summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/rk27xx.h100
-rw-r--r--firmware/target/arm/rk27xx/usb-drv-rk27xx.c156
2 files changed, 150 insertions, 106 deletions
diff --git a/firmware/export/rk27xx.h b/firmware/export/rk27xx.h
index c75004c5f7..3ca2bc089d 100644
--- a/firmware/export/rk27xx.h
+++ b/firmware/export/rk27xx.h
@@ -555,8 +555,19 @@
555#define PHY_TEST_EN (*(volatile unsigned long *)(AHB0_UDC + 0x00)) 555#define PHY_TEST_EN (*(volatile unsigned long *)(AHB0_UDC + 0x00))
556#define PHY_TEST (*(volatile unsigned long *)(AHB0_UDC + 0x04)) 556#define PHY_TEST (*(volatile unsigned long *)(AHB0_UDC + 0x04))
557#define DEV_CTL (*(volatile unsigned long *)(AHB0_UDC + 0x08)) 557#define DEV_CTL (*(volatile unsigned long *)(AHB0_UDC + 0x08))
558#define DEV_RMTWKP (1<<2)
559#define DEV_SELF_PWR (1<<3)
560#define DEV_SOFT_CN (1<<4)
561#define DEV_RESUME (1<<5)
562#define DEV_PHY16BIT (1<<6)
563#define SOFT_POR (1<<7)
564#define CSR_DONE (1<<8)
558 565
559#define DEV_INFO (*(volatile unsigned long *)(AHB0_UDC + 0x10)) 566#define DEV_INFO (*(volatile unsigned long *)(AHB0_UDC + 0x10))
567#define DEV_EN (1<<7)
568#define VBUS_STS (1<<20)
569#define DEV_SPEED (3<<21)
570
560#define EN_INT (*(volatile unsigned long *)(AHB0_UDC + 0x14)) 571#define EN_INT (*(volatile unsigned long *)(AHB0_UDC + 0x14))
561#define EN_SOF_INTR (1<<0) 572#define EN_SOF_INTR (1<<0)
562#define EN_SETUP_INTR (1<<1) 573#define EN_SETUP_INTR (1<<1)
@@ -592,7 +603,7 @@
592#define USBRST_INTR (1<<4) 603#define USBRST_INTR (1<<4)
593#define RESUME_INTR (1<<5) 604#define RESUME_INTR (1<<5)
594#define SUSP_INTR (1<<6) 605#define SUSP_INTR (1<<6)
595/* bit 7 reserved */ 606#define CONN_INTR (1<<7) /* marked as reserved in DS */
596#define BOUT1_INTR (1<<8) 607#define BOUT1_INTR (1<<8)
597#define BIN2_INTR (1<<9) 608#define BIN2_INTR (1<<9)
598#define IIN3_INTR (1<<10) 609#define IIN3_INTR (1<<10)
@@ -612,44 +623,21 @@
612/* bits 27-31 reserved */ 623/* bits 27-31 reserved */
613 624
614#define INTCON (*(volatile unsigned long *)(AHB0_UDC + 0x1C)) 625#define INTCON (*(volatile unsigned long *)(AHB0_UDC + 0x1C))
626#define UDC_INTEN (1<<0)
627#define UDC_INTEDGE_TRIG (1<<1)
628#define UDC_INTHIGH_ACT (1<<2)
629
615#define SETUP1 (*(volatile unsigned long *)(AHB0_UDC + 0x20)) 630#define SETUP1 (*(volatile unsigned long *)(AHB0_UDC + 0x20))
616#define SETUP2 (*(volatile unsigned long *)(AHB0_UDC + 0x24)) 631#define SETUP2 (*(volatile unsigned long *)(AHB0_UDC + 0x24))
617#define AHBCON (*(volatile unsigned long *)(AHB0_UDC + 0x28)) 632#define AHBCON (*(volatile unsigned long *)(AHB0_UDC + 0x28))
618
619#define RX0STAT (*(volatile unsigned long *)(AHB0_UDC + 0x30)) 633#define RX0STAT (*(volatile unsigned long *)(AHB0_UDC + 0x30))
620#define RX0CON (*(volatile unsigned long *)(AHB0_UDC + 0x34)) 634#define RX0CON (*(volatile unsigned long *)(AHB0_UDC + 0x34))
621#define RX0FFRC (1<<0)
622#define RX0CLR (1<<1)
623#define RX0STALL (1<<2)
624#define RX0NAK (1<<3)
625#define EP0EN (1<<4)
626#define RX0VOIDINTEN (1<<5)
627#define RX0ERRINTEN (1<<6)
628#define RX0ACKINTEN (1<<7)
629/* bits 8-31 reserved */
630
631#define RX0DMACTLO (*(volatile unsigned long *)(AHB0_UDC + 0x38)) 635#define RX0DMACTLO (*(volatile unsigned long *)(AHB0_UDC + 0x38))
632#define RX0DMAOUTLMADDR (*(volatile unsigned long *)(AHB0_UDC + 0x3C)) 636#define RX0DMAOUTLMADDR (*(volatile unsigned long *)(AHB0_UDC + 0x3C))
633#define TX0STAT (*(volatile unsigned long *)(AHB0_UDC + 0x40)) 637#define TX0STAT (*(volatile unsigned long *)(AHB0_UDC + 0x40))
634#define TX0CON (*(volatile unsigned long *)(AHB0_UDC + 0x44)) 638#define TX0CON (*(volatile unsigned long *)(AHB0_UDC + 0x44))
635#define TX0CLR (1<<0)
636#define TX0STALL (1<<1)
637#define TX0NAK (1<<2)
638/* bit 3 reserved */
639#define TX0VOIDINTEN (1<<4)
640#define TX0ERRINTEN (1<<5)
641#define TX0ACKINTEN (1<<6)
642/* bits 7-31 reserved */
643
644#define TX0BUF (*(volatile unsigned long *)(AHB0_UDC + 0x48)) 639#define TX0BUF (*(volatile unsigned long *)(AHB0_UDC + 0x48))
645#define TX0FULL (1<<0)
646#define TX0URF (1<<1)
647/* bits 2-31 reserved */
648
649#define TX0DMAINCTL (*(volatile unsigned long *)(AHB0_UDC + 0x4C)) 640#define TX0DMAINCTL (*(volatile unsigned long *)(AHB0_UDC + 0x4C))
650#define TX0DMAINSTA (1<<0)
651/* bits 1-31 reserved */
652
653#define TX0DMALM_IADDR (*(volatile unsigned long *)(AHB0_UDC + 0x50)) 641#define TX0DMALM_IADDR (*(volatile unsigned long *)(AHB0_UDC + 0x50))
654#define RX1STAT (*(volatile unsigned long *)(AHB0_UDC + 0x54)) 642#define RX1STAT (*(volatile unsigned long *)(AHB0_UDC + 0x54))
655#define RX1CON (*(volatile unsigned long *)(AHB0_UDC + 0x58)) 643#define RX1CON (*(volatile unsigned long *)(AHB0_UDC + 0x58))
@@ -722,6 +710,62 @@
722#define TX15DMAINCTL (*(volatile unsigned long *)(AHB0_UDC + 0x164)) 710#define TX15DMAINCTL (*(volatile unsigned long *)(AHB0_UDC + 0x164))
723#define TX15DMALM_IADDR (*(volatile unsigned long *)(AHB0_UDC + 0x168)) 711#define TX15DMALM_IADDR (*(volatile unsigned long *)(AHB0_UDC + 0x168))
724 712
713/* RXnSTAT bits */
714/* bits 10:0 RXLEN */
715/* bits 15:11 reserved */
716#define RXVOID (1<<16)
717#define RXERR (1<<17)
718#define RXACK (1<<18)
719#define RXCFINT (1<<19) /* reserved for EP0 */
720/* bits 23:20 reserved */
721#define RXFULL (1<<24)
722#define RXOVF (1<<25)
723/* bits 31:26 reserved */
724
725/* RXnCON bits */
726#define RXFFRC (1<<0)
727#define RXCLR (1<<1)
728#define RXSTALL (1<<2)
729#define RXNAK (1<<3)
730#define RXEPEN (1<<4)
731#define RXVOIDINTEN (1<<5)
732#define RXERRINTEN (1<<6)
733#define RXACKINTEN (1<<7)
734/* bits 31:8 reserved for EP0 */
735/* bits 31:14 reserved for others */
736
737/* TxnSTAT */
738/* bits 10:0 TXLEN */
739/* bits 15:11 reserved */
740#define TXVOID (1<<16)
741#define TXERR (1<<17)
742#define TXACK (1<<18)
743#define TXDMADN (1<<19) /* reserved for EP0 */
744#define TXCFINT (1<<20) /* reserved for EP0 */
745/* bits 31:21 reserved */
746
747/* TXnCON bits */
748#define TXCLR (1<<0)
749#define TXSTALL (1<<1)
750#define TXNAK (1<<2)
751#define TXEPEN (1<<3) /* reserved for EP0 */
752#define TXVOIDINTEN (1<<4)
753#define TXERRINTEN (1<<5)
754#define TXACKINTEN (1<<6)
755#define TXDMADNEN (1<<7) /* reserved for EP0 */
756/* bits 31:8 reserved */
757
758/* TXnBUF bits */
759#define TXFULL (1<<0)
760#define TXURF (1<<1)
761#define TXDS0 (1<<2) /* reserved for EP0 */
762#define TXDS1 (1<<3) /* reserved for EP0 */
763/* bits 31:4 reserved */
764
765/* DMA bits */
766#define DMA_START (1<<0)
767/* bits 31:1 reserved */
768
725/* USB host controller */ 769/* USB host controller */
726#define AHB0_UHC (ARM_BUS0_BASE + 0x000A4000) 770#define AHB0_UHC (ARM_BUS0_BASE + 0x000A4000)
727/* documentation missing */ 771/* documentation missing */
diff --git a/firmware/target/arm/rk27xx/usb-drv-rk27xx.c b/firmware/target/arm/rk27xx/usb-drv-rk27xx.c
index 3001509069..401df17133 100644
--- a/firmware/target/arm/rk27xx/usb-drv-rk27xx.c
+++ b/firmware/target/arm/rk27xx/usb-drv-rk27xx.c
@@ -120,16 +120,16 @@ static void ctr_write(void)
120 int xfer_size = (ctrlep[DIR_IN].cnt > 64) ? 64 : ctrlep[DIR_IN].cnt; 120 int xfer_size = (ctrlep[DIR_IN].cnt > 64) ? 64 : ctrlep[DIR_IN].cnt;
121 unsigned int timeout = current_tick + HZ/10; 121 unsigned int timeout = current_tick + HZ/10;
122 122
123 while (TX0BUF & (1<<0)) /* TX0FULL flag */ 123 while (TX0BUF & TXFULL) /* TX0FULL flag */
124 { 124 {
125 if(TIME_AFTER(current_tick, timeout)) 125 if(TIME_AFTER(current_tick, timeout))
126 break; 126 break;
127 } 127 }
128 128
129 TX0STAT = xfer_size; /* size of the transfer */ 129 TX0STAT = xfer_size; /* size of the transfer */
130 TX0DMALM_IADDR = (uint32_t)ctrlep[DIR_IN].buf; /* local buffer address */ 130 TX0DMALM_IADDR = (uint32_t)ctrlep[DIR_IN].buf; /* local buffer address */
131 TX0DMAINCTL = (1<<1); /* start DMA */ 131 TX0DMAINCTL = DMA_START; /* start DMA */
132 TX0CON &= ~(1<<2); /* clear NAK */ 132 TX0CON &= ~TXNAK; /* clear NAK */
133 133
134 /* Decrement by max packet size is intentional. 134 /* Decrement by max packet size is intentional.
135 * This way if we have final packet short one we will get negative len 135 * This way if we have final packet short one we will get negative len
@@ -147,13 +147,13 @@ static void ctr_read(void)
147 int xfer_size = RX0STAT & 0xffff; 147 int xfer_size = RX0STAT & 0xffff;
148 148
149 /* clear NAK bit */ 149 /* clear NAK bit */
150 RX0CON &= ~(1<<3); 150 RX0CON &= ~RXNAK;
151 151
152 ctrlep[DIR_OUT].cnt -= xfer_size; 152 ctrlep[DIR_OUT].cnt -= xfer_size;
153 ctrlep[DIR_OUT].buf += xfer_size; 153 ctrlep[DIR_OUT].buf += xfer_size;
154 154
155 RX0DMAOUTLMADDR = (uint32_t)ctrlep[DIR_OUT].buf; 155 RX0DMAOUTLMADDR = (uint32_t)ctrlep[DIR_OUT].buf; /* buffer address */
156 RX0DMACTLO = (1<<0); 156 RX0DMACTLO = DMA_START; /* start DMA */
157} 157}
158 158
159static void blk_write(int ep) 159static void blk_write(int ep)
@@ -163,16 +163,16 @@ static void blk_write(int ep)
163 int xfer_size = (endpoints[ep_num].cnt > max) ? max : endpoints[ep_num].cnt; 163 int xfer_size = (endpoints[ep_num].cnt > max) ? max : endpoints[ep_num].cnt;
164 unsigned int timeout = current_tick + HZ/10; 164 unsigned int timeout = current_tick + HZ/10;
165 165
166 while (BIN_TXBUF(ep_num) & (1<<0)) /* TXFULL flag */ 166 while (BIN_TXBUF(ep_num) & TXFULL) /* TXFULL flag */
167 { 167 {
168 if(TIME_AFTER(current_tick, timeout)) 168 if(TIME_AFTER(current_tick, timeout))
169 break; 169 break;
170 } 170 }
171 171
172 BIN_TXSTAT(ep_num) = xfer_size; /* size of the transfer */ 172 BIN_TXSTAT(ep_num) = xfer_size; /* size */
173 BIN_DMAINLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf; /* buf address */ 173 BIN_DMAINLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf; /* buf address */
174 BIN_DMAINCTL(ep_num) = (1<<0); /* start DMA */ 174 BIN_DMAINCTL(ep_num) = DMA_START; /* start DMA */
175 BIN_TXCON(ep_num) &= ~(1<<2); /* clear NAK */ 175 BIN_TXCON(ep_num) &= ~TXNAK; /* clear NAK */
176 176
177 /* Decrement by max packet size is intentional. 177 /* Decrement by max packet size is intentional.
178 * This way if we have final packet short one we will get negative len 178 * This way if we have final packet short one we will get negative len
@@ -191,13 +191,13 @@ static void blk_read(int ep)
191 int xfer_size = BOUT_RXSTAT(ep_num) & 0xffff; 191 int xfer_size = BOUT_RXSTAT(ep_num) & 0xffff;
192 192
193 /* clear NAK bit */ 193 /* clear NAK bit */
194 BOUT_RXCON(ep_num) &= ~(1<<3); 194 BOUT_RXCON(ep_num) &= ~RXNAK;
195 195
196 endpoints[ep_num].cnt -= xfer_size; 196 endpoints[ep_num].cnt -= xfer_size;
197 endpoints[ep_num].buf += xfer_size; 197 endpoints[ep_num].buf += xfer_size;
198 198
199 BOUT_DMAOUTLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf; 199 BOUT_DMAOUTLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf;
200 BOUT_DMAOUTCTL(ep_num) = (1<<1); 200 BOUT_DMAOUTCTL(ep_num) = DMA_START;
201} 201}
202 202
203static void int_write(int ep) 203static void int_write(int ep)
@@ -207,16 +207,16 @@ static void int_write(int ep)
207 int xfer_size = (endpoints[ep_num].cnt > max) ? max : endpoints[ep_num].cnt; 207 int xfer_size = (endpoints[ep_num].cnt > max) ? max : endpoints[ep_num].cnt;
208 unsigned int timeout = current_tick + HZ/10; 208 unsigned int timeout = current_tick + HZ/10;
209 209
210 while (IIN_TXBUF(ep_num) & (1<<0)) /* TXFULL flag */ 210 while (IIN_TXBUF(ep_num) & TXFULL) /* TXFULL flag */
211 { 211 {
212 if(TIME_AFTER(current_tick, timeout)) 212 if(TIME_AFTER(current_tick, timeout))
213 break; 213 break;
214 } 214 }
215 215
216 IIN_TXSTAT(ep_num) = xfer_size; /* size of the transfer */ 216 IIN_TXSTAT(ep_num) = xfer_size; /* size */
217 IIN_DMAINLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf; /* buf address */ 217 IIN_DMAINLMADDR(ep_num) = (uint32_t)endpoints[ep_num].buf; /* buf address */
218 IIN_DMAINCTL(ep_num) = (1<<0); /* start DMA */ 218 IIN_DMAINCTL(ep_num) = DMA_START; /* start DMA */
219 IIN_TXCON(ep_num) &= ~(1<<2); /* clear NAK */ 219 IIN_TXCON(ep_num) &= ~TXNAK; /* clear NAK */
220 220
221 /* Decrement by max packet size is intentional. 221 /* Decrement by max packet size is intentional.
222 * This way if we have final packet short one we will get negative len 222 * This way if we have final packet short one we will get negative len
@@ -238,16 +238,16 @@ void INT_UDC(void)
238 /* read what caused UDC irq */ 238 /* read what caused UDC irq */
239 uint32_t intsrc = INT2FLAG & 0x7fffff; 239 uint32_t intsrc = INT2FLAG & 0x7fffff;
240 240
241 if (intsrc & (1<<1)) /* setup interrupt */ 241 if (intsrc & SETUP_INTR) /* setup interrupt */
242 { 242 {
243 setup_received(); 243 setup_received();
244 } 244 }
245 else if (intsrc & (1<<2)) /* ep0 in interrupt */ 245 else if (intsrc & IN0_INTR) /* ep0 in interrupt */
246 { 246 {
247 txstat = TX0STAT; /* read clears flags */ 247 txstat = TX0STAT; /* read clears flags */
248 248
249 /* TODO handle errors */ 249 /* TODO handle errors */
250 if (txstat & (1<<18)) /* check TxACK flag */ 250 if (txstat & TXACK) /* check TxACK flag */
251 { 251 {
252 if (ctrlep[DIR_IN].cnt >= 0) 252 if (ctrlep[DIR_IN].cnt >= 0)
253 { 253 {
@@ -268,12 +268,12 @@ void INT_UDC(void)
268 } 268 }
269 } 269 }
270 } 270 }
271 else if (intsrc & (1<<3)) /* ep0 out interrupt */ 271 else if (intsrc & OUT0_INTR) /* ep0 out interrupt */
272 { 272 {
273 rxstat = RX0STAT; 273 rxstat = RX0STAT;
274 274
275 /* TODO handle errors */ 275 /* TODO handle errors */
276 if (rxstat & (1<<18)) /* RxACK */ 276 if (rxstat & RXACK) /* RxACK */
277 { 277 {
278 if (ctrlep[DIR_OUT].cnt > 0) 278 if (ctrlep[DIR_OUT].cnt > 0)
279 ctr_read(); 279 ctr_read();
@@ -284,21 +284,21 @@ void INT_UDC(void)
284 ctrlep[DIR_OUT].len); /* length */ 284 ctrlep[DIR_OUT].len); /* length */
285 } 285 }
286 } 286 }
287 else if (intsrc & (1<<4)) /* usb reset */ 287 else if (intsrc & USBRST_INTR) /* usb reset */
288 { 288 {
289 usb_drv_init(); 289 usb_drv_init();
290 } 290 }
291 else if (intsrc & (1<<5)) /* usb resume */ 291 else if (intsrc & RESUME_INTR) /* usb resume */
292 { 292 {
293 TX0CON |= (1<<0); /* TxClr */ 293 TX0CON |= TXCLR; /* TxClr */
294 TX0CON &= ~(1<<0); 294 TX0CON &= ~TXCLR;
295 RX0CON |= (1<<1); /* RxClr */ 295 RX0CON |= RXCLR; /* RxClr */
296 RX0CON &= (1<<1); 296 RX0CON &= ~RXCLR;
297 } 297 }
298 else if (intsrc & (1<<6)) /* usb suspend */ 298 else if (intsrc & SUSP_INTR) /* usb suspend */
299 { 299 {
300 } 300 }
301 else if (intsrc & (1<<7)) /* usb connect */ 301 else if (intsrc & CONN_INTR) /* usb connect */
302 { 302 {
303 } 303 }
304 else 304 else
@@ -362,7 +362,7 @@ void INT_UDC(void)
362 txstat = IIN_TXSTAT(ep_num); 362 txstat = IIN_TXSTAT(ep_num);
363 363
364 /* TODO handle errors */ 364 /* TODO handle errors */
365 if (txstat & (1<<18)) /* check TxACK flag */ 365 if (txstat & TXACK) /* check TxACK flag */
366 { 366 {
367 if (endpoints[ep_num].cnt >= 0) 367 if (endpoints[ep_num].cnt >= 0)
368 { 368 {
@@ -389,7 +389,7 @@ void INT_UDC(void)
389/* return port speed FS=0, HS=1 */ 389/* return port speed FS=0, HS=1 */
390int usb_drv_port_speed(void) 390int usb_drv_port_speed(void)
391{ 391{
392 return ((DEV_INFO & (3<<21)) == 0) ? 0 : 1; 392 return ((DEV_INFO & DEV_SPEED) == 0) ? 0 : 1;
393} 393}
394 394
395/* Reserve endpoint */ 395/* Reserve endpoint */
@@ -521,9 +521,9 @@ int usb_drv_recv(int endpoint, void* ptr, int length)
521 ep = &endpoints[ep_num]; 521 ep = &endpoints[ep_num];
522 522
523 /* clear NAK bit */ 523 /* clear NAK bit */
524 BOUT_RXCON(ep_num) &= ~(1<<3); 524 BOUT_RXCON(ep_num) &= ~RXNAK;
525 BOUT_DMAOUTLMADDR(ep_num) = (uint32_t)ptr; 525 BOUT_DMAOUTLMADDR(ep_num) = (uint32_t)ptr;
526 BOUT_DMAOUTCTL(ep_num) = (1<<1); 526 BOUT_DMAOUTCTL(ep_num) = DMA_START;
527 } 527 }
528 528
529 ep->buf = ptr; 529 ep->buf = ptr;
@@ -557,23 +557,23 @@ bool usb_drv_stalled(int endpoint, bool in)
557 { 557 {
558 case USB_ENDPOINT_XFER_CONTROL: 558 case USB_ENDPOINT_XFER_CONTROL:
559 if (in) 559 if (in)
560 return (TX0CON & (1<<1)) ? true : false; 560 return (TX0CON & TXSTALL) ? true : false;
561 else 561 else
562 return (RX0CON & (1<<2)) ? true : false; 562 return (RX0CON & RXSTALL) ? true : false;
563 563
564 break; 564 break;
565 565
566 case USB_ENDPOINT_XFER_BULK: 566 case USB_ENDPOINT_XFER_BULK:
567 if (in) 567 if (in)
568 return (BIN_TXCON(ep_num) & (1<<1)) ? true : false; 568 return (BIN_TXCON(ep_num) & TXSTALL) ? true : false;
569 else 569 else
570 return (BOUT_RXCON(ep_num) & (1<<2)) ? true : false; 570 return (BOUT_RXCON(ep_num) & RXSTALL) ? true : false;
571 571
572 break; 572 break;
573 573
574 case USB_ENDPOINT_XFER_INT: 574 case USB_ENDPOINT_XFER_INT:
575 if (in) 575 if (in)
576 return (IIN_TXCON(ep_num) & (1<<1)) ? true : false; 576 return (IIN_TXCON(ep_num) & TXSTALL) ? true : false;
577 else 577 else
578 return false; /* we don't have such endpoint anyway */ 578 return false; /* we don't have such endpoint anyway */
579 579
@@ -594,16 +594,16 @@ void usb_drv_stall(int endpoint, bool stall, bool in)
594 if (in) 594 if (in)
595 { 595 {
596 if (stall) 596 if (stall)
597 TX0CON |= (1<<1); 597 TX0CON |= TXSTALL;
598 else 598 else
599 TX0CON &= ~(1<<1); 599 TX0CON &= ~TXSTALL;
600 } 600 }
601 else 601 else
602 { 602 {
603 if (stall) 603 if (stall)
604 RX0CON |= (1<<2); 604 RX0CON |= RXSTALL;
605 else 605 else
606 RX0CON &= ~(1<<2); /* doc says Auto clear by UDC 2.0 */ 606 RX0CON &= ~RXSTALL; /* doc says Auto clear by UDC 2.0 */
607 } 607 }
608 break; 608 break;
609 609
@@ -611,16 +611,16 @@ void usb_drv_stall(int endpoint, bool stall, bool in)
611 if (in) 611 if (in)
612 { 612 {
613 if (stall) 613 if (stall)
614 BIN_TXCON(ep_num) |= (1<<1); 614 BIN_TXCON(ep_num) |= TXSTALL;
615 else 615 else
616 BIN_TXCON(ep_num) &= ~(1<<1); 616 BIN_TXCON(ep_num) &= ~TXSTALL;
617 } 617 }
618 else 618 else
619 { 619 {
620 if (stall) 620 if (stall)
621 BOUT_RXCON(ep_num) |= (1<<2); 621 BOUT_RXCON(ep_num) |= RXSTALL;
622 else 622 else
623 BOUT_RXCON(ep_num) &= ~(1<<2); 623 BOUT_RXCON(ep_num) &= ~RXSTALL;
624 } 624 }
625 break; 625 break;
626 626
@@ -628,9 +628,9 @@ void usb_drv_stall(int endpoint, bool stall, bool in)
628 if (in) 628 if (in)
629 { 629 {
630 if (stall) 630 if (stall)
631 IIN_TXCON(ep_num) |= (1<<1); 631 IIN_TXCON(ep_num) |= TXSTALL;
632 else 632 else
633 IIN_TXCON(ep_num) &= ~(1<<1); 633 IIN_TXCON(ep_num) &= ~TXSTALL;
634 } 634 }
635 break; 635 break;
636 } 636 }
@@ -645,46 +645,46 @@ void usb_drv_init(void)
645 SCU_CLKCFG &= ~(1<<6); 645 SCU_CLKCFG &= ~(1<<6);
646 646
647 /* 1. do soft disconnect */ 647 /* 1. do soft disconnect */
648 DEV_CTL = (1<<3); /* DEV_SELF_PWR */ 648 DEV_CTL = DEV_SELF_PWR;
649 649
650 /* 2. do power on reset to PHY */ 650 /* 2. do power on reset to PHY */
651 DEV_CTL = (1<<3) | /* DEV_SELF_PWR */ 651 DEV_CTL = DEV_SELF_PWR |
652 (1<<7); /* SOFT_POR */ 652 SOFT_POR;
653 653
654 /* 3. wait more than 10ms */ 654 /* 3. wait more than 10ms */
655 udelay(20000); 655 udelay(20000);
656 656
657 /* 4. clear SOFT_POR bit */ 657 /* 4. clear SOFT_POR bit */
658 DEV_CTL &= ~(1<<7); 658 DEV_CTL &= ~SOFT_POR;
659 659
660 /* 5. configure minimal EN_INT */ 660 /* 5. configure minimal EN_INT */
661 EN_INT = (1<<6) | /* Enable Suspend Interrupt */ 661 EN_INT = EN_SUSP_INTR | /* Enable Suspend Interrupt */
662 (1<<5) | /* Enable Resume Interrupt */ 662 EN_RESUME_INTR | /* Enable Resume Interrupt */
663 (1<<4) | /* Enable USB Reset Interrupt */ 663 EN_USBRST_INTR | /* Enable USB Reset Interrupt */
664 (1<<3) | /* Enable OUT Token receive Interrupt EP0 */ 664 EN_OUT0_INTR | /* Enable OUT Token receive Interrupt EP0 */
665 (1<<2) | /* Enable IN Token transmits Interrupt EP0 */ 665 EN_IN0_INTR | /* Enable IN Token transmits Interrupt EP0 */
666 (1<<1); /* Enable SETUP Packet Receive Interrupt */ 666 EN_SETUP_INTR; /* Enable SETUP Packet Receive Interrupt */
667 667
668 /* 6. configure INTCON */ 668 /* 6. configure INTCON */
669 INTCON = (1<<2) | /* interrupt high active */ 669 INTCON = UDC_INTHIGH_ACT | /* interrupt high active */
670 (1<<0); /* enable EP0 interrupts */ 670 UDC_INTEN; /* enable EP0 interrupts */
671 671
672 /* 7. configure EP0 control registers */ 672 /* 7. configure EP0 control registers */
673 TX0CON = (1<<6) | /* Set as one to enable the EP0 tx irq */ 673 TX0CON = TXACKINTEN | /* Set as one to enable the EP0 tx irq */
674 (1<<2); /* Set as one to response NAK handshake */ 674 TXNAK; /* Set as one to response NAK handshake */
675 675
676 RX0CON = (1<<7) | 676 RX0CON = RXACKINTEN |
677 (1<<4) | /* Endpoint 0 Enable. When cleared the endpoint does 677 RXEPEN | /* Endpoint 0 Enable. When cleared the endpoint does
678 * not respond to an SETUP or OUT token 678 * not respond to an SETUP or OUT token
679 */ 679 */
680 680
681 (1<<3); /* Set as one to response NAK handshake */ 681 RXNAK; /* Set as one to response NAK handshake */
682 682
683 /* 8. write final bits to DEV_CTL */ 683 /* 8. write final bits to DEV_CTL */
684 DEV_CTL = (1<<8) | /* Configure CSR done */ 684 DEV_CTL = CSR_DONE | /* Configure CSR done */
685 (1<<6) | /* 16-bit data path enabled. udc_clk = 30MHz */ 685 DEV_PHY16BIT | /* 16-bit data path enabled. udc_clk = 30MHz */
686 (1<<4) | /* Device soft connect */ 686 DEV_SOFT_CN | /* Device soft connect */
687 (1<<3); /* Device self power */ 687 DEV_SELF_PWR; /* Device self power */
688 688
689 /* init semaphore of ep0 */ 689 /* init semaphore of ep0 */
690 semaphore_init(&ctrlep[DIR_OUT].complete, 1, 0); 690 semaphore_init(&ctrlep[DIR_OUT].complete, 1, 0);
@@ -696,15 +696,15 @@ void usb_drv_init(void)
696 696
697 if (ep_num%3 == 0) /* IIN 3, 6, 9, 12, 15 */ 697 if (ep_num%3 == 0) /* IIN 3, 6, 9, 12, 15 */
698 { 698 {
699 IIN_TXCON(ep_num) |= (ep_num<<8)|(1<<3)|(1<<2); /* ep_num, enable, NAK */ 699 IIN_TXCON(ep_num) |= (ep_num<<8)|TXEPEN|TXNAK; /* ep_num, enable, NAK */
700 } 700 }
701 else if (ep_num%3 == 1) /* BOUT 1, 4, 7, 10, 13 */ 701 else if (ep_num%3 == 1) /* BOUT 1, 4, 7, 10, 13 */
702 { 702 {
703 BOUT_RXCON(ep_num) |= (ep_num<<8)|(1<<4)|(1<<3); /* ep_num, NAK, enable */ 703 BOUT_RXCON(ep_num) |= (ep_num<<8)|RXEPEN|RXNAK; /* ep_num, NAK, enable */
704 } 704 }
705 else if (ep_num%3 == 2) /* BIN 2, 5, 8, 11, 14 */ 705 else if (ep_num%3 == 2) /* BIN 2, 5, 8, 11, 14 */
706 { 706 {
707 BIN_TXCON(ep_num) |= (ep_num<<8)|(1<<3)|(1<<2); /* ep_num, enable, NAK */ 707 BIN_TXCON(ep_num) |= (ep_num<<8)|TXEPEN|TXNAK; /* ep_num, enable, NAK */
708 } 708 }
709 } 709 }
710} 710}
@@ -712,7 +712,7 @@ void usb_drv_init(void)
712/* turn off usb core */ 712/* turn off usb core */
713void usb_drv_exit(void) 713void usb_drv_exit(void)
714{ 714{
715 DEV_CTL = (1<<3); /* DEV_SELF_PWR */ 715 DEV_CTL = DEV_SELF_PWR;
716 716
717 /* disable USB interrupts in interrupt controller */ 717 /* disable USB interrupts in interrupt controller */
718 INTC_IMR &= ~(1<<16); 718 INTC_IMR &= ~(1<<16);
@@ -725,7 +725,7 @@ void usb_drv_exit(void)
725 725
726int usb_detect(void) 726int usb_detect(void)
727{ 727{
728 if (DEV_INFO & (1<<20)) 728 if (DEV_INFO & VBUS_STS)
729 return USB_INSERTED; 729 return USB_INSERTED;
730 else 730 else
731 return USB_EXTRACTED; 731 return USB_EXTRACTED;