248 lines
5.7 KiB
C
248 lines
5.7 KiB
C
|
|
||
|
|
||
|
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)
|
||
|
|