| U-Boot for Odroid X2/U3/XU3/XU4/HC1 | |
| ======================== | |
| 1. Summary | |
| ========== | |
| This is a quick instruction for setup Odroid boards. | |
| Board config: odroid_config for X2/U3 | |
| Board config: odroid-xu3_config for XU3/XU4/HC1 | |
| 2. Supported devices | |
| ==================== | |
| This U-BOOT config can be used on three boards: | |
| - Odroid U3 | |
| - Odroid X2 | |
| with CPU Exynos 4412 rev 2.0 and 2GB of RAM | |
| - Odroid XU3 | |
| - Odroid XU4 | |
| - Odroid HC1 | |
| with CPU Exynos5422 and 2GB of RAM | |
| 3. Boot sequence | |
| ================ | |
| iROM->BL1->(BL2 + TrustZone)->U-BOOT | |
| This version of U-BOOT doesn't implement SPL. So, BL1, BL2, and TrustZone | |
| binaries are needed to boot up. | |
| << X2/U3 >> | |
| It can be found in "boot.tar.gz" from here: | |
| http://dev.odroid.com/projects/4412boot/wiki/FrontPage?action=download&value=boot.tar.gz | |
| or here: | |
| http://odroid.in/guides/ubuntu-lfs/boot.tar.gz | |
| << XU3/XU4 >> | |
| It can be downloaded from: | |
| https://github.com/hardkernel/u-boot/tree/odroidxu3-v2012.07/sd_fuse/hardkernel_1mb_uboot | |
| 4. Boot media layout | |
| ==================== | |
| The table below shows SD/eMMC cards layout for U-Boot. | |
| The block offset is starting from 0 and the block size is 512B. | |
| ------------------------------------- | |
| | Binary | Block offset| part type | | |
| | name | SD | eMMC |(eMMC only)| | |
| ------------------------------------- | |
| | Bl1 | 1 | 0 | 1 (boot) | | |
| | Bl2 | 31 | 30 | 1 (boot) | | |
| | U-Boot | 63 | 62 | 1 (boot) | | |
| | Tzsw | 2111 | 2110 | 1 (boot) | | |
| | Uboot Env | 2560 | 2560 | 0 (user) | | |
| ------------------------------------- | |
| 5. Prepare the SD boot card - with SD card reader | |
| ================================================= | |
| To prepare bootable media you need boot binaries provided by hardkernel. | |
| From the downloaded files, You can find: | |
| - bl1.bin | |
| - tzsw.bin | |
| - bl2.bin | |
| - sd_fusing.sh | |
| - u-boot.bin | |
| (The file names can be slightly different, but you can distinguish what they are | |
| without problem) | |
| This is all you need to boot this board. But if you want to use your custom | |
| U-Boot then you need to change u-boot.bin with your own U-Boot binary* | |
| and run the script "sd_fusing.sh" - this script is valid only for SD card. | |
| *note: | |
| The proper binary file of current U-Boot is u-boot-dtb.bin. | |
| quick steps for Linux: | |
| - Download all files from the link at point 3 and extract it if needed. | |
| - put any SD card into the SD reader | |
| - check the device with "dmesg" | |
| - run ./sd_fusing.sh /dev/sdX - where X is SD card device (but not a partition) | |
| Check if Hardkernel U-Boot is booting, and next do the same with your U-Boot. | |
| 6. Prepare the eMMC boot card | |
| with a eMMC card reader (boot from eMMC card slot) | |
| ===================================================== | |
| To boot the device from the eMMC slot you should use a special card reader | |
| which supports eMMC partition switch. All of the boot binaries are stored | |
| on the eMMC boot partition which is normally hidden. | |
| The "sd_fusing.sh" script can be used after updating offsets of binaries | |
| according to the table from point 4. Be sure that you are working on the right | |
| eMMC partition - its size is usually very small, about 1-4 MiB. | |
| 7. Prepare the eMMC boot card | |
| with a SD card reader (boot from SD card slot) | |
| ================================================= | |
| If you have an eMMC->microSD adapter you can prepare the card as in point 5. | |
| But then the device can boot only from the SD card slot. | |
| 8. Prepare the boot media using Hardkernel U-Boot | |
| ================================================= | |
| You can update the U-Boot to the custom one if you have a working bootloader | |
| delivered with the board on the eMMC/SD card. Then follow the steps: | |
| - install the android fastboot tool | |
| - connect a micro usb cable to the board | |
| - on the U-Boot prompt, run command: fastboot (as a root) | |
| - on the host, run command: "fastboot flash bootloader u-boot-dtb.bin" | |
| - the custom U-Boot should start after the board resets. | |
| 9. Partition layout | |
| ==================== | |
| Default U-Boot environment is setup for fixed partition layout. | |
| Partition table: MSDOS. Disk layout and files as listed in the table below. | |
| ----- ------ ------ ------ -------- --------------------------------- | |
| | Num | Name | FS | Size | Offset | Reguired files | | |
| | | | Type | MiB | MiB | | | |
| ----- ------ ------ ------ -------- --------------------------------- | |
| | 1 | BOOT | fat | 100 | 2 | kernel, fdt** | | |
| | 2 | ROOT | ext4 | - | | any Linux system | | |
| ----- ------ ------ ------ -------- --------------------------------- | |
| **note: | |
| Supported fdt files are: | |
| - exynos4412-odroidx2.dtb | |
| - exynos4412-odroidu3.dtb | |
| - exynos5422-odroidxu3.dtb | |
| - exynos5422-odroidxu3-lite.dtb | |
| - exynos5422-odroidxu4.dtb | |
| - exynos5422-odroidhc1.dtb | |
| Supported kernel files are: | |
| - Image.itb | |
| - zImage | |
| - uImage | |
| The default environmental variable "dfu_alt_info" is set* for above layout. | |
| Each partition size is just an example, dfu_alt_info tries init two partitions. | |
| The size of each is not important. | |
| *note: | |
| $dfu_alt_info is set on a boot time and it is concatenated using two variables: | |
| - $dfu_alt_boot(set dynamically) | |
| - $dfu_alt_system(from current env). | |
| To add any changes to dfu_alt_info - please modify $dfu_alt_system only. | |
| Changes are visible after board reset. | |
| 10. The environment and booting the kernel | |
| ========================================== | |
| There are three macros defined in config for various boot options: | |
| Two for both, kernel with device tree support and also without it: | |
| - boot_uimg - load uImage | |
| - boot_zimg - load zImage | |
| If proper fdt file exists then it will be automatically loaded, | |
| so for old kernel types, please remove fdt file from boot partition. | |
| The third boot option for multi image support (more info: doc/usage/fit/) | |
| - boot_fit - for binary file: "Image.itb" | |
| Default boot command: "autoboot" | |
| And the boot sequence is: | |
| - boot_fit - if "Image.itb" exists | |
| - boot_zimg - if "zImage" exists | |
| - boot_uimg - if "uImage" exists | |
| 11. USB host support | |
| ==================== | |
| NOTE: This section is only for Odroid X2/U3. | |
| The ethernet can be accessed after starting the USB subsystem in U-Boot. | |
| The adapter does not come with a preconfigured MAC address, and hence it needs | |
| to be set before starting USB. | |
| setenv usbethaddr 02:DE:AD:BE:EF:FF | |
| Note that in this example a locally managed MAC address is chosen. Care should | |
| be taken to make these MAC addresses unique within the same subnet. | |
| Start the USB subsystem: | |
| Odroid # setenv usbethaddr 02:DE:AD:BE:EF:FF | |
| Odroid # usb start | |
| (Re)start USB... | |
| USB0: USB EHCI 1.00 | |
| scanning bus 0 for devices... 4 USB Device(s) found | |
| scanning usb for storage devices... 1 Storage Device(s) found | |
| scanning usb for ethernet devices... 1 Ethernet Device(s) found | |
| Odroid # | |
| Automatic IP assignment: | |
| ------------------------ | |
| If the ethernet is connected to a DHCP server (router maybe with DHCP enabled), | |
| then the below will automatically assign an ip address through DHCP. | |
| setenv autoload no | |
| dhcp | |
| Odroid # setenv autoload no | |
| Odroid # dhcp | |
| Waiting for Ethernet connection... done. | |
| BOOTP broadcast 1 | |
| DHCP client bound to address 192.168.1.10 (524 ms) | |
| Odroid # | |
| Note that this automatically sets the many IP address related variables in | |
| U-Boot that is obtained from the DHCP server. | |
| Odroid # printenv ipaddr netmask gatewayip dnsip | |
| ipaddr=192.168.1.10 | |
| netmask=255.255.255.0 | |
| gatewayip=192.168.1.1 | |
| dnsip=192.168.1.1 | |
| Ping example: | |
| The ping command can be used a test to check connectivity. In this example, | |
| 192.168.1.27 is a pingable server in the network. | |
| Odroid # ping 192.168.1.27 | |
| Waiting for Ethernet connection... done. | |
| Using sms0 device | |
| host 192.168.1.27 is alive | |
| Odroid # | |
| Static IP assignment: | |
| --------------------- | |
| In the case where there are no DHCP servers in the network, or you want to | |
| set the IP address statically, it can be done by: | |
| Odroid # setenv ipaddr 192.168.1.10 | |
| Odroid # ping 192.168.1.27 | |
| Waiting for Ethernet connection... done. | |
| Using sms0 device | |
| host 192.168.1.27 is alive | |
| TFTP booting: | |
| ------------- | |
| Say there exists a tftp server in the network with address 192.168.1.27 and | |
| it serves a kernel image (zImage.3.17) and a DTB blob (exynos4412-odroidu3.dtb) | |
| that needs to be loaded and booted. It can be accomplished as below: | |
| (Assumes that you have setenv usbethaddr, and have not set autoload to no) | |
| Odroid # setenv serverip 192.168.1.27 | |
| Odroid # tftpboot 0x40080000 zImage.3.17 | |
| Waiting for Ethernet connection... done. | |
| Using sms0 device | |
| TFTP from server 192.168.1.27; our IP address is 192.168.1.10 | |
| Filename 'zImage.3.17'. | |
| Load address: 0x40080000 | |
| Loading: ################################################################# | |
| ################################################################# | |
| ################################################################# | |
| ####################### | |
| 52.7 KiB/s | |
| done | |
| Bytes transferred = 3194200 (30bd58 hex) | |
| Odroid # tftpboot 0x42000000 exynos4412-odroidu3.dtb | |
| Waiting for Ethernet connection... done. | |
| Using sms0 device | |
| TFTP from server 192.168.1.27; our IP address is 192.168.1.10 | |
| Filename 'exynos4412-odroidu3.dtb'. | |
| Load address: 0x42000000 | |
| Loading: #### | |
| 40 KiB/s | |
| done | |
| Bytes transferred = 46935 (b757 hex) | |
| Odroid # printenv bootargs | |
| bootargs=Please use defined boot | |
| Odroid # setenv bootargs console=ttySAC1,115200n8 root=/dev/mmcblk0p2 rootwait | |
| Odroid # bootz 40080000 - 42000000 | |
| Kernel image @ 0x40080000 [ 0x000000 - 0x30bd58 ] | |
| ## Flattened Device Tree blob at 42000000 | |
| Booting using the fdt blob at 0x42000000 | |
| Loading Device Tree to 4fff1000, end 4ffff756 ... OK | |
| Starting kernel ... | |
| [ 0.000000] Booting Linux on physical CPU 0xa00 | |
| ... etc ... | |
| In the above example you can substitute 'dhcp' for 'tftpboot' as well. | |
| USB Storage booting: | |
| -------------------- | |
| Similarly we can use the USB storage to load the kernel image/initrd/fdt etc | |
| and boot. For this example, there is a USB drive plugged in. It has a FAT | |
| 1st partition and an EXT 2nd partition. Using the generic FS (ls/load) makes | |
| it even easier to work with FAT/EXT file systems. | |
| For this example the second EXT partition is used for booting and as rootfs. | |
| The boot files - kernel and the dtb are present in the /boot directory of the | |
| second partition. | |
| Odroid # usb start | |
| (Re)start USB... | |
| USB0: USB EHCI 1.00 | |
| scanning bus 0 for devices... 4 USB Device(s) found | |
| scanning usb for storage devices... 1 Storage Device(s) found | |
| scanning usb for ethernet devices... | |
| Error: sms0 address not set. <----- Note the error as usbethaddr | |
| Warning: failed to set MAC address <----- is not set. | |
| 1 Ethernet Device(s) found | |
| Odroid # usb part 0 | |
| Partition Map for USB device 0 -- Partition Type: DOS | |
| Part Start Sector Num Sectors UUID Type | |
| 1 3072 263168 000c4046-01 06 | |
| 2 266240 13457408 000c4046-02 83 | |
| Odroid # ls usb 0:2 /boot | |
| <DIR> 4096 . | |
| <DIR> 4096 .. | |
| 353 boot.scr | |
| 281 boot.txt | |
| 101420 config-3.8.13.23 | |
| 2127254 initrd.img-3.8.13.23 | |
| 2194825 uInitrd | |
| 2194825 uInitrd-3.8.13.23 | |
| 2453112 zImage | |
| 101448 config-3.8.13.26 | |
| 2127670 uInitrd-3.8.13.26 | |
| 2127606 initrd.img-3.8.13.26 | |
| 3194200 zImage.3.17 <--- Kernel | |
| 46935 exynos4412-odroidu3.dtb <--- DTB | |
| Odroid # load usb 0:2 40080000 /boot/zImage.3.17 | |
| 3194200 bytes read in 471 ms (6.5 MiB/s) | |
| Odroid # load usb 0:2 42000000 /boot/exynos4412-odroidu3.dtb | |
| 46935 bytes read in 233 ms (196.3 KiB/s) | |
| Odroid # setenv bootargs console=ttySAC1,115200n8 root=/dev/sda2 rootwait | |
| Odroid # bootz 40080000 - 42000000 | |
| Kernel image @ 0x40080000 [ 0x000000 - 0x30bd58 ] | |
| ## Flattened Device Tree blob at 42000000 | |
| Booting using the fdt blob at 0x42000000 | |
| Loading Device Tree to 4fff1000, end 4ffff756 ... OK | |
| Starting kernel ... | |
| [ 0.000000] Booting Linux on physical CPU 0xa00 | |
| Please refer to README.usb for additional information. |