2 #if (USE_STM32_USB_HOST_MODE || USE_STM32_USB_USE_DEVICE_MODE || USE_STM32_USB_OTG_MODE)
30 #include "config/usb_conf.h"
31 #if defined(USE_HOST_MODE)
34 #include "stm32/usb/usbh_core.h"
42 #define USB_ACCESSORY_VENDOR_ID 0x18D1
43 #define USB_ACCESSORY_PRODUCT_ID 0x2D00
44 #define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01
46 #define USB_AUDIO_PRODUCT_ID 0x2D02
47 #define USB_AUDIO_ADB_PRODUCT_ID 0x2D03
48 #define USB_ACCESSORY_AUDIO_PRODUCT_ID 0x2D04
49 #define USB_ACCESSORY_AUDIO_ADB_PRODUCT_ID 0x2D05
51 #define ACCESSORY_STRING_MANUFACTURER 0
52 #define ACCESSORY_STRING_MODEL 1
53 #define ACCESSORY_STRING_DESCRIPTION 2
54 #define ACCESSORY_STRING_VERSION 3
55 #define ACCESSORY_STRING_URI 4
56 #define ACCESSORY_STRING_SERIAL 5
59 #define ACCESSORY_GET_PROTOCOL 51
60 #define ACCESSORY_SEND_STRING 52
61 #define ACCESSORY_START 53
64 #define ACCESSORY_REGISTER_HID 54
65 #define ACCESSORY_UNREGISTER_HID 55
66 #define ACCESSORY_SET_HID_REPORT_DESC 56
67 #define ACCESSORY_SEND_HID_EVENT 57
68 #define ACCESSORY_SET_AUDIO_MODE 58
70 #define USBH_ADK_DATA_SIZE 64
71 #define USBH_ADK_NAK_RETRY_LIMIT 1
77 ADK_INIT_GET_PROTOCOL,
78 ADK_INIT_SEND_MANUFACTURER,
80 ADK_INIT_SEND_DESCRIPTION,
81 ADK_INIT_SEND_VERSION,
86 ADK_INIT_CONFIGURE_ANDROID,
116 uint16_t BulkInEpSize;
117 uint16_t BulkOutEpSize;
118 uint32_t inbuff[(USBH_ADK_DATA_SIZE+
sizeof(uint32_t)-1)/
sizeof(uint32_t)];
119 uint32_t outbuff[(USBH_ADK_DATA_SIZE+
sizeof(uint32_t)-1)/
sizeof(uint32_t)];
122 enum adk_init_state_e initstate;
123 enum adk_state_e state;
124 enum adk_tx_state_e tx_state;
125 const char *acc_manufacturer;
126 const char *acc_model;
127 const char *acc_description;
128 const char *acc_version;
130 const char *acc_serial;
136 #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
137 #if defined ( __ICCARM__ )
138 #pragma data_alignment=4
141 static __ALIGN_BEGIN
struct adk_t sAdk __ALIGN_END;
143 static USBH_Status USBH_ADK_getProtocol ( USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
145 phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_VENDOR | USB_REQ_RECIPIENT_DEVICE;
146 phost->Control.setup.b.bRequest = ACCESSORY_GET_PROTOCOL;
147 phost->Control.setup.b.wValue.w = 0;
148 phost->Control.setup.b.wIndex.w = 0;
149 phost->Control.setup.b.wLength.w = 2;
152 return USBH_CtlReq(pdev, phost, (uint8_t*)&sAdk.protocol , 2 );
164 static USBH_Status USBH_ADK_sendString ( USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost, uint16_t index,
const char* buff)
167 length = (uint16_t)
strlen(buff)+1;
169 phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_VENDOR | USB_REQ_RECIPIENT_DEVICE;
170 phost->Control.setup.b.bRequest = ACCESSORY_SEND_STRING;
171 phost->Control.setup.b.wValue.w = 0;
172 phost->Control.setup.b.wIndex.w = index;
173 phost->Control.setup.b.wLength.w = length;
176 return USBH_CtlReq(pdev, phost, (uint8_t*)buff , length );
185 static USBH_Status USBH_ADK_switch ( USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
187 phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_VENDOR | USB_REQ_RECIPIENT_DEVICE;
188 phost->Control.setup.b.bRequest = ACCESSORY_START;
189 phost->Control.setup.b.wValue.w = 0;
190 phost->Control.setup.b.wIndex.w = 0;
191 phost->Control.setup.b.wLength.w = 0;
194 return USBH_CtlReq(pdev, phost, 0 , 0);
204 static USBH_Status USBH_ADK_configAndroid ( USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
206 USBH_HOST *pphost = phost;
208 iprintf(
"ADK:configure bulk endpoint\n");
210 if(pphost->device_prop.Ep_Desc[0][0].bEndpointAddress & 0x80)
212 sAdk.BulkInEp = (pphost->device_prop.Ep_Desc[0][0].bEndpointAddress);
213 sAdk.BulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
217 sAdk.BulkOutEp = (pphost->device_prop.Ep_Desc[0][0].bEndpointAddress);
218 sAdk.BulkOutEpSize = pphost->device_prop.Ep_Desc[0] [0].wMaxPacketSize;
221 if(pphost->device_prop.Ep_Desc[0][1].bEndpointAddress & 0x80)
223 sAdk.BulkInEp = (pphost->device_prop.Ep_Desc[0][1].bEndpointAddress);
224 sAdk.BulkInEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
228 sAdk.BulkOutEp = (pphost->device_prop.Ep_Desc[0][1].bEndpointAddress);
229 sAdk.BulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
232 sAdk.hc_num_out = USBH_Alloc_Channel(pdev, sAdk.BulkOutEp);
233 sAdk.hc_num_in = USBH_Alloc_Channel(pdev, sAdk.BulkInEp);
236 USBH_Open_Channel (pdev,
238 pphost->device_prop.address,
239 pphost->device_prop.speed,
243 USBH_Open_Channel (pdev,
245 pphost->device_prop.address,
246 pphost->device_prop.speed,
259 static USBH_Status USBH_ADK_InterfaceInit ( USB_OTG_CORE_HANDLE *pdev,
void *phost)
261 USBH_Status status = USBH_OK;
263 sAdk.state = ADK_INITIALIZING;
279 void USBH_ADK_InterfaceDeInit ( USB_OTG_CORE_HANDLE *pdev,
void *phost)
284 sAdk.state = ADK_INITIALIZING;
285 sAdk.initstate = ADK_INIT_SETUP;
294 if ( sAdk.hc_num_out)
296 USB_OTG_HC_Halt(pdev, sAdk.hc_num_out);
297 USBH_Free_Channel (pdev, sAdk.hc_num_out);
302 USB_OTG_HC_Halt(pdev, sAdk.hc_num_in);
303 USBH_Free_Channel (pdev, sAdk.hc_num_in);
318 static USBH_Status USBH_ADK_ClassRequest(USB_OTG_CORE_HANDLE *pdev,
void *phost)
320 USBH_HOST *pphost = phost;
321 USBH_Status status = USBH_BUSY ;
323 switch (sAdk.initstate)
327 iprintf(
"> USB_ADK_ClassRequest\n");
333 if(pphost->device_prop.Dev_Desc.idVendor == USB_ACCESSORY_VENDOR_ID &&
334 (pphost->device_prop.Dev_Desc.idProduct == USB_ACCESSORY_PRODUCT_ID ||
335 pphost->device_prop.Dev_Desc.idProduct == USB_ACCESSORY_ADB_PRODUCT_ID)
337 sAdk.initstate = ADK_INIT_CONFIGURE_ANDROID;
339 sAdk.initstate = ADK_INIT_GET_PROTOCOL;
344 case ADK_INIT_GET_PROTOCOL:
345 if ( USBH_ADK_getProtocol ( pdev, phost ) == USBH_OK ){
346 if (sAdk.protocol >= 1) {
347 sAdk.initstate = ADK_INIT_SEND_MANUFACTURER;
349 iprintf(
"ADK:device supports protocol 1\n");
352 sAdk.initstate = ADK_INIT_FAILED;
354 iprintf(
"ADK:could not read device protocol version\n");
359 case ADK_INIT_SEND_MANUFACTURER:
360 if( USBH_ADK_sendString ( pdev, phost, ACCESSORY_STRING_MANUFACTURER, sAdk.acc_manufacturer)== USBH_OK ){
361 sAdk.initstate = ADK_INIT_SEND_MODEL;
363 iprintf(
"ADK:SEND_MANUFACTURER\n");
367 case ADK_INIT_SEND_MODEL:
368 if( USBH_ADK_sendString ( pdev, phost, ACCESSORY_STRING_MODEL, sAdk.acc_model)== USBH_OK ){
369 sAdk.initstate = ADK_INIT_SEND_DESCRIPTION;
375 case ADK_INIT_SEND_DESCRIPTION:
376 if( USBH_ADK_sendString ( pdev, phost, ACCESSORY_STRING_DESCRIPTION, sAdk.acc_description)== USBH_OK ){
377 sAdk.initstate = ADK_INIT_SEND_VERSION;
379 iprintf(
"ADK:SEND_DESCRIPTION\n");
383 case ADK_INIT_SEND_VERSION:
384 if( USBH_ADK_sendString ( pdev, phost, ACCESSORY_STRING_VERSION, sAdk.acc_version)== USBH_OK ){
385 sAdk.initstate = ADK_INIT_SEND_URI;
391 case ADK_INIT_SEND_URI:
392 if( USBH_ADK_sendString ( pdev, phost, ACCESSORY_STRING_URI, sAdk.acc_uri)== USBH_OK ){
393 sAdk.initstate = ADK_INIT_SEND_SERIAL;
399 case ADK_INIT_SEND_SERIAL:
400 if( USBH_ADK_sendString ( pdev, phost, ACCESSORY_STRING_SERIAL, sAdk.acc_serial)== USBH_OK ){
401 sAdk.initstate = ADK_INIT_SWITCHING;
407 case ADK_INIT_SWITCHING:
408 if( USBH_ADK_switch ( pdev, phost)== USBH_OK ){
409 sAdk.initstate = ADK_INIT_GET_DEVDESC;
411 iprintf(
"ADK:switch to accessory mode\n");
416 case ADK_INIT_GET_DEVDESC:
417 if( USBH_Get_DevDesc(pdev , phost, USB_DEVICE_DESC_SIZE)== USBH_OK ){
418 sAdk.initstate = ADK_INIT_DONE;
419 sAdk.pid = pphost->device_prop.Dev_Desc.idProduct;
421 if(pphost->device_prop.Dev_Desc.idVendor == USB_ACCESSORY_VENDOR_ID &&
422 (pphost->device_prop.Dev_Desc.idProduct == USB_ACCESSORY_PRODUCT_ID ||
423 pphost->device_prop.Dev_Desc.idProduct == USB_ACCESSORY_ADB_PRODUCT_ID)
425 sAdk.initstate = ADK_INIT_CONFIGURE_ANDROID;
427 sAdk.initstate = ADK_INIT_FAILED;
432 case ADK_INIT_CONFIGURE_ANDROID:
433 USBH_ADK_configAndroid(pdev, phost);
434 sAdk.initstate = ADK_INIT_DONE;
440 iprintf(
"ADK:configuration complete.\n");
444 case ADK_INIT_FAILED:
445 status = USBH_UNRECOVERED_ERROR;
462 static USBH_Status USBH_ADK_Handle(USB_OTG_CORE_HANDLE *pdev,
void *phost)
464 uint32_t HCD_GXferCnt = HCD_GetXferCnt(pdev , sAdk.hc_num_in);
465 HC_STATUS HCD_Status = HCD_GetHCState(pdev , sAdk.hc_num_in);
466 URB_STATE URB_Status;
470 sAdk.inSize = HCD_GXferCnt;
473 if (HCD_Status == HC_XFRC &&
time_elapsed(sAdk.timeout))
476 USBH_BulkReceiveData(pdev, (uint8_t*)sAdk.inbuff, USBH_ADK_DATA_SIZE, sAdk.hc_num_in);
481 case ADK_INITIALIZING:
482 USBH_BulkReceiveData(pdev, (uint8_t*)sAdk.inbuff, USBH_ADK_DATA_SIZE, sAdk.hc_num_in);
483 sAdk.state = ADK_IDLE;
493 URB_Status = HCD_GetURB_State(pdev , sAdk.hc_num_out);
494 HCD_Status = HCD_GetHCState(pdev , sAdk.hc_num_out);
496 switch (sAdk.tx_state)
502 USBH_BulkSendData(pdev, (uint8_t*)sAdk.outbuff, sAdk.outSize, sAdk.hc_num_out);
503 sAdk.tx_state = ADK_TX_BUSY;
511 sAdk.tx_state = ADK_TX_IDLE;
525 if (sAdk.nakretry++ < 500)
527 USBH_BulkSendData(pdev, (uint8_t*)sAdk.outbuff, sAdk.outSize, sAdk.hc_num_out);
532 sAdk.tx_state = ADK_TX_IDLE;
539 iprintf(
"USBH_ADK_ReInit called from USBH_ADK_Handle\n");
553 USBH_Class_cb_TypeDef USBH_ADK_cb =
555 USBH_ADK_InterfaceInit,
556 USBH_ADK_InterfaceDeInit,
557 USBH_ADK_ClassRequest,
564 static void disconnected(
void)
567 printf(
"> Device Disconnected\n");
573 static void do_nothing(
void){}
574 static void do_nothing_uint8_t(uint8_t unused){}
575 static void do_nothing_voidptr(
void *unused){}
576 static void do_nothing_desc(USBH_CfgDesc_TypeDef *a, USBH_InterfaceDesc_TypeDef *b, USBH_EpDesc_TypeDef *c){}
578 static USBH_USR_Status do_nothing_ret_ok(){
return USBH_USR_RESP_OK;}
579 static int do_nothing_ret_int(){
return 0;}
581 static USBH_Usr_cb_TypeDef USR_Callbacks =
584 .DeInit = do_nothing,
585 .DeviceAttached = do_nothing,
586 .ResetDevice = do_nothing,
587 .DeviceDisconnected = disconnected,
588 .OverCurrentDetected = do_nothing,
589 .DeviceSpeedDetected = do_nothing_uint8_t,
590 .DeviceDescAvailable = do_nothing_voidptr,
591 .DeviceAddressAssigned = do_nothing,
592 .ConfigurationDescAvailable = do_nothing_desc,
593 .ManufacturerString = do_nothing_voidptr,
594 .ProductString = do_nothing_voidptr,
595 .SerialNumString = do_nothing_voidptr,
596 .EnumerationDone = do_nothing,
597 .UserInput = do_nothing_ret_ok,
598 .UserApplication = do_nothing_ret_int,
599 .DeviceNotSupported = do_nothing,
600 .UnrecoveredError = do_nothing,
605 sAdk.initstate = ADK_INIT_SETUP;
606 sAdk.state = ADK_INITIALIZING;
607 sAdk.tx_state = ADK_TX_IDLE;
612 USBH_Init(&USB_OTG_Core, USB_OTG_FS_CORE_ID, &USB_Host, &USBH_ADK_cb, &USR_Callbacks);
628 status_e USBH_ADK_Init(
const char* manufacture,
const char* model,
const char* description,
const char* version,
const char* uri,
const char* serial)
630 const size_t max_size = 255;
631 if (
strlen(manufacture) > max_size)
635 sAdk.acc_manufacturer = manufacture;
637 if (
strlen(model) > max_size)
641 sAdk.acc_model = model;
643 if (
strlen(description) > max_size)
647 sAdk.acc_description = description;
649 if (
strlen(version) > max_size)
653 sAdk.acc_version = version;
655 if (
strlen(uri) > max_size)
661 if (
strlen(serial) > max_size)
665 sAdk.acc_serial = serial;
667 return USBH_ADK_ReInit();
678 status_e USBH_ADK_write(USB_OTG_CORE_HANDLE *pdev,
const uint8_t *buff,
size_t len)
682 while (sAdk.tx_state != ADK_TX_IDLE)
684 USBH_Process(&USB_OTG_Core , &USB_Host);
688 iprintf(
"%s:timeout", __FUNCTION__);
693 if (len >
sizeof(sAdk.outbuff))
698 memcpy(&sAdk.outbuff[0], buff, len);
700 sAdk.tx_state = ADK_TX_START;
713 status_e USBH_ADK_read(USB_OTG_CORE_HANDLE *pdev, uint8_t *buff,
size_t len,
size_t *rlen)
715 uint32_t xfercount = sAdk.inSize;
723 *rlen = min(xfercount, len);
724 memcpy(buff, sAdk.inbuff, *rlen);
725 memset(sAdk.inbuff, 0x00,
sizeof(sAdk.inbuff));
733 uint32_t USBH_ADK_Connected(
void)
735 return sAdk.state == ADK_IDLE;
void * memcpy(void *dest, const void *src, size_t n)
void * memset(void *dest, int n, size_t n)
libheivs configuration file
This file contains all the prototypes for the usbh_adk_core.c.
static uint32_t time_elapsed(timeout_t timeout)
Is this time passed?
int printf(const char *fmt,...)
printf
timeout_t time_set_timeout_ms(uint32_t ms)
Set an obscure time at least ms milliseconds in the future.
int iprintf(const char *fmt,...)
iprintf Integer-only version of printf
size_t strlen(const char *str)