i.MX8MM处理处罚器采取了先辈的14LPCFinFET工艺,提供更快的速率和更高的电源服从;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口包罗万象。H264、VP8视频硬编码,H.264、H.265、VP8、VP9视频硬解码,并提供相干进程,支持8路PDM接口、5路SAI接口、2路Speaker。体系支持Android9.0(支持获取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9体系。实用于智能充电桩,物联网 ,工业控制,医疗,智能交通等,可用于任何通用工业和物联网 应用、
【粉丝群】258811263
第四十三章 驱动模块传参
本章导读
在编写应用步伐的时间,我们可以给main函数通报参数,比如void main(int argc,char *argv[]),这个功能各人用起来已经很纯熟了。着实在使用insmod下令加载模块的时间,也是可以给模块通报参数的。
43.1章节解说了驱动模块传参的理论知识。
43.2章节编写了驱动模块传平常参数的驱动步伐,并运行测试验证。
43.3章节编写了驱动模块传数组的驱动步伐,并运行测试。
本章内容对应视频解说链接(在线观看):
驱动模块传参数 → https://www.bilibili.com/video/BV1Vy4y1B7ta?p=14
步伐源码在网盘资料“iTOP-i.MX8MM开辟板\02-i.MX8MM开辟板网盘资料汇总(不含光盘内容)\嵌入式Linux开辟指南(iTOP-i.MX8MM)手册配套资料\2.驱动步伐例程\05-驱动模块传参”路径下。
43.1 驱动模块传参简介
什么是驱动传参
在装载内核模块时,用户可以向模块通报参数,情势为“insmode(或modprobe)模块名参数名=参数
值”,假如不通报,参数将使用模块内界说的缺省值。假如模块被内置,就无法insmod了,但是bootloader
可以通过在bootargs里设置“模块名.参数名=值”的情势给该内置的模块通报参数。
驱动传参的作用
- 设置驱动的相干参数,比如设置缓冲区的巨细
- 设置安全校验,防止我们写的驱动被人盗用
怎么给驱动传参数
通报平常的参数,比如 char int范例,使用如下函数:
函数
| module_param(name,type,perm);
| 参数name
| 要通报进去参数的名称
| 参数type
| 要通报进去参数的范例
| 参数perm
| 要通报进去参数的读写权限
| 部门常用参数权限表明如下:
宏界说
| 权限表明
| #defineS_IRUSR 00400
| 文件全部者可读
| #defineS_IWUSR00200
| 文件全部者可写
| #defineS_IXUSR 00100
| 文件全部者可实行
| #defineS_IRGRP00040
| 与文件全部者同组的用户可读
| #defineS_IWGRP00020
|
| #defineS_IXGRP 00010
|
| #defineS_IROTH 00004
| 与文件全部者差别组的用户可读
| #defineS_IWOTH00002
|
| #defineS_IROTH 00004
| 与文件全部者差别组的用户可读
| #defineS_IWOTH00002
|
| #defineS_IXOTH 00001
|
| 别的的可以使用下面的方法来判断:
可以将数字末了三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为 1 表现文件全部者可读,第二位为 1 表现文件全部者可写,第三位为 1 表现文件全部者可实行;接下来三位表现文件全部者同构成员的权限;再下来三位为差别组用户权限。
通报数组使用以下函数:
函数
| module_param_array(name,type,nump,perm)
| 参数name
| 要通报进去参数的名称
| 参数type
| 要通报进去参数的范例
| 参数nump
| 现实传入进去参数的个数
| 参数perm
| 要通报进去参数的读写权限
| 43.2 驱动模块传平常参数
步伐源码在网盘资料“iTOP-i.MX8MM开辟板\02-i.MX8MM开辟板网盘资料汇总(不含光盘内容)\嵌入式Linux开辟指南(iTOP-i.MX8MM)手册配套资料\2.驱动步伐例程\05-驱动模块传参\001”路径下。
通过43.1章节驱动理论根本的学习,我们已经把驱动传参的根本概念搞懂了。我们在ubuntu的/home/topeet/imx8mm/001目次下新建parameter.c文件。完备驱动代码如下图所示:
- #include <linux/init.h>
- #include <linux/module.h>
- //定义整型变量a
- static int a;
- //传递普通的参数a,参数权限为S_IRUSR,意为可读
- module_param(a,int,S_IRUSR);
- static int hello_init(void){
- //打印变量a
- printk("a = %d \n",a);
- printk("hello world! \n");
- return 0;
- }
- static void hello_exit(void){
- //打印变量a
- printk("a = %d \n",a);
- printk("goodbye \n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
- MODULE_LICENSE("GPL");
复制代码 以I.MX8MM开辟板为例,请参考本手册第三十七章 Linux内核模块。我们将parameter.c文件拷贝到Ubuntu的/home/topeet/imx8mm/05/001目次下。将前次编译helloworld的Makefile文件和build.sh文件拷贝到parameter.c同级目次下,修改Makefile为:
- obj-m += parameter.o
- KDIR:=/home/topeet/linux/linux-imx
- PWD?=$(shell pwd)
- all:
- make -C $(KDIR) M=$(PWD) modules ARCH=arm64
- clean:
- make -C $(KDIR) M=$(PWD) clean
复制代码 编译驱动乐成如下图所示:
我们通过nfs将编译好的驱动步伐加载模块,我们进入到共享目次,加载驱动模块如图所示:
insmod parameter.ko
我们卸载驱动,然后改变参数的值,再次加载驱动模块,如下图所示:
rmmod parameter
insmod parameter.ko a=5
我们进入到/sys/module/parameter/目次下,查察变量a的读写权限,如下图所示:
cd /sys/module/parameter/
ls
cd parameters/
ls
ls -l
如上图所示,查察到变量a的读写权限为-r,意为可读,驱动步伐内里设置的变量a的权限为S_IRUSR,意为可读,以是变量a传参乐成。
43.3 驱动模块传数组
步伐源码在网盘资料“iTOP-i.MX8MM开辟板\02-i.MX8MM开辟板网盘资料汇总(不含光盘内容)\嵌入式Linux开辟指南(iTOP-i.MX8MM)手册配套资料\2.驱动步伐例程\05-驱动模块传参\002”路径下。
通过43.2章节驱动理论根本的学习,我们已经把驱动传平常参数学会了。本末节我们来学习怎样在驱动模块传数组。我们在ubuntu的/home/topeet/imx8mm/002目次下新建parameter.c文件。完备驱动代码如下图所示:
- #include <linux/init.h>
- #include <linux/module.h>
- //定义数组b
- static int b[5];
- //定义实际传入进去参数的个数
- static int count;
- //定义整型变量a
- static int a;
- //传递普通的参数a,参数权限为S_IRUSR,意为可读
- module_param(a, int, S_IRUSR);
- //传递数组的参数
- module_param_array(b, int, &count, S_IRUSR);
- static int hello_init(void)
- {
- int i;
- //循环遍历数组b的值
- for (i = 0; i < count; i++)
- {
- //打印数组b的值
- printk("b[%d] = %d \n", i, b[i]);
- }
- //打印传入参数的个数
- printk("count= %d \n", count);
- return 0;
- }
- static void hello_exit(void)
- {
- printk("goodbye \n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
- MODULE_LICENSE("GPL");
复制代码 我们再将驱动传入数组的代码编译成驱动模块,加载驱动模块,如下图所示:
rmmod parameter
insmod parameter.ko b=1,2,3,4,5
同样我们可以进入到/sys/module/parameter/目次下,查察变量b的权限,如下图所示:
cd /sys/module/parameter/
ls
cd parameters/
ls
ls b -l
假如我们多传入进去参数,会发生什么呢?我们试试传入六个数
到此,我们已经学会了在iTOP-i.MX8MM开辟板上面给驱动模块传平常参数和数组参数了。
|