]>
Commit | Line | Data |
---|---|---|
eec3f024 BT |
1 | U-Boot for Freescale i.MX6 |
2 | ||
3 | This file contains information for the port of U-Boot to the Freescale i.MX6 | |
4 | SoC. | |
5 | ||
6 | 1. CONVENTIONS FOR FUSE ASSIGNMENTS | |
7 | ----------------------------------- | |
8 | ||
9 | 1.1 MAC Address: It is stored in fuse bank 4, with the 32 lsbs in word 2 and the | |
d4d1dd67 YL |
10 | 16 msbs in word 3[15:0]. |
11 | For i.MX6SX and i.MX6UL, they have two MAC addresses. The second MAC address | |
12 | is stored in fuse bank 4, with the 16 lsb in word 3[31:16] and the 32 msbs in | |
13 | word 4. | |
6f3bef9e FE |
14 | |
15 | Example: | |
16 | ||
17 | For reading the MAC address fuses on a MX6Q: | |
18 | ||
19 | - The MAC address is stored in two fuse addresses (the fuse addresses are | |
20 | described in the Fusemap Descriptions table from the mx6q Reference Manual): | |
21 | ||
22 | 0x620[31:0] - MAC_ADDR[31:0] | |
23 | 0x630[15:0] - MAC_ADDR[47:32] | |
24 | ||
25 | In order to use the fuse API, we need to pass the bank and word values, which | |
26 | are calculated as below: | |
27 | ||
28 | Fuse address for the lower MAC address: 0x620 | |
29 | Base address for the fuses: 0x400 | |
30 | ||
31 | (0x620 - 0x400)/0x10 = 0x22 = 34 decimal | |
32 | ||
33 | As the fuses are arranged in banks of 8 words: | |
34 | ||
35 | 34 / 8 = 4 and the remainder is 2, so in this case: | |
36 | ||
37 | bank = 4 | |
38 | word = 2 | |
39 | ||
a187559e | 40 | And the U-Boot command would be: |
6f3bef9e FE |
41 | |
42 | => fuse read 4 2 | |
43 | Reading bank 4: | |
44 | ||
45 | Word 0x00000002: 9f027772 | |
46 | ||
47 | Doing the same for the upper MAC address: | |
48 | ||
49 | Fuse address for the upper MAC address: 0x630 | |
50 | Base address for the fuses: 0x400 | |
51 | ||
52 | (0x630 - 0x400)/0x10 = 0x23 = 35 decimal | |
53 | ||
54 | As the fuses are arranged in banks of 8 words: | |
55 | ||
56 | 35 / 8 = 4 and the remainder is 3, so in this case: | |
57 | ||
58 | bank = 4 | |
59 | word = 3 | |
60 | ||
a187559e | 61 | And the U-Boot command would be: |
6f3bef9e FE |
62 | |
63 | => fuse read 4 3 | |
64 | Reading bank 4: | |
65 | ||
66 | Word 0x00000003: 00000004 | |
67 | ||
68 | ,which matches the ethaddr value: | |
69 | => echo ${ethaddr} | |
70 | 00:04:9f:02:77:72 | |
71 | ||
72 | Some other useful hints: | |
73 | ||
74 | - The 'bank' and 'word' numbers can be easily obtained from the mx6 Reference | |
75 | Manual. For the mx6quad case, please check the "46.5 OCOTP Memory Map/Register | |
76 | Definition" from the "i.MX 6Dual/6Quad Applications Processor Reference Manual, | |
77 | Rev. 1, 04/2013" document. For example, for the MAC fuses we have: | |
78 | ||
79 | Address: | |
80 | 21B_C620 Value of OTP Bank4 Word2 (MAC Address)(OCOTP_MAC0) | |
81 | ||
82 | 21B_C630 Value of OTP Bank4 Word3 (MAC Address)(OCOTP_MAC1) | |
83 | ||
84 | - The command '=> fuse read 4 2 2' reads the whole MAC addresses at once: | |
85 | ||
86 | => fuse read 4 2 2 | |
87 | Reading bank 4: | |
88 | ||
89 | Word 0x00000002: 9f027772 00000004 | |
40f4839c SB |
90 | |
91 | 2. Using imx_usb_loader for first install with SPL | |
92 | -------------------------------------------------- | |
93 | ||
112d59a1 | 94 | imx_usb_loader is a very nice tool by Boundary Devices that |
40f4839c SB |
95 | allow to install U-Boot without a JTAG debugger, using |
96 | the USB boot mode as described in the manual. It is | |
97 | a replacement for Freescale's MFGTOOLS. | |
98 | ||
99 | The sources can be found here: | |
100 | ||
101 | https://github.com/boundarydevices/imx_usb_loader.git | |
102 | ||
103 | Booting in USB mode, the i.MX6 announces itself to the Linux Host as: | |
104 | ||
105 | Bus 001 Device 111: ID 15a2:0061 Freescale Semiconductor, Inc. | |
106 | ||
107 | imx_usb_loader is able to download a single file (u-boot.imx) | |
108 | to the board. For boards without SPL support, it is enough to | |
109 | issue the command: | |
110 | ||
111 | sudo ../imx_usb_loader/imx_usb -v u-boot.imx | |
112 | ||
113 | Getting U-Boot when SPL support is active, it requires | |
114 | two downloads. imx_usb_loader downloads the SPL into | |
115 | OCRAM and starts it. SPL will check for a valid u-boot.img, and | |
116 | because it is not found, it will wait for it using the y-modem | |
117 | protocol via the console. | |
118 | ||
119 | A first install is then possible by combining imx_usb_loader with | |
120 | another tool such as kermit. | |
121 | ||
122 | sudo ../imx_usb_loader/imx_usb -v SPL | |
123 | kermit kermit_uboot | |
124 | ||
125 | and kermit_uboot contains something like this (set line should be adjusted): | |
126 | ||
127 | set line /dev/ttyUSB1 | |
128 | set speed 115200 | |
129 | SET CARRIER-WATCH OFF | |
130 | set flow-control none | |
131 | set handshake none | |
132 | set prefixing all | |
133 | set file type bin | |
134 | set protocol ymodem | |
135 | send u-boot.img | |
136 | c | |
137 | ||
138 | The last "c" command tells kermit (from ckermit package in most distros) | |
139 | to switch from command line mode to communication mode, and when the | |
140 | script is finished, the U-Boot prompt is shown in the same shell. | |
3de6c7fc SE |
141 | |
142 | 3. Using Secure Boot on i.MX6 machines with SPL support | |
143 | ------------------------------------------------------- | |
144 | ||
145 | This version of U-Boot is able to build a signable version of the SPL | |
146 | as well as a signable version of the U-Boot image. The signature can | |
147 | be verified through High Assurance Boot (HAB). | |
148 | ||
149 | CONFIG_SECURE_BOOT is needed to build those two binaries. | |
150 | After building, you need to create a command sequence file and use | |
151 | Freescales Code Signing Tool to sign both binaries. After creation, | |
152 | the mkimage tool outputs the required information about the HAB Blocks | |
1f6a6648 SE |
153 | parameter for the CSF. During the build, the information is preserved |
154 | in log files named as the binaries. (SPL.log and u-boot-ivt.log). | |
3de6c7fc SE |
155 | |
156 | More information about the CSF and HAB can be found in the AN4581. | |
157 | https://cache.freescale.com/files/32bit/doc/app_note/AN4581.pdf | |
158 | ||
159 | We don't want to explain how to create a PKI tree or SRK table as | |
160 | this is well explained in the Application Note. | |
161 | ||
162 | Example Output of the SPL (imximage) creation: | |
163 | Image Type: Freescale IMX Boot Image | |
164 | Image Ver: 2 (i.MX53/6/7 compatible) | |
165 | Mode: DCD | |
166 | Data Size: 61440 Bytes = 60.00 kB = 0.06 MB | |
167 | Load Address: 00907420 | |
168 | Entry Point: 00908000 | |
169 | HAB Blocks: 00907400 00000000 0000cc00 | |
170 | ||
171 | Example Output of the u-boot-ivt.img (firmware_ivt) creation: | |
172 | Image Name: U-Boot 2016.11-rc1-31589-g2a4411 | |
173 | Created: Sat Nov 5 21:53:28 2016 | |
174 | Image Type: ARM U-Boot Firmware with HABv4 IVT (uncompressed) | |
175 | Data Size: 352192 Bytes = 343.94 kB = 0.34 MB | |
176 | Load Address: 17800000 | |
177 | Entry Point: 00000000 | |
178 | HAB Blocks: 0x177fffc0 0x0000 0x00054020 | |
179 | ||
180 | The CST (Code Signing Tool) can be downloaded from NXP. | |
181 | # Compile CSF and create signature | |
182 | ./cst --o csf-u-boot.bin < command_sequence_uboot.csf | |
183 | ./cst --o csf-SPL.bin < command_sequence_spl.csf | |
184 | # Append compiled CSF to Binary | |
185 | cat SPL csf-SPL.bin > SPL-signed | |
186 | cat u-boot-ivt.img csf-u-boot.bin > u-boot-signed.img | |
187 | ||
188 | These two signed binaries can be used on an i.MX6 in closed | |
189 | configuration when the according SRK Table Hash has been flashed. |