[an error occurred while processing this directive]
|
Первое чтение дескриптора хост принудительно обрывает. Читает только первые 8 байт. Это ты и наблюдаешь. Так и должно быть.
Потом хост назначает адрес устройству и читает дескриптор еще раз. Теперь уже до конца. При инициализации драйверов каждый драйвер в стеке протоколов еще раз читает дескрипторы.
Вот протокол событий (прерываний) при енумерации:
IntAltSusp //сначала вышестоящий хаб "усыпляет" устройство, чтоб зря не кушало
IntAltRst //а теперь хаб начинает будить спящее устройство
IntAltRst //таких событий дальше много, т.к. на просыпание может
понадобиться большое время
...
IntRx0SetupGetDescDevice //теперь хост начинает читать дескриптор используя 0-й адрес
IntTx0 //читает первые 8 байт, из них он узнает размер EP0, версию
USB поддерживаемую устройством
IntNakRx0 //и обрывает чтение, переключая направление ControlPipe в сторону передачи от хоста
IntAltRst //опять множество RESET
IntAltRst
...
IntRx0SetupSetAddr82 //хост задает адрес, значимые только 7 младших бит, поэтому адрес 0x02
IntTx0ControlPipeRxOK //транзакция успешно подтверждается
IntRx0SetupGetDescDevice //хост читает дескриптор устройства
IntTx0 //несколькими порциями по 8 байт, кроме последней, которая меньше или вовсе пустая
IntTx0
IntTx0
IntRx0ControlPipeTxOK //транзакция успешно подтверждается
IntRx0SetupGetDescConfig //хост читает дескриптор конфигурации
IntTx0
IntTx0
IntTx0
IntTx0
IntTx0
IntRx0ControlPipeTxOK //транзакция успешно подтверждается
IntRx0SetupGetDescDevice //хост читает дескриптор устройства и дескриптор конфигурации еще несколько раз
IntTx0
IntTx0
IntTx0
IntRx0ControlPipeTxOK //транзакция успешно подтверждается
IntRx0SetupGetDescConfig
IntTx0
IntTx0
IntTx0
IntTx0
IntTx0
IntRx0ControlPipeTxOK //транзакция успешно подтверждается
IntRx0SetupGetDescConfig
IntTx0
IntTx0
IntTx0
IntTx0
IntTx0
IntRx0ControlPipeTxOK //транзакция успешно подтверждается
IntRx0SetupSetConf01 //хост задает номер конфигурации (0x01) в которой
будет использовать устройство
IntTx0ControlPipeRxOK //транзакция успешно подтверждается
IntRx0SetupSetIdle //хост инициализирует HID устройство
IntTx0ControlPipeRxOK //транзакция успешно подтверждается
IntRx0SetupGetDescHidrep //хост читает HID дескриптор
IntTx0
IntTx0
IntTx0
IntTx0
IntRx0ControlPipeTxOK //транзакция успешно подтверждается
IntNakTx1 //хост начинает опрашивать EP1, чтобы забирать через него HID
report
IntNakTx1 //а так как я ничего в FIFO1 не положил, то USBN на эти
попытки чтения дает NAK
IntNakTx1
... //так продолжается бесконечно
Что касается разницы между D12 и USBN9603 - то, по моему, чипы почти одинаковые. Просто пример для USBN9603 который можно скачать с сайта NS это откровенная халтура.
E-mail: info@telesys.ru