例程代码路径:ELF 1开发板资料包\03-例程源码\03-2 驱动例程源码\01_helloworld\hello_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 // 包含模块相关函数的头文件 #include // 包含内核相关函数的头文件 #include // 包含初始化和清理函数的头文件 #include //包含模块参数相关函数的头文件
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 %d\n",my_param); // 打印消息到内核日志 printk(KERN_INFO "Hello, World! this is %s\n",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! |