想做USB设备驱动,必需的几点知识是:
3 呢,linux是通过Vendor ID和ProductID找到一个设备的驱动程序的。当一个usb设备插到系统上后,系统会自动向设备索取设备描述信息,这个信息里面有设备的类型,最大 数据包,还有上面提到的venderID和ProductID。收到设备描述信息后,linux系统会根据ID信息在已经注册的驱动程序中搜索,如果发现 匹配的驱动程序,就调用驱动程序的Probe函数。没有的话,就变成无法识别的设备。
为了有个感性的认识,举了USB驱动开发的例子。
系统情况: 内核版本是2.6.22
ubuntu系统。
USB设备是一个VendorID和ProductID分别为0x4500,0xdf10的USB键盘。
操作步骤:
到系统的/usr/src/linux-xxx的源代码目录下,打开driver/usb目录,里面有个usb-skeleton.c文件,这个是linux系统提供的usb设备驱动模板。
把这个文件拷贝到一个目录下,假设为/test_user。
打开这个模板文件,
找到
#define USB_SKEL_VENDOR_ID
#define USB_SKEL_PRODUCT_ID
两行,修改为
#define USB_SKEL_VENDOR_ID 0x4500
#define USB_SKEL_PRODUCT_ID 0xdf10
修改后,这个模板驱动程序实际上就可以被注册到linux中,并被调用。
首先编译这个驱动,
在模板文件所在目录,建立一个Makefile
内容为
obj-m := usb-skeleton.o
注意的是.o文件的名字和驱动源程序文件名字一定要一样。
然后用Make -C /usr/src/linux-headers-xxx/ M=`pwd` modules命令编译
结束后,会输出一个usb-skeleton.ko文件。
使用insmod usb-skeleton.ko将驱动加载到linux系统中。
加载后,将usb设备插到usb接口,这时候
dmesg |tail命令,就可以看到usb驱动输出的一些信息了。
下图是一个USB设备描述信息
- USB2.0协议规格,这个可以到www.usb.org网站下载,如果要做HID(人机接口设备)的话,还要看下hid的协议,也在该网站上。
- USB设备的工作方式,就是设备都会向主机提供那些信息
- linux如何发现USB设备,如何根据设备提供的信息搜索合适的驱动程序。
- linux驱动程序的开发方法,以及如何将驱动程序注册到linux系统中
3 呢,linux是通过Vendor ID和ProductID找到一个设备的驱动程序的。当一个usb设备插到系统上后,系统会自动向设备索取设备描述信息,这个信息里面有设备的类型,最大 数据包,还有上面提到的venderID和ProductID。收到设备描述信息后,linux系统会根据ID信息在已经注册的驱动程序中搜索,如果发现 匹配的驱动程序,就调用驱动程序的Probe函数。没有的话,就变成无法识别的设备。
为了有个感性的认识,举了USB驱动开发的例子。
系统情况: 内核版本是2.6.22
ubuntu系统。
USB设备是一个VendorID和ProductID分别为0x4500,0xdf10的USB键盘。
操作步骤:
到系统的/usr/src/linux-xxx的源代码目录下,打开driver/usb目录,里面有个usb-skeleton.c文件,这个是linux系统提供的usb设备驱动模板。
把这个文件拷贝到一个目录下,假设为/test_user。
打开这个模板文件,
找到
#define USB_SKEL_VENDOR_ID
#define USB_SKEL_PRODUCT_ID
两行,修改为
#define USB_SKEL_VENDOR_ID 0x4500
#define USB_SKEL_PRODUCT_ID 0xdf10
修改后,这个模板驱动程序实际上就可以被注册到linux中,并被调用。
首先编译这个驱动,
在模板文件所在目录,建立一个Makefile
内容为
obj-m := usb-skeleton.o
注意的是.o文件的名字和驱动源程序文件名字一定要一样。
然后用Make -C /usr/src/linux-headers-xxx/ M=`pwd` modules命令编译
结束后,会输出一个usb-skeleton.ko文件。
使用insmod usb-skeleton.ko将驱动加载到linux系统中。
加载后,将usb设备插到usb接口,这时候
dmesg |tail命令,就可以看到usb驱动输出的一些信息了。
下图是一个USB设备描述信息