alif — פונקציות של ה-SoC מסוג Alif Ensemble

המודול alif חושף פונקציונליות ספציפית ליציאה (port) עבור ה-SoC מסוג Alif Ensemble, כולל עוטף התקן-בלוקים לזיכרון ה-flash מסוג OSPI המובנה ועזר להדפסת מידע על ה-SoC משירותי ה-Secure Enclave.

דוגמה:

import alif

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

פונקציות

alif.info() None

מדפיסה אל מסוף הטורי מידע על ההתקן שנאסף משירותי ה-Secure Enclave (שירותי SE) של Alif.

מחלקות

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

יוצרת אובייקט התקן-בלוקים המגובה על-ידי זיכרון ה-flash מסוג OSPI המובנה. מחלקה זו זמינה רק כאשר הקושחה נבנתה עם תמיכת OSPI מאופשרת.

כאשר נקראת ללא ארגומנטים, מחזירה את אובייקט הסינגלטון בברירת המחדל המכסה את אזור מערכת הקבצים הניתן לכתיבה ב-flash.

start הוא היסט הבתים בתוך אזור אחסון ה-flash. חייב להיות כפולה של גודל בלוק ה-flash ובתוך טווח אחסון ה-flash. ברירת המחדל היא -1 שמשמעותה התחלה מהיסט 0.

len הוא האורך בבתים של אזור ה-flash שהאובייקט חושף. חייב להיות כפולה של גודל בלוק ה-flash ולא להשתרע מעבר לסוף אזור אחסון ה-flash. ברירת המחדל היא -1 שמשמעותה שימוש בכל הבתים הנותרים החל מ-start.

האובייקט מממש גם את פרוטוקול ה-buffer, ומאפשר גישה ממופת-זיכרון לקריאה-בלבד אל אזור ה-flash דרך בסיס ה-XIP של OSPI. הדבר הופך תצוגת אפס-העתקה (zero-copy) של כל האזור לזמינה ללא הנפקת קריאות flash כלשהן:

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

קוראת בתים מה-flash אל תוך buf. שתי הצורות החליפיות חושפות את הממשק הפשוט והמורחב:

צורה פשוטה (readblocks(block_num, buf)): קוראת בלוקים שלמים החל מאינדקס הבלוק block_num. len(buf) חייב להיות כפולה של גודל בלוק ה-flash.

צורה מורחבת (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 אל ה-flash. שתי הצורות החליפיות חושפות את הממשק הפשוט והמורחב:

צורה פשוטה (writeblocks(block_num, buf)): כותבת בלוקים שלמים החל מאינדקס הבלוק block_num. len(buf) חייב להיות כפולה של גודל בלוק ה-flash. כל בלוק מושפע נמחק אוטומטית לפני שהוא נכתב.

צורה מורחבת (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 הוא אחד מפקודות ה-MP_BLOCKDEV_IOCTL_* הסטנדרטיות של MicroPython:

  • 1 (init) — מחזירה 0.

  • 2 (deinit) — מחזירה 0.

  • 3 (sync) — מחזירה 0.

  • 4 (block count) — מחזירה את מספר הבלוקים באזור.

  • 5 (block size) — מחזירה את גודל בלוק ה-flash בבתים.

  • 6 (block erase) — מוחקת את הבלוק באינדקס arg ומחזירה את תוצאת פעולת המחיקה.

ערכי cmd אחרים מחזירים None.

קבועים

alif.usb_msc: bool

קיים ומוגדר ל-True רק כאשר הקושחה נבנתה עם תמיכת USB Mass Storage Class מאופשרת. אחרת התכונה נעדרת.