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

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

?? amd_flash.c

?? 此代碼為bootloader
?? C
?? 第 1 頁 / 共 2 頁
字號:
	}	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
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜片在线观看| 欧美日韩黄色一区二区| 久久九九久久九九| 日韩高清一区二区| 欧美视频一区二区三区四区 | 亚洲成人在线免费| 在线视频你懂得一区二区三区| 国产精品久久久久7777按摩| 国产不卡一区视频| 国产欧美一区二区精品久导航| 国产麻豆9l精品三级站| 亚洲精品一区二区三区蜜桃下载| 久久精品国产精品亚洲精品| 日韩免费性生活视频播放| 日韩1区2区日韩1区2区| 日韩一区二区精品| 久久99精品久久久| 久久五月婷婷丁香社区| 国产美女久久久久| 国产欧美1区2区3区| 成人aa视频在线观看| 亚洲欧洲另类国产综合| 99国产精品久久| 亚洲综合自拍偷拍| 欧美精选午夜久久久乱码6080| 天堂蜜桃91精品| 欧美videofree性高清杂交| 国产在线精品一区二区三区不卡| 久久这里只精品最新地址| 国产一区二区精品在线观看| 国产三级久久久| 波多野洁衣一区| 亚洲精品中文在线| 在线电影欧美成精品| 美女视频一区二区三区| 久久久久久久精| 成人a区在线观看| 亚洲蜜桃精久久久久久久| 欧美亚洲精品一区| 美女在线一区二区| 国产欧美久久久精品影院| 成人免费视频视频在线观看免费 | 欧美a级理论片| 久久久久久久性| 91小视频免费看| 午夜免费久久看| 久久嫩草精品久久久精品| 国产欧美日韩另类一区| 91伊人久久大香线蕉| 午夜成人免费视频| 久久久.com| 欧亚一区二区三区| 激情av综合网| 亚洲欧美偷拍另类a∨色屁股| 欧美亚洲高清一区二区三区不卡| 男女男精品网站| 国产欧美日韩三区| 欧美日韩一区久久| 国产成人免费9x9x人网站视频| 亚洲激情欧美激情| 日韩精品一区二区在线| 成人v精品蜜桃久久一区| 日韩精品欧美精品| 亚洲国产精品二十页| 欧美日韩精品一区二区三区四区| 韩国毛片一区二区三区| 亚洲欧美二区三区| 精品日韩欧美在线| 欧洲视频一区二区| 国产美女主播视频一区| 亚洲电影在线播放| 国产日韩欧美激情| 欧美日韩久久久| 成人国产一区二区三区精品| 日韩精品免费专区| 中文字幕在线观看一区| 日韩欧美在线影院| 色嗨嗨av一区二区三区| 国产美女一区二区| 日韩国产欧美三级| 亚洲图片另类小说| 精品奇米国产一区二区三区| 91精品福利在线| 国产suv精品一区二区6| 日韩精品国产精品| 亚洲女女做受ⅹxx高潮| 久久九九久久九九| 日韩女优av电影| 欧美三级电影网| av激情亚洲男人天堂| 激情综合一区二区三区| 午夜久久久影院| 亚洲精品成人在线| 欧美极品少妇xxxxⅹ高跟鞋 | 欧美电影一区二区| 色综合天天天天做夜夜夜夜做| 精品亚洲国产成人av制服丝袜| 亚洲成人中文在线| 一区二区三区视频在线看| 亚洲国产精品ⅴa在线观看| 精品奇米国产一区二区三区| 欧美精品一卡两卡| 欧美在线观看一二区| 99re8在线精品视频免费播放| 国产一区999| 久久精品国产亚洲aⅴ | 亚洲精品第1页| 中文字幕av不卡| 国产日韩欧美精品一区| 久久综合久久鬼色中文字| 91精品国产高清一区二区三区 | 韩国av一区二区三区四区| 日韩av一区二区在线影视| 亚洲香蕉伊在人在线观| 亚洲免费成人av| 亚洲人被黑人高潮完整版| 136国产福利精品导航| 成人av第一页| 国产成人在线免费| 国产一区二区三区免费观看| 乱中年女人伦av一区二区| 日本不卡高清视频| 免费观看久久久4p| 美女任你摸久久| 麻豆免费精品视频| 久草精品在线观看| 激情综合色综合久久综合| 久久精品国产精品亚洲精品| 久色婷婷小香蕉久久| 狠狠色狠狠色综合系列| 精品一二线国产| 国产成人综合视频| 成人av网址在线观看| 9l国产精品久久久久麻豆| 99免费精品在线| 色婷婷亚洲婷婷| 欧美亚洲国产bt| 91精品一区二区三区久久久久久| 在线电影国产精品| 欧美哺乳videos| 久久久国产午夜精品| 国产欧美久久久精品影院| 中文字幕一区二区日韩精品绯色| 亚洲欧美在线观看| 亚洲综合久久久久| 午夜精品免费在线| 久久av资源站| 风间由美性色一区二区三区| 成人福利视频网站| 色av成人天堂桃色av| 欧美日韩一区高清| 日韩精品影音先锋| 国产日韩欧美在线一区| 亚洲免费在线电影| 午夜久久久久久| 韩国女主播一区| 99久久综合精品| 欧美日韩精品一区二区在线播放| 欧美一卡二卡三卡四卡| 久久婷婷综合激情| 国产精品久久久久久久久免费丝袜| 亚洲美女视频在线| 日韩成人一区二区三区在线观看| 久久国产精品第一页| 粉嫩aⅴ一区二区三区四区| 91精品91久久久中77777| 91精品国产aⅴ一区二区| 久久精品亚洲麻豆av一区二区| 中文字幕一区av| 午夜影院久久久| 国产精品自产自拍| 色婷婷精品久久二区二区蜜臂av | 精品国内片67194| 国产精品无圣光一区二区| 一级女性全黄久久生活片免费| 免费欧美高清视频| 99精品欧美一区| 欧美一区二区三区爱爱| 国产欧美视频在线观看| 亚洲一区二区三区四区在线观看| 美日韩一区二区三区| 99re8在线精品视频免费播放| 6080亚洲精品一区二区| 欧美—级在线免费片| 午夜电影网一区| 成人激情免费网站| 7799精品视频| 国产日韩av一区| 偷拍日韩校园综合在线| 成人一二三区视频| 777久久久精品| 中文字幕中文字幕在线一区| 日本女优在线视频一区二区| 不卡的av在线播放| 日韩情涩欧美日韩视频| 亚洲免费在线观看| 国产福利一区二区| 欧美精品第1页| 日韩理论片网站| 精品无码三级在线观看视频|