C Linux USB:通过控制端点的请求/响应?
我正在尝试为读卡器开发一个内核驱动程序。我没有开发linux内核的经验,也从未编写过驱动程序;自从我写了任何C代码以来,这也是一个很好的15年 利用互联网上的大量资源和内核源代码,我拼凑了一个驱动程序。具体地说,我现在正在通过设备的控制端点处理请求/响应。我的理解是,控制端点具有USB规范中定义的功能,并且为供应商在该端点上支持特定于设备的功能提供了一点回旋余地。我可以找到一百万个关于“供应商在控制端点上实现专有功能”的引用,但在我的一生中,我找不到一个简单的例子来说明如何在我的驱动程序代码中设置它 使用usbpcap/wireshark和USBLyzer,我可以用它附带的Windows演示软件监视这个设备。在我在Windows上监控的USB通信中,一个控制输出(主机到设备)熄灭,然后设备以多个控制包响应 这是控制输出请求信息: BMR类型21h 布雷奎斯特09h W0300H值 wIndex 0000h WLENGHT 0008h 数据本身是十六进制字符串: 60 00 01 39 58 03 5f 00 我在驱动程序代码中构建并提交了相同的(我认为)请求,usb_submit_urb()的返回值为0。但我不知道如何才能收到回复 以下是相关代码:C Linux USB:通过控制端点的请求/响应?,c,linux,usb,linux-device-driver,C,Linux,Usb,Linux Device Driver,我正在尝试为读卡器开发一个内核驱动程序。我没有开发linux内核的经验,也从未编写过驱动程序;自从我写了任何C代码以来,这也是一个很好的15年 利用互联网上的大量资源和内核源代码,我拼凑了一个驱动程序。具体地说,我现在正在通过设备的控制端点处理请求/响应。我的理解是,控制端点具有USB规范中定义的功能,并且为供应商在该端点上支持特定于设备的功能提供了一点回旋余地。我可以找到一百万个关于“供应商在控制端点上实现专有功能”的引用,但在我的一生中,我找不到一个简单的例子来说明如何在我的驱动程序代码中设
/* in header file */
struct usb_idtech {
struct usb_device *udev;
struct usb_interface *interface;
unsigned char minor;
char *ctrl_buffer;
struct urb *ctrl_urb;
struct usb_ctrlrequest *ctrl_req;
int type;
};
/* in my probe callback */
dev->ctrl_req->bRequestType = IDTECH_CTRL_REQUEST_TYPE;
dev->ctrl_req->bRequest = IDTECH_CTRL_REQUEST;
dev->ctrl_req->wValue = IDTECH_CTRL_VALUE;
dev->ctrl_req->wIndex = IDTECH_CTRL_INDEX;
dev->ctrl_req->wLength = IDTECH_CTRL_BUFFER_SIZE;
usb_fill_control_urb(
dev->ctrl_urb,
dev->udev,
usb_sndctrlpipe( dev->udev, 0 ),
(unsigned char *)dev->ctrl_req,
dev->ctrl_buffer,
IDTECH_CTRL_BUFFER_SIZE,
idtech_ctrl_callback,
dev
);
printk( KERN_INFO "submitting control urb" );
memcpy( dev->ctrl_buffer, "\x60\x00\x01\x39\x58\x03\xd2\x00", IDTECH_CTRL_BUFFER_SIZE );
printk( KERN_INFO "ctrl_buffer: %02x %02x %02x %02x %02x %02x %02x %02x",
(unsigned char)dev->ctrl_buffer[ 0 ],
(unsigned char)dev->ctrl_buffer[ 1 ],
(unsigned char)dev->ctrl_buffer[ 2 ],
(unsigned char)dev->ctrl_buffer[ 3 ],
(unsigned char)dev->ctrl_buffer[ 4 ],
(unsigned char)dev->ctrl_buffer[ 5 ],
(unsigned char)dev->ctrl_buffer[ 6 ],
(unsigned char)dev->ctrl_buffer[ 7 ]
);
result = usb_submit_urb( dev->ctrl_urb, GFP_KERNEL );
printk( KERN_INFO "control urb submitted %d", result );
这是相关的dmesg数据:
[13253.304464] idtech attached at idtech0
[13253.304479] submitting control urb
[13253.304498] ctrl_buffer: 60 00 01 39 58 03 d2 00
[13253.304574] control urb submitted 0
[13253.304907] usbcore: registered new interface driver usbidtech
[13253.305887] inside idtech_ctrl_callback
这是usbmon的输出:
f51a4980 2557517293 S Co:2:003:0 s 21 09 0300 0000 0008 8 = 60000139 5803d200
f51a4980 2557518637 C Co:2:003:0 0 8 >
到目前为止,我所做的看起来正确吗?我如何得到回应?为什么usbmon输出不显示设备的通信返回
谢谢 我建议首先用C编写一个用户空间应用程序(可能使用),以确保您可以控制设备。您不想同时担心通信和内核接口;太多了,一下子拿不下。应用程序运行后,开始处理内核。现有和驱动程序源应该有所帮助。