1. RK3568 Android 11 驱动开发概述
在嵌入式Android系统开发中,产品配置和设备树的选择是构建定制化系统的关键第一步。RK3568作为Rockchip推出的中高端处理器,广泛应用于智能终端、工业控制等领域。当我们需要基于RK3568开发新产品时,通常需要创建独立的产品配置并选择合适的设备树文件。
为什么需要自定义产品配置?官方提供的参考配置(如rk3568_r)往往包含了许多我们实际产品不需要的组件和设置。通过创建专属配置,我们可以:
- 精简系统镜像大小,移除不必要的预装应用和服务
- 针对特定硬件配置优化系统参数
- 便于团队协作和版本管理
- 实现不同产品线的差异化配置
设备树(Device Tree)则是描述硬件配置的重要机制,它取代了传统的硬编码硬件信息方式,使得同一内核可以支持多种硬件变体。在RK3568平台上,设备树的选择直接影响:
- 存储控制器初始化(eMMC/SD/NAND)
- DDR内存配置和时序参数
- 外设接口使能与配置(如I2C、SPI、USB等)
- 电源管理芯片的配置
2. 创建新产品配置
2.1 基础配置复制与重命名
Rockchip的Android BSP通常已经包含了参考板配置,我们可以基于这些配置快速创建新产品。假设我们的产品代号为"taurus",操作步骤如下:
bash复制cd device/rockchip/rk356x
cp -r rk3568_r/ rk3568_taurus
这个操作复制了参考板的所有配置文件,包括:
- BoardConfig.mk:板级编译配置
- AndroidProducts.mk:产品定义
- system.prop:系统属性
- 其他必要的init脚本和配置文件
提示:建议保持rk356x目录下的命名规范,使用"rk3568_"作为产品名前缀,便于后续维护。
2.2 关键配置文件修改
2.2.1 产品Makefile配置
进入新创建的目录,重命名并修改产品Makefile:
bash复制cd rk3568_taurus
mv rk3568_r.mk rk3568_taurus.mk
需要修改的关键参数包括:
makefile复制PRODUCT_NAME := rk3568_taurus
PRODUCT_DEVICE := rk3568_taurus
PRODUCT_BRAND := YourBrand
PRODUCT_MODEL := YourProductModel
这些参数会影响:
- 编译系统识别的产品名称
- 最终系统中显示的设备信息
- OTA升级包的文件名生成
2.2.2 BoardConfig.mk调整
BoardConfig.mk决定了内核和bootloader的编译配置,特别是设备树的选择:
makefile复制# 内核设备树配置
TARGET_KERNEL_CONFIG := rockchip_defconfig
TARGET_KERNEL_DTS := rk3568-evb5-ddr4-v10
# U-Boot配置
TARGET_UBOOT_CONFIG := rk3568
设备树选择需要考虑:
- 存储类型(eMMC/NAND/SD)
- DDR内存类型(DDR3/DDR4/LPDDR4)
- 电源管理IC(RK809/RK806等)
- 外设接口配置
2.3 注册新产品到编译系统
修改device/rockchip/rk356x/AndroidProducts.mk,添加新产品:
makefile复制PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/rk3566_32bit/rk3566_32bit.mk \
$(LOCAL_DIR)/rk3568_r/rk3568_r.mk \
$(LOCAL_DIR)/rk3568_taurus/rk3568_taurus.mk \
...
同时更新COMMON_LUNCH_CHOICES,添加新产品的编译变体:
makefile复制COMMON_LUNCH_CHOICES := \
rk3568_r-userdebug \
rk3568_r-user \
rk3568_taurus-userdebug \
rk3568_taurus-user \
...
编译变体说明:
- userdebug:开发版本,带有root权限和调试工具
- user:发布版本,去除了调试功能
- eng:工程版本,包含所有调试选项
2.4 验证配置
完成修改后,执行以下命令验证配置:
bash复制source build/envsetup.sh
lunch
应该能在产品列表中看到新增的rk3568_taurus选项。选择对应配置后,即可开始编译:
bash复制make -j$(nproc)
3. 设备树选择与定制
3.1 RK3568设备树架构
RK3568的设备树采用分层设计,主要包含以下组件:
code复制rk3568.dtsi (SoC级定义)
└── rk3568-android.dtsi (Android平台配置)
└── rk3568-evb5-ddr4-v10.dtsi (参考板配置)
└── rk3568-evb5-ddr4-v10.dts (最终产品配置)
各文件职责:
- rk3568.dtsi:定义SoC内部外设和基本配置,不应修改
- rk3568-android.dtsi:Android特有配置(如启动参数、固件路径)
- rk3568-evb5-ddr4-v10.dtsi:参考板硬件抽象(接口定义、默认状态)
- rk3568-evb5-ddr4-v10.dts:具体产品配置(硬件差异、外设使能)
3.2 设备树选择标准
选择基础设备树时,需考虑以下硬件匹配度:
3.2.1 存储配置匹配
检查eMMC/SD控制器配置是否匹配:
dts复制&sdhci {
bus-width = <8>; // 8位总线宽度
supports-emmc; // 支持eMMC
non-removable; // 不可移除
max-frequency = <200000000>; // 最大200MHz
status = "okay"; // 使能控制器
};
3.2.2 DDR内存配置
根据实际使用的DDR类型选择对应配置:
dts复制// DDR4配置示例
memory {
device_type = "memory";
reg = <0x0 0x00000000 0x0 0x80000000>; // 2GB地址空间
};
3.2.3 电源管理IC
确认PMIC节点与硬件一致:
dts复制rk809: pmic@20 {
compatible = "rockchip,rk809";
reg = <0x20>;
interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
...
};
3.3 设备树定制实践
3.3.1 创建产品专用设备树
建议基于最接近的参考配置创建新产品设备树:
bash复制cd kernel/arch/arm64/boot/dts/rockchip
cp rk3568-evb5-ddr4-v10.dts rk3568-taurus.dts
3.3.2 硬件差异调整
修改屏幕背光控制(示例):
dts复制&backlight {
pwms = <&pwm4 0 25000 0>; // 使用PWM4
brightness-levels = <
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87
88 89 90 91 92 93 94 95
96 97 98 99 100 101 102 103
104 105 106 107 108 109 110 111
112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127
128 129 130 131 132 133 134 135
136 137 138 139 140 141 142 143
144 145 146 147 148 149 150 151
152 153 154 155 156 157 158 159
160 161 162 163 164 165 166 167
168 169 170 171 172 173 174 175
176 177 178 179 180 181 182 183
184 185 186 187 188 189 190 191
192 193 194 195 196 197 198 199
200 201 202 203 204 205 206 207
208 209 210 211 212 213 214 215
216 217 218 219 220 221 222 223
224 225 226 227 228 229 230 231
232 233 234 235 236 237 238 239
240 241 242 243 244 245 246 247
248 249 250 251 252 253 254 255
>;
default-brightness-level = <200>;
enable-gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>;
};
3.3.3 更新编译配置
修改BoardConfig.mk指向新设备树:
makefile复制TARGET_KERNEL_DTS := rk3568-taurus
4. 常见问题与调试技巧
4.1 设备树编译错误排查
问题现象:编译时报错"Error: DTC: dts:1.1 syntax error"
解决方法:
- 检查设备树文件编码格式(应为UTF-8无BOM)
- 确认使用的dtc工具版本与内核匹配
- 检查节点定义是否完整闭合
4.2 硬件不匹配导致启动失败
典型表现:卡在uboot阶段或内核早期初始化
调试步骤:
- 通过串口查看启动日志
- 确认DDR初始化参数是否正确
- 检查关键外设(如PMIC)的I2C通信是否正常
- 逐步精简设备树,定位问题节点
4.3 多产品共用设备树配置
对于基于相同硬件的不同产品,建议采用如下结构:
code复制rk3568-common.dtsi (共用配置)
├── rk3568-productA.dts (产品A特有配置)
└── rk3568-productB.dts (产品B特有配置)
共用配置可能包括:
- DDR参数
- 核心电压设置
- 基础外设接口
4.4 设备树调试技巧
-
查看解析后的设备树:
bash复制
adb pull /sys/firmware/devicetree/base dtc -I fs -O dts base > decompiled.dts -
动态修改设备树参数:
bash复制echo 1 > /sys/class/gpio/export echo out > /sys/class/gpio/gpioX/direction echo 1 > /sys/class/gpio/gpioX/value -
内核设备树调试打印:
在内核配置中启用:code复制CONFIG_DEBUG_DEVICE_TREE=y
5. 工程管理与维护建议
5.1 版本控制策略
建议采用以下目录结构管理设备树:
code复制kernel/arch/arm64/boot/dts/rockchip/
├── products/
│ ├── taurus/
│ │ ├── rk3568-taurus.dts
│ │ └── taurus-specific.dtsi
│ └── common/
│ ├── rk3568-display.dtsi
│ └── rk3568-power.dtsi
└── vendor/
├── rk3568-evb5-ddr4-v10.dts
└── rk3568-evb.dtsi
5.2 自动化验证流程
创建编译脚本自动验证配置:
bash复制#!/bin/bash
PRODUCT=$1
VARIANT=${2:-userdebug}
source build/envsetup.sh
lunch ${PRODUCT}-${VARIANT}
make -j$(nproc) 2>&1 | tee build.log
5.3 文档规范
为每个产品配置创建README.md,记录:
- 硬件配置摘要
- 关键设备树修改点
- 已知问题及解决方案
- 测试验证结果
在实际项目中,我发现保持设备树变更与硬件BOM版本严格对应非常重要。曾经遇到过因为设备树未随硬件改版更新,导致新产品无法启动的情况。建议在设备树文件中添加明确的版本注释:
dts复制/*
* [Version] 1.1
* [Date] 2023-08-20
* [Changes]
* - Update DDR timing for new memory chip
* - Disable unused SPI interface
* - Adjust backlight PWM frequency
*/
/dts-v1/;