alif — funkcje SoC Alif Ensemble

Moduł alif udostępnia funkcjonalność specyficzną dla portu układu SoC Alif Ensemble, w tym opakowanie urządzenia blokowego dla wbudowanej pamięci flash OSPI oraz funkcję pomocniczą do wypisywania informacji o SoC z usług Secure Enclave.

Przykład:

import alif

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

Funkcje

alif.info() None

Wypisuje na terminal szeregowy informacje o urządzeniu zebrane z usług Alif Secure Enclave (usługi SE).

Klasy

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

Tworzy obiekt urządzenia blokowego opartego na wbudowanej pamięci flash OSPI. Ta klasa jest dostępna tylko wtedy, gdy oprogramowanie układowe zostało zbudowane z włączoną obsługą OSPI.

Wywołana bez argumentów zwraca domyślny obiekt singleton obejmujący zapisywalny obszar systemu plików w pamięci flash.

start to przesunięcie w bajtach względem obszaru pamięci flash. Musi być wielokrotnością rozmiaru bloku pamięci flash i mieścić się w zakresie obszaru pamięci flash. Domyślnie -1, co oznacza początek od przesunięcia 0.

len to długość w bajtach obszaru pamięci flash udostępnianego przez obiekt. Musi być wielokrotnością rozmiaru bloku pamięci flash i nie może wykraczać poza koniec obszaru pamięci flash. Domyślnie -1, co oznacza wykorzystanie wszystkich pozostałych bajtów od start.

Obiekt implementuje również protokół bufora, umożliwiając dostęp tylko do odczytu do obszaru pamięci flash mapowanego w pamięci poprzez bazę OSPI XIP. Dzięki temu dostępny jest widok całego obszaru bez kopiowania, bez wykonywania jakichkolwiek odczytów z pamięci 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

Odczytuje bajty z pamięci flash do buf. Dwa przeciążenia udostępniają interfejs prosty i rozszerzony:

Forma prosta (readblocks(block_num, buf)): odczytuje całe bloki począwszy od indeksu bloku block_num. len(buf) musi być wielokrotnością rozmiaru bloku pamięci flash.

Forma rozszerzona (readblocks(block_num, buf, offset)): odczytuje len(buf) bajtów – niekoniecznie całkowitą liczbę bloków – począwszy od bajtu offset w bloku block_num. len(buf) nie ma ograniczeń wyrównania.

Zwraca 0 w przypadku powodzenia lub ujemny kod błędu. Należy pamiętać, że standardowy protokół urządzenia blokowego MicroPython zwraca None; sterownik alif celowo udostępnia bazowy kod stanu OSPI, aby wywołujący, którzy omijają vfs, mogli reagować na błędy sprzętowe.

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

Zapisuje bajty z buf do pamięci flash. Dwa przeciążenia udostępniają interfejs prosty i rozszerzony:

Forma prosta (writeblocks(block_num, buf)): zapisuje całe bloki począwszy od indeksu bloku block_num. len(buf) musi być wielokrotnością rozmiaru bloku pamięci flash. Każdy objęty blok jest automatycznie kasowany przed zapisem.

Forma rozszerzona (writeblocks(block_num, buf, offset)): zapisuje len(buf) bajtów – niekoniecznie całkowitą liczbę bloków – począwszy od bajtu offset w bloku block_num. len(buf) nie ma ograniczeń wyrównania, a żadne niejawne kasowanie nie jest wykonywane – wywołujący musi zapewnić, że objęte bloki zostały skasowane wcześniejszym wywołaniem ioctl(6, block_num).

Zwraca 0 w przypadku powodzenia lub ujemny kod błędu (uzasadnienie zobacz w readblocks()).

ioctl(cmd: int, arg: int) int

Wykonuje operację sterującą urządzeniem blokowym. cmd jest jednym ze standardowych poleceń MicroPython MP_BLOCKDEV_IOCTL_*:

  • 1 (init) — zwraca 0.

  • 2 (deinit) — zwraca 0.

  • 3 (sync) — zwraca 0.

  • 4 (liczba bloków) — zwraca liczbę bloków w obszarze.

  • 5 (rozmiar bloku) — zwraca rozmiar bloku pamięci flash w bajtach.

  • 6 (kasowanie bloku) — kasuje blok o indeksie arg i zwraca wynik operacji kasowania.

Inne wartości cmd zwracają None.

Stałe

alif.usb_msc: bool

Obecny i ustawiony na True tylko wtedy, gdy oprogramowanie układowe zostało zbudowane z włączoną obsługą klasy USB Mass Storage. W przeciwnym razie atrybut nie istnieje.