1
0
Fork 0
forked from len0rd/rockbox

Fix Ingenic Jz4740 USB driver (USB IN <-> OUT) and some whitespace cleaning

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20996 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Maurus Cuelenaere 2009-05-20 12:37:56 +00:00
parent e71c67f340
commit 8bcb4a6971

View file

@ -74,12 +74,13 @@ struct usb_endpoint
static unsigned char ep0_rx_buf[64]; static unsigned char ep0_rx_buf[64];
static unsigned char ep0state = USB_EP0_IDLE; static unsigned char ep0state = USB_EP0_IDLE;
static struct usb_endpoint endpoints[] = static struct usb_endpoint endpoints[] =
{/* buf length sent busy type use_dma wait fifo_addr fifo_size */ {
{&ep0_rx_buf, 0, {0}, false, ep_control, false, false, USB_FIFO_EP0, 64 }, /* buf length sent busy type use_dma wait fifo_addr fifo_size */
{NULL, 0, {0}, false, ep_control, false, false, USB_FIFO_EP0, 64 }, {NULL, 0, {0}, false, ep_control, false, false, USB_FIFO_EP0, 64 },
{NULL, 0, {0}, false, ep_interrupt, false, false, USB_FIFO_EP1, 64 }, {&ep0_rx_buf, 0, {0}, false, ep_control, false, false, USB_FIFO_EP0, 64 },
{NULL, 0, {0}, false, ep_bulk, false, false, USB_FIFO_EP1, 512}, {NULL, 0, {0}, false, ep_bulk, false, false, USB_FIFO_EP1, 512},
{NULL, 0, {0}, false, ep_bulk, false, false, USB_FIFO_EP2, 512} {NULL, 0, {0}, false, ep_bulk, false, false, USB_FIFO_EP1, 512},
{NULL, 0, {0}, false, ep_interrupt, false, false, USB_FIFO_EP2, 64 }
}; };
static struct wakeup ep_wkup[TOTAL_EP()]; static struct wakeup ep_wkup[TOTAL_EP()];
@ -177,7 +178,7 @@ static void flushFIFO(struct usb_endpoint *ep)
static void EP0_send(void) static void EP0_send(void)
{ {
struct usb_endpoint* ep = &endpoints[1]; struct usb_endpoint* ep = &endpoints[0];
unsigned int length; unsigned int length;
unsigned char csr0; unsigned char csr0;
@ -204,7 +205,7 @@ static void EP0_send(void)
REG_USB_REG_CSR0 = (csr0 | USB_CSR0_INPKTRDY | USB_CSR0_DATAEND); /* Set data end! */ REG_USB_REG_CSR0 = (csr0 | USB_CSR0_INPKTRDY | USB_CSR0_DATAEND); /* Set data end! */
ep0state = USB_EP0_IDLE; ep0state = USB_EP0_IDLE;
if(ep->wait) if(ep->wait)
wakeup_signal(&ep_wkup[1]); wakeup_signal(&ep_wkup[0]);
} }
else else
REG_USB_REG_CSR0 = (csr0 | USB_CSR0_INPKTRDY); REG_USB_REG_CSR0 = (csr0 | USB_CSR0_INPKTRDY);
@ -247,11 +248,11 @@ static void EP0_handler(void)
{ {
if(csr0 & USB_CSR0_OUTPKTRDY) /* There is a packet in the fifo */ if(csr0 & USB_CSR0_OUTPKTRDY) /* There is a packet in the fifo */
{ {
readFIFO(&endpoints[0], REG_USB_REG_COUNT0); readFIFO(&endpoints[1], REG_USB_REG_COUNT0);
REG_USB_REG_CSR0 = csr0 | USB_CSR0_SVDOUTPKTRDY; /* clear OUTPKTRDY bit */ REG_USB_REG_CSR0 = csr0 | USB_CSR0_SVDOUTPKTRDY; /* clear OUTPKTRDY bit */
usb_core_control_request((struct usb_ctrlrequest*)endpoints[0].buf); usb_core_control_request((struct usb_ctrlrequest*)endpoints[1].buf);
if(endpoints[0].wait) if(endpoints[1].wait)
wakeup_signal(&ep_wkup[0]); wakeup_signal(&ep_wkup[1]);
} }
} }
else if(ep0state == USB_EP0_TX) else if(ep0state == USB_EP0_TX)
@ -260,7 +261,7 @@ static void EP0_handler(void)
static void EPIN_handler(unsigned int endpoint) static void EPIN_handler(unsigned int endpoint)
{ {
struct usb_endpoint* ep = &endpoints[endpoint*2+1]; struct usb_endpoint* ep = &endpoints[endpoint*2];
unsigned int length, csr; unsigned int length, csr;
select_endpoint(endpoint); select_endpoint(endpoint);
@ -300,7 +301,7 @@ static void EPIN_handler(unsigned int endpoint)
{ {
usb_core_transfer_complete(endpoint, USB_DIR_IN, 0, ep->sent); usb_core_transfer_complete(endpoint, USB_DIR_IN, 0, ep->sent);
if(ep->wait) if(ep->wait)
wakeup_signal(&ep_wkup[endpoint*2+1]); wakeup_signal(&ep_wkup[endpoint*2]);
logf("sent complete"); logf("sent complete");
ep->sent = 0; ep->sent = 0;
ep->length = 0; ep->length = 0;
@ -311,7 +312,7 @@ static void EPIN_handler(unsigned int endpoint)
static void EPOUT_handler(unsigned int endpoint) static void EPOUT_handler(unsigned int endpoint)
{ {
struct usb_endpoint* ep = &endpoints[endpoint*2]; struct usb_endpoint* ep = &endpoints[endpoint*2+1];
unsigned int size, csr; unsigned int size, csr;
if(!ep->busy) if(!ep->busy)
@ -350,7 +351,7 @@ static void EPOUT_handler(unsigned int endpoint)
{ {
usb_core_transfer_complete(endpoint, USB_DIR_OUT, 0, ep->received); usb_core_transfer_complete(endpoint, USB_DIR_OUT, 0, ep->received);
if(ep->wait) if(ep->wait)
wakeup_signal(&ep_wkup[endpoint*2]); wakeup_signal(&ep_wkup[endpoint*2+1]);
logf("receive transfer_complete"); logf("receive transfer_complete");
ep->received = 0; ep->received = 0;
ep->length = 0; ep->length = 0;
@ -714,9 +715,9 @@ int usb_drv_send_nonblocking(int endpoint, void* ptr, int length)
if(endpoint == EP_CONTROL) if(endpoint == EP_CONTROL)
{ {
flags = disable_irq_save(); flags = disable_irq_save();
endpoints[1].buf = ptr; endpoints[0].buf = ptr;
endpoints[1].sent = 0; endpoints[0].sent = 0;
endpoints[1].length = length; endpoints[0].length = length;
ep0state = USB_EP0_TX; ep0state = USB_EP0_TX;
EP0_send(); EP0_send();
restore_irq(flags); restore_irq(flags);
@ -726,11 +727,11 @@ int usb_drv_send_nonblocking(int endpoint, void* ptr, int length)
else else
{ {
flags = disable_irq_save(); flags = disable_irq_save();
endpoints[endpoint*2+1].buf = ptr; endpoints[endpoint*2].buf = ptr;
endpoints[endpoint*2+1].sent = 0; endpoints[endpoint*2].sent = 0;
endpoints[endpoint*2+1].length = length; endpoints[endpoint*2].length = length;
endpoints[endpoint*2+1].busy = true; endpoints[endpoint*2].busy = true;
if(endpoints[endpoint*2+1].use_dma) if(endpoints[endpoint*2].use_dma)
{ {
//dma_cache_wback_inv((unsigned long)ptr, length); //dma_cache_wback_inv((unsigned long)ptr, length);
__dcache_writeback_all(); __dcache_writeback_all();
@ -756,10 +757,10 @@ int usb_drv_send(int endpoint, void* ptr, int length)
if(endpoint == EP_CONTROL && ptr == NULL && length == 0) if(endpoint == EP_CONTROL && ptr == NULL && length == 0)
return 0; /* ACK request, handled by the USB controller */ return 0; /* ACK request, handled by the USB controller */
endpoints[endpoint*2+1].wait = true; endpoints[endpoint*2].wait = true;
ret = usb_drv_send_nonblocking(endpoint, ptr, length); ret = usb_drv_send_nonblocking(endpoint, ptr, length);
wakeup_wait(&ep_wkup[endpoint*2+1], TIMEOUT_BLOCK); wakeup_wait(&ep_wkup[endpoint*2], TIMEOUT_BLOCK);
endpoints[endpoint*2+1].wait = false; endpoints[endpoint*2].wait = false;
return ret; return ret;
} }
@ -776,11 +777,11 @@ int usb_drv_recv(int endpoint, void* ptr, int length)
else else
{ {
flags = disable_irq_save(); flags = disable_irq_save();
endpoints[endpoint*2].buf = ptr; endpoints[endpoint*2+1].buf = ptr;
endpoints[endpoint*2].received = 0; endpoints[endpoint*2+1].received = 0;
endpoints[endpoint*2].length = length; endpoints[endpoint*2+1].length = length;
endpoints[endpoint*2].busy = true; endpoints[endpoint*2+1].busy = true;
if(endpoints[endpoint*2].use_dma) if(endpoints[endpoint*2+1].use_dma)
{ {
//dma_cache_wback_inv((unsigned long)ptr, length); //dma_cache_wback_inv((unsigned long)ptr, length);
__dcache_writeback_all(); __dcache_writeback_all();
@ -836,7 +837,7 @@ void usb_drv_cancel_all_transfers(void)
for(i=0; i<TOTAL_EP(); i++) for(i=0; i<TOTAL_EP(); i++)
{ {
if(i > 2) if(i >= 2)
endpoints[i].buf = NULL; endpoints[i].buf = NULL;
endpoints[i].sent = 0; endpoints[i].sent = 0;
@ -864,18 +865,17 @@ int usb_drv_request_endpoint(int type, int dir)
type &= USB_ENDPOINT_XFERTYPE_MASK; type &= USB_ENDPOINT_XFERTYPE_MASK;
/* There are only 3+2 endpoints, so hardcode this ... */ /* There are only 3+2 endpoints, so hardcode this ... */
/* Use the endpoint combinations from the Ingenic Linux USB driver */
switch(type) switch(type)
{ {
case USB_ENDPOINT_XFER_BULK: case USB_ENDPOINT_XFER_BULK:
if(dir == USB_DIR_IN) if(dir == USB_DIR_IN)
return (2 | USB_DIR_IN); return (1 | USB_DIR_IN);
else else
return (1 | USB_DIR_OUT); return (1 | USB_DIR_OUT);
case USB_ENDPOINT_XFER_INT: case USB_ENDPOINT_XFER_INT:
if(dir == USB_DIR_IN) if(dir == USB_DIR_IN)
return (1 | USB_DIR_IN); return (2 | USB_DIR_IN);
default: default:
return -1; return -1;