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

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

?? nandemul2k.c

?? 優龍2410linux2.6.8內核源代碼
?? C
字號:
/* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * * Copyright (C) 2002-2007 Aleph One Ltd. *   for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning <charles@aleph1.co.uk> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. *//* *  This version hacked for emulating 2kpage NAND for YAFFS2 testing. */#include <linux/config.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/version.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/list.h>#include <linux/fs.h>#include <linux/proc_fs.h>#include <linux/pagemap.h>#include <linux/mtd/mtd.h>#include <linux/interrupt.h>#include <linux/string.h>#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))#include <linux/locks.h>#endif#include <asm/uaccess.h>#include <linux/mtd/mtd.h>#include <linux/mtd/partitions.h>#include <linux/mtd/nand.h>#include "../yaffs_nandemul2k.h"#define ALLOCATE(x) kmalloc(x,GFP_KERNEL)#define FREE(x)     kfree(x)#define NAND_SHIFT      (11)   // Shifter for 2k#define PAGE_DATA_SIZE  (1 << NAND_SHIFT)#define PAGE_SPARE_SIZE (64)#define BLK_SHIFT	6#define PAGES_PER_BLOCK (1 << BLK_SHIFT)	// = 64#define EM_SIZE_IN_MEG 4#define EM_SIZE_IN_BYTES (EM_SIZE_IN_MEG * (1<<20))#define PAGE_TOTAL_SIZE (PAGE_DATA_SIZE+PAGE_SPARE_SIZE)#define BLOCK_TOTAL_SIZE (PAGES_PER_BLOCK * PAGE_TOTAL_SIZE)#define BLOCKS_PER_MEG ((1<<20)/(PAGES_PER_BLOCK * PAGE_DATA_SIZE))static struct mtd_info nandemul2k_mtd;typedef struct {	__u8 data[PAGE_TOTAL_SIZE]; // Data + spare	int empty;      // is this empty?} nandemul_Page;typedef struct{	nandemul_Page *page[PAGES_PER_BLOCK];	int damaged;	} nandemul_Block;typedef struct{	nandemul_Block**block;	int nBlocks;} nandemul_Device;static nandemul_Device ned;static int sizeInMB = EM_SIZE_IN_MEG;static void nandemul_yield(int n){#ifdef __KERNEL__	if(n > 0) schedule_timeout(n);#endif}static void nandemul2k_Read(void *buffer, int page, int start, int nBytes){	int pg = page%PAGES_PER_BLOCK;	int blk = page/PAGES_PER_BLOCK;	if(buffer && nBytes > 0)	{		memcpy(buffer,&ned.block[blk]->page[pg]->data[start],nBytes);	}	}static void nandemul2k_Program(const void *buffer, int page, int start, int nBytes){	int pg = page%PAGES_PER_BLOCK;	int blk = page/PAGES_PER_BLOCK;	__u8 *p;	__u8 *b = (__u8 *)buffer;	p = &ned.block[blk]->page[pg]->data[start];		while(buffer && nBytes>0)	{		*p = *p & *b;		p++;		b++;		nBytes--;	}}static void nandemul2k_DoErase(int blockNumber){	int i;		nandemul_Block *blk;		if(blockNumber < 0 || blockNumber >= ned.nBlocks)	{		return;	}		blk = ned.block[blockNumber];		for(i = 0; i < PAGES_PER_BLOCK; i++)	{		memset(blk->page[i],0xff,sizeof(nandemul_Page));		blk->page[i]->empty = 1;	}	nandemul_yield(2);}static int nandemul2k_CalcNBlocks(void){	return EM_SIZE_IN_MEG * BLOCKS_PER_MEG;}static int  CheckInit(void){	static int initialised = 0;		int i,j;		int fail = 0;	int nBlocks; 	int nAllocated = 0;		if(initialised) 	{		return 0;	}			ned.nBlocks = nBlocks = nandemul2k_CalcNBlocks();		ned.block = ALLOCATE(sizeof(nandemul_Block*) * nBlocks );		if(!ned.block) return ENOMEM;						for(i=fail=0; i <nBlocks; i++)	{				nandemul_Block *blk;				if(!(blk = ned.block[i] = ALLOCATE(sizeof(nandemul_Block))))		{		 fail = 1;		}  		else		{			for(j = 0; j < PAGES_PER_BLOCK; j++)			{				if((blk->page[j] = ALLOCATE(sizeof(nandemul_Page))) == 0)				{					fail = 1;				}			}			nandemul2k_DoErase(i);			ned.block[i]->damaged = 0;			nAllocated++;		}	}		if(fail)	{		//Todo thump pages				for(i = 0; i < nAllocated; i++)		{			FREE(ned.block[i]);		}		FREE(ned.block);				return ENOMEM;	}		ned.nBlocks = nBlocks;		initialised = 1;		return 1;}static void nandemul2k_CleanUp(void){	int i,j;		for(i = 0; i < ned.nBlocks; i++)	{		for(j = 0; j < PAGES_PER_BLOCK; j++)		{		   FREE(ned.block[i]->page[j]);		}		FREE(ned.block[i]);			}	FREE(ned.block);	ned.block = 0;}int nandemul2k_GetBytesPerChunk(void) { return PAGE_DATA_SIZE;}int nandemul2k_GetChunksPerBlock(void) { return PAGES_PER_BLOCK; }int nandemul2k_GetNumberOfBlocks(void) {return nandemul2k_CalcNBlocks();}static int nandemul2k_ReadId(__u8 *vendorId, __u8 *deviceId){	*vendorId = 'Y'; 	*deviceId = '2';		return 1;}static int nandemul2k_ReadStatus(__u8 *status){		*status = 0;		return 1;}#ifdef CONFIG_MTD_NAND_ECC#include <linux/mtd/nand_ecc.h>#endif/* * NAND low-level MTD interface functions */static int nand_read (struct mtd_info *mtd, loff_t from, size_t len,			size_t *retlen, u_char *buf);static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,				size_t *retlen, u_char *buf, u_char *oob_buf, struct nand_oobinfo *dummy);static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len,				size_t *retlen, u_char *buf);static int nand_write (struct mtd_info *mtd, loff_t to, size_t len,			size_t *retlen, const u_char *buf);static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,				size_t *retlen, const u_char *buf,				u_char *oob_buf, struct nand_oobinfo *dummy);static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len,				size_t *retlen, const u_char *buf);#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,7))static int nand_writev (struct mtd_info *mtd, const struct kvec *vecs,				unsigned long count, loff_t to, size_t *retlen);#elsestatic int nand_writev (struct mtd_info *mtd, const struct iovec *vecs,				unsigned long count, loff_t to, size_t *retlen);#endifstatic int nand_erase (struct mtd_info *mtd, struct erase_info *instr);static void nand_sync (struct mtd_info *mtd);/* * NAND read */static int nand_read (struct mtd_info *mtd, loff_t from, size_t len,			size_t *retlen, u_char *buf){	return nand_read_ecc (mtd, from, len, retlen, buf, NULL,NULL);}/* * NAND read with ECC */static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,				size_t *retlen, u_char *buf, u_char *oob_buf,struct nand_oobinfo *oobsel){	int 	start, page;	int n = len;	int nToCopy;	/* Do not allow reads past end of device */	if ((from + len) > mtd->size) {		*retlen = 0;		return -EINVAL;	}	/* Initialize return value */	*retlen = 0;	while(n > 0)	{		/* First we calculate the starting page */		page = from >> NAND_SHIFT;		/* Get raw starting column */		start = from & (mtd->oobblock-1);		// OK now check for the curveball where the start and end are in		// the same page		if((start + n) < mtd->oobblock)		{			nToCopy = n;		}		else		{			nToCopy =  mtd->oobblock - start;		}		nandemul2k_Read(buf, page, start, nToCopy);		nandemul2k_Read(oob_buf,page,PAGE_DATA_SIZE,PAGE_SPARE_SIZE);		n -= nToCopy;		from += nToCopy;		buf += nToCopy;		if(oob_buf) oob_buf += PAGE_SPARE_SIZE;		*retlen += nToCopy;	}	return 0;}/* * NAND read out-of-band */static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len,				size_t *retlen, u_char *buf){	int col, page;	T(0,("nand_read_oob: from = 0x%08x, buf = 0x%08x, len = %i\n", (unsigned int) from, (unsigned int) buf,		(int) len));	/* Shift to get page */	page = ((int) from) >> NAND_SHIFT;	/* Mask to get column */	col = from & 0x0f;	/* Initialize return length value */	*retlen = 0;	/* Do not allow reads past end of device */	if ((from + len) > mtd->size) {		T(0,			("nand_read_oob: Attempt read beyond end of device\n"));		*retlen = 0;		return -EINVAL;	}	nandemul2k_Read(buf,page,PAGE_DATA_SIZE + col,len);	/* Return happy */	*retlen = len;	return 0;}/* * NAND write */static int nand_write (struct mtd_info *mtd, loff_t to, size_t len,			size_t *retlen, const u_char *buf){	return nand_write_ecc (mtd, to, len, retlen, buf, NULL,NULL);}/* * NAND write with ECC */static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,				size_t *retlen, const u_char *buf,				u_char *oob_buf, struct nand_oobinfo *dummy){	int 	start, page;	int n = len;	int nToCopy;	/* Do not allow reads past end of device */	if ((to + len) > mtd->size) {		*retlen = 0;		return -EINVAL;	}	/* Initialize return value */	*retlen = 0;	while(n > 0)	{		/* First we calculate the starting page */		page = to >> NAND_SHIFT;		/* Get raw starting column */		start = to & (mtd->oobblock - 1);		// OK now check for the curveball where the start and end are in		// the same page		if((start + n) < mtd->oobblock)		{			nToCopy = n;		}		else		{			nToCopy =  mtd->oobblock - start;		}		nandemul2k_Program(buf, page, start, nToCopy);		nandemul2k_Program(oob_buf, page, PAGE_DATA_SIZE, PAGE_SPARE_SIZE);		n -= nToCopy;		to += nToCopy;		buf += nToCopy;		if(oob_buf) oob_buf += PAGE_SPARE_SIZE;		*retlen += nToCopy;	}	return 0;}/* * NAND write out-of-band */static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len,				size_t *retlen, const u_char *buf){	int col, page;	T(0,(		"nand_read_oob: to = 0x%08x, len = %i\n", (unsigned int) to,		(int) len));	/* Shift to get page */	page = ((int) to) >> NAND_SHIFT;	/* Mask to get column */	col = to & 0x0f;	/* Initialize return length value */	*retlen = 0;	/* Do not allow reads past end of device */	if ((to + len) > mtd->size) {		T(0,(		   "nand_read_oob: Attempt read beyond end of device\n"));		*retlen = 0;		return -EINVAL;	}	nandemul2k_Program(buf,page,512 + col,len);	/* Return happy */	*retlen = len;	return 0;}/* * NAND write with iovec */#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,7))static int nand_writev (struct mtd_info *mtd, const struct kvec *vecs,				unsigned long count, loff_t to, size_t *retlen)#elsestatic int nand_writev (struct mtd_info *mtd, const struct iovec *vecs,				unsigned long count, loff_t to, size_t *retlen)#endif{	return -EINVAL;}/* * NAND erase a block */static int nand_erase (struct mtd_info *mtd, struct erase_info *instr){	int i, nBlocks,block;	T(0,(		"nand_erase: start = 0x%08x, len = %i\n",		(unsigned int) instr->addr, (unsigned int) instr->len));	/* Start address must align on block boundary */	if (instr->addr & (mtd->erasesize - 1)) {		T(0,(			"nand_erase: Unaligned address\n"));		return -EINVAL;	}	/* Length must align on block boundary */	if (instr->len & (mtd->erasesize - 1)) {		T(0,(			"nand_erase: Length not block aligned\n"));		return -EINVAL;	}	/* Do not allow erase past end of device */	if ((instr->len + instr->addr) > mtd->size) {		T(0,(			"nand_erase: Erase past end of device\n"));		return -EINVAL;	}	nBlocks = instr->len >> (NAND_SHIFT + BLK_SHIFT);	block = instr->addr >> (NAND_SHIFT + BLK_SHIFT);	for(i = 0; i < nBlocks; i++)	{		nandemul2k_DoErase(block);		block++;	}	return 0;}static int nand_block_isbad(struct mtd_info *mtd, loff_t ofs){	return 0;}static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs){	return 0;}/* * NAND sync */static void nand_sync (struct mtd_info *mtd){	T(0,("nand_sync: called\n"));}/* * Scan for the NAND device */static int nandemul2k_scan (struct mtd_info *mtd,int nchips){	mtd->oobblock = PAGE_DATA_SIZE;	mtd->oobsize =  PAGE_SPARE_SIZE;	mtd->erasesize = PAGE_DATA_SIZE * PAGES_PER_BLOCK;	mtd->size = sizeInMB * 1024*1024;	/* Fill in remaining MTD driver data */	mtd->type = MTD_NANDFLASH;	mtd->flags = MTD_CAP_NANDFLASH;	mtd->owner = THIS_MODULE;	mtd->ecctype = MTD_ECC_NONE;	mtd->erase = nand_erase;	mtd->point = NULL;	mtd->unpoint = NULL;	mtd->read = nand_read;	mtd->write = nand_write;	mtd->read_ecc = nand_read_ecc;	mtd->write_ecc = nand_write_ecc;	mtd->read_oob = nand_read_oob;	mtd->write_oob = nand_write_oob;	mtd->block_isbad = nand_block_isbad;	mtd->block_markbad = nand_block_markbad;	mtd->readv = NULL;	mtd->writev = nand_writev;	mtd->sync = nand_sync;	mtd->lock = NULL;	mtd->unlock = NULL;	mtd->suspend = NULL;	mtd->resume = NULL;	mtd->name = "NANDemul2k";	/* Return happy */	return 0;}#if 0#ifdef MODULEMODULE_PARM(sizeInMB, "i");__setup("sizeInMB=",sizeInMB);#endif#endif/* * Define partitions for flash devices */static struct mtd_partition nandemul2k_partition[] ={	{ .name		= "NANDemul partition 1",	  .offset	= 0,	  .size		= 0 },};static int nPartitions = sizeof(nandemul2k_partition)/sizeof(nandemul2k_partition[0]);/* * Main initialization routine */int __init nandemul2k_init (void){	// Do the nand init		CheckInit();	nandemul2k_scan(&nandemul2k_mtd,1);	// Build the partition table	nandemul2k_partition[0].size = sizeInMB * 1024 * 1024;	// Register the partition	add_mtd_partitions(&nandemul2k_mtd,nandemul2k_partition,nPartitions);	return 0;}module_init(nandemul2k_init);/* * Clean up routine */#ifdef MODULEstatic void __exit nandemul2k_cleanup (void){	nandemul2k_CleanUp();	/* Unregister partitions */	del_mtd_partitions(&nandemul2k_mtd);	/* Unregister the device */	del_mtd_device (&nandemul2k_mtd);}module_exit(nandemul2k_cleanup);#endifMODULE_LICENSE("GPL");MODULE_AUTHOR("Charles Manning <manningc@aleph1.co.uk>");MODULE_DESCRIPTION("2k Page/128k Block NAND emulated in RAM");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
首页综合国产亚洲丝袜| 久久青草国产手机看片福利盒子| 国产欧美精品日韩区二区麻豆天美| 亚洲日穴在线视频| 国产一区在线观看视频| 欧美一区二区视频在线观看| 一区二区三区在线观看视频| 成人久久视频在线观看| 久久久精品免费免费| 国产中文一区二区三区| 欧美成人性福生活免费看| 三级欧美在线一区| 欧美剧在线免费观看网站| 亚洲成av人片www| 欧美中文一区二区三区| 亚洲人精品午夜| 91麻豆福利精品推荐| 国产精品的网站| 91天堂素人约啪| 怡红院av一区二区三区| 欧美性生活久久| 五月婷婷色综合| 日韩精品专区在线影院重磅| 精品伊人久久久久7777人| 久久久亚洲欧洲日产国码αv| 国产一区二区三区四区五区入口| 26uuu国产电影一区二区| 狠狠狠色丁香婷婷综合激情| 久久久精品国产免大香伊| 成人国产精品免费观看动漫| 国产精品国产三级国产| 欧美日韩国产一区二区三区地区| 免费不卡在线视频| 国产精品视频观看| 欧美视频日韩视频| 国模一区二区三区白浆 | 亚洲国产裸拍裸体视频在线观看乱了 | 一区二区三区中文字幕电影 | 2020国产精品自拍| 成人av电影观看| 欧美大片一区二区| 亚洲高清中文字幕| 欧美一区二区在线不卡| 蜜臀av性久久久久av蜜臀妖精| 国产精品一品视频| 一区二区三区在线不卡| 91麻豆精品国产91久久久久久 | 欧美本精品男人aⅴ天堂| 成人午夜电影网站| 婷婷国产v国产偷v亚洲高清| 国产日韩欧美一区二区三区乱码 | 欧美人牲a欧美精品| 国产福利视频一区二区三区| 亚洲国产欧美在线人成| 久久欧美一区二区| 欧美日韩一区国产| 一本色道**综合亚洲精品蜜桃冫| 久久精品国产99久久6| 亚洲精品日日夜夜| 中文字幕成人在线观看| 精品国内片67194| 欧美午夜精品久久久久久超碰| 国产91精品久久久久久久网曝门 | 亚洲国产精品成人综合色在线婷婷 | 国产宾馆实践打屁股91| 蜜臀国产一区二区三区在线播放| 亚洲成在人线免费| 亚洲成人午夜影院| 亚洲精品午夜久久久| 综合激情成人伊人| 国产精品灌醉下药二区| 国产精品白丝在线| 亚洲欧洲美洲综合色网| 国产精品久久久久久久第一福利 | 亚洲成a人片综合在线| 日韩一区中文字幕| 亚洲美女视频在线| 亚洲激情第一区| 亚洲成人在线网站| 日韩av中文字幕一区二区三区| 一区二区三区.www| 日韩精品视频网站| 久久国产欧美日韩精品| 丁香婷婷综合激情五月色| 波多野结衣的一区二区三区| jlzzjlzz欧美大全| 欧美吻胸吃奶大尺度电影| 亚洲国产精品视频| 国产日产欧美一区二区视频| 国产精品丝袜久久久久久app| 亚洲男人的天堂在线观看| 亚洲一区电影777| 国产毛片精品一区| 91黄视频在线| 久久综合99re88久久爱| 亚洲免费观看高清完整版在线 | 日本高清视频一区二区| 91精品国产91热久久久做人人| 久久久久高清精品| 亚洲bdsm女犯bdsm网站| 国产丶欧美丶日本不卡视频| 欧美亚洲一区二区三区四区| 久久久精品综合| 日韩vs国产vs欧美| 99久久精品一区| 精品国产凹凸成av人网站| 一区二区三区在线观看国产| 石原莉奈在线亚洲三区| 天天操天天干天天综合网| 麻豆免费看一区二区三区| 日韩精品久久理论片| 美腿丝袜亚洲一区| 亚洲二区在线视频| 免费精品视频在线| 91亚洲永久精品| 久久一夜天堂av一区二区三区| 成人免费视频免费观看| 欧美日本精品一区二区三区| 综合久久久久久久| 国产福利一区二区三区视频| 精品剧情在线观看| 日韩和欧美一区二区| 99这里只有精品| 久久久精品国产99久久精品芒果| 日韩激情视频网站| 一区二区在线观看不卡| www.久久久久久久久| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | fc2成人免费人成在线观看播放| 日韩欧美一区中文| 六月丁香婷婷久久| 日韩一区二区三区视频在线观看 | 成人av片在线观看| 日本一区二区三级电影在线观看| 国产精品主播直播| 国产精品欧美一级免费| 不卡的av网站| 亚洲精品第一国产综合野| av成人动漫在线观看| 国产精品―色哟哟| 在线观看亚洲a| 奇米一区二区三区av| 2020国产精品自拍| 粉嫩aⅴ一区二区三区四区| 国产精品传媒入口麻豆| 91极品美女在线| 久久精品国产99久久6| 中文字幕精品一区二区精品绿巨人 | 一区二区三区日本| 色综合激情久久| 日本美女一区二区三区视频| 久久免费美女视频| 欧美中文字幕久久| 黄色成人免费在线| 中文字幕一区日韩精品欧美| 欧美日韩视频不卡| 国产精品中文字幕日韩精品| 洋洋av久久久久久久一区| 26uuu亚洲综合色| 欧美日韩中文精品| 久久疯狂做爰流白浆xx| 综合婷婷亚洲小说| 日韩亚洲欧美综合| 在线观看免费亚洲| 成人性生交大片免费| 视频在线观看一区| 国产精品欧美一级免费| 精品国产精品网麻豆系列| 色婷婷综合久色| 国产成人啪午夜精品网站男同| 亚洲精品第1页| 国产精品久久夜| 国产亚洲欧洲997久久综合| 日韩欧美一区在线| 欧美日韩国产一级二级| 99热99精品| 国产69精品久久99不卡| 麻豆精品一区二区三区| 亚洲成av人影院| 三级久久三级久久| 午夜精品久久久久久久久久| 日韩一区日韩二区| 亚洲视频 欧洲视频| 亚洲欧洲日韩av| 中文字幕一区二区三区视频 | 午夜精品一区二区三区电影天堂 | 国产一区二区三区av电影| 视频在线观看一区二区三区| 亚洲私人黄色宅男| 综合久久综合久久| 国产精品国产a| 亚洲精品免费电影| 一个色综合网站| 亚洲成人免费看| 亚洲成人激情自拍| 亚洲香蕉伊在人在线观| 午夜精品久久一牛影视| 裸体歌舞表演一区二区| 国产不卡一区视频| 色婷婷一区二区三区四区|