xref: /rk3399_rockchip-uboot/board/BuS/eb_cpu5282/eb_cpu5282.c (revision 00caae6d47645e68d6e5277aceb69592b49381a6)
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