嵌入式驱动——模块编程形式之模块传递参数

一、使用模块传递参数的原因:

安装同一个模块时给模块指定不同的功能特性,给模块传递参数可以实现不同功能选择。

二、配备的条件:

Linux kernel提供了一个简单的框架,其允许驱动程序声明参数,并且用户在系统启动或模块加载时为参数指定相应值。

三、特点:

在驱动程序里,参数的用法如同全局变量。

四、需包含头文件:
 

#include <Linux/moduleparam.h>

五、步骤:

首先将获取参数值的变量声明为全局变量,然后使用宏module_param()[在头文件Linux/moduleparam.h中]。

运行时,insmod将给变量赋予命令行的参数,如同insmod module.ko var="zhangsan"。为使代码清晰,变量的声明和宏都应该放在模块代码的开始部分。

六、module_param()介绍

该宏被定义在include/linux/module.h文件中。具体定义如下:

#define module_param(name,type,perm)    module_param_named(name,name,type,perm)

module_param 使用了3个参数:变量名name、类型type、以及一个权限掩码。

这个宏应当放在任何函数之外,典型的就是出现在源文件的前面。

模块参数支持许多类型:bool、invbool、charp(字符指针值,内存为用户提供的字符串分配,指针因此设置)

int,long,short,uint,ushort:基本的变长整型值。

需要传递多个参数可以通过宏module_param_array()实现:

module_param_array(name,type,num,perm);

参数说明如下:

name:数组的名字(也是参数名)。

type:数组元素的类型。

num:存放数组元素个数的指针,模块加载者拒绝比数组能放下的多的值。

perm:通常的权限值。

perm参数的作用:module_param字段是一个权限值,perm值可以控制谁可以存取这些模块参数在sysfs中的表示。如果perm被设置为0,就根本没有sysfs项;否则,它出现在/sys/module下面,带有给定的权限。使用S_IRUGO作为参数可以作为被所有人读取,但是不能改变;S_IRUGO|S_IWUSR允许root来改变参数。

限权在include/linux/stat.h中定义:

  #define S_IRUSR    00400 文件所有者可读
  #define S_IWUSR    00200 文件所有者可写
  #define S_IXUSR    00100 文件所有者可执行
  #define S_IRGRP    00040 与文件所有者同组的用户可读
  #define S_IWGRP    00020
  #define S_IXGRP    00010
  #define S_IROTH    00004 与文件所有者不同组的用户可读
  #define S_IWOTH    00002
  #define S_IXOTH    00001

七、通过宏MODULE_PARM_DESC()对参数进行说明:

static unsigned short size=1;
module_param(size,ushort,0644);
MODULE_PARM_DESC(size,"The size in inches of fishing pole" "connected to this computer.");

传递数组示例代码片段:

static int arr[MAX_FISH];
static int nr_arr;
module_param_array(arr,int,&nr_arr,0444);

八、总结模块参数实现的步骤:

  1. 定义一个全局变量
  2. 使用module_param(name,type,perm)或者module_param_array(name,type,num,perm)来说明变量是一个全局参数。
  3. 使用MODULE_PARM_DESC(name,desc);来对参数进行描述,解释说明。

  九、注意事项:

module_param()和module_param_array()最后一个参数权限值不能包含让普通用户也有写的权限,否者编译报错。可参考linux/moduleparam.h中的_module_param_call()的定义。                                   

猜你喜欢

转载自blog.csdn.net/pangyinglong/article/details/90169233
今日推荐