Работает Control, Bulk, Int передачи.
Настроил запуск Iso IN транзакции.
Для простоты, в таблице прерываний HCCA инициализировал только одну точку. Хочу чтобы хост, для начала, выполнил только одну транзакцию.
Вот код настройки:
Код
// Disable periodic list processing
HcControl &= ~( OR_CONTROL_PLE | OR_CONTROL_IE );
Hcca->IntTable[ 0 ]= (unsigned int)EndpointDescriptorInt;
EndpointDescriptorInt->Control = 1 | // USB address
( 3 << 7 ) | // Endpoint address
( 2 << 11 ) | // direction IN
( ISO_PACKET_SIZE << 16 ); // MaxPkt Size
EndpointDescriptorInt->HeadTd = (unsigned int)TDTail;
EndpointDescriptorInt->TailTd = (unsigned int)TDTail;
EndpointDescriptorInt->Next= (unsigned int)EndpointDescriptorIso;
EndpointDescriptorIso->Control = 1 | // USB address
( 2 << 7 ) | // Endpoint address
( 2 << 11 ) | // direction IN
( 1 << 15 ) | // format ISO
( ISO_PACKET_SIZE << 16 ); // MaxPkt Size
TDHead_ISO->Control = (((HcFmNumber)&0xFFFF) | // Starting Frame
TD_DELAY_INT(0) | // Delay Interrupt ( 0 << 21 )
( 0 << 24 ) | // Frame Count ( 0 - 1 packet, 7 - 8 packets )
TD_CC); // Completition Code 0xF0000000
TDTail->Control = 0;
TDHead_ISO->BP0 = (unsigned int) TDIntBuffer;
TDTail->CurrBufPtr = 0;
TDHead_ISO->Next = (unsigned int) TDTail;
TDTail->Next = 0;
TDHead_ISO->BufEnd = 0;
TDTail->BufEnd = 0;
TDHead_ISO->Offset[0] = 0xE000;
TDHead_ISO->Offset[1] = 0;
TDHead_ISO->Offset[2] = 0;
TDHead_ISO->Offset[3] = 0;
TDHead_ISO->Offset[4] = 0;
TDHead_ISO->Offset[5] = 0;
TDHead_ISO->Offset[6] = 0;
TDHead_ISO->Offset[7] = 0;
EndpointDescriptorIso->HeadTd = (unsigned int)TDHead_ISO |
((EndpointDescriptorIso->HeadTd) & 0x00000002);
EndpointDescriptorIso->TailTd = (unsigned int)TDTail;
EndpointDescriptorIso->Next= 0;
// Set the time when periodic list processing should start
HcPeriodicStart= ( HcFmInterval & 0x00003fff ) / 2;
// Enable periodic list processing
HcControl |= ( OR_CONTROL_PLE | OR_CONTROL_IE );
HcControl &= ~( OR_CONTROL_PLE | OR_CONTROL_IE );
Hcca->IntTable[ 0 ]= (unsigned int)EndpointDescriptorInt;
EndpointDescriptorInt->Control = 1 | // USB address
( 3 << 7 ) | // Endpoint address
( 2 << 11 ) | // direction IN
( ISO_PACKET_SIZE << 16 ); // MaxPkt Size
EndpointDescriptorInt->HeadTd = (unsigned int)TDTail;
EndpointDescriptorInt->TailTd = (unsigned int)TDTail;
EndpointDescriptorInt->Next= (unsigned int)EndpointDescriptorIso;
EndpointDescriptorIso->Control = 1 | // USB address
( 2 << 7 ) | // Endpoint address
( 2 << 11 ) | // direction IN
( 1 << 15 ) | // format ISO
( ISO_PACKET_SIZE << 16 ); // MaxPkt Size
TDHead_ISO->Control = (((HcFmNumber)&0xFFFF) | // Starting Frame
TD_DELAY_INT(0) | // Delay Interrupt ( 0 << 21 )
( 0 << 24 ) | // Frame Count ( 0 - 1 packet, 7 - 8 packets )
TD_CC); // Completition Code 0xF0000000
TDTail->Control = 0;
TDHead_ISO->BP0 = (unsigned int) TDIntBuffer;
TDTail->CurrBufPtr = 0;
TDHead_ISO->Next = (unsigned int) TDTail;
TDTail->Next = 0;
TDHead_ISO->BufEnd = 0;
TDTail->BufEnd = 0;
TDHead_ISO->Offset[0] = 0xE000;
TDHead_ISO->Offset[1] = 0;
TDHead_ISO->Offset[2] = 0;
TDHead_ISO->Offset[3] = 0;
TDHead_ISO->Offset[4] = 0;
TDHead_ISO->Offset[5] = 0;
TDHead_ISO->Offset[6] = 0;
TDHead_ISO->Offset[7] = 0;
EndpointDescriptorIso->HeadTd = (unsigned int)TDHead_ISO |
((EndpointDescriptorIso->HeadTd) & 0x00000002);
EndpointDescriptorIso->TailTd = (unsigned int)TDTail;
EndpointDescriptorIso->Next= 0;
// Set the time when periodic list processing should start
HcPeriodicStart= ( HcFmInterval & 0x00003fff ) / 2;
// Enable periodic list processing
HcControl |= ( OR_CONTROL_PLE | OR_CONTROL_IE );
В результате хост трансфер дескриптор на обработку берет, но сразу же ставит его в Done со статусом Data Overrun.
При этом не ставит точку в Halt состояние и не меняет статуса в поле Offset[0].
Эта ситуация описана в доке на хост, как случающаяся, когда хост не может завершить транзакцию в указанном фрейме,
но он ее даже не начинает!
Я смотрю аппаратным анализатором шину, никакой активности хост на шине не показывает.
Помогите пожалуйста куда смотреть?