usbhostenum.c
uint32_t
USBHCDPipeRead(uint32_t ui32Pipe, uint8_t *pui8Data, uint32_t ui32Size)
{
// ...
while(ui32RemainingBytes != 0)
{
// ...
while(1)
{
// ...
// If any error event occurs then exit out of the loop.
if(g_sUSBHCD.ui32IntEvents & (INT_EVENT_DISCONNECT |
INT_EVENT_VBUS_ERR |
INT_EVENT_POWER_FAULT))
{
//
// Set the pipe state to error.
//
g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState = ePipeError;
// 아래 문장 추가
ui32RemainingBytes = 0;
break;
}
// ...
}
}
// ...
}
USBHCDPipeRead() 함수에는 바깥 loop가 있고 안쪽 loop가 있는데, 바깥 loop 는 ui32RemainingBytes 가 0이 될 때까지 반복하고 안쪽 loop는 다양한 조건에 의해 빠져나올 수 있도록 되어있다.
문제는 해당 함수가 실행되는 동안 USB 연결이 끊어지는 경우, 무한루프에 갇히는 것이다.
USB 상태가 변경되면 인터럽트 핸들러를 통해 g_sUSBHCD.ui32IntEvents 변수의 INT_EVENT_DISCONNECT 비트가 set되고 안쪽 loop에선 g_sUSBHCD.psUSBINPipes[0].iState 를 ePipeError로 만든 뒤 빠져나오지만 ui32RemainingBytes 이 0이 아니어서 여전히 바깥 loop를 탈출하지 못한다.
따라서 함수 실행 도중 USB DISCONNECT 가 감지되었을 때 ui32RemainingBytes = 0; 문장을 추가해줘야 한다.
'임베디드 개발 > TMS320F2838x (C28x)' 카테고리의 다른 글
TMS320F28388D ] IPC 사용하여 CPU1과 CPU2 타이머 Tick 값 Synchronization (0) | 2023.01.26 |
---|---|
TMS320F28388D ] RAM에 NOINIT 변수 두기 불가 (0) | 2023.01.25 |
TMS320F28388D ] 터미널 모니터와 메모리 덤프 (0) | 2023.01.10 |
TMS320F28388D ] 링버퍼 사용 SCI 에코백 (0) | 2022.12.30 |
TMS320F28388D ] CM에서 USB MSC 사용 (0) | 2022.12.28 |