blob: 0b916d2482c5f52696e3ff7be10bb4c31e33e7c9 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Heiko Schocherac1956e2006-04-20 08:42:42 +02002/*
Jens Scharsig772d9b02009-07-24 10:31:48 +02003 * (C) Copyright 2005-2009
Heiko Schocherac1956e2006-04-20 08:42:42 +02004 * BuS Elektronik GmbH & Co.KG <esw@bus-elektonik.de>
5 *
6 * (C) Copyright 2000-2003
7 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
Heiko Schocherac1956e2006-04-20 08:42:42 +02008 */
9
10#include <common.h>
11#include <command.h>
12#include "asm/m5282.h"
Jens Scharsig772d9b02009-07-24 10:31:48 +020013#include <bmp_layout.h>
Simon Glass0af6e2d2019-08-01 09:46:52 -060014#include <env.h>
Jens Scharsig772d9b02009-07-24 10:31:48 +020015#include <status_led.h>
16#include <bus_vcxk.h>
17
18/*---------------------------------------------------------------------------*/
19
20DECLARE_GLOBAL_DATA_PTR;
21
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000022#ifdef CONFIG_VIDEO
Jens Scharsig772d9b02009-07-24 10:31:48 +020023unsigned long display_width;
24unsigned long display_height;
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000025#endif
Jens Scharsig772d9b02009-07-24 10:31:48 +020026
27/*---------------------------------------------------------------------------*/
Heiko Schocherac1956e2006-04-20 08:42:42 +020028
29int checkboard (void)
30{
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000031 puts("Board: EB+CPU5282 (BuS Elektronik GmbH & Co. KG)\n");
Wolfgang Denk0708bc62010-10-07 21:51:12 +020032#if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000033 puts(" Boot from Internal FLASH\n");
Heiko Schocherac1956e2006-04-20 08:42:42 +020034#endif
Heiko Schocherac1956e2006-04-20 08:42:42 +020035 return 0;
36}
37
Simon Glassd35f3382017-04-06 12:47:05 -060038int dram_init(void)
Heiko Schocherac1956e2006-04-20 08:42:42 +020039{
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020040 int size, i;
Heiko Schocherac1956e2006-04-20 08:42:42 +020041
42 size = 0;
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000043 MCFSDRAMC_DCR = MCFSDRAMC_DCR_RTIM_6 |
44 MCFSDRAMC_DCR_RC((15 * CONFIG_SYS_CLK / 1000000) >> 4);
45 asm (" nop");
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020046#ifdef CONFIG_SYS_SDRAM_BASE0
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000047 MCFSDRAMC_DACR0 = MCFSDRAMC_DACR_BASE(CONFIG_SYS_SDRAM_BASE0)|
48 MCFSDRAMC_DACR_CASL(1) | MCFSDRAMC_DACR_CBM(3) |
49 MCFSDRAMC_DACR_PS_32;
50 asm (" nop");
Heiko Schocherac1956e2006-04-20 08:42:42 +020051
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020052 MCFSDRAMC_DMR0 = MCFSDRAMC_DMR_BAM_16M | MCFSDRAMC_DMR_V;
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000053 asm (" nop");
Heiko Schocherac1956e2006-04-20 08:42:42 +020054
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020055 MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP;
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000056 asm (" nop");
57 for (i = 0; i < 10; i++)
58 asm (" nop");
Heiko Schocherac1956e2006-04-20 08:42:42 +020059
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000060 *(unsigned long *)(CONFIG_SYS_SDRAM_BASE0) = 0xA5A5A5A5;
61 asm (" nop");
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020062 MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_RE;
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000063 asm (" nop");
64
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020065 for (i = 0; i < 2000; i++)
66 asm (" nop");
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000067
68 MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IMRS;
69 asm (" nop");
70 /* write SDRAM mode register */
71 *(unsigned long *)(CONFIG_SYS_SDRAM_BASE0 + 0x80440) = 0xA5A5A5A5;
72 asm (" nop");
73 size += CONFIG_SYS_SDRAM_SIZE0 * 1024 * 1024;
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020074#endif
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +000075#ifdef CONFIG_SYS_SDRAM_BASE1xx
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020076 MCFSDRAMC_DACR1 = MCFSDRAMC_DACR_BASE (CONFIG_SYS_SDRAM_BASE1)
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020077 | MCFSDRAMC_DACR_CASL (1)
78 | MCFSDRAMC_DACR_CBM (3)
79 | MCFSDRAMC_DACR_PS_16;
Heiko Schocherac1956e2006-04-20 08:42:42 +020080
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020081 MCFSDRAMC_DMR1 = MCFSDRAMC_DMR_BAM_16M | MCFSDRAMC_DMR_V;
Heiko Schocherac1956e2006-04-20 08:42:42 +020082
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020083 MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IP;
84
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020085 *(unsigned short *) (CONFIG_SYS_SDRAM_BASE1) = 0xA5A5;
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020086 MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_RE;
87
88 for (i = 0; i < 2000; i++)
89 asm (" nop");
Heiko Schocherac1956e2006-04-20 08:42:42 +020090
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020091 MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IMRS;
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020092 *(unsigned int *) (CONFIG_SYS_SDRAM_BASE1 + 0x220) = 0xA5A5;
93 size += CONFIG_SYS_SDRAM_SIZE1 * 1024 * 1024;
Wolfgang Denkc4f55ee2008-07-14 20:38:26 +020094#endif
Simon Glass39f90ba2017-03-31 08:40:25 -060095 gd->ram_size = size;
96
97 return 0;
Heiko Schocherac1956e2006-04-20 08:42:42 +020098}
99
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200100#if defined(CONFIG_SYS_DRAM_TEST)
Heiko Schocherac1956e2006-04-20 08:42:42 +0200101int testdram (void)
102{
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200103 uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
104 uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
Heiko Schocherac1956e2006-04-20 08:42:42 +0200105 uint *p;
106
107 printf("SDRAM test phase 1:\n");
108 for (p = pstart; p < pend; p++)
109 *p = 0xaaaaaaaa;
110
111 for (p = pstart; p < pend; p++) {
112 if (*p != 0xaaaaaaaa) {
113 printf ("SDRAM test fails at: %08x\n", (uint) p);
114 return 1;
115 }
116 }
117
118 printf("SDRAM test phase 2:\n");
119 for (p = pstart; p < pend; p++)
120 *p = 0x55555555;
121
122 for (p = pstart; p < pend; p++) {
123 if (*p != 0x55555555) {
124 printf ("SDRAM test fails at: %08x\n", (uint) p);
125 return 1;
126 }
127 }
128
129 printf("SDRAM test passed.\n");
130 return 0;
131}
132#endif
133
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000134#if defined(CONFIG_HW_WATCHDOG)
135
136void hw_watchdog_init(void)
137{
138 char *s;
139 int enable;
140
141 enable = 1;
Simon Glass64b723f2017-08-03 12:22:12 -0600142 s = env_get("watchdog");
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000143 if (s != NULL)
144 if ((strncmp(s, "off", 3) == 0) || (strncmp(s, "0", 1) == 0))
145 enable = 0;
146 if (enable)
147 MCFGPTA_GPTDDR |= (1<<2);
148 else
149 MCFGPTA_GPTDDR &= ~(1<<2);
150}
151
152void hw_watchdog_reset(void)
153{
154 MCFGPTA_GPTPORT ^= (1<<2);
155}
156#endif
157
Heiko Schocherac1956e2006-04-20 08:42:42 +0200158int misc_init_r(void)
159{
Jens Scharsig772d9b02009-07-24 10:31:48 +0200160#ifdef CONFIG_HW_WATCHDOG
161 hw_watchdog_init();
162#endif
Heiko Schocherac1956e2006-04-20 08:42:42 +0200163 return 1;
164}
Jens Scharsig772d9b02009-07-24 10:31:48 +0200165
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000166void __led_toggle(led_id_t mask)
167{
168 MCFGPTA_GPTPORT ^= (1 << 3);
169}
170
171void __led_init(led_id_t mask, int state)
172{
173 __led_set(mask, state);
174 MCFGPTA_GPTDDR |= (1 << 3);
175}
Jens Scharsig772d9b02009-07-24 10:31:48 +0200176
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000177void __led_set(led_id_t mask, int state)
178{
Uri Mashiach4892d392017-01-19 10:51:45 +0200179 if (state == CONFIG_LED_STATUS_ON)
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000180 MCFGPTA_GPTPORT |= (1 << 3);
181 else
182 MCFGPTA_GPTPORT &= ~(1 << 3);
183}
184
185#if defined(CONFIG_VIDEO)
Jens Scharsig772d9b02009-07-24 10:31:48 +0200186
187int drv_video_init(void)
188{
189 char *s;
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000190#ifdef CONFIG_SPLASH_SCREEN
Jens Scharsig772d9b02009-07-24 10:31:48 +0200191 unsigned long splash;
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000192#endif
Jens Scharsig772d9b02009-07-24 10:31:48 +0200193 printf("Init Video as ");
Simon Glass64b723f2017-08-03 12:22:12 -0600194 s = env_get("displaywidth");
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000195 if (s != NULL)
Jens Scharsig772d9b02009-07-24 10:31:48 +0200196 display_width = simple_strtoul(s, NULL, 10);
197 else
198 display_width = 256;
199
Simon Glass64b723f2017-08-03 12:22:12 -0600200 s = env_get("displayheight");
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000201 if (s != NULL)
Jens Scharsig772d9b02009-07-24 10:31:48 +0200202 display_height = simple_strtoul(s, NULL, 10);
203 else
204 display_height = 256;
205
206 printf("%lu x %lu pixel matrix\n", display_width, display_height);
207
208 MCFCCM_CCR &= ~MCFCCM_CCR_SZEN;
209 MCFGPIO_PEPAR &= ~MCFGPIO_PEPAR_PEPA2;
210
211 vcxk_init(display_width, display_height);
212
213#ifdef CONFIG_SPLASH_SCREEN
Simon Glass64b723f2017-08-03 12:22:12 -0600214 s = env_get("splashimage");
Jens Scharsig (BuS Elektronik)e5e58372012-10-30 00:46:05 +0000215 if (s != NULL) {
Jens Scharsig772d9b02009-07-24 10:31:48 +0200216 splash = simple_strtoul(s, NULL, 16);
Jens Scharsig772d9b02009-07-24 10:31:48 +0200217 vcxk_acknowledge_wait();
218 video_display_bitmap(splash, 0, 0);
219 }
220#endif
221 return 0;
222}
223#endif
Heiko Schocherac1956e2006-04-20 08:42:42 +0200224
225/*---------------------------------------------------------------------------*/
226
Jens Scharsig772d9b02009-07-24 10:31:48 +0200227#ifdef CONFIG_VIDEO
Wolfgang Denk6262d0212010-06-28 22:00:46 +0200228int do_brightness(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
Heiko Schocherac1956e2006-04-20 08:42:42 +0200229{
230 int rcode = 0;
Jens Scharsig772d9b02009-07-24 10:31:48 +0200231 ulong side;
232 ulong bright;
Heiko Schocherac1956e2006-04-20 08:42:42 +0200233
234 switch (argc) {
Jens Scharsig772d9b02009-07-24 10:31:48 +0200235 case 3:
236 side = simple_strtoul(argv[1], NULL, 10);
237 bright = simple_strtoul(argv[2], NULL, 10);
238 if ((side >= 0) && (side <= 3) &&
239 (bright >= 0) && (bright <= 1000)) {
240 vcxk_setbrightness(side, bright);
241 rcode = 0;
242 } else {
243 printf("parameters out of range\n");
244 printf("Usage:\n%s\n", cmdtp->usage);
245 rcode = 1;
246 }
Heiko Schocherac1956e2006-04-20 08:42:42 +0200247 break;
248 default:
Jens Scharsig772d9b02009-07-24 10:31:48 +0200249 printf("Usage:\n%s\n", cmdtp->usage);
Heiko Schocherac1956e2006-04-20 08:42:42 +0200250 rcode = 1;
251 break;
252 }
253 return rcode;
254}
255
Jens Scharsig772d9b02009-07-24 10:31:48 +0200256/*---------------------------------------------------------------------------*/
Heiko Schocherac1956e2006-04-20 08:42:42 +0200257
258U_BOOT_CMD(
Jens Scharsig772d9b02009-07-24 10:31:48 +0200259 bright, 3, 0, do_brightness,
260 "sets the display brightness\n",
261 " <side> <0..1000>\n side: 0/3=both; 1=first; 2=second\n"
Heiko Schocherac1956e2006-04-20 08:42:42 +0200262);
263
Jens Scharsig772d9b02009-07-24 10:31:48 +0200264#endif
265
266/* EOF EB+MCF-EV123.c */