xfer.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
- /*
- * arch/mips/galileo/compressed/xfer.c
- *
- * By RidgeRun Inc,
- *
- * Xfer an image from flash to ram.
- * For use with Galileo EVB64120A MIPS eval board.
- */
- #include "linux/serial_reg.h"
- #define port 0xbd000000
- #define inb(addr) (*(volatile unsigned char *) ((unsigned long)(addr)))
- #define outb(b,addr) (*(volatile unsigned char *) ((unsigned long)(addr)) = (b))
- #ifdef RUNNINGFROMFLASH
- // This is where our image of interest is mapped to
- // when the jumbers are set for booting out of flash.
- // (flash part starts at address 0xbfC00000)
- #define srcAddr 0xbfC20000
- #else
- // This is where our image of interest is mapped to
- // when the jumbers are set for booting out of eprom.
- // (flash part starts at address 0xbf000000)
- #define srcAddr 0xbf020000
- #endif
- static int PortAddress(unsigned int channel, unsigned char reg);
- static void inline cons_hook(void);
- static void print_message(const char *string);
- /******************************
- Routine:
- Description:
- ******************************/
- void XferToRam(void)
- {
- unsigned int temp;
- void (*entry_point) (void);
- cons_hook();
- print_message("Copying image from Flash to Ram.n");
- for (temp = 0; temp < (0x100000 - 0x20000); temp = temp + 4) {
- *(volatile unsigned int *) (temp + 0xa0400000) =
- *(volatile unsigned int *) (temp + srcAddr);
- if (*(volatile unsigned int *) (temp + 0xa0400000) !=
- *(volatile unsigned int *) (temp + srcAddr)) {
- print_message
- ("Error!: copy verification failed.n");
- break;
- }
- }
- print_message("Now jumping to the code just xferred to ram.n");
- entry_point = (void *) 0x80400000;
- entry_point();
- }
- /******************************
- Routine:
- Description:
- ******************************/
- static int PortAddress(unsigned int channel, unsigned char reg)
- {
- unsigned int channelOffset = 0x20;
- unsigned int regDelta = 4;
- return (port + (channel * channelOffset) + (reg * regDelta));
- }
- /******************************
- Routine:
- Description:
- ******************************/
- static void cons_hook(void)
- {
- register int comstat;
- unsigned temp;
- unsigned int channel = 1; // Channel 1 is the main serial
- // connector of the EVB64120A. Channel 0
- // is the secondary serial port (typically
- // the unsoldered connector of the board).
- temp = *(unsigned int *) 0xb4000464;
- *(unsigned int *) 0xb4000464 = 0xffff4f14;
- // Set Baud Rate, baud=115K
- outb(0x83, PortAddress(channel, UART_LCR));
- outb(0x00, PortAddress(channel, UART_DLM));
- outb(0x02, PortAddress(channel, UART_DLL));
- outb(0x03, PortAddress(channel, UART_LCR));
- comstat = inb(PortAddress(channel, UART_LSR));
- comstat = inb(PortAddress(channel, UART_RX));
- outb(0x00, PortAddress(channel, UART_IER));
- }
- /******************************
- Routine:
- Description:
- ******************************/
- static void print_message(const char *string)
- {
- register int count, loop;
- /* Display Opening Message */
- for (count = 0; string[count]; count++) {
- if (string[count] == 'n') {
- *(char *) 0xbd000020 = 'r';
- }
- *(char *) 0xbd000020 = string[count];
- for (loop = 0; loop < 2000; loop++) {
- }
- }
- }