正点原子RK3568学习日志6-驱动模块传参
1.基础学习1-6知识点总结
驱动模块传递参数类型:基本类型,数组,字符串
是传给驱动
2.驱动模块传参函数--module_param(name, type, perm)基本类型
name:模块参数的名称
type: 模块参数的数据类型
基本类型:char,bool,int,long,short, byte, ushort, uint, charp,(字符指针)
perm: 模块参数的访问权限 x1 w2 r4
S_IRUSR 4用户可读
S_IRGRP 4组可读S_IROTH 4其他人可读
S_IRUGO 444S所有可读
static int a = 0;module_param(a, int, S_IRUGO); //传基本类型参数 444
MODULE_PARM_DESC(a, "e.g:a=1"); //描述信息printk("a is %d\n", a);
3.驱动模块传参函数--module_param_array(name, type, nump, perm)数组
name: 要传递给驱动代码中的变量的名字
type: 模块参数的数据类型
nump: 数组长度 是个地址perm: 模块参数的访问权限 x1 w2 r4
static int array[5] = {0};
static int array_size; //自动判断多长,module_param_array(array, int, &array_size, S_IRUGO); //传数组参数 444 用&符号,前面那个是数组
MODULE_PARM_DESC(array, "e.g:array=1,2,3"); //描述信息for(i = 0; i < array_size; i++){printk("array[%d] is %d\n", i, array[i]);}printk("array_size is %d\n", array_size);
4.驱动模块传参函数--moudule_param_string(name, string, len, perm)字符串
name: 要传递给驱动代码的变量的名字
string: 驱动代码内部的变量的名字
len: 字符串大小
perm: 模块参数的访问权限 x1 w2 r4
static char str1[10] = {0};module_param_string(str, str1, sizeof(str1), S_IRUGO); //传字符串 444
MODULE_PARM_DESC(str, "e.g:str=hello"); //描述信息printk("str1 is %s\n", str1);
5.显示函数--MODULE_PARM_DESC(_parm, desc)
用来描述模块参数的信息
_parm: 要描述的参数的名称
desc: 描述信息
6.内核模块符号表
驱动程序编译成驱动模块,ko文件,需要各个模块之间进行访问,要放在同一个目录下,进行make,符号就是内核中的函数名,全局变量名,符号表就是用来记录这些符号的文件
内核符号表导出
EXPORT_SYMBOL(sym)
EXPORT_SYMBOL_GPL(sym) 只能被 GPL 许可的模块使用
int add(int a, int b)
{return a+b;
}
EXPORT_SYMBOL(add);
内核符号表导入
extern就行
extern int add(int a, int b); static int helloworld_init(void)
{int a;a = add(1, 2);printk("a=%d\n", a);return 0;
}
7.实验:先编译a.c, 再编译b.c, 使用驱动模块编译方法
1.使用驱动模块方法,随便建一个目录,a.c b.c 文件,
2.再建一个Makefile文件,
ARCH := arm64 CROSS_COMPILE := aarch64-rockchip1031-linux-gnu- export ARCH CROSS_COMPILE KDIR := /home/alientek/rk3568_linux5.10_sdk/kernel PWD ?= $(shell pwd) obj-m += a.o obj-m += b.o all:make -C $(KDIR) M=$(PWD) modules clean:make -C $(KDIR) M=$(PWD) clean
3.然后在上级目录make,产生ko文件,先移动到windows
make clean 清除掉make后的文件4.使用ADB工具从windows移动到rk3568, rk3568用串口工具
win+R cmd
windows 家目录是/
find / -name "*.ko"
find / -name "helloworld.ko"
modinfo .ko 查看.ko文件
adb pushadb devices
加载驱动 数组逗号分割
insmod hellworld.ko a=1 array=1,2,3 str=helloworld #加载驱动模块
8.问题
驱动模块编译