diff options
author | Diego Ismirlian <dismirlian (at) google's mail.com> | 2017-07-09 18:30:46 -0300 |
---|---|---|
committer | Diego Ismirlian <dismirlian (at) google's mail.com> | 2017-07-09 18:30:46 -0300 |
commit | 025ca5345a8ffbb7de3b1c64fb0a5ddbbdacd3b0 (patch) | |
tree | 8b5fb3aa38faa39db8e35a1e59a6ef634b169974 /os/hal/src/hal_usbh.c | |
parent | c9388668449f9d686b1e4df14f9143263cc0fafc (diff) | |
download | ChibiOS-Contrib-025ca5345a8ffbb7de3b1c64fb0a5ddbbdacd3b0.tar.gz ChibiOS-Contrib-025ca5345a8ffbb7de3b1c64fb0a5ddbbdacd3b0.tar.bz2 ChibiOS-Contrib-025ca5345a8ffbb7de3b1c64fb0a5ddbbdacd3b0.zip |
USBH: Added mechanism for out-of-tree class driver enumeration
Diffstat (limited to 'os/hal/src/hal_usbh.c')
-rw-r--r-- | os/hal/src/hal_usbh.c | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/os/hal/src/hal_usbh.c b/os/hal/src/hal_usbh.c index 9e6c8eb..d0d3cb7 100644 --- a/os/hal/src/hal_usbh.c +++ b/os/hal/src/hal_usbh.c @@ -66,6 +66,12 @@ static void _classdriver_process_device(usbh_device_t *dev); static bool _classdriver_load(usbh_device_t *dev, uint8_t class, uint8_t subclass, uint8_t protocol, uint8_t *descbuff, uint16_t rem); +#if HAL_USBH_USE_ADDITIONAL_CLASS_DRIVERS +#include "usbh_additional_class_drivers.h" +#ifndef HAL_USBH_ADDITIONAL_CLASS_DRIVERS +#error "Must define HAL_USBH_ADDITIONAL_CLASS_DRIVERS" +#endif +#endif /*===========================================================================*/ /* Checks. */ @@ -105,28 +111,6 @@ void usbhObjectInit(USBHDriver *usbh) { #endif } -void usbhInit(void) { -#if HAL_USBH_USE_FTDI - usbhftdiInit(); -#endif -#if HAL_USBH_USE_AOA - usbhaoaInit(); -#endif -#if HAL_USBH_USE_MSD - usbhmsdInit(); -#endif -#if HAL_USBH_USE_HID - usbhhidInit(); -#endif -#if HAL_USBH_USE_UVC - usbhuvcInit(); -#endif -#if HAL_USBH_USE_HUB - usbhhubInit(); -#endif - usbh_lld_init(); -} - void usbhStart(USBHDriver *usbh) { usbDbgInit(usbh); @@ -1236,6 +1220,7 @@ void usbhMainLoop(USBHDriver *usbh) { static usbh_baseclassdriver_t *iad_load(usbh_device_t *dev, const uint8_t *descriptor, uint16_t rem); static void iad_unload(usbh_baseclassdriver_t *drv); static const usbh_classdriver_vmt_t usbhiadClassDriverVMT = { + NULL, iad_load, iad_unload }; @@ -1290,8 +1275,11 @@ static void iad_unload(usbh_baseclassdriver_t *drv) { /*===========================================================================*/ /* Class driver loader. */ /*===========================================================================*/ - static const usbh_classdriverinfo_t *usbh_classdrivers_lookup[] = { +#if HAL_USBH_USE_ADDITIONAL_CLASS_DRIVERS + /* user-defined out of tree class drivers */ + HAL_USBH_ADDITIONAL_CLASS_DRIVERS +#endif #if HAL_USBH_USE_FTDI &usbhftdiClassDriverInfo, #endif @@ -1431,6 +1419,14 @@ exit: } } +void usbhInit(void) { + uint8_t i; + for (i = 0; i < sizeof_array(usbh_classdrivers_lookup); i++) { + if (usbh_classdrivers_lookup[i]->vmt->init) { + usbh_classdrivers_lookup[i]->vmt->init(); + } + } +} #endif |