如何修改rk3399 ddr初始化代码的波特率

终极方法(先公布答案)

hexdump -ve '1/1 "%.2X"' rk3399_ddr_800MHz_v1.25.bin | \
sed "s/60E31600/00C20100/" | \
xxd -r -p | openssl rc4 -K 7c4e0304550509072d2c7b38170d1711 | rkflashtool l

rk3399 ddr 初始化代码的默认波特率为 1500000(≈ 115200 × 13 = 1497600)

这是一个很奇葩的设置!

如何修改

ddr初始化代码一共有3个频率的文件:

rk3399_ddr_666MHz_v1.25.bin
rk3399_ddr_800MHz_v1.25.bin
rk3399_ddr_933MHz_v1.25.bin

在二进制编辑器中,搜索:60 E3 16 00(1500000),替换成00 C2 01 00(115200)
注意:应该只会命中一处,如有多处,可能有问题!

运行

cat rk3399_ddr_800MHz_v1.25.bin | openssl rc4 -K 7c4e0304550509072d2c7b38170d1711 | rkflashtool l
就能看到正确的输出结果:

DDR Versi
<think>好的,我需要帮助用户调整RK3588平台U-Boot引导内核程序的启动优先级。用户之前的问题已经涉及到了通过环境变量和板级代码调整启动顺序,现在他们想更具体地了解如何设置引导内核的优先级。我需要参考用户提供的引用内容,尤其是引用[1]中提到的修改波特率需要调整多个地方,优先级最高的设置可能在DDR参数中。这可能暗示启动优先级也有类似的层级结构,需要检查多个配置文件。首先,用户之前的回答提到了boot_targets和bootcmd环境变量,以及板级代码和设备树的修改。现在的问题是关于引导内核程序的优先级,可能涉及到多个内核镜像或不同存储设备中的内核选择。需要确定U-Boot如何选择加载哪个内核。 可能的步骤包括: 1.检查环境变量中的启动顺序设置,比如boot_targets,确保优先的设备被正确列出。2.修改bootcmd以明确指定从特定设备加载内核,例如优先从SD卡而不是eMMC。3.确认是否有板级代码硬编码了启动顺序,需要调整初始化流程。4.设备树中的存储设备节点顺序是否影响初始化优先级,可能需要调整节点顺序。5.类似引用[1]中的DDR参数优先级,是否存在类似的高优先级设置需要覆盖其他配置。需要注意引用[1]提到的波特率修改需要三个地方,其中DDR参数优先级最高。这可能意味着在启动顺序中,某些底层配置(如SPL阶段)可能优先于U-Boot的环境变量。因此,用户可能需要检查SPL阶段的设置,或者是否有类似DDR参数的启动顺序配置在更早的阶段被设定。 另外,用户之前的问题中的相关提到SPL如何影响启动流程,这可能与当前问题相关。SPL(Secondary ProgramLoader)负责加载U-Boot,可能影响存储设备的初始化顺序。因此,调整SPL的配置可能也是必要的步骤。需要确保回答中涵盖这些方面,并引用相关的引用内容。例如,引用[1]中的多位置修改和优先级问题,引用[3]中的启动汇编代码可能涉及初始化的顺序。最后,生成相关问题时,要结合用户之前的问题,比如SPL的影响、设备树关系、调试方法等,确保问题连贯且有帮助。</think>### RK3588 U-Boot设置内核启动优先级方法 RK3588的U-Boot内核启动优先级可通过**环境变量控制**、**设备树配置**和**代码逻辑调整**实现,具体步骤如下: --- #### 1. **通过环境变量调整启动顺序** U-Boot的`boot_targets`和`bootcmd`是控制启动流程的核心变量。 - **修改`boot_targets`**: 定义启动设备优先级列表,例如优先从SD卡(`mmc1`)而非eMMC(`mmc0`): ```bash setenv boot_targets "mmc1 mmc0 usb0 pxe dhcp" saveenv ``` 此配置会按顺序尝试从`mmc1`加载内核[^1][^3]。 - **自定义`bootcmd`脚本**: 直接指定内核加载路径,强制从特定设备启动: ```bash setenv bootcmd "mmc dev 1; load mmc 1:1 0x80080000 Image; booti 0x80080000" saveenv ``` 此命令会直接从SD卡(`mmc1`)加载内核镜像并启动[^1]。 --- #### 2. **设备树配置存储设备优先级** 在设备树中调整存储控制器初始化顺序可能影响设备枚举优先级。 - **示例配置**(`rk3588-linux.dtsi`): ```dts &sdhci { // SD卡控制器配置 status = "okay"; bus-width = <8>; }; &sdmmc { // eMMC控制器配置 status = "okay"; bus-width = <4>; }; ``` 若需优先初始化SD卡,可将`sdhci`节点置于`sdmmc`之前[^3]。 --- #### 3. **板级代码逻辑调整** 若环境变量和设备树无法满足需求,需修改U-Boot源码中的初始化逻辑。 - **关键函数示例**(`board/rockchip/rk3588/board.c`): ```c int board_late_init(void) { // 强制设置启动设备为SD卡(mmc1) env_set("boot_targets", "mmc1"); return 0; } ``` 此代码会在初始化阶段直接覆盖环境变量设置[^1][^3]。 --- #### 4. **SPL阶段的影响** RK3588的SPL(Secondary Program Loader)负责初始化DDR和加载U-Boot。 - **SPL配置优先级**: SPL可能硬编码了存储设备初始化顺序,需检查`drivers/mmc/rockchip_dw_mmc.c`中的`mmc_init`调用顺序。 ```c void mmc_init(void) { // 调整mmc设备的初始化顺序 rockchip_dwmmc_init(1); // 先初始化SD卡(mmc1) rockchip_dwmmc_init(0); // 后初始化eMMC(mmc0) } ``` 修改后需重新编译SPL和U-Boot[^1][^3]。 --- #### 5. **验证与调试** - **查看设备枚举顺序**: ```bash U-Boot > mmc list Device 0: emmc@fe2c0000 // eMMC Device 1: sdhci@fe310000 // SD卡 ``` 确保目标设备在列表中靠前。 - **调试环境变量**: ```bash U-Boot > printenv boot_targets boot_targets=mmc1 mmc0 usb0 ``` --- ### 注意事项 1. **优先级冲突**: 若SPL或DDR初始化阶段已硬编码设备顺序,需同步修改相关代码(类似引用[1]中DDR参数优先级高于U-Boot设置的情况)[^1]。 2. **设备树兼容性**: U-Boot设备树需与内核设备树保持一致,避免因节点状态(如`status = "disabled"`)导致设备不可用[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值