hrev43315 adds 1 changeset to branch 'master' old head: 6b418363041f3c03b8be57f5f9ca7308efa094b5 new head: dea8f9c7666e897a50d904ab02ea3f37107f734b ---------------------------------------------------------------------------- 2 files changed, 26 insertions(+), 15 deletions(-) .../kernel/drivers/printer/usb/usb_printer.cpp | 38 ++++++++++------ .../kernel/drivers/printer/usb/usb_printer.h | 3 +- ############################################################################ Revision: hrev43315 Commit: dea8f9c7666e897a50d904ab02ea3f37107f734b URL: http://cgit.haiku-os.org/haiku/commit/?id=dea8f9c Author: Jérôme Duval <jerome.duval@xxxxxxxxx> Date: Thu Nov 24 16:56:08 2011 UTC usb_printer: support for alternate interfaces, not just the default one. * Tested with a Profilic USB-Parallel adapter and a Laserjet printer. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp b/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp index c16d463..5514dd2 100644 --- a/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp +++ b/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp @@ -159,25 +159,27 @@ usb_printer_device_added(usb_device newDevice, void **cookie) } for (size_t i = 0; i < configuration->interface_count; i++) { - usb_interface_info *interface = configuration->interface[i].active; - if (interface == NULL) - continue; - - if (interface->descr->interface_class == PRINTER_INTERFACE_CLASS - && interface->descr->interface_subclass == - PRINTER_INTERFACE_SUBCLASS - && (interface->descr->interface_protocol == PIT_UNIDIRECTIONAL - || interface->descr->interface_protocol == PIT_BIDIRECTIONAL - || interface->descr->interface_protocol - == PIT_1284_4_COMPATIBLE)) { + for (size_t j = 0; j < configuration->interface[i].alt_count; j++) { + usb_interface_info *interface = &configuration->interface[i].alt[j]; + if (interface == NULL + || interface->descr->interface_class != PRINTER_INTERFACE_CLASS + || interface->descr->interface_subclass != + PRINTER_INTERFACE_SUBCLASS + || !(interface->descr->interface_protocol == PIT_UNIDIRECTIONAL + || interface->descr->interface_protocol == PIT_BIDIRECTIONAL + || interface->descr->interface_protocol + == PIT_1284_4_COMPATIBLE)) { + continue; + } bool hasIn = false; bool hasOut = false; - for (size_t j = 0; j < interface->endpoint_count; j++) { - usb_endpoint_info *endpoint = &interface->endpoint[j]; + for (size_t k = 0; k < interface->endpoint_count; k++) { + usb_endpoint_info *endpoint = &interface->endpoint[k]; if (endpoint == NULL - || endpoint->descr->attributes != USB_ENDPOINT_ATTR_BULK) + || endpoint->descr->attributes != USB_ENDPOINT_ATTR_BULK) { continue; + } if (!hasIn && (endpoint->descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN)) { @@ -197,6 +199,7 @@ usb_printer_device_added(usb_device newDevice, void **cookie) continue; device->interface = interface->descr->interface_number; + device->alternate = j; device->alternate_setting = interface->descr->alternate_setting; break; @@ -209,6 +212,13 @@ usb_printer_device_added(usb_device newDevice, void **cookie) return B_ERROR; } + status_t status = gUSBModule->set_alt_interface(newDevice, + &configuration->interface[device->interface].alt[device->alternate]); + if (status < B_OK) { + free(device); + return B_ERROR; + } + mutex_init(&device->lock, "usb_printer device lock"); device->notify = create_sem(0, "usb_printer callback notify"); diff --git a/src/add-ons/kernel/drivers/printer/usb/usb_printer.h b/src/add-ons/kernel/drivers/printer/usb/usb_printer.h index 4ae6986..e507aac 100644 --- a/src/add-ons/kernel/drivers/printer/usb/usb_printer.h +++ b/src/add-ons/kernel/drivers/printer/usb/usb_printer.h @@ -6,10 +6,10 @@ * Michael Lotz <mmlr@xxxxxxxx> * Michael Pfeiffer <laplace@xxxxxxxxxxxxxxxxxxxxx> */ - #ifndef _USB_PRINTER_H_ #define _USB_PRINTER_H_ + #include <lock.h> #include <USB3.h> @@ -45,6 +45,7 @@ typedef struct printer_device_s { usb_pipe bulk_in; usb_pipe bulk_out; uint8 interface; + uint8 alternate; uint8 alternate_setting; // used to store callback information