alif --- Các hàm SoC Alif Ensemble

Mô-đun alif cung cấp các chức năng dành riêng cho cổng trên SoC Alif Ensemble, bao gồm một trình bao bọc thiết bị khối cho bộ nhớ flash OSPI trên bo mạch và một trình trợ giúp để xuất thông tin SoC từ các dịch vụ Secure Enclave.

Ví dụ:

import alif

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

Hàm

alif.info() None

Xuất thông tin thiết bị được thu thập từ các dịch vụ Alif Secure Enclave (SE services) ra thiết bị đầu cuối nối tiếp.

Lớp

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

Tạo một đối tượng thiết bị khối được hỗ trợ bởi bộ nhớ flash OSPI trên bo mạch. Lớp này chỉ khả dụng khi firmware được xây dựng với hỗ trợ OSPI được bật.

Khi được gọi không có đối số, trả về đối tượng singleton mặc định bao phủ vùng filesystem có thể ghi của bộ nhớ flash.

start là độ lệch byte vào vùng lưu trữ flash. Phải là bội số của kích thước khối flash và nằm trong phạm vi lưu trữ flash. Mặc định là -1 nghĩa là bắt đầu tại độ lệch 0.

len là độ dài tính bằng byte của vùng flash được đối tượng này hiển thị. Phải là bội số của kích thước khối flash và không vượt quá cuối vùng lưu trữ flash. Mặc định là -1 nghĩa là sử dụng tất cả các byte còn lại từ start.

Đối tượng cũng triển khai giao thức bộ đệm, cho phép truy cập ánh xạ bộ nhớ chỉ đọc vào vùng flash qua cơ sở OSPI XIP. Điều này tạo ra một khung nhìn sao chép bằng không của toàn bộ vùng mà không cần thực hiện bất kỳ thao tác đọc flash nào:

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

Đọc các byte từ bộ nhớ flash vào buf. Hai dạng quá tải cung cấp giao diện đơn giản và mở rộng:

Dạng đơn giản (readblocks(block_num, buf)): đọc các khối hoàn chỉnh bắt đầu từ chỉ mục khối block_num. len(buf) phải là bội số của kích thước khối flash.

Dạng mở rộng (readblocks(block_num, buf, offset)): đọc len(buf) byte -- không nhất thiết là số nguyên của các khối -- bắt đầu từ byte offset trong khối block_num. len(buf) không có ràng buộc căn chỉnh.

Trả về 0 khi thành công hoặc mã lỗi âm. Lưu ý rằng giao thức thiết bị khối MicroPython chuẩn trả về None; driver alif có chủ ý hiển thị mã trạng thái OSPI bên dưới để các bên gọi bỏ qua vfs có thể phản ứng với lỗi phần cứng.

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

Ghi các byte từ buf vào bộ nhớ flash. Hai dạng quá tải cung cấp giao diện đơn giản và mở rộng:

Dạng đơn giản (writeblocks(block_num, buf)): ghi các khối hoàn chỉnh bắt đầu từ chỉ mục khối block_num. len(buf) phải là bội số của kích thước khối flash. Mỗi khối bị ảnh hưởng được xóa tự động trước khi ghi.

Dạng mở rộng (writeblocks(block_num, buf, offset)): ghi len(buf) byte -- không nhất thiết là số nguyên của các khối -- bắt đầu từ byte offset trong khối block_num. len(buf) không có ràng buộc căn chỉnh, và không có xóa ngầm được thực hiện -- người gọi phải đảm bảo rằng các khối bị ảnh hưởng đã được xóa thông qua lệnh gọi ioctl(6, block_num) trước đó.

Trả về 0 khi thành công hoặc mã lỗi âm (xem readblocks() để biết lý do).

ioctl(cmd: int, arg: int) int

Thực hiện một thao tác kiểm soát thiết bị khối. cmd là một trong các lệnh MP_BLOCKDEV_IOCTL_* chuẩn của MicroPython:

  • 1 (init) --- trả về 0.

  • 2 (deinit) --- trả về 0.

  • 3 (sync) --- trả về 0.

  • 4 (block count) --- trả về số lượng khối trong vùng.

  • 5 (block size) --- trả về kích thước khối flash tính bằng byte.

  • 6 (block erase) --- xóa khối tại chỉ mục arg và trả về kết quả của thao tác xóa.

Các giá trị cmd khác trả về None.

Hằng số

alif.usb_msc: bool

Có mặt và được đặt thành True chỉ khi firmware được xây dựng với hỗ trợ USB Mass Storage Class được bật. Thuộc tính này vắng mặt trong các trường hợp khác.