summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-01-17 12:24:41 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-01-17 12:24:41 +0000
commit05f6f3419aec991307e7c81e0738e0496a21d89b (patch)
tree4bad4a187bc2a2bdd714e086ac9910a9b3de6357 /firmware/target/arm
parentbcc0f88372fd2be986a5e279dd7e3bd556d6c984 (diff)
downloadrockbox-05f6f3419aec991307e7c81e0738e0496a21d89b.tar.gz
rockbox-05f6f3419aec991307e7c81e0738e0496a21d89b.zip
Add a higher level USB detection that prevents fraudulent bus resets from causing USB mode to be entered. Enable for SA9200 only at this time. Also, for SA9200, use the bus power GPIO rather than the 'connector inserted' GPIO to detect the cable.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29068 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/system-pp502x.c4
-rw-r--r--firmware/target/arm/usb-drv-arc.c8
-rw-r--r--firmware/target/arm/usb-fw-pp502x.c14
3 files changed, 17 insertions, 9 deletions
diff --git a/firmware/target/arm/system-pp502x.c b/firmware/target/arm/system-pp502x.c
index bd71d28417..0422ea7d9c 100644
--- a/firmware/target/arm/system-pp502x.c
+++ b/firmware/target/arm/system-pp502x.c
@@ -141,9 +141,7 @@ void __attribute__((interrupt("IRQ"))) irq_handler(void)
141 else if (CPU_HI_INT_STAT & GPIO0_MASK) { 141 else if (CPU_HI_INT_STAT & GPIO0_MASK) {
142 if (GPIOD_INT_STAT & 0x02) 142 if (GPIOD_INT_STAT & 0x02)
143 button_int(); 143 button_int();
144 } 144 if (GPIOB_INT_STAT & 0x40)
145 else if (CPU_HI_INT_STAT & GPIO1_MASK) {
146 if (GPIOF_INT_STAT & 0x80)
147 usb_insert_int(); 145 usb_insert_int();
148 } 146 }
149/* end PHILIPS_SA9200 */ 147/* end PHILIPS_SA9200 */
diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c
index 86a1637bc8..fc74ce5bf0 100644
--- a/firmware/target/arm/usb-drv-arc.c
+++ b/firmware/target/arm/usb-drv-arc.c
@@ -498,15 +498,23 @@ static void log_ep(int ep_num, int ep_dir, char* prefix)
498 498
499void usb_drv_init(void) 499void usb_drv_init(void)
500{ 500{
501#ifdef USB_DETECT_BY_CORE
502 /* USB core decides */
503 _usb_drv_init(true);
504#else
505 /* Use bus reset condition */
501 _usb_drv_init(false); 506 _usb_drv_init(false);
507#endif
502} 508}
503 509
504/* fully enable driver */ 510/* fully enable driver */
505void usb_drv_attach(void) 511void usb_drv_attach(void)
506{ 512{
507 logf("usb_drv_attach"); 513 logf("usb_drv_attach");
514#ifndef USB_DETECT_BY_CORE
508 sleep(HZ/10); 515 sleep(HZ/10);
509 _usb_drv_init(true); 516 _usb_drv_init(true);
517#endif
510} 518}
511 519
512void usb_drv_exit(void) 520void usb_drv_exit(void)
diff --git a/firmware/target/arm/usb-fw-pp502x.c b/firmware/target/arm/usb-fw-pp502x.c
index 8f754fd04b..536535e059 100644
--- a/firmware/target/arm/usb-fw-pp502x.c
+++ b/firmware/target/arm/usb-fw-pp502x.c
@@ -65,10 +65,10 @@
65#define USB_GPIO_VAL 0x04 65#define USB_GPIO_VAL 0x04
66 66
67#elif defined(PHILIPS_SA9200) 67#elif defined(PHILIPS_SA9200)
68 /* GPIO F bit 7 (low) is usb detect */ 68 /* GPIO B bit 6 (high) is usb bus power detect */
69#define USB_GPIO GPIOF 69#define USB_GPIO GPIOB
70#define USB_GPIO_MASK 0x80 70#define USB_GPIO_MASK 0x40
71#define USB_GPIO_VAL 0x00 71#define USB_GPIO_VAL 0x40
72 72
73#elif defined(PHILIPS_HDD1630) || defined(PHILIPS_HDD6330) 73#elif defined(PHILIPS_HDD1630) || defined(PHILIPS_HDD6330)
74 /* GPIO E bit 2 is usb detect */ 74 /* GPIO E bit 2 is usb detect */
@@ -225,10 +225,12 @@ void usb_insert_int(void)
225 timeout_register(&usb_oneshot, usb_timeout_event, HZ/5, val); 225 timeout_register(&usb_oneshot, usb_timeout_event, HZ/5, val);
226} 226}
227 227
228/* Called during the bus reset interrupt when in detect mode - filter for 228/* USB_DETECT_BY_DRV: Called during the bus reset interrupt when in detect mode
229 * invalid bus reset when unplugging by checking the pin state. */ 229 * USB_DETECT_BY_CORE: Called when device descriptor is requested
230 */
230void usb_drv_usb_detect_event(void) 231void usb_drv_usb_detect_event(void)
231{ 232{
233 /* Filter for invalid bus reset when unplugging by checking the pin state. */
232 if(usb_plugged()) { 234 if(usb_plugged()) {
233 usb_status_event(USB_INSERTED); 235 usb_status_event(USB_INSERTED);
234 } 236 }