嵌入式Linux驱动模块传参简介

什么是驱动传参
        在装载内核模块时, 用户可以向模块传递参数, 形式为“insmode(或 modprobe) 模块名参数名=参数值” , 如果不传递, 参数将使用模块内定义的缺省值。 如果模块被内置, 就无法 insmod 了, 但是 bootloader可以通过在 bootargs 里设置“模块名.参数名=值” 的形式给该内置的模块传递参数。
驱动传参的作用
 设置驱动的相关参数, 比如设置缓冲区的大小
设置安全校验, 防止我们写的驱动被人盗用
怎么给驱动传参数
传递普通的参数, 比如 char int 类型, 使用如下函数:

函数module_param(name,type,perm);
参数 name要传递进去参数的名称
参数 type要传递进去参数的类型
参数 perm要传递进去参数的读写权限

部分常用参数权限解释如下:

宏定义权限解释
#defineS_IRUSR 00400文件所有者可读
#defineS_IWUSR00200文件所有者可写
#defineS_IXUSR 00100文件所有者可执行
#defineS_IRGRP00040与文件所有者同组的用户可读
#defineS_IWGRP00020
#defineS_IXGRP 00010
#defineS_IROTH 00004与文件所有者不同组的用户可读
#defineS_IWOTH00002
#defineS_IROTH 00004与文件所有者不同组的用户可读
#defineS_IWOTH00002
#defineS_IXOTH 00001

其它的可以使用下面的方法来判断:
        可以将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为 1 表示文件所有者可读,第二位为 1 表示文件所有者可写,第三位为 1 表示文件所有者可执行;接下来三位表示文件所有者同组成员的权限;再下来三位为不同组用户权限。
传递数组使用以下函数:

函数module_param_array(name,type,nump,perm)
参数 name要传递进去参数的名称
参数 type要传递进去参数的类型
参数 nump实际传入进去参数的个数
参数 perm要传递进去参数的读写权限

驱动模块传普通参数
parameter.c 文件
 

/*
* @Descripttion: 驱动模块传普通参数
* @version:
* @Author:topeet
* @Date: 2021-02-23 14:51:57
*/
#include <linux/init.h>
#include <linux/module.h>

//定义整型变量 a
static int a;
//传递普通的参数 a,参数权限为 S_IRUSR, 意为可读
module_param(a ,int,S_IRUSR);

static int hello_init(void)
{
    //打印变量 a
    printk("a = %d \n",a);
    printk("hello world! \n");
    return 0;
} 

static void hello_exit(void)
{
    //打印变量 a
    printk("a = %d \n",a);
    printk("gooodbye! \n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

我们将 parameter.c 文件拷贝到
Ubuntu 的/home/topeet/driver/imx6ull/parameter 目录下, 大家可以拷贝到 Ubuntu 上任意目录。 修改 Makefile 为:

obj-m += parameter.o #先写生成的中间文件的名字是什么, -m 的意思是把我们的驱动编译成模块
KDIR:=/home/topeet/driver/imx6ull/linux-imx-rel_imx_4.1.15_2.1.0_ga/
PWD?=$(shell pwd) #获取当前目录的变量
all:
    make -C $(KDIR) M=$(PWD) modules #make 会进入内核源码的路径, 然后把当前路径下的代码编译成
模块

编译成功如下图所示:

我们通过 nfs 将编译好的驱动程序加载模块,进入到共享目录, 加载驱动模块如图所示:

cd /mnt/nfs/
ls
cd imx6ull/
cd parameter/
insmod parameter.ko

卸载驱动, 然后改变参数的值, 再次加载驱动模块, 如下图所示: 

rmmod parameter
insmod parameter.ko a=5

输入lsmod命令, 查看模块信息,如下图所示:
 

我们进入到/sys/module/parameter/目录下, 查看变量 a 的读写权限, 如下图所示:

cd /sys/module/parameter/
ls
cd parameters/
ls
ls -l

 

如上图所示, 查看到变量 a 的读写权限为-r,意为可读, 驱动程序里面设置的变量 a 的权限为 S_IRUSR,意为可读, 所以变量 a 传参成功。
 驱动模块传数组

parameter.c文件, 在此基础上进行编写。
 

/*
* @Descripttion: 驱动模块传递数组
* @version:
* @Author: topeet
*/
#include <linux/init.h>
#include <linux/module.h>
//定义数组 b
static int b[5];
//定义实际传入进去参数的个数
static int count;
static int a;
module_param(a ,int,S_IRUSR);
//传递数组的参数
module_param_array(b,int,&count,S_IRUSR);

static int hello_init(void)
{
    int i;
    //循环遍历数组 b 的值
    for(i = 0;i<count;i++)
    {
        //打印数组 b 的值
        printk("b[%d] = %d \n",i,b[i]);
    } 
    //打印传入参数的个数
    printk("count= %d \n",count);
    //printk("a = %d \n",a);
    //printk("hello world! \n");
    return 0;
} 

static void hello_exit(void)
{
    printk("a = %d \n",a);
    printk("gooodbye! \n");
} 
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

我们再将驱动传入数组的代码编译成驱动模块, 加载驱动模块, 如下图所示:
 

同样我们可以进入到/sys/module/parameter/目录下, 查看变量 b 的权限, 如下图所示:

cd /sys/module/parameter/
ls
cd parameters/
ls
ls b -l

 如果我们多传入进去参数, 会发生什么呢?我们试试传入六个数

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木士易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值