Subversion Repositories Kolibri OS

Rev

Rev 1875 | Blame | Compare with Previous | 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.         memset(pkt,0, sizeof(*pkt));
  125.     };
  126.     td->status = TD_CTRL_ACTIVE | TD_CTRL_IOC | dev->speed;
  127.     td->token ^= DATA1;
  128.  
  129.     u32_t efl = safe_cli();
  130.       list_add_tail(&rq->list, &dev->host->rq_list);
  131.       qh = dev->host->qh[rq->qnum];
  132.       qh->qelem = rq->td_head->dma;
  133.       mb();
  134.     safe_sti(efl);
  135.  
  136.     return true;
  137. };
  138.  
  139. typedef union
  140. {
  141.     uint16_t value;
  142.     struct
  143.     {
  144.         uint8_t code;
  145.         uint8_t ecode;
  146.     };
  147. }scancode_t;
  148.  
  149. static const uint16_t usb_keycode[256] =
  150. {
  151.   /*   0       1       2       3       4       5       6       7    */
  152.   /*   8       9       A       B       C       D       E       F    */
  153.  
  154.     0x0000, 0x0000, 0x0000, 0x0000, 0x001E, 0x0030, 0x002E, 0x0020,   /*  0x00  */
  155.     0x0012, 0x0021, 0x0022, 0x0023, 0x0017, 0x0024, 0x0025, 0x0026,
  156.  
  157.     0x0032, 0x0031, 0x0018, 0x0019, 0x0010, 0x0013, 0x001F, 0x0014,   /*  0x10  */
  158.     0x0016, 0x002F, 0x0011, 0x002D, 0x0015, 0x002C, 0x0002, 0x0003,
  159.  
  160.     0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B,   /*  0x20  */
  161.     0x001C, 0x0001, 0x000E, 0x000F, 0x0039, 0x000C, 0x000D, 0x001A,
  162.  
  163.     0x001B, 0x002B, 0x002B, 0x0027, 0x0028, 0x0029, 0x0033, 0x0034,   /*  0x30  */
  164.     0x0035, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
  165.  
  166.     0x0041, 0x0042, 0x0043, 0x0044, 0x0057, 0x0058, 0xE037, 0x0046,   /*  0x40  */
  167.     0x0000, 0xE052, 0xE047, 0xE049, 0xE053, 0xE04F, 0xE051, 0xE04D,
  168.  
  169.     0xE04B, 0xE050, 0xE048, 0x0045, 0xE035, 0x0037, 0x004A, 0x004E,   /*  0x50  */
  170.     0xE01C, 0x004F, 0x0050, 0x0051, 0x004B, 0x004C, 0x004D, 0x0047,
  171.  
  172.     0x0048, 0x0049, 0x0052, 0x0053, 0x0056, 0xE05D, 0xE05E, 0x0059,   /*  0x60  */
  173.     0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
  174.  
  175.     0x006C, 0x006D, 0x006E, 0x0076, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0x70  */
  176.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  177.  
  178.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x0000, 0x0073,   /*  0x80  */
  179.     0x0070, 0x007D, 0x0079, 0x007B, 0x005C, 0x0000, 0x0000, 0x0000,
  180.  
  181.     0x00F2, 0x00F1, 0x0078, 0x0077, 0x0076, 0x0000, 0x0000, 0x0000,   /*  0x90  */
  182.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  183.  
  184.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xA0  */
  185.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  186.  
  187.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xB0  */
  188.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  189.  
  190.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xC0  */
  191.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  192.  
  193.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xD0  */
  194.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  195.  
  196.     0x001D, 0x002A, 0x0038, 0xE05B, 0xE01D, 0x0036, 0xE038, 0xE05C,   /*  0xE0  */
  197.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  198.  
  199.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   /*  0xFE0  */
  200.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  201.  
  202. };
  203.  
  204. static uint8_t  kbd_old[8];
  205.  
  206. bool keyboard_handler(udev_t *dev, struct tag_request *rq)
  207. {
  208.     td_t   *td;
  209.     qh_t   *qh;
  210.  
  211.     uint8_t *data;
  212.     int    i;
  213.  
  214.     td = rq->td_head;
  215.  
  216.     if( (td->status &0x7FF)==rq->size-1)
  217.     {
  218.         uint8_t action;
  219.         scancode_t scan;
  220.  
  221.         data = (uint8_t*)rq->data;
  222.  
  223.         action = data[0] ^ kbd_old[0];
  224.  
  225.         for (i = 0; i < 8; i++)
  226.         {
  227.             if(action & 1)
  228.             {
  229.                 scan.value = usb_keycode[i+224];
  230.  
  231.                 if(data[0]>>i & 1)
  232.                 {
  233.                     if(scan.ecode)
  234.                         SetKeyboardData(scan.ecode);
  235.                     SetKeyboardData(scan.code);
  236.                 }
  237.                 else
  238.                 {
  239.                     if(scan.ecode)
  240.                         SetKeyboardData(scan.ecode);
  241.                     SetKeyboardData(scan.code|0x80);
  242.                 };
  243.             }
  244.             action >>= 1;
  245.         }
  246.  
  247.  
  248.         for (i = 2; i < 8; i++)
  249.         {
  250.             if ((kbd_old[i] > 3) && (memscan(data+2, kbd_old[i], 6) == data+8))
  251.             {
  252.                 scan.value = usb_keycode[kbd_old[i]];
  253.  
  254.                 if (scan.value)
  255.                 {
  256.                     if(scan.ecode)
  257.                         SetKeyboardData(scan.ecode);
  258.                     SetKeyboardData(scan.code|0x80);
  259.                   //  input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
  260.                 }
  261.                 else
  262.                     dbgprintf("Unknown key (scancode %#x) released.\n", kbd_old[i]);
  263.             }
  264.  
  265.             if ((data[i] > 3) && (memscan(kbd_old+2, data[i], 6) == kbd_old+8))
  266.             {
  267.                 scan.value = usb_keycode[data[i]];
  268.  
  269.                 if (scan.value)
  270.                 {
  271.                     if(scan.ecode)
  272.                         SetKeyboardData(scan.ecode);
  273.                     SetKeyboardData(scan.code);
  274.                    //input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
  275.                 }
  276.                 else
  277.                     dbgprintf("Unknown key (scancode %#x) released.\n", data[i]);
  278.             }
  279.         }
  280.         memcpy(kbd_old, data, 8);
  281.     };
  282.  
  283.     td->status = TD_CTRL_ACTIVE | TD_CTRL_IOC | dev->speed;
  284.     td->token ^= DATA1;
  285.  
  286.     u32_t efl = safe_cli();
  287.       list_add_tail(&rq->list, &dev->host->rq_list);
  288.       qh = dev->host->qh[rq->qnum];
  289.       qh->qelem = rq->td_head->dma;
  290.       mb();
  291.     safe_sti(efl);
  292.  
  293.     return true;
  294. };
  295.  
  296. void create_hid_mouse(udev_t *dev, endpoint_descr_t *en_d)
  297. {
  298.     request_t *rq;
  299.     endp_t    enp;
  300.  
  301.     addr_t  address;
  302.     addr_t  size;
  303.     u32_t   toggle;
  304.  
  305.     qh_t   *qh;
  306.  
  307.     static  u16_t __attribute__((aligned(16)))
  308.             req_set_conf[4]  = {0x0900,0x0001,0x0000,0x0000};
  309.  
  310.     if( !ctrl_request(dev, req_set_conf, DOUT, 0, 0))
  311.         return;
  312.  
  313.     enp.address = en_d->bEndpointAddress;
  314.     enp.size    = en_d->wMaxPacketSize;
  315.     enp.toggle  = DATA0;
  316.  
  317.     rq = alloc_rq_buffer(dev, &enp, DIN, enp.size);
  318.  
  319.     rq->qnum = 6;
  320.     rq->handler = &mouse_handler;
  321.  
  322.     u32_t efl = safe_cli();
  323.       list_add_tail(&rq->list, &dev->host->rq_list);
  324.       qh = dev->host->qh[rq->qnum];
  325.       qh->qelem = rq->td_head->dma;
  326.       mb();
  327.     safe_sti(efl);
  328.  
  329.     dbgprintf("%s\n",__FUNCTION__);
  330. }
  331.  
  332. void create_hid_keyboard(udev_t *dev, endpoint_descr_t *en_d)
  333. {
  334.     request_t *rq;
  335.     endp_t    enp;
  336.  
  337.     addr_t  address;
  338.     addr_t  size;
  339.     u32_t   toggle;
  340.  
  341.     qh_t   *qh;
  342.  
  343.     static  u16_t __attribute__((aligned(16)))
  344.             req_set_conf[4]  = {0x0900,0x0001,0x0000,0x0000};
  345.  
  346.     if( !ctrl_request(dev, req_set_conf, DOUT, 0, 0))
  347.         return;
  348.  
  349.     enp.address = en_d->bEndpointAddress;
  350.     enp.size    = en_d->wMaxPacketSize;
  351.     enp.toggle  = DATA0;
  352.  
  353.     rq = alloc_rq_buffer(dev, &enp, DIN, enp.size);
  354.  
  355.     rq->qnum = 4;
  356.     rq->handler = &keyboard_handler;
  357.  
  358.     u32_t efl = safe_cli();
  359.       list_add_tail(&rq->list, &dev->host->rq_list);
  360.       qh = dev->host->qh[rq->qnum];
  361.       qh->qelem = rq->td_head->dma;
  362.       mb();
  363.     safe_sti(efl);
  364.  
  365.     dbgprintf("%s\n",__FUNCTION__);
  366. }
  367.  
  368. void *memscan(void *addr, int c, size_t size)
  369. {
  370.     if (!size)
  371.         return addr;
  372.     __asm__ __volatile__(
  373.         "repnz; scasb       \n\t"
  374.         "jnz 1f             \n\t"
  375.         "dec %%edi          \n\t"
  376.     "1:"
  377.         : "=D" (addr), "=c" (size)
  378.         : "D" (addr), "1" (size), "a" (c)
  379.         : "memory");
  380.     return addr;
  381. }
  382.  
  383.