【RK3576】【Android14】如何在Android kernel-6.1 的版本中添加一个ko驱动并编译出来?
获取更多相关的【RK3576】【Android14】驱动开发,可收藏系列博文,持续更新中:
【RK3576】Android 14 驱动开发实战指南
前置步骤
首先完整编译一次,保证kernel编译过有中间成果物
cd .../Android/# 配置环境变量
source build/envsetup.sh# 确保 lunch 过
lunch rk3576_u-userdebug# 编译内核
./build.sh -K -J8
//-K = build kernel
方法一:将模块添加到安卓SDK中,使用make编译
步骤一:选择一个合适的目录
在Android/external下创建目录:
mkdir external/simple_ko/
步骤二:完成KO模块源码
编写external/simple_ko/
simple_ko.c
#include <linux/init.h>
#include <linux/module.h> static int hello_init(void)
{ printk("Hello, World !\n"); return 0;
} static void hello_exit(void)
{ printk("Goodbye, World !\n");
} module_init(hello_init);
module_exit(hello_exit); MODULE_LICENSE("Dual BSD/GPL");
步骤三:创建 Makefile
编写external/simple_ko/
Makefile
obj-m += simple_ko.o
步骤四:添加build.sh脚本
编写external/build.sh脚本:
#!/bin/bash#Usage:
#Compile all: ./build.shexport PATH=../prebuilts/clang/host/linux-x86/clang-r487747c/bin:$PATHLOCAL_KERNEL_PATH=kernel-6.1
ADDON_ARGS="CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1"cd ../$LOCAL_KERNEL_PATH && make $ADDON_ARGS ARCH=arm64 -C . M=../external/$1 clean && cd -
cd ../$LOCAL_KERNEL_PATH && make $ADDON_ARGS ARCH=arm64 -C . M=../external/$1 -j8 && cd -
步骤五:编译模块
# 进入Android/external目录
cd external# 编译simple_ko模块
./build.sh simple_ko
步骤六:提取 .ko
并测试
拷贝KO到本地,通过adb push推送到设备端
参考:【RK3576】【Android14】ADB工具说明与使用
# 拷贝到本地
Y:\nfs\simple_ko.ko# 确认adb设备存在
adb devices
//List of devices attached
//5aaa789bdf4c4440 device# 推送到设备
adb push Y:\nfs\simple_ko.ko /data/local/tmp/
//Y:\nfs\simple_ko.ko: 1 file pushed, 0 skipped. 14.9 MB/s (121928 bytes in 0.008s)# 加载模块
adb shell
su
insmod /data/local/tmp/simple_ko.ko# 查看日志
dmesg | grep "World"# 卸载
rmmod simple_ko# 查看日志
dmesg | grep "World"
在前面基础上进阶,实现在外部目录下编译simple_ko模块
# 随机目录下创建simple_ko目录mkdir /data/tmp/simple_ko# 将前面的simple_ko.c文件和Makefile拷贝过来
cp .../simple_ko.c /data/tmp/simple_ko
cp .../Makefile /data/tmp/simple_ko# 配置环境变量
export PATH=[使用绝对路径]/prebuilts/clang/host/linux-x86/clang-r487747c/bin:$PATH# 编译前clean
cd [使用绝对路径]/kernel-6.1/ && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 -C . M=/data/tmp/simple_ko clean && cd -# 编译KO模块
cd [使用绝对路径]/kernel-6.1/ && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 -C . M=/data/tmp/simple_ko -j8 && cd -
方法二:将模块添加到内核源码树中,使用传统的 Kconfig + Makefile 编译方式
步骤一:选择一个合适的目录
进入内核源码目录:
cd .../Android/kernel-6.1
创建模块目录(建议放在 drivers/misc/
下):
mkdir drivers/misc/simple_ko
步骤二:完成KO模块源码
编写drivers/misc/simple_ko/
simple_ko.c
#include <linux/init.h>
#include <linux/module.h> static int hello_init(void)
{ printk("Hello, World !\n"); return 0;
} static void hello_exit(void)
{ printk("Goodbye, World !\n");
} module_init(hello_init);
module_exit(hello_exit); MODULE_LICENSE("Dual BSD/GPL");
步骤三:创建 Makefile
编写drivers/misc/simple_ko/
Makefile
obj-$(CONFIG_SIMPLE_KO) += simple_ko.o
步骤四:修改上层 Makefile
编辑 drivers/misc/Makefile
,添加一行:
obj-$(CONFIG_SIMPLE_KO) += simple_ko/
步骤五:添加 Kconfig 选项
编辑 drivers/misc/Kconfig,
在合适位置(比如末尾)添加:
config SIMPLE_KOtristate "Simple hello_world module"helpSay Y or M here to test a simple kernel module that printshello world.
步骤六:启用模块配置
修改xxx_defconfig内核配置项:
make ARCH=arm64 rockchip_defconfigmake ARCH=arm64 menuconfig
找到SIMPLE_KO配置项:
> Search (SIMPLE_KO) lq Search Results qkx Symbol: SIMPLE_KO [=n] x x Type : tristate x x Defined at drivers/misc/Kconfig:531 x x Prompt: Simple hello_world module x x Location: x x -> Device Drivers x x -> Misc devices x x (1) -> Simple hello_world module (SIMPLE_KO [=n])
勾选SIMPLE_KO配置项
保存defconfig配置后,将.config拷贝到项目xxx_defconfig
cp .config arch/arm64/configs/rockchip_defconfig
可以通过cat命令查看配置是否已添加:
$ cat arch/arm64/configs/rockchip_defconfig | grep SIMPLE_KO
CONFIG_SIMPLE_KO=m
步骤七:编译内核
回到Android根目录,编译内核
cd .../Android/# 配置环境变量
source build/envsetup.sh# 确保 lunch 过
lunch rk3576_u-userdebug# 编译内核
./build.sh -K -J8
//-K = build kernel
成功后,模块会生成在:
kernel-6.1/drivers/misc/simple_ko/simple_ko.ko
步骤八:提取 .ko
并测试
拷贝KO到本地,通过adb push推送到设备端
参考:【RK3576】【Android14】ADB工具说明与使用
# 拷贝到本地
Y:\nfs\simple_ko.ko# 确认adb设备存在
adb devices
//List of devices attached
//5aaa789bdf4c4440 device# 推送到设备
adb push Y:\nfs\simple_ko.ko /data/local/tmp/
//Y:\nfs\simple_ko.ko: 1 file pushed, 0 skipped. 14.9 MB/s (121928 bytes in 0.008s)# 加载模块
adb shell
su
insmod /data/local/tmp/simple_ko.ko# 查看日志
dmesg | grep "World"# 卸载
rmmod simple_ko# 查看日志
dmesg | grep "World"