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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sharp.c

?? MIZI Research, Inc.發(fā)布的嵌入式Linux內(nèi)核源碼
?? C
字號(hào):
/* * MTD chip driver for pre-CFI Sharp flash chips * * Copyright 2000,2001 David A. Schleef <ds@schleef.org> *           2000,2001 Lineo, Inc. * * $Id: sharp.c,v 1.7 2002/02/13 15:49:07 dwmw2 Exp $ * * Devices supported: *   LH28F016SCT Symmetrical block flash memory, 2Mx8 *   LH28F008SCT Symmetrical block flash memory, 1Mx8 * * Documentation: *   http://www.sharpmeg.com/datasheets/memic/flashcmp/ *   http://www.sharpmeg.com/datasheets/memic/flashcmp/01symf/16m/016sctl9.pdf *   016sctl9.pdf * * Limitations: *   This driver only supports 4x1 arrangement of chips. *   Not tested on anything but PowerPC. */#include <linux/kernel.h>#include <linux/module.h>#include <linux/version.h>#include <linux/types.h>#include <linux/sched.h>#include <linux/errno.h>#include <linux/interrupt.h>#include <linux/mtd/map.h>#include <linux/mtd/cfi.h>#include <linux/delay.h>#define CMD_RESET		0xffffffff#define CMD_READ_ID		0x90909090#define CMD_READ_STATUS		0x70707070#define CMD_CLEAR_STATUS	0x50505050#define CMD_BLOCK_ERASE_1	0x20202020#define CMD_BLOCK_ERASE_2	0xd0d0d0d0#define CMD_BYTE_WRITE		0x40404040#define CMD_SUSPEND		0xb0b0b0b0#define CMD_RESUME		0xd0d0d0d0#define CMD_SET_BLOCK_LOCK_1	0x60606060#define CMD_SET_BLOCK_LOCK_2	0x01010101#define CMD_SET_MASTER_LOCK_1	0x60606060#define CMD_SET_MASTER_LOCK_2	0xf1f1f1f1#define CMD_CLEAR_BLOCK_LOCKS_1	0x60606060#define CMD_CLEAR_BLOCK_LOCKS_2	0xd0d0d0d0#define SR_READY		0x80808080 // 1 = ready#define SR_ERASE_SUSPEND	0x40404040 // 1 = block erase suspended#define SR_ERROR_ERASE		0x20202020 // 1 = error in block erase or clear lock bits#define SR_ERROR_WRITE		0x10101010 // 1 = error in byte write or set lock bit#define	SR_VPP			0x08080808 // 1 = Vpp is low#define SR_WRITE_SUSPEND	0x04040404 // 1 = byte write suspended#define SR_PROTECT		0x02020202 // 1 = lock bit set#define SR_RESERVED		0x01010101#define SR_ERRORS (SR_ERROR_ERASE|SR_ERROR_WRITE|SR_VPP|SR_PROTECT)/* Configuration options */#undef AUTOUNLOCK  /* automatically unlocks blocks before erasing */struct mtd_info *sharp_probe(struct map_info *);static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd);static int sharp_read(struct mtd_info *mtd, loff_t from, size_t len,	size_t *retlen, u_char *buf);static int sharp_write(struct mtd_info *mtd, loff_t from, size_t len,	size_t *retlen, const u_char *buf);static int sharp_erase(struct mtd_info *mtd, struct erase_info *instr);static void sharp_sync(struct mtd_info *mtd);static int sharp_suspend(struct mtd_info *mtd);static void sharp_resume(struct mtd_info *mtd);static void sharp_destroy(struct mtd_info *mtd);static int sharp_write_oneword(struct map_info *map, struct flchip *chip,	unsigned long adr, __u32 datum);static int sharp_erase_oneblock(struct map_info *map, struct flchip *chip,	unsigned long adr);#ifdef AUTOUNLOCKstatic void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip,	unsigned long adr);#endifstruct sharp_info{	struct flchip *chip;	int bogus;	int chipshift;	int numchips;	struct flchip chips[1];};struct mtd_info *sharp_probe(struct map_info *map);static void sharp_destroy(struct mtd_info *mtd);static struct mtd_chip_driver sharp_chipdrv = {	probe: sharp_probe,	destroy: sharp_destroy,	name: "sharp",	module: THIS_MODULE};struct mtd_info *sharp_probe(struct map_info *map){	struct mtd_info *mtd = NULL;	struct sharp_info *sharp = NULL;	int width;	mtd = kmalloc(sizeof(*mtd), GFP_KERNEL);	if(!mtd)		return NULL;	sharp = kmalloc(sizeof(*sharp), GFP_KERNEL);	if(!sharp)		return NULL;	memset(mtd, 0, sizeof(*mtd));	width = sharp_probe_map(map,mtd);	if(!width){		kfree(mtd);		kfree(sharp);		return NULL;	}	mtd->priv = map;	mtd->type = MTD_NORFLASH;	mtd->erase = sharp_erase;	mtd->read = sharp_read;	mtd->write = sharp_write;	mtd->sync = sharp_sync;	mtd->suspend = sharp_suspend;	mtd->resume = sharp_resume;	mtd->flags = MTD_CAP_NORFLASH;	mtd->name = map->name;	memset(sharp, 0, sizeof(*sharp));	sharp->chipshift = 23;	sharp->numchips = 1;	sharp->chips[0].start = 0;	sharp->chips[0].state = FL_READY;	sharp->chips[0].mutex = &sharp->chips[0]._spinlock;	sharp->chips[0].word_write_time = 0;	init_waitqueue_head(&sharp->chips[0].wq);	spin_lock_init(&sharp->chips[0]._spinlock);	map->fldrv = &sharp_chipdrv;	map->fldrv_priv = sharp;	MOD_INC_USE_COUNT;	return mtd;}static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd){	unsigned long tmp;	unsigned long base = 0;	u32 read0, read4;	int width = 4;	tmp = map->read32(map, base+0);	map->write32(map, CMD_READ_ID, base+0);	read0=map->read32(map, base+0);	read4=map->read32(map, base+4);	if(read0 == 0x89898989){		printk("Looks like sharp flash\n");		switch(read4){		case 0xaaaaaaaa:		case 0xa0a0a0a0:			/* aa - LH28F016SCT-L95 2Mx8, 32 64k blocks*/			/* a0 - LH28F016SCT-Z4  2Mx8, 32 64k blocks*/			mtd->erasesize = 0x10000 * width;			mtd->size = 0x200000 * width;			return width;		case 0xa6a6a6a6:			/* a6 - LH28F008SCT-L12 1Mx8, 16 64k blocks*/			/* a6 - LH28F008SCR-L85 1Mx8, 16 64k blocks*/			mtd->erasesize = 0x10000 * width;			mtd->size = 0x100000 * width;			return width;#if 0		case 0x00000000: /* unknown */			/* XX - LH28F004SCT 512kx8, 8 64k blocks*/			mtd->erasesize = 0x10000 * width;			mtd->size = 0x80000 * width;			return width;#endif		default:			printk("Sort-of looks like sharp flash, 0x%08x 0x%08x\n",				read0,read4);		}	}else if((map->read32(map, base+0) == CMD_READ_ID)){		/* RAM, probably */		printk("Looks like RAM\n");		map->write32(map, tmp, base+0);	}else{		printk("Doesn't look like sharp flash, 0x%08x 0x%08x\n",			read0,read4);	}	return 0;}/* This function returns with the chip->mutex lock held. */static int sharp_wait(struct map_info *map, struct flchip *chip){	__u16 status;	unsigned long timeo = jiffies + HZ;	DECLARE_WAITQUEUE(wait, current);	int adr = 0;retry:	spin_lock_bh(chip->mutex);	switch(chip->state){	case FL_READY:		map->write32(map,CMD_READ_STATUS,adr);		chip->state = FL_STATUS;	case FL_STATUS:		status = map->read32(map,adr);//printk("status=%08x\n",status);		udelay(100);		if((status & SR_READY)!=SR_READY){//printk(".status=%08x\n",status);			udelay(100);		}		break;	default:		printk("Waiting for chip\n");		set_current_state(TASK_INTERRUPTIBLE);		add_wait_queue(&chip->wq, &wait);		spin_unlock_bh(chip->mutex);		schedule();		remove_wait_queue(&chip->wq, &wait);		if(signal_pending(current))			return -EINTR;		timeo = jiffies + HZ;		goto retry;	}	map->write32(map,CMD_RESET, adr);	chip->state = FL_READY;	return 0;}static void sharp_release(struct flchip *chip){	wake_up(&chip->wq);	spin_unlock_bh(chip->mutex);}static int sharp_read(struct mtd_info *mtd, loff_t from, size_t len,	size_t *retlen, u_char *buf){	struct map_info *map = mtd->priv;	struct sharp_info *sharp = map->fldrv_priv;	int chipnum;	int ret = 0;	int ofs = 0;	chipnum = (from >> sharp->chipshift);	ofs = from & ((1 << sharp->chipshift)-1);	*retlen = 0;	while(len){		unsigned long thislen;		if(chipnum>=sharp->numchips)			break;		thislen = len;		if(ofs+thislen >= (1<<sharp->chipshift))			thislen = (1<<sharp->chipshift) - ofs;		ret = sharp_wait(map,&sharp->chips[chipnum]);		if(ret<0)			break;		map->copy_from(map,buf,ofs,thislen);		sharp_release(&sharp->chips[chipnum]);		*retlen += thislen;		len -= thislen;		buf += thislen;		ofs = 0;		chipnum++;	}	return ret;}static int sharp_write(struct mtd_info *mtd, loff_t to, size_t len,	size_t *retlen, const u_char *buf){	struct map_info *map = mtd->priv;	struct sharp_info *sharp = map->fldrv_priv;	int ret = 0;	int i,j;	int chipnum;	unsigned long ofs;	union { u32 l; unsigned char uc[4]; } tbuf;	*retlen = 0;	while(len){		tbuf.l = 0xffffffff;		chipnum = to >> sharp->chipshift;		ofs = to & ((1<<sharp->chipshift)-1);		j=0;		for(i=ofs&3;i<4 && len;i++){			tbuf.uc[i] = *buf;			buf++;			to++;			len--;			j++;		}		sharp_write_oneword(map, &sharp->chips[chipnum], ofs&~3, tbuf.l);		if(ret<0)			return ret;		(*retlen)+=j;	}	return 0;}static int sharp_write_oneword(struct map_info *map, struct flchip *chip,	unsigned long adr, __u32 datum){	int ret;	int timeo;	int try;	int i;	int status = 0;	ret = sharp_wait(map,chip);	for(try=0;try<10;try++){		map->write32(map,CMD_BYTE_WRITE,adr);		/* cpu_to_le32 -> hack to fix the writel be->le conversion */		map->write32(map,cpu_to_le32(datum),adr);		chip->state = FL_WRITING;		timeo = jiffies + (HZ/2);		map->write32(map,CMD_READ_STATUS,adr);		for(i=0;i<100;i++){			status = map->read32(map,adr);			if((status & SR_READY)==SR_READY)				break;		}		if(i==100){			printk("sharp: timed out writing\n");		}		if(!(status&SR_ERRORS))			break;		printk("sharp: error writing byte at addr=%08lx status=%08x\n",adr,status);		map->write32(map,CMD_CLEAR_STATUS,adr);	}	map->write32(map,CMD_RESET,adr);	chip->state = FL_READY;	wake_up(&chip->wq);	spin_unlock_bh(chip->mutex);	return 0;}static int sharp_erase(struct mtd_info *mtd, struct erase_info *instr){	struct map_info *map = mtd->priv;	struct sharp_info *sharp = map->fldrv_priv;	unsigned long adr,len;	int chipnum, ret=0;//printk("sharp_erase()\n");	if(instr->addr & (mtd->erasesize - 1))		return -EINVAL;	if(instr->len & (mtd->erasesize - 1))		return -EINVAL;	if(instr->len + instr->addr > mtd->size)		return -EINVAL;	chipnum = instr->addr >> sharp->chipshift;	adr = instr->addr & ((1<<sharp->chipshift)-1);	len = instr->len;	while(len){		ret = sharp_erase_oneblock(map, &sharp->chips[chipnum], adr);		if(ret)return ret;		adr += mtd->erasesize;		len -= mtd->erasesize;		if(adr >> sharp->chipshift){			adr = 0;			chipnum++;			if(chipnum>=sharp->numchips)				break;		}	}	instr->state = MTD_ERASE_DONE;	if(instr->callback)		instr->callback(instr);	return 0;}static int sharp_do_wait_for_ready(struct map_info *map, struct flchip *chip,	unsigned long adr){	int ret;	int timeo;	int status;	DECLARE_WAITQUEUE(wait, current);	map->write32(map,CMD_READ_STATUS,adr);	status = map->read32(map,adr);	timeo = jiffies + HZ;	while(time_before(jiffies, timeo)){		map->write32(map,CMD_READ_STATUS,adr);		status = map->read32(map,adr);		if((status & SR_READY)==SR_READY){			ret = 0;			goto out;		}		set_current_state(TASK_INTERRUPTIBLE);		add_wait_queue(&chip->wq, &wait);		//spin_unlock_bh(chip->mutex);		schedule_timeout(1);		schedule();		remove_wait_queue(&chip->wq, &wait);		//spin_lock_bh(chip->mutex);				if (signal_pending(current)){			ret = -EINTR;			goto out;		}			}	ret = -ETIME;out:	return ret;}static int sharp_erase_oneblock(struct map_info *map, struct flchip *chip,	unsigned long adr){	int ret;	//int timeo;	int status;	//int i;//printk("sharp_erase_oneblock()\n");#ifdef AUTOUNLOCK	/* This seems like a good place to do an unlock */	sharp_unlock_oneblock(map,chip,adr);#endif	map->write32(map,CMD_BLOCK_ERASE_1,adr);	map->write32(map,CMD_BLOCK_ERASE_2,adr);	chip->state = FL_ERASING;	ret = sharp_do_wait_for_ready(map,chip,adr);	if(ret<0)return ret;	map->write32(map,CMD_READ_STATUS,adr);	status = map->read32(map,adr);	if(!(status&SR_ERRORS)){		map->write32(map,CMD_RESET,adr);		chip->state = FL_READY;		//spin_unlock_bh(chip->mutex);		return 0;	}	printk("sharp: error erasing block at addr=%08lx status=%08x\n",adr,status);	map->write32(map,CMD_CLEAR_STATUS,adr);	//spin_unlock_bh(chip->mutex);	return -EIO;}#ifdef AUTOUNLOCKstatic void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip,	unsigned long adr){	int i;	int status;	map->write32(map,CMD_CLEAR_BLOCK_LOCKS_1,adr);	map->write32(map,CMD_CLEAR_BLOCK_LOCKS_2,adr);	udelay(100);	status = map->read32(map,adr);	printk("status=%08x\n",status);	for(i=0;i<1000;i++){		//map->write32(map,CMD_READ_STATUS,adr);		status = map->read32(map,adr);		if((status & SR_READY)==SR_READY)			break;		udelay(100);	}	if(i==1000){		printk("sharp: timed out unlocking block\n");	}	if(!(status&SR_ERRORS)){		map->write32(map,CMD_RESET,adr);		chip->state = FL_READY;		return;	}	printk("sharp: error unlocking block at addr=%08lx status=%08x\n",adr,status);	map->write32(map,CMD_CLEAR_STATUS,adr);}#endifstatic void sharp_sync(struct mtd_info *mtd){	//printk("sharp_sync()\n");}static int sharp_suspend(struct mtd_info *mtd){	printk("sharp_suspend()\n");	return -EINVAL;}static void sharp_resume(struct mtd_info *mtd){	printk("sharp_resume()\n");	}static void sharp_destroy(struct mtd_info *mtd){	printk("sharp_destroy()\n");}int __init sharp_probe_init(void){	printk("MTD Sharp chip driver <ds@lineo.com>\n");	register_mtd_chip_driver(&sharp_chipdrv);	return 0;}static void __exit sharp_probe_exit(void){	unregister_mtd_chip_driver(&sharp_chipdrv);}module_init(sharp_probe_init);module_exit(sharp_probe_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("David Schleef <ds@schleef.org>");MODULE_DESCRIPTION("Old MTD chip driver for pre-CFI Sharp flash chips");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡的av网站| 欧美精品久久久久久久久老牛影院| 国产精品久久久久久亚洲毛片| 在线观看视频91| 精品一区二区在线看| 亚洲精品videosex极品| wwww国产精品欧美| 欧美日韩亚洲高清一区二区| 国产成人精品免费看| 午夜精品一区二区三区免费视频| 国产情人综合久久777777| 欧美区视频在线观看| 99久久免费国产| 国产做a爰片久久毛片| 亚洲3atv精品一区二区三区| 国产精品久久久久桃色tv| 精品国产一区二区三区av性色| 欧美三日本三级三级在线播放| 成人小视频在线观看| 韩国三级在线一区| 蜜臀av一区二区三区| 午夜精品福利视频网站| 一区二区三区四区中文字幕| 久久久国际精品| 日韩精品一区二区三区三区免费| 欧美日韩电影在线播放| 色欧美日韩亚洲| 色综合网站在线| 成人av免费网站| 成人性生交大片免费看中文网站| 久久精品国产第一区二区三区| 三级欧美在线一区| 亚洲成人精品影院| 午夜激情一区二区| 亚洲www啪成人一区二区麻豆| 一区二区高清视频在线观看| 亚洲欧美自拍偷拍色图| 亚洲国产成人一区二区三区| 日本一区二区视频在线| 国产午夜精品一区二区三区嫩草| 久久蜜桃av一区精品变态类天堂 | 欧美丝袜丝交足nylons图片| 99久久精品国产一区| 91小视频在线观看| 97精品国产露脸对白| 色综合久久久久久久| 欧美综合色免费| 欧美综合一区二区三区| 欧美另类高清zo欧美| 在线综合视频播放| 精品国产一区二区三区忘忧草| 精品国产免费人成在线观看| 欧美精品一区二区三区视频| 亚洲精品一区二区三区精华液| 久久午夜电影网| 国产女人18水真多18精品一级做| 中文字幕一区三区| 亚洲国产毛片aaaaa无费看| 午夜精品成人在线| 久久精品国产网站| 国产福利一区二区三区视频在线| 国产成人av资源| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 色哟哟一区二区在线观看| 色av成人天堂桃色av| 欧美日韩精品免费观看视频| 欧美一级在线视频| 国产亚洲精品免费| 一区二区三区在线免费观看| 视频一区视频二区中文| 韩国v欧美v日本v亚洲v| thepron国产精品| 欧美日韩一二区| 精品国产第一区二区三区观看体验| 久久久久97国产精华液好用吗| 亚洲三级小视频| 日韩精品电影一区亚洲| 国产91精品精华液一区二区三区 | 成人综合在线观看| 欧美午夜影院一区| 五月婷婷激情综合网| 久久99九九99精品| 91视频国产观看| 4438x成人网最大色成网站| 久久久不卡网国产精品一区| 亚洲另类春色国产| 精品无码三级在线观看视频 | 精品福利一二区| 亚洲乱码中文字幕| 精品中文av资源站在线观看| 色悠悠亚洲一区二区| 日韩欧美一级二级| 亚洲综合视频在线观看| 国产美女在线观看一区| 欧美日韩在线一区二区| 国产日产欧美一区| 午夜精品福利久久久| 99国产精品久久久久久久久久久 | 亚洲蜜桃精久久久久久久| 久久精品免费观看| 欧美日韩亚洲丝袜制服| 国产精品久久久久7777按摩| 久久精品国产亚洲一区二区三区| 日本乱人伦aⅴ精品| 中文字幕免费观看一区| 美女一区二区在线观看| 色天天综合久久久久综合片| 国产日本一区二区| 蜜桃一区二区三区在线观看| 欧美午夜片在线看| 亚洲日穴在线视频| 成人性生交大片| 337p日本欧洲亚洲大胆精品| 婷婷中文字幕一区三区| 色综合久久久久| 国产精品传媒视频| 国产美女视频91| 精品对白一区国产伦| 奇米精品一区二区三区在线观看 | 亚洲欧美在线aaa| 欧美一区二区三区视频免费播放| 亚洲欧洲无码一区二区三区| 国产成人综合精品三级| 精品国产免费一区二区三区四区 | 91一区在线观看| 中文字幕第一页久久| 国产精品亚洲一区二区三区在线 | 亚洲精品国久久99热| av电影一区二区| 中文字幕制服丝袜成人av| 成人h精品动漫一区二区三区| 国产午夜精品久久| 国产成人av电影在线播放| 久久亚洲精华国产精华液| 麻豆久久一区二区| 精品少妇一区二区三区视频免付费| 日韩不卡在线观看日韩不卡视频| 欧美日韩国产精品成人| 日韩中文字幕一区二区三区| 555夜色666亚洲国产免| 日本欧美大码aⅴ在线播放| 91精品国产美女浴室洗澡无遮挡| 丝袜亚洲另类欧美综合| 日韩午夜激情电影| 精品午夜久久福利影院| 国产丝袜欧美中文另类| 成人视屏免费看| 亚洲男人的天堂av| 欧美日韩国产综合一区二区三区 | 精品日韩在线观看| 国产精品99久久久久久久vr| 欧美国产激情一区二区三区蜜月| 成人福利在线看| 国产精品美女久久久久aⅴ国产馆| 不卡一区中文字幕| 亚洲综合区在线| 91精品国产91久久久久久一区二区| 美女www一区二区| 国产欧美日韩亚州综合| 色综合久久88色综合天天6| 亚洲福利视频三区| 欧美精品一区二区在线播放| 成人激情动漫在线观看| 亚洲一区在线电影| 日韩一区二区免费电影| 国产高清不卡一区二区| 亚洲精品国产品国语在线app| 欧美日韩国产乱码电影| 国产乱码精品一品二品| 亚洲精品久久久久久国产精华液 | 国产精品高潮久久久久无| 欧美在线短视频| 欧美日韩国产综合视频在线观看 | 久久久亚洲精华液精华液精华液| www.成人在线| 日本中文一区二区三区| 国产日本亚洲高清| 欧美亚洲丝袜传媒另类| 国产一区二区三区免费看 | 亚洲欧洲日韩av| 91精品国产欧美一区二区成人| 国产999精品久久| 午夜私人影院久久久久| 国产女人18水真多18精品一级做| 欧美日精品一区视频| 国产成人在线视频网址| 亚洲综合一二区| 国产日产欧产精品推荐色| 欧美另类高清zo欧美| av激情亚洲男人天堂| 美女看a上一区| 一区二区三区精品在线| 久久久五月婷婷| 67194成人在线观看| 91一区二区三区在线观看| 久久狠狠亚洲综合| 亚洲午夜影视影院在线观看| 中文字幕不卡在线观看| 日韩欧美一区二区不卡| 日本韩国欧美三级|