typedef struct { int available; /**< Count of available items in this slab. */ void *start; /**< Start address of first item. */ addr_t nextavail; /**< The index of next available item. */ addr_t dma; } slab_t; #define USB_CLASS_AUDIO 1 #define USB_CLASS_COMM 2 #define USB_CLASS_HID 3 #define USB_CLASS_PHYSICAL 5 #define USB_CLASS_STILL_IMAGE 6 #define USB_CLASS_PRINTER 7 #define USB_CLASS_MASS_STORAGE 8 #define USB_CLASS_HUB 9 #define USB_CLASS_CDC_DATA 0x0a #define USB_CLASS_CSCID 0x0b /* chip+ smart card */ #define USB_CLASS_CONTENT_SEC 0x0d /* content security */ #define USB_CLASS_VIDEO 0x0e #define USB_CLASS_WIRELESS_CONTROLLER 0xe0 #define USB_CLASS_MISC 0xef #define USB_CLASS_APP_SPEC 0xfe #define USB_CLASS_VENDOR_SPEC 0xff typedef struct { addr_t qlink; addr_t qelem; addr_t dma; u32_t r1; }qh_t __attribute__((aligned(16))); typedef struct { link_t link; addr_t iobase; u32_t *frame_base; count_t frame_number; addr_t frame_dma; qh_t *qh1; u32_t *data; addr_t data_dma; u32_t port_map; int numports; u32_t pciId; PCITAG PciTag; addr_t ioBase[6]; addr_t memBase[6]; size_t memSize[6]; u32_t memType[6]; }hc_t; typedef struct tag_td { /* Hardware fields */ addr_t link; u32_t status; u32_t token; addr_t buffer; /* Software fields */ addr_t dma; struct tag_td *bk; // struct list_head list; // int frame; /* for iso: what frame? */ // struct list_head fl_list; u32_t reserved[2]; } td_t __attribute__((aligned(16))); #define TD_CTRL_SPD (1 << 29) /* Short Packet Detect */ #define TD_CTRL_C_ERR_MASK (3 << 27) /* Error Counter bits */ #define TD_CTRL_C_ERR_SHIFT 27 #define TD_CTRL_LS (1 << 26) /* Low Speed Device */ #define TD_CTRL_IOS (1 << 25) /* Isochronous Select */ #define TD_CTRL_IOC (1 << 24) /* Interrupt on Complete */ #define TD_CTRL_ACTIVE (1 << 23) /* TD Active */ #define TD_CTRL_STALLED (1 << 22) /* TD Stalled */ #define TD_CTRL_DBUFERR (1 << 21) /* Data Buffer Error */ #define TD_CTRL_BABBLE (1 << 20) /* Babble Detected */ #define TD_CTRL_NAK (1 << 19) /* NAK Received */ #define TD_CTRL_CRCTIMEO (1 << 18) /* CRC/Time Out Error */ #define TD_CTRL_BITSTUFF (1 << 17) /* Bit Stuff Error */ #define TD_ANY_ERROR (TD_CTRL_STALLED | TD_CTRL_DBUFERR | \ TD_CTRL_BABBLE | TD_CTRL_CRCTIMEO | \ TD_CTRL_BITSTUFF) typedef struct __attribute__ ((packed)) { u8_t bLength; u8_t bDescriptorType; u16_t bcdUSB; u8_t bDeviceClass; u8_t bDeviceSubClass; u8_t bDeviceProtocol; u8_t bMaxPacketSize0; u16_t idVendor; u16_t idProduct; u16_t bcdDevice; u8_t iManufacturer; u8_t iProduct; u8_t iSerialNumber; u8_t bNumConfigurations; }dev_descr_t; typedef struct __attribute__ ((packed)) { u8_t bLength; u8_t bDescriptorType; u16_t wTotalLength; u8_t bNumInterfaces; u8_t bConfigurationValue; u8_t iConfiguration; u8_t bmAttributes; u8_t bMaxPower; }conf_descr_t; typedef struct __attribute__ ((packed)) { u8_t bLength; u8_t bDescriptorType; u8_t bInterfaceNumber; u8_t bAlternateSetting; u8_t bNumEndpoints; u8_t bInterfaceClass; u8_t bInterfaceSubClass; u8_t bInterfaceProtocol; u8_t iInterface; }interface_descr_t ; typedef struct __attribute__ ((packed)) { u8_t bLength; u8_t bDescriptorType; u8_t bEndpointAddress; u8_t bmAttributes; u16_t wMaxPacketSize; u8_t bInterval; /* NOTE: these two are _only_ in audio endpoints. */ /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */ u8_t bRefresh; u8_t bSynchAddress; }endpoint_descr_t; typedef struct { addr_t address; addr_t size; u32_t toggle; }endp_t; typedef struct __attribute__ ((packed)) { u8_t bRequestType; u8_t bRequest; u16_t wValue; u16_t wIndex; u16_t wLength; }ctrl_request_t; typedef struct { link_t link; u32_t id; hc_t *host; u32_t speed; addr_t addr; addr_t ep0_size; endp_t enp; u32_t status; int port; dev_descr_t dev_descr; conf_descr_t *conf; }udev_t; typedef struct tag_request { link_t link; td_t *td_head; td_t *td_tail; addr_t data; size_t size; udev_t *dev; u32_t type; Bool (*handler)(udev_t *dev, struct tag_request *rq); }request_t; #define DMA(val) GetPgAddr(val)|(((addr_t)(val))&0xFFF) #define TOKEN( size, toggle, ep, addr, pid) \ ( (((size)-1)<<21)|(toggle)|(((ep)&0xF)<<15)|((addr)<<8)|(pid)) Bool ctrl_request(udev_t *dev, void *req, u32_t dir, void *data, size_t req_size); Bool set_address(udev_t *dev); Bool init_device(udev_t *dev); Bool init_hid(udev_t *dev); struct boot_packet { u8_t buttons; i8_t x; i8_t y; i8_t z; }__attribute__ ((packed)); #define DOUT 0xE1 #define DIN 0x69 #define DATA0 (0<<19) #define DATA1 (1<<19)