我正在尝试为读卡器开发内核驱动程序。我没有为linux内核开发的经验,也从未编写过驱动程序;自从我编写了任何C代码以来,它已经过了15年。
使用互联网上的许多资源和内核源代码我拼凑了一个驱动程序。具体来说,我现在正在努力通过控制端点与设备进行请求/响应。我的理解是控制端点具有USB规范中定义的功能,并且供应商可以通过该端点支持设备特定功能。我可以找到一百万个引用,并且#34;供应商在控制端点上实现专有功能"但对于我的生活,我无法找到一个如何在我的驱动程序代码中设置它的简单示例。
使用usbpcap / wireshark和USBLyzer我可以使用它附带的Windows演示软件监控此设备。在我在Windows上监控的USB流量中,控制输出(主机到设备)熄灭,然后设备响应多个控制包。
这是控制输出请求信息: bmRequestType 21h b请求09h wValue 0300h wIndex 0000h wLength 0008h
数据本身是十六进制字符串: 60 00 01 39 58 03 5f 00
我在我的驱动程序代码中构建并提交相同的(我认为)请求,usb_submit_urb()给出的返回值为0.但我不知道如何接收响应。
以下是相关代码:
/* 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输出没有显示设备正在回传?
谢谢!