1 /********************************************************************
3 * Unless otherwise specified, Copyright (C) 2004-2005 Barco Control Rooms
5 * $Source: /home/services/cvs/firmware/ppc/u-boot-1.1.2/board/barco/barco.c,v $
8 * $Date: 2005/03/02 16:40:20 $
10 * Last ChangeLog Entry
12 * Revision 1.4 2005/03/02 16:40:20 mleeman
13 * remove empty labels (3.4 complains)
15 * Revision 1.3 2005/02/21 12:48:58 mleeman
16 * update of copyright years (feedback wd)
18 * Revision 1.2 2005/02/21 10:10:53 mleeman
19 * - split up switch statement to a function call (Linux kernel coding guidelines)
22 * Revision 1.1 2005/02/14 09:31:07 mleeman
25 * Revision 1.1 2005/02/14 09:23:46 mleeman
26 * - moved 'barcohydra' directory to a more generic barco; since we will be
27 * supporting and adding multiple boards
29 * Revision 1.3 2005/02/10 13:57:32 mleeman
30 * fixed flash corruption: I should exit from the moment I find the correct value
32 * Revision 1.2 2005/02/09 12:56:23 mleeman
33 * add generic header to track changes in sources
36 *******************************************************************/
40 * Marc Leeman <marc.leeman@barco.com>
42 * This program is free software; you can redistribute it and/or
43 * modify it under the terms of the GNU General Public License as
44 * published by the Free Software Foundation; either version 2 of
45 * the License, or (at your option) any later version.
47 * This program is distributed in the hope that it will be useful,
48 * but WITHOUT ANY WARRANTY; without even the implied warranty of
49 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
50 * GNU General Public License for more details.
52 * You should have received a copy of the GNU General Public License
53 * along with this program; if not, write to the Free Software
54 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
65 #include "barco_svc.h"
67 #define TRY_WORKING (3)
68 #define BOOT_DEFAULT (2)
69 #define BOOT_WORKING (1)
73 /*TODO: Check processor type */
75 puts ( "Board: Streaming Video Card for Hydra systems "
82 " Unity ##Test not implemented yet##\n");
86 long int initdram (int board_type)
93 size = get_ram_size(CFG_SDRAM_BASE, CFG_MAX_RAM_SIZE);
95 new_bank0_end = size - 1;
96 mear1 = mpc824x_mpc107_getreg(MEAR1);
97 emear1 = mpc824x_mpc107_getreg(EMEAR1);
98 mear1 = (mear1 & 0xFFFFFF00) |
99 ((new_bank0_end & MICR_ADDR_MASK) >> MICR_ADDR_SHIFT);
100 emear1 = (emear1 & 0xFFFFFF00) |
101 ((new_bank0_end & MICR_ADDR_MASK) >> MICR_EADDR_SHIFT);
102 mpc824x_mpc107_setreg(MEAR1, mear1);
103 mpc824x_mpc107_setreg(EMEAR1, emear1);
109 * Initialize PCI Devices, report devices found.
111 #ifndef CONFIG_PCI_PNP
112 static struct pci_config_table pci_barcohydra_config_table[] = {
113 { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x0f, PCI_ANY_ID,
114 pci_cfgfunc_config_device, { PCI_ENET0_IOADDR,
116 PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER }},
117 { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x10, PCI_ANY_ID,
118 pci_cfgfunc_config_device, { PCI_ENET1_IOADDR,
120 PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER }},
125 struct pci_controller hose = {
126 #ifndef CONFIG_PCI_PNP
127 config_table: pci_barcohydra_config_table,
131 void pci_init_board(void)
133 pci_mpc824x_init(&hose);
136 int write_flash(char *addr, char value)
138 char *adr = (char *)0xFF800000;
140 char status,oldstatus;
156 if ((oldstatus & 0x40) == (status & 0x40)){
163 }while( (status & 0x20) == 0 );
168 if ((oldstatus & 0x40) == (status & 0x40)) return 0;
175 unsigned update_flash(unsigned char* buf){
176 switch((*buf) & 0x3){
178 printf("found 3 and converted it to 2\n");
179 write_flash(buf, (*buf) & 0xFE);
180 *((unsigned char *)0xFF800000) = 0xF0;
182 printf("buf [%#010x] %#010x\n",buf,(*buf));
189 unsigned scan_flash(void)
191 char section[] = "kernel";
193 int cfgFileLen = (CFG_FLASH_ERASE_SECTOR_LENGTH >> 1);
195 int foundItem = 0; /* 0: None, 1: section found, 2: "=" found */
199 buf = (unsigned char*)(CFG_FLASH_RANGE_BASE + CFG_FLASH_RANGE_SIZE \
200 - CFG_FLASH_ERASE_SECTOR_LENGTH);
201 for(bufPtr = 0; bufPtr < cfgFileLen; ++bufPtr){
202 if ((buf[bufPtr]==0xFF) && (*(int*)(buf+bufPtr)==0xFFFFFFFF)) {
207 /* This is the scanning loop, we try to find a particular
211 if((section[sectionPtr] == 0)){
214 else if(buf[bufPtr] == section[sectionPtr]){
229 return update_flash(buf[bufPtr - 1]);
233 printf("Failed to read %s\n",section);
237 TSBootInfo* find_boot_info(void)
239 unsigned bootimage = scan_flash();
240 TSBootInfo* info = (TSBootInfo*)malloc(sizeof(TSBootInfo));
244 info->address = CFG_WORKING_KERNEL_ADDRESS;
247 info->address = CFG_WORKING_KERNEL_ADDRESS;
251 info->address= CFG_DEFAULT_KERNEL_ADDRESS;
254 info->size = *((unsigned int *)(info->address ));
259 void barcobcd_boot(void)
266 buf = (char *)(0x00800000);
267 /* make certain there are enough chars to print the command line here!
269 bootm_args[0]=(char *)malloc(16*sizeof(char));
270 bootm_args[1]=(char *)malloc(16*sizeof(char));
272 start = find_boot_info();
274 printf("Booting kernel at address %#10x with size %#10x\n",
275 start->address, start->size);
277 /* give length of the kernel image to bootm */
278 sprintf(bootm_args[0],"%x",start->size);
279 /* give address of the kernel image to bootm */
280 sprintf(bootm_args[1],"%x",buf);
282 printf("flash address: %#10x\n",start->address+8);
283 printf("buf address: %#10x\n",buf);
285 /* aha, we reserve 8 bytes here... */
286 for (cnt = 0; cnt < start->size ; cnt++){
287 buf[cnt] = ((char *)start->address)[cnt+8];
290 /* initialise RAM memory */
291 *((unsigned int *)0xFEC00000) = 0x00141A98;
292 do_bootm(NULL,0,2,bootm_args);
295 int barcobcd_boot_image(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
299 printf ("Usage:\n (%d) %s\n", argc, cmdtp->usage);
308 /* Currently, boot_working and boot_default are the same command. This is
309 * left in here to see what we'll do in the future */
312 try_working, 1, 1, barcobcd_boot_image,
313 " try_working - check flash value and boot the appropriate image\n",
318 boot_working, 1, 1, barcobcd_boot_image,
319 " boot_working - check flash value and boot the appropriate image\n",
324 boot_default, 1, 1, barcobcd_boot_image,
325 " boot_default - check flash value and boot the appropriate image\n",
329 * We are not using serial communication, so just provide empty functions
331 int serial_init(void){return 0;}
332 void serial_setbrg(void){}
333 void serial_putc(const char c){}
334 void serial_puts(const char *c){}
335 void serial_addr(unsigned int i){}
336 int serial_getc(void){return 0;}
337 int serial_tstc(void){return 0;}
339 unsigned long post_word_load(void){return 0l;};
340 void post_word_store(unsigned long val){}