主机端的配置:我们在host端(可以是一个装了linux的pc,或其他嵌入式设备也可以,但需要有usb host controller),在host端安装驱动usb-skeleton,这个驱动是主机端的驱动。我们后面再分析这个驱动。首先,需要编译usb-skeleton,在编译之前需要把修改两个宏。
/* Define these values to match your devices */ #define USB_SKEL_VENDOR_ID 0xfff0 #define USB_SKEL_PRODUCT_ID 0xfff0</span>
将这两个宏修改成对应于zero.c中的数。其中,在zero.c中有如下的定义:
#define DRIVER_VENDOR_NUM 0x0525 /* NetChip */ #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抓包,需要对内核进行相应的配置选项。然后,
再进入 /sys/kenel/debug/usb_mon 就可以看到各个usb host controller的对应项了。通过cat 1u 就可以看到第1个Host controller收发的包。
另外,lsusb -t也是很不错的工具,可以看到usb 设备的各种描述符。通过
转自:http://www.xuebuyuan.com/1494145.html