[Linux] [RK1808] -rk1808Linuxプラットフォームに基づくSDカードのアップグレード

序文:

作業でSDアップグレードカードを作成するには、Rockchipが提供するSDアップグレードツールを使用する必要があります。以前はソフトウェアとハ​​ードウェアの状態を理解していなかったため、SDアップグレードカードを使用してアップグレードできないという問題が発生しました。記事は、ソリューションの後にここに書かれています。使用するソフトウェアとハ​​ードウェアの特徴は次のとおりです。

  1. システムモードのデバッグシリアルポートはUart2です。
  2. SdmmcインターフェイスとUart2インターフェイスには共有ピンがあります。
  3. リカバリモード;

この状況で、直接作成されたアップグレードカードをアップグレードするときに発生する問題は次のとおりです。

  1. デバッグシリアルポートには情報が出力されません。
  2. SDカードをアップグレードできません。

以上の特徴や問題点を踏まえ、ひとつひとつ解決していきました。

1.デバッグシリアルポートを変更します

2つのインターフェイスはピンを共有するため、最初にデバッグ中に使用されるシリアルポートを変更して、システムが作業中にログ情報を正常に印刷できるようにします。これは、問題を見つけるのに便利です。

ボードのハードウェア特性と組み合わせて、デバッグシリアルポートをUart2からUart6に変更しました。ここでの変更は2つの部分に分かれています。1つはu-bootの変更であり、もう1つはカーネルの変更です。

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を変更します。これらの2つのパラメーターは、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。カーネルへの変更

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、コンパイル

カーネルコンパイル:./ build.shカーネル

リカバリのコンパイル:./ build.shリカバリ

注:リカバリコンパイルの前にbuildroot / output / rockchip_rk1808_recovery /ディレクトリを削除する必要があります。そうしないと、リカバリでコンパイルを更新できません。

2.リカバリモード

リカバリモードでは、マシンにもう1つのパーティションを追加します。パーティションは、カーネル+リソース+ RAMディスクで構成され、主にアップグレード操作に使用されます。u-bootは、miscパーティションに格納されているフィールドに応じて、起動するシステムが通常のシステムであるかリカバリシステムであるかを判別します。システムの独立性により、リカバリモードではアップグレードの整合性を確保できます。つまり、異常な電源障害などのアップグレードプロセスが中断されても、アップグレードを続行できます。

利点:

  1. アップグレードの整合性を保証できます。

短所:

  1. システムにはもう1つのパーティションがあり、アップグレードにのみ使用されます。
  2. リカバリモードに入るには、アップグレードプロセスを再起動する必要があり、現在のシステムで直接アップグレードを実行することはできません。

3.SDカードをアップグレードできない理由の分析

3.1、SdmmcインターフェースがUart2インターフェースと競合する

SdmmcインターフェイスとUart2インターフェイスの競合により、リカバリモードに入った後、IOポートがUart2に引き継がれた後、SDカード操作を実行できず、アップグレードに失敗します。上記の方法で、デバッグシリアルポートを他のシリアルポートに変更する必要があります。

3.2。リカバリに入った後にスタック

最初は、上記の変更が完了した後、デバッグログが出力されますが、次の位置でスタックし、アップグレードを続行できません。

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に変更した後、それが有効になり、ログは上記のように正常に出力できますが、リカバリのコンパイル時にクリーン操作(buildroot / output / rockchip_rk1808_recovery /ディレクトリの削除)が実行されなかったため、変更されたカーネル部分は更新されず、リカバリにコンパイルされませんでした。

おすすめ

転載: blog.csdn.net/u014674293/article/details/114635753