硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6351|回复: 2
收起左侧

[ThreadX全家桶] ST官方USBX HID设备BUG

[复制链接]

4

主题

31

回帖

43

积分

新手上路

积分
43
发表于 2021-6-19 00:33:00 | 显示全部楼层 |阅读模式
本帖最后由 miss-you 于 2021-6-19 00:52 编辑

NUCLEO-H723ZG -> Ux_Host_HID 这个例子中问题1:接无线鼠标会出现枚举不上的BUG,

分析:调试分析后原因锁定在app_usbx_host.c -> ux_host_event_callback这个函数里。调试中发现无线鼠标和键盘是复合设备(我手上不同品牌的一个无线键盘和一个无线鼠标发现都是复合设备, 猜测这类电子产品都是复合的键盘+鼠标设备),这类设备枚举时会
先向主机端发送枚举键盘设备, 之后再枚举鼠标设备。
这个函数中鼠标设备第一次向主机枚举键盘时会枚举成功, hid参数会被赋值,第二次枚举鼠标时会判断 hid是否为空, 此时hid不为空, 所以if中的程序没有得到执行,导致枚举不上无线鼠标。
解决方法: 将hid参数重新定义成数组, 并且在进入这个函数后轮询找到对应hid,(这个方法不适用于一个主机设备接多个鼠标设备,需要靠其他方法实现)。


问题2:无线鼠标能够正常枚举后,先插入鼠标开机或者 先开机,后插入鼠标, 鼠标接入后如果短时间内鼠标没有将第一条位置或按键信息上报,主机设备就一直接受不到消息。
暂时没有发现解决办法,目前一直追踪到了

ux_hcd_stm32_callback.c 下的
void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state)


这个函数, 发现urb_state 这个参数一直为0, 进一步发现不管有没有按下或移动鼠标调用这个函数的位置都在 stm32H7xx_hal_hcd.c
static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
{
.......
  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH)
  {

.......
    __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH);
    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
  }
}

正常按下的时候应该在这个位置。
static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
{
.......
else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_XFRC) == USB_OTG_HCINT_XFRC)
  {
   .....
    else if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR)
    {
.....


#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
      hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
#else
      HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
    }
.....

}
希望大家有能力的能够解决这个BUG;

  1. /**
  2. * @brief ux_host_event_callback
  3. * @param ULONG event
  4.            This parameter can be one of the these values:
  5.              1 : UX_DEVICE_INSERTION
  6.              2 : UX_DEVICE_REMOVAL
  7.              3 : UX_HID_CLIENT_INSERTION
  8.              4 : UX_HID_CLIENT_REMOVAL
  9.          UX_HOST_CLASS * Current_class
  10.          VOID * Current_instance
  11. * @retval Status
  12. */
  13. UINT ux_host_event_callback(ULONG event, UX_HOST_CLASS *Current_class, VOID *Current_instance)
  14. {
  15.   UINT status;
  16.   UX_HOST_CLASS *hid_class;
  17.   switch (event)
  18.   {
  19.   case UX_DEVICE_INSERTION:
  20.     /* Get current Hid Class */
  21.     status = ux_host_stack_class_get(_ux_system_host_class_hid_name, &hid_class);
  22.     if (status == UX_SUCCESS)
  23.     {
  24.       if ((hid_class == Current_class) && (hid == NULL))
  25.       {
  26.         /* Get current Hid Instance */
  27.         hid = Current_instance;
  28.         /* Get the HID Client */
  29.         hid_client = hid->ux_host_class_hid_client;

  30.         if (hid->ux_host_class_hid_client->ux_host_class_hid_client_status != (ULONG)UX_HOST_CLASS_INSTANCE_LIVE)
  31.         {
  32.           ux_dev_info.Device_Type = Unknown_Device;
  33.         }

  34.         /* Check the HID_client if this is a HID mouse device. */
  35.         if (ux_utility_memory_compare(hid_client->ux_host_class_hid_client_name,
  36.                                       _ux_system_host_class_hid_client_mouse_name,
  37.                                       ux_utility_string_length_get(_ux_system_host_class_hid_client_mouse_name)) == UX_SUCCESS)
  38.         {
  39.           /* update HID device Type */
  40.           ux_dev_info.Device_Type = Mouse_Device;

  41.           /* put a message queue to usbx_app_thread_entry */
  42.           tx_queue_send(&ux_app_MsgQueue, &ux_dev_info, TX_NO_WAIT);
  43.         }

  44.         /* Check the HID_client if this is a HID keyboard device. */
  45.         else if (ux_utility_memory_compare(hid_client->ux_host_class_hid_client_name,
  46.                                            _ux_system_host_class_hid_client_keyboard_name,
  47.                                            ux_utility_string_length_get(_ux_system_host_class_hid_client_keyboard_name)) == UX_SUCCESS)
  48.         {
  49.           /* update HID device Type */
  50.           ux_dev_info.Device_Type = Keyboard_Device;

  51.           /* put a message queue to usbx_app_thread_entry */
  52.           tx_queue_send(&ux_app_MsgQueue, &ux_dev_info, TX_NO_WAIT);
  53.         }
  54.         else
  55.         {
  56.           ux_dev_info.Device_Type = Unknown_Device;
  57.           ux_dev_info.Dev_state = Device_connected;
  58.           tx_queue_send(&ux_app_MsgQueue, &ux_dev_info, TX_NO_WAIT);
  59.         }
  60.       }
  61.     }
  62.     else
  63.     {
  64.       /* No HID class found */
  65.       USBH_ErrLog("NO HID Class found");
  66.       hid = NULL;
  67.     }
  68.     break;

  69.   case UX_DEVICE_REMOVAL:

  70.     if (Current_instance == hid)
  71.     {
  72.       /* Free Instance */
  73.       hid = NULL;
  74.       USBH_UsrLog("USB Device Unplugged");
  75.       ux_dev_info.Dev_state = No_Device;
  76.       ux_dev_info.Device_Type = Unknown_Device;
  77.     }
  78.     break;

  79.   case UX_HID_CLIENT_INSERTION:
  80.     USBH_UsrLog("HID Client Plugged");
  81.     ux_dev_info.Dev_state = Device_connected;
  82.     break;

  83.   case UX_HID_CLIENT_REMOVAL:
  84.     USBH_UsrLog("HID Client Unplugged");
  85.     ux_dev_info.Dev_state = Device_disconnected;
  86.     ux_dev_info.Device_Type = Unknown_Device;
  87.     tx_queue_send(&ux_app_MsgQueue, &ux_dev_info, TX_NO_WAIT);

  88.     break;

  89.   default:
  90.     break;
  91.   }

  92.   return (UINT)UX_SUCCESS;
  93. }
复制代码








回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2021-6-19 08:19:55 | 显示全部楼层
帮顶。
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2021-6-19 12:54:49 | 显示全部楼层
帮顶,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 03:23 , Processed in 0.037242 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表