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 17adfb2bfeSSimon GlassSo far only support for the RK3288 is provided. 18adfb2bfeSSimon Glass 19adfb2bfeSSimon Glass 20adfb2bfeSSimon GlassPrerequisites 21adfb2bfeSSimon Glass============= 22adfb2bfeSSimon Glass 23adfb2bfeSSimon GlassYou will need: 24adfb2bfeSSimon Glass 25adfb2bfeSSimon Glass - Firefly RK3288 baord 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 39adfb2bfeSSimon GlassAt present three RK3288 boards are supported: 40adfb2bfeSSimon Glass 41adfb2bfeSSimon Glass - Firefly RK3288 - use firefly-rk3288 configuration 42*f2b3017cSSjoerd Simons - Radxa Rock 2 - also uses firefly-rk3288 configuration 43adfb2bfeSSimon Glass - Haier Chromebook - use chromebook_jerry configuration 44adfb2bfeSSimon Glass 45adfb2bfeSSimon GlassFor example: 46adfb2bfeSSimon Glass 47adfb2bfeSSimon Glass CROSS_COMPILE=arm-linux-gnueabi- make O=firefly firefly-rk3288_defconfig all 48adfb2bfeSSimon Glass 49adfb2bfeSSimon Glass(or you can use another cross compiler if you prefer) 50adfb2bfeSSimon Glass 51*f2b3017cSSjoerd SimonsNote that the Radxa Rock 2 uses the Firefly configuration for now as 52*f2b3017cSSjoerd Simonsdevice tree files are not yet available for the Rock 2. Clearly the two 53adfb2bfeSSimon Glasshave hardware differences, so this approach will break down as more drivers 54adfb2bfeSSimon Glassare added. 55adfb2bfeSSimon Glass 56adfb2bfeSSimon Glass 57adfb2bfeSSimon GlassWriting to the board with USB 58adfb2bfeSSimon Glass============================= 59adfb2bfeSSimon Glass 60adfb2bfeSSimon GlassFor USB to work you must get your board into ROM boot mode, either by erasing 61adfb2bfeSSimon Glassyour MMC or (perhaps) holding the recovery button when you boot the board. 62adfb2bfeSSimon GlassTo erase your MMC, you can boot into Linux and type (as root) 63adfb2bfeSSimon Glass 64adfb2bfeSSimon Glass dd if=/dev/zero of=/dev/mmcblk0 bs=1M 65adfb2bfeSSimon Glass 66adfb2bfeSSimon GlassConnect your board's OTG port to your computer. 67adfb2bfeSSimon Glass 68adfb2bfeSSimon GlassTo create a suitable image and write it to the board: 69adfb2bfeSSimon Glass 70adfb2bfeSSimon Glass ./firefly-rk3288/tools/mkimage -T rkimage -d ./firefly-rk3288/spl/u-boot-spl-dtb.bin out 71adfb2bfeSSimon Glass cat out | openssl rc4 -K 7c4e0304550509072d2c7b38170d1711 | rkflashtool l 72adfb2bfeSSimon Glass 73adfb2bfeSSimon GlassIf all goes well you should something like: 74adfb2bfeSSimon Glass 75adfb2bfeSSimon Glass U-Boot SPL 2015.07-rc1-00383-ge345740-dirty (Jun 03 2015 - 10:06:49) 76adfb2bfeSSimon Glass Card did not respond to voltage select! 77adfb2bfeSSimon Glass spl: mmc init failed with error: -17 78adfb2bfeSSimon Glass ### ERROR ### Please RESET the board ### 79adfb2bfeSSimon Glass 80adfb2bfeSSimon GlassYou will need to reset the board before each time you try. Yes, that's all 81adfb2bfeSSimon Glassit does so far. If support for the Rockchip USB protocol or DFU were added 82adfb2bfeSSimon Glassin SPL then we could in principle load U-Boot and boot to a prompt from USB 83adfb2bfeSSimon Glassas several other platforms do. However it does not seem to be possible to 84adfb2bfeSSimon Glassuse the existing boot ROM code from SPL. 85adfb2bfeSSimon Glass 86adfb2bfeSSimon Glass 87adfb2bfeSSimon GlassBooting from an SD card 88adfb2bfeSSimon Glass======================= 89adfb2bfeSSimon Glass 90adfb2bfeSSimon GlassTo write an image that boots from an SD card (assumed to be /dev/sdc): 91adfb2bfeSSimon Glass 92adfb2bfeSSimon Glass ./firefly-rk3288/tools/mkimage -T rksd -d firefly-rk3288/spl/u-boot-spl-dtb.bin out 93adfb2bfeSSimon Glass sudo dd if=out of=/dev/sdc 94adfb2bfeSSimon Glass sudo dd if=firefly-rk3288/u-boot-dtb.img of=/dev/sdc seek=256 95adfb2bfeSSimon Glass 96adfb2bfeSSimon GlassThis puts the Rockchip header and SPL image first and then places the U-Boot 97adfb2bfeSSimon Glassimage at block 256 (i.e. 128KB from the start of the SD card). This 98adfb2bfeSSimon Glasscorresponds with this setting in U-Boot: 99adfb2bfeSSimon Glass 100adfb2bfeSSimon Glass #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR 256 101adfb2bfeSSimon Glass 102adfb2bfeSSimon GlassPut this SD (or micro-SD) card into your board and reset it. You should see 103adfb2bfeSSimon Glasssomething like: 104adfb2bfeSSimon Glass 105adfb2bfeSSimon Glass U-Boot SPL 2015.07-rc1-00383-ge345740-dirty (Jun 03 2015 - 11:04:40) 106adfb2bfeSSimon Glass 107adfb2bfeSSimon Glass 108adfb2bfeSSimon Glass U-Boot 2015.07-rc1-00383-ge345740-dirty (Jun 03 2015 - 11:04:40) 109adfb2bfeSSimon Glass 110adfb2bfeSSimon Glass DRAM: 2 GiB 111adfb2bfeSSimon Glass MMC: 112adfb2bfeSSimon Glass Using default environment 113adfb2bfeSSimon Glass 114adfb2bfeSSimon Glass In: serial@ff690000 115adfb2bfeSSimon Glass Out: serial@ff690000 116adfb2bfeSSimon Glass Err: serial@ff690000 117adfb2bfeSSimon Glass => 118adfb2bfeSSimon Glass 119adfb2bfeSSimon Glass 120adfb2bfeSSimon GlassBooting from SPI 121adfb2bfeSSimon Glass================ 122adfb2bfeSSimon Glass 123adfb2bfeSSimon GlassTo write an image that boots from SPI flash (e.g. for the Haier Chromebook): 124adfb2bfeSSimon Glass 125adfb2bfeSSimon Glass ./chromebook_jerry/tools/mkimage -T rkspi -d chromebook_jerry/spl/u-boot-spl-dtb.bin out 126adfb2bfeSSimon Glass dd if=spl.bin of=out.bin bs=128K conv=sync 127adfb2bfeSSimon Glass cat chromebook_jerry/u-boot-dtb.img out.bin 128adfb2bfeSSimon Glass dd if=out.bin of=out.bin.pad bs=4M conv=sync 129adfb2bfeSSimon Glass 130adfb2bfeSSimon GlassThis converts the SPL image to the required SPI format by adding the Rockchip 131adfb2bfeSSimon Glassheader and skipping every 2KB block. Then the U-Boot image is written at 132adfb2bfeSSimon Glassoffset 128KB and the whole image is padded to 4MB which is the SPI flash size. 133adfb2bfeSSimon GlassThe position of U-Boot is controlled with this setting in U-Boot: 134adfb2bfeSSimon Glass 135adfb2bfeSSimon Glass #define CONFIG_SYS_SPI_U_BOOT_OFFS (128 << 10) 136adfb2bfeSSimon Glass 137adfb2bfeSSimon GlassIf you have a Dediprog em100pro connected then you can write the image with: 138adfb2bfeSSimon Glass 139adfb2bfeSSimon Glass sudo em100 -s -c GD25LQ32 -d out.bin.pad -r 140adfb2bfeSSimon Glass 141adfb2bfeSSimon GlassWhen booting you should see something like: 142adfb2bfeSSimon Glass 143adfb2bfeSSimon Glass U-Boot SPL 2015.07-rc2-00215-g9a58220-dirty (Jun 23 2015 - 12:11:32) 144adfb2bfeSSimon Glass 145adfb2bfeSSimon Glass 146adfb2bfeSSimon Glass U-Boot 2015.07-rc2-00215-g9a58220-dirty (Jun 23 2015 - 12:11:32 -0600) 147adfb2bfeSSimon Glass 148adfb2bfeSSimon Glass Model: Google Jerry 149adfb2bfeSSimon Glass DRAM: 2 GiB 150adfb2bfeSSimon Glass MMC: 151adfb2bfeSSimon Glass Using default environment 152adfb2bfeSSimon Glass 153adfb2bfeSSimon Glass In: serial@ff690000 154adfb2bfeSSimon Glass Out: serial@ff690000 155adfb2bfeSSimon Glass Err: serial@ff690000 156adfb2bfeSSimon Glass => 157adfb2bfeSSimon Glass 158adfb2bfeSSimon Glass 159adfb2bfeSSimon GlassFuture work 160adfb2bfeSSimon Glass=========== 161adfb2bfeSSimon Glass 162adfb2bfeSSimon GlassImmediate priorities are: 163adfb2bfeSSimon Glass 164adfb2bfeSSimon Glass- MMC support (in U-Boot itself) 165adfb2bfeSSimon Glass- GPIO (driver exists but is lightly tested) 166adfb2bfeSSimon Glass- I2C (driver exists but is non-functional) 167adfb2bfeSSimon Glass- USB host 168adfb2bfeSSimon Glass- USB device 169adfb2bfeSSimon Glass- PMIC and regulators (only ACT8846 is supported at present) 170adfb2bfeSSimon Glass- LCD and HDMI 171adfb2bfeSSimon Glass- Run CPU at full speed 172adfb2bfeSSimon Glass- Ethernet 173adfb2bfeSSimon Glass- NAND flash 174adfb2bfeSSimon Glass- Support for other Rockchip parts 175adfb2bfeSSimon Glass- Boot U-Boot proper over USB OTG (at present only SPL works) 176adfb2bfeSSimon Glass 177adfb2bfeSSimon Glass 178adfb2bfeSSimon GlassDevelopment Notes 179adfb2bfeSSimon Glass================= 180adfb2bfeSSimon Glass 181adfb2bfeSSimon GlassThere are plenty of patches in the links below to help with this work. 182adfb2bfeSSimon Glass 183adfb2bfeSSimon Glass[1] https://github.com/rkchrome/uboot.git 184adfb2bfeSSimon Glass[2] https://github.com/linux-rockchip/u-boot-rockchip.git branch u-boot-rk3288 185adfb2bfeSSimon Glass[3] https://github.com/linux-rockchip/rkflashtool.git 186adfb2bfeSSimon Glass[4] http://wiki.t-firefly.com/index.php/Firefly-RK3288/Serial_debug/en 187adfb2bfeSSimon Glass 188adfb2bfeSSimon Glassrkimage 189adfb2bfeSSimon Glass------- 190adfb2bfeSSimon Glass 191adfb2bfeSSimon Glassrkimage.c produces an SPL image suitable for sending directly to the boot ROM 192adfb2bfeSSimon Glassover USB OTG. This is a very simple format - just the string RK32 (as 4 bytes) 193adfb2bfeSSimon Glassfollowed by u-boot-spl-dtb.bin. 194adfb2bfeSSimon Glass 195adfb2bfeSSimon GlassThe boot ROM loads image to 0xff704000 which is in the internal SRAM. The SRAM 196adfb2bfeSSimon Glassstarts at 0xff700000 and extends to 0xff718000 where we put the stack. 197adfb2bfeSSimon Glass 198adfb2bfeSSimon Glassrksd 199adfb2bfeSSimon Glass---- 200adfb2bfeSSimon Glass 201adfb2bfeSSimon Glassrksd.c produces an image consisting of 32KB of empty space, a header and 202adfb2bfeSSimon Glassu-boot-spl-dtb.bin. The header is defined by 'struct header0_info' although 203adfb2bfeSSimon Glassmost of the fields are unused by U-Boot. We just need to specify the 204adfb2bfeSSimon Glasssignature, a flag and the block offset and size of the SPL image. 205adfb2bfeSSimon Glass 206adfb2bfeSSimon GlassThe header occupies a single block but we pad it out to 4 blocks. The header 207adfb2bfeSSimon Glassis encoding using RC4 with the key 7c4e0304550509072d2c7b38170d1711. The SPL 208adfb2bfeSSimon Glassimage can be encoded too but we don't do that. 209adfb2bfeSSimon Glass 210adfb2bfeSSimon GlassThe maximum size of u-boot-spl-dtb.bin which the boot ROM will read is 32KB, 211adfb2bfeSSimon Glassor 0x40 blocks. This is a severe and annoying limitation. There may be a way 212adfb2bfeSSimon Glassaround this limitation, since there is plenty of SRAM, but at present the 213adfb2bfeSSimon Glassboard refuses to boot if this limit is exceeded. 214adfb2bfeSSimon Glass 215adfb2bfeSSimon GlassThe image produced is padded up to a block boundary (512 bytes). It should be 216adfb2bfeSSimon Glasswritten to the start of an SD card using dd. 217adfb2bfeSSimon Glass 218adfb2bfeSSimon GlassSince this image is set to load U-Boot from the SD card at block offset, 219adfb2bfeSSimon GlassCONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR, dd should be used to write 220adfb2bfeSSimon Glassu-boot-dtb.img to the SD card at that offset. See above for instructions. 221adfb2bfeSSimon Glass 222adfb2bfeSSimon Glassrkspi 223adfb2bfeSSimon Glass----- 224adfb2bfeSSimon Glass 225adfb2bfeSSimon Glassrkspi.c produces an image consisting of a header and u-boot-spl-dtb.bin. The 226adfb2bfeSSimon Glassresulting image is then spread out so that only the first 2KB of each 4KB 227adfb2bfeSSimon Glasssector is used. The header is the same as with rksd and the maximum size is 228adfb2bfeSSimon Glassalso 32KB (before spreading). The image should be written to the start of 229adfb2bfeSSimon GlassSPI flash. 230adfb2bfeSSimon Glass 231adfb2bfeSSimon GlassSee above for instructions on how to write a SPI image. 232adfb2bfeSSimon Glass 233adfb2bfeSSimon Glass 234adfb2bfeSSimon GlassDevice tree and driver model 235adfb2bfeSSimon Glass---------------------------- 236adfb2bfeSSimon Glass 237adfb2bfeSSimon GlassWhere possible driver model is used to provide a structure to the 238adfb2bfeSSimon Glassfunctionality. Device tree is used for configuration. However these have an 239adfb2bfeSSimon Glassoverhead and in SPL with a 32KB size limit some shortcuts have been taken. 240adfb2bfeSSimon GlassIn general all Rockchip drivers should use these features, with SPL-specific 241adfb2bfeSSimon Glassmodifications where required. 242adfb2bfeSSimon Glass 243adfb2bfeSSimon Glass 244adfb2bfeSSimon Glass-- 245adfb2bfeSSimon GlassSimon Glass <sjg@chromium.org> 246adfb2bfeSSimon Glass24 June 2015 247