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

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

?? cfi_cmdset_0001.c

?? Supervivi的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
			return -EIO;		}	}	/* Write length of data to come */	cfi_write(map, CMD(len/CFIDEV_BUSWIDTH-1), cmd_adr);	/* Write data */	for (z = 0; z < len; z += CFIDEV_BUSWIDTH) {		if (cfi_buswidth_is_1()) {			map->write8(map, *((__u8*)buf)++, adr+z);		} else if (cfi_buswidth_is_2()) {			map->write16(map, *((__u16*)buf)++, adr+z);		} else if (cfi_buswidth_is_4()) {			map->write32(map, *((__u32*)buf)++, adr+z);		} else if (cfi_buswidth_is_8()) {			map->write64(map, *((__u64*)buf)++, adr+z);		} else {			DISABLE_VPP(map);			cfi_write(map, CMD(0xff), adr);			return -EINVAL;		}	}	/* GO GO GO */	cfi_write(map, CMD(0xd0), cmd_adr);	timeo = cfi->cfiq->BufWriteTimeoutMax * 1000;	for (;;) {		status = cfi_read(map, cmd_adr);		if ((status & status_OK) == status_OK)			break;		if (timeo-- < 0) {			printk("Waiting for chip to be ready timed out in bufwrite\n");			cfi_write(map, CMD(0xff), adr);			return -EIO;		}	}	/* Done and happy. */	DISABLE_VPP(map);	/* check for lock bit */	if (status & CMD(0x02)) {		/* clear status */		cfi_write(map, CMD(0x50), cmd_adr);		/* put back into read status register mode */		cfi_write(map, CMD(0x70), adr);		cfi_write(map, CMD(0xff), adr);		return -EROFS;	}	cfi_write(map, CMD(0xff), adr);	return 0;}static int cfi_intelext_write_buffers(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 wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize;	int ret = 0;	int chipnum;	unsigned long ofs;	*retlen = 0;	if (!len) return 0;	chipnum = to >> cfi->chipshift;	ofs = to - (chipnum << cfi->chipshift);#ifdef CONFIG_MSG_PROGRESS	progress_bar(0, 100);#endif	/* If it's not bus-aligned, do the first word write */	if (ofs & (CFIDEV_BUSWIDTH-1)) {		size_t local_len = (-ofs)&(CFIDEV_BUSWIDTH-1);		if (local_len > len)			local_len = len;		ret = cfi_intelext_write_words(mtd, to, local_len, retlen, buf);		if (ret) return ret;		ofs += local_len;		buf += local_len;		len -= local_len;		if (ofs >> cfi->chipshift) {			chipnum++;			ofs = 0;			if (chipnum == cfi->numchips)				return 0;		}	}	/* Write buffer is worth it only if more than one word to write... */	while (len > CFIDEV_BUSWIDTH) {		/* We must not cross write block boundaries */		int size = wbufsize - (ofs & (wbufsize-1));		if (size > len )			size = len & ~(CFIDEV_BUSWIDTH - 1);		ret = do_write_buffer(map, &cfi->chips[chipnum], ofs, buf, size);		if (ret) return ret;		ofs += size;		buf += size;		(*retlen) += size;		len -= size;		if (ofs >> cfi->chipshift) {			chipnum++;			ofs = 0;			if (chipnum == cfi->numchips)				return 0;		}#ifdef CONFIG_MSG_PROGRESS		if (!(*retlen % 0x20000))			progress_bar(*retlen, len + *retlen);#endif	}	/* ... and write the remaining bytes */	if (len > 0) {		size_t local_retlen;		ret = cfi_intelext_write_words(mtd, ofs + (chipnum << cfi->chipshift),                                               len, &local_retlen, buf);				if (ret) return ret;		(*retlen) += local_retlen;	}#ifdef CONFIG_MSG_PROGRESS	progress_bar(100, 100);#endif	return 0;}typedef int (*varsize_frob_t)(struct map_info *map, struct flchip *chip,                              unsigned long adr, void *thunk);static int cfi_intelext_varsize_frob(struct mtd_info *mtd, varsize_frob_t frob,                                     loff_t ofs, size_t len, void *thunk){        struct map_info *map = mtd->priv;        struct cfi_private *cfi = map->fldrv_priv;        unsigned long adr;        int chipnum, ret = 0;        int i, first;        struct mtd_erase_region_info *regions = mtd->eraseregions;        if (ofs > mtd->size)                return -EINVAL;        if ((len + ofs) > mtd->size)                return -EINVAL;        /* Check that both start and end of the requested erase are         * aligned with the erasesize at the appropriate addresses.         */        i = 0;        /* Skip all erase regions which are ended before the start of            the requested erase. Actually, to save on the calculations,           we skip to the first erase region which starts after the           start of the requested erase, and then go back one.        */        while (i < mtd->numeraseregions && ofs >= regions[i].offset)               i++;        i--;        /* OK, now i is pointing at the erase region in which this            erase request starts. Check the start of the requested           erase range is aligned with the erase size which is in           effect here.        */        if (ofs & (regions[i].erasesize-1))                return -EINVAL;        /* Remember the erase region we start on */        first = i;        /* Next, check that the end of the requested erase is aligned         * with the erase region at that address.         */        while (i<mtd->numeraseregions && (ofs + len) >= regions[i].offset)                i++;        /* As before, drop back one to point at the region in which           the address actually falls        */        i--;        if ((ofs + len) & (regions[i].erasesize-1))                return -EINVAL;        chipnum = ofs >> cfi->chipshift;        adr = ofs - (chipnum << cfi->chipshift);        i=first;#ifdef CONFIG_MSG_PROGRESS	progress_bar(adr - ofs, (len + adr) - ofs);#endif        while(len) {                ret = (*frob)(map, &cfi->chips[chipnum], adr, thunk);                if (ret)                        return ret;                adr += regions[i].erasesize;                len -= regions[i].erasesize;                if (adr % (1<< cfi->chipshift) == ((regions[i].offset + (regions[i].erasesize * regions[i].numblocks)) %( 1<< cfi->chipshift)))                        i++;                if (adr >> cfi->chipshift) {                        adr = 0;                        chipnum++;                        if (chipnum >= cfi->numchips)                        break;                }#ifdef CONFIG_MSG_PROGRESS	progress_bar(adr - ofs, (len + adr) - ofs);#endif        }#ifdef CONFIG_MSG_PROGRESS	progress_bar(100, 100);#endif        return 0;}static int do_erase_oneblock(struct map_info *map, struct flchip *chip,                              unsigned long adr, void *thunk){	struct cfi_private *cfi = map->fldrv_priv;	cfi_word status, status_OK;	unsigned long timeo;	int ret = 0;	adr += chip->start;	/* Let's determine this according to the interleave only once */	status_OK = CMD(0x80);		timeo = 0x4000 * 1000;	ENABLE_VPP(map);	/* Clear the status register first */	cfi_write(map, CMD(0x50), adr);	/* Now erase */	cfi_write(map, CMD(0x20), adr);	cfi_write(map, CMD(0xD0), adr);		while (timeo > 0) {		status = cfi_read(map, adr);		if ((status & status_OK) == status_OK)			break;		timeo--;	}	DISABLE_VPP(map);	/* We've broken this before. It doesn't hurt to be safe */	cfi_write(map, CMD(0x70), adr);	status = cfi_read(map, adr);	ret = 0;	/* check for lock bit */	if ((timeo <= 0) || (status & CMD(0x3a))) {		unsigned char chipstatus = status;		if (status != CMD(status & 0xff)) {			int i;			for (i = 1; i < CFIDEV_INTERLEAVE; i++) {				chipstatus |= status >> (cfi->device_type * 8);			}			printk("Status is not identical for all chips: 0x%llx, Mergint to give 0x%02x\n", (__u64)status, chipstatus);		}		/* Reset the error bits */		cfi_write(map, CMD(0x50), adr);		cfi_write(map, CMD(0x70), adr);		printk("\n");		if ((chipstatus & 0x30) == 0x30) {			printk("Chip reports improper command sequence: status 0x%llx\n", (__u64)status);			ret = -EIO;		} else if (chipstatus & 0x02) {			/* Protection bit set */			printk("Protection bit set: status 0x%llx\n", (__u64)status);			ret = -EROFS;		} else if (chipstatus & 0x8) {			/* Voltage */			printk("Chip reports voltage low on erase: status 0x%llx\n", (__u64)status);			ret = -EIO;		} else if (chipstatus & 0x20) {			printk("Chip erase failed at 0x%08lx: status 0x%llx\n", adr, (__u64)status);			ret = -EIO;		}	}	cfi_write(map, CMD(0xff), adr);	return ret;}int cfi_intelext_erase_varsize(struct mtd_info *mtd, struct erase_info *instr){        unsigned long ofs, len;        int ret;        ofs = instr->addr;        len = instr->len;        ret = cfi_intelext_varsize_frob(mtd, do_erase_oneblock, ofs, len, 0);        return ret;}#ifdef DEBUG_LOCK_BITSstatic int do_printlockstatus_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr, void *thunk){        struct cfi_private *cfi = map->fldrv_priv;        int ofs_factor = cfi->interleave * cfi->device_type;        cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);        printk("block status register for 0x%08lx is %x\n",               adr, cfi_read_query(map, adr+(2*ofs_factor)));        cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);        return 0;}#endif#define DO_XXLOCK_ONEBLOCK_LOCK         ((void *) 1)#define DO_XXLOCK_ONEBLOCK_UNLOCK       ((void *) 2)static int do_xxlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr, void *thunk){	struct cfi_private *cfi = map->fldrv_priv;	cfi_word status, status_OK;	unsigned long timeo = 0x10000;	adr += chip->start;	/* Let's determine this according to the interleave only once */	status_OK = CMD(0x80);	ENABLE_VPP(map);	cfi_write(map, CMD(0x60), adr);	if (thunk == DO_XXLOCK_ONEBLOCK_LOCK) {		cfi_write(map, CMD(0x01), adr);	} else if (thunk == DO_XXLOCK_ONEBLOCK_UNLOCK) {		cfi_write(map, CMD(0xD0), adr);	} else {		/* bug */	}	for (;;) {		status = cfi_read(map, adr);		if ((status & status_OK) == status_OK)			break;		if (timeo-- == 0) {			cfi_write(map, CMD(0x70), adr);                        printk("waiting for unlock to complete timed out. Xstatus = %llx, status = %llx.\n", (__u64)status, (__u64)cfi_read(map, adr));			cfi_write(map, CMD(0xff), adr);			DISABLE_VPP(map);			return -EIO;		}	}	/* Done */	DISABLE_VPP(map);	cfi_write(map, CMD(0xff), adr);	return 0;}static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, size_t len){        int ret;#ifdef DEBUG_LOCK_BITS        printk(__FUNCTION__               ": lock status before, ofs=0x%08llx, len=0x%08X\n",               ofs, len);        cfi_intelext_varsize_frob(mtd, do_printlockstatus_oneblock,                                  ofs, len, 0);#endif        ret = cfi_intelext_varsize_frob(mtd, do_xxlock_oneblock,                                        ofs, len, DO_XXLOCK_ONEBLOCK_LOCK);#ifdef DEBUG_LOCK_BITS        printk(__FUNCTION__               ": lock status after, ret=%d\n", ret);        cfi_intelext_varsize_frob(mtd, do_printlockstatus_oneblock,                                  ofs, len, 0);#endif        return ret;}static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, size_t len){        int ret;#ifdef DEBUG_LOCK_BITS        printk(__FUNCTION__               ": lock status before, ofs=0x%08llx, len=0x%08X\n",               ofs, len);        cfi_intelext_varsize_frob(mtd, do_printlockstatus_oneblock,                                  ofs, len, 0);#endif        ret = cfi_intelext_varsize_frob(mtd, do_xxlock_oneblock,                                        ofs, len, DO_XXLOCK_ONEBLOCK_UNLOCK);#ifdef DEBUG_LOCK_BITS        printk(__FUNCTION__               ": lock status after, ret=%d\n", ret);        cfi_intelext_varsize_frob(mtd, do_printlockstatus_oneblock,                                  ofs, len, 0);#endif        return ret;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久69国产一区二区蜜臀| 午夜一区二区三区视频| 一区二区三区.www| 精品一区二区三区不卡| 色综合久久综合网97色综合| 精品久久久久一区二区国产| 亚洲欧美日韩国产成人精品影院 | 一区二区三区四区视频精品免费 | 免费精品视频在线| 在线视频你懂得一区| 久久久久国产免费免费| 亚洲国产日韩a在线播放| 欧美久久久久久蜜桃| 欧美极品美女视频| 九九**精品视频免费播放| 欧美日韩一区二区在线观看视频| 中文字幕成人网| 国产麻豆日韩欧美久久| 日韩一区二区三区在线观看| 亚洲午夜精品网| 日本高清不卡视频| 国产精品水嫩水嫩| 国产精品一级黄| 精品国精品国产尤物美女| 天天射综合影视| 欧美日韩在线三级| 亚洲国产成人91porn| 91免费版在线| 1区2区3区精品视频| 成人高清免费观看| 国产精品久久久久久久久快鸭| 精品系列免费在线观看| 日韩免费观看2025年上映的电影| 香港成人在线视频| 欧美日本在线观看| 亚洲不卡一区二区三区| 欧美中文字幕久久| 亚洲国产精品综合小说图片区| 日本国产一区二区| 亚洲成人福利片| 欧美一区欧美二区| 国产又粗又猛又爽又黄91精品| 欧美成人性战久久| 国产一区二区三区av电影| 久久综合九色综合97婷婷女人| 激情五月播播久久久精品| 欧美成人午夜电影| 成人一级片网址| 自拍视频在线观看一区二区| 色综合天天视频在线观看| 亚洲电影视频在线| 欧美一区二区三区男人的天堂| 奇米综合一区二区三区精品视频| 日韩一区二区三区免费观看| 国产在线不卡视频| 欧美激情一区二区三区不卡| 91性感美女视频| 无码av中文一区二区三区桃花岛| 日韩你懂的在线观看| 国产风韵犹存在线视精品| 中文字幕在线一区免费| 欧美日高清视频| 国产精品中文字幕一区二区三区| 国产精品美女一区二区| 欧美色区777第一页| 精品一区二区三区蜜桃| 日韩一区欧美小说| 欧美一级国产精品| 成人国产精品免费| 免费观看一级欧美片| 国产精品不卡一区二区三区| 欧美日韩一区二区不卡| 国产精品一区二区视频| 亚洲国产视频在线| 国产精品国产三级国产有无不卡| 欧美三级日本三级少妇99| 国产精品一区专区| 亚洲chinese男男1069| 精品国产91亚洲一区二区三区婷婷 | 免费的国产精品| 最新国产の精品合集bt伙计| 欧美一区二区三区在线观看视频 | 亚洲欧美另类图片小说| 日韩免费观看高清完整版| 日本精品视频一区二区| 国产乱码字幕精品高清av| 亚洲h精品动漫在线观看| 国产精品久久777777| 久久这里只有精品视频网| 欧美日韩国产高清一区二区三区 | 日本精品视频一区二区| 国产一区二区在线免费观看| 亚洲国产日韩av| 专区另类欧美日韩| 国产日韩欧美精品一区| 欧美一级xxx| 欧美日韩一级大片网址| jlzzjlzz国产精品久久| 国产精品一色哟哟哟| 美国十次了思思久久精品导航| 一区二区在线观看av| 欧美经典一区二区三区| 亚洲精品一区二区三区99| 91精品婷婷国产综合久久| 欧美电影免费观看高清完整版在线| 日本电影亚洲天堂一区| bt7086福利一区国产| 国产美女娇喘av呻吟久久| 麻豆精品久久精品色综合| 日韩和欧美一区二区三区| 亚洲国产一区二区视频| 亚洲人成伊人成综合网小说| 国产精品久久三区| 中文字幕在线视频一区| 一区精品在线播放| 最近中文字幕一区二区三区| 中文字幕日韩一区| 亚洲欧美一区二区三区极速播放 | 成人福利在线看| av电影一区二区| www.欧美亚洲| 色综合视频在线观看| 91黄色激情网站| 欧美日韩免费观看一区二区三区 | 在线免费观看日本一区| 91在线视频18| 色噜噜狠狠成人中文综合| 91国偷自产一区二区三区成为亚洲经典 | 日韩小视频在线观看专区| 欧美一区二区三区性视频| 日韩久久精品一区| 久久精品免视看| 亚洲日本青草视频在线怡红院| 亚洲免费在线看| 五月天网站亚洲| 麻豆精品久久久| 成人免费毛片app| 日本高清无吗v一区| 91精品国产入口在线| 久久综合九色综合欧美亚洲| 国产精品美日韩| 五月婷婷久久综合| 国模娜娜一区二区三区| 99精品视频中文字幕| 欧美视频在线观看一区| 欧美tk—视频vk| 中文字幕一区二区三区视频| 夜夜嗨av一区二区三区中文字幕| 日韩成人免费电影| 国产成人免费视频网站高清观看视频| av在线一区二区三区| 欧美日韩国产免费一区二区| 国产夜色精品一区二区av| 亚洲视频资源在线| 美女国产一区二区| 99免费精品视频| 91精品国产欧美一区二区18 | 国产69精品久久777的优势| 日本高清无吗v一区| 久久一留热品黄| 夜夜精品视频一区二区| 国产麻豆视频精品| 欧美色电影在线| 国产亚洲欧美日韩日本| 美国欧美日韩国产在线播放| 91丨九色丨尤物| 久久久三级国产网站| 性欧美大战久久久久久久久| 成人午夜激情在线| 日韩精品一区二区三区在线播放 | 久草精品在线观看| 在线观看日产精品| 国产欧美视频在线观看| 日韩高清中文字幕一区| 91美女在线观看| 国产亚洲欧美在线| 日韩av高清在线观看| 欧美在线一二三| 亚洲色图色小说| 菠萝蜜视频在线观看一区| 欧美xxxxx牲另类人与| 丝袜国产日韩另类美女| 欧美伊人久久久久久午夜久久久久| 久久亚洲综合色| 日本va欧美va精品| 色综合天天性综合| 国产精品剧情在线亚洲| 激情欧美一区二区| 成年人午夜久久久| 日韩亚洲欧美成人一区| 亚洲国产精品一区二区尤物区| 日本成人中文字幕在线视频| 在线观看日韩电影| 综合激情网...| 岛国精品在线观看| 国产精品无遮挡| 国产精品一区久久久久| 日韩精品最新网址| 狠狠狠色丁香婷婷综合久久五月| 欧美精品 国产精品|