我正在尝试为读卡器开发内核驱动程序 . 我没有为linux内核开发的经验,也从未编写过驱动程序;自从我编写任何C代码以来,它已经过了15年 .

使用互联网上的许多资源和内核源代码,我拼凑了一个驱动程序 . 具体来说,我现在正在努力通过控制 endpoints 与设备进行请求/响应 . 我的理解是控制 endpoints 具有USB规范中定义的功能,并且供应商在该 endpoints 上支持设备特定功能的一些小问题 . 我可以找到一百万个“供应商在控制 endpoints 上实现专有功能”的引用,但对于我的生活,我找不到一个如何在我的驱动程序代码中设置它的简单示例 .

使用usbpcap / wireshark和USBLyzer我可以使用它附带的Windows演示软件监控该设备 . 在我在Windows上监控的USB流量中,控制输出(主机到设备)熄灭,然后设备以数据包中的许多控制进行响应 .

这是控制输出请求信息:bmRequestType 21h bRequest 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输出没有显示设备回传?

谢谢!