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 38*088454cdSSimon Glass int initdram(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 95*088454cdSSimon Glass gd->ram_size = size; 96*088454cdSSimon Glass 97*088454cdSSimon Glass return 0; 98eb0b43f2SJens Scharsig } 99eb0b43f2SJens Scharsig 100eb0b43f2SJens Scharsig #if defined(CONFIG_SYS_DRAM_TEST) 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) 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; 142d858c335SJens Scharsig (BuS Elektronik) s = getenv("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) 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) 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 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) 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) 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 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 "); 194d858c335SJens Scharsig (BuS Elektronik) s = getenv("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 200d858c335SJens Scharsig (BuS Elektronik) s = getenv("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 214d858c335SJens Scharsig (BuS Elektronik) s = getenv("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 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