Linux驱动开发-安装驱动参数传递

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux驱动开发-安装驱动参数传递相关的知识,希望对你有一定的参考价值。

一、简介

在Linux下进行C语言开发时,经常在命令行传递参数给C程序,常见的Linux命令也是需要传参的,这样用起来就很灵活,根据不同的参数可以执行不同的效果。

Linux驱动安装时也支持传递参数,和命令行上运行的命令原理类似。

只不过在编写驱动的时候,需要在驱动代码里提前将相关信息声明好才可以使用。

这篇文章就介绍如果在命令安装驱动时,传递参数给驱动代码,演示各种类型的参数传输情况。

在驱动代码里声明传入参数的类型、权限,接收的变量名称。

module_param(变量的名称,类型,权限)

二、在驱动代码里声明传递参数的格式

/*传递整型类型数据*/
int int_data = 0;
module_param(int_data, int ,0664);
MODULE_PARM_DESC(int_data, "是一个整型的参数.");

/*传递指针类型数据*/
char *p_data = NULL;
module_param(p_data, charp, 0664);
MODULE_PARM_DESC(p_data, "是一个指针类型数据.");

/*
传递数组类型数据
module_param_array(数组名, 元素类型, 元素个数(取地址), 权限);
*/
int array_data[3] = ;
int num = 3;
module_param_array(array_data, int, &num, 0664);
MODULE_PARM_DESC(array_data, "是一个数组类型数据.");

/*
传递字符串: module_param_string
(传递参数时的字符串名称, 字符串名称, 字符串大小, 权限);
*/
char str_data[12] = ;
module_param_string(str_data, str_data, sizeof(str_data), 0664);
MODULE_PARM_DESC(str_data, "是一个字符串类型数据.");

三、完整代码示例

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>

/*传递整型类型数据*/
int int_data = 0;
module_param(int_data, int ,0664);
MODULE_PARM_DESC(int_data, "是一个整型的参数.");

/*传递指针类型数据*/
char *p_data = NULL;
module_param(p_data, charp, 0664);
MODULE_PARM_DESC(p_data, "是一个指针类型数据.");

/*
传递数组类型数据
module_param_array(数组名, 元素类型, 元素个数(取地址), 权限);
*/
int array_data[3] = ;
int num = 3;
module_param_array(array_data, int, &num, 0664);
MODULE_PARM_DESC(array_data, "是一个数组类型数据.");

/*
传递字符串: module_param_string
(传递参数时的字符串名称, 字符串名称, 字符串大小, 权限);
*/
char str_data[12] = ;
module_param_string(str_data, str_data, sizeof(str_data), 0664);
MODULE_PARM_DESC(str_data, "是一个字符串类型数据.");

static int __init tiny4412_param_dev_init(void) 

    printk("安装驱动成功.\\n");
    printk("int_data=%d\\n",int_data);
    printk("p_data=%s\\n",p_data);
    printk("array_data=%d\\n",array_data[0]);
    printk("str_data=%s\\n",str_data);
    return 0;


static void __exit tiny4412_param_dev_exit(void) 

    printk("卸载驱动成功.\\n");


module_init(tiny4412_param_dev_init);
module_exit(tiny4412_param_dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("wbyq");

四、查看驱动提示信息

[root@wbyq code]#modinfo led_drv.ko 
filename:       led_drv.ko
license:        GPL
author:         wbyq
depends:        
vermagic:       3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8 
parm:           str_data:是一个字符串类型数据.
parm:           array_data:是一个数组类型数据.
parm:           p_data:是一个指针类型数据.
parm:           int_data:是一个整型的参数.

五、安装驱动时传递参数

[root@wbyq code]#insmod led_drv.ko str_data="123" int_data=666 p_data="789" array_data=6,7,8
[ 2692.220000] 安装驱动成功.
[ 2692.220000] int_data=666
[ 2692.220000] p_data=789
[ 2692.220000] array_data=6
[ 2692.220000] str_data=123

六、驱动安装成功在sys目录下查看传递的参数

[root@wbyq code]#cd /sys/module/led_drv/parameters/
[root@wbyq parameters]#ls
array_data  int_data    p_data      str_data
[root@wbyq parameters]#cat array_data 
6,7,8
[root@wbyq parameters]#cat int_data 
666
[root@wbyq parameters]#cat p_data 
789
[root@wbyq parameters]#cat str_data 
123
[root@wbyq parameters]#

七、权限定义

用户
#define S_IRWXU 00700 
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100

用户组
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010

其他用户
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001

示例代码:

/*传递整型类型数据*/
int int_data = 0;
module_param(int_data, int ,S_IRUSR|S_IWUSR|S_IXUSR);
MODULE_PARM_DESC(int_data, "是一个整型的参数.");

/*传递指针类型数据*/
char *p_data = NULL;
module_param(p_data, charp, S_IRUSR|S_IWUSR|S_IXUSR);
MODULE_PARM_DESC(p_data, "是一个指针类型数据.");

以上是关于Linux驱动开发-安装驱动参数传递的主要内容,如果未能解决你的问题,请参考以下文章

《Linux设备驱动程序》(十六)-中断处理

Linux驱动开发之LED驱动

Linux驱动开发: 网络设备驱动开发

i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架

i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架

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