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

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

?? ipaq-flash.c

?? 基于linux-2.6.28的mtd驅(qū)動(dòng)
?? 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 */#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 <mach/hardware.h>#include <mach/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 DEFINE_SPINLOCK(ipaq_vpp_lock);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 = ioremap(cs_phys[i], 0x04000000);			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);	}#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]);			}		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 = ioremap(0x0, 0x04000000);	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");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
东方aⅴ免费观看久久av| 91国偷自产一区二区三区成为亚洲经典| 黄色小说综合网站| 97se狠狠狠综合亚洲狠狠| 日韩免费高清av| 亚洲福利视频一区| 99久久伊人网影院| 久久久www成人免费无遮挡大片| 性做久久久久久免费观看| 91视频在线看| 日本一区二区久久| 激情久久五月天| 欧美一区二区精品久久911| 亚洲影视资源网| 91麻豆精品视频| 国产精品久久久久7777按摩 | 欧美大片拔萝卜| 亚洲成va人在线观看| 91美女视频网站| 亚洲天堂网中文字| 不卡在线观看av| 欧美国产禁国产网站cc| 国产乱子伦一区二区三区国色天香| 欧美一区二区视频在线观看2020 | 亚洲欧美成人一区二区三区| 高清在线观看日韩| 久久亚洲私人国产精品va媚药| 日本不卡视频在线| 3751色影院一区二区三区| 亚洲国产婷婷综合在线精品| 在线免费观看一区| 依依成人综合视频| 在线观看欧美精品| 亚洲综合男人的天堂| 色吧成人激情小说| 亚洲在线免费播放| 欧美日韩久久不卡| 天天做天天摸天天爽国产一区| 欧美日韩国产美女| 婷婷中文字幕综合| 在线综合视频播放| 日本不卡高清视频| 精品久久国产老人久久综合| 国产在线视频一区二区| 国产欧美精品一区aⅴ影院| 国产999精品久久久久久| 中文字幕亚洲在| 色婷婷精品大在线视频| 亚洲一区二区三区四区五区中文| 欧美系列一区二区| 日韩激情av在线| 精品日韩在线观看| 国产成人av资源| 综合色中文字幕| 在线精品视频一区二区| 天堂av在线一区| 欧美videofree性高清杂交| 韩国精品主播一区二区在线观看| 国产喂奶挤奶一区二区三区| gogogo免费视频观看亚洲一| 亚洲欧洲综合另类| 欧美美女一区二区在线观看| 久久97超碰色| 国产精品人人做人人爽人人添| 91丨国产丨九色丨pron| 亚洲午夜精品一区二区三区他趣| 在线成人免费观看| 蜜桃av一区二区| 欧美激情一区三区| 欧美伊人久久久久久久久影院| 日本va欧美va精品发布| 国产夜色精品一区二区av| 91玉足脚交白嫩脚丫在线播放| 亚洲成av人片观看| 2欧美一区二区三区在线观看视频| 成人免费观看视频| 亚洲大尺度视频在线观看| 日韩精品一区二区三区中文不卡| 成人一级黄色片| 亚洲国产精品久久不卡毛片| 久久影院视频免费| 色婷婷久久综合| 久久99久久久欧美国产| 中文字幕一区二区三区不卡 | 国产精品一卡二卡在线观看| 亚洲免费大片在线观看| 制服丝袜一区二区三区| 丁香亚洲综合激情啪啪综合| 亚洲一区二区三区四区五区中文| 精品国产伦理网| 色哟哟一区二区三区| 极品少妇xxxx精品少妇| 亚洲精品欧美综合四区| 日韩欧美激情在线| 色老综合老女人久久久| 精品午夜久久福利影院| 亚洲黄色在线视频| wwww国产精品欧美| 欧美色图天堂网| 懂色av一区二区在线播放| 丝袜美腿一区二区三区| 国产精品福利在线播放| 欧美一级视频精品观看| 日本黄色一区二区| 国产很黄免费观看久久| 日韩激情av在线| 亚洲精品中文字幕乱码三区| 精品国产乱码久久久久久免费 | 国产高清不卡一区| 视频一区欧美精品| 亚洲视频香蕉人妖| 久久网站最新地址| 777a∨成人精品桃花网| 91论坛在线播放| 国产91对白在线观看九色| 日本不卡一二三区黄网| 亚洲一区二区影院| 国产精品久久精品日日| 26uuu亚洲综合色欧美| 欧美久久久久久久久久| 91丨九色丨蝌蚪富婆spa| 国产suv精品一区二区三区| 久久99最新地址| 偷拍日韩校园综合在线| 一区二区三区在线视频免费| 国产精品午夜电影| 久久综合九色综合97婷婷女人 | 狠狠久久亚洲欧美| 婷婷成人激情在线网| 一区二区免费在线播放| 国产精品久久久久aaaa樱花 | 欧美日韩三级一区| 色综合久久久久综合| 国产999精品久久| 国产乱码精品一区二区三区av| 轻轻草成人在线| 天天射综合影视| 亚洲国产精品嫩草影院| 91色视频在线| 成人免费高清视频| 国产精品18久久久久久久网站| 久久国产精品区| 蜜臀av在线播放一区二区三区| 亚洲永久精品国产| 一卡二卡欧美日韩| 亚洲免费观看高清完整| 亚洲久草在线视频| 一区二区三区在线视频观看58| 最新热久久免费视频| 中文字幕亚洲精品在线观看| 国产精品国产三级国产有无不卡| 中文在线一区二区| 国产精品私人自拍| 国产精品美女久久久久aⅴ国产馆| 久久精品亚洲一区二区三区浴池| 久久久青草青青国产亚洲免观| 久久久久久久综合日本| 久久精品男人天堂av| 国产欧美日本一区二区三区| 国产精品网站在线观看| 国产精品久久久久久福利一牛影视 | 色噜噜夜夜夜综合网| 91麻豆视频网站| 在线观看一区日韩| 欧美日韩综合在线| 欧美另类z0zxhd电影| 欧美一区二区三区公司| 欧美精品一区二区三区蜜桃| 国产欧美一区二区三区在线看蜜臀 | 综合中文字幕亚洲| 亚洲精品美国一| 日韩精品电影在线| 久久 天天综合| 高清不卡一区二区| 99久精品国产| 欧美午夜精品免费| 欧美一级淫片007| 国产亚洲精品bt天堂精选| 国产精品毛片久久久久久久| 一区二区三区四区高清精品免费观看| 亚洲一区在线观看免费观看电影高清| 香蕉久久一区二区不卡无毒影院 | 亚洲精品自拍动漫在线| 午夜av一区二区三区| 精品一区二区免费看| 成人午夜激情视频| 欧洲精品视频在线观看| 欧美一区二区三区四区五区| 久草这里只有精品视频| 国产精品亚洲午夜一区二区三区| 成人99免费视频| 欧美理论电影在线| 久久亚洲精品国产精品紫薇| 中文字幕在线不卡视频| 亚洲成人免费视频| 国产一区二区电影| 欧美综合一区二区| 日韩欧美不卡在线观看视频| 国产精品欧美一级免费| 婷婷六月综合亚洲|