kolibrios/drivers/usb/uhci/usb.h

276 lines
6.2 KiB
C

typedef struct list_head list_t;
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)));
#define UHCI_NUM_SKELQH 11
#define SKEL_ISO 1
#define SKEL_ASYNC 9
typedef struct
{
list_t list;
addr_t iobase;
struct dma_pool *td_pool;
u32_t *frame_base;
count_t frame_number;
addr_t frame_dma;
qh_t *qh[UHCI_NUM_SKELQH];
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];
u32_t irq_line;
list_t rq_list;
}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
{
list_t list;
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
{
list_t list;
td_t *td_head;
td_t *td_tail;
addr_t data;
size_t size;
udev_t *dev;
u32_t type;
int qnum;
evhandle_t evh;
kevent_t event;
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 FindUSBControllers();
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;
char x;
char y;
char z;
}__attribute__ ((packed));
#define DOUT 0xE1
#define DIN 0x69
#define DATA0 (0<<19)
#define DATA1 (1<<19)
static inline u32_t __bsf(u32_t val)
{
asm("bsf %1,%0"
:"=r" (val)
:"rm" (val));
return val;
}