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