|
|
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.