본문 바로가기
임베디드 개발/TMS320F2838x (C28x)

TMS320F28388D ] USB 라이브러리 USBHCDPipeRead()에서 무한루프 빠지는 문제

by eteo 2023. 1. 25.

 

 

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; 문장을 추가해줘야 한다.