1.. SPDX-License-Identifier: GPL-2.0+
2
3U-Boot for Khadas VIM3L
4=======================
5
6Khadas VIM3L is a single board computer manufactured by Shenzhen Wesion
7Technology Co., Ltd. with the following specifications:
8
9 - Amlogic S905D3 Arm Cortex-A55 quad-core SoC
10 - 2GB LPDDR4 SDRAM
11 - Gigabit Ethernet
12 - HDMI 2.1 display
13 - 40-pin GPIO header
14 - 1 x USB 3.0 Host, 1 x USB 2.0 Host
15 - eMMC, microSD
16 - M.2
17 - Infrared receiver
18
19Schematics are available on the manufacturer website.
20
21PCIe Setup
22----------
23The VIM3 on-board  MCU can mux the PCIe/USB3.0 shared differential
24lines using a FUSB340TMX USB 3.1 SuperSpeed Data Switch between
25an USB3.0 Type A connector and a M.2 Key M slot.
26The PHY driving these differential lines is shared between
27the USB3.0 controller and the PCIe Controller, thus only
28a single controller can use it.
29
30To setup for PCIe, run the following commands from U-Boot:
31
32.. code-block:: none
33
34    i2c dev i2c@5000
35    i2c mw 0x18 0x33 1
36
37Then power-cycle the board.
38
39To set back to USB3.0, run the following commands from U-Boot:
40
41.. code-block:: none
42
43    i2c dev i2c@5000
44    i2c mw 0x18 0x33 0
45
46Then power-cycle the board.
47
48U-Boot compilation
49------------------
50
51.. code-block:: bash
52
53    $ export CROSS_COMPILE=aarch64-none-elf-
54    $ make khadas-vim3l_defconfig
55    $ make
56
57Image creation
58--------------
59
60Amlogic doesn't provide sources for the firmware and for tools needed
61to create the bootloader image, so it is necessary to obtain them from
62the git tree published by the board vendor:
63
64.. code-block:: bash
65
66    $ wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
67    $ wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
68    $ tar xvfJ gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
69    $ tar xvfJ gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
70    $ export PATH=$PWD/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux/bin:$PWD/gcc-linaro-arm-none-eabi-4.8-2013.11_linux/bin:$PATH
71
72    $ DIR=vim3l-u-boot
73    $ git clone --depth 1 \
74       https://github.com/khadas/u-boot.git -b khadas-vims-v2015.01 \
75       $DIR
76
77    $ cd vim3l-u-boot
78    $ make kvim3l_defconfig
79    $ make CROSS_COMPILE=aarch64-none-elf-
80    $ export UBOOTDIR=$PWD
81
82Go back to mainline U-Boot source tree then :
83
84.. code-block:: bash
85
86    $ mkdir fip
87
88    $ wget https://github.com/BayLibre/u-boot/releases/download/v2017.11-libretech-cc/blx_fix_g12a.sh -O fip/blx_fix.sh
89    $ cp $UBOOTDIR/build/scp_task/bl301.bin fip/
90    $ cp $UBOOTDIR/build/board/khadas/kvim3l/firmware/acs.bin fip/
91    $ cp $UBOOTDIR/fip/g12a/bl2.bin fip/
92    $ cp $UBOOTDIR/fip/g12a/bl30.bin fip/
93    $ cp $UBOOTDIR/fip/g12a/bl31.img fip/
94    $ cp $UBOOTDIR/fip/g12a/ddr3_1d.fw fip/
95    $ cp $UBOOTDIR/fip/g12a/ddr4_1d.fw fip/
96    $ cp $UBOOTDIR/fip/g12a/ddr4_2d.fw fip/
97    $ cp $UBOOTDIR/fip/g12a/diag_lpddr4.fw fip/
98    $ cp $UBOOTDIR/fip/g12a/lpddr3_1d.fw fip/
99    $ cp $UBOOTDIR/fip/g12a/lpddr4_1d.fw fip/
100    $ cp $UBOOTDIR/fip/g12a/lpddr4_2d.fw fip/
101    $ cp $UBOOTDIR/fip/g12a/piei.fw fip/
102    $ cp $UBOOTDIR/fip/g12a/aml_ddr.fw fip/
103    $ cp u-boot.bin fip/bl33.bin
104
105    $ bash fip/blx_fix.sh \
106    	fip/bl30.bin \
107    	fip/zero_tmp \
108    	fip/bl30_zero.bin \
109    	fip/bl301.bin \
110    	fip/bl301_zero.bin \
111    	fip/bl30_new.bin \
112    	bl30
113
114    $ bash fip/blx_fix.sh \
115    	fip/bl2.bin \
116    	fip/zero_tmp \
117    	fip/bl2_zero.bin \
118    	fip/acs.bin \
119    	fip/bl21_zero.bin \
120    	fip/bl2_new.bin \
121    	bl2
122
123    $ $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl30sig --input fip/bl30_new.bin \
124    					--output fip/bl30_new.bin.g12a.enc \
125    					--level v3
126    $ $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl3sig --input fip/bl30_new.bin.g12a.enc \
127    					--output fip/bl30_new.bin.enc \
128    					--level v3 --type bl30
129    $ $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl3sig --input fip/bl31.img \
130    					--output fip/bl31.img.enc \
131    					--level v3 --type bl31
132    $ $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl3sig --input fip/bl33.bin --compress lz4 \
133    					--output fip/bl33.bin.enc \
134    					--level v3 --type bl33 --compress lz4
135    $ $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl2sig --input fip/bl2_new.bin \
136    					--output fip/bl2.n.bin.sig
137    $ $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bootmk \
138    		--output fip/u-boot.bin \
139    		--bl2 fip/bl2.n.bin.sig \
140    		--bl30 fip/bl30_new.bin.enc \
141    		--bl31 fip/bl31.img.enc \
142    		--bl33 fip/bl33.bin.enc \
143    		--ddrfw1 fip/ddr4_1d.fw \
144    		--ddrfw2 fip/ddr4_2d.fw \
145    		--ddrfw3 fip/ddr3_1d.fw \
146    		--ddrfw4 fip/piei.fw \
147    		--ddrfw5 fip/lpddr4_1d.fw \
148    		--ddrfw6 fip/lpddr4_2d.fw \
149    		--ddrfw7 fip/diag_lpddr4.fw \
150    		--ddrfw8 fip/aml_ddr.fw \
151    		--ddrfw9 fip/lpddr3_1d.fw \
152    		--level v3
153
154and then write the image to SD with:
155
156.. code-block:: bash
157
158    $ DEV=/dev/your_sd_device
159    $ dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=512 skip=1 seek=1
160    $ dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=1 count=444
161