【原创】Tiny6410驱动模块的构建、加载和卸载

来源:互联网 发布:矩阵的秩的所有性质 编辑:程序博客网 时间:2024/05/16 09:47


【原创】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 *.korm -rf *.order</span>

原文链接:http://blog.csdn.net/geng823/article/details/37355109

0 0