前言:
工作中需要使用 rockchip 提供的 SD 升级制作工具制作 SD 升级卡,之前由于不了解软硬件情况,导致在使用时遇到了不能使用 SD升级卡升级的问题,解决后特此写此文章记录。以下是使用的软硬件特点:
- 系统模式调试串口为 Uart2;
- Sdmmc 接口与 Uart2 接口有共用引脚;
- recovery模式;
在这种情况下,直接制作的升级卡进行升级遇到的问题如下:
- 调试串口没有打印信息;
- 无法进行 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 模式能保证升级的完整性,即升级过程被中断,如异常掉电,升级仍然能继续执行。
优点:
-
能保证升级的完整性;
缺点:
- 系统多了一个分区,该分区仅用于升级;
- 升级过程必须重启进入 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 中。