# rk3576-learning **Repository Path**: linzhenghan/rk3576_learning ## Basic Information - **Project Name**: rk3576-learning - **Description**: 泰山派3M rk3576相关学习仓库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-09 - **Last Updated**: 2026-04-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rk3576-learning 泰山派3M rk3576 相关资料学习记录 ## 编写第一个驱动 内核的基本框架 - 加载函数(Module Entry Point) - 加载函数(Module Entry Point) - 通常使用static int __init xxx_init(void) 定义,并通过 module_init() 宏注册 - 卸载函数(Module Exit Point) - 卸载函数(Module Exit Point) - 通常使用static void __exit xxx_exit(void) 定义,并通过 module_exit() 宏注册 - 许可证声明(License Declaration) - 通常使用MODULE_LICENSE("GPL v2"); 宏注册 上述三个模块为每个驱动模块必须的部分,下述模块可以按需添加 - 模块参数:允许模块加载时传递参数,提高灵活性 - 导出符号:实现不同模块/驱动间的功能共享 - 作者和描述信息:便于维护和模块识别 第一个驱动文件:hello_world.c ```c #include #include static int __init hello_world_init(void) { printk("hello world\n"); return 0; } static void __exit hello_world_exit(void) { printk("hello world exit\n"); } module_init(hello_world_init); module_exit(hello_world_exit); MODULE_LICENSE("GPL v2"); MODULE_VERSION("1.0"); MODULE_DESCRIPTION("helloworld Driver"); ``` printk 是 Linux 内核中的“打印日志”函数,相当于我们在普通 C 程序里的 printf,但它专门用在内核空间,用于给开发者输出调试信息、状态信息或错误信息。 在 Linux 驱动开发、内核模块开发中,printk 是主要的调试工具。 printk 还支持日志等级,可以指定消息的重要程度: KERN_EMERG 严重到系统可能瘫痪 KERN_ALERT 需要立即处理的警报 KERN_CRIT 危急错误 KERN_ERR 普通错误 KERN_WARNING 警告(不是致命错误) KERN_NOTICE 需要注意的信息 KERN_INFO 一般信息(成功/流程) KERN_DEBUG 调试信息(代码跟踪) 如果不指定日志等级,那么就是默认的 KERN_WARNING 级别。 使用示例 ```c printk(KERN_INFO "Driver loaded successfully.\n"); // 流程性通知 printk(KERN_ERR "Can not open device!\n"); // 错误通知 printk(KERN_DEBUG "x value is %d\n", x); // 普通调试时用 ``` 编写Makefile文件 ```makefile export ARCH=arm64 export CROSS_COMPILE=/home/lin/TaishanPi-3-Linux/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- obj-m += hello_world.o KDIR := /home/lin/TaishanPi-3-Linux/kernel-6.1 PWD ?= $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean ``` 特别注意:我们编译内核驱动模块之前,一定要确保kernel已经被编译过了,因为编译内核模块的依赖文件有些需要在编译内核后生成。 测试驱动 ```shell sudo insmod hello_world.ko ``` 可以通过如下查看日志 ```shell dmesg | grep -E 'hello' ``` ## Makefile 讲解 - 什么是Makefile Makefile 就是一个普通的文本文件,里面写了编译程序的规则和命令。 只要我们用 make 命令, make 工具会自动读 Makefile ,按照里面的指令一步步帮我们编译代码。 用 Makefile 能让我们不用每次手敲长长的编译命令,非常方便,尤其是有很多源文件的时候。 - 什么是make工具 make 工具是编译辅助工具。解决使用命令编译工程非常繁琐的问题。 读取当前目录下的 Makefile 文件,然后自动帮你完成: 编译 链接 清理(删除临时文件)。 只要源文件有改动,它才会重新编译,没改就不用动。 编译内核驱动、很多大型项目,都是靠 make + Makefile 来自动化编译。 - Makefile 和 make的关系 Makefile:一本“说明书”,写清楚: 我要生成什么文件(目标) 这些文件依赖哪些源文件 要用什么命令去生成 make:一个“执行说明书的小工” 它不会自己猜怎么编译 它只是读 Makefile 然后一步一步执行里面的命令 具体规则现场查看