【原创】Tiny6410驱动模块的构建、加载和卸载
准备工作
在构建模块驱动之前首先要编译与Tiny6410中完全对应的内核源码,生成zImage。首次编译内核会比较慢,之后就会比较快,若只是构建模块驱动,编译一次即可。
编译Tiny6410参考连接: 【原创】Ubuntu12.04下交叉编译Linux内核到Tiny6410
在对应内核正确编译完成后,找到模块驱动源码,在我的Ubuntu12.04中,路径pwd为/home/yang/tarpackage/mini6410/linux-2.6.38/drivers/char,其中/home/yang/tarpackage/mini6410/linux-2.6.38/为内核源码位置,此源码是友善之臂提供,已配置好,唯一要做的就是在源码目录下将config_linux_mini6410复制为.config,然后就可以编译内核。当然,也可以在源码目录下通过命令make menuconfig根据自己的需要进行配置。
比如,我要测试源码中的下面几个文件对应的模块驱动,如下图,那么我首先就要运行命令make menuconfig,通过配置界面取消掉对应的模块驱动,然后在源码目录下执行make zImage命令,编译出新的内核,生成的zImage在目录/home/yang/tarpackage/mini6410/linux-2.6.38/arch/arm/boot 下,然后把此zImage复制到用来烧写系统的SD卡中,即覆盖掉卡中原有的zImage,然后重新烧写Tiny6410开发板,完成之后即可。
然后进入目录/home/yang/kernel_drive下,建立为每一个想要构建的驱动模块建一个目录。将/home/yang/tarpackage/mini6410/linux-2.6.38/drivers/char中驱动源码拷贝到对应目录中,我的驱动子目录如下图:
开始构建驱动模块
以hello_module中的驱动为例,有两个文件,一个驱动文件hello_module.c,一个Makefile文件。如下图。源码见附录。
在hello_module目录中,执行make即可,会生成驱动文件,以.ko为后缀,如下图:
正确执行后结果目录中所有文件如下图,其中hello_module.ko即是驱动模块。执行make clean 可清除生成的文件。
然后用一种方法将hello_module.ko拷贝到新烧写系统的开发板中,进入hello_module.ko所在目录。
加载驱动模块
insmod hello_module.ko 此命令可加载hello_module.ko
modprobe hello_module 此命令也可加载hello_module.ko,命令中不带后缀.ko,此命令可自动分析模块的依赖关系。
说明:如果是用串口控制操作开饭,加载成功后即可看到输出信息 Hello,geng world。
如果是用键盘直接操作开发板,在开发板显示屏上看不到输出信息,不过可以通过命令dmesg | tail看到信息Hello,geng world。
另外可以用命令lsmod来查看当前都加载了哪些模块。
卸载驱动模块
rmmod hello_module 此命令可卸载hello_module.ko,命令中不带后缀.ko
modprobe -r hello_module 此命令也可加卸载hello_module.ko,命令中不带后缀.ko
说明:如果是用串口控制操作开饭,卸载成功后即可看到输出信息 Goodbye,geng world。
如果是用键盘直接操作开发板,在开发板显示屏上看不到输出信息,不过可以通过命令dmesg | tail看到信息Goodbye,geng world。
另外可以用命令lsmod来查看当前还剩下哪些加载的模块。
附录源码
hello_module.c
<span style="font-size:18px;">#include <linux/module.h>
#include <linux/init.h>
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, geng world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, geng world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("+++Geng+++"); </span>
Makefile
<span style="font-size:18px;">#此Makefile可做为通用的Makefile文件,使用时只需修改对应的目标文件和KDIR即可
obj-m :=hello_module.o #目标文件
#module-objs := file1.o file.o #当模块有多个文件组成时,添加本句
#内核路径,根据实际情况换成自己的内核路径,嵌入式的换成嵌入式,PC机的指定PC机路径
KDIR :=/home/yang/tarpackage/mini6410/linux-2.6.38
#上面的路径是为6410开发板设置的,要保证make之前内核已经正确编译过
#KDIR :=/usr/src/linux-headers-$(shell uname -r)
#上面路径为我的ubuntu12.04设置的,ubuntu版本可以通过uname -r查看,同样要在make前先编译对应内核
PWD := $(shell pwd) #模块源文件路径
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
@rm -rf *.mod.*
@rm -rf .*.cmd
@rm -rf *.o
@rm -rf Module.*
clean:
rm -rf *.ko
rm -rf *.order</span>