正点原子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所有可读

cpp 复制代码
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

cpp 复制代码
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

cpp 复制代码
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 许可的模块使用

cpp 复制代码
int add(int a, int b)
{
	return a+b;
}
EXPORT_SYMBOL(add);  

内核符号表导入

extern就行

cpp 复制代码
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文件,

bash 复制代码
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 push

adb devices

加载驱动 数组逗号分割

insmod hellworld.ko a=1 array=1,2,3 str=helloworld #加载驱动模块

8.问题

驱动模块编译

相关推荐
进击的荆棘1 分钟前
Linux系统——线程同步与互斥
linux·运维·服务器·策略模式·同步·互斥·posix
白杨尚青11 分钟前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
橙橙笔记17 分钟前
QT的学习第四部分
linux·qt·学习·音视频
.道阻且长.18 分钟前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
叼烟扛炮41 分钟前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
在猴站学算法1 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习
starzy19901 小时前
深入理解Scala匿名函数:函数式编程基石
开发语言·scala
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
linux·运维·服务器·ffmpeg·ffmpeg音视频进阶
旖旎夜光1 小时前
【C++ 基础入门】C++ 继承(上):概念、切片、隐藏、默认成员函数与友元
c++·笔记·学习
Godspeed Zhao1 小时前
从零开始学AI24——无监督学习之K均值
学习·机器学习