09_驱动模块传参数
驱动模块传参数
1.什么是驱动传参
驱动传参就是传递参数给我们的驱动。
举例:
insmod beep.ko a=1
2.驱动传参数有什么作用呢?
(1)设置驱动的相关参数,比如设置缓冲区的大小
(2)设置安全校验,防止我们写的驱动被人盗用
3.怎么给驱动传参数?
传递普通的参数, 比如 char int 类型, 使用如下函数:
部分常用参数权限解释如下:
其它的可以使用下面的方法来判断:
可以将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为 1 表示文件所有者可读,第二位为 1 表示文件所有者可写,第三位为 1 表示文件所有者可执行;接下来三位表示文件所有者同组成员的权限;再下来三位为不同组用户权限。
示例
parameter.c
#include<linux/init.h> //包含宏定义的头文件
#include<linux/module.h> //包含初始化加载模块的头文件
static int a;
/* 驱动传普通参数 */
module_param(a, int, S_IRUSR); //文件所有者可读
static int hello_init(void)
{
/* 内核打印函数不能用printf,因为内核没有办法使用C语言库 */
printk("a = %d\n", a);
return 0;
}
static void hello_exit(void)
{
printk("byby\n"); //内核模块卸载的时候打印"byb byb
printk("a = %d\n", a);
}
module_init(hello_init); //驱动模块的入口
module_exit(hello_exit); //驱动模块的出口
MODULE_LICENSE("GPL"); //声明模块拥有开源许可证
Makefile
obj-m +=parameter.o
KDIR:=/home/mzx/imx6ull/linux-imx-rel_imx_4.1.15_2.1.0_ga
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
在开发板上安装驱动
我们进入到/sys/module/parameter/目录下, 查看变量 a 的读写权限, 如下图所示:
传递数组使用以下函数:
注意参数nump要传地址,比如&count
示例
parameter.c
#include<linux/init.h> //包含宏定义的头文件
#include<linux/module.h> //包含初始化加载模块的头文件
static int b[5];
static int count;
/* 驱动传数组参数 */
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 ", i, b[i]);
}
printk("count = %d\n", count);
return 0;
}
static void hello_exit(void)
{
printk("byby\n"); //内核模块卸载的时候打印"byb byb
}
module_init(hello_init); //驱动模块的入口
module_exit(hello_exit); //驱动模块的出口
MODULE_LICENSE("GPL"); //声明模块拥有开源许可证
Makefile
obj-m +=parameter.o
KDIR:=/home/mzx/imx6ull/linux-imx-rel_imx_4.1.15_2.1.0_ga
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
注意:数组最多设5个值