alif --- دوال شريحة Alif Ensemble SoC

تكشف الوحدة alif عن وظائف خاصة بالمنفذ لشريحة Alif Ensemble SoC، بما في ذلك غلاف لجهاز الكتل للذاكرة OSPI flash الموجودة على اللوحة ومساعد لإخراج معلومات الشريحة من خدمات الحاوية الآمنة (Secure Enclave).

مثال:

import alif

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

الدوال

alif.info() None

تُخرج معلومات الجهاز المجمّعة من خدمات الحاوية الآمنة (SE services) في Alif إلى الطرفية التسلسلية.

الأصناف

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

ينشئ كائن جهاز كتل مدعوماً بالذاكرة OSPI flash الموجودة على اللوحة. لا يتوفر هذا الصنف إلا عندما يُبنى البرنامج الثابت مع تمكين دعم OSPI.

عند استدعائه دون وسائط، يُعيد الكائن المفرد الافتراضي الذي يغطي منطقة نظام الملفات القابلة للكتابة من ذاكرة flash.

start هو إزاحة البايت داخل منطقة تخزين flash. يجب أن يكون مضاعفاً لحجم كتلة flash وضمن نطاق تخزين flash. القيمة الافتراضية هي -1 وتعني البدء عند الإزاحة 0.

len هو الطول بالبايتات لمنطقة flash التي يكشفها الكائن. يجب أن يكون مضاعفاً لحجم كتلة flash وألا يمتد إلى ما بعد نهاية منطقة تخزين flash. القيمة الافتراضية هي -1 وتعني استخدام جميع البايتات المتبقية بدءاً من start.

يُنفّذ الكائن أيضاً بروتوكول المخزن المؤقت، مما يتيح وصولاً للقراءة فقط مُسقطاً في الذاكرة إلى منطقة flash عبر قاعدة OSPI XIP. هذا يجعل عرضاً بلا نسخ للمنطقة بأكملها متاحاً دون إصدار أي عمليات قراءة من 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 (التهيئة) --- تُعيد 0.

  • 2 (إنهاء التهيئة) --- تُعيد 0.

  • 3 (المزامنة) --- تُعيد 0.

  • 4 (عدد الكتل) --- تُعيد عدد الكتل في المنطقة.

  • 5 (حجم الكتلة) --- تُعيد حجم كتلة flash بالبايتات.

  • 6 (محو الكتلة) --- تمحو الكتلة عند الفهرس arg وتُعيد نتيجة عملية المحو.

تُعيد قيم cmd الأخرى None.

الثوابت

alif.usb_msc: bool

موجود ومضبوط على True فقط عندما يُبنى البرنامج الثابت مع تمكين دعم فئة التخزين الكتلي عبر USB (USB Mass Storage Class). وتكون السمة غائبة فيما عدا ذلك.