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