(ARM+DSP开发)Linux中如何以模块方式加载没有烧写进内核的驱动
因为我需要在开发板上(OMAPL138-ARM+Linux双核)连接一个USB转串口的设备,而内核中没有编译进相关驱动,所以无法识别出该设备,USB转串口线的芯片是PL2303,PL2303芯片驱动已经集成到了Linux的内核源码中,只是ARM Linux 把它剪裁掉了,需要重新编译为内核模块,并加载。
以模块方式编译,加载过程如下:
在内核所在目录:
cd omapl138/linux-3.3/
- 配置内核:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- da850_omapl138_tl_defconfig
- 打开配置界面:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
进入“Device Drivers”-->
选中USB support(*),进入其中-->
USB Serial Converter Surpport配置成M,进入其中--->
选中USB Generic Serial Driver(*),
USB Prolific 2303 Single Port Serial Driver配成M。
保存退出。
default Y表示默认编译到内核,有Y、M、N三种选择,M表示编译为内核模块,N表示不编译。
- 编译模块:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- modules
编译完成后,在drivers/usb/serial下,生成了pl2303.ko文件。将该文件下载到ARM板任意目录上,在ARM端命令执行
insmod pl2303.ko
加载驱动。
- 加载了驱动后,可以通过
dmesg | grep usb
查看加载的USB驱动信息,当看到以下信息:
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver Core
usbcore: registered new interface driver pl2303
usb 1-1: pl2303 converter now attached to ttyUSB0
说明已正确加载驱动。
- 或者通过命令:
ls /sys/bus/usb-serial/drivers
查看驱动已是否加载,当看到以下信息:
generic option1 pl2303
说明已正确加载驱动。
- 可以通过命令:
ls -l /dev/ttyUSB0
查看端口信息,如读写权限等:
crw-rw---- 1 root dialout 188, 0 2015-09-02 11:18 /dev/ttyUSB0
或者通过命令:
dmesg | grep ttyUSB0
查看信息:
[ 20.956427] usb 3-2.3: pl2303 converter now attached to ttyUSB0
[ 28.412579] type=1503 audit(1441078763.210:19): operation="open" pid=1874 parent=1852 profile="/usr/sbin/cupsd" requested_mask="w::" denied_mask="w::" fsuid=0 ouid=0 name="/dev/ttyUSB0"
[ 9994.613062] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0
[29474.242048] usb 3-2.3: pl2303 converter now attached to ttyUSB0
- 一开始要确定连接到系统上的是哪个USB设备可以通过命令:
lsusb
显示系统中以及连接到系统的USB总线信息。
- 可以通过
modinfo [模块名]
查看模块信息
- 通过
modinfo [模块名] | grep depend
查看模块依赖
- 通过
cat /var/log/messages | tail
或者
dmesg | tail
查看系统日志。
- 模块编译方法:
make -C ${KERNELSRC} M=${PWD} modules
其中KERNELSRC为内核源码目录,一般为
/usr/src/${shell uname -r}
M表示模块源码的当前目录
其它硬件驱动可类推。