Subversion Repositories Kolibri OS

Rev

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