2 * Copyright (C) 2006 by Bryan O'Donoghue, CodeHermit
3 * bodonoghue@CodeHermit.ie
6 * DasUBoot/drivers/usbdcore_omap1510.c, for design and implementation ideas.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the
20 * Free Software Foundation, Inc.,
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 * 1. #define __SIMULATE_ERROR__ to inject a CRC error into every 2nd TX
28 * packet to force the USB re-transmit protocol.
30 * 2. #define __DEBUG_UDC__ to switch on debug tracing to serial console
31 * be careful that tracing doesn't create Hiesen-bugs with respect to
32 * response timeouts to control requests.
34 * 3. This driver should be able to support any higher level driver that
35 * that wants to do either of the two standard UDC implementations
36 * Control-Bulk-Interrupt or Bulk-IN/Bulk-Out standards. Hence
37 * gserial and cdc_acm should work with this code.
39 * 4. NAK events never actually get raised at all, the documentation
42 * 5. For some reason, cbd_datlen is *always* +2 the value it should be.
43 * this means that having an RX cbd of 16 bytes is not possible, since
44 * the same size is reported for 14 bytes received as 16 bytes received
45 * until we can find out why this happens, RX cbds must be limited to 8
46 * bytes. TODO: check errata for this behaviour.
48 * 6. Right now this code doesn't support properly powering up with the USB
49 * cable attached to the USB host my development board the Adder87x doesn't
50 * have a pull-up fitted to allow this, so it is necessary to power the
51 * board and *then* attached the USB cable to the host. However somebody
52 * with a different design in their board may be able to keep the cable
53 * constantly connected and simply enable/disable a pull-up re
54 * figure 31.1 in MPC885RM.pdf instead of having to power up the board and
55 * then attach the cable !
61 #if defined(CONFIG_MPC885_FAMILY) && defined(CONFIG_USB_DEVICE)
64 #include "usbdcore_mpc8xx.h"
65 #include "usbdcore_ep0.h"
67 #define ERR(fmt, args...)\
68 serial_printf("ERROR : [%s] %s:%d: "fmt,\
69 __FILE__,__FUNCTION__,__LINE__, ##args)
71 #define DBG(fmt,args...)\
72 serial_printf("[%s] %s:%d: "fmt,\
73 __FILE__,__FUNCTION__,__LINE__, ##args)
75 #define DBG(fmt,args...)
79 #ifdef __SIMULATE_ERROR__
80 static char err_poison_test
= 0;
82 static struct mpc8xx_ep ep_ref
[MAX_ENDPOINTS
];
83 static u32 address_base
= STATE_NOT_READY
;
84 static mpc8xx_udc_state_t udc_state
= 0;
85 static struct usb_device_instance
*udc_device
= 0;
86 static volatile usb_epb_t
*endpoints
[MAX_ENDPOINTS
];
87 static volatile cbd_t
*tx_cbd
[TX_RING_SIZE
];
88 static volatile cbd_t
*rx_cbd
[RX_RING_SIZE
];
89 static volatile immap_t
*immr
= 0;
90 static volatile cpm8xx_t
*cp
= 0;
91 static volatile usb_pram_t
*usb_paramp
= 0;
92 static volatile usb_t
*usbp
= 0;
96 /* Static Function Declarations */
97 static void mpc8xx_udc_state_transition_up (usb_device_state_t initial
,
98 usb_device_state_t final
);
99 static void mpc8xx_udc_state_transition_down (usb_device_state_t initial
,
100 usb_device_state_t final
);
101 static void mpc8xx_udc_stall (unsigned int ep
);
102 static void mpc8xx_udc_flush_tx_fifo (int epid
);
103 static void mpc8xx_udc_flush_rx_fifo (void);
104 static void mpc8xx_udc_clear_rxbd (volatile cbd_t
* rx_cbdp
);
105 static void mpc8xx_udc_init_tx (struct usb_endpoint_instance
*epi
,
107 static void mpc8xx_udc_dump_request (struct usb_device_request
*request
);
108 static void mpc8xx_udc_clock_init (volatile immap_t
* immr
,
109 volatile cpm8xx_t
* cp
);
110 static int mpc8xx_udc_ep_tx (struct usb_endpoint_instance
*epi
);
111 static int mpc8xx_udc_epn_rx (unsigned int epid
, volatile cbd_t
* rx_cbdp
);
112 static void mpc8xx_udc_ep0_rx (volatile cbd_t
* rx_cbdp
);
113 static void mpc8xx_udc_cbd_init (void);
114 static void mpc8xx_udc_endpoint_init (void);
115 static void mpc8xx_udc_cbd_attach (int ep
, uchar tx_size
, uchar rx_size
);
116 static u32
mpc8xx_udc_alloc (u32 data_size
, u32 alignment
);
117 static int mpc8xx_udc_ep0_rx_setup (volatile cbd_t
* rx_cbdp
);
118 static void mpc8xx_udc_set_nak (unsigned int ep
);
119 static short mpc8xx_udc_handle_txerr (void);
120 static void mpc8xx_udc_advance_rx (volatile cbd_t
** rx_cbdp
, int epid
);
122 /******************************************************************************
124 *****************************************************************************/
128 * Do initial bus gluing
132 /* Init various pointers */
133 immr
= (immap_t
*) CFG_IMMR
;
134 cp
= (cpm8xx_t
*) & (immr
->im_cpm
);
135 usb_paramp
= (usb_pram_t
*) & (cp
->cp_dparam
[PROFF_USB
]);
136 usbp
= (usb_t
*) & (cp
->cp_scc
[0]);
138 memset (ep_ref
, 0x00, (sizeof (struct mpc8xx_ep
) * MAX_ENDPOINTS
));
141 udc_state
= STATE_NOT_READY
;
146 /* Set USB Frame #0, Respond at Address & Get a clock source */
148 mpc8xx_udc_clock_init (immr
, cp
);
150 /* PA15, PA14 as perhiperal USBRXD and USBOE */
151 immr
->im_ioport
.iop_padir
&= ~0x0003;
152 immr
->im_ioport
.iop_papar
|= 0x0003;
154 /* PC11/PC10 as peripheral USBRXP USBRXN */
155 immr
->im_ioport
.iop_pcso
|= 0x0030;
157 /* PC7/PC6 as perhiperal USBTXP and USBTXN */
158 immr
->im_ioport
.iop_pcdir
|= 0x0300;
159 immr
->im_ioport
.iop_pcpar
|= 0x0300;
161 /* Set the base address */
162 address_base
= (u32
) (cp
->cp_dpmem
+ CPM_USB_BASE
);
164 /* Initialise endpoints and circular buffers */
165 mpc8xx_udc_endpoint_init ();
166 mpc8xx_udc_cbd_init ();
168 /* Assign allocated Dual Port Endpoint descriptors */
169 usb_paramp
->ep0ptr
= (u32
) endpoints
[0];
170 usb_paramp
->ep1ptr
= (u32
) endpoints
[1];
171 usb_paramp
->ep2ptr
= (u32
) endpoints
[2];
172 usb_paramp
->ep3ptr
= (u32
) endpoints
[3];
173 usb_paramp
->frame_n
= 0;
175 DBG ("ep0ptr=0x%08x ep1ptr=0x%08x ep2ptr=0x%08x ep3ptr=0x%08x\n",
176 usb_paramp
->ep0ptr
, usb_paramp
->ep1ptr
, usb_paramp
->ep2ptr
,
184 * Poll for whatever events may have occured
189 volatile cbd_t
*rx_cbdp
= 0;
190 volatile cbd_t
*rx_cbdp_base
= 0;
192 if (udc_state
!= STATE_READY
) {
196 if (usbp
->usber
& USB_E_BSY
) {
197 /* This shouldn't happen. If it does then it's a bug ! */
198 usbp
->usber
|= USB_E_BSY
;
199 mpc8xx_udc_flush_rx_fifo ();
202 /* Scan all RX/Bidirectional Endpoints for RX data. */
203 for (epid
= 0; epid
< MAX_ENDPOINTS
; epid
++) {
204 if (!ep_ref
[epid
].prx
) {
207 rx_cbdp
= rx_cbdp_base
= ep_ref
[epid
].prx
;
210 if (!(rx_cbdp
->cbd_sc
& RX_BD_E
)) {
212 if (rx_cbdp
->cbd_sc
& 0x1F) {
213 /* Corrupt data discard it.
214 * Controller has NAK'd this packet.
216 mpc8xx_udc_clear_rxbd (rx_cbdp
);
220 mpc8xx_udc_ep0_rx (rx_cbdp
);
224 mpc8xx_udc_set_nak (epid
);
225 mpc8xx_udc_epn_rx (epid
, rx_cbdp
);
226 mpc8xx_udc_clear_rxbd (rx_cbdp
);
230 /* Advance RX CBD pointer */
231 mpc8xx_udc_advance_rx (&rx_cbdp
, epid
);
232 ep_ref
[epid
].prx
= rx_cbdp
;
234 /* Advance RX CBD pointer */
235 mpc8xx_udc_advance_rx (&rx_cbdp
, epid
);
238 } while (rx_cbdp
!= rx_cbdp_base
);
241 /* Handle TX events as appropiate, the correct place to do this is
242 * in a tx routine. Perhaps TX on epn was pre-empted by ep0
245 if (usbp
->usber
& USB_E_TXB
) {
246 usbp
->usber
|= USB_E_TXB
;
249 if (usbp
->usber
& (USB_TX_ERRMASK
)) {
250 mpc8xx_udc_handle_txerr ();
253 /* Switch to the default state, respond at the default address */
254 if (usbp
->usber
& USB_E_RESET
) {
255 usbp
->usber
|= USB_E_RESET
;
257 udc_device
->device_state
= STATE_DEFAULT
;
260 /* if(usbp->usber&USB_E_IDLE){
261 We could suspend here !
262 usbp->usber|=USB_E_IDLE;
263 DBG("idle state change\n");
266 We could resume here when IDLE is deasserted !
267 Not worth doing, so long as we are self powered though.
274 /* udc_endpoint_write
276 * Write some data to an endpoint
278 int udc_endpoint_write (struct usb_endpoint_instance
*epi
)
281 short epid
= 1, unnak
= 0, ret
= 0;
283 if (udc_state
!= STATE_READY
) {
284 ERR ("invalid udc_state != STATE_READY!\n");
288 if (!udc_device
|| !epi
) {
292 if (udc_device
->device_state
!= STATE_CONFIGURED
) {
296 ep
= epi
->endpoint_address
& 0x03;
297 if (ep
>= MAX_ENDPOINTS
) {
301 /* Set NAK for all RX endpoints during TX */
302 for (epid
= 1; epid
< MAX_ENDPOINTS
; epid
++) {
304 /* Don't set NAK on DATA IN/CONTROL endpoints */
305 if (ep_ref
[epid
].sc
& USB_DIR_IN
) {
309 if (!(usbp
->usep
[epid
] & (USEP_THS_NAK
| USEP_RHS_NAK
))) {
313 mpc8xx_udc_set_nak (epid
);
316 mpc8xx_udc_init_tx (&udc_device
->bus
->endpoint_array
[ep
],
318 ret
= mpc8xx_udc_ep_tx (&udc_device
->bus
->endpoint_array
[ep
]);
320 /* Remove temporary NAK */
321 for (epid
= 1; epid
< MAX_ENDPOINTS
; epid
++) {
322 if (unnak
& (1 << epid
)) {
323 udc_unset_nak (epid
);
330 /* mpc8xx_udc_assign_urb
332 * Associate a given urb to an endpoint TX or RX transmit/receive buffers
334 static int mpc8xx_udc_assign_urb (int ep
, char direction
)
336 struct usb_endpoint_instance
*epi
= 0;
338 if (ep
>= MAX_ENDPOINTS
) {
341 epi
= &udc_device
->bus
->endpoint_array
[ep
];
346 if (!ep_ref
[ep
].urb
) {
347 ep_ref
[ep
].urb
= usbd_alloc_urb (udc_device
, udc_device
->bus
->endpoint_array
);
348 if (!ep_ref
[ep
].urb
) {
352 ep_ref
[ep
].urb
->actual_length
= 0;
357 epi
->tx_urb
= ep_ref
[ep
].urb
;
360 epi
->rcv_urb
= ep_ref
[ep
].urb
;
368 udc_state
= STATE_ERROR
;
374 * Associate U-Boot software endpoints to mpc8xx endpoint parameter ram
375 * Isochronous endpoints aren't yet supported!
377 void udc_setup_ep (struct usb_device_instance
*device
, unsigned int ep
,
378 struct usb_endpoint_instance
*epi
)
383 if (epi
&& (ep
< MAX_ENDPOINTS
)) {
386 if (epi
->rcv_attributes
!= USB_ENDPOINT_XFER_CONTROL
387 || epi
->tx_attributes
!=
388 USB_ENDPOINT_XFER_CONTROL
) {
390 /* ep0 must be a control endpoint */
391 udc_state
= STATE_ERROR
;
395 if (!(ep_ref
[ep
].sc
& EP_ATTACHED
)) {
396 mpc8xx_udc_cbd_attach (ep
, epi
->tx_packetSize
,
397 epi
->rcv_packetSize
);
399 usbp
->usep
[ep
] = 0x0000;
403 if ((epi
->endpoint_address
& USB_ENDPOINT_DIR_MASK
)
407 ep_attrib
= epi
->tx_attributes
;
408 epi
->rcv_packetSize
= 0;
409 ep_ref
[ep
].sc
|= USB_DIR_IN
;
413 ep_attrib
= epi
->rcv_attributes
;
414 epi
->tx_packetSize
= 0;
415 ep_ref
[ep
].sc
&= ~USB_DIR_IN
;
418 if (mpc8xx_udc_assign_urb (ep
, epi
->endpoint_address
419 & USB_ENDPOINT_DIR_MASK
)) {
424 case USB_ENDPOINT_XFER_CONTROL
:
425 if (!(ep_ref
[ep
].sc
& EP_ATTACHED
)) {
426 mpc8xx_udc_cbd_attach (ep
,
428 epi
->rcv_packetSize
);
430 usbp
->usep
[ep
] = ep
<< 12;
431 epi
->rcv_urb
= epi
->tx_urb
= ep_ref
[ep
].urb
;
434 case USB_ENDPOINT_XFER_BULK
:
435 case USB_ENDPOINT_XFER_INT
:
436 if (!(ep_ref
[ep
].sc
& EP_ATTACHED
)) {
438 mpc8xx_udc_cbd_attach (ep
,
442 mpc8xx_udc_cbd_attach (ep
,
444 epi
->rcv_packetSize
);
447 usbp
->usep
[ep
] = (ep
<< 12) | ((ep_attrib
) << 8);
450 case USB_ENDPOINT_XFER_ISOC
:
452 serial_printf ("Error endpoint attrib %d>3\n", ep_attrib
);
453 udc_state
= STATE_ERROR
;
462 * Move state, switch on the USB
464 void udc_connect (void)
466 /* Enable pull-up resistor on D+
467 * TODO: fit a pull-up resistor to drive SE0 for > 2.5us
470 if (udc_state
!= STATE_ERROR
) {
471 udc_state
= STATE_READY
;
472 usbp
->usmod
|= USMOD_EN
;
478 * Disconnect is not used but, is included for completeness
480 void udc_disconnect (void)
482 /* Disable pull-up resistor on D-
483 * TODO: fix a pullup resistor to control this
486 if (udc_state
!= STATE_ERROR
) {
487 udc_state
= STATE_NOT_READY
;
489 usbp
->usmod
&= ~USMOD_EN
;
494 * Grab an EP0 URB, register interest in a subset of USB events
496 void udc_enable (struct usb_device_instance
*device
)
498 if (udc_state
== STATE_ERROR
) {
504 if (!ep_ref
[0].urb
) {
505 ep_ref
[0].urb
= usbd_alloc_urb (device
, device
->bus
->endpoint_array
);
508 /* Register interest in all events except SOF, enable transceiver */
509 usbp
->usber
= 0x03FF;
510 usbp
->usbmr
= 0x02F7;
517 * disable the currently hooked device
519 void udc_disable (void)
523 if (udc_state
== STATE_ERROR
) {
524 DBG ("Won't disable UDC. udc_state==STATE_ERROR !\n");
530 for (; i
< MAX_ENDPOINTS
; i
++) {
532 usbd_dealloc_urb (ep_ref
[i
].urb
);
538 usbp
->usmod
= ~USMOD_EN
;
539 udc_state
= STATE_NOT_READY
;
542 /* udc_startup_events
544 * Enable the specified device
546 void udc_startup_events (struct usb_device_instance
*device
)
549 if (udc_state
== STATE_READY
) {
550 usbd_device_event_irq (device
, DEVICE_CREATE
, 0);
556 * Allow upper layers to signal lower layers should not accept more RX data
559 void udc_set_nak (int epid
)
562 mpc8xx_udc_set_nak (epid
);
568 * Suspend sending of NAK tokens for DATA OUT tokens on a given endpoint.
569 * Switch off NAKing on this endpoint to accept more data output from host.
572 void udc_unset_nak (int epid
)
574 if (epid
> MAX_ENDPOINTS
) {
578 if (usbp
->usep
[epid
] & (USEP_THS_NAK
| USEP_RHS_NAK
)) {
579 usbp
->usep
[epid
] &= ~(USEP_THS_NAK
| USEP_RHS_NAK
);
584 /******************************************************************************
586 ******************************************************************************/
588 /* udc_state_transition_up
589 * udc_state_transition_down
591 * Helper functions to implement device state changes. The device states and
592 * the events that transition between them are:
597 * DEVICE_HUB_CONFIGURED DEVICE_HUB_RESET
603 * DEVICE_RESET DEVICE_POWER_INTERRUPTION
609 * DEVICE_ADDRESS_ASSIGNED DEVICE_RESET
615 * DEVICE_CONFIGURED DEVICE_DE_CONFIGURED
620 * udc_state_transition_up transitions up (in the direction from STATE_ATTACHED
621 * to STATE_CONFIGURED) from the specified initial state to the specified final
622 * state, passing through each intermediate state on the way. If the initial
623 * state is at or above (i.e. nearer to STATE_CONFIGURED) the final state, then
624 * no state transitions will take place.
626 * udc_state_transition_down transitions down (in the direction from
627 * STATE_CONFIGURED to STATE_ATTACHED) from the specified initial state to the
628 * specified final state, passing through each intermediate state on the way.
629 * If the initial state is at or below (i.e. nearer to STATE_ATTACHED) the final
630 * state, then no state transitions will take place.
634 static void mpc8xx_udc_state_transition_up (usb_device_state_t initial
,
635 usb_device_state_t final
)
637 if (initial
< final
) {
640 usbd_device_event_irq (udc_device
,
641 DEVICE_HUB_CONFIGURED
, 0);
642 if (final
== STATE_POWERED
)
645 usbd_device_event_irq (udc_device
, DEVICE_RESET
, 0);
646 if (final
== STATE_DEFAULT
)
649 usbd_device_event_irq (udc_device
,
650 DEVICE_ADDRESS_ASSIGNED
, 0);
651 if (final
== STATE_ADDRESSED
)
653 case STATE_ADDRESSED
:
654 usbd_device_event_irq (udc_device
, DEVICE_CONFIGURED
,
656 case STATE_CONFIGURED
:
664 static void mpc8xx_udc_state_transition_down (usb_device_state_t initial
,
665 usb_device_state_t final
)
667 if (initial
> final
) {
669 case STATE_CONFIGURED
:
670 usbd_device_event_irq (udc_device
,
671 DEVICE_DE_CONFIGURED
, 0);
672 if (final
== STATE_ADDRESSED
)
674 case STATE_ADDRESSED
:
675 usbd_device_event_irq (udc_device
, DEVICE_RESET
, 0);
676 if (final
== STATE_DEFAULT
)
679 usbd_device_event_irq (udc_device
,
680 DEVICE_POWER_INTERRUPTION
, 0);
681 if (final
== STATE_POWERED
)
684 usbd_device_event_irq (udc_device
, DEVICE_HUB_RESET
,
696 * Force returning of STALL tokens on the given endpoint. Protocol or function
697 * STALL conditions are permissable here
699 static void mpc8xx_udc_stall (unsigned int ep
)
701 usbp
->usep
[ep
] |= STALL_BITMASK
;
704 /* mpc8xx_udc_set_nak
706 * Force returning of NAK responses for the given endpoint as a kind of very
707 * simple flow control
709 static void mpc8xx_udc_set_nak (unsigned int ep
)
711 usbp
->usep
[ep
] |= NAK_BITMASK
;
715 /* mpc8xx_udc_handle_txerr
717 * Handle errors relevant to TX. Return a status code to allow calling
718 * indicative of what if anything happened
720 static short mpc8xx_udc_handle_txerr ()
722 short ep
= 0, ret
= 0;
724 for (; ep
< TX_RING_SIZE
; ep
++) {
725 if (usbp
->usber
& (0x10 << ep
)) {
727 /* Timeout or underrun */
728 if (tx_cbd
[ep
]->cbd_sc
& 0x06) {
730 mpc8xx_udc_flush_tx_fifo (ep
);
733 if (usbp
->usep
[ep
] & STALL_BITMASK
) {
735 usbp
->usep
[ep
] &= ~STALL_BITMASK
;
739 usbp
->usber
|= (0x10 << ep
);
745 /* mpc8xx_udc_advance_rx
749 static void mpc8xx_udc_advance_rx (volatile cbd_t
** rx_cbdp
, int epid
)
751 if ((*rx_cbdp
)->cbd_sc
& RX_BD_W
) {
752 *rx_cbdp
= (volatile cbd_t
*) (endpoints
[epid
]->rbase
+ CFG_IMMR
);
760 /* mpc8xx_udc_flush_tx_fifo
762 * Flush a given TX fifo. Assumes one tx cbd per endpoint
764 static void mpc8xx_udc_flush_tx_fifo (int epid
)
766 volatile cbd_t
*tx_cbdp
= 0;
768 if (epid
> MAX_ENDPOINTS
) {
773 immr
->im_cpm
.cp_cpcr
= ((epid
<< 2) | 0x1D01);
775 while (immr
->im_cpm
.cp_cpcr
& 0x01);
777 usbp
->uscom
= 0x40 | 0;
780 tx_cbdp
= (cbd_t
*) (endpoints
[epid
]->tbptr
+ CFG_IMMR
);
781 tx_cbdp
->cbd_sc
= (TX_BD_I
| TX_BD_W
);
784 endpoints
[epid
]->tptr
= endpoints
[epid
]->tbase
;
785 endpoints
[epid
]->tstate
= 0x00;
786 endpoints
[epid
]->tbcnt
= 0x00;
789 immr
->im_cpm
.cp_cpcr
= ((epid
<< 2) | 0x2D01);
791 while (immr
->im_cpm
.cp_cpcr
& 0x01);
796 /* mpc8xx_udc_flush_rx_fifo
798 * For the sake of completeness of the namespace, it seems like
799 * a good-design-decision (tm) to include mpc8xx_udc_flush_rx_fifo();
800 * If RX_BD_E is true => a driver bug either here or in an upper layer
801 * not polling frequently enough. If RX_BD_E is true we have told the host
802 * we have accepted data but, the CPM found it had no-where to put that data
803 * which needless to say would be a bad thing.
805 static void mpc8xx_udc_flush_rx_fifo ()
809 for (i
= 0; i
< RX_RING_SIZE
; i
++) {
810 if (!(rx_cbd
[i
]->cbd_sc
& RX_BD_E
)) {
811 ERR ("buf %p used rx data len = 0x%x sc=0x%x!\n",
812 rx_cbd
[i
], rx_cbd
[i
]->cbd_datlen
,
817 ERR ("BUG : Input over-run\n");
820 /* mpc8xx_udc_clear_rxbd
822 * Release control of RX CBD to CP.
824 static void mpc8xx_udc_clear_rxbd (volatile cbd_t
* rx_cbdp
)
826 rx_cbdp
->cbd_datlen
= 0x0000;
827 rx_cbdp
->cbd_sc
= ((rx_cbdp
->cbd_sc
& RX_BD_W
) | (RX_BD_E
| RX_BD_I
));
833 * Parse for tx timeout, control RX or USB reset/busy conditions
834 * Return -1 on timeout, -2 on fatal error, else return zero
836 static int mpc8xx_udc_tx_irq (int ep
)
840 if (usbp
->usber
& (USB_TX_ERRMASK
)) {
841 if (mpc8xx_udc_handle_txerr ()) {
842 /* Timeout, controlling function must retry send */
847 if (usbp
->usber
& (USB_E_RESET
| USB_E_BSY
)) {
848 /* Fatal, abandon TX transaction */
852 if (usbp
->usber
& USB_E_RXB
) {
853 for (i
= 0; i
< RX_RING_SIZE
; i
++) {
854 if (!(rx_cbd
[i
]->cbd_sc
& RX_BD_E
)) {
855 if ((rx_cbd
[i
] == ep_ref
[0].prx
) || ep
) {
867 * Transmit in a re-entrant fashion outbound USB packets.
868 * Implement retry/timeout mechanism described in USB specification
869 * Toggle DATA0/DATA1 pids as necessary
870 * Introduces non-standard tx_retry. The USB standard has no scope for slave
871 * devices to give up TX, however tx_retry stops us getting stuck in an endless
874 static int mpc8xx_udc_ep_tx (struct usb_endpoint_instance
*epi
)
876 struct urb
*urb
= epi
->tx_urb
;
877 volatile cbd_t
*tx_cbdp
= 0;
878 unsigned int ep
= 0, pkt_len
= 0, x
= 0, tx_retry
= 0;
881 if (!epi
|| (epi
->endpoint_address
& 0x03) >= MAX_ENDPOINTS
|| !urb
) {
885 ep
= epi
->endpoint_address
& 0x03;
886 tx_cbdp
= (cbd_t
*) (endpoints
[ep
]->tbptr
+ CFG_IMMR
);
888 if (tx_cbdp
->cbd_sc
& TX_BD_R
|| usbp
->usber
& USB_E_TXB
) {
889 mpc8xx_udc_flush_tx_fifo (ep
);
890 usbp
->usber
|= USB_E_TXB
;
893 while (tx_retry
++ < 100) {
894 ret
= mpc8xx_udc_tx_irq (ep
);
896 /* ignore timeout here */
897 } else if (ret
== -2) {
899 mpc8xx_udc_flush_tx_fifo (ep
);
903 tx_cbdp
= (cbd_t
*) (endpoints
[ep
]->tbptr
+ CFG_IMMR
);
904 while (tx_cbdp
->cbd_sc
& TX_BD_R
) {
906 tx_cbdp
->cbd_sc
= (tx_cbdp
->cbd_sc
& TX_BD_W
);
908 pkt_len
= urb
->actual_length
- epi
->sent
;
910 if (pkt_len
> epi
->tx_packetSize
|| pkt_len
> EP_MAX_PKT
) {
911 pkt_len
= MIN (epi
->tx_packetSize
, EP_MAX_PKT
);
914 for (x
= 0; x
< pkt_len
; x
++) {
915 *((unsigned char *) (tx_cbdp
->cbd_bufaddr
+ x
)) =
916 urb
->buffer
[epi
->sent
+ x
];
918 tx_cbdp
->cbd_datlen
= pkt_len
;
919 tx_cbdp
->cbd_sc
|= (CBD_TX_BITMASK
| ep_ref
[ep
].pid
);
922 #ifdef __SIMULATE_ERROR__
923 if (++err_poison_test
== 2) {
925 tx_cbdp
->cbd_sc
&= ~TX_BD_TC
;
929 usbp
->uscom
= (USCOM_STR
| ep
);
931 while (!(usbp
->usber
& USB_E_TXB
)) {
932 ret
= mpc8xx_udc_tx_irq (ep
);
936 } else if (ret
== -2) {
937 if (usbp
->usber
& USB_E_TXB
) {
938 usbp
->usber
|= USB_E_TXB
;
940 mpc8xx_udc_flush_tx_fifo (ep
);
945 if (usbp
->usber
& USB_E_TXB
) {
946 usbp
->usber
|= USB_E_TXB
;
949 /* ACK must be present <= 18bit times from TX */
954 /* TX ACK : USB 2.0 8.7.2, Toggle PID, Advance TX */
955 epi
->sent
+= pkt_len
;
956 epi
->last
= MIN (urb
->actual_length
- epi
->sent
, epi
->tx_packetSize
);
957 TOGGLE_TX_PID (ep_ref
[ep
].pid
);
959 if (epi
->sent
>= epi
->tx_urb
->actual_length
) {
961 epi
->tx_urb
->actual_length
= 0;
964 if (ep_ref
[ep
].sc
& EP_SEND_ZLP
) {
965 ep_ref
[ep
].sc
&= ~EP_SEND_ZLP
;
972 ERR ("TX fail, endpoint 0x%x tx bytes 0x%x/0x%x\n", ep
, epi
->sent
,
973 epi
->tx_urb
->actual_length
);
978 /* mpc8xx_udc_dump_request
980 * Dump a control request to console
982 static void mpc8xx_udc_dump_request (struct usb_device_request
*request
)
984 DBG ("bmRequestType:%02x bRequest:%02x wValue:%04x "
985 "wIndex:%04x wLength:%04x ?\n",
986 request
->bmRequestType
,
988 request
->wValue
, request
->wIndex
, request
->wLength
);
993 /* mpc8xx_udc_ep0_rx_setup
995 * Decode received ep0 SETUP packet. return non-zero on error
997 static int mpc8xx_udc_ep0_rx_setup (volatile cbd_t
* rx_cbdp
)
1000 struct urb
*purb
= ep_ref
[0].urb
;
1001 struct usb_endpoint_instance
*epi
=
1002 &udc_device
->bus
->endpoint_array
[0];
1004 for (; x
< rx_cbdp
->cbd_datlen
; x
++) {
1005 *(((unsigned char *) &ep_ref
[0].urb
->device_request
) + x
) =
1006 *((unsigned char *) (rx_cbdp
->cbd_bufaddr
+ x
));
1009 mpc8xx_udc_clear_rxbd (rx_cbdp
);
1011 if (ep0_recv_setup (purb
)) {
1012 mpc8xx_udc_dump_request (&purb
->device_request
);
1016 if ((purb
->device_request
.bmRequestType
& USB_REQ_DIRECTION_MASK
)
1017 == USB_REQ_HOST2DEVICE
) {
1019 switch (purb
->device_request
.bRequest
) {
1020 case USB_REQ_SET_ADDRESS
:
1021 /* Send the Status OUT ZLP */
1022 ep_ref
[0].pid
= TX_BD_PID_DATA1
;
1023 purb
->actual_length
= 0;
1024 mpc8xx_udc_init_tx (epi
, purb
);
1025 mpc8xx_udc_ep_tx (epi
);
1027 /* Move to the addressed state */
1028 usbp
->usaddr
= udc_device
->address
;
1029 mpc8xx_udc_state_transition_up (udc_device
->device_state
,
1033 case USB_REQ_SET_CONFIGURATION
:
1034 if (!purb
->device_request
.wValue
) {
1035 /* Respond at default address */
1036 usbp
->usaddr
= 0x00;
1037 mpc8xx_udc_state_transition_down (udc_device
->device_state
,
1040 /* TODO: Support multiple configurations */
1041 mpc8xx_udc_state_transition_up (udc_device
->device_state
,
1043 for (x
= 1; x
< MAX_ENDPOINTS
; x
++) {
1044 if ((udc_device
->bus
->endpoint_array
[x
].endpoint_address
& USB_ENDPOINT_DIR_MASK
)
1046 ep_ref
[x
].pid
= TX_BD_PID_DATA0
;
1048 ep_ref
[x
].pid
= RX_BD_PID_DATA0
;
1050 /* Set configuration must unstall endpoints */
1051 usbp
->usep
[x
] &= ~STALL_BITMASK
;
1056 /* CDC/Vendor specific */
1060 /* Send ZLP as ACK in Status OUT phase */
1061 ep_ref
[0].pid
= TX_BD_PID_DATA1
;
1062 purb
->actual_length
= 0;
1063 mpc8xx_udc_init_tx (epi
, purb
);
1064 mpc8xx_udc_ep_tx (epi
);
1068 if (purb
->actual_length
) {
1069 ep_ref
[0].pid
= TX_BD_PID_DATA1
;
1070 mpc8xx_udc_init_tx (epi
, purb
);
1072 if (!(purb
->actual_length
% EP0_MAX_PACKET_SIZE
)) {
1073 ep_ref
[0].sc
|= EP_SEND_ZLP
;
1076 if (purb
->device_request
.wValue
==
1077 USB_DESCRIPTOR_TYPE_DEVICE
) {
1078 if (le16_to_cpu (purb
->device_request
.wLength
)
1079 > purb
->actual_length
) {
1080 /* Send EP0_MAX_PACKET_SIZE bytes
1081 * unless correct size requested.
1083 if (purb
->actual_length
> epi
->tx_packetSize
) {
1084 purb
->actual_length
= epi
->tx_packetSize
;
1088 mpc8xx_udc_ep_tx (epi
);
1091 /* Corrupt SETUP packet? */
1092 ERR ("Zero length data or SETUP with DATA-IN phase ?\n");
1099 /* mpc8xx_udc_init_tx
1101 * Setup some basic parameters for a TX transaction
1103 static void mpc8xx_udc_init_tx (struct usb_endpoint_instance
*epi
,
1108 epi
->tx_urb
= tx_urb
;
1111 /* mpc8xx_udc_ep0_rx
1113 * Receive ep0/control USB data. Parse and possibly send a response.
1115 static void mpc8xx_udc_ep0_rx (volatile cbd_t
* rx_cbdp
)
1117 if (rx_cbdp
->cbd_sc
& RX_BD_PID_SETUP
) {
1119 /* Unconditionally accept SETUP packets */
1120 if (mpc8xx_udc_ep0_rx_setup (rx_cbdp
)) {
1121 mpc8xx_udc_stall (0);
1126 mpc8xx_udc_clear_rxbd (rx_cbdp
);
1128 if ((rx_cbdp
->cbd_datlen
- 2)) {
1129 /* SETUP with a DATA phase
1130 * outside of SETUP packet.
1133 mpc8xx_udc_stall (0);
1138 /* mpc8xx_udc_epn_rx
1140 * Receive some data from cbd into USB system urb data abstraction
1141 * Upper layers should NAK if there is insufficient RX data space
1143 static int mpc8xx_udc_epn_rx (unsigned int epid
, volatile cbd_t
* rx_cbdp
)
1145 struct usb_endpoint_instance
*epi
= 0;
1146 struct urb
*urb
= 0;
1149 if (epid
>= MAX_ENDPOINTS
|| !rx_cbdp
->cbd_datlen
) {
1153 /* USB 2.0 PDF section 8.6.4
1154 * Discard data with invalid PID it is a resend.
1156 if (ep_ref
[epid
].pid
!= (rx_cbdp
->cbd_sc
& 0xC0)) {
1159 TOGGLE_RX_PID (ep_ref
[epid
].pid
);
1161 epi
= &udc_device
->bus
->endpoint_array
[epid
];
1164 for (; x
< (rx_cbdp
->cbd_datlen
- 2); x
++) {
1165 *((unsigned char *) (urb
->buffer
+ urb
->actual_length
+ x
)) =
1166 *((unsigned char *) (rx_cbdp
->cbd_bufaddr
+ x
));
1170 usbd_rcv_complete (epi
, x
, 0);
1171 if (ep_ref
[epid
].urb
->status
== RECV_ERROR
) {
1172 DBG ("RX error unset NAK\n");
1173 udc_unset_nak (epid
);
1179 /* mpc8xx_udc_clock_init
1181 * Obtain a clock reference for Full Speed Signaling
1183 static void mpc8xx_udc_clock_init (volatile immap_t
* immr
,
1184 volatile cpm8xx_t
* cp
)
1187 #if defined(CFG_USB_EXTC_CLK)
1189 /* This has been tested with a 48MHz crystal on CLK6 */
1190 switch (CFG_USB_EXTC_CLK
) {
1192 immr
->im_ioport
.iop_papar
|= 0x0100;
1193 immr
->im_ioport
.iop_padir
&= ~0x0100;
1194 cp
->cp_sicr
|= 0x24;
1197 immr
->im_ioport
.iop_papar
|= 0x0200;
1198 immr
->im_ioport
.iop_padir
&= ~0x0200;
1199 cp
->cp_sicr
|= 0x2D;
1202 immr
->im_ioport
.iop_papar
|= 0x0400;
1203 immr
->im_ioport
.iop_padir
&= ~0x0400;
1204 cp
->cp_sicr
|= 0x36;
1207 immr
->im_ioport
.iop_papar
|= 0x0800;
1208 immr
->im_ioport
.iop_padir
&= ~0x0800;
1209 cp
->cp_sicr
|= 0x3F;
1212 udc_state
= STATE_ERROR
;
1216 #elif defined(CFG_USB_BRGCLK)
1218 /* This has been tested with brgclk == 50MHz */
1219 DECLARE_GLOBAL_DATA_PTR
;
1222 if (gd
->cpu_clk
< 48000000L) {
1223 ERR ("brgclk is too slow for full-speed USB!\n");
1224 udc_state
= STATE_ERROR
;
1228 /* Assume the brgclk is 'good enough', we want !(gd->cpu_clk%48Mhz)
1229 * but, can /probably/ live with close-ish alternative rates.
1231 divisor
= (gd
->cpu_clk
/ 48000000L) - 1;
1232 cp
->cp_sicr
&= ~0x0000003F;
1234 switch (CFG_USB_BRGCLK
) {
1236 cp
->cp_brgc1
|= (divisor
| CPM_BRG_EN
);
1237 cp
->cp_sicr
&= ~0x2F;
1240 cp
->cp_brgc2
|= (divisor
| CPM_BRG_EN
);
1241 cp
->cp_sicr
|= 0x00000009;
1244 cp
->cp_brgc3
|= (divisor
| CPM_BRG_EN
);
1245 cp
->cp_sicr
|= 0x00000012;
1248 cp
->cp_brgc4
= (divisor
| CPM_BRG_EN
);
1249 cp
->cp_sicr
|= 0x0000001B;
1252 udc_state
= STATE_ERROR
;
1257 #error "CFG_USB_EXTC_CLK or CFG_USB_BRGCLK must be defined"
1262 /* mpc8xx_udc_cbd_attach
1264 * attach a cbd to and endpoint
1266 static void mpc8xx_udc_cbd_attach (int ep
, uchar tx_size
, uchar rx_size
)
1269 if (!tx_cbd
[ep
] || !rx_cbd
[ep
] || ep
>= MAX_ENDPOINTS
) {
1270 udc_state
= STATE_ERROR
;
1274 if (tx_size
> USB_MAX_PKT
|| rx_size
> USB_MAX_PKT
||
1275 (!tx_size
&& !rx_size
)) {
1276 udc_state
= STATE_ERROR
;
1280 /* Attach CBD to appropiate Parameter RAM Endpoint data structure */
1282 endpoints
[ep
]->rbase
= (u32
) rx_cbd
[rx_ct
];
1283 endpoints
[ep
]->rbptr
= (u32
) rx_cbd
[rx_ct
];
1288 endpoints
[ep
]->rbptr
= (u32
) rx_cbd
[rx_ct
];
1289 rx_cbd
[rx_ct
]->cbd_sc
|= RX_BD_W
;
1294 endpoints
[ep
]->rbptr
= (u32
) rx_cbd
[rx_ct
];
1295 rx_cbd
[rx_ct
]->cbd_sc
|= RX_BD_W
;
1299 /* Where we expect to RX data on this endpoint */
1300 ep_ref
[ep
].prx
= rx_cbd
[rx_ct
- 1];
1304 endpoints
[ep
]->rbase
= 0;
1305 endpoints
[ep
]->rbptr
= 0;
1309 endpoints
[ep
]->tbase
= (u32
) tx_cbd
[tx_ct
];
1310 endpoints
[ep
]->tbptr
= (u32
) tx_cbd
[tx_ct
];
1313 endpoints
[ep
]->tbase
= 0;
1314 endpoints
[ep
]->tbptr
= 0;
1317 endpoints
[ep
]->tstate
= 0;
1318 endpoints
[ep
]->tbcnt
= 0;
1319 endpoints
[ep
]->mrblr
= EP_MAX_PKT
;
1320 endpoints
[ep
]->rfcr
= 0x18;
1321 endpoints
[ep
]->tfcr
= 0x18;
1322 ep_ref
[ep
].sc
|= EP_ATTACHED
;
1324 DBG ("ep %d rbase 0x%08x rbptr 0x%08x tbase 0x%08x tbptr 0x%08x prx = %p\n",
1325 ep
, endpoints
[ep
]->rbase
, endpoints
[ep
]->rbptr
,
1326 endpoints
[ep
]->tbase
, endpoints
[ep
]->tbptr
,
1332 /* mpc8xx_udc_cbd_init
1334 * Allocate space for a cbd and allocate TX/RX data space
1336 static void mpc8xx_udc_cbd_init (void)
1340 for (; i
< TX_RING_SIZE
; i
++) {
1341 tx_cbd
[i
] = (cbd_t
*)
1342 mpc8xx_udc_alloc (sizeof (cbd_t
), sizeof (int));
1345 for (i
= 0; i
< RX_RING_SIZE
; i
++) {
1346 rx_cbd
[i
] = (cbd_t
*)
1347 mpc8xx_udc_alloc (sizeof (cbd_t
), sizeof (int));
1350 for (i
= 0; i
< TX_RING_SIZE
; i
++) {
1351 tx_cbd
[i
]->cbd_bufaddr
=
1352 mpc8xx_udc_alloc (EP_MAX_PKT
, sizeof (int));
1354 tx_cbd
[i
]->cbd_sc
= (TX_BD_I
| TX_BD_W
);
1355 tx_cbd
[i
]->cbd_datlen
= 0x0000;
1359 for (i
= 0; i
< RX_RING_SIZE
; i
++) {
1360 rx_cbd
[i
]->cbd_bufaddr
=
1361 mpc8xx_udc_alloc (EP_MAX_PKT
, sizeof (int));
1362 rx_cbd
[i
]->cbd_sc
= (RX_BD_I
| RX_BD_E
);
1363 rx_cbd
[i
]->cbd_datlen
= 0x0000;
1370 /* mpc8xx_udc_endpoint_init
1372 * Attach an endpoint to some dpram
1374 static void mpc8xx_udc_endpoint_init (void)
1378 for (; i
< MAX_ENDPOINTS
; i
++) {
1379 endpoints
[i
] = (usb_epb_t
*)
1380 mpc8xx_udc_alloc (sizeof (usb_epb_t
), 32);
1386 * Grab the address of some dpram
1388 static u32
mpc8xx_udc_alloc (u32 data_size
, u32 alignment
)
1390 u32 retaddr
= address_base
;
1392 while (retaddr
% alignment
) {
1395 address_base
+= data_size
;
1400 #endif /* CONFIG_MPC885_FAMILY && CONFIG_USB_DEVICE) */