例程代码路径:ELF 1开发板资料包3-例程源码3-2 驱动例程源码1_helloworldhello_param
Linux驱动模块可以接受参数,这些参数可以在加载模块时通过命令行或配置文件进行配置。驱动模块参数提供了一种动态配置和调整驱动行为的方式。
在Linux内核中,驱动模块参数通常使用module_param宏进行定义和注册。下面是一些常用的驱动模块参数相关的宏和函数:
module_param:用于定义和注册一个驱动模块参数。
module_param(name, type, permissions); |
name:参数名称,通常使用驼峰命名法;
type:参数的数据类型,可以是整型、字符型或布尔型等;
permissions:指定参数的访问权限;
MODULE_PARM_DESC:用于定义驱动模块参数的描述信息。
MODULE_PARM_DESC(name, description); |
name:参数名称,与之前使用module_param或module_param_array定义的参数名称相同;
description:参数的描述信息;
通过使用这些宏和函数,可以定义和注册驱动模块参数。在加载驱动模块时,可以通过命令行或配置文件设置这些参数的值;
hello_param.c示例源码
#include <linux/module.h> // 包含模块相关函数的头文件
#include <linux/kernel.h> // 包含内核相关函数的头文件 #include <linux/init.h> // 包含初始化和清理函数的头文件 #include <linux/moduleparam.h> //包含模块参数相关函数的头文件 static int my_param = 0; static char *who = "helloworld"; module_param(my_param, int, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(my_param, "An integer parameter"); module_param(who, charp, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(who, "An integer parameter"); static int __init helloworld_init(void) { printk(KERN_INFO "Hello, World! my_param is %dn",my_param); // 打印消息到内核日志 printk(KERN_INFO "Hello, World! this is %sn",who); return 0; } static void __exit helloworld_exit(void) { printk(KERN_INFO "Goodbye, World!n"); // 打印消息到内核日志 } module_init(helloworld_init); // 指定驱动程序的初始化函数 module_exit(helloworld_exit); // 指定驱动程序的清理函数 MODULE_LICENSE("GPL"); // 指定模块的许可证信息 MODULE_AUTHOR("Your Name"); // 指定模块的作者信息 MODULE_DESCRIPTION("A simple Hello World driver"); // 指定模块的描述信息 |
编译
复制helloworld驱动中的Makefile文件,将其中的hello.o修改为hello_param.o,效果如下:
设置环境变量,编译:
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
elf@ubuntu:~/work/test/01_helloworld/hello_param$ make |
测试
将生成的hello_param.ko文件拷贝到开发板中测试。在开发板中执行insmod加载驱动,rmmod卸载驱动:
root@ELF1:~# insmod hello_param.ko
Hello, World! my_param is 0 Hello, World! this is helloworld root@ELF1:~# rmmod hello_param.ko Goodbye, World! |
可以看出不输入参数,加载时打印出的是初始化参数。下面我们传入参数看一下效果:
root@ELF1:~# insmod hello_param.ko my_param=72 who=elfboard
Hello, World! my_param is 72 Hello, World! this is elfboard root@ELF1:~# rmmod hello_param.ko Goodbye, World! |
可以看到我们写的参数传到了驱动中,并打印了出来。