/****************************************************************************** * Copyright (c) 2004, 2008 IBM Corporation * All rights reserved. * This program and the accompanying materials * are made available under the terms of the BSD License * which accompanies this distribution, and is available at * http://www.opensource.org/licenses/bsd-license.php * * Contributors: * IBM Corporation - initial implementation *****************************************************************************/ #include #include #include #include #include #include #include #include #include "rtas_board.h" volatile unsigned char *uart; volatile unsigned char u4Flag; void io_init(void); unsigned long check_flash_image(unsigned long rombase, unsigned long length, unsigned long start_crc); void io_init(void) { // read ID register: only if it is a PC87427, enable serial2 store8_ci(0xf400002e, 0x20); if (load8_ci(0xf400002f) != 0xf2) { uart = (volatile unsigned char *) 0xf40003f8; u4Flag = 0; } else { uart = (volatile unsigned char *) 0xf40002f8; u4Flag = 1; } } static void display_char(char ch) { volatile int i = 0; volatile unsigned char *uart = (volatile unsigned char *) 0xf40002f8; int cnt = 2; while (cnt--) { set_ci(); while (!(uart[5] & 0x20)) { i++; } uart[0] = ch; clr_ci(); uart += 0x100; } } ssize_t write(int fd __attribute((unused)), const void *buf, size_t cnt) { while (cnt--) { display_char(*(char *) buf); if (*(char *) buf++ == '\n') display_char('\r'); } return 0; } void * sbrk(int incr __attribute((unused))) { return (void *) -1; } void rtas_display_character(rtas_args_t * pArgs) { int retVal = 0; display_char((char) pArgs->args[0]); pArgs->args[1] = retVal; } unsigned long check_flash_image(unsigned long rombase, unsigned long length, unsigned long start_crc) { const uint32_t CrcTableHigh[16] = { 0x00000000, 0x4C11DB70, 0x9823B6E0, 0xD4326D90, 0x34867077, 0x7897AB07, 0xACA5C697, 0xE0B41DE7, 0x690CE0EE, 0x251D3B9E, 0xF12F560E, 0xBD3E8D7E, 0x5D8A9099, 0x119B4BE9, 0xC5A92679, 0x89B8FD09 }; const uint32_t CrcTableLow[16] = { 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD }; char *Buffer = (char *) rombase; uint32_t AccumCRC = start_crc; char val; uint32_t Temp; while (length-- > 0) { set_ci(); val = *Buffer; clr_ci(); Temp = ((AccumCRC >> 24) ^ val) & 0x000000ff; AccumCRC <<= 8; AccumCRC ^= CrcTableHigh[Temp / 16]; AccumCRC ^= CrcTableLow[Temp % 16]; ++Buffer; } return AccumCRC; }