xref: /openbmc/u-boot/doc/README.rockchip (revision dd63fbc70a5fa59677c86695ebad341834fec172)
1adfb2bfeSSimon Glass#
2adfb2bfeSSimon Glass# Copyright (C) 2015 Google. Inc
3adfb2bfeSSimon Glass# Written by Simon Glass <sjg@chromium.org>
4adfb2bfeSSimon Glass#
5adfb2bfeSSimon Glass# SPDX-License-Identifier:	GPL-2.0+
6adfb2bfeSSimon Glass#
7adfb2bfeSSimon Glass
8adfb2bfeSSimon GlassU-Boot on Rockchip
9adfb2bfeSSimon Glass==================
10adfb2bfeSSimon Glass
11adfb2bfeSSimon GlassThere are several repositories available with versions of U-Boot that support
12adfb2bfeSSimon Glassmany Rockchip devices [1] [2].
13adfb2bfeSSimon Glass
14adfb2bfeSSimon GlassThe current mainline support is experimental only and is not useful for
15adfb2bfeSSimon Glassanything. It should provide a base on which to build.
16adfb2bfeSSimon Glass
17f1387130SSimon GlassSo far only support for the RK3288 and RK3036 is provided.
18adfb2bfeSSimon Glass
19adfb2bfeSSimon Glass
20adfb2bfeSSimon GlassPrerequisites
21adfb2bfeSSimon Glass=============
22adfb2bfeSSimon Glass
23adfb2bfeSSimon GlassYou will need:
24adfb2bfeSSimon Glass
25f1387130SSimon Glass   - Firefly RK3288 board or something else with a supported RockChip SoC
26adfb2bfeSSimon Glass   - Power connection to 5V using the supplied micro-USB power cable
27adfb2bfeSSimon Glass   - Separate USB serial cable attached to your computer and the Firefly
28adfb2bfeSSimon Glass        (connect to the micro-USB connector below the logo)
29adfb2bfeSSimon Glass   - rkflashtool [3]
30adfb2bfeSSimon Glass   - openssl (sudo apt-get install openssl)
31adfb2bfeSSimon Glass   - Serial UART connection [4]
32adfb2bfeSSimon Glass   - Suitable ARM cross compiler, e.g.:
33adfb2bfeSSimon Glass        sudo apt-get install gcc-4.7-arm-linux-gnueabi
34adfb2bfeSSimon Glass
35adfb2bfeSSimon Glass
36adfb2bfeSSimon GlassBuilding
37adfb2bfeSSimon Glass========
38adfb2bfeSSimon Glass
39*dd63fbc7Sjk.kernel@gmail.comAt present six RK3288 boards are supported:
40adfb2bfeSSimon Glass
41adfb2bfeSSimon Glass   - Firefly RK3288 - use firefly-rk3288 configuration
427c1058faSSimon Glass   - Radxa Rock 2 - use rock2 configuration
43f1387130SSimon Glass   - Hisense Chromebook - use chromebook_jerry configuration
44744368d6SXu Ziyuan   - EVB RK3288 - use evb-rk3288 configuration
45d7ca67b7Sjk.kernel@gmail.com   - Fennec RK3288 - use fennec-rk3288 configuration
46*dd63fbc7Sjk.kernel@gmail.com   - PopMetal RK3288 - use popmetal-rk3288 configuration
47adfb2bfeSSimon Glass
48f1387130SSimon GlassTwo RK3036 board are supported:
491d5a6968Shuang lin
50f1387130SSimon Glass   - EVB RK3036 - use evb-rk3036 configuration
51f1387130SSimon Glass   - Kylin - use kylin_rk3036 configuration
521d5a6968Shuang lin
53adfb2bfeSSimon GlassFor example:
54adfb2bfeSSimon Glass
55adfb2bfeSSimon Glass   CROSS_COMPILE=arm-linux-gnueabi- make O=firefly firefly-rk3288_defconfig all
56adfb2bfeSSimon Glass
57adfb2bfeSSimon Glass(or you can use another cross compiler if you prefer)
58adfb2bfeSSimon Glass
59adfb2bfeSSimon Glass
60adfb2bfeSSimon GlassWriting to the board with USB
61adfb2bfeSSimon Glass=============================
62adfb2bfeSSimon Glass
63adfb2bfeSSimon GlassFor USB to work you must get your board into ROM boot mode, either by erasing
64adfb2bfeSSimon Glassyour MMC or (perhaps) holding the recovery button when you boot the board.
65adfb2bfeSSimon GlassTo erase your MMC, you can boot into Linux and type (as root)
66adfb2bfeSSimon Glass
67adfb2bfeSSimon Glass   dd if=/dev/zero of=/dev/mmcblk0 bs=1M
68adfb2bfeSSimon Glass
69adfb2bfeSSimon GlassConnect your board's OTG port to your computer.
70adfb2bfeSSimon Glass
71adfb2bfeSSimon GlassTo create a suitable image and write it to the board:
72adfb2bfeSSimon Glass
73717f8845SJeffy Chen   ./firefly-rk3288/tools/mkimage -n rk3288 -T rkimage -d \
74f2acc55eSSimon Glass	./firefly-rk3288/spl/u-boot-spl-dtb.bin out && \
75adfb2bfeSSimon Glass   cat out | openssl rc4 -K 7c4e0304550509072d2c7b38170d1711 | rkflashtool l
76adfb2bfeSSimon Glass
77adfb2bfeSSimon GlassIf all goes well you should something like:
78adfb2bfeSSimon Glass
79adfb2bfeSSimon Glass   U-Boot SPL 2015.07-rc1-00383-ge345740-dirty (Jun 03 2015 - 10:06:49)
80adfb2bfeSSimon Glass   Card did not respond to voltage select!
81adfb2bfeSSimon Glass   spl: mmc init failed with error: -17
82adfb2bfeSSimon Glass   ### ERROR ### Please RESET the board ###
83adfb2bfeSSimon Glass
84adfb2bfeSSimon GlassYou will need to reset the board before each time you try. Yes, that's all
85adfb2bfeSSimon Glassit does so far. If support for the Rockchip USB protocol or DFU were added
86adfb2bfeSSimon Glassin SPL then we could in principle load U-Boot and boot to a prompt from USB
87adfb2bfeSSimon Glassas several other platforms do. However it does not seem to be possible to
88adfb2bfeSSimon Glassuse the existing boot ROM code from SPL.
89adfb2bfeSSimon Glass
90adfb2bfeSSimon Glass
91adfb2bfeSSimon GlassBooting from an SD card
92adfb2bfeSSimon Glass=======================
93adfb2bfeSSimon Glass
94adfb2bfeSSimon GlassTo write an image that boots from an SD card (assumed to be /dev/sdc):
95adfb2bfeSSimon Glass
96717f8845SJeffy Chen   ./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \
97f2acc55eSSimon Glass	firefly-rk3288/spl/u-boot-spl-dtb.bin out && \
98f2acc55eSSimon Glass   sudo dd if=out of=/dev/sdc seek=64 && \
99adfb2bfeSSimon Glass   sudo dd if=firefly-rk3288/u-boot-dtb.img of=/dev/sdc seek=256
100adfb2bfeSSimon Glass
101adfb2bfeSSimon GlassThis puts the Rockchip header and SPL image first and then places the U-Boot
102adfb2bfeSSimon Glassimage at block 256 (i.e. 128KB from the start of the SD card). This
103adfb2bfeSSimon Glasscorresponds with this setting in U-Boot:
104adfb2bfeSSimon Glass
105adfb2bfeSSimon Glass   #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR	256
106adfb2bfeSSimon Glass
107adfb2bfeSSimon GlassPut this SD (or micro-SD) card into your board and reset it. You should see
108adfb2bfeSSimon Glasssomething like:
109adfb2bfeSSimon Glass
110f1387130SSimon Glass   U-Boot 2016.01-rc2-00309-ge5bad3b-dirty (Jan 02 2016 - 23:41:59 -0700)
111adfb2bfeSSimon Glass
112f1387130SSimon Glass   Model: Radxa Rock 2 Square
113adfb2bfeSSimon Glass   DRAM:  2 GiB
114f1387130SSimon Glass   MMC:   dwmmc@ff0f0000: 0, dwmmc@ff0c0000: 1
115f1387130SSimon Glass   *** Warning - bad CRC, using default environment
116adfb2bfeSSimon Glass
117f1387130SSimon Glass   In:    serial
118f1387130SSimon Glass   Out:   vop@ff940000.vidconsole
119f1387130SSimon Glass   Err:   serial
120f1387130SSimon Glass   Net:   Net Initialization Skipped
121f1387130SSimon Glass   No ethernet found.
122f1387130SSimon Glass   Hit any key to stop autoboot:  0
123adfb2bfeSSimon Glass   =>
124adfb2bfeSSimon Glass
125b47ea792SXu ZiyuanThe rockchip bootrom can load and boot an initial spl, then continue to
126b47ea792SXu Ziyuanload a second-level bootloader(ie. U-BOOT) as soon as it returns to bootrom.
127b47ea792SXu ZiyuanTherefore RK3288 has another loading sequence like RK3036. The option of
128b47ea792SXu ZiyuanU-Boot is controlled with this setting in U-Boot:
129b47ea792SXu Ziyuan
130b47ea792SXu Ziyuan	#define CONFIG_ROCKCHIP_SPL_BACK_TO_BROM
131b47ea792SXu Ziyuan
132b47ea792SXu ZiyuanYou can create the image via the following operations:
133b47ea792SXu Ziyuan
134b47ea792SXu Ziyuan   ./firefly-rk3288/tools/mkimage -n rk3288 -T rksd -d \
135b47ea792SXu Ziyuan	firefly-rk3288/spl/u-boot-spl-dtb.bin out && \
136b47ea792SXu Ziyuan   cat firefly-rk3288/u-boot-dtb.bin >> out && \
137b47ea792SXu Ziyuan   sudo dd if=out of=/dev/sdc seek=64
138b47ea792SXu Ziyuan
139f1387130SSimon GlassIf you have an HDMI cable attached you should see a video console.
140f1387130SSimon Glass
1411d5a6968Shuang linFor evb_rk3036 board:
142717f8845SJeffy Chen	./evb-rk3036/tools/mkimage -n rk3036 -T rksd  -d evb-rk3036/spl/u-boot-spl.bin out && \
1431d5a6968Shuang lin	cat evb-rk3036/u-boot-dtb.bin >> out && \
1441d5a6968Shuang lin	sudo dd if=out of=/dev/sdc seek=64
1451d5a6968Shuang lin
1461d5a6968Shuang linNote: rk3036 SDMMC and debug uart use the same iomux, so if you boot from SD, the
1471d5a6968Shuang lin      debug uart must be disabled
148adfb2bfeSSimon Glass
149a16e2e06SXu ZiyuanUsing fastboot on rk3288
150a16e2e06SXu Ziyuan========================
151a16e2e06SXu Ziyuan- Define GPT partition layout like kylin_rk3036(see include/configs/kylin_rk3036.h)
152a16e2e06SXu Ziyuan- Write GPT partition layout to mmc device which fastboot want to use it to
153a16e2e06SXu Ziyuanstore the image
154a16e2e06SXu Ziyuan
155a16e2e06SXu Ziyuan        => gpt write mmc 1 $partitions
156a16e2e06SXu Ziyuan
157a16e2e06SXu Ziyuan- Invoke fastboot command to prepare
158a16e2e06SXu Ziyuan
159a16e2e06SXu Ziyuan        => fastboot 1
160a16e2e06SXu Ziyuan
161a16e2e06SXu Ziyuan- Start fastboot request on PC
162a16e2e06SXu Ziyuan
163a16e2e06SXu Ziyuan        fastboot -i 0x2207 flash loader evb-rk3288/spl/u-boot-spl-dtb.bin
164a16e2e06SXu Ziyuan
165a16e2e06SXu ZiyuanYou should see something like:
166a16e2e06SXu Ziyuan
167a16e2e06SXu Ziyuan        => fastboot 1
168a16e2e06SXu Ziyuan        WARNING: unknown variable: partition-type:loader
169a16e2e06SXu Ziyuan        Starting download of 357796 bytes
170a16e2e06SXu Ziyuan        ..
171a16e2e06SXu Ziyuan        downloading of 357796 bytes finished
172a16e2e06SXu Ziyuan        Flashing Raw Image
173a16e2e06SXu Ziyuan        ........ wrote 357888 bytes to 'loader'
174a16e2e06SXu Ziyuan
175adfb2bfeSSimon GlassBooting from SPI
176adfb2bfeSSimon Glass================
177adfb2bfeSSimon Glass
178adfb2bfeSSimon GlassTo write an image that boots from SPI flash (e.g. for the Haier Chromebook):
179adfb2bfeSSimon Glass
180dd8e4290SSimon Glass   ./chromebook_jerry/tools/mkimage -n rk3288 -T rkspi \
181dd8e4290SSimon Glass	-d chromebook_jerry/spl/u-boot-spl-dtb.bin spl.bin && \
182dd8e4290SSimon Glass   dd if=spl.bin of=spl-out.bin bs=128K conv=sync && \
183dd8e4290SSimon Glass   cat spl-out.bin chromebook_jerry/u-boot-dtb.img >out.bin && \
184adfb2bfeSSimon Glass   dd if=out.bin of=out.bin.pad bs=4M conv=sync
185adfb2bfeSSimon Glass
186adfb2bfeSSimon GlassThis converts the SPL image to the required SPI format by adding the Rockchip
187adfb2bfeSSimon Glassheader and skipping every 2KB block. Then the U-Boot image is written at
188adfb2bfeSSimon Glassoffset 128KB and the whole image is padded to 4MB which is the SPI flash size.
189adfb2bfeSSimon GlassThe position of U-Boot is controlled with this setting in U-Boot:
190adfb2bfeSSimon Glass
191adfb2bfeSSimon Glass   #define CONFIG_SYS_SPI_U_BOOT_OFFS	(128 << 10)
192adfb2bfeSSimon Glass
193adfb2bfeSSimon GlassIf you have a Dediprog em100pro connected then you can write the image with:
194adfb2bfeSSimon Glass
195adfb2bfeSSimon Glass      sudo em100 -s -c GD25LQ32 -d out.bin.pad -r
196adfb2bfeSSimon Glass
197adfb2bfeSSimon GlassWhen booting you should see something like:
198adfb2bfeSSimon Glass
199adfb2bfeSSimon Glass   U-Boot SPL 2015.07-rc2-00215-g9a58220-dirty (Jun 23 2015 - 12:11:32)
200adfb2bfeSSimon Glass
201adfb2bfeSSimon Glass
202adfb2bfeSSimon Glass   U-Boot 2015.07-rc2-00215-g9a58220-dirty (Jun 23 2015 - 12:11:32 -0600)
203adfb2bfeSSimon Glass
204adfb2bfeSSimon Glass   Model: Google Jerry
205adfb2bfeSSimon Glass   DRAM:  2 GiB
206adfb2bfeSSimon Glass   MMC:
207adfb2bfeSSimon Glass   Using default environment
208adfb2bfeSSimon Glass
209adfb2bfeSSimon Glass   In:    serial@ff690000
210adfb2bfeSSimon Glass   Out:   serial@ff690000
211adfb2bfeSSimon Glass   Err:   serial@ff690000
212adfb2bfeSSimon Glass   =>
213adfb2bfeSSimon Glass
214adfb2bfeSSimon Glass
215adfb2bfeSSimon GlassFuture work
216adfb2bfeSSimon Glass===========
217adfb2bfeSSimon Glass
218adfb2bfeSSimon GlassImmediate priorities are:
219adfb2bfeSSimon Glass
220adfb2bfeSSimon Glass- USB host
221adfb2bfeSSimon Glass- USB device
222f1387130SSimon Glass- Run CPU at full speed (code exists but we only see ~60 DMIPS maximum)
223adfb2bfeSSimon Glass- Ethernet
224adfb2bfeSSimon Glass- NAND flash
225adfb2bfeSSimon Glass- Support for other Rockchip parts
226adfb2bfeSSimon Glass- Boot U-Boot proper over USB OTG (at present only SPL works)
227adfb2bfeSSimon Glass
228adfb2bfeSSimon Glass
229adfb2bfeSSimon GlassDevelopment Notes
230adfb2bfeSSimon Glass=================
231adfb2bfeSSimon Glass
232adfb2bfeSSimon GlassThere are plenty of patches in the links below to help with this work.
233adfb2bfeSSimon Glass
234adfb2bfeSSimon Glass[1] https://github.com/rkchrome/uboot.git
235adfb2bfeSSimon Glass[2] https://github.com/linux-rockchip/u-boot-rockchip.git branch u-boot-rk3288
236adfb2bfeSSimon Glass[3] https://github.com/linux-rockchip/rkflashtool.git
237adfb2bfeSSimon Glass[4] http://wiki.t-firefly.com/index.php/Firefly-RK3288/Serial_debug/en
238adfb2bfeSSimon Glass
239adfb2bfeSSimon Glassrkimage
240adfb2bfeSSimon Glass-------
241adfb2bfeSSimon Glass
242adfb2bfeSSimon Glassrkimage.c produces an SPL image suitable for sending directly to the boot ROM
243adfb2bfeSSimon Glassover USB OTG. This is a very simple format - just the string RK32 (as 4 bytes)
244adfb2bfeSSimon Glassfollowed by u-boot-spl-dtb.bin.
245adfb2bfeSSimon Glass
246adfb2bfeSSimon GlassThe boot ROM loads image to 0xff704000 which is in the internal SRAM. The SRAM
247adfb2bfeSSimon Glassstarts at 0xff700000 and extends to 0xff718000 where we put the stack.
248adfb2bfeSSimon Glass
249adfb2bfeSSimon Glassrksd
250adfb2bfeSSimon Glass----
251adfb2bfeSSimon Glass
252adfb2bfeSSimon Glassrksd.c produces an image consisting of 32KB of empty space, a header and
253adfb2bfeSSimon Glassu-boot-spl-dtb.bin. The header is defined by 'struct header0_info' although
254adfb2bfeSSimon Glassmost of the fields are unused by U-Boot. We just need to specify the
255adfb2bfeSSimon Glasssignature, a flag and the block offset and size of the SPL image.
256adfb2bfeSSimon Glass
257adfb2bfeSSimon GlassThe header occupies a single block but we pad it out to 4 blocks. The header
258adfb2bfeSSimon Glassis encoding using RC4 with the key 7c4e0304550509072d2c7b38170d1711. The SPL
259adfb2bfeSSimon Glassimage can be encoded too but we don't do that.
260adfb2bfeSSimon Glass
261adfb2bfeSSimon GlassThe maximum size of u-boot-spl-dtb.bin which the boot ROM will read is 32KB,
262adfb2bfeSSimon Glassor 0x40 blocks. This is a severe and annoying limitation. There may be a way
263adfb2bfeSSimon Glassaround this limitation, since there is plenty of SRAM, but at present the
264adfb2bfeSSimon Glassboard refuses to boot if this limit is exceeded.
265adfb2bfeSSimon Glass
266adfb2bfeSSimon GlassThe image produced is padded up to a block boundary (512 bytes). It should be
267adfb2bfeSSimon Glasswritten to the start of an SD card using dd.
268adfb2bfeSSimon Glass
269adfb2bfeSSimon GlassSince this image is set to load U-Boot from the SD card at block offset,
270adfb2bfeSSimon GlassCONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR, dd should be used to write
271adfb2bfeSSimon Glassu-boot-dtb.img to the SD card at that offset. See above for instructions.
272adfb2bfeSSimon Glass
273adfb2bfeSSimon Glassrkspi
274adfb2bfeSSimon Glass-----
275adfb2bfeSSimon Glass
276adfb2bfeSSimon Glassrkspi.c produces an image consisting of a header and u-boot-spl-dtb.bin. The
277adfb2bfeSSimon Glassresulting image is then spread out so that only the first 2KB of each 4KB
278adfb2bfeSSimon Glasssector is used. The header is the same as with rksd and the maximum size is
279adfb2bfeSSimon Glassalso 32KB (before spreading). The image should be written to the start of
280adfb2bfeSSimon GlassSPI flash.
281adfb2bfeSSimon Glass
282adfb2bfeSSimon GlassSee above for instructions on how to write a SPI image.
283adfb2bfeSSimon Glass
284002c634cSSimon Glassrkmux.py
285002c634cSSimon Glass--------
286002c634cSSimon Glass
287002c634cSSimon GlassYou can use this script to create #defines for SoC register access. See the
288002c634cSSimon Glassscript for usage.
289002c634cSSimon Glass
290adfb2bfeSSimon Glass
291adfb2bfeSSimon GlassDevice tree and driver model
292adfb2bfeSSimon Glass----------------------------
293adfb2bfeSSimon Glass
294adfb2bfeSSimon GlassWhere possible driver model is used to provide a structure to the
295adfb2bfeSSimon Glassfunctionality. Device tree is used for configuration. However these have an
296adfb2bfeSSimon Glassoverhead and in SPL with a 32KB size limit some shortcuts have been taken.
297adfb2bfeSSimon GlassIn general all Rockchip drivers should use these features, with SPL-specific
298adfb2bfeSSimon Glassmodifications where required.
299adfb2bfeSSimon Glass
300adfb2bfeSSimon Glass
301adfb2bfeSSimon Glass--
302adfb2bfeSSimon GlassSimon Glass <sjg@chromium.org>
303adfb2bfeSSimon Glass24 June 2015
304