linux驱动开发-安装驱动参数传递(代码片段)

DS小龙哥 DS小龙哥     2022-12-02     590

关键词:

一、简介

在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驱动开发:usb无线wifi驱动开发(mt7601)完成wifi管理工具安装(代码片段)

...:arm-linux-gcc-4.5.1PC宿主机:红帽REDHAT一、移植WIFI驱动当前采用的WIFI是360随身WIFI,这款随身WIFI所用的网卡芯片是 Ralink(雷凌科技)的解决方案(在上篇文章里也有详细介绍),芯片型号为MT7601。如果在PC 查看详情

嵌入式linux驱动开发01:基础开发与使用(代码片段)

文章目录目的基础说明驱动测试应用程序基础开发与使用驱动模块入口与出口驱动模块安装与卸载字符设备注册与注销设备开关与读写自动创建与销毁设备节点使用VSCode进行开发总结目的驱动开发是嵌入式Linux中工作比重比较大... 查看详情

linux驱动开发lcd(代码片段)

...关的硬件和软件集合起来,虚拟出一个fb设备,LCD驱动生成/dev/fbx的设备,应用程序通过访问/dev/fbx设备即可以访问LCD。不同分辨率的LCD屏幕eLCDIF控制器驱动代码相同,只需要修改好对应的屏幕参数。Linux内核将所... 查看详情

linux驱动开发:字符设备驱动开发(代码片段)

文章目录Linux驱动开发:字符设备驱动开发一、字符设备简介二、驱动调用原理三、驱动加载与卸载四、字符设备注册与注销五、设备驱动编写流程六、添加驱动信息Linux驱动开发:字符设备驱动开发一、字符设备简介字... 查看详情

linux驱动开发:字符设备驱动开发(代码片段)

文章目录Linux驱动开发:字符设备驱动开发一、字符设备简介二、驱动调用原理三、驱动加载与卸载四、字符设备注册与注销五、设备驱动编写流程六、添加驱动信息Linux驱动开发:字符设备驱动开发一、字符设备简介字... 查看详情

i.mx6ull驱动开发|31-linux内核网络设备驱动框架(代码片段)

一、Linux网络设备驱动整体架构网络设备是完成用户数据包在网络媒介上发送和接收的设备,它将上层协议传递下来的数据包,以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议。Linux系统对... 查看详情

linux驱动开发:字符设备驱动开发实战(代码片段)

Linux驱动开发:字符设备驱动开发实战一、工程创建VSCode创建工程,设置C/C++配置,导入linuxkernel源码目录,方便vscode写代码自动补全,vscode配置"configurations":["name":"Linux","includ 查看详情

linux移植usbch340驱动到arm板,并作测试(代码片段)

文章目录一、安装usbserial驱动1.获得usbserial驱动2.加载usbserial驱动二、安装ch340驱动1.获得ch340驱动源码2.编译ch340驱动源码,生成ko驱动3.加载ch340驱动三、编写程序验证驱动能否正常使用linux-arm开发板在引出USB接口的时候,... 查看详情

linux驱动开发misc(代码片段)

MISC驱动是杂项驱动,是使用platform的字符设备驱动。MISC设备驱动的主设备号都为10,不同设备使用不同次设备号。MISC设备自动创建cdev、class、device,简化了字符设备驱动的编写。Linux定义miscdevice结构体表示MISC设备驱... 查看详情

linux驱动开发:framebuffe(lcd)驱动开发(代码片段)

...文frameBuffer设备。frameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。帧缓冲(framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异࿰ 查看详情

linux驱动开发-字符设备控制技术笔记3(代码片段)

字符设备控制技术  笔记要做的自己看起来舒服和有头绪,这不又折腾切换编辑器来从新排版,有强迫症啊!对于字符控制,很多时候编写上层应用程序时,使用ioctl系统调用来控制设备,原型如下:/*fd:... 查看详情

linux驱动开发:设备号(代码片段)

文章目录Linux驱动开发:设备号一、设备号组成二、设备号分配Linux驱动开发:设备号一、设备号组成Linux中每个设备都有一个设备号,分为:主设备号:表示某一个具体的驱动次设备号:表示使用这个驱动... 查看详情

linux驱动开发:设备号(代码片段)

文章目录Linux驱动开发:设备号一、设备号组成二、设备号分配Linux驱动开发:设备号一、设备号组成Linux中每个设备都有一个设备号,分为:主设备号:表示某一个具体的驱动次设备号:表示使用这个驱动... 查看详情

linux驱动开发-字符设备控制技术笔记3(代码片段)

字符设备控制技术  笔记要做的自己看起来舒服和有头绪,这不又折腾切换编辑器来从新排版,有强迫症啊!对于字符控制,很多时候编写上层应用程序时,使用ioctl系统调用来控制设备,原型如下:/*fd:... 查看详情

linux驱动开发:块设备驱动开发(代码片段)

Linux内核版本:3.5测试设备: 友善之臂Tiny4412开发板  (CPU型号: 三星Exynos4412)2019年三星发布的GalaxySII和MX采用的就是这款CPU。一、块设备介绍     块是一种具有一定结构的随机存取设备,对这种设备的读写是按块... 查看详情

linux驱动开发:块设备驱动开发(代码片段)

Linux内核版本:3.5测试设备: 友善之臂Tiny4412开发板  (CPU型号: 三星Exynos4412)2019年三星发布的GalaxySII和MX采用的就是这款CPU。一、块设备介绍     块是一种具有一定结构的随机存取设备,对这种设备的读写是按块... 查看详情

linux驱动开发rtc(代码片段)

对于大多数SOC,半导体厂商已经编写好内部RTC驱动。RTC设备驱动是一个标准的字符设备驱动,Linux内核将RTC设备抽象为rtc_device结构体,include/linux/rtc.h。structrtc_class_ops int(*open)(structdevice*); void(*release)(structdevice*); int( 查看详情

linux驱动开发:usb驱动开发(代码片段)

一、USB简介1.1 什么是USB?   USB是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,USB就是简写,中文叫通用串行总线。... 查看详情