libusb10_desc.c (195957) | libusb10_desc.c (199055) |
---|---|
1/* $FreeBSD: head/lib/libusb/libusb10_desc.c 195957 2009-07-30 00:11:41Z alfred $ */ | 1/* $FreeBSD: head/lib/libusb/libusb10_desc.c 199055 2009-11-08 20:03:52Z thompsa $ */ |
2/*- 3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. --- 20 unchanged lines hidden (view full) --- 30#include <sys/queue.h> 31 32#include "libusb20.h" 33#include "libusb20_desc.h" 34#include "libusb20_int.h" 35#include "libusb.h" 36#include "libusb10.h" 37 | 2/*- 3 * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. --- 20 unchanged lines hidden (view full) --- 30#include <sys/queue.h> 31 32#include "libusb20.h" 33#include "libusb20_desc.h" 34#include "libusb20_int.h" 35#include "libusb.h" 36#include "libusb10.h" 37 |
38#define N_ALIGN(n) (-((-(n)) & (-8UL))) 39 |
|
38/* USB descriptors */ 39 40int 41libusb_get_device_descriptor(libusb_device *dev, 42 struct libusb_device_descriptor *desc) 43{ 44 struct LIBUSB20_DEVICE_DESC_DECODED *pdesc; 45 struct libusb20_device *pdev; --- 63 unchanged lines hidden (view full) --- 109 pdev = dev->os_priv; 110 pconf = libusb20_dev_alloc_config(pdev, config_index); 111 112 if (pconf == NULL) 113 return (LIBUSB_ERROR_NOT_FOUND); 114 115 nalt = nif = pconf->num_interface; 116 nep = 0; | 40/* USB descriptors */ 41 42int 43libusb_get_device_descriptor(libusb_device *dev, 44 struct libusb_device_descriptor *desc) 45{ 46 struct LIBUSB20_DEVICE_DESC_DECODED *pdesc; 47 struct libusb20_device *pdev; --- 63 unchanged lines hidden (view full) --- 111 pdev = dev->os_priv; 112 pconf = libusb20_dev_alloc_config(pdev, config_index); 113 114 if (pconf == NULL) 115 return (LIBUSB_ERROR_NOT_FOUND); 116 117 nalt = nif = pconf->num_interface; 118 nep = 0; |
117 nextra = pconf->extra.len; | 119 nextra = N_ALIGN(pconf->extra.len); |
118 119 for (i = 0; i < nif; i++) { 120 121 pinf = pconf->interface + i; | 120 121 for (i = 0; i < nif; i++) { 122 123 pinf = pconf->interface + i; |
122 nextra += pinf->extra.len; | 124 nextra += N_ALIGN(pinf->extra.len); |
123 nep += pinf->num_endpoints; 124 k = pinf->num_endpoints; 125 pend = pinf->endpoints; 126 while (k--) { | 125 nep += pinf->num_endpoints; 126 k = pinf->num_endpoints; 127 pend = pinf->endpoints; 128 while (k--) { |
127 nextra += pend->extra.len; | 129 nextra += N_ALIGN(pend->extra.len); |
128 pend++; 129 } 130 131 j = pinf->num_altsetting; 132 nalt += pinf->num_altsetting; 133 pinf = pinf->altsetting; 134 while (j--) { | 130 pend++; 131 } 132 133 j = pinf->num_altsetting; 134 nalt += pinf->num_altsetting; 135 pinf = pinf->altsetting; 136 while (j--) { |
135 nextra += pinf->extra.len; | 137 nextra += N_ALIGN(pinf->extra.len); |
136 nep += pinf->num_endpoints; 137 k = pinf->num_endpoints; 138 pend = pinf->endpoints; 139 while (k--) { | 138 nep += pinf->num_endpoints; 139 k = pinf->num_endpoints; 140 pend = pinf->endpoints; 141 while (k--) { |
140 nextra += pend->extra.len; | 142 nextra += N_ALIGN(pend->extra.len); |
141 pend++; 142 } 143 pinf++; 144 } 145 } 146 147 nextra = nextra + 148 (1 * sizeof(libusb_config_descriptor)) + 149 (nif * sizeof(libusb_interface)) + 150 (nalt * sizeof(libusb_interface_descriptor)) + 151 (nep * sizeof(libusb_endpoint_descriptor)); 152 | 143 pend++; 144 } 145 pinf++; 146 } 147 } 148 149 nextra = nextra + 150 (1 * sizeof(libusb_config_descriptor)) + 151 (nif * sizeof(libusb_interface)) + 152 (nalt * sizeof(libusb_interface_descriptor)) + 153 (nep * sizeof(libusb_endpoint_descriptor)); 154 |
155 nextra = N_ALIGN(nextra); 156 |
|
153 pconfd = malloc(nextra); 154 155 if (pconfd == NULL) { 156 free(pconf); 157 return (LIBUSB_ERROR_NO_MEM); 158 } | 157 pconfd = malloc(nextra); 158 159 if (pconfd == NULL) { 160 free(pconf); 161 return (LIBUSB_ERROR_NO_MEM); 162 } |
159 /* make sure memory is clean */ | 163 /* make sure memory is initialised */ |
160 memset(pconfd, 0, nextra); 161 | 164 memset(pconfd, 0, nextra); 165 |
162 pconfd->interface = (libusb_interface *) (pconfd + 163 sizeof(libusb_config_descriptor)); | 166 pconfd->interface = (libusb_interface *) (pconfd + 1); |
164 165 ifd = (libusb_interface_descriptor *) (pconfd->interface + nif); 166 endd = (libusb_endpoint_descriptor *) (ifd + nalt); 167 pextra = (uint8_t *)(endd + nep); 168 169 /* fill in config descriptor */ 170 171 pconfd->bLength = pconf->desc.bLength; --- 4 unchanged lines hidden (view full) --- 176 pconfd->iConfiguration = pconf->desc.iConfiguration; 177 pconfd->bmAttributes = pconf->desc.bmAttributes; 178 pconfd->MaxPower = pconf->desc.bMaxPower; 179 180 if (pconf->extra.len != 0) { 181 pconfd->extra_length = pconf->extra.len; 182 pconfd->extra = pextra; 183 memcpy(pextra, pconf->extra.ptr, pconfd->extra_length); | 167 168 ifd = (libusb_interface_descriptor *) (pconfd->interface + nif); 169 endd = (libusb_endpoint_descriptor *) (ifd + nalt); 170 pextra = (uint8_t *)(endd + nep); 171 172 /* fill in config descriptor */ 173 174 pconfd->bLength = pconf->desc.bLength; --- 4 unchanged lines hidden (view full) --- 179 pconfd->iConfiguration = pconf->desc.iConfiguration; 180 pconfd->bmAttributes = pconf->desc.bmAttributes; 181 pconfd->MaxPower = pconf->desc.bMaxPower; 182 183 if (pconf->extra.len != 0) { 184 pconfd->extra_length = pconf->extra.len; 185 pconfd->extra = pextra; 186 memcpy(pextra, pconf->extra.ptr, pconfd->extra_length); |
184 pextra += pconfd->extra_length; | 187 pextra += N_ALIGN(pconfd->extra_length); |
185 } 186 /* setup all interface and endpoint pointers */ 187 188 for (i = 0; i < nif; i++) { 189 190 pconfd->interface[i].altsetting = ifd; 191 ifd->endpoint = endd; 192 endd += pconf->interface[i].num_endpoints; --- 23 unchanged lines hidden (view full) --- 216 ifd->bInterfaceClass = pinf->desc.bInterfaceClass; 217 ifd->bInterfaceSubClass = pinf->desc.bInterfaceSubClass; 218 ifd->bInterfaceProtocol = pinf->desc.bInterfaceProtocol; 219 ifd->iInterface = pinf->desc.iInterface; 220 if (pinf->extra.len != 0) { 221 ifd->extra_length = pinf->extra.len; 222 ifd->extra = pextra; 223 memcpy(pextra, pinf->extra.ptr, pinf->extra.len); | 188 } 189 /* setup all interface and endpoint pointers */ 190 191 for (i = 0; i < nif; i++) { 192 193 pconfd->interface[i].altsetting = ifd; 194 ifd->endpoint = endd; 195 endd += pconf->interface[i].num_endpoints; --- 23 unchanged lines hidden (view full) --- 219 ifd->bInterfaceClass = pinf->desc.bInterfaceClass; 220 ifd->bInterfaceSubClass = pinf->desc.bInterfaceSubClass; 221 ifd->bInterfaceProtocol = pinf->desc.bInterfaceProtocol; 222 ifd->iInterface = pinf->desc.iInterface; 223 if (pinf->extra.len != 0) { 224 ifd->extra_length = pinf->extra.len; 225 ifd->extra = pextra; 226 memcpy(pextra, pinf->extra.ptr, pinf->extra.len); |
224 pextra += pinf->extra.len; | 227 pextra += N_ALIGN(pinf->extra.len); |
225 } 226 for (k = 0; k < pinf->num_endpoints; k++) { 227 pend = &pinf->endpoints[k]; 228 endd = &ifd->endpoint[k]; 229 endd->bLength = pend->desc.bLength; 230 endd->bDescriptorType = pend->desc.bDescriptorType; 231 endd->bEndpointAddress = pend->desc.bEndpointAddress; 232 endd->bmAttributes = pend->desc.bmAttributes; 233 endd->wMaxPacketSize = pend->desc.wMaxPacketSize; 234 endd->bInterval = pend->desc.bInterval; 235 endd->bRefresh = pend->desc.bRefresh; 236 endd->bSynchAddress = pend->desc.bSynchAddress; 237 if (pend->extra.len != 0) { 238 endd->extra_length = pend->extra.len; 239 endd->extra = pextra; 240 memcpy(pextra, pend->extra.ptr, pend->extra.len); | 228 } 229 for (k = 0; k < pinf->num_endpoints; k++) { 230 pend = &pinf->endpoints[k]; 231 endd = &ifd->endpoint[k]; 232 endd->bLength = pend->desc.bLength; 233 endd->bDescriptorType = pend->desc.bDescriptorType; 234 endd->bEndpointAddress = pend->desc.bEndpointAddress; 235 endd->bmAttributes = pend->desc.bmAttributes; 236 endd->wMaxPacketSize = pend->desc.wMaxPacketSize; 237 endd->bInterval = pend->desc.bInterval; 238 endd->bRefresh = pend->desc.bRefresh; 239 endd->bSynchAddress = pend->desc.bSynchAddress; 240 if (pend->extra.len != 0) { 241 endd->extra_length = pend->extra.len; 242 endd->extra = pextra; 243 memcpy(pextra, pend->extra.ptr, pend->extra.len); |
241 pextra += pend->extra.len; | 244 pextra += N_ALIGN(pend->extra.len); |
242 } 243 } 244 } 245 } 246 247 free(pconf); 248 249 *config = pconfd; --- 49 unchanged lines hidden (view full) --- 299 data[0] = 0; 300 301 if (libusb20_dev_req_string_simple_sync(pdev, desc_index, 302 data, length) == 0) 303 return (strlen(data)); 304 305 return (LIBUSB_ERROR_OTHER); 306} | 245 } 246 } 247 } 248 } 249 250 free(pconf); 251 252 *config = pconfd; --- 49 unchanged lines hidden (view full) --- 302 data[0] = 0; 303 304 if (libusb20_dev_req_string_simple_sync(pdev, desc_index, 305 data, length) == 0) 306 return (strlen(data)); 307 308 return (LIBUSB_ERROR_OTHER); 309} |
310 311int 312libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, 313 uint8_t desc_index, uint8_t *data, int length) 314{ 315 return (libusb_control_transfer(devh, LIBUSB_ENDPOINT_IN, 316 LIBUSB_REQUEST_GET_DESCRIPTOR, (desc_type << 8) | desc_index, 0, data, 317 length, 1000)); 318} |
|