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

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

?? sharp.c

?? 該文件是rt_linux
?? C
字號:
/* * 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;		}	}	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");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区精品视频 | 不卡影院免费观看| 欧美人妖巨大在线| 亚洲黄色av一区| 日本韩国一区二区三区视频| 亚洲精选视频在线| 欧美探花视频资源| 亚洲成人激情综合网| 欧美三级电影在线看| 亚洲一区二区3| 亚洲一区在线播放| 欧美一区二区三区白人| 三级一区在线视频先锋 | 99精品视频在线观看| 国产精品美女久久久久久2018| 成人午夜看片网址| 亚洲精品久久久蜜桃| 欧美精品tushy高清| 精品一区二区三区在线观看| 久久久久综合网| 99re热这里只有精品免费视频| 亚洲激情综合网| 日韩午夜激情av| 懂色av中文字幕一区二区三区| 亚洲欧美日韩一区二区| 欧美精品免费视频| 国产麻豆精品久久一二三| 中文字幕五月欧美| 欧美高清www午色夜在线视频| 激情综合色播激情啊| 日韩毛片视频在线看| 6080日韩午夜伦伦午夜伦| 国产一区二区在线电影| 亚洲精品成人精品456| 欧美一区二区三区精品| 成人av电影免费观看| 首页欧美精品中文字幕| 久久奇米777| 欧美日韩国产系列| 日韩欧美国产精品一区| 国产曰批免费观看久久久| 亚洲欧美区自拍先锋| 精品欧美一区二区久久| 色噜噜狠狠成人中文综合| 狠狠网亚洲精品| 一区二区三区中文字幕在线观看| 精品免费一区二区三区| 在线精品观看国产| 成人在线视频首页| 五月婷婷久久综合| 国产精品久久毛片a| 日韩欧美国产麻豆| 欧美三日本三级三级在线播放| 丁香六月综合激情| 久久国产精品第一页| 亚洲一区二区在线免费观看视频| 欧美激情综合网| 日韩精品一区二区三区中文不卡| 一本高清dvd不卡在线观看| 国产精品一区专区| 日本不卡视频在线| 亚洲综合小说图片| 中文字幕综合网| 久久精品网站免费观看| 欧美电影免费观看完整版| 欧美图区在线视频| 91免费看`日韩一区二区| 国产精品一二三四五| 青青草精品视频| 亚洲一区电影777| 一区二区三区在线观看欧美| 最新日韩在线视频| 中文字幕电影一区| 久久久久久97三级| 久久久综合激的五月天| 欧美一二三四区在线| 国产亚洲1区2区3区| 91精品国产免费| 欧美日韩亚洲不卡| 欧美午夜一区二区| 在线亚洲高清视频| 91久久久免费一区二区| 色综合亚洲欧洲| 99久久99久久久精品齐齐| 成人免费视频视频| 不卡的av网站| av在线不卡网| 一本一道综合狠狠老| 色欧美日韩亚洲| 欧日韩精品视频| 欧美群妇大交群的观看方式| 欧美喷潮久久久xxxxx| 欧美精品一二三| 欧美成人艳星乳罩| 久久久五月婷婷| 中文字幕的久久| 成人欧美一区二区三区1314| 亚洲色图制服丝袜| 亚洲一级二级三级在线免费观看| 亚洲高清不卡在线观看| 天天色综合天天| 国模无码大尺度一区二区三区| 国产精一区二区三区| 丁香五精品蜜臀久久久久99网站| aa级大片欧美| 欧美在线不卡视频| 欧美一区二区三区四区在线观看 | 亚洲一级电影视频| 丁香婷婷综合色啪| 波多野结衣欧美| 欧美色偷偷大香| 欧美成人在线直播| 国产精品午夜春色av| 亚洲一区二区三区中文字幕 | 亚洲欧美一区二区三区国产精品 | 欧美丰满一区二区免费视频| 久久综合九色综合97婷婷| 美女网站视频久久| 亚洲综合久久久| 毛片av中文字幕一区二区| 丁香一区二区三区| 欧美日韩国产综合一区二区三区 | 99久久婷婷国产精品综合| 欧美吞精做爰啪啪高潮| 26uuu国产在线精品一区二区| 国产精品久久久久久久久久久免费看 | 欧美三级欧美一级| 久久中文字幕电影| 一区二区三区日韩欧美| 国产在线看一区| 欧美在线一二三| 中文字幕欧美日韩一区| 日韩高清不卡在线| 波多野结衣中文一区| 欧美一区二区三区不卡| 亚洲女人****多毛耸耸8| 激情丁香综合五月| 欧美日韩久久一区二区| 国产精品福利一区| 捆绑变态av一区二区三区| 色爱区综合激月婷婷| 国产日韩欧美亚洲| 蜜臀久久99精品久久久画质超高清| 99精品久久久久久| 亚洲国产三级在线| 国产成人免费网站| 日韩午夜小视频| 亚洲午夜久久久| 91亚洲资源网| 久久久99久久精品欧美| 三级精品在线观看| 欧美亚洲另类激情小说| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美日韩一区三区四区| 中文字幕欧美激情| 国产一区二区三区精品欧美日韩一区二区三区 | 美国三级日本三级久久99| 色综合色狠狠综合色| 亚洲国产精品二十页| 国内偷窥港台综合视频在线播放| 制服丝袜av成人在线看| 亚洲成人av一区二区三区| av在线免费不卡| 中文字幕一区二区三区在线播放| 国产美女精品一区二区三区| 日韩免费电影一区| 奇米色一区二区| 日韩一区二区三区视频在线观看| 亚洲超碰97人人做人人爱| 日本久久电影网| 一区二区三区中文字幕精品精品 | 1区2区3区国产精品| 成人黄色一级视频| 国产日韩欧美在线一区| 国产盗摄精品一区二区三区在线| 久久综合久久综合九色| 狠狠色2019综合网| 久久久久久久久久久久电影| 国产麻豆成人精品| 日本一区二区三区高清不卡 | 高清在线成人网| 国产精品每日更新| 成人午夜碰碰视频| 亚洲另类色综合网站| 色狠狠综合天天综合综合| 国产精品1024| 国产片一区二区三区| 成人av资源网站| 亚洲日本青草视频在线怡红院| 99精品黄色片免费大全| 亚洲综合在线五月| 7777女厕盗摄久久久| 美女www一区二区| 久久久777精品电影网影网| 成人在线综合网| 一区二区不卡在线视频 午夜欧美不卡在| 色av综合在线| 另类的小说在线视频另类成人小视频在线 | 97se亚洲国产综合自在线观| 亚洲欧美日韩一区二区|