📄 usbdcore-multiple_configs.patch
字号:
This patch fixes bugs in usbdcore*.c related to the use of deviceswith multiple configurations.The original code made mistakes about the meaning of configuration value andconfiguration index, and the resulting off-by-one errors resulted in:* SET_CONFIGURATION always selected the first configuration, no matter what wValue is being passed.* GET_DESCRIPTOR/CONFIGURATION always returned the descriptor for the first configuration (index 0).Signed-off-by: Harald Welte <laforge@openmoko.org>Index: u-boot/drivers/usb/usbdcore_ep0.c===================================================================--- u-boot.orig/drivers/usb/usbdcore_ep0.c+++ u-boot/drivers/usb/usbdcore_ep0.c@@ -237,8 +237,8 @@ return -1; } /*dbg_ep0(2, "%d %d", index, device_descriptor->bNumConfigurations); */- if (index > device_descriptor->bNumConfigurations) {- dbg_ep0 (0, "index too large: %d > %d", index,+ if (index >= device_descriptor->bNumConfigurations) {+ dbg_ep0 (0, "index too large: %d >= %d", index, device_descriptor-> bNumConfigurations); return -1;@@ -612,14 +612,8 @@ case USB_REQ_SET_CONFIGURATION: /* c.f. 9.4.7 - the top half of wValue is reserved */- /* */- if ((device->configuration =- le16_to_cpu (request->wValue) & 0xFF80) != 0) {- /* c.f. 9.4.7 - zero is the default or addressed state, in our case this */- /* is the same is configuration zero */- serial_printf("error setting dev->config to zero!\n");- device->configuration = 0; /* TBR - ?????? */- }+ device->configuration = le16_to_cpu(request->wValue) & 0xff;+ /* reset interface and alternate settings */ device->interface = device->alternate = 0; Index: u-boot/drivers/usb/usbdcore.c===================================================================--- u-boot.orig/drivers/usb/usbdcore.c+++ u-boot/drivers/usb/usbdcore.c@@ -147,12 +147,9 @@ static struct usb_configuration_instance *usbd_device_configuration_instance (struct usb_device_instance *device, unsigned int port, unsigned int configuration) {- /* XXX */- configuration = configuration ? configuration - 1 : 0;-- if (configuration >= device->configurations) {+ if (configuration >= device->configurations) return NULL;- }+ return device->configuration_instance_array + configuration; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -