1 /********************************************************************
3 * Unless otherwise specified, Copyright (C) 2004-2005 Barco Control Rooms
10 * Last ChangeLog Entry
12 * Revision 1.1.5.1 2011-02-28 14:41:59 lothar
13 * imported Freescale specific U-Boot additions for i.MX28,... release L2.6.31_10.08.01
15 * Revision 1.4 2005/03/02 16:40:20 mleeman
16 * remove empty labels (3.4 complains)
18 * Revision 1.3 2005/02/21 12:48:58 mleeman
19 * update of copyright years (feedback wd)
21 * Revision 1.2 2005/02/21 10:10:53 mleeman
22 * - split up switch statement to a function call (Linux kernel coding guidelines)
25 * Revision 1.1 2005/02/14 09:31:07 mleeman
28 * Revision 1.1 2005/02/14 09:23:46 mleeman
29 * - moved 'barcohydra' directory to a more generic barco; since we will be
30 * supporting and adding multiple boards
32 * Revision 1.3 2005/02/10 13:57:32 mleeman
33 * fixed flash corruption: I should exit from the moment I find the correct value
35 * Revision 1.2 2005/02/09 12:56:23 mleeman
36 * add generic header to track changes in sources
39 *******************************************************************/
43 * Marc Leeman <marc.leeman@barco.com>
45 * This program is free software; you can redistribute it and/or
46 * modify it under the terms of the GNU General Public License as
47 * published by the Free Software Foundation; either version 2 of
48 * the License, or (at your option) any later version.
50 * This program is distributed in the hope that it will be useful,
51 * but WITHOUT ANY WARRANTY; without even the implied warranty of
52 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53 * GNU General Public License for more details.
55 * You should have received a copy of the GNU General Public License
56 * along with this program; if not, write to the Free Software
57 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
68 #include "barco_svc.h"
70 #define TRY_WORKING (3)
71 #define BOOT_DEFAULT (2)
72 #define BOOT_WORKING (1)
76 /*TODO: Check processor type */
78 puts ( "Board: Streaming Video Card for Hydra systems "
85 " Unity ##Test not implemented yet##\n");
89 phys_size_t initdram (int board_type)
96 size = get_ram_size (CONFIG_SYS_SDRAM_BASE, CONFIG_SYS_MAX_RAM_SIZE);
98 new_bank0_end = size - 1;
99 mear1 = mpc824x_mpc107_getreg (MEAR1);
100 emear1 = mpc824x_mpc107_getreg (EMEAR1);
101 mear1 = (mear1 & 0xFFFFFF00) |
102 ((new_bank0_end & MICR_ADDR_MASK) >> MICR_ADDR_SHIFT);
103 emear1 = (emear1 & 0xFFFFFF00) |
104 ((new_bank0_end & MICR_ADDR_MASK) >> MICR_EADDR_SHIFT);
105 mpc824x_mpc107_setreg (MEAR1, mear1);
106 mpc824x_mpc107_setreg (EMEAR1, emear1);
112 * Initialize PCI Devices, report devices found.
114 #ifndef CONFIG_PCI_PNP
115 static struct pci_config_table pci_barcohydra_config_table[] = {
116 { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x0f, PCI_ANY_ID,
117 pci_cfgfunc_config_device, { PCI_ENET0_IOADDR,
119 PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER } },
120 { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x10, PCI_ANY_ID,
121 pci_cfgfunc_config_device, { PCI_ENET1_IOADDR,
123 PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER } },
128 struct pci_controller hose = {
129 #ifndef CONFIG_PCI_PNP
130 config_table: pci_barcohydra_config_table,
134 void pci_init_board (void)
136 pci_mpc824x_init (&hose);
139 int write_flash (char *addr, char value)
141 char *adr = (char *)0xFF800000;
143 char status,oldstatus;
145 *(adr+0x55) = 0xAA; udelay (1);
146 *(adr+0xAA) = 0x55; udelay (1);
147 *(adr+0x55) = 0xA0; udelay (1);
155 if ((oldstatus & 0x40) == (status & 0x40)) {
162 } while ( (status & 0x20) == 0 );
167 if ((oldstatus & 0x40) == (status & 0x40)) {
175 unsigned update_flash (unsigned char *buf)
177 switch ((*buf) & 0x3) {
179 printf ("found 3 and converted it to 2\n");
180 write_flash ((char *)buf, (*buf) & 0xFE);
181 *((unsigned char *)0xFF800000) = 0xF0;
183 printf ("buf [%#010x] %#010x\n", (unsigned)buf, (*buf));
184 /* XXX - fall through??? */
191 unsigned scan_flash (void)
193 char section[] = "kernel";
194 int cfgFileLen = (CONFIG_SYS_FLASH_ERASE_SECTOR_LENGTH >> 1);
196 int foundItem = 0; /* 0: None, 1: section found, 2: "=" found */
200 buf = (unsigned char*)(CONFIG_SYS_FLASH_RANGE_BASE + CONFIG_SYS_FLASH_RANGE_SIZE \
201 - CONFIG_SYS_FLASH_ERASE_SECTOR_LENGTH);
202 for (bufPtr = 0; bufPtr < cfgFileLen; ++bufPtr) {
203 if ((buf[bufPtr]==0xFF) && (*(int*)(buf+bufPtr)==0xFFFFFFFF)) {
206 /* This is the scanning loop, we try to find a particular
211 if ((section[sectionPtr] == 0)) {
213 } else if (buf[bufPtr] == section[sectionPtr]) {
227 return update_flash (&buf[bufPtr - 1]);
231 printf ("Failed to read %s\n",section);
235 TSBootInfo* find_boot_info (void)
237 unsigned bootimage = scan_flash ();
238 TSBootInfo* info = (TSBootInfo*)malloc (sizeof(TSBootInfo));
242 info->address = CONFIG_SYS_WORKING_KERNEL_ADDRESS;
245 info->address = CONFIG_SYS_WORKING_KERNEL_ADDRESS;
249 info->address= CONFIG_SYS_DEFAULT_KERNEL_ADDRESS;
252 info->size = *((unsigned int *)(info->address ));
257 void barcobcd_boot (void)
263 extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
265 buf = (char *)(0x00800000);
266 /* make certain there are enough chars to print the command line here!
268 bootm_args[0] = (char *)malloc (16*sizeof(char));
269 bootm_args[1] = (char *)malloc (16*sizeof(char));
271 start = find_boot_info ();
273 printf ("Booting kernel at address %#10x with size %#10x\n",
274 start->address, start->size);
276 /* give length of the kernel image to bootm */
277 sprintf (bootm_args[0],"%x",start->size);
278 /* give address of the kernel image to bootm */
279 sprintf (bootm_args[1],"%x",(unsigned)buf);
281 printf ("flash address: %#10x\n",start->address+8);
282 printf ("buf address: %#10x\n",(unsigned)buf);
284 /* aha, we reserve 8 bytes here... */
285 for (cnt = 0; cnt < start->size ; cnt++) {
286 buf[cnt] = ((char *)start->address)[cnt+8];
289 /* initialise RAM memory */
290 *((unsigned int *)0xFEC00000) = 0x00141A98;
291 do_bootm (NULL,0,2,bootm_args);
294 int barcobcd_boot_image (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
307 /* Currently, boot_working and boot_default are the same command. This is
308 * left in here to see what we'll do in the future */
311 try_working, 1, 1, barcobcd_boot_image,
312 "check flash value and boot the appropriate image",
317 boot_working, 1, 1, barcobcd_boot_image,
318 "check flash value and boot the appropriate image",
323 boot_default, 1, 1, barcobcd_boot_image,
324 "check flash value and boot the appropriate image",
328 * We are not using serial communication, so just provide empty functions
330 int serial_init (void)
334 void serial_setbrg (void)
338 void serial_putc (const char c)
342 void serial_puts (const char *c)
346 void serial_addr (unsigned int i)
350 int serial_getc (void)
354 int serial_tstc (void)
359 unsigned long post_word_load (void)
363 void post_word_store (unsigned long val)