想请教CH583 Demo中的HostU2Enum这个例子,关于枚举复合的usb hid类设备过程

如题,想请教CH583 Demo中的HostU2Enum这个例子,关于枚举复合的usb hid类设备过程?



例程的usb hid类枚举过程,从代码中可发现,只支持只有一个接口的Mouse与KEYBOARD设备;

                /* 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 */
                cfg = ((PUSB_CFG_DESCR)U2Com_Buffer)->bConfigurationValue;
                if_cls = ((PUSB_CFG_DESCR_LONG)U2Com_Buffer)->itf_descr.bInterfaceClass; // 接口类代码   

                if((dv_cls == 0x00) && (if_cls == USB_DEV_CLASS_HID) && ((PUSB_CFG_DESCR_LONG)U2Com_Buffer)->itf_descr.bInterfaceSubClass <= 0x01)
                { // 是HID类设备,键盘/鼠标等
                    //  从描述符中分析出HID中断端点的地址
                    s = AnalyzeU2HidIntEndp(U2Com_Buffer, 0); // 从描述符中分析出HID中断端点的地址
                    PRINT("AnalyzeU2HidIntEndp %02x\n", (uint16_t)s);
                    //  保存中断端点的地址,位7用于同步标志位,清0
                    if_cls = ((PUSB_CFG_DESCR_LONG)U2Com_Buffer)->itf_descr.bInterfaceProtocol;
                    s = CtrlSetUsb2Config(cfg); // 设置USB设备配置
                    if(s == ERR_SUCCESS)
                    {
                        //	    					Set_Idle( );
                        //	需保存端点信息以便主程序进行USB传输
                        ThisUsb2Dev.DeviceStatus = ROOT_DEV_SUCCESS;

                            if(if_cls == 1)
                            {
                                ThisUsb2Dev.DeviceType = DEV_TYPE_KEYBOARD;
                                //	进一步初始化,例如设备键盘指示灯LED等
                                PRINT("U2 USB-Keyboard Ready\n");
                                SetUsb2Speed(1); // 默认为全速
                                return (ERR_SUCCESS);
                            }
                            else if(if_cls == 2)
                            {
                                ThisUsb2Dev.DeviceType = DEV_TYPE_MOUSE;
                                //	为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息
                                PRINT("U2 USB-Mouse Ready\n");
                                SetUsb2Speed(1); // 默认为全速
                                return (ERR_SUCCESS);
                            }else{


                            }

                        s = ERR_USB_UNSUPPORT;
                    }
                }


但是我们公司开发的设备都是custom hid类设备;一般都是Joystick,mouse,keyboard多个接口的复合;

我打算先判断接口数量bNumInterfaces,然后获取各个接口的bInterfaceProtocol,如果bInterfaceProtocol=0则为复合或其他设备,然后判断各个接口下的报告描述符的Usage 部分从而判断该接口是Mouse接口,还是gamepad或其他;

Usage Page (Generic Desktop)05 01 Usage (Mouse)09 02 


请问这个解析复合设备过程是否有例程可参考,或请给我一些建议;


另外

hisUsb2Dev.DeviceType = DEV_TYPE_KEYBOARD;

里面的

#define DEV_TYPE_KEYBOARD      (USB_DEV_CLASS_HID | 0x20)

#define DEV_TYPE_MOUSE         (USB_DEV_CLASS_HID | 0x30)

typedef struct
{
    uint8_t  DeviceStatus;  // 设备状态,0-无设备,1-有设备但尚未初始化,2-有设备但初始化枚举失败,3-有设备且初始化枚举成功
    uint8_t  DeviceAddress; // 设备被分配的USB地址
    uint8_t  DeviceSpeed;   // 0为低速,非0为全速
    uint8_t  DeviceType;    // 设备类型
    uint16_t DeviceVID;
    uint16_t DevicePID;
    uint8_t  GpVar[4];     // 通用变量,存放端点
    uint8_t  GpHUBPortNum; // 通用变量,如果是HUB,表示HUB端口数
} _RootHubDev;

我想问一下_RootHubDev.DeviceType 是自定义的吗?是否可以作以下定义

#define DEV_TYPE_KEYBOARD      (USB_DEV_CLASS_HID | 0x20)

#define DEV_TYPE_MOUSE         (USB_DEV_CLASS_HID | 0x30)

#define DEV_TYPE_GAMEPAD      (USB_DEV_CLASS_HID | 0x40)

#define DEV_TYPE_JOYSTICK         (USB_DEV_CLASS_HID | 0x50)

#define DEV_TYPE_OTHER         (USB_DEV_CLASS_HID | 0x60)


https://www.wch.cn/downloads/CH559EVT_ZIP.html
可以参考559的USB主机例子,USB这块基本都是一样的可以参考。 


559的USB主机例子跟ch583的完全一样,都是一个接口设备的主机枚举过程,没有复合设备的;


image.png

分析多接口的,看例子的这个地方


j_0069.gif好的,看到了,感谢,膜拜大佬!!!


请问楼主怎么解决的呢?我这也遇到相同问题了


您好,可以参考559例程中的处理,583EVT中没有识别多接口的代码。


只有登录才能回复,可以选择微信账号登录