blob: 52b5140eca95a4916f5f24cd3551a0a50b2a9a67 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001# SPDX-License-Identifier: GPL-2.0+
Simon Glassadfb2bf2015-08-30 16:55:43 -06002#
3# Copyright (C) 2015 Google. Inc
4# Written by Simon Glass <sjg@chromium.org>
Simon Glassadfb2bf2015-08-30 16:55:43 -06005
6U-Boot on Rockchip
7==================
8
Simon Glass0c14c362019-01-21 14:53:23 -07009A wide range of Rockchip SoCs are supported in mainline U-Boot
Simon Glassadfb2bf2015-08-30 16:55:43 -060010
Walter Lozano1cf99b32020-05-22 11:14:57 -030011Warning
12=======
13This document is being moved to doc/board/rockchip, so information on it
14might be incomplete or outdated.
Simon Glassadfb2bf2015-08-30 16:55:43 -060015
16Prerequisites
17=============
18
19You will need:
20
Simon Glassf1387132016-01-21 19:45:25 -070021 - Firefly RK3288 board or something else with a supported RockChip SoC
Simon Glassadfb2bf2015-08-30 16:55:43 -060022 - 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
Simon Glassadfb2bf2015-08-30 16:55:43 -060031Building
32========
33
Jagan Tekic661c052019-05-08 11:11:51 +0530341. To build RK3288 board:
35
Simon Glassadfb2bf2015-08-30 16:55:43 -060036 CROSS_COMPILE=arm-linux-gnueabi- make O=firefly firefly-rk3288_defconfig all
37
Jagan Tekic661c052019-05-08 11:11:51 +053038 (or you can use another cross compiler if you prefer)
Simon Glassadfb2bf2015-08-30 16:55:43 -060039
Andy Yan7f08bfb2019-11-14 11:23:17 +0800402. 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
Andy Yandcdea292019-12-26 15:20:34 +080047 => make roc-cc-rk3308_defconfig
Andy Yan7f08bfb2019-11-14 11:23:17 +080048 => make CROSS_COMPILE=aarch64-linux-gnu- all
Andy Yan7f08bfb2019-11-14 11:23:17 +080049 => ./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:
Jagan Tekic661c052019-05-08 11:11:51 +053053
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
Jagan Tekic661c052019-05-08 11:11:51 +053061
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
Jagan Tekic661c052019-05-08 11:11:51 +053080 - Export cross compiler path for aarch64
81
82 - Compile ATF
83
Quentin Schulz780fc002021-11-12 15:15:50 +010084 => git clone https://github.com/ARM-software/arm-trusted-firmware.git
85 => cd arm-trusted-firmware
Jagan Tekic661c052019-05-08 11:11:51 +053086
Quentin Schulz780fc002021-11-12 15:15:50 +010087 (export cross compiler path for Cortex-M0 MCU likely arm-none-eabi-)
88 => make realclean
89 => make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3399
Jagan Tekic661c052019-05-08 11:11:51 +053090
Quentin Schulz780fc002021-11-12 15:15:50 +010091 (export bl31.elf)
92 => export BL31=/path/to/arm-trusted-firmware/build/rk3399/release/bl31/bl31.elf
Jagan Tekic661c052019-05-08 11:11:51 +053093
94 - Compile PMU M0 firmware
95
Quentin Schulz780fc002021-11-12 15:15:50 +010096 This is optional for most of the rk3399 boards.
Jagan Tekic661c052019-05-08 11:11:51 +053097
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
Jagan Teki2411c332019-06-20 15:37:39 +0530104 (export rk3399m0.bin)
105 => export PMUM0=/path/to/rk3399-cortex-m0/rk3399m0.bin
Jagan Tekic661c052019-05-08 11:11:51 +0530106
107 - Compile U-Boot
108
109 => cd /path/to/u-boot
110 => make orangepi-rk3399_defconfig
111 => make
Jagan Tekic661c052019-05-08 11:11:51 +0530112
113 (Get spl/u-boot-spl-dtb.bin, u-boot.itb images and some boards would get
Jagan Teki051c7552019-05-29 13:55:49 +0530114 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)
Simon Glassadfb2bf2015-08-30 16:55:43 -0600118
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
Jeffy Chen717f8842015-11-27 12:07:18 +0800132 ./firefly-rk3288/tools/mkimage -n rk3288 -T rkimage -d \
Simon Glassf2acc552015-08-30 16:55:52 -0600133 ./firefly-rk3288/spl/u-boot-spl-dtb.bin out && \
Simon Glassadfb2bf2015-08-30 16:55:43 -0600134 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
Andy Yan7f08bfb2019-11-14 11:23:17 +0800150Writing 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
Simon Glassadfb2bf2015-08-30 16:55:43 -0600222Booting from an SD card
223=======================
224
225To write an image that boots from an SD card (assumed to be /dev/sdc):
226
Jeffy Chen717f8842015-11-27 12:07:18 +0800227 ./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \
Simon Glassf2acc552015-08-30 16:55:52 -0600228 firefly-rk3288/spl/u-boot-spl-dtb.bin out && \
229 sudo dd if=out of=/dev/sdc seek=64 && \
Kever Yang73e6dbe2017-11-02 15:16:35 +0800230 sudo dd if=firefly-rk3288/u-boot-dtb.img of=/dev/sdc seek=16384
Simon Glassadfb2bf2015-08-30 16:55:43 -0600231
232This puts the Rockchip header and SPL image first and then places the U-Boot
Goldschmidt Simon341e44e2017-11-10 11:38:32 +0000233image at block 16384 (i.e. 8MB from the start of the SD card). This
Simon Glassadfb2bf2015-08-30 16:55:43 -0600234corresponds with this setting in U-Boot:
235
Kever Yang73e6dbe2017-11-02 15:16:35 +0800236 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 0x4000
Simon Glassadfb2bf2015-08-30 16:55:43 -0600237
238Put this SD (or micro-SD) card into your board and reset it. You should see
239something like:
240
Simon Glassf1387132016-01-21 19:45:25 -0700241 U-Boot 2016.01-rc2-00309-ge5bad3b-dirty (Jan 02 2016 - 23:41:59 -0700)
Simon Glassadfb2bf2015-08-30 16:55:43 -0600242
Simon Glassf1387132016-01-21 19:45:25 -0700243 Model: Radxa Rock 2 Square
Simon Glassadfb2bf2015-08-30 16:55:43 -0600244 DRAM: 2 GiB
Simon Glassf1387132016-01-21 19:45:25 -0700245 MMC: dwmmc@ff0f0000: 0, dwmmc@ff0c0000: 1
246 *** Warning - bad CRC, using default environment
Simon Glassadfb2bf2015-08-30 16:55:43 -0600247
Simon Glassf1387132016-01-21 19:45:25 -0700248 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
Simon Glassadfb2bf2015-08-30 16:55:43 -0600254 =>
255
Xu Ziyuanb47ea792016-07-12 19:09:49 +0800256The rockchip bootrom can load and boot an initial spl, then continue to
Heinrich Schuchardt760b9572018-06-03 20:41:29 +0200257load 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:
Xu Ziyuanb47ea792016-07-12 19:09:49 +0800260
Heinrich Schuchardt760b9572018-06-03 20:41:29 +0200261 CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y
Xu Ziyuanb47ea792016-07-12 19:09:49 +0800262
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
Jeffy Chenbcfb05c2019-12-05 18:58:28 +0800270Or:
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
Simon Glassf1387132016-01-21 19:45:25 -0700276If you have an HDMI cable attached you should see a video console.
277
huang lin1d5a6962015-11-17 14:20:31 +0800278For evb_rk3036 board:
Jeffy Chen717f8842015-11-27 12:07:18 +0800279 ./evb-rk3036/tools/mkimage -n rk3036 -T rksd -d evb-rk3036/spl/u-boot-spl.bin out && \
huang lin1d5a6962015-11-17 14:20:31 +0800280 cat evb-rk3036/u-boot-dtb.bin >> out && \
281 sudo dd if=out of=/dev/sdc seek=64
282
Jeffy Chenbcfb05c2019-12-05 18:58:28 +0800283Or:
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
huang lin1d5a6962015-11-17 14:20:31 +0800288Note: rk3036 SDMMC and debug uart use the same iomux, so if you boot from SD, the
289 debug uart must be disabled
Simon Glassadfb2bf2015-08-30 16:55:43 -0600290
Heiko Stübnerf46b8592017-03-24 00:41:34 +0100291
Jagan Teki532cb7f2017-09-27 23:03:12 +0530292Booting 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
Matwey V. Kornilov78af73e2019-09-03 19:29:02 +0300305 sudo dd if=idbloader.img of=/dev/mmcblk0 seek=64 &&
Jagan Tekid80599e2017-11-10 17:18:43 +0530306 sudo dd if=u-boot-dtb.img of=/dev/mmcblk0 seek=16384
Jagan Teki532cb7f2017-09-27 23:03:12 +0530307
Heiko Stübnerf46b8592017-03-24 00:41:34 +0100308Booting 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
Philipp Tomsich4d9253f2017-10-10 16:21:15 +0200316can 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.
Heiko Stübnerf46b8592017-03-24 00:41:34 +0100320
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
Philipp Tomsich4d9253f2017-10-10 16:21:15 +0200326tools/mkimage -n rk3188 -T rksd -d spl/u-boot-spl.bin out
Heiko Stübnerf46b8592017-03-24 00:41:34 +0100327
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
Matwey V. Kornilov8fc48222019-06-09 00:27:18 +0300332Booting from an SD card on Pine64 Rock64 (RK3328)
333=================================================
334
335For Rock64 rk3328 board the following three parts are required:
Matwey V. Kornilov6a452e52019-08-02 10:40:04 +0300336TPL, SPL, and the u-boot image tree blob.
Matwey V. Kornilov8fc48222019-06-09 00:27:18 +0300337
Matwey V. Kornilov8fc48222019-06-09 00:27:18 +0300338 - 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
Jagan Tekic661c052019-05-08 11:11:51 +0530346Booting 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=>
Heiko Stübnerf46b8592017-03-24 00:41:34 +0100493
Jagan Teki051c7552019-05-29 13:55:49 +0530494Option 3: Package the image with TPL:
495
Jagan Teki051c7552019-05-29 13:55:49 +0530496 - Write tpl+spl at 64th sector
497
Matwey V. Kornilov78af73e2019-09-03 19:29:02 +0300498 => sudo dd if=idbloader.img of=/dev/sdc seek=64
Jagan Teki051c7552019-05-29 13:55:49 +0530499
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
Xu Ziyuana16e2e02016-07-18 09:56:46 +0800530Using fastboot on rk3288
531========================
Xu Ziyuana16e2e02016-07-18 09:56:46 +0800532- 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
Simon Glassadfb2bf2015-08-30 16:55:43 -0600555Booting from SPI
556================
557
Simon Glass9e921162019-01-21 14:53:36 -0700558To write an image that boots from SPI flash (e.g. for the Haier Chromebook or
559Bob):
Simon Glassadfb2bf2015-08-30 16:55:43 -0600560
Simon Glassdd8e4292015-12-29 05:22:45 -0700561 ./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 && \
Simon Glassadfb2bf2015-08-30 16:55:43 -0600565 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
Simon Glass6cecc2b2019-01-21 14:53:27 -0700568header and skipping every second 2KB block. Then the U-Boot image is written at
Simon Glassadfb2bf2015-08-30 16:55:43 -0600569offset 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
Hannes Schmelzer01528792019-08-22 15:41:42 +0200572 #define CONFIG_SYS_SPI_U_BOOT_OFFS 0x20000
Simon Glassadfb2bf2015-08-30 16:55:43 -0600573
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
Simon Glassadfb2bf2015-08-30 16:55:43 -0600595Future work
596===========
597
598Immediate priorities are:
599
Simon Glassadfb2bf2015-08-30 16:55:43 -0600600- USB host
601- USB device
Simon Glassf1387132016-01-21 19:45:25 -0700602- Run CPU at full speed (code exists but we only see ~60 DMIPS maximum)
Simon Glassadfb2bf2015-08-30 16:55:43 -0600603- NAND flash
Simon Glassadfb2bf2015-08-30 16:55:43 -0600604- 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
Simon Glass002c6342016-01-21 19:45:08 -0700662rkmux.py
663--------
664
665You can use this script to create #defines for SoC register access. See the
666script for usage.
667
Simon Glassadfb2bf2015-08-30 16:55:43 -0600668
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
Jacob Chen3f3e1e32016-10-08 13:47:42 +0800678GPT 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
Simon Glassadfb2bf2015-08-30 16:55:43 -0600687
688--
Jagan Tekic661c052019-05-08 11:11:51 +0530689Jagan Teki <jagan@amarulasolutions.com>
69027 Mar 2019
Simon Glassadfb2bf2015-08-30 16:55:43 -0600691Simon Glass <sjg@chromium.org>
69224 June 2015