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

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

?? amd_flash.c

?? 2410完整的測試原碼(依照各功能分開目錄,學(xué)習(xí)更容易)
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
	}	chips[0].start = 0;	temp.numchips = 1;	for (size = mtd->size; size > 1; size >>= 1) {		temp.chipshift++;	}	switch (temp.interleave) {		case 2:			temp.chipshift += 1;			break;		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 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产经典视频| 欧美电视剧在线看免费| 欧美在线不卡视频| 欧美午夜电影网| 性久久久久久久| 欧美精品一区二区三区在线 | 日韩一区二区在线看| 欧美成人精精品一区二区频| 国产精品污污网站在线观看| 在线亚洲欧美专区二区| 午夜免费久久看| 久久日一线二线三线suv| 欧美日韩一区精品| 久久免费美女视频| 欧美日产国产精品| 欧美xxxxxxxxx| 欧美日韩亚洲另类| 日韩一区欧美二区| 性做久久久久久| 亚洲情趣在线观看| 成人蜜臀av电影| 色诱视频网站一区| 国产xxx精品视频大全| 欧美乱妇一区二区三区不卡视频| 国产经典欧美精品| 欧美精品v日韩精品v韩国精品v| 中文字幕一区二区三区在线播放| 欧美日韩成人高清| 国产精品久久久久aaaa樱花| 色婷婷av一区二区三区gif| 69堂国产成人免费视频| 99久久免费精品| 中文字幕日本不卡| 99精品视频中文字幕| 欧美电影免费观看高清完整版在 | 91福利在线看| 欧美韩国日本综合| 国产裸体歌舞团一区二区| 欧美一级片免费看| 青青草国产精品亚洲专区无| 欧美性受xxxx黑人xyx性爽| 一区二区三区在线高清| 91成人在线免费观看| 亚洲精品欧美激情| 91久久国产综合久久| 亚洲精品久久久蜜桃| 在线观看视频一区| 久久疯狂做爰流白浆xx| 精品蜜桃在线看| 成人h动漫精品一区二| 综合自拍亚洲综合图不卡区| 91福利视频在线| 久久精品久久久精品美女| 久久精品一区二区三区不卡| 国产精品99久久久久久久vr | 国产另类ts人妖一区二区| 国产午夜精品一区二区| 91在线视频免费91| 美美哒免费高清在线观看视频一区二区| 日韩亚洲欧美中文三级| 不卡的av电影| 日韩av中文字幕一区二区| 久久精品在线观看| 欧美精品1区2区| 不卡欧美aaaaa| 精品在线播放免费| 洋洋av久久久久久久一区| 久久久久久久久久久黄色| 在线免费不卡视频| jlzzjlzz亚洲日本少妇| 免费观看30秒视频久久| 亚洲激情图片qvod| 中文字幕一区二区三区在线播放| 日韩一区二区三区av| 欧美精品一级二级| 91视频.com| 波多野结衣欧美| 国产原创一区二区| 精品一区二区免费在线观看| 亚洲女同女同女同女同女同69| 久久久久99精品一区| 精品少妇一区二区三区免费观看| 欧美群妇大交群的观看方式| 91女厕偷拍女厕偷拍高清| 成人国产精品免费| 懂色av一区二区三区蜜臀| 国产精品一区免费视频| 激情欧美一区二区| 国产精品一区二区免费不卡| 美女视频网站黄色亚洲| 精品亚洲porn| 国产一区二区精品久久91| 国产九色精品成人porny| 国产精一区二区三区| 成人动漫视频在线| 色婷婷亚洲婷婷| 日韩一卡二卡三卡| 国产人久久人人人人爽| 亚洲日本在线观看| 亚洲3atv精品一区二区三区| 奇米色一区二区三区四区| 国产在线精品视频| 欧美亚洲愉拍一区二区| 9191国产精品| 一区二区中文字幕在线| 亚洲一区在线播放| 国产精品综合av一区二区国产馆| 成人晚上爱看视频| 在线播放/欧美激情| 综合欧美亚洲日本| 精品影视av免费| 欧美日韩综合一区| 国产精品国产三级国产专播品爱网| 亚洲小说春色综合另类电影| 国产精品一区二区黑丝| 欧美三级视频在线| 亚洲欧美色一区| 成人动漫在线一区| 欧美精品一区二区在线播放| 亚洲免费av观看| 国产a久久麻豆| 国产无人区一区二区三区| 一区二区三区精密机械公司| 高清在线不卡av| 亚洲在线视频网站| 色婷婷精品久久二区二区蜜臀av| 欧美极品美女视频| 国产精品自拍一区| 欧美国产亚洲另类动漫| 国产曰批免费观看久久久| 久久这里只有精品首页| 麻豆91在线看| 久久久久久夜精品精品免费| 久久99久久久久| 久久亚洲二区三区| 成人高清免费观看| 一区二区三区在线观看国产| 欧美性一二三区| 青娱乐精品视频在线| 日韩一区二区在线观看视频播放| 美女视频黄 久久| 国产欧美日韩精品一区| 在线观看免费亚洲| 蜜桃av一区二区在线观看| 久久综合资源网| 色综合中文字幕国产 | 91在线看国产| 日本欧美大码aⅴ在线播放| 欧美大片一区二区三区| 国产精品69久久久久水密桃| 亚洲欧美日韩精品久久久久| 欧美嫩在线观看| 丁香五精品蜜臀久久久久99网站| 亚洲欧美另类久久久精品| 91麻豆精品国产自产在线| 极品少妇一区二区| 亚洲午夜视频在线观看| 日本一区二区动态图| 欧美丰满少妇xxxbbb| 成人一区二区三区视频在线观看| 午夜精品免费在线观看| 中文字幕在线视频一区| 日韩精品中文字幕一区二区三区| 色综合天天综合在线视频| 国产在线不卡一区| 免费视频一区二区| 日本怡春院一区二区| 亚洲一线二线三线久久久| 一区二区中文视频| 国产精品欧美经典| 国产精品久久午夜夜伦鲁鲁| 欧美电影精品一区二区| 日韩免费在线观看| 日韩一级成人av| 日韩色视频在线观看| 日韩欧美中文一区| 欧美一区二区三区四区高清 | 欧美激情自拍偷拍| 久久久久国产精品厨房| 国产亚洲欧美在线| 中文天堂在线一区| 亚洲免费观看视频| 同产精品九九九| 经典三级视频一区| 国产91精品在线观看| 色噜噜久久综合| 欧美日韩成人综合天天影院| 88在线观看91蜜桃国自产| 欧美α欧美αv大片| 国产精品久久久久久久浪潮网站| 中文字幕亚洲精品在线观看| 亚洲免费观看高清完整版在线观看| 亚洲免费视频中文字幕| 日韩精品一卡二卡三卡四卡无卡| 久久超级碰视频| 91福利社在线观看| 久久久久久黄色| 亚洲成人动漫av| 风间由美中文字幕在线看视频国产欧美| av在线这里只有精品|