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

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

?? nand_base.c

?? U-boot latest tarball
?? C
?? 第 1 頁 / 共 5 頁
字號:
	reset_timer();	/* wait until command is processed or timeout occures */	while (get_timer(0) < timeo) {		if (chip->dev_ready)			if (chip->dev_ready(mtd))				break;	}}#endif/** * nand_command - [DEFAULT] Send command to NAND device * @mtd:	MTD device structure * @command:	the command to be sent * @column:	the column address for this command, -1 if none * @page_addr:	the page address for this command, -1 if none * * Send command to NAND device. This function is used for small page * devices (256/512 Bytes per page) */static void nand_command(struct mtd_info *mtd, unsigned int command,			 int column, int page_addr){	register struct nand_chip *chip = mtd->priv;	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;	uint32_t rst_sts_cnt = CONFIG_SYS_NAND_RESET_CNT;	/*	 * Write out the command to the device.	 */	if (command == NAND_CMD_SEQIN) {		int readcmd;		if (column >= mtd->writesize) {			/* OOB area */			column -= mtd->writesize;			readcmd = NAND_CMD_READOOB;		} else if (column < 256) {			/* First 256 bytes --> READ0 */			readcmd = NAND_CMD_READ0;		} else {			column -= 256;			readcmd = NAND_CMD_READ1;		}		chip->cmd_ctrl(mtd, readcmd, ctrl);		ctrl &= ~NAND_CTRL_CHANGE;	}	chip->cmd_ctrl(mtd, command, ctrl);	/*	 * Address cycle, when necessary	 */	ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;	/* Serially input address */	if (column != -1) {		/* Adjust columns for 16 bit buswidth */		if (chip->options & NAND_BUSWIDTH_16)			column >>= 1;		chip->cmd_ctrl(mtd, column, ctrl);		ctrl &= ~NAND_CTRL_CHANGE;	}	if (page_addr != -1) {		chip->cmd_ctrl(mtd, page_addr, ctrl);		ctrl &= ~NAND_CTRL_CHANGE;		chip->cmd_ctrl(mtd, page_addr >> 8, ctrl);		/* One more address cycle for devices > 32MiB */		if (chip->chipsize > (32 << 20))			chip->cmd_ctrl(mtd, page_addr >> 16, ctrl);	}	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);	/*	 * program and erase have their own busy handlers	 * status and sequential in needs no delay	 */	switch (command) {	case NAND_CMD_PAGEPROG:	case NAND_CMD_ERASE1:	case NAND_CMD_ERASE2:	case NAND_CMD_SEQIN:	case NAND_CMD_STATUS:		return;	case NAND_CMD_RESET:		if (chip->dev_ready)			break;		udelay(chip->chip_delay);		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,			       NAND_CTRL_CLE | NAND_CTRL_CHANGE);		chip->cmd_ctrl(mtd,			       NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);		while (!(chip->read_byte(mtd) & NAND_STATUS_READY) &&			(rst_sts_cnt--));		return;		/* This applies to read commands */	default:		/*		 * If we don't have access to the busy pin, we apply the given		 * command delay		 */		if (!chip->dev_ready) {			udelay(chip->chip_delay);			return;		}	}	/* Apply this short delay always to ensure that we do wait tWB in	 * any case on any machine. */	ndelay(100);	nand_wait_ready(mtd);}/** * nand_command_lp - [DEFAULT] Send command to NAND large page device * @mtd:	MTD device structure * @command:	the command to be sent * @column:	the column address for this command, -1 if none * @page_addr:	the page address for this command, -1 if none * * Send command to NAND device. This is the version for the new large page * devices We dont have the separate regions as we have in the small page * devices.  We must emulate NAND_CMD_READOOB to keep the code compatible. */static void nand_command_lp(struct mtd_info *mtd, unsigned int command,			    int column, int page_addr){	register struct nand_chip *chip = mtd->priv;	uint32_t rst_sts_cnt = CONFIG_SYS_NAND_RESET_CNT;	/* Emulate NAND_CMD_READOOB */	if (command == NAND_CMD_READOOB) {		column += mtd->writesize;		command = NAND_CMD_READ0;	}	/* Command latch cycle */	chip->cmd_ctrl(mtd, command & 0xff,		       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);	if (column != -1 || page_addr != -1) {		int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;		/* Serially input address */		if (column != -1) {			/* Adjust columns for 16 bit buswidth */			if (chip->options & NAND_BUSWIDTH_16)				column >>= 1;			chip->cmd_ctrl(mtd, column, ctrl);			ctrl &= ~NAND_CTRL_CHANGE;			chip->cmd_ctrl(mtd, column >> 8, ctrl);		}		if (page_addr != -1) {			chip->cmd_ctrl(mtd, page_addr, ctrl);			chip->cmd_ctrl(mtd, page_addr >> 8,				       NAND_NCE | NAND_ALE);			/* One more address cycle for devices > 128MiB */			if (chip->chipsize > (128 << 20))				chip->cmd_ctrl(mtd, page_addr >> 16,					       NAND_NCE | NAND_ALE);		}	}	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);	/*	 * program and erase have their own busy handlers	 * status, sequential in, and deplete1 need no delay	 */	switch (command) {	case NAND_CMD_CACHEDPROG:	case NAND_CMD_PAGEPROG:	case NAND_CMD_ERASE1:	case NAND_CMD_ERASE2:	case NAND_CMD_SEQIN:	case NAND_CMD_RNDIN:	case NAND_CMD_STATUS:	case NAND_CMD_DEPLETE1:		return;		/*		 * read error status commands require only a short delay		 */	case NAND_CMD_STATUS_ERROR:	case NAND_CMD_STATUS_ERROR0:	case NAND_CMD_STATUS_ERROR1:	case NAND_CMD_STATUS_ERROR2:	case NAND_CMD_STATUS_ERROR3:		udelay(chip->chip_delay);		return;	case NAND_CMD_RESET:		if (chip->dev_ready)			break;		udelay(chip->chip_delay);		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);		chip->cmd_ctrl(mtd, NAND_CMD_NONE,			       NAND_NCE | NAND_CTRL_CHANGE);		while (!(chip->read_byte(mtd) & NAND_STATUS_READY) &&			(rst_sts_cnt--));		return;	case NAND_CMD_RNDOUT:		/* No ready / busy check necessary */		chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART,			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);		chip->cmd_ctrl(mtd, NAND_CMD_NONE,			       NAND_NCE | NAND_CTRL_CHANGE);		return;	case NAND_CMD_READ0:		chip->cmd_ctrl(mtd, NAND_CMD_READSTART,			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);		chip->cmd_ctrl(mtd, NAND_CMD_NONE,			       NAND_NCE | NAND_CTRL_CHANGE);		/* This applies to read commands */	default:		/*		 * If we don't have access to the busy pin, we apply the given		 * command delay		 */		if (!chip->dev_ready) {			udelay(chip->chip_delay);			return;		}	}	/* Apply this short delay always to ensure that we do wait tWB in	 * any case on any machine. */	ndelay(100);	nand_wait_ready(mtd);}/** * nand_get_device - [GENERIC] Get chip for selected access * @chip:	the nand chip descriptor * @mtd:	MTD device structure * @new_state:	the state which is requested * * Get the device and lock it for exclusive access *//* XXX U-BOOT XXX */#if 0static intnand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state){	spinlock_t *lock = &chip->controller->lock;	wait_queue_head_t *wq = &chip->controller->wq;	DECLARE_WAITQUEUE(wait, current); retry:	spin_lock(lock);	/* Hardware controller shared among independend devices */	/* Hardware controller shared among independend devices */	if (!chip->controller->active)		chip->controller->active = chip;	if (chip->controller->active == chip && chip->state == FL_READY) {		chip->state = new_state;		spin_unlock(lock);		return 0;	}	if (new_state == FL_PM_SUSPENDED) {		spin_unlock(lock);		return (chip->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;	}	set_current_state(TASK_UNINTERRUPTIBLE);	add_wait_queue(wq, &wait);	spin_unlock(lock);	schedule();	remove_wait_queue(wq, &wait);	goto retry;}#elsestatic int nand_get_device (struct nand_chip *this, struct mtd_info *mtd, int new_state){	this->state = new_state;	return 0;}#endif/** * nand_wait - [DEFAULT]  wait until the command is done * @mtd:	MTD device structure * @chip:	NAND chip structure * * Wait for command done. This applies to erase and program only * Erase can take up to 400ms and program up to 20ms according to * general NAND and SmartMedia specs *//* XXX U-BOOT XXX */#if 0static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip){	unsigned long timeo = jiffies;	int status, state = chip->state;	if (state == FL_ERASING)		timeo += (HZ * 400) / 1000;	else		timeo += (HZ * 20) / 1000;	led_trigger_event(nand_led_trigger, LED_FULL);	/* Apply this short delay always to ensure that we do wait tWB in	 * any case on any machine. */	ndelay(100);	if ((state == FL_ERASING) && (chip->options & NAND_IS_AND))		chip->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);	else		chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);	while (time_before(jiffies, timeo)) {		if (chip->dev_ready) {			if (chip->dev_ready(mtd))				break;		} else {			if (chip->read_byte(mtd) & NAND_STATUS_READY)				break;		}		cond_resched();	}	led_trigger_event(nand_led_trigger, LED_OFF);	status = (int)chip->read_byte(mtd);	return status;}#elsestatic int nand_wait(struct mtd_info *mtd, struct nand_chip *this){	unsigned long	timeo;	int state = this->state;	if (state == FL_ERASING)		timeo = (CONFIG_SYS_HZ * 400) / 1000;	else		timeo = (CONFIG_SYS_HZ * 20) / 1000;	if ((state == FL_ERASING) && (this->options & NAND_IS_AND))		this->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);	else		this->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);	reset_timer();	while (1) {		if (get_timer(0) > timeo) {			printf("Timeout!");			return 0x01;		}		if (this->dev_ready) {			if (this->dev_ready(mtd))				break;		} else {			if (this->read_byte(mtd) & NAND_STATUS_READY)				break;		}	}#ifdef PPCHAMELON_NAND_TIMER_HACK	reset_timer();	while (get_timer(0) < 10);#endif /*  PPCHAMELON_NAND_TIMER_HACK */	return this->read_byte(mtd);}#endif/** * nand_read_page_raw - [Intern] read raw page data without ecc * @mtd:	mtd info structure * @chip:	nand chip info structure * @buf:	buffer to store read data */static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,			      uint8_t *buf){	chip->read_buf(mtd, buf, mtd->writesize);	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);	return 0;}/** * nand_read_page_swecc - [REPLACABLE] software ecc based page read function * @mtd:	mtd info structure * @chip:	nand chip info structure * @buf:	buffer to store read data */static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,				uint8_t *buf){	int i, eccsize = chip->ecc.size;	int eccbytes = chip->ecc.bytes;	int eccsteps = chip->ecc.steps;	uint8_t *p = buf;	uint8_t *ecc_calc = chip->buffers->ecccalc;	uint8_t *ecc_code = chip->buffers->ecccode;	uint32_t *eccpos = chip->ecc.layout->eccpos;	chip->ecc.read_page_raw(mtd, chip, buf);	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)		chip->ecc.calculate(mtd, p, &ecc_calc[i]);	for (i = 0; i < chip->ecc.total; i++)		ecc_code[i] = chip->oob_poi[eccpos[i]];	eccsteps = chip->ecc.steps;	p = buf;	for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {		int stat;		stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);		if (stat < 0)			mtd->ecc_stats.failed++;		else			mtd->ecc_stats.corrected += stat;	}	return 0;}/** * nand_read_subpage - [REPLACABLE] software ecc based sub-page read function * @mtd:	mtd info structure * @chip:	nand chip info structure * @dataofs	offset of requested data within the page * @readlen	data length * @buf:	buffer to store read data */static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi){	int start_step, end_step, num_steps;	uint32_t *eccpos = chip->ecc.layout->eccpos;	uint8_t *p;	int data_col_addr, i, gaps = 0;	int datafrag_len, eccfrag_len, aligned_len, aligned_pos;	int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;	/* Column address wihin the page aligned to ECC size (256bytes). */	start_step = data_offs / chip->ecc.size;	end_step = (data_offs + readlen - 1) / chip->ecc.size;	num_steps = end_step - start_step + 1;	/* Data size aligned to ECC ecc.size*/	datafrag_len = num_steps * chip->ecc.size;	eccfrag_len = num_steps * chip->ecc.bytes;	data_col_addr = start_step * chip->ecc.size;	/* If we read not a page aligned data */	if (data_col_addr != 0)		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1);	p = bufpoi + data_col_addr;	chip->read_buf(mtd, p, datafrag_len);	/* Calculate  ECC */	for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size)		chip->ecc.calculate(mtd, p, &chip->buffers->ecccalc[i]);	/* The performance is faster if to position offsets	   according to ecc.pos. Let make sure here that	   there are no gaps in ecc positions */	for (i = 0; i < eccfrag_len - 1; i++) {		if (eccpos[i + start_step * chip->ecc.bytes] + 1 !=			eccpos[i + start_step * chip->ecc.bytes + 1]) {			gaps = 1;			break;		}	}	if (gaps) {		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);		chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);	} else {		/* send the command to read the particular ecc bytes */		/* take care about buswidth alignment in read_buf */		aligned_pos = eccpos[start_step * chip->ecc.bytes] & ~(busw - 1);		aligned_len = eccfrag_len;		if (eccpos[start_step * chip->ecc.bytes] & (busw - 1))			aligned_len++;		if (eccpos[(start_step + num_steps) * chip->ecc.bytes] & (busw - 1))			aligned_len++;		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize + aligned_pos, -1);		chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);	}	for (i = 0; i < eccfrag_len; i++)		chip->buffers->ecccode[i] = chip->oob_poi[eccpos[i + start_step * chip->ecc.bytes]];	p = bufpoi + data_col_addr;	for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size) {		int stat;		stat = chip->ecc.correct(mtd, p, &chip->buffers->ecccode[i], &chip->buffers->ecccalc[i]);		if (stat < 0)			mtd->ecc_stats.failed++;		else			mtd->ecc_stats.corrected += stat;	}	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久影视| 欧美日韩中字一区| 久久人人爽爽爽人久久久| 美女看a上一区| 精品国产乱码久久久久久免费| 久久电影国产免费久久电影| 欧美tickling网站挠脚心| 国产一区二区三区四区五区入口| 精品少妇一区二区| 成人免费电影视频| 亚洲最大的成人av| 制服丝袜av成人在线看| 久久99久国产精品黄毛片色诱| 久久九九久久九九| 91麻豆国产香蕉久久精品| 亚洲成a人片在线观看中文| 日韩一区二区在线看| 久久av中文字幕片| 中文字幕色av一区二区三区| 欧美吻胸吃奶大尺度电影| 奇米影视一区二区三区| 国产日韩欧美一区二区三区乱码| www.日本不卡| 日韩国产在线一| 国产亚洲欧美一级| 一本高清dvd不卡在线观看| 天堂久久一区二区三区| 国产色一区二区| 欧美网站一区二区| 国产成人精品综合在线观看| 一区二区三国产精华液| 精品久久久久久久人人人人传媒| av一区二区三区在线| 日韩av电影一区| 亚洲欧洲av一区二区三区久久| 欧美日韩久久久| www.欧美精品一二区| 蜜臀av性久久久久蜜臀av麻豆| 亚洲天堂福利av| 精品国产乱码久久久久久老虎| 色综合视频在线观看| 精品一区二区久久久| 亚洲欧美国产三级| 久久久久国色av免费看影院| 欧美日韩免费观看一区二区三区| 懂色av一区二区在线播放| 日本视频一区二区三区| 亚洲另类中文字| 国产欧美日本一区二区三区| 欧美妇女性影城| 欧美综合一区二区三区| a级精品国产片在线观看| 久久国产日韩欧美精品| 天天射综合影视| 亚洲欧美日韩电影| 欧美国产精品一区| 日韩免费观看高清完整版在线观看| 一本大道久久a久久精二百| 国产又粗又猛又爽又黄91精品| 亚洲成人黄色小说| 亚洲男人天堂av| 国产精品久久精品日日| 精品国产乱码久久久久久闺蜜| 51精品秘密在线观看| 欧美三级在线视频| 欧美在线免费观看视频| 91色|porny| 91偷拍与自偷拍精品| 成人精品视频一区二区三区 | 国产精品久久三| 久久精品一区二区三区不卡牛牛 | 色婷婷久久综合| 一本大道久久a久久精二百| 99久久久国产精品免费蜜臀| 国产白丝精品91爽爽久久| 国产成人av电影在线播放| 国产乱码精品一区二区三区av| 免费的国产精品| 激情综合网av| 国产精品88888| 国产成人精品一区二| 国产成人自拍在线| 国产成人免费在线视频| 成人性生交大片免费看中文 | 99久久精品情趣| 色综合久久久久综合体| 91黄色激情网站| 欧美视频一区二区| 欧美绝品在线观看成人午夜影视| 欧美视频精品在线观看| 欧美精品xxxxbbbb| 欧美一区二区三区四区在线观看| 日韩欧美亚洲国产精品字幕久久久 | 精品久久国产字幕高潮| 久久久综合网站| 一区二区中文字幕在线| 亚洲一级在线观看| 天天操天天色综合| 精品在线播放免费| 成人av资源在线| 欧美在线观看一区| 日韩欧美二区三区| 国产精品拍天天在线| 亚洲精品成a人| 日本中文字幕一区二区有限公司| 国内外成人在线| 99re6这里只有精品视频在线观看| 色综合中文字幕国产| 在线免费av一区| 日韩一级完整毛片| 国产欧美精品国产国产专区| 亚洲欧美乱综合| 美女视频黄久久| 99热精品国产| 日韩欧美综合一区| 亚洲天堂成人在线观看| 免费看日韩精品| 99久久国产综合精品女不卡| 91精品在线观看入口| 中文字幕不卡一区| 日本va欧美va精品| 色域天天综合网| 精品国产成人系列| 亚洲图片自拍偷拍| 国产精品一二三在| 欧美精品久久99| 中文字幕av一区二区三区| 丝袜国产日韩另类美女| av爱爱亚洲一区| 26uuu亚洲综合色欧美| 亚洲国产精品久久艾草纯爱| 成人性视频网站| 日韩欧美在线123| 亚洲精选视频免费看| 韩国女主播成人在线| 欧美蜜桃一区二区三区| 国产精品久久毛片| 国产麻豆成人精品| 91精品国产一区二区人妖| 亚洲另类色综合网站| 国产不卡视频一区二区三区| 日韩三级av在线播放| 伊人开心综合网| 99久久精品情趣| 国产免费观看久久| 国产精品自拍av| 日韩一级二级三级| 视频一区中文字幕国产| 欧美亚洲一区二区在线观看| 国产精品久久久久久久久久免费看| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美色涩在线第一页| 亚洲乱码国产乱码精品精可以看| 国产乱码精品1区2区3区| 日韩欧美一级二级| 日韩精品电影在线| 欧美视频在线一区| 一二三四社区欧美黄| 色美美综合视频| 亚洲日本丝袜连裤袜办公室| 成人v精品蜜桃久久一区| 中文字幕乱码一区二区免费| 国产乱码精品一区二区三区av| 精品国产一区二区三区四区四 | 亚洲精品视频在线看| 99国产精品久久久久久久久久| 欧美激情自拍偷拍| 国产成人精品www牛牛影视| 国产欧美日本一区二区三区| 国产精品羞羞答答xxdd| 欧美不卡激情三级在线观看| 久久国产剧场电影| 国产日韩欧美精品一区| 成人av集中营| 亚洲综合免费观看高清完整版| 欧美日韩一区在线观看| 日韩极品在线观看| 欧美精品一区二区三区四区| 国产成人av一区二区三区在线观看| 国产亚洲精品中文字幕| 99精品视频在线播放观看| 亚洲欧美国产高清| 在线观看91精品国产麻豆| 久久99国产乱子伦精品免费| 久久久亚洲国产美女国产盗摄| 丰满岳乱妇一区二区三区| 亚洲手机成人高清视频| 欧美色综合网站| 美女在线视频一区| 欧美国产禁国产网站cc| 欧美亚洲精品一区| 蜜桃视频一区二区| 国产精品国产自产拍高清av王其| 91福利精品视频| 蜜桃av噜噜一区二区三区小说| 国产日韩一级二级三级| av电影天堂一区二区在线| 亚洲美女电影在线| 欧美性受xxxx黑人xyx性爽| 久久精品av麻豆的观看方式|