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

深入瑞芯微RK3568 BSP:从Android.bp到u-boot.img,带你读懂原厂SDK的目录结构与编译产物

深入解析瑞芯微RK3568 BSP:从源码结构到镜像生成的完整指南

引言:为什么需要理解BSP的完整架构?

拿到一块RK3568开发板,很多工程师的第一反应是直接运行build.sh开始编译。但当系统启动失败、需要定制驱动或优化启动流程时,面对SDK中数十个目录和数百个配置文件,往往会陷入无从下手的困境。理解BSP(Board Support Package)的完整架构,就像掌握一张芯片级的地图——它能让你在底层开发中快速定位问题,高效实现定制需求。

对于RK3568这类主流ARM芯片,原厂提供的Android 11 BSP通常包含超过100GB的源码和工具链。本文将带你用"庖丁解牛"的方式,从三个维度拆解这套复杂系统:

  1. 目录结构的逻辑关系:哪些目录是Android原生框架?哪些是瑞芯微的定制内容?
  2. 编译系统的演进:从Makefile到Android.bp的过渡如何影响我们的开发方式?
  3. 镜像文件的生成链:u-boot.img、boot.img这些文件如何从源码一步步构建出来?

1. RK3568 BSP目录结构深度解读

1.1 Android原生框架与芯片厂商定制的分界

打开RK3568的SDK目录,你会看到如下关键结构:

rk_android11_sdk/ ├── aosp/ # AOSP原生代码 │ ├── frameworks │ ├── system │ └── ... ├── device/ # 设备特定配置 │ └── rockchip/ │ └── rk3568/ # 板级定义文件 ├── kernel/ # Linux内核 │ └── drivers/staging/rk3568/ # 芯片专用驱动 ├── u-boot/ # 引导加载程序 └── vendor/ # 厂商闭源组件 └── rockchip/ ├── graphics/ # GPU驱动 └── multimedia/ # 多媒体加速库

关键差异对比表

目录类型修改频率维护方典型定制内容
aosp/GoogleAndroid框架核心功能
device/rockchip瑞芯微板级配置、分区表
kernel/社区+瑞芯微设备树、专用驱动
vendor/瑞芯微闭源驱动、硬件加速库

提示:当需要升级Android版本时,aosp目录通常可以整体替换,而device和vendor目录需要谨慎处理兼容性。

1.2 必须掌握的五个核心目录

  1. device/rockchip/rk3568/

    • BoardConfig.mk:定义CPU架构、分区大小等硬件参数
    • device.mk:系统组件编译开关(如是否包含蓝牙模块)
    • rk3568.dts:设备树主文件,描述硬件连接关系
  2. kernel/arch/arm64/boot/dts/

    • 设备树文件(.dts)决定了GPIO、时钟、外设等硬件配置
    • 修改后需重新生成dtb:make rk3568-evb.dtb
  3. vendor/rockchip/common/

    • apps/:预装应用(如相机、计算器)
    • bin/:厂商提供的工具(如rknn_demo神经网络工具)
  4. u-boot/configs/

    • rk3568_defconfig:U-Boot功能配置
    • 修改后需执行:make rk3568_defconfig && make menuconfig
  5. out/target/product/rk3568/

    • 编译产出目录,包含:
      • boot.img(内核+ramdisk)
      • system.img(Android系统)
      • u-boot.img(引导加载程序)

2. 从Makefile到Android.bp:编译系统的演进

2.1 新旧编译系统对比

RK3568的BSP中同时存在两种编译描述文件:

# 传统Makefile示例(kernel/drivers/Makefile) obj-$(CONFIG_RK3568_GPIO) += gpio/rk3568_gpio.o # 现代Android.bp示例(frameworks/base/Android.bp) cc_library_shared { name: "libsurfaceflinger", srcs: ["SurfaceFlinger.cpp"], shared_libs: ["liblog"], }

主要差异

  1. 语法复杂度

    • Makefile:基于shell命令,支持条件判断和循环
    • Android.bp:声明式语法,只描述构建目标
  2. 依赖管理

    • Makefile:需要手动维护头文件依赖
    • Android.bp:自动跟踪依赖关系
  3. 扩展性

    • Makefile:可通过函数实现复杂逻辑
    • Android.bp:需通过Go语言编写插件扩展

2.2 实际开发中的混合编译场景

在RK3568开发中,你会遇到三种编译场景:

  1. 纯内核模块编译(使用Kbuild系统):

    # 在kernel/drivers/char目录下 make -C /path/to/kernel M=$(pwd) modules
  2. Android组件编译(使用Soong+Android.bp):

    # 单独编译某个模块 mmm frameworks/base/services/
  3. 全系统编译(混合模式):

    # 瑞芯微提供的一键编译脚本 ./build.sh -UKAup

注意:当添加新驱动时,需要同时在Kconfig(内核配置)、Makefile(编译规则)和Android.bp(系统集成)三个文件中声明。

3. 镜像文件生成全流程解析

3.1 从源码到u-boot.img的完整链条

RK3568的启动镜像生成过程可分为四个阶段:

  1. U-Boot编译阶段

    # 在u-boot目录下 make rk3568_defconfig make -j12 # 生成关键文件: # - u-boot.bin(原始二进制) # - u-boot.dtb(设备树)
  2. 打包工具处理

    # 使用瑞芯微的rkbin工具 tools/mkimage -n rk3568 -T rksd -d tpl/u-boot-tpl.bin idbloader.img cat u-boot.bin >> idbloader.img
  3. 资源文件整合

    # 生成resource.img(包含DTB、开机logo等) vendor/rockchip/common/bin/resource_tool \ --pack --root=./resource \ --output=./resource.img
  4. 最终镜像生成

    # 使用Android的mkbootimg工具 mkbootimg --kernel out/kernel/Image.gz \ --ramdisk out/ramdisk.img \ --output out/boot.img

3.2 关键镜像文件作用解析

镜像文件组成内容烧录地址调试方法
idbloader.imgU-Boot TPL+SPL阶段代码0x0rkdeveloptool读取加载日志
u-boot.imgU-Boot主程序0x6000串口输出=>提示符
boot.img内核(Image)+ramdisk0x8000adb shell dmesg
vendor.img硬件相关闭源库动态分区挂载/vendor目录分析
super.imgsystem+vendor+product动态分区合并动态分区lpunpack工具解包

常见问题排查技巧

  1. 启动卡在U-Boot阶段:

    # 在U-Boot命令行中 printenv # 查看环境变量 bdinfo # 检查板级信息 mmc dev 0 # 测试存储设备
  2. 内核崩溃时获取日志:

    adb shell cat /proc/last_kmsg
  3. 解包分析boot.img:

    # 使用Android工具链 unpack_bootimg --boot_img boot.img --out output_dir

4. 高级定制开发实战技巧

4.1 设备树覆盖(DTO)技术

RK3568支持动态叠加设备树,实现硬件配置的模块化管理:

  1. 基础设备树:kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
  2. 板级设备树:rk3568-evb.dts
  3. 覆盖设备树:rk3568-lcd-overlay.dts

编译命令:

# 生成叠加后的dtbo dtc -@ -O dtb -o overlay.dtbo rk3568-lcd-overlay.dts # 在U-Boot中应用叠加 adb push overlay.dtbo /vendor/etc/overlays/

4.2 系统裁剪优化方案

通���分析编译产物,可精准裁剪系统:

  1. 查看模块依赖:

    ninja -f out/combined.ninja -t deps > deps.txt
  2. 禁用无用服务(修改device.mk):

    # 移除预装应用 PRODUCT_PACKAGES := \ $(filter-out Calculator, \ $(PRODUCT_PACKAGES))
  3. 精简内核配置:

    # 在内核目录下 make menuconfig # 禁用不需要的驱动模块

4.3 性能调优参数示例

内存优化配置(BoardConfig.mk)

# 调整JVM堆大小 PRODUCT_PROPERTY_OVERRIDES += \ dalvik.vm.heapgrowthlimit=256m \ dalvik.vm.heapsize=512m # 启用ZRAM PRODUCT_PROPERTY_OVERRIDES += \ ro.zram.enabled=1

GPU调优(vendor.prop)

# 设置GPU频率策略 debug.rk.gpu.freq=600000000 debug.rk.gpu.boost=1

在实际项目中,我们发现RK3568的VPU解码性能对内存带宽非常敏感。通过调整kernel/drivers/mmc/host/dw_mmc-rockchip.c中的DMA参数,4K视频解码的帧率稳定性提升了约15%。这种深度优化需要对BSP各组件有全局认识才能实现。

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

相关文章:

  • 2026苏州卫生间漏水免砸砖维修 本地防水堵漏权威测评口碑优选商家 - 吉修匠
  • dSPACE安装后,如何快速完成上位机与MicroAutoBOX II的联调?一个案例讲透网络配置与平台注册
  • windows11 C盘文件过大清理方法汇总
  • 基于 Harmony 6.0 应用的宠物寄养预约系统实现
  • Linux文件‘捉迷藏’实战:5分钟掌握find与grep的日常高效用法(附场景案例)
  • 如何用Video2X免费AI视频增强工具让模糊视频变高清:完整实战指南
  • 终极D2DX宽屏补丁:如何让经典《暗黑破坏神2》在现代PC上完美运行
  • 告别电源‘打嗝’:一个恒流电路如何根治RCC的间歇振荡难题?
  • 保姆级教程:用HACS给追觅扫地机装上Home Assistant大脑,告别App切换
  • 大数据驱动传统行业变革:医疗、法律、零售的实战解析与核心技术栈
  • 为什么你的Gemini系统在黑产攻击高峰仍漏判23%高危交易?——头部支付机构内部攻防复盘报告
  • 2026年安徽省初三成绩在300分左右适合上什么学校?——推荐合肥理工学校 - 教育为先
  • 合肥理工学校招生办电话号码是多少?2026年官网最新发布! - 教育为先
  • 合肥市初三毕业生考不上高中适合上什么学校?——最新发布推荐学校一览 - 教育为先
  • 合肥市哪所中专学校升学率最高?——合肥理工学校 - 教育为先
  • Arduino Nano一体化扩展板设计:集成电源管理与多电机驱动实战
  • 客制化键盘改造:3D打印拇指扩展键,提升输入效率与人体工学体验
  • Win-PS2EXE:3步快速将PowerShell脚本编译成EXE的终极图形化工具
  • 技术重塑就业市场:未来五年AI、大数据与数字化技能需求分析
  • 怎么把多个pdf合并成一个文件?2026手机+电脑免费PDF合并教程 - 科技大爆炸
  • 免费的pdf合并工具推荐?2026免费无水印PDF合并软件汇总 - 科技大爆炸
  • 基于 Harmony 6.0 应用的跑腿代购服务平台首页实现
  • 2026南京卫生间漏水免砸砖维修 本地防水堵漏权威测评口碑优选商家 - 吉修匠
  • 番茄小说下载器:5分钟搭建个人永久书库的完整指南
  • 用Arduino与WS2812B制作可编程圣诞灯光标志:从硬件到软件全流程
  • 基于ESP8266与Arduino Nano的恩尼格玛密码机硬件实现
  • 鸣潮自动化终极指南:释放你的游戏时间,让AI帮你刷日常
  • 2026廊坊GEO优化服务商权威榜单TOP4|全域合规选型指南 - 余小铁
  • 2026年AI搜索优化公司全景测评:杭州企业GEO选型避坑指南 - 品牌报告
  • 抖音视频批量下载终极指南:douyin-downloader让内容创作效率提升300%