реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC2368, проблема с контроллером MCI, Не получается послать LOCK_UNLOCK на карту
VslavX
сообщение Sep 30 2010, 21:33
Сообщение #1


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Имеется LPC2368, на его аппаратном контроллере MCI реализованы чтение-запись карточек MMC/SD/SDHC, все нормально и беспроблемно работает. Теперь потребовалось реализовать функцию парольной защиты карт памяти. Для этого на карту следует послать команду LOCK_UNLOCK, дождаться статуса и затем послать некоторый блок данных (с паролем), длина которого для разных парольных операций может составлять от 1 до 34 байтов. Этот блок данных должен сопровождаться CRC, после чего карта отвечает статусом приема и переходит на некоторое время в состояние занятости - все эти парольные операции LOCk_UNLOCK полностью аналогичны записи одиночного блока данных.
В чем проблема - контроллер MCI, похоже, не позволяет посылать блоки данных произвольной длины. В режиме контроллера BLOCK_MODE длина блока должна быть степенью 2 - 1/2/4/8... 2048 байт. После отсылки блока указанной длины автоматически отсылается CRC. То есть передать например 5 байт + CRC никак не получается. В режиме контролллера STREAM_MODE можно передать произвольное число байтов, но в этом режиме CRC контроллером MCI не посылается.
В итоге было принято решение дополнить посылаемый блок данных нулями до кратного степени 2 размера и работать в BLOCK_MODE. Карты SDHC (я подозреваю что все карты спецификации SD v2+) в таком режиме работают нормально, а вот обычные SD - нет. Для них работают нормально все команды установки/стирания пароля, а вот собственно команда разблокировки - не работает - грит UNLOCK_FAILED. Причем, если длину пароля подобрать так что длина посылаемого блока точно кратна степени 2, то все тоже работает.
Сижу вот теперь и думаю - это контроллер MCI в LPC23xx кривой и реально не позволяет передать блок нужной длины с CRC, или я чего-то упускаю? NXP традиционно на вопросы не отвечает ((

Дополню пост диаграммами посылки блока данных пароля для блочного и потокового режимов.
В потоковом режиме посылается 6 байт 0x00, 0x04, 0x30, 0x31, 0x32, 0x33, как видно контрольной суммы нет и карта не переходит в Busy.
Прикрепленное изображение


В блочном режиме данные дополнены до 8 байт 0x00, 0x04, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00 и видно что контроллер посылает CRC. Лишние два 0x00 никак не мешают SDHC картам, и также не мешают SD картам кроме собственно разблокировки (а вот установить/стереть пароль/глобально стереть при помощи такой команды можно)
Прикрепленное изображение

Go to the top of the page
 
+Quote Post
VslavX
сообщение Oct 2 2010, 05:58
Сообщение #2


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



NXP ответили, предложили попробовать установить длину блока в 1 байт и передать так. Ессно, при этом MCI стал посылать два байта CRC после каждого байта данных. На практике был послан первый байт парольного пакета, за ним 2 байта CRC, после этого MCI стал ждать токен подтверждения СRC от карты. А карта ждет полный блок (с длиной пароля) и в итоге после нескольких тактов набирает этот пакет, CRC конечно не совпадает и транзакция завершается с ошибкой. Установить же длину блока в карте в 1 байт не помогает - не получается передать пароль в нескольких 1-байтных блоках, команда LOCK_UNLOCK так не работает.
В-общем, "улыбаемся и машем, парни" ©, придется сделать LOCK_UNLOCK через GPIO.
P.S. Еще меня поддержка паролей в телефонах Нокиа порадовала - они его в Unicode вводят, то есть далеко не всякий пароль можно установить и не всякую карту запароленную на стороннем оборудовании можно прочитать.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Oct 14 2010, 06:46
Сообщение #3


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Захирел что-то электроникс - ни идей ни предложений. Пришлось выкручиваться самому smile.gif
Результат получился такой - посылаем блок данных нужной длины в STREAM_MODE с добавлением вычисленной вручную контрольной суммы CRC-16, на ответный токен забиваем. А готовность и ошибки уже мониторим командой статуса. Немного некошерно - но работает.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016