клас 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.