2 * Copyright (C) 2006 by Bryan O'Donoghue, CodeHermit
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,
106 struct urb * tx_urb);
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();
203 /* Scan all RX/Bidirectional Endpoints for RX data. */
204 for(epid = 0; epid<MAX_ENDPOINTS; epid++){
206 if(!ep_ref[epid].prx){
210 rx_cbdp = rx_cbdp_base = ep_ref[epid].prx;
212 if(!(rx_cbdp->cbd_sc&RX_BD_E)){
214 if(rx_cbdp->cbd_sc&0x1F){
215 /* Corrupt data discard it.
216 * Controller has NAK'd this packet.
218 mpc8xx_udc_clear_rxbd(rx_cbdp);
222 mpc8xx_udc_ep0_rx(rx_cbdp);
226 mpc8xx_udc_set_nak(epid);
227 mpc8xx_udc_epn_rx(epid,rx_cbdp);
228 mpc8xx_udc_clear_rxbd(rx_cbdp);
232 /* Advance RX CBD pointer */
233 mpc8xx_udc_advance_rx(&rx_cbdp, epid);
234 ep_ref[epid].prx = rx_cbdp;
236 /* Advance RX CBD pointer */
237 mpc8xx_udc_advance_rx(&rx_cbdp, epid);
240 }while(rx_cbdp != rx_cbdp_base);
243 /* Handle TX events as appropiate, the correct place to do this is
244 * in a tx routine. Perhaps TX on epn was pre-empted by ep0
247 if(usbp->usber&USB_E_TXB){
248 usbp->usber|=USB_E_TXB;
251 if(usbp->usber&(USB_TX_ERRMASK)){
252 mpc8xx_udc_handle_txerr();
255 /* Switch to the default state, respond at the default address */
256 if(usbp->usber&USB_E_RESET){
257 usbp->usber|=USB_E_RESET;
259 udc_device->device_state = STATE_DEFAULT;
262 /*if(usbp->usber&USB_E_IDLE){
263 We could suspend here !
264 usbp->usber|=USB_E_IDLE;
265 DBG("idle state change\n");
268 We could resume here when IDLE is deasserted !
269 Not worth doing, so long as we are self powered though.
277 /* udc_endpoint_write
279 * Write some data to an endpoint
281 int udc_endpoint_write(struct usb_endpoint_instance *epi)
284 short epid = 1, unnak = 0, ret = 0;
286 if(udc_state != STATE_READY){
287 ERR("invalid udc_state != STATE_READY!\n");
291 if(!udc_device || !epi){
295 if(udc_device->device_state!=STATE_CONFIGURED){
299 ep = epi->endpoint_address & 0x03;
300 if(ep >= MAX_ENDPOINTS){
304 /* Set NAK for all RX endpoints during TX */
305 for(epid = 1; epid<MAX_ENDPOINTS; epid++){
307 /* Don't set NAK on DATA IN/CONTROL endpoints */
308 if(ep_ref[epid].sc & USB_DIR_IN){
312 if(!(usbp->usep[epid]&( USEP_THS_NAK | USEP_RHS_NAK ))){
316 mpc8xx_udc_set_nak(epid);
319 mpc8xx_udc_init_tx(&udc_device->bus->endpoint_array[ep],epi->tx_urb);
320 ret = mpc8xx_udc_ep_tx(&udc_device->bus->endpoint_array[ep]);
322 /* Remove temporary NAK */
323 for(epid = 1; epid<MAX_ENDPOINTS; epid++){
332 /* mpc8xx_udc_assign_urb
334 * Associate a given urb to an endpoint TX or RX transmit/receive buffers
336 static int mpc8xx_udc_assign_urb(int ep, char direction)
338 struct usb_endpoint_instance *epi = 0;
340 if(ep >= MAX_ENDPOINTS){
343 epi = &udc_device->bus->endpoint_array[ep];
349 ep_ref[ep].urb = usbd_alloc_urb(udc_device,
350 udc_device->bus->endpoint_array);
355 ep_ref[ep].urb->actual_length = 0;
360 epi->tx_urb = ep_ref[ep].urb;
363 epi->rcv_urb = ep_ref[ep].urb;
371 udc_state = STATE_ERROR;
377 * Associate U-Boot software endpoints to mpc8xx endpoint parameter ram
378 * Isochronous endpoints aren't yet supported!
380 void udc_setup_ep(struct usb_device_instance *device, unsigned int ep,
381 struct usb_endpoint_instance *epi)
386 if(epi && (ep < MAX_ENDPOINTS)){
389 if (epi->rcv_attributes!=USB_ENDPOINT_XFER_CONTROL
390 ||epi->tx_attributes!=
391 USB_ENDPOINT_XFER_CONTROL){
393 /* ep0 must be a control endpoint*/
394 udc_state = STATE_ERROR;
398 if(!(ep_ref[ep].sc & EP_ATTACHED)){
399 mpc8xx_udc_cbd_attach (ep, epi->tx_packetSize,
400 epi->rcv_packetSize);
402 usbp->usep[ep] = 0x0000;
406 if ((epi->endpoint_address & USB_ENDPOINT_DIR_MASK)
410 ep_attrib = epi->tx_attributes;
411 epi->rcv_packetSize = 0;
412 ep_ref[ep].sc |= USB_DIR_IN;
416 ep_attrib = epi->rcv_attributes;
417 epi->tx_packetSize = 0;
418 ep_ref[ep].sc &= ~USB_DIR_IN;
421 if(mpc8xx_udc_assign_urb(ep, epi->endpoint_address
422 &USB_ENDPOINT_DIR_MASK)){
427 case USB_ENDPOINT_XFER_CONTROL:
428 if(!(ep_ref[ep].sc & EP_ATTACHED)){
429 mpc8xx_udc_cbd_attach (ep,
431 epi->rcv_packetSize);
433 usbp->usep[ep] = ep<<12;
434 epi->rcv_urb = epi->tx_urb = ep_ref[ep].urb;
437 case USB_ENDPOINT_XFER_BULK :
438 case USB_ENDPOINT_XFER_INT:
439 if(!(ep_ref[ep].sc & EP_ATTACHED)){
441 mpc8xx_udc_cbd_attach (ep,
442 epi->tx_packetSize, 0);
444 mpc8xx_udc_cbd_attach (ep,
445 0, epi->rcv_packetSize);
448 usbp->usep[ep]= (ep<<12)|((ep_attrib)<<8);
451 case USB_ENDPOINT_XFER_ISOC:
453 serial_printf("Error endpoint attrib %d>3\n",
455 udc_state = STATE_ERROR;
464 * Move state, switch on the USB
466 void udc_connect(void)
468 /* Enable pull-up resistor on D+
469 * TODO: fit a pull-up resistor to drive SE0 for > 2.5us
472 if(udc_state!=STATE_ERROR){
473 udc_state = STATE_READY;
474 usbp->usmod|= USMOD_EN;
480 * Disconnect is not used but, is included for completeness
482 void udc_disconnect(void)
484 /* Disable pull-up resistor on D-
485 * TODO: fix a pullup resistor to control this
488 if(udc_state!=STATE_ERROR){
489 udc_state = STATE_NOT_READY;
491 usbp->usmod&=~USMOD_EN;
496 * Grab an EP0 URB, register interest in a subset of USB events
498 void udc_enable(struct usb_device_instance *device)
500 if(udc_state == STATE_ERROR){
507 ep_ref[0].urb = usbd_alloc_urb(device,
508 device->bus->endpoint_array);
511 /* Register interest in all events except SOF, enable transceiver */
520 * disable the currently hooked device
522 void udc_disable(void)
526 if(udc_state == STATE_ERROR){
527 DBG("Won't disable UDC. udc_state==STATE_ERROR !\n");
533 for(;i<MAX_ENDPOINTS; i++){
535 usbd_dealloc_urb(ep_ref[i].urb);
541 usbp->usmod= ~USMOD_EN;
542 udc_state = STATE_NOT_READY;
545 /* udc_startup_events
547 * Enable the specified device
549 void udc_startup_events(struct usb_device_instance *device)
552 if(udc_state == STATE_READY){
553 usbd_device_event_irq (device, DEVICE_CREATE, 0);
559 * Allow upper layers to signal lower layers should not accept more RX data
562 void udc_set_nak(int epid)
565 mpc8xx_udc_set_nak(epid);
571 * Suspend sending of NAK tokens for DATA OUT tokens on a given endpoint.
572 * Switch off NAKing on this endpoint to accept more data output from host.
575 void udc_unset_nak (int epid)
577 if(epid > MAX_ENDPOINTS){
581 if(usbp->usep[epid]&(USEP_THS_NAK | USEP_RHS_NAK)){
582 usbp->usep[epid]&= ~(USEP_THS_NAK | USEP_RHS_NAK);
587 /******************************************************************************
589 ******************************************************************************/
591 /* udc_state_transition_up
592 * udc_state_transition_down
594 * Helper functions to implement device state changes. The device states and
595 * the events that transition between them are:
600 * DEVICE_HUB_CONFIGURED DEVICE_HUB_RESET
606 * DEVICE_RESET DEVICE_POWER_INTERRUPTION
612 * DEVICE_ADDRESS_ASSIGNED DEVICE_RESET
618 * DEVICE_CONFIGURED DEVICE_DE_CONFIGURED
623 * udc_state_transition_up transitions up (in the direction from STATE_ATTACHED
624 * to STATE_CONFIGURED) from the specified initial state to the specified final
625 * state, passing through each intermediate state on the way. If the initial
626 * state is at or above (i.e. nearer to STATE_CONFIGURED) the final state, then
627 * no state transitions will take place.
629 * udc_state_transition_down transitions down (in the direction from
630 * STATE_CONFIGURED to STATE_ATTACHED) from the specified initial state to the
631 * specified final state, passing through each intermediate state on the way.
632 * If the initial state is at or below (i.e. nearer to STATE_ATTACHED) the final
633 * state, then no state transitions will take place.
637 static void mpc8xx_udc_state_transition_up (usb_device_state_t initial,
638 usb_device_state_t final)
640 if (initial < final) {
643 usbd_device_event_irq (udc_device,
644 DEVICE_HUB_CONFIGURED, 0);
645 if (final == STATE_POWERED)
648 usbd_device_event_irq (udc_device, DEVICE_RESET, 0);
649 if (final == STATE_DEFAULT)
652 usbd_device_event_irq (udc_device,
653 DEVICE_ADDRESS_ASSIGNED, 0);
654 if (final == STATE_ADDRESSED)
656 case STATE_ADDRESSED:
657 usbd_device_event_irq (udc_device, DEVICE_CONFIGURED,
659 case STATE_CONFIGURED:
667 static void mpc8xx_udc_state_transition_down (usb_device_state_t initial,
668 usb_device_state_t final)
670 if (initial > final) {
672 case STATE_CONFIGURED:
673 usbd_device_event_irq (udc_device,
674 DEVICE_DE_CONFIGURED, 0);
675 if (final == STATE_ADDRESSED)
677 case STATE_ADDRESSED:
678 usbd_device_event_irq (udc_device, DEVICE_RESET, 0);
679 if (final == STATE_DEFAULT)
682 usbd_device_event_irq (udc_device,
683 DEVICE_POWER_INTERRUPTION, 0);
684 if (final == STATE_POWERED)
687 usbd_device_event_irq (udc_device, DEVICE_HUB_RESET,
699 * Force returning of STALL tokens on the given endpoint. Protocol or function
700 * STALL conditions are permissable here
702 static void mpc8xx_udc_stall (unsigned int ep)
704 usbp->usep[ep] |= STALL_BITMASK;
707 /* mpc8xx_udc_set_nak
709 * Force returning of NAK responses for the given endpoint as a kind of very
710 * simple flow control
712 static void mpc8xx_udc_set_nak (unsigned int ep)
714 usbp->usep[ep] |= NAK_BITMASK;
718 /* mpc8xx_udc_handle_txerr
720 * Handle errors relevant to TX. Return a status code to allow calling
721 * indicative of what if anything happened
723 static short mpc8xx_udc_handle_txerr()
725 short ep = 0, ret = 0;
727 for(; ep<TX_RING_SIZE; ep++){
728 if(usbp->usber&(0x10<<ep)){
730 /* Timeout or underrun */
731 if(tx_cbd[ep]->cbd_sc&0x06){
733 mpc8xx_udc_flush_tx_fifo(ep);
736 if(usbp->usep[ep]&STALL_BITMASK){
743 usbp->usber|=(0x10<<ep);
749 /* mpc8xx_udc_advance_rx
753 static void mpc8xx_udc_advance_rx(volatile cbd_t ** rx_cbdp, int epid)
755 if((*rx_cbdp)->cbd_sc & RX_BD_W){
756 *rx_cbdp = (volatile cbd_t*)
757 (endpoints[epid]->rbase + CFG_IMMR);
765 /* mpc8xx_udc_flush_tx_fifo
767 * Flush a given TX fifo. Assumes one tx cbd per endpoint
769 static void mpc8xx_udc_flush_tx_fifo(int epid)
771 volatile cbd_t * tx_cbdp = 0;
773 if(epid > MAX_ENDPOINTS){
778 immr->im_cpm.cp_cpcr = ((epid<<2) | 0x1D01);
780 while(immr->im_cpm.cp_cpcr & 0x01);
782 usbp->uscom = 0x40 | 0;
785 tx_cbdp = (cbd_t*)(endpoints[epid]->tbptr + CFG_IMMR);
786 tx_cbdp->cbd_sc = (TX_BD_I | TX_BD_W);
789 endpoints[epid]->tptr = endpoints[epid]->tbase;
790 endpoints[epid]->tstate = 0x00;
791 endpoints[epid]->tbcnt = 0x00;
794 immr->im_cpm.cp_cpcr = ((epid<<2) | 0x2D01);
796 while(immr->im_cpm.cp_cpcr & 0x01);
801 /* mpc8xx_udc_flush_rx_fifo
803 * For the sake of completeness of the namespace, it seems like
804 * a good-design-decision (tm) to include mpc8xx_udc_flush_rx_fifo();
805 * If RX_BD_E is true => a driver bug either here or in an upper layer
806 * not polling frequently enough. If RX_BD_E is true we have told the host
807 * we have accepted data but, the CPM found it had no-where to put that data
808 * which needless to say would be a bad thing.
810 static void mpc8xx_udc_flush_rx_fifo()
813 for(i = 0;i<RX_RING_SIZE; i++){
814 if(!(rx_cbd[i]->cbd_sc&RX_BD_E)){
815 ERR("buf %p used rx data len = 0x%x sc=0x%x!\n",
816 rx_cbd[i], rx_cbd[i]->cbd_datlen,
821 ERR("BUG : Input over-run\n");
824 /* mpc8xx_udc_clear_rxbd
826 * Release control of RX CBD to CP.
828 static void mpc8xx_udc_clear_rxbd(volatile cbd_t * rx_cbdp)
830 rx_cbdp->cbd_datlen = 0x0000;
831 rx_cbdp->cbd_sc= ((rx_cbdp->cbd_sc & RX_BD_W)|(RX_BD_E | RX_BD_I));
837 * Parse for tx timeout, control RX or USB reset/busy conditions
838 * Return -1 on timeout, -2 on fatal error, else return zero
840 static int mpc8xx_udc_tx_irq(int ep)
844 if(usbp->usber&(USB_TX_ERRMASK)){
845 if(mpc8xx_udc_handle_txerr()){
846 /* Timeout, controlling function must retry send */
851 if(usbp->usber & (USB_E_RESET|USB_E_BSY)){
852 /* Fatal, abandon TX transaction */
856 if(usbp->usber & USB_E_RXB){
857 for(i = 0;i<RX_RING_SIZE; i++){
858 if(!(rx_cbd[i]->cbd_sc&RX_BD_E)){
859 if((rx_cbd[i] == ep_ref[0].prx) || ep){
871 * Transmit in a re-entrant fashion outbound USB packets.
872 * Implement retry/timeout mechanism described in USB specification
873 * Toggle DATA0/DATA1 pids as necessary
874 * Introduces non-standard tx_retry. The USB standard has no scope for slave
875 * devices to give up TX, however tx_retry stops us getting stuck in an endless
878 static int mpc8xx_udc_ep_tx (struct usb_endpoint_instance *epi)
880 struct urb *urb = epi->tx_urb;
881 volatile cbd_t * tx_cbdp = 0;
882 unsigned int ep = 0, pkt_len = 0, x = 0, tx_retry = 0;
885 if(!epi || (epi->endpoint_address&0x03)>=MAX_ENDPOINTS || !urb){
889 ep = epi->endpoint_address & 0x03;
890 tx_cbdp = (cbd_t*)(endpoints[ep]->tbptr + CFG_IMMR);
892 if(tx_cbdp->cbd_sc&TX_BD_R || usbp->usber&USB_E_TXB){
893 mpc8xx_udc_flush_tx_fifo(ep);
894 usbp->usber |= USB_E_TXB;
897 while(tx_retry++ < 100){
898 ret = mpc8xx_udc_tx_irq(ep);
900 /* ignore timeout here */
903 mpc8xx_udc_flush_tx_fifo(ep);
907 tx_cbdp = (cbd_t*)(endpoints[ep]->tbptr + CFG_IMMR);
908 while(tx_cbdp->cbd_sc&TX_BD_R){};
909 tx_cbdp->cbd_sc = (tx_cbdp->cbd_sc&TX_BD_W);
911 pkt_len = urb->actual_length - epi->sent;
913 if(pkt_len> epi->tx_packetSize || pkt_len > EP_MAX_PKT){
914 pkt_len = MIN(epi->tx_packetSize, EP_MAX_PKT);
917 for(x=0; x<pkt_len; x++){
918 *((unsigned char*)(tx_cbdp->cbd_bufaddr+x)) =
919 urb->buffer[epi->sent + x];
921 tx_cbdp->cbd_datlen = pkt_len;
922 tx_cbdp->cbd_sc|=(CBD_TX_BITMASK | ep_ref[ep].pid);
925 #ifdef __SIMULATE_ERROR__
926 if(++err_poison_test == 2){
928 tx_cbdp->cbd_sc&=~TX_BD_TC;
932 usbp->uscom = (USCOM_STR | ep);
934 while(!(usbp->usber&USB_E_TXB)){
935 ret = mpc8xx_udc_tx_irq(ep);
940 if(usbp->usber & USB_E_TXB){
941 usbp->usber|=USB_E_TXB;
943 mpc8xx_udc_flush_tx_fifo(ep);
948 if(usbp->usber & USB_E_TXB){
949 usbp->usber|=USB_E_TXB;
952 /* ACK must be present <= 18bit times from TX */
957 /* TX ACK : USB 2.0 8.7.2, Toggle PID, Advance TX */
958 epi->sent += pkt_len;
959 epi->last = MIN (urb->actual_length - epi->sent,
961 TOGGLE_TX_PID(ep_ref[ep].pid);
963 if(epi->sent >= epi->tx_urb->actual_length){
965 epi->tx_urb->actual_length = 0;
968 if(ep_ref[ep].sc & EP_SEND_ZLP){
969 ep_ref[ep].sc &= ~EP_SEND_ZLP;
976 ERR("TX fail, endpoint 0x%x tx bytes 0x%x/0x%x\n",ep, epi->sent,
977 epi->tx_urb->actual_length);
982 /* mpc8xx_udc_dump_request
984 * Dump a control request to console
986 static void mpc8xx_udc_dump_request(struct usb_device_request *request)
989 "bmRequestType:%02x bRequest:%02x wValue:%04x "
990 "wIndex:%04x wLength:%04x ?\n",
991 request->bmRequestType,
1000 /* mpc8xx_udc_ep0_rx_setup
1002 * Decode received ep0 SETUP packet. return non-zero on error
1004 static int mpc8xx_udc_ep0_rx_setup (volatile cbd_t * rx_cbdp)
1007 struct urb * purb = ep_ref[0].urb;
1008 struct usb_endpoint_instance *epi =
1009 &udc_device->bus->endpoint_array[0];
1011 for(; x<rx_cbdp->cbd_datlen; x++){
1012 *(((unsigned char*)&ep_ref[0].urb->device_request)+x) =
1013 *((unsigned char*)(rx_cbdp->cbd_bufaddr+x));
1016 mpc8xx_udc_clear_rxbd(rx_cbdp);
1018 if (ep0_recv_setup(purb)) {
1019 mpc8xx_udc_dump_request(&purb->device_request);
1023 if ((purb->device_request.bmRequestType&USB_REQ_DIRECTION_MASK)
1024 == USB_REQ_HOST2DEVICE) {
1026 switch (purb->device_request.bRequest){
1027 case USB_REQ_SET_ADDRESS:
1028 /* Send the Status OUT ZLP */
1029 ep_ref[0].pid = TX_BD_PID_DATA1;
1030 purb->actual_length = 0;
1031 mpc8xx_udc_init_tx(epi,purb);
1032 mpc8xx_udc_ep_tx(epi);
1034 /* Move to the addressed state */
1035 usbp->usaddr = udc_device->address;
1036 mpc8xx_udc_state_transition_up(udc_device->device_state,
1040 case USB_REQ_SET_CONFIGURATION:
1041 if(!purb->device_request.wValue){
1043 /* Respond at default address */
1044 usbp->usaddr = 0x00;
1045 mpc8xx_udc_state_transition_down(udc_device->device_state,
1050 /* TODO: Support multiple configurations */
1051 mpc8xx_udc_state_transition_up(udc_device->device_state,STATE_CONFIGURED);
1052 for(x=1; x<MAX_ENDPOINTS; x++){
1053 if((udc_device->bus->endpoint_array[x].endpoint_address&USB_ENDPOINT_DIR_MASK)
1055 ep_ref[x].pid = TX_BD_PID_DATA0;
1057 ep_ref[x].pid = RX_BD_PID_DATA0;
1059 /* Set configuration must unstall endpoints */
1060 usbp->usep[x]&=~STALL_BITMASK;
1066 /* CDC/Vendor specific */
1070 /* Send ZLP as ACK in Status OUT phase */
1071 ep_ref[0].pid = TX_BD_PID_DATA1;
1072 purb->actual_length = 0;
1073 mpc8xx_udc_init_tx(epi,purb);
1074 mpc8xx_udc_ep_tx(epi);
1077 if(purb->actual_length){
1078 ep_ref[0].pid = TX_BD_PID_DATA1;
1079 mpc8xx_udc_init_tx(epi,purb);
1081 if(!(purb->actual_length%EP0_MAX_PACKET_SIZE)){
1082 ep_ref[0].sc |= EP_SEND_ZLP;
1085 if(purb->device_request.wValue==
1086 USB_DESCRIPTOR_TYPE_DEVICE){
1087 if(le16_to_cpu(purb->device_request.wLength)>
1088 purb->actual_length){
1089 /* Send EP0_MAX_PACKET_SIZE bytes
1090 * unless correct size requested.
1092 if(purb->actual_length >
1093 epi->tx_packetSize){
1095 purb->actual_length =
1101 mpc8xx_udc_ep_tx(epi);
1104 /* Corrupt SETUP packet? */
1105 ERR("Zero length data or SETUP with DATA-IN phase ?\n");
1112 /* mpc8xx_udc_init_tx
1114 * Setup some basic parameters for a TX transaction
1116 static void mpc8xx_udc_init_tx(struct usb_endpoint_instance *epi,
1117 struct urb * tx_urb)
1121 epi->tx_urb = tx_urb;
1124 /* mpc8xx_udc_ep0_rx
1126 * Receive ep0/control USB data. Parse and possibly send a response.
1128 static void mpc8xx_udc_ep0_rx(volatile cbd_t * rx_cbdp)
1130 if(rx_cbdp->cbd_sc&RX_BD_PID_SETUP){
1132 /* Unconditionally accept SETUP packets */
1133 if(mpc8xx_udc_ep0_rx_setup(rx_cbdp)){
1134 mpc8xx_udc_stall (0);
1139 mpc8xx_udc_clear_rxbd(rx_cbdp);
1141 if((rx_cbdp->cbd_datlen-2)){
1142 /* SETUP with a DATA phase
1143 * outside of SETUP packet.
1146 mpc8xx_udc_stall (0);
1151 /* mpc8xx_udc_epn_rx
1153 * Receive some data from cbd into USB system urb data abstraction
1154 * Upper layers should NAK if there is insufficient RX data space
1156 static int mpc8xx_udc_epn_rx (unsigned int epid, volatile cbd_t * rx_cbdp)
1158 struct usb_endpoint_instance *epi = 0;
1159 struct urb *urb = 0;
1162 if(epid >= MAX_ENDPOINTS || !rx_cbdp->cbd_datlen){
1166 /* USB 2.0 PDF section 8.6.4
1167 * Discard data with invalid PID it is a resend.
1169 if(ep_ref[epid].pid!=(rx_cbdp->cbd_sc&0xC0)){
1172 TOGGLE_RX_PID(ep_ref[epid].pid);
1174 epi = &udc_device->bus->endpoint_array[epid];
1177 for(; x<(rx_cbdp->cbd_datlen-2); x++){
1178 *((unsigned char*)(urb->buffer + urb->actual_length +x)) =
1179 *((unsigned char*)(rx_cbdp->cbd_bufaddr+x));
1183 usbd_rcv_complete (epi, x, 0);
1184 if(ep_ref[epid].urb->status == RECV_ERROR){
1185 DBG("RX error unset NAK\n");
1186 udc_unset_nak(epid);
1192 /* mpc8xx_udc_clock_init
1194 * Obtain a clock reference for Full Speed Signaling
1196 static void mpc8xx_udc_clock_init (volatile immap_t * immr,
1197 volatile cpm8xx_t * cp)
1200 #if defined(CFG_USB_EXTC_CLK)
1202 /* This has been tested with a 48MHz crystal on CLK6 */
1203 switch(CFG_USB_EXTC_CLK){
1205 immr->im_ioport.iop_papar|= 0x0100;
1206 immr->im_ioport.iop_padir&= ~0x0100;
1210 immr->im_ioport.iop_papar|= 0x0200;
1211 immr->im_ioport.iop_padir&= ~0x0200;
1215 immr->im_ioport.iop_papar|= 0x0400;
1216 immr->im_ioport.iop_padir&= ~0x0400;
1220 immr->im_ioport.iop_papar|= 0x0800;
1221 immr->im_ioport.iop_padir&= ~0x0800;
1225 udc_state = STATE_ERROR;
1229 #elif defined(CFG_USB_BRGCLK)
1231 /* This has been tested with brgclk == 50MHz */
1232 DECLARE_GLOBAL_DATA_PTR;
1235 if(gd->cpu_clk<48000000L){
1236 ERR("brgclk is too slow for full-speed USB!\n");
1237 udc_state = STATE_ERROR;
1241 /* Assume the brgclk is 'good enough', we want !(gd->cpu_clk%48Mhz)
1242 * but, can /probably/ live with close-ish alternative rates.
1244 divisor = (gd->cpu_clk/48000000L)-1;
1245 cp->cp_sicr &= ~0x0000003F;
1247 switch(CFG_USB_BRGCLK){
1249 cp->cp_brgc1 |= (divisor|CPM_BRG_EN);
1250 cp->cp_sicr &= ~0x2F;
1253 cp->cp_brgc2 |= (divisor|CPM_BRG_EN);
1254 cp->cp_sicr |= 0x00000009;
1257 cp->cp_brgc3 |= (divisor|CPM_BRG_EN);
1258 cp->cp_sicr |= 0x00000012;
1261 cp->cp_brgc4 = (divisor|CPM_BRG_EN);
1262 cp->cp_sicr |= 0x0000001B;
1265 udc_state = STATE_ERROR;
1270 #error "CFG_USB_EXTC_CLK or CFG_USB_BRGCLK must be defined"
1275 /* mpc8xx_udc_cbd_attach
1277 * attach a cbd to and endpoint
1279 static void mpc8xx_udc_cbd_attach (int ep, uchar tx_size, uchar rx_size)
1282 if (!tx_cbd[ep] || !rx_cbd[ep] || ep >= MAX_ENDPOINTS){
1283 udc_state = STATE_ERROR;
1287 if (tx_size>USB_MAX_PKT || rx_size>USB_MAX_PKT ||
1288 (!tx_size && !rx_size)){
1289 udc_state = STATE_ERROR;
1293 /* Attach CBD to appropiate Parameter RAM Endpoint data structure */
1295 endpoints[ep]->rbase = (u32)rx_cbd[rx_ct];
1296 endpoints[ep]->rbptr = (u32)rx_cbd[rx_ct];
1301 endpoints[ep]->rbptr = (u32)rx_cbd[rx_ct];
1302 rx_cbd[rx_ct]->cbd_sc |= RX_BD_W;
1307 endpoints[ep]->rbptr = (u32)rx_cbd[rx_ct];
1308 rx_cbd[rx_ct]->cbd_sc |= RX_BD_W;
1312 /* Where we expect to RX data on this endpoint */
1313 ep_ref[ep].prx = rx_cbd[rx_ct-1];
1317 endpoints[ep]->rbase = 0;
1318 endpoints[ep]->rbptr = 0;
1322 endpoints[ep]->tbase = (u32)tx_cbd[tx_ct];
1323 endpoints[ep]->tbptr = (u32)tx_cbd[tx_ct];
1326 endpoints[ep]->tbase = 0;
1327 endpoints[ep]->tbptr = 0;
1330 endpoints[ep]->tstate = 0;
1331 endpoints[ep]->tbcnt = 0;
1332 endpoints[ep]->mrblr = EP_MAX_PKT;
1333 endpoints[ep]->rfcr = 0x18;
1334 endpoints[ep]->tfcr = 0x18;
1335 ep_ref[ep].sc |= EP_ATTACHED;
1337 DBG("ep %d rbase 0x%08x rbptr 0x%08x tbase 0x%08x tbptr 0x%08x prx = %p\n",
1338 ep, endpoints[ep]->rbase, endpoints[ep]->rbptr, endpoints[ep]->tbase,
1339 endpoints[ep]->tbptr, ep_ref[ep].prx);
1344 /* mpc8xx_udc_cbd_init
1346 * Allocate space for a cbd and allocate TX/RX data space
1348 static void mpc8xx_udc_cbd_init (void)
1352 for(; i<TX_RING_SIZE; i++){
1354 mpc8xx_udc_alloc(sizeof(cbd_t), sizeof(int));
1357 for(i=0; i<RX_RING_SIZE; i++){
1359 mpc8xx_udc_alloc(sizeof(cbd_t),sizeof(int));
1362 for(i=0; i< TX_RING_SIZE; i++){
1363 tx_cbd[i]->cbd_bufaddr =
1364 mpc8xx_udc_alloc(EP_MAX_PKT, sizeof(int));
1366 tx_cbd[i]->cbd_sc = (TX_BD_I | TX_BD_W);
1367 tx_cbd[i]->cbd_datlen = 0x0000;
1371 for(i=0; i< RX_RING_SIZE; i++){
1372 rx_cbd[i]->cbd_bufaddr =
1373 mpc8xx_udc_alloc(EP_MAX_PKT, sizeof(int));
1374 rx_cbd[i]->cbd_sc = (RX_BD_I | RX_BD_E);
1375 rx_cbd[i]->cbd_datlen = 0x0000;
1382 /* mpc8xx_udc_endpoint_init
1384 * Attach an endpoint to some dpram
1386 static void mpc8xx_udc_endpoint_init (void)
1390 for(; i<MAX_ENDPOINTS; i++){
1391 endpoints[i]= (usb_epb_t*)
1392 mpc8xx_udc_alloc(sizeof(usb_epb_t) , 32);
1398 * Grab the address of some dpram
1400 static u32 mpc8xx_udc_alloc (u32 data_size, u32 alignment)
1402 u32 retaddr = address_base;
1404 while(retaddr%alignment){
1407 address_base+= data_size;
1412 #endif /* CONFIG_MPC885_FAMILY && CONFIG_USB_DEVICE) */