驱动模块传参

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

name:参数的名字

type:参数类型

perm:权限---对参数的操作权限

  0 文件系统不可见--只能当前模块使用该参数

  0444 world-readable 所有用户可读

  0644 root可写

模块传递参数类型:byte, short, ushort, int, uint, long, ulong,charp,bool,invbool

  其中:charp是字符串指针类型

       bool: a bool, values 0/1, y/n, Y/N

       invbool: 取反 (N = true)

举例说明: int  x = 20; module_parammodule_param(x,int,0664); 加载模块时传递参数 sudo insmod demo.ko x=10 ,模块运行时参数就变为了10 

一. 传递 charp 和 int 型

在驱动程序中定义 char指针和int变量;然后通过 module_param 指定传递参数的变量名,类型及权限;使用 MODULE_PARM_DESC 描述这个传递的参数;

驱动程序 demo.c 文件

#include <linux/module.h>
int demoint = 10;                  // 通过下面的宏使用时可以在加载时传递参数
char *str= "world";
static int __init demo_init(void)    // 入口函数
{
// 加载模块时通过内核打印传参值
    printk(KERN_DEBUG " init %s---- %d --- %s
",__func__,__LINE__,str);
    return 0;
}
static void __exit demo_exit(void) // 出口函数
{
// 卸载模块时通过内核打印传参改变的值
    printk(KERN_INFO" exit %s --- %d %d
",__func__,__LINE__,demoint); 
}
module_init(demo_init);  // 模块入口
module_exit(demo_exit);   // 模块出口
MODULE_LICENSE("GPL");  // 模块协议

module_param(demoint,int,0644); // 模块传参,指定参数,类型,权限 MODULE_PARM_DESC(demoint,"demoint for test "); // 传参介绍描述 module_param(str,charp,0644); MODULE_PARM_DESC(str,"demoint for test ");

Makefile文件: 想在开发板上运行就要配置指定用开发板上的内核源码中的Makefile 编译

# 这个路径是开发板内核源码路径,使用这个路径时可以编译到开发板上运行
# KERNELDIR=/home/linux/share/kernel-3.4.39/ 
# 这个路径是虚拟机中内核源码路径,只能在虚拟机上运行 
KERNELDIR=/lib/modules/3.13.0-32-generic/build  
PWD=$(shell pwd)
all:
    make -C $(KERNELDIR) M=$(PWD) modules
clean:
    make -C $(KERNELDIR) M=$(PWD) clean
obj-m +=demo.o

加载模块时,指定参数名及参数值

通过传参加载模块:sudo insmod demo.ko demoint=0 str="modules"  

 

 二。 传递数组 array

 demo.c 驱动模块文件

#include <linux/module.h>
int array[16] = {1,2,3,4,5}; // 定义数组
int len; // 定义数组的长度
static int __init demo_init(void)
{
    int i=0;
    printk(KERN_DEBUG " init %s---- %d
",__func__,__LINE__);

    // 加载内核时打印内容
    for(i=0;i<16;i++) // 内核打印数组内容
    {
        printk("array[%d] = %d
",i,array[i]);
    }

    return 0;

static void __exit demo_exit(void)
{
    printk(KERN_INFO" exit %s --- %d 
",__func__,__LINE__);
}
module_init(demo_init);     // 模块入口
module_exit(demo_exit);  // 模块出口
MODULE_LICENSE("GPL");   // 模块协议
// 导入数组参数,数组名,类型,长度,权限,其中长度设为 NULL 自动获取长度
module_param_array(array,int,&len,0644);  // 指定数组名,数组类型,长度,及权限
MODULE_PARM_DESC(array, "array test 
"); // 描述数组

加载模块时传递数组中元素值:sudo insmod demo.ko array=6,7,8,9,0

 

三 。 对于模块的一些操作命令 以 demo.ko 为例

insmod demo.ko  加载模块

rmmod demo  卸载模块

lsmod   查看内核中加载的模块

modinfo demo.ko 查看这个模块的信息

 

 dmesg 查看内核打印信息

sudo dmesg  -c  清除内核的打印信息,回显清除

sudo dmesg -C  不回显清除 

sudo modprobe vivi  加载带依赖的模块 vivi.ko 

sudo modprobe -r vivi  卸载带依赖的模块 vivi.ko

 安装摄像头调试工具xawtv: sudo apt-get install  xawtv    也可以使用  cheese 摄像头调试工具

原文地址:https://www.cnblogs.com/electronic/p/11141742.html