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 * 151a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 162731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 172731b9a8SJean-Christophe PLAGNIOL-VILLARD 182731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef __USBDCORE_H__ 192731b9a8SJean-Christophe PLAGNIOL-VILLARD #define __USBDCORE_H__ 202731b9a8SJean-Christophe PLAGNIOL-VILLARD 212731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 222731b9a8SJean-Christophe PLAGNIOL-VILLARD #include "usbdescriptors.h" 232731b9a8SJean-Christophe PLAGNIOL-VILLARD 242731b9a8SJean-Christophe PLAGNIOL-VILLARD 252731b9a8SJean-Christophe PLAGNIOL-VILLARD #define MAX_URBS_QUEUED 5 262731b9a8SJean-Christophe PLAGNIOL-VILLARD 272731b9a8SJean-Christophe PLAGNIOL-VILLARD 282731b9a8SJean-Christophe PLAGNIOL-VILLARD #if 1 292731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usberr(fmt,args...) serial_printf("ERROR: %s(), %d: "fmt"\n",__FUNCTION__,__LINE__,##args) 302731b9a8SJean-Christophe PLAGNIOL-VILLARD #else 312731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usberr(fmt,args...) do{}while(0) 322731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 332731b9a8SJean-Christophe PLAGNIOL-VILLARD 342731b9a8SJean-Christophe PLAGNIOL-VILLARD #if 0 352731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbdbg(fmt,args...) serial_printf("debug: %s(), %d: "fmt"\n",__FUNCTION__,__LINE__,##args) 362731b9a8SJean-Christophe PLAGNIOL-VILLARD #else 372731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbdbg(fmt,args...) do{}while(0) 382731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 392731b9a8SJean-Christophe PLAGNIOL-VILLARD 402731b9a8SJean-Christophe PLAGNIOL-VILLARD #if 0 412731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbinfo(fmt,args...) serial_printf("info: %s(), %d: "fmt"\n",__FUNCTION__,__LINE__,##args) 422731b9a8SJean-Christophe PLAGNIOL-VILLARD #else 432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define usbinfo(fmt,args...) do{}while(0) 442731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 452731b9a8SJean-Christophe PLAGNIOL-VILLARD 462731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef le16_to_cpu 472731b9a8SJean-Christophe PLAGNIOL-VILLARD #define le16_to_cpu(x) (x) 482731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 492731b9a8SJean-Christophe PLAGNIOL-VILLARD 502731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef inb 512731b9a8SJean-Christophe PLAGNIOL-VILLARD #define inb(p) (*(volatile u8*)(p)) 522731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 532731b9a8SJean-Christophe PLAGNIOL-VILLARD 542731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outb 552731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outb(val,p) (*(volatile u8*)(p) = (val)) 562731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 572731b9a8SJean-Christophe PLAGNIOL-VILLARD 582731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef inw 592731b9a8SJean-Christophe PLAGNIOL-VILLARD #define inw(p) (*(volatile u16*)(p)) 602731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 612731b9a8SJean-Christophe PLAGNIOL-VILLARD 622731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outw 632731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outw(val,p) (*(volatile u16*)(p) = (val)) 642731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 652731b9a8SJean-Christophe PLAGNIOL-VILLARD 662731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef inl 672731b9a8SJean-Christophe PLAGNIOL-VILLARD #define inl(p) (*(volatile u32*)(p)) 682731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 692731b9a8SJean-Christophe PLAGNIOL-VILLARD 702731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outl 712731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outl(val,p) (*(volatile u32*)(p) = (val)) 722731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 732731b9a8SJean-Christophe PLAGNIOL-VILLARD 742731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef insw 752731b9a8SJean-Christophe PLAGNIOL-VILLARD #define insw(p,to,len) mmio_insw(p,to,len) 762731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 772731b9a8SJean-Christophe PLAGNIOL-VILLARD 782731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef outsw 792731b9a8SJean-Christophe PLAGNIOL-VILLARD #define outsw(p,from,len) mmio_outsw(p,from,len) 802731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 812731b9a8SJean-Christophe PLAGNIOL-VILLARD 822731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef insb 832731b9a8SJean-Christophe PLAGNIOL-VILLARD #define insb(p,to,len) mmio_insb(p,to,len) 842731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 852731b9a8SJean-Christophe PLAGNIOL-VILLARD 862731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef mmio_insw 872731b9a8SJean-Christophe PLAGNIOL-VILLARD #define mmio_insw(r,b,l) ({ int __i ; \ 882731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 *__b2; \ 892731b9a8SJean-Christophe PLAGNIOL-VILLARD __b2 = (u16 *) b; \ 902731b9a8SJean-Christophe PLAGNIOL-VILLARD for (__i = 0; __i < l; __i++) { \ 912731b9a8SJean-Christophe PLAGNIOL-VILLARD *(__b2 + __i) = inw(r); \ 922731b9a8SJean-Christophe PLAGNIOL-VILLARD }; \ 932731b9a8SJean-Christophe PLAGNIOL-VILLARD }) 942731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 952731b9a8SJean-Christophe PLAGNIOL-VILLARD 962731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef mmio_outsw 972731b9a8SJean-Christophe PLAGNIOL-VILLARD #define mmio_outsw(r,b,l) ({ int __i; \ 982731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 *__b2; \ 992731b9a8SJean-Christophe PLAGNIOL-VILLARD __b2 = (u16 *) b; \ 1002731b9a8SJean-Christophe PLAGNIOL-VILLARD for (__i = 0; __i < l; __i++) { \ 1012731b9a8SJean-Christophe PLAGNIOL-VILLARD outw( *(__b2 + __i), r); \ 1022731b9a8SJean-Christophe PLAGNIOL-VILLARD } \ 1032731b9a8SJean-Christophe PLAGNIOL-VILLARD }) 1042731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 1052731b9a8SJean-Christophe PLAGNIOL-VILLARD 1062731b9a8SJean-Christophe PLAGNIOL-VILLARD #ifndef mmio_insb 1072731b9a8SJean-Christophe PLAGNIOL-VILLARD #define mmio_insb(r,b,l) ({ int __i ; \ 1082731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 *__b2; \ 1092731b9a8SJean-Christophe PLAGNIOL-VILLARD __b2 = (u8 *) b; \ 1102731b9a8SJean-Christophe PLAGNIOL-VILLARD for (__i = 0; __i < l; __i++) { \ 1112731b9a8SJean-Christophe PLAGNIOL-VILLARD *(__b2 + __i) = inb(r); \ 1122731b9a8SJean-Christophe PLAGNIOL-VILLARD }; \ 1132731b9a8SJean-Christophe PLAGNIOL-VILLARD }) 1142731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 1152731b9a8SJean-Christophe PLAGNIOL-VILLARD 1162731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1172731b9a8SJean-Christophe PLAGNIOL-VILLARD * Structure member address manipulation macros. 1182731b9a8SJean-Christophe PLAGNIOL-VILLARD * These are used by client code (code using the urb_link routines), since 1192731b9a8SJean-Christophe PLAGNIOL-VILLARD * the urb_link structure is embedded in the client data structures. 1202731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1212731b9a8SJean-Christophe PLAGNIOL-VILLARD * Note: a macro offsetof equivalent to member_offset is defined in stddef.h 1222731b9a8SJean-Christophe PLAGNIOL-VILLARD * but this is kept here for the sake of portability. 1232731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1242731b9a8SJean-Christophe PLAGNIOL-VILLARD * p2surround returns a pointer to the surrounding structure given 1252731b9a8SJean-Christophe PLAGNIOL-VILLARD * type of the surrounding structure, the name memb of the structure 1262731b9a8SJean-Christophe PLAGNIOL-VILLARD * member pointed at by ptr. For example, if you have: 1272731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1282731b9a8SJean-Christophe PLAGNIOL-VILLARD * struct foo { 1292731b9a8SJean-Christophe PLAGNIOL-VILLARD * int x; 1302731b9a8SJean-Christophe PLAGNIOL-VILLARD * float y; 1312731b9a8SJean-Christophe PLAGNIOL-VILLARD * char z; 1322731b9a8SJean-Christophe PLAGNIOL-VILLARD * } thingy; 1332731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1342731b9a8SJean-Christophe PLAGNIOL-VILLARD * char *cp = &thingy.z; 1352731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1362731b9a8SJean-Christophe PLAGNIOL-VILLARD * then 1372731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1382731b9a8SJean-Christophe PLAGNIOL-VILLARD * &thingy == p2surround(struct foo, z, cp) 1392731b9a8SJean-Christophe PLAGNIOL-VILLARD * 1402731b9a8SJean-Christophe PLAGNIOL-VILLARD * Clear? 1412731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define _cv_(ptr) ((char*)(void*)(ptr)) 1432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define member_offset(type,memb) (_cv_(&(((type*)0)->memb))-(char*)0) 1442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define p2surround(type,memb,ptr) ((type*)(void*)(_cv_(ptr)-member_offset(type,memb))) 1452731b9a8SJean-Christophe PLAGNIOL-VILLARD 1462731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb; 1472731b9a8SJean-Christophe PLAGNIOL-VILLARD 1482731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance; 1492731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance; 1502731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_instance; 1512731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance; 1522731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_bus_instance; 1532731b9a8SJean-Christophe PLAGNIOL-VILLARD 1542731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1552731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device and/or Interface Class codes 1562731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1572731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ 1582731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_AUDIO 1 1592731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_COMM 2 1602731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_HID 3 1612731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_PHYSICAL 5 1622731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_PRINTER 7 1632731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_MASS_STORAGE 8 1642731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_HUB 9 1652731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_DATA 10 1662731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_APP_SPEC 0xfe 1672731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_CLASS_VENDOR_SPEC 0xff 1682731b9a8SJean-Christophe PLAGNIOL-VILLARD 1692731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1702731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB types 1712731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1722731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_STANDARD (0x00 << 5) 1732731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_CLASS (0x01 << 5) 1742731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_VENDOR (0x02 << 5) 1752731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TYPE_RESERVED (0x03 << 5) 1762731b9a8SJean-Christophe PLAGNIOL-VILLARD 1772731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1782731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB recipients 1792731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1802731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_DEVICE 0x00 1812731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_INTERFACE 0x01 1822731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_ENDPOINT 0x02 1832731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_RECIP_OTHER 0x03 1842731b9a8SJean-Christophe PLAGNIOL-VILLARD 1852731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1862731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB directions 1872731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1882731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DIR_OUT 0 1892731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DIR_IN 0x80 1902731b9a8SJean-Christophe PLAGNIOL-VILLARD 1912731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 1922731b9a8SJean-Christophe PLAGNIOL-VILLARD * Descriptor types 1932731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 1942731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_DEVICE 0x01 1952731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_CONFIG 0x02 1962731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_STRING 0x03 1972731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_INTERFACE 0x04 1982731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT 0x05 1992731b9a8SJean-Christophe PLAGNIOL-VILLARD 200f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 201f9da0f89SVipin KUMAR #define USB_DT_QUAL 0x06 202f9da0f89SVipin KUMAR #endif 203f9da0f89SVipin KUMAR 2042731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HID (USB_TYPE_CLASS | 0x01) 2052731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_REPORT (USB_TYPE_CLASS | 0x02) 2062731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03) 2072731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HUB (USB_TYPE_CLASS | 0x09) 2082731b9a8SJean-Christophe PLAGNIOL-VILLARD 2092731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2102731b9a8SJean-Christophe PLAGNIOL-VILLARD * Descriptor sizes per descriptor type 2112731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2122731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_DEVICE_SIZE 18 2132731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_CONFIG_SIZE 9 2142731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_INTERFACE_SIZE 9 2152731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT_SIZE 7 2162731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ 2172731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HUB_NONVAR_SIZE 7 2182731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DT_HID_SIZE 9 2192731b9a8SJean-Christophe PLAGNIOL-VILLARD 2202731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2212731b9a8SJean-Christophe PLAGNIOL-VILLARD * Endpoints 2222731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2232731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ 2242731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_DIR_MASK 0x80 2252731b9a8SJean-Christophe PLAGNIOL-VILLARD 2262731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ 2272731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_CONTROL 0 2282731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_ISOC 1 2292731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_BULK 2 2302731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_XFER_INT 3 2312731b9a8SJean-Christophe PLAGNIOL-VILLARD 2322731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2332731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB Packet IDs (PIDs) 2342731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2352731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_UNDEF_0 0xf0 2362731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_OUT 0xe1 2372731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_ACK 0xd2 2382731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA0 0xc3 2392731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_PING 0xb4 /* USB 2.0 */ 2402731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SOF 0xa5 2412731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_NYET 0x96 /* USB 2.0 */ 2422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA2 0x87 /* USB 2.0 */ 2432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SPLIT 0x78 /* USB 2.0 */ 2442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_IN 0x69 2452731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_NAK 0x5a 2462731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_DATA1 0x4b 2472731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_PREAMBLE 0x3c /* Token mode */ 2482731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_ERR 0x3c /* USB 2.0: handshake mode */ 2492731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_SETUP 0x2d 2502731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_STALL 0x1e 2512731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_PID_MDATA 0x0f /* USB 2.0 */ 2522731b9a8SJean-Christophe PLAGNIOL-VILLARD 2532731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2542731b9a8SJean-Christophe PLAGNIOL-VILLARD * Standard requests 2552731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2562731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_STATUS 0x00 2572731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_CLEAR_FEATURE 0x01 2582731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_FEATURE 0x03 2592731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_ADDRESS 0x05 2602731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_DESCRIPTOR 0x06 2612731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_DESCRIPTOR 0x07 2622731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_CONFIGURATION 0x08 2632731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_CONFIGURATION 0x09 2642731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_INTERFACE 0x0A 2652731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_INTERFACE 0x0B 2662731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SYNCH_FRAME 0x0C 2672731b9a8SJean-Christophe PLAGNIOL-VILLARD 2682731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_REQUESTS(x) (((unsigned int)x <= USB_REQ_SYNCH_FRAME) ? usbd_device_requests[x] : "UNKNOWN") 2692731b9a8SJean-Christophe PLAGNIOL-VILLARD 2702731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2712731b9a8SJean-Christophe PLAGNIOL-VILLARD * HID requests 2722731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2732731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_REPORT 0x01 2742731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_IDLE 0x02 2752731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_GET_PROTOCOL 0x03 2762731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_REPORT 0x09 2772731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_IDLE 0x0A 2782731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_SET_PROTOCOL 0x0B 2792731b9a8SJean-Christophe PLAGNIOL-VILLARD 2802731b9a8SJean-Christophe PLAGNIOL-VILLARD 2812731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2822731b9a8SJean-Christophe PLAGNIOL-VILLARD * USB Spec Release number 2832731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2842731b9a8SJean-Christophe PLAGNIOL-VILLARD 285f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 286f9da0f89SVipin KUMAR #define USB_BCD_VERSION 0x0200 287f9da0f89SVipin KUMAR #else 2882731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_BCD_VERSION 0x0110 289f9da0f89SVipin KUMAR #endif 2902731b9a8SJean-Christophe PLAGNIOL-VILLARD 2912731b9a8SJean-Christophe PLAGNIOL-VILLARD 2922731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 2932731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device Requests (c.f Table 9-2) 2942731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 2952731b9a8SJean-Christophe PLAGNIOL-VILLARD 2962731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_DIRECTION_MASK 0x80 2972731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_MASK 0x60 2982731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_MASK 0x1f 2992731b9a8SJean-Christophe PLAGNIOL-VILLARD 3002731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_DEVICE2HOST 0x80 3012731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_HOST2DEVICE 0x00 3022731b9a8SJean-Christophe PLAGNIOL-VILLARD 3032731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_STANDARD 0x00 3042731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_CLASS 0x20 3052731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_TYPE_VENDOR 0x40 3062731b9a8SJean-Christophe PLAGNIOL-VILLARD 3072731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_DEVICE 0x00 3082731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_INTERFACE 0x01 3092731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_ENDPOINT 0x02 3102731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_REQ_RECIPIENT_OTHER 0x03 3112731b9a8SJean-Christophe PLAGNIOL-VILLARD 3122731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3132731b9a8SJean-Christophe PLAGNIOL-VILLARD * get status bits 3142731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3152731b9a8SJean-Christophe PLAGNIOL-VILLARD 3162731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_SELFPOWERED 0x01 3172731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_REMOTEWAKEUP 0x02 3182731b9a8SJean-Christophe PLAGNIOL-VILLARD 3192731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_STATUS_HALT 0x01 3202731b9a8SJean-Christophe PLAGNIOL-VILLARD 3212731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3222731b9a8SJean-Christophe PLAGNIOL-VILLARD * descriptor types 3232731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3242731b9a8SJean-Christophe PLAGNIOL-VILLARD 3252731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_DEVICE 0x01 3262731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02 3272731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_STRING 0x03 3282731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_INTERFACE 0x04 3292731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05 3302731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER 0x06 3312731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION 0x07 3322731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_INTERFACE_POWER 0x08 3332731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_HID 0x21 3342731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DESCRIPTOR_TYPE_REPORT 0x22 3352731b9a8SJean-Christophe PLAGNIOL-VILLARD 3362731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_DESCRIPTORS(x) (((unsigned int)x <= USB_DESCRIPTOR_TYPE_INTERFACE_POWER) ? \ 3372731b9a8SJean-Christophe PLAGNIOL-VILLARD usbd_device_descriptors[x] : "UNKNOWN") 3382731b9a8SJean-Christophe PLAGNIOL-VILLARD 3392731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3402731b9a8SJean-Christophe PLAGNIOL-VILLARD * standard feature selectors 3412731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3422731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_ENDPOINT_HALT 0x00 3432731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_DEVICE_REMOTE_WAKEUP 0x01 3442731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USB_TEST_MODE 0x02 3452731b9a8SJean-Christophe PLAGNIOL-VILLARD 3462731b9a8SJean-Christophe PLAGNIOL-VILLARD 3472731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Requests 3482731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3492731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3502731b9a8SJean-Christophe PLAGNIOL-VILLARD 3512731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_request { 3522731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 bmRequestType; 3532731b9a8SJean-Christophe PLAGNIOL-VILLARD u8 bRequest; 3542731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wValue; 3552731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wIndex; 3562731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 wLength; 3572731b9a8SJean-Christophe PLAGNIOL-VILLARD } __attribute__ ((packed)); 3582731b9a8SJean-Christophe PLAGNIOL-VILLARD 3592731b9a8SJean-Christophe PLAGNIOL-VILLARD 3602731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Status 3612731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3622731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3632731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum urb_send_status { 3642731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_IN_PROGRESS, 3652731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_FINISHED_OK, 3662731b9a8SJean-Christophe PLAGNIOL-VILLARD SEND_FINISHED_ERROR, 3672731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_READY, 3682731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_OK, 3692731b9a8SJean-Christophe PLAGNIOL-VILLARD RECV_ERROR 3702731b9a8SJean-Christophe PLAGNIOL-VILLARD } urb_send_status_t; 3712731b9a8SJean-Christophe PLAGNIOL-VILLARD 3722731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3732731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device State (c.f USB Spec 2.0 Figure 9-1) 3742731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3752731b9a8SJean-Christophe PLAGNIOL-VILLARD * What state the usb device is in. 3762731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3772731b9a8SJean-Christophe PLAGNIOL-VILLARD * Note the state does not change if the device is suspended, we simply set a 3782731b9a8SJean-Christophe PLAGNIOL-VILLARD * flag to show that it is suspended. 3792731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3802731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3812731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_state { 3822731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_INIT, /* just initialized */ 3832731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_CREATED, /* just created */ 3842731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_ATTACHED, /* we are attached */ 3852731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_POWERED, /* we have seen power indication (electrical bus signal) */ 3862731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_DEFAULT, /* we been reset */ 3872731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_ADDRESSED, /* we have been addressed (in default configuration) */ 3882731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_CONFIGURED, /* we have seen a set configuration device command */ 3892731b9a8SJean-Christophe PLAGNIOL-VILLARD STATE_UNKNOWN, /* destroyed */ 3902731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_state_t; 3912731b9a8SJean-Christophe PLAGNIOL-VILLARD 3922731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_STATE(x) (((unsigned int)x <= STATE_UNKNOWN) ? usbd_device_states[x] : "UNKNOWN") 3932731b9a8SJean-Christophe PLAGNIOL-VILLARD 3942731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 3952731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device status 3962731b9a8SJean-Christophe PLAGNIOL-VILLARD * 3972731b9a8SJean-Christophe PLAGNIOL-VILLARD * Overall state 3982731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 3992731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_status { 4002731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_OPENING, /* we are currently opening */ 4012731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_OK, /* ok to use */ 4022731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_SUSPENDED, /* we are currently suspended */ 4032731b9a8SJean-Christophe PLAGNIOL-VILLARD USBD_CLOSING, /* we are currently closing */ 4042731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_status_t; 4052731b9a8SJean-Christophe PLAGNIOL-VILLARD 4062731b9a8SJean-Christophe PLAGNIOL-VILLARD #define USBD_DEVICE_STATUS(x) (((unsigned int)x <= USBD_CLOSING) ? usbd_device_status[x] : "UNKNOWN") 4072731b9a8SJean-Christophe PLAGNIOL-VILLARD 4082731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 4092731b9a8SJean-Christophe PLAGNIOL-VILLARD * Device Events 4102731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4112731b9a8SJean-Christophe PLAGNIOL-VILLARD * These are defined in the USB Spec (c.f USB Spec 2.0 Figure 9-1). 4122731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4132731b9a8SJean-Christophe PLAGNIOL-VILLARD * There are additional events defined to handle some extra actions we need 4142731b9a8SJean-Christophe PLAGNIOL-VILLARD * to have handled. 4152731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4162731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4172731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef enum usb_device_event { 4182731b9a8SJean-Christophe PLAGNIOL-VILLARD 4192731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_UNKNOWN, /* bi - unknown event */ 4202731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_INIT, /* bi - initialize */ 4212731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CREATE, /* bi - */ 4222731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HUB_CONFIGURED, /* bi - bus has been plugged int */ 4232731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_RESET, /* bi - hub has powered our port */ 4242731b9a8SJean-Christophe PLAGNIOL-VILLARD 4252731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_ADDRESS_ASSIGNED, /* ep0 - set address setup received */ 4262731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CONFIGURED, /* ep0 - set configure setup received */ 4272731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_SET_INTERFACE, /* ep0 - set interface setup received */ 4282731b9a8SJean-Christophe PLAGNIOL-VILLARD 4292731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_SET_FEATURE, /* ep0 - set feature setup received */ 4302731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_CLEAR_FEATURE, /* ep0 - clear feature setup received */ 4312731b9a8SJean-Christophe PLAGNIOL-VILLARD 4322731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_DE_CONFIGURED, /* ep0 - set configure setup received for ?? */ 4332731b9a8SJean-Christophe PLAGNIOL-VILLARD 4342731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_BUS_INACTIVE, /* bi - bus in inactive (no SOF packets) */ 4352731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_BUS_ACTIVITY, /* bi - bus is active again */ 4362731b9a8SJean-Christophe PLAGNIOL-VILLARD 4372731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_POWER_INTERRUPTION, /* bi - hub has depowered our port */ 4382731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_HUB_RESET, /* bi - bus has been unplugged */ 4392731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_DESTROY, /* bi - device instance should be destroyed */ 4402731b9a8SJean-Christophe PLAGNIOL-VILLARD 441*eae4b2b6SVagrant Cascadian DEVICE_HOTPLUG, /* bi - a hotplug event has occurred */ 4422731b9a8SJean-Christophe PLAGNIOL-VILLARD 4432731b9a8SJean-Christophe PLAGNIOL-VILLARD DEVICE_FUNCTION_PRIVATE, /* function - private */ 4442731b9a8SJean-Christophe PLAGNIOL-VILLARD 4452731b9a8SJean-Christophe PLAGNIOL-VILLARD } usb_device_event_t; 4462731b9a8SJean-Christophe PLAGNIOL-VILLARD 4472731b9a8SJean-Christophe PLAGNIOL-VILLARD 4482731b9a8SJean-Christophe PLAGNIOL-VILLARD typedef struct urb_link { 4492731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link *next; 4502731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link *prev; 4512731b9a8SJean-Christophe PLAGNIOL-VILLARD } urb_link; 4522731b9a8SJean-Christophe PLAGNIOL-VILLARD 4532731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Data structure - for passing data around. 4542731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4552731b9a8SJean-Christophe PLAGNIOL-VILLARD * This is used for both sending and receiving data. 4562731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4572731b9a8SJean-Christophe PLAGNIOL-VILLARD * The callback function is used to let the function driver know when 4582731b9a8SJean-Christophe PLAGNIOL-VILLARD * transmitted data has been sent. 4592731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4602731b9a8SJean-Christophe PLAGNIOL-VILLARD * The callback function is set by the alloc_recv function when an urb is 4612731b9a8SJean-Christophe PLAGNIOL-VILLARD * allocated for receiving data for an endpoint and used to call the 4622731b9a8SJean-Christophe PLAGNIOL-VILLARD * function driver to inform it that data has arrived. 4632731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4642731b9a8SJean-Christophe PLAGNIOL-VILLARD 465b2caefbbSShiraz Hashim /* in linux we'd malloc this, but in u-boot we prefer static data */ 466b2caefbbSShiraz Hashim #define URB_BUF_SIZE 512 467b2caefbbSShiraz Hashim 4682731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb { 4692731b9a8SJean-Christophe PLAGNIOL-VILLARD 4702731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance *endpoint; 4712731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance *device; 4722731b9a8SJean-Christophe PLAGNIOL-VILLARD 4732731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_request device_request; /* contents of received SETUP packet */ 4742731b9a8SJean-Christophe PLAGNIOL-VILLARD 4752731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link link; /* embedded struct for circular doubly linked list of urbs */ 4762731b9a8SJean-Christophe PLAGNIOL-VILLARD 4772731b9a8SJean-Christophe PLAGNIOL-VILLARD u8* buffer; 4782731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int buffer_length; 4792731b9a8SJean-Christophe PLAGNIOL-VILLARD unsigned int actual_length; 4802731b9a8SJean-Christophe PLAGNIOL-VILLARD 4812731b9a8SJean-Christophe PLAGNIOL-VILLARD urb_send_status_t status; 4822731b9a8SJean-Christophe PLAGNIOL-VILLARD int data; 4832731b9a8SJean-Christophe PLAGNIOL-VILLARD 4842731b9a8SJean-Christophe PLAGNIOL-VILLARD u16 buffer_data[URB_BUF_SIZE]; /* data received (OUT) or being sent (IN) */ 4852731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 4862731b9a8SJean-Christophe PLAGNIOL-VILLARD 4872731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Endpoint configuration 4882731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4892731b9a8SJean-Christophe PLAGNIOL-VILLARD * Per endpoint configuration data. Used to track which function driver owns 4902731b9a8SJean-Christophe PLAGNIOL-VILLARD * an endpoint. 4912731b9a8SJean-Christophe PLAGNIOL-VILLARD * 4922731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 4932731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_instance { 4942731b9a8SJean-Christophe PLAGNIOL-VILLARD int endpoint_address; /* logical endpoint address */ 4952731b9a8SJean-Christophe PLAGNIOL-VILLARD 4962731b9a8SJean-Christophe PLAGNIOL-VILLARD /* control */ 4972731b9a8SJean-Christophe PLAGNIOL-VILLARD int status; /* halted */ 4982731b9a8SJean-Christophe PLAGNIOL-VILLARD int state; /* available for use by bus interface driver */ 4992731b9a8SJean-Christophe PLAGNIOL-VILLARD 5002731b9a8SJean-Christophe PLAGNIOL-VILLARD /* receive side */ 5012731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link rcv; /* received urbs */ 5022731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link rdy; /* empty urbs ready to receive */ 5032731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *rcv_urb; /* active urb */ 5042731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_attributes; /* copy of bmAttributes from endpoint descriptor */ 5052731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_packetSize; /* maximum packet size from endpoint descriptor */ 5062731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_transferSize; /* maximum transfer size from function driver */ 5072731b9a8SJean-Christophe PLAGNIOL-VILLARD int rcv_queue; 5082731b9a8SJean-Christophe PLAGNIOL-VILLARD 5092731b9a8SJean-Christophe PLAGNIOL-VILLARD /* transmit side */ 5102731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link tx; /* urbs ready to transmit */ 5112731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb_link done; /* transmitted urbs */ 5122731b9a8SJean-Christophe PLAGNIOL-VILLARD struct urb *tx_urb; /* active urb */ 5132731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_attributes; /* copy of bmAttributes from endpoint descriptor */ 5142731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_packetSize; /* maximum packet size from endpoint descriptor */ 5152731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_transferSize; /* maximum transfer size from function driver */ 5162731b9a8SJean-Christophe PLAGNIOL-VILLARD int tx_queue; 5172731b9a8SJean-Christophe PLAGNIOL-VILLARD 5182731b9a8SJean-Christophe PLAGNIOL-VILLARD int sent; /* data already sent */ 5192731b9a8SJean-Christophe PLAGNIOL-VILLARD int last; /* data sent in last packet XXX do we need this */ 5202731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5212731b9a8SJean-Christophe PLAGNIOL-VILLARD 5222731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance { 5232731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_descriptor *interface_descriptor; 5242731b9a8SJean-Christophe PLAGNIOL-VILLARD 5252731b9a8SJean-Christophe PLAGNIOL-VILLARD int endpoints; 5262731b9a8SJean-Christophe PLAGNIOL-VILLARD int *endpoint_transfersize_array; 5272731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_endpoint_descriptor **endpoints_descriptor_array; 5282731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5292731b9a8SJean-Christophe PLAGNIOL-VILLARD 5302731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance { 5312731b9a8SJean-Christophe PLAGNIOL-VILLARD int alternates; 5322731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_alternate_instance *alternates_instance_array; 5332731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5342731b9a8SJean-Christophe PLAGNIOL-VILLARD 5352731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_instance { 5362731b9a8SJean-Christophe PLAGNIOL-VILLARD int interfaces; 5372731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_configuration_descriptor *configuration_descriptor; 5382731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_interface_instance *interface_instance_array; 5392731b9a8SJean-Christophe PLAGNIOL-VILLARD }; 5402731b9a8SJean-Christophe PLAGNIOL-VILLARD 5412731b9a8SJean-Christophe PLAGNIOL-VILLARD 5422731b9a8SJean-Christophe PLAGNIOL-VILLARD /* USB Device Instance 5432731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5442731b9a8SJean-Christophe PLAGNIOL-VILLARD * For each physical bus interface we create a logical device structure. This 5452731b9a8SJean-Christophe PLAGNIOL-VILLARD * tracks all of the required state to track the USB HOST's view of the device. 5462731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5472731b9a8SJean-Christophe PLAGNIOL-VILLARD * Keep track of the device configuration for a real physical bus interface, 5482731b9a8SJean-Christophe PLAGNIOL-VILLARD * this includes the bus interface, multiple function drivers, the current 5492731b9a8SJean-Christophe PLAGNIOL-VILLARD * configuration and the current state. 5502731b9a8SJean-Christophe PLAGNIOL-VILLARD * 5512731b9a8SJean-Christophe PLAGNIOL-VILLARD * This will show: 5522731b9a8SJean-Christophe PLAGNIOL-VILLARD * the specific bus interface driver 5532731b9a8SJean-Christophe PLAGNIOL-VILLARD * the default endpoint 0 driver 5542731b9a8SJean-Christophe PLAGNIOL-VILLARD * the configured function driver 5552731b9a8SJean-Christophe PLAGNIOL-VILLARD * device state 5562731b9a8SJean-Christophe PLAGNIOL-VILLARD * device status 5572731b9a8SJean-Christophe PLAGNIOL-VILLARD * endpoint list 5582731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 5592731b9a8SJean-Christophe PLAGNIOL-VILLARD 5602731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_instance { 5612731b9a8SJean-Christophe PLAGNIOL-VILLARD 5622731b9a8SJean-Christophe PLAGNIOL-VILLARD /* generic */ 5632731b9a8SJean-Christophe PLAGNIOL-VILLARD char *name; 5642731b9a8SJean-Christophe PLAGNIOL-VILLARD struct usb_device_descriptor *device_descriptor; /* per device descriptor */ 565f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 566f9da0f89SVipin KUMAR struct usb_qualifier_descriptor *qualifier_descriptor; 567f9da0f89SVipin KUMAR #endif 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); 660f9da0f89SVipin KUMAR struct usb_device_descriptor *usbd_device_device_descriptor(struct 661f9da0f89SVipin KUMAR usb_device_instance *, int); 6622731b9a8SJean-Christophe PLAGNIOL-VILLARD 663f9da0f89SVipin KUMAR #if defined(CONFIG_USBD_HS) 664f9da0f89SVipin KUMAR /* 665f9da0f89SVipin KUMAR * is_usbd_high_speed routine needs to be defined by specific gadget driver 666472d5460SYork Sun * It returns true if device enumerates at High speed 667472d5460SYork Sun * Retuns false otherwise 668f9da0f89SVipin KUMAR */ 669f9da0f89SVipin KUMAR int is_usbd_high_speed(void); 670f9da0f89SVipin KUMAR #endif 6712731b9a8SJean-Christophe PLAGNIOL-VILLARD int usbd_endpoint_halted (struct usb_device_instance *device, int endpoint); 6722731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_rcv_complete(struct usb_endpoint_instance *endpoint, int len, int urb_bad); 6732731b9a8SJean-Christophe PLAGNIOL-VILLARD void usbd_tx_complete (struct usb_endpoint_instance *endpoint); 6742731b9a8SJean-Christophe PLAGNIOL-VILLARD 675988365a2STom Rix /* These are macros used in debugging */ 676988365a2STom Rix #ifdef DEBUG 677988365a2STom Rix static inline void print_urb(struct urb *u) 678988365a2STom Rix { 679988365a2STom Rix serial_printf("urb %p\n", (u)); 680988365a2STom Rix serial_printf("\tendpoint %p\n", u->endpoint); 681988365a2STom Rix serial_printf("\tdevice %p\n", u->device); 682988365a2STom Rix serial_printf("\tbuffer %p\n", u->buffer); 683988365a2STom Rix serial_printf("\tbuffer_length %d\n", u->buffer_length); 684988365a2STom Rix serial_printf("\tactual_length %d\n", u->actual_length); 685988365a2STom Rix serial_printf("\tstatus %d\n", u->status); 686988365a2STom Rix serial_printf("\tdata %d\n", u->data); 687988365a2STom Rix } 688988365a2STom Rix 689988365a2STom Rix static inline void print_usb_device_request(struct usb_device_request *r) 690988365a2STom Rix { 691988365a2STom Rix serial_printf("usb request\n"); 692988365a2STom Rix serial_printf("\tbmRequestType 0x%2.2x\n", r->bmRequestType); 693988365a2STom Rix if ((r->bmRequestType & USB_REQ_DIRECTION_MASK) == 0) 694988365a2STom Rix serial_printf("\t\tDirection : To device\n"); 695988365a2STom Rix else 696988365a2STom Rix serial_printf("\t\tDirection : To host\n"); 697988365a2STom Rix if ((r->bmRequestType & USB_TYPE_STANDARD) == USB_TYPE_STANDARD) 698988365a2STom Rix serial_printf("\t\tType : Standard\n"); 699988365a2STom Rix if ((r->bmRequestType & USB_TYPE_CLASS) == USB_TYPE_CLASS) 700988365a2STom Rix serial_printf("\t\tType : Standard\n"); 701988365a2STom Rix if ((r->bmRequestType & USB_TYPE_VENDOR) == USB_TYPE_VENDOR) 702988365a2STom Rix serial_printf("\t\tType : Standard\n"); 703988365a2STom Rix if ((r->bmRequestType & USB_TYPE_RESERVED) == USB_TYPE_RESERVED) 704988365a2STom Rix serial_printf("\t\tType : Standard\n"); 705988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 706988365a2STom Rix USB_REQ_RECIPIENT_DEVICE) 707988365a2STom Rix serial_printf("\t\tRecipient : Device\n"); 708988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 709988365a2STom Rix USB_REQ_RECIPIENT_INTERFACE) 710988365a2STom Rix serial_printf("\t\tRecipient : Interface\n"); 711988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 712988365a2STom Rix USB_REQ_RECIPIENT_ENDPOINT) 713988365a2STom Rix serial_printf("\t\tRecipient : Endpoint\n"); 714988365a2STom Rix if ((r->bmRequestType & USB_REQ_RECIPIENT_MASK) == 715988365a2STom Rix USB_REQ_RECIPIENT_OTHER) 716988365a2STom Rix serial_printf("\t\tRecipient : Other\n"); 717988365a2STom Rix serial_printf("\tbRequest 0x%2.2x\n", r->bRequest); 718988365a2STom Rix if (r->bRequest == USB_REQ_GET_STATUS) 719988365a2STom Rix serial_printf("\t\tGET_STATUS\n"); 720988365a2STom Rix else if (r->bRequest == USB_REQ_SET_ADDRESS) 721988365a2STom Rix serial_printf("\t\tSET_ADDRESS\n"); 722988365a2STom Rix else if (r->bRequest == USB_REQ_SET_FEATURE) 723988365a2STom Rix serial_printf("\t\tSET_FEATURE\n"); 724988365a2STom Rix else if (r->bRequest == USB_REQ_GET_DESCRIPTOR) 725988365a2STom Rix serial_printf("\t\tGET_DESCRIPTOR\n"); 726988365a2STom Rix else if (r->bRequest == USB_REQ_SET_CONFIGURATION) 727988365a2STom Rix serial_printf("\t\tSET_CONFIGURATION\n"); 728988365a2STom Rix else if (r->bRequest == USB_REQ_SET_INTERFACE) 729988365a2STom Rix serial_printf("\t\tUSB_REQ_SET_INTERFACE\n"); 730988365a2STom Rix else 731988365a2STom Rix serial_printf("\tUNKNOWN %d\n", r->bRequest); 732988365a2STom Rix serial_printf("\twValue 0x%4.4x\n", r->wValue); 733988365a2STom Rix if (r->bRequest == USB_REQ_GET_DESCRIPTOR) { 734988365a2STom Rix switch (r->wValue >> 8) { 735988365a2STom Rix case USB_DESCRIPTOR_TYPE_DEVICE: 736988365a2STom Rix serial_printf("\tDEVICE\n"); 737988365a2STom Rix break; 738988365a2STom Rix case USB_DESCRIPTOR_TYPE_CONFIGURATION: 739988365a2STom Rix serial_printf("\tCONFIGURATION\n"); 740988365a2STom Rix break; 741988365a2STom Rix case USB_DESCRIPTOR_TYPE_STRING: 742988365a2STom Rix serial_printf("\tSTRING\n"); 743988365a2STom Rix break; 744988365a2STom Rix case USB_DESCRIPTOR_TYPE_INTERFACE: 745988365a2STom Rix serial_printf("\tINTERFACE\n"); 746988365a2STom Rix break; 747988365a2STom Rix case USB_DESCRIPTOR_TYPE_ENDPOINT: 748988365a2STom Rix serial_printf("\tENDPOINT\n"); 749988365a2STom Rix break; 750988365a2STom Rix case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER: 751988365a2STom Rix serial_printf("\tDEVICE_QUALIFIER\n"); 752988365a2STom Rix break; 753988365a2STom Rix case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION: 754988365a2STom Rix serial_printf("\tOTHER_SPEED_CONFIGURATION\n"); 755988365a2STom Rix break; 756988365a2STom Rix case USB_DESCRIPTOR_TYPE_INTERFACE_POWER: 757988365a2STom Rix serial_printf("\tINTERFACE_POWER\n"); 758988365a2STom Rix break; 759988365a2STom Rix case USB_DESCRIPTOR_TYPE_HID: 760988365a2STom Rix serial_printf("\tHID\n"); 761988365a2STom Rix break; 762988365a2STom Rix case USB_DESCRIPTOR_TYPE_REPORT: 763988365a2STom Rix serial_printf("\tREPORT\n"); 764988365a2STom Rix break; 765988365a2STom Rix default: 766988365a2STom Rix serial_printf("\tUNKNOWN TYPE\n"); 767988365a2STom Rix break; 768988365a2STom Rix } 769988365a2STom Rix } 770988365a2STom Rix serial_printf("\twIndex 0x%4.4x\n", r->wIndex); 771988365a2STom Rix serial_printf("\twLength 0x%4.4x\n", r->wLength); 772988365a2STom Rix } 773988365a2STom Rix #else 774988365a2STom Rix /* stubs */ 775988365a2STom Rix #define print_urb(u) 776988365a2STom Rix #define print_usb_device_request(r) 777988365a2STom Rix #endif /* DEBUG */ 7782731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 779