Commit e813eae3bfeba9c0bda9d1bf9fc3d081f790972f
Committed by
Wolfgang Denk
1 parent
d8c82db482
Exists in
master
and in
54 other branches
Fix compilation error in cmd_usb.c
This patch fixes compilation error cmd_usb.c: In function 'do_usb': cmd_usb.c:552: error: void value not ignored as it ought to be Signed-off-by: Anatolij Gustschin <agust@denx.de>
Showing 1 changed file with 1 additions and 1 deletions Inline Diff
include/usb.h
1 | /* | 1 | /* |
2 | * (C) Copyright 2001 | 2 | * (C) Copyright 2001 |
3 | * Denis Peter, MPL AG Switzerland | 3 | * Denis Peter, MPL AG Switzerland |
4 | * | 4 | * |
5 | * See file CREDITS for list of people who contributed to this | 5 | * See file CREDITS for list of people who contributed to this |
6 | * project. | 6 | * project. |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or | 8 | * This program is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU General Public License as | 9 | * modify it under the terms of the GNU General Public License as |
10 | * published by the Free Software Foundation; either version 2 of | 10 | * published by the Free Software Foundation; either version 2 of |
11 | * the License, or (at your option) any later version. | 11 | * the License, or (at your option) any later version. |
12 | * | 12 | * |
13 | * This program is distributed in the hope that it will be useful, | 13 | * This program is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. | 16 | * GNU General Public License for more details. |
17 | * | 17 | * |
18 | * You should have received a copy of the GNU General Public License | 18 | * You should have received a copy of the GNU General Public License |
19 | * along with this program; if not, write to the Free Software | 19 | * along with this program; if not, write to the Free Software |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
21 | * MA 02111-1307 USA | 21 | * MA 02111-1307 USA |
22 | * | 22 | * |
23 | * Note: Part of this code has been derived from linux | 23 | * Note: Part of this code has been derived from linux |
24 | * | 24 | * |
25 | */ | 25 | */ |
26 | #ifndef _USB_H_ | 26 | #ifndef _USB_H_ |
27 | #define _USB_H_ | 27 | #define _USB_H_ |
28 | 28 | ||
29 | #include <usb_defs.h> | 29 | #include <usb_defs.h> |
30 | 30 | ||
31 | /* Everything is aribtrary */ | 31 | /* Everything is aribtrary */ |
32 | #define USB_ALTSETTINGALLOC 4 | 32 | #define USB_ALTSETTINGALLOC 4 |
33 | #define USB_MAXALTSETTING 128 /* Hard limit */ | 33 | #define USB_MAXALTSETTING 128 /* Hard limit */ |
34 | 34 | ||
35 | #define USB_MAX_DEVICE 32 | 35 | #define USB_MAX_DEVICE 32 |
36 | #define USB_MAXCONFIG 8 | 36 | #define USB_MAXCONFIG 8 |
37 | #define USB_MAXINTERFACES 8 | 37 | #define USB_MAXINTERFACES 8 |
38 | #define USB_MAXENDPOINTS 16 | 38 | #define USB_MAXENDPOINTS 16 |
39 | #define USB_MAXCHILDREN 8 /* This is arbitrary */ | 39 | #define USB_MAXCHILDREN 8 /* This is arbitrary */ |
40 | #define USB_MAX_HUB 16 | 40 | #define USB_MAX_HUB 16 |
41 | 41 | ||
42 | #define USB_CNTL_TIMEOUT 100 /* 100ms timeout */ | 42 | #define USB_CNTL_TIMEOUT 100 /* 100ms timeout */ |
43 | 43 | ||
44 | /* String descriptor */ | 44 | /* String descriptor */ |
45 | struct usb_string_descriptor { | 45 | struct usb_string_descriptor { |
46 | unsigned char bLength; | 46 | unsigned char bLength; |
47 | unsigned char bDescriptorType; | 47 | unsigned char bDescriptorType; |
48 | unsigned short wData[1]; | 48 | unsigned short wData[1]; |
49 | } __attribute__ ((packed)); | 49 | } __attribute__ ((packed)); |
50 | 50 | ||
51 | /* device request (setup) */ | 51 | /* device request (setup) */ |
52 | struct devrequest { | 52 | struct devrequest { |
53 | unsigned char requesttype; | 53 | unsigned char requesttype; |
54 | unsigned char request; | 54 | unsigned char request; |
55 | unsigned short value; | 55 | unsigned short value; |
56 | unsigned short index; | 56 | unsigned short index; |
57 | unsigned short length; | 57 | unsigned short length; |
58 | } __attribute__ ((packed)); | 58 | } __attribute__ ((packed)); |
59 | 59 | ||
60 | 60 | ||
61 | /* All standard descriptors have these 2 fields in common */ | 61 | /* All standard descriptors have these 2 fields in common */ |
62 | struct usb_descriptor_header { | 62 | struct usb_descriptor_header { |
63 | unsigned char bLength; | 63 | unsigned char bLength; |
64 | unsigned char bDescriptorType; | 64 | unsigned char bDescriptorType; |
65 | } __attribute__ ((packed)); | 65 | } __attribute__ ((packed)); |
66 | 66 | ||
67 | /* Device descriptor */ | 67 | /* Device descriptor */ |
68 | struct usb_device_descriptor { | 68 | struct usb_device_descriptor { |
69 | unsigned char bLength; | 69 | unsigned char bLength; |
70 | unsigned char bDescriptorType; | 70 | unsigned char bDescriptorType; |
71 | unsigned short bcdUSB; | 71 | unsigned short bcdUSB; |
72 | unsigned char bDeviceClass; | 72 | unsigned char bDeviceClass; |
73 | unsigned char bDeviceSubClass; | 73 | unsigned char bDeviceSubClass; |
74 | unsigned char bDeviceProtocol; | 74 | unsigned char bDeviceProtocol; |
75 | unsigned char bMaxPacketSize0; | 75 | unsigned char bMaxPacketSize0; |
76 | unsigned short idVendor; | 76 | unsigned short idVendor; |
77 | unsigned short idProduct; | 77 | unsigned short idProduct; |
78 | unsigned short bcdDevice; | 78 | unsigned short bcdDevice; |
79 | unsigned char iManufacturer; | 79 | unsigned char iManufacturer; |
80 | unsigned char iProduct; | 80 | unsigned char iProduct; |
81 | unsigned char iSerialNumber; | 81 | unsigned char iSerialNumber; |
82 | unsigned char bNumConfigurations; | 82 | unsigned char bNumConfigurations; |
83 | } __attribute__ ((packed)); | 83 | } __attribute__ ((packed)); |
84 | 84 | ||
85 | 85 | ||
86 | /* Endpoint descriptor */ | 86 | /* Endpoint descriptor */ |
87 | struct usb_endpoint_descriptor { | 87 | struct usb_endpoint_descriptor { |
88 | unsigned char bLength; | 88 | unsigned char bLength; |
89 | unsigned char bDescriptorType; | 89 | unsigned char bDescriptorType; |
90 | unsigned char bEndpointAddress; | 90 | unsigned char bEndpointAddress; |
91 | unsigned char bmAttributes; | 91 | unsigned char bmAttributes; |
92 | unsigned short wMaxPacketSize; | 92 | unsigned short wMaxPacketSize; |
93 | unsigned char bInterval; | 93 | unsigned char bInterval; |
94 | unsigned char bRefresh; | 94 | unsigned char bRefresh; |
95 | unsigned char bSynchAddress; | 95 | unsigned char bSynchAddress; |
96 | 96 | ||
97 | } __attribute__ ((packed)); | 97 | } __attribute__ ((packed)); |
98 | /* Interface descriptor */ | 98 | /* Interface descriptor */ |
99 | struct usb_interface_descriptor { | 99 | struct usb_interface_descriptor { |
100 | unsigned char bLength; | 100 | unsigned char bLength; |
101 | unsigned char bDescriptorType; | 101 | unsigned char bDescriptorType; |
102 | unsigned char bInterfaceNumber; | 102 | unsigned char bInterfaceNumber; |
103 | unsigned char bAlternateSetting; | 103 | unsigned char bAlternateSetting; |
104 | unsigned char bNumEndpoints; | 104 | unsigned char bNumEndpoints; |
105 | unsigned char bInterfaceClass; | 105 | unsigned char bInterfaceClass; |
106 | unsigned char bInterfaceSubClass; | 106 | unsigned char bInterfaceSubClass; |
107 | unsigned char bInterfaceProtocol; | 107 | unsigned char bInterfaceProtocol; |
108 | unsigned char iInterface; | 108 | unsigned char iInterface; |
109 | 109 | ||
110 | unsigned char no_of_ep; | 110 | unsigned char no_of_ep; |
111 | unsigned char num_altsetting; | 111 | unsigned char num_altsetting; |
112 | unsigned char act_altsetting; | 112 | unsigned char act_altsetting; |
113 | struct usb_endpoint_descriptor ep_desc[USB_MAXENDPOINTS]; | 113 | struct usb_endpoint_descriptor ep_desc[USB_MAXENDPOINTS]; |
114 | } __attribute__ ((packed)); | 114 | } __attribute__ ((packed)); |
115 | 115 | ||
116 | 116 | ||
117 | /* Configuration descriptor information.. */ | 117 | /* Configuration descriptor information.. */ |
118 | struct usb_config_descriptor { | 118 | struct usb_config_descriptor { |
119 | unsigned char bLength; | 119 | unsigned char bLength; |
120 | unsigned char bDescriptorType; | 120 | unsigned char bDescriptorType; |
121 | unsigned short wTotalLength; | 121 | unsigned short wTotalLength; |
122 | unsigned char bNumInterfaces; | 122 | unsigned char bNumInterfaces; |
123 | unsigned char bConfigurationValue; | 123 | unsigned char bConfigurationValue; |
124 | unsigned char iConfiguration; | 124 | unsigned char iConfiguration; |
125 | unsigned char bmAttributes; | 125 | unsigned char bmAttributes; |
126 | unsigned char MaxPower; | 126 | unsigned char MaxPower; |
127 | 127 | ||
128 | unsigned char no_of_if; /* number of interfaces */ | 128 | unsigned char no_of_if; /* number of interfaces */ |
129 | struct usb_interface_descriptor if_desc[USB_MAXINTERFACES]; | 129 | struct usb_interface_descriptor if_desc[USB_MAXINTERFACES]; |
130 | } __attribute__ ((packed)); | 130 | } __attribute__ ((packed)); |
131 | 131 | ||
132 | 132 | ||
133 | struct usb_device { | 133 | struct usb_device { |
134 | int devnum; /* Device number on USB bus */ | 134 | int devnum; /* Device number on USB bus */ |
135 | int slow; /* Slow device? */ | 135 | int slow; /* Slow device? */ |
136 | char mf[32]; /* manufacturer */ | 136 | char mf[32]; /* manufacturer */ |
137 | char prod[32]; /* product */ | 137 | char prod[32]; /* product */ |
138 | char serial[32]; /* serial number */ | 138 | char serial[32]; /* serial number */ |
139 | 139 | ||
140 | int maxpacketsize; /* Maximum packet size; encoded as 0,1,2,3 = 8,16,32,64 */ | 140 | int maxpacketsize; /* Maximum packet size; encoded as 0,1,2,3 = 8,16,32,64 */ |
141 | unsigned int toggle[2]; /* one bit for each endpoint ([0] = IN, [1] = OUT) */ | 141 | unsigned int toggle[2]; /* one bit for each endpoint ([0] = IN, [1] = OUT) */ |
142 | unsigned int halted[2]; /* endpoint halts; one bit per endpoint # & direction; */ | 142 | unsigned int halted[2]; /* endpoint halts; one bit per endpoint # & direction; */ |
143 | /* [0] = IN, [1] = OUT */ | 143 | /* [0] = IN, [1] = OUT */ |
144 | int epmaxpacketin[16]; /* INput endpoint specific maximums */ | 144 | int epmaxpacketin[16]; /* INput endpoint specific maximums */ |
145 | int epmaxpacketout[16]; /* OUTput endpoint specific maximums */ | 145 | int epmaxpacketout[16]; /* OUTput endpoint specific maximums */ |
146 | 146 | ||
147 | int configno; /* selected config number */ | 147 | int configno; /* selected config number */ |
148 | struct usb_device_descriptor descriptor; /* Device Descriptor */ | 148 | struct usb_device_descriptor descriptor; /* Device Descriptor */ |
149 | struct usb_config_descriptor config; /* config descriptor */ | 149 | struct usb_config_descriptor config; /* config descriptor */ |
150 | 150 | ||
151 | int have_langid; /* whether string_langid is valid yet */ | 151 | int have_langid; /* whether string_langid is valid yet */ |
152 | int string_langid; /* language ID for strings */ | 152 | int string_langid; /* language ID for strings */ |
153 | int (*irq_handle)(struct usb_device *dev); | 153 | int (*irq_handle)(struct usb_device *dev); |
154 | unsigned long irq_status; | 154 | unsigned long irq_status; |
155 | int irq_act_len; /* transfered bytes */ | 155 | int irq_act_len; /* transfered bytes */ |
156 | void *privptr; | 156 | void *privptr; |
157 | /* | 157 | /* |
158 | * Child devices - if this is a hub device | 158 | * Child devices - if this is a hub device |
159 | * Each instance needs its own set of data structures. | 159 | * Each instance needs its own set of data structures. |
160 | */ | 160 | */ |
161 | unsigned long status; | 161 | unsigned long status; |
162 | int act_len; /* transfered bytes */ | 162 | int act_len; /* transfered bytes */ |
163 | int maxchild; /* Number of ports if hub */ | 163 | int maxchild; /* Number of ports if hub */ |
164 | struct usb_device *parent; | 164 | struct usb_device *parent; |
165 | struct usb_device *children[USB_MAXCHILDREN]; | 165 | struct usb_device *children[USB_MAXCHILDREN]; |
166 | }; | 166 | }; |
167 | 167 | ||
168 | /********************************************************************** | 168 | /********************************************************************** |
169 | * this is how the lowlevel part communicate with the outer world | 169 | * this is how the lowlevel part communicate with the outer world |
170 | */ | 170 | */ |
171 | 171 | ||
172 | #if defined(CONFIG_USB_UHCI) || defined(CONFIG_USB_OHCI) || \ | 172 | #if defined(CONFIG_USB_UHCI) || defined(CONFIG_USB_OHCI) || \ |
173 | defined(CONFIG_USB_OHCI_NEW) || defined (CONFIG_USB_SL811HS) || \ | 173 | defined(CONFIG_USB_OHCI_NEW) || defined (CONFIG_USB_SL811HS) || \ |
174 | defined(CONFIG_USB_ISP116X_HCD) | 174 | defined(CONFIG_USB_ISP116X_HCD) |
175 | 175 | ||
176 | int usb_lowlevel_init(void); | 176 | int usb_lowlevel_init(void); |
177 | int usb_lowlevel_stop(void); | 177 | int usb_lowlevel_stop(void); |
178 | int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,int transfer_len); | 178 | int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,int transfer_len); |
179 | int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer, | 179 | int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer, |
180 | int transfer_len,struct devrequest *setup); | 180 | int transfer_len,struct devrequest *setup); |
181 | int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, | 181 | int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer, |
182 | int transfer_len, int interval); | 182 | int transfer_len, int interval); |
183 | void usb_event_poll(void); | 183 | void usb_event_poll(void); |
184 | 184 | ||
185 | /* Defines */ | 185 | /* Defines */ |
186 | #define USB_UHCI_VEND_ID 0x8086 | 186 | #define USB_UHCI_VEND_ID 0x8086 |
187 | #define USB_UHCI_DEV_ID 0x7112 | 187 | #define USB_UHCI_DEV_ID 0x7112 |
188 | 188 | ||
189 | #else | 189 | #else |
190 | #error USB Lowlevel not defined | 190 | #error USB Lowlevel not defined |
191 | #endif | 191 | #endif |
192 | 192 | ||
193 | #ifdef CONFIG_USB_STORAGE | 193 | #ifdef CONFIG_USB_STORAGE |
194 | 194 | ||
195 | #define USB_MAX_STOR_DEV 5 | 195 | #define USB_MAX_STOR_DEV 5 |
196 | block_dev_desc_t *usb_stor_get_dev(int index); | 196 | block_dev_desc_t *usb_stor_get_dev(int index); |
197 | int usb_stor_scan(int mode); | 197 | int usb_stor_scan(int mode); |
198 | void usb_stor_info(void); | 198 | int usb_stor_info(void); |
199 | 199 | ||
200 | #endif | 200 | #endif |
201 | 201 | ||
202 | #ifdef CONFIG_USB_KEYBOARD | 202 | #ifdef CONFIG_USB_KEYBOARD |
203 | 203 | ||
204 | int drv_usb_kbd_init(void); | 204 | int drv_usb_kbd_init(void); |
205 | int usb_kbd_deregister(void); | 205 | int usb_kbd_deregister(void); |
206 | 206 | ||
207 | #endif | 207 | #endif |
208 | /* routines */ | 208 | /* routines */ |
209 | int usb_init(void); /* initialize the USB Controller */ | 209 | int usb_init(void); /* initialize the USB Controller */ |
210 | int usb_stop(void); /* stop the USB Controller */ | 210 | int usb_stop(void); /* stop the USB Controller */ |
211 | 211 | ||
212 | 212 | ||
213 | int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol); | 213 | int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol); |
214 | int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id); | 214 | int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id); |
215 | struct usb_device * usb_get_dev_index(int index); | 215 | struct usb_device * usb_get_dev_index(int index); |
216 | int usb_control_msg(struct usb_device *dev, unsigned int pipe, | 216 | int usb_control_msg(struct usb_device *dev, unsigned int pipe, |
217 | unsigned char request, unsigned char requesttype, | 217 | unsigned char request, unsigned char requesttype, |
218 | unsigned short value, unsigned short index, | 218 | unsigned short value, unsigned short index, |
219 | void *data, unsigned short size, int timeout); | 219 | void *data, unsigned short size, int timeout); |
220 | int usb_bulk_msg(struct usb_device *dev, unsigned int pipe, | 220 | int usb_bulk_msg(struct usb_device *dev, unsigned int pipe, |
221 | void *data, int len, int *actual_length, int timeout); | 221 | void *data, int len, int *actual_length, int timeout); |
222 | int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe, | 222 | int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe, |
223 | void *buffer,int transfer_len, int interval); | 223 | void *buffer,int transfer_len, int interval); |
224 | void usb_disable_asynch(int disable); | 224 | void usb_disable_asynch(int disable); |
225 | int usb_maxpacket(struct usb_device *dev,unsigned long pipe); | 225 | int usb_maxpacket(struct usb_device *dev,unsigned long pipe); |
226 | void __inline__ wait_ms(unsigned long ms); | 226 | void __inline__ wait_ms(unsigned long ms); |
227 | int usb_get_configuration_no(struct usb_device *dev,unsigned char *buffer,int cfgno); | 227 | int usb_get_configuration_no(struct usb_device *dev,unsigned char *buffer,int cfgno); |
228 | int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size); | 228 | int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size); |
229 | int usb_get_class_descriptor(struct usb_device *dev, int ifnum, | 229 | int usb_get_class_descriptor(struct usb_device *dev, int ifnum, |
230 | unsigned char type, unsigned char id, void *buf, int size); | 230 | unsigned char type, unsigned char id, void *buf, int size); |
231 | int usb_clear_halt(struct usb_device *dev, int pipe); | 231 | int usb_clear_halt(struct usb_device *dev, int pipe); |
232 | int usb_string(struct usb_device *dev, int index, char *buf, size_t size); | 232 | int usb_string(struct usb_device *dev, int index, char *buf, size_t size); |
233 | int usb_set_interface(struct usb_device *dev, int interface, int alternate); | 233 | int usb_set_interface(struct usb_device *dev, int interface, int alternate); |
234 | 234 | ||
235 | /* big endian -> little endian conversion */ | 235 | /* big endian -> little endian conversion */ |
236 | /* some CPUs are already little endian e.g. the ARM920T */ | 236 | /* some CPUs are already little endian e.g. the ARM920T */ |
237 | #define __swap_16(x) \ | 237 | #define __swap_16(x) \ |
238 | ({ unsigned short x_ = (unsigned short)x; \ | 238 | ({ unsigned short x_ = (unsigned short)x; \ |
239 | (unsigned short)( \ | 239 | (unsigned short)( \ |
240 | ((x_ & 0x00FFU) << 8) | ((x_ & 0xFF00U) >> 8) ); \ | 240 | ((x_ & 0x00FFU) << 8) | ((x_ & 0xFF00U) >> 8) ); \ |
241 | }) | 241 | }) |
242 | #define __swap_32(x) \ | 242 | #define __swap_32(x) \ |
243 | ({ unsigned long x_ = (unsigned long)x; \ | 243 | ({ unsigned long x_ = (unsigned long)x; \ |
244 | (unsigned long)( \ | 244 | (unsigned long)( \ |
245 | ((x_ & 0x000000FFUL) << 24) | \ | 245 | ((x_ & 0x000000FFUL) << 24) | \ |
246 | ((x_ & 0x0000FF00UL) << 8) | \ | 246 | ((x_ & 0x0000FF00UL) << 8) | \ |
247 | ((x_ & 0x00FF0000UL) >> 8) | \ | 247 | ((x_ & 0x00FF0000UL) >> 8) | \ |
248 | ((x_ & 0xFF000000UL) >> 24) ); \ | 248 | ((x_ & 0xFF000000UL) >> 24) ); \ |
249 | }) | 249 | }) |
250 | 250 | ||
251 | #ifdef LITTLEENDIAN | 251 | #ifdef LITTLEENDIAN |
252 | # define swap_16(x) (x) | 252 | # define swap_16(x) (x) |
253 | # define swap_32(x) (x) | 253 | # define swap_32(x) (x) |
254 | #else | 254 | #else |
255 | # define swap_16(x) __swap_16(x) | 255 | # define swap_16(x) __swap_16(x) |
256 | # define swap_32(x) __swap_32(x) | 256 | # define swap_32(x) __swap_32(x) |
257 | #endif /* LITTLEENDIAN */ | 257 | #endif /* LITTLEENDIAN */ |
258 | 258 | ||
259 | /* | 259 | /* |
260 | * Calling this entity a "pipe" is glorifying it. A USB pipe | 260 | * Calling this entity a "pipe" is glorifying it. A USB pipe |
261 | * is something embarrassingly simple: it basically consists | 261 | * is something embarrassingly simple: it basically consists |
262 | * of the following information: | 262 | * of the following information: |
263 | * - device number (7 bits) | 263 | * - device number (7 bits) |
264 | * - endpoint number (4 bits) | 264 | * - endpoint number (4 bits) |
265 | * - current Data0/1 state (1 bit) | 265 | * - current Data0/1 state (1 bit) |
266 | * - direction (1 bit) | 266 | * - direction (1 bit) |
267 | * - speed (1 bit) | 267 | * - speed (1 bit) |
268 | * - max packet size (2 bits: 8, 16, 32 or 64) | 268 | * - max packet size (2 bits: 8, 16, 32 or 64) |
269 | * - pipe type (2 bits: control, interrupt, bulk, isochronous) | 269 | * - pipe type (2 bits: control, interrupt, bulk, isochronous) |
270 | * | 270 | * |
271 | * That's 18 bits. Really. Nothing more. And the USB people have | 271 | * That's 18 bits. Really. Nothing more. And the USB people have |
272 | * documented these eighteen bits as some kind of glorious | 272 | * documented these eighteen bits as some kind of glorious |
273 | * virtual data structure. | 273 | * virtual data structure. |
274 | * | 274 | * |
275 | * Let's not fall in that trap. We'll just encode it as a simple | 275 | * Let's not fall in that trap. We'll just encode it as a simple |
276 | * unsigned int. The encoding is: | 276 | * unsigned int. The encoding is: |
277 | * | 277 | * |
278 | * - max size: bits 0-1 (00 = 8, 01 = 16, 10 = 32, 11 = 64) | 278 | * - max size: bits 0-1 (00 = 8, 01 = 16, 10 = 32, 11 = 64) |
279 | * - direction: bit 7 (0 = Host-to-Device [Out], 1 = Device-to-Host [In]) | 279 | * - direction: bit 7 (0 = Host-to-Device [Out], 1 = Device-to-Host [In]) |
280 | * - device: bits 8-14 | 280 | * - device: bits 8-14 |
281 | * - endpoint: bits 15-18 | 281 | * - endpoint: bits 15-18 |
282 | * - Data0/1: bit 19 | 282 | * - Data0/1: bit 19 |
283 | * - speed: bit 26 (0 = Full, 1 = Low Speed) | 283 | * - speed: bit 26 (0 = Full, 1 = Low Speed) |
284 | * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt, 10 = control, 11 = bulk) | 284 | * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt, 10 = control, 11 = bulk) |
285 | * | 285 | * |
286 | * Why? Because it's arbitrary, and whatever encoding we select is really | 286 | * Why? Because it's arbitrary, and whatever encoding we select is really |
287 | * up to us. This one happens to share a lot of bit positions with the UHCI | 287 | * up to us. This one happens to share a lot of bit positions with the UHCI |
288 | * specification, so that much of the uhci driver can just mask the bits | 288 | * specification, so that much of the uhci driver can just mask the bits |
289 | * appropriately. | 289 | * appropriately. |
290 | */ | 290 | */ |
291 | /* Create various pipes... */ | 291 | /* Create various pipes... */ |
292 | #define create_pipe(dev,endpoint) \ | 292 | #define create_pipe(dev,endpoint) \ |
293 | (((dev)->devnum << 8) | (endpoint << 15) | ((dev)->slow << 26) | (dev)->maxpacketsize) | 293 | (((dev)->devnum << 8) | (endpoint << 15) | ((dev)->slow << 26) | (dev)->maxpacketsize) |
294 | #define default_pipe(dev) ((dev)->slow <<26) | 294 | #define default_pipe(dev) ((dev)->slow <<26) |
295 | 295 | ||
296 | #define usb_sndctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | create_pipe(dev,endpoint)) | 296 | #define usb_sndctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | create_pipe(dev,endpoint)) |
297 | #define usb_rcvctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) | 297 | #define usb_rcvctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) |
298 | #define usb_sndisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | create_pipe(dev,endpoint)) | 298 | #define usb_sndisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | create_pipe(dev,endpoint)) |
299 | #define usb_rcvisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) | 299 | #define usb_rcvisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) |
300 | #define usb_sndbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | create_pipe(dev,endpoint)) | 300 | #define usb_sndbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | create_pipe(dev,endpoint)) |
301 | #define usb_rcvbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) | 301 | #define usb_rcvbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) |
302 | #define usb_sndintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | create_pipe(dev,endpoint)) | 302 | #define usb_sndintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | create_pipe(dev,endpoint)) |
303 | #define usb_rcvintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) | 303 | #define usb_rcvintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) | create_pipe(dev,endpoint) | USB_DIR_IN) |
304 | #define usb_snddefctrl(dev) ((PIPE_CONTROL << 30) | default_pipe(dev)) | 304 | #define usb_snddefctrl(dev) ((PIPE_CONTROL << 30) | default_pipe(dev)) |
305 | #define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | default_pipe(dev) | USB_DIR_IN) | 305 | #define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | default_pipe(dev) | USB_DIR_IN) |
306 | 306 | ||
307 | /* The D0/D1 toggle bits */ | 307 | /* The D0/D1 toggle bits */ |
308 | #define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> ep) & 1) | 308 | #define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> ep) & 1) |
309 | #define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << ep)) | 309 | #define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << ep)) |
310 | #define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << ep)) | ((bit) << ep)) | 310 | #define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << ep)) | ((bit) << ep)) |
311 | 311 | ||
312 | /* Endpoint halt control/status */ | 312 | /* Endpoint halt control/status */ |
313 | #define usb_endpoint_out(ep_dir) (((ep_dir >> 7) & 1) ^ 1) | 313 | #define usb_endpoint_out(ep_dir) (((ep_dir >> 7) & 1) ^ 1) |
314 | #define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep))) | 314 | #define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep))) |
315 | #define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep))) | 315 | #define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep))) |
316 | #define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep))) | 316 | #define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep))) |
317 | 317 | ||
318 | #define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : USB_PID_OUT) | 318 | #define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : USB_PID_OUT) |
319 | 319 | ||
320 | #define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1) | 320 | #define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1) |
321 | #define usb_pipein(pipe) (((pipe) >> 7) & 1) | 321 | #define usb_pipein(pipe) (((pipe) >> 7) & 1) |
322 | #define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f) | 322 | #define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f) |
323 | #define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff) | 323 | #define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff) |
324 | #define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf) | 324 | #define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf) |
325 | #define usb_pipedata(pipe) (((pipe) >> 19) & 1) | 325 | #define usb_pipedata(pipe) (((pipe) >> 19) & 1) |
326 | #define usb_pipeslow(pipe) (((pipe) >> 26) & 1) | 326 | #define usb_pipeslow(pipe) (((pipe) >> 26) & 1) |
327 | #define usb_pipetype(pipe) (((pipe) >> 30) & 3) | 327 | #define usb_pipetype(pipe) (((pipe) >> 30) & 3) |
328 | #define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) | 328 | #define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) |
329 | #define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT) | 329 | #define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT) |
330 | #define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL) | 330 | #define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL) |
331 | #define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK) | 331 | #define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK) |
332 | 332 | ||
333 | 333 | ||
334 | /************************************************************************* | 334 | /************************************************************************* |
335 | * Hub Stuff | 335 | * Hub Stuff |
336 | */ | 336 | */ |
337 | struct usb_port_status { | 337 | struct usb_port_status { |
338 | unsigned short wPortStatus; | 338 | unsigned short wPortStatus; |
339 | unsigned short wPortChange; | 339 | unsigned short wPortChange; |
340 | } __attribute__ ((packed)); | 340 | } __attribute__ ((packed)); |
341 | 341 | ||
342 | struct usb_hub_status { | 342 | struct usb_hub_status { |
343 | unsigned short wHubStatus; | 343 | unsigned short wHubStatus; |
344 | unsigned short wHubChange; | 344 | unsigned short wHubChange; |
345 | } __attribute__ ((packed)); | 345 | } __attribute__ ((packed)); |
346 | 346 | ||
347 | 347 | ||
348 | /* Hub descriptor */ | 348 | /* Hub descriptor */ |
349 | struct usb_hub_descriptor { | 349 | struct usb_hub_descriptor { |
350 | unsigned char bLength; | 350 | unsigned char bLength; |
351 | unsigned char bDescriptorType; | 351 | unsigned char bDescriptorType; |
352 | unsigned char bNbrPorts; | 352 | unsigned char bNbrPorts; |
353 | unsigned short wHubCharacteristics; | 353 | unsigned short wHubCharacteristics; |
354 | unsigned char bPwrOn2PwrGood; | 354 | unsigned char bPwrOn2PwrGood; |
355 | unsigned char bHubContrCurrent; | 355 | unsigned char bHubContrCurrent; |
356 | unsigned char DeviceRemovable[(USB_MAXCHILDREN+1+7)/8]; | 356 | unsigned char DeviceRemovable[(USB_MAXCHILDREN+1+7)/8]; |
357 | unsigned char PortPowerCtrlMask[(USB_MAXCHILDREN+1+7)/8]; | 357 | unsigned char PortPowerCtrlMask[(USB_MAXCHILDREN+1+7)/8]; |
358 | /* DeviceRemovable and PortPwrCtrlMask want to be variable-length | 358 | /* DeviceRemovable and PortPwrCtrlMask want to be variable-length |
359 | bitmaps that hold max 255 entries. (bit0 is ignored) */ | 359 | bitmaps that hold max 255 entries. (bit0 is ignored) */ |
360 | } __attribute__ ((packed)); | 360 | } __attribute__ ((packed)); |
361 | 361 | ||
362 | 362 | ||
363 | struct usb_hub_device { | 363 | struct usb_hub_device { |
364 | struct usb_device *pusb_dev; | 364 | struct usb_device *pusb_dev; |
365 | struct usb_hub_descriptor desc; | 365 | struct usb_hub_descriptor desc; |
366 | }; | 366 | }; |
367 | 367 | ||
368 | #endif /*_USB_H_ */ | 368 | #endif /*_USB_H_ */ |
369 | 369 |