Обработка ошибок USB XACT_ERROR и BABBLE_DETECTED
От: Yuricsson Россия  
Дата: 15.01.16 10:14
Оценка:
Здравствуйте, гуру!

Столкнулся с такой проблемой — есть устройство (на msp430f5528) с bulk-пайпом, по которому передаю в реалтайме некие данные.
Изредка выскакивает ошибка USBD_STATUS_BABBLE_DETECTED или ещё реже USBD_STATUS_XACT_ERROR. Как я понял, в этом случае нужно сделать ABORT_PIPE, подождать завершения очереди висящих запросов, потом сделать RESET_PIPE и возобновить запросы.
Всё вроде бы понятно, но запрос ABORT_PIPE формируется с помощью IoBuildDeviceIoControlRequest, которую нужно вызывать при IRQL<=APC_LEVEL, а я в момент получения ошибки нахожусь в CompletionRoutine, то есть на уровне DISPATCH_LEVEL. Погуглил интернет, вроде бы советуют самостоятельно создавать эту IRP с помощью IoAllocateIrp. Я так сделал, но запрос возвращает STATUS_PENDING, запросы продолжают себе спокойно висеть, ничего не происходит.
Ладно, я вручную отменяю свою очередь запросов без использования ABORT_PIPE, потом когда последний запрос отменяется, мне нужно сделать RESET_PIPE, но я опять нахожусь в CompletionRoutine и не могу сформировать этот запрос через IoBuildDeviceIoControlRequest. Опять создаю IRP сам, запрос опять возвращает STATUS_PENDING и всё. Все дальнейшие запросы возвращаются с ошибкой.
Кто может подсказать механизм (лучше с кусочком работающего кода) для правильного восстановления пайпа после этих ошибок?

Я использую очередь из нескольких запросов, которая крутится сама в себе с CompetionRoutine и копит данные в буфере независимо от чтения данных из user-mode.

Спасибо большое!

Юрий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.