zoukankan      html  css  js  c++  java
  • 驱动模块传参

    #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 摄像头调试工具

  • 相关阅读:
    javascript小记
    好看的echart的词云效果(wordCloud)
    工作中经常用到的git的简单操作记录
    积累就是提升之浅谈分时函数
    有意思的面试小试题
    分享张鑫旭大神的,纯css打字小技巧,我顺便收藏一下
    模仿也是提高,纯css小技巧实现头部进度条
    推荐好用的css调试工具,两个
    There appears to be trouble with your network connection. Retrying
    Enter passphrase for key ‘/root/.ssh/id_rsa’ : git push 重复输入密码的问题
  • 原文地址:https://www.cnblogs.com/electronic/p/11141742.html
Copyright © 2011-2022 走看看