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

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

?? diskonchip.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? 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.1.4.2 2003/11/08 09:42:12 bushi 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 i;	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一区二区三区免费野_久草精品视频
国产老妇另类xxxxx| 91麻豆免费视频| 国产 日韩 欧美大片| 色欧美日韩亚洲| 欧美成人一区二区| 国产精品成人在线观看| 午夜电影一区二区三区| 成人激情小说乱人伦| 91精品国产入口在线| 国产精品乱码人人做人人爱| 丝袜诱惑亚洲看片| 99国产精品一区| 精品国产精品网麻豆系列| 一区二区三区不卡视频在线观看| 美女mm1313爽爽久久久蜜臀| 91免费国产视频网站| 国产清纯白嫩初高生在线观看91| 日韩av网站免费在线| 91行情网站电视在线观看高清版| 国产欧美日韩在线视频| 久久精品国产亚洲5555| 欧美日韩久久久一区| 亚洲免费观看高清| 成人av在线看| 国产三区在线成人av| 毛片一区二区三区| 91精品国产色综合久久| 亚洲亚洲精品在线观看| 一本到一区二区三区| 国产精品视频免费看| 国产一区二区伦理| 久久午夜电影网| 国产一区二区三区综合| 日韩欧美aaaaaa| 久久国产精品色婷婷| 91精品国产综合久久精品图片| 亚洲男人天堂av| 99re热这里只有精品视频| 国产精品网站在线观看| 成人一道本在线| 欧美国产日韩精品免费观看| 成人中文字幕在线| 中文字幕电影一区| gogo大胆日本视频一区| 中文字幕一区二区三区四区不卡| 99久久99久久久精品齐齐| 国产精品久久影院| 91丨porny丨国产| 亚洲视频一二三| 在线视频国内自拍亚洲视频| 亚洲福利视频一区二区| 91精品久久久久久蜜臀| 九九视频精品免费| 午夜欧美视频在线观看| 日韩一级免费一区| 国产精品资源网| 中文字幕永久在线不卡| 欧美性大战久久| 琪琪久久久久日韩精品| 久久久亚洲国产美女国产盗摄| 国产.欧美.日韩| 一区二区三区视频在线观看| 欧美丝袜第三区| 看片的网站亚洲| 中文字幕高清一区| 欧美色网站导航| 极品销魂美女一区二区三区| 欧美激情一区二区三区不卡| 色婷婷av一区| 蜜桃在线一区二区三区| 国产精品青草综合久久久久99| 在线观看视频欧美| 激情另类小说区图片区视频区| 国产精品免费人成网站| 欧美日韩精品是欧美日韩精品| 九九精品一区二区| 亚洲欧美二区三区| 日韩欧美中文一区| 色素色在线综合| 狠狠色狠狠色综合| 亚洲福利电影网| 国产欧美一区二区精品忘忧草| 欧美日韩国产乱码电影| 成人性视频网站| 日本最新不卡在线| 亚洲视频在线一区观看| 精品国免费一区二区三区| 欧洲一区在线观看| 国产精品18久久久久| 午夜国产不卡在线观看视频| 中文字幕av一区 二区| 欧美电影在线免费观看| 95精品视频在线| 国产尤物一区二区| 亚洲二区视频在线| 1000精品久久久久久久久| 日韩精品一区二区三区视频在线观看| 91色视频在线| 国产成人aaaa| 精品亚洲国内自在自线福利| 亚洲香肠在线观看| 中文字幕一区二区三| 久久精品视频免费观看| 日韩欧美一区在线| 91黄色小视频| bt欧美亚洲午夜电影天堂| 国产一区二区三区四区五区入口| 亚洲一区二区五区| 亚洲欧美日韩中文字幕一区二区三区| 久久久国产午夜精品| 欧美va亚洲va| 日韩手机在线导航| 欧美xxxxx裸体时装秀| 欧美另类z0zxhd电影| 欧美三级资源在线| 欧美日韩一区二区三区不卡| 91免费国产视频网站| 91日韩精品一区| 色综合久久综合网欧美综合网| 成人一区在线看| www.66久久| 不卡的电影网站| 91香蕉国产在线观看软件| 成人爱爱电影网址| 91在线精品一区二区| 91老师国产黑色丝袜在线| 91性感美女视频| 欧亚洲嫩模精品一区三区| 欧美性欧美巨大黑白大战| 欧美精选在线播放| 日韩午夜电影av| www成人在线观看| 欧美激情一区二区三区全黄| 国产精品久久精品日日| 亚洲欧洲一区二区在线播放| 亚洲精品日日夜夜| 亚洲成人av免费| 看电视剧不卡顿的网站| 国产成人夜色高潮福利影视| 风间由美一区二区av101| 99精品视频在线播放观看| 色av成人天堂桃色av| 欧美日韩一区二区欧美激情| 日韩亚洲欧美中文三级| 久久精品视频在线免费观看| 中文字幕亚洲欧美在线不卡| 亚洲夂夂婷婷色拍ww47| 日韩国产精品大片| 国产91精品露脸国语对白| 99久久er热在这里只有精品15| 欧美撒尿777hd撒尿| 精品美女一区二区| 国产精品乱人伦中文| 亚洲gay无套男同| 国内精品久久久久影院薰衣草| eeuss国产一区二区三区| 91精品婷婷国产综合久久性色| 久久蜜臀精品av| 亚洲一区二区三区四区中文字幕| 免费成人在线观看| 91在线国产福利| 日韩欧美国产系列| 亚洲精品国产成人久久av盗摄| 日本美女一区二区三区| 成人一区二区三区| 91精品国产91久久久久久最新毛片| 国产日韩成人精品| 日本中文字幕不卡| av电影在线不卡| 精品少妇一区二区三区免费观看| 国产精品美女久久久久久| 免费xxxx性欧美18vr| 色伊人久久综合中文字幕| 2014亚洲片线观看视频免费| 亚洲成人777| 99久久精品国产麻豆演员表| 久久噜噜亚洲综合| 日本欧美久久久久免费播放网| 91丨porny丨蝌蚪视频| 欧美经典一区二区| 蜜桃免费网站一区二区三区| 在线精品视频免费观看| 国产农村妇女精品| 韩国欧美一区二区| 91.麻豆视频| 亚洲国产一区视频| 色哟哟在线观看一区二区三区| 中文字幕国产一区| 国产一区91精品张津瑜| 日韩美女在线视频| 丝袜诱惑亚洲看片| 欧美乱妇20p| 亚洲福利视频三区| 欧美日韩一区二区电影| 一区二区三区影院| 色一情一伦一子一伦一区| 亚洲免费三区一区二区| 97久久超碰国产精品电影| 国产精品美女一区二区三区 | 色噜噜狠狠成人中文综合 |