|
|
1.1 root 1: // USB functions and data.
2: #ifndef __USB_H
3: #define __USB_H
4:
5: // Local information for a usb controller.
6: struct usb_s {
7: u8 type;
8: u8 maxaddr;
9: u16 bdf;
10:
11: union {
12: struct {
13: u16 iobase;
14: void *qh;
15: } uhci;
16: struct {
17: struct ohci_regs *regs;
18: void *control_ed;
19: } ohci;
20: };
21: };
22:
23: #define USB_TYPE_UHCI 1
24: #define USB_TYPE_OHCI 2
25:
26: extern struct usb_s USBControllers[];
27:
28: struct usb_pipe {
29: u32 endp;
30: };
31:
32: #define USB_MAXADDR 127
33:
34: // usb.c
35: void usb_setup();
36: int configure_usb_device(struct usb_s *cntl, int lowspeed);
37: struct usb_ctrlrequest;
38: int send_default_control(u32 endp, const struct usb_ctrlrequest *req
39: , void *data);
40: struct usb_pipe *alloc_intr_pipe(u32 endp, int period);
41: int usb_poll_intr(struct usb_pipe *pipe, void *data);
42:
43:
44: /****************************************************************
45: * endpoint definition
46: ****************************************************************/
47:
48: static inline u32
49: mkendp(struct usb_s *cntl, u8 devaddr, u8 ep, u8 lowspeed, u8 maxsize)
50: {
51: u8 bus = cntl-USBControllers;
52: u8 size = __ffs(maxsize);
53: return (size<<25) | (lowspeed<<24) | (bus<<16) | (devaddr<<8) | ep;
54: }
55:
56: static inline u8 endp2ep(u32 endp) {
57: return endp;
58: }
59: static inline u8 endp2devaddr(u32 endp) {
60: return endp>>8;
61: }
62: static inline struct usb_s *endp2cntl(u32 endp) {
63: u8 bus = endp>>16;
64: return &USBControllers[bus];
65: }
66: static inline u8 endp2speed(u32 endp) {
67: return (endp>>24) & 1;
68: }
69: static inline u8 endp2maxsize(u32 endp) {
70: return 1 << (endp>>25);
71: }
72:
73:
74: /****************************************************************
75: * usb structs and flags
76: ****************************************************************/
77:
78: #define USB_PID_OUT 0xe1
79: #define USB_PID_IN 0x69
80: #define USB_PID_SETUP 0x2d
81:
82: #define USB_DIR_OUT 0 /* to device */
83: #define USB_DIR_IN 0x80 /* to host */
84:
85: #define USB_TYPE_MASK (0x03 << 5)
86: #define USB_TYPE_STANDARD (0x00 << 5)
87: #define USB_TYPE_CLASS (0x01 << 5)
88: #define USB_TYPE_VENDOR (0x02 << 5)
89: #define USB_TYPE_RESERVED (0x03 << 5)
90:
91: #define USB_RECIP_MASK 0x1f
92: #define USB_RECIP_DEVICE 0x00
93: #define USB_RECIP_INTERFACE 0x01
94: #define USB_RECIP_ENDPOINT 0x02
95: #define USB_RECIP_OTHER 0x03
96:
97: #define USB_REQ_GET_STATUS 0x00
98: #define USB_REQ_CLEAR_FEATURE 0x01
99: #define USB_REQ_SET_FEATURE 0x03
100: #define USB_REQ_SET_ADDRESS 0x05
101: #define USB_REQ_GET_DESCRIPTOR 0x06
102: #define USB_REQ_SET_DESCRIPTOR 0x07
103: #define USB_REQ_GET_CONFIGURATION 0x08
104: #define USB_REQ_SET_CONFIGURATION 0x09
105: #define USB_REQ_GET_INTERFACE 0x0A
106: #define USB_REQ_SET_INTERFACE 0x0B
107: #define USB_REQ_SYNCH_FRAME 0x0C
108:
109: struct usb_ctrlrequest {
110: u8 bRequestType;
111: u8 bRequest;
112: u16 wValue;
113: u16 wIndex;
114: u16 wLength;
115: } PACKED;
116:
117: #define USB_DT_DEVICE 0x01
118: #define USB_DT_CONFIG 0x02
119: #define USB_DT_STRING 0x03
120: #define USB_DT_INTERFACE 0x04
121: #define USB_DT_ENDPOINT 0x05
122: #define USB_DT_DEVICE_QUALIFIER 0x06
123: #define USB_DT_OTHER_SPEED_CONFIG 0x07
124:
125: struct usb_device_descriptor {
126: u8 bLength;
127: u8 bDescriptorType;
128:
129: u16 bcdUSB;
130: u8 bDeviceClass;
131: u8 bDeviceSubClass;
132: u8 bDeviceProtocol;
133: u8 bMaxPacketSize0;
134: u16 idVendor;
135: u16 idProduct;
136: u16 bcdDevice;
137: u8 iManufacturer;
138: u8 iProduct;
139: u8 iSerialNumber;
140: u8 bNumConfigurations;
141: } PACKED;
142:
143: #define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
144: #define USB_CLASS_AUDIO 1
145: #define USB_CLASS_COMM 2
146: #define USB_CLASS_HID 3
147: #define USB_CLASS_PHYSICAL 5
148: #define USB_CLASS_STILL_IMAGE 6
149: #define USB_CLASS_PRINTER 7
150: #define USB_CLASS_MASS_STORAGE 8
151: #define USB_CLASS_HUB 9
152:
153: struct usb_config_descriptor {
154: u8 bLength;
155: u8 bDescriptorType;
156:
157: u16 wTotalLength;
158: u8 bNumInterfaces;
159: u8 bConfigurationValue;
160: u8 iConfiguration;
161: u8 bmAttributes;
162: u8 bMaxPower;
163: } PACKED;
164:
165: struct usb_interface_descriptor {
166: u8 bLength;
167: u8 bDescriptorType;
168:
169: u8 bInterfaceNumber;
170: u8 bAlternateSetting;
171: u8 bNumEndpoints;
172: u8 bInterfaceClass;
173: u8 bInterfaceSubClass;
174: u8 bInterfaceProtocol;
175: u8 iInterface;
176: } PACKED;
177:
178: struct usb_endpoint_descriptor {
179: u8 bLength;
180: u8 bDescriptorType;
181:
182: u8 bEndpointAddress;
183: u8 bmAttributes;
184: u16 wMaxPacketSize;
185: u8 bInterval;
186: } PACKED;
187:
188: #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
189: #define USB_ENDPOINT_DIR_MASK 0x80
190:
191: #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
192: #define USB_ENDPOINT_XFER_CONTROL 0
193: #define USB_ENDPOINT_XFER_ISOC 1
194: #define USB_ENDPOINT_XFER_BULK 2
195: #define USB_ENDPOINT_XFER_INT 3
196: #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
197:
198: #endif // usb.h
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.