X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=usb%2Fcore%2Fcore.c;h=97acc56a57be1e7a66d1b0fbded801c2396e6540;hb=f80a808bafef8020c6d97d33cdf3cc613a70912b;hp=c3574283e0610562cfc13bf7b26d61aad61e8d0a;hpb=e8dd6b27d501339472cb5c8e0c94f3d2484e7810;p=ppcskel.git diff --git a/usb/core/core.c b/usb/core/core.c index c357428..97acc56 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -31,8 +31,17 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* + ppcskel - a Free Software replacement for the Nintendo/BroadOn bootloader. + plugmii core + +Copyright (C) 2009 Bernhard Urban +Copyright (C) 2009 Sebastian Falbesoner + +# This code is licensed to you under the terms of the GNU GPL, version 2; +# see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt +*/ -//#include #include "core.h" #include "../host/host.h" #include "usb.h" @@ -45,12 +54,12 @@ /** * Initialize USB stack. */ -void usb_init() +void usb_init(u32 reg) { core.drivers = list_create(); core.devices = list_create(); core.nextaddress = 1; - hcdi_init(); + hcdi_init(reg); } /** @@ -86,15 +95,19 @@ void usb_periodic() * for the core. usb_add_device expected that * the device answers to address zero. */ -struct usb_device *usb_add_device() +struct usb_device *usb_add_device(u8 lowspeed, u32 reg) { struct usb_device *dev = (struct usb_device *) malloc(sizeof(struct usb_device)); dev->conf = (struct usb_conf *) malloc(sizeof(struct usb_conf)); dev->address = 0; - /* send at first time only 8 bytes */ - dev->bMaxPacketSize0 = 8; + dev->fullspeed = lowspeed ? 0 : 1; + /* send at first time only 8 bytes for lowspeed devices + * 64 bytes for fullspeed + */ + dev->bMaxPacketSize0 = lowspeed ? 8 : 64; + dev->ohci = reg; - dev->epSize[0] = 64; + dev->epSize[0] = 8; dev->epSize[1] = 64; dev->epSize[2] = 64; @@ -107,30 +120,46 @@ struct usb_device *usb_add_device() if(ret < 0) { return (void*) -1; } - - /* set MaxPacketSize */ - +// +//#define WTF +#ifdef WTF + volatile u8 wzf = 11; + if(0 == wzf) { + printf("WTF WTF WTF WTF padding??? WTFWTF WTF\n"); + printf("WTF WTF WTF WTF padding??? WTF WTF WTF\n"); + printf("WTF TF WTF WTF padding??? WTF WTF WTF\n"); + printf("WTF WTF TF WTF padding??? WTF WTWTF\n"); + printf("TF WTF WTF WTF padding??? WTF WTF WTF\n"); + printf("WTF WTF WTF WT padding??? WTF WF WTF\n"); + printf("WTF WTF WTF WTF padding??? WTF WTF WTF\n"); + printf("WTF WTF WTF WTF padding??? WT WTF WTF\n"); + printf("WTF WTF WTF WTF pdding??? WTF WTF WTF\n"); + printf("WTF WTF WTF WTF paddin??? WTF WTF WTF\n"); + printf("WTF WTF WTF WTF padding??? WTF WTF WTF\n"); + printf("WTF WTF WTF WTF padding?? WT WTF WTF\n"); + printf("WTF WTF WTF WTF padding??? WTF WTF WTF\n"); + printf("WTF WTF WTF WTF padding??? WTFWTF WTF\n"); + } +#endif u8 address = usb_next_address(); ret = usb_set_address(dev, address); dev->address = address; printf("set address to %d\n", dev->address); + /* get device descriptor&co */ ret = usb_get_desc_dev(dev); + if(ret < 0) + return (void*) -1; - /* select configuration */ - ret = usb_set_configuration(dev, dev->conf->bConfigurationValue); - printf("=============\nusb_set_configuration(ret: %d) %d\n", ret, dev->conf->bConfigurationValue); - + /* print device info */ lsusb(dev); -#if 0 /* add device to device list */ - element *tmp = (element *) malloc(sizeof(element)); + struct element *tmp = (struct element *) malloc(sizeof(struct element)); tmp->data = (void *) dev; list_add_tail(core.devices, tmp); usb_probe_driver(); -#endif return dev; } @@ -140,10 +169,11 @@ void lsusb(struct usb_device *dev) printf("=== Device Descriptor === \n"); printf("bLength 0x%02X\n", dev->bLength); printf("bDescriptorType 0x%02X\n", dev->bDeviceClass); - printf("bcdUSB 0x%02X\n", dev->bcdUSB); + printf("bcdUSB 0x%04X\n", dev->bcdUSB); printf("bDeviceClass 0x%02X\n", dev->bDeviceClass); printf("bDeviceSubClass 0x%02X\n", dev->bDeviceSubClass); printf("bDeviceProtocoll 0x%02X\n", dev->bDeviceProtocoll); + printf("bMaxPacketSize 0x%02X\n", dev->bMaxPacketSize0); printf("idVendor 0x%04X\n", dev->idVendor); printf("idProduct 0x%04X\n", dev->idProduct); printf("bcdDevice 0x%04X\n", dev->bcdDevice); @@ -151,7 +181,7 @@ void lsusb(struct usb_device *dev) printf("iProduct(0x%02X): \"%s\"\n", dev->iProduct, dev->iProduct ? usb_get_string_simple(dev, dev->iProduct) : "no String"); printf("iSerialNumber(0x%02X): \"%s\"\n", dev->iSerialNumber, dev->iSerialNumber ? usb_get_string_simple(dev, dev->iSerialNumber) : "no String"); printf("bNumConfigurations 0x%02X\n", dev->bNumConfigurations); - + u8 c, i, e; struct usb_conf *conf = dev->conf; for(c=0; c <= dev->bNumConfigurations; c++) { @@ -190,7 +220,7 @@ void lsusb(struct usb_device *dev) ed = ed->next; } //endpoint - + ifs = ifs->next; } //interface @@ -202,19 +232,34 @@ void lsusb(struct usb_device *dev) * Find currently detached device and remove * data structures */ -u8 usb_remove_device(struct usb_device * dev) +u8 usb_remove_device(struct usb_device *dev) { - // FIXME!!!! dieser quatsch ist nur temporaer - free(core.devices->head); - free(core.devices); - core.devices = list_create(); + /* trigger driver for this device */ + struct usb_driver *drv; + struct element *iterator = core.drivers->head; + while (iterator != NULL) { + drv = (struct usb_driver *) iterator->data; + if(drv->data && !memcmp(drv->data, dev, sizeof(struct usb_device))) { + drv->remove(); + break; + } + iterator = iterator->next; + } + + /* remove from device list */ + struct element *tmp = (struct element *) malloc(sizeof(struct element)); + tmp->data = (void *) dev; + list_delete_element(core.devices, tmp); + + printf("REMOVED\n"); + return 1; } /** * Register new driver at usb stack. */ -u8 usb_register_driver(struct usb_driver * dev) +u8 usb_register_driver(struct usb_driver *dev) { /* add driver to driver list */ struct element *tmp = (struct element *) malloc(sizeof(struct element)); @@ -222,7 +267,6 @@ u8 usb_register_driver(struct usb_driver * dev) tmp->next = NULL; list_add_tail(core.drivers, tmp); - /** * first check to find a suitable device * (root hub drivers need this call here) @@ -306,7 +350,7 @@ u16 usb_submit_irp(struct usb_irp *irp) togl = togl ? 0 : 1; /**** send token ****/ - hcdi_enqueue(td); + hcdi_enqueue(td, irp->dev->ohci); /***************** Data Stage ***********************/ /** @@ -364,7 +408,7 @@ u16 usb_submit_irp(struct usb_irp *irp) } /**** send token ****/ - hcdi_enqueue(td); + hcdi_enqueue(td, irp->dev->ohci); /* pruefe ob noch weitere Pakete vom Device abgeholt werden muessen */ restlength = restlength - irp->epsize; @@ -391,19 +435,17 @@ u16 usb_submit_irp(struct usb_irp *irp) td->pid = USB_PID_IN; } /**** send token ****/ - hcdi_enqueue(td); + hcdi_enqueue(td, irp->dev->ohci); free(td); break; case USB_BULK: - core.stdout("bulk\r\n"); //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 */ @@ -428,12 +470,9 @@ u16 usb_submit_irp(struct usb_irp *irp) td_buf_ptr = td_buf_ptr + irp->epsize; td->togl = togl; - if (togl == 0) - togl = 1; - else - togl = 0; + togl = togl ? 0 : 1; /**** send token ****/ - hcdi_enqueue(td); + hcdi_enqueue(td, irp->dev->ohci); free(td); } /* next togl */ @@ -443,8 +482,43 @@ u16 usb_submit_irp(struct usb_irp *irp) 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 */ + + /* 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 += irp->epsize; + + td->togl = togl; + togl = togl ? 0 : 1; + + /**** send token ****/ + hcdi_enqueue(td, irp->dev->ohci); + restlength = restlength - irp->epsize; + free(td); + } + break; + irp->dev->epTogl[(irp->endpoint & 0x7F)] = togl; } - hcdi_fire(); + hcdi_fire(irp->dev->ohci); return 1; } @@ -464,6 +538,8 @@ struct usb_transfer_descriptor *usb_create_transfer_descriptor(struct usb_irp * td->iso = 0; td->state = USB_TRANSFER_DESCR_NONE; td->maxp = irp->epsize; + td->fullspeed = irp->dev->fullspeed; + td->type = irp->type; return td; }