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

 
 
> Странности (или ошибки) примера 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



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

 


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


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