> 文章列表 > 嵌入式Linux(6):驱动模块传参

嵌入式Linux(6):驱动模块传参

嵌入式Linux(6):驱动模块传参

文章目录

  • 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.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

所以是不能这么操作的,因为会提示你只能传五个元素进去。