硬汉嵌入式论坛

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

usbx hid Bus Hound不能发送数据

[复制链接]

7

主题

46

回帖

67

积分

初级会员

积分
67
发表于 2021-12-11 21:32:28 | 显示全部楼层 |阅读模式
STM32H7,根据en.x-cube-azrtos-h7例程,移植了一个USBX。
复合设备,一个CDC ACM,一个HID。
CDC ACM能正常收发。
HID能发,但不能收。用BUS HOUND向开发板发送数据,提示invalid command,然后没有任何反应。
开发板向PC能正常发送数据,测试速率为8MB/S,平均125us发送一次。
理论上一个125us时间内,可以发送3次1024字节。需要额外的设置吗?
哪位大神,移植过USBX,有没有出现类似的现象?
描述符、报告应该没有错误,与我F429的项目比较过,没有问题。
怀疑是不是增加的STM驱动方面有问题?
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-11 22:01:34 | 显示全部楼层
直接在en.x-cube-azrtos-h7上,将HID报告改为自定义双向通信,同时增加一个out端点。
在BUS HOUND上可以看到端点IN/OUT,但也还是不能向开发板发送数据。
以下是HID报告       
        0x05, 0x8c,                        /* USAGE_PAGE (ST Page) */
        0x09, 0x01,                        /* USAGE (Demo Kit) */
        0xa1, 0x01,                        /* COLLECTION (Application) */
        // The Input report
        0x09,0x03,                        // USAGE ID - Vendor defined
        0x15,0x00,                        // LOGICAL_MINIMUM (0)
        0x26,0x00, 0xFF,        // LOGICAL_MAXIMUM (255)
        0x75,0x08,                        // REPORT_SIZE (8bit)
        0x95,0x04,                        // REPORT_COUNT (64Byte)
        0x81,0x02,                         // INPUT (Data,Var,Abs)

        // The Output report
        0x09,0x04,                        // USAGE ID - Vendor defined
        0x15,0x00,                        // LOGICAL_MINIMUM (0)
        0x26,0x00,0xFF,                // LOGICAL_MAXIMUM (255)
        0x75,0x08,                        // REPORT_SIZE (8bit)
        0x95,0x04,                        // REPORT_COUNT (64Byte)
        0x91,0x02,                        // OUTPUT (Data,Var,Abs)
        0xc0                                /* END_COLLECTION */
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-12-12 09:12:57 | 显示全部楼层
CDC和HID二合一的方式,软件包里面不是标配了一个例子。
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-12 10:12:00 | 显示全部楼层
标配中HID是鼠标,只有上传数据,没有接收数据。
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-12 17:56:45 | 显示全部楼层
说是不能接收数据也不妥当,应该是PC机的BUS HOUND一发数据就死了。
用CDC ACM的端点发送数据都正常。
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-13 15:42:45 | 显示全部楼层
继续测试,发现系列问题
1)hid_event
大批量数据发送接收时,hid_event有3个地方都是直接定义,如任务中定义一个hid_event。这会导致任务的堆栈需要很大,切换时,效率低下。
将里面hid_event都换成全局,测试OK。
ux_device_class_hid_event_set(),发送数据,需要输入hid_event,这个地方有一个内存copy,进入函数内,再将hid_event copy到列表buf,最后发送请求时,又再次copy。
即使用dma也扛不住。数据量小时,还好。数据量大,每包1024字节,要吐血的。
typedef struct UX_SLAVE_CLASS_HID_EVENT_STRUCT
{
    ULONG                   ux_device_class_hid_event_report_id;
    ULONG                   ux_device_class_hid_event_report_type;
    UCHAR                   ux_device_class_hid_event_buffer[UX_DEVICE_CLASS_HID_EVENT_BUFFER_LENGTH];
    ULONG                   ux_device_class_hid_event_length;
   
} UX_SLAVE_CLASS_HID_EVENT;
2)同时支持多个类
同时支持HID、CDC ACM时,同时发送,发现两个干架了。HID发送的内容一部分变成CDC ACM内容了。
两个类单独发送数据时,都OK。
HID发送数据测试达到8MB/S。
3)HID
HID还是只能发送,PC机一发送就死了,提示invalid command。
4)关闭HID,移植DPUMP
PC机提示没有驱动,应该没深入进去,不知道是自己移植错误,还是就这样。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-12-14 09:18:17 | 显示全部楼层
shzdf123 发表于 2021-12-13 15:42
继续测试,发现系列问题
1)hid_event
大批量数据发送接收时,hid_event有3个地方都是直接定义,如任务中 ...

有可能是USB FIFO的分配问题,
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-14 10:42:55 | 显示全部楼层
eric2013 发表于 2021-12-14 09:18
有可能是USB FIFO的分配问题,


        //一共4KB FIFO
        //发送FIFO不能小于端点最大包大小
       
        //2KB,以32bit字为单位
        HAL_PCDEx_SetRxFiFo(phpcd, 0x0200);                                //所有输出端点使用一个FIFO
                                                                                                        //端点2:HID 输出        主机-->设备
                                                                                                        //端点5:CDC ACM 输出        主机-->设备
        //64字节
        HAL_PCDEx_SetTxFiFo(phpcd, 0, 0x10);                        //端点0:双向

        //64字节
        HAL_PCDEx_SetTxFiFo(phpcd, 3, 0x10);                        //端点3:CDC ACM 控制 输入        设备-->主机

        //512字节
        HAL_PCDEx_SetTxFiFo(phpcd, 4, 0x80);                        //端点4:CDC ACM 输入        设备-->主机

        //1024字节
        HAL_PCDEx_SetTxFiFo(phpcd, 1, 0x0100);                        //端点1:HID 输入        设备-->主机
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-14 10:48:41 | 显示全部楼层
ST官方例程STM32Cube_FW_H7_V1.9.0
使用CustomHID_Standalone这个例程,也是只能设备发送到主机,主机不能发送到设备
123.png
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-14 12:35:20 | 显示全部楼层
eric2013 发表于 2021-12-14 09:18
有可能是USB FIFO的分配问题,

@硬汉 你们做H747吗?有没有H747的核心板之类的卖?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-12-14 15:00:34 | 显示全部楼层
shzdf123 发表于 2021-12-14 12:35
@硬汉 你们做H747吗?有没有H747的核心板之类的卖?

我们没有H747。
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-18 11:07:58 | 显示全部楼层
今天看了看usbx hid,发现hid只支持device向host发送数据流程。不支持互相传输数据。
移植了一个dpump,发现pc端要自行安装驱动,非免驱。用例程上的VIP,变成佳能的一个驱动了。
以前那种CUSTOM HID,主从机相互发数据的怎么办?这个尴尬了。
希望我理解错了。
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-18 22:10:01 | 显示全部楼层
Threadx USBX Custom HID
终于搞定了HID的接收问题。
1)HID只有一个线程:ux_device_class_hid_interrupt_thread.c。
这个线程就是一个device向host发送数据的线程,根本没有接收的功能。
参考CDC ACM类的ux_device_class_cdc_acm_bulkout_thread.c做了个ux_device_class_hid_interruptout_thread.c就可以了。

2)HID的UX_SLAVE_CLASS_HID_EVENT就是一个小坑,HID发送数据小,问题不大,一旦数据大时,内存就很容易出问题。
现在只是简单改为全局,之后还是要改为指针操作。改为指针,至少要少掉3次的copy时间。不然,对于大数据交互的工程,效率太低了。
回复

使用道具 举报

7

主题

46

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2021-12-19 22:02:51 | 显示全部楼层
继续测试,还是发现问题,好在都解决了。
1)高强度测试,一直HID发送数据,每包1024字节。
BUG:bus hound显示,接收数据,有时错误。
解决:ux_device_class_hid_event_set(),数据写入,先更新头指针,再写入数据。
          这样,线程检测发现头指针与尾指针不一致,就会认为有数据,进而将缓冲中的数据直接发送出去。
          而此时,数据还未全部写入到缓冲区。所以应该先写入数据,再更新头指针。
测试:OK。
2)CDC ACM与HID同时向PC发送数据。
BUG:bus hound显示,HID发送一段时间就停止,且停止的那包数据,部分数据为下一包CDC ACM要发送的数据。
         同时,接收长度也不正确。此时,CDC ACM发送数据正常。
解决:发现各个类发送数据都是调用_ux_device_stack_transfer_request(),继续追下去,发现是USB的底层函数。
          这个地方,应该有个互斥才对。继续查看,发现CDC ACM类内部是有个互斥信号的。
          重新定义一个信号量,将HID、CDC ACM中所有调用_ux_device_stack_transfer_request()前后都加一个锁、解锁。
测试:OK。
          继续,_ux_device_stack_transfer_request()这个函数最终都是调用_ux_dcd_stm32_function()中的_ux_dcd_stm32_transfer_request(),
          在_ux_dcd_stm32_transfer_request()前后加锁、解锁。
测试:失败。
          看来,在_ux_device_stack_transfer_request()与_ux_dcd_stm32_transfer_request()之前,还是有一些不可重入的因素。
          先不管了。项目要紧,等后期进入优化阶段,再进一步深入。
备注:测试并未充分。只是测试了10多次。BUG是每一次都会出现。10多次不出现,暂时就认为解决了。
回复

使用道具 举报

2

主题

10

回帖

16

积分

新手上路

积分
16
发表于 2022-5-5 19:00:56 | 显示全部楼层
请教楼主,我用 CubeMX生成的HID代码,USBX给PC发送数据没有问题,但PC给USBX发送数据的时候,发 8次后 USBX就不再应答了,一直没有找到问题。 不知道你遇到过这样的问题没有。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2024-3-16 00:05:34 来自手机 | 显示全部楼层
我这里更搞笑,MSC+CDC+HID,CDC和HID可以同时各自做回环测试,同时MSC也可以读,但是MSC只要一写,CDC和HID就会报错,如果写MSC时,不对CDC和HID进行操作,等MSC写完后,再打开CDC做回环测试没问题,HID就只能从设备往电脑发送,电脑不能往设备发送。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 05:48 , Processed in 0.219830 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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