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

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

?? nand.c

?? u-boot1.3.0的原碼,從配了網絡驅動和FLASH的驅動,并該用ESC竟如
?? C
字號:
/* * NAND driver for TI DaVinci based boards. * * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> * * Based on Linux DaVinci NAND driver by TI. Original copyright follows: *//* * * linux/drivers/mtd/nand/nand_davinci.c * * NAND Flash Driver * * Copyright (C) 2006 Texas Instruments. * * ---------------------------------------------------------------------------- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * ---------------------------------------------------------------------------- * *  Overview: *   This is a device driver for the NAND flash device found on the *   DaVinci board which utilizes the Samsung k9k2g08 part. * Modifications: ver. 1.0: Feb 2005, Vinod/Sudhakar - * */#include <common.h>#ifdef CFG_USE_NAND#if !defined(CFG_NAND_LEGACY)#include <nand.h>#include <asm/arch/nand_defs.h>#include <asm/arch/emif_defs.h>extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd){	struct		nand_chip *this = mtd->priv;	u_int32_t	IO_ADDR_W = (u_int32_t)this->IO_ADDR_W;	IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);	switch (cmd) {		case NAND_CTL_SETCLE:			IO_ADDR_W |= MASK_CLE;			break;		case NAND_CTL_SETALE:			IO_ADDR_W |= MASK_ALE;			break;	}	this->IO_ADDR_W = (void *)IO_ADDR_W;}/* Set WP on deselect, write enable on select */static void nand_davinci_select_chip(struct mtd_info *mtd, int chip){#define GPIO_SET_DATA01	0x01c67018#define GPIO_CLR_DATA01	0x01c6701c#define GPIO_NAND_WP	(1 << 4)#ifdef SONATA_BOARD_GPIOWP	if (chip < 0) {		REG(GPIO_CLR_DATA01) |= GPIO_NAND_WP;	} else {		REG(GPIO_SET_DATA01) |= GPIO_NAND_WP;	}#endif}#ifdef CFG_NAND_HW_ECC#ifdef CFG_NAND_LARGEPAGEstatic struct nand_oobinfo davinci_nand_oobinfo = {	.useecc = MTD_NANDECC_AUTOPLACE,	.eccbytes = 12,	.eccpos = {8, 9, 10, 24, 25, 26, 40, 41, 42, 56, 57, 58},	.oobfree = { {2, 6}, {12, 12}, {28, 12}, {44, 12}, {60, 4} }};#elif defined(CFG_NAND_SMALLPAGE)static struct nand_oobinfo davinci_nand_oobinfo = {	.useecc = MTD_NANDECC_AUTOPLACE,	.eccbytes = 3,	.eccpos = {0, 1, 2},	.oobfree = { {6, 2}, {8, 8} }};#else#error "Either CFG_NAND_LARGEPAGE or CFG_NAND_SMALLPAGE must be defined!"#endifstatic void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode){	emifregs	emif_addr;	int		dummy;	emif_addr = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;	dummy = emif_addr->NANDF1ECC;	dummy = emif_addr->NANDF2ECC;	dummy = emif_addr->NANDF3ECC;	dummy = emif_addr->NANDF4ECC;	emif_addr->NANDFCR |= (1 << 8);}static u_int32_t nand_davinci_readecc(struct mtd_info *mtd, u_int32_t region){	u_int32_t	ecc = 0;	emifregs	emif_base_addr;	emif_base_addr = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;	if (region == 1)		ecc = emif_base_addr->NANDF1ECC;	else if (region == 2)		ecc = emif_base_addr->NANDF2ECC;	else if (region == 3)		ecc = emif_base_addr->NANDF3ECC;	else if (region == 4)		ecc = emif_base_addr->NANDF4ECC;	return(ecc);}static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code){	u_int32_t		tmp;	int			region, n;	struct nand_chip	*this = mtd->priv;	n = (this->eccmode == NAND_ECC_HW12_2048) ? 4 : 1;	region = 1;	while (n--) {		tmp = nand_davinci_readecc(mtd, region);		*ecc_code++ = tmp;		*ecc_code++ = tmp >> 16;		*ecc_code++ = ((tmp >> 8) & 0x0f) | ((tmp >> 20) & 0xf0);		region++;	}	return(0);}static void nand_davinci_gen_true_ecc(u_int8_t *ecc_buf){	u_int32_t	tmp = ecc_buf[0] | (ecc_buf[1] << 16) | ((ecc_buf[2] & 0xf0) << 20) | ((ecc_buf[2] & 0x0f) << 8);	ecc_buf[0] = ~(P64o(tmp) | P64e(tmp) | P32o(tmp) | P32e(tmp) | P16o(tmp) | P16e(tmp) | P8o(tmp) | P8e(tmp));	ecc_buf[1] = ~(P1024o(tmp) | P1024e(tmp) | P512o(tmp) | P512e(tmp) | P256o(tmp) | P256e(tmp) | P128o(tmp) | P128e(tmp));	ecc_buf[2] = ~( P4o(tmp) | P4e(tmp) | P2o(tmp) | P2e(tmp) | P1o(tmp) | P1e(tmp) | P2048o(tmp) | P2048e(tmp));}static int nand_davinci_compare_ecc(u_int8_t *ecc_nand, u_int8_t *ecc_calc, u_int8_t *page_data){	u_int32_t	i;	u_int8_t	tmp0_bit[8], tmp1_bit[8], tmp2_bit[8];	u_int8_t	comp0_bit[8], comp1_bit[8], comp2_bit[8];	u_int8_t	ecc_bit[24];	u_int8_t	ecc_sum = 0;	u_int8_t	find_bit = 0;	u_int32_t	find_byte = 0;	int		is_ecc_ff;	is_ecc_ff = ((*ecc_nand == 0xff) && (*(ecc_nand + 1) == 0xff) && (*(ecc_nand + 2) == 0xff));	nand_davinci_gen_true_ecc(ecc_nand);	nand_davinci_gen_true_ecc(ecc_calc);	for (i = 0; i <= 2; i++) {		*(ecc_nand + i) = ~(*(ecc_nand + i));		*(ecc_calc + i) = ~(*(ecc_calc + i));	}	for (i = 0; i < 8; i++) {		tmp0_bit[i] = *ecc_nand % 2;		*ecc_nand = *ecc_nand / 2;	}	for (i = 0; i < 8; i++) {		tmp1_bit[i] = *(ecc_nand + 1) % 2;		*(ecc_nand + 1) = *(ecc_nand + 1) / 2;	}	for (i = 0; i < 8; i++) {		tmp2_bit[i] = *(ecc_nand + 2) % 2;		*(ecc_nand + 2) = *(ecc_nand + 2) / 2;	}	for (i = 0; i < 8; i++) {		comp0_bit[i] = *ecc_calc % 2;		*ecc_calc = *ecc_calc / 2;	}	for (i = 0; i < 8; i++) {		comp1_bit[i] = *(ecc_calc + 1) % 2;		*(ecc_calc + 1) = *(ecc_calc + 1) / 2;	}	for (i = 0; i < 8; i++) {		comp2_bit[i] = *(ecc_calc + 2) % 2;		*(ecc_calc + 2) = *(ecc_calc + 2) / 2;	}	for (i = 0; i< 6; i++)		ecc_bit[i] = tmp2_bit[i + 2] ^ comp2_bit[i + 2];	for (i = 0; i < 8; i++)		ecc_bit[i + 6] = tmp0_bit[i] ^ comp0_bit[i];	for (i = 0; i < 8; i++)		ecc_bit[i + 14] = tmp1_bit[i] ^ comp1_bit[i];	ecc_bit[22] = tmp2_bit[0] ^ comp2_bit[0];	ecc_bit[23] = tmp2_bit[1] ^ comp2_bit[1];	for (i = 0; i < 24; i++)		ecc_sum += ecc_bit[i];	switch (ecc_sum) {		case 0:			/* Not reached because this function is not called if			   ECC values are equal */			return 0;		case 1:			/* Uncorrectable error */			DEBUG (MTD_DEBUG_LEVEL0, "ECC UNCORRECTED_ERROR 1\n");			return(-1);		case 12:			/* Correctable error */			find_byte = (ecc_bit[23] << 8) +				(ecc_bit[21] << 7) +				(ecc_bit[19] << 6) +				(ecc_bit[17] << 5) +				(ecc_bit[15] << 4) +				(ecc_bit[13] << 3) +				(ecc_bit[11] << 2) +				(ecc_bit[9]  << 1) +				ecc_bit[7];			find_bit = (ecc_bit[5] << 2) + (ecc_bit[3] << 1) + ecc_bit[1];			DEBUG (MTD_DEBUG_LEVEL0, "Correcting single bit ECC error at offset: %d, bit: %d\n", find_byte, find_bit);			page_data[find_byte] ^= (1 << find_bit);			return(0);		default:			if (is_ecc_ff) {				if (ecc_calc[0] == 0 && ecc_calc[1] == 0 && ecc_calc[2] == 0)					return(0);			}			DEBUG (MTD_DEBUG_LEVEL0, "UNCORRECTED_ERROR default\n");			return(-1);	}}static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc){	struct nand_chip	*this;	int			block_count = 0, i, rc;	this = mtd->priv;	block_count = (this->eccmode == NAND_ECC_HW12_2048) ? 4 : 1;	for (i = 0; i < block_count; i++) {		if (memcmp(read_ecc, calc_ecc, 3) != 0) {			rc = nand_davinci_compare_ecc(read_ecc, calc_ecc, dat);			if (rc < 0) {				return(rc);			}		}		read_ecc += 3;		calc_ecc += 3;		dat += 512;	}	return(0);}#endifstatic int nand_davinci_dev_ready(struct mtd_info *mtd){	emifregs	emif_addr;	emif_addr = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;	return(emif_addr->NANDFSR & 0x1);}static int nand_davinci_waitfunc(struct mtd_info *mtd, struct nand_chip *this, int state){	while(!nand_davinci_dev_ready(mtd)) {;}	*NAND_CE0CLE = NAND_STATUS;	return(*NAND_CE0DATA);}static void nand_flash_init(void){	u_int32_t	acfg1 = 0x3ffffffc;	u_int32_t	acfg2 = 0x3ffffffc;	u_int32_t	acfg3 = 0x3ffffffc;	u_int32_t	acfg4 = 0x3ffffffc;	emifregs	emif_regs;	/*------------------------------------------------------------------*	 *  NAND FLASH CHIP TIMEOUT @ 459 MHz                               *	 *                                                                  *	 *  AEMIF.CLK freq   = PLL1/6 = 459/6 = 76.5 MHz                    *	 *  AEMIF.CLK period = 1/76.5 MHz = 13.1 ns                         *	 *                                                                  *	 *------------------------------------------------------------------*/	 acfg1 = 0	 	| (0 << 31 )	/* selectStrobe */	 	| (0 << 30 )	/* extWait */	 	| (1 << 26 )	/* writeSetup	10 ns */	 	| (3 << 20 )	/* writeStrobe	40 ns */	 	| (1 << 17 )	/* writeHold	10 ns */	 	| (1 << 13 )	/* readSetup	10 ns */	 	| (5 << 7 )	/* readStrobe	60 ns */	 	| (1 << 4 )	/* readHold	10 ns */	 	| (3 << 2 )	/* turnAround	?? ns */	 	| (0 << 0 )	/* asyncSize	8-bit bus */	 	;	emif_regs = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;	emif_regs->AWCCR |= 0x10000000;	emif_regs->AB1CR = acfg1;	/* 0x08244128 */;	emif_regs->AB2CR = acfg2;	emif_regs->AB3CR = acfg3;	emif_regs->AB4CR = acfg4;	emif_regs->NANDFCR = 0x00000101;}int board_nand_init(struct nand_chip *nand){	nand->IO_ADDR_R   = (void  __iomem *)NAND_CE0DATA;	nand->IO_ADDR_W   = (void  __iomem *)NAND_CE0DATA;	nand->chip_delay  = 0;	nand->select_chip = nand_davinci_select_chip;#ifdef CFG_NAND_USE_FLASH_BBT	nand->options	  = NAND_USE_FLASH_BBT;#endif#ifdef CFG_NAND_HW_ECC#ifdef CFG_NAND_LARGEPAGE	nand->eccmode     = NAND_ECC_HW12_2048;#elif defined(CFG_NAND_SMALLPAGE)	nand->eccmode     = NAND_ECC_HW3_512;#else#error "Either CFG_NAND_LARGEPAGE or CFG_NAND_SMALLPAGE must be defined!"#endif	nand->autooob	  = &davinci_nand_oobinfo;	nand->calculate_ecc = nand_davinci_calculate_ecc;	nand->correct_data  = nand_davinci_correct_data;	nand->enable_hwecc  = nand_davinci_enable_hwecc;#else	nand->eccmode     = NAND_ECC_SOFT;#endif	/* Set address of hardware control function */	nand->hwcontrol = nand_davinci_hwcontrol;	nand->dev_ready = nand_davinci_dev_ready;	nand->waitfunc = nand_davinci_waitfunc;	nand_flash_init();	return(0);}#else#error "U-Boot legacy NAND support not available for DaVinci chips"#endif#endif	/* CFG_USE_NAND */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色激情天天射综合网| 五月天激情小说综合| 国产一区亚洲一区| 日韩欧美在线一区二区三区| 日本免费新一区视频 | 欧洲中文字幕精品| 亚洲国产美女搞黄色| 欧美放荡的少妇| 激情文学综合丁香| 国产精品黄色在线观看| 成人国产精品免费网站| 亚洲乱码国产乱码精品精98午夜| 欧洲亚洲精品在线| 免费成人在线观看视频| 久久欧美中文字幕| 色综合天天做天天爱| 亚洲成人综合网站| 久久青草欧美一区二区三区| a在线欧美一区| 亚洲电影一级片| 国产日产欧产精品推荐色 | 精品久久久三级丝袜| 成人av综合一区| 午夜欧美电影在线观看| 精品国精品国产尤物美女| av中文字幕在线不卡| 视频一区欧美精品| 国产精品福利影院| 3d动漫精品啪啪| 国产精品综合网| 亚洲天堂福利av| 精品福利一区二区三区免费视频| 99久久精品免费精品国产| 一区二区三区欧美亚洲| 精品美女被调教视频大全网站| 波多野结衣亚洲| 青青草国产精品亚洲专区无| 国产精品美女一区二区| 欧美蜜桃一区二区三区| 国产精品一二三四| 日韩高清国产一区在线| 国产精品嫩草久久久久| 日韩一区二区三区视频在线| 91在线一区二区| 狠狠色丁香久久婷婷综| 亚洲一区二三区| 中文一区二区在线观看| 欧美一级黄色录像| 在线精品视频一区二区三四| 国产美女久久久久| 日韩av成人高清| 亚洲在线视频免费观看| 中文字幕不卡在线| 久久综合色综合88| 欧美一级搡bbbb搡bbbb| 91麻豆国产精品久久| 国产毛片精品国产一区二区三区| 污片在线观看一区二区| 亚洲三级久久久| 国产精品久久久久9999吃药| 久久在线观看免费| 精品黑人一区二区三区久久| 欧美午夜精品久久久久久超碰| 成人av影院在线| 国产成人aaa| 国产一区二区不卡在线| 麻豆freexxxx性91精品| 日韩影院精彩在线| 三级不卡在线观看| 亚洲成人免费看| 亚洲国产精品久久一线不卡| 亚洲精品久久久蜜桃| 国产精品美女久久久久久2018| 精品成人佐山爱一区二区| 日韩网站在线看片你懂的| 欧美挠脚心视频网站| 5858s免费视频成人| 欧美日韩国产欧美日美国产精品| 色88888久久久久久影院按摩| 成年人国产精品| 99精品视频在线观看免费| 丰满亚洲少妇av| 成人小视频免费在线观看| 国产 欧美在线| 成人h精品动漫一区二区三区| 成人精品在线视频观看| 91视频免费播放| 欧美视频一区二区| 69堂精品视频| 在线不卡中文字幕| 欧美mv日韩mv国产| 久久久久久久久久久久久久久99| 精品福利视频一区二区三区| 国产清纯白嫩初高生在线观看91 | 欧美一级生活片| 26uuu色噜噜精品一区二区| 精品国产91久久久久久久妲己| 久久亚洲精华国产精华液| 国产天堂亚洲国产碰碰| 成人欧美一区二区三区白人| 成人欧美一区二区三区1314| 亚洲在线免费播放| 看片网站欧美日韩| 成人高清在线视频| 欧美日韩国产乱码电影| 日韩欧美在线综合网| 欧美国产日本视频| 一区二区三区美女| 美女www一区二区| 国产成人在线看| 色婷婷久久综合| 欧美一区二区日韩| 亚洲欧洲三级电影| 午夜精品免费在线观看| 国产一区二区毛片| 91成人免费网站| 91精品国产综合久久久久久久久久| 欧美精品一区二区久久婷婷| 中文字幕亚洲成人| 欧美aaaaaa午夜精品| 成人久久18免费网站麻豆| 欧美精品一二三四| 中国色在线观看另类| 亚洲成av人片www| 成人丝袜18视频在线观看| 欧美无砖专区一中文字| 久久精品日韩一区二区三区| 亚洲毛片av在线| 国产成人亚洲综合a∨婷婷| 欧美亚洲国产一区二区三区va| 欧美刺激午夜性久久久久久久| 亚洲天堂精品在线观看| 国产一区二区三区四区五区美女| 一本大道av一区二区在线播放| 欧美成人精品高清在线播放 | 久久久久久久久久久99999| 一区二区三区四区视频精品免费 | 精品国产乱子伦一区| 亚洲一区二区三区四区五区中文| 国产尤物一区二区在线| 欧美老肥妇做.爰bbww| 国产精品国产三级国产| 久久91精品国产91久久小草| 欧美日韩在线精品一区二区三区激情 | 日韩一区国产二区欧美三区| 亚洲日本一区二区三区| 国产大陆a不卡| 精品国产91乱码一区二区三区| 亚洲午夜影视影院在线观看| a级精品国产片在线观看| 久久久噜噜噜久噜久久综合| 青青草97国产精品免费观看 | 97国产精品videossex| 久久久国产综合精品女国产盗摄| 日韩电影免费在线看| 欧美日韩国产成人在线91| 亚洲日本va在线观看| av电影在线观看不卡| 国产精品日韩成人| 不卡的av网站| 国产女人18毛片水真多成人如厕| 精品一区二区三区在线播放| 在线播放亚洲一区| 日韩精品乱码av一区二区| 欧美午夜视频网站| 五月天激情综合网| 欧美一区二区黄色| 精品一区二区三区视频在线观看| 日韩丝袜美女视频| 蓝色福利精品导航| 久久久久久久久久久电影| 国产呦精品一区二区三区网站| 久久久噜噜噜久久人人看| 懂色av一区二区三区免费看| 国产三级精品三级| 国产精品99久久不卡二区| 久久久精品2019中文字幕之3| 国产99久久久久| 国产精品毛片久久久久久久| 成人网在线免费视频| 亚洲视频一区二区在线观看| 91香蕉视频污| 亚洲一区在线视频| 欧美精品第1页| 麻豆成人久久精品二区三区小说| 精品国产一区二区三区四区四 | 麻豆精品国产传媒mv男同| 精品国产免费人成在线观看| 国产一区在线不卡| 国产精品成人一区二区艾草| 99精品欧美一区二区三区小说 | 亚洲成人动漫av| 7777精品伊人久久久大香线蕉完整版| 日韩激情在线观看| 久久久精品tv| 欧洲精品一区二区| 麻豆一区二区99久久久久| 国产精品视频一二三| 欧美最新大片在线看| 经典三级视频一区|