Снятие защиты от записи с SD карты

 

Проблема

В SD-карте есть служебный регистр CSD (Card-Specific Data, «данные, специфичные для карты»). В нём содержатся, например, сведения о ёмкости, скоростных характеристиках и версии стандарта карты: SDSC, SDHC или SDXC.
В CSD также предусмотрены два бита защиты от записи:
  • TMP_WRITE_PROTECT — временная защита, которую можно включить и снять;
  • PERM_WRITE_PROTECT — постоянная защита. Этот бит одноразовый: после установки снять его штатными средствами нельзя.
Нас интересует именно временная защита. На низком уровне можно прочитать CSD и, если карта допускает это, изменить 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.
Такие платы разработки обычно недороги, как и модуль для SD-карты. Для Arduino Uno/Nano и LGT8F328P нужно учитывать разницу уровней логики: выводы микроконтроллера работают от 5 В, а SD-карта — от 3,3 В. Поэтому понадобятся либо делители напряжения, либо преобразователь логических уровней, например 74HC125N. Для ESP8266 и ESP32 согласование уровней обычно не требуется, поскольку они используют логику 3,3 В.

Конструкция выглядит примерно так:

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

После сборки устройство подключается к компьютеру по USB. В Arduino IDE нужно открыть скетч, скомпилировать его и загрузить в микроконтроллер. Затем откройте монитор последовательного порта, вставьте карту в модуль и проверьте её состояние. Программа должна показать, установлена ли временная защита, и предложить снять её либо включить снова.

Скетч, схема подключения и команды для сборки находятся в репозитории проекта. Скетч можно собрать через Arduino IDE или PlatformIO. Если для выбранной платы есть готовая прошивка, её можно загрузить утилитой, указанной в документации репозитория.

Комментариев нет:

Отправить комментарий