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

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

?? cfi_cmdset_0002.c

?? 根據(jù)fs2410移植過后的mtd驅(qū)動源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * Common Flash Interface support: *   AMD & Fujitsu Standard Vendor Command Set (ID 0x0002) * * Copyright (C) 2000 Crossnet Co. <info@crossnet.co.jp> * Copyright (C) 2004 Arcom Control Systems Ltd <linux@arcom.com> * Copyright (C) 2005 MontaVista Software Inc. <source@mvista.com> * * 2_by_8 routines added by Simon Munton * * 4_by_16 work by Carolyn J. Smith * * XIP support hooks by Vitaly Wool (based on code for Intel flash * by Nicolas Pitre) * * Occasionally maintained by Thayne Harbaugh tharbaugh at lnxi dot com * * This code is GPL * * $Id: cfi_cmdset_0002.c,v 1.122 2005/11/07 11:14:22 gleixner Exp $ * */#include <linux/config.h>#include <linux/module.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/init.h>#include <asm/io.h>#include <asm/byteorder.h>#include <linux/errno.h>#include <linux/slab.h>#include <linux/delay.h>#include <linux/interrupt.h>#include <linux/mtd/compatmac.h>#include <linux/mtd/map.h>#include <linux/mtd/mtd.h>#include <linux/mtd/cfi.h>#include <linux/mtd/xip.h>#define AMD_BOOTLOC_BUG#define FORCE_WORD_WRITE 0#define MAX_WORD_RETRIES 3#define MANUFACTURER_AMD	0x0001#define MANUFACTURER_SST	0x00BF#define SST49LF004B	        0x0060#define SST49LF008A		0x005astatic int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);static int cfi_amdstd_erase_chip(struct mtd_info *, struct erase_info *);static int cfi_amdstd_erase_varsize(struct mtd_info *, struct erase_info *);static void cfi_amdstd_sync (struct mtd_info *);static int cfi_amdstd_suspend (struct mtd_info *);static void cfi_amdstd_resume (struct mtd_info *);static int cfi_amdstd_secsi_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);static void cfi_amdstd_destroy(struct mtd_info *);struct mtd_info *cfi_cmdset_0002(struct map_info *, int);static struct mtd_info *cfi_amdstd_setup (struct mtd_info *);static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode);static void put_chip(struct map_info *map, struct flchip *chip, unsigned long adr);#include "fwh_lock.h"static struct mtd_chip_driver cfi_amdstd_chipdrv = {	.probe		= NULL, /* Not usable directly */	.destroy	= cfi_amdstd_destroy,	.name		= "cfi_cmdset_0002",	.module		= THIS_MODULE};/* #define DEBUG_CFI_FEATURES */#ifdef DEBUG_CFI_FEATURESstatic void cfi_tell_features(struct cfi_pri_amdstd *extp){	const char* erase_suspend[3] = {		"Not supported", "Read only", "Read/write"	};	const char* top_bottom[6] = {		"No WP", "8x8KiB sectors at top & bottom, no WP",		"Bottom boot", "Top boot",		"Uniform, Bottom WP", "Uniform, Top WP"	};	printk("  Silicon revision: %d\n", extp->SiliconRevision >> 1);	printk("  Address sensitive unlock: %s\n",	       (extp->SiliconRevision & 1) ? "Not required" : "Required");	if (extp->EraseSuspend < ARRAY_SIZE(erase_suspend))		printk("  Erase Suspend: %s\n", erase_suspend[extp->EraseSuspend]);	else		printk("  Erase Suspend: Unknown value %d\n", extp->EraseSuspend);	if (extp->BlkProt == 0)		printk("  Block protection: Not supported\n");	else		printk("  Block protection: %d sectors per group\n", extp->BlkProt);	printk("  Temporary block unprotect: %s\n",	       extp->TmpBlkUnprotect ? "Supported" : "Not supported");	printk("  Block protect/unprotect scheme: %d\n", extp->BlkProtUnprot);	printk("  Number of simultaneous operations: %d\n", extp->SimultaneousOps);	printk("  Burst mode: %s\n",	       extp->BurstMode ? "Supported" : "Not supported");	if (extp->PageMode == 0)		printk("  Page mode: Not supported\n");	else		printk("  Page mode: %d word page\n", extp->PageMode << 2);	printk("  Vpp Supply Minimum Program/Erase Voltage: %d.%d V\n",	       extp->VppMin >> 4, extp->VppMin & 0xf);	printk("  Vpp Supply Maximum Program/Erase Voltage: %d.%d V\n",	       extp->VppMax >> 4, extp->VppMax & 0xf);	if (extp->TopBottom < ARRAY_SIZE(top_bottom))		printk("  Top/Bottom Boot Block: %s\n", top_bottom[extp->TopBottom]);	else		printk("  Top/Bottom Boot Block: Unknown value %d\n", extp->TopBottom);}#endif#ifdef AMD_BOOTLOC_BUG/* Wheee. Bring me the head of someone at AMD. */static void fixup_amd_bootblock(struct mtd_info *mtd, void* param){	struct map_info *map = mtd->priv;	struct cfi_private *cfi = map->fldrv_priv;	struct cfi_pri_amdstd *extp = cfi->cmdset_priv;	__u8 major = extp->MajorVersion;	__u8 minor = extp->MinorVersion;	if (((major << 8) | minor) < 0x3131) {		/* CFI version 1.0 => don't trust bootloc */		if (cfi->id & 0x80) {			printk(KERN_WARNING "%s: JEDEC Device ID is 0x%02X. Assuming broken CFI table.\n", map->name, cfi->id);			extp->TopBottom = 3;	/* top boot */		} else {			extp->TopBottom = 2;	/* bottom boot */		}	}}#endifstatic void fixup_use_write_buffers(struct mtd_info *mtd, void *param){	struct map_info *map = mtd->priv;	struct cfi_private *cfi = map->fldrv_priv;	if (cfi->cfiq->BufWriteTimeoutTyp) {		DEBUG(MTD_DEBUG_LEVEL1, "Using buffer write method\n" );		mtd->write = cfi_amdstd_write_buffers;	}}static void fixup_use_secsi(struct mtd_info *mtd, void *param){	/* Setup for chips with a secsi area */	mtd->read_user_prot_reg = cfi_amdstd_secsi_read;	mtd->read_fact_prot_reg = cfi_amdstd_secsi_read;}static void fixup_use_erase_chip(struct mtd_info *mtd, void *param){	struct map_info *map = mtd->priv;	struct cfi_private *cfi = map->fldrv_priv;	if ((cfi->cfiq->NumEraseRegions == 1) &&		((cfi->cfiq->EraseRegionInfo[0] & 0xffff) == 0)) {		mtd->erase = cfi_amdstd_erase_chip;	}}static struct cfi_fixup cfi_fixup_table[] = {#ifdef AMD_BOOTLOC_BUG	{ CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },#endif	{ CFI_MFR_AMD, 0x0050, fixup_use_secsi, NULL, },	{ CFI_MFR_AMD, 0x0053, fixup_use_secsi, NULL, },	{ CFI_MFR_AMD, 0x0055, fixup_use_secsi, NULL, },	{ CFI_MFR_AMD, 0x0056, fixup_use_secsi, NULL, },	{ CFI_MFR_AMD, 0x005C, fixup_use_secsi, NULL, },	{ CFI_MFR_AMD, 0x005F, fixup_use_secsi, NULL, },#if !FORCE_WORD_WRITE	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },#endif	{ 0, 0, NULL, NULL }};static struct cfi_fixup jedec_fixup_table[] = {	{ MANUFACTURER_SST, SST49LF004B, fixup_use_fwh_lock, NULL, },	{ MANUFACTURER_SST, SST49LF008A, fixup_use_fwh_lock, NULL, },	{ 0, 0, NULL, NULL }};static struct cfi_fixup fixup_table[] = {	/* The CFI vendor ids and the JEDEC vendor IDs appear	 * to be common.  It is like the devices id's are as	 * well.  This table is to pick all cases where	 * we know that is the case.	 */	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_erase_chip, NULL },	{ 0, 0, NULL, NULL }};struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary){	struct cfi_private *cfi = map->fldrv_priv;	struct mtd_info *mtd;	int i;	mtd = kmalloc(sizeof(*mtd), GFP_KERNEL);	if (!mtd) {		printk(KERN_WARNING "Failed to allocate memory for MTD device\n");		return NULL;	}	memset(mtd, 0, sizeof(*mtd));	mtd->priv = map;	mtd->type = MTD_NORFLASH;	/* Fill in the default mtd operations */	mtd->erase   = cfi_amdstd_erase_varsize;	mtd->write   = cfi_amdstd_write_words;	mtd->read    = cfi_amdstd_read;	mtd->sync    = cfi_amdstd_sync;	mtd->suspend = cfi_amdstd_suspend;	mtd->resume  = cfi_amdstd_resume;	mtd->flags   = MTD_CAP_NORFLASH;	mtd->name    = map->name;	if (cfi->cfi_mode==CFI_MODE_CFI){		unsigned char bootloc;		/*		 * 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_amdstd *extp;		extp = (struct cfi_pri_amdstd*)cfi_read_pri(map, adr, sizeof(*extp), "Amd/Fujitsu");		if (!extp) {			kfree(mtd);			return NULL;		}		if (extp->MajorVersion != '1' ||		    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {			printk(KERN_ERR "  Unknown Amd/Fujitsu Extended Query "			       "version %c.%c.\n",  extp->MajorVersion,			       extp->MinorVersion);			kfree(extp);			kfree(mtd);			return NULL;		}		/* Install our own private info structure */		cfi->cmdset_priv = extp;		/* Apply cfi device specific fixups */		cfi_fixup(mtd, cfi_fixup_table);#ifdef DEBUG_CFI_FEATURES		/* Tell the user about it in lots of lovely detail */		cfi_tell_features(extp);#endif		bootloc = extp->TopBottom;		if ((bootloc != 2) && (bootloc != 3)) {			printk(KERN_WARNING "%s: CFI does not contain boot "			       "bank location. Assuming top.\n", map->name);			bootloc = 2;		}		if (bootloc == 3 && cfi->cfiq->NumEraseRegions > 1) {			printk(KERN_WARNING "%s: Swapping erase regions for broken CFI table.\n", map->name);			for (i=0; i<cfi->cfiq->NumEraseRegions / 2; i++) {				int j = (cfi->cfiq->NumEraseRegions-1)-i;				__u32 swap;				swap = cfi->cfiq->EraseRegionInfo[i];				cfi->cfiq->EraseRegionInfo[i] = cfi->cfiq->EraseRegionInfo[j];				cfi->cfiq->EraseRegionInfo[j] = swap;			}		}		/* Set the default CFI lock/unlock addresses */		cfi->addr_unlock1 = 0x555;		cfi->addr_unlock2 = 0x2aa;		/* Modify the unlock address if we are in compatibility mode */		if (	/* x16 in x8 mode */			((cfi->device_type == CFI_DEVICETYPE_X8) &&				(cfi->cfiq->InterfaceDesc == 2)) ||			/* x32 in x16 mode */			((cfi->device_type == CFI_DEVICETYPE_X16) &&				(cfi->cfiq->InterfaceDesc == 4)))		{			cfi->addr_unlock1 = 0xaaa;			cfi->addr_unlock2 = 0x555;		}	} /* CFI mode */	else if (cfi->cfi_mode == CFI_MODE_JEDEC) {		/* Apply jedec specific fixups */		cfi_fixup(mtd, jedec_fixup_table);	}	/* Apply generic fixups */	cfi_fixup(mtd, fixup_table);	for (i=0; i< cfi->numchips; i++) {		cfi->chips[i].word_write_time = 1<<cfi->cfiq->WordWriteTimeoutTyp;		cfi->chips[i].buffer_write_time = 1<<cfi->cfiq->BufWriteTimeoutTyp;		cfi->chips[i].erase_time = 1<<cfi->cfiq->BlockEraseTimeoutTyp;	}	map->fldrv = &cfi_amdstd_chipdrv;	return cfi_amdstd_setup(mtd);}static struct mtd_info *cfi_amdstd_setup(struct mtd_info *mtd){	struct map_info *map = mtd->priv;	struct cfi_private *cfi = map->fldrv_priv;	unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;	unsigned long offset = 0;	int i,j;	printk(KERN_NOTICE "number of %s chips: %d\n",	       (cfi->cfi_mode == CFI_MODE_CFI)?"CFI":"JEDEC",cfi->numchips);	/* Select the correct geometry setup */	mtd->size = devsize * cfi->numchips;	mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;	mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info)				    * mtd->numeraseregions, GFP_KERNEL);	if (!mtd->eraseregions) {		printk(KERN_WARNING "Failed to allocate memory for MTD erase region info\n");		goto setup_err;	}	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(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);		goto setup_err;	}#if 0	// debug	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);	}#endif	/* FIXME: erase-suspend-program is broken.  See	   http://lists.infradead.org/pipermail/linux-mtd/2003-December/009001.html */	printk(KERN_NOTICE "cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness.\n");	__module_get(THIS_MODULE);	return mtd; setup_err:	if(mtd) {		kfree(mtd->eraseregions);		kfree(mtd);	}	kfree(cfi->cmdset_priv);	kfree(cfi->cfiq);	return NULL;}/* * Return true if the chip is ready. * * Ready is one of: read mode, query mode, erase-suspend-read mode (in any * non-suspended sector) and is indicated by no toggle bits toggling. * * Note that anything more complicated than checking if no bits are toggling * (including checking DQ5 for an error status) is tricky to get working * correctly and is therefore not done	(particulary with interleaved chips * as each chip must be checked independantly of the others). */static int __xipram chip_ready(struct map_info *map, unsigned long addr){	map_word d, t;	d = map_read(map, addr);	t = map_read(map, addr);	return map_word_equal(map, d, t);}/* * Return true if the chip is ready and has the correct value. * * Ready is one of: read mode, query mode, erase-suspend-read mode (in any * non-suspended sector) and it is indicated by no bits toggling. * * Error are indicated by toggling bits or bits held with the wrong value, * or with bits toggling. * * Note that anything more complicated than checking if no bits are toggling * (including checking DQ5 for an error status) is tricky to get working * correctly and is therefore not done	(particulary with interleaved chips * as each chip must be checked independantly of the others). * */static int __xipram chip_good(struct map_info *map, unsigned long addr, map_word expected){	map_word oldd, curd;	oldd = map_read(map, addr);	curd = map_read(map, addr);	return	map_word_equal(map, oldd, curd) &&		map_word_equal(map, curd, expected);}static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕中文字幕一区二区| 成人av网址在线| 欧美三级日韩在线| 亚洲免费视频成人| 在线观看一区日韩| 亚洲丝袜制服诱惑| 色噜噜狠狠色综合欧洲selulu| 欧美激情在线一区二区| 国产99久久久国产精品潘金网站| 日韩欧美一区二区三区在线| 美日韩黄色大片| 久久久亚洲精品石原莉奈 | 亚洲在线观看免费视频| 欧美日韩国产首页在线观看| 午夜精品久久久久| 26uuu亚洲综合色| 91免费看视频| 五月天国产精品| 欧美国产日韩一二三区| 色综合婷婷久久| 久久精品国内一区二区三区| 久久久亚洲精品石原莉奈| 不卡视频在线观看| 婷婷夜色潮精品综合在线| 久久综合九色综合欧美98| 99久久777色| 国产在线不卡一区| 亚洲男同性视频| www久久精品| 欧美放荡的少妇| av色综合久久天堂av综合| 日本一道高清亚洲日美韩| 国产精品不卡在线| 久久久亚洲精品石原莉奈| 欧美日韩在线三级| 成人福利视频网站| 国产精品亚洲午夜一区二区三区 | 国产一区高清在线| 五月婷婷激情综合网| 亚洲六月丁香色婷婷综合久久 | 日本一区二区三区高清不卡| 国产激情视频一区二区在线观看 | 粉嫩av一区二区三区在线播放 | 美女爽到高潮91| 亚洲综合色网站| 中文字幕在线一区| 国产午夜精品一区二区三区嫩草| 91精品国产欧美日韩| 91高清视频在线| 欧美综合一区二区三区| 99re热视频精品| 91成人网在线| 欧美日韩亚洲综合在线| 欧美日韩免费在线视频| 777欧美精品| 91精品国产乱| 久久久久久一二三区| 欧美大片日本大片免费观看| 欧美一级精品在线| 欧美一区二区三区免费在线看 | 成人国产精品免费观看动漫| 高清视频一区二区| 欧美在线免费播放| 91精品欧美福利在线观看| 精品福利二区三区| 亚洲国产精品av| 午夜视频在线观看一区二区三区| 日本亚洲天堂网| 国产成人综合自拍| 欧美喷水一区二区| 欧美激情艳妇裸体舞| 三级欧美在线一区| 不卡的av在线播放| 日韩午夜电影av| 亚洲精品乱码久久久久久| 精品中文av资源站在线观看| 91原创在线视频| 久久亚洲一区二区三区四区| 一区二区三区国产精华| 国产九色sp调教91| 欧美一级片免费看| 亚洲少妇中出一区| 国产福利一区在线| 欧美乱熟臀69xxxxxx| 亚洲女性喷水在线观看一区| 韩国成人福利片在线播放| 欧美三级三级三级| 国产精品久久久久精k8| 一本色道久久综合亚洲aⅴ蜜桃| 久久99国产精品麻豆| 久久99精品久久久久久国产越南 | 亚洲素人一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美系列亚洲系列| 国产精品丝袜久久久久久app| 麻豆91精品视频| 欧美精品丝袜中出| 亚洲欧美偷拍另类a∨色屁股| 成人午夜av在线| 国产欧美一区二区精品性| voyeur盗摄精品| 日韩精品一区二区三区swag | 综合精品久久久| 91在线观看一区二区| 亚洲欧洲性图库| 91麻豆自制传媒国产之光| 亚洲嫩草精品久久| 欧美片在线播放| 精品在线一区二区三区| 久久久久久毛片| 成人免费视频视频在线观看免费| 精品国产乱码久久久久久1区2区| 韩国成人精品a∨在线观看| 亚洲国产成人在线| 在线观看视频91| 久久国产人妖系列| 久久久久久毛片| 一本一道波多野结衣一区二区| 亚洲香蕉伊在人在线观| 亚洲精品一区二区精华| a4yy欧美一区二区三区| 日韩av中文在线观看| 久久久久久久久岛国免费| 91麻豆高清视频| 国产一区 二区| 午夜不卡av免费| 国产精品传媒在线| 精品国产髙清在线看国产毛片| av亚洲精华国产精华| 韩国女主播成人在线观看| 亚洲制服丝袜av| **网站欧美大片在线观看| 久久综合久久鬼色| 在线观看av一区| 99久久精品一区二区| 久久国产免费看| 亚洲成a人片在线观看中文| 国产精品视频yy9299一区| 久久久一区二区三区捆绑**| 欧美一级在线观看| 日韩视频不卡中文| 欧美精品视频www在线观看| 91黄色激情网站| 91国模大尺度私拍在线视频| 成人白浆超碰人人人人| 粉嫩av一区二区三区粉嫩| 国产成a人无v码亚洲福利| 国产大片一区二区| 丁香六月久久综合狠狠色| 大白屁股一区二区视频| 久久99精品国产.久久久久久| 水野朝阳av一区二区三区| 亚洲精品久久久久久国产精华液| 国产精品嫩草99a| 国产精品久久久久国产精品日日| 中文字幕欧美激情| 国产精品女上位| 亚洲精品水蜜桃| 日韩电影在线一区二区三区| 美女视频黄免费的久久 | 色哟哟在线观看一区二区三区| 99精品久久只有精品| 欧美视频一区在线| 91精品国产色综合久久 | 制服丝袜亚洲色图| 337p粉嫩大胆色噜噜噜噜亚洲 | 日韩一区二区三区观看| 久久午夜电影网| 亚洲国产精品尤物yw在线观看| 日本中文在线一区| 99久久综合国产精品| 91精品免费在线| 国产欧美日韩在线看| 天天色综合天天| 首页综合国产亚洲丝袜| 三级成人在线视频| 9i看片成人免费高清| 555www色欧美视频| 国产精品免费人成网站| 蜜臀av一区二区在线观看| 91网站在线观看视频| 欧美精品三级在线观看| 亚洲人一二三区| 国产精品一卡二卡| 日韩午夜精品电影| 午夜视频在线观看一区| 成人app在线观看| 久久午夜免费电影| 免费在线欧美视频| 欧美日韩国产乱码电影| 亚洲欧美另类久久久精品2019| 麻豆成人久久精品二区三区小说| 91社区在线播放| 国产精品福利一区二区三区| 国产成人久久精品77777最新版本| 91精品一区二区三区久久久久久 | 欧美理论片在线| 亚洲国产精品一区二区久久 | 色综合视频在线观看| 亚洲天堂网中文字|