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

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

?? bfin_nand.c

?? U-boot latest tarball
?? C
字號:
/* * Driver for Blackfin on-chip NAND controller. * * Enter bugs at http://blackfin.uclinux.org/ * * Copyright (c) 2007-2008 Analog Devices Inc. * * Licensed under the GPL-2 or later. *//* TODO: * - move bit defines into mach-common/bits/nand.h * - try and replace all IRQSTAT usage with STAT polling * - have software ecc mode use same algo as hw ecc ? */#include <common.h>#include <asm/io.h>#ifdef DEBUG# define pr_stamp() printf("%s:%s:%i: here i am\n", __FILE__, __func__, __LINE__)#else# define pr_stamp()#endif#include <nand.h>#include <asm/blackfin.h>/* Bit masks for NFC_CTL */#define                    WR_DLY  0xf        /* Write Strobe Delay */#define                    RD_DLY  0xf0       /* Read Strobe Delay */#define                    NWIDTH  0x100      /* NAND Data Width */#define                   PG_SIZE  0x200      /* Page Size *//* Bit masks for NFC_STAT */#define                     NBUSY  0x1        /* Not Busy */#define                   WB_FULL  0x2        /* Write Buffer Full */#define                PG_WR_STAT  0x4        /* Page Write Pending */#define                PG_RD_STAT  0x8        /* Page Read Pending */#define                  WB_EMPTY  0x10       /* Write Buffer Empty *//* Bit masks for NFC_IRQSTAT */#define                  NBUSYIRQ  0x1        /* Not Busy IRQ */#define                    WB_OVF  0x2        /* Write Buffer Overflow */#define                   WB_EDGE  0x4        /* Write Buffer Edge Detect */#define                    RD_RDY  0x8        /* Read Data Ready */#define                   WR_DONE  0x10       /* Page Write Done */#define NAND_IS_512() (CONFIG_BFIN_NFC_CTL_VAL & 0x200)/* * hardware specific access to control-lines */static void bfin_nfc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl){	pr_stamp();	if (cmd == NAND_CMD_NONE)		return;	while (bfin_read_NFC_STAT() & WB_FULL)		continue;	if (ctrl & NAND_CLE)		bfin_write_NFC_CMD(cmd);	else		bfin_write_NFC_ADDR(cmd);	SSYNC();}int bfin_nfc_devready(struct mtd_info *mtd){	pr_stamp();	return (bfin_read_NFC_STAT() & NBUSY ? 1 : 0);}/* * PIO mode for buffer writing and reading */static void bfin_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len){	pr_stamp();	int i;	/*	 * Data reads are requested by first writing to NFC_DATA_RD	* and then reading back from NFC_READ.	*/	for (i = 0; i < len; ++i) {		while (bfin_read_NFC_STAT() & WB_FULL)			if (ctrlc())				return;		/* Contents do not matter */		bfin_write_NFC_DATA_RD(0x0000);		while (!(bfin_read_NFC_IRQSTAT() & RD_RDY))			if (ctrlc())				return;		buf[i] = bfin_read_NFC_READ();		bfin_write_NFC_IRQSTAT(RD_RDY);	}}static uint8_t bfin_nfc_read_byte(struct mtd_info *mtd){	pr_stamp();	uint8_t val;	bfin_nfc_read_buf(mtd, &val, 1);	return val;}static void bfin_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len){	pr_stamp();	int i;	for (i = 0; i < len; ++i) {		while (bfin_read_NFC_STAT() & WB_FULL)			if (ctrlc())				return;		bfin_write_NFC_DATA_WR(buf[i]);	}}/* * ECC functions * These allow the bfin to use the controller's ECC * generator block to ECC the data as it passes through *//* * ECC error correction function */static int bfin_nfc_correct_data_256(struct mtd_info *mtd, u_char *dat,					u_char *read_ecc, u_char *calc_ecc){	u32 syndrome[5];	u32 calced, stored;	unsigned short failing_bit, failing_byte;	u_char data;	pr_stamp();	calced = calc_ecc[0] | (calc_ecc[1] << 8) | (calc_ecc[2] << 16);	stored = read_ecc[0] | (read_ecc[1] << 8) | (read_ecc[2] << 16);	syndrome[0] = (calced ^ stored);	/*	 * syndrome 0: all zero	 * No error in data	 * No action	 */	if (!syndrome[0] || !calced || !stored)		return 0;	/*	 * sysdrome 0: only one bit is one	 * ECC data was incorrect	 * No action	 */	if (hweight32(syndrome[0]) == 1)		return 1;	syndrome[1] = (calced & 0x7FF) ^ (stored & 0x7FF);	syndrome[2] = (calced & 0x7FF) ^ ((calced >> 11) & 0x7FF);	syndrome[3] = (stored & 0x7FF) ^ ((stored >> 11) & 0x7FF);	syndrome[4] = syndrome[2] ^ syndrome[3];	/*	 * sysdrome 0: exactly 11 bits are one, each parity	 * and parity' pair is 1 & 0 or 0 & 1.	 * 1-bit correctable error	 * Correct the error	 */	if (hweight32(syndrome[0]) == 11 && syndrome[4] == 0x7FF) {		failing_bit = syndrome[1] & 0x7;		failing_byte = syndrome[1] >> 0x3;		data = *(dat + failing_byte);		data = data ^ (0x1 << failing_bit);		*(dat + failing_byte) = data;		return 0;	}	/*	 * sysdrome 0: random data	 * More than 1-bit error, non-correctable error	 * Discard data, mark bad block	 */	return 1;}static int bfin_nfc_correct_data(struct mtd_info *mtd, u_char *dat,					u_char *read_ecc, u_char *calc_ecc){	int ret;	pr_stamp();	ret = bfin_nfc_correct_data_256(mtd, dat, read_ecc, calc_ecc);	/* If page size is 512, correct second 256 bytes */	if (NAND_IS_512()) {		dat += 256;		read_ecc += 8;		calc_ecc += 8;		ret |= bfin_nfc_correct_data_256(mtd, dat, read_ecc, calc_ecc);	}	return ret;}static void reset_ecc(void){	bfin_write_NFC_RST(0x1);	while (bfin_read_NFC_RST() & 1)		continue;}static void bfin_nfc_enable_hwecc(struct mtd_info *mtd, int mode){	reset_ecc();}static int bfin_nfc_calculate_ecc(struct mtd_info *mtd,		const u_char *dat, u_char *ecc_code){	u16 ecc0, ecc1;	u32 code[2];	u8 *p;	pr_stamp();	/* first 4 bytes ECC code for 256 page size */	ecc0 = bfin_read_NFC_ECC0();	ecc1 = bfin_read_NFC_ECC1();	code[0] = (ecc0 & 0x7FF) | ((ecc1 & 0x7FF) << 11);	/* first 3 bytes in ecc_code for 256 page size */	p = (u8 *) code;	memcpy(ecc_code, p, 3);	/* second 4 bytes ECC code for 512 page size */	if (NAND_IS_512()) {		ecc0 = bfin_read_NFC_ECC2();		ecc1 = bfin_read_NFC_ECC3();		code[1] = (ecc0 & 0x7FF) | ((ecc1 & 0x7FF) << 11);		/* second 3 bytes in ecc_code for second 256		 * bytes of 512 page size		 */		p = (u8 *) (code + 1);		memcpy((ecc_code + 3), p, 3);	}	reset_ecc();	return 0;}#ifdef CONFIG_BFIN_NFC_BOOTROM_ECC# define BOOTROM_ECC 1#else# define BOOTROM_ECC 0#endifstatic uint8_t bbt_pattern[] = { 0xff };static struct nand_bbt_descr bootrom_bbt = {	.options = 0,	.offs = 63,	.len = 1,	.pattern = bbt_pattern,};static struct nand_ecclayout bootrom_ecclayout = {	.eccbytes = 24,	.eccpos = {		0x8 * 0, 0x8 * 0 + 1, 0x8 * 0 + 2,		0x8 * 1, 0x8 * 1 + 1, 0x8 * 1 + 2,		0x8 * 2, 0x8 * 2 + 1, 0x8 * 2 + 2,		0x8 * 3, 0x8 * 3 + 1, 0x8 * 3 + 2,		0x8 * 4, 0x8 * 4 + 1, 0x8 * 4 + 2,		0x8 * 5, 0x8 * 5 + 1, 0x8 * 5 + 2,		0x8 * 6, 0x8 * 6 + 1, 0x8 * 6 + 2,		0x8 * 7, 0x8 * 7 + 1, 0x8 * 7 + 2	},	.oobfree = {		{ 0x8 * 0 + 3, 5 },		{ 0x8 * 1 + 3, 5 },		{ 0x8 * 2 + 3, 5 },		{ 0x8 * 3 + 3, 5 },		{ 0x8 * 4 + 3, 5 },		{ 0x8 * 5 + 3, 5 },		{ 0x8 * 6 + 3, 5 },		{ 0x8 * 7 + 3, 5 },	}};/* * Board-specific NAND initialization. The following members of the * argument are board-specific (per include/linux/mtd/nand.h): * - IO_ADDR_R?: address to read the 8 I/O lines of the flash device * - IO_ADDR_W?: address to write the 8 I/O lines of the flash device * - cmd_ctrl: hardwarespecific function for accesing control-lines * - dev_ready: hardwarespecific function for  accesing device ready/busy line * - enable_hwecc?: function to enable (reset)  hardware ecc generator. Must *   only be provided if a hardware ECC is available * - ecc.mode: mode of ecc, see defines * - chip_delay: chip dependent delay for transfering data from array to *   read regs (tR) * - options: various chip options. They can partly be set to inform *   nand_scan about special functionality. See the defines for further *   explanation * Members with a "?" were not set in the merged testing-NAND branch, * so they are not set here either. */int board_nand_init(struct nand_chip *chip){	pr_stamp();	/* set width/ecc/timings/etc... */	bfin_write_NFC_CTL(CONFIG_BFIN_NFC_CTL_VAL);	/* clear interrupt status */	bfin_write_NFC_IRQMASK(0x0);	bfin_write_NFC_IRQSTAT(0xffff);	/* enable GPIO function enable register */#ifdef __ADSPBF54x__	bfin_write_PORTJ_FER(bfin_read_PORTJ_FER() | 6);#elif defined(__ADSPBF52x__)	bfin_write_PORTH_FER(bfin_read_PORTH_FER() | 0xFCFF);	bfin_write_PORTH_MUX(0);#else# error no support for this variant#endif	chip->cmd_ctrl = bfin_nfc_cmd_ctrl;	chip->read_buf = bfin_nfc_read_buf;	chip->write_buf = bfin_nfc_write_buf;	chip->read_byte = bfin_nfc_read_byte;#ifdef CONFIG_BFIN_NFC_NO_HW_ECC# define ECC_HW 0#else# define ECC_HW 1#endif	if (ECC_HW) {		if (BOOTROM_ECC) {			chip->badblock_pattern = &bootrom_bbt;			chip->ecc.layout = &bootrom_ecclayout;		}		if (!NAND_IS_512()) {			chip->ecc.bytes = 3;			chip->ecc.size = 256;		} else {			chip->ecc.bytes = 6;			chip->ecc.size = 512;		}		chip->ecc.mode = NAND_ECC_HW;		chip->ecc.calculate = bfin_nfc_calculate_ecc;		chip->ecc.correct   = bfin_nfc_correct_data;		chip->ecc.hwctl     = bfin_nfc_enable_hwecc;	} else		chip->ecc.mode = NAND_ECC_SOFT;	chip->dev_ready = bfin_nfc_devready;	chip->chip_delay = 0;	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本到不卡免费一区二区| 国产综合色视频| 欧美亚洲图片小说| 亚洲精品水蜜桃| 91久久一区二区| 午夜av一区二区三区| 欧美一区二区三区免费在线看| 免费一级片91| 久久久久高清精品| 一本大道综合伊人精品热热| 亚洲国产精品综合小说图片区| 欧美久久高跟鞋激| 国模冰冰炮一区二区| 国产日韩精品久久久| 色综合咪咪久久| 日本成人在线不卡视频| 久久精品一区蜜桃臀影院| 91碰在线视频| 人人精品人人爱| 国产精品日韩成人| 欧美日韩视频在线一区二区| 久久国内精品视频| 国产精品久久久久久久午夜片 | 久久国产三级精品| 国产日韩欧美亚洲| 欧美午夜一区二区| 国产伦精品一区二区三区在线观看| 日韩毛片一二三区| 日韩美一区二区三区| 成人黄色小视频在线观看| 亚洲一区视频在线观看视频| 精品国产在天天线2019| 色偷偷久久人人79超碰人人澡| 蜜桃久久久久久| 一区二区三区四区视频精品免费| 91精品欧美一区二区三区综合在 | 国产精品国产精品国产专区不蜜 | 日韩视频国产视频| 成人福利视频网站| 日本vs亚洲vs韩国一区三区二区| 国产精品九色蝌蚪自拍| 日韩欧美精品三级| 欧美午夜精品一区二区三区| 风间由美一区二区av101| 蜜臀久久久99精品久久久久久| 亚洲人成网站在线| 精品福利视频一区二区三区| 欧美日韩一区在线观看| 91免费观看在线| 国产成人亚洲综合a∨婷婷图片| 日本成人在线视频网站| 一区二区欧美视频| 中文字幕亚洲综合久久菠萝蜜| 日韩午夜在线影院| 欧美视频在线一区二区三区 | 欧美性大战久久久久久久蜜臀| 国产酒店精品激情| 美国毛片一区二区| 亚洲成人久久影院| 亚洲男女一区二区三区| 国产精品网站导航| 国产精品色婷婷| 久久久久久久久久电影| 精品国产不卡一区二区三区| 555夜色666亚洲国产免| 精品视频一区 二区 三区| 91视频一区二区三区| 99久久婷婷国产综合精品| 国产精品夜夜嗨| 国产精品综合在线视频| 国产乱人伦偷精品视频免下载| 韩国v欧美v日本v亚洲v| 国产在线国偷精品产拍免费yy| 久久99久久精品| 麻豆国产欧美一区二区三区| 久久99久久久欧美国产| 久久精工是国产品牌吗| 韩国视频一区二区| 国产精品综合av一区二区国产馆| 激情综合色综合久久| 国产在线观看一区二区| 国产精品18久久久久| 成人午夜av电影| 99久久久精品免费观看国产蜜| 99精品在线观看视频| 91成人在线精品| 欧美日韩综合在线| 91精品国产乱码| 日韩女优视频免费观看| 精品国产污网站| 日本一区二区免费在线| 亚洲色图制服诱惑 | 韩日欧美一区二区三区| 国产99久久久精品| 91麻豆高清视频| 欧美人与禽zozo性伦| 日韩欧美一级精品久久| 久久久三级国产网站| 亚洲色欲色欲www在线观看| 亚洲444eee在线观看| 看电影不卡的网站| 成人免费毛片app| 在线视频欧美区| 欧美一区二区福利在线| 国产欧美一区二区精品性色超碰| 国产精品久久久久久久蜜臀| 亚洲成a人片综合在线| 免费在线观看精品| 成人在线一区二区三区| 欧美三级蜜桃2在线观看| 欧美成人精品1314www| 国产精品乱码一区二区三区软件| 亚洲自拍偷拍欧美| 激情六月婷婷久久| 一本到不卡免费一区二区| 日韩欧美美女一区二区三区| 国产清纯美女被跳蛋高潮一区二区久久w | 欧美日韩三级在线| 精品国产成人系列| 一区二区在线看| 国产在线视频一区二区三区| 91日韩精品一区| 精品国产精品网麻豆系列| 一区二区三区在线视频观看| 韩国一区二区在线观看| 欧美日韩一区小说| 国产精品久久久久一区二区三区共| 日韩精品久久久久久| 成人在线综合网| 欧美一级高清片| 亚洲精品菠萝久久久久久久| 国模一区二区三区白浆| 欧美男生操女生| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 日韩亚洲国产中文字幕欧美| 亚洲视频香蕉人妖| 精彩视频一区二区三区| 欧美剧情电影在线观看完整版免费励志电影| 精品久久久久一区| 性做久久久久久| 91在线看国产| 国产拍揄自揄精品视频麻豆| 蜜臀av性久久久久蜜臀av麻豆| 色偷偷久久一区二区三区| 国产女同互慰高潮91漫画| 蜜桃av噜噜一区二区三区小说| 日本乱人伦一区| 亚洲婷婷在线视频| 丁香激情综合国产| 久久免费美女视频| 精品影院一区二区久久久| 91精品国产一区二区人妖| 亚洲电影一级片| 欧美视频一区二区三区| 亚洲视频电影在线| 99久久精品国产导航| 国产无人区一区二区三区| 国产一区二区三区四区五区美女| 欧美一级艳片视频免费观看| 亚洲影院久久精品| 色婷婷av一区二区三区大白胸| 国产精品午夜久久| 波多野结衣中文字幕一区| 国产日韩精品视频一区| 国产传媒日韩欧美成人| 久久久综合激的五月天| 国产一区二区毛片| 337p粉嫩大胆色噜噜噜噜亚洲| 久久精品理论片| 亚洲精品在线观看网站| 韩国精品一区二区| 久久免费美女视频| 丁香六月久久综合狠狠色| 国产精品传媒入口麻豆| 97久久超碰国产精品| 亚洲乱码国产乱码精品精的特点 | 国产在线不卡一区| 久久久久久久久久久久电影| 粉嫩在线一区二区三区视频| 国产精品成人网| 色视频欧美一区二区三区| 一区二区三区中文字幕| 欧美日韩一区视频| 免费xxxx性欧美18vr| 精品成人私密视频| 国产成人高清视频| 一区二区三区高清| 69久久99精品久久久久婷婷| 老司机精品视频线观看86| 国产性色一区二区| 91在线一区二区三区| 亚洲不卡在线观看| 精品少妇一区二区三区在线播放| 国产一区二区精品久久91| 国产精品青草综合久久久久99| 99久久er热在这里只有精品15| 亚洲综合一区二区三区| 4438成人网| 大胆亚洲人体视频| 亚洲一区二区三区爽爽爽爽爽|