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

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

?? cfi_cmdset_0001.c

?? MIZI Research, Inc.發布的vivi
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * vivi/drivers/mtd/cfi-intelext.c: Intel Extended Vendor Command Set * * Based on linux/drivers/mtd/chips/cfi_cmdset_0001.c * * $Id: cfi_cmdset_0001.c,v 1.6 2002/10/10 11:52:26 nandy Exp $ * * History * * 2002-01-16: Nandy Lyu <nandy@mizi.com> *    - Initial code * */#include "config.h"#include "mtd/mtd.h"#include "mtd/cfi.h"#include "heap.h"#include "printk.h"#ifdef CONFIG_MSG_PROGRESS#include "vivi_lib.h"#endif#include <types.h>#include <errno.h>static int cfi_intelext_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);static int cfi_intelext_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);static int cfi_intelext_erase_varsize(struct mtd_info *, struct erase_info *);static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, size_t len);static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, size_t len);struct mtd_info *cfi_cmdset_0001(struct map_info *, int);static struct mtd_info *cfi_intelext_setup (struct map_info *);#ifdef CONFIG_DEBUG_CFIstatic void cfi_tell_features(struct cfi_pri_intelext *extp){        int i;        printk("  Feature/Command Support: %4.4X\n", extp->FeatureSupport);        printk("     - Chip Erase:         %s\n", extp->FeatureSupport&1?"supported":"unsupported");        printk("     - Suspend Erase:      %s\n", extp->FeatureSupport&2?"supported":"unsupported");        printk("     - Suspend Program:    %s\n", extp->FeatureSupport&4?"supported":"unsupported");        printk("     - Legacy Lock/Unlock: %s\n", extp->FeatureSupport&8?"supported":"unsupported");        printk("     - Queued Erase:       %s\n", extp->FeatureSupport&16?"supported":"unsupported");        printk("     - Instant block lock: %s\n", extp->FeatureSupport&32?"supported":"unsupported");        printk("     - Protection Bits:    %s\n", extp->FeatureSupport&64?"supported":"unsupported");        printk("     - Page-mode read:     %s\n", extp->FeatureSupport&128?"supported":"unsupported");        printk("     - Synchronous read:   %s\n", extp->FeatureSupport&256?"supported":"unsupported");        for (i=9; i<32; i++) {                if (extp->FeatureSupport & (1<<i))                        printk("     - Unknown Bit %X:      supported\n", i);        }        printk("  Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);        printk("     - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");        for (i=1; i<8; i++) {                if (extp->SuspendCmdSupport & (1<<i))                        printk("     - Unknown Bit %X:               supported\n", i);        }        printk("  Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);        printk("     - Lock Bit Active:      %s\n", extp->BlkStatusRegMask&1?"yes":"no");        printk("     - Valid Bit Active:     %s\n", extp->BlkStatusRegMask&2?"yes":"no");        for (i=2; i<16; i++) {                if (extp->BlkStatusRegMask & (1<<i))                        printk("     - Unknown Bit %X Active: yes\n",i);        }        printk("  Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",               extp->VccOptimal >> 8, extp->VccOptimal & 0xf);        if (extp->VppOptimal)                printk("  Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",                       extp->VppOptimal >> 8, extp->VppOptimal & 0xf);}#endif/* This routine is made available to other mtd code via * inter_module_register.  It must only be accessed through * inter_module_get which will bump the use count of this module.  The * addresses passed back in cfi are valid as long as the use count of * this module is non-zero, i.e. between inter_module_get and * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000. */struct mtd_info *cfi_cmdset_0001(struct map_info *map, int primary){        struct cfi_private *cfi = map->fldrv_priv;        int i;        __u32 base = cfi->chips[0].start;        if (cfi->cfi_mode == CFI_MODE_CFI) {                /*                  * It's a real CFI chip, not one for which the probe                 * routine faked a CFI structure. So we read the feature                 * table from it.                 */                __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;                struct cfi_pri_intelext *extp;                int ofs_factor = cfi->interleave * cfi->device_type;                //printk(" Intel/Sharp Extended Query Table at 0x%4.4X\n", adr);                if (!adr)                        return NULL;                /* Switch it into Query Mode */                cfi_send_gen_cmd(0x98, 0x55, base, map, cfi, cfi->device_type, NULL);                extp = mmalloc(sizeof(*extp));                if (!extp) {                        printk("Failed to allocate memory\n");                        return NULL;                }                         /* Read in the Extended Query Table */                for (i=0; i<sizeof(*extp); i++) {                        ((unsigned char *)extp)[i] =                                 cfi_read_query(map, (base+((adr+i)*ofs_factor)));                }                         if (extp->MajorVersion != '1' ||                      (extp->MinorVersion < '0' || extp->MinorVersion > '2')) {                         printk("  Unknown IntelExt Extended Query "                               "version %c.%c.\n",  extp->MajorVersion,                               extp->MinorVersion);                        mfree(extp);                        return NULL;                }                         /* Do some byteswapping if necessary */                extp->FeatureSupport = extp->FeatureSupport;                extp->BlkStatusRegMask = extp->BlkStatusRegMask;                extp->ProtRegAddr = extp->ProtRegAddr;         #ifdef CONFIG_DEBUG_CFI                /* Tell the user about it in lots of lovely detail */                cfi_tell_features(extp);#endif                /* Install our own private info structure */                cfi->cmdset_priv = extp;        }        for (i=0; i< cfi->numchips; i++) {                cfi->chips[i].word_write_time = 128;                cfi->chips[i].buffer_write_time = 128;                cfi->chips[i].erase_time = 1024;        }        /* Make sure it's in read mode */        cfi_send_gen_cmd(0xff, 0x55, base, map, cfi, cfi->device_type, NULL);        return cfi_intelext_setup(map);}static struct mtd_info *cfi_intelext_setup(struct map_info *map){	struct cfi_private *cfi = map->fldrv_priv;	struct mtd_info *mtd;	unsigned long offset = 0;	int i, j;	unsigned long devsize = (1 << cfi->cfiq->DevSize) * cfi->interleave;	mtd = mmalloc(sizeof(*mtd));	if (!mtd) {		printk("Failed to allocate memory for MTD device\n");		mfree(cfi->cmdset_priv);		return NULL;	}	memset(mtd, 0, sizeof(*mtd));	mtd->priv = map;	mtd->type = MTD_NORFLASH;	mtd->size = devsize * cfi->numchips;		mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;	mtd->eraseregions = mmalloc(sizeof(struct mtd_erase_region_info) 				    * mtd->numeraseregions);	if (!mtd->eraseregions) { 		printk("Failed to allocate memory for MTD erase region info\n");		mfree(cfi->cmdset_priv);		return NULL;	}	for (i = 0; i < cfi->cfiq->NumEraseRegions; i++) {		unsigned long ernum, ersize;		ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;		ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;		if (mtd->erasesize < ersize) {			mtd->erasesize = ersize;		}		for (j = 0; j < cfi->numchips; j++) {			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;		}		offset += (ersize * ernum);	}	if (offset != devsize) {		/* Argh */		printk("Sum of region (%lx) != total size of set of interleave chips (%lx)\n", offset, devsize);		mfree(mtd->eraseregions);		mfree(cfi->cmdset_priv);		return NULL;	}	for (i = 0; i < mtd->numeraseregions; i++) {		printk("%d: offset = 0x%x, size = 0x%x, blocks = %d\n", 			i, mtd->eraseregions[i].offset,			mtd->eraseregions[i].erasesize,			mtd->eraseregions[i].numblocks);	}	/* Also select the correct geometry setup too */	mtd->erase = cfi_intelext_erase_varsize;#ifndef FORCE_WORD_WRTE	if (cfi->cfiq->BufWriteTimeoutTyp) {		printk("Using buffer write method\n");		mtd->write = cfi_intelext_write_buffers;	} else {#else	}#endif		printk("Using word write method\n");		mtd->write = cfi_intelext_write_words;	}	mtd->lock = cfi_intelext_lock;	mtd->unlock = cfi_intelext_unlock;	mtd->flags = MTD_CAP_NORFLASH;	mtd->name = map->name;	return mtd;}int do_write_oneword(struct map_info *map, struct flchip *chip,                      unsigned long adr, cfi_word datum){	struct cfi_private *cfi = map->fldrv_priv;	cfi_word status = 0, status_OK;	unsigned long timeo;	adr += chip->start;	/* Let's determine this according to the interleave only once */	status_OK = CMD(0x80);	/* 弊成 葷儈 沁瀾 - 2002-06-25 nandy */	timeo = cfi->cfiq->WordWriteTimeoutMax * 1000;	ENABLE_VPP(map);	cfi_write(map, CMD(0x40), adr);	cfi_write(map, datum, adr);	/* wait for it to be programmed */	while (timeo > 0) {		status = cfi_read(map, adr);		if ((status & status_OK) == status_OK)			break;		timeo--;	}	/* done */	DISABLE_VPP(map);	/* clear status */	cfi_write(map, CMD(0x50), adr);	/* report errors */	if (timeo <= 0) {		printk("\nFailed do_write_oneword() operation\n");		printk("  Offset = 0x%08lx, datum = 0x%08lx, status = 0x%08lx\n",			adr, datum, status);		cfi_write(map, CMD(0xff), adr);		return -EIO;	}	cfi_write(map, CMD(0xff), adr);	return 0;}static int cfi_intelext_write_words(struct mtd_info *mtd,  loff_t to, size_t len, size_t *retlen, const u_char *buf){	struct map_info *map = mtd->priv;	struct cfi_private *cfi = map->fldrv_priv;	int ret = 0;	int chipnum;	unsigned long ofs;		*retlen = 0;	if (!len)		return 0;	chipnum = to >> cfi->chipshift;	ofs = to - (chipnum << cfi->chipshift);	/* It it's not bus-aligned, do the first byte write */	if (ofs & (CFIDEV_BUSWIDTH-1)) {		unsigned long bus_ofs = ofs & ~(CFIDEV_BUSWIDTH-1);		int gap = ofs - bus_ofs;		int i = 0, n = 0;		u_char tmp_buf[8];		cfi_word datum;		while (gap--)			tmp_buf[i++] = 0xff;		while (len && i < CFIDEV_BUSWIDTH)			tmp_buf[i++] = buf[n++], len--;		while (i < CFIDEV_BUSWIDTH)			tmp_buf[i++] = 0xff;		if (cfi_buswidth_is_2()) {			datum = *(__u16*)tmp_buf;		} else if (cfi_buswidth_is_4()) {			datum = *(__u32*)tmp_buf;		} else if (cfi_buswidth_is_8()) {			datum = *(__u64*)tmp_buf;		} else {			return -EINVAL;	/* should never happen, but be safe */		}		ret = do_write_oneword(map, &cfi->chips[chipnum], bus_ofs, datum);		if (ret) return ret;		ofs += n;		buf += n;		(*retlen) += n;		if (ofs >> cfi->chipshift) {			chipnum++;			ofs = 0;			if (chipnum == cfi->numchips) 				return 0;		}	}	while (len >= CFIDEV_BUSWIDTH) {		cfi_word datum;		if (cfi_buswidth_is_1()) {			datum = *(__u8*)buf;		} else if (cfi_buswidth_is_2()) {			datum = *(__u16*)buf;		} else if (cfi_buswidth_is_4()) {			datum = *(__u32*)buf;		} else if (cfi_buswidth_is_8()) {			datum = *(__u64*)buf;		} else {			return -EINVAL;		}		ret = do_write_oneword(map, &cfi->chips[chipnum], ofs, datum);		if (ret) return ret;		ofs += CFIDEV_BUSWIDTH;		buf += CFIDEV_BUSWIDTH;		(*retlen) += CFIDEV_BUSWIDTH;		len -= CFIDEV_BUSWIDTH;		if (ofs >> cfi->chipshift) {			chipnum++;			ofs = 0;			if (chipnum == cfi->numchips)				return 0;		}	}	if (len & (CFIDEV_BUSWIDTH-1)) {		int i = 0, n = 0;		u_char tmp_buf[8];		cfi_word datum;		while (len--)			tmp_buf[i++] = buf[n++];		while (i < CFIDEV_BUSWIDTH)			tmp_buf[i++] = 0xff;		if (cfi_buswidth_is_2()) {			datum = *(__u16*)tmp_buf;		} else if (cfi_buswidth_is_4()) {			datum = *(__u32*)tmp_buf;		} else if (cfi_buswidth_is_8()) {			datum = *(__u64*)tmp_buf;		} else {			return -EINVAL;	/* should never happen, but be safe */		}		ret = do_write_oneword(map, &cfi->chips[chipnum], ofs, datum);		if (ret)			return ret;		(*retlen) += n;	}	return 0;}static int do_write_buffer(struct map_info *map, struct flchip *chip,                           unsigned long adr, const u_char *buf, int len){	struct cfi_private *cfi = map->fldrv_priv;	cfi_word status, status_OK;	unsigned long cmd_adr, timeo;	int wbufsize, z;	wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize;	adr += chip->start;	cmd_adr = adr & ~(wbufsize - 1);	/* Let's determinc this according to the interleave only once */	status_OK = CMD(0x80);	timeo = cfi->cfiq->BufWriteTimeoutMax * 1000;	ENABLE_VPP(map);	cfi_write(map, CMD(0xe8), cmd_adr);	for (;;) {		status = cfi_read(map, cmd_adr);		if ((status & status_OK) == status_OK)			break;		if (timeo < 0) {			/* Argh. Not ready for write to buffer */			cfi_write(map, CMD(0x70), cmd_adr);			DISABLE_VPP(map);			printk("Chip not ready for buffer write. Xstatus = 0x%llx, status = %llx\n", (__u64)status, (__u64)cfi_read(map, cmd_adr));			/* Odd. Clear status bits */			cfi_write(map, CMD(0x50), cmd_adr);			cfi_write(map, CMD(0x70), cmd_adr);			cfi_write(map, CMD(0xff), adr);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产中文字幕一区| 亚洲午夜免费电影| 日韩欧美久久久| 欧美三级视频在线| 欧美亚洲愉拍一区二区| 欧美日韩一区二区三区视频| 在线免费精品视频| 欧美日本一区二区| 欧美少妇bbb| 91精品婷婷国产综合久久竹菊| 91 com成人网| 久久女同精品一区二区| 国产无一区二区| 日韩美女视频一区二区 | 国产丝袜欧美中文另类| 日韩欧美区一区二| 国产精品色婷婷久久58| 国产综合色产在线精品| 99久久精品一区二区| 亚洲一区二区三区四区五区中文| 最近日韩中文字幕| 亚洲欧美一区二区三区国产精品 | 精品国产一区二区精华| 久久精品一区二区| 亚洲综合色噜噜狠狠| 男男视频亚洲欧美| 国产91高潮流白浆在线麻豆| 色哟哟国产精品免费观看| 69堂国产成人免费视频| 久久综合久色欧美综合狠狠| 亚洲欧美国产77777| 北条麻妃国产九九精品视频| 国产精品第五页| 亚洲午夜精品网| 狠狠色狠狠色合久久伊人| 日韩午夜精品电影| 欧美在线视频你懂得| 精品sm在线观看| 伊人夜夜躁av伊人久久| 老司机一区二区| 色网站国产精品| 精品1区2区在线观看| 亚洲一区视频在线观看视频| 精品一区二区三区在线视频| 色综合久久综合| 欧美精品一区二区三区蜜桃| 一区二区三区波多野结衣在线观看| 奇米色777欧美一区二区| 成人久久久精品乱码一区二区三区| 欧美精品在线一区二区| 成人欧美一区二区三区小说| 激情小说亚洲一区| 7777精品伊人久久久大香线蕉 | 成人美女视频在线看| 91精品国产综合久久久久久| 成人欧美一区二区三区黑人麻豆| 美女一区二区久久| 精品视频资源站| 中文字幕在线视频一区| 激情都市一区二区| 日韩欧美激情四射| 欧美aaa在线| 5858s免费视频成人| 亚洲国产综合人成综合网站| 91美女片黄在线| 国产精品少妇自拍| 国产精一品亚洲二区在线视频| 欧美日韩高清不卡| 国内精品免费**视频| 中文字幕av资源一区| 亚洲成av人片观看| 91久久精品一区二区| 综合欧美一区二区三区| 国产成人av电影免费在线观看| 亚洲精品在线电影| 九九九精品视频| 久久先锋资源网| 国产乱对白刺激视频不卡| 久久综合国产精品| 国产美女久久久久| 欧美国产精品专区| 99久久99久久精品免费观看| 国产精品高潮呻吟| 99热在这里有精品免费| 亚洲精品自拍动漫在线| 欧美自拍偷拍午夜视频| 午夜精品爽啪视频| 日韩午夜电影av| 国产一区999| 亚洲日本青草视频在线怡红院| 国产女同性恋一区二区| 99久久99久久精品国产片果冻| 免费久久99精品国产| 一区二区三区四区亚洲| 在线免费观看日韩欧美| 水蜜桃久久夜色精品一区的特点| 欧美伦理视频网站| 日本 国产 欧美色综合| 久久久精品免费网站| 成人免费观看男女羞羞视频| 亚洲综合在线免费观看| 9191精品国产综合久久久久久| 精彩视频一区二区| 中文字幕日韩精品一区| 欧美美女激情18p| 国产福利91精品一区| 一区二区三区四区在线免费观看| 欧美一区二区三区电影| 欧美一级视频精品观看| 亚洲人吸女人奶水| 91精品欧美久久久久久动漫| 久久综合成人精品亚洲另类欧美| 亚洲免费观看高清| 日韩欧美电影一区| 91免费看片在线观看| 麻豆精品视频在线| 亚洲色欲色欲www| 精品入口麻豆88视频| 色婷婷精品大在线视频| 国精产品一区一区三区mba视频 | 国产婷婷一区二区| 欧美三级中文字幕| 成人精品视频.| 九九热在线视频观看这里只有精品| 亚洲欧美另类久久久精品2019| 精品毛片乱码1区2区3区| 欧美视频在线一区二区三区| 国内精品国产成人国产三级粉色| 亚洲国产精品久久一线不卡| 国产欧美精品一区二区三区四区| 91精品久久久久久久91蜜桃| 色婷婷亚洲一区二区三区| 国产伦精品一区二区三区免费 | 欧美一区二区三区婷婷月色| 成人禁用看黄a在线| 国产又粗又猛又爽又黄91精品| 亚洲主播在线观看| 综合亚洲深深色噜噜狠狠网站| 精品国免费一区二区三区| 欧美老肥妇做.爰bbww| 日本伦理一区二区| 91香蕉视频污在线| av网站一区二区三区| 成人午夜av影视| 国产mv日韩mv欧美| 国产九色sp调教91| 国产综合色产在线精品| 精品一区二区三区在线观看国产| 美女网站色91| 免费久久精品视频| 久国产精品韩国三级视频| 麻豆免费看一区二区三区| 日韩高清不卡一区二区三区| 亚洲另类色综合网站| 亚洲欧美视频在线观看| 中文字幕字幕中文在线中不卡视频| 国产精品乱码妇女bbbb| 中文字幕欧美区| 成人免费在线观看入口| 亚洲欧洲无码一区二区三区| 中文字幕一区二区三区不卡| 中文字幕一区不卡| 亚洲美女一区二区三区| 亚洲一区精品在线| 蜜臀va亚洲va欧美va天堂| 精品一区二区综合| 成人亚洲精品久久久久软件| 91在线视频18| 欧美日韩卡一卡二| 欧美sm美女调教| 欧美国产日韩a欧美在线观看| 亚洲日本va午夜在线影院| 亚洲制服欧美中文字幕中文字幕| 性做久久久久久免费观看| 久久成人综合网| 成人午夜av电影| 欧美亚洲一区二区在线| 日韩亚洲欧美在线| 亚洲国产精品传媒在线观看| 1区2区3区国产精品| 亚洲成va人在线观看| 狠狠网亚洲精品| 91片在线免费观看| 日韩视频在线一区二区| 国产精品国产三级国产aⅴ无密码| 夜夜精品浪潮av一区二区三区| 美女一区二区视频| 99精品视频一区二区三区| 91麻豆精品国产自产在线观看一区| 欧美成人午夜电影| 亚洲免费观看在线观看| 麻豆免费看一区二区三区| 一本到不卡免费一区二区| 精品国产自在久精品国产| 亚洲丝袜制服诱惑| 国产一区久久久| 欧美精品vⅰdeose4hd| ●精品国产综合乱码久久久久| 免费久久99精品国产| 欧美性生活一区|