diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/target/arm/imx31/gigabeat-s/usb-imx31.c | 3 | ||||
-rw-r--r-- | firmware/target/arm/usb-drv-arc.c | 5 | ||||
-rw-r--r-- | firmware/target/arm/usb-fw-pp502x.c | 15 |
3 files changed, 14 insertions, 9 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c b/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c index 99f3e072eb..8682cff7c7 100644 --- a/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c +++ b/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c | |||
@@ -125,5 +125,6 @@ void usb_drv_int_enable(bool enable) | |||
125 | /* Called during the bus reset interrupt when in detect mode */ | 125 | /* Called during the bus reset interrupt when in detect mode */ |
126 | void usb_drv_usb_detect_event(void) | 126 | void usb_drv_usb_detect_event(void) |
127 | { | 127 | { |
128 | usb_status_event(USB_INSERTED); | 128 | if (usb_drv_powered()) |
129 | usb_status_event(USB_INSERTED); | ||
129 | } | 130 | } |
diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c index 15f3bf2c6c..5a08acb348 100644 --- a/firmware/target/arm/usb-drv-arc.c +++ b/firmware/target/arm/usb-drv-arc.c | |||
@@ -509,10 +509,7 @@ void usb_drv_int(void) | |||
509 | if (UNLIKELY(usbintr == USBINTR_RESET_EN)) { | 509 | if (UNLIKELY(usbintr == USBINTR_RESET_EN)) { |
510 | /* USB detected - detach and inform */ | 510 | /* USB detected - detach and inform */ |
511 | usb_drv_stop(); | 511 | usb_drv_stop(); |
512 | /* A false reset may occur upon unplugging, be sure VBUS is above | 512 | usb_drv_usb_detect_event(); |
513 | * the 4V4 threshold. */ | ||
514 | if (usb_drv_powered()) | ||
515 | usb_drv_usb_detect_event(); | ||
516 | } | 513 | } |
517 | else | 514 | else |
518 | { | 515 | { |
diff --git a/firmware/target/arm/usb-fw-pp502x.c b/firmware/target/arm/usb-fw-pp502x.c index 883ca1e8e2..cf5a82f37c 100644 --- a/firmware/target/arm/usb-fw-pp502x.c +++ b/firmware/target/arm/usb-fw-pp502x.c | |||
@@ -177,6 +177,11 @@ void usb_attach(void) | |||
177 | usb_drv_attach(); | 177 | usb_drv_attach(); |
178 | } | 178 | } |
179 | 179 | ||
180 | static bool usb_pin_state(void) | ||
181 | { | ||
182 | return (USB_GPIO_INPUT_VAL & USB_GPIO_MASK) == USB_GPIO_VAL; | ||
183 | } | ||
184 | |||
180 | #ifdef USB_STATUS_BY_EVENT | 185 | #ifdef USB_STATUS_BY_EVENT |
181 | /* Cannot always tell power pin from USB pin */ | 186 | /* Cannot always tell power pin from USB pin */ |
182 | static int usb_status = USB_EXTRACTED; | 187 | static int usb_status = USB_EXTRACTED; |
@@ -197,10 +202,13 @@ void usb_insert_int(void) | |||
197 | timeout_register(&usb_oneshot, usb_timeout_event, HZ/5, val); | 202 | timeout_register(&usb_oneshot, usb_timeout_event, HZ/5, val); |
198 | } | 203 | } |
199 | 204 | ||
200 | /* Called during the bus reset interrupt when in detect mode */ | 205 | /* Called during the bus reset interrupt when in detect mode - filter for |
206 | * invalid bus reset when unplugging by checking the pin state. */ | ||
201 | void usb_drv_usb_detect_event(void) | 207 | void usb_drv_usb_detect_event(void) |
202 | { | 208 | { |
203 | usb_status_event(USB_INSERTED); | 209 | if(usb_pin_state()) { |
210 | usb_status_event(USB_INSERTED); | ||
211 | } | ||
204 | } | 212 | } |
205 | #endif /* USB_STATUS_BY_EVENT */ | 213 | #endif /* USB_STATUS_BY_EVENT */ |
206 | 214 | ||
@@ -221,8 +229,7 @@ int usb_detect(void) | |||
221 | #ifdef USB_STATUS_BY_EVENT | 229 | #ifdef USB_STATUS_BY_EVENT |
222 | return usb_status; | 230 | return usb_status; |
223 | #else | 231 | #else |
224 | return ((USB_GPIO_INPUT_VAL & USB_GPIO_MASK) == USB_GPIO_VAL) ? | 232 | return usb_pin_state() ? USB_INSERTED : USB_EXTRACTED; |
225 | USB_INSERTED : USB_EXTRACTED; | ||
226 | #endif | 233 | #endif |
227 | } | 234 | } |
228 | 235 | ||