RK3568 Android 13 驱动适配实战:从零开始让SDK在自己的板子上跑起来

拿到芯片厂商的BSP包只是第一步,如何让它在你自己的硬件上"活"起来,才是真正考验功底的时候。本文将从零开始,手把手带你完成RK3568 Android 13 SDK的板级移植,避开那些官方文档里不会写的"坑"。


目录

前言

[一、RK3568 启动流程概览](#一、RK3568 启动流程概览)

[二、SDK 编译前的关键修改](#二、SDK 编译前的关键修改)

[1. 内存初始化固件 ddr.bin 的修改](#1. 内存初始化固件 ddr.bin 的修改)

[1.1 找到 ddr.bin 的位置](#1.1 找到 ddr.bin 的位置)

[1.2 如何修改(重点)](#1.2 如何修改(重点))

[2. U-Boot 层的适配](#2. U-Boot 层的适配)

[2.1 编译配置文件](#2.1 编译配置文件)

[2.2 个性化修改](#2.2 个性化修改)

[2.3 修改调试串口波特率](#2.3 修改调试串口波特率)

[3. Kernel 层的适配](#3. Kernel 层的适配)

[3.1 选择合适的设备树文件](#3.1 选择合适的设备树文件)

[3.2 编译配置文件](#3.2 编译配置文件)

[3.3 Kernel阶段串口波特率](#3.3 Kernel阶段串口波特率)

[3.4 编译SDK(一键或分部)](#3.4 编译SDK(一键或分部))

三、让SDK在你的板子上跑起来

[1. IO 电压域(Voltage Domain)的核对](#1. IO 电压域(Voltage Domain)的核对)

[2. 烧录与运行测试](#2. 烧录与运行测试)

总结


前言

当我们拿到Rockchip(瑞芯微)提供的Linux或Android SDK时,第一项任务永远是"本地化"------即让这套通用的软件系统适配到公司自研的硬件底板上。这不仅是后续驱动开发(如LCD、TP、Camera、Wi-Fi等)的基石,更是整个项目软硬件联调的"破冰"之旅。

然而,官方SDK默认是针对其参考设计板(EVB) 的,直接烧录到你的板子上大概率是无法正常启动的。不同厂商的DDR型号、PMIC(电源管理芯片)、IO电压、调试串口波特率等都存在差异。

本文基于RK3568 平台和Android 13 SDK,详细记录了我将官方SDK移植到定制板上的全流程、修改细节以及踩坑记录。如果你是嵌入式驱动开发的初学者,这篇文章将为你节省数周的摸索时间。


一、RK3568 启动流程概览

在进行任何移植工作前,理解芯片的启动流程至关重要。RK3568基于ARMv8架构,其启动流程与标准ARM启动略有不同,因为它集成了Rockchip自研的Miniloader阶段。具体的启动流程介绍可参考以下链接中的官方文档:

https://opensource.rock-chips.com/wiki_Boot_option

简化启动链路如下:

  1. BootROM(固化在芯片内) :芯片上电后首先执行,初始化基本时钟,从eMMC/SD卡/NAND等存储介质加载idbloader.img(由ddr.binusbplug.bin组成)。

  2. Miniloader(ddr.bin) :此阶段负责初始化DDR内存,这是后续所有代码运行的基础。这也是我们第一个需要修改的地方

  3. U-Boot:加载并运行U-Boot,进行更复杂的硬件初始化(如时钟、串口、存储),并加载内核。

  4. Kernel(内核):Linux内核启动,加载驱动,挂载根文件系统。

  5. Android/System:启动Android系统服务,进入桌面。

💡 核心思想 :移植的本质,就是让上述每一个阶段的硬件配置参数,都与你的实际原理图严格对应。

二、SDK 编译前的关键修改

官方SDK的编译通常很简单,但直接编译出来的镜像无法在你的板子上运行。我们需要按顺序修改三个关键部分。

1. 内存初始化固件 ddr.bin 的修改

这个文件负责在启动的最早期初始化DDR,如果参数不对,你的板子会直接"变砖"(无任何串口输出)。

1.1 找到 ddr.bin 的位置

配置文件路径:rkbin/RKBOOT/RK3568MINIALL.ini,从下图文件截图中可以找到实际使用的DDR固件路径,为 rkbin/bin/rk35/rk3568_ddr_1560MHz_v1.18.bin 。

1.2 如何修改(重点)

Rockchip官方提供了一个隐藏工具------ddrbin_tool,它可以将二进制文件导出为文本配置,修改后再重新打包。

操作步骤:

Step 1:导出配置参数

bash 复制代码
# 进入工具目录
cd rkbin/tools
# 导出参数到 gen_param.txt 文件
./ddrbin_tool rk3568 -g gen_param.txt ../bin/rk35/rk3568_ddr_1560MHz_v1.18.bin

Step 2:修改关键参数

打开生成的 gen_param.txt,你不需要修改大部分参数,但以下两项必须确认:

参数名 说明 常见修改值
uart baudrate 调试串口波特率 很多定制板为了兼容老式工具,需要从默认的 1500000 改为 115200
first_init_dram_type DDR内存类型 务必与硬件匹配 !例如,你板子上是LPDDR4X,则设为 8。官方EVB多用DDR4。

Step 3:重新生成 ddr.bin

bash 复制代码
./ddrbin_tool rk3568 gen_param.txt ../bin/rk35/rk3568_ddr_1560MHz_v1.18.bin

2. U-Boot 层的适配

U-Boot是承上启下的关键环节,需要修改串口波特率、启动延时和设备树。

2.1 编译配置文件

U-Boot的配置头文件位于:u-boot/configs/rk3568_defconfig

常用修改项:

  • CONFIG_BOOTDELAY=3:将自动启动等待时间改为3秒,便于开发时按 Ctrl+C 中断进入命令行。

2.2 个性化修改

你还可以修改U-Boot启动时串口打印的Model名称,方便区分固件。

设备树路径:u-boot/arch/arm/dts/rk3568-evb.dtsi(或你的板级dts)

bash 复制代码
model = "MyCompany-RK3568 Custom Board"; // 改这里
compatible = "rockchip,rk3568-evb", "rockchip,rk3568";

2.3 修改调试串口波特率

修改uboot阶段的串口打印波特率(默认1500000),需要在make menuconfig中修改,如以下界面,注意需要用CTRL+BACK键组合使用才能删除原来的1500000,然后输入新的,保存退出。

更新配置的小技巧

在U-Boot目录下,如果你修改了 Kconfig,推荐使用以下标准流程来更新 defconfig

bash 复制代码
1. make rk3568_defconfig                   //加载基础配置
2. make menuconfig                         //图形化修改
3. make savedefconfig                      //生成精简配置
4. cp defconfig configs/rk3568_defconfig   //更新配置文件

3. Kernel 层的适配

Kernel层是我们最常打交道的部分,设备树(DTS)的选型和串口配置是这里的重点。

3.1 选择合适的设备树文件

默认的配置指向DDR4的板型即rk3568-evb1-ddr4-v10.dts,我这里板子用的是LPDDR4X,必须切换设备树文件。

修改路径device/rockchip/rk356x/rk3568_t/BoardConfig.mk

bash 复制代码
# 将默认的 ddr4 设备树改为 lp4x 的
PRODUCT_KERNEL_DTS := rk3568-evb2-lp4x-v10   # 注意:此处不需要加 .dts 后缀

修改后的设备树文件路径如下:

bash 复制代码
kernel-5.10/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dts

设备树文件也可以用include包含,常用的设备树文件如下,我们最常修改的是评估板和底板的设备树文件。

bash 复制代码
rk3568.dtsi         //芯片级设备树文件
rk3568-evb.dtsi     //官方评估板参考设计
rk3568-pinctrl.dtsi //描述各个外设的引脚配置
rk3568-evb2-lp4x-v10.dtsi    //底板级设备树文件

3.2 编译配置文件

kernel的配置头文件路径如下:

bash 复制代码
kernel-5.10/arch/arm64/configs/rockchip_defconfig
kernel-5.10/kernel/configs/android-13.config

3.3 Kernel阶段串口波特率

Kernel会继承U-Boot的波特率,但显式修改kernel-5.10/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi是更规范的做法。

bash 复制代码
kernel-5.10/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi

fiq-debugger {
    compatible = "rockchip,fiq-debugger";
    rockchip,serial-id = <2>;       //对应UART2
    rockchip,wake-irq = <0>;
    /* If enable uart uses irq instead of fiq */
    rockchip,irq-mode-enable = <1>;
    rockchip,baudrate = <115200>;  /* Only 115200 and 1500000 */ 此处修改调试串口波特率
    interrupts = <GIC_SPI 252 IRQ_TYPE_LEVEL_LOW>;
    pinctrl-names = "default";
    pinctrl-0 = <&uart2m0_xfer>;
    status = "okay";
};

3.4 编译SDK(一键或分部)

SDK编译的文件路径如下,

bash 复制代码
device/rockchip/rk356x/rk3568_t/ rk3568_t.mk

一键全编译

瑞芯微官方已经在SDK的根目录下编写好了编译脚本,build.sh文件,全部打包命令如下:

bash 复制代码
source build/envsetup.sh    //加载编译环境
lunch                       //选择目标系列芯片
./build.sh -UCKApu          //完整编译u-boot、kernel、Android最后打包成update.img一个完整的镜像包

这里运行lunch有很多选项,我们一般选编译rk3568_t-userdebug这个版本,

复制代码
android-builder@436b1153169c:~/sdk/rk3568-sdk$ lunch

You're building on Linux

Lunch menu .. Here are the common combinations:
     1. PX30_t-user
     2. PX30_t-userdebug
     3. aosp_arm-eng
     4. aosp_arm64-eng
     5. aosp_bluejay_car-userdebug
     6. aosp_bramble_car-userdebug
     7. aosp_cf_arm64_auto-userdebug
     8. aosp_cf_arm64_phone-userdebug
     9. aosp_cf_x86_64_foldable-userdebug
     10. aosp_cf_x86_64_only_phone_hsum-userdebug
     11. aosp_cf_x86_64_pc-userdebug
     12. aosp_cf_x86_64_phone-userdebug
     13. aosp_cf_x86_64_tv-userdebug
     14. aosp_cf_x86_auto-userdebug
     15. aosp_cf_x86_phone-userdebug
     16. aosp_cf_x86_tv-userdebug
     17. aosp_coral_car-userdebug
     18. aosp_flame_car-userdebug
     19. aosp_oriole-userdebug
     20. aosp_oriole_car-userdebug
     21. aosp_raven-userdebug
     22. aosp_raven_car-userdebug
     23. aosp_redfin_car-userdebug
     24. aosp_slider-userdebug
     25. aosp_sunfish_car-userdebug
     26. aosp_whitefin-userdebug
     27. aosp_x86-eng
     28. aosp_x86_64-eng
     29. arm_krait-eng
     30. arm_v7_v8-eng
     31. armv8-eng
     32. armv8_cortex_a55-eng
     33. armv8_kryo385-eng
     34. beagle_x15-userdebug
     35. beagle_x15_auto-userdebug
     36. hikey-userdebug
     37. hikey64_only-userdebug
     38. hikey960-userdebug
     39. hikey960_tv-userdebug
     40. hikey_tv-userdebug
     41. qemu_trusty_arm64-userdebug
     42. rk3326_t-user
     43. rk3326_t-userdebug
     44. rk3326_tgo-user
     45. rk3326_tgo-userdebug
     46. rk3399_t-user
     47. rk3399_t-userdebug
     48. rk3528_box-user
     49. rk3528_box-userdebug
     50. rk3562_32bit-user
     51. rk3562_32bit-userdebug
     52. rk3562_t-user
     53. rk3562_t-userdebug
     54. rk3562_tgo-user
     55. rk3562_tgo-userdebug
     56. rk3566_t-user
     57. rk3566_t-userdebug
     58. rk3566_tgo-user
     59. rk3566_tgo-userdebug
     60. rk3568_t-user
     61. rk3568_t-userdebug
     62. rk3588_box-user
     63. rk3588_box-userdebug
     64. rk3588_s-user
     65. rk3588_s-userdebug
     66. rk3588_t-user
     67. rk3588_t-userdebug
     68. rk3588_xr-user
     69. rk3588_xr-userdebug
     70. rk3588m_car-user
     71. rk3588m_car-userdebug
     72. rk3588m_s-user
     73. rk3588m_s-userdebug
     74. rk3588s_s-user
     75. rk3588s_s-userdebug
     76. rk3588s_t-user
     77. rk3588s_t-userdebug
     78. sdk_car_arm-userdebug
     79. sdk_car_arm64-userdebug
     80. sdk_car_portrait_x86_64-userdebug
     81. sdk_car_x86-userdebug
     82. sdk_car_x86_64-userdebug
     83. sdk_pc_x86_64-userdebug
     84. silvermont-eng
     85. uml-userdebug
     86. yukawa-userdebug
     87. yukawa_sei510-userdebug

Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): 61

编译之后的镜像文件在以下路径,

bash 复制代码
rockdev/Image-rk3568_t/update.img

分步编译(开发调试更高效)

在根路径下执行./build.sh -h能看到帮助命令,

bash 复制代码
android-builder@9268c6032251:~/sdk/rk3568-sdk$ ./build.sh -h
./build.sh: illegal option -- h
USAGE: [-U] [-CK] [-A] [-p] [-o] [-u] [-v VERSION_NAME]
No ARGS means use default build option
WHERE: -U = build uboot
       -C = build kernel with Clang
       -K = build kernel
       -A = build android
       -p = will build packaging in IMAGE
       -o = build OTA package
       -u = build update.img
       -v = build android with 'user' or 'userdebug'
       -d = huild kernel dts name
       -V = build version
       -J = build jobs

1.如果想仅编译uboot,在根目录下执行**./build.sh -U** ,或去uboot目录下执行**./make.sh rk3568**。

2.如果想近编译kernel,需要将kernel打包到boot.img镜像里,可以去kernel路径下编写make.sh脚本,我这里如下,注意需要结合自己的实际情况改写。

bash 复制代码
export PATH=../prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH

make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rockchip_defconfig android-13.config pcie_wifi.config && \
make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3568_t/boot.img rk3568-evb2-lp4x-v10.img
~

三、让SDK在你的板子上跑起来

1. IO 电压域(Voltage Domain)的核对

这是新手最容易忽略,但一旦出错就会导致外设(如SD卡、以太网、HDMI)无法工作甚至烧毁IO口的地方。

核心原则 :软件配置的IO电压必须与硬件原理图上的实际供电电压完全一致。

设备树中的配置示例

找到 评估参考板设备树文件,结合原理图修改 pmu_io_domains 节点如下,注意VCCIO2由硬件处理,不需要软件配置。

bash 复制代码
kernel-5.10/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi

&pmu_io_domains {
    status = "okay";
    pmuio2-supply = <&vcc3v3_pmu>;    // 硬件上PMUIO2接的是3.3V
    vccio1-supply = <&vcc3v3_sys>;    // VCCIO1接3.3V
    vccio3-supply = <&vcc1v8_sys>;    // VCCIO3接1.8V
    vccio4-supply = <&vcc1v8_sys>;    // VCCIO4接1.8V
    vccio5-supply = <&vcc3v3_sys>;    // VCCIO5接3.3V
    vccio6-supply = <&vcc1v8_sys>;    // VCCIO6接1.8V
    vccio7-supply = <&vcc3v3_sys>;    // VCCIO7接3.3V
};

⚠️ 警告:如果这里配置为1.8V,而硬件实际给的是3.3V,轻则导致该组IO引脚通信失败(电平不匹配),重则因电流倒灌烧毁芯片!

2. 烧录与运行测试

完成上述所有修改并编译成功后,你会得到 rockdev/Image-rk3568_t/update.img 这个完整的固件包。借助瑞芯微的下载工具将完整镜像包下载进板子里,

接上打印串口,重新上电可以看到打印日志,静待时刻,就会进入安卓系统。这时已完成一个新的SDK在自己板子上的移植,后续可以进行各板载外设的适配了。


总结

至此,已成功在RK3568平台上完成了Android 13 SDK的板级移植。这不仅仅是一次编译,更是对芯片启动流程、硬件原理图匹配和嵌入式系统底层交互的一次深刻理解。

这份工作为后续的LCD屏调试、TP触摸校准、Camera摄像头点亮、Wi-Fi/BT蓝牙无线适配等打下了坚实的基础。

相关推荐
振南的单片机世界2 小时前
看门狗硬核拆解:1.6秒不喂狗,硬件强制“掀桌子”
arm开发·stm32·单片机·嵌入式硬件
明雨-开发3 小时前
Android打包时候Execution failed for task ‘:launcher:lintVitalAnalyzeRelease‘.
android
游戏开发爱好者83 小时前
开心上架是什么,一站式 Apple 开发者工作台总览
android·小程序·https·uni-app·iphone·webview
Android-Flutter4 小时前
android kotlin launch 源码分析
android·kotlin
小嵌同学4 小时前
Linux 内核中的 Per-CPU 机制详解
linux·运维·arm开发·嵌入式
Android-Flutter4 小时前
android kotlin 状态机 Continuation 详解
android·kotlin
Jay丶ke4 小时前
arm ni-700
arm开发
Zha0Zhun5 小时前
Jetpack Compose 实现 iOS 风格 3D WheelPicker
android
深念Y6 小时前
RIO-UL00(EMUI 4.1 / Android 6.0.1 / arm64)开机自启动 sshd
android·linux·华为·安卓·chroot·sshd·emui