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

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

?? ipaq-flash.c

?? nandflash k9g808u0a在pxa270的驅動,由于pxa270沒有nandflash接口
?? 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 2007/09/21 03:09:24 quy 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 = (__u32)__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 = (__u32)__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一区二区三区免费野_久草精品视频
国产成人精品免费视频网站| 日韩一级视频免费观看在线| 日韩亚洲欧美成人一区| 精品少妇一区二区三区视频免付费 | 国产99久久精品| 在线亚洲一区二区| 日本一区二区在线不卡| 美女脱光内衣内裤视频久久网站| 99国内精品久久| 精品国产乱码久久久久久浪潮 | 久久久久99精品国产片| 日韩中文字幕一区二区三区| 99久久99久久久精品齐齐| 欧美一区二区在线免费播放| 一区二区视频在线| av福利精品导航| 国产三级精品视频| 久久av资源网| 日韩一区二区免费在线电影| 亚洲一二三专区| 日本高清不卡视频| 国产精品麻豆一区二区| 国产jizzjizz一区二区| 久久久国产午夜精品| 精品一区二区三区在线观看| 欧美日韩精品福利| 亚洲一本大道在线| 欧美亚洲综合一区| 亚洲一区av在线| 在线观看网站黄不卡| 亚洲黄色小视频| 欧美在线短视频| 亚洲一级在线观看| 欧美日韩激情在线| 亚洲国产欧美日韩另类综合| 欧美偷拍一区二区| 亚洲国产日韩在线一区模特| 欧美日本一区二区| 日韩av一区二区三区| 91精品欧美久久久久久动漫| 三级欧美韩日大片在线看| 日韩欧美专区在线| 久久99国产精品久久99| 久久久电影一区二区三区| 成人免费看黄yyy456| 亚洲欧美视频一区| 欧美日韩激情一区| 久久99最新地址| 中文字幕亚洲精品在线观看| 色综合久久综合中文综合网| 亚洲综合精品久久| 欧美电视剧在线观看完整版| 国产丶欧美丶日本不卡视频| 亚洲蜜臀av乱码久久精品| 欧美日韩一区二区不卡| 麻豆精品视频在线| 中文字幕av在线一区二区三区| 色综合一区二区三区| 五月婷婷色综合| 久久午夜免费电影| 91猫先生在线| 日本女优在线视频一区二区 | 美女视频网站黄色亚洲| 国产精品网站一区| 欧美视频一区二区在线观看| 久久国产麻豆精品| 亚洲欧美一区二区视频| 欧美日韩国产免费| 国产v综合v亚洲欧| 丝袜美腿亚洲一区| 欧美国产精品一区| 7777精品伊人久久久大香线蕉最新版 | 综合色中文字幕| 欧美一区二区视频在线观看2022| 国产精品亚洲成人| 亚洲成av人片在线| 国产精品免费视频观看| 制服丝袜av成人在线看| 高清在线不卡av| 日韩精品一二区| 亚洲三级理论片| 久久久亚洲精品石原莉奈| 欧美亚洲国产一区二区三区va | 亚洲不卡在线观看| 国产精品嫩草影院av蜜臀| 日韩免费电影一区| 91麻豆免费在线观看| 国产一区二区三区在线观看免费| 一区二区三区国产豹纹内裤在线| 久久九九久久九九| 欧美精品久久一区二区三区| 成人黄页在线观看| 国产在线精品一区在线观看麻豆| 一区二区三区四区不卡在线| 久久日一线二线三线suv| 欧美久久婷婷综合色| 91视频免费播放| 成人性生交大片| 极品少妇xxxx精品少妇| 青青青伊人色综合久久| 亚洲综合精品久久| 亚洲自拍另类综合| 亚洲欧美日韩综合aⅴ视频| 国产精品天干天干在观线| 精品免费国产一区二区三区四区| 欧美精品三级日韩久久| 欧洲精品中文字幕| 色八戒一区二区三区| 成人蜜臀av电影| 成人a区在线观看| 福利一区福利二区| 成人一区二区三区中文字幕| 韩国欧美国产一区| 狠狠色伊人亚洲综合成人| 激情欧美一区二区三区在线观看| 日韩高清中文字幕一区| 免费在线观看不卡| 久久精品99国产国产精| 人人超碰91尤物精品国产| 日本vs亚洲vs韩国一区三区二区| 日韩高清一级片| 精品一区在线看| 国产精品一区在线观看乱码 | 亚洲国产成人私人影院tom| 国产午夜精品一区二区三区嫩草| 久久精品在线观看| 成人免费小视频| 亚洲激情图片qvod| 日韩国产欧美一区二区三区| 麻豆成人免费电影| 国产a视频精品免费观看| eeuss鲁片一区二区三区在线观看| 99久久综合色| 欧美日韩精品欧美日韩精品一| 日韩欧美视频在线| 国产亚洲人成网站| 亚洲人妖av一区二区| 亚洲成a人v欧美综合天堂下载 | 日韩精品免费视频人成| 久国产精品韩国三级视频| 国产v日产∨综合v精品视频| 日本久久一区二区三区| 欧美顶级少妇做爰| 久久精品人人爽人人爽| 亚洲欧美日韩久久| 午夜电影久久久| 国产精品自在在线| 精品视频色一区| 2024国产精品| 亚洲综合自拍偷拍| 精品一二三四区| 91小视频在线免费看| 日韩视频一区在线观看| 国产精品欧美经典| 午夜一区二区三区在线观看| 国产一区二区三区综合| 日本道精品一区二区三区 | 日本免费新一区视频| 国产不卡视频在线观看| 欧美日韩国产色站一区二区三区| 国产欧美日韩麻豆91| 五月综合激情网| 91麻豆精品在线观看| 日韩精品中午字幕| 一区二区三区免费| 国产成人精品亚洲日本在线桃色 | 99久久er热在这里只有精品15 | 国产在线精品一区在线观看麻豆| 97精品超碰一区二区三区| 日韩三级伦理片妻子的秘密按摩| 一区二区三区四区在线播放 | 欧美男女性生活在线直播观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 国产欧美日韩不卡免费| 青草av.久久免费一区| 91网页版在线| 久久精品夜夜夜夜久久| 蜜臀av性久久久久蜜臀av麻豆| 色婷婷av一区二区三区之一色屋| 久久久亚洲欧洲日产国码αv| 日韩精品一二三区| 精品视频1区2区| 最新国产の精品合集bt伙计| 国产成人精品一区二区三区四区| 日韩欧美国产成人一区二区| 亚洲午夜一二三区视频| 色久优优欧美色久优优| 中文字幕中文字幕中文字幕亚洲无线| 久久精品国产网站| 4438成人网| 日本视频一区二区| 欧美男生操女生| 视频精品一区二区| 91精品国产色综合久久不卡电影 | 日韩精品一区二区在线| 午夜精品久久久久久久久久久 | 美女被吸乳得到大胸91| 欧美肥妇毛茸茸| 日本午夜一区二区| 精品日韩成人av|