From 835bb887c0557f0f26716c7f3570f6049925b1ec Mon Sep 17 00:00:00 2001 From: Diego Ismirlian Date: Mon, 5 Jun 2017 10:38:05 -0300 Subject: Add AOA (Android Accessory) class driver --- .../STM32/STM32F4xx/USB_HOST/halconf_community.h | 19 ++++ testhal/STM32/STM32F4xx/USB_HOST/main.c | 112 ++++++++++++++++++--- 2 files changed, 119 insertions(+), 12 deletions(-) (limited to 'testhal/STM32/STM32F4xx/USB_HOST') diff --git a/testhal/STM32/STM32F4xx/USB_HOST/halconf_community.h b/testhal/STM32/STM32F4xx/USB_HOST/halconf_community.h index 7b962bc..f0e1195 100644 --- a/testhal/STM32/STM32F4xx/USB_HOST/halconf_community.h +++ b/testhal/STM32/STM32F4xx/USB_HOST/halconf_community.h @@ -115,6 +115,20 @@ #define HAL_USBHUVC_WORK_RAM_SIZE 20000 #define HAL_USBHUVC_STATUS_PACKETS_COUNT 10 +/* AOA */ +#define HAL_USBH_USE_AOA TRUE + +#define HAL_USBHAOA_MAX_INSTANCES 1 +/* Uncomment this if you need a filter for AOA devices: + * #define HAL_USBHAOA_FILTER_CALLBACK _try_aoa + */ +#define HAL_USBHAOA_DEFAULT_MANUFACTURER "Diego MFG & Co." +#define HAL_USBHAOA_DEFAULT_MODEL "Diego's device" +#define HAL_USBHAOA_DEFAULT_DESCRIPTION "Description of this device..." +#define HAL_USBHAOA_DEFAULT_VERSION "1.0" +#define HAL_USBHAOA_DEFAULT_URI NULL +#define HAL_USBHAOA_DEFAULT_SERIAL NULL +#define HAL_USBHAOA_DEFAULT_AUDIO_MODE USBHAOA_AUDIO_MODE_DISABLED /* HUB */ #define HAL_USBH_USE_HUB TRUE @@ -159,6 +173,11 @@ #define USBHFTDI_DEBUG_ENABLE_WARNINGS TRUE #define USBHFTDI_DEBUG_ENABLE_ERRORS TRUE +#define USBHAOA_DEBUG_ENABLE_TRACE FALSE +#define USBHAOA_DEBUG_ENABLE_INFO TRUE +#define USBHAOA_DEBUG_ENABLE_WARNINGS TRUE +#define USBHAOA_DEBUG_ENABLE_ERRORS TRUE + /*===========================================================================*/ /* FSMCNAND driver related settings. */ /*===========================================================================*/ diff --git a/testhal/STM32/STM32F4xx/USB_HOST/main.c b/testhal/STM32/STM32F4xx/USB_HOST/main.c index 9f0c8b3..804eb93 100644 --- a/testhal/STM32/STM32F4xx/USB_HOST/main.c +++ b/testhal/STM32/STM32F4xx/USB_HOST/main.c @@ -19,18 +19,7 @@ #include "ff.h" #include - - -#if HAL_USBH_USE_FTDI -#include "usbh/dev/ftdi.h" -#include "shell.h" -#include "chprintf.h" - -static THD_WORKING_AREA(waTestFTDI, 1024); - -#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(2048) -#define TEST_WA_SIZE THD_WORKING_AREA_SIZE(256) - +#if HAL_USBH_USE_FTDI || HAL_USBH_USE_AOA static uint8_t buf[] = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" @@ -48,7 +37,17 @@ static uint8_t buf[] = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; +#endif + +#if HAL_USBH_USE_FTDI +#include "usbh/dev/ftdi.h" +#include "shell.h" +#include "chprintf.h" +static THD_WORKING_AREA(waTestFTDI, 1024); + +#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(2048) +#define TEST_WA_SIZE THD_WORKING_AREA_SIZE(256) static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { @@ -197,7 +196,92 @@ start: } #endif +#if HAL_USBH_USE_AOA +#include "usbh/dev/aoa.h" +#include "chprintf.h" + +static THD_WORKING_AREA(waTestAOA, 1024); + +#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(2048) +#define TEST_WA_SIZE THD_WORKING_AREA_SIZE(256) + +static void ThreadTestAOA(void *p) { + (void)p; + USBHAOADriver *const aoap = &USBHAOAD[0]; + USBHAOAChannel *const aoacp = &aoap->channel; + +start: + while (usbhaoaGetState(aoap) != USBHAOA_STATE_READY) { + chThdSleepMilliseconds(100); + } + + usbDbgPuts("AOA: Connected"); + + if (usbhaoaGetChannelState(aoap) != USBHAOA_CHANNEL_STATE_READY) { + usbhaoaChannelStart(aoap); + usbDbgPuts("AOA: Channel started"); + } + + //loopback + if (1) { + for(;;) { + msg_t m = streamGet(aoacp); + if (m < MSG_OK) { + usbDbgPuts("AOA: Disconnected"); + goto start; + } + streamPut(aoacp, (uint8_t)m); + if (m == 'q') + break; + } + } + +#define AOA_WRITE_SPEED_TEST_BYTES 3000000UL + //write speed test + if (1) { + systime_t st, et; + int i; + for (i = 0; i < 5; i++) { + uint32_t bytes = AOA_WRITE_SPEED_TEST_BYTES; + uint32_t times = bytes / 1024; + st = chVTGetSystemTimeX(); + while (times--) { + if (streamWrite(aoacp, buf, 1024) < 1024) { + usbDbgPuts("AOA: Disconnected"); + goto start; + } + bytes -= 1024; + } + if (bytes) { + if (streamWrite(aoacp, buf, bytes) < bytes) { + usbDbgPuts("AOA: Disconnected"); + goto start; + } + } + et = chVTGetSystemTimeX(); + usbDbgPrintf("\tRate=%uB/s", AOA_WRITE_SPEED_TEST_BYTES / (et - st) * 100); + } + } + + //single character write test (tests the timer) + if (0) { + for (;;) { + if (streamPut(aoacp, 'A') != MSG_OK) { + usbDbgPuts("AOA: Disconnected"); + goto start; + } + chThdSleepMilliseconds(100); + } + } + + usbhaoaChannelStop(aoap); + + usbDbgPuts("AOA: Tests done, restarting in 3s"); + chThdSleepMilliseconds(3000); + goto start; +} +#endif #if HAL_USBH_USE_MSD #include "usbh/dev/msd.h" @@ -400,6 +484,10 @@ int main(void) { chThdCreateStatic(waTestFTDI, sizeof(waTestFTDI), NORMALPRIO, ThreadTestFTDI, 0); #endif +#if HAL_USBH_USE_AOA + chThdCreateStatic(waTestAOA, sizeof(waTestAOA), NORMALPRIO, ThreadTestAOA, 0); +#endif + //turn on USB power palClearPad(GPIOC, GPIOC_OTG_FS_POWER_ON); -- cgit v1.2.3