[驱动]内核添加USB转串口驱动支持

时间:2022-12-23 15:54:14

转自:http://blog.csdn.net/gatieme/article/details/49491325

目录

1. 问题

2. 驱动源码

3. 内核配置

4. 编译内核和模块驱动

5. 加载驱动

问题


这两天为了做gps和arm的通讯,不得不捣鼓这个东东。开发板是创维特jx2410,usb转串口线的芯片是pl2303。还好是这个芯片,让我没费多少力气,就达成了目的。因为linux对它已经支持了,我们只要编译、加载它的驱动就ok了。

驱动源码


一般来说USB转串口的驱动已经集成在内核中,我们无需下载,只需要在编译时进行一些配置即可. 
因此在编译之前我们需要确认自己的内核中有没有USB转串口的驱动. 
usb转串口的驱动位于内核源码根目录下/drivers/usb/serial

[驱动]内核添加USB转串口驱动支持 
主要的源码包括usb-serial.coption.c,pl2303.c
针对不同的芯片还有cp210x.c 和 pl2303.c 
例如在我们本例中使用的就是pl2303

内核配置


使用make menuconfig进行配置

主要配置信息如下

-->Device Driver

  -->usb support

    -->USB Serial Converter Surpport相关的选项。

  • usb generic serial driver选中
  • usb prolific 2303 single port serial driver配成M。

具体配置如下图所示 
首先打开menuconfig,进入Device Drivers驱动配置页面 
[驱动]内核添加USB转串口驱动支持 
进入usb support USB驱动配置页面主要配置信息如下 
usb support下 
[驱动]内核添加USB转串口驱动支持

选择USB Serial Converter Surpport相关的选项。 
[驱动]内核添加USB转串口驱动支持

[驱动]内核添加USB转串口驱动支持

选中USB Serial Converter Surpport和 
usb generic serial driver 
[驱动]内核添加USB转串口驱动支持

最后选择对应的芯片,注意这里选择为M,将驱动编译成模块,动态加载

编译内核和驱动模块

make zImage, make modules 
[驱动]内核添加USB转串口驱动支持 
make modules 
[驱动]内核添加USB转串口驱动支持

加载驱动


最后在源码目录下pl2303.ko 就是我们需要的驱动,在板子上直接insmod即可

[驱动]内核添加USB转串口驱动支持

问题:

1. usb设备调试命令

lsusb: 列出usb设备和属性, lsusb -v可以查看设备的详细属性

ls /dev/tty*: 查看usb设备是否有加载成功

2. make dep/make module, insmod/rmmod, depmode/modprobe三组的具体用法

http://www.cnblogs.com/jacklikedogs/p/4659249.html

  • 这里面提到加载内核驱动的正常流程,首先拷贝*.ko文件到/lib/module/`uname -r`/kernel/driver/usb, 其次执行depmode -a建立依赖,更新module.dep,最后运行modprobe加载模块
  • modprobe相较于insmod的话,更加智能,会根据module.dep建立的模块依赖关系,安排加载顺序,若insmod则可能会出现undefined symbol等问题
  • 所以在加载pl2303.ko驱动,只要depmod -a, 后使用modprobe pl2303.ko即可,不需要再有insmod usb-serial.ko, insmod option.ko, insmod pl2303.ko等操作

3. 除了在rc中添加insmod, 在开机使用modprobe如何自动加载模块

  • /lib/modules/version: cp yourdrivername.ko /lib/modules/`uname -r`/kernel/drivers/misc
  • depmod -a: 使用depmod -a应该也是可以的,该文件,会一直保存的,不随断电而消失, 或者编辑/lib/modules/`uname -r`/modules.dep,设置驱动程序之间的关联,增加一行: /lib/modules/`uname -r`/kernel/drivers/misc/yourdrivername.ko
  • modprobe: 编辑/etc/rc.d/rc.local,增加一行: /sbin/modprobe yourdrivername

4. 理解depmod -a和modprobe

  • depmod -a: 通过读取/lib/modules/version下的每一个模块来创建模块的依赖性列表,也就是/lib/modules/version下的modules.dep文件,所以执行depmod -a不需要到特定目录下,且待加载模块需要拷贝到/lib/modules/version目录下
  • modprobe: modprobe pl2303, 不需要pl2303.ko, modprobe会读取modules.dep文件,并决定模块加载顺序。

[驱动]内核添加USB转串口驱动支持

5. 将pl2303.ko和option.ko, usb-serial.ko拷贝到板子的/lib/modules/3.14.**/kernel/drivers/usb下->depmod -a->modprobe, 系统启动会自动加载吗?

在测试pl2303.ko,发现系统启动会自动加载,不知什么原因?

6. Make zImage, make modules, make modules_install怎么理解?

当menuconfig中将模块设置为"M"时,make zImage不会把模块编译进内核。这时,可以使用make modules编译模块源码为*.ko文件,然后通过make modules_install动态加载该模块。