[Linux] [RK1808] -- 基于 rk1808 Linux 平台 进行 SD 卡升级

前言:

工作中需要使用 rockchip 提供的 SD 升级制作工具制作 SD 升级卡,之前由于不了解软硬件情况,导致在使用时遇到了不能使用 SD升级卡升级的问题,解决后特此写此文章记录。以下是使用的软硬件特点:

  1. 系统模式调试串口为 Uart2;
  2. Sdmmc 接口与 Uart2 接口有共用引脚;
  3. recovery模式;

在这种情况下,直接制作的升级卡进行升级遇到的问题如下:

  1. 调试串口没有打印信息;
  2. 无法进行 SD 卡升级;

针对以上特点及问题,开始逐一解决。

一、修改调试串口

由于两个接口有共用引脚的情况,先修改调试时使用的串口,使系统在工作中能正常打印 Log 信息,便于我们查找问题。

结合自己板子的硬件特点,我们把调试串口从 Uart2 修改为 Uart6。此处修改分为两个部分,一个是对 u-boot 的修改,一个是对 kernel 的修改。

1.1、对 U-boot 的修改

1.1.1、修改 ddrbin_param.txt

这部分的修改主要是对 /rkbin/tools/ddrbin_param.txt 文件的修改,修改如下:

start tag=0x12345678
ddr2_freq=0
lp2_freq=0
ddr3_freq=0
lp3_freq=0
ddr4_freq=0
lp4_freq=0

uart id=6
uart iomux=0
uart baudrate=1500000

end

修改 uart id=6,uart baudrate=1500000,这两个参数对应 Uart6 和波特率。

然后用命令重新生成 ddr.bin,命令如下:

./rkbin/tools/ddrbin_tool ddrbin_param.txt ./rkbin/bin/rk1x/rk1808_ddr_933MHz_v1.04.bin

 通过 ddrbin_tool 工具 将 ddrbin_param.txt 生成 rk1808_ddr_933MHz_v1.04.bin 文件。

1.1.2、编译

然后通过以下命令对 uboot 进行编译:

./build.sh uboot

或者进入 u-boot 目录中,执行:./make.sh rk1808

编译后在 u-boot 目录下生成如下文件:

  • rk-1808_loader_v1.03.104.bin
  • trust.img
  • uboot.img

1.2、对 kernel 的修改

1.2.1、修改 rk1808-evb.dts

fiq-debugger {
		compatible = "rockchip,fiq-debugger";
		rockchip,serial-id = <6>;
		rockchip,wake-irq = <0>;
		/* If enable uart uses irq instead of fiq */
		rockchip,irq-mode-enable = <0>;
		rockchip,baudrate = <1500000>;  /* Only 115200 and 1500000 */
		interrupts = <GIC_SPI 242 IRQ_TYPE_LEVEL_HIGH>;
		status = "okay";
	};

rockchip,serial-id = <2> 修改为 rockchip,serial-id = <6>;

该节点驱动加载后会注册 /dev/ttyFIQ0 设备,需要注意的是 rockchip,serial-id 即便改了,注册的也是 ttyFIQ0(参考下文设置)。

此时需要禁止对应 uart 节点:(若不进行此操作,系统将进入无限重启中)

& uart2 {
                status = "disabled";
        };

1.2.2、修改 rk1808-evb-v10.dts

chosen {
		bootargs = "earlycon=uart8250,mmio32,0xff5b0000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 rootwait swiotlb=1 kpti=0 snd_aloop.index=7";
	};

这里,0xff550000 为 Uart2 的地址,需要修改为 Uart6 的地址:0xff5b0000。

1.2.3、编译

kernel 编译:./build.sh kernel

recovery 编译:./build.sh recovery

注意:recovery 编译之前需要先删除 buildroot/output/rockchip_rk1808_recovery/ 目录,否者 recovery 无法更新编译。

二、Recovery 模式

Recovery 模式是在机器上多一个分区,该分区由 kernel+resource+ramdisk 组成,主要用于升级操作。u-boot 会根据 misc 分区存放的字段来判断将要引导的系统是 Normal 系统还是 Recovery 系统。由于系统的独立性,所以 Recovery 模式能保证升级的完整性,即升级过程被中断,如异常掉电,升级仍然能继续执行。

优点:

  1. 能保证升级的完整性;

缺点:

  1. 系统多了一个分区,该分区仅用于升级;
  2. 升级过程必须重启进入 recovery 模式,不能在当前系统直接进行升级;

三、无法进行 SD 卡升级原因分析

3.1、Sdmmc 接口与 Uart2 接口冲突

由于 Sdmmc 接口与 Uart2 接口冲突,进入 recovery 模式后,IO 口被 Uart2 接管后,不能进行 SD 卡的操作,导致无法升级。需按照上文的方式修改 调试串口到其他串口上。

3.2、进入 Recovery 后卡住

刚开始,按照上文修改完成后,调试 log输出,但是卡在如下的位置,不能继续升级:

DDR Version V1.04 20191121
LPDDR3
933MHz
BW=32 Col=10 Bk=8 CS0 Row=15 CS1 Row=15 CS=2 Die BW=32 Size=2048MB
out
Boot1 Release Time: Dec  9 2019 18:18:13, version: 1.05
chip_id:524b188,0
ChipType = 0x14, 10272
sfc nor id: ff ff ff
sfc_nand id: ff ff ff
NeedKHz=200KHz,clock=12000KHz
NeedKHz=200KHz,clock=12000KHz
NeedKHz=200KHz,clock=12000KHz
NeedKHz=18000KHz,clock=192000KHz
NeedKHz=48000KHz,clock=192000KHz
mmc2:cmd19,100
SdmmcInit=2 0
BootCapSize=2000
UserCapSize=7456MB
FwPartOffset=2000 , 2000
NeedKHz=200KHz,clock=12000KHz
NeedKHz=200KHz,clock=12000KHz
NeedKHz=200KHz,clock=12000KHz
mmc0:cmd5,20
NeedKHz=24000KHz,clock=192000KHz
NeedKHz=40000KHz,clock=192000KHz
SdmmcInit=0 0
BootCapSize=0
UserCapSize=30720MB
FwPartOffset=2000 , 0
StorageInit ok = 187193
SecureMode = 0
Secure read PBA: 0x4
Secure read PBA: 0x404
Secure read PBA: 0x804
Secure read PBA: 0xc04
Secure read PBA: 0x1004
SecureInit ret = 0, SecureMode = 0
atags_set_bootdev: ret:(0)
GPT part:  0, name:            uboot, start:0x4000, size:0x2000
GPT part:  1, name:            trust, start:0x6000, size:0x2000
GPT part:  2, name:             misc, start:0x8000, size:0x2000
GPT part:  3, name:             boot, start:0xa000, size:0x10000
GPT part:  4, name:         recovery, start:0x1a000, size:0x10000
GPT part:  5, name:           backup, start:0x2a000, size:0x10000
GPT part:  6, name:              oem, start:0x3a000, size:0x20000
GPT part:  7, name:           rootfs, start:0x5a000, size:0x300000
GPT part:  8, name:         userdata, start:0x35a000, size:0x38a5fdf
find part:uboot OK. first_lba:0x4000.
find part:trust OK. first_lba:0x6000.
LoadTrust Addr:0x6000
No find bl30.bin
No find bl32.bin
Load uboot, ReadLba = 4000
Load OK, addr=0x600000, size=0xc6850
RunBL31 0x40000 @ 307219 us
INFO:    Preloader serial: 6
NOTICE:  BL31: v1.3(debug):2a138bbaa
NOTICE:  BL31: Built : 19:41:05, Dec  9 2019
NOTICE:  BL31: Rockchip release version: v1.0
INFO:    GICv3 with legacy support detected. ARM GICV3 driver initialized in EL3
INFO:    not boot from ram
INFO:    Using opteed sec cpu_context!
INFO:    boot cpu mask: 0
INFO:    plat_rockchip_pmu_init(1807): pd status 8002
INFO:    BL31: Initializing runtime services
WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will return SMC_UNK
ERROR:   Error initializing runtime service opteed_fast
INFO:    BL31: Preparing for EL3 exit to normal world
INFO:    Entry point address = 0x600000
INFO:    SPSR = 0x3c9


U-Boot 2017.09 (Feb 04 2021 - 17:54:20 +0800)

Model: Rockchip RK1808 EVB
PreSerial: 6
DRAM:  2 GiB
Sysmem: init
Relocation Offset: 7d7fc000, fdt: 7bdf0f20
Using default environment

no mmc device at slot 1
Found IDB in SDcard
dwmmc@ffcf0000: 1 (SD), dwmmc@ffd00000: 0
Bootdev(atags): mmc 1
MMC1: Legacy, 50Mhz
PartType: EFI
boot mode: recovery (misc)
Found DTB in recovery part
DTB: rk-kernel.dtb
HASH: OK(c)
I2c0 speed: 400000Hz
vdd_npu init 880000 uV
PMIC:  RK8090 (on=0x40, off=0x00)
vdd_log 800000 uV
vdd_cpu 800000 uV
Can't get crtc id, default set to id = 0
Model: Rockchip RK1808 EVB V10 Board
Rockchip UBOOT DRM driver version: v1.0.1
Using display timing dts
Detailed mode clock 67000 kHz, flags[a]
    H: 0720 0780 0810 0870
    V: 1280 1296 1298 1312
bus_format: 100e
final DSI-Link bandwidth: 444 Mbps x 4
CLK: (sync kernel. arm: enter 1200000 KHz, init 1200000 KHz, kernel 0N/A)
  apll 1200000 KHz
  dpll 462000 KHz
  cpll 1000000 KHz
  gpll 1188000 KHz
  npll 603000 KHz
  ppll 100000 KHz
  hsclk_bus 297000 KHz
  msclk_bus 198000 KHz
  lsclk_bus 99000 KHz
  msclk_peri 198000 KHz
  lsclk_peri 99000 KHz
Net:   No ethernet found.
Hit key to stop autoboot('CTRL+C'):  0 
ANDROID: reboot reason: "recovery"
Fdt Ramdisk skip relocation
Booting IMAGE kernel at 0x00280000 with fdt at 0x1f00000...


Sysmem Warn: kernel 'reserved-memory' "region@110000"(0x00110000 - 0x00200000) is overlap with [invisible] "SHM" (0x00100000 - 0x00200000)
## Booting Android Image at 0x0027f800 ...
Kernel load addr 0x00280000 size 10341 KiB
RAM disk load addr 0x0a200000 size 6469 KiB
## Flattened Device Tree blob at 01f00000
   Booting using the fdt blob at 0x1f00000
   XIP Kernel Image ... OK
  'reserved-memory' region@110000: addr=110000 size=f0000
   Using Device Tree in place at 0000000001f00000, end 0000000001f1c1d1
Adding bank: 0x00200000 - 0x80000000 (size: 0x7fe00000)
Total: 2160.966 ms

Starting kernel ...

原因:

uboot 修改调试串口为 Uart6 后已经生效,可以正常如上打印 Log,但是由于编译 recovery 时,没有先进行 clean 操作(删除 buildroot/output/rockchip_rk1808_recovery/ 目录),导致修改的 kernel 部分没有更新编译进 recovery 中。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Rockchip RK3566是一款由Rockchip推出的高性能应用处理器,其集成了四核ARM Cortex-A55 CPU和ARM Mali-G52 GPU。在移植U-Boot 2023.04时,我们需要考虑以下几个方面的工作: 1. 了解RK3566芯片的硬件架构和技术规格,包括处理器核心、内存控制器、外设接口等。这将有助于理解U-Boot如何与硬件交互,并进行相应的配置。 2. 下载并准备U-Boot 2023.04的源代码。在Rockchip官方网站或开源社区中可以找到最新的U-Boot源代码。将其下载并解压到开发机上。 3. 设置交叉编译环境。因为U-Boot是一个跨平台的项目,所以需要配置适合RK3566的交叉编译器,确保能够正确编译U-Boot源代码。 4. 配置U-Boot。根据RK3566的硬件架构和技术规格,需要进行相应的配置,包括处理器、内存、外设等设置。这些设置在U-Boot的配置文件中进行,可以根据需求进行修改。 5. 编译U-Boot。在配置好U-Boot后,使用交叉编译器编译U-Boot源代码。编译完成后,将生成的U-Boot二进制文件烧录到RK3566的启动设备上,如eMMC或SD。 6. 测试U-Boot。将准备好的启动设备插入RK3566开发板中,根据开发板的启动方式,进入U-Boot命令行界面。在命令行界面中可以进行各种操作和调试,如加载内核、启动操作系统等。 7. 调试和优化。在移植和测试U-Boot过程中,可能会出现一些问题和不稳定的情况。需要通过调试和优化来解决这些问题,确保U-Boot的正常运行和稳定性。 总之,移植U-Boot 2023.04到Rockchip RK3566需要了解芯片的硬件架构和技术规格,配置和编译U-Boot源代码,进行测试和调试。这样可以确保U-Boot能够与RK3566正常交互,并为后续的操作系统加载和启动提供基础支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值