1eb0b43f2SJens Scharsig /*
2eb0b43f2SJens Scharsig * (C) Copyright 2005-2009
3eb0b43f2SJens Scharsig * BuS Elektronik GmbH & Co.KG <esw@bus-elektonik.de>
4eb0b43f2SJens Scharsig *
5eb0b43f2SJens Scharsig * (C) Copyright 2000-2003
6eb0b43f2SJens Scharsig * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
7eb0b43f2SJens Scharsig *
81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
9eb0b43f2SJens Scharsig */
10eb0b43f2SJens Scharsig
11eb0b43f2SJens Scharsig #include <common.h>
12eb0b43f2SJens Scharsig #include <command.h>
13eb0b43f2SJens Scharsig #include "asm/m5282.h"
14eb0b43f2SJens Scharsig #include <bmp_layout.h>
15eb0b43f2SJens Scharsig #include <status_led.h>
16eb0b43f2SJens Scharsig #include <bus_vcxk.h>
17eb0b43f2SJens Scharsig
18eb0b43f2SJens Scharsig /*---------------------------------------------------------------------------*/
19eb0b43f2SJens Scharsig
20eb0b43f2SJens Scharsig DECLARE_GLOBAL_DATA_PTR;
21eb0b43f2SJens Scharsig
22d858c335SJens Scharsig (BuS Elektronik) #ifdef CONFIG_VIDEO
23eb0b43f2SJens Scharsig unsigned long display_width;
24eb0b43f2SJens Scharsig unsigned long display_height;
25d858c335SJens Scharsig (BuS Elektronik) #endif
26eb0b43f2SJens Scharsig
27eb0b43f2SJens Scharsig /*---------------------------------------------------------------------------*/
28eb0b43f2SJens Scharsig
checkboard(void)29eb0b43f2SJens Scharsig int checkboard (void)
30eb0b43f2SJens Scharsig {
31d858c335SJens Scharsig (BuS Elektronik) puts("Board: EB+CPU5282 (BuS Elektronik GmbH & Co. KG)\n");
32eb0b43f2SJens Scharsig #if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
33eb0b43f2SJens Scharsig puts(" Boot from Internal FLASH\n");
34eb0b43f2SJens Scharsig #endif
35eb0b43f2SJens Scharsig return 0;
36eb0b43f2SJens Scharsig }
37eb0b43f2SJens Scharsig
dram_init(void)38f1683aa7SSimon Glass int dram_init(void)
39eb0b43f2SJens Scharsig {
40eb0b43f2SJens Scharsig int size, i;
41eb0b43f2SJens Scharsig
42eb0b43f2SJens Scharsig size = 0;
43d858c335SJens Scharsig (BuS Elektronik) MCFSDRAMC_DCR = MCFSDRAMC_DCR_RTIM_6 |
44d858c335SJens Scharsig (BuS Elektronik) MCFSDRAMC_DCR_RC((15 * CONFIG_SYS_CLK / 1000000) >> 4);
45d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
46eb0b43f2SJens Scharsig #ifdef CONFIG_SYS_SDRAM_BASE0
47d858c335SJens Scharsig (BuS Elektronik) MCFSDRAMC_DACR0 = MCFSDRAMC_DACR_BASE(CONFIG_SYS_SDRAM_BASE0)|
48d858c335SJens Scharsig (BuS Elektronik) MCFSDRAMC_DACR_CASL(1) | MCFSDRAMC_DACR_CBM(3) |
49d858c335SJens Scharsig (BuS Elektronik) MCFSDRAMC_DACR_PS_32;
50d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
51eb0b43f2SJens Scharsig
52eb0b43f2SJens Scharsig MCFSDRAMC_DMR0 = MCFSDRAMC_DMR_BAM_16M | MCFSDRAMC_DMR_V;
53d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
54eb0b43f2SJens Scharsig
55eb0b43f2SJens Scharsig MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP;
56d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
57d858c335SJens Scharsig (BuS Elektronik) for (i = 0; i < 10; i++)
58d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
59eb0b43f2SJens Scharsig
60d858c335SJens Scharsig (BuS Elektronik) *(unsigned long *)(CONFIG_SYS_SDRAM_BASE0) = 0xA5A5A5A5;
61d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
62eb0b43f2SJens Scharsig MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_RE;
63d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
64d858c335SJens Scharsig (BuS Elektronik)
65eb0b43f2SJens Scharsig for (i = 0; i < 2000; i++)
66eb0b43f2SJens Scharsig asm (" nop");
67d858c335SJens Scharsig (BuS Elektronik)
68d858c335SJens Scharsig (BuS Elektronik) MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IMRS;
69d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
70d858c335SJens Scharsig (BuS Elektronik) /* write SDRAM mode register */
71d858c335SJens Scharsig (BuS Elektronik) *(unsigned long *)(CONFIG_SYS_SDRAM_BASE0 + 0x80440) = 0xA5A5A5A5;
72d858c335SJens Scharsig (BuS Elektronik) asm (" nop");
73d858c335SJens Scharsig (BuS Elektronik) size += CONFIG_SYS_SDRAM_SIZE0 * 1024 * 1024;
74eb0b43f2SJens Scharsig #endif
75d858c335SJens Scharsig (BuS Elektronik) #ifdef CONFIG_SYS_SDRAM_BASE1xx
76eb0b43f2SJens Scharsig MCFSDRAMC_DACR1 = MCFSDRAMC_DACR_BASE (CONFIG_SYS_SDRAM_BASE1)
77eb0b43f2SJens Scharsig | MCFSDRAMC_DACR_CASL (1)
78eb0b43f2SJens Scharsig | MCFSDRAMC_DACR_CBM (3)
79eb0b43f2SJens Scharsig | MCFSDRAMC_DACR_PS_16;
80eb0b43f2SJens Scharsig
81eb0b43f2SJens Scharsig MCFSDRAMC_DMR1 = MCFSDRAMC_DMR_BAM_16M | MCFSDRAMC_DMR_V;
82eb0b43f2SJens Scharsig
83eb0b43f2SJens Scharsig MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IP;
84eb0b43f2SJens Scharsig
85eb0b43f2SJens Scharsig *(unsigned short *) (CONFIG_SYS_SDRAM_BASE1) = 0xA5A5;
86eb0b43f2SJens Scharsig MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_RE;
87eb0b43f2SJens Scharsig
88eb0b43f2SJens Scharsig for (i = 0; i < 2000; i++)
89eb0b43f2SJens Scharsig asm (" nop");
90eb0b43f2SJens Scharsig
91eb0b43f2SJens Scharsig MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IMRS;
92eb0b43f2SJens Scharsig *(unsigned int *) (CONFIG_SYS_SDRAM_BASE1 + 0x220) = 0xA5A5;
93eb0b43f2SJens Scharsig size += CONFIG_SYS_SDRAM_SIZE1 * 1024 * 1024;
94eb0b43f2SJens Scharsig #endif
95088454cdSSimon Glass gd->ram_size = size;
96088454cdSSimon Glass
97088454cdSSimon Glass return 0;
98eb0b43f2SJens Scharsig }
99eb0b43f2SJens Scharsig
100eb0b43f2SJens Scharsig #if defined(CONFIG_SYS_DRAM_TEST)
testdram(void)101eb0b43f2SJens Scharsig int testdram (void)
102eb0b43f2SJens Scharsig {
103eb0b43f2SJens Scharsig uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
104eb0b43f2SJens Scharsig uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
105eb0b43f2SJens Scharsig uint *p;
106eb0b43f2SJens Scharsig
107eb0b43f2SJens Scharsig printf("SDRAM test phase 1:\n");
108eb0b43f2SJens Scharsig for (p = pstart; p < pend; p++)
109eb0b43f2SJens Scharsig *p = 0xaaaaaaaa;
110eb0b43f2SJens Scharsig
111eb0b43f2SJens Scharsig for (p = pstart; p < pend; p++) {
112eb0b43f2SJens Scharsig if (*p != 0xaaaaaaaa) {
113eb0b43f2SJens Scharsig printf ("SDRAM test fails at: %08x\n", (uint) p);
114eb0b43f2SJens Scharsig return 1;
115eb0b43f2SJens Scharsig }
116eb0b43f2SJens Scharsig }
117eb0b43f2SJens Scharsig
118eb0b43f2SJens Scharsig printf("SDRAM test phase 2:\n");
119eb0b43f2SJens Scharsig for (p = pstart; p < pend; p++)
120eb0b43f2SJens Scharsig *p = 0x55555555;
121eb0b43f2SJens Scharsig
122eb0b43f2SJens Scharsig for (p = pstart; p < pend; p++) {
123eb0b43f2SJens Scharsig if (*p != 0x55555555) {
124eb0b43f2SJens Scharsig printf ("SDRAM test fails at: %08x\n", (uint) p);
125eb0b43f2SJens Scharsig return 1;
126eb0b43f2SJens Scharsig }
127eb0b43f2SJens Scharsig }
128eb0b43f2SJens Scharsig
129eb0b43f2SJens Scharsig printf("SDRAM test passed.\n");
130eb0b43f2SJens Scharsig return 0;
131eb0b43f2SJens Scharsig }
132eb0b43f2SJens Scharsig #endif
133eb0b43f2SJens Scharsig
134d858c335SJens Scharsig (BuS Elektronik) #if defined(CONFIG_HW_WATCHDOG)
135d858c335SJens Scharsig (BuS Elektronik)
hw_watchdog_init(void)136d858c335SJens Scharsig (BuS Elektronik) void hw_watchdog_init(void)
137d858c335SJens Scharsig (BuS Elektronik) {
138d858c335SJens Scharsig (BuS Elektronik) char *s;
139d858c335SJens Scharsig (BuS Elektronik) int enable;
140d858c335SJens Scharsig (BuS Elektronik)
141d858c335SJens Scharsig (BuS Elektronik) enable = 1;
142*00caae6dSSimon Glass s = env_get("watchdog");
143d858c335SJens Scharsig (BuS Elektronik) if (s != NULL)
144d858c335SJens Scharsig (BuS Elektronik) if ((strncmp(s, "off", 3) == 0) || (strncmp(s, "0", 1) == 0))
145d858c335SJens Scharsig (BuS Elektronik) enable = 0;
146d858c335SJens Scharsig (BuS Elektronik) if (enable)
147d858c335SJens Scharsig (BuS Elektronik) MCFGPTA_GPTDDR |= (1<<2);
148d858c335SJens Scharsig (BuS Elektronik) else
149d858c335SJens Scharsig (BuS Elektronik) MCFGPTA_GPTDDR &= ~(1<<2);
150d858c335SJens Scharsig (BuS Elektronik) }
151d858c335SJens Scharsig (BuS Elektronik)
hw_watchdog_reset(void)152d858c335SJens Scharsig (BuS Elektronik) void hw_watchdog_reset(void)
153d858c335SJens Scharsig (BuS Elektronik) {
154d858c335SJens Scharsig (BuS Elektronik) MCFGPTA_GPTPORT ^= (1<<2);
155d858c335SJens Scharsig (BuS Elektronik) }
156d858c335SJens Scharsig (BuS Elektronik) #endif
157d858c335SJens Scharsig (BuS Elektronik)
misc_init_r(void)158eb0b43f2SJens Scharsig int misc_init_r(void)
159eb0b43f2SJens Scharsig {
160eb0b43f2SJens Scharsig #ifdef CONFIG_HW_WATCHDOG
161eb0b43f2SJens Scharsig hw_watchdog_init();
162eb0b43f2SJens Scharsig #endif
163eb0b43f2SJens Scharsig return 1;
164eb0b43f2SJens Scharsig }
165eb0b43f2SJens Scharsig
__led_toggle(led_id_t mask)166d858c335SJens Scharsig (BuS Elektronik) void __led_toggle(led_id_t mask)
167d858c335SJens Scharsig (BuS Elektronik) {
168d858c335SJens Scharsig (BuS Elektronik) MCFGPTA_GPTPORT ^= (1 << 3);
169d858c335SJens Scharsig (BuS Elektronik) }
170d858c335SJens Scharsig (BuS Elektronik)
__led_init(led_id_t mask,int state)171d858c335SJens Scharsig (BuS Elektronik) void __led_init(led_id_t mask, int state)
172d858c335SJens Scharsig (BuS Elektronik) {
173d858c335SJens Scharsig (BuS Elektronik) __led_set(mask, state);
174d858c335SJens Scharsig (BuS Elektronik) MCFGPTA_GPTDDR |= (1 << 3);
175d858c335SJens Scharsig (BuS Elektronik) }
176d858c335SJens Scharsig (BuS Elektronik)
__led_set(led_id_t mask,int state)177d858c335SJens Scharsig (BuS Elektronik) void __led_set(led_id_t mask, int state)
178d858c335SJens Scharsig (BuS Elektronik) {
1792d8d190cSUri Mashiach if (state == CONFIG_LED_STATUS_ON)
180d858c335SJens Scharsig (BuS Elektronik) MCFGPTA_GPTPORT |= (1 << 3);
181d858c335SJens Scharsig (BuS Elektronik) else
182d858c335SJens Scharsig (BuS Elektronik) MCFGPTA_GPTPORT &= ~(1 << 3);
183d858c335SJens Scharsig (BuS Elektronik) }
184d858c335SJens Scharsig (BuS Elektronik)
185eb0b43f2SJens Scharsig #if defined(CONFIG_VIDEO)
186eb0b43f2SJens Scharsig
drv_video_init(void)187eb0b43f2SJens Scharsig int drv_video_init(void)
188eb0b43f2SJens Scharsig {
189eb0b43f2SJens Scharsig char *s;
190d858c335SJens Scharsig (BuS Elektronik) #ifdef CONFIG_SPLASH_SCREEN
191eb0b43f2SJens Scharsig unsigned long splash;
192d858c335SJens Scharsig (BuS Elektronik) #endif
193eb0b43f2SJens Scharsig printf("Init Video as ");
194*00caae6dSSimon Glass s = env_get("displaywidth");
195d858c335SJens Scharsig (BuS Elektronik) if (s != NULL)
196eb0b43f2SJens Scharsig display_width = simple_strtoul(s, NULL, 10);
197eb0b43f2SJens Scharsig else
198eb0b43f2SJens Scharsig display_width = 256;
199eb0b43f2SJens Scharsig
200*00caae6dSSimon Glass s = env_get("displayheight");
201d858c335SJens Scharsig (BuS Elektronik) if (s != NULL)
202eb0b43f2SJens Scharsig display_height = simple_strtoul(s, NULL, 10);
203eb0b43f2SJens Scharsig else
204eb0b43f2SJens Scharsig display_height = 256;
205eb0b43f2SJens Scharsig
206eb0b43f2SJens Scharsig printf("%lu x %lu pixel matrix\n", display_width, display_height);
207eb0b43f2SJens Scharsig
208eb0b43f2SJens Scharsig MCFCCM_CCR &= ~MCFCCM_CCR_SZEN;
209eb0b43f2SJens Scharsig MCFGPIO_PEPAR &= ~MCFGPIO_PEPAR_PEPA2;
210eb0b43f2SJens Scharsig
211eb0b43f2SJens Scharsig vcxk_init(display_width, display_height);
212eb0b43f2SJens Scharsig
213eb0b43f2SJens Scharsig #ifdef CONFIG_SPLASH_SCREEN
214*00caae6dSSimon Glass s = env_get("splashimage");
215d858c335SJens Scharsig (BuS Elektronik) if (s != NULL) {
216eb0b43f2SJens Scharsig splash = simple_strtoul(s, NULL, 16);
217eb0b43f2SJens Scharsig vcxk_acknowledge_wait();
218eb0b43f2SJens Scharsig video_display_bitmap(splash, 0, 0);
219eb0b43f2SJens Scharsig }
220eb0b43f2SJens Scharsig #endif
221eb0b43f2SJens Scharsig return 0;
222eb0b43f2SJens Scharsig }
223eb0b43f2SJens Scharsig #endif
224eb0b43f2SJens Scharsig
225eb0b43f2SJens Scharsig /*---------------------------------------------------------------------------*/
226eb0b43f2SJens Scharsig
227eb0b43f2SJens Scharsig #ifdef CONFIG_VIDEO
do_brightness(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])228eb0b43f2SJens Scharsig int do_brightness(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
229eb0b43f2SJens Scharsig {
230eb0b43f2SJens Scharsig int rcode = 0;
231eb0b43f2SJens Scharsig ulong side;
232eb0b43f2SJens Scharsig ulong bright;
233eb0b43f2SJens Scharsig
234eb0b43f2SJens Scharsig switch (argc) {
235eb0b43f2SJens Scharsig case 3:
236eb0b43f2SJens Scharsig side = simple_strtoul(argv[1], NULL, 10);
237eb0b43f2SJens Scharsig bright = simple_strtoul(argv[2], NULL, 10);
238eb0b43f2SJens Scharsig if ((side >= 0) && (side <= 3) &&
239eb0b43f2SJens Scharsig (bright >= 0) && (bright <= 1000)) {
240eb0b43f2SJens Scharsig vcxk_setbrightness(side, bright);
241eb0b43f2SJens Scharsig rcode = 0;
242eb0b43f2SJens Scharsig } else {
243eb0b43f2SJens Scharsig printf("parameters out of range\n");
244eb0b43f2SJens Scharsig printf("Usage:\n%s\n", cmdtp->usage);
245eb0b43f2SJens Scharsig rcode = 1;
246eb0b43f2SJens Scharsig }
247eb0b43f2SJens Scharsig break;
248eb0b43f2SJens Scharsig default:
249eb0b43f2SJens Scharsig printf("Usage:\n%s\n", cmdtp->usage);
250eb0b43f2SJens Scharsig rcode = 1;
251eb0b43f2SJens Scharsig break;
252eb0b43f2SJens Scharsig }
253eb0b43f2SJens Scharsig return rcode;
254eb0b43f2SJens Scharsig }
255eb0b43f2SJens Scharsig
256eb0b43f2SJens Scharsig /*---------------------------------------------------------------------------*/
257eb0b43f2SJens Scharsig
258eb0b43f2SJens Scharsig U_BOOT_CMD(
259eb0b43f2SJens Scharsig bright, 3, 0, do_brightness,
260eb0b43f2SJens Scharsig "sets the display brightness\n",
261eb0b43f2SJens Scharsig " <side> <0..1000>\n side: 0/3=both; 1=first; 2=second\n"
262eb0b43f2SJens Scharsig );
263eb0b43f2SJens Scharsig
264eb0b43f2SJens Scharsig #endif
265eb0b43f2SJens Scharsig
266eb0b43f2SJens Scharsig /* EOF EB+MCF-EV123.c */
267