linux驱动: 如何向模块传递参数, module_param和module_param_array

如何向模块传递参数,Linux kernel 提供了一个简单的框架.
 
  1.  module_param(name, type, perm);
    name 既是用户看到的参数名,又是模块内接受参数的变量;
      type 表示参数的数据类型,是下列之一:byte, short, ushort, int, uint, long, ulong, charp, bool, invbool;
      perm 指定了在sysfs中相应文件的访问权限。访问权限与linux文件访问权限相同的方式管理,如0644,或使用stat.h中的宏如S_IRUGO表示。
            0    表示完全关闭在sysfs中相对应的项。
            #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
            
  这些宏不会声明变量,因此在使用宏之前,必须声明变量,典型地用法如下:
  static unsigned int int_var = 0;
  module_param(int_var, uint, S_IRUGO);
    insmod xxxx.ko int_var=x

2.传递多个参数可以通过宏 module_param_array(para , type , &n_para , perm) 实现。
  
        其中,para既是外部模块的参数名又是程序内部的变量名,type是数据类型,perm是sysfs的访问权限。指针nump指向一个整数,其值表示有多少个参数存放在数组para中。
     para:参数数组; 数组的大小才是决定能输入多少个参数的决定因素.
     n_para:参数个数; 这个变量其实无决定性作用;只要para数组大小够大,在插入模块的时候,输入的参数个数会改变n_para的值,最终传递数组元素个数存在n_para中.
  
  典型地用法如下:
  static int para[MAX_FISH];
  static int n_para;
  module_param_array(para , int , &n_para , S_IRUGO);

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>

static char *name = "Ocean";
static int count = 2;
static int para[8] = {1,2,3,4};
static int n_para = 1;
module_param(count, int, S_IRUGO);
module_param(name, charp, S_IRUGO);
module_param_array(para , int , &n_para , S_IRUGO);

static struct file_operations first_drv_fops={
    .owner = THIS_MODULE,
    .open = first_drv_open,
    .write = first_drv_write,
};

int first_drv_init(void)
{
    printk("init first_drv drv!\n");

    int i;
    for (i = 0; i < count; i++)
        printk(KERN_ALERT "(%d) Hello, %s !\n", i, name);

    for (i = 0; i < 8; i++)
        printk(KERN_ALERT "para[%d] : %d \n", i, para[i]);

    for(i = 0; i < n_para; i++)
        printk(KERN_ALERT "para[%d] : %d \n", i, para[i]);

    return 0;
}

void first_drv_exit(void)
{
    printk("exit first_drv drv!\n");
}   

module_init(first_drv_init);
module_exit(first_drv_exit);

MODULE_AUTHOR("Ocean Byond");
MODULE_DESCRIPTION("my first char driver");
MODULE_LICENSE("GPL");

数组大小为8,但只传入4个参数,则n_para=4.

数组大小为8,但只传入8个参数,则n_para=8.

数组大小为8,传入9个参数,数组不够大,无法传入.

时间: 2024-08-28 13:59:16

linux驱动: 如何向模块传递参数, module_param和module_param_array的相关文章

linux驱动开发第二步 驱动模块传参(module_param函数使用)

在驱动的模块中声明一下你要传递的参数名称,类型和权限 module_param(变量的名称,类型,权限); 先上例子 #include <linux/init.h> #include <linux/module.h> static char *p_name = "Usr"; module_param(p_name, charp, S_IRUGO); MODULE_PARM_DESC(p_name, "This is a char * string.&q

Linux学习笔记 -- 为 Shell 传递参数

我们可以在执行 Shell 脚本时,可以向脚本传递参数.脚本内获取参数的格式为:$n.(n 代表一个数字,0为所执行的shell脚本名称,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……) 举例说明 我们先编写一个脚本,名字为test.sh,她的内容如下: #!/bin/bash echo "Shell 输出脚本名称及参数"; echo "执行的脚本名:$0"; echo "第一个参数为:$1"; echo "第二个

Linux之module_param()--给模块传递参数

1. 用户态下编程: 通过main()来传递命令行参数 编写一个内核模块: 通过module_param()来传递命令行参数 2. module_param宏是Linux 2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中 3. module_param使用了3个参数:变量名,它的类型,以及一个权限掩码用来做一个辅助的sysfs入口 module_param(name, type, perm); name既是用户看到的参数名,又是模块内接受参数的变量:

linux xargs 不同命令中传递参数

find . -amin -40 | grep -v "^./\." | grep -v ^.$ | xargs -I {} sudo mv {} ./test/ -a file 从文件中读入作为sdtin -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止. -p 当每次执行一个argument的时候询问一次用户. -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有

linux内核可以接受的参数 | Linux kernel启动参数 | 通过grub给内核传递参数

在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB或LILO等启动程序调用之时传递给kernel. 3.在kernel运行时,修改/proc或/sys目录下的文件. 这里我简单讲的就是第二种方式了,kernel在grub中配置的启动参数. 首先,kernel有哪些参数呢? 在linux的源代码中,有这样的一个文档Documentation/kern

linux驱动之模块化驱动Makefile

本文摘自http://blog.csdn.net/lufeiop02/article/details/6446343 Linux驱动一般以模块module的形式来加载,首先需要把驱动编译成模块的形式.简单的例子, #include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> static int __init test_init(void) { printk("init

Linux驱动开发之初始化参数

先上代码: #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/moduleparam.h> static char* whom = "World"; static int howmany = 1; module_param( howmany, int, S_IRUGO ); module_param( wh

一步一步实现Linux设备驱动的Helloworld模块

学了那么多程序语言,总是有一个Hello world开头,不禁感叹Hello world的强大.呵呵,废话少说,咋们的故事当然要从这个Hello world开始. 先查看自己OS使用的内核版本[[email protected]:~]$ uname -r2.6.22-14-generic /* 这是我显示的结果 */ 如果安装系统时,自动安装了源码.在 /usr/src 目录下有对应的使用的版本目录.例如下(我是自己下的)[[email protected] :/usr/src]# lslinu

嵌入式linux驱动开发之给你的linux系统添加温度传感器模块

忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而且剩余很多,可以用软件资源来代替硬件资源,比如说可以用视频编解码软件取代硬件来工作.但有很多模块需要实时的采集数据这都是软件永远无法代替的,而且随着互联网的进一步发展,智能化也是一个必然的趋势,因此大量的传感器和控制芯片将被应用到生产生活中,所以个人觉得驱动开发还是个不错的方向.同时,作为学习者,再