alif --- ฟังก์ชันสำหรับ Alif Ensemble SoC

โมดูล alif เปิดเผยฟังก์ชันการทำงานเฉพาะสำหรับพอร์ต Alif Ensemble SoC รวมถึง wrapper อุปกรณ์บล็อกสำหรับแฟลช OSPI บนบอร์ดและตัวช่วยสำหรับดัมป์ข้อมูล SoC จากบริการ Secure Enclave

ตัวอย่าง:

import alif

alif.info()
flash = alif.Flash()

ฟังก์ชัน

alif.info() None

ดัมป์ข้อมูลอุปกรณ์ที่รวบรวมจากบริการ Alif Secure Enclave (SE services) ไปยังเทอร์มินัลอนุกรม

คลาส

class alif.Flash(*, start: int = -1, len: int = -1)

สร้างออบเจกต์อุปกรณ์บล็อกที่รองรับโดยแฟลช OSPI บนบอร์ด คลาสนี้จะใช้งานได้เฉพาะเมื่อ เฟิร์มแวร์ถูกสร้างโดยเปิดใช้งานการรองรับ OSPI

เมื่อเรียกโดยไม่มีอาร์กิวเมนต์ จะส่งคืนออบเจกต์ singleton เริ่มต้นที่ครอบคลุมบริเวณระบบไฟล์ที่เขียนได้ของแฟลช

start คือออฟเซ็ตไบต์ลงในบริเวณพื้นที่จัดเก็บแฟลช ต้องเป็นทวีคูณของขนาดบล็อกแฟลชและอยู่ในช่วงพื้นที่จัดเก็บแฟลช ค่าเริ่มต้นคือ -1 ซึ่งหมายถึงเริ่มต้นที่ออฟเซ็ต 0

len คือความยาวเป็นไบต์ของบริเวณแฟลชที่เปิดเผยโดยออบเจกต์ ต้องเป็นทวีคูณของขนาดบล็อกแฟลชและต้องไม่เกินสิ้นสุดของบริเวณพื้นที่จัดเก็บแฟลช ค่าเริ่มต้นคือ -1 ซึ่งหมายถึงใช้ไบต์ที่เหลือทั้งหมดจาก start

ออบเจกต์ยังนำโปรโตคอลบัฟเฟอร์ไปใช้ด้วย ทำให้สามารถเข้าถึงหน่วยความจำแบบแมปแบบอ่านอย่างเดียวไปยังบริเวณแฟลชผ่านฐาน OSPI XIP ซึ่งทำให้มุมมองแบบ zero-copy ของบริเวณทั้งหมดพร้อมใช้งานโดยไม่ต้องออกคำสั่งอ่านแฟลชใด ๆ:

flash = alif.Flash()
view = memoryview(flash)
magic = bytes(view[:4])      # read the first 4 bytes directly from XIP
readblocks(block_num: int, buf: bytearray) int
readblocks(block_num: int, buf: bytearray, offset: int) int

อ่านไบต์จากแฟลชลงใน buf มีสองรูปแบบที่เปิดเผยอินเทอร์เฟซแบบง่ายและแบบขยาย:

รูปแบบง่าย (readblocks(block_num, buf)): อ่านบล็อกทั้งหมดเริ่มต้นที่ดัชนีบล็อก block_num len(buf) ต้องเป็นทวีคูณของขนาดบล็อกแฟลช

รูปแบบขยาย (readblocks(block_num, buf, offset)): อ่าน len(buf) ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนบล็อกทั้งหมด -- เริ่มต้นที่ไบต์ offset ภายในบล็อก block_num len(buf) ไม่มีข้อจำกัดการจัดวาง

ส่งคืน 0 เมื่อสำเร็จหรือรหัสข้อผิดพลาดเชิงลบ โปรดทราบว่าโปรโตคอลอุปกรณ์บล็อก MicroPython มาตรฐานส่งคืน None ไดรเวอร์ alif เปิดเผยรหัสสถานะ OSPI ที่อยู่เบื้องหลังโดยตั้งใจ เพื่อให้ผู้เรียกที่ข้ามผ่าน vfs สามารถตอบสนองต่อข้อผิดพลาดฮาร์ดแวร์ได้

writeblocks(block_num: int, buf: bytes) int
writeblocks(block_num: int, buf: bytes, offset: int) int

เขียนไบต์จาก buf ไปยังแฟลช มีสองรูปแบบที่เปิดเผยอินเทอร์เฟซแบบง่ายและแบบขยาย:

รูปแบบง่าย (writeblocks(block_num, buf)): เขียนบล็อกทั้งหมดเริ่มต้นที่ดัชนีบล็อก block_num len(buf) ต้องเป็นทวีคูณของขนาดบล็อกแฟลช แต่ละบล็อกที่ได้รับผลกระทบจะถูกลบอัตโนมัติก่อนการเขียน

รูปแบบขยาย (writeblocks(block_num, buf, offset)): เขียน len(buf) ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนบล็อกทั้งหมด -- เริ่มต้นที่ไบต์ offset ภายในบล็อก block_num len(buf) ไม่มีข้อจำกัดการจัดวาง และ ไม่มีการลบโดยอัตโนมัติ -- ผู้เรียกต้องตรวจสอบให้แน่ใจว่าบล็อกที่ได้รับผลกระทบถูกลบผ่านการเรียก ioctl(6, block_num) ก่อนหน้า

ส่งคืน 0 เมื่อสำเร็จหรือรหัสข้อผิดพลาดเชิงลบ (ดู readblocks() สำหรับเหตุผล)

ioctl(cmd: int, arg: int) int

ดำเนินการควบคุมอุปกรณ์บล็อก cmd เป็นหนึ่งในคำสั่ง MicroPython MP_BLOCKDEV_IOCTL_* มาตรฐาน:

  • 1 (init) --- ส่งคืน 0

  • 2 (deinit) --- ส่งคืน 0

  • 3 (sync) --- ส่งคืน 0

  • 4 (block count) --- ส่งคืนจำนวนบล็อกในบริเวณ

  • 5 (block size) --- ส่งคืนขนาดบล็อกแฟลชเป็นไบต์

  • 6 (block erase) --- ลบบล็อกที่ดัชนี arg และส่งคืนผลลัพธ์ของการดำเนินการลบ

ค่า cmd อื่น ๆ ส่งคืน None

ค่าคงที่

alif.usb_msc: bool

มีอยู่และตั้งค่าเป็น True เฉพาะเมื่อ เฟิร์มแวร์ถูกสร้างโดยเปิดใช้งานการรองรับ USB Mass Storage Class แอตทริบิวต์จะขาดหายไปในกรณีอื่น