首页 要闻 金融 物流 汽车 国企 财经 公司 环保 能源

您的位置:首页 > 财经 >

linux驱动模块参数传递方式

来源:嵌入式小生    编审:    发布时间:2023-08-09 09:35:56

一、简介

嵌入式linux应用开发中,可以给main()函数传递参数,这样应用程序就能知道最初的控制参数是什么,当然也可以选择不向应用程序传递参数。在驱动开发中,会使用到insmod命令来加载一个驱动模块,这时候我们也可以使用insmod命令向驱动模块传递参数。


(相关资料图)

使用模块的参数传递机制,对调试系统非常方便!

二、参数传递方式

参数传递分为两种:

内置模块参数传递:即将模块编译构建进内核镜像。

外置模块参数传递:使用insmod等命令装在的内核模块。

对于内置模块参数传递,一般在bootloader中可向内置的模块传递参数,例如可以在bootargs中设置模块名.参数名=值的形式给该内置的模块传递参数;对于外置模块,在装载内核模块时,我们可以向模块传递参数,形式为:

insmode(或modprobe)模块名参数名=参数值

如果不传递参数,参数将使用模块内定义的缺省值。

三、技术点

1、变量权限

向驱动模块传递参数,必须事先在驱动源码中声明某一个变量可作为模块参数传递,并且指定变量的权限,常见的权限参数如下:

宏定义权限解释
#defineS_IRUSR 00400文件所有者可读
#defineS_IWUSR 00200文件所有者可写
#defineS_IXUSR 00100文件所有者可执行
#defineS_IRGRP 00040与文件所有者同组的用户可读
#defineS_IWGRP 00020
#defineS_IXGRP 00010
#defineS_IROTH 00004与文件所有者不同组的用户可读
#defineS_IWOTH 00002
#defineS_IXOTH 00001

上述宏定义中,S_I是公共的写法,R = read,W = write,X = execute , USR = user,GPR = group。

当然,也可以这样看:可以将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为 1 表示文件所有者可读,第二位为 1 表示文件所有者可写,第三位为 1 表示文件所有者可执行;接下来三位表示文件所有者同组成员的权限;再下来三位为不同组用户权限。

使用"|"(或操作),可以一次设置多个权限。

了解了一个变量有哪些常见的权限可供设置,接下来看看如何将一个变量声明为可传递参数的变量。

2、传递普通的参数

传递普通的参数(例如 bool、char、int),使用下列宏定义:

module_param(name,type,perm);

name:要传递进去参数的名称。

type:要传递进去参数的类型。

perm:要传递进去参数的读写权限。

module_param()宏在/sys/module下创建子目录。上述代码,将在/sys/module/中可查看对应的参数:

3、传递数组

传递数组参数使用下列的宏定义:

module_param_array(name,type,nump,perm)

name:要传递进去参数的名称。

type:要传递进去参数的类型。

nump:实际传入进去参数的个数。

perm:要传递进去参数的读写权限。

4、参数改变时回调

我们已经知道,可以向/sys/module/下的参数名称写入参数,这意味将改变参数的值,如果使用module_param()和module_param_array(),则无法获知参数的值是否改变,如果我们想要让系统获知参数的改变,并根据参数改变进一步执行处理,则需要使用module_param_cb()注册参数值改变时的处理函数。在内核中,module_param_cb()宏用于注册回调,每当参数(形参)发生变化时,将调用此回调函数:

module_param_cb(name,ops,arg,perm)

name:要传递进去参数的名称。

ops:该参数的set和get操作。

arg:传递给ops中回到函数的参数。

perm:要传递进去参数的读写权限。

四、代码实验

例如下列代码:

/************************************************************************************@Copyright:IriczhaoCo.,Ltd.2021-2029.Allrightsreserved.*@File:dt_param_trans_demo.c*@Descripttion:linuxkernelmoduleparameterpassingexperiment*@version:1.0*@Author:iriczhao*@Date:2023-08-71506*@LastEditors:iriczhao************************************************************************************/#include#include#include#includeintvalue,arr_value[4];char*name;intcb_value=0;//声明模块参数module_param(value,int,S_IRUSR|S_IWUSR);//integer类型module_param(name,charp,S_IRUSR|S_IWUSR);//String类型module_param_array(arr_value,int,NULL,S_IRUSR|S_IWUSR);//整型数组/*----------------------Module_param_cb()--------------------------------*/intnotify_param(constchar*val,conststructkernel_param*kp){intres=param_set_int(val,kp);//Usehelperforwritevariableif(res==0){printk(KERN_INFO"Callbackfunctioncalled...");printk(KERN_INFO"Newvalueofcb_value=%d",cb_value);return0;}return-1;}conststructkernel_param_opsmy_param_ops={.set=notify_param,.get=param_get_int,};module_param_cb(cb_value,&my_param_ops,&cb_value,S_IRUGO|S_IWUSR);staticint__initdt_param_trans_demo_init(void){inti;//打印出模块参数printk(KERN_INFO"Value=%d",value);printk(KERN_INFO"cb_value=%d",cb_value);printk(KERN_INFO"Name=%s",name);for(i=0;i<(sizeofarr_value/sizeof(int));i++){printk(KERN_INFO"Arr_value[%d]=%d",i,arr_value[i]);}printk(KERN_INFO"KernelModuleInsertedSuccessfully...");return0;}staticvoid__exitdt_param_trans_demo_exit(void){printk(KERN_INFO"KernelModuleRemovedSuccessfully...");}module_init(dt_param_trans_demo_init);module_exit(dt_param_trans_demo_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("iriczhao");MODULE_DESCRIPTION("linuxkernelmoduleparameterpassingexperiment");MODULE_VERSION("1.0");

将上述代码以模块方式构建,然后将生成的dt_param_trans_demo.ko模块载入内核,在加载该模块时,传入value、name、arr_value的参数值,在程序中将会打印出输出的参数值:

从上述输出的结果中,cb_value的参数值为0(默认参数值),然后我们通过向/sys/module/dt_param_trans_demo/parameters/cb_value文件写入参数值,这时候将会触发该参数改变时绑定的回调函数,并打印出修改过后的参数值:

在载入一个模块后,我们可以在/sys/module/模块名/parameters/目录下查看该模块包含导出了哪些动态参数(参数以文件名称表示),以及对应参数的权限(文件的权限对应参数的权限),例如本例中,将在/sys/module/dt_param_trans_demo/parameters/目录下查看:

五、总结

1、模块在载入的时候可以传递参数给模块,前提是在模块中提前声明需要传递的参数。

2、当在系统启动后,在/sys/module/模块名/parameters/目录中可以查看对应模块下导出了哪些参数。也可以通过该目录下的文件向对应的参数传递信新的参数值。

审核编辑:汤梓红

标签:

精彩推送

最火资讯

Copyright @2008-2018 名企时报网 版权所有
本站点信息未经允许不得复制或镜像 联系邮箱:9 9 2 5 8 3 5@qq.com
豫ICP备2020035338号-4 营业执照公示信息