Deleted Added
full compact
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}