Проблема
В SD-карте есть служебный регистр CSD (Card-Specific Data, «данные, специфичные для карты»). В нём содержатся, например, сведения о ёмкости, скоростных характеристиках и версии стандарта карты: SDSC, SDHC или SDXC.В CSD также предусмотрены два бита защиты от записи:
TMP_WRITE_PROTECT— временная защита, которую можно включить и снять;
PERM_WRITE_PROTECT— постоянная защита. Этот бит одноразовый: после установки снять его штатными средствами нельзя.
TMP_WRITE_PROTECT командой CMD27 (PROGRAM_CSD). Постоянную защиту эта процедура не снимает. Спецификация SDНа этом пути есть две проблемы.
Первая проблема: нужен низкоуровневый доступ к карте
SD-карта работает по определённому протоколу: хост отправляет команду, а карта отвечает в установленном формате. Обычные средства работы с накопителями такого доступа, как правило, не дают. На уровне драйвера команды SD-карте, конечно, отправляются, но выше этого уровня карта обычно представлена просто как диск.В Linux некоторые встроенные кардридеры доступны как устройства вида
/dev/mmcblk0. Через них можно передавать низкоуровневые команды карте. Для этой задачи существует утилита sdtool: она позволяет проверить состояние защиты и снять временную защиту.Однако многие современные кардридеры, особенно в ноутбуках, подключены по USB и отображаются как обычные USB-накопители — например,
/dev/sdb. Такой кардридер обычно не даёт отправить карте нужную команду напрямую, поэтому sdtool с ним не работает. В Windows ситуация аналогична: типовые USB-кардридеры обычно не предоставляют необходимый доступ.Решение есть: подключить карту не через USB-кардридер, а напрямую к микроконтроллеру с SD-модулем.
Вторая проблема: причина защиты может быть другой
Не всякая карта, которая выглядит защищённой от записи, имеет установленныйTMP_WRITE_PROTECT.Например:
- контроллер карты может перевести её в режим «только чтение» при серьёзном износе или неисправности памяти;
- карта или её контроллер могут не поддерживать изменение CSD либо отклонить команду.
По имеющемуся опыту, SD-карты с картами для Ford SYNC 2 обычно позволяют снять временную защиту этим способом. Однако это не гарантия для каждой конкретной карты.
Решение
Будем работать с SD-картой через SD-модуль, подключённый к микроконтроллеру. Подойдут, например:- Arduino Uno, Nano или Mega;
- платы на LGT8F328P;
- ESP8266;
- ESP32;
- STM32.
Конструкция выглядит примерно так:

На картинке тут Arduino Uno и видавший виды модуль на 2 типоразмера карт, где линия DAT1 колхозом выведена на CS1 для аппаратного детекта наличия карты. Вам оно не надо, скорее всего - берите обычный Arduino Nano и модуль для обычной SD (не MicroSD, если надо будет - вставите через переходник). Если найдете модель для полноценной SD с согласованием линий, берите его - меньше возни с резиторами, но я на алике такой не нашел - только для MicroSD. Или берите ESP8266 там вообще ничего не надо согласовывать а стоит оно примерно также.
После сборки устройство подключается к компьютеру по USB. В Arduino IDE нужно открыть скетч, скомпилировать его и загрузить в микроконтроллер. Затем откройте монитор последовательного порта, вставьте карту в модуль и проверьте её состояние. Программа должна показать, установлена ли временная защита, и предложить снять её либо включить снова.
Скетч, схема подключения и команды для сборки находятся в репозитории проекта. Скетч можно собрать через Arduino IDE или PlatformIO. Если для выбранной платы есть готовая прошивка, её можно загрузить утилитой, указанной в документации репозитория.
Комментариев нет:
Отправить комментарий