在DriverKit中使用USBmakebmRequestType遇头文件缺失问题咨询
解决DriverKit中找不到USBmakebmRequestType宏的问题
DriverKit与传统IOKit的头文件差异
DriverKit是独立于传统IOKit的框架,它的头文件体系不包含<IOKit/USB.h>,因此无法直接引入该头文件使用USBmakebmRequestType宏。手动构造bmRequestType字段
bmRequestType是一个8位无符号整数,由三部分构成:- 方向位(第7位):
0x00表示主机到设备的输出请求,0x80表示设备到主机的输入请求 - 类型位(第6-5位):
0x00(标准请求)、0x20(类请求)、0x40(厂商自定义请求)、0x60(保留) - 接收者位(第4-0位):
0x00(设备)、0x01(接口)、0x02(端点)、0x03(其他)
- 方向位(第7位):
手动实现USBmakebmRequestType宏
你可以直接在代码中实现该宏的逻辑,完全等价于原宏功能:
#define USB_DIR_IN 0x80 #define USB_DIR_OUT 0x00 #define USB_TYPE_STANDARD 0x00 #define USB_TYPE_CLASS 0x20 #define USB_TYPE_VENDOR 0x40 #define USB_TYPE_RESERVED 0x60 #define USB_RECIP_DEVICE 0x00 #define USB_RECIP_INTERFACE 0x01 #define USB_RECIP_ENDPOINT 0x02 #define USB_RECIP_OTHER 0x03 #define USBmakebmRequestType(direction, type, recipient) \ ((direction) | ((type) << 5) | ((recipient) << 0))
- 使用示例
构造一个标准设备输出请求的bmRequestType并调用DeviceRequest:
uint8_t bmRequestType = USBmakebmRequestType(USB_DIR_OUT, USB_TYPE_STANDARD, USB_RECIP_DEVICE); IOUSBHostDeviceRequest request = { .bmRequestType = bmRequestType, .bRequest = 0x06, // 例如获取描述符请求 .wValue = 0x0100, // 设备描述符类型+索引 .wIndex = 0, .wLength = 18, .pData = nullptr // 按需填充数据指针 }; interface->DeviceRequest(request, nullptr, nullptr);
内容的提问来源于stack exchange,提问作者xarly
相关产品推荐
相关产品推荐

