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

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

?? nand_util.c

?? u-boot 源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
		}		/* read page data from input memory buffer */		memcpy(data_buf, buffer, readlen);		buffer += readlen;		if (opts->writeoob) {			/* read OOB data from input memory block, exit			 * on failure */			memcpy(oob_buf, buffer, meminfo->oobsize);			buffer += meminfo->oobsize;			/* write OOB data first, as ecc will be placed			 * in there*/			result = meminfo->write_oob(meminfo,						    mtdoffset,						    meminfo->oobsize,						    &written,						    (unsigned char *)						    &oob_buf);			if (result != 0) {				printf("\nMTD writeoob failure: %d\n",				       result);				goto restoreoob;			}			imglen -= meminfo->oobsize;		}		/* write out the page data */		result = meminfo->write(meminfo,					mtdoffset,					meminfo->oobblock,					&written,					(unsigned char *) &data_buf);		if (result != 0) {			printf("writing NAND page at offset 0x%lx failed\n",			       mtdoffset);			goto restoreoob;		}		imglen -= readlen;		if (!opts->quiet) {			unsigned long long n = (unsigned long long)				 (opts->length-imglen) * 100;			int percent;			do_div(n, opts->length);			percent = (int)n;			/* output progress message only at whole percent			 * steps to reduce the number of messages printed			 * on (slow) serial consoles			 */			if (percent != percent_complete) {				printf("\rWriting data at 0x%x "				       "-- %3d%% complete.",				       mtdoffset, percent);				percent_complete = percent;			}		}		mtdoffset += meminfo->oobblock;	}	if (!opts->quiet)		printf("\n");restoreoob:	if (oobinfochanged) {		memcpy(&meminfo->oobinfo, &old_oobinfo,		       sizeof(meminfo->oobinfo));	}	if (imglen > 0) {		printf("Data did not fit into device, due to bad blocks\n");		return -1;	}	/* return happy */	return 0;}/** * nand_read_opts: - read image from NAND flash with support for various options * * @param meminfo	NAND device to erase * @param opts		read options (@see struct nand_read_options) * @return		0 in case of success * */int nand_read_opts(nand_info_t *meminfo, const nand_read_options_t *opts){	int imglen = opts->length;	int pagelen;	int baderaseblock;	int blockstart = -1;	int percent_complete = -1;	loff_t offs;	size_t readlen;	ulong mtdoffset = opts->offset;	u_char *buffer = opts->buffer;	int result;	/* make sure device page sizes are valid */	if (!(meminfo->oobsize == 16 && meminfo->oobblock == 512)	    && !(meminfo->oobsize == 8 && meminfo->oobblock == 256)	    && !(meminfo->oobsize == 64 && meminfo->oobblock == 2048)) {		printf("Unknown flash (not normal NAND)\n");		return -1;	}	pagelen = meminfo->oobblock		+ ((opts->readoob != 0) ? meminfo->oobsize : 0);	/* check, if length is not larger than device */	if (((imglen / pagelen) * meminfo->oobblock)	     > (meminfo->size - opts->offset)) {		printf("Image %d bytes, NAND page %d bytes, "		       "OOB area %u bytes, device size %u bytes\n",		       imglen, pagelen, meminfo->oobblock, meminfo->size);		printf("Input block is larger than device\n");		return -1;	}	if (!opts->quiet)		printf("\n");	/* get data from input and write to the device */	while (imglen && (mtdoffset < meminfo->size)) {		WATCHDOG_RESET ();		/*		 * new eraseblock, check for bad block(s). Stay in the		 * loop to be sure if the offset changes because of		 * a bad block, that the next block that will be		 * written to is also checked. Thus avoiding errors if		 * the block(s) after the skipped block(s) is also bad		 * (number of blocks depending on the blockalign		 */		while (blockstart != (mtdoffset & (~meminfo->erasesize+1))) {			blockstart = mtdoffset & (~meminfo->erasesize+1);			offs = blockstart;			baderaseblock = 0;			/* check all the blocks in an erase block for			 * bad blocks */			do {				int ret = meminfo->block_isbad(meminfo, offs);				if (ret < 0) {					printf("Bad block check failed\n");					return -1;				}				if (ret == 1) {					baderaseblock = 1;					if (!opts->quiet)						printf("\rBad block at 0x%lx "						       "in erase block from "						       "0x%x will be skipped\n",						       (long) offs,						       blockstart);				}				if (baderaseblock) {					mtdoffset = blockstart						+ meminfo->erasesize;				}				offs +=	 meminfo->erasesize;			} while (offs < blockstart + meminfo->erasesize);		}		/* read page data to memory buffer */		result = meminfo->read(meminfo,				       mtdoffset,				       meminfo->oobblock,				       &readlen,				       (unsigned char *) &data_buf);		if (result != 0) {			printf("reading NAND page at offset 0x%lx failed\n",			       mtdoffset);			return -1;		}		if (imglen < readlen) {			readlen = imglen;		}		memcpy(buffer, data_buf, readlen);		buffer += readlen;		imglen -= readlen;		if (opts->readoob) {			result = meminfo->read_oob(meminfo,						   mtdoffset,						   meminfo->oobsize,						   &readlen,						   (unsigned char *)						   &oob_buf);			if (result != 0) {				printf("\nMTD readoob failure: %d\n",				       result);				return -1;			}			if (imglen < readlen) {				readlen = imglen;			}			memcpy(buffer, oob_buf, readlen);			buffer += readlen;			imglen -= readlen;		}		if (!opts->quiet) {			unsigned long long n = (unsigned long long)				 (opts->length-imglen) * 100;			int percent;			do_div(n, opts->length);			percent = (int)n;			/* output progress message only at whole percent			 * steps to reduce the number of messages printed			 * on (slow) serial consoles			 */			if (percent != percent_complete) {			if (!opts->quiet)				printf("\rReading data from 0x%x "				       "-- %3d%% complete.",				       mtdoffset, percent);				percent_complete = percent;			}		}		mtdoffset += meminfo->oobblock;	}	if (!opts->quiet)		printf("\n");	if (imglen > 0) {		printf("Could not read entire image due to bad blocks\n");		return -1;	}	/* return happy */	return 0;}/****************************************************************************** * Support for locking / unlocking operations of some NAND devices *****************************************************************************/#define NAND_CMD_LOCK		0x2a#define NAND_CMD_LOCK_TIGHT	0x2c#define NAND_CMD_UNLOCK1	0x23#define NAND_CMD_UNLOCK2	0x24#define NAND_CMD_LOCK_STATUS	0x7a/** * nand_lock: Set all pages of NAND flash chip to the LOCK or LOCK-TIGHT *	      state * * @param meminfo	nand mtd instance * @param tight		bring device in lock tight mode * * @return		0 on success, -1 in case of error * * The lock / lock-tight command only applies to the whole chip. To get some * parts of the chip lock and others unlocked use the following sequence: * * - Lock all pages of the chip using nand_lock(mtd, 0) (or the lockpre pin) * - Call nand_unlock() once for each consecutive area to be unlocked * - If desired: Bring the chip to the lock-tight state using nand_lock(mtd, 1) * *   If the device is in lock-tight state software can't change the *   current active lock/unlock state of all pages. nand_lock() / nand_unlock() *   calls will fail. It is only posible to leave lock-tight state by *   an hardware signal (low pulse on _WP pin) or by power down. */int nand_lock(nand_info_t *meminfo, int tight){	int ret = 0;	int status;	struct nand_chip *this = meminfo->priv;	/* select the NAND device */	this->select_chip(meminfo, 0);	this->cmdfunc(meminfo,		      (tight ? NAND_CMD_LOCK_TIGHT : NAND_CMD_LOCK),		      -1, -1);	/* call wait ready function */	status = this->waitfunc(meminfo, this, FL_WRITING);	/* see if device thinks it succeeded */	if (status & 0x01) {		ret = -1;	}	/* de-select the NAND device */	this->select_chip(meminfo, -1);	return ret;}/** * nand_get_lock_status: - query current lock state from one page of NAND *			   flash * * @param meminfo	nand mtd instance * @param offset	page address to query (muss be page aligned!) * * @return		-1 in case of error *			>0 lock status: *			  bitfield with the following combinations: *			  NAND_LOCK_STATUS_TIGHT: page in tight state *			  NAND_LOCK_STATUS_LOCK:  page locked *			  NAND_LOCK_STATUS_UNLOCK: page unlocked * */int nand_get_lock_status(nand_info_t *meminfo, ulong offset){	int ret = 0;	int chipnr;	int page;	struct nand_chip *this = meminfo->priv;	/* select the NAND device */	chipnr = (int)(offset >> this->chip_shift);	this->select_chip(meminfo, chipnr);	if ((offset & (meminfo->oobblock - 1)) != 0) {		printf ("nand_get_lock_status: "			"Start address must be beginning of "			"nand page!\n");		ret = -1;		goto out;	}	/* check the Lock Status */	page = (int)(offset >> this->page_shift);	this->cmdfunc(meminfo, NAND_CMD_LOCK_STATUS, -1, page & this->pagemask);	ret = this->read_byte(meminfo) & (NAND_LOCK_STATUS_TIGHT					  | NAND_LOCK_STATUS_LOCK					  | NAND_LOCK_STATUS_UNLOCK); out:	/* de-select the NAND device */	this->select_chip(meminfo, -1);	return ret;}/** * nand_unlock: - Unlock area of NAND pages *		  only one consecutive area can be unlocked at one time! * * @param meminfo	nand mtd instance * @param start		start byte address * @param length	number of bytes to unlock (must be a multiple of *			page size nand->oobblock) * * @return		0 on success, -1 in case of error */int nand_unlock(nand_info_t *meminfo, ulong start, ulong length){	int ret = 0;	int chipnr;	int status;	int page;	struct nand_chip *this = meminfo->priv;	printf ("nand_unlock: start: %08x, length: %d!\n",		(int)start, (int)length);	/* select the NAND device */	chipnr = (int)(start >> this->chip_shift);	this->select_chip(meminfo, chipnr);	/* check the WP bit */	this->cmdfunc(meminfo, NAND_CMD_STATUS, -1, -1);	if ((this->read_byte(meminfo) & 0x80) == 0) {		printf ("nand_unlock: Device is write protected!\n");		ret = -1;		goto out;	}	if ((start & (meminfo->oobblock - 1)) != 0) {		printf ("nand_unlock: Start address must be beginning of "			"nand page!\n");		ret = -1;		goto out;	}	if (length == 0 || (length & (meminfo->oobblock - 1)) != 0) {		printf ("nand_unlock: Length must be a multiple of nand page "			"size!\n");		ret = -1;		goto out;	}	/* submit address of first page to unlock */	page = (int)(start >> this->page_shift);	this->cmdfunc(meminfo, NAND_CMD_UNLOCK1, -1, page & this->pagemask);	/* submit ADDRESS of LAST page to unlock */	page += (int)(length >> this->page_shift) - 1;	this->cmdfunc(meminfo, NAND_CMD_UNLOCK2, -1, page & this->pagemask);	/* call wait ready function */	status = this->waitfunc(meminfo, this, FL_WRITING);	/* see if device thinks it succeeded */	if (status & 0x01) {		/* there was an error */		ret = -1;		goto out;	} out:	/* de-select the NAND device */	this->select_chip(meminfo, -1);	return ret;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久精品| 一本色道久久综合精品竹菊| 国产精品国产a| 欧美精品乱码久久久久久按摩| 国产麻豆精品95视频| 亚洲一区二区欧美日韩| 国产清纯白嫩初高生在线观看91| 欧美日韩国产在线观看| 成人精品鲁一区一区二区| 免费人成精品欧美精品| 一区二区三区欧美| 国产精品不卡在线观看| 久久综合av免费| 欧美日韩国产综合一区二区三区 | 欧美在线免费观看亚洲| 国产福利一区在线| 老司机免费视频一区二区| 亚洲综合另类小说| 成人免费在线播放视频| 久久精品这里都是精品| 欧美成人三级在线| 在线观看91av| 欧美亚洲综合在线| 95精品视频在线| 成人深夜福利app| 国产精品一卡二卡在线观看| 日韩精品亚洲专区| 午夜日韩在线电影| 一区二区三区电影在线播| 国产精品乱人伦| 国产午夜一区二区三区| 欧美成人乱码一区二区三区| 欧美精品xxxxbbbb| 99精品久久免费看蜜臀剧情介绍| 国产成人午夜精品影院观看视频 | 国产精品一级黄| 国内精品久久久久影院一蜜桃| 日韩电影免费在线看| 图片区日韩欧美亚洲| 午夜影院在线观看欧美| 亚洲一区二区三区四区在线观看 | 成人精品在线视频观看| 粉嫩aⅴ一区二区三区四区五区| 狠狠色丁香婷综合久久| 国产一区欧美日韩| 国产精品18久久久久久久网站| 国产乱码一区二区三区| 国产精品小仙女| 成人激情校园春色| 色妞www精品视频| 在线视频观看一区| 欧美丰满高潮xxxx喷水动漫| 制服丝袜国产精品| 精品久久五月天| 欧美激情一区二区在线| 中文字幕色av一区二区三区| 亚洲另类在线一区| 石原莉奈一区二区三区在线观看 | 性欧美疯狂xxxxbbbb| 午夜久久久影院| 麻豆中文一区二区| 国产乱人伦精品一区二区在线观看| 大胆亚洲人体视频| 一本大道久久a久久精品综合| 欧美视频三区在线播放| 91精品婷婷国产综合久久性色| 日韩欧美国产系列| 国产精品色一区二区三区| 亚洲女子a中天字幕| 午夜av一区二区三区| 精品无人区卡一卡二卡三乱码免费卡| 国产一区二区三区免费在线观看| av一区二区三区黑人| 在线欧美日韩精品| 精品福利一区二区三区| 日韩美女视频19| 日韩在线一区二区| 国产精品538一区二区在线| 一本久道久久综合中文字幕| 制服.丝袜.亚洲.中文.综合| 久久亚洲二区三区| 亚洲一区二区三区不卡国产欧美| 免费在线观看成人| av在线一区二区| 欧美一区二区视频网站| 国产精品美女一区二区| 日韩成人免费电影| 99视频国产精品| 日韩一级免费一区| 亚洲婷婷国产精品电影人久久| 日本aⅴ亚洲精品中文乱码| 成人一区二区三区| 日韩午夜激情免费电影| 亚洲日本免费电影| 国产主播一区二区三区| 欧美日韩视频专区在线播放| 久久久精品tv| 日韩国产精品久久久久久亚洲| 成人网男人的天堂| 日韩精品一区二区三区四区| 亚洲精品写真福利| 国产成人精品三级麻豆| 91精品在线免费观看| 亚洲欧美电影院| 国产高清在线精品| 日韩欧美123| 五月综合激情婷婷六月色窝| av电影在线观看完整版一区二区| 精品不卡在线视频| 日韩一区精品视频| 91成人网在线| 亚洲人成人一区二区在线观看| 国产自产2019最新不卡| 69堂亚洲精品首页| 亚洲小说欧美激情另类| 99国产精品视频免费观看| 国产欧美日韩视频在线观看| 久久精品国产**网站演员| 欧美日韩日日骚| 亚洲精品水蜜桃| 97超碰欧美中文字幕| 亚洲精品视频在线看| www.在线成人| 国产精品人妖ts系列视频| 国产成人综合网| 久久久九九九九| 国产一区二区不卡在线| 精品99999| 国产精品一卡二卡在线观看| 日韩精品一区二区三区老鸭窝 | 激情文学综合网| 日韩欧美国产一区二区三区 | www.欧美日韩| 国产精品青草综合久久久久99| 国产精品一区专区| 国产丝袜在线精品| 成人黄色大片在线观看| 亚洲国产精品精华液2区45| 国产成人精品综合在线观看| 国产午夜亚洲精品午夜鲁丝片| 国产激情视频一区二区在线观看| 久久九九国产精品| 成人免费毛片高清视频| 最新热久久免费视频| 色噜噜久久综合| 亚洲成年人影院| 欧美一区二区三区四区五区| 男人的天堂久久精品| 精品日韩在线一区| 国产成人啪免费观看软件| 欧美高清在线视频| av在线播放不卡| 亚洲国产日韩一级| 这里只有精品视频在线观看| 久久精品二区亚洲w码| 久久综合九色综合欧美98| 国产成人免费视频| 亚洲日本成人在线观看| 欧美日韩国产欧美日美国产精品| 奇米亚洲午夜久久精品| 久久婷婷一区二区三区| 91原创在线视频| 婷婷激情综合网| 久久亚洲欧美国产精品乐播| 成人av片在线观看| 亚洲国产人成综合网站| 日韩午夜小视频| av激情亚洲男人天堂| 亚洲国产va精品久久久不卡综合| 日韩精品一区二区三区在线| 大胆亚洲人体视频| 亚洲高清视频在线| 久久久三级国产网站| 91热门视频在线观看| 蜜臀av亚洲一区中文字幕| 国产欧美一二三区| 欧美日韩一区二区在线视频| 国内精品伊人久久久久影院对白| 中文字幕一区二区三| 在线综合视频播放| 成人av网站免费| 美女在线观看视频一区二区| 国产精品护士白丝一区av| 91精品国产色综合久久ai换脸| 色偷偷成人一区二区三区91| 久久精品久久精品| 亚洲欧美国产毛片在线| 精品日韩99亚洲| 欧美伊人久久大香线蕉综合69 | 欧洲精品在线观看| 国产在线看一区| 亚洲高清视频在线| 欧美国产成人精品| 日韩情涩欧美日韩视频| 色狠狠av一区二区三区| 午夜视频一区二区三区| 91精品在线一区二区| 精品国产三级a在线观看| 奇米影视一区二区三区小说| 国产高清不卡一区|