当前位置: 首页 > 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.gsyq.cn/news/1431913.html

相关文章:

  • 不只是驱动移植:手把手教你为RK3566安卓设备调试RTL8211F千兆网卡性能与LED状态
  • Neoverse N1 CPU性能分析与PMU调优实践
  • 手把手教你用TensorFlow Lite在IMX6ULL上部署AI模型(附STM32MP157传感器数据采集源码)
  • 别再死记硬背了!用Python搞定贪心算法,从找零钱到压缩文件一次讲透
  • 【工具调用评估】Function Calling(函数调用)准确率测试:参数提取漏填、错填怎么防?
  • MySQL报错注入实战:当updatexml/extractvalue遇上right()截断,如何完整获取长flag?
  • 别再只用JSON了!手把手教你用Protocol Buffers(protobuf)提升Java微服务性能
  • Vue项目实战:Element UI的el-select回显数字而非文字?一个数据类型引发的‘血案’
  • 嘉立创EDA标准版画PCB,从原理图到Gerber文件的保姆级避坑指南
  • 给自动驾驶新手的激光雷达参数扫盲:从905nm和1550nm波长到点频线数,一次讲清楚
  • Flutter UI2CODE:从Figma设计稿到可运行代码的自动化实践
  • 告别传统求解器:傅立叶神经算子(FNO)如何将PDE计算速度提升1000倍?
  • 保姆级教程:在Win10专业版上从零安装dSPACE 2017A,关联MATLAB 2016b一步到位
  • 竞争分析实战指南:从市场洞察到AI赋能,构建差异化增长策略
  • K8s网络管理利器:手把手教你安装配置calicoctl客户端(v3.21.4版)
  • 别再手动写Tooltip了!ElementUI表单label提示的3种高效封装方案(附代码)
  • Flutter VLC播放RTSP流媒体,从卡顿到流畅:一份保姆级的低延迟配置清单(附完整代码)
  • 北斗SPP避坑指南:广播星历文件解析与伪距C6I提取的那些细节
  • PP-OCRv4识别模型微调避坑指南:如何用5000张图+合成数据提升生僻字准确率
  • Unity 2022 + Pico 4 开发避坑:XR Interaction Toolkit 2.3.2 环境配置与串流调试全流程
  • 2026年口碑好的文件柜冷轧板/高强度冷轧板/冷轧板长期合作厂家推荐 - 行业平台推荐
  • AI驱动的自我改写恶意软件:原理、威胁与下一代防御体系构建
  • AI如何重塑专业服务:从效率工具到关系重构者
  • 告别虚拟机手柄难题:DS4Windows完美适配Hyper-V/VMware全攻略
  • 别再死记硬背了!用Python仿真带你玩转SRT除法器设计(附完整代码)
  • 2026年靠谱的安徽白云石/江苏灰钙粉(涂料专用)/浙江氢氧化钙推荐厂家精选 - 品牌宣传支持者
  • 从上海电信数据集看边缘计算:如何用真实用户轨迹数据优化服务器部署?
  • 2026年性价比高的无花镀锌板/冲压级镀锌板优质厂家汇总推荐 - 行业平台推荐
  • 告别手动抠图!用Labelme的AI-Polygon功能快速分割图像(Python 3.8环境保姆级教程)
  • 科研党必备:如何用闲置旧电脑/树莓派搭建低成本WebDAV服务器,同步Zotero文献?