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

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

?? ipaq-flash.c

?? mtd-snapshot-20041027
?? C
字號:
/* * Flash memory access on iPAQ Handhelds (either SA1100 or PXA250 based) *  * (C) 2000 Nicolas Pitre <nico@cam.org> * (C) 2002 Hewlett-Packard Company <jamey.hicks@hp.com> * (C) 2003 Christian Pellegrin <chri@ascensit.com>, <chri@infis.univ.ts.it>: concatenation of multiple flashes *  * $Id: ipaq-flash.c,v 1.2 2004/09/16 23:27:13 gleixner Exp $ */#include <linux/config.h>#include <linux/module.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/spinlock.h>#include <linux/init.h>#include <linux/slab.h>#include <asm/page.h>#include <asm/mach-types.h>#include <asm/system.h>#include <asm/errno.h>#include <linux/mtd/mtd.h>#include <linux/mtd/map.h>#include <linux/mtd/partitions.h>#ifdef CONFIG_MTD_CONCAT#include <linux/mtd/concat.h>#endif#include <asm/hardware.h>#include <asm/arch-sa1100/h3600.h>#include <asm/io.h>#ifndef CONFIG_IPAQ_HANDHELD#error This is for iPAQ Handhelds only#endif#ifdef CONFIG_SA1100_JORNADA56Xstatic void jornada56x_set_vpp(struct map_info *map, int vpp){	if (vpp)		GPSR = GPIO_GPIO26;	else		GPCR = GPIO_GPIO26;	GPDR |= GPIO_GPIO26;}#endif#ifdef CONFIG_SA1100_JORNADA720static void jornada720_set_vpp(struct map_info *map, int vpp){	if (vpp)		PPSR |= 0x80;	else		PPSR &= ~0x80;	PPDR |= 0x80;}#endif#define MAX_IPAQ_CS 2		/* Number of CS we are going to test */#define IPAQ_MAP_INIT(X) \	{ \		name:		"IPAQ flash " X, \	}static struct map_info ipaq_map[MAX_IPAQ_CS] = {	IPAQ_MAP_INIT("bank 1"),	IPAQ_MAP_INIT("bank 2")};static struct mtd_info *my_sub_mtd[MAX_IPAQ_CS] = {	NULL,	NULL};/* * Here are partition information for all known IPAQ-based devices. * See include/linux/mtd/partitions.h for definition of the mtd_partition * structure. * * The *_max_flash_size is the maximum possible mapped flash size which * is not necessarily the actual flash size.  It must be no more than * the value specified in the "struct map_desc *_io_desc" mapping * definition for the corresponding machine. * * Please keep these in alphabetical order, and formatted as per existing * entries.  Thanks. */#ifdef CONFIG_IPAQ_HANDHELDstatic unsigned long h3xxx_max_flash_size = 0x04000000;static struct mtd_partition h3xxx_partitions[] = {	{		name:		"H3XXX boot firmware",#ifndef CONFIG_LAB		size:		0x00040000,#else		size:		0x00080000,#endif		offset:		0,#ifndef CONFIG_LAB		mask_flags:	MTD_WRITEABLE,  /* force read-only */#endif	}, 	{		name:		"H3XXX root jffs2",#ifndef CONFIG_LAB		size:		0x2000000 - 2*0x40000, /* Warning, this is fixed later */		offset:		0x00040000,#else		size:		0x2000000 - 0x40000 - 0x80000, /* Warning, this is fixed later */		offset:		0x00080000,#endif	},	{		name:		"asset",		size:		0x40000,		offset:		0x2000000 - 0x40000, /* Warning, this is fixed later */		mask_flags:	MTD_WRITEABLE,  /* force read-only */	}};#ifndef CONFIG_MTD_CONCATstatic struct mtd_partition h3xxx_partitions_bank2[] = {	/* this is used only on 2 CS machines when concat is not present */	{		name:		"second H3XXX root jffs2",		size:		0x1000000 - 0x40000, /* Warning, this is fixed later */		offset:		0x00000000,	},	{		name:		"second asset",		size:		0x40000,		offset:		0x1000000 - 0x40000, /* Warning, this is fixed later */		mask_flags:	MTD_WRITEABLE,  /* force read-only */	}};#endifstatic spinlock_t ipaq_vpp_lock = SPIN_LOCK_UNLOCKED;static void h3xxx_set_vpp(struct map_info *map, int vpp){	static int nest = 0;		spin_lock(&ipaq_vpp_lock);	if (vpp)		nest++;	else		nest--;	if (nest)		assign_h3600_egpio(IPAQ_EGPIO_VPP_ON, 1);	else		assign_h3600_egpio(IPAQ_EGPIO_VPP_ON, 0);	spin_unlock(&ipaq_vpp_lock);}#endif#if defined(CONFIG_SA1100_JORNADA56X) || defined(CONFIG_SA1100_JORNADA720)static unsigned long jornada_max_flash_size = 0x02000000;static struct mtd_partition jornada_partitions[] = {	{		name:		"Jornada boot firmware",		size:		0x00040000,		offset:		0,		mask_flags:	MTD_WRITEABLE,  /* force read-only */	}, {		name:		"Jornada root jffs2",		size:		MTDPART_SIZ_FULL,		offset:		0x00040000,	}};#endifstatic struct mtd_partition *parsed_parts;static struct mtd_info *mymtd;static unsigned long cs_phys[] = {#ifdef CONFIG_ARCH_SA1100	SA1100_CS0_PHYS,	SA1100_CS1_PHYS,	SA1100_CS2_PHYS,	SA1100_CS3_PHYS,	SA1100_CS4_PHYS,	SA1100_CS5_PHYS,#else 	PXA_CS0_PHYS,	PXA_CS1_PHYS,	PXA_CS2_PHYS,	PXA_CS3_PHYS,	PXA_CS4_PHYS,	PXA_CS5_PHYS,#endif};static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };static int __init h1900_special_case(void);int __init ipaq_mtd_init(void){	struct mtd_partition *parts = NULL;	int nb_parts = 0;	int parsed_nr_parts = 0;	const char *part_type;	int i; /* used when we have >1 flash chips */	unsigned long tot_flashsize = 0; /* used when we have >1 flash chips */	/* Default flash bankwidth */	// ipaq_map.bankwidth = (MSC0 & MSC_RBW) ? 2 : 4;		if (machine_is_h1900())	{		/* For our intents, the h1900 is not a real iPAQ, so we special-case it. */		return h1900_special_case();	}	if (machine_is_h3100() || machine_is_h1900())		for(i=0; i<MAX_IPAQ_CS; i++)			ipaq_map[i].bankwidth = 2;	else		for(i=0; i<MAX_IPAQ_CS; i++)			ipaq_map[i].bankwidth = 4;				/*	 * Static partition definition selection	 */	part_type = "static";	simple_map_init(&ipaq_map[0]);	simple_map_init(&ipaq_map[1]);#ifdef CONFIG_IPAQ_HANDHELD	if (machine_is_ipaq()) {		parts = h3xxx_partitions;		nb_parts = ARRAY_SIZE(h3xxx_partitions);		for(i=0; i<MAX_IPAQ_CS; i++) {			ipaq_map[i].size = h3xxx_max_flash_size;			ipaq_map[i].set_vpp = h3xxx_set_vpp;			ipaq_map[i].phys = cs_phys[i];			ipaq_map[i].virt = (void __iomem *)__ioremap(cs_phys[i], 0x04000000, 0, 1);			if (machine_is_h3100 () || machine_is_h1900())				ipaq_map[i].bankwidth = 2;		}		if (machine_is_h3600()) {			/* No asset partition here */			h3xxx_partitions[1].size += 0x40000;			nb_parts--;		}	}#endif#ifdef CONFIG_ARCH_H5400	if (machine_is_h5400()) {		ipaq_map[0].size = 0x02000000;		ipaq_map[1].size = 0x02000000;		ipaq_map[1].phys = 0x02000000;		ipaq_map[1].virt = ipaq_map[0].virt + 0x02000000;	}#endif#ifdef CONFIG_ARCH_H1900	if (machine_is_h1900()) {		ipaq_map[0].size = 0x00400000;		ipaq_map[1].size = 0x02000000;		ipaq_map[1].phys = 0x00080000;		ipaq_map[1].virt = ipaq_map[0].virt + 0x00080000;	}#endif#ifdef CONFIG_SA1100_JORNADA56X	if (machine_is_jornada56x()) {		parts = jornada_partitions;		nb_parts = ARRAY_SIZE(jornada_partitions);		ipaq_map[0].size = jornada_max_flash_size;		ipaq_map[0].set_vpp = jornada56x_set_vpp;		ipaq_map[0].virt = (__u32)__ioremap(0x0, 0x04000000, 0, 1);	}#endif#ifdef CONFIG_SA1100_JORNADA720	if (machine_is_jornada720()) {		parts = jornada_partitions;		nb_parts = ARRAY_SIZE(jornada_partitions);		ipaq_map[0].size = jornada_max_flash_size;		ipaq_map[0].set_vpp = jornada720_set_vpp;	}#endif	if (machine_is_ipaq()) { /* for iPAQs only */		for(i=0; i<MAX_IPAQ_CS; i++) {			printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with CFI.\n", ipaq_map[i].bankwidth*8, ipaq_map[i].virt);			my_sub_mtd[i] = do_map_probe("cfi_probe", &ipaq_map[i]);			if (!my_sub_mtd[i]) {				printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with JEDEC.\n", ipaq_map[i].bankwidth*8, ipaq_map[i].virt);				my_sub_mtd[i] = do_map_probe("jedec_probe", &ipaq_map[i]);			}			if (!my_sub_mtd[i]) {				printk(KERN_NOTICE "iPAQ flash: failed to find flash.\n");				if (i)					break;				else					return -ENXIO;			} else				printk(KERN_NOTICE "iPAQ flash: found %d bytes\n", my_sub_mtd[i]->size);						/* do we really need this debugging? --joshua 20030703 */			// printk("my_sub_mtd[%d]=%p\n", i, my_sub_mtd[i]);			my_sub_mtd[i]->owner = THIS_MODULE;			tot_flashsize += my_sub_mtd[i]->size;		}#ifdef CONFIG_MTD_CONCAT		/* fix the asset location */#	ifdef CONFIG_LAB		h3xxx_partitions[1].size = tot_flashsize - 0x40000 - 0x80000 /* extra big boot block */;#	else		h3xxx_partitions[1].size = tot_flashsize - 2 * 0x40000;#	endif		h3xxx_partitions[2].offset = tot_flashsize - 0x40000;		/* and concat the devices */		mymtd = mtd_concat_create(&my_sub_mtd[0], i,					  "ipaq");		if (!mymtd) {			printk("Cannot create iPAQ concat device\n");			return -ENXIO;		}#else		mymtd = my_sub_mtd[0];		/* 		 *In the very near future, command line partition parsing		 * will use the device name as 'mtd-id' instead of a value		 * passed to the parse_cmdline_partitions() routine. Since		 * the bootldr says 'ipaq', make sure it continues to work. 		 */		mymtd->name = "ipaq";		if ((machine_is_h3600())) {#	ifdef CONFIG_LAB			h3xxx_partitions[1].size = my_sub_mtd[0]->size - 0x80000;#	else			h3xxx_partitions[1].size = my_sub_mtd[0]->size - 0x40000;#	endif			nb_parts = 2;		} else {#	ifdef CONFIG_LAB			h3xxx_partitions[1].size = my_sub_mtd[0]->size - 0x40000 - 0x80000; /* extra big boot block */#	else			h3xxx_partitions[1].size = my_sub_mtd[0]->size - 2*0x40000;#	endif			h3xxx_partitions[2].offset = my_sub_mtd[0]->size - 0x40000;		}		if (my_sub_mtd[1]) {#	ifdef CONFIG_LAB			h3xxx_partitions_bank2[0].size = my_sub_mtd[1]->size - 0x80000;#	else			h3xxx_partitions_bank2[0].size = my_sub_mtd[1]->size - 0x40000;#	endif			h3xxx_partitions_bank2[1].offset = my_sub_mtd[1]->size - 0x40000;		}#endif	}	else {		/*		 * Now let's probe for the actual flash.  Do it here since		 * specific machine settings might have been set above.		 */		printk(KERN_NOTICE "IPAQ flash: probing %d-bit flash bus, window=%lx\n", ipaq_map[0].bankwidth*8, ipaq_map[0].virt);		mymtd = do_map_probe("cfi_probe", &ipaq_map[0]);		if (!mymtd)			return -ENXIO;		mymtd->owner = THIS_MODULE;	}	/*	 * Dynamic partition selection stuff (might override the static ones)	 */	 i = parse_mtd_partitions(mymtd, part_probes, &parsed_parts, 0);				 if (i > 0) {		 nb_parts = parsed_nr_parts = i;		 parts = parsed_parts;		 part_type = "dynamic";	 }	 if (!parts) {		 printk(KERN_NOTICE "IPAQ flash: no partition info available, registering whole flash at once\n");		 add_mtd_device(mymtd);#ifndef CONFIG_MTD_CONCAT		 if (my_sub_mtd[1])			 add_mtd_device(my_sub_mtd[1]);#endif	 } else {		 printk(KERN_NOTICE "Using %s partition definition\n", part_type);		 add_mtd_partitions(mymtd, parts, nb_parts);#ifndef CONFIG_MTD_CONCAT		 if (my_sub_mtd[1])			 add_mtd_partitions(my_sub_mtd[1], h3xxx_partitions_bank2, ARRAY_SIZE(h3xxx_partitions_bank2));#endif	 }	 return 0;}static void __exit ipaq_mtd_cleanup(void){	int i;	if (mymtd) {		del_mtd_partitions(mymtd);#ifndef CONFIG_MTD_CONCAT		if (my_sub_mtd[1])			del_mtd_partitions(my_sub_mtd[1]);#endif		map_destroy(mymtd);#ifdef CONFIG_MTD_CONCAT		for(i=0; i<MAX_IPAQ_CS; i++) #else			for(i=1; i<MAX_IPAQ_CS; i++) #endif		  			{				if (my_sub_mtd[i])					map_destroy(my_sub_mtd[i]);			}		if (parsed_parts)			kfree(parsed_parts);	}}static int __init h1900_special_case(void){	/* The iPAQ h1900 is a special case - it has weird ROM. */	simple_map_init(&ipaq_map[0]);	ipaq_map[0].size = 0x80000;	ipaq_map[0].set_vpp = h3xxx_set_vpp;	ipaq_map[0].phys = 0x0;	ipaq_map[0].virt = (void __iomem *)__ioremap(0x0, 0x04000000, 0, 1);	ipaq_map[0].bankwidth = 2;		printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with JEDEC.\n", ipaq_map[0].bankwidth*8, ipaq_map[0].virt);	mymtd = do_map_probe("jedec_probe", &ipaq_map[0]);	if (!mymtd)		return -ENODEV;	add_mtd_device(mymtd);	printk(KERN_NOTICE "iPAQ flash: registered h1910 flash\n");		return 0;}module_init(ipaq_mtd_init);module_exit(ipaq_mtd_cleanup);MODULE_AUTHOR("Jamey Hicks");MODULE_DESCRIPTION("IPAQ CFI map driver");MODULE_LICENSE("MIT");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品中文字幕乱码三区| 国产一区二区三区免费在线观看| 777a∨成人精品桃花网| av在线综合网| 久久综合狠狠综合| 毛片av中文字幕一区二区| 欧美日韩一本到| 亚洲高清视频在线| 久久久噜噜噜久噜久久综合| 青青国产91久久久久久| 欧洲国内综合视频| 亚洲综合激情网| 在线视频国产一区| 亚洲国产精品一区二区www| 色综合久久久久综合99| 色婷婷一区二区三区四区| 欧美色图激情小说| 成人自拍视频在线观看| 国产精品一区一区三区| 欧美国产日韩亚洲一区| 在线亚洲高清视频| 久久99精品国产.久久久久久| 91精品国产综合久久久久| 亚洲超碰精品一区二区| 日韩欧美不卡在线观看视频| 91视频免费观看| 亚洲日穴在线视频| 欧美人牲a欧美精品| 粉嫩av一区二区三区在线播放 | 在线电影院国产精品| 一区二区三区四区激情 | 91视视频在线直接观看在线看网页在线看 | 久久se精品一区精品二区| 日韩欧美国产不卡| 国产成人免费av在线| 亚洲精品一区二区精华| 777奇米四色成人影色区| 久久99国产精品久久| 亚洲天堂av一区| 精品欧美一区二区在线观看| 日本乱人伦aⅴ精品| 成人va在线观看| 成人午夜电影网站| 丰满亚洲少妇av| 国产精品一区专区| 国产激情91久久精品导航| 免费欧美高清视频| 美女视频一区在线观看| 日韩电影在线观看一区| 婷婷成人综合网| 久久精品国产99久久6| 日韩高清不卡在线| 日本成人中文字幕在线视频| 国产成人亚洲精品狼色在线| 亚洲黄网站在线观看| 91精品福利在线一区二区三区 | 国产精品久久久久久亚洲毛片| 欧美精品一区二区三区高清aⅴ| 日韩一级片在线观看| 欧美精品一区二区三区久久久 | 欧美日韩国产系列| 91精品久久久久久久91蜜桃| 91精品国产综合久久婷婷香蕉 | 久久9热精品视频| 国产一本一道久久香蕉| 成人精品免费看| 欧美亚洲综合一区| 国产综合久久久久影院| 久久久久高清精品| 欧美一区二区三区性视频| 精品三级在线观看| 亚洲夂夂婷婷色拍ww47 | av在线不卡免费看| 91豆麻精品91久久久久久| 精品国产青草久久久久福利| 18欧美乱大交hd1984| 麻豆精品在线看| 91色乱码一区二区三区| 精品久久久久久久久久久久包黑料| 国产精品美女久久久久aⅴ| 日韩不卡一区二区三区| 99精品视频免费在线观看| 成人动漫一区二区| 成人av网站免费| 日本乱码高清不卡字幕| 欧美日韩国产电影| 成人精品免费网站| av一区二区三区在线| 成人动漫视频在线| 99精品热视频| 欧美日韩一区二区在线视频| 91国内精品野花午夜精品| 欧美日韩一区二区在线观看视频 | 亚洲四区在线观看| 一区二区三区自拍| 日韩成人精品在线观看| 国产在线播放一区二区三区| 粉嫩蜜臀av国产精品网站| 色综合天天性综合| 国产午夜精品福利| 亚洲精品欧美激情| 亚洲一级二级三级在线免费观看| 亚洲视频一区二区在线观看| 亚洲精品日韩专区silk| 亚洲精品美腿丝袜| 国产成人午夜视频| 欧美视频中文字幕| 久久久久久黄色| 三级在线观看一区二区| 免费成人在线网站| 欧美日韩成人综合天天影院 | 中文字幕一区二区三区在线不卡 | 国产精品一二三四区| 日韩一级片网站| 亚洲色图在线视频| 国产亚洲视频系列| 久久99精品国产麻豆婷婷洗澡| 高清成人免费视频| 精品少妇一区二区三区免费观看| 亚洲风情在线资源站| 色狠狠色狠狠综合| 中文字幕精品在线不卡| 久久99久久久久久久久久久| 91精品国产综合久久精品图片| 亚洲精品国产精品乱码不99| 国产白丝精品91爽爽久久 | 精品国产乱码久久久久久免费 | 欧美猛男男办公室激情| 亚洲女爱视频在线| 一本大道av伊人久久综合| 亚洲精品老司机| 色999日韩国产欧美一区二区| 久久影音资源网| 国产综合色在线视频区| 国产亚洲欧美日韩日本| 一区二区三区在线不卡| 国产成人午夜99999| 制服丝袜在线91| 中文字幕制服丝袜成人av| 国产91精品露脸国语对白| 精品动漫一区二区三区在线观看| 国产成人久久精品77777最新版本| 亚洲欧洲99久久| 欧美一区二区三区四区视频| 成人97人人超碰人人99| 秋霞午夜av一区二区三区| 久久久99久久| 欧美日韩国产天堂| 97久久精品人人做人人爽| 免费高清视频精品| 亚洲欧美一区二区三区极速播放| 日韩欧美中文一区| 欧美日韩久久一区二区| 顶级嫩模精品视频在线看| 日本最新不卡在线| 国产精品私人影院| 日韩手机在线导航| 精品影院一区二区久久久| 欧美变态口味重另类| 亚洲午夜一二三区视频| 欧美日韩电影在线播放| 99精品欧美一区二区三区小说 | 中文字幕的久久| 欧美巨大另类极品videosbest| 久久精品久久99精品久久| 亚洲综合精品自拍| 国产精品国产自产拍高清av| 91精品国产高清一区二区三区蜜臀| 成人久久久精品乱码一区二区三区 | 国产精品进线69影院| 欧美大片一区二区| 欧美不卡123| 欧美日韩国产另类一区| 在线亚洲免费视频| 色诱视频网站一区| 91黄色在线观看| 色播五月激情综合网| 成人精品国产免费网站| 9l国产精品久久久久麻豆| 国产sm精品调教视频网站| 国产剧情一区二区三区| 日韩综合在线视频| 蜜臀久久久99精品久久久久久| 日韩中文字幕1| 亚洲香肠在线观看| 亚洲男同1069视频| 亚洲成人你懂的| 日韩成人免费在线| 美女脱光内衣内裤视频久久网站| 精品亚洲porn| 国产激情一区二区三区四区 | 蓝色福利精品导航| 国产裸体歌舞团一区二区| 国产成人综合网站| 成人性生交大片免费看在线播放| 亚洲午夜激情网页| 99精品欧美一区二区三区综合在线| 国产馆精品极品| 在线精品视频一区二区| 欧美成人三级在线|