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

📄 ucboot.c

📁 source code of armboot for s3c4510
💻 C
字号:
/* * This file is only to emulate uCboot environment related functions. * If kernel & userland use environment supplied by uCboot methods, use this function
 */#include <armboot.h>#include "s3c2510.h"#ifdef CONFIG_UCBOOTSTRAP	/* The uCbootstrap system calls use	*/#define FEF_WEAK        0x0001#define FEF_BOOT_MASK   0x000E#define FEF_BOOT_READ   0x0002#define FEF_BOOT_WRITE  0x0004#define FEF_BOOT_WHITE  0x0008#define FEF_SUPER_MASK  0x00E0#define FEF_SUPER_READ  0x0020#define FEF_SUPER_WRITE 0x0040#define FEF_SUPER_WHITE 0x0080#define FEF_USER_MASK   0x0E00#define FEF_USER_READ   0x0200#define FEF_USER_WRITE  0x0400#define FEF_USER_WHITE  0x0800#define FEF_FACTORY     0x1000#define FEF_SERIAL      0x2000#define FEV_VALID       0xffffffffUL#define FEV_WHITEOUT    0x0000#define FEV_PROTECT     0x0001int pmask = FEF_BOOT_READ | FEF_BOOT_WRITE;bd_t *bd_save;typedef struct _memnode {  int len;  int *offset;} mnode_t;//================================================int bsc_test(int a, int b, int c, int d, int e){    printf("bsc_test(%d, %d, %d, %d, %d)\n",a,b,c,d,e);    return (e);}/* find an entry in FLASH memory */char * bsc_getenv(char *name){	//unsigned long flags;	char * fev;	unsigned int temp;#if 1	// hans, because of ethernet bug of kernel driver	temp = (unsigned int)bd_save->bi_env;	//hans	if((*name =='H')&&(*(name+1) =='W')&&(*(name+2) =='A')&&(*(name+3) =='D')&&(*(name+4) =='D')&&(*(name+5) =='R')){		bd_save->bi_env =0;						//hans --> get data from flash	}#endif	fev = getenv (bd_save, name);#if 1	// hans, because of ethernet bug of kernel driver	bd_save->bi_env = (env_t*)temp;			//hans#endif	return fev;}//===========================================================//===========================================================//===========================================================// 02.12.~ 03.01. ARMBOOT +  uCEmulation append code section//===========================================================//===========================================================//==========================================================// append  @0 bsc_reset   code by LAPUTA// unreachable ......?????//===========================================================int bsc_reset(int flags){	//if(flags){//		printf("LAPUTA RESET\n");		reset_call(bd_save);//	}}//============================================================// append @17 bsc_readenv by LAPUTA// cmd =>// 0= start initial & return 1st name return// 1= index name return// 2= value of name return// ===> ../common/cmd_nvedit.c : readenv(bd_t *bd, int cmd)//============================================================char * bsc_readenv(int cmd){	char *fev;	env_t *old_bi_env;	old_bi_env = bd_save->bi_env;	bd_save->bi_env =0;			// flash read	fev =readenv(bd_save,cmd);	bd_save->bi_env = old_bi_env;	return fev;}//============================================================// append @18 flash_chattr_range by LAPUTA// flashptr => flash memory base address// start => start address that we want to modify dirty bit// end => end address that we want to modify dirty bit//// ../common/flash.c :flash_protect_range( start_addr,int end_addr,int protect_flag)//  uCboot  -> 0x01 : Dirty, 0x02 : Erased, 0x04:Protect//// FLAG_PROTECT_SET = 0x01// FLAG_PROTECT_CLEAR = 0x02// cmd_flash.c: flash_protect_range -> flash_sect_protect//============================================================int flash_chattr_range(unsigned short *flashptr, int start, int end, char and, char or){	//int flag = (or & PROTECT_FLAG) ?  FLAG_PROTECT_SET :  FLAG_PROTECT_CLEAR ;		// only protect set	int flag = (or & PROTECT_FLAG) ?  1 :  0 ;		// only protect set	//printf("\n\nflag : %x,%x\n",or,flag);	if(flash_protect_range(flashptr,start, end, flag))// protect set info->protect[n]		return 1;	else		return 0;			// SET/clear error}//============================================================// append @19 flash_erase_range by LAPUTAflash_sect_erase// start => start address that we want to erase// end => end address that we want to erase//start : erase start address// end : erase end address////../common/flash.c :flash_sect_erase(ulomg start_addr, ulong end_addr)//============================================================int flash_erase_range(unsigned short *flashptr, int start, int end){	ulong start_addr;	ulong end_addr;	start_addr = flashptr;		// start address save	start_addr += start;		// seperator calc cause address type mismatch	end_addr = flashptr;	end_addr += end;	printf("\n\nflash ERASE  from:[%x]  ~  to:[%x] \n", start_addr, end_addr);	// sector erase where sector of start & end address 	flash_sect_erase(start_addr ,  end_addr);	return 0;}//==========================================================//===========================================================// append @20 falsh_write_range by LAPUTA// ../common/flash.c : flash_write(uchar *src, ulong offset, ulong len)// src : ram start address of source// offset : flash write start address// len : No# write byte s//// ../common/flash.c :flash_write(uchar *src ,       ulong addr,         ulong cnt)//===========================================================int flash_write_range(unsigned short * flashptr, mnode_t *mnode, int offset){ 	printf("uCFlash write source(RAM) start address : [%x]\n",&mnode->offset);	printf("uCFlash write dest.(FLASH) start address : [%x]\n",offset);	flash_write((unsigned char *)mnode->offset, (unsigned long)offset, (unsigned long)mnode->len);	           // (uchar *src ,       ulong addr,         ulong cnt)	printf("Flash Write DONE!.......................\n");	return 0;}//==========================================================//==========================================================// append  @21 bsc_ramload   code by LAPUTA// unreachable.......////../common/cmd_nvedit.c : go_ram(bd_t *bd,int flag)// --->boocmd & reset  & while loop//===========================================================#define	DRAM_APP_START	0x40000			// application of ram start addressint bsc_ramload(mnode_t *mnode, int flag){	void	**chain = (void **)mnode->offset;	int	len = mnode->len;	int	length,offset;	int	block = 0;	for(offset =0; offset <len ;offset+= 4096,block++){		if((len-offset)>4096)	length = 4096;		else				length = len - 4096;		printf("Flash %2d block [%x] write to ram start ......\n",block,DRAM_BASE+DRAM_APP_START+offset);		memcpy( (void *)(DRAM_BASE+DRAM_APP_START+offset),(void *)chain[block],length);		printf("WRITE DONE ! ! ...\n");	}	//to cmd_nvedit.c	go_ram(bd_save,flag);	return 0;}//===========================================================//-------------------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------------------------/* @15 write an entry in ram area */int bsc_setenv(char *pair){	char *p;	if (!pair)		return -1;	for (p=pair; *p; p++)	{		if (*p == '=')		{			*(p++) = 0;			break;		}	}	setenv (bd_save, pair, p);	board_env_save(bd_save, bd_save->bi_env, sizeof(env_t));        // 20030220 added by drsohn	return 0;}void *bsc_getserialnum(void){	int mask = pmask;	void *ret;	pmask = FEF_BOOT_READ | FEF_SUPER_READ | FEF_USER_READ;	ret =(void *)bsc_getenv("SERIAL");	pmask = mask;	return(ret ? ret : "none");}/* reset:  Reset external devices and the processor */void *bsc_gethwaddr(int ifnum){	int mask = pmask;	char *ret;	int i;	unsigned char tempconv[3]={0, 0, 0};	static unsigned char hwaddr[6] = {0, 0, 0, 0, 0, 0};	pmask = FEF_BOOT_READ | FEF_SUPER_READ | FEF_USER_READ;	ret =(char *)bsc_getenv( ifnum? "HWADDR1" : "HWADDR0");	pmask = mask;	memset(hwaddr, 0, 6);		if (ret && strlen(ret) == 17) {		for (i=0; i<6; i++) {			tempconv[0] = ret[i*3];			tempconv[1] = ret[i*3 +1];			tempconv[2] =0;			hwaddr[i] = simple_strtoul(tempconv, 0, 16);		}	}	return(&hwaddr);}int bsc_setpmask(int mask){  pmask = mask;  return 0;}#endif	/* CONFIG_UCBOOTSTRAP */

⌨️ 快捷键说明

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