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

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

?? diskonchip.c

?? linux下的MTD設備驅動源代碼,配合jffs2 yaffss2文件系統.
?? C
字號:
/*  * drivers/mtd/nand/diskonchip.c * * (C) 2003 Red Hat, Inc. * * Author: David Woodhouse <dwmw2@infradead.org> * * Interface to generic NAND code for M-Systems DiskOnChip devices * * $Id: diskonchip.c,v 1.9 2004/03/27 19:55:53 gleixner Exp $ */#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/delay.h>#include <asm/io.h>#include <linux/mtd/mtd.h>#include <linux/mtd/nand.h>#include <linux/mtd/doc2000.h>#include <linux/mtd/compatmac.h>struct doc_priv {	unsigned long virtadr;	unsigned long physadr;	u_char ChipID;	u_char CDSNControl;	int chips_per_floor; /* The number of chips detected on each floor */	int curfloor;	int curchip;};#define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)#define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd);static void doc200x_select_chip(struct mtd_info *mtd, int chip);static int debug=0;MODULE_PARM(debug, "i");static int try_dword=1;MODULE_PARM(try_dword, "i");static void DoC_Delay(struct doc_priv *doc, unsigned short cycles){	volatile char dummy;	int i;		for (i = 0; i < cycles; i++) {		if (DoC_is_Millennium(doc))			dummy = ReadDOC(doc->virtadr, NOP);		else			dummy = ReadDOC(doc->virtadr, DOCStatus);	}	}/* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */static int _DoC_WaitReady(struct doc_priv *doc){	unsigned long docptr = doc->virtadr;	unsigned long timeo = jiffies + (HZ * 10);	if(debug) printk("_DoC_WaitReady...\n");	/* Out-of-line routine to wait for chip response */	while (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) {		if (time_after(jiffies, timeo)) {			printk("_DoC_WaitReady timed out.\n");			return -EIO;		}		udelay(1);		cond_resched();	}	return 0;}static inline int DoC_WaitReady(struct doc_priv *doc){	unsigned long docptr = doc->virtadr;	int ret = 0;	DoC_Delay(doc, 4);	if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B))		/* Call the out-of-line routine to wait */		ret = _DoC_WaitReady(doc);	DoC_Delay(doc, 2);	if(debug) printk("DoC_WaitReady OK\n");	return ret;}static void doc2000_write_byte(struct mtd_info *mtd, u_char datum){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	if(debug)printk("write_byte %02x\n", datum);	WriteDOC(datum, docptr, CDSNSlowIO);	WriteDOC(datum, docptr, 2k_CDSN_IO);}static u_char doc2000_read_byte(struct mtd_info *mtd){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	ReadDOC(docptr, CDSNSlowIO);	u_char ret = ReadDOC(docptr, 2k_CDSN_IO);	if (debug) printk("read_byte returns %02x\n", ret);	return ret;}static void doc2000_writebuf(struct mtd_info *mtd, 			     const u_char *buf, int len){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	int i;	if (debug)printk("writebuf of %d bytes: ", len);	for (i=0; i < len; i++) {		WriteDOC_(buf[i], docptr, DoC_2k_CDSN_IO + i);		if (debug && i < 16)			printk("%02x ", buf[i]);	}	if (debug) printk("\n");}static void doc2000_readbuf(struct mtd_info *mtd, 			    u_char *buf, int len){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr; 	int i;	if (debug)printk("readbuf of %d bytes: ", len);	for (i=0; i < len; i++) {		buf[i] = ReadDOC(docptr, 2k_CDSN_IO + i);	}}static void doc2000_readbuf_dword(struct mtd_info *mtd, 			    u_char *buf, int len){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr; 	int i;	if (debug) printk("readbuf_dword of %d bytes: ", len);	if (unlikely((((unsigned long)buf)|len) & 3)) {		for (i=0; i < len; i++) {			*(uint8_t *)(&buf[i]) = ReadDOC(docptr, 2k_CDSN_IO + i);		}	} else {		for (i=0; i < len; i+=4) {			*(uint32_t*)(&buf[i]) = readl(docptr + DoC_2k_CDSN_IO + i);		}	}}static int doc2000_verifybuf(struct mtd_info *mtd, 			      const u_char *buf, int len){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	int i;	for (i=0; i < len; i++)		if (buf[i] != ReadDOC(docptr, 2k_CDSN_IO))			return -EFAULT;	return 0;}static uint16_t doc200x_ident_chip(struct mtd_info *mtd, int nr){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	uint16_t ret;	doc200x_select_chip(mtd, nr);	doc200x_hwcontrol(mtd, NAND_CTL_SETCLE);	this->write_byte(mtd, NAND_CMD_READID);	doc200x_hwcontrol(mtd, NAND_CTL_CLRCLE);	doc200x_hwcontrol(mtd, NAND_CTL_SETALE);	this->write_byte(mtd, 0);	doc200x_hwcontrol(mtd, NAND_CTL_CLRALE);		ret = this->read_byte(mtd) << 8;	ret |= this->read_byte(mtd);	if (doc->ChipID == DOC_ChipID_Doc2k && try_dword && !nr) {		/* First chip probe. See if we get same results by 32-bit access */		union {			uint32_t dword;			uint8_t byte[4];		} ident;		struct nand_chip *this = mtd->priv;		struct doc_priv *doc = (void *)this->priv;		unsigned long docptr = doc->virtadr;		doc200x_hwcontrol(mtd, NAND_CTL_SETCLE);		doc2000_write_byte(mtd, NAND_CMD_READID);		doc200x_hwcontrol(mtd, NAND_CTL_CLRCLE);		doc200x_hwcontrol(mtd, NAND_CTL_SETALE);		doc2000_write_byte(mtd, 0);		doc200x_hwcontrol(mtd, NAND_CTL_CLRALE);		ident.dword = readl(docptr + DoC_2k_CDSN_IO);		if (((ident.byte[0] << 8) | ident.byte[1]) == ret) {			printk(KERN_INFO "DiskOnChip 2000 responds to DWORD access\n");			this->read_buf = &doc2000_readbuf_dword;		}	}			return ret;}static void doc2000_count_chips(struct mtd_info *mtd){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	uint16_t mfrid;	int i;	/* Max 4 chips per floor on DiskOnChip 2000 */	doc->chips_per_floor = 4;	/* Find out what the first chip is */	mfrid = doc200x_ident_chip(mtd, 0);	/* Find how many chips in each floor. */	for (i = 1; i < 4; i++) {		if (doc200x_ident_chip(mtd, i) != mfrid)			break;	}	doc->chips_per_floor = i;}static int doc200x_wait(struct mtd_info *mtd, struct nand_chip *this, int state){	struct doc_priv *doc = (void *)this->priv;	int status;		DoC_WaitReady(doc);	this->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);	DoC_WaitReady(doc);	status = (int)this->read_byte(mtd);	return status;}static void doc2001_write_byte(struct mtd_info *mtd, u_char datum){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	WriteDOC(datum, docptr, CDSNSlowIO);	WriteDOC(datum, docptr, Mil_CDSN_IO);	WriteDOC(datum, docptr, WritePipeTerm);}static u_char doc2001_read_byte(struct mtd_info *mtd){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	ReadDOC(docptr, CDSNSlowIO);	/* 11.4.5 -- delay twice to allow extended length cycle */	DoC_Delay(doc, 2);	ReadDOC(docptr, ReadPipeInit);	return ReadDOC(docptr, Mil_CDSN_IO);}static void doc2001_writebuf(struct mtd_info *mtd, 			     const u_char *buf, int len){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	int i;	for (i=0; i < len; i++)		WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i);	/* Terminate write pipeline */	WriteDOC(0x00, docptr, WritePipeTerm);}static void doc2001_readbuf(struct mtd_info *mtd, 			    u_char *buf, int len){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	int i;	/* Start read pipeline */	ReadDOC(docptr, ReadPipeInit);	for (i=0; i < len-1; i++)		buf[i] = ReadDOC(docptr, Mil_CDSN_IO);	/* Terminate read pipeline */	buf[i] = ReadDOC(docptr, LastDataRead);}static int doc2001_verifybuf(struct mtd_info *mtd, 			     const u_char *buf, int len){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	int i;	/* Start read pipeline */	ReadDOC(docptr, ReadPipeInit);	for (i=0; i < len-1; i++)		if (buf[i] != ReadDOC(docptr, Mil_CDSN_IO)) {			ReadDOC(docptr, LastDataRead);			return i;		}	if (buf[i] != ReadDOC(docptr, LastDataRead))		return i;	return 0;}static void doc200x_select_chip(struct mtd_info *mtd, int chip){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	int floor = 0;	/* 11.4.4 -- deassert CE before changing chip */	doc200x_hwcontrol(mtd, NAND_CTL_CLRNCE);	if(debug)printk("select chip (%d)\n", chip);	if (chip == -1)		return;	floor = chip / doc->chips_per_floor;	chip -= (floor *  doc->chips_per_floor);	WriteDOC(floor, docptr, FloorSelect);	WriteDOC(chip, docptr, CDSNDeviceSelect);	doc200x_hwcontrol(mtd, NAND_CTL_SETNCE);	doc->curchip = chip;	doc->curfloor = floor;}static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	switch(cmd) {	case NAND_CTL_SETNCE:		doc->CDSNControl |= CDSN_CTRL_CE;		break;	case NAND_CTL_CLRNCE:		doc->CDSNControl &= ~CDSN_CTRL_CE;		break;	case NAND_CTL_SETCLE:		doc->CDSNControl |= CDSN_CTRL_CLE;		break;	case NAND_CTL_CLRCLE:		doc->CDSNControl &= ~CDSN_CTRL_CLE;		break;	case NAND_CTL_SETALE:		doc->CDSNControl |= CDSN_CTRL_ALE;		break;	case NAND_CTL_CLRALE:		doc->CDSNControl &= ~CDSN_CTRL_ALE;		break;	case NAND_CTL_SETWP:		doc->CDSNControl |= CDSN_CTRL_WP;		break;	case NAND_CTL_CLRWP:		doc->CDSNControl &= ~CDSN_CTRL_WP;		break;	}	if (debug)printk("hwcontrol(%d): %02x\n", cmd, doc->CDSNControl);	WriteDOC(doc->CDSNControl, docptr, CDSNControl);	/* 11.4.3 -- 4 NOPs after CSDNControl write */	DoC_Delay(doc, 4);}static int doc200x_dev_ready(struct mtd_info *mtd){	struct nand_chip *this = mtd->priv;	struct doc_priv *doc = (void *)this->priv;	unsigned long docptr = doc->virtadr;	/* 11.4.2 -- must NOP four times before checking FR/B# */	DoC_Delay(doc, 4);	if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) {		if(debug)			printk("not ready\n");		return 0;	}	/* 11.4.2 -- Must NOP twice if it's ready */	DoC_Delay(doc, 2);	if (debug)printk("was ready\n");	return 1; }	static int doc200x_block_bad(struct mtd_info *mtd, unsigned long block){	/* FIXME: Look it up in the BBT */	return 0;}struct doc_priv mydoc = {	.physadr = 0xd4000,	.curfloor = -1,	.curchip = -1,};u_char mydatabuf[528];struct nand_chip mynand = {	.priv = (void *)&mydoc,	.select_chip = doc200x_select_chip,	.hwcontrol = doc200x_hwcontrol,	.dev_ready = doc200x_dev_ready,	.waitfunc = doc200x_wait,	.block_bad = doc200x_block_bad,	.eccmode = NAND_ECC_SOFT,	.data_buf = mydatabuf,};struct mtd_info mymtd = {	.priv = (void *)&mynand,	.owner = THIS_MODULE,};int __init init_nanddoc(void){	mydoc.virtadr = (unsigned long)ioremap(mydoc.physadr, DOC_IOREMAP_LEN);	int nrchips = 1;	char *name;	WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, 		 mydoc.virtadr, DOCControl);	WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, 		 mydoc.virtadr, DOCControl);	WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, 		 mydoc.virtadr, DOCControl);	WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, 		 mydoc.virtadr, DOCControl);	mydoc.ChipID = ReadDOC(mydoc.virtadr, ChipID);	switch(mydoc.ChipID) {	case DOC_ChipID_DocMil:		mynand.write_byte = doc2001_write_byte;		mynand.read_byte = doc2001_read_byte;		mynand.write_buf = doc2001_writebuf;		mynand.read_buf = doc2001_readbuf;		mynand.verify_buf = doc2001_verifybuf;		ReadDOC(mydoc.virtadr, ChipID);		ReadDOC(mydoc.virtadr, ChipID);		if (ReadDOC(mydoc.virtadr, ChipID) != DOC_ChipID_DocMil) {			/* It's not a Millennium; it's one of the newer			   DiskOnChip 2000 units with a similar ASIC. 			   Treat it like a Millennium, except that it			   can have multiple chips. */			doc2000_count_chips(&mymtd);			nrchips = 4 * mydoc.chips_per_floor;			name = "DiskOnChip 2000 (INFTL Model)";		} else {			/* Bog-standard Millennium */			mydoc.chips_per_floor = 1;			nrchips = 1;			name = "DiskOnChip Millennium";		}		break;	case DOC_ChipID_Doc2k:		mynand.write_byte = doc2000_write_byte;		mynand.read_byte = doc2000_read_byte;		mynand.write_buf = doc2000_writebuf;		mynand.read_buf = doc2000_readbuf;		mynand.verify_buf = doc2000_verifybuf;		doc2000_count_chips(&mymtd);		nrchips = 4 * mydoc.chips_per_floor;		name = "DiskOnChip 2000 (NFTL Model)";		mydoc.CDSNControl |= CDSN_CTRL_FLASH_IO;		break;	default:		return -EIO;	}	if (nand_scan(&mymtd, nrchips)) {		iounmap((void *)mydoc.virtadr);		return -EIO;	}	mymtd.name = name;	add_mtd_device(&mymtd);	return 0;}void __exit cleanup_nanddoc(void){	del_mtd_device(&mymtd);	iounmap((void *)mydoc.virtadr);}	module_init(init_nanddoc);module_exit(cleanup_nanddoc);MODULE_LICENSE("GPL");MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");MODULE_DESCRIPTION("M-Systems DiskOnChip 2000 and Millennium device driver\n");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美在线观看一区二区三区| 99久久精品国产一区二区三区| 日韩欧美国产三级| 精品一区二区三区久久| 精品国产1区二区| 国产不卡一区视频| 亚洲欧美二区三区| 欧美性极品少妇| 日韩va亚洲va欧美va久久| 日韩欧美国产午夜精品| 国产不卡视频在线播放| 国产一区二区三区在线观看精品| 91在线免费视频观看| 亚洲高清不卡在线| 精品久久久久久久人人人人传媒 | 欧美久久久久久久久久| 免费观看成人鲁鲁鲁鲁鲁视频| 久久综合五月天婷婷伊人| 成人在线视频首页| 一区二区三区四区高清精品免费观看| 欧美日韩国产免费一区二区| 美女视频免费一区| 国产精品嫩草久久久久| 欧美日免费三级在线| 久久99国产精品久久99| 中文字幕亚洲电影| 欧美老女人第四色| 国产精品一区一区| 亚洲综合久久av| 精品成a人在线观看| 91麻豆视频网站| 麻豆精品视频在线观看| 国产精品久久久久久久久图文区 | 欧美亚洲一区二区在线观看| 男女视频一区二区| 国产精品久久久久久久久免费相片 | 欧美精品在线观看一区二区| 国内精品第一页| 亚洲精品国久久99热| 日韩精品中文字幕一区二区三区| 成人国产精品免费观看动漫| 五月天亚洲婷婷| 国产精品色哟哟| 91精品国产综合久久蜜臀| 东方aⅴ免费观看久久av| 性久久久久久久久久久久| 国产亚洲精品aa| 欧美人妖巨大在线| 不卡的av在线播放| 日本特黄久久久高潮| 中文字幕佐山爱一区二区免费| 日韩欧美资源站| 色8久久人人97超碰香蕉987| 国内成人精品2018免费看| 亚洲欧美日韩国产另类专区| 欧美大片在线观看一区| 在线精品视频小说1| 国产精品主播直播| 偷拍与自拍一区| 亚洲视频中文字幕| 久久影音资源网| 在线综合亚洲欧美在线视频| 91麻豆国产香蕉久久精品| 激情小说欧美图片| 五月婷婷色综合| 亚洲欧美区自拍先锋| 美女久久久精品| 欧美va亚洲va| 欧美日韩在线亚洲一区蜜芽| 成人午夜视频在线观看| 免费看日韩a级影片| 一区二区三区色| 国产欧美1区2区3区| 日韩一卡二卡三卡| 欧美午夜精品理论片a级按摩| 成人在线视频首页| 国产精一品亚洲二区在线视频| 性感美女极品91精品| ㊣最新国产の精品bt伙计久久| 久久午夜羞羞影院免费观看| 欧美一区二区成人| 欧美中文一区二区三区| caoporen国产精品视频| 国产精品一二一区| 久久超碰97中文字幕| 石原莉奈在线亚洲二区| 亚洲欧美一区二区久久| 久久九九久精品国产免费直播| 日韩一卡二卡三卡四卡| 欧美精品日韩综合在线| 欧美无砖砖区免费| 91国偷自产一区二区三区成为亚洲经典| 国产精品99久久久| 国产一区二区三区在线观看免费 | 日本最新不卡在线| 亚洲综合成人在线视频| 亚洲人一二三区| 最新久久zyz资源站| 国产精品蜜臀在线观看| 国产视频一区二区三区在线观看| 精品国产精品一区二区夜夜嗨| 日韩亚洲欧美综合| 日韩三级精品电影久久久| 欧美一区午夜视频在线观看| 8x8x8国产精品| 欧美日本精品一区二区三区| 色综合天天性综合| 色婷婷精品大视频在线蜜桃视频| 91视频免费播放| 91在线观看美女| 色婷婷精品久久二区二区蜜臂av| 色久优优欧美色久优优| 色综合久久综合网97色综合| 91丨porny丨蝌蚪视频| 91色.com| 欧洲一区二区三区在线| 在线欧美日韩精品| 欧美丝袜丝交足nylons| 欧美视频日韩视频在线观看| 欧美亚洲图片小说| 欧美日本在线播放| 欧美一级xxx| 久久综合色综合88| 国产欧美日韩中文久久| 欧美激情在线一区二区| 中文字幕五月欧美| 亚洲激情图片一区| 日韩精品一二区| 天天综合色天天综合| 婷婷综合另类小说色区| 免费精品视频最新在线| 精品在线你懂的| 国产高清精品网站| 99久久精品一区二区| 欧美在线观看一区| 欧美一区午夜视频在线观看| 久久午夜色播影院免费高清| 中文字幕一区二区三区不卡| 国产调教视频一区| 国产午夜精品一区二区三区嫩草 | 国产在线播放一区三区四| 丰满少妇久久久久久久| 99精品视频在线观看| 欧美亚洲动漫制服丝袜| 日韩一区二区免费在线电影| 国产拍欧美日韩视频二区 | 中文子幕无线码一区tr | 欧美韩国日本不卡| 亚洲欧美日韩国产综合在线| 亚洲不卡av一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品亚洲人在线观看| 99久久精品国产毛片| 一区二区三区成人在线视频| 精品欧美久久久| 国产精品久久久久久亚洲毛片| 亚洲欧美日韩久久| 天天射综合影视| 国产成人小视频| 欧美亚洲禁片免费| 精品国产乱码久久久久久久久| 国产精品久久久久影院| 亚洲高清免费观看| 国产成人av在线影院| 欧美视频一区在线| 久久久久久一级片| 夜夜亚洲天天久久| 狠狠色狠狠色综合日日91app| 91在线观看成人| 精品污污网站免费看| www国产精品av| 一区二区三区精品在线观看| 极品销魂美女一区二区三区| 99国产精品久久久久久久久久 | 精品国产乱码久久久久久久| 亚洲精品乱码久久久久久| 久久99精品久久久久久| 91在线视频播放地址| 日韩欧美中文字幕制服| 亚洲精品美国一| 国产精品一区专区| 欧美精品色综合| 自拍视频在线观看一区二区| 精品一二线国产| 欧美日韩中文字幕一区| 中文欧美字幕免费| 蜜桃在线一区二区三区| 91片黄在线观看| 日精品一区二区三区| 免费成人美女在线观看.| 97精品电影院| 欧美精品一区二区三区视频| 亚洲欧美福利一区二区| 国产成人在线网站| 欧美一卡二卡在线| 亚洲在线免费播放| 成人黄色一级视频| 精品国产欧美一区二区| 午夜在线电影亚洲一区| 97精品久久久午夜一区二区三区|