文章目录
- 1、什么是驱动传参?
- 2、驱动传参有什么作用?
- 3、怎么给我们的驱动传参数?
-
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.o
all:
make -C $(KERN_DIR) M=$(PWD) modules
clean:
rm -rf *.order *o *.symvers *.mod.c *.mod *.ko
编译模块
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make
安装模块:
[root@RK356X:/opt]
[10720.481350] a = 66
[10720.481426] hello world
[root@RK356X:/opt]
[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]
[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]
[11852.876411] a = 1
[11852.876498] Bye Bye
测试传三个数组元素(最大传5个元素):
[root@RK356X:/opt]
[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]
[11953.501088] a = 1
[11953.501189] Bye Bye
测试传递多个参数进去(超过5个)进去:会报错,不能这么操作。
[root@RK356X:/opt]
[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: can't unload module 'parameter': No such file or directory
所以是不能这么操作的,因为会提示你只能传五个元素进去。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)