From 207131c53b15e7b5956177e90932b7445ff5b4ce Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Wed, 14 Sep 2011 14:05:07 +0000 Subject: [PATCH] Convert ARC USB driver code to always use setup packet detection and remove the bus-reset-based detection method for it. This prevents false USB detection from chargers or other accesories that aren't actually a host but can trigger the bus reset condition. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30546 a1c6a512-1295-4272-9138-f99709370657 --- firmware/export/config.h | 10 +-- firmware/target/arm/usb-drv-arc.c | 103 +++++++++++------------------- 2 files changed, 38 insertions(+), 75 deletions(-) diff --git a/firmware/export/config.h b/firmware/export/config.h index 8addb62e95..e6a87915fc 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -736,7 +736,7 @@ Lyre prototype 1 */ /* Priority in bootloader is wanted */ #define HAVE_PRIORITY_SCHEDULING #define USB_STATUS_BY_EVENT -#define USB_DETECT_BY_DRV +#define USB_DETECT_BY_CORE #if defined(HAVE_USBSTACK) && CONFIG_USBOTG == USBOTG_ARC #define INCLUDE_TIMEOUT_API #endif @@ -763,7 +763,7 @@ Lyre prototype 1 */ #ifdef HAVE_USBSTACK #if CONFIG_USBOTG == USBOTG_ARC #define USB_STATUS_BY_EVENT -#define USB_DETECT_BY_DRV +#define USB_DETECT_BY_CORE #define INCLUDE_TIMEOUT_API #elif CONFIG_USBOTG == USBOTG_AS3525 #define USB_STATUS_BY_EVENT @@ -779,12 +779,6 @@ Lyre prototype 1 */ #endif /* BOOTLOADER */ -#ifdef PHILIPS_SA9200 -/* Instead use the request for a device descriptor to detect a host */ -#undef USB_DETECT_BY_DRV -#define USB_DETECT_BY_CORE -#endif - #if defined(HAVE_USBSTACK) || (CONFIG_CPU == JZ4732) \ || (CONFIG_CPU == AS3525) || (CONFIG_CPU == AS3525v2) \ || defined(CPU_S5L870X) || (CONFIG_CPU == S3C2440) \ diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c index f252f11f3e..855f67e4c3 100644 --- a/firmware/target/arm/usb-drv-arc.c +++ b/firmware/target/arm/usb-drv-arc.c @@ -428,53 +428,6 @@ void usb_drv_startup(void) } } -/* manual: 32.14.1 Device Controller Initialization */ -static void _usb_drv_init(bool attach) -{ - usb_drv_reset(); - - REG_USBMODE = USBMODE_CTRL_MODE_DEVICE; - -#ifdef USB_NO_HIGH_SPEED - /* Force device to full speed */ - /* See 32.9.5.9.2 */ - REG_PORTSC1 |= PORTSCX_PORT_FORCE_FULL_SPEED; -#endif - - init_control_queue_heads(); - memset(td_array, 0, sizeof td_array); - - REG_ENDPOINTLISTADDR = (unsigned int)qh_array; - REG_DEVICEADDR = 0; - - if (!attach) { - /* enable RESET interrupt */ - REG_USBINTR = USBINTR_RESET_EN; - } - else - { - /* enable USB interrupts */ - REG_USBINTR = - USBINTR_INT_EN | - USBINTR_ERR_INT_EN | - USBINTR_PTC_DETECT_EN | - USBINTR_RESET_EN; - } - - usb_drv_int_enable(true); - - /* go go go */ - REG_USBCMD |= USBCMD_RUN; - - logf("usb_drv_init() finished"); - logf("usb id %x", REG_ID); - logf("usb dciversion %x", REG_DCIVERSION); - logf("usb dccparams %x", REG_DCCPARAMS); - - /* now a bus reset will occur. see bus_reset() */ - (void)attach; -} - #ifdef LOGF_ENABLE #define XFER_DIR_STR(dir) ((dir) ? "IN" : "OUT") #define XFER_TYPE_STR(type) \ @@ -496,25 +449,50 @@ static void log_ep(int ep_num, int ep_dir, char* prefix) #define log_ep(...) #endif +/* manual: 32.14.1 Device Controller Initialization */ void usb_drv_init(void) { -#ifdef USB_DETECT_BY_CORE /* USB core decides */ - _usb_drv_init(true); -#else - /* Use bus reset condition */ - _usb_drv_init(false); + usb_drv_reset(); + + REG_USBMODE = USBMODE_CTRL_MODE_DEVICE; + +#ifdef USB_NO_HIGH_SPEED + /* Force device to full speed */ + /* See 32.9.5.9.2 */ + REG_PORTSC1 |= PORTSCX_PORT_FORCE_FULL_SPEED; #endif + + init_control_queue_heads(); + memset(td_array, 0, sizeof td_array); + + REG_ENDPOINTLISTADDR = (unsigned int)qh_array; + REG_DEVICEADDR = 0; + + /* enable USB interrupts */ + REG_USBINTR = + USBINTR_INT_EN | + USBINTR_ERR_INT_EN | + USBINTR_PTC_DETECT_EN | + USBINTR_RESET_EN; + + usb_drv_int_enable(true); + + /* go go go */ + REG_USBCMD |= USBCMD_RUN; + + logf("usb_drv_init() finished"); + logf("usb id %x", REG_ID); + logf("usb dciversion %x", REG_DCIVERSION); + logf("usb dccparams %x", REG_DCCPARAMS); + + /* now a bus reset will occur. see bus_reset() */ } /* fully enable driver */ void usb_drv_attach(void) { logf("usb_drv_attach"); -#ifndef USB_DETECT_BY_CORE - sleep(HZ/10); - _usb_drv_init(true); -#endif } void usb_drv_exit(void) @@ -563,17 +541,8 @@ void usb_drv_int(void) /* reset interrupt */ if (status & USBSTS_RESET) { REG_USBSTS = USBSTS_RESET; - - if (UNLIKELY(usbintr == USBINTR_RESET_EN)) { - /* USB detected - detach and inform */ - usb_drv_stop(); - usb_drv_usb_detect_event(); - } - else - { - bus_reset(); - usb_core_bus_reset(); /* tell mom */ - } + bus_reset(); + usb_core_bus_reset(); /* tell mom */ } /* port change */