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 213f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 214f9da0f89SVipin KUMAR #define USB_DT_QUAL 0x06 215f9da0f89SVipin KUMAR #endif 216f9da0f89SVipin KUMAR 2172731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HID (USB_TYPE_CLASS | 0x01) 2182731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_REPORT (USB_TYPE_CLASS | 0x02) 2192731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03) 2202731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HUB (USB_TYPE_CLASS | 0x09) 2212731b9a8SJean-Christophe PLAGNIOL-VILLARD 2222731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2232731b9a8SJean-Christophe PLAGNIOL-VILLARD * Descriptor sizes per descriptor type 2242731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2252731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_DEVICE_SIZE 18 2262731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_CONFIG_SIZE 9 2272731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_INTERFACE_SIZE 9 2282731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT_SIZE 7 2292731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ 2302731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HUB_NONVAR_SIZE 7 2312731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HID_SIZE 9 2322731b9a8SJean-Christophe PLAGNIOL-VILLARD 2332731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2342731b9a8SJean-Christophe PLAGNIOL-VILLARD * Endpoints 2352731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2362731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ 2372731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_DIR_MASK 0x80 2382731b9a8SJean-Christophe PLAGNIOL-VILLARD 2392731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ 2402731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_CONTROL 0 2412731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_ISOC 1 2422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_BULK 2 2432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_INT 3 2442731b9a8SJean-Christophe PLAGNIOL-VILLARD 2452731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2462731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB Packet IDs (PIDs) 2472731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2482731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_UNDEF_0 0xf0 2492731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_OUT 0xe1 2502731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_ACK 0xd2 2512731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA0 0xc3 2522731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_PING 0xb4 /* USB 2.0 */ 2532731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SOF 0xa5 2542731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_NYET 0x96 /* USB 2.0 */ 2552731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA2 0x87 /* USB 2.0 */ 2562731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SPLIT 0x78 /* USB 2.0 */ 2572731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_IN 0x69 2582731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_NAK 0x5a 2592731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA1 0x4b 2602731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_PREAMBLE 0x3c /* Token mode */ 2612731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_ERR 0x3c /* USB 2.0: handshake mode */ 2622731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SETUP 0x2d 2632731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_STALL 0x1e 2642731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_MDATA 0x0f /* USB 2.0 */ 2652731b9a8SJean-Christophe PLAGNIOL-VILLARD 2662731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2672731b9a8SJean-Christophe PLAGNIOL-VILLARD * Standard requests 2682731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2692731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_STATUS 0x00 2702731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_CLEAR_FEATURE 0x01 2712731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_FEATURE 0x03 2722731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_ADDRESS 0x05 2732731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_DESCRIPTOR 0x06 2742731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_DESCRIPTOR 0x07 2752731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_CONFIGURATION 0x08 2762731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_CONFIGURATION 0x09 2772731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_INTERFACE 0x0A 2782731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_INTERFACE 0x0B 2792731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SYNCH_FRAME 0x0C 2802731b9a8SJean-Christophe PLAGNIOL-VILLARD 2812731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_REQUESTS(x) (((unsigned int)x <= USB_REQ_SYNCH_FRAME) ? usbd_device_requests[x] : "UNKNOWN") 2822731b9a8SJean-Christophe PLAGNIOL-VILLARD 2832731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2842731b9a8SJean-Christophe PLAGNIOL-VILLARD * HID requests 2852731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2862731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_REPORT 0x01 2872731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_IDLE 0x02 2882731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_PROTOCOL 0x03 2892731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_REPORT 0x09 2902731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_IDLE 0x0A 2912731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_PROTOCOL 0x0B 2922731b9a8SJean-Christophe PLAGNIOL-VILLARD 2932731b9a8SJean-Christophe PLAGNIOL-VILLARD 2942731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2952731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB Spec Release number 2962731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2972731b9a8SJean-Christophe PLAGNIOL-VILLARD 298f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 299f9da0f89SVipin KUMAR #define USB_BCD_VERSION 0x0200 300f9da0f89SVipin KUMAR #else 3012731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_BCD_VERSION 0x0110 302f9da0f89SVipin KUMAR #endif 3032731b9a8SJean-Christophe PLAGNIOL-VILLARD 3042731b9a8SJean-Christophe PLAGNIOL-VILLARD 3052731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3062731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device Requests (c.f Table 9-2) 3072731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3082731b9a8SJean-Christophe PLAGNIOL-VILLARD 3092731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_DIRECTION_MASK 0x80 3102731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_MASK 0x60 3112731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_MASK 0x1f 3122731b9a8SJean-Christophe PLAGNIOL-VILLARD 3132731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_DEVICE2HOST 0x80 3142731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_HOST2DEVICE 0x00 3152731b9a8SJean-Christophe PLAGNIOL-VILLARD 3162731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_STANDARD 0x00 3172731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_CLASS 0x20 3182731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_VENDOR 0x40 3192731b9a8SJean-Christophe PLAGNIOL-VILLARD 3202731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_DEVICE 0x00 3212731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_INTERFACE 0x01 3222731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_ENDPOINT 0x02 3232731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_OTHER 0x03 3242731b9a8SJean-Christophe PLAGNIOL-VILLARD 3252731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3262731b9a8SJean-Christophe PLAGNIOL-VILLARD * get status bits 3272731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3282731b9a8SJean-Christophe PLAGNIOL-VILLARD 3292731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_SELFPOWERED 0x01 3302731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_REMOTEWAKEUP 0x02 3312731b9a8SJean-Christophe PLAGNIOL-VILLARD 3322731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_HALT 0x01 3332731b9a8SJean-Christophe PLAGNIOL-VILLARD 3342731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3352731b9a8SJean-Christophe PLAGNIOL-VILLARD * descriptor types 3362731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3372731b9a8SJean-Christophe PLAGNIOL-VILLARD 3382731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_DEVICE 0x01 3392731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02 3402731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_STRING 0x03 3412731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_INTERFACE 0x04 3422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05 3432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 0x06 3442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION 0x07 3452731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 0x08 3462731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_HID 0x21 3472731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_REPORT 0x22 3482731b9a8SJean-Christophe PLAGNIOL-VILLARD 3492731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_DESCRIPTORS(x) (((unsigned int)x <= USB_DESCRIPTOR_TYPE_INTERFACE_POWER) ? \ 3502731b9a8SJean-Christophe PLAGNIOL-VILLARD usbd_device_descriptors[x] : "UNKNOWN") 3512731b9a8SJean-Christophe PLAGNIOL-VILLARD 3522731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3532731b9a8SJean-Christophe PLAGNIOL-VILLARD * standard feature selectors 3542731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3552731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_HALT 0x00 3562731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DEVICE_REMOTE_WAKEUP 0x01 3572731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TEST_MODE 0x02 3582731b9a8SJean-Christophe PLAGNIOL-VILLARD 3592731b9a8SJean-Christophe PLAGNIOL-VILLARD 3602731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Requests 3612731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3622731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3632731b9a8SJean-Christophe PLAGNIOL-VILLARD 3642731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_request { 3652731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 bmRequestType; 3662731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 bRequest; 3672731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wValue; 3682731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wIndex; 3692731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wLength; 3702731b9a8SJean-Christophe PLAGNIOL-VILLARD } __attribute__ ((packed)); 3712731b9a8SJean-Christophe PLAGNIOL-VILLARD 3722731b9a8SJean-Christophe PLAGNIOL-VILLARD 3732731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Status 3742731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3752731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3762731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum urb_send_status { 3772731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_IN_PROGRESS, 3782731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_FINISHED_OK, 3792731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_FINISHED_ERROR, 3802731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_READY, 3812731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_OK, 3822731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_ERROR 3832731b9a8SJean-Christophe PLAGNIOL-VILLARD } urb_send_status_t; 3842731b9a8SJean-Christophe PLAGNIOL-VILLARD 3852731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3862731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device State (c.f USB Spec 2.0 Figure 9-1) 3872731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3882731b9a8SJean-Christophe PLAGNIOL-VILLARD * What state the usb device is in. 3892731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3902731b9a8SJean-Christophe PLAGNIOL-VILLARD * Note the state does not change if the device is suspended, we simply set a 3912731b9a8SJean-Christophe PLAGNIOL-VILLARD * flag to show that it is suspended. 3922731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3932731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3942731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_state { 3952731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_INIT, /* just initialized */ 3962731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_CREATED, /* just created */ 3972731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_ATTACHED, /* we are attached */ 3982731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_POWERED, /* we have seen power indication (electrical bus signal) */ 3992731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_DEFAULT, /* we been reset */ 4002731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_ADDRESSED, /* we have been addressed (in default configuration) */ 4012731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_CONFIGURED, /* we have seen a set configuration device command */ 4022731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_UNKNOWN, /* destroyed */ 4032731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_state_t; 4042731b9a8SJean-Christophe PLAGNIOL-VILLARD 4052731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_STATE(x) (((unsigned int)x <= STATE_UNKNOWN) ? usbd_device_states[x] : "UNKNOWN") 4062731b9a8SJean-Christophe PLAGNIOL-VILLARD 4072731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 4082731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device status 4092731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4102731b9a8SJean-Christophe PLAGNIOL-VILLARD * Overall state 4112731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4122731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_status { 4132731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_OPENING, /* we are currently opening */ 4142731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_OK, /* ok to use */ 4152731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_SUSPENDED, /* we are currently suspended */ 4162731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_CLOSING, /* we are currently closing */ 4172731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_status_t; 4182731b9a8SJean-Christophe PLAGNIOL-VILLARD 4192731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_STATUS(x) (((unsigned int)x <= USBD_CLOSING) ? usbd_device_status[x] : "UNKNOWN") 4202731b9a8SJean-Christophe PLAGNIOL-VILLARD 4212731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 4222731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device Events 4232731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4242731b9a8SJean-Christophe PLAGNIOL-VILLARD * These are defined in the USB Spec (c.f USB Spec 2.0 Figure 9-1). 4252731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4262731b9a8SJean-Christophe PLAGNIOL-VILLARD * There are additional events defined to handle some extra actions we need 4272731b9a8SJean-Christophe PLAGNIOL-VILLARD * to have handled. 4282731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4292731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4302731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_event { 4312731b9a8SJean-Christophe PLAGNIOL-VILLARD 4322731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_UNKNOWN, /* bi - unknown event */ 4332731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_INIT, /* bi - initialize */ 4342731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CREATE, /* bi - */ 4352731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HUB_CONFIGURED, /* bi - bus has been plugged int */ 4362731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_RESET, /* bi - hub has powered our port */ 4372731b9a8SJean-Christophe PLAGNIOL-VILLARD 4382731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_ADDRESS_ASSIGNED, /* ep0 - set address setup received */ 4392731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CONFIGURED, /* ep0 - set configure setup received */ 4402731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_SET_INTERFACE, /* ep0 - set interface setup received */ 4412731b9a8SJean-Christophe PLAGNIOL-VILLARD 4422731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_SET_FEATURE, /* ep0 - set feature setup received */ 4432731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CLEAR_FEATURE, /* ep0 - clear feature setup received */ 4442731b9a8SJean-Christophe PLAGNIOL-VILLARD 4452731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_DE_CONFIGURED, /* ep0 - set configure setup received for ?? */ 4462731b9a8SJean-Christophe PLAGNIOL-VILLARD 4472731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_BUS_INACTIVE, /* bi - bus in inactive (no SOF packets) */ 4482731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_BUS_ACTIVITY, /* bi - bus is active again */ 4492731b9a8SJean-Christophe PLAGNIOL-VILLARD 4502731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_POWER_INTERRUPTION, /* bi - hub has depowered our port */ 4512731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HUB_RESET, /* bi - bus has been unplugged */ 4522731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_DESTROY, /* bi - device instance should be destroyed */ 4532731b9a8SJean-Christophe PLAGNIOL-VILLARD 4542731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HOTPLUG, /* bi - a hotplug event has occured */ 4552731b9a8SJean-Christophe PLAGNIOL-VILLARD 4562731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_FUNCTION_PRIVATE, /* function - private */ 4572731b9a8SJean-Christophe PLAGNIOL-VILLARD 4582731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_event_t; 4592731b9a8SJean-Christophe PLAGNIOL-VILLARD 4602731b9a8SJean-Christophe PLAGNIOL-VILLARD 4612731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef struct urb_link { 4622731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link *next; 4632731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link *prev; 4642731b9a8SJean-Christophe PLAGNIOL-VILLARD } urb_link; 4652731b9a8SJean-Christophe PLAGNIOL-VILLARD 4662731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Data structure - for passing data around. 4672731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4682731b9a8SJean-Christophe PLAGNIOL-VILLARD * This is used for both sending and receiving data. 4692731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4702731b9a8SJean-Christophe PLAGNIOL-VILLARD * The callback function is used to let the function driver know when 4712731b9a8SJean-Christophe PLAGNIOL-VILLARD * transmitted data has been sent. 4722731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4732731b9a8SJean-Christophe PLAGNIOL-VILLARD * The callback function is set by the alloc_recv function when an urb is 4742731b9a8SJean-Christophe PLAGNIOL-VILLARD * allocated for receiving data for an endpoint and used to call the 4752731b9a8SJean-Christophe PLAGNIOL-VILLARD * function driver to inform it that data has arrived. 4762731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4772731b9a8SJean-Christophe PLAGNIOL-VILLARD 478*b2caefbbSShiraz Hashim /* in linux we'd malloc this, but in u-boot we prefer static data */ 479*b2caefbbSShiraz Hashim #define URB_BUF_SIZE 512 480*b2caefbbSShiraz Hashim 4812731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb { 4822731b9a8SJean-Christophe PLAGNIOL-VILLARD 4832731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance *endpoint; 4842731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance *device; 4852731b9a8SJean-Christophe PLAGNIOL-VILLARD 4862731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_request device_request; /* contents of received SETUP packet */ 4872731b9a8SJean-Christophe PLAGNIOL-VILLARD 4882731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link link; /* embedded struct for circular doubly linked list of urbs */ 4892731b9a8SJean-Christophe PLAGNIOL-VILLARD 4902731b9a8SJean-Christophe PLAGNIOL-VILLARD u8* buffer; 4912731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int buffer_length; 4922731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int actual_length; 4932731b9a8SJean-Christophe PLAGNIOL-VILLARD 4942731b9a8SJean-Christophe PLAGNIOL-VILLARD urb_send_status_t status; 4952731b9a8SJean-Christophe PLAGNIOL-VILLARD int data; 4962731b9a8SJean-Christophe PLAGNIOL-VILLARD 4972731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 buffer_data[URB_BUF_SIZE]; /* data received (OUT) or being sent (IN) */ 4982731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 4992731b9a8SJean-Christophe PLAGNIOL-VILLARD 5002731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Endpoint configuration 5012731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5022731b9a8SJean-Christophe PLAGNIOL-VILLARD * Per endpoint configuration data. Used to track which function driver owns 5032731b9a8SJean-Christophe PLAGNIOL-VILLARD * an endpoint. 5042731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5052731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 5062731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance { 5072731b9a8SJean-Christophe PLAGNIOL-VILLARD int endpoint_address; /* logical endpoint address */ 5082731b9a8SJean-Christophe PLAGNIOL-VILLARD 5092731b9a8SJean-Christophe PLAGNIOL-VILLARD /* control */ 5102731b9a8SJean-Christophe PLAGNIOL-VILLARD int status; /* halted */ 5112731b9a8SJean-Christophe PLAGNIOL-VILLARD int state; /* available for use by bus interface driver */ 5122731b9a8SJean-Christophe PLAGNIOL-VILLARD 5132731b9a8SJean-Christophe PLAGNIOL-VILLARD /* receive side */ 5142731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link rcv; /* received urbs */ 5152731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link rdy; /* empty urbs ready to receive */ 5162731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *rcv_urb; /* active urb */ 5172731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_attributes; /* copy of bmAttributes from endpoint descriptor */ 5182731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_packetSize; /* maximum packet size from endpoint descriptor */ 5192731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_transferSize; /* maximum transfer size from function driver */ 5202731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_queue; 5212731b9a8SJean-Christophe PLAGNIOL-VILLARD 5222731b9a8SJean-Christophe PLAGNIOL-VILLARD /* transmit side */ 5232731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link tx; /* urbs ready to transmit */ 5242731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link done; /* transmitted urbs */ 5252731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *tx_urb; /* active urb */ 5262731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_attributes; /* copy of bmAttributes from endpoint descriptor */ 5272731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_packetSize; /* maximum packet size from endpoint descriptor */ 5282731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_transferSize; /* maximum transfer size from function driver */ 5292731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_queue; 5302731b9a8SJean-Christophe PLAGNIOL-VILLARD 5312731b9a8SJean-Christophe PLAGNIOL-VILLARD int sent; /* data already sent */ 5322731b9a8SJean-Christophe PLAGNIOL-VILLARD int last; /* data sent in last packet XXX do we need this */ 5332731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5342731b9a8SJean-Christophe PLAGNIOL-VILLARD 5352731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance { 5362731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_descriptor *interface_descriptor; 5372731b9a8SJean-Christophe PLAGNIOL-VILLARD 5382731b9a8SJean-Christophe PLAGNIOL-VILLARD int endpoints; 5392731b9a8SJean-Christophe PLAGNIOL-VILLARD int *endpoint_transfersize_array; 5402731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_descriptor **endpoints_descriptor_array; 5412731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5422731b9a8SJean-Christophe PLAGNIOL-VILLARD 5432731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance { 5442731b9a8SJean-Christophe PLAGNIOL-VILLARD int alternates; 5452731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance *alternates_instance_array; 5462731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5472731b9a8SJean-Christophe PLAGNIOL-VILLARD 5482731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_instance { 5492731b9a8SJean-Christophe PLAGNIOL-VILLARD int interfaces; 5502731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_descriptor *configuration_descriptor; 5512731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance *interface_instance_array; 5522731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5532731b9a8SJean-Christophe PLAGNIOL-VILLARD 5542731b9a8SJean-Christophe PLAGNIOL-VILLARD 5552731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Device Instance 5562731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5572731b9a8SJean-Christophe PLAGNIOL-VILLARD * For each physical bus interface we create a logical device structure. This 5582731b9a8SJean-Christophe PLAGNIOL-VILLARD * tracks all of the required state to track the USB HOST's view of the device. 5592731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5602731b9a8SJean-Christophe PLAGNIOL-VILLARD * Keep track of the device configuration for a real physical bus interface, 5612731b9a8SJean-Christophe PLAGNIOL-VILLARD * this includes the bus interface, multiple function drivers, the current 5622731b9a8SJean-Christophe PLAGNIOL-VILLARD * configuration and the current state. 5632731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5642731b9a8SJean-Christophe PLAGNIOL-VILLARD * This will show: 5652731b9a8SJean-Christophe PLAGNIOL-VILLARD * the specific bus interface driver 5662731b9a8SJean-Christophe PLAGNIOL-VILLARD * the default endpoint 0 driver 5672731b9a8SJean-Christophe PLAGNIOL-VILLARD * the configured function driver 5682731b9a8SJean-Christophe PLAGNIOL-VILLARD * device state 5692731b9a8SJean-Christophe PLAGNIOL-VILLARD * device status 5702731b9a8SJean-Christophe PLAGNIOL-VILLARD * endpoint list 5712731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 5722731b9a8SJean-Christophe PLAGNIOL-VILLARD 5732731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance { 5742731b9a8SJean-Christophe PLAGNIOL-VILLARD 5752731b9a8SJean-Christophe PLAGNIOL-VILLARD /* generic */ 5762731b9a8SJean-Christophe PLAGNIOL-VILLARD char *name; 5772731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_descriptor *device_descriptor; /* per device descriptor */ 578f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 579f9da0f89SVipin KUMAR struct usb_qualifier_descriptor *qualifier_descriptor; 580f9da0f89SVipin KUMAR #endif 5812731b9a8SJean-Christophe PLAGNIOL-VILLARD 5822731b9a8SJean-Christophe PLAGNIOL-VILLARD void (*event) (struct usb_device_instance *device, usb_device_event_t event, int data); 5832731b9a8SJean-Christophe PLAGNIOL-VILLARD 5842731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Do cdc device specific control requests */ 5852731b9a8SJean-Christophe PLAGNIOL-VILLARD int (*cdc_recv_setup)(struct usb_device_request *request, struct urb *urb); 5862731b9a8SJean-Christophe PLAGNIOL-VILLARD 5872731b9a8SJean-Christophe PLAGNIOL-VILLARD /* bus interface */ 5882731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_bus_instance *bus; /* which bus interface driver */ 5892731b9a8SJean-Christophe PLAGNIOL-VILLARD 5902731b9a8SJean-Christophe PLAGNIOL-VILLARD /* configuration descriptors */ 5912731b9a8SJean-Christophe PLAGNIOL-VILLARD int configurations; 5922731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_instance *configuration_instance_array; 5932731b9a8SJean-Christophe PLAGNIOL-VILLARD 5942731b9a8SJean-Christophe PLAGNIOL-VILLARD /* device state */ 5952731b9a8SJean-Christophe PLAGNIOL-VILLARD usb_device_state_t device_state; /* current USB Device state */ 5962731b9a8SJean-Christophe PLAGNIOL-VILLARD usb_device_state_t device_previous_state; /* current USB Device state */ 5972731b9a8SJean-Christophe PLAGNIOL-VILLARD 5982731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 address; /* current address (zero is default) */ 5992731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 configuration; /* current show configuration (zero is default) */ 6002731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 interface; /* current interface (zero is default) */ 6012731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 alternate; /* alternate flag */ 6022731b9a8SJean-Christophe PLAGNIOL-VILLARD 6032731b9a8SJean-Christophe PLAGNIOL-VILLARD usb_device_status_t status; /* device status */ 6042731b9a8SJean-Christophe PLAGNIOL-VILLARD 6052731b9a8SJean-Christophe PLAGNIOL-VILLARD int urbs_queued; /* number of submitted urbs */ 6062731b9a8SJean-Christophe PLAGNIOL-VILLARD 6072731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Shouldn't need to make this atomic, all we need is a change indicator */ 6082731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned long usbd_rxtx_timestamp; 6092731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned long usbd_last_rxtx_timestamp; 6102731b9a8SJean-Christophe PLAGNIOL-VILLARD 6112731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 6122731b9a8SJean-Christophe PLAGNIOL-VILLARD 6132731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Bus Interface configuration structure 6142731b9a8SJean-Christophe PLAGNIOL-VILLARD * 6152731b9a8SJean-Christophe PLAGNIOL-VILLARD * This is allocated for each configured instance of a bus interface driver. 6162731b9a8SJean-Christophe PLAGNIOL-VILLARD * 6172731b9a8SJean-Christophe PLAGNIOL-VILLARD * The privdata pointer may be used by the bus interface driver to store private 6182731b9a8SJean-Christophe PLAGNIOL-VILLARD * per instance state information. 6192731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 6202731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_bus_instance { 6212731b9a8SJean-Christophe PLAGNIOL-VILLARD 6222731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance *device; 6232731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance *endpoint_array; /* array of available configured endpoints */ 6242731b9a8SJean-Christophe PLAGNIOL-VILLARD 6252731b9a8SJean-Christophe PLAGNIOL-VILLARD int max_endpoints; /* maximimum number of rx enpoints */ 6262731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned char maxpacketsize; 6272731b9a8SJean-Christophe PLAGNIOL-VILLARD 6282731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int serial_number; 6292731b9a8SJean-Christophe PLAGNIOL-VILLARD char *serial_number_str; 6302731b9a8SJean-Christophe PLAGNIOL-VILLARD void *privdata; /* private data for the bus interface */ 6312731b9a8SJean-Christophe PLAGNIOL-VILLARD 6322731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 6332731b9a8SJean-Christophe PLAGNIOL-VILLARD 6342731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_events[]; 6352731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_states[]; 6362731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_status[]; 6372731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_requests[]; 6382731b9a8SJean-Christophe PLAGNIOL-VILLARD extern char *usbd_device_descriptors[]; 6392731b9a8SJean-Christophe PLAGNIOL-VILLARD 6402731b9a8SJean-Christophe PLAGNIOL-VILLARD void urb_link_init (urb_link * ul); 6412731b9a8SJean-Christophe PLAGNIOL-VILLARD void urb_detach (struct urb *urb); 6422731b9a8SJean-Christophe PLAGNIOL-VILLARD urb_link *first_urb_link (urb_link * hd); 6432731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *first_urb (urb_link * hd); 6442731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *first_urb_detached (urb_link * hd); 6452731b9a8SJean-Christophe PLAGNIOL-VILLARD void urb_append (urb_link * hd, struct urb *urb); 6462731b9a8SJean-Christophe PLAGNIOL-VILLARD 6472731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *usbd_alloc_urb (struct usb_device_instance *device, struct usb_endpoint_instance *endpoint); 6482731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_dealloc_urb (struct urb *urb); 6492731b9a8SJean-Christophe PLAGNIOL-VILLARD 6502731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 6512731b9a8SJean-Christophe PLAGNIOL-VILLARD * usbd_device_event is used by bus interface drivers to tell the higher layers that 6522731b9a8SJean-Christophe PLAGNIOL-VILLARD * certain events have taken place. 6532731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 6542731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_device_event_irq (struct usb_device_instance *conf, usb_device_event_t, int); 6552731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_device_event (struct usb_device_instance *conf, usb_device_event_t, int); 6562731b9a8SJean-Christophe PLAGNIOL-VILLARD 6572731b9a8SJean-Christophe PLAGNIOL-VILLARD /* descriptors 6582731b9a8SJean-Christophe PLAGNIOL-VILLARD * 6592731b9a8SJean-Christophe PLAGNIOL-VILLARD * Various ways of finding descriptors based on the current device and any 6602731b9a8SJean-Christophe PLAGNIOL-VILLARD * possible configuration / interface / endpoint for it. 6612731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 6622731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_descriptor *usbd_device_configuration_descriptor (struct usb_device_instance *, int, int); 6632731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_function_instance *usbd_device_function_instance (struct usb_device_instance *, unsigned int); 6642731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance *usbd_device_interface_instance (struct usb_device_instance *, int, int, int); 6652731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance *usbd_device_alternate_instance (struct usb_device_instance *, int, int, int, int); 6662731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_descriptor *usbd_device_interface_descriptor (struct usb_device_instance *, int, int, int, int); 6672731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor_index (struct usb_device_instance *, int, int, int, int, int); 6682731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_class_descriptor *usbd_device_class_descriptor_index (struct usb_device_instance *, int, int, int, int, int); 6692731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_class_report_descriptor *usbd_device_class_report_descriptor_index( struct usb_device_instance *, int , int , int , int , int ); 6702731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_descriptor *usbd_device_endpoint_descriptor (struct usb_device_instance *, int, int, int, int, int); 6712731b9a8SJean-Christophe PLAGNIOL-VILLARD int usbd_device_endpoint_transfersize (struct usb_device_instance *, int, int, int, int, int); 6722731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_string_descriptor *usbd_get_string (u8); 673f9da0f89SVipin KUMAR struct usb_device_descriptor *usbd_device_device_descriptor(struct 674f9da0f89SVipin KUMAR usb_device_instance *, int); 6752731b9a8SJean-Christophe PLAGNIOL-VILLARD 676f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 677f9da0f89SVipin KUMAR /* 678f9da0f89SVipin KUMAR * is_usbd_high_speed routine needs to be defined by specific gadget driver 679f9da0f89SVipin KUMAR * It returns TRUE if device enumerates at High speed 680f9da0f89SVipin KUMAR * Retuns FALSE otherwise 681f9da0f89SVipin KUMAR */ 682f9da0f89SVipin KUMAR int is_usbd_high_speed(void); 683f9da0f89SVipin KUMAR #endif 6842731b9a8SJean-Christophe PLAGNIOL-VILLARD int usbd_endpoint_halted (struct usb_device_instance *device, int endpoint); 6852731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_rcv_complete(struct usb_endpoint_instance *endpoint, int len, int urb_bad); 6862731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_tx_complete (struct usb_endpoint_instance *endpoint); 6872731b9a8SJean-Christophe PLAGNIOL-VILLARD 688988365a2STom Rix /* These are macros used in debugging */ 689988365a2STom Rix #ifdef DEBUG 690988365a2STom Rix static inline void print_urb(struct urb *u) 691988365a2STom Rix { 692988365a2STom Rix serial_printf("urb %p\n", (u)); 693988365a2STom Rix serial_printf("\tendpoint %p\n", u->endpoint); 694988365a2STom Rix serial_printf("\tdevice %p\n", u->device); 695988365a2STom Rix serial_printf("\tbuffer %p\n", u->buffer); 696988365a2STom Rix serial_printf("\tbuffer_length %d\n", u->buffer_length); 697988365a2STom Rix serial_printf("\tactual_length %d\n", u->actual_length); 698988365a2STom Rix serial_printf("\tstatus %d\n", u->status); 699988365a2STom Rix serial_printf("\tdata %d\n", u->data); 700988365a2STom Rix } 701988365a2STom Rix 702988365a2STom Rix static inline void print_usb_device_request(struct usb_device_request *r) 703988365a2STom Rix { 704988365a2STom Rix serial_printf("usb request\n"); 705988365a2STom Rix serial_printf("\tbmRequestType 0x%2.2x\n", r->bmRequestType); 706988365a2STom Rix if ((r->bmRequestType & USB_REQ_DIRECTION_MASK) == 0) 707988365a2STom Rix serial_printf("\t\tDirection : To device\n"); 708988365a2STom Rix else 709988365a2STom Rix serial_printf("\t\tDirection : To host\n"); 710988365a2STom Rix if ((r->bmRequestType & USB_TYPE_STANDARD) == USB_TYPE_STANDARD) 711988365a2STom Rix serial_printf("\t\tType : Standard\n"); 712988365a2STom Rix if ((r->bmRequestType & USB_TYPE_CLASS) == USB_TYPE_CLASS) 713988365a2STom Rix serial_printf("\t\tType : Standard\n"); 714988365a2STom Rix if ((r->bmRequestType & USB_TYPE_VENDOR) == USB_TYPE_VENDOR) 715988365a2STom Rix serial_printf("\t\tType : Standard\n"); 716988365a2STom Rix if ((r->bmRequestType & USB_TYPE_RESERVED) == USB_TYPE_RESERVED) 717988365a2STom Rix serial_printf("\t\tType : Standard\n"); 718988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 719988365a2STom Rix USB_REQ_RECIPIENT_DEVICE) 720988365a2STom Rix serial_printf("\t\tRecipient : Device\n"); 721988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 722988365a2STom Rix USB_REQ_RECIPIENT_INTERFACE) 723988365a2STom Rix serial_printf("\t\tRecipient : Interface\n"); 724988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 725988365a2STom Rix USB_REQ_RECIPIENT_ENDPOINT) 726988365a2STom Rix serial_printf("\t\tRecipient : Endpoint\n"); 727988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 728988365a2STom Rix USB_REQ_RECIPIENT_OTHER) 729988365a2STom Rix serial_printf("\t\tRecipient : Other\n"); 730988365a2STom Rix serial_printf("\tbRequest 0x%2.2x\n", r->bRequest); 731988365a2STom Rix if (r->bRequest == USB_REQ_GET_STATUS) 732988365a2STom Rix serial_printf("\t\tGET_STATUS\n"); 733988365a2STom Rix else if (r->bRequest == USB_REQ_SET_ADDRESS) 734988365a2STom Rix serial_printf("\t\tSET_ADDRESS\n"); 735988365a2STom Rix else if (r->bRequest == USB_REQ_SET_FEATURE) 736988365a2STom Rix serial_printf("\t\tSET_FEATURE\n"); 737988365a2STom Rix else if (r->bRequest == USB_REQ_GET_DESCRIPTOR) 738988365a2STom Rix serial_printf("\t\tGET_DESCRIPTOR\n"); 739988365a2STom Rix else if (r->bRequest == USB_REQ_SET_CONFIGURATION) 740988365a2STom Rix serial_printf("\t\tSET_CONFIGURATION\n"); 741988365a2STom Rix else if (r->bRequest == USB_REQ_SET_INTERFACE) 742988365a2STom Rix serial_printf("\t\tUSB_REQ_SET_INTERFACE\n"); 743988365a2STom Rix else 744988365a2STom Rix serial_printf("\tUNKNOWN %d\n", r->bRequest); 745988365a2STom Rix serial_printf("\twValue 0x%4.4x\n", r->wValue); 746988365a2STom Rix if (r->bRequest == USB_REQ_GET_DESCRIPTOR) { 747988365a2STom Rix switch (r->wValue >> 8) { 748988365a2STom Rix case USB_DESCRIPTOR_TYPE_DEVICE: 749988365a2STom Rix serial_printf("\tDEVICE\n"); 750988365a2STom Rix break; 751988365a2STom Rix case USB_DESCRIPTOR_TYPE_CONFIGURATION: 752988365a2STom Rix serial_printf("\tCONFIGURATION\n"); 753988365a2STom Rix break; 754988365a2STom Rix case USB_DESCRIPTOR_TYPE_STRING: 755988365a2STom Rix serial_printf("\tSTRING\n"); 756988365a2STom Rix break; 757988365a2STom Rix case USB_DESCRIPTOR_TYPE_INTERFACE: 758988365a2STom Rix serial_printf("\tINTERFACE\n"); 759988365a2STom Rix break; 760988365a2STom Rix case USB_DESCRIPTOR_TYPE_ENDPOINT: 761988365a2STom Rix serial_printf("\tENDPOINT\n"); 762988365a2STom Rix break; 763988365a2STom Rix case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER: 764988365a2STom Rix serial_printf("\tDEVICE_QUALIFIER\n"); 765988365a2STom Rix break; 766988365a2STom Rix case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION: 767988365a2STom Rix serial_printf("\tOTHER_SPEED_CONFIGURATION\n"); 768988365a2STom Rix break; 769988365a2STom Rix case USB_DESCRIPTOR_TYPE_INTERFACE_POWER: 770988365a2STom Rix serial_printf("\tINTERFACE_POWER\n"); 771988365a2STom Rix break; 772988365a2STom Rix case USB_DESCRIPTOR_TYPE_HID: 773988365a2STom Rix serial_printf("\tHID\n"); 774988365a2STom Rix break; 775988365a2STom Rix case USB_DESCRIPTOR_TYPE_REPORT: 776988365a2STom Rix serial_printf("\tREPORT\n"); 777988365a2STom Rix break; 778988365a2STom Rix default: 779988365a2STom Rix serial_printf("\tUNKNOWN TYPE\n"); 780988365a2STom Rix break; 781988365a2STom Rix } 782988365a2STom Rix } 783988365a2STom Rix serial_printf("\twIndex 0x%4.4x\n", r->wIndex); 784988365a2STom Rix serial_printf("\twLength 0x%4.4x\n", r->wLength); 785988365a2STom Rix } 786988365a2STom Rix #else 787988365a2STom Rix /* stubs */ 788988365a2STom Rix #define print_urb(u) 789988365a2STom Rix #define print_usb_device_request(r) 790988365a2STom Rix #endif /* DEBUG */ 7912731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 792