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

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

?? tqm8xxl.c

?? nandflash k9g808u0a在pxa270的驅動,由于pxa270沒有nandflash接口
?? C
字號:
/* * Handle mapping of the flash memory access routines  * on TQM8xxL based devices. * * $Id: tqm8xxl.c,v 1.2 2007/09/21 03:09:24 quy Exp $ * * based on rpxlite.c * * Copyright(C) 2001 Kirk Lee <kirk@hpc.ee.ntu.edu.tw> * * This code is GPLed *  *//* * According to TQM8xxL hardware manual, TQM8xxL series have * following flash memory organisations: *	| capacity |	| chip type |	| bank0 |	| bank1 | *	    2MiB	   512Kx16	  2MiB		   0 *	    4MiB	   1Mx16	  4MiB		   0 *	    8MiB	   1Mx16	  4MiB		   4MiB * Thus, we choose CONFIG_MTD_CFI_I2 & CONFIG_MTD_CFI_B4 at  * kernel configuration. */#include <linux/config.h>#include <linux/module.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/init.h>#include <asm/io.h>#include <linux/mtd/mtd.h>#include <linux/mtd/map.h>#include <linux/mtd/partitions.h>#define FLASH_ADDR 0x40000000#define FLASH_SIZE 0x00800000#define FLASH_BANK_MAX 4// trivial struct to describe partition informationstruct mtd_part_def{	int nums;	unsigned char *type;	struct mtd_partition* mtd_part;};//static struct mtd_info *mymtd;static struct mtd_info* mtd_banks[FLASH_BANK_MAX];static struct map_info* map_banks[FLASH_BANK_MAX];static struct mtd_part_def part_banks[FLASH_BANK_MAX];static unsigned long num_banks;static unsigned long start_scan_addr;/* * Here are partition information for all known TQM8xxL series 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 correspond to the  * value specified in the mapping definition defined by the * "struct map_desc *_io_desc" for the corresponding machine. */#ifdef CONFIG_MTD_PARTITIONS/* Currently, TQM8xxL has upto 8MiB flash */static unsigned long tqm8xxl_max_flash_size = 0x00800000;/* partition definition for first flash bank * (cf. "drivers/char/flash_config.c") */static struct mtd_partition tqm8xxl_partitions[] = {	{	  .name = "ppcboot",	  .offset = 0x00000000,	  .size = 0x00020000,           /* 128KB           */	  .mask_flags = MTD_WRITEABLE,  /* force read-only */	},	{	  .name = "kernel",             /* default kernel image */	  .offset = 0x00020000,	  .size = 0x000e0000,	  .mask_flags = MTD_WRITEABLE,  /* force read-only */	},	{	  .name = "user",	  .offset = 0x00100000,	  .size = 0x00100000,	},	{	  .name = "initrd",	  .offset = 0x00200000,	  .size = 0x00200000,	}};/* partition definition for second flash bank */static struct mtd_partition tqm8xxl_fs_partitions[] = {	{	  .name = "cramfs",	  .offset = 0x00000000,	  .size = 0x00200000,	},	{	  .name = "jffs",	  .offset = 0x00200000,	  .size = 0x00200000,	  //.size = MTDPART_SIZ_FULL,	}};#endifint __init init_tqm_mtd(void){	int idx = 0, ret = 0;	unsigned long flash_addr, flash_size, mtd_size = 0;	/* pointer to TQM8xxL board info data */	bd_t *bd = (bd_t *)__res;	flash_addr = bd->bi_flashstart;	flash_size = bd->bi_flashsize;	//request maximum flash size address space	start_scan_addr = (unsigned long)ioremap(flash_addr, flash_size);	if (!start_scan_addr) {		printk(KERN_WARNING "%s:Failed to ioremap address:0x%x\n", __FUNCTION__, flash_addr);		return -EIO;	}	for (idx = 0 ; idx < FLASH_BANK_MAX ; idx++) {		if(mtd_size >= flash_size)			break;				printk(KERN_INFO "%s: chip probing count %d\n", __FUNCTION__, idx);				map_banks[idx] = (struct map_info *)kmalloc(sizeof(struct map_info), GFP_KERNEL);		if(map_banks[idx] == NULL) {			ret = -ENOMEM;			/* FIXME: What if some MTD devices were probed already? */			goto error_mem;		}		memset((void *)map_banks[idx], 0, sizeof(struct map_info));		map_banks[idx]->name = (char *)kmalloc(16, GFP_KERNEL);		if (!map_banks[idx]->name) {			ret = -ENOMEM;			/* FIXME: What if some MTD devices were probed already? */			goto error_mem;		}		sprintf(map_banks[idx]->name, "TQM8xxL%d", idx);		map_banks[idx]->size = flash_size;		map_banks[idx]->bankwidth = 4;		simple_map_init(map_banks[idx]);		map_banks[idx]->virt = start_scan_addr;		map_banks[idx]->phys = flash_addr;		/* FIXME: This looks utterly bogus, but I'm trying to		   preserve the behaviour of the original (shown here)...		map_banks[idx]->map_priv_1 =		start_scan_addr + ((idx > 0) ?		(mtd_banks[idx-1] ? mtd_banks[idx-1]->size : 0) : 0);		*/		if (idx && mtd_banks[idx-1]) {			map_banks[idx]->virt += mtd_banks[idx-1]->size;			map_banks[idx]->phys += mtd_banks[idx-1]->size;		}		//start to probe flash chips		mtd_banks[idx] = do_map_probe("cfi_probe", map_banks[idx]);		if (mtd_banks[idx]) {			mtd_banks[idx]->owner = THIS_MODULE;			mtd_size += mtd_banks[idx]->size;			num_banks++;			printk(KERN_INFO "%s: bank%d, name:%s, size:%dbytes \n", __FUNCTION__, num_banks, 			mtd_banks[idx]->name, mtd_banks[idx]->size);		}	}	/* no supported flash chips found */	if (!num_banks) {		printk(KERN_NOTICE "TQM8xxL: No support flash chips found!\n");		ret = -ENXIO;		goto error_mem;	}#ifdef CONFIG_MTD_PARTITIONS	/*	 * Select Static partition definitions	 */	part_banks[0].mtd_part = tqm8xxl_partitions;	part_banks[0].type = "Static image";	part_banks[0].nums = ARRAY_SIZE(tqm8xxl_partitions);	part_banks[1].mtd_part = tqm8xxl_fs_partitions;	part_banks[1].type = "Static file system";	part_banks[1].nums = ARRAY_SIZE(tqm8xxl_fs_partitions);	for(idx = 0; idx < num_banks ; idx++) {		if (part_banks[idx].nums == 0) {			printk(KERN_NOTICE "TQM flash%d: no partition info available, registering whole flash at once\n", idx);			add_mtd_device(mtd_banks[idx]);		} else {			printk(KERN_NOTICE "TQM flash%d: Using %s partition definition\n",					idx, part_banks[idx].type);			add_mtd_partitions(mtd_banks[idx], part_banks[idx].mtd_part, 								part_banks[idx].nums);		}	}#else	printk(KERN_NOTICE "TQM flash: registering %d whole flash banks at once\n", num_banks);	for(idx = 0 ; idx < num_banks ; idx++)		add_mtd_device(mtd_banks[idx]);#endif	return 0;error_mem:	for(idx = 0 ; idx < FLASH_BANK_MAX ; idx++) {		if(map_banks[idx] != NULL) {			if(map_banks[idx]->name != NULL) {				kfree(map_banks[idx]->name);				map_banks[idx]->name = NULL;			}			kfree(map_banks[idx]);			map_banks[idx] = NULL;		}	}error:	iounmap((void *)start_scan_addr);	return ret;}static void __exit cleanup_tqm_mtd(void){	unsigned int idx = 0;	for(idx = 0 ; idx < num_banks ; idx++) {		/* destroy mtd_info previously allocated */		if (mtd_banks[idx]) {			del_mtd_partitions(mtd_banks[idx]);			map_destroy(mtd_banks[idx]);		}		/* release map_info not used anymore */		kfree(map_banks[idx]->name);		kfree(map_banks[idx]);	}	if (start_scan_addr) {		iounmap((void *)start_scan_addr);		start_scan_addr = 0;	}}module_init(init_tqm_mtd);module_exit(cleanup_tqm_mtd);MODULE_LICENSE("GPL");MODULE_AUTHOR("Kirk Lee <kirk@hpc.ee.ntu.edu.tw>");MODULE_DESCRIPTION("MTD map driver for TQM8xxL boards");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线视频国内自拍亚洲视频| 9色porny自拍视频一区二区| 亚洲国产精品二十页| 欧洲在线/亚洲| 国产一区二区三区视频在线播放| 综合色天天鬼久久鬼色| 日韩色在线观看| 日本久久一区二区三区| 久久99国产精品免费网站| 亚洲精品高清在线观看| 国产丝袜欧美中文另类| 3atv一区二区三区| 91黄视频在线| 国产不卡视频一区| 美女网站色91| 亚洲成av人影院在线观看网| 国产精品国产三级国产aⅴ中文| 日韩精品专区在线影院重磅| 欧美色涩在线第一页| 91网站最新网址| 国产精品88888| 韩国v欧美v日本v亚洲v| 日韩精品亚洲一区| 亚洲已满18点击进入久久| 国产精品毛片大码女人| 久久欧美中文字幕| 日韩一级二级三级| 欧美狂野另类xxxxoooo| 一本久久a久久精品亚洲| 成人激情黄色小说| 国产二区国产一区在线观看| 免费人成在线不卡| 日产欧产美韩系列久久99| 亚洲成人激情自拍| 亚洲电影你懂得| 亚洲伊人色欲综合网| 一区二区三区产品免费精品久久75| 国产精品视频免费| 欧美国产日韩一二三区| 中文字幕av免费专区久久| 亚洲国产人成综合网站| 亚洲欧美成aⅴ人在线观看| 国产精品伦理在线| 国产精品女同一区二区三区| 国产日韩欧美a| 国产精品麻豆一区二区| 日韩一区日韩二区| 亚洲精品高清在线| 亚洲午夜国产一区99re久久| 亚洲高清在线精品| 日韩精品欧美成人高清一区二区| 五月天欧美精品| 日韩国产一区二| 久久精品国产亚洲5555| 国产精品亚洲专一区二区三区 | 成人午夜免费av| 国产传媒日韩欧美成人| 成人免费高清在线观看| 97se亚洲国产综合自在线不卡| 9i看片成人免费高清| 色综合一个色综合| 欧美日韩国产综合一区二区三区 | 欧美一区二区三区精品| 日韩亚洲欧美高清| 久久众筹精品私拍模特| 国产欧美日韩不卡免费| 亚洲人成小说网站色在线 | 日韩一区二区三免费高清| 91精品国产综合久久久久| 精品国产在天天线2019| 中文字幕av一区 二区| 亚洲综合一区二区| 日本欧美肥老太交大片| 国产精选一区二区三区| 一本一本大道香蕉久在线精品| 欧美调教femdomvk| 欧美变态凌虐bdsm| 一色屋精品亚洲香蕉网站| 亚洲第一在线综合网站| 国内成人免费视频| 99在线精品视频| 在线播放91灌醉迷j高跟美女 | 亚洲精品视频观看| 久久爱www久久做| 国产乱码一区二区三区| 91国偷自产一区二区三区观看| 555夜色666亚洲国产免| 久久精品水蜜桃av综合天堂| 亚洲乱码中文字幕综合| 久久国产乱子精品免费女| 成人一区二区视频| 欧美喷水一区二区| 久久精品一区八戒影视| 一区二区免费看| 精品亚洲aⅴ乱码一区二区三区| 菠萝蜜视频在线观看一区| 欧美日韩国产在线观看| 午夜av电影一区| 国产不卡在线播放| 欧美一二三区在线| 亚洲丝袜美腿综合| 紧缚奴在线一区二区三区| 一本久久综合亚洲鲁鲁五月天| 日韩久久久久久| 亚洲欧美日韩精品久久久久| 国产在线播放一区| 欧美精品在欧美一区二区少妇| 国产精品无码永久免费888| 日韩电影一区二区三区| 色综合激情五月| 国产午夜精品在线观看| 日韩国产高清影视| 91久色porny | 一本大道久久a久久精品综合| 日韩美女视频在线| 午夜精品aaa| 91麻豆国产精品久久| 日本一区二区免费在线观看视频| 日本三级韩国三级欧美三级| 色噜噜夜夜夜综合网| 国产三级一区二区| 亚洲乱码精品一二三四区日韩在线| 福利一区二区在线观看| 日韩精品影音先锋| 肉肉av福利一精品导航| 色婷婷亚洲精品| 亚洲欧美在线视频观看| 国产.精品.日韩.另类.中文.在线.播放 | 亚洲免费在线视频| 成人性生交大片免费看在线播放| 精品国产亚洲在线| 男人的天堂久久精品| 51精品秘密在线观看| 日本视频一区二区三区| 欧美高清你懂得| 午夜精品一区二区三区免费视频| heyzo一本久久综合| 国产精品丝袜黑色高跟| 成人黄色大片在线观看| 国产精品欧美一区喷水| 国产伦精品一区二区三区视频青涩| 欧美电视剧免费全集观看| 男人的天堂久久精品| 精品久久久久久久一区二区蜜臀| 青青草97国产精品免费观看无弹窗版| 欧美亚洲动漫精品| 午夜久久久久久久久久一区二区| 欧美日韩在线不卡| 午夜成人免费电影| 久久视频一区二区| 蜜桃久久精品一区二区| 精品视频在线免费| 亚洲一二三级电影| 欧美日韩成人在线| 日韩精品高清不卡| 欧美日韩在线三区| 午夜精品成人在线视频| 99久久精品久久久久久清纯| 一区二区高清免费观看影视大全| 日韩欧美色电影| 91蜜桃免费观看视频| 免费高清不卡av| 最近中文字幕一区二区三区| 91精品一区二区三区在线观看| 丁香婷婷综合网| 日韩在线一区二区三区| 中文成人av在线| 欧美一区二区三区成人| 99精品一区二区三区| 美女www一区二区| 一区二区三区四区在线免费观看 | 精品视频一区 二区 三区| 国产91精品在线观看| 偷拍亚洲欧洲综合| 中文字幕中文字幕一区二区| 欧美一级二级在线观看| 99r国产精品| 国产一区二区福利| 日韩精彩视频在线观看| 亚洲婷婷综合久久一本伊一区| 精品国产3级a| 欧美日韩三级一区| zzijzzij亚洲日本少妇熟睡| 久久福利资源站| 日欧美一区二区| 一级精品视频在线观看宜春院| 久久久蜜桃精品| 日韩午夜激情电影| 欧美日韩中文一区| 91免费国产视频网站| 成人黄色免费短视频| 国产在线播放一区| 精品一区二区三区在线观看| 图片区小说区区亚洲影院| 亚洲视频精选在线| 亚洲国产精品v| 中日韩免费视频中文字幕| 久久蜜臀精品av| 精品福利一二区| 日韩欧美国产精品一区|