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

 
 
> Странности (или ошибки) примера USB Mass Storage от Keil, обработка ошибок
sonycman
сообщение Jun 26 2009, 08:56
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Осваиваю тут пример USB MSC для STM32, скачанный с сайта Кейл. Впрочем, практически такие-же примеры существуют и для LPC на этом-же сайте.
Вот архив, если кому интересно:
Прикрепленный файл  STM32_USBMem.rar ( 66.81 килобайт ) Кол-во скачиваний: 165

Так вот, в некоторых местах кода озадачила обработка нештатных ситуаций и ошибок при проверке данных на уровне класса MSC.
К примеру, часто встречающаяся последовательность:
Код
    USB_SetStallEP(MSC_EP_IN);
    USB_SetStallEP(MSC_EP_OUT);
    CSW.bStatus = CSW_PHASE_ERROR;
    MSC_SetCSW();

то есть устанавливаются флаги STALL для обоих конечных точек bulk, а затем подготавливаются данные статуса CSW для последующей отправки хосту. Вроде всё правильно.
Но! Функция MSC_SetCSW() вызывает WriteEP, которая копирует данные в SRAM буфер конечной точки и затем перезаписывает её статус как VALID, то есть записанный перед этим STALL совершенно затирается!

Ну не бред ли??

В результате получится вместо STALL обычный ACK, данные статуса CSW уйдут как обычный пакет данных... что будет дальше, можно уже не разбираться - просто хаос...

В основном код написан вроде бы правильно, с верной обработкой протокола, но вот это место ставит меня в тупик - может быть я тут что-то недопонимаю?
Всё таки первый раз имею дело с USB и MSC...


Ещё хотел спросить - каким образом хост определяет конец фазы передачи данных в режиме Mass Storage?
Если последний пакет данных будет меньше максимально допустимого для данной конечной точки?
Или как-то по другому?

А то сижу сейчас и думаю, как мне обрабатывать неподдерживаемые моим девайсом SCSI команды.
К примеру, приходит CBW с какой нибудь SCSI_MODE_SELECT10, по идее я должен обработать фазу передачи данных для этой команды (если она есть), и уже затем отправить CSW с флагом CSW_CMD_FAILED.
То есть, если фаза данных будет состоять из 1000 байт, будет ли хост слать IN пакеты, пока не будут переданы все 1000 байт, или передача прекратится на первом же пакете нулевой (или любой другой, меньшей MAX_PACKET_SIZE) длины?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vitaMAX
сообщение Oct 19 2009, 19:16
Сообщение #2





Группа: Участник
Сообщений: 8
Регистрация: 18-10-09
Пользователь №: 53 046



В проекте Memory при старте массив const unsigned char DiskImage[MSC_ImageSize] записывается в RAM.
Затем, в ф-ции void MSC_MemoryRead (void) считывается поблочно вся память на RAM.
Возникает вопрос, а если флешка была бы не на 16Kb, а на 2Гб - сколько бы времени ушло на пробег по всей памяти? здесь явно нужен другой подход для реализации usb mass storage на mmc.
И второй вопрос. чтобы винда не говорила, что флешка не отформатирована, ей нужно дать заголовочный сектор с флешки-mmc карты.
Я использовал ф-цию чтения с карты int fs_spi_ReadData (U32 adr, U32 sz, U8 *buf), но безрезультатно. Да, блоки считываются, но в них явно не та инфа.
Помогите советом, как заставить винду видеть mmc-card как usb mass storage
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 20:04
Рейтинг@Mail.ru


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