From 956c71f52b91291ff6344dddb0c4585cdd13f437 Mon Sep 17 00:00:00 2001 From: dizzyofcrn Date: Thu, 5 Nov 2015 09:28:14 +0000 Subject: [PATCH] Added new calls to libusb libusb expects the endpoint to contain the direction of transfer - hack code in bulk transfer for massstorage (EP1=in, EP2=out) - bulk transfer won't work with anything else ToDo: Check what libusb wants for the buffer size, unsure about that git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@51200 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- rom/usb/vusbhc/vusbhci_bridge.c | 68 +++++++++++++++++++++++++++++++-------- rom/usb/vusbhc/vusbhci_bridge.h | 4 ++- rom/usb/vusbhc/vusbhci_commands.c | 8 ++--- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/rom/usb/vusbhc/vusbhci_bridge.c b/rom/usb/vusbhc/vusbhci_bridge.c index 1103538abf..374fce8adf 100644 --- a/rom/usb/vusbhc/vusbhci_bridge.c +++ b/rom/usb/vusbhc/vusbhci_bridge.c @@ -63,8 +63,8 @@ int hotplug_callback_event_handler(libusb_context *ctx, libusb_device *dev, libu rc = LIBUSBCALL(libusb_open, dev, &dev_handle); if(dev_handle) { LIBUSBCALL(libusb_set_auto_detach_kernel_driver, dev_handle, 1); + LIBUSBCALL(libusb_set_configuration, dev_handle, 1); LIBUSBCALL(libusb_claim_interface, dev_handle, 0); - LIBUSBCALL(libusb_claim_interface, dev_handle, 1); speed = LIBUSBCALL(libusb_get_device_speed, dev); switch(speed) { @@ -237,8 +237,9 @@ int do_libusb_ctrl_transfer(struct IOUsbHWReq *ioreq) { } ioreq->iouh_Actual = rc; - return UHIOERR_NO_ERROR; - + + mybug_unit(-1, ("Done!\n\n")); + return UHIOERR_NO_ERROR; } /* @@ -257,26 +258,61 @@ int do_libusb_intr_transfer(struct IOUsbHWReq *ioreq) { rc = LIBUSBCALL(libusb_interrupt_transfer, dev_handle, ioreq->iouh_Endpoint, ioreq->iouh_Data, wLength, &ioreq->iouh_Actual, 10); mybug_unit(-1, ("libusb_interrupt_transfer rc = %d\n\n", rc)); - + + mybug_unit(-1, ("Done!\n\n")); return UHIOERR_NO_ERROR; } -/* - FIXME: libusb expects buffer to precede with enough space for setup data (8 bytes or LIBUSB_CONTROL_SETUP_SIZE) - - Copy buffer need to be used -*/ int do_libusb_bulk_transfer(struct IOUsbHWReq *ioreq) { struct VUSBHCIUnit *unit = (struct VUSBHCIUnit *) ioreq->iouh_Req.io_Unit; - int rc, transferred = 0; + int rc, transferred = 0, i; + APTR buffer; + UBYTE endpoint = ioreq->iouh_Endpoint; UWORD wLength = AROS_WORD2LE(ioreq->iouh_SetupData.wLength); mybug_unit(-1, ("wLength %d\n", wLength)); mybug_unit(-1, ("ioreq->iouh_Length %d\n", ioreq->iouh_Length)); - rc = LIBUSBCALL(libusb_bulk_transfer, dev_handle, ioreq->iouh_Endpoint, ioreq->iouh_Data, ioreq->iouh_Length, &transferred, 10); - mybug_unit(-1, ("libusb_bulk_transfer rc = %d\n\n", rc)); +// if( (ioreq->iouh_SetupData.bmRequestType && URTF_IN) ) { + /* + This is a hack for massstorage with EP1 being IN and EP2 being OUT, will mess everuthing else + for some reason above code tries always OUT transfer, check why + */ + if(endpoint == 1) { + mybug_unit(-1, ("ioreq->iouh_Endpoint %d (IN)\n", endpoint)); + rc = LIBUSBCALL(libusb_bulk_transfer, dev_handle, (endpoint|LIBUSB_ENDPOINT_IN), (UBYTE *)ioreq->iouh_Data, ioreq->iouh_Length, &transferred, 0); + + buffer = ioreq->iouh_Data; + + mybug_unit(-1, ("Bulk data buffer in:\n")); + for(i = 0;i < ioreq->iouh_Length; i++) { + if(i%8 == 0) + bug("\n"); + + bug("%02x ", *(UBYTE *)buffer++ ); + } + bug("\n\n"); + } else { + /* LIBUSB_ENDPOINT_OUT = 0*/ + mybug_unit(-1, ("ioreq->iouh_Endpoint %d (OUT)\n", endpoint)); + + buffer = ioreq->iouh_Data; + + mybug_unit(-1, ("Bulk data buffer out:\n")); + for(i = 0;i < ioreq->iouh_Length; i++) { + if(i%8 == 0) + bug("\n"); + + bug("%02x ", *(UBYTE *)buffer++ ); + } + bug("\n\n"); + + rc = LIBUSBCALL(libusb_bulk_transfer, dev_handle, (endpoint|LIBUSB_ENDPOINT_OUT), (UBYTE *)ioreq->iouh_Data, ioreq->iouh_Length, &transferred, 0); + } + + mybug_unit(-1, ("libusb_bulk_transfer rc = %d, transferred %d\n", rc, transferred)); /* 0 on success (and populates transferred) @@ -288,15 +324,18 @@ int do_libusb_bulk_transfer(struct IOUsbHWReq *ioreq) { */ if(rc<0) { rc = 0; + } else { + if(transferred) { + ioreq->iouh_Actual = transferred; + } } - ioreq->iouh_Actual = transferred; + mybug_unit(-1, ("Done!\n\n")); return UHIOERR_NO_ERROR; - } int do_libusb_isoc_transfer(struct IOUsbHWReq *ioreq) { - //struct VUSBHCIUnit *unit = (struct VUSBHCIUnit *) ioreq->iouh_Req.io_Unit; + struct VUSBHCIUnit *unit = (struct VUSBHCIUnit *) ioreq->iouh_Req.io_Unit; //UWORD bmRequestType = (ioreq->iouh_SetupData.bmRequestType) & (URTF_STANDARD | URTF_CLASS | URTF_VENDOR); //UWORD bmRequestDirection = (ioreq->iouh_SetupData.bmRequestType) & (URTF_IN | URTF_OUT); @@ -307,5 +346,6 @@ int do_libusb_isoc_transfer(struct IOUsbHWReq *ioreq) { //UWORD wIndex = AROS_WORD2LE(ioreq->iouh_SetupData.wIndex); //UWORD wLength = AROS_WORD2LE(ioreq->iouh_SetupData.wLength); + mybug_unit(-1, ("Done!\n\n")); return 0; } diff --git a/rom/usb/vusbhc/vusbhci_bridge.h b/rom/usb/vusbhc/vusbhci_bridge.h index bf27cc7354..3a5eb99dc2 100644 --- a/rom/usb/vusbhc/vusbhci_bridge.h +++ b/rom/usb/vusbhc/vusbhci_bridge.h @@ -30,7 +30,8 @@ static const char *libusb_func_names[] = { "libusb_set_auto_detach_kernel_driver", "libusb_get_device_speed", "libusb_claim_interface", - "libusb_set_debug" + "libusb_set_debug", + "libusb_set_configuration" }; #define LIBUSB_NUM_FUNCS (sizeof(libusb_func_names) / sizeof(libusb_func_names[0])) @@ -75,6 +76,7 @@ struct libusb_func { int (*libusb_get_device_speed)(libusb_device *dev); int (*libusb_claim_interface)(libusb_device_handle *dev, int interface_number); void (*libusb_set_debug)(libusb_context *ctx, int level); + int (*libusb_set_configuration)(libusb_device_handle *dev, int configuration); }; //extern struct libusb_func libusb_func; diff --git a/rom/usb/vusbhc/vusbhci_commands.c b/rom/usb/vusbhc/vusbhci_commands.c index bdd1b66ef9..ac82053bb5 100644 --- a/rom/usb/vusbhc/vusbhci_commands.c +++ b/rom/usb/vusbhc/vusbhci_commands.c @@ -928,7 +928,7 @@ WORD cmdControlXFer(struct IOUsbHWReq *ioreq) { return(cmdControlXFerRootHub(ioreq)); } - mybug_unit(-1, ("Sending transfer request to libusb\n\n")); + mybug_unit(-1, ("Sending transfer request to libusb\n")); return(do_libusb_ctrl_transfer(ioreq)); } @@ -960,7 +960,7 @@ WORD cmdIntXFer(struct IOUsbHWReq *ioreq) { return(cmdIntXFerRootHub(ioreq)); } - mybug_unit(-1, ("Sending transfer request to libusb\n\n")); + mybug_unit(-1, ("Sending transfer request to libusb\n")); return(do_libusb_intr_transfer(ioreq)); return(RC_DONTREPLY); } @@ -989,7 +989,7 @@ WORD cmdBulkXFer(struct IOUsbHWReq *ioreq) { return UHIOERR_USBOFFLINE; } - mybug_unit(-1, ("Sending transfer request to libusb\n\n")); + mybug_unit(-1, ("Sending transfer request to libusb\n")); return(do_libusb_bulk_transfer(ioreq)); return(RC_DONTREPLY); } @@ -1018,7 +1018,7 @@ WORD cmdISOXFer(struct IOUsbHWReq *ioreq) { return UHIOERR_USBOFFLINE; } - mybug_unit(0, ("Sending transfer request to libusb\n\n")); + mybug_unit(-1, ("Sending transfer request to libusb\n")); do_libusb_isoc_transfer(ioreq); return RC_DONTREPLY; -- 2.11.4.GIT