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

深入瑞芯微RK3568 BSP:从Android.bp到U-Boot,带你读懂原厂SDK的目录玄机

深入瑞芯微RK3568 BSP:从Android.bp到U-Boot,带你读懂原厂SDK的目录玄机

在嵌入式开发领域,真正掌握一款芯片平台的精髓往往不在于能跑通demo,而在于理解其BSP(Board Support Package)的设计哲学。瑞芯微RK3568作为一款中高端AIoT芯片,其Android 11 BSP的目录结构就像一张精心绘制的地图,藏着从硬件抽象到系统集成的全部秘密。本文将带你以"代码考古学家"的视角,拆解那些看似普通的文件夹背后蕴含的工程智慧。

1. 原厂BSP的顶层设计逻辑

当打开RK3568的Android 11 SDK包时,扑面而来的数十个目录可能会让开发者陷入"选择困难"。实际上,这些文件夹的排布遵循着Android开源项目(AOSP)与芯片厂商的双重规范:

  • AOSP标准层art/bionic/frameworks/等目录保持着与谷歌原版的高度一致,这是系统兼容性的基石
  • 硬件适配层device/hardware/kernel/构成了芯片定制的核心三角区
  • 厂商扩展层rknin/RKTools/等瑞芯微特有目录藏着原厂的"黑科技"

提示:理解这种分层架构,能帮助开发者在修改代码时准确定位——该动AOSP标准层还是硬件适配层,往往决定着后续维护的难易程度。

2. 硬件抽象的艺术:device与hardware目录

2.1 device/rockchip/rk3568的奥秘

这个目录是RK3568开发板的"身份证",其子目录结构值得玩味:

device/rockchip/rk3568/ ├── apps/ # 预装应用 ├── audio/ # 音频策略 ├── bootloader/ # 引导配置 ├── configs/ # 硬件参数 ├── display/ # 显示配置 ├── etc/ # 初始化脚本 ├── firmware/ # 固件镜像 ├── overlay/ # 资源覆盖 └── sepolicy/ # 安全策略

特别需要注意的是overlay/frameworks/base/core/res/res/目录,这里通过资源覆盖机制实现了对AOSP默认配置的修改,比直接改动AOSP源码更优雅。

2.2 hardware/rockchip的HAL层实现

硬件抽象层(HAL)是Android系统与Linux内核之间的"翻译官"。RK3568的HAL实现有几个关键目录:

  • interfaces/:标准的HIDL接口定义
  • libgralloc/:图形内存分配器
  • librga/:2D加速器驱动
  • libhwc/:硬件合成器

在调试显示异常问题时,经常会用到这个命令抓取HAL层状态:

adb shell dumpsys SurfaceFlinger

3. 内核与驱动的秘密花园

3.1 kernel/目录的双重身份

RK3568的kernel目录实际上是一个完整的Linux内核源码树,但有几个特殊之处:

  1. arch/arm64/boot/dts/rockchip/存放着所有开发板的设备树文件
  2. drivers/soc/rockchip/包含芯片特有的外设驱动
  3. include/uapi/linux/rk_*.h定义了用户空间与内核的交互接口

设备树与驱动的对应关系可以通过这个命令验证:

cat /proc/device-tree/compatible

3.2 编译系统的演进:从Make到Soong

RK3568 BSP中同时存在两种编译系统:

文件类型出现位置作用时期
Android.mkkernel/drivers/传统Make
Android.bphardware/interfaces/现代Soong

迁移到Soong编译系统后,模块依赖关系变得更加明确。例如在hardware/rockchip/Android.bp中可以看到:

cc_library_shared { name: "vendor.rockchip.hardware.example@1.0", srcs: ["Example.cpp"], shared_libs: [ "libhidlbase", "libhidltransport", ], }

4. U-Boot的定制之道

4.1 board/rockchip/的开发板适配

U-Boot的board/rockchip/目录下,每个开发板都有独立的配置文件夹。以RK3568为例:

  • common/:通用初始化代码
  • evb_rk3568/:评估板特定配置
  • include/configs/:头文件定义
  • rk3568.c:板级初始化入口

关键的DDR初始化参数藏在rk3568-dram.c文件中,修改时需特别注意时序参数:

static struct dram_cfg_param ddr_ddrconf_cfg[] = { {0x00000004, 0x0000008a}, {0x00000008, 0x00000004}, // ...更多寄存器配置 };

4.2 瑞芯微的编译魔法

原厂提供的make.sh脚本简化了编译流程,但其背后实际执行的是:

./make.sh rk3568 # 配置开发板 make ARCH=arm64 # 交叉编译

编译产物中,这几个文件最关键:

  • u-boot.bin:原始二进制镜像
  • u-boot.dtb:设备树二进制
  • u-boot.itb:包含设备树的FIT镜像

5. 厂商定制区的隐藏功能

5.1 RKTools的实用工具集

RKTools/目录下的工具常被开发者忽视,其实包含多个实用工具:

  • linux/Linux_Upgrade_Tool:底层烧录工具
  • windows/AndroidTool:Windows平台烧写工具
  • bin/rkdeveloptool:命令行烧录工具

使用示例:

rkdeveloptool db rk356x_spl_loader_v1.xx.bin rkdeveloptool wl 0x8000 uboot.img rkdeveloptool rd

5.2 rknin的性能调优

rknin/目录存放着瑞芯微的NPU相关组件:

  • driver/:内核驱动模块
  • examples/:AI模型示例
  • runtime/:推理运行时库

典型的NPU使用流程需要先加载内核模块:

insmod /vendor/lib/modules/rknpu.ko

6. 实战:添加新开发板支持

当需要为定制硬件移植BSP时,通常需要修改以下关键点:

  1. 设备树:在kernel/arch/arm64/boot/dts/rockchip/添加新dts文件
  2. U-Boot配置:复制board/rockchip/evb_rk3568/并修改初始化代码
  3. HAL适配:在hardware/rockchip/中添加新传感器驱动
  4. 构建配置:在device/rockchip/rk3568/中添加新产品定义

一个典型的开发板定义文件device/rockchip/rk3568/BoardConfig.mk包含这些关键参数:

TARGET_BOARD_PLATFORM := rk3568 BOARD_SENSOR_TYPE := virtual BOARD_HAVE_BLUETOOTH := true

7. 调试技巧与常见陷阱

在深度定制过程中,这些调试方法可能会帮到你:

  • 查看启动日志

    adb shell dmesg | grep -i error
  • 分析内存布局

    adb shell cat /proc/iomem
  • 追踪系统属性

    adb shell getprop | grep ro.hardware

常见问题包括:

  1. 显示异常:检查hardware/rockchip/libgralloc/的内存分配策略
  2. 音频失效:验证device/rockchip/rk3568/audio/中的策略文件
  3. 启动卡住:对比u-boot/include/configs/rk3568_common.h中的初始化参数

在rk3568的开发过程中,最耗时的往往不是代码编写,而是理解原厂设计的各种隐含约定。比如vendor/rockchip/common目录下的脚本会覆盖系统默认行为,而device/rockchip/common中的配置则会影响所有Rockchip平台。

http://www.jsqmd.com/news/920590/

相关文章:

  • 告别臃肿的PLY:手把手教你优化3D Gaussian Splatting的存储与传输
  • 从Google Duplex看对话式AI:技术原理、伦理挑战与工程实践
  • 机器学习项目成本估算与优化实战:从数据到部署的全链路解析
  • 多智能体系统开发:从核心挑战到工程实践的九重难关与应对策略
  • 不只是驱动移植:手把手教你为RK3566安卓设备调试RTL8211F千兆网卡性能与LED状态
  • Neoverse N1 CPU性能分析与PMU调优实践
  • 别只盯着等长!DDR3稳定性的幕后功臣:电源完整性与滤波电容摆放实战
  • 【长文本压测】大海捞针测试(Needle in a Haystack):评估模型长上下文记忆力
  • Multisim仿真避坑指南:从74LS148优先级电路到LED显示,我踩过的那些坑
  • 为什么你的AI推荐模型AB结果总不显著?——缺失的因果对齐层正在 silently bias 你的结论
  • 【对话模型评估】多轮对话记忆力测试:模型在第10轮对话还会记得第1轮的设定吗?
  • 手把手教你用TensorFlow Lite在IMX6ULL上部署AI模型(附STM32MP157传感器数据采集源码)
  • 终极OpenCore配置工具:告别复杂文本编辑,轻松搭建黑苹果系统
  • 终极指南:用Win11Debloat简单三步彻底清理Windows 11臃肿问题
  • 告别‘玄学’判断:如何用早期充放电曲线特征,给你的动力电池做个快速‘体检’?
  • 别再死记硬背了!用Python搞定贪心算法,从找零钱到压缩文件一次讲透
  • 社交发现系统设计:从算法匹配到关系培育,破解数字时代孤独困境
  • 告别system用户:在Android 11 user版本中为特定功能开启su权限的完整配置流程
  • 【工具调用评估】Function Calling(函数调用)准确率测试:参数提取漏填、错填怎么防?
  • 2026年4月有名的电解钢板源头厂家推荐,电解钢板,电解钢板厂商如何选 - 品牌推荐师
  • 告别硬边UI!用UE4材质和UMG轻松实现CSS级圆角按钮(附完整材质蓝图)
  • 2023 AI翻译工具深度横评:从DeepL到ChatGPT,场景化选型与实战指南
  • 第二机器时代AI投资全景图:从基础设施到行业应用的框架性指南
  • AI文本检测实战指南:从原理到工具,教你识别ChatGPT等生成内容
  • MySQL报错注入实战:当updatexml/extractvalue遇上right()截断,如何完整获取长flag?
  • AI与机器学习驱动卓越运营:从预测性维护到智能供应链的实战架构
  • 别再只用JSON了!手把手教你用Protocol Buffers(protobuf)提升Java微服务性能
  • 从原理图到PCB:嘉立创EDA标准版保姆级实战教程(附泪滴、铺地技巧)
  • 从数据手册的V-I曲线到实际浪涌:手把手教你读懂TVS的VRWM、VBR和VCL
  • 别再只用mean()了!Pandas rolling的5个高阶用法,让你的股票/销量分析更专业