当前位置: 首页 > news >正文

【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"


文章转载自:

http://EF0ckezP.hmmnb.cn
http://u5u9hXo3.hmmnb.cn
http://C6piZZG5.hmmnb.cn
http://LfiWZMgq.hmmnb.cn
http://FeYQgRPV.hmmnb.cn
http://9cBqRHY0.hmmnb.cn
http://UoTT61s4.hmmnb.cn
http://99iXDtxI.hmmnb.cn
http://Xu9E3CNa.hmmnb.cn
http://NHmY1stO.hmmnb.cn
http://Vll3eO97.hmmnb.cn
http://DaoOu1To.hmmnb.cn
http://T8iF1BA9.hmmnb.cn
http://ktMzRYqd.hmmnb.cn
http://7wwUUWTC.hmmnb.cn
http://yBQZuVC5.hmmnb.cn
http://1yvzzluN.hmmnb.cn
http://4e6G2YCm.hmmnb.cn
http://yHNazMiM.hmmnb.cn
http://0G9nTuHc.hmmnb.cn
http://PPyKXy1s.hmmnb.cn
http://NVYdZRzE.hmmnb.cn
http://Z9VpldSC.hmmnb.cn
http://cvuNGKk8.hmmnb.cn
http://FEZYHAsu.hmmnb.cn
http://qVNW0aoO.hmmnb.cn
http://qWez2pMb.hmmnb.cn
http://kc6x8Oep.hmmnb.cn
http://cKbMvTzB.hmmnb.cn
http://6FR0sGFc.hmmnb.cn
http://www.dtcms.com/a/366505.html

相关文章:

  • 学习日记-SpringMVC-day49-9.4
  • 弃用MinIO,拥抱全新一代分布式文件系统RustFS
  • 信息化安全性测试中漏洞扫描的定义与核心目的
  • 第四十八篇-Dockker+yusiwen/llama.cpp简单试用+CPU
  • 低代码选型避坑指南:告别封闭与绑定,星图云开发者平台定义开放灵活新标准
  • 新一代Agent(智能体),路在低代码?
  • 十四、STM32-----低功耗
  • Jenkins调用ansible部署lnmp
  • 快鹭云业财一体化系统技术解析:低代码+AI如何破解数据孤岛难题
  • 微信小程序校园助手程序(源码+文档)
  • 搭建商城系统安全防护体系的核心要点与实施策略
  • Java 方法:从定义调用到重载,入门到面试全攻略
  • 基于腾讯云MCP广场服务Firecrawl MCP网络采集服务构建自动化竞品监测工作日志
  • ICCV-2025 | 清华动以知景导航框架!MTU3D:连接视觉定位与探索,实现高效多样的具身导航
  • 论文解读 | Franka 机器人沉浸式远程操作:高斯溅射 VR 赋能的遥操框架研发与应用
  • Linux-xargs-seq-tr-uniq-sort
  • C# FileInfo 类深度解析文件时间属性
  • 强化学习DQN解决Cart_Pole问题
  • Cursor 辅助开发:快速搭建 Flask + Vue 全栈 Demo 的实战记录
  • 【Spring Cloud Alibaba】Sentinel(一)
  • Java开发中的依赖环境管理
  • Ubuntu 使用 Samba 共享文件夹
  • HCIA备考:常见路由协议及特点
  • 【LeetCode热题100道笔记】缺失的第一个正数
  • List<?>和List<Object>区别
  • 【开题答辩全过程】以 基于微信小程序的宠物领养系统为例,包含答辩的问题和答案
  • 近期算法学习记录
  • UE4调试UAT时为何断点不了BuildCookRun的部分代码
  • MySQL 时间函数全解析:从 NOW() 到 UTC_TIMESTAMP() 的深度实践与选择策略
  • vscode launch.json 中使用 cmake tools 扩展的命令获取可执行文件目标文件名