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

【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://www.xdnf.cn/news/20133.html

相关文章:

  • Django 常用功能完全指南:从核心基础到高级实战
  • [光学原理与应用-401]:设计 - 深紫外皮秒脉冲激光器 - 元件 - 布拉格衍射在深紫外皮秒声光调制器(AOM)中的核心作用与系统实现
  • 小程序:12亿用户的入口,企业数字化的先锋军
  • Linux编程——网络编程(UDP)
  • 计算机网络模型入门指南:分层原理与各层作用
  • 对接旅游行业安全需求:旅游安全急救实训室的功能构建与育人目标
  • 网络安全初级-渗透测试
  • 用AI做TikTok影视解说,全流程全自动成片,不懂外语也能做全球矩阵!
  • 办公任务分发项目 laravel vue mysql 第一章:核心功能构建 API
  • 系统越拆越乱?你可能误解了微服务的本质!
  • 【Linux系统】线程同步
  • 正则表达式与转义符的区别。注意输入的东西经过了一次转义,一次正则表达式。\\转义是单斜杠\\在正则表达式也是单斜杠所以\\\\经过两道门才是字符单斜杠
  • MongoDB Change Streams:实时监听数据变化的实战场景
  • clickhouse迁移工具clickhouse-copier
  • Python EXCEL 小技巧:最快重新排列dataframe函数
  • 工业机器人标杆的数字化突围,珞石机器人如何以CRM实现业务重塑
  • 技术视界 | 跨域机器人通信与智能系统:打破壁垒的开源探索
  • 【Linux】环境变量与程序地址空间详解
  • ansible-角色
  • MySQL知识
  • 【C++】17. AVL树实现
  • 探索未来智能自动化,一个强大的自动化引擎
  • 苹果Vision Air蓝图或定档2027,三星/微美全息加速XR+AI核心生态布局卡位
  • 第二阶段WinForm-13:图表控件,N层架构,Dapper
  • 【数学建模学习笔记】机器学习分类:决策树分类
  • 团队协作与接口联调 Charles抓包工具在多人开发中的高效应用
  • WEBSTORM前端 —— 第4章:JavaScript —— 第7节:函数
  • 安徽造价信息网期刊及工程材料信息价
  • 去中心化投票系统开发教程 第一章:区块链基础知识
  • 新一代Agent(智能体),路在低代码?