From 34b9e07b8eafbaef3c81dd850cdaee8610efa1f1 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 28 Sep 2009 20:42:53 +0200 Subject: [PATCH] some usb stack related clean up; BULK still untested --- usb/core/core.c | 55 ++---------------------------- usb/core/usb.c | 89 +++++++++++++++++-------------------------------- 2 files changed, 33 insertions(+), 111 deletions(-) diff --git a/usb/core/core.c b/usb/core/core.c index 97acc56..a6c84fb 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -120,7 +120,7 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) if(ret < 0) { return (void*) -1; } -// + //#define WTF #ifdef WTF volatile u8 wzf = 11; @@ -440,62 +440,13 @@ u16 usb_submit_irp(struct usb_irp *irp) break; case USB_BULK: - //u8 runloop=1; - //u16 restlength = irp->len; - //char * td_buf_ptr=irp->buffer; - - /* schleife die die tds generiert */ - while (runloop) { - td = usb_create_transfer_descriptor(irp); - td->endpoint = td->endpoint & 0x7F; /* clear direction bit */ - - /* max packet size for given endpoint */ - td->actlen = irp->epsize; - - /* Generate In Packet */ - if (irp->endpoint & 0x80) - td->pid = USB_PID_IN; - else - /* Generate Out Packet */ - td->pid = USB_PID_OUT; - - /* stop loop if all bytes are send */ - if (restlength <= irp->epsize) { - runloop = 0; - td->actlen = restlength; - } - - td->buffer = td_buf_ptr; - /* move pointer for next packet */ - td_buf_ptr = td_buf_ptr + irp->epsize; - - td->togl = togl; - togl = togl ? 0 : 1; - /**** send token ****/ - hcdi_enqueue(td, irp->dev->ohci); - free(td); - } - /* next togl */ - //if(td->pid == USB_PID_OUT) { - //if(togl==0) togl=1; else togl=0; - //} - irp->dev->epTogl[(irp->endpoint & 0x7F)] = togl; - - break; - case USB_INTR: - //u8 runloop=1; - //u16 restlength = irp->len; - //char * td_buf_ptr=irp->buffer; - - /* schleife die die tds generiert */ while (runloop && (restlength > 0)) { td = usb_create_transfer_descriptor(irp); /* max packet size for given endpoint */ td->actlen = irp->epsize; - td->pid = USB_PID_IN; - /* TODO: USB_PID_OUT */ + td->pid = irp->endpoint & 0x80 ? USB_PID_IN : USB_PID_OUT; /* stop loop if all bytes are send */ if (restlength < irp->epsize) { @@ -534,7 +485,7 @@ struct usb_transfer_descriptor *usb_create_transfer_descriptor(struct usb_irp * (struct usb_transfer_descriptor *) malloc(sizeof(struct usb_transfer_descriptor)); td->devaddress = irp->dev->address; - td->endpoint = irp->endpoint; + td->endpoint = irp->endpoint & 0x7F; td->iso = 0; td->state = USB_TRANSFER_DESCR_NONE; td->maxp = irp->epsize; diff --git a/usb/core/usb.c b/usb/core/usb.c index 76c3e85..45ceba2 100644 --- a/usb/core/usb.c +++ b/usb/core/usb.c @@ -118,12 +118,14 @@ s8 usb_reset(struct usb_device *dev) s8 usb_control_msg(struct usb_device *dev, u8 requesttype, u8 request, u16 value, u16 index, u16 length, u8 *buf, u16 timeout) { - struct usb_irp *irp = (struct usb_irp*)malloc(sizeof(struct usb_irp)); - irp->dev = dev; - irp->endpoint = 0; + static struct usb_irp irp; + memset(&irp, 0, sizeof(struct usb_irp)); - irp->epsize = dev->bMaxPacketSize0; - irp->type = USB_CTRL; + irp.dev = dev; + irp.endpoint = 0; + + irp.epsize = dev->bMaxPacketSize0; + irp.type = USB_CTRL; buf[0]=(u8)requesttype; buf[1]=(u8)request; @@ -134,12 +136,11 @@ s8 usb_control_msg(struct usb_device *dev, u8 requesttype, u8 request, buf[6]=(u8)(length); buf[7]=(u8)(length >> 8); - irp->buffer = buf; - irp->len = length; - irp->timeout = timeout; + irp.buffer = buf; + irp.len = length; + irp.timeout = timeout; - usb_submit_irp(irp); - free(irp); + usb_submit_irp(&irp); return 0; } @@ -333,7 +334,22 @@ s8 usb_set_altinterface(struct usb_device *dev, u8 alternate) return 0; } +static s8 usb_gen_rw(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout, u8 type) { + static struct usb_irp irp; + memset(&irp, 0, sizeof(struct usb_irp)); + + irp.dev = dev; + irp.endpoint = ep; + irp.epsize = dev->epSize[ep & 0x7F]; + irp.type = type; + + irp.buffer = buf; + irp.len = size; + irp.timeout = timeout; + usb_submit_irp(&irp); + return 0; +} /******************* Bulk Transfer **********************/ /** @@ -341,22 +357,7 @@ s8 usb_set_altinterface(struct usb_device *dev, u8 alternate) */ s8 usb_bulk_write(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout) { - struct usb_irp * irp = (struct usb_irp*)malloc(sizeof(struct usb_irp)); - irp->dev = dev; - //irp->devaddress = dev->address; - - irp->endpoint = ep; - irp->epsize = dev->epSize[ep]; // ermitteln - irp->type = USB_BULK; - - irp->buffer = buf; - irp->len = size; - irp->timeout = timeout; - - usb_submit_irp(irp); - free(irp); - - return 0; + return usb_gen_rw(dev, ep, buf, size, timeout, USB_BULK); } /** @@ -364,22 +365,7 @@ s8 usb_bulk_write(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout) */ s8 usb_bulk_read(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout) { - struct usb_irp * irp = (struct usb_irp*)malloc(sizeof(struct usb_irp)); - //irp->devaddress = dev->address; - irp->dev = dev; - - irp->endpoint = ep | 0x80; // from device to host - irp->epsize = dev->epSize[ep]; // ermitteln - irp->type = USB_BULK; - - irp->buffer = buf; - irp->len = size; - irp->timeout = timeout; - - usb_submit_irp(irp); - free(irp); - - return 0; + return usb_gen_rw(dev, ep|0x80, buf, size, timeout, USB_BULK); } @@ -389,7 +375,7 @@ s8 usb_bulk_read(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout) */ s8 usb_interrupt_write(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout) { - return 0; + return usb_gen_rw(dev, ep, buf, size, timeout, USB_INTR); } /** @@ -397,20 +383,7 @@ s8 usb_interrupt_write(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeo */ s8 usb_interrupt_read(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout) { - struct usb_irp *irp = (struct usb_irp*)malloc(sizeof(struct usb_irp)); - irp->dev = dev; - irp->endpoint = ep; //wtf? |80; //from device to host - irp->epsize = dev->epSize[ep]; // ermitteln - irp->type = USB_INTR; - - irp->buffer = buf; - irp->len = size; - irp->timeout = timeout; - - usb_submit_irp(irp); - free(irp); - - return 0; + return usb_gen_rw(dev, ep|0x80, buf, size, timeout, USB_INTR); } @@ -435,5 +408,3 @@ s8 usb_isochron_read(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout return 0; } - -//#endif //_USB_H_ -- 2.25.1