Не получается ни так ни этак.
Что-то совсем запутался, уже не знаю, что и делать.
Пытаюсь организовать канал прерывания для чтения репорта мыши.
Подскажите, как правильно сформировать список TD для запроса данных IN прерывания?
Один из моих вариантов.
Код
// |Формируем структуру дескриптора конечной точки ED
AT91F_CreateEd(
(unsigned int) &pCtrlED, // ED Address
8, // Max packet size
0, // TD format
1, // Skip
1, // Speed = "Low" ("0" <=> "Full", "1" <=> "Low")
0x0, // Direction (брать из поля PID Td)
0x1, // Endpoint Address
FuncAddress, // Func Address
(unsigned int) &pCtrlTD[2], // TDQTailPointer
(unsigned int) &pCtrlTD[0], // TDQHeadPointer
0, // ToggleCarry
0x0); // NextED
//Data IN
AT91F_CreateGenTd(
(unsigned int) &pCtrlTD[0], // TD Address
3, // Data Toggle (First data packet <=> всегда DATA1)
0x00, // DelayInterrupt
0x2, // Direction ("2" <=> In)
1, // Buffer Rounding
(unsigned int) buffer, // Current Buffer Pointer (сюда принимаем данные)
(unsigned int) &pCtrlTD[1], // Next TD
5); // Buffer Length
//Status OUT
AT91F_CreateGenTd(
(unsigned int) &pCtrlTD[1], // TD Address
3, // Data Toggle (Status packet <=> всегда DATA1)
0x00, // DelayInterrupt
0x01, // Direction ("1" <=> Out)
1, // Buffer Rounding
0x0, // Current Buffer Pointer
(unsigned int) &pCtrlTD[2], // Next TD
0x0); // Buffer Length
// Этот TD хостом никогда не обрабатывается
AT91F_CreateGenTd(
(unsigned int) &pCtrlTD[2], // TD Address
3, // Data Toggle
0x00, // DelayInterrupt
0x01, // Direction ("1" <=> Out)
1, // Buffer Rounding
0x0, // Current Buffer Pointer
(unsigned int) 0, // Next TD
0x0); // Buffer Length
После я подсоединяю ED к HCCA. HccaInterrruptTable[0] и установив бит PLE в HcControl.
Ждем события мыши, так как предварительно было установлено Idle = 0.
Нажав на кнопку мыши, я принимаю первый пакет данных, в buffer записываются прочитанные данные и они вроде правильные.
Но в pCtrlTD[1].control в поле CC = 5 ошибка
DEVICENOTRESPONDING Device did not respond to token (IN) or did not provide a
handshake (OUT)
И все от мыши больше ничего принять нельзя.
Перечитал кучу литературы с нулевым результатов.
Передача прерывания состоит из трех пакетов
Token Packet
Data Packet
H/S Packet
pCtrlTD[0] – это Data Packet
pCtrlTD[1] – должен быть H/S Packet (но он передается с ошибкой)
Кто формирует Token Packet.
Думаю, что его формирует OHCI из ED, но может его нужно указывать явно через дополнительный TD (так тоже пробовал, но ничего не получилось).
Подскажите хотя бы правильное направление, а то три недели стою на месте уже не знаю что и делать.