前一篇博文讲解了ubuntu12.04下实现第一个设备驱动模块。这一次来实现以下带有参数的驱动模块。
操作过程在root权限下!
---------------------------------------------------------------------------------
我再桌面上面建立我文件夹,路径为:/home/gavin-guo/Desktop/workdir/driver/driverparam
这个里面有两个文件:driverparam.c和Makefile
它们的内容为:driverparam.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static char *namestr = "word";
static int age = 4;
static int driverparam_init(void)
{
printk(KERN_ALERT “name:%s\n",namestr);
printk(KERN_ALERT "age:%d\n",age);
return 0;
}
static void driverparam_exit(void)
{
printk(KERN_ALERT “Goodbye,driverparam”);
}
module_init(driverparam_init);
module_exit(driverparam_exit);
module_param(age,int,S_IRUGO);
module_param(namestr,charp,S_IRGO);1.include是引入的头文件
2.MODULE_LICENSE表示该模块带有的自由许可证。
3.namestr,age是定义的参数。定义的参数都应该给一个缺省值,insmod只在用户明确告诉它的时候,才改变它的值。
4.KERN_ALERT代表信息的级别的权限。
5.%s,%d代码占位符。
6.module_param,在insmod可以修改模块参数前,模块必须使它们可用,参数用module_param宏定义来声明,使用了三个参数:变量名,类型,权限掩码。至于最后一个权限掩码,是用来辅助的sysfs入口。S_IRUGO表示参数可以被所有人读取,S_IRUGO|S_IWUSR表示允许root来改变参数。至于参数的类型,有很多种。
Makefile
obj-m := driverparam.o
KERNELDIR := $(shell uname -r)
PWD := $(shell pwd)
modules:
这个是一个tab符号$(MAKE) -C /lib/modules/$(KERNELDIR)/build M=$(PWD) modules
modules_install:
这个是一个tab符号$(MAKE) -C /lib/modules/$(KERNELDIR)/build M=$(PWD) modules_install
脚本注释请参考: HelloWorld
----------------------------------------------------------------------------
ok,脚本写完了,我们在项目的根目录进行编译:make
成功之后,会在项目中生成下面的文件:
接下来,我们进行安装和测试输出:
可以看到在,没有明确告诉内核参数的情况下,它使用的是默认值,当我们给出参数的时候,就是显示我们指定的值。
我们在sys/modules下面可以看到driverparam文件夹,也就是我们的模块,在其中可以有一个paramters文件夹,里面有我们的参数文件。
经过上一次的折腾,这一次就顺利很多了,基本没有什么问题了。
本文介绍如何在Ubuntu 12.04环境下,使用C语言和Linux内核API实现并安装一个带有参数的驱动模块。通过创建特定文件夹、编写驱动源文件和Makefile,最终实现模块的初始化、退出、参数设置与读取功能。
864

被折叠的 条评论
为什么被折叠?



