分享

usb trace/monitor

 xsx2008 2014-02-18

usb trace/monitor  

2012-04-12 17:31:08|  分类: kernel |  标签:usb  libusb   |举报 |字号 订阅

linux kernel中有一个选项CONFIG_USB_MON,可以打开kernel的usb protocol monitor功能,在分析usb协议时挺有用的。

打开CONFIG_USB_MON后,重新编译kernel。新kernel运行起来后,可以看到在/sys中加入了以下目录:
# cd /sys/kernel/debug/usb/usbmon/                                             
# ls
1s 1u 1t 0s 0u

这样,cat 0u可以看到所有usb设备的trace。如果只想跟踪某条bus上的设备,可以cat非0的那个文件,比如1u。

我手头上有一个usb指纹头。在应用程序中,我通过libusb来控制指纹头、读取图像:
    int ret;

    ret = libusb_init(NULL);
    ASSERT(ret == 0);

    devh = libusb_open_device_with_vid_pid(NULL, xxxx_VID, xxxx_PID);
    ASSERT(devh != NULL);

    ret = libusb_set_configuration(devh, 1);
    ASSERT(ret == 0);

    ret = libusb_claim_interface(devh, 0);
    ASSERT(ret == 0);

    libusb_control_transfer(devh, 
        LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT, 
        CMD_INIT, 0, 0, NULL, 0, TIME_OUT); /* CMD_INIT为0xe0 */

    libusb_control_transfer(devh, 
        LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT, 
        CMD_GET_IMAGE, 0, 0, NULL, 0, TIME_OUT); /* CMD_GET_IMAGE为0xe5 */

    img_transfer = libusb_alloc_transfer(0);
    ASSERT(img_transfer != NULL);

    libusb_fill_bulk_transfer(img_transfer, devh, ep_bulk, buf,
        sizeof(buf), cb_img, jcb, 0);

    ret = libusb_submit_transfer(img_transfer);
    ASSERT(ret == 0);

这样trace的输出是:
e8c14120 1078039890 S Co:1:004:0 s 00 09 0001 0000 0000 0
e8c14120 1078043182 C Co:1:004:0 0 0
e8c14120 1078043457 S Co:1:004:0 s 40 e5 0000 0000 0000 0
e8c14120 1078043548 C Co:1:004:0 0 0
e8c14120 1078043670 S Bi:1:004:1 -115 16384 <
e8c148a0 1078043731 S Bi:1:004:1 -115 16384 <
e8c140a0 1078043823 S Bi:1:004:1 -115 16384 <
e8483c20 1078043884 S Bi:1:004:1 -115 16384 <
e8483ca0 1078043945 S Bi:1:004:1 -115 16384 <
e87dd6e0 1078046323 S Bi:1:004:1 -115 16384 <
e87dd9e0 1078046445 S Bi:1:004:1 -115 16384 <
e87dd260 1078046536 S Bi:1:004:1 -115 16384 <
e87dd2e0 1078046597 S Bi:1:004:1 -115 16384 <
e87dd3e0 1078046658 S Bi:1:004:1 -115 6144 <
e8c14120 1078060957 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e8c148a0 1078078182 C Bi:1:004:1 0 16384 = fafbf8fa f5f5f5fa fafafcfa f9f7fafb f9f9faf7 f9f9f7f9 f9f8fcfa f8f9f8f8
e8c140a0 1078095804 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e8483c20 1078113030 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e8483ca0 1078130134 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e87dd6e0 1078147359 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e87dd9e0 1078165103 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e87dd260 1078182207 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e87dd2e0 1078200073 C Bi:1:004:1 0 16384 = fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe fefefefe
e87dd3e0 1078206902 C Bi:1:004:1 0 6144 = fefefefe fefefaf4 f7f4f8fe fefefefe fefefefe fefefefe fefefefe fefefefe

trace的格式可以参考Documentation/usb/usbmon.txt。下面是trace的解析:
e8c14120 - urb tag
1078039890 - timestamp
S - event type. S: submission; C: callback; E: submission error
Co:1:004:0 - address. urb type+direction:bus no:dev address:endpoint
s - urb status. 一个字母或者数字。如果为字母,则表示setup packet,对应libusb.h中的libusb_control_setup
00 09 0001 0000 0000 0 - 分别为bmRequestType, bRequest, wValue, wIndex, wLength, data,为libusb_control_setup的成员

bRequest为09表示SET_CONFIGURATION
urb status为-115表示EINPROGRESS
从trace中可以看到libusb_set_configuration和 libusb_control_transfer对应的命令。另外,指纹头数据也可以看到。有关setup packet的介绍可以参考:

最后,可以参考
这里提供了一个方法,可以用wireshark抓取和查看usb trace。不幸的是,我这里没有试成功,以后有时间再试试。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多