1、代码编写,只有一个文件,内容如下
文件名为:mini2440_hello_module.c
#include <linux/kernel.h>
#include <linux/module.h>
static int __init mini2440_hello_module_init(void)
{
printk("Hello, Mini2440 module is installed !\n");
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good-bye, Mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
注解:
A、两个头文件是必须的,不要问为什么
B、mini2440_hello_module_init() 驱动加载函数,也是必须的
C、mini2440_hello_module_cleanup()驱动卸载函数,也是必须的
D、module_init(mini2440_hello_module_init) 你想让你的驱动运行起来,就必须有这个
E、module_exit(mini2440_hello_module_cleanup) 和 module_init 的意义刚好相反
B、MODULE_LICENSE("GPL"); 用于声明模块的许可证
2、驱动安装
驱动程序的安装有两种方式,第一种是模块方式,第二种是直接编译进内核
这里我就讲讲如何修改相应的配置文件,增加内核的配置菜单选项吧。这里涉及到两个文件一个是makefile和kconfig,makefile的作用就是编译,具体的来说就是写好一个程序你就必须写好它的makefile文件。kconfig的作用就是使得写好的驱动能增加到图形配置菜单中,简单来说,就是你想在内核配置菜单中看到你的内核选项,你就必须修改kconfig文件。
,下面我们就来讲讲如何修改makefile文件以及kconfig文件吧。假如我们写好了一个驱动程序,然后呢放在了drivers/char目录下,而且文件名为mini2440_hello_module.c。首先,我们先修改同目录下的makefile文件吧,如何修改呢?很多时候一打开一看怎么密密麻麻的呢,其实没关系的,你没看到吗?大部分的格式其实是一摸一样的,这就简单了,我们也依葫芦画瓢吧,我们加这一句: obj-$(CONFIG_MINI2440_HELLO) += mini2440_hello_module.o
对于这个语句是什么意思,我也不想在这里说的太详细了,最右边那个是我们的驱动文件的文件名,至于右边那个CONFIG是必须的,而那个MINI2440_HELLO呢,是我们等一下在Kconfig文件中要用到的。接着我们修改同目录下的Kconfig文件,找到menu“Character devices”在这下面开始添加吧,添加的内容如下:
config MINI2440_HELLO
tristate "MINI2440 BOARD HELLO TEST"
depends on ARCH_S3C2440
default m if ARCH_S3C2440
help
MINI2440 Board First module test.
在这里我也简单讲解一下上面这几条语句吧,最上面的config是必须的,这是它的格式这样说吧。下面一句呢,是它在内核配置单上显示的文字了,下面的那句是它的依赖,也就是说只有ARCH_S3C2440配置好了,我们才能配置这一驱动。最后的是它的帮助信息,以后你按照它的格式照着写就好了。懂了吧!
接着就是照着之前讲的如何编译内核编译一下内核了。输入:make menuconfig,将刚刚的模块选择为M吧,然后编译内核,把内核镜像烧进开发板。最后使用命令make SUBDIR=drivers/char/
modules再编译。得到mini2440_hello_module.ko这个就是我们要的驱动模块了,我们把它加到开发板,加载的方式有很多种,我一般是用串口加进开发板的。在开发板的lib目录下输入rz即可下载了。
ok,假如你已经成功下载驱动模块到开发板了,这时候你需要做的是加载驱动模块了,为了形象生动点,我就截图了吧:
注意:在执行make menuconfig,图形化界面中
Device Drivers -->....Character devices -->
下可能不会出现
MINI2440 BOARD HELLO TEST
选项,
需要进行以下动作,则会出现此选项
#make menuconfig命令进入内核配置界面,进入到“System Type”选项配置菜单,将S3C2440 Machines选项下做如下选择:只选择SMDK2440和SMDK2440 withS3C2440 CPU module两个选项。
Linux操作系统中模块操作相关命令解释
lsmod 查看已经安装好的模块, 也可以查看/proc/modules文件的内容. 实际上,lsmod读命令就是通过查看/proc/modules的内容来显示模块信息的.
modinfo 显示模块信息
modprobe 不需要指定路径,它会到默认路径下寻找模块。模块也存在依赖性问题: 比如你要加载msdos.ko, 需要先加载fat.ko. modprobe查看/lib/module/version/modules.dep得知模块的依赖关系
rmmod 卸载模块,但是内核会认为卸载模块不安全,可以添加命令强制卸载。
depmod 检查系统中模块之间的依赖关系,并把依赖关系信息存于/lib/modules/2.6.18-1.2798/modules.dep中。 一般加载模块后,要命令行下先执行 depmod -a后,在系统加载模块时候会查看modules.dep中模块依赖及路径信息,这样子才可以成功加载需要模块。
insmod 加载模块,需要指定完整的路径和模块名字。
注:本人遇到的问题
模块需要上传到:
/lib/modules/2.6.32.2
下,rmmod命令才会起作用,【2.6.32.2】为linux kernel版本号
如图
来源:oschina
链接:https://my.oschina.net/u/1028474/blog/541469