Subversion Repositories Kolibri OS

Rev

Rev 1600 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. typedef struct list_head  list_t;
  3.  
  4.  
  5. typedef struct {
  6.   int     available;          /**< Count of available items in this slab. */
  7.   void   *start;              /**< Start address of first item. */
  8.   addr_t  nextavail;          /**< The index of next available item. */
  9.   addr_t  dma;
  10. } slab_t;
  11.  
  12.  
  13. #define USB_CLASS_AUDIO                    1
  14. #define USB_CLASS_COMM                     2
  15. #define USB_CLASS_HID                      3
  16. #define USB_CLASS_PHYSICAL                 5
  17. #define USB_CLASS_STILL_IMAGE              6
  18. #define USB_CLASS_PRINTER                  7
  19. #define USB_CLASS_MASS_STORAGE             8
  20. #define USB_CLASS_HUB                      9
  21. #define USB_CLASS_CDC_DATA              0x0a
  22. #define USB_CLASS_CSCID                 0x0b    /* chip+ smart card */
  23. #define USB_CLASS_CONTENT_SEC           0x0d    /* content security */
  24. #define USB_CLASS_VIDEO                 0x0e
  25. #define USB_CLASS_WIRELESS_CONTROLLER   0xe0
  26. #define USB_CLASS_MISC                  0xef
  27. #define USB_CLASS_APP_SPEC              0xfe
  28. #define USB_CLASS_VENDOR_SPEC           0xff
  29.  
  30.  
  31. typedef struct
  32. {
  33.     addr_t  qlink;
  34.     addr_t  qelem;
  35.  
  36.     addr_t  dma;
  37.     u32_t   r1;
  38.  
  39. }qh_t __attribute__((aligned(16)));
  40.  
  41.  
  42. #define UHCI_NUM_SKELQH 11
  43.  
  44. #define SKEL_ISO        1
  45. #define SKEL_ASYNC      9
  46.  
  47. /*
  48. #define     QH_1    0
  49. #define     QH_2    1
  50. #define     QH_4    2
  51. #define     QH_8    3
  52. #define     QH_16   4
  53. #define     QH_32   5
  54. #define     QH_64   6
  55. */
  56.  
  57.  
  58. typedef struct
  59. {
  60.     list_t  list;
  61.  
  62.     addr_t  iobase;
  63.  
  64.     u32_t   *frame_base;
  65.     count_t frame_number;
  66.     addr_t  frame_dma;
  67.  
  68.     qh_t   *qh[UHCI_NUM_SKELQH];
  69.  
  70.     u32_t  *data;
  71.     addr_t  data_dma;
  72.  
  73.     u32_t   port_map;
  74.  
  75.     int     numports;
  76.  
  77.     u32_t   pciId;
  78.     PCITAG  PciTag;
  79.     addr_t  ioBase[6];
  80.     addr_t  memBase[6];
  81.     size_t  memSize[6];
  82.     u32_t   memType[6];
  83.     u32_t   irq_line;
  84. }hc_t;
  85.  
  86. typedef struct tag_td
  87. {
  88.         /* Hardware fields */
  89.     addr_t   link;
  90.     u32_t    status;
  91.     u32_t    token;
  92.     addr_t   buffer;
  93.  
  94.         /* Software fields */
  95.     addr_t   dma;
  96.  
  97.     struct   tag_td *bk;
  98.  
  99.   //  struct list_head list;
  100.  
  101.   //  int frame;          /* for iso: what frame? */
  102.   //  struct list_head fl_list;
  103.  
  104.     u32_t    reserved[2];
  105. } td_t __attribute__((aligned(16)));
  106.  
  107. #define TD_CTRL_SPD         (1 << 29)   /* Short Packet Detect */
  108. #define TD_CTRL_C_ERR_MASK      (3 << 27)       /* Error Counter bits */
  109. #define TD_CTRL_C_ERR_SHIFT     27
  110. #define TD_CTRL_LS          (1 << 26)   /* Low Speed Device */
  111. #define TD_CTRL_IOS         (1 << 25)   /* Isochronous Select */
  112. #define TD_CTRL_IOC         (1 << 24)   /* Interrupt on Complete */
  113. #define TD_CTRL_ACTIVE          (1 << 23)       /* TD Active */
  114. #define TD_CTRL_STALLED         (1 << 22)       /* TD Stalled */
  115. #define TD_CTRL_DBUFERR         (1 << 21)       /* Data Buffer Error */
  116. #define TD_CTRL_BABBLE          (1 << 20)       /* Babble Detected */
  117. #define TD_CTRL_NAK         (1 << 19)   /* NAK Received */
  118. #define TD_CTRL_CRCTIMEO        (1 << 18)       /* CRC/Time Out Error */
  119. #define TD_CTRL_BITSTUFF    (1 << 17)   /* Bit Stuff Error */
  120.  
  121. #define TD_ANY_ERROR   (TD_CTRL_STALLED | TD_CTRL_DBUFERR  | \
  122.                         TD_CTRL_BABBLE  | TD_CTRL_CRCTIMEO | \
  123.                         TD_CTRL_BITSTUFF)
  124.  
  125. typedef struct __attribute__ ((packed))
  126. {
  127.     u8_t    bLength;
  128.     u8_t    bDescriptorType;
  129.     u16_t   bcdUSB;
  130.  
  131.     u8_t    bDeviceClass;
  132.     u8_t    bDeviceSubClass;
  133.     u8_t    bDeviceProtocol;
  134.     u8_t    bMaxPacketSize0;
  135.  
  136.     u16_t   idVendor;
  137.     u16_t   idProduct;
  138.     u16_t   bcdDevice;
  139.  
  140.     u8_t    iManufacturer;
  141.     u8_t    iProduct;
  142.     u8_t    iSerialNumber;
  143.     u8_t    bNumConfigurations;
  144. }dev_descr_t;
  145.  
  146. typedef struct  __attribute__ ((packed))
  147. {
  148.     u8_t    bLength;
  149.     u8_t    bDescriptorType;
  150.     u16_t   wTotalLength;
  151.     u8_t    bNumInterfaces;
  152.     u8_t    bConfigurationValue;
  153.     u8_t    iConfiguration;
  154.     u8_t    bmAttributes;
  155.     u8_t    bMaxPower;
  156. }conf_descr_t;
  157.  
  158. typedef struct __attribute__ ((packed))
  159. {
  160.     u8_t    bLength;
  161.     u8_t    bDescriptorType;
  162.     u8_t    bInterfaceNumber;
  163.     u8_t    bAlternateSetting;
  164.     u8_t    bNumEndpoints;
  165.     u8_t    bInterfaceClass;
  166.     u8_t    bInterfaceSubClass;
  167.     u8_t    bInterfaceProtocol;
  168.     u8_t    iInterface;
  169. }interface_descr_t ;
  170.  
  171. typedef struct __attribute__ ((packed))
  172. {
  173.     u8_t    bLength;
  174.     u8_t    bDescriptorType;
  175.  
  176.     u8_t    bEndpointAddress;
  177.     u8_t    bmAttributes;
  178.     u16_t   wMaxPacketSize;
  179.     u8_t    bInterval;
  180.  
  181.         /* NOTE:  these two are _only_ in audio endpoints. */
  182.         /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
  183.     u8_t    bRefresh;
  184.     u8_t    bSynchAddress;
  185. }endpoint_descr_t;
  186.  
  187. typedef struct
  188. {
  189.     addr_t  address;
  190.     addr_t  size;
  191.     u32_t   toggle;
  192.  
  193. }endp_t;
  194.  
  195. typedef struct __attribute__ ((packed))
  196. {
  197.     u8_t    bRequestType;
  198.     u8_t    bRequest;
  199.     u16_t   wValue;
  200.     u16_t   wIndex;
  201.     u16_t   wLength;
  202. }ctrl_request_t;
  203.  
  204.  
  205. typedef struct
  206. {
  207.     list_t  list;
  208.     u32_t   id;
  209.  
  210.     hc_t   *host;
  211.  
  212.     u32_t   speed;
  213.     addr_t  addr;
  214.  
  215.     addr_t  ep0_size;
  216.  
  217.     endp_t  enp;
  218.  
  219.     u32_t   status;
  220.     int     port;
  221.  
  222.     dev_descr_t   dev_descr;
  223.     conf_descr_t  *conf;
  224. }udev_t;
  225.  
  226. typedef struct   tag_request
  227. {
  228.     list_t        list;
  229.     td_t         *td_head;
  230.     td_t         *td_tail;
  231.     addr_t        data;
  232.     size_t        size;
  233.     udev_t       *dev;
  234.     u32_t         type;
  235.     int           qnum;
  236.     bool        (*handler)(udev_t *dev, struct   tag_request *rq);
  237. }request_t;
  238.  
  239.  
  240. #define  DMA(val) GetPgAddr(val)|(((addr_t)(val))&0xFFF)
  241.  
  242. #define  TOKEN( size, toggle, ep, addr, pid) \
  243.          ( (((size)-1)<<21)|(toggle)|(((ep)&0xF)<<15)|((addr)<<8)|(pid))
  244.  
  245. bool FindUSBControllers();
  246.  
  247. bool ctrl_request(udev_t *dev, void *req, u32_t dir,
  248.                   void *data, size_t req_size);
  249.  
  250. bool set_address(udev_t *dev);
  251.  
  252. bool init_device(udev_t *dev);
  253.  
  254. bool init_hid(udev_t *dev);
  255.  
  256. struct boot_packet
  257. {
  258.     u8_t  buttons;
  259.     char  x;
  260.     char  y;
  261.     char  z;
  262. }__attribute__ ((packed));
  263.  
  264. #define DOUT   0xE1
  265. #define DIN    0x69
  266.  
  267. #define DATA0  (0<<19)
  268. #define DATA1  (1<<19)
  269.  
  270.  
  271.  
  272. static inline u32_t __bsf(u32_t val)
  273. {
  274.     asm("bsf %1,%0"
  275.         :"=r" (val)
  276.         :"rm" (val));
  277.     return val;
  278. }
  279.  
  280.