12731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 22731b9a8SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2003 32731b9a8SJean-Christophe PLAGNIOL-VILLARD * Gerry Hamel, geh@ti.com, Texas Instruments 42731b9a8SJean-Christophe PLAGNIOL-VILLARD * 52731b9a8SJean-Christophe PLAGNIOL-VILLARD * Based on linux/drivers/usbd/usbd.h 62731b9a8SJean-Christophe PLAGNIOL-VILLARD * 72731b9a8SJean-Christophe PLAGNIOL-VILLARD * Copyright (c) 2000, 2001, 2002 Lineo 82731b9a8SJean-Christophe PLAGNIOL-VILLARD * Copyright (c) 2001 Hewlett Packard 92731b9a8SJean-Christophe PLAGNIOL-VILLARD * 102731b9a8SJean-Christophe PLAGNIOL-VILLARD * By: 112731b9a8SJean-Christophe PLAGNIOL-VILLARD * Stuart Lynne <sl@lineo.com>, 122731b9a8SJean-Christophe PLAGNIOL-VILLARD * Tom Rushworth <tbr@lineo.com>, 132731b9a8SJean-Christophe PLAGNIOL-VILLARD * Bruce Balden <balden@lineo.com> 142731b9a8SJean-Christophe PLAGNIOL-VILLARD * 152731b9a8SJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or modify 162731b9a8SJean-Christophe PLAGNIOL-VILLARD * it under the terms of the GNU General Public License as published by 172731b9a8SJean-Christophe PLAGNIOL-VILLARD * the Free Software Foundation; either version 2 of the License, or 182731b9a8SJean-Christophe PLAGNIOL-VILLARD * (at your option) any later version. 192731b9a8SJean-Christophe PLAGNIOL-VILLARD * 202731b9a8SJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 212731b9a8SJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 222731b9a8SJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 232731b9a8SJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 242731b9a8SJean-Christophe PLAGNIOL-VILLARD * 252731b9a8SJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 262731b9a8SJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 272731b9a8SJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 282731b9a8SJean-Christophe PLAGNIOL-VILLARD * 292731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 302731b9a8SJean-Christophe PLAGNIOL-VILLARD 312731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef __USBDCORE_H__ 322731b9a8SJean-Christophe PLAGNIOL-VILLARD #define __USBDCORE_H__ 332731b9a8SJean-Christophe PLAGNIOL-VILLARD 342731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 352731b9a8SJean-Christophe PLAGNIOL-VILLARD #include "usbdescriptors.h" 362731b9a8SJean-Christophe PLAGNIOL-VILLARD 372731b9a8SJean-Christophe PLAGNIOL-VILLARD 382731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MAX_URBS_QUEUED 5 392731b9a8SJean-Christophe PLAGNIOL-VILLARD 402731b9a8SJean-Christophe PLAGNIOL-VILLARD 412731b9a8SJean-Christophe PLAGNIOL-VILLARD #if 1 422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usberr(fmt,args...) serial_printf("ERROR: %s(), %d: "fmt"\n",__FUNCTION__,__LINE__,##args) 432731b9a8SJean-Christophe PLAGNIOL-VILLARD #else 442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usberr(fmt,args...) do{}while(0) 452731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 462731b9a8SJean-Christophe PLAGNIOL-VILLARD 472731b9a8SJean-Christophe PLAGNIOL-VILLARD #if 0 482731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbdbg(fmt,args...) serial_printf("debug: %s(), %d: "fmt"\n",__FUNCTION__,__LINE__,##args) 492731b9a8SJean-Christophe PLAGNIOL-VILLARD #else 502731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbdbg(fmt,args...) do{}while(0) 512731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 522731b9a8SJean-Christophe PLAGNIOL-VILLARD 532731b9a8SJean-Christophe PLAGNIOL-VILLARD #if 0 542731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbinfo(fmt,args...) serial_printf("info: %s(), %d: "fmt"\n",__FUNCTION__,__LINE__,##args) 552731b9a8SJean-Christophe PLAGNIOL-VILLARD #else 562731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbinfo(fmt,args...) do{}while(0) 572731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 582731b9a8SJean-Christophe PLAGNIOL-VILLARD 592731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef le16_to_cpu 602731b9a8SJean-Christophe PLAGNIOL-VILLARD #define le16_to_cpu(x) (x) 612731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 622731b9a8SJean-Christophe PLAGNIOL-VILLARD 632731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef inb 642731b9a8SJean-Christophe PLAGNIOL-VILLARD #define inb(p) (*(volatile u8*)(p)) 652731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 662731b9a8SJean-Christophe PLAGNIOL-VILLARD 672731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outb 682731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outb(val,p) (*(volatile u8*)(p) = (val)) 692731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 702731b9a8SJean-Christophe PLAGNIOL-VILLARD 712731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef inw 722731b9a8SJean-Christophe PLAGNIOL-VILLARD #define inw(p) (*(volatile u16*)(p)) 732731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 742731b9a8SJean-Christophe PLAGNIOL-VILLARD 752731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outw 762731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outw(val,p) (*(volatile u16*)(p) = (val)) 772731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 782731b9a8SJean-Christophe PLAGNIOL-VILLARD 792731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef inl 802731b9a8SJean-Christophe PLAGNIOL-VILLARD #define inl(p) (*(volatile u32*)(p)) 812731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 822731b9a8SJean-Christophe PLAGNIOL-VILLARD 832731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outl 842731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outl(val,p) (*(volatile u32*)(p) = (val)) 852731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 862731b9a8SJean-Christophe PLAGNIOL-VILLARD 872731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef insw 882731b9a8SJean-Christophe PLAGNIOL-VILLARD #define insw(p,to,len) mmio_insw(p,to,len) 892731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 902731b9a8SJean-Christophe PLAGNIOL-VILLARD 912731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outsw 922731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outsw(p,from,len) mmio_outsw(p,from,len) 932731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 942731b9a8SJean-Christophe PLAGNIOL-VILLARD 952731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef insb 962731b9a8SJean-Christophe PLAGNIOL-VILLARD #define insb(p,to,len) mmio_insb(p,to,len) 972731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 982731b9a8SJean-Christophe PLAGNIOL-VILLARD 992731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef mmio_insw 1002731b9a8SJean-Christophe PLAGNIOL-VILLARD #define mmio_insw(r,b,l) ({ int __i ; \ 1012731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 *__b2; \ 1022731b9a8SJean-Christophe PLAGNIOL-VILLARD __b2 = (u16 *) b; \ 1032731b9a8SJean-Christophe PLAGNIOL-VILLARD for (__i = 0; __i < l; __i++) { \ 1042731b9a8SJean-Christophe PLAGNIOL-VILLARD *(__b2 + __i) = inw(r); \ 1052731b9a8SJean-Christophe PLAGNIOL-VILLARD }; \ 1062731b9a8SJean-Christophe PLAGNIOL-VILLARD }) 1072731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 1082731b9a8SJean-Christophe PLAGNIOL-VILLARD 1092731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef mmio_outsw 1102731b9a8SJean-Christophe PLAGNIOL-VILLARD #define mmio_outsw(r,b,l) ({ int __i; \ 1112731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 *__b2; \ 1122731b9a8SJean-Christophe PLAGNIOL-VILLARD __b2 = (u16 *) b; \ 1132731b9a8SJean-Christophe PLAGNIOL-VILLARD for (__i = 0; __i < l; __i++) { \ 1142731b9a8SJean-Christophe PLAGNIOL-VILLARD outw( *(__b2 + __i), r); \ 1152731b9a8SJean-Christophe PLAGNIOL-VILLARD } \ 1162731b9a8SJean-Christophe PLAGNIOL-VILLARD }) 1172731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 1182731b9a8SJean-Christophe PLAGNIOL-VILLARD 1192731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef mmio_insb 1202731b9a8SJean-Christophe PLAGNIOL-VILLARD #define mmio_insb(r,b,l) ({ int __i ; \ 1212731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 *__b2; \ 1222731b9a8SJean-Christophe PLAGNIOL-VILLARD __b2 = (u8 *) b; \ 1232731b9a8SJean-Christophe PLAGNIOL-VILLARD for (__i = 0; __i < l; __i++) { \ 1242731b9a8SJean-Christophe PLAGNIOL-VILLARD *(__b2 + __i) = inb(r); \ 1252731b9a8SJean-Christophe PLAGNIOL-VILLARD }; \ 1262731b9a8SJean-Christophe PLAGNIOL-VILLARD }) 1272731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 1282731b9a8SJean-Christophe PLAGNIOL-VILLARD 1292731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1302731b9a8SJean-Christophe PLAGNIOL-VILLARD * Structure member address manipulation macros. 1312731b9a8SJean-Christophe PLAGNIOL-VILLARD * These are used by client code (code using the urb_link routines), since 1322731b9a8SJean-Christophe PLAGNIOL-VILLARD * the urb_link structure is embedded in the client data structures. 1332731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1342731b9a8SJean-Christophe PLAGNIOL-VILLARD * Note: a macro offsetof equivalent to member_offset is defined in stddef.h 1352731b9a8SJean-Christophe PLAGNIOL-VILLARD * but this is kept here for the sake of portability. 1362731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1372731b9a8SJean-Christophe PLAGNIOL-VILLARD * p2surround returns a pointer to the surrounding structure given 1382731b9a8SJean-Christophe PLAGNIOL-VILLARD * type of the surrounding structure, the name memb of the structure 1392731b9a8SJean-Christophe PLAGNIOL-VILLARD * member pointed at by ptr. For example, if you have: 1402731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1412731b9a8SJean-Christophe PLAGNIOL-VILLARD * struct foo { 1422731b9a8SJean-Christophe PLAGNIOL-VILLARD * int x; 1432731b9a8SJean-Christophe PLAGNIOL-VILLARD * float y; 1442731b9a8SJean-Christophe PLAGNIOL-VILLARD * char z; 1452731b9a8SJean-Christophe PLAGNIOL-VILLARD * } thingy; 1462731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1472731b9a8SJean-Christophe PLAGNIOL-VILLARD * char *cp = &thingy.z; 1482731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1492731b9a8SJean-Christophe PLAGNIOL-VILLARD * then 1502731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1512731b9a8SJean-Christophe PLAGNIOL-VILLARD * &thingy == p2surround(struct foo, z, cp) 1522731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1532731b9a8SJean-Christophe PLAGNIOL-VILLARD * Clear? 1542731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1552731b9a8SJean-Christophe PLAGNIOL-VILLARD #define _cv_(ptr) ((char*)(void*)(ptr)) 1562731b9a8SJean-Christophe PLAGNIOL-VILLARD #define member_offset(type,memb) (_cv_(&(((type*)0)->memb))-(char*)0) 1572731b9a8SJean-Christophe PLAGNIOL-VILLARD #define p2surround(type,memb,ptr) ((type*)(void*)(_cv_(ptr)-member_offset(type,memb))) 1582731b9a8SJean-Christophe PLAGNIOL-VILLARD 1592731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb; 1602731b9a8SJean-Christophe PLAGNIOL-VILLARD 1612731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance; 1622731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance; 1632731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_instance; 1642731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance; 1652731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_bus_instance; 1662731b9a8SJean-Christophe PLAGNIOL-VILLARD 1672731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1682731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device and/or Interface Class codes 1692731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1702731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ 1712731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_AUDIO 1 1722731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_COMM 2 1732731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_HID 3 1742731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_PHYSICAL 5 1752731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_PRINTER 7 1762731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_MASS_STORAGE 8 1772731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_HUB 9 1782731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_DATA 10 1792731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_APP_SPEC 0xfe 1802731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_VENDOR_SPEC 0xff 1812731b9a8SJean-Christophe PLAGNIOL-VILLARD 1822731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1832731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB types 1842731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1852731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_STANDARD (0x00 << 5) 1862731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_CLASS (0x01 << 5) 1872731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_VENDOR (0x02 << 5) 1882731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_RESERVED (0x03 << 5) 1892731b9a8SJean-Christophe PLAGNIOL-VILLARD 1902731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1912731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB recipients 1922731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1932731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_DEVICE 0x00 1942731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_INTERFACE 0x01 1952731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_ENDPOINT 0x02 1962731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_OTHER 0x03 1972731b9a8SJean-Christophe PLAGNIOL-VILLARD 1982731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1992731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB directions 2002731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2012731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DIR_OUT 0 2022731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DIR_IN 0x80 2032731b9a8SJean-Christophe PLAGNIOL-VILLARD 2042731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2052731b9a8SJean-Christophe PLAGNIOL-VILLARD * Descriptor types 2062731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2072731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_DEVICE 0x01 2082731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_CONFIG 0x02 2092731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_STRING 0x03 2102731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_INTERFACE 0x04 2112731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT 0x05 2122731b9a8SJean-Christophe PLAGNIOL-VILLARD 2132731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HID (USB_TYPE_CLASS | 0x01) 2142731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_REPORT (USB_TYPE_CLASS | 0x02) 2152731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03) 2162731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HUB (USB_TYPE_CLASS | 0x09) 2172731b9a8SJean-Christophe PLAGNIOL-VILLARD 2182731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2192731b9a8SJean-Christophe PLAGNIOL-VILLARD * Descriptor sizes per descriptor type 2202731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2212731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_DEVICE_SIZE 18 2222731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_CONFIG_SIZE 9 2232731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_INTERFACE_SIZE 9 2242731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT_SIZE 7 2252731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ 2262731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HUB_NONVAR_SIZE 7 2272731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HID_SIZE 9 2282731b9a8SJean-Christophe PLAGNIOL-VILLARD 2292731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2302731b9a8SJean-Christophe PLAGNIOL-VILLARD * Endpoints 2312731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2322731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ 2332731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_DIR_MASK 0x80 2342731b9a8SJean-Christophe PLAGNIOL-VILLARD 2352731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ 2362731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_CONTROL 0 2372731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_ISOC 1 2382731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_BULK 2 2392731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_INT 3 2402731b9a8SJean-Christophe PLAGNIOL-VILLARD 2412731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2422731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB Packet IDs (PIDs) 2432731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_UNDEF_0 0xf0 2452731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_OUT 0xe1 2462731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_ACK 0xd2 2472731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA0 0xc3 2482731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_PING 0xb4 /* USB 2.0 */ 2492731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SOF 0xa5 2502731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_NYET 0x96 /* USB 2.0 */ 2512731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA2 0x87 /* USB 2.0 */ 2522731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SPLIT 0x78 /* USB 2.0 */ 2532731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_IN 0x69 2542731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_NAK 0x5a 2552731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA1 0x4b 2562731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_PREAMBLE 0x3c /* Token mode */ 2572731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_ERR 0x3c /* USB 2.0: handshake mode */ 2582731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SETUP 0x2d 2592731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_STALL 0x1e 2602731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_MDATA 0x0f /* USB 2.0 */ 2612731b9a8SJean-Christophe PLAGNIOL-VILLARD 2622731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2632731b9a8SJean-Christophe PLAGNIOL-VILLARD * Standard requests 2642731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2652731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_STATUS 0x00 2662731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_CLEAR_FEATURE 0x01 2672731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_FEATURE 0x03 2682731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_ADDRESS 0x05 2692731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_DESCRIPTOR 0x06 2702731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_DESCRIPTOR 0x07 2712731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_CONFIGURATION 0x08 2722731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_CONFIGURATION 0x09 2732731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_INTERFACE 0x0A 2742731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_INTERFACE 0x0B 2752731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SYNCH_FRAME 0x0C 2762731b9a8SJean-Christophe PLAGNIOL-VILLARD 2772731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_REQUESTS(x) (((unsigned int)x <= USB_REQ_SYNCH_FRAME) ? usbd_device_requests[x] : "UNKNOWN") 2782731b9a8SJean-Christophe PLAGNIOL-VILLARD 2792731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2802731b9a8SJean-Christophe PLAGNIOL-VILLARD * HID requests 2812731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2822731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_REPORT 0x01 2832731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_IDLE 0x02 2842731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_PROTOCOL 0x03 2852731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_REPORT 0x09 2862731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_IDLE 0x0A 2872731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_PROTOCOL 0x0B 2882731b9a8SJean-Christophe PLAGNIOL-VILLARD 2892731b9a8SJean-Christophe PLAGNIOL-VILLARD 2902731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2912731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB Spec Release number 2922731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2932731b9a8SJean-Christophe PLAGNIOL-VILLARD 2942731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_BCD_VERSION 0x0110 2952731b9a8SJean-Christophe PLAGNIOL-VILLARD 2962731b9a8SJean-Christophe PLAGNIOL-VILLARD 2972731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2982731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device Requests (c.f Table 9-2) 2992731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3002731b9a8SJean-Christophe PLAGNIOL-VILLARD 3012731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_DIRECTION_MASK 0x80 3022731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_MASK 0x60 3032731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_MASK 0x1f 3042731b9a8SJean-Christophe PLAGNIOL-VILLARD 3052731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_DEVICE2HOST 0x80 3062731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_HOST2DEVICE 0x00 3072731b9a8SJean-Christophe PLAGNIOL-VILLARD 3082731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_STANDARD 0x00 3092731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_CLASS 0x20 3102731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_VENDOR 0x40 3112731b9a8SJean-Christophe PLAGNIOL-VILLARD 3122731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_DEVICE 0x00 3132731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_INTERFACE 0x01 3142731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_ENDPOINT 0x02 3152731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_OTHER 0x03 3162731b9a8SJean-Christophe PLAGNIOL-VILLARD 3172731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3182731b9a8SJean-Christophe PLAGNIOL-VILLARD * get status bits 3192731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3202731b9a8SJean-Christophe PLAGNIOL-VILLARD 3212731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_SELFPOWERED 0x01 3222731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_REMOTEWAKEUP 0x02 3232731b9a8SJean-Christophe PLAGNIOL-VILLARD 3242731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_HALT 0x01 3252731b9a8SJean-Christophe PLAGNIOL-VILLARD 3262731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3272731b9a8SJean-Christophe PLAGNIOL-VILLARD * descriptor types 3282731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3292731b9a8SJean-Christophe PLAGNIOL-VILLARD 3302731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_DEVICE 0x01 3312731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02 3322731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_STRING 0x03 3332731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_INTERFACE 0x04 3342731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05 3352731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 0x06 3362731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION 0x07 3372731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 0x08 3382731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_HID 0x21 3392731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_REPORT 0x22 3402731b9a8SJean-Christophe PLAGNIOL-VILLARD 3412731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_DESCRIPTORS(x) (((unsigned int)x <= USB_DESCRIPTOR_TYPE_INTERFACE_POWER) ? \ 3422731b9a8SJean-Christophe PLAGNIOL-VILLARD usbd_device_descriptors[x] : "UNKNOWN") 3432731b9a8SJean-Christophe PLAGNIOL-VILLARD 3442731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3452731b9a8SJean-Christophe PLAGNIOL-VILLARD * standard feature selectors 3462731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3472731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_HALT 0x00 3482731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DEVICE_REMOTE_WAKEUP 0x01 3492731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TEST_MODE 0x02 3502731b9a8SJean-Christophe PLAGNIOL-VILLARD 3512731b9a8SJean-Christophe PLAGNIOL-VILLARD 3522731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Requests 3532731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3542731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3552731b9a8SJean-Christophe PLAGNIOL-VILLARD 3562731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_request { 3572731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 bmRequestType; 3582731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 bRequest; 3592731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wValue; 3602731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wIndex; 3612731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wLength; 3622731b9a8SJean-Christophe PLAGNIOL-VILLARD } __attribute__ ((packed)); 3632731b9a8SJean-Christophe PLAGNIOL-VILLARD 3642731b9a8SJean-Christophe PLAGNIOL-VILLARD 3652731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Status 3662731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3672731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3682731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum urb_send_status { 3692731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_IN_PROGRESS, 3702731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_FINISHED_OK, 3712731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_FINISHED_ERROR, 3722731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_READY, 3732731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_OK, 3742731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_ERROR 3752731b9a8SJean-Christophe PLAGNIOL-VILLARD } urb_send_status_t; 3762731b9a8SJean-Christophe PLAGNIOL-VILLARD 3772731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3782731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device State (c.f USB Spec 2.0 Figure 9-1) 3792731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3802731b9a8SJean-Christophe PLAGNIOL-VILLARD * What state the usb device is in. 3812731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3822731b9a8SJean-Christophe PLAGNIOL-VILLARD * Note the state does not change if the device is suspended, we simply set a 3832731b9a8SJean-Christophe PLAGNIOL-VILLARD * flag to show that it is suspended. 3842731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3852731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3862731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_state { 3872731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_INIT, /* just initialized */ 3882731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_CREATED, /* just created */ 3892731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_ATTACHED, /* we are attached */ 3902731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_POWERED, /* we have seen power indication (electrical bus signal) */ 3912731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_DEFAULT, /* we been reset */ 3922731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_ADDRESSED, /* we have been addressed (in default configuration) */ 3932731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_CONFIGURED, /* we have seen a set configuration device command */ 3942731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_UNKNOWN, /* destroyed */ 3952731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_state_t; 3962731b9a8SJean-Christophe PLAGNIOL-VILLARD 3972731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_STATE(x) (((unsigned int)x <= STATE_UNKNOWN) ? usbd_device_states[x] : "UNKNOWN") 3982731b9a8SJean-Christophe PLAGNIOL-VILLARD 3992731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 4002731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device status 4012731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4022731b9a8SJean-Christophe PLAGNIOL-VILLARD * Overall state 4032731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4042731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_status { 4052731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_OPENING, /* we are currently opening */ 4062731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_OK, /* ok to use */ 4072731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_SUSPENDED, /* we are currently suspended */ 4082731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_CLOSING, /* we are currently closing */ 4092731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_status_t; 4102731b9a8SJean-Christophe PLAGNIOL-VILLARD 4112731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_STATUS(x) (((unsigned int)x <= USBD_CLOSING) ? usbd_device_status[x] : "UNKNOWN") 4122731b9a8SJean-Christophe PLAGNIOL-VILLARD 4132731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 4142731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device Events 4152731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4162731b9a8SJean-Christophe PLAGNIOL-VILLARD * These are defined in the USB Spec (c.f USB Spec 2.0 Figure 9-1). 4172731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4182731b9a8SJean-Christophe PLAGNIOL-VILLARD * There are additional events defined to handle some extra actions we need 4192731b9a8SJean-Christophe PLAGNIOL-VILLARD * to have handled. 4202731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4212731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4222731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_event { 4232731b9a8SJean-Christophe PLAGNIOL-VILLARD 4242731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_UNKNOWN, /* bi - unknown event */ 4252731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_INIT, /* bi - initialize */ 4262731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CREATE, /* bi - */ 4272731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HUB_CONFIGURED, /* bi - bus has been plugged int */ 4282731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_RESET, /* bi - hub has powered our port */ 4292731b9a8SJean-Christophe PLAGNIOL-VILLARD 4302731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_ADDRESS_ASSIGNED, /* ep0 - set address setup received */ 4312731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CONFIGURED, /* ep0 - set configure setup received */ 4322731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_SET_INTERFACE, /* ep0 - set interface setup received */ 4332731b9a8SJean-Christophe PLAGNIOL-VILLARD 4342731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_SET_FEATURE, /* ep0 - set feature setup received */ 4352731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CLEAR_FEATURE, /* ep0 - clear feature setup received */ 4362731b9a8SJean-Christophe PLAGNIOL-VILLARD 4372731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_DE_CONFIGURED, /* ep0 - set configure setup received for ?? */ 4382731b9a8SJean-Christophe PLAGNIOL-VILLARD 4392731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_BUS_INACTIVE, /* bi - bus in inactive (no SOF packets) */ 4402731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_BUS_ACTIVITY, /* bi - bus is active again */ 4412731b9a8SJean-Christophe PLAGNIOL-VILLARD 4422731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_POWER_INTERRUPTION, /* bi - hub has depowered our port */ 4432731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HUB_RESET, /* bi - bus has been unplugged */ 4442731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_DESTROY, /* bi - device instance should be destroyed */ 4452731b9a8SJean-Christophe PLAGNIOL-VILLARD 4462731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HOTPLUG, /* bi - a hotplug event has occured */ 4472731b9a8SJean-Christophe PLAGNIOL-VILLARD 4482731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_FUNCTION_PRIVATE, /* function - private */ 4492731b9a8SJean-Christophe PLAGNIOL-VILLARD 4502731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_event_t; 4512731b9a8SJean-Christophe PLAGNIOL-VILLARD 4522731b9a8SJean-Christophe PLAGNIOL-VILLARD 4532731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef struct urb_link { 4542731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link *next; 4552731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link *prev; 4562731b9a8SJean-Christophe PLAGNIOL-VILLARD } urb_link; 4572731b9a8SJean-Christophe PLAGNIOL-VILLARD 4582731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Data structure - for passing data around. 4592731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4602731b9a8SJean-Christophe PLAGNIOL-VILLARD * This is used for both sending and receiving data. 4612731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4622731b9a8SJean-Christophe PLAGNIOL-VILLARD * The callback function is used to let the function driver know when 4632731b9a8SJean-Christophe PLAGNIOL-VILLARD * transmitted data has been sent. 4642731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4652731b9a8SJean-Christophe PLAGNIOL-VILLARD * The callback function is set by the alloc_recv function when an urb is 4662731b9a8SJean-Christophe PLAGNIOL-VILLARD * allocated for receiving data for an endpoint and used to call the 4672731b9a8SJean-Christophe PLAGNIOL-VILLARD * function driver to inform it that data has arrived. 4682731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4692731b9a8SJean-Christophe PLAGNIOL-VILLARD 4702731b9a8SJean-Christophe PLAGNIOL-VILLARD #define URB_BUF_SIZE 128 /* in linux we'd malloc this, but in u-boot we prefer static data */ 4712731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb { 4722731b9a8SJean-Christophe PLAGNIOL-VILLARD 4732731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance *endpoint; 4742731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance *device; 4752731b9a8SJean-Christophe PLAGNIOL-VILLARD 4762731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_request device_request; /* contents of received SETUP packet */ 4772731b9a8SJean-Christophe PLAGNIOL-VILLARD 4782731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link link; /* embedded struct for circular doubly linked list of urbs */ 4792731b9a8SJean-Christophe PLAGNIOL-VILLARD 4802731b9a8SJean-Christophe PLAGNIOL-VILLARD u8* buffer; 4812731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int buffer_length; 4822731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int actual_length; 4832731b9a8SJean-Christophe PLAGNIOL-VILLARD 4842731b9a8SJean-Christophe PLAGNIOL-VILLARD urb_send_status_t status; 4852731b9a8SJean-Christophe PLAGNIOL-VILLARD int data; 4862731b9a8SJean-Christophe PLAGNIOL-VILLARD 4872731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 buffer_data[URB_BUF_SIZE]; /* data received (OUT) or being sent (IN) */ 4882731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 4892731b9a8SJean-Christophe PLAGNIOL-VILLARD 4902731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Endpoint configuration 4912731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4922731b9a8SJean-Christophe PLAGNIOL-VILLARD * Per endpoint configuration data. Used to track which function driver owns 4932731b9a8SJean-Christophe PLAGNIOL-VILLARD * an endpoint. 4942731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4952731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4962731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance { 4972731b9a8SJean-Christophe PLAGNIOL-VILLARD int endpoint_address; /* logical endpoint address */ 4982731b9a8SJean-Christophe PLAGNIOL-VILLARD 4992731b9a8SJean-Christophe PLAGNIOL-VILLARD /* control */ 5002731b9a8SJean-Christophe PLAGNIOL-VILLARD int status; /* halted */ 5012731b9a8SJean-Christophe PLAGNIOL-VILLARD int state; /* available for use by bus interface driver */ 5022731b9a8SJean-Christophe PLAGNIOL-VILLARD 5032731b9a8SJean-Christophe PLAGNIOL-VILLARD /* receive side */ 5042731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link rcv; /* received urbs */ 5052731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link rdy; /* empty urbs ready to receive */ 5062731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *rcv_urb; /* active urb */ 5072731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_attributes; /* copy of bmAttributes from endpoint descriptor */ 5082731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_packetSize; /* maximum packet size from endpoint descriptor */ 5092731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_transferSize; /* maximum transfer size from function driver */ 5102731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_queue; 5112731b9a8SJean-Christophe PLAGNIOL-VILLARD 5122731b9a8SJean-Christophe PLAGNIOL-VILLARD /* transmit side */ 5132731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link tx; /* urbs ready to transmit */ 5142731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link done; /* transmitted urbs */ 5152731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *tx_urb; /* active urb */ 5162731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_attributes; /* copy of bmAttributes from endpoint descriptor */ 5172731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_packetSize; /* maximum packet size from endpoint descriptor */ 5182731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_transferSize; /* maximum transfer size from function driver */ 5192731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_queue; 5202731b9a8SJean-Christophe PLAGNIOL-VILLARD 5212731b9a8SJean-Christophe PLAGNIOL-VILLARD int sent; /* data already sent */ 5222731b9a8SJean-Christophe PLAGNIOL-VILLARD int last; /* data sent in last packet XXX do we need this */ 5232731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5242731b9a8SJean-Christophe PLAGNIOL-VILLARD 5252731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance { 5262731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_descriptor *interface_descriptor; 5272731b9a8SJean-Christophe PLAGNIOL-VILLARD 5282731b9a8SJean-Christophe PLAGNIOL-VILLARD int endpoints; 5292731b9a8SJean-Christophe PLAGNIOL-VILLARD int *endpoint_transfersize_array; 5302731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_descriptor **endpoints_descriptor_array; 5312731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5322731b9a8SJean-Christophe PLAGNIOL-VILLARD 5332731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance { 5342731b9a8SJean-Christophe PLAGNIOL-VILLARD int alternates; 5352731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance *alternates_instance_array; 5362731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5372731b9a8SJean-Christophe PLAGNIOL-VILLARD 5382731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_instance { 5392731b9a8SJean-Christophe PLAGNIOL-VILLARD int interfaces; 5402731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_descriptor *configuration_descriptor; 5412731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance *interface_instance_array; 5422731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5432731b9a8SJean-Christophe PLAGNIOL-VILLARD 5442731b9a8SJean-Christophe PLAGNIOL-VILLARD 5452731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Device Instance 5462731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5472731b9a8SJean-Christophe PLAGNIOL-VILLARD * For each physical bus interface we create a logical device structure. This 5482731b9a8SJean-Christophe PLAGNIOL-VILLARD * tracks all of the required state to track the USB HOST's view of the device. 5492731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5502731b9a8SJean-Christophe PLAGNIOL-VILLARD * Keep track of the device configuration for a real physical bus interface, 5512731b9a8SJean-Christophe PLAGNIOL-VILLARD * this includes the bus interface, multiple function drivers, the current 5522731b9a8SJean-Christophe PLAGNIOL-VILLARD * configuration and the current state. 5532731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5542731b9a8SJean-Christophe PLAGNIOL-VILLARD * This will show: 5552731b9a8SJean-Christophe PLAGNIOL-VILLARD * the specific bus interface driver 5562731b9a8SJean-Christophe PLAGNIOL-VILLARD * the default endpoint 0 driver 5572731b9a8SJean-Christophe PLAGNIOL-VILLARD * the configured function driver 5582731b9a8SJean-Christophe PLAGNIOL-VILLARD * device state 5592731b9a8SJean-Christophe PLAGNIOL-VILLARD * device status 5602731b9a8SJean-Christophe PLAGNIOL-VILLARD * endpoint list 5612731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 5622731b9a8SJean-Christophe PLAGNIOL-VILLARD 5632731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance { 5642731b9a8SJean-Christophe PLAGNIOL-VILLARD 5652731b9a8SJean-Christophe PLAGNIOL-VILLARD /* generic */ 5662731b9a8SJean-Christophe PLAGNIOL-VILLARD char *name; 5672731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_descriptor *device_descriptor; /* per device descriptor */ 5682731b9a8SJean-Christophe PLAGNIOL-VILLARD 5692731b9a8SJean-Christophe PLAGNIOL-VILLARD void (*event) (struct usb_device_instance *device, usb_device_event_t event, int data); 5702731b9a8SJean-Christophe PLAGNIOL-VILLARD 5712731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Do cdc device specific control requests */ 5722731b9a8SJean-Christophe PLAGNIOL-VILLARD int (*cdc_recv_setup)(struct usb_device_request *request, struct urb *urb); 5732731b9a8SJean-Christophe PLAGNIOL-VILLARD 5742731b9a8SJean-Christophe PLAGNIOL-VILLARD /* bus interface */ 5752731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_bus_instance *bus; /* which bus interface driver */ 5762731b9a8SJean-Christophe PLAGNIOL-VILLARD 5772731b9a8SJean-Christophe PLAGNIOL-VILLARD /* configuration descriptors */ 5782731b9a8SJean-Christophe PLAGNIOL-VILLARD int configurations; 5792731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_instance *configuration_instance_array; 5802731b9a8SJean-Christophe PLAGNIOL-VILLARD 5812731b9a8SJean-Christophe PLAGNIOL-VILLARD /* device state */ 5822731b9a8SJean-Christophe PLAGNIOL-VILLARD usb_device_state_t device_state; /* current USB Device state */ 5832731b9a8SJean-Christophe PLAGNIOL-VILLARD usb_device_state_t device_previous_state; /* current USB Device state */ 5842731b9a8SJean-Christophe PLAGNIOL-VILLARD 5852731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 address; /* current address (zero is default) */ 5862731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 configuration; /* current show configuration (zero is default) */ 5872731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 interface; /* current interface (zero is default) */ 5882731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 alternate; /* alternate flag */ 5892731b9a8SJean-Christophe PLAGNIOL-VILLARD 5902731b9a8SJean-Christophe PLAGNIOL-VILLARD usb_device_status_t status; /* device status */ 5912731b9a8SJean-Christophe PLAGNIOL-VILLARD 5922731b9a8SJean-Christophe PLAGNIOL-VILLARD int urbs_queued; /* number of submitted urbs */ 5932731b9a8SJean-Christophe PLAGNIOL-VILLARD 5942731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Shouldn't need to make this atomic, all we need is a change indicator */ 5952731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned long usbd_rxtx_timestamp; 5962731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned long usbd_last_rxtx_timestamp; 5972731b9a8SJean-Christophe PLAGNIOL-VILLARD 5982731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5992731b9a8SJean-Christophe PLAGNIOL-VILLARD 6002731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Bus Interface configuration structure 6012731b9a8SJean-Christophe PLAGNIOL-VILLARD * 6022731b9a8SJean-Christophe PLAGNIOL-VILLARD * This is allocated for each configured instance of a bus interface driver. 6032731b9a8SJean-Christophe PLAGNIOL-VILLARD * 6042731b9a8SJean-Christophe PLAGNIOL-VILLARD * The privdata pointer may be used by the bus interface driver to store private 6052731b9a8SJean-Christophe PLAGNIOL-VILLARD * per instance state information. 6062731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 6072731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_bus_instance { 6082731b9a8SJean-Christophe PLAGNIOL-VILLARD 6092731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance *device; 6102731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance *endpoint_array; /* array of available configured endpoints */ 6112731b9a8SJean-Christophe PLAGNIOL-VILLARD 6122731b9a8SJean-Christophe PLAGNIOL-VILLARD int max_endpoints; /* maximimum number of rx enpoints */ 6132731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned char maxpacketsize; 6142731b9a8SJean-Christophe PLAGNIOL-VILLARD 6152731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int serial_number; 6162731b9a8SJean-Christophe PLAGNIOL-VILLARD char *serial_number_str; 6172731b9a8SJean-Christophe PLAGNIOL-VILLARD void *privdata; /* private data for the bus interface */ 6182731b9a8SJean-Christophe PLAGNIOL-VILLARD 6192731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 6202731b9a8SJean-Christophe PLAGNIOL-VILLARD 6212731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_events[]; 6222731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_states[]; 6232731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_status[]; 6242731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_requests[]; 6252731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_descriptors[]; 6262731b9a8SJean-Christophe PLAGNIOL-VILLARD 6272731b9a8SJean-Christophe PLAGNIOL-VILLARD void urb_link_init (urb_link * ul); 6282731b9a8SJean-Christophe PLAGNIOL-VILLARD void urb_detach (struct urb *urb); 6292731b9a8SJean-Christophe PLAGNIOL-VILLARD urb_link *first_urb_link (urb_link * hd); 6302731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *first_urb (urb_link * hd); 6312731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *first_urb_detached (urb_link * hd); 6322731b9a8SJean-Christophe PLAGNIOL-VILLARD void urb_append (urb_link * hd, struct urb *urb); 6332731b9a8SJean-Christophe PLAGNIOL-VILLARD 6342731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *usbd_alloc_urb (struct usb_device_instance *device, struct usb_endpoint_instance *endpoint); 6352731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_dealloc_urb (struct urb *urb); 6362731b9a8SJean-Christophe PLAGNIOL-VILLARD 6372731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 6382731b9a8SJean-Christophe PLAGNIOL-VILLARD * usbd_device_event is used by bus interface drivers to tell the higher layers that 6392731b9a8SJean-Christophe PLAGNIOL-VILLARD * certain events have taken place. 6402731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 6412731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_device_event_irq (struct usb_device_instance *conf, usb_device_event_t, int); 6422731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_device_event (struct usb_device_instance *conf, usb_device_event_t, int); 6432731b9a8SJean-Christophe PLAGNIOL-VILLARD 6442731b9a8SJean-Christophe PLAGNIOL-VILLARD /* descriptors 6452731b9a8SJean-Christophe PLAGNIOL-VILLARD * 6462731b9a8SJean-Christophe PLAGNIOL-VILLARD * Various ways of finding descriptors based on the current device and any 6472731b9a8SJean-Christophe PLAGNIOL-VILLARD * possible configuration / interface / endpoint for it. 6482731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 6492731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_descriptor *usbd_device_configuration_descriptor (struct usb_device_instance *, int, int); 6502731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_function_instance *usbd_device_function_instance (struct usb_device_instance *, unsigned int); 6512731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance *usbd_device_interface_instance (struct usb_device_instance *, int, int, int); 6522731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance *usbd_device_alternate_instance (struct usb_device_instance *, int, int, int, int); 6532731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_descriptor *usbd_device_interface_descriptor (struct usb_device_instance *, int, int, int, int); 6542731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor_index (struct usb_device_instance *, int, int, int, int, int); 6552731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_class_descriptor *usbd_device_class_descriptor_index (struct usb_device_instance *, int, int, int, int, int); 6562731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_class_report_descriptor *usbd_device_class_report_descriptor_index( struct usb_device_instance *, int , int , int , int , int ); 6572731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor (struct usb_device_instance *, int, int, int, int, int); 6582731b9a8SJean-Christophe PLAGNIOL-VILLARD int usbd_device_endpoint_transfersize (struct usb_device_instance *, int, int, int, int, int); 6592731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_string_descriptor *usbd_get_string (u8); 6602731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_descriptor *usbd_device_device_descriptor (struct usb_device_instance *, int); 6612731b9a8SJean-Christophe PLAGNIOL-VILLARD 6622731b9a8SJean-Christophe PLAGNIOL-VILLARD int usbd_endpoint_halted (struct usb_device_instance *device, int endpoint); 6632731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_rcv_complete(struct usb_endpoint_instance *endpoint, int len, int urb_bad); 6642731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_tx_complete (struct usb_endpoint_instance *endpoint); 6652731b9a8SJean-Christophe PLAGNIOL-VILLARD 666*988365a2STom Rix /* These are macros used in debugging */ 667*988365a2STom Rix #ifdef DEBUG 668*988365a2STom Rix static inline void print_urb(struct urb *u) 669*988365a2STom Rix { 670*988365a2STom Rix serial_printf("urb %p\n", (u)); 671*988365a2STom Rix serial_printf("\tendpoint %p\n", u->endpoint); 672*988365a2STom Rix serial_printf("\tdevice %p\n", u->device); 673*988365a2STom Rix serial_printf("\tbuffer %p\n", u->buffer); 674*988365a2STom Rix serial_printf("\tbuffer_length %d\n", u->buffer_length); 675*988365a2STom Rix serial_printf("\tactual_length %d\n", u->actual_length); 676*988365a2STom Rix serial_printf("\tstatus %d\n", u->status); 677*988365a2STom Rix serial_printf("\tdata %d\n", u->data); 678*988365a2STom Rix } 679*988365a2STom Rix 680*988365a2STom Rix static inline void print_usb_device_request(struct usb_device_request *r) 681*988365a2STom Rix { 682*988365a2STom Rix serial_printf("usb request\n"); 683*988365a2STom Rix serial_printf("\tbmRequestType 0x%2.2x\n", r->bmRequestType); 684*988365a2STom Rix if ((r->bmRequestType & USB_REQ_DIRECTION_MASK) == 0) 685*988365a2STom Rix serial_printf("\t\tDirection : To device\n"); 686*988365a2STom Rix else 687*988365a2STom Rix serial_printf("\t\tDirection : To host\n"); 688*988365a2STom Rix if ((r->bmRequestType & USB_TYPE_STANDARD) == USB_TYPE_STANDARD) 689*988365a2STom Rix serial_printf("\t\tType : Standard\n"); 690*988365a2STom Rix if ((r->bmRequestType & USB_TYPE_CLASS) == USB_TYPE_CLASS) 691*988365a2STom Rix serial_printf("\t\tType : Standard\n"); 692*988365a2STom Rix if ((r->bmRequestType & USB_TYPE_VENDOR) == USB_TYPE_VENDOR) 693*988365a2STom Rix serial_printf("\t\tType : Standard\n"); 694*988365a2STom Rix if ((r->bmRequestType & USB_TYPE_RESERVED) == USB_TYPE_RESERVED) 695*988365a2STom Rix serial_printf("\t\tType : Standard\n"); 696*988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 697*988365a2STom Rix USB_REQ_RECIPIENT_DEVICE) 698*988365a2STom Rix serial_printf("\t\tRecipient : Device\n"); 699*988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 700*988365a2STom Rix USB_REQ_RECIPIENT_INTERFACE) 701*988365a2STom Rix serial_printf("\t\tRecipient : Interface\n"); 702*988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 703*988365a2STom Rix USB_REQ_RECIPIENT_ENDPOINT) 704*988365a2STom Rix serial_printf("\t\tRecipient : Endpoint\n"); 705*988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 706*988365a2STom Rix USB_REQ_RECIPIENT_OTHER) 707*988365a2STom Rix serial_printf("\t\tRecipient : Other\n"); 708*988365a2STom Rix serial_printf("\tbRequest 0x%2.2x\n", r->bRequest); 709*988365a2STom Rix if (r->bRequest == USB_REQ_GET_STATUS) 710*988365a2STom Rix serial_printf("\t\tGET_STATUS\n"); 711*988365a2STom Rix else if (r->bRequest == USB_REQ_SET_ADDRESS) 712*988365a2STom Rix serial_printf("\t\tSET_ADDRESS\n"); 713*988365a2STom Rix else if (r->bRequest == USB_REQ_SET_FEATURE) 714*988365a2STom Rix serial_printf("\t\tSET_FEATURE\n"); 715*988365a2STom Rix else if (r->bRequest == USB_REQ_GET_DESCRIPTOR) 716*988365a2STom Rix serial_printf("\t\tGET_DESCRIPTOR\n"); 717*988365a2STom Rix else if (r->bRequest == USB_REQ_SET_CONFIGURATION) 718*988365a2STom Rix serial_printf("\t\tSET_CONFIGURATION\n"); 719*988365a2STom Rix else if (r->bRequest == USB_REQ_SET_INTERFACE) 720*988365a2STom Rix serial_printf("\t\tUSB_REQ_SET_INTERFACE\n"); 721*988365a2STom Rix else 722*988365a2STom Rix serial_printf("\tUNKNOWN %d\n", r->bRequest); 723*988365a2STom Rix serial_printf("\twValue 0x%4.4x\n", r->wValue); 724*988365a2STom Rix if (r->bRequest == USB_REQ_GET_DESCRIPTOR) { 725*988365a2STom Rix switch (r->wValue >> 8) { 726*988365a2STom Rix case USB_DESCRIPTOR_TYPE_DEVICE: 727*988365a2STom Rix serial_printf("\tDEVICE\n"); 728*988365a2STom Rix break; 729*988365a2STom Rix case USB_DESCRIPTOR_TYPE_CONFIGURATION: 730*988365a2STom Rix serial_printf("\tCONFIGURATION\n"); 731*988365a2STom Rix break; 732*988365a2STom Rix case USB_DESCRIPTOR_TYPE_STRING: 733*988365a2STom Rix serial_printf("\tSTRING\n"); 734*988365a2STom Rix break; 735*988365a2STom Rix case USB_DESCRIPTOR_TYPE_INTERFACE: 736*988365a2STom Rix serial_printf("\tINTERFACE\n"); 737*988365a2STom Rix break; 738*988365a2STom Rix case USB_DESCRIPTOR_TYPE_ENDPOINT: 739*988365a2STom Rix serial_printf("\tENDPOINT\n"); 740*988365a2STom Rix break; 741*988365a2STom Rix case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER: 742*988365a2STom Rix serial_printf("\tDEVICE_QUALIFIER\n"); 743*988365a2STom Rix break; 744*988365a2STom Rix case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION: 745*988365a2STom Rix serial_printf("\tOTHER_SPEED_CONFIGURATION\n"); 746*988365a2STom Rix break; 747*988365a2STom Rix case USB_DESCRIPTOR_TYPE_INTERFACE_POWER: 748*988365a2STom Rix serial_printf("\tINTERFACE_POWER\n"); 749*988365a2STom Rix break; 750*988365a2STom Rix case USB_DESCRIPTOR_TYPE_HID: 751*988365a2STom Rix serial_printf("\tHID\n"); 752*988365a2STom Rix break; 753*988365a2STom Rix case USB_DESCRIPTOR_TYPE_REPORT: 754*988365a2STom Rix serial_printf("\tREPORT\n"); 755*988365a2STom Rix break; 756*988365a2STom Rix default: 757*988365a2STom Rix serial_printf("\tUNKNOWN TYPE\n"); 758*988365a2STom Rix break; 759*988365a2STom Rix } 760*988365a2STom Rix } 761*988365a2STom Rix serial_printf("\twIndex 0x%4.4x\n", r->wIndex); 762*988365a2STom Rix serial_printf("\twLength 0x%4.4x\n", r->wLength); 763*988365a2STom Rix } 764*988365a2STom Rix #else 765*988365a2STom Rix /* stubs */ 766*988365a2STom Rix #define print_urb(u) 767*988365a2STom Rix #define print_usb_device_request(r) 768*988365a2STom Rix #endif /* DEBUG */ 7692731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 770