第5章 驱动模块传参实验(iTOP-RK3568开发板驱动开发指南 )

经过前两章实验的实战操作,我们已经完成最简单的helloworld驱动实验和模块驱动实验,加载模块可以使用“insmod”函数,使用“insmod”函数进行模块加载时也能进行参数的传递。运用得当可以极大提升内核测试速度。本节就来学习一下如何进行驱动模块的传参。

5.1 驱动模块传参简介

驱动模块传参是一种可以随时向内核模块传递、修改参数的方法。例如可以传递串口驱动的波特率、数据位数、校验位、停止位等参数,进行功能的设置,以此节省编译模块的时间,大大提高调试速度。

Linux内核提供了 module_param(name, type, perm)、module_param_array(name, type, nump, perm)宏和module_param_string(name, string, len, perm)宏,分别进行基本类型、数组和字符串参数的传递。它们定义在 “内核源码/include/linux/moduleparam.h”文件中(在module.h文件中已经对export.h进行引用,所以不需要单独引用moduleparam.h文件),详细定义如下(图5-1)所示:

#define module_param(name, type, perm)              \module_param_named(name, name, type, perm)#define module_param_array(name, type, nump, perm)      \
module_param_array_named(name, name, type, nump, perm)  #define module_param_string(name, string, len, perm)            \static const struct kparam_string __param_string_##name     \                                                                                                                                                                                           = { len, string };                  \__module_param_call(MODULE_PARAM_PREFIX, name,          \&param_ops_string,              \.str = &__param_string_##name, perm, -1, 0);\__MODULE_PARM_TYPE(name, "string") 

图5-1

以上宏定义中的 module_param ()函数可以用来进行基本类型参数的传递,传入的三个参数定义如下:

  • name:模块参数的名称
  • type: 模块参数的数据类型
  • perm: 模块参数的访问权限

参数type可以取以下任意一种情况:

  • bool : 布尔型
  • inbool : 布尔反值
  • charp**😗* 字符指针(相当于char *,不超过1024字节的字符串)
  • short**😗* 短整型
  • ushort : 无符号短整型
  • int : 整型
  • uint : 无符号整型
  • long : 长整型
  • ulong**😗* 无符号长整型。

参数perm表示该参数在sysfs文件系统中所对应的文件节点的属性,其权限定义在“内核源码/include/linux/stat.h”文件中。可以用宏定义和数字法两种方式来表示。详细宏定义如下(图5-2)所示:

#define S_IRUSR 00400 /*文件所有者可读*/
#define S_IWUSR 00200 /*文件所有者可写*/
#define S_IXUSR 00100 /*文件所有者可执行*/
#define S_IRGRP 00040 /*与文件所有者同组的用户可读*/
#define S_IWGRP 00020 /*与文件所有者同组的用户可写*/
#define S_IXGRP 00010 /*与文件所有者同组的用户可执行*/
#define S_IROTH 00004 /*与文件所有者不同组的用户可读*/
#define S_IWOTH 00002 /*与文件所有者不同组的用户可写*/
#define S_IXOTH 00001 /*与文件所有者不同组的用户可可执行*/

图5-2

如果要传递数组类型参数可以使用 module_param_array ()函数,相较于 module_param ()函数多了n_para参数,用来表示传递参数个数;n_para参数值会根据输入的参数个数而改变,n_para的最终值为传递的数组元素个数。

最后是 module_param_string(name, string, len, perm)函数,用来传递字符串类型的变量,四个参数的定义如下所示:

  • name:外部传入的参数名,即加载模块时的传入值
  • string:内部的变量名,即程序内定义的参数名
  • len:以string命名的buffer大小(可以小于buffer的大小,但是没有意义)
  • perm:模块参数的访问权限

至此,关于驱动模块传参所使用的函数就讲解完成了,在下一小节中将编写驱动模块传参函数代码。

5.2 实验程序的编写

本实验对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\02。

本章实验将编写Linux下的驱动传参实例代码,通过“insmod”命令进行参数的传递,并将相应的参数打印到串口终端上。

编写完成的parameter.c代码如下(图5-3)所示

#include <linux/init.h>
#include <linux/module.h>
static int number;//定义int类型变量number
static char *name;//定义char类型变量name
static int para[8];//定义int类型的数组
static char str1[10];//定义char类型字符串str1
static int n_para;//定义int类型的用来记录module_param_array函数传递数组元素个数的变量n_para
module_param(number, int, S_IRUGO);//传递int类型的参数number,S_IRUGO表示权限为可读
module_param(name, charp, S_IRUGO);//传递char类型变量name
module_param_array(para , int , &n_para , S_IRUGO);//传递int类型的数组变量para
module_param_string(str, str1 ,sizeof(str1), S_IRUGO);//传递字符串类型的变量str1
static int __init parameter_init(void)//驱动入口函数
{static int i;printk(KERN_EMERG "%d\n",number);printk(KERN_EMERG "%s\n",name);                                                                                                                                                          for(i = 0; i < n_para; i++){printk(KERN_EMERG "para[%d] : %d \n", i, para[i]);}printk(KERN_EMERG "%s\n",str1);return 0;
}
static void __exit parameter_exit(void)//驱动出口函数
{printk(KERN_EMERG "parameter_exit\n");
}
module_init(parameter_init);//注册入口函数
module_exit(parameter_exit);//注册出口函数
MODULE_LICENSE("GPL v2");//同意GPL开源协议
MODULE_AUTHOR("topeet"); //作者信息

图5-3

以上代码将传递int类型参数number、char类型参数name、int类型的数组para和char类型字符串str1,并在驱动入口函数中,对各个参数进行打印。在下一小节会进行驱动加载测试。

5.3 运行测试

5.3.1 编译驱动程序

在上一小节中的parameter.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下(图5-4)所示:

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += parameter.o    #此处要和你的驱动源文件同名
KDIR :=/home/topeet/Linux/linux_sdk/kernel    #这里是你的内核目录                                                                                                                            
PWD ?= $(shell pwd)
all:make -C $(KDIR) M=$(PWD) modules    #make操作
clean:make -C $(KDIR) M=$(PWD) clean    #make clean操作

图5-4

对于Makefile的内容注释已在上图添加,保存退出之后,来到存放parameter.c和Makefile文件目录下,如下图(图5-5)所示:

img

图5-5

然后使用命令“make”进行驱动的编译,编译完成如下图(图5-6)所示:

img

图5-6

编译完生成 parameter.ko目标文件,如下图(图5-7)所示:

img

图5-7

至此我们的驱动模块就编译成功了,下面进行驱动的运行测试。

5.3.2 运行测试

在上一章节中已经学习了使用insmod命令加载模块,而驱动模块传参的命令格式为

insmod 对应的模块 参数

parameter.ko 驱动加载可以传递3个参数,分别为int类型的参数number,char类型的参数name和int数组类型的参数para。使用以下命令进行驱动的加载,加载完成之后的打印信息如下图(图5-8)所示:

insmod parameter.ko number=100 name="topeet" para=0,1,2,3,4,5,6,7 str="itop"

img

图5-8

可以看到传递的参数都分别打印了出来。最后可以输入以下命令进行驱动的卸载,如下图(图5-9)所示:

rmmod parameter.ko

img

图5-9

【最新驱动资料(文档+例程)】

链接 https://pan.baidu.com/s/1M4smUG2vw_hnn0Hye-tkog

提取码:hbh6

【B 站配套视频】

https://b23.tv/XqYa6Hm

【RK3568 购买链接】

https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-2245

动资料(文档+例程)】

链接 https://pan.baidu.com/s/1M4smUG2vw_hnn0Hye-tkog

提取码:hbh6

【B 站配套视频】

https://b23.tv/XqYa6Hm

【RK3568 购买链接】

https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-2245

2452613.11.2fec74a6elWNeA&id=669939423234

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/100823.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】pycharm 突然每次点击都开新页面,关不掉怎么办?

今天在 pycharm 中写代码&#xff0c;突然发现&#xff0c;新开的文件不再原来的页面上&#xff0c;而是新增了页面&#xff0c;导致整个屏幕全都是新开的页面&#xff0c;最难受的是&#xff0c;关不掉&#xff01; 无奈&#xff0c;我只能关闭 pycharm&#xff0c;重新双击…

力扣373. 查找和最小的 K 对数字 优先队列法

题目 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。 示例 1: 输入: nums1 [1,7,11], …

stm32 学习笔记:GPIO输出

一、GPIO简介 引脚电平 0-3.3V,部分可容忍5V&#xff0c;对输出而言最大只能输出3.3V, 只要可以用高低电平来控制的地方&#xff0c;都可以用GPIO来完成&#xff0c;如果控制的功率比较大的设备&#xff0c;只需加入驱动电路即可 GPIO 通用输入输出口&#xff0c;可配置为 8种 …

PyCharm 虚拟环境搭建

Anaconda搭建虚拟环境 安装 前往Anaconda官网&#xff08;https://www.anaconda.com/products/individual&#xff09;&#xff0c;下载适合您操作系统的Anaconda版本&#xff0c;建议下载最新的稳定版。这里可以直接进入这个&#xff1a;https://repo.anaconda.com/archive/ …

M1 Pro 新芯片安装python2 方案汇总

前言&#xff1a;磨刀不误砍柴工&#xff0c;环境装好&#xff0c;才能打工。M1 Pro 新芯片安装python2 文章目录 方案一 docker 容器构造环境&#xff08;如果涉及本地两个仓库需要关联则不适用&#xff09;方案二 使用 pyenv &#x1f680; 作者简介&#xff1a;作为某云服务…

uniapp 下拉框数据回显的问题

问题 : 现在是下拉框数据回显不了, 绑定的v-model 原因 : uniui 下拉框数据绑定要是 value text 这种格式的 解决办法: 将获取到的后端数据 转换为 需要的格式 ,再进行绑定 下拉框的数据 遍历

【Java SE】抽象类与接口

目录 【1】抽象类 【1.1】抽象类概念 【1.2】抽象类语法 【1.3】抽象类特性 【1.4】抽象类的作用 【2】接口 【2.1】接口的概念 【2.2】语法规则 【2.3】接口使用 【2.4】接口特性 【2.5】实现多个接口 【2.6】接口间的继承 【2.7】接口使用实例 【2.8】Clonable …

Android逆向学习(二)vscode进行双开与图标修改

Android逆向学习&#xff08;二&#xff09;vscode进行双开与图标修改 写在前面 这其实应该还是吾爱的第一个作业&#xff0c;但是写完上一个博客的时候已经比较晚了&#xff0c;如果继续敲机械键盘吵到室友&#xff0c;我怕我看不到明天的太阳&#xff0c;所以我决定分成两篇…

如何压缩图片大小?缩小图片体积跟我学

在日常生活中&#xff0c;我们常常需要处理图片&#xff0c;但是由于图片大小过大&#xff0c;常常带来许多不便。那么&#xff0c;如何压缩图片大小呢&#xff1f;下面就为大家介绍三个方法&#xff0c;让你轻松解决这个问题。 一、使用图片编辑软件 市面上有许多图片编辑软件…

2023-08-31 LeetCode每日一题(一个图中连通三元组的最小度数)

2023-08-31每日一题 一、题目编号 1761. 一个图中连通三元组的最小度数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui…

并发测试工具 apache-jmeter使用发送post请求JSON数据

目录 1 下载安装 2 汉化 3 创建高并发测试 配置线程组 创建web请求 创建监听器 结果树 汇总报告 为web请求添加token 添加Content-Type用于发送json 4 启动测试 5 查看结果 1 下载安装 官网Apache JMeter - Download Apache JMeter 解压运行 2 2 汉化 打开软件…

elasticsearch的索引库操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型&#xff0c;常见的…