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

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

?? amd_flash.c

?? vivi的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
		case 4:			temp.chipshift += 2;			break;	}	/* Find out if there are any more chips in the map. */	for (base = (1 << temp.chipshift);	     base < map->size;	     base += (1 << temp.chipshift)) {	     	int numchips = temp.numchips;		table_pos[numchips] = probe_new_chip(mtd, base, chips,			&temp, table, sizeof(table)/sizeof(table[0]));	}	mtd->eraseregions = mmalloc(sizeof(struct mtd_erase_region_info) *				    mtd->numeraseregions);	if (!mtd->eraseregions) { 		printk("%s: Failed to allocate "		       "memory for MTD erase region info\n", map->name);		mfree(mtd);		map->fldrv_priv = NULL;		return 0;	}	reg_idx = 0;	offset = 0;	for (i = 0; i < temp.numchips; i++) {		int dev_size;		int j;		dev_size = 0;		for (j = 0; j < table[table_pos[i]].numeraseregions; j++) {			mtd->eraseregions[reg_idx].offset = offset +				(table[table_pos[i]].regions[j].offset *				 temp.interleave);			mtd->eraseregions[reg_idx].erasesize =				table[table_pos[i]].regions[j].erasesize *				temp.interleave;			mtd->eraseregions[reg_idx].numblocks =				table[table_pos[i]].regions[j].numblocks;			if (mtd->erasesize <			    mtd->eraseregions[reg_idx].erasesize) {				mtd->erasesize =					mtd->eraseregions[reg_idx].erasesize;			}			dev_size += mtd->eraseregions[reg_idx].erasesize *				    mtd->eraseregions[reg_idx].numblocks;			reg_idx++;		}		offset += dev_size;	}	mtd->type = MTD_NORFLASH;	mtd->flags = MTD_CAP_NORFLASH;	mtd->name = map->name;	mtd->erase = amd_flash_erase;		mtd->write = amd_flash_write;		mtd->lock = amd_flash_lock;	mtd->unlock = amd_flash_unlock;	private = mmalloc(sizeof(*private) + (sizeof(struct flchip) *					      temp.numchips));	if (!private) {		printk("%s: kmalloc failed for private structure\n", map->name);		mfree(mtd);		map->fldrv_priv = NULL;		return NULL;	}	memcpy(private, &temp, sizeof(temp));	memcpy(private->chips, chips,	       sizeof(struct flchip) * private->numchips);	map->fldrv_priv = private;	/* map->fldrv = &amd_flash_chipdrv; */	return mtd;}static int write_one_word(struct map_info *map, struct flchip *chip,			  unsigned long adr, __u32 datum){	struct amd_flash_private *private = map->fldrv_priv;	int ret = 0;	int times_left;	adr += chip->start;	ENABLE_VPP(map);	send_cmd(map, chip->start, CMD_PROGRAM_UNLOCK_DATA);	wide_write(map, datum, adr);	times_left = 500000;	while (times_left-- && flash_is_busy(map, adr, private->interleave)) ;	if (!times_left) {		printk("%s: write to 0x%lx timed out!\n",		       map->name, adr);		ret = -EIO;	} else {		__u32 verify;		if ((verify = wide_read(map, adr)) != datum) {			printk("%s: write to 0x%lx failed. "			       "datum = %x, verify = %x\n",			       map->name, adr, datum, verify);			ret = -EIO;		}	}	DISABLE_VPP(map);	return ret;}static int amd_flash_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 amd_flash_private *private = map->fldrv_priv;	int ret = 0;	int chipnum;	unsigned long ofs;	unsigned long chipstart;	*retlen = 0;	if (!len) {		return 0;	}	chipnum = to >> private->chipshift;	ofs = to  - (chipnum << private->chipshift);	chipstart = private->chips[chipnum].start;	/* If it's not bus-aligned, do the first byte write. */	if (ofs & (map->buswidth - 1)) {		unsigned long bus_ofs = ofs & ~(map->buswidth - 1);		int i = ofs - bus_ofs;		int n = 0;		u_char tmp_buf[4];		__u32 datum;#if 0 /* comment out by nandy */		map->copy_from(map, tmp_buf,			       bus_ofs + private->chips[chipnum].start,			       map->buswidth);#endif		while (len && i < map->buswidth)			tmp_buf[i++] = buf[n++], len--;		if (map->buswidth == 2) {			datum = *(__u16*)tmp_buf;		} else if (map->buswidth == 4) {			datum = *(__u32*)tmp_buf;		} else {			return -EINVAL;  /* should never happen, but be safe */		}		ret = write_one_word(map, &private->chips[chipnum], bus_ofs,				     datum);		if (ret) {			return ret;		}				ofs += n;		buf += n;		(*retlen) += n;		if (ofs >> private->chipshift) {			chipnum++;			ofs = 0;			if (chipnum == private->numchips) {				return 0;			}		}	}		/* We are now aligned, write as much as possible. */	while(len >= map->buswidth) {		__u32 datum;		if (map->buswidth == 1) {			datum = *(__u8*)buf;		} else if (map->buswidth == 2) {			datum = *(__u16*)buf;		} else if (map->buswidth == 4) {			datum = *(__u32*)buf;		} else {			return -EINVAL;		}		ret = write_one_word(map, &private->chips[chipnum], ofs, datum);		if (ret) {			return ret;		}		ofs += map->buswidth;		buf += map->buswidth;		(*retlen) += map->buswidth;		len -= map->buswidth;		if (ofs >> private->chipshift) {			chipnum++;			ofs = 0;			if (chipnum == private->numchips) {				return 0;			}			chipstart = private->chips[chipnum].start;		}	}	if (len & (map->buswidth - 1)) {		int i = 0, n = 0;		u_char tmp_buf[2];		__u32 datum;#if 0	/* comment out by nandy */		map->copy_from(map, tmp_buf,			       ofs + private->chips[chipnum].start,			       map->buswidth);#endif		while (len--) {			tmp_buf[i++] = buf[n++];		}		if (map->buswidth == 2) {			datum = *(__u16*)tmp_buf;		} else if (map->buswidth == 4) {			datum = *(__u32*)tmp_buf;		} else {			return -EINVAL;  /* should never happen, but be safe */		}		ret = write_one_word(map, &private->chips[chipnum], ofs, datum);		if (ret) {			return ret;		}				(*retlen) += n;	}	return 0;}static inline int erase_one_block(struct map_info *map, struct flchip *chip,				  unsigned long adr, u_long size){	unsigned long timeo = TIMEO;	struct amd_flash_private *private = map->fldrv_priv;	adr += chip->start;	ENABLE_VPP(map);	send_cmd(map, chip->start, CMD_SECTOR_ERASE_UNLOCK_DATA);	send_cmd_to_addr(map, chip->start, CMD_SECTOR_ERASE_UNLOCK_DATA_2, adr);		while (flash_is_busy(map, adr, private->interleave)) {		/* OK Still waiting */		if (timeo < 0) {			printk("%s: waiting for erase to complete "			       "timed out.\n", map->name);			DISABLE_VPP(map);			return -EIO;		}				udelay(1);	}	/* Verify every single word */	{		int address;		int error = 0;		__u8 verify;		for (address = adr; address < (adr + size); address++) {			if ((verify = map->read8(map, address)) != 0xFF) {				error = 1;				break;			}		}		if (error) {			printk("%s: verify error at 0x%x, size %ld.\n",			       map->name, address, size);			DISABLE_VPP(map);			return -EIO;		}	}		DISABLE_VPP(map);	return 0;}static int amd_flash_erase(struct mtd_info *mtd, struct erase_info *instr){	struct map_info *map = mtd->priv;	struct amd_flash_private *private = map->fldrv_priv;	unsigned long adr, len;	int chipnum;	int ret = 0;	int i;	int first;	struct mtd_erase_region_info *regions = mtd->eraseregions;	if (instr->addr > mtd->size) {		return -EINVAL;	}	if ((instr->len + instr->addr) > 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) &&	       (instr->addr >= 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 (instr->addr & (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) && 	       ((instr->addr + instr->len) >= regions[i].offset)) {                i++;	}	/* As before, drop back one to point at the region in which	 * the address actually falls.	 */	i--;	if ((instr->addr + instr->len) & (regions[i].erasesize-1)) {                return -EINVAL;	}	chipnum = instr->addr >> private->chipshift;	adr = instr->addr - (chipnum << private->chipshift);	len = instr->len;	i = first;	DPRINTK("Start erase\n");	while (len) {		DPRINTK("remain length = 0x%lx\n", len);		ret = erase_one_block(map, &private->chips[chipnum], adr,				      regions[i].erasesize);		if (ret) {			return ret;		}		adr += regions[i].erasesize;		len -= regions[i].erasesize;		if ((adr % (1 << private->chipshift)) ==		    ((regions[i].offset + (regions[i].erasesize *		    			   regions[i].numblocks))		     % (1 << private->chipshift))) {			i++;		}		if (adr >> private->chipshift) {			adr = 0;			chipnum++;			if (chipnum >= private->numchips) {				break;			}		}	}			return 0;}#ifdef CONFIG_CMD_AMD_FLASHstruct mtd_info *amdstd_mtd;#define AMDFLASH_SIZE	SZ_1M#define AMDFLASH_BUSWIDTH	DEVICE_TYPE_X16#define AMDFLASH_BASE		0x08000000static voidamdstd_set_vpp(struct map_info *map, int vpp){	/* nothing */}static __u8 amdstd_read8(struct map_info *map, unsigned long ofs){        return readb(map->map_priv_1 + ofs); }static __u16 amdstd_read16(struct map_info *map, unsigned long ofs){        return readw(map->map_priv_1 + ofs); }static __u32 amdstd_read32(struct map_info *map, unsigned long ofs){        return readl(map->map_priv_1 + ofs); }static void amdstd_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len){        memcpy(to, (void *)(map->map_priv_1 + from), len);}static void amdstd_write8(struct map_info *map, __u8 d, unsigned long adr){        writeb(d, map->map_priv_1 + adr); }static void amdstd_write16(struct map_info *map, __u16 d, unsigned long adr){        writew(d, map->map_priv_1 + adr); }static void amdstd_write32(struct map_info *map, __u32 d, unsigned long adr){        writel(d, map->map_priv_1 + adr); }static void amdstd_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len){        memcpy((void *)(map->map_priv_1 + to), from, len);}static struct map_info amdstd_map = {        name:           "S3C2410 amd flash",        read8:          amdstd_read8,        read16:         amdstd_read16,        read32:         amdstd_read32,        copy_from:      amdstd_copy_from,        write8:         amdstd_write8,        write16:        amdstd_write16,        write32:        amdstd_write32,        copy_to:        amdstd_copy_to,        map_priv_1:     AMDFLASH_BASE,        map_priv_2:     -1,};static voidfill_map(struct map_info *map){	map->size = AMDFLASH_SIZE;	map->buswidth = AMDFLASH_BUSWIDTH;	/* DEVICE_TYPE_X16 */	map->set_vpp = amdstd_set_vpp;}static voidcommand_erase(int argc, const char **argv){	struct mtd_info *mtd = amdstd_mtd;	struct erase_info instr;	int ret;	if (argc != 3) {		printk("invalid 'amd erase' command: too few(many) arguments\n");		return;	}	instr.addr = strtoul(argv[1], NULL, 0, NULL);	instr.len = strtoul(argv[2], NULL, 0, NULL);	printk("Erase from 0x%08lx-0x%08lx... ", instr.addr, instr.addr + instr.len);	ret = amd_flash_erase(mtd, &instr);	if (ret)		printk("failed.\n");	else		printk("done.\n");}static voidcommand_write(int argc, const char **argv){	struct mtd_info *mtd = amdstd_mtd;	loff_t ofs;	size_t size;	u_char *from;	size_t retlen;	if (argc != 4) {		printk("invalid 'amd write' command: too few(many) arguments\n");		return;	}	ofs = (loff_t)strtoul(argv[1], NULL, 0, NULL);	size = (size_t)strtoul(argv[2], NULL, 0, NULL);	from = (u_char *)strtoul(argv[3], NULL, 0, NULL);	amd_flash_write(mtd, ofs, size, &retlen, from);	printk("retlen = 0x%x, %d-byte\n", retlen, retlen);}static voidcommand_probe(int arg, const char **argv){	fill_map(&amdstd_map);	amdstd_mtd = amd_flash_probe(&amdstd_map);}static user_subcommand_t amd_cmds[] = {	{		"erase",		command_erase,		"amd erase <ofs> <size>\t\t-- erase a region"	}, {		"probe", 		command_probe, 		"amd probe\t\t\t-- probing AMD flash"	}, {		"write",		command_write,		"amd write <ofs> <size> <buf_addr>\t-- write images"	}, {		NULL,		NULL,		NULL	}};voidcommand_amd(int argc, const char **argv){	switch (argc) {		case 1:			invalid_cmd("amd", amd_cmds);			break;		case 2:			if (strncmp("help", argv[1], 4) == 0) {				print_usage("", amd_cmds);				break;			}		default:			execsubcmd(amd_cmds, argc-1, argv+1);	}}user_command_t amd_cmd = {	"amd",	command_amd,	NULL,	"amd [{cmds}]\t\t\t-- Manage AMD flash memory"};#endif /* CONFIG_CMD_AMD_FLASH */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99久久99精品免视看婷婷| 欧洲在线/亚洲| 日本电影欧美片| 日韩精品中文字幕在线不卡尤物 | 91精品国模一区二区三区| 久久夜色精品国产噜噜av| 亚洲成在线观看| 99久久99久久精品免费看蜜桃| 欧美精品一区二区三区高清aⅴ| 亚洲影院久久精品| 99久久国产综合色|国产精品| 精品久久国产97色综合| 午夜免费欧美电影| 欧美亚洲尤物久久| 亚洲精品免费在线| av网站一区二区三区| 久久女同性恋中文字幕| 久久97超碰国产精品超碰| 欧美无砖砖区免费| 亚洲综合色婷婷| 欧美羞羞免费网站| 亚洲国产精品久久人人爱蜜臀| 9久草视频在线视频精品| 欧美国产综合一区二区| 国产成人精品亚洲777人妖| 久久美女艺术照精彩视频福利播放| 免费欧美高清视频| 日韩精品一区二区三区四区视频| 秋霞av亚洲一区二区三| 日韩午夜在线观看| 久久精品国产免费| 久久久久国产精品人| 国产成人免费在线观看不卡| 国产午夜亚洲精品羞羞网站| 国产麻豆日韩欧美久久| 国产欧美日韩久久| 成人黄色在线网站| 亚洲欧美日韩一区| 欧美日韩成人高清| 久久国产免费看| 2024国产精品视频| 成人97人人超碰人人99| 亚洲欧美一区二区三区国产精品| 色婷婷国产精品| 婷婷亚洲久悠悠色悠在线播放| 欧美久久久一区| 久久精品国产一区二区三区免费看| 精品三级在线观看| av一区二区三区在线| 亚洲午夜电影在线| 欧美不卡123| 91丨porny丨国产入口| 亚洲18女电影在线观看| 精品免费国产二区三区| 不卡的电视剧免费网站有什么| 亚洲男人的天堂在线观看| 欧美又粗又大又爽| 久久福利视频一区二区| 国产精品美女久久久久久| 欧美三级电影网站| 激情欧美一区二区三区在线观看| 日韩毛片在线免费观看| 欧美一区二区美女| 不卡在线观看av| 亚洲福利一区二区| 国产日韩一级二级三级| 欧美卡1卡2卡| 成人黄色一级视频| 免费观看日韩电影| 亚洲精品一二三区| 久久综合九色综合欧美亚洲| 久久精品人人做人人综合| av亚洲产国偷v产偷v自拍| 亚洲成av人片一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 色哟哟精品一区| 国产精品综合在线视频| 亚洲国产精品麻豆| 亚洲欧洲精品成人久久奇米网| 制服丝袜中文字幕一区| 色先锋久久av资源部| 久久er99精品| 午夜伊人狠狠久久| 国产精品成人免费在线| 精品国产露脸精彩对白| 欧美日韩国产一级| 色婷婷久久一区二区三区麻豆| 国产一区二区三区久久久| 日韩高清不卡一区| 亚洲免费观看高清完整| 亚洲国产成人午夜在线一区| 精品久久久久99| 717成人午夜免费福利电影| 91啪亚洲精品| av在线不卡观看免费观看| 国产一区二区三区美女| 麻豆成人免费电影| 亚洲成人动漫精品| 亚洲精品免费播放| 亚洲人吸女人奶水| 亚洲欧美韩国综合色| 一区二区中文视频| 综合久久给合久久狠狠狠97色| 国产欧美精品区一区二区三区| 精品国产伦理网| 日韩免费电影一区| 日韩一区二区电影在线| 91精品国产综合久久久久久漫画| 欧美性生活影院| 在线精品亚洲一区二区不卡| 92国产精品观看| 色综合色狠狠综合色| 色偷偷久久一区二区三区| av电影天堂一区二区在线观看| 成人开心网精品视频| 不卡高清视频专区| 91亚洲精华国产精华精华液| 99国产精品一区| 色婷婷久久久久swag精品| 欧美在线观看一区| 在线播放中文一区| 日韩欧美一级精品久久| 欧美精品一区二区三区在线| 2023国产精品自拍| 国产精品久久久久久久久免费樱桃| 亚洲国产精品v| 一区二区三区在线视频免费| 亚洲国产成人porn| 免费观看在线综合| 国产精品影视网| 91免费版在线看| 欧美日韩一级二级三级| 制服.丝袜.亚洲.另类.中文| 欧美精品一区二区在线播放| 欧美激情综合五月色丁香小说| 国产精品午夜电影| 亚洲一区在线看| 狠狠色丁香婷婷综合| 99久久婷婷国产| 在线不卡一区二区| 亚洲国产高清不卡| 香蕉久久一区二区不卡无毒影院| 九色综合狠狠综合久久| 成人黄色小视频| 日韩一级二级三级| 欧美大片在线观看一区二区| 中文字幕一区二区三区蜜月| 亚洲成人午夜影院| 国产河南妇女毛片精品久久久| 91久久精品网| 久久久99久久| 亚洲成人自拍一区| 成人av免费在线| 欧美一区中文字幕| 专区另类欧美日韩| 国产一区二区精品久久| 欧美日韩激情一区| 欧美国产精品一区二区三区| 亚洲va欧美va国产va天堂影院| 国产综合色在线| 欧美精品三级在线观看| 国产精品视频麻豆| 久久99九九99精品| 欧洲亚洲国产日韩| 国产精品久久毛片| 韩国中文字幕2020精品| 欧美美女黄视频| 亚洲色图一区二区三区| 国产精品一线二线三线精华| 884aa四虎影成人精品一区| 亚洲婷婷综合久久一本伊一区 | 懂色av一区二区三区免费看| 欧美日韩成人一区二区| 亚洲女人小视频在线观看| 国产麻豆一精品一av一免费 | 91福利小视频| 国产精品色婷婷久久58| 精品一区二区三区免费视频| 欧美三区在线观看| 一区二区三区国产豹纹内裤在线 | 亚洲女爱视频在线| 成熟亚洲日本毛茸茸凸凹| 亚洲精品一区二区三区99| 免费人成在线不卡| 欧美一级片在线观看| 亚洲图片有声小说| 在线观看一区不卡| 亚洲精品视频在线观看网站| 9久草视频在线视频精品| 国产午夜精品福利| 狠狠网亚洲精品| 久久九九全国免费| 国产激情视频一区二区在线观看| 日韩视频一区二区三区在线播放 | 2017欧美狠狠色| 久久精品国产色蜜蜜麻豆| 精品日韩99亚洲| 国产麻豆日韩欧美久久| 国产情人综合久久777777| 国产精品18久久久|