клас SDCard – драйвер карти SD / MMC

Клас SDCard керує слотом карти SD / MMC на камерах OpenMV, де він присутній. Драйвер реалізує інтерфейс vfs.AbstractBlockDev, тому його можна передати безпосередньо до vfs.mount()

import machine
import vfs

sd = machine.SDCard()
vfs.mount(sd, "/sd")

Примітка

Мікропрограма OpenMV автоматично монтує карту SD під час завантаження, тому більшість скриптів ніколи не створюють SDCard безпосередньо – вони просто читають і записують через автоматично змонтований шлях. Створюйте об’єкт вручну лише тоді, коли потрібна нестандартна точка монтування або доступ до блоків на низькому рівні через readblocks() / writeblocks() / ioctl().

На OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 слот керується вбудованим контролером SDMMC мікросхеми STM32 у режимі 4-бітного SD. На OpenMV Cam RT1062 слот керується контролером USDHC i.MX RT, також у режимі 4-бітного SD. Жодних аргументів мультиплексування виводів для поточних плат OpenMV не потрібно – драйвер знає схему підключення плати.

Недоступно на OpenMV Cam AE3 (порт alif).

Конструктори

class machine.SDCard(id: int = 1) SDCard

Повертає одиничний екземпляр SDCard для слота SD, визначеного за id. id приймається для сумісності між портами, але порти, що підтримуються OpenMV, надають лише один слот; передайте 1 або не вказуйте аргумент.

На STM32 конструктор не приймає жодних аргументів; на mimxrt аргумент id приймається, але дійсним є лише 1.

Методи

present() bool

Повертає True, якщо карта наразі виявлена у слоті, або False – в іншому випадку.

На платах, де підключено сигнал виявлення картки, метод відображає цей сигнал у реальному часі, тому його можна опитувати після створення об’єкта SDCard для реагування на гаряче встановлення / виймання. На платах без сигналу виявлення картки значення фіксується під час створення об’єкта – воно відображає результат початкового зондування CMD0, яке виконав драйвер при створенні об’єкта, і карта, встановлена після цього, не буде видима до повторного створення об’єкта (або виклику init() на mimxrt).

info() tuple[int, int, int]

Повертає кортеж із 3 елементів, що описують встановлену карту:

  • [0] num_blocks – загальна ємність у блоках по 512 байт. Помножте на 512 для отримання сирої ємності у байтах.

  • [1] block_size – завжди 512 для карт SD. Включено, щоб абоненти могли портативно використовувати num_blocks * block_size.

  • [2] card_type – тип карти, повідомлений шиною SD під час рукостискання ініціалізації CMD8 / OCR. Типові значення: 0 (SDSC – стандартна ємність), 0x40 (SDHC / SDXC – висока / розширена ємність) та 0x80 (MMC).

Корисно для перевірки того, що карта розпізнана, або для відображення показників вільного місця відносно загальної ємності.

power(state: bool, /) None

Вмикає або вимикає шину живлення слота картки. Мікропрограма STM32 надає цей метод, але жодна поточна OpenMV Cam не комутує живлення SD, тому виклик фактично є пустою операцією. Збережено для сумісності з кодом, спочатку написаним для еталонних плат STM32 upstream MicroPython. Лише порт STM32.

read(block_num: int, /) bytes

Зчитує один блок 512 байт з картки і повертає його як новостворений об’єкт bytes.

Це застарілий метод читання одного блоку, що постачається з портом STM32. Новий код слід використовувати з readblocks() – цей метод працює на кожному порту OpenMV, може читати будь-яку кількість суміжних блоків за одну операцію і уникає виділення пам’яті на кожен виклик, записуючи у буфер, наданий абонентом. Лише порт STM32.

write(block_num: int, data: bytes, /) None

Записує один блок 512 байт на картку. data повинен бути рівно 512 байт.

Це застарілий метод запису одного блоку, що постачається з портом STM32; новий код слід використовувати з writeblocks(), який працює на кожному порту OpenMV і може записувати будь-яку кількість суміжних блоків за виклик. Лише порт STM32.

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

Читає вирівняні по блоках сирі дані з картки у buf. Стандартна точка входу блочного пристрою vfs.AbstractBlockDev, яку використовує рівень файлової системи.

Проста форма (readblocks(block_num, buf)): читає цілі блоки, починаючи з індексу блоку block_num. len(buf) повинен бути кратним розміру блоку SD (512 байт).

Розширена форма (readblocks(block_num, buf, offset)): читає len(buf) байт – не обов’язково ціле число блоків – починаючи з байта offset у блоці block_num. Використовується littlefs та іншими файловими системами з адресацією по байтах.

writeblocks(block_num: int, buf: bytes | bytearray) None
writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None

Записує вирівняні по блоках сирі дані з buf на картку. Стандартна точка входу блочного пристрою vfs.AbstractBlockDev, яку використовує рівень файлової системи.

Проста форма (writeblocks(block_num, buf)): записує цілі блоки, починаючи з індексу блоку block_num. len(buf) повинен бути кратним розміру блоку SD (512 байт). Кожен задіяний блок повністю перезаписується.

Розширена форма (writeblocks(block_num, buf, offset)): записує len(buf) байт – не обов’язково ціле число блоків – починаючи з байта offset у блоці block_num. Використовується littlefs та іншими файловими системами з адресацією по байтах.

ioctl(cmd: int, arg: int) int | None

Стандартна точка входу керування vfs.AbstractBlockDev. Викликається рівнем файлової системи під час монтування/демонтування та при кожній синхронізації. Розпізнавані значення cmd:

  • 1 – ініціалізація. Повертає 0 у разі успіху.

  • 2 – деініціалізація. Повертає 0 у разі успіху.

  • 3 – синхронізує відкладені записи. Повертає 0 (драйвер SDMMC пише синхронно, нічого скидати).

  • 4 – повертає кількість блоків на пристрої.

  • 5 – повертає розмір одного блоку (завжди 512).

  • 6 – стирає блок (пуста операція для SD, збережена відповідно до контракту vfs.AbstractBlockDev).

  • 7 – повертає, чи підтримує пристрій стирання блоків (0 для SD).

Прямі абоненти зазвичай не використовують цей метод – драйвер файлової системи автоматично обробляє всі стандартні коди після монтування SDCard.

init(*args, **kwargs) None

Повторно ініціалізує інтерфейс SD з нуля. Приймає ті самі аргументи, що й конструктор. Корисно для повторного виявлення картки, встановленої гарячою заміною, на платах без сигналу виявлення картки, оскільки present() інакше фіксується під час створення об’єкта. Лише порт mimxrt.

deinit() None

Деініціалізує інтерфейс SD, звільняючи контролер SDMMC/USDHC та виводи, які він займав. Об’єкт SDCard стає непридатним до використання, доки не буде викликано init() знову. Використовуйте його перед перепрошивкою картки з іншого інтерфейсу або для відключення живлення слота у пристрої з акумулятором. Лише порт mimxrt.