WCH沁恒单片机
直播中

切克切克闹

11年用户 464经验值
私信 关注
[问答]

请教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 %02xn", (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 Readyn");
SetUsb2Speed(1); // 默认为全速
return (ERR_SUCCESS);
}
else if(if_cls == 2)
{
ThisUsb2Dev.DeviceType = DEV_TYPE_MOUSE;
// 为了以后查询鼠标状态,应该分析描述符,取得中断端口的地址,长度等信息
PRINT("U2 USB-Mouse Readyn");
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)

回帖(3)

李建平

2022-7-25 10:32:52
https://www.wch.cn/downloads/CH559EVT_ZIP.html
可以参考559的USB主机例子,USB这块基本都是一样的可以参考。
举报

潘凌

2022-7-25 10:32:59
559的USB主机例子跟ch583的完全一样,都是一个接口设备的主机枚举过程,没有复合设备的;
举报

李惠英

2022-7-25 10:33:04

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

更多回帖

发帖
×
20
完善资料,
赚取积分