嵌入式Linux(6):驱动模块传参
1、什么是驱动传参?
驱动传参就是在安装驱动模块(.ko文件)的时候传递参数给驱动模块。
举例:
insmod beep.ko a=1
2、驱动传参有什么作用?
- (1) 设置驱动的相关参数,比如设置缓冲区的大小。
- (2) 设置安全校验,防止我们写的驱动被人盗用。
3、怎么给我们的驱动传参数?
-
(1)传递普通的参数,比如char,int类型的参数。
函数:module_param(name, type, perm);
参数:- name:要传递进去的参数的名称
- type:类型
- perm:参数的读写权限
-
(2)传递数组。
函数:module_param_array(name, type, nump, perm);
- name:要传递进去的参数的名称。
- type:类型。
- nump:实际传进去的参数的个数。
- perm:参数的读写权限。
以下基于RK3568:
传递普通参数
parameter.c
/* 头文件 */
#include <linux/init.h> // 包含宏定义
#include <linux/module.h> // 包含初始化、加载模块的头文件static int a;module_param(a, int, S_IRUSR);static int hello_init(void)
{printk("a = %d\\n",a);printk("hello world\\n");return 0;
}
static void hello_exit(void)
{printk("a = %d\\n", a);printk("Bye Bye\\n");
}/* 模块的入口 */
module_init(hello_init);
/* 模块的出口 */
module_exit(hello_exit);/* 模块声明 */
MODULE_LICENSE("GPL");
Makefile
# 定义内核源码的目录
KERN_DIR ?= /home/liefyuan/Linux/rk356x_linux/kernel
# 定义当前目录
PWD := $(shell pwd)
# 要生成的内核模块
obj-m += parameter.oall:make -C $(KERN_DIR) M=$(PWD) modulesclean:rm -rf *.order *o *.symvers *.mod.c *.mod *.ko
编译模块
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make
安装模块:
[root@RK356X:/opt]# insmod parameter.ko a=66
[10720.481350] a = 66
[10720.481426] hello world
[root@RK356X:/opt]# rmmod parameter.ko
[10773.480615] a = 66
[10773.480706] Bye Bye
传递数组
#include <linux/init.h> // 包含宏定义
#include <linux/module.h> // 包含初始化、加载模块的头文件static int a;
static int b[5];
static int count;module_param(a, int, S_IRUSR);
module_param_array(b, int, &count, S_IRUSR);static int hello_init(void)
{int i;for(i = 0; i < count; i++){printk("b[%d] = %d \\n", i, b[i]);}printk("count: %d \\n", count);printk("a = %d\\n",a);printk("hello world\\n");return 0;
}
static void hello_exit(void)
{printk("a = %d\\n", a);printk("Bye Bye\\n");
}/* 模块的入口 */
module_init(hello_init);
/* 模块的出口 */
module_exit(hello_exit);/* 模块声明 */
MODULE_LICENSE("GPL");
编译安装驱动测试(传5个元素进去):
[root@RK356X:/opt]# insmod parameter.ko a=1 b=1,2,3,4,5
[11813.893909] b[0] = 1
[11813.893986] b[1] = 2
[11813.893994] b[2] = 3
[11813.894002] b[3] = 4
[11813.894008] b[4] = 5
[11813.894016] count: 5
[11813.894022] a = 1
[11813.894028] hello world[root@RK356X:/opt]# rmmod parameter
[11852.876411] a = 1
[11852.876498] Bye Bye
测试传三个数组元素(最大传5个元素):
[root@RK356X:/opt]# insmod parameter.ko a=1 b=1,2,3
[11945.295155] b[0] = 1
[11945.295259] b[1] = 2
[11945.295268] b[2] = 3
[11945.295275] count: 3
[11945.295281] a = 1
[11945.295287] hello world[root@RK356X:/opt]# rmmod parameter
[11953.501088] a = 1
[11953.501189] Bye Bye
测试传递多个参数进去(超过5个)进去:会报错,不能这么操作。
[root@RK356X:/opt]# insmod parameter.ko a=1 b=1,2,3,4,5,6,7
[12912.728832] b: can only take 5 arguments
[12912.728933] parameter: `1' invalid for parameter `b'
[12912.768608] b: can only take 5 arguments
[12912.768693] parameter: `1' invalid for parameter `b'
insmod: can't insert 'parameter.ko': Invalid argument[root@RK356X:/opt]# rmmod parameter
rmmod: can't unload module 'parameter': No such file or directory
所以是不能这么操作的,因为会提示你只能传五个元素进去。