OpenWrt – Blame information for rev 2
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | From 6af0148a38b23ba761905f98a7211fab986033ce Mon Sep 17 00:00:00 2001 |
2 | From: Michael Heimpold <mhei@heimpold.de> |
||
3 | Date: Thu, 13 Sep 2018 21:40:19 +0200 |
||
4 | Subject: [PATCH] arm: mxs: add support for I2SE's Duckbill boards |
||
5 | |||
6 | The Duckbill devices are small, pen-drive sized boards based on |
||
7 | NXP's i.MX28 SoC. While the initial variants (Duckbill series) were |
||
8 | equipped with a micro SD card slot only, the latest generation |
||
9 | (Duckbill 2 series) have an additional internal eMMC onboard. |
||
10 | |||
11 | Both device generations consist of four "family members": |
||
12 | |||
13 | - Duckbill/Duckbill 2: generic board, intended to be used as |
||
14 | baseboard for custom designs and/or as development board |
||
15 | |||
16 | - Duckbill EnOcean/Duckbill 2 EnOcean: come with an EnOcean |
||
17 | daugther board equipped with the popular TCM310 module |
||
18 | |||
19 | - Duckbill 485/Duckbill 2 485: as the name implies, these |
||
20 | devices are intended to be used as Ethernet - RS485 converters |
||
21 | |||
22 | - Duckbill SPI/Duckbill 2 SPI: not sold separately, but used |
||
23 | in I2SE's development kits for Green PHY HomePlug Powerline |
||
24 | communication |
||
25 | |||
26 | Signed-off-by: Michael Heimpold <mhei@heimpold.de> |
||
27 | Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com> |
||
28 | --- |
||
29 | arch/arm/mach-imx/mxs/Kconfig | 5 + |
||
30 | board/i2se/duckbill/Kconfig | 15 +++ |
||
31 | board/i2se/duckbill/MAINTAINERS | 6 ++ |
||
32 | board/i2se/duckbill/Makefile | 10 ++ |
||
33 | board/i2se/duckbill/duckbill.c | 186 ++++++++++++++++++++++++++++++++ |
||
34 | board/i2se/duckbill/iomux.c | 156 +++++++++++++++++++++++++++ |
||
35 | configs/duckbill_defconfig | 38 +++++++ |
||
36 | include/configs/duckbill.h | 179 ++++++++++++++++++++++++++++++ |
||
37 | 8 files changed, 595 insertions(+) |
||
38 | create mode 100644 board/i2se/duckbill/Kconfig |
||
39 | create mode 100644 board/i2se/duckbill/MAINTAINERS |
||
40 | create mode 100644 board/i2se/duckbill/Makefile |
||
41 | create mode 100644 board/i2se/duckbill/duckbill.c |
||
42 | create mode 100644 board/i2se/duckbill/iomux.c |
||
43 | create mode 100644 configs/duckbill_defconfig |
||
44 | create mode 100644 include/configs/duckbill.h |
||
45 | |||
46 | diff --git a/arch/arm/mach-imx/mxs/Kconfig b/arch/arm/mach-imx/mxs/Kconfig |
||
47 | index 68072d5a1f..82aaa3ef76 100644 |
||
48 | --- a/arch/arm/mach-imx/mxs/Kconfig |
||
49 | +++ b/arch/arm/mach-imx/mxs/Kconfig |
||
50 | @@ -50,6 +50,10 @@ config TARGET_APX4DEVKIT |
||
51 | config TARGET_BG0900 |
||
52 | bool "Support bg0900" |
||
53 | |||
54 | +config TARGET_DUCKBILL |
||
55 | + bool "Support duckbill" |
||
56 | + select BOARD_EARLY_INIT_F |
||
57 | + |
||
58 | config TARGET_MX28EVK |
||
59 | bool "Support mx28evk" |
||
60 | select BOARD_EARLY_INIT_F |
||
61 | @@ -67,6 +71,7 @@ config SYS_SOC |
||
62 | |||
63 | source "board/bluegiga/apx4devkit/Kconfig" |
||
64 | source "board/freescale/mx28evk/Kconfig" |
||
65 | +source "board/i2se/duckbill/Kconfig" |
||
66 | source "board/ppcag/bg0900/Kconfig" |
||
67 | source "board/schulercontrol/sc_sps_1/Kconfig" |
||
68 | source "board/technologic/ts4600/Kconfig" |
||
69 | diff --git a/board/i2se/duckbill/Kconfig b/board/i2se/duckbill/Kconfig |
||
70 | new file mode 100644 |
||
71 | index 0000000000..98c1e4689f |
||
72 | --- /dev/null |
||
73 | +++ b/board/i2se/duckbill/Kconfig |
||
74 | @@ -0,0 +1,15 @@ |
||
75 | +if TARGET_DUCKBILL |
||
76 | + |
||
77 | +config SYS_BOARD |
||
78 | + default "duckbill" |
||
79 | + |
||
80 | +config SYS_VENDOR |
||
81 | + default "i2se" |
||
82 | + |
||
83 | +config SYS_SOC |
||
84 | + default "mxs" |
||
85 | + |
||
86 | +config SYS_CONFIG_NAME |
||
87 | + default "duckbill" |
||
88 | + |
||
89 | +endif |
||
90 | diff --git a/board/i2se/duckbill/MAINTAINERS b/board/i2se/duckbill/MAINTAINERS |
||
91 | new file mode 100644 |
||
92 | index 0000000000..5496baa330 |
||
93 | --- /dev/null |
||
94 | +++ b/board/i2se/duckbill/MAINTAINERS |
||
95 | @@ -0,0 +1,6 @@ |
||
96 | +I2SE DUCKBILL BOARD |
||
97 | +M: Michael Heimpold <mhei@heimpold.de> |
||
98 | +S: Maintained |
||
99 | +F: board/i2se/duckbill/ |
||
100 | +F: include/configs/duckbill.h |
||
101 | +F: configs/duckbill_defconfig |
||
102 | diff --git a/board/i2se/duckbill/Makefile b/board/i2se/duckbill/Makefile |
||
103 | new file mode 100644 |
||
104 | index 0000000000..0079eb413c |
||
105 | --- /dev/null |
||
106 | +++ b/board/i2se/duckbill/Makefile |
||
107 | @@ -0,0 +1,10 @@ |
||
108 | +# SPDX-License-Identifier: GPL-2.0+ |
||
109 | +# |
||
110 | +# (C) Copyright 2014-2019 |
||
111 | +# Michael Heimpold, mhei@heimpold.de. |
||
112 | + |
||
113 | +ifndef CONFIG_SPL_BUILD |
||
114 | +obj-y := duckbill.o |
||
115 | +else |
||
116 | +obj-y := iomux.o |
||
117 | +endif |
||
118 | diff --git a/board/i2se/duckbill/duckbill.c b/board/i2se/duckbill/duckbill.c |
||
119 | new file mode 100644 |
||
120 | index 0000000000..f93c372611 |
||
121 | --- /dev/null |
||
122 | +++ b/board/i2se/duckbill/duckbill.c |
||
123 | @@ -0,0 +1,186 @@ |
||
124 | +// SPDX-License-Identifier: GPL-2.0+ |
||
125 | +/* |
||
126 | + * I2SE Duckbill board |
||
127 | + * |
||
128 | + * (C) Copyright 2014-2019 Michael Heimpold <mhei@heimpold.de> |
||
129 | + */ |
||
130 | + |
||
131 | +#include <common.h> |
||
132 | +#include <asm/gpio.h> |
||
133 | +#include <asm/io.h> |
||
134 | +#include <asm/arch/imx-regs.h> |
||
135 | +#include <asm/arch/iomux-mx28.h> |
||
136 | +#include <asm/arch/clock.h> |
||
137 | +#include <asm/arch/sys_proto.h> |
||
138 | +#include <asm/setup.h> |
||
139 | +#include <fdt_support.h> |
||
140 | +#include <linux/mii.h> |
||
141 | +#include <miiphy.h> |
||
142 | +#include <netdev.h> |
||
143 | +#include <errno.h> |
||
144 | +#include <fuse.h> |
||
145 | + |
||
146 | +DECLARE_GLOBAL_DATA_PTR; |
||
147 | + |
||
148 | +static u32 system_rev; |
||
149 | +static u32 serialno; |
||
150 | + |
||
151 | +/* |
||
152 | + * Functions |
||
153 | + */ |
||
154 | +int board_early_init_f(void) |
||
155 | +{ |
||
156 | + /* IO0 clock at 480MHz */ |
||
157 | + mxs_set_ioclk(MXC_IOCLK0, 480000); |
||
158 | + /* IO1 clock at 480MHz */ |
||
159 | + mxs_set_ioclk(MXC_IOCLK1, 480000); |
||
160 | + |
||
161 | + /* SSP0 clock at 96MHz */ |
||
162 | + mxs_set_sspclk(MXC_SSPCLK0, 96000, 0); |
||
163 | + |
||
164 | + return 0; |
||
165 | +} |
||
166 | + |
||
167 | +int dram_init(void) |
||
168 | +{ |
||
169 | + return mxs_dram_init(); |
||
170 | +} |
||
171 | + |
||
172 | +int board_init(void) |
||
173 | +{ |
||
174 | + /* Adress of boot parameters */ |
||
175 | + gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; |
||
176 | + |
||
177 | + return 0; |
||
178 | +} |
||
179 | + |
||
180 | +#ifdef CONFIG_CMD_MMC |
||
181 | +int board_mmc_init(bd_t *bis) |
||
182 | +{ |
||
183 | + return mxsmmc_initialize(bis, 0, NULL, NULL); |
||
184 | +} |
||
185 | +#endif |
||
186 | + |
||
187 | +#ifdef CONFIG_CMD_NET |
||
188 | +int board_eth_init(bd_t *bis) |
||
189 | +{ |
||
190 | + unsigned int reset_gpio; |
||
191 | + int ret; |
||
192 | + |
||
193 | + ret = cpu_eth_init(bis); |
||
194 | + |
||
195 | + if (system_rev == 1) |
||
196 | + reset_gpio = MX28_PAD_SSP0_DATA7__GPIO_2_7; |
||
197 | + else |
||
198 | + reset_gpio = MX28_PAD_GPMI_ALE__GPIO_0_26; |
||
199 | + |
||
200 | + /* Reset PHY */ |
||
201 | + gpio_direction_output(reset_gpio, 0); |
||
202 | + udelay(200); |
||
203 | + gpio_set_value(reset_gpio, 1); |
||
204 | + |
||
205 | + /* give PHY some time to get out of the reset */ |
||
206 | + udelay(10000); |
||
207 | + |
||
208 | + ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE); |
||
209 | + if (ret) { |
||
210 | + puts("FEC MXS: Unable to init FEC\n"); |
||
211 | + return ret; |
||
212 | + } |
||
213 | + |
||
214 | + return ret; |
||
215 | +} |
||
216 | + |
||
217 | +void mx28_adjust_mac(int dev_id, unsigned char *mac) |
||
218 | +{ |
||
219 | + mac[0] = 0x00; |
||
220 | + mac[1] = 0x01; |
||
221 | + mac[2] = 0x87; |
||
222 | +} |
||
223 | +#endif |
||
224 | + |
||
225 | +#ifdef CONFIG_OF_BOARD_SETUP |
||
226 | +int ft_board_setup(void *blob, bd_t *bd) |
||
227 | +{ |
||
228 | + uint8_t enetaddr[6]; |
||
229 | + u32 mac = 0; |
||
230 | + |
||
231 | +#ifdef CONFIG_MXS_OCOTP |
||
232 | + /* only Duckbill SPI has a MAC for the QCA7k */ |
||
233 | + fuse_read(0, 1, &mac); |
||
234 | +#endif |
||
235 | + |
||
236 | + if (mac != 0) { |
||
237 | + enetaddr[0] = 0x00; |
||
238 | + enetaddr[1] = 0x01; |
||
239 | + enetaddr[2] = 0x87; |
||
240 | + enetaddr[3] = (mac >> 16) & 0xff; |
||
241 | + enetaddr[4] = (mac >> 8) & 0xff; |
||
242 | + enetaddr[5] = mac & 0xff; |
||
243 | + |
||
244 | + fdt_find_and_setprop(blob, "spi1/ethernet@0", |
||
245 | + "local-mac-address", enetaddr, 6, 1); |
||
246 | + } |
||
247 | + |
||
248 | + return 0; |
||
249 | +} |
||
250 | +#endif |
||
251 | + |
||
252 | +#ifdef CONFIG_REVISION_TAG |
||
253 | +u32 get_board_rev(void) |
||
254 | +{ |
||
255 | + return system_rev; |
||
256 | +} |
||
257 | +#endif |
||
258 | + |
||
259 | +#ifdef CONFIG_SERIAL_TAG |
||
260 | +void get_board_serial(struct tag_serialnr *serialnr) |
||
261 | +{ |
||
262 | + serialnr->low = serialno; |
||
263 | + serialnr->high = 0; |
||
264 | +} |
||
265 | +#endif |
||
266 | + |
||
267 | +int misc_init_r(void) |
||
268 | +{ |
||
269 | + unsigned int led_red_gpio; |
||
270 | + char *s; |
||
271 | + |
||
272 | + /* Board revision detection */ |
||
273 | + gpio_direction_input(MX28_PAD_LCD_D17__GPIO_1_17); |
||
274 | + |
||
275 | + /* MX28_PAD_LCD_D17__GPIO_1_17: v1 = pull-down, v2 = pull-up */ |
||
276 | + system_rev = |
||
277 | + gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17); |
||
278 | + system_rev += 1; |
||
279 | + |
||
280 | + /* guess DT blob if not set in environment */ |
||
281 | + if (!env_get("fdt_file")) { |
||
282 | + if (system_rev == 1) |
||
283 | + env_set("fdt_file", "imx28-duckbill.dtb"); |
||
284 | + else |
||
285 | + env_set("fdt_file", "imx28-duckbill-2.dtb"); |
||
286 | + } |
||
287 | + |
||
288 | + /* enable red LED to indicate a running bootloader */ |
||
289 | + if (system_rev == 1) |
||
290 | + led_red_gpio = MX28_PAD_AUART1_RX__GPIO_3_4; |
||
291 | + else |
||
292 | + led_red_gpio = MX28_PAD_SAIF0_LRCLK__GPIO_3_21; |
||
293 | + gpio_direction_output(led_red_gpio, 1); |
||
294 | + |
||
295 | + if (system_rev == 1) |
||
296 | + puts("Board: I2SE Duckbill\n"); |
||
297 | + else |
||
298 | + puts("Board: I2SE Duckbill 2\n"); |
||
299 | + |
||
300 | + serialno = env_get_ulong("serial#", 10, 0); |
||
301 | + s = env_get("serial#"); |
||
302 | + if (s && s[0]) { |
||
303 | + puts("Serial: "); |
||
304 | + puts(s); |
||
305 | + putc('\n'); |
||
306 | + } |
||
307 | + |
||
308 | + return 0; |
||
309 | +} |
||
310 | diff --git a/board/i2se/duckbill/iomux.c b/board/i2se/duckbill/iomux.c |
||
311 | new file mode 100644 |
||
312 | index 0000000000..1db3c52c34 |
||
313 | --- /dev/null |
||
314 | +++ b/board/i2se/duckbill/iomux.c |
||
315 | @@ -0,0 +1,156 @@ |
||
316 | +// SPDX-License-Identifier: GPL-2.0+ |
||
317 | +/* |
||
318 | + * I2SE Duckbill IOMUX setup |
||
319 | + * |
||
320 | + * Copyright (C) 2013-2019 Michael Heimpold <mhei@heimpold.de> |
||
321 | + */ |
||
322 | + |
||
323 | +#include <common.h> |
||
324 | +#include <config.h> |
||
325 | +#include <asm/io.h> |
||
326 | +#include <asm/gpio.h> |
||
327 | +#include <asm/arch/iomux-mx28.h> |
||
328 | +#include <asm/arch/imx-regs.h> |
||
329 | +#include <asm/arch/sys_proto.h> |
||
330 | + |
||
331 | +#define MUX_CONFIG_SSP0 (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP) |
||
332 | +#define MUX_CONFIG_ENET (MXS_PAD_3V3 | MXS_PAD_8MA | MXS_PAD_PULLUP) |
||
333 | +#define MUX_CONFIG_EMI (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL) |
||
334 | + |
||
335 | +/* For all revisions */ |
||
336 | +const iomux_cfg_t iomux_setup[] = { |
||
337 | + /* DUART */ |
||
338 | + MX28_PAD_PWM0__DUART_RX, |
||
339 | + MX28_PAD_PWM1__DUART_TX, |
||
340 | + |
||
341 | + /* eMMC (v2) or SD card (v1) */ |
||
342 | + MX28_PAD_SSP0_DATA0__SSP0_D0 | MUX_CONFIG_SSP0, |
||
343 | + MX28_PAD_SSP0_DATA1__SSP0_D1 | MUX_CONFIG_SSP0, |
||
344 | + MX28_PAD_SSP0_DATA2__SSP0_D2 | MUX_CONFIG_SSP0, |
||
345 | + MX28_PAD_SSP0_DATA3__SSP0_D3 | MUX_CONFIG_SSP0, |
||
346 | + MX28_PAD_SSP0_CMD__SSP0_CMD | MUX_CONFIG_SSP0, |
||
347 | + MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT | |
||
348 | + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), |
||
349 | + MX28_PAD_SSP0_SCK__SSP0_SCK | |
||
350 | + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), |
||
351 | + |
||
352 | + /* Ethernet */ |
||
353 | + MX28_PAD_ENET0_MDC__ENET0_MDC | MUX_CONFIG_ENET, |
||
354 | + MX28_PAD_ENET0_MDIO__ENET0_MDIO | MUX_CONFIG_ENET, |
||
355 | + MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MUX_CONFIG_ENET, |
||
356 | + MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MUX_CONFIG_ENET, |
||
357 | + MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MUX_CONFIG_ENET, |
||
358 | + MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MUX_CONFIG_ENET, |
||
359 | + MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MUX_CONFIG_ENET, |
||
360 | + MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MUX_CONFIG_ENET, |
||
361 | + MX28_PAD_ENET_CLK__CLKCTRL_ENET | MUX_CONFIG_ENET, |
||
362 | + |
||
363 | + /* EMI */ |
||
364 | + MX28_PAD_EMI_D00__EMI_DATA0 | MUX_CONFIG_EMI, |
||
365 | + MX28_PAD_EMI_D01__EMI_DATA1 | MUX_CONFIG_EMI, |
||
366 | + MX28_PAD_EMI_D02__EMI_DATA2 | MUX_CONFIG_EMI, |
||
367 | + MX28_PAD_EMI_D03__EMI_DATA3 | MUX_CONFIG_EMI, |
||
368 | + MX28_PAD_EMI_D04__EMI_DATA4 | MUX_CONFIG_EMI, |
||
369 | + MX28_PAD_EMI_D05__EMI_DATA5 | MUX_CONFIG_EMI, |
||
370 | + MX28_PAD_EMI_D06__EMI_DATA6 | MUX_CONFIG_EMI, |
||
371 | + MX28_PAD_EMI_D07__EMI_DATA7 | MUX_CONFIG_EMI, |
||
372 | + MX28_PAD_EMI_D08__EMI_DATA8 | MUX_CONFIG_EMI, |
||
373 | + MX28_PAD_EMI_D09__EMI_DATA9 | MUX_CONFIG_EMI, |
||
374 | + MX28_PAD_EMI_D10__EMI_DATA10 | MUX_CONFIG_EMI, |
||
375 | + MX28_PAD_EMI_D11__EMI_DATA11 | MUX_CONFIG_EMI, |
||
376 | + MX28_PAD_EMI_D12__EMI_DATA12 | MUX_CONFIG_EMI, |
||
377 | + MX28_PAD_EMI_D13__EMI_DATA13 | MUX_CONFIG_EMI, |
||
378 | + MX28_PAD_EMI_D14__EMI_DATA14 | MUX_CONFIG_EMI, |
||
379 | + MX28_PAD_EMI_D15__EMI_DATA15 | MUX_CONFIG_EMI, |
||
380 | + MX28_PAD_EMI_ODT0__EMI_ODT0 | MUX_CONFIG_EMI, |
||
381 | + MX28_PAD_EMI_DQM0__EMI_DQM0 | MUX_CONFIG_EMI, |
||
382 | + MX28_PAD_EMI_ODT1__EMI_ODT1 | MUX_CONFIG_EMI, |
||
383 | + MX28_PAD_EMI_DQM1__EMI_DQM1 | MUX_CONFIG_EMI, |
||
384 | + MX28_PAD_EMI_DDR_OPEN_FB__EMI_DDR_OPEN_FEEDBACK | MUX_CONFIG_EMI, |
||
385 | + MX28_PAD_EMI_CLK__EMI_CLK | MUX_CONFIG_EMI, |
||
386 | + MX28_PAD_EMI_DQS0__EMI_DQS0 | MUX_CONFIG_EMI, |
||
387 | + MX28_PAD_EMI_DQS1__EMI_DQS1 | MUX_CONFIG_EMI, |
||
388 | + MX28_PAD_EMI_DDR_OPEN__EMI_DDR_OPEN | MUX_CONFIG_EMI, |
||
389 | + |
||
390 | + MX28_PAD_EMI_A00__EMI_ADDR0 | MUX_CONFIG_EMI, |
||
391 | + MX28_PAD_EMI_A01__EMI_ADDR1 | MUX_CONFIG_EMI, |
||
392 | + MX28_PAD_EMI_A02__EMI_ADDR2 | MUX_CONFIG_EMI, |
||
393 | + MX28_PAD_EMI_A03__EMI_ADDR3 | MUX_CONFIG_EMI, |
||
394 | + MX28_PAD_EMI_A04__EMI_ADDR4 | MUX_CONFIG_EMI, |
||
395 | + MX28_PAD_EMI_A05__EMI_ADDR5 | MUX_CONFIG_EMI, |
||
396 | + MX28_PAD_EMI_A06__EMI_ADDR6 | MUX_CONFIG_EMI, |
||
397 | + MX28_PAD_EMI_A07__EMI_ADDR7 | MUX_CONFIG_EMI, |
||
398 | + MX28_PAD_EMI_A08__EMI_ADDR8 | MUX_CONFIG_EMI, |
||
399 | + MX28_PAD_EMI_A09__EMI_ADDR9 | MUX_CONFIG_EMI, |
||
400 | + MX28_PAD_EMI_A10__EMI_ADDR10 | MUX_CONFIG_EMI, |
||
401 | + MX28_PAD_EMI_A11__EMI_ADDR11 | MUX_CONFIG_EMI, |
||
402 | + MX28_PAD_EMI_A12__EMI_ADDR12 | MUX_CONFIG_EMI, |
||
403 | + MX28_PAD_EMI_A13__EMI_ADDR13 | MUX_CONFIG_EMI, |
||
404 | + MX28_PAD_EMI_A14__EMI_ADDR14 | MUX_CONFIG_EMI, |
||
405 | + MX28_PAD_EMI_BA0__EMI_BA0 | MUX_CONFIG_EMI, |
||
406 | + MX28_PAD_EMI_BA1__EMI_BA1 | MUX_CONFIG_EMI, |
||
407 | + MX28_PAD_EMI_BA2__EMI_BA2 | MUX_CONFIG_EMI, |
||
408 | + MX28_PAD_EMI_CASN__EMI_CASN | MUX_CONFIG_EMI, |
||
409 | + MX28_PAD_EMI_RASN__EMI_RASN | MUX_CONFIG_EMI, |
||
410 | + MX28_PAD_EMI_WEN__EMI_WEN | MUX_CONFIG_EMI, |
||
411 | + MX28_PAD_EMI_CE0N__EMI_CE0N | MUX_CONFIG_EMI, |
||
412 | + MX28_PAD_EMI_CE1N__EMI_CE1N | MUX_CONFIG_EMI, |
||
413 | + MX28_PAD_EMI_CKE__EMI_CKE | MUX_CONFIG_EMI, |
||
414 | + |
||
415 | + /* Revision pin(s) */ |
||
416 | + MX28_PAD_LCD_D17__GPIO_1_17, |
||
417 | +}; |
||
418 | + |
||
419 | +/* For revision 1 only */ |
||
420 | +const iomux_cfg_t iomux_setup_v1[] = { |
||
421 | + /* PHY reset */ |
||
422 | + MX28_PAD_SSP0_DATA7__GPIO_2_7 | |
||
423 | + (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), |
||
424 | + |
||
425 | + /* LEDs */ |
||
426 | + MX28_PAD_AUART1_RX__GPIO_3_4, |
||
427 | + MX28_PAD_AUART1_TX__GPIO_3_5, |
||
428 | +}; |
||
429 | + |
||
430 | +/* For revision 2 only */ |
||
431 | +const iomux_cfg_t iomux_setup_v2[] = { |
||
432 | + /* eMMC (v2) */ |
||
433 | + MX28_PAD_SSP0_DATA4__SSP0_D4 | MUX_CONFIG_SSP0, |
||
434 | + MX28_PAD_SSP0_DATA5__SSP0_D5 | MUX_CONFIG_SSP0, |
||
435 | + MX28_PAD_SSP0_DATA6__SSP0_D6 | MUX_CONFIG_SSP0, |
||
436 | + MX28_PAD_SSP0_DATA7__SSP0_D7 | MUX_CONFIG_SSP0, |
||
437 | + |
||
438 | + /* PHY reset */ |
||
439 | + MX28_PAD_GPMI_ALE__GPIO_0_26 | |
||
440 | + (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), |
||
441 | + |
||
442 | + /* LEDs */ |
||
443 | + MX28_PAD_SAIF0_LRCLK__GPIO_3_21, |
||
444 | + MX28_PAD_SAIF0_MCLK__GPIO_3_20, |
||
445 | +}; |
||
446 | + |
||
447 | +#define HW_DRAM_CTL29 (0x74 >> 2) |
||
448 | +#define CS_MAP 0xf |
||
449 | +#define COLUMN_SIZE 0x2 |
||
450 | +#define ADDR_PINS 0x1 |
||
451 | +#define APREBIT 0xa |
||
452 | + |
||
453 | +#define HW_DRAM_CTL29_CONFIG (CS_MAP << 24 | COLUMN_SIZE << 16 | \ |
||
454 | + ADDR_PINS << 8 | APREBIT) |
||
455 | + |
||
456 | +void mxs_adjust_memory_params(uint32_t *dram_vals) |
||
457 | +{ |
||
458 | + dram_vals[HW_DRAM_CTL29] = HW_DRAM_CTL29_CONFIG; |
||
459 | +} |
||
460 | + |
||
461 | +void board_init_ll(const uint32_t arg, const uint32_t *resptr) |
||
462 | +{ |
||
463 | + mxs_common_spl_init(arg, resptr, iomux_setup, ARRAY_SIZE(iomux_setup)); |
||
464 | + |
||
465 | + gpio_direction_input(MX28_PAD_LCD_D17__GPIO_1_17); |
||
466 | + |
||
467 | + if (gpio_get_value(MX28_PAD_LCD_D17__GPIO_1_17)) |
||
468 | + mxs_iomux_setup_multiple_pads(iomux_setup_v2, ARRAY_SIZE(iomux_setup_v2)); |
||
469 | + else |
||
470 | + mxs_iomux_setup_multiple_pads(iomux_setup_v1, ARRAY_SIZE(iomux_setup_v1)); |
||
471 | +} |
||
472 | diff --git a/configs/duckbill_defconfig b/configs/duckbill_defconfig |
||
473 | new file mode 100644 |
||
474 | index 0000000000..f92a67d53d |
||
475 | --- /dev/null |
||
476 | +++ b/configs/duckbill_defconfig |
||
477 | @@ -0,0 +1,38 @@ |
||
478 | +CONFIG_ARM=y |
||
479 | +CONFIG_ARCH_MX28=y |
||
480 | +CONFIG_SYS_TEXT_BASE=0x40002000 |
||
481 | +CONFIG_SPL_GPIO_SUPPORT=y |
||
482 | +CONFIG_SPL_LIBCOMMON_SUPPORT=y |
||
483 | +CONFIG_SPL_LIBGENERIC_SUPPORT=y |
||
484 | +CONFIG_TARGET_DUCKBILL=y |
||
485 | +CONFIG_SPL_SERIAL_SUPPORT=y |
||
486 | +CONFIG_SPL=y |
||
487 | +CONFIG_NR_DRAM_BANKS=1 |
||
488 | +CONFIG_BOOTDELAY=1 |
||
489 | +CONFIG_SYS_CONSOLE_IS_IN_ENV=y |
||
490 | +CONFIG_VERSION_VARIABLE=y |
||
491 | +# CONFIG_DISPLAY_BOARDINFO is not set |
||
492 | +CONFIG_ARCH_MISC_INIT=y |
||
493 | +# CONFIG_SPL_FRAMEWORK is not set |
||
494 | +CONFIG_HUSH_PARSER=y |
||
495 | +CONFIG_CMD_BOOTZ=y |
||
496 | +# CONFIG_CMD_ELF is not set |
||
497 | +CONFIG_CMD_UNZIP=y |
||
498 | +# CONFIG_CMD_FLASH is not set |
||
499 | +CONFIG_CMD_FUSE=y |
||
500 | +CONFIG_CMD_GPIO=y |
||
501 | +CONFIG_CMD_MMC=y |
||
502 | +CONFIG_CMD_MMC_SWRITE=y |
||
503 | +CONFIG_CMD_DHCP=y |
||
504 | +CONFIG_CMD_MII=y |
||
505 | +CONFIG_CMD_PING=y |
||
506 | +CONFIG_CMD_EXT4=y |
||
507 | +CONFIG_CMD_EXT4_WRITE=y |
||
508 | +CONFIG_CMD_FS_GENERIC=y |
||
509 | +CONFIG_DOS_PARTITION=y |
||
510 | +CONFIG_ENV_IS_IN_MMC=y |
||
511 | +CONFIG_MMC_MXS=y |
||
512 | +CONFIG_MII=y |
||
513 | +CONFIG_CONS_INDEX=0 |
||
514 | +CONFIG_OF_LIBFDT=y |
||
515 | +# CONFIG_EFI_LOADER is not set |
||
516 | diff --git a/include/configs/duckbill.h b/include/configs/duckbill.h |
||
517 | new file mode 100644 |
||
518 | index 0000000000..e7fce8843e |
||
519 | --- /dev/null |
||
520 | +++ b/include/configs/duckbill.h |
||
521 | @@ -0,0 +1,179 @@ |
||
522 | +/* SPDX-License-Identifier: GPL-2.0+ */ |
||
523 | +/* |
||
524 | + * Copyright (C) 2014-2019 Michael Heimpold <mhei@heimpold.de> |
||
525 | + * |
||
526 | + */ |
||
527 | +#ifndef __CONFIGS_DUCKBILL_H__ |
||
528 | +#define __CONFIGS_DUCKBILL_H__ |
||
529 | + |
||
530 | +/* System configurations */ |
||
531 | +#define CONFIG_MACH_TYPE MACH_TYPE_DUCKBILL |
||
532 | + |
||
533 | +#define CONFIG_MISC_INIT_R |
||
534 | + |
||
535 | +#define CONFIG_SYS_MXS_VDD5V_ONLY |
||
536 | + |
||
537 | +/* Memory configuration */ |
||
538 | +#define PHYS_SDRAM_1 0x40000000 /* Base address */ |
||
539 | +#define PHYS_SDRAM_1_SIZE 0x40000000 /* Max 1 GB RAM */ |
||
540 | +#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 |
||
541 | + |
||
542 | +/* Environment is in MMC */ |
||
543 | +#define CONFIG_ENV_OVERWRITE |
||
544 | +#define CONFIG_ENV_SIZE (128 * 1024) |
||
545 | +#define CONFIG_ENV_OFFSET (128 * 1024) |
||
546 | +#define CONFIG_ENV_OFFSET_REDUND (256 * 1024) |
||
547 | +#define CONFIG_SYS_MMC_ENV_DEV 0 |
||
548 | +#define CONFIG_SYS_REDUNDAND_ENVIRONMENT |
||
549 | + |
||
550 | +/* FEC Ethernet on SoC */ |
||
551 | +#ifdef CONFIG_CMD_NET |
||
552 | +#define CONFIG_FEC_MXC |
||
553 | +#define CONFIG_MX28_FEC_MAC_IN_OCOTP |
||
554 | +#define CONFIG_FEC_MXC_MDIO_BASE MXS_ENET0_BASE |
||
555 | +#endif |
||
556 | + |
||
557 | +#define CONFIG_IPADDR 192.168.1.10 |
||
558 | +#define CONFIG_SERVERIP 192.168.1.1 |
||
559 | +#define CONFIG_NETMASK 255.255.255.0 |
||
560 | +#define CONFIG_GATEWAYIP 192.168.1.254 |
||
561 | + |
||
562 | +/* Boot Linux */ |
||
563 | +#define CONFIG_BOOTDELAY 1 |
||
564 | +#define CONFIG_BOOTFILE "zImage" |
||
565 | +#define CONFIG_LOADADDR 0x42000000 |
||
566 | +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR |
||
567 | +#define CONFIG_REVISION_TAG |
||
568 | +#define CONFIG_SERIAL_TAG |
||
569 | +#define CONFIG_OF_BOARD_SETUP |
||
570 | +#define CONFIG_BOOT_RETRY_TIME 120 /* retry autoboot after 120 seconds */ |
||
571 | +#define CONFIG_AUTOBOOT_KEYED |
||
572 | +#define CONFIG_AUTOBOOT_PROMPT "Autobooting in %d seconds, " \ |
||
573 | + "press <c> to stop\n" |
||
574 | +#define CONFIG_AUTOBOOT_DELAY_STR "\x63" /* allows retry after retry time */ |
||
575 | +#define CONFIG_AUTOBOOT_STOP_STR " " /* stop autoboot with <Space> */ |
||
576 | +#define CONFIG_RESET_TO_RETRY /* reset board to retry booting */ |
||
577 | + |
||
578 | +/* Extra Environment */ |
||
579 | +#define CONFIG_EXTRA_ENV_SETTINGS \ |
||
580 | + "mmc_part2_offset=1000\0" \ |
||
581 | + "mmc_part3_offset=19000\0" \ |
||
582 | + "update_openwrt_firmware_filename=openwrt-mxs-root.ext4\0" \ |
||
583 | + "update_openwrt_firmware=" \ |
||
584 | + "if mmc rescan; then " \ |
||
585 | + "if tftp ${update_openwrt_firmware_filename}; then " \ |
||
586 | + "setexpr fw_sz ${filesize} + 1ff; " \ |
||
587 | + "setexpr fw_sz ${fw_sz} / 200; " \ |
||
588 | + "mmc write ${loadaddr} ${mmc_part2_offset} ${fw_sz}; " \ |
||
589 | + "mmc write ${loadaddr} ${mmc_part3_offset} ${fw_sz}; " \ |
||
590 | + "fi; " \ |
||
591 | + "fi\0" \ |
||
592 | + "update_fw_filename_prefix=emmc.img.\0" \ |
||
593 | + "update_fw_filename_suffix=.gz\0" \ |
||
594 | + "update_fw_parts=0x6\0" \ |
||
595 | + "update_fw_fsize_uncompressed=4000000\0" \ |
||
596 | + "gzwrite_wbuf=100000\0" \ |
||
597 | + "update_emmc_firmware=" \ |
||
598 | + "setexpr i ${update_fw_parts}; setexpr error 0; " \ |
||
599 | + "while itest ${i} -gt 0; do " \ |
||
600 | + "echo Transfering firmware image part ${i} of ${update_fw_parts}; " \ |
||
601 | + "if itest ${i} -le f; then " \ |
||
602 | + "setenv j 0${i}; " \ |
||
603 | + "else " \ |
||
604 | + "setenv j ${i}; " \ |
||
605 | + "fi; " \ |
||
606 | + "if tftp ${loadaddr} ${update_fw_basedir}${update_fw_filename_prefix}${j}${update_fw_filename_suffix}; then " \ |
||
607 | + "setexpr k ${i} - 1; " \ |
||
608 | + "setexpr offset ${update_fw_fsize_uncompressed} * ${k}; " \ |
||
609 | + "if gzwrite mmc ${mmcdev} ${loadaddr} ${filesize} ${gzwrite_wbuf} ${offset}; then " \ |
||
610 | + "setexpr i ${i} - 1; " \ |
||
611 | + "else " \ |
||
612 | + "setexpr i 0; " \ |
||
613 | + "setexpr error 1; " \ |
||
614 | + "fi; " \ |
||
615 | + "else " \ |
||
616 | + "setexpr i 0; " \ |
||
617 | + "setexpr error 1; " \ |
||
618 | + "fi; " \ |
||
619 | + "done; setenv i; setenv j; setenv k; setenv fsize; setenv filesize; setenv offset; " \ |
||
620 | + "if test ${error} -eq 1; then " \ |
||
621 | + "echo Firmware Update FAILED; " \ |
||
622 | + "else " \ |
||
623 | + "echo Firmware Update OK; " \ |
||
624 | + "fi; setenv error\0" \ |
||
625 | + "erase_mmc=mmc erase 0 2\0" \ |
||
626 | + "erase_env1=mmc erase 100 100\0" \ |
||
627 | + "erase_env2=mmc erase 200 100\0" \ |
||
628 | + "image=zImage\0" \ |
||
629 | + "console=ttyAMA0\0" \ |
||
630 | + "fdt_addr=0x41000000\0" \ |
||
631 | + "boot_fdt=try\0" \ |
||
632 | + "ip_dyn=yes\0" \ |
||
633 | + "bootsys=1\0" \ |
||
634 | + "mmcdev=0\0" \ |
||
635 | + "mmcpart=2\0" \ |
||
636 | + "mmcroot=/dev/mmcblk0p2\0" \ |
||
637 | + "mmcargs=setenv bootargs console=${console},${baudrate} " \ |
||
638 | + "root=${mmcroot} " \ |
||
639 | + "rootwait bootsys=${bootsys} panic=1 ${extraargs}\0" \ |
||
640 | + "loadimage=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} /boot/${image}\0" \ |
||
641 | + "loadfdt=ext4load mmc ${mmcdev}:${mmcpart} ${fdt_addr} /boot/${fdt_file}\0" \ |
||
642 | + "mmcboot=echo Booting from mmc ...; " \ |
||
643 | + "setexpr mmcpart 1 + ${bootsys}; " \ |
||
644 | + "setenv mmcroot /dev/mmcblk0p${mmcpart}; " \ |
||
645 | + "run mmcargs; " \ |
||
646 | + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \ |
||
647 | + "if run loadfdt; then " \ |
||
648 | + "bootz ${loadaddr} - ${fdt_addr}; " \ |
||
649 | + "else " \ |
||
650 | + "if test ${boot_fdt} = try; then " \ |
||
651 | + "bootz; " \ |
||
652 | + "else " \ |
||
653 | + "echo WARN: Cannot load the DT; " \ |
||
654 | + "fi; " \ |
||
655 | + "fi; " \ |
||
656 | + "else " \ |
||
657 | + "bootz; " \ |
||
658 | + "fi\0" \ |
||
659 | + "nfsroot=/\0" \ |
||
660 | + "netargs=setenv bootargs console=${console},${baudrate} " \ |
||
661 | + "root=/dev/nfs " \ |
||
662 | + "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp ${extraargs}\0" \ |
||
663 | + "netboot=echo Booting from net ...; " \ |
||
664 | + "run netargs; " \ |
||
665 | + "if test ${ip_dyn} = yes; then " \ |
||
666 | + "setenv get_cmd dhcp; " \ |
||
667 | + "else " \ |
||
668 | + "setenv get_cmd tftp; " \ |
||
669 | + "fi; " \ |
||
670 | + "${get_cmd} ${image}; " \ |
||
671 | + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \ |
||
672 | + "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \ |
||
673 | + "bootz ${loadaddr} - ${fdt_addr}; " \ |
||
674 | + "else " \ |
||
675 | + "if test ${boot_fdt} = try; then " \ |
||
676 | + "bootz; " \ |
||
677 | + "else " \ |
||
678 | + "echo WARN: Cannot load the DT; " \ |
||
679 | + "fi;" \ |
||
680 | + "fi; " \ |
||
681 | + "else " \ |
||
682 | + "bootz; " \ |
||
683 | + "fi\0" |
||
684 | + |
||
685 | +#define CONFIG_BOOTCOMMAND \ |
||
686 | + "mmc dev ${mmcdev}; " \ |
||
687 | + "if mmc rescan; then " \ |
||
688 | + "if run loadimage; then " \ |
||
689 | + "run mmcboot; " \ |
||
690 | + "else " \ |
||
691 | + "run netboot; " \ |
||
692 | + "fi; " \ |
||
693 | + "else " \ |
||
694 | + "run netboot; " \ |
||
695 | + "fi" |
||
696 | + |
||
697 | +/* The rest of the configuration is shared */ |
||
698 | +#include <configs/mxs.h> |
||
699 | + |
||
700 | +#endif /* __CONFIGS_DUCKBILL_H__ */ |
||
701 | -- |
||
702 | 2.17.1 |
||
703 |