xref: /rk3399_rockchip-uboot/board/BuS/eb_cpu5282/eb_cpu5282.c (revision 2d8d190c8394b43c0989cdb04a50cb48d4e1f8da)
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 
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 
38eb0b43f2SJens Scharsig phys_size_t initdram (int board_type)
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
95eb0b43f2SJens Scharsig 	return size;
96eb0b43f2SJens Scharsig }
97eb0b43f2SJens Scharsig 
98eb0b43f2SJens Scharsig #if defined(CONFIG_SYS_DRAM_TEST)
99eb0b43f2SJens Scharsig int testdram (void)
100eb0b43f2SJens Scharsig {
101eb0b43f2SJens Scharsig 	uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
102eb0b43f2SJens Scharsig 	uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
103eb0b43f2SJens Scharsig 	uint *p;
104eb0b43f2SJens Scharsig 
105eb0b43f2SJens Scharsig 	printf("SDRAM test phase 1:\n");
106eb0b43f2SJens Scharsig 	for (p = pstart; p < pend; p++)
107eb0b43f2SJens Scharsig 		*p = 0xaaaaaaaa;
108eb0b43f2SJens Scharsig 
109eb0b43f2SJens Scharsig 	for (p = pstart; p < pend; p++) {
110eb0b43f2SJens Scharsig 		if (*p != 0xaaaaaaaa) {
111eb0b43f2SJens Scharsig 			printf ("SDRAM test fails at: %08x\n", (uint) p);
112eb0b43f2SJens Scharsig 			return 1;
113eb0b43f2SJens Scharsig 		}
114eb0b43f2SJens Scharsig 	}
115eb0b43f2SJens Scharsig 
116eb0b43f2SJens Scharsig 	printf("SDRAM test phase 2:\n");
117eb0b43f2SJens Scharsig 	for (p = pstart; p < pend; p++)
118eb0b43f2SJens Scharsig 		*p = 0x55555555;
119eb0b43f2SJens Scharsig 
120eb0b43f2SJens Scharsig 	for (p = pstart; p < pend; p++) {
121eb0b43f2SJens Scharsig 		if (*p != 0x55555555) {
122eb0b43f2SJens Scharsig 			printf ("SDRAM test fails at: %08x\n", (uint) p);
123eb0b43f2SJens Scharsig 			return 1;
124eb0b43f2SJens Scharsig 		}
125eb0b43f2SJens Scharsig 	}
126eb0b43f2SJens Scharsig 
127eb0b43f2SJens Scharsig 	printf("SDRAM test passed.\n");
128eb0b43f2SJens Scharsig 	return 0;
129eb0b43f2SJens Scharsig }
130eb0b43f2SJens Scharsig #endif
131eb0b43f2SJens Scharsig 
132d858c335SJens Scharsig (BuS Elektronik) #if defined(CONFIG_HW_WATCHDOG)
133d858c335SJens Scharsig (BuS Elektronik) 
134d858c335SJens Scharsig (BuS Elektronik) void hw_watchdog_init(void)
135d858c335SJens Scharsig (BuS Elektronik) {
136d858c335SJens Scharsig (BuS Elektronik) 	char *s;
137d858c335SJens Scharsig (BuS Elektronik) 	int enable;
138d858c335SJens Scharsig (BuS Elektronik) 
139d858c335SJens Scharsig (BuS Elektronik) 	enable = 1;
140d858c335SJens Scharsig (BuS Elektronik) 	s = getenv("watchdog");
141d858c335SJens Scharsig (BuS Elektronik) 	if (s != NULL)
142d858c335SJens Scharsig (BuS Elektronik) 		if ((strncmp(s, "off", 3) == 0) || (strncmp(s, "0", 1) == 0))
143d858c335SJens Scharsig (BuS Elektronik) 			enable = 0;
144d858c335SJens Scharsig (BuS Elektronik) 	if (enable)
145d858c335SJens Scharsig (BuS Elektronik) 		MCFGPTA_GPTDDR  |= (1<<2);
146d858c335SJens Scharsig (BuS Elektronik) 	else
147d858c335SJens Scharsig (BuS Elektronik) 		MCFGPTA_GPTDDR  &= ~(1<<2);
148d858c335SJens Scharsig (BuS Elektronik) }
149d858c335SJens Scharsig (BuS Elektronik) 
150d858c335SJens Scharsig (BuS Elektronik) void hw_watchdog_reset(void)
151d858c335SJens Scharsig (BuS Elektronik) {
152d858c335SJens Scharsig (BuS Elektronik) 	MCFGPTA_GPTPORT  ^= (1<<2);
153d858c335SJens Scharsig (BuS Elektronik) }
154d858c335SJens Scharsig (BuS Elektronik) #endif
155d858c335SJens Scharsig (BuS Elektronik) 
156eb0b43f2SJens Scharsig int misc_init_r(void)
157eb0b43f2SJens Scharsig {
158eb0b43f2SJens Scharsig #ifdef	CONFIG_HW_WATCHDOG
159eb0b43f2SJens Scharsig 	hw_watchdog_init();
160eb0b43f2SJens Scharsig #endif
161eb0b43f2SJens Scharsig 	return 1;
162eb0b43f2SJens Scharsig }
163eb0b43f2SJens Scharsig 
164d858c335SJens Scharsig (BuS Elektronik) void __led_toggle(led_id_t mask)
165d858c335SJens Scharsig (BuS Elektronik) {
166d858c335SJens Scharsig (BuS Elektronik) 	MCFGPTA_GPTPORT ^= (1 << 3);
167d858c335SJens Scharsig (BuS Elektronik) }
168d858c335SJens Scharsig (BuS Elektronik) 
169d858c335SJens Scharsig (BuS Elektronik) void __led_init(led_id_t mask, int state)
170d858c335SJens Scharsig (BuS Elektronik) {
171d858c335SJens Scharsig (BuS Elektronik) 	__led_set(mask, state);
172d858c335SJens Scharsig (BuS Elektronik) 	MCFGPTA_GPTDDR  |= (1 << 3);
173d858c335SJens Scharsig (BuS Elektronik) }
174d858c335SJens Scharsig (BuS Elektronik) 
175d858c335SJens Scharsig (BuS Elektronik) void __led_set(led_id_t mask, int state)
176d858c335SJens Scharsig (BuS Elektronik) {
177*2d8d190cSUri Mashiach 	if (state == CONFIG_LED_STATUS_ON)
178d858c335SJens Scharsig (BuS Elektronik) 		MCFGPTA_GPTPORT |= (1 << 3);
179d858c335SJens Scharsig (BuS Elektronik) 	else
180d858c335SJens Scharsig (BuS Elektronik) 		MCFGPTA_GPTPORT &= ~(1 << 3);
181d858c335SJens Scharsig (BuS Elektronik) }
182d858c335SJens Scharsig (BuS Elektronik) 
183eb0b43f2SJens Scharsig #if defined(CONFIG_VIDEO)
184eb0b43f2SJens Scharsig 
185eb0b43f2SJens Scharsig int drv_video_init(void)
186eb0b43f2SJens Scharsig {
187eb0b43f2SJens Scharsig 	char *s;
188d858c335SJens Scharsig (BuS Elektronik) #ifdef CONFIG_SPLASH_SCREEN
189eb0b43f2SJens Scharsig 	unsigned long splash;
190d858c335SJens Scharsig (BuS Elektronik) #endif
191eb0b43f2SJens Scharsig 	printf("Init Video as ");
192d858c335SJens Scharsig (BuS Elektronik) 	s = getenv("displaywidth");
193d858c335SJens Scharsig (BuS Elektronik) 	if (s != NULL)
194eb0b43f2SJens Scharsig 		display_width = simple_strtoul(s, NULL, 10);
195eb0b43f2SJens Scharsig 	else
196eb0b43f2SJens Scharsig 		display_width = 256;
197eb0b43f2SJens Scharsig 
198d858c335SJens Scharsig (BuS Elektronik) 	s = getenv("displayheight");
199d858c335SJens Scharsig (BuS Elektronik) 	if (s != NULL)
200eb0b43f2SJens Scharsig 		display_height = simple_strtoul(s, NULL, 10);
201eb0b43f2SJens Scharsig 	else
202eb0b43f2SJens Scharsig 		display_height = 256;
203eb0b43f2SJens Scharsig 
204eb0b43f2SJens Scharsig 	printf("%lu x %lu pixel matrix\n", display_width, display_height);
205eb0b43f2SJens Scharsig 
206eb0b43f2SJens Scharsig 	MCFCCM_CCR &= ~MCFCCM_CCR_SZEN;
207eb0b43f2SJens Scharsig 	MCFGPIO_PEPAR &= ~MCFGPIO_PEPAR_PEPA2;
208eb0b43f2SJens Scharsig 
209eb0b43f2SJens Scharsig 	vcxk_init(display_width, display_height);
210eb0b43f2SJens Scharsig 
211eb0b43f2SJens Scharsig #ifdef CONFIG_SPLASH_SCREEN
212d858c335SJens Scharsig (BuS Elektronik) 	s = getenv("splashimage");
213d858c335SJens Scharsig (BuS Elektronik) 	if (s != NULL) {
214eb0b43f2SJens Scharsig 		splash = simple_strtoul(s, NULL, 16);
215eb0b43f2SJens Scharsig 		vcxk_acknowledge_wait();
216eb0b43f2SJens Scharsig 		video_display_bitmap(splash, 0, 0);
217eb0b43f2SJens Scharsig 	}
218eb0b43f2SJens Scharsig #endif
219eb0b43f2SJens Scharsig 	return 0;
220eb0b43f2SJens Scharsig }
221eb0b43f2SJens Scharsig #endif
222eb0b43f2SJens Scharsig 
223eb0b43f2SJens Scharsig /*---------------------------------------------------------------------------*/
224eb0b43f2SJens Scharsig 
225eb0b43f2SJens Scharsig #ifdef CONFIG_VIDEO
226eb0b43f2SJens Scharsig int do_brightness(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
227eb0b43f2SJens Scharsig {
228eb0b43f2SJens Scharsig 	int rcode = 0;
229eb0b43f2SJens Scharsig 	ulong side;
230eb0b43f2SJens Scharsig 	ulong bright;
231eb0b43f2SJens Scharsig 
232eb0b43f2SJens Scharsig 	switch (argc) {
233eb0b43f2SJens Scharsig 	case 3:
234eb0b43f2SJens Scharsig 		side = simple_strtoul(argv[1], NULL, 10);
235eb0b43f2SJens Scharsig 		bright = simple_strtoul(argv[2], NULL, 10);
236eb0b43f2SJens Scharsig 		if ((side >= 0) && (side <= 3) &&
237eb0b43f2SJens Scharsig 			(bright >= 0) && (bright <= 1000)) {
238eb0b43f2SJens Scharsig 			vcxk_setbrightness(side, bright);
239eb0b43f2SJens Scharsig 			rcode = 0;
240eb0b43f2SJens Scharsig 		} else {
241eb0b43f2SJens Scharsig 			printf("parameters out of range\n");
242eb0b43f2SJens Scharsig 			printf("Usage:\n%s\n", cmdtp->usage);
243eb0b43f2SJens Scharsig 			rcode = 1;
244eb0b43f2SJens Scharsig 		}
245eb0b43f2SJens Scharsig 		break;
246eb0b43f2SJens Scharsig 	default:
247eb0b43f2SJens Scharsig 		printf("Usage:\n%s\n", cmdtp->usage);
248eb0b43f2SJens Scharsig 		rcode = 1;
249eb0b43f2SJens Scharsig 		break;
250eb0b43f2SJens Scharsig 	}
251eb0b43f2SJens Scharsig 	return rcode;
252eb0b43f2SJens Scharsig }
253eb0b43f2SJens Scharsig 
254eb0b43f2SJens Scharsig /*---------------------------------------------------------------------------*/
255eb0b43f2SJens Scharsig 
256eb0b43f2SJens Scharsig U_BOOT_CMD(
257eb0b43f2SJens Scharsig 	bright,	3,	0,	do_brightness,
258eb0b43f2SJens Scharsig 	"sets the display brightness\n",
259eb0b43f2SJens Scharsig 	" <side> <0..1000>\n        side: 0/3=both; 1=first; 2=second\n"
260eb0b43f2SJens Scharsig );
261eb0b43f2SJens Scharsig 
262eb0b43f2SJens Scharsig #endif
263eb0b43f2SJens Scharsig 
264eb0b43f2SJens Scharsig /* EOF EB+MCF-EV123.c */
265