linux驱动模块传参

  linux驱动加载模块可以使用“insmod”函数,使用“insmod”函数进行模块加载时也能进行参数的传递。

一、驱动模块传参简介

  驱动模块传参是一种可以随时向内核模块传递、修改参数的方法。例如可以传递串口驱动的波特率、数据位数、校验位、停止位等参数,进行功能的设置,以此节省编译模块的时间,大大提高调试速度
  Linux 内核提供了 module_param(name, type, perm)、module_param_array(name, type, nump, perm)宏和 module_param_string(name, string, len, perm)宏,分别进行基本类型、数组和字符串参数的传递。它们定义在 “/include/linux/moduleparam.h”文件中(在 module.h 文件中已经对 export.h 进行引用,所以不需要单独引用 moduleparam.h 文件),详细定义如下:

#define module_param(name, type, perm) \
module_param_named(name, name, type, perm)
#define module_param_array(name, type, nump, perm) \
module_param_array_named(name, name, type, nump, perm)
#define module_param_string(name, string, len, perm) \
static const struct kparam_string __param_string_##name \ = { len, string }; \ __module_param_call(MODULE_PARAM_PREFIX, name, \
&param_ops_string, \
.str = &__param_string_##name, perm, -1, 0);\ __MODULE_PARM_TYPE(name, "string")

1.1、module_param ()函数

  宏定义中的 module_param ()函数可以用来进行基本类型参数的传递,传入的三个参数定义如下:
  name:模块参数的名称
   type: 模块参数的数据类型
  perm: 模块参数的访问权限
  参数 type 可以取以下任意一种情况

bool : 布尔型
inbool : 布尔反值
charp: 字符指针(相当于 char *,不超过 1024 字节的字符串)
short: 短整型
ushort : 无符号短整型
int : 整型
uint : 无符号整型
long : 长整型
ulong: 无符号长整型。

  参数 perm 表示该参数在 sysfs 文件系统中所对应的文件节点的属性,其权限定义在“内核源码/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 /*与文件所有者不同组的用户可可执行*/

1.2、module_param_array ()函数

  如果要传递数组类型参数可以使用 module_param_array ()函数,相较于 module_param ()函数多了n_para参数,用来表示传递参数个数;n_para参数值会根据输入的参数个数而改变,n_para的最终值为传递的数组元素个数。

1.3、module_param_string()函数

  module_param_string(name, string, len, perm)函数,用来传递字符串类型的变量,四个参数的定义如下所示:
  name:外部传入的参数名,即加载模块时的传入值
  string:内部的变量名,即程序内定义的参数名
  len:以 string 命名的 buffer 大小(可以小于 buffer 的大小,但是没有意义)
  perm:模块参数的访问权限

二、应用实例

2.1、驱动代码

#include <linux/init.h>
#include <linux/module.h>
static int number;//定义int类型变量number
static char *name;//定义char类型变量name
static int para[8];//定义int类型的数组
static char str1[10];//定义char类型字符串str1
static int n_para;//定义int类型的用来记录module_param_array函数传递数组元素个数的变量n_para
module_param(number, int, S_IRUGO);//传递int类型的参数number,S_IRUGO表示权限为可读
module_param(name, charp, S_IRUGO);//传递char类型变量name
module_param_array(para , int , &n_para , S_IRUGO);//传递int类型的数组变量para
module_param_string(str, str1 ,sizeof(str1), S_IRUGO);//传递字符串类型的变量str1
static int __init parameter_init(void)//驱动入口函数
{
    static int i;
    printk(KERN_EMERG "%d\n",number);
    printk(KERN_EMERG "%s\n",name);                                                                                                                                                          
    for(i = 0; i < n_para; i++)
    {
        printk(KERN_EMERG "para[%d] : %d \n", i, para[i]);
    }
    printk(KERN_EMERG "%s\n",str1);
    return 0;
}
static void __exit parameter_exit(void)//驱动出口函数
{
    printk(KERN_EMERG "parameter_exit\n");
}
module_init(parameter_init);//注册入口函数
module_exit(parameter_exit);//注册出口函数

2.2、Makefile 文件

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += parameter.o	#helloworld.c对应.o文件的名称。名称要保持一致。
KDIR :=/home/z/Linux/linux_sdk/kernel    #内核源码所在虚拟机ubuntu的实际路径
PWD ?= $(shell pwd)
all:
	make -C $(KDIR) M=$(PWD) modules    #make操作
clean:
	make -C $(KDIR) M=$(PWD) clean    #make clean操作

2.3、运行测试

  驱动模块传参的命令格式为

nsmod 对应的模块 参数

  以下命令进行驱动的加载,加载完成之后驱动模块就会打印信息

insmod parameter.ko number=100 name="topeet" para=0,1,2,3,4,5,6,7 str="itop
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值