STM32를 이용해서 AOA로 동작하는 USB Host 코드 설명
이 부분을 선택하지 않으면 CubeIDE가 Code Generation을 하지 않는다.
나중에 AOA Class로 포팅한다.
참고로 CDC Class는 0x02의 값은 AOA Class는 0xFF로 포팅한다.
참고 : https://zetawiki.com/wiki/USB_%EC%9E%A5%EC%B9%98_%ED%81%B4%EB%9E%98%EC%8A%A4
CubeIDE로 Generate Code 동작을 하면 아래와 같이 소스코드가 생성된다.
USB Host Library (STM32_USB_Host_Library)코드와 Application (USB_HOST) 영역의 코드가 생성된다.
USB_Host 초기화
USB_HOST\App\usb_host.c 파일안에 위치한다.
void MX_USB_HOST_Init(void)
{
/* USER CODE BEGIN USB_HOST_Init_PreTreatment */
/* USER CODE END USB_HOST_Init_PreTreatment */
/* Init host Library, add supported class and start the library. */
if (USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS) != USBH_OK)
{
Error_Handler();
}
if (USBH_RegisterClass(&hUsbHostFS, USBH_CDC_CLASS) != USBH_OK)
{
Error_Handler();
}
if (USBH_Start(&hUsbHostFS) != USBH_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USB_HOST_Init_PostTreatment */
/* USER CODE END USB_HOST_Init_PostTreatment */
}
초기화 코드 중 USBH_CDC_CLASS 부분을 포팅한다. 이 부분을 고쳐야 AOA Class를 등록할 수 있다. 아래와 같이.
#define USB_ADK_CLASS 0xFFU
USBH_ClassTypeDef CDC_Class =
{
"CDC",
USB_CDC_CLASS,
USBH_CDC_InterfaceInit,
USBH_CDC_InterfaceDeInit,
USBH_CDC_ClassRequest,
USBH_CDC_Process,
USBH_CDC_SOFProcess,
NULL,
};
이 부분을 AOA 동작에 필요한 내용으로 포팅한다. 주로 필요한 내용은 ClassRequest, Process 부분이다. 참조할 수 있는 부분은 아래와 같다.
https://github.com/YuuichiAkagawa/STM32F4_ADK
USB Host는 USB Device 간의 Read, Write 동작은 USB Host 기준으로 Polling 동작을 한다.
USB H/W 블럭의 동작 상태에 따라 적절한 동작을 하도록 포팅이 필요하다.
USB 동작 처리를 하는 main 부분에서 호출 되도록 한다.
while (1)
{
/* USB Host Background task */
USBH_Process(&hUsbHostFS);
if (USBH_ADK_getStatus() == ADK_IDLE)
{
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
USB H/W 포트에 USB 케이블이 연결 되는지를 감지한다.
USB 케이블이 연결된 상태
USB 케이블로 연결된 Device의 USB 정보 (Device Description) 등을 만들고 통신 채널 (Pipe Line, End Point) 를 만든다.
연결된 Device가 Host에서 지원하는 장치인지 판단한다. (지원하는 Class 인지)
Config Description 내용 안의 Interface Description struct의 bInterfaceClass 를 확인
USB Host와 USB Device 장치간 AOA 동작을 지원하는지 확인 하는 과정이다.
Device Descriptor에서 얻은 정보로 AOA 장치를 지원하는 ID 장치 인지 확인
USB Device에서 지원하는 AOA Protocol Version 정보를 얻어 온다.
USB Host의 Manufacturer, Model, Version 정보를 Device로 전송 한다.
=> Device의 OS는 이 정보가 일치하는 Android Application을 찾는다.
USB Host 장치는 Android Device가 설치된 Android Application을 동작을 위해 Start (0x53) 정보를 전송한다.
USB Host 장치는 USB Device 장치와 Polling 동작 (BgndProcess) 동작을 한다.