写点什么

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

作者:DS小龙哥
  • 2022 年 4 月 04 日
  • 本文字数:2092 字

    阅读完需:约 7 分钟

一、简介

在 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.kolicense:        GPLauthor:         wbyqdepends:        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]#lsarray_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, "是一个指针类型数据.");
复制代码


发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
Linux驱动开发-安装驱动参数传递_4月月更_DS小龙哥_InfoQ写作平台