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
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/c4c019ff5a4a9c4acae950cad】。文章转载请联系作者。
DS小龙哥
关注
之所以觉得累,是因为说的比做的多。 2022.01.06 加入
熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域











评论