开发Linux下USB设备驱动程序的方法及实践体验(linuxusb开发)
在Linux下开发USB设备驱动程序是一项比较复杂的任务,也是内核开发中重要的一环。本文将介绍如何开发Linux下的USB设备驱动,并结合实际案例给出相应的实践体验。
1.下载源代码并编译内核
首先需要准备好Linux内核源代码,并从官网上进行下载安装。下载完成后,利用Makefile编译安装内核。Linux内核中已经有许多USB驱动程序,所以,准备编译内核时对预编译的USB驱动程序类型需要进行设置,使之与已有驱动程序进行匹配,这一步操作会比较繁琐,所以务必要认真操作,以免出现后续的麻烦。
2.设置usb设备的ID
当准备完成内核编译安装后,就需要设置相应的usb设备的vendor和product id,以此标识不同的设备,这时候可以通过linux的设备热插拔系统udev,调用udev_hset来配置usbid,需要创建一个文件,文件名为60-usbhid.rules,用于设置usbid,文件内容如下:
# The vendor id 1003 is matching VID_1020 and VID_1047 with PID_0003
SUBSYSTEMS==”usb”, ENV{ID_VENDOR_ID}==”1003″, ENV{ID_MODEL_ID}==”0003″, MODE=”664″
通过以上文件配置完成后,就可以看到usb设备,udev会自动发现识别设备,并调用内核中相应的usb驱动程序,来使设备工作。
3.编写usb设备驱动程序
只有当usb设备的ID正确识别后,才能进行后续的步骤,此时可以正式编写usb设备的驱动程序。在Linux下写USB设备驱动程序主要有两种方法:一种是通过模块驱动;另一种是通过用户态驱动程序,以运行在用户态下。两种驱动程序的区别在于执行权限,模块驱动程序在内核态中执行,具有最高的权限,而用户态的驱动程序会依赖于内核的接口,在用户态下执行,其权限要低于内核态。
在模块驱动程序编写过程中,可以通过一my_usb.c文件中的usb_init函数来完成驱动的提供,usb_init函数的编写如下:
static int __init my_usb_init(void)
{
int result;
/* Request resource for USB device*/
result = usb_register(&my_usb_driver);
if (result) {
printk(KERN_ERR “Failed to register Driver\n”);
return result;
}
printk(KERN_ERR “Succeed in registering Driver\n”);
return result;
}
然后在模块程序中需要调用usb_register函数注册驱动,用于关联USB内核驱动,这样才能实现usb设备的驱动程序编写。最后,需要通过insmod命令将编译后的模块文件安装到系统,来完成驱动程序的加载
所以,从上面我们可以看出,大致步骤就是:准备源代码编译安装内核,设置usb的id,编写usb设备驱动程序,然后通过insmod命令将驱动程序加载。完成以上步骤,就可以实现usb设备的驱动程序开发,从而使得usb设备正常使用。
实践体验:本人此次参与在Linux上开发usb设备驱动程序,和同事一起分析源代码,编写模块驱动程序,按照以上步骤,花费大概半个小时,最后成功完成驱动的安装,并使相应的usb设