alif --- ฟังก์ชันสำหรับ Alif Ensemble SoC¶
โมดูล alif เปิดเผยฟังก์ชันการทำงานเฉพาะสำหรับพอร์ต Alif Ensemble SoC รวมถึง wrapper อุปกรณ์บล็อกสำหรับแฟลช OSPI บนบอร์ดและตัวช่วยสำหรับดัมป์ข้อมูล SoC จากบริการ Secure Enclave
ตัวอย่าง:
import alif
alif.info()
flash = alif.Flash()
ฟังก์ชัน¶
คลาส¶
- class alif.Flash(*, start: int = -1, len: int = -1)¶
สร้างออบเจกต์อุปกรณ์บล็อกที่รองรับโดยแฟลช OSPI บนบอร์ด คลาสนี้จะใช้งานได้เฉพาะเมื่อ เฟิร์มแวร์ถูกสร้างโดยเปิดใช้งานการรองรับ OSPI
เมื่อเรียกโดยไม่มีอาร์กิวเมนต์ จะส่งคืนออบเจกต์ singleton เริ่มต้นที่ครอบคลุมบริเวณระบบไฟล์ที่เขียนได้ของแฟลช
startคือออฟเซ็ตไบต์ลงในบริเวณพื้นที่จัดเก็บแฟลช ต้องเป็นทวีคูณของขนาดบล็อกแฟลชและอยู่ในช่วงพื้นที่จัดเก็บแฟลช ค่าเริ่มต้นคือ-1ซึ่งหมายถึงเริ่มต้นที่ออฟเซ็ต0lenคือความยาวเป็นไบต์ของบริเวณแฟลชที่เปิดเผยโดยออบเจกต์ ต้องเป็นทวีคูณของขนาดบล็อกแฟลชและต้องไม่เกินสิ้นสุดของบริเวณพื้นที่จัดเก็บแฟลช ค่าเริ่มต้นคือ-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_numlen(buf)ต้องเป็นทวีคูณของขนาดบล็อกแฟลชรูปแบบขยาย (
readblocks(block_num, buf, offset)): อ่านlen(buf)ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนบล็อกทั้งหมด -- เริ่มต้นที่ไบต์offsetภายในบล็อกblock_numlen(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_numlen(buf)ต้องเป็นทวีคูณของขนาดบล็อกแฟลช แต่ละบล็อกที่ได้รับผลกระทบจะถูกลบอัตโนมัติก่อนการเขียนรูปแบบขยาย (
writeblocks(block_num, buf, offset)): เขียนlen(buf)ไบต์ -- ไม่จำเป็นต้องเป็นจำนวนบล็อกทั้งหมด -- เริ่มต้นที่ไบต์offsetภายในบล็อกblock_numlen(buf)ไม่มีข้อจำกัดการจัดวาง และ ไม่มีการลบโดยอัตโนมัติ -- ผู้เรียกต้องตรวจสอบให้แน่ใจว่าบล็อกที่ได้รับผลกระทบถูกลบผ่านการเรียกioctl(6, block_num)ก่อนหน้าส่งคืน
0เมื่อสำเร็จหรือรหัสข้อผิดพลาดเชิงลบ (ดูreadblocks()สำหรับเหตุผล)
- ioctl(cmd: int, arg: int) int¶
ดำเนินการควบคุมอุปกรณ์บล็อก
cmdเป็นหนึ่งในคำสั่ง MicroPythonMP_BLOCKDEV_IOCTL_*มาตรฐาน:1(init) --- ส่งคืน02(deinit) --- ส่งคืน03(sync) --- ส่งคืน04(block count) --- ส่งคืนจำนวนบล็อกในบริเวณ5(block size) --- ส่งคืนขนาดบล็อกแฟลชเป็นไบต์6(block erase) --- ลบบล็อกที่ดัชนีargและส่งคืนผลลัพธ์ของการดำเนินการลบ
ค่า
cmdอื่น ๆ ส่งคืนNone