X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=usb%2Fcore%2Fcore.c;h=a6c84fb2a7dd13aa3409feb94592fa69071052a1;hb=34b9e07b8eafbaef3c81dd850cdaee8610efa1f1;hp=d50c22ba4b057082a29671ac6cbfd9e851a9b007;hpb=a553702c41879a83bb8931372d06e377fe88181d;p=ppcskel.git diff --git a/usb/core/core.c b/usb/core/core.c index d50c22b..a6c84fb 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; @@ -114,46 +123,23 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) //#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 PADING WTF :O lolololololo \n"); - printf("loolololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDNG WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDINGWTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :Ololololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O llololololo \n"); - printf("lololololool PADDING WTF :O loololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O loloooloo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololoolo \n"); - printf("lololololool PADDING WTF :O lololooolo \n"); - printf("lololololool PADDING WTF :O loloolololo \n"); - printf("lololol PADDING WTF :O lolololololo \n"); - printf("lololololool PADDING WTF :O lolololololo \n"); - printf("lolololool PADDING WTF :O lololoololo \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 loloolololo \n"); - printf("lololololool PADDING WTF lololololo \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); @@ -168,72 +154,12 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) /* print device info */ lsusb(dev); - //HID only! -#define GET_PROTOCOL 0x03 -#define SET_PROTOCOL 0x0b -#define GETit 0xa1 -#define SETit 0x21 - - - u8 buf[255]; -#if 1 - /* select configuration */ - wait_ms(500); - ret = usb_set_configuration(dev, 1); - printf("=============\nusb_set_configuration(ret: %d): %d\n", ret, dev->conf->bConfigurationValue); - wait_ms(500); - printf("=============\nusb_get_configuration: %d (should be 1 here)\n", usb_get_configuration(dev)); -#endif - -#if 0 - memset(buf, 0, 0xff); - usb_control_msg(dev, 0x81, GET_DESCRIPTOR, 0x2200, 0x0, 0x41, buf, 0); - printf("wtf request\n"); - hexdump((void*)buf, 0x41); -#endif - -#if 0 - /* set protocol */ - /* see p48 in HID spec */ - memset(buf, 0, 8); - usb_control_msg(dev, SETit, SET_PROTOCOL, 0, 0, 0, buf, 0); - printf("=============\nhid_set_protocol %d\n", 0); - hexdump((void*)buf, 8); -#endif -#if 0 - memset(buf, 0, 8); - usb_control_msg(dev, GETit, GET_PROTOCOL, 0, 0, 4, buf, 0); - printf("=============\nusb_get_interface: %d\n", buf[0]); - hexdump((void*)buf, 8); -#endif - -#if 0 - /* I just don't know why on some devices - * {s,g}et_{configuration,interface} won't work. - * may the setter works and getter are poorly implemented? - * however, I try here some interrupt inputs, assuming - * the setters are fine*/ - - memset(buf, 0, 8); - s8 epnum = dev->conf->intf->endp->bEndpointAddress & 0xf; - printf("epnum: 0x%04X\n", epnum); - u8 muh = 10; - while(muh--) { - (void) usb_interrupt_read(dev, epnum, buf, 8, 0); - printf("============\nusb_interrupt_read:\n"); - hexdump((void*)buf, 8); - udelay(2000000); - } -#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; } @@ -306,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)); @@ -326,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) @@ -500,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) { @@ -570,7 +461,7 @@ u16 usb_submit_irp(struct usb_irp *irp) td->togl = togl; togl = togl ? 0 : 1; - /**** send token ****/ + /**** send token ****/ hcdi_enqueue(td, irp->dev->ohci); restlength = restlength - irp->epsize; free(td); @@ -594,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;