【北京迅为】《i.MX8MM嵌入式Linux开辟指南》-第三篇 嵌入式Linux驱动开辟篇-第四十三章 驱动模块传参

[复制链接]
发表于 2026-4-24 09:36:36 | 显示全部楼层 |阅读模式
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文件。完备驱动代码如下图所示: 
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. //定义整型变量a
  4. static int a;
  5. //传递普通的参数a,参数权限为S_IRUSR,意为可读
  6. module_param(a,int,S_IRUSR);
  7. static int hello_init(void){
  8.     //打印变量a
  9.     printk("a = %d \n",a);
  10.     printk("hello world! \n");
  11.     return 0;
  12. }
  13. static void hello_exit(void){
  14.     //打印变量a
  15.     printk("a = %d \n",a);
  16.     printk("goodbye \n");
  17. }
  18. module_init(hello_init);
  19. module_exit(hello_exit);
  20. MODULE_LICENSE("GPL");
复制代码
以I.MX8MM开辟板为例,请参考本手册第三十Linux内核模块。我们将parameter.c文件拷贝到Ubuntu的/home/topeet/imx8mm/05/001目次下。将前次编译helloworld的Makefile文件和build.sh文件拷贝到parameter.c同级目次下,修改Makefile为:
  1. obj-m += parameter.o
  2. KDIR:=/home/topeet/linux/linux-imx
  3. PWD?=$(shell pwd)
  4. all:
  5.         make -C $(KDIR) M=$(PWD) modules ARCH=arm64
  6. clean:
  7.         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文件。完备驱动代码如下图所示:
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. //定义数组b
  4. static int b[5];
  5. //定义实际传入进去参数的个数
  6. static int count;
  7. //定义整型变量a
  8. static int a;
  9. //传递普通的参数a,参数权限为S_IRUSR,意为可读
  10. module_param(a, int, S_IRUSR);
  11. //传递数组的参数
  12. module_param_array(b, int, &count, S_IRUSR);
  13. static int hello_init(void)
  14. {
  15.     int i;
  16.     //循环遍历数组b的值
  17.     for (i = 0; i < count; i++)
  18.     {
  19.         //打印数组b的值
  20.         printk("b[%d] = %d \n", i, b[i]);
  21.     }
  22.     //打印传入参数的个数
  23.     printk("count= %d \n", count);
  24.     return 0;
  25. }
  26. static void hello_exit(void)
  27. {
  28.     printk("goodbye \n");
  29. }
  30. module_init(hello_init);
  31. module_exit(hello_exit);
  32. 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开辟板上面给驱动模块传平常参数和数组参数了。

 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表