zero与usb-skeleton结合测试

主机端的配置: 我们在host端(可以是一个装了linux的pc,或其他嵌入式设备也可以,但需要有usb host controller),在host端安装驱动usb-skeleton,这个驱动是主机端的驱动。我们后面再分析这个驱动。首先,需要编译usb-skeleton,在编译之前需要把修改两个宏。
[cpp]  view plain copy
  1. /* Define these values to match your devices */  
  2. #define USB_SKEL_VENDOR_ID 0xfff0  
  3. #define USB_SKEL_PRODUCT_ID 0xfff0</span>  

将这两个宏修改成对应于zero.c中的数。其中,在zero.c中有如下的定义:

[cpp]  view plain copy
  1. #define DRIVER_VENDOR_NUM   0x0525      /* NetChip */  
  2. #define DRIVER_PRODUCT_NUM  0xa4a0      /* Linux-USB "Gadget Zero" */  

 因此,这两个数需要相同(在usb设备插入,枚举时候会根据vendor id 和 product id给device找相应的host端的驱动)因此,需要将将USB_SKEL_VENDOR_ID 改成 0x0525,USB_SKEL_PRODUCT_ID改成0xa4a0。

编译模块usb-skeleton之后,生成usb-skeleton.ko。在主机端加载这个模块。另外主机还需要加载usb-core.ko、usb-ohci.ko等。会生成文件/dev/skel0.这个文件就代表了mini2440 。我们可以通过读写/dev/skel0,从而通过usb给mini2440发送数据。


gadget端的配置:gadget就是我们的mini2440。我们在gadget端需要安装的驱动有s3c2410_udc.ko和g_zero.ko。当然也可以把他们编译到内核中,直接烧写内核。我们需要加载这两个驱动,首先加载s3c2410_udc.ko。然后insmod g_zero.ko。另外,我们想让gadget起到的作用是loopback的作用,因此,这个需要在加载驱动时进行配置。方式是这样的: insmod g_zero.ko loopdefault=1 ,
其中loopdefault这个参数是用来将loopback configuration 作为设备的默认配置的。这样加载之后,从设备端的配置也结束了。


在host端执行#echo helloworld > /dev/skel0,在zero.c的ep的回调函数中添加打印语句可以看到收到的数据。然后在host端执行 #cat /dev/skel0

                    helloworld

我们又读回了helloworld。


usb-skeleton通过构造read和write的方法,直接往设备节点写数据就可以通过构造urb将数据发送出去,与g_zero那边的loopback配合来完成数据回环显示。linux就是喜欢这种有echo的功能,在UNP中一个echo server的实现讲了整整一部书。

这样,我们的这个测试例就结束了。


另外,补充一个调试手段。和网络变成一样,usb通讯的一个有效调试手段也是抓包。在windows上面通过usb hound可以抓usb包。在linux上面我们通过usb mon来抓包。貌似wireshark也有抓usb包的功能,我没有用过。通过usb mon抓包,需要对内核进行相应的配置选项。然后,

#mount -t debugfs none_debugs /sys/kernel/debug
#modprobe usbmon

再进入 /sys/kenel/debug/usb_mon 就可以看到各个usb host controller的对应项了。通过cat 1u 就可以看到第1个Host controller收发的包。

另外,lsusb -t也是很不错的工具,可以看到usb 设备的各种描述符。通过

cat /proc/bus/usb/devices   也可以查看usb设备的信息。

转自:http://www.xuebuyuan.com/1494145.html

你可能感兴趣的:(zero与usb-skeleton结合测试)