⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xfer.c

📁 一个2.4.21版本的嵌入式linux内核
💻 C
字号:
/* *  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#endifstatic 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++) {		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -