1# SPDX-License-Identifier: GPL-2.0+ 2# 3# Copyright (C) 2015 Google. Inc 4# Written by Simon Glass <sjg@chromium.org> 5 6U-Boot on Rockchip 7================== 8 9A wide range of Rockchip SoCs are supported in mainline U-Boot 10 11Warning 12======= 13This document is being moved to doc/board/rockchip, so information on it 14might be incomplete or outdated. 15 16Prerequisites 17============= 18 19You will need: 20 21 - Firefly RK3288 board or something else with a supported RockChip SoC 22 - Power connection to 5V using the supplied micro-USB power cable 23 - Separate USB serial cable attached to your computer and the Firefly 24 (connect to the micro-USB connector below the logo) 25 - rkflashtool [3] 26 - openssl (sudo apt-get install openssl) 27 - Serial UART connection [4] 28 - Suitable ARM cross compiler, e.g.: 29 sudo apt-get install gcc-4.7-arm-linux-gnueabi 30 31Building 32======== 33 341. To build RK3288 board: 35 36 CROSS_COMPILE=arm-linux-gnueabi- make O=firefly firefly-rk3288_defconfig all 37 38 (or you can use another cross compiler if you prefer) 39 402. To build RK3308 board: 41 42 See doc/board/rockchip/rockchip.rst 43 443. To build RK3399 board: 45 46 Option 1: Package the image with Rockchip miniloader: 47 48 - Compile U-Boot 49 50 => cd /path/to/u-boot 51 => make nanopi-neo4-rk3399_defconfig 52 => make 53 54 - Get the rkbin 55 56 => git clone https://github.com/rockchip-linux/rkbin.git 57 58 - Create trust.img 59 60 => cd /path/to/rkbin 61 => ./tools/trust_merger RKTRUST/RK3399TRUST.ini 62 63 - Create uboot.img 64 65 => cd /path/to/rkbin 66 => ./tools/loaderimage --pack --uboot /path/to/u-boot/u-boot-dtb.bin uboot.img 67 68 (Get trust.img and uboot.img) 69 70 Option 2: Package the image with SPL: 71 72 - Export cross compiler path for aarch64 73 74 - Compile ATF 75 76 => git clone https://github.com/ARM-software/arm-trusted-firmware.git 77 => cd arm-trusted-firmware 78 79 (export cross compiler path for Cortex-M0 MCU likely arm-none-eabi-) 80 => make realclean 81 => make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3399 82 83 (export bl31.elf) 84 => export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf 85 86 - Compile PMU M0 firmware 87 88 This is optional for most of the rk3399 boards. 89 90 => git clone git://git.theobroma-systems.com/rk3399-cortex-m0.git 91 => cd rk3399-cortex-m0 92 93 (export cross compiler path for Cortex-M0 PMU) 94 => make CROSS_COMPILE=arm-cortex_m0-eabi- 95 96 (export rk3399m0.bin) 97 => export PMUM0=/path/to/rk3399-cortex-m0/rk3399m0.bin 98 99 - Compile U-Boot 100 101 => cd /path/to/u-boot 102 => make orangepi-rk3399_defconfig 103 => make 104 105 (Get spl/u-boot-spl-dtb.bin, u-boot.itb images and some boards would get 106 spl/u-boot-spl.bin since it doesn't enable CONFIG_SPL_OF_CONTROL 107 108 If TPL enabled on the target, get tpl/u-boot-tpl-dtb.bin or tpl/u-boot-tpl.bin 109 if CONFIG_TPL_OF_CONTROL not enabled) 110 111Writing to the board with USB 112============================= 113 114For USB to work you must get your board into ROM boot mode, either by erasing 115your MMC or (perhaps) holding the recovery button when you boot the board. 116To erase your MMC, you can boot into Linux and type (as root) 117 118 dd if=/dev/zero of=/dev/mmcblk0 bs=1M 119 120Connect your board's OTG port to your computer. 121 122To create a suitable image and write it to the board: 123 124 ./firefly-rk3288/tools/mkimage -n rk3288 -T rkimage -d \ 125 ./firefly-rk3288/spl/u-boot-spl-dtb.bin out && \ 126 cat out | openssl rc4 -K 7c4e0304550509072d2c7b38170d1711 | rkflashtool l 127 128If all goes well you should something like: 129 130 U-Boot SPL 2015.07-rc1-00383-ge345740-dirty (Jun 03 2015 - 10:06:49) 131 Card did not respond to voltage select! 132 spl: mmc init failed with error: -17 133 ### ERROR ### Please RESET the board ### 134 135You will need to reset the board before each time you try. Yes, that's all 136it does so far. If support for the Rockchip USB protocol or DFU were added 137in SPL then we could in principle load U-Boot and boot to a prompt from USB 138as several other platforms do. However it does not seem to be possible to 139use the existing boot ROM code from SPL. 140 141 142Writing to the eMMC with USB on ROC-RK3308-CC 143============================================= 144For USB to work you must get your board into Bootrom mode, 145either by erasing the eMMC or short circuit the GND and D0 146on core board. 147 148Connect the board to your computer via tyepc. 149=> rkdeveloptool db rk3308_loader_v1.26.117.bin 150=> rkdeveloptool wl 0x40 idbloader.img 151=> rkdeveloptool wl 0x4000 u-boot.itb 152=> rkdeveloptool rd 153 154Then you will see the boot log from Debug UART at baud rate 1500000: 155DDR Version V1.26 156REGFB: 0x00000032, 0x00000032 157In 158589MHz 159DDR3 160 Col=10 Bank=8 Row=14 Size=256MB 161msch:1 162Returning to boot ROM... 163 164U-Boot SPL 2020.01-rc1-00225-g34b681327f (Nov 14 2019 - 10:58:04 +0800) 165Trying to boot from MMC1 166INFO: Preloader serial: 2 167NOTICE: BL31: v1.3(release):30f1405 168NOTICE: BL31: Built : 17:08:28, Sep 23 2019 169INFO: Lastlog: last=0x100000, realtime=0x102000, size=0x2000 170INFO: ARM GICv2 driver initialized 171INFO: Using opteed sec cpu_context! 172INFO: boot cpu mask: 1 173INFO: plat_rockchip_pmu_init: pd status 0xe b 174INFO: BL31: Initializing runtime services 175WARNING: No OPTEE provided by BL2 boot loader, Booting device without OPTEE initialization. SMC`s destined for OPTEE will rK 176ERROR: Error initializing runtime service opteed_fast 177INFO: BL31: Preparing for EL3 exit to normal world 178INFO: Entry point address = 0x600000 179INFO: SPSR = 0x3c9 180 181 182U-Boot 2020.01-rc1-00225-g34b681327f (Nov 14 2019 - 10:58:47 +0800) 183 184Model: Firefly ROC-RK3308-CC board 185DRAM: 254 MiB 186MMC: dwmmc@ff480000: 0, dwmmc@ff490000: 1 187rockchip_dnl_key_pressed read adc key val failed 188Net: No ethernet found. 189Hit any key to stop autoboot: 0 190Card did not respond to voltage select! 191switch to partitions #0, OK 192mmc1(part 0) is current device 193Scanning mmc 1:4... 194Found /extlinux/extlinux.conf 195Retrieving file: /extlinux/extlinux.conf 196151 bytes read in 3 ms (48.8 KiB/s) 1971: kernel-mainline 198Retrieving file: /Image 19914737920 bytes read in 377 ms (37.3 MiB/s) 200append: earlycon=uart8250,mmio32,0xff0c0000 console=ttyS2,1500000n8 201Retrieving file: /rk3308-roc-cc.dtb 20228954 bytes read in 4 ms (6.9 MiB/s) 203Flattened Device Tree blob at 01f00000 204Booting using the fdt blob at 0x1f00000 205## Loading Device Tree to 000000000df3a000, end 000000000df44119 ... OK 206 207Starting kernel ... 208[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd042] 209[ 0.000000] Linux version 5.4.0-rc1-00040-g4dc2d508fa47-dirty (andy@B150) (gcc version 6.3.1 20170404 (Linaro GCC 6.3-209 210[ 0.000000] Machine model: Firefly ROC-RK3308-CC board 211[ 0.000000] earlycon: uart8250 at MMIO32 0x00000000ff0c0000 (options '') 212[ 0.000000] printk: bootconsole [uart8250] enabled 213 214Booting from an SD card 215======================= 216 217To write an image that boots from an SD card (assumed to be /dev/sdc): 218 219 ./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \ 220 firefly-rk3288/spl/u-boot-spl-dtb.bin out && \ 221 sudo dd if=out of=/dev/sdc seek=64 && \ 222 sudo dd if=firefly-rk3288/u-boot-dtb.img of=/dev/sdc seek=16384 223 224This puts the Rockchip header and SPL image first and then places the U-Boot 225image at block 16384 (i.e. 8MB from the start of the SD card). This 226corresponds with this setting in U-Boot: 227 228 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 0x4000 229 230Put this SD (or micro-SD) card into your board and reset it. You should see 231something like: 232 233 U-Boot 2016.01-rc2-00309-ge5bad3b-dirty (Jan 02 2016 - 23:41:59 -0700) 234 235 Model: Radxa Rock 2 Square 236 DRAM: 2 GiB 237 MMC: dwmmc@ff0f0000: 0, dwmmc@ff0c0000: 1 238 *** Warning - bad CRC, using default environment 239 240 In: serial 241 Out: vop@ff940000.vidconsole 242 Err: serial 243 Net: Net Initialization Skipped 244 No ethernet found. 245 Hit any key to stop autoboot: 0 246 => 247 248The rockchip bootrom can load and boot an initial spl, then continue to 249load a second-stage bootloader (ie. U-Boot) as soon as the control is returned 250to the bootrom. Both the RK3288 and the RK3036 use this special boot sequence. 251The configuration option enabling this is: 252 253 CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y 254 255You can create the image via the following operations: 256 257 ./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \ 258 firefly-rk3288/spl/u-boot-spl-dtb.bin out && \ 259 cat firefly-rk3288/u-boot-dtb.bin >> out && \ 260 sudo dd if=out of=/dev/sdc seek=64 261 262Or: 263 ./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \ 264 firefly-rk3288/spl/u-boot-spl-dtb.bin:firefly-rk3288/u-boot-dtb.bin \ 265 out && \ 266 sudo dd if=out of=/dev/sdc seek=64 267 268If you have an HDMI cable attached you should see a video console. 269 270For evb_rk3036 board: 271 ./evb-rk3036/tools/mkimage -n rk3036 -T rksd -d evb-rk3036/spl/u-boot-spl.bin out && \ 272 cat evb-rk3036/u-boot-dtb.bin >> out && \ 273 sudo dd if=out of=/dev/sdc seek=64 274 275Or: 276 ./evb-rk3036/tools/mkimage -n rk3036 -T rksd -d \ 277 evb-rk3036/spl/u-boot-spl.bin:evb-rk3036/u-boot-dtb.bin out && \ 278 sudo dd if=out of=/dev/sdc seek=64 279 280Note: rk3036 SDMMC and debug uart use the same iomux, so if you boot from SD, the 281 debug uart must be disabled 282 283 284Booting from an SD card on RK3288 with TPL 285========================================== 286 287Since the size of SPL can't be exceeded 0x8000 bytes in RK3288, it is not possible add 288new SPL features like Falcon mode or etc. 289 290So introduce TPL so-that adding new features to SPL is possible because now TPL should 291run minimal with code like DDR, clock etc and rest of new features in SPL. 292 293As of now TPL is added on Vyasa-RK3288 board. 294 295To write an image that boots from an SD card (assumed to be /dev/mmcblk0): 296 297 sudo dd if=idbloader.img of=/dev/mmcblk0 seek=64 && 298 sudo dd if=u-boot-dtb.img of=/dev/mmcblk0 seek=16384 299 300Booting from an SD card on RK3188 301================================= 302 303For rk3188 boards the general storage onto the card stays the same as 304described above, but the image creation needs a bit more care. 305 306The bootrom of rk3188 expects to find a small 1kb loader which returns 307control to the bootrom, after which it will load the real loader, which 308can then be up to 29kb in size and does the regular ddr init. This is 309handled by a single image (built as the SPL stage) that tests whether 310it is handled for the first or second time via code executed from the 311boot0-hook. 312 313Additionally the rk3188 requires everything the bootrom loads to be 314rc4-encrypted. Except for the very first stage the bootrom always reads 315and decodes 2kb pages, so files should be sized accordingly. 316 317# copy tpl, pad to 1020 bytes and append spl 318tools/mkimage -n rk3188 -T rksd -d spl/u-boot-spl.bin out 319 320# truncate, encode and append u-boot.bin 321truncate -s %2048 u-boot.bin 322cat u-boot.bin | split -b 512 --filter='openssl rc4 -K 7C4E0304550509072D2C7B38170D1711' >> out 323 324Booting from an SD card on Pine64 Rock64 (RK3328) 325================================================= 326 327For Rock64 rk3328 board the following three parts are required: 328TPL, SPL, and the u-boot image tree blob. 329 330 - Write TPL/SPL image at 64 sector 331 332 => sudo dd if=idbloader.img of=/dev/mmcblk0 seek=64 333 334 - Write u-boot image tree blob at 16384 sector 335 336 => sudo dd if=u-boot.itb of=/dev/mmcblk0 seek=16384 337 338Booting from an SD card on RK3399 339================================= 340 341To write an image that boots from an SD card (assumed to be /dev/sdc): 342 343Option 1: Package the image with Rockchip miniloader: 344 345 - Create idbloader.img 346 347 => cd /path/to/u-boot 348 => ./tools/mkimage -n rk3399 -T rksd -d /path/to/rkbin/bin/rk33/rk3399_ddr_800MHz_v1.20.bin idbloader.img 349 => cat /path/to/rkbin/bin/rk33/rk3399_miniloader_v1.19.bin >> idbloader.img 350 351 - Write idbloader.img at 64 sector 352 353 => sudo dd if=idbloader.img of=/dev/sdc seek=64 354 355 - Write trust.img at 24576 356 357 => sudo dd if=trust.img of=/dev/sdc seek=24576 358 359 - Write uboot.img at 16384 sector 360 361 => sudo dd if=uboot.img of=/dev/sdc seek=16384 362 => sync 363 364Put this SD (or micro-SD) card into your board and reset it. You should see 365something like: 366 367DDR Version 1.20 20190314 368In 369Channel 0: DDR3, 933MHz 370Bus Width=32 Col=10 Bank=8 Row=15 CS=1 Die Bus-Width=16 Size=1024MB 371no stride 372ch 0 ddrconfig = 0x101, ddrsize = 0x20 373pmugrf_os_reg[2] = 0x10006281, stride = 0x17 374OUT 375Boot1: 2019-03-14, version: 1.19 376CPUId = 0x0 377ChipType = 0x10, 239 378mmc: ERROR: SDHCI ERR:cmd:0x102,stat:0x18000 379mmc: ERROR: Card did not respond to voltage select! 380emmc reinit 381mmc: ERROR: SDHCI ERR:cmd:0x102,stat:0x18000 382mmc: ERROR: Card did not respond to voltage select! 383emmc reinit 384mmc: ERROR: SDHCI ERR:cmd:0x102,stat:0x18000 385mmc: ERROR: Card did not respond to voltage select! 386SdmmcInit=2 1 387mmc0:cmd5,20 388SdmmcInit=0 0 389BootCapSize=0 390UserCapSize=60543MB 391FwPartOffset=2000 , 0 392StorageInit ok = 45266 393SecureMode = 0 394SecureInit read PBA: 0x4 395SecureInit read PBA: 0x404 396SecureInit read PBA: 0x804 397SecureInit read PBA: 0xc04 398SecureInit read PBA: 0x1004 399SecureInit read PBA: 0x1404 400SecureInit read PBA: 0x1804 401SecureInit read PBA: 0x1c04 402SecureInit ret = 0, SecureMode = 0 403atags_set_bootdev: ret:(0) 404GPT 0x3380ec0 signature is wrong 405recovery gpt... 406GPT 0x3380ec0 signature is wrong 407recovery gpt fail! 408LoadTrust Addr:0x4000 409No find bl30.bin 410Load uboot, ReadLba = 2000 411hdr 0000000003380880 + 0x0:0x88,0x41,0x3e,0x97,0xe6,0x61,0x54,0x23,0xe9,0x5a,0xd1,0x2b,0xdc,0x2f,0xf9,0x35, 412 413Load OK, addr=0x200000, size=0x9c9c0 414RunBL31 0x10000 415NOTICE: BL31: v1.3(debug):370ab80 416NOTICE: BL31: Built : 09:23:41, Mar 4 2019 417NOTICE: BL31: Rockchip release version: v1.1 418INFO: GICv3 with legacy support detected. ARM GICV3 driver initialized in EL3 419INFO: Using opteed sec cpu_context! 420INFO: boot cpu mask: 0 421INFO: plat_rockchip_pmu_init(1181): pd status 3e 422INFO: BL31: Initializing runtime services 423INFO: BL31: Initializing BL32 424INF [0x0] TEE-CORE:init_primary_helper:337: Initializing (1.1.0-195-g8f090d20 #6 Fri Dec 7 06:11:20 UTC 2018 aarch64) 425 426INF [0x0] TEE-CORE:init_primary_helper:338: Release version: 1.2 427 428INF [0x0] TEE-CORE:init_teecore:83: teecore inits done 429INFO: BL31: Preparing for EL3 exit to normal world 430INFO: Entry point address = 0x200000 431INFO: SPSR = 0x3c9 432 433 434U-Boot 2019.04-rc4-00136-gfd121f9641-dirty (Apr 16 2019 - 14:02:47 +0530) 435 436Model: FriendlyARM NanoPi NEO4 437DRAM: 1022 MiB 438MMC: dwmmc@fe310000: 2, dwmmc@fe320000: 1, sdhci@fe330000: 0 439Loading Environment from MMC... *** Warning - bad CRC, using default environment 440 441In: serial@ff1a0000 442Out: serial@ff1a0000 443Err: serial@ff1a0000 444Model: FriendlyARM NanoPi NEO4 445Net: eth0: ethernet@fe300000 446Hit any key to stop autoboot: 0 447=> 448 449Option 2: Package the image with SPL: 450 451 - Prefix rk3399 header to SPL image 452 453 => cd /path/to/u-boot 454 => ./tools/mkimage -n rk3399 -T rksd -d spl/u-boot-spl-dtb.bin out 455 456 - Write prefixed SPL at 64th sector 457 458 => sudo dd if=out of=/dev/sdc seek=64 459 460 - Write U-Boot proper at 16384 sector 461 462 => sudo dd if=u-boot.itb of=/dev/sdc seek=16384 463 => sync 464 465Put this SD (or micro-SD) card into your board and reset it. You should see 466something like: 467 468U-Boot SPL board init 469Trying to boot from MMC1 470 471 472U-Boot 2019.01-00004-g14db5ee998 (Mar 11 2019 - 13:18:41 +0530) 473 474Model: Orange Pi RK3399 Board 475DRAM: 2 GiB 476MMC: dwmmc@fe310000: 2, dwmmc@fe320000: 1, sdhci@fe330000: 0 477Loading Environment from MMC... OK 478In: serial@ff1a0000 479Out: serial@ff1a0000 480Err: serial@ff1a0000 481Model: Orange Pi RK3399 Board 482Net: eth0: ethernet@fe300000 483Hit any key to stop autoboot: 0 484=> 485 486Option 3: Package the image with TPL: 487 488 - Write tpl+spl at 64th sector 489 490 => sudo dd if=idbloader.img of=/dev/sdc seek=64 491 492 - Write U-Boot proper at 16384 sector 493 494 => sudo dd if=u-boot.itb of=/dev/sdc seek=16384 495 => sync 496 497Put this SD (or micro-SD) card into your board and reset it. You should see 498something like: 499 500U-Boot TPL board init 501Trying to boot from BOOTROM 502Returning to boot ROM... 503 504U-Boot SPL board init 505Trying to boot from MMC1 506 507 508U-Boot 2019.07-rc1-00241-g5b3244767a (May 08 2019 - 10:51:06 +0530) 509 510Model: Orange Pi RK3399 Board 511DRAM: 2 GiB 512MMC: dwmmc@fe310000: 2, dwmmc@fe320000: 1, sdhci@fe330000: 0 513Loading Environment from MMC... OK 514In: serial@ff1a0000 515Out: serial@ff1a0000 516Err: serial@ff1a0000 517Model: Orange Pi RK3399 Board 518Net: eth0: ethernet@fe300000 519Hit any key to stop autoboot: 0 520=> 521 522Using fastboot on rk3288 523======================== 524- Write GPT partition layout to mmc device which fastboot want to use it to 525store the image 526 527 => gpt write mmc 1 $partitions 528 529- Invoke fastboot command to prepare 530 531 => fastboot 1 532 533- Start fastboot request on PC 534 535 fastboot -i 0x2207 flash loader evb-rk3288/spl/u-boot-spl-dtb.bin 536 537You should see something like: 538 539 => fastboot 1 540 WARNING: unknown variable: partition-type:loader 541 Starting download of 357796 bytes 542 .. 543 downloading of 357796 bytes finished 544 Flashing Raw Image 545 ........ wrote 357888 bytes to 'loader' 546 547Booting from SPI 548================ 549 550To write an image that boots from SPI flash (e.g. for the Haier Chromebook or 551Bob): 552 553 ./chromebook_jerry/tools/mkimage -n rk3288 -T rkspi \ 554 -d chromebook_jerry/spl/u-boot-spl-dtb.bin spl.bin && \ 555 dd if=spl.bin of=spl-out.bin bs=128K conv=sync && \ 556 cat spl-out.bin chromebook_jerry/u-boot-dtb.img >out.bin && \ 557 dd if=out.bin of=out.bin.pad bs=4M conv=sync 558 559This converts the SPL image to the required SPI format by adding the Rockchip 560header and skipping every second 2KB block. Then the U-Boot image is written at 561offset 128KB and the whole image is padded to 4MB which is the SPI flash size. 562The position of U-Boot is controlled with this setting in U-Boot: 563 564 #define CONFIG_SYS_SPI_U_BOOT_OFFS 0x20000 565 566If you have a Dediprog em100pro connected then you can write the image with: 567 568 sudo em100 -s -c GD25LQ32 -d out.bin.pad -r 569 570When booting you should see something like: 571 572 U-Boot SPL 2015.07-rc2-00215-g9a58220-dirty (Jun 23 2015 - 12:11:32) 573 574 575 U-Boot 2015.07-rc2-00215-g9a58220-dirty (Jun 23 2015 - 12:11:32 -0600) 576 577 Model: Google Jerry 578 DRAM: 2 GiB 579 MMC: 580 Using default environment 581 582 In: serial@ff690000 583 Out: serial@ff690000 584 Err: serial@ff690000 585 => 586 587Future work 588=========== 589 590Immediate priorities are: 591 592- USB host 593- USB device 594- Run CPU at full speed (code exists but we only see ~60 DMIPS maximum) 595- NAND flash 596- Boot U-Boot proper over USB OTG (at present only SPL works) 597 598 599Development Notes 600================= 601 602There are plenty of patches in the links below to help with this work. 603 604[1] https://github.com/rkchrome/uboot.git 605[2] https://github.com/linux-rockchip/u-boot-rockchip.git branch u-boot-rk3288 606[3] https://github.com/linux-rockchip/rkflashtool.git 607[4] http://wiki.t-firefly.com/index.php/Firefly-RK3288/Serial_debug/en 608 609rkimage 610------- 611 612rkimage.c produces an SPL image suitable for sending directly to the boot ROM 613over USB OTG. This is a very simple format - just the string RK32 (as 4 bytes) 614followed by u-boot-spl-dtb.bin. 615 616The boot ROM loads image to 0xff704000 which is in the internal SRAM. The SRAM 617starts at 0xff700000 and extends to 0xff718000 where we put the stack. 618 619rksd 620---- 621 622rksd.c produces an image consisting of 32KB of empty space, a header and 623u-boot-spl-dtb.bin. The header is defined by 'struct header0_info' although 624most of the fields are unused by U-Boot. We just need to specify the 625signature, a flag and the block offset and size of the SPL image. 626 627The header occupies a single block but we pad it out to 4 blocks. The header 628is encoding using RC4 with the key 7c4e0304550509072d2c7b38170d1711. The SPL 629image can be encoded too but we don't do that. 630 631The maximum size of u-boot-spl-dtb.bin which the boot ROM will read is 32KB, 632or 0x40 blocks. This is a severe and annoying limitation. There may be a way 633around this limitation, since there is plenty of SRAM, but at present the 634board refuses to boot if this limit is exceeded. 635 636The image produced is padded up to a block boundary (512 bytes). It should be 637written to the start of an SD card using dd. 638 639Since this image is set to load U-Boot from the SD card at block offset, 640CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR, dd should be used to write 641u-boot-dtb.img to the SD card at that offset. See above for instructions. 642 643rkspi 644----- 645 646rkspi.c produces an image consisting of a header and u-boot-spl-dtb.bin. The 647resulting image is then spread out so that only the first 2KB of each 4KB 648sector is used. The header is the same as with rksd and the maximum size is 649also 32KB (before spreading). The image should be written to the start of 650SPI flash. 651 652See above for instructions on how to write a SPI image. 653 654rkmux.py 655-------- 656 657You can use this script to create #defines for SoC register access. See the 658script for usage. 659 660 661Device tree and driver model 662---------------------------- 663 664Where possible driver model is used to provide a structure to the 665functionality. Device tree is used for configuration. However these have an 666overhead and in SPL with a 32KB size limit some shortcuts have been taken. 667In general all Rockchip drivers should use these features, with SPL-specific 668modifications where required. 669 670GPT partition layout 671---------------------------- 672 673Rockchip use a unified GPT partition layout in open source support. 674With this GPT partition layout, uboot can be compatilbe with other components, 675like miniloader, trusted-os, arm-trust-firmware. 676 677There are some documents about partitions in the links below. 678http://rockchip.wikidot.com/partitions 679 680-- 681Jagan Teki <jagan@amarulasolutions.com> 68227 Mar 2019 683Simon Glass <sjg@chromium.org> 68424 June 2015 685