亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flash.c

?? xhyPXA255 Linux Bootloader 源程序
?? C
字號:
/////////////////////////////////////////////////////////////////////////////////// Copyright(c) 2001-2002 Hybus Co,.ltd. All rights reserved.//// Module name://      flash.c//// Description:////// Author://      bedguy//// Created://      2002.10/////////////////////////////////////////////////////////////////////////////////#include "flash.h"#ifdef XHYPER255A#define IT(x) 	(*((volatile unsigned short *)(x)))#else#define IT(x) 	(*((volatile unsigned int *)(x)))#endiftypedef enum {	ACT_PGM,	ACT_ERASE,	ACT_LOCK,	ACT_UNLOCK,	ACT_WRITE_BUF,} FLASH_ACTION;	// Static function defs.bool			EraseFlashBlocks(FUNIT *addr, ulong len);static bool		EraseOneFlashBlock(FUNIT *addr);static bool		FlashLock(FUNIT *addr);static bool		FlashUnlock();bool			FullStatusCheck(volatile FUNIT *addr, FLASH_ACTION which);bool DoWriteToFlashBlocks(CMD_TBL *cptr, int argc, char **argv){	long	dest=0, src=0, len, wsize;		switch (argc){		case 2 :			if (!StrCmp(argv[1], "kernel")){				dest = (long)KERNEL_SRAM_BASE;				src  = (long)KERNEL_DRAM_BASE;				len  = (long)KERNEL_MAX_SIZE;				printf("Saving kernel to flash...\n");			}			else if (!StrCmp(argv[1], "root")){				dest = (long)ROOT_SRAM_BASE;				src  = (long)ROOT_DRAM_BASE;				len  = (long)ROOT_MAX_SIZE;				printf("Saving root to flash...\n");			}			else if (!StrCmp(argv[1], "loader")){				dest = (long)LOADER_SRAM_BASE;				src  = (long)LOADER_DRAM_BASE;				len  = (long)LOADER_MAX_SIZE;				printf("Saving bootloader to flash...\n");			}			else {				printf(cptr->usage);				return false;				}			break;		// "flash [dest] [src] [len]".		case 4 :			if (!HexToInt(argv[1], &dest, 32) || !HexToInt(argv[2], &src, 32) ||					!HexToInt(argv[3], &len, 32)){				printf(cptr->usage);				return false;			}			if (dest % FLASH_BLOCK_SIZE){				printf("dest is not Flash Block Base.\n");				return false;			}			break;		default :			printf(cptr->usage);			return false;			break;	}	// erase flash blocks.	printf("Erase flash blocks from 0x%08lx to 0x%08lx.\n", dest, (long)dest+len-1);	if (!EraseFlashBlocks((FUNIT *)dest, len)) return false;	printf("\tDone.\n");	// write to flash.	printf("Write to flash...\n");	wsize = FLASH_BLOCK_SIZE;    do{            printf("\tWriting at 0x%08lx...", (ulong)dest);            if (!WriteToFlashBuffer((FUNIT *)dest, (FUNIT *)src)) break;            dest += FLASH_BLOCK_SIZE;            src += FLASH_BLOCK_SIZE;			ClearLine();    } while((len -= FLASH_BLOCK_SIZE) >0);	printf("\tWriting at 0x%08lx\r\n", (ulong)dest);	printf("\tDone\n");	IT(dest) = FlashCMD(READ_ARRAY);		return true;}	// DoWriteToFlashBlocks.bool WriteToFlashBuffer(void *dest, void *src){#ifdef XHYPER255A	int             i;        volatile FUNIT *s1=dest, *s2=src, result, *end=s1+(FLASH_BLOCK_SIZE/FBOUND);        ushort writeBuf = 32;        while (s1<end){                 *s1 = FlashCMD(WRITE_BUF);                                      do {                        *s1 = FlashCMD(STATUS_READ);                        result = *s1;                  } while  ((~result & STATUS_BUSY));                                     *s1 = (writeBuf)/2 - 1;                for (i=0; i<(writeBuf)/FBOUND; i++)			*s1++ = *s2++;		IT((s1)) = FlashCMD(WRITE_BUF_COMFIRM);		do {			result = IT(s1);		} while((result & STATUS_BUSY ) != STATUS_BUSY);		IT(s1) = FlashCMD(READ_ARRAY);        }#else	ulong		i=0;	volatile uchar *s1=(uchar *)dest; 	uchar *s2=(uchar *)src;		ushort  writeBuf = 32;			while(i < FLASH_BLOCK_SIZE)	{		int cnt = writeBuf / sizeof(ushort);		int result;					do {			IT(s1) = WRITE_BUF;			result = IT(s1);		} while((result & STATUS_BUSY ) != STATUS_BUSY);		IT(s1) = FlashCMD((writeBuf / sizeof(ushort) -1) | \				((writeBuf / sizeof(ushort) -1 ) << (sizeof(ulong) * 4)));		while(cnt--)		{				IT((s1+i)) = IT(s2);				i += sizeof(ulong);				s2 += sizeof(ulong);		}		IT((s1)) = FlashCMD(WRITE_BUF_COMFIRM);		do {			result = IT(s1);		} while((result & STATUS_BUSY ) != STATUS_BUSY);		IT(s1) = FlashCMD(READ_ARRAY);	}#endif	return true;}bool EraseFlashBlocks(FUNIT *addr, ulong len){	FUNIT	*ptr, *end=addr+len/FBOUND;	// erase block loop.	for (ptr=addr; ptr<end; ptr+=FLASH_BLOCK_SIZE/FBOUND){		ClearLine();		printf("\tErase Block at : 0x%08lx.", (long)ptr);		// erase block.		if (!EraseOneFlashBlock(ptr)){			return false;		}	}	printf("\n");	return true;}bool DoEraseFlashBlocks(CMD_TBL *cptr, int argc, char **argv){	ulong	addr=0, len, end;		switch (argc){        case 2 :            if (!StrCmp(argv[1], "kernel")){                addr = (long)KERNEL_SRAM_BASE;                len  = (long)KERNEL_MAX_SIZE;            }            else if (!StrCmp(argv[1], "root")){                addr = (long)ROOT_SRAM_BASE;                len  = (long)ROOT_MAX_SIZE;            }            else if (!StrCmp(argv[1], "loader")){                addr = (long)LOADER_SRAM_BASE;                len  = (long)LOADER_MAX_SIZE;            }             else {                printf(cptr->usage);                return false;            }			if ((long)addr%FLASH_BLOCK_SIZE){				printf("addr is not flash block base.\n");				return false;			}		    // erase flash blocks.		    printf("Erase flash blocks from 0x%08lx to 0x%08lx.\n", addr, (long)addr+len-1);		    if (!EraseFlashBlocks((FUNIT *)addr, len)) return false;		    printf("\tDone.\n");	        		    break;			// "erase [addr] [len]".	case 3 :		// error.		if (!HexToInt(argv[2], &len, 32)){			printf(cptr->usage);			return false;		}		if ((long)addr%FLASH_BLOCK_SIZE){			printf("addr is not flash block base.\n");			return false;		}		// erase flash blocks.		end = addr + len;		for (; addr<end; addr+=FLASH_BLOCK_SIZE){			if (!EraseOneFlashBlock((FUNIT *)addr)) return false;		}		break;	// error.	default :		printf(cptr->usage);		return false;		break;	}	return true;}	// DoEraseOneFlashBlock.static bool EraseOneFlashBlock(FUNIT *addr){	volatile FUNIT	*s=addr;	// error.	if ((long)addr%FLASH_BLOCK_SIZE) return false;		// do command.	*s = FlashCMD(ERASE_SETUP);	*s = FlashCMD(ERASE_CONFIRM);	if (!FullStatusCheck(s, ACT_ERASE)) return false;	return true;}	// EraseOne.bool DoFlashLock(CMD_TBL *cptr, int argc, char **argv){	long	i, addr, len, cnt;	// error.	if (argc < 2){		printf(cptr->usage);		return false;	}	switch (argc){		// "lock [addr]".		case 2 :			if (!StrCmp(argv[1], "loader")){				addr = (long)LOADER_SRAM_BASE;				len  = (long)LOADER_SRAM_MAX_SIZE;			}			else if (!StrCmp(argv[1], "kernel")){				addr = (long)KERNEL_SRAM_BASE;				len  = (long)KERNEL_MAX_SIZE;			}			else if (!StrCmp(argv[1], "root")){				addr = (long)ROOT_SRAM_BASE;				len  = (long)ROOT_MAX_SIZE;			}			else {				if (!HexToInt(argv[1], &addr, 32)){					printf(cptr->usage);					return false;				}				len = (long)FLASH_BLOCK_SIZE;			}			break;		// "lock [addr] [len]".		default :			printf(cptr->usage);			return false;			break;	}	// lock of flash blocks.	cnt = len/FLASH_BLOCK_SIZE + ((len&(FLASH_BLOCK_SIZE-1)) ? 1 : 0);	for (i=0; i<cnt; i++, addr+=FLASH_BLOCK_SIZE){		if (!FlashLock((FUNIT *)addr)) return false;	}	return true;}	// DoFlashLock.bool DoFlashUnlock(CMD_TBL *cptr, int argc, char **argv){	// error.	if (argc != 1){		printf(cptr->usage);		return false;	}	// Unlock of whole flash blocks.	if (!FlashUnlock()) return false;	return true;}	// DoFlashUnlock.bool FlashLock(FUNIT *addr){	volatile FUNIT	*s=addr;	// error.	if ((long)addr % FLASH_BLOCK_SIZE){		printf("addr is not flash block base.\n");		return false;	}		// do command.	*s = FlashCMD(FLASH_SETUP);	*s = FlashCMD(BLOCK_LOCK_BIT_SET);		if (!FullStatusCheck(s, ACT_LOCK)) return false;	return true;}	// FlashLock.bool FlashUnlock(void){	volatile FUNIT	*s=(FUNIT *)FLASH_BASE;	// do command.	*s = FlashCMD(FLASH_SETUP);	*s = FlashCMD(BLOCK_LOCK_BIT_CLEAR);		if (!FullStatusCheck(s, ACT_UNLOCK)) return false;	return true;}	// FlashUnlock.// error啊 樂欄擱 false, 酒聰擱 true return.bool FullStatusCheck(volatile FUNIT *addr, FLASH_ACTION which){	FUNIT	result;		// delay before command is done.	do {		*addr = FlashCMD(STATUS_READ);		result = *addr;	} while  ((~result & STATUS_BUSY));	*addr = FlashCMD(READ_ARRAY);	return true;	// if no error, return true.	if ((result & STATUS_ERR_FILTER) == 0) return true;	// if error, print out error message.	if (result & STATUS_LOCK_DETECT){		printf("Block Lock-bit detected.\n\n");	} else if (result & STATUS_VOLT_RANG_ERR){		printf("Voltage Range Error.\n\n");	} else if ((result & STATUS_CMD_SEQ_ERR) == STATUS_CMD_SEQ_ERR){		printf("Command Sequence Error.\n\n");  	} else if ((result & STATUS_PGM_ERR) && ACT_PGM){  	printf("\nWrite error at address 0x%08lx\n\n", (long)addr);	} else if ((result & STATUS_LOCK_ERR) && ACT_LOCK){		printf("Set Lock-Bit Error.\n\n");	} else if ((result & STATUS_ERASE_ERR) && ACT_ERASE){		printf("Fail to erase. retry again.\n\n");	} else if ((result & STATUS_UNLOCK_ERR) && ACT_UNLOCK){		printf("Clear Lock-Bit Error.\n\n");	}	else {		printf("Unknown Error.\n\n");	}	*addr = FlashCMD(STATUS_CLEAR);	*addr = FlashCMD(READ_ARRAY);	return true;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91成人免费电影| 91激情在线视频| 男人的天堂亚洲一区| 亚洲国产日韩a在线播放性色| 中文字幕一区三区| 亚洲男同1069视频| 亚洲综合丁香婷婷六月香| 亚洲综合图片区| 亚洲成a人片在线观看中文| 香蕉成人伊视频在线观看| 免费观看在线综合| 国产精品1区二区.| 91在线视频在线| 欧美三区在线观看| 日韩欧美中文字幕公布| 2023国产精品视频| 成人欧美一区二区三区视频网页 | 欧美一级生活片| 精品美女被调教视频大全网站| 精品粉嫩aⅴ一区二区三区四区| 精品电影一区二区三区 | 91年精品国产| 欧美日韩精品欧美日韩精品一综合| 69久久99精品久久久久婷婷| 久久亚洲欧美国产精品乐播| 成人欧美一区二区三区1314| 亚洲国产wwwccc36天堂| 韩国毛片一区二区三区| 成人黄页毛片网站| 欧美一区二区在线不卡| 国产人成一区二区三区影院| 夜夜嗨av一区二区三区网页| 韩国三级中文字幕hd久久精品| 成人国产在线观看| 欧美一区二区福利视频| 国产精品美女久久久久久久网站| 偷拍亚洲欧洲综合| 成人av在线资源网| 精品剧情在线观看| 亚洲精品国久久99热| 久久99精品久久久久久久久久久久 | 亚洲日本韩国一区| 久久国产精品无码网站| 欧日韩精品视频| 国产精品天美传媒沈樵| 免费观看30秒视频久久| 91黄色免费观看| 日本一区二区三区免费乱视频 | 国产视频不卡一区| 日韩精品一二区| 色域天天综合网| 国产精品视频yy9299一区| 免费看日韩a级影片| 在线亚洲+欧美+日本专区| 国产日韩欧美麻豆| 久久精品国产999大香线蕉| 色天使久久综合网天天| 中文字幕亚洲不卡| 国内精品久久久久影院色| 69精品人人人人| 亚洲福利一区二区三区| 91视视频在线直接观看在线看网页在线看| 日韩一级欧美一级| 青椒成人免费视频| 欧美人妖巨大在线| 一区二区成人在线| 色视频欧美一区二区三区| 中文字幕第一区综合| 国产传媒日韩欧美成人| 欧美videofree性高清杂交| 视频一区二区不卡| 91精品欧美综合在线观看最新 | 亚洲人成影院在线观看| 成人黄色在线看| 国产精品国模大尺度视频| 高潮精品一区videoshd| 国产午夜精品美女毛片视频| 国产久卡久卡久卡久卡视频精品| 日韩一区二区三区四区五区六区| 日韩av电影天堂| 日韩一区二区三区av| 久久av资源站| 日韩欧美国产综合| 国产一区二区三区免费| 国产女主播视频一区二区| 懂色av噜噜一区二区三区av| 国产精品电影院| 色婷婷久久一区二区三区麻豆| 亚洲成人午夜影院| 欧美mv和日韩mv国产网站| 国产精品一线二线三线精华| 国产欧美一区二区精品性色超碰| av不卡在线播放| 午夜影院久久久| 久久久综合精品| 成人午夜短视频| 亚洲一区二区三区视频在线播放| 欧美美女网站色| 国产伦精品一区二区三区免费| 久久综合色播五月| 99精品1区2区| 美女尤物国产一区| 亚洲图片激情小说| 在线成人高清不卡| 国产91精品露脸国语对白| 悠悠色在线精品| 精品久久久久久最新网址| 国产成都精品91一区二区三| 亚洲自拍都市欧美小说| 欧美成人女星排名| 91美女视频网站| 国内欧美视频一区二区| 一片黄亚洲嫩模| 久久九九国产精品| 666欧美在线视频| 99精品视频中文字幕| 伦理电影国产精品| 一区二区三区精品视频| 久久九九全国免费| 91精品国产91久久综合桃花| 粉嫩高潮美女一区二区三区| 日韩精品高清不卡| 最新热久久免费视频| 精品91自产拍在线观看一区| 欧美无乱码久久久免费午夜一区| 国产一区二区三区高清播放| 亚洲成a天堂v人片| 尤物在线观看一区| 18成人在线视频| 国产性做久久久久久| 欧美一区二区三区视频免费播放 | jlzzjlzz亚洲女人18| 日韩福利电影在线| 一区二区三区视频在线看| 国产精品麻豆久久久| 久久欧美中文字幕| 日韩一区二区在线播放| 欧美另类videos死尸| 欧美性xxxxxx少妇| 91一区二区在线| 成人黄动漫网站免费app| 国产一区二区女| 国产精品一区二区久久精品爱涩 | 日本一区二区成人| 久久综合色一综合色88| 精品免费视频一区二区| 日韩欧美一区二区久久婷婷| 9191精品国产综合久久久久久| 欧美午夜电影网| 在线观看免费亚洲| 欧美又粗又大又爽| 欧美视频一区二区在线观看| 一本大道久久a久久精品综合| 一本大道综合伊人精品热热 | 日日摸夜夜添夜夜添国产精品| 亚洲成在人线免费| 五月综合激情网| 日韩经典一区二区| 捆绑调教美女网站视频一区| 久久精品久久99精品久久| 精品一区二区三区在线播放| 精品系列免费在线观看| 国产成人午夜电影网| 99久久777色| 欧美中文一区二区三区| 91精品国模一区二区三区| 日韩一区二区在线看| 久久久久久久综合狠狠综合| 国产精品久久精品日日| 亚洲图片有声小说| 免费高清在线一区| 成人av网站在线| 欧美天堂一区二区三区| 在线播放视频一区| 久久久国产午夜精品| 国产精品国产自产拍高清av| 亚洲国产日韩av| 国精品**一区二区三区在线蜜桃| 国产成人在线色| 欧美少妇一区二区| 欧美精品一区二区高清在线观看 | 久久久不卡网国产精品一区| 国产精品传媒在线| 日日噜噜夜夜狠狠视频欧美人| 久草中文综合在线| 99r国产精品| 日韩欧美电影在线| 伊人色综合久久天天| 久久精品国产99国产| 色欧美88888久久久久久影院| 日韩视频在线你懂得| 中文字幕中文字幕在线一区| 日本美女一区二区| 91首页免费视频| 精品国产伦一区二区三区免费| 国产精品久久久久一区二区三区| 日韩av一区二区在线影视| 99精品热视频| 欧美精品一区二区三区高清aⅴ| 亚洲一级二级三级|