mini2440 usb device controller 驱动的分析--gadget设备(五)--zero和usb-skeleton测试例

前面分析了这么多,在最后贴一个zero设备的测试例,供大家参考。在这个测试例中,需要对host端和gadget端都进行相应的配置。下面分开讲述。

主机端的配置:我们在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

将这两个宏修改成对应于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。在主机端加载这个模块。会生成文件/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 作为设备的默认配置的。这样加载之后,从设备端的配置也结束了。

 

我们将mini2440通过usb连接到host。在host上面,通过lsusb -v 可以看到从设备的具体信息。如下:

 

然后,我们测试loopback的功能。

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

                    helloworld

我们又读回了helloworld。

 

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设备的信息。
 
目前,我知道的调试方法只有这么多。
 
后面继续分析host 端的驱动。

 

 

 



 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页