[应用相关] USB_HOST_HID工程[添加对CAPS_LOCK指示灯的控制][SetReport]

[复制链接]
1978|2
 楼主| huahuagg 发表于 2018-8-29 18:55 | 显示全部楼层 |阅读模式
在之前(使用STM32CubeMX生成USB_HOST_HID工程)的基础上进行修改
在结合之前在pc上的测试 USB之HID类Set_Report Request[调试手记1]
测试代码如下:
  1. /* USER CODE BEGIN 1 */
  2. void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
  3. {
  4.    HID_TypeTypeDef   type = HID_UNKNOWN;
  5.    
  6.    USBH_ErrLog("USBH_HID_EventCallback");
  7.    
  8.    type = USBH_HID_GetDeviceType(phost);
  9.    
  10.    switch(type)
  11.    {
  12.        case HID_KEYBOARD:
  13.        {
  14.             HID_KEYBD_Info_TypeDef *keyboard_info;            
  15.             char ascii;
  16.             uint8_t reportBuff[1];
  17.       static uint8_t led_flag =0;
  18.             
  19.             keyboard_info = USBH_HID_GetKeybdInfo(phost);

  20.             if( keyboard_info != NULL )
  21.             {
  22.                 ascii = USBH_HID_GetASCIICode(keyboard_info);
  23.                 if( ascii != 0 )
  24.                 {
  25.                     USBH_UsrLog("%c",ascii);
  26.                 }
  27.                
  28. //                USBH_UsrLog("state %x",keyboard_info->state);
  29. //                USBH_UsrLog("lctrl %x",keyboard_info->lctrl);
  30. //                USBH_UsrLog("lshift %x",keyboard_info->lshift);
  31. //                USBH_UsrLog("lalt %x",keyboard_info->lalt);
  32. //                USBH_UsrLog("lgui %x",keyboard_info->lgui);
  33. //                USBH_UsrLog("rctrl %x",keyboard_info->rctrl);
  34. //                USBH_UsrLog("rshift %x",keyboard_info->rshift);
  35. //                USBH_UsrLog("rgui %x",keyboard_info->rgui);
  36.                
  37.                 USBH_UsrLog("keys[6] %x %x %x %x %x %x ",keyboard_info->keys[0],\
  38.                                                          keyboard_info->keys[1],\
  39.                                                          keyboard_info->keys[2],\
  40.                                                          keyboard_info->keys[3],\
  41.                                                          keyboard_info->keys[4],\
  42.                                                          keyboard_info->keys[5]);
  43.                
  44.                 if(keyboard_info->keys[0] == 0x39)
  45.                 {
  46.                     led_flag=~led_flag;
  47.                     if(led_flag)
  48.                     {
  49.                         reportBuff[0] = 0X02;
  50.                         USBH_HID_SetReport (phost,2,0,reportBuff,1);
  51.                         USBH_UsrLog("reportBuff %02x ",reportBuff[0]);
  52.                     }
  53.                     else
  54.                     {
  55.                         reportBuff[0] = 0X00;
  56.                         USBH_HID_SetReport (phost,2,0,reportBuff,1);
  57.                         USBH_UsrLog("reportBuff %02x ",reportBuff[0]);
  58.                     }

  59.                 }
  60.                
  61.             }
  62.             



  63.        }     
  64.        break;
  65.       
  66.        case HID_MOUSE:
  67.        {  
  68.            HID_MOUSE_Info_TypeDef *mouse_info;
  69.            
  70.            mouse_info = USBH_HID_GetMouseInfo(phost);
  71.            USBH_UsrLog("mouse_info X%d, Y%d ,button %d %d %d",mouse_info->x,mouse_info->y,mouse_info->buttons[2],mouse_info->buttons[1],mouse_info->buttons[0]);
  72.        }
  73.        break;
  74.       
  75.        default:
  76.        break;
  77.    }
  78. }
  79. /* USER CODE END 1 */
通过capslock按键按下和释放等可以看到CAPS_LOCK指示灯变化。但是会发现需要按多次才能翻转CAPS_LOCK指示灯。
而我们在rtt中可以看到我们赋值reportBuff正常变化。
924267-20170816142349146-2055880438.jpg
我们继续给USBH_HID_SetReport的返回结果加log信息。
  1. /* USER CODE BEGIN 1 */
  2. void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
  3. {
  4.    HID_TypeTypeDef   type = HID_UNKNOWN;
  5.    
  6.    USBH_ErrLog("USBH_HID_EventCallback");
  7.    
  8.    type = USBH_HID_GetDeviceType(phost);
  9.    
  10.    switch(type)
  11.    {
  12.        case HID_KEYBOARD:
  13.        {
  14.             HID_KEYBD_Info_TypeDef *keyboard_info;            
  15.             char ascii;
  16.             uint8_t reportBuff[1];
  17.             USBH_StatusTypeDef status         = USBH_BUSY;
  18.             static uint8_t led_flag =0;
  19.             
  20.             keyboard_info = USBH_HID_GetKeybdInfo(phost);

  21.             if( keyboard_info != NULL )
  22.             {
  23.                 ascii = USBH_HID_GetASCIICode(keyboard_info);
  24.                 if( ascii != 0 )
  25.                 {
  26.                     USBH_UsrLog("%c",ascii);
  27.                 }
  28.                
  29. //                USBH_UsrLog("state %x",keyboard_info->state);
  30. //                USBH_UsrLog("lctrl %x",keyboard_info->lctrl);
  31. //                USBH_UsrLog("lshift %x",keyboard_info->lshift);
  32. //                USBH_UsrLog("lalt %x",keyboard_info->lalt);
  33. //                USBH_UsrLog("lgui %x",keyboard_info->lgui);
  34. //                USBH_UsrLog("rctrl %x",keyboard_info->rctrl);
  35. //                USBH_UsrLog("rshift %x",keyboard_info->rshift);
  36. //                USBH_UsrLog("rgui %x",keyboard_info->rgui);
  37.                
  38.                 USBH_UsrLog("keys[6] %x %x %x %x %x %x ",keyboard_info->keys[0],\
  39.                                                          keyboard_info->keys[1],\
  40.                                                          keyboard_info->keys[2],\
  41.                                                          keyboard_info->keys[3],\
  42.                                                          keyboard_info->keys[4],\
  43.                                                          keyboard_info->keys[5]);
  44.                
  45.                 if(keyboard_info->keys[0] == 0x39)
  46.                 {
  47.                     led_flag=~led_flag;
  48.                     if(led_flag)
  49.                     {
  50.                         reportBuff[0] = 0X02;
  51.                         status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
  52.                         USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]);
  53.                     }
  54.                     else
  55.                     {
  56.                         reportBuff[0] = 0X00;
  57.                         status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
  58.                         USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]);

  59.                     }

  60.                 }
  61.                
  62.             }
  63.             



  64.        }     
  65.        break;
  66.       
  67.        case HID_MOUSE:
  68.        {  
  69.            HID_MOUSE_Info_TypeDef *mouse_info;
  70.            
  71.            mouse_info = USBH_HID_GetMouseInfo(phost);
  72.            USBH_UsrLog("mouse_info X%d, Y%d ,button %d %d %d",mouse_info->x,mouse_info->y,mouse_info->buttons[2],mouse_info->buttons[1],mouse_info->buttons[0]);
  73.        }
  74.        break;
  75.       
  76.        default:
  77.        break;
  78.    }
  79. }
  80. /* USER CODE END 1 */
观察log,只有当USBH_HID_SetReport的返回值为  USBH_OK   = 0,时候我们才能看到灯的变化。
924267-20170816145029443-1664411566.jpg
那我们继续修改代码
  1. /* USER CODE BEGIN 1 */
  2. void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
  3. {
  4.     HID_TypeTypeDef   type = HID_UNKNOWN;

  5.     USBH_ErrLog("USBH_HID_EventCallback");

  6.     type = USBH_HID_GetDeviceType(phost);

  7.     switch(type)
  8.     {
  9.     case HID_KEYBOARD:
  10.     {
  11.         HID_KEYBD_Info_TypeDef *keyboard_info;
  12.         char ascii;
  13.         uint8_t reportBuff[1];
  14.         USBH_StatusTypeDef status         = USBH_BUSY;
  15.         static uint8_t led_flag =0;

  16.         keyboard_info = USBH_HID_GetKeybdInfo(phost);

  17.         if( keyboard_info != NULL )
  18.         {
  19.             ascii = USBH_HID_GetASCIICode(keyboard_info);
  20.             if( ascii != 0 )
  21.             {
  22.                 USBH_UsrLog("%c",ascii);
  23.             }

  24. //                USBH_UsrLog("state %x",keyboard_info->state);
  25. //                USBH_UsrLog("lctrl %x",keyboard_info->lctrl);
  26. //                USBH_UsrLog("lshift %x",keyboard_info->lshift);
  27. //                USBH_UsrLog("lalt %x",keyboard_info->lalt);
  28. //                USBH_UsrLog("lgui %x",keyboard_info->lgui);
  29. //                USBH_UsrLog("rctrl %x",keyboard_info->rctrl);
  30. //                USBH_UsrLog("rshift %x",keyboard_info->rshift);
  31. //                USBH_UsrLog("rgui %x",keyboard_info->rgui);

  32.             USBH_UsrLog("keys[6] %x %x %x %x %x %x ",keyboard_info->keys[0],\
  33.                         keyboard_info->keys[1],\
  34.                         keyboard_info->keys[2],\
  35.                         keyboard_info->keys[3],\
  36.                         keyboard_info->keys[4],\
  37.                         keyboard_info->keys[5]);

  38.             if(keyboard_info->keys[0] == 0x39)
  39.             {
  40.                 led_flag=~led_flag;
  41.                 if(led_flag)
  42.                 {
  43.                     reportBuff[0] = 0X02;
  44.                     do
  45.                     {
  46.                         status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
  47.                     }
  48.                     while(status !=USBH_OK);

  49.                     USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]);
  50.                 }
  51.                 else
  52.                 {
  53.                     reportBuff[0] = 0X00;
  54.                     do
  55.                     {
  56.                         status = USBH_HID_SetReport (phost,2,0,reportBuff,1);
  57.                     }
  58.                     while(status !=USBH_OK);
  59.                     USBH_UsrLog("USBH_HID_SetReport %02x  reportBuff %02x  ",status,reportBuff[0]);

  60.                 }

  61.             }

  62.         }
  63.     }
  64.     break;

  65.     case HID_MOUSE:
  66.     {
  67.         HID_MOUSE_Info_TypeDef *mouse_info;

  68.         mouse_info = USBH_HID_GetMouseInfo(phost);
  69.         USBH_UsrLog("mouse_info X%d, Y%d ,button %d %d %d",mouse_info->x,mouse_info->y,mouse_info->buttons[2],mouse_info->buttons[1],mouse_info->buttons[0]);
  70.     }
  71.     break;

  72.     default:
  73.         break;
  74.     }
  75. }
  76. /* USER CODE END 1 */


 楼主| huahuagg 发表于 2018-8-29 18:56 | 显示全部楼层
好了我们继续测试发现我们按一下CAPS_LOCK后CAPS_LOCK指示灯能进行翻转。
924267-20170816150058584-1048873455.jpg

 楼主| huahuagg 发表于 2018-8-29 18:56 | 显示全部楼层
http://www.cnblogs.com/libra13179/p/7373217.html
转载自这。
也是本论坛网友发的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

160

主题

1437

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部