Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. struct hid_class_descriptor {
  3.     u8_t   bDescriptorType;
  4.     u16_t  wDescriptorLength;
  5. } __attribute__ ((packed));
  6.  
  7. struct hid_descriptor {
  8.     u8_t   bLength;
  9.     u8_t   bDescriptorType;
  10.     u16_t  bcdHID;
  11.     u8_t   bCountryCode;
  12.     u8_t   bNumDescriptors;
  13.  
  14.         struct hid_class_descriptor desc[1];
  15. } __attribute__ ((packed));
  16.  
  17. void create_hid_mouse(udev_t *dev, endpoint_descr_t *en_d);
  18. void create_hid_keyboard(udev_t *dev, endpoint_descr_t *en_d);
  19.  
  20. bool init_hid(udev_t *dev)
  21. {
  22.     interface_descr_t              *interface;
  23.     struct hid_descriptor          *hds;
  24.     struct hid_class_descriptor    *hidclass;
  25.     u8_t *dptr = (u8_t*)dev->conf;
  26.  
  27.     int i=0, j=0;
  28.  
  29.     dbgprintf( "init hid device\n");
  30.  
  31.     dptr+= dev->conf->bLength;
  32.  
  33.   //  for(i = 0; i < dev->conf->bNumInterfaces; i++)
  34.   //  {
  35.         interface = (interface_descr_t*)dptr;
  36.         dptr+= interface->bLength;
  37.  
  38.         dbgprintf("interface           %d\n\n"
  39.                   "bLength             %d\n"
  40.                   "bDescriptorType     %d\n"
  41.                   "bInterfaceNumber    %d\n"
  42.                   "bAlternateSetting   %d\n"
  43.                   "bNumEndpoints       %d\n"
  44.                   "bInterfaceClass     %d\n"
  45.                   "bInterfaceSubClass  %d\n"
  46.                   "bInterfaceProtocol  %d\n"
  47.                   "iInterface          %d\n\n",
  48.                   i+1,
  49.                   interface->bLength,
  50.                   interface->bDescriptorType,
  51.                   interface->bInterfaceNumber,
  52.                   interface->bAlternateSetting,
  53.                   interface->bNumEndpoints,
  54.                   interface->bInterfaceClass,
  55.                   interface->bInterfaceSubClass,
  56.                   interface->bInterfaceProtocol,
  57.                   interface->iInterface);
  58.  
  59.         hds = (struct hid_descriptor*) dptr;
  60.  
  61.         dbgprintf("hid descriptor\n\n"
  62.                   "bLength             %d\n"
  63.                   "bDescriptorType     %d\n"
  64.                   "bcdHID              %x\n"
  65.                   "bCountryCode        %d\n"
  66.                   "bNumDescriptors     %d\n",
  67.                   hds->bLength,
  68.                   hds->bDescriptorType,
  69.                   hds->bcdHID,
  70.                   hds->bCountryCode,
  71.                   hds->bNumDescriptors);
  72.  
  73.         for(j=0; j < hds->bNumDescriptors; j++)
  74.         {
  75.             dbgprintf("bDescriptorType    %d\n"
  76.                       "wDescriptorLength  %d\n",
  77.                       hds->desc[j].bDescriptorType,
  78.                       hds->desc[j].wDescriptorLength);
  79.         };
  80.         dptr+= hds->bLength;
  81.  
  82.         endpoint_descr_t *ep;
  83.         ep = (endpoint_descr_t*)dptr;
  84.  
  85.         dbgprintf("\nendpoint\n\n"
  86.                   "bLength             %d\n"
  87.                   "bDescriptorType     %d\n"
  88.                   "bEndpointAddress    %d\n"
  89.                   "bmAttributes        %d\n"
  90.                   "wMaxPacketSize      %d\n"
  91.                   "bInterval           %d\n",
  92.                   ep->bLength, ep->bDescriptorType,
  93.                   ep->bEndpointAddress, ep->bmAttributes,
  94.                   ep->wMaxPacketSize, ep->bInterval);
  95.         dptr+= ep->bLength;
  96.  
  97.         switch(interface->bInterfaceProtocol)
  98.         {
  99.             case 1:
  100.                 create_hid_keyboard(dev, ep);
  101.                 break;
  102.  
  103.             case 2:
  104.                 create_hid_mouse(dev, ep);
  105.                 break;
  106.         }
  107.   //  }
  108.     return true;
  109. };
  110.  
  111.  
  112. bool mouse_handler(udev_t *dev, struct tag_request *rq)
  113. {
  114.     td_t   *td;
  115.     qh_t   *qh;
  116.  
  117.     td = rq->td_head;
  118.  
  119.     if( (td->status &0x7FF)==rq->size-1)
  120.     {
  121.         struct boot_packet *pkt;
  122.         pkt = (struct boot_packet *)rq->data;
  123.         SetMouseData(pkt->buttons, pkt->x, -pkt->y, -pkt->z, 0);
  124.     };
  125.     td->status = TD_CTRL_ACTIVE | TD_CTRL_IOC | dev->speed;
  126.     td->token ^= DATA1;
  127.  
  128.     u32_t efl = safe_cli();
  129.       list_add_tail(&rq->list, &dev->host->rq_list);
  130.       qh = dev->host->qh[rq->qnum];
  131.       qh->qelem = rq->td_head->dma;
  132.       mb();
  133.     safe_sti(efl);
  134.  
  135.     return true;
  136. };
  137.  
  138. typedef union
  139. {
  140.     uint16_t value;
  141.     struct
  142.     {
  143.         uint8_t code;
  144.         uint8_t ecode;
  145.     };
  146. }scancode_t;
  147.  
  148. static const uint16_t usb_keycode[256] =
  149. {
  150.   /*   0       1       2       3       4       5       6       7    */
  151.   /*   8       9       A       B       C       D       E       F    */
  152.  
  153.     0x0000, 0x0000, 0x0000, 0x0000, 0x001E, 0x0030, 0x002E, 0x0020,   /*  0x00  */
  154.     0x0012, 0x0021, 0x0022, 0x0023, 0x0017, 0x0024, 0x0025, 0x0026,
  155.  
  156.     0x0032, 0x0031, 0x0018, 0x0019, 0x0010, 0x0013, 0x001F, 0x0014,   /*  0x10  */
  157.     0x0016, 0x002F, 0x0011, 0x002D, 0x0015, 0x002C, 0x0002, 0x0003,
  158.  
  159.     0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B,   /*  0x20  */
  160.     0x001C, 0x0001, 0x000E, 0x000F, 0x0039, 0x000C, 0x000D, 0x001A,
  161.  
  162.     0x001B, 0x002B, 0x002B, 0x0027, 0x0028, 0x0029, 0x0033, 0x0034,   /*  0x30  */
  163.     0x0035, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
  164.  
  165.     0x0041, 0x0042, 0x0043, 0x0044, 0x0057, 0x0058, 0xE037, 0x0046,   /*  0x40  */
  166.     0x0000, 0xE052, 0xE047, 0xE049, 0xE053, 0xE04F, 0xE051, 0xE04D,
  167.  
  168.     0xE04B, 0xE050, 0xE048, 0x0045, 0xE035, 0x0037, 0x004A, 0x004E,   /*  0x50  */
  169.     0xE01C, 0x004F, 0x0050, 0x0051, 0x004B, 0x004C, 0x004D, 0x0047,
  170.  
  171.     0x0048, 0x0049, 0x0052, 0x0053, 0x0056, 0xE05D, 0xE05E, 0x0059,   /*  0x60  */
  172.     0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
  173.  
  174.     0x006C, 0x006D, 0x006E, 0x0076, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0x70  */
  175.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  176.  
  177.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x0000, 0x0073,   /*  0x80  */
  178.     0x0070, 0x007D, 0x0079, 0x007B, 0x005C, 0x0000, 0x0000, 0x0000,
  179.  
  180.     0x00F2, 0x00F1, 0x0078, 0x0077, 0x0076, 0x0000, 0x0000, 0x0000,   /*  0x90  */
  181.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  182.  
  183.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xA0  */
  184.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  185.  
  186.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xB0  */
  187.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  188.  
  189.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xC0  */
  190.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  191.  
  192.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xD0  */
  193.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  194.  
  195.     0x001D, 0x002A, 0x0038, 0xE05B, 0xE01D, 0x0036, 0xE038, 0xE05C,   /*  0xE0  */
  196.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  197.  
  198.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xFE0  */
  199.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  200.  
  201. };
  202.  
  203. static uint8_t  kbd_old[8];
  204.  
  205. bool keyboard_handler(udev_t *dev, struct tag_request *rq)
  206. {
  207.     td_t   *td;
  208.     qh_t   *qh;
  209.  
  210.     uint8_t *data;
  211.     int    i;
  212.  
  213.     td = rq->td_head;
  214.  
  215.     if( (td->status &0x7FF)==rq->size-1)
  216.     {
  217.         uint8_t action;
  218.         scancode_t scan;
  219.  
  220.         data = (uint8_t*)rq->data;
  221.  
  222.         action = data[0] ^ kbd_old[0];
  223.  
  224.         for (i = 0; i < 8; i++)
  225.         {
  226.             if(action & 1)
  227.             {
  228.                 scan.value = usb_keycode[i+224];
  229.  
  230.                 if(data[0]>>i & 1)
  231.                 {
  232.                     if(scan.ecode)
  233.                         SetKeyboardData(scan.ecode);
  234.                     SetKeyboardData(scan.code);
  235.                 }
  236.                 else
  237.                 {
  238.                     if(scan.ecode)
  239.                         SetKeyboardData(scan.ecode);
  240.                     SetKeyboardData(scan.code|0x80);
  241.                 };
  242.             }
  243.             action >>= 1;
  244.         }
  245.  
  246.  
  247.         for (i = 2; i < 8; i++)
  248.         {
  249.             if ((kbd_old[i] > 3) && (memscan(data+2, kbd_old[i], 6) == data+8))
  250.             {
  251.                 scan.value = usb_keycode[kbd_old[i]];
  252.  
  253.                 if (scan.value)
  254.                 {
  255.                     if(scan.ecode)
  256.                         SetKeyboardData(scan.ecode);
  257.                     SetKeyboardData(scan.code|0x80);
  258.                   //  input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
  259.                 }
  260.                 else
  261.                     dbgprintf("Unknown key (scancode %#x) released.\n", kbd_old[i]);
  262.             }
  263.  
  264.             if ((data[i] > 3) && (memscan(kbd_old+2, data[i], 6) == kbd_old+8))
  265.             {
  266.                 scan.value = usb_keycode[data[i]];
  267.  
  268.                 if (scan.value)
  269.                 {
  270.                     if(scan.ecode)
  271.                         SetKeyboardData(scan.ecode);
  272.                     SetKeyboardData(scan.code);
  273.                    //input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
  274.                 }
  275.                 else
  276.                     dbgprintf("Unknown key (scancode %#x) released.\n", data[i]);
  277.             }
  278.         }
  279.         memcpy(kbd_old, data, 8);
  280.     };
  281.  
  282.     td->status = TD_CTRL_ACTIVE | TD_CTRL_IOC | dev->speed;
  283.     td->token ^= DATA1;
  284.  
  285.     u32_t efl = safe_cli();
  286.       list_add_tail(&rq->list, &dev->host->rq_list);
  287.       qh = dev->host->qh[rq->qnum];
  288.       qh->qelem = rq->td_head->dma;
  289.       mb();
  290.     safe_sti(efl);
  291.  
  292.     return true;
  293. };
  294.  
  295. void create_hid_mouse(udev_t *dev, endpoint_descr_t *en_d)
  296. {
  297.     request_t *rq;
  298.     endp_t    enp;
  299.  
  300.     addr_t  address;
  301.     addr_t  size;
  302.     u32_t   toggle;
  303.  
  304.     qh_t   *qh;
  305.  
  306.     static  u16_t __attribute__((aligned(16)))
  307.             req_set_conf[4]  = {0x0900,0x0001,0x0000,0x0000};
  308.  
  309.     if( !ctrl_request(dev, req_set_conf, DOUT, 0, 0))
  310.         return;
  311.  
  312.     enp.address = en_d->bEndpointAddress;
  313.     enp.size    = en_d->wMaxPacketSize;
  314.     enp.toggle  = DATA0;
  315.  
  316.     rq = alloc_rq_buffer(dev, &enp, DIN, enp.size);
  317.  
  318.     rq->qnum = 6;
  319.     rq->handler = &mouse_handler;
  320.  
  321.     u32_t efl = safe_cli();
  322.       list_add_tail(&rq->list, &dev->host->rq_list);
  323.       qh = dev->host->qh[rq->qnum];
  324.       qh->qelem = rq->td_head->dma;
  325.       mb();
  326.     safe_sti(efl);
  327.  
  328.     dbgprintf("%s\n",__FUNCTION__);
  329. }
  330.  
  331. void create_hid_keyboard(udev_t *dev, endpoint_descr_t *en_d)
  332. {
  333.     request_t *rq;
  334.     endp_t    enp;
  335.  
  336.     addr_t  address;
  337.     addr_t  size;
  338.     u32_t   toggle;
  339.  
  340.     qh_t   *qh;
  341.  
  342.     static  u16_t __attribute__((aligned(16)))
  343.             req_set_conf[4]  = {0x0900,0x0001,0x0000,0x0000};
  344.  
  345.     if( !ctrl_request(dev, req_set_conf, DOUT, 0, 0))
  346.         return;
  347.  
  348.     enp.address = en_d->bEndpointAddress;
  349.     enp.size    = en_d->wMaxPacketSize;
  350.     enp.toggle  = DATA0;
  351.  
  352.     rq = alloc_rq_buffer(dev, &enp, DIN, enp.size);
  353.  
  354.     rq->qnum = 4;
  355.     rq->handler = &keyboard_handler;
  356.  
  357.     u32_t efl = safe_cli();
  358.       list_add_tail(&rq->list, &dev->host->rq_list);
  359.       qh = dev->host->qh[rq->qnum];
  360.       qh->qelem = rq->td_head->dma;
  361.       mb();
  362.     safe_sti(efl);
  363.  
  364.     dbgprintf("%s\n",__FUNCTION__);
  365. }
  366.  
  367. void *memscan(void *addr, int c, size_t size)
  368. {
  369.     if (!size)
  370.         return addr;
  371.     __asm__ __volatile__(
  372.         "repnz; scasb       \n\t"
  373.         "jnz 1f             \n\t"
  374.         "dec %%edi          \n\t"
  375.     "1:"
  376.         : "=D" (addr), "=c" (size)
  377.         : "D" (addr), "1" (size), "a" (c)
  378.         : "memory");
  379.     return addr;
  380. }
  381.  
  382.