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