X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=usb%2Fcore%2Fcore.c;h=97acc56a57be1e7a66d1b0fbded801c2396e6540;hb=f80a808bafef8020c6d97d33cdf3cc613a70912b;hp=34a853798119dc19125ae54804a8514988b4551d;hpb=5e7b3fe7025e9b039c5ab8d4cd9b4af088b70303;p=ppcskel.git diff --git a/usb/core/core.c b/usb/core/core.c index 34a8537..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" @@ -98,7 +107,7 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) dev->bMaxPacketSize0 = lowspeed ? 8 : 64; dev->ohci = reg; - dev->epSize[0] = 64; + dev->epSize[0] = 8; dev->epSize[1] = 64; dev->epSize[2] = 64; @@ -111,41 +120,26 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) if(ret < 0) { return (void*) -1; } - +// //#define WTF #ifdef WTF - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololol PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lolololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lolololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lollllool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); + 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); @@ -160,34 +154,12 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) /* print device info */ lsusb(dev); -#if 0 - /* select configuration */ - ret = usb_set_configuration(dev, dev->conf->bConfigurationValue); - printf("=============\nusb_set_configuration(ret: %d) %d\n", ret, dev->conf->bConfigurationValue); - printf("=============\nusb_get_configuration: %d\n", usb_get_configuration(dev)); -#endif - -#if 0 - u8 buf[8]; - memset(buf, 0, 8); - usb_control_msg(dev, 0x00, SET_INTERFACE, 0, dev->conf->intf->bInterfaceNumber, 0, buf, 0); - printf("=============\nusb_set_interface: %d\n", dev->conf->intf->bInterfaceNumber); - hexdump((void*)buf, 8); - - memset(buf, 0, 8); - usb_control_msg(dev, 0x81, GET_INTERFACE, 0, dev->conf->intf->bInterfaceNumber, 8, buf, 0); - printf("=============\nusb_get_interface: %d\n", buf[0]); - hexdump((void*)buf, 8); -#endif - -#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; } @@ -197,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); @@ -259,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)); @@ -279,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) @@ -453,14 +440,12 @@ u16 usb_submit_irp(struct usb_irp *irp) 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 */ @@ -485,10 +470,7 @@ 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, irp->dev->ohci); free(td); @@ -500,6 +482,41 @@ 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(irp->dev->ohci); @@ -522,6 +539,7 @@ struct usb_transfer_descriptor *usb_create_transfer_descriptor(struct usb_irp * td->state = USB_TRANSFER_DESCR_NONE; td->maxp = irp->epsize; td->fullspeed = irp->dev->fullspeed; + td->type = irp->type; return td; }