imx6ulevk linux内核usb驱动的问题

    在使用usb-skeleton.c usb设备驱动的时候,首先得修改USB_SKEL_VENDOR_ID

USB_SKEL_PRODUCT_ID这两个值,这两个值分别对应于production IDvendorID.

因为在usb枚举的过程中会通过这两个值与usb设备驱动进行匹配。

在开发板子的过程中,使用了U盘和鼠标的两个id。插上板子之后,板子原有的usb

驱动程序会被检测到,但是我自己开发的驱动不能被检测到,当我把id换成我的u

Id之后,我的驱动程序被检测到,探测程序被调用。所以猜想,usb设备驱动之间存在着竞争关系。Usb核心会优先使用系统自带的驱动与设备匹配,当系统驱动中没有相应的设备驱动的时候,才会调用我们开发的驱动。

经过验证之后。是存在这个竞争关系的。

例如,我们自己的usb驱动程序使用的是u盘的两个id。并且自己的模块能够正常加载。但是在插入u盘的时候,linux主机系统会优先使用系统已经带有的u盘的设备驱动,导致我们的驱动不会被检测,自然不能被加载。


通过修改usb-skeleton.c之后,加入了自己的u盾的两个idu盾的两个id肯定是没有加载到bsp系统的设备驱动的。编译,从新加载驱动。内核会提示成功。现在把自己的u盾插上之后。usb-core 调用了我修改驱动的

探测函数。并且正确加载了我的驱动。在/dev下面出现了在驱动里面定义的那个设备文件,test_usb0.然后用cat test_usb0.。里面打印了自己定义的printk().到此自己的usb驱动探索完成。后续的应用程序的开发可以使用skele0设备文件进行读写。

探测过程:

imx6ulevk linux内核usb驱动的问题_第1张图片

加载成之后:

imx6ulevk linux内核usb驱动的问题_第2张图片


到此,usb驱动程序探索完成。由于内核版本高。网上的都是2.6的。自己探索,花了很长时间。有不对的地方还请指教。


你可能感兴趣的:(linuxusb驱动)