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

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

?? pcmciamtd.c

?? nandflash k9g808u0a在pxa270的驅動,由于pxa270沒有nandflash接口
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * $Id: pcmciamtd.c,v 1.2 2007/09/21 03:09:24 quy Exp $ * * pcmciamtd.c - MTD driver for PCMCIA flash memory cards * * Author: Simon Evans <spse@secret.org.uk> * * Copyright (C) 2002 Simon Evans * * Licence: GPL * */#include <linux/module.h>#include <linux/slab.h>#include <linux/timer.h>#include <linux/init.h>#include <asm/io.h>#include <asm/system.h>#include <pcmcia/version.h>#include <pcmcia/cs_types.h>#include <pcmcia/cs.h>#include <pcmcia/cistpl.h>#include <pcmcia/ds.h>#include <linux/mtd/map.h>#include <linux/mtd/mtd.h>#ifdef CONFIG_MTD_DEBUGstatic int debug = CONFIG_MTD_DEBUG_VERBOSE;MODULE_PARM(debug, "i");MODULE_PARM_DESC(debug, "Set Debug Level 0=quiet, 5=noisy");#undef DEBUG#define DEBUG(n, format, arg...) \	if (n <= debug) {	 \		printk(KERN_DEBUG __FILE__ ":%s(): " format "\n", __FUNCTION__ , ## arg); \	}#else#undef DEBUG#define DEBUG(n, arg...)static const int debug = 0;#endif#define err(format, arg...) printk(KERN_ERR "pcmciamtd: " format "\n" , ## arg)#define info(format, arg...) printk(KERN_INFO "pcmciamtd: " format "\n" , ## arg)#define warn(format, arg...) printk(KERN_WARNING "pcmciamtd: " format "\n" , ## arg)#define DRIVER_DESC	"PCMCIA Flash memory card driver"#define DRIVER_VERSION	"$Revision: 1.2 $"/* Size of the PCMCIA address space: 26 bits = 64 MB */#define MAX_PCMCIA_ADDR	0x4000000struct pcmciamtd_dev {	dev_link_t	link;		/* PCMCIA link */	dev_node_t	node;		/* device node */	caddr_t		win_base;	/* ioremapped address of PCMCIA window */	unsigned int	win_size;	/* size of window */	unsigned int	offset;		/* offset into card the window currently points at */	struct map_info	pcmcia_map;	struct mtd_info	*mtd_info;	int		vpp;	char		mtd_name[sizeof(struct cistpl_vers_1_t)];};static dev_info_t dev_info = "pcmciamtd";static dev_link_t *dev_list;/* Module parameters *//* 2 = do 16-bit transfers, 1 = do 8-bit transfers */static int bankwidth = 2;/* Speed of memory accesses, in ns */static int mem_speed;/* Force the size of an SRAM card */static int force_size;/* Force Vpp */static int vpp;/* Set Vpp */static int setvpp;/* Force card to be treated as FLASH, ROM or RAM */static int mem_type;MODULE_LICENSE("GPL");MODULE_AUTHOR("Simon Evans <spse@secret.org.uk>");MODULE_DESCRIPTION(DRIVER_DESC);MODULE_PARM(bankwidth, "i");MODULE_PARM_DESC(bankwidth, "Set bankwidth (1=8 bit, 2=16 bit, default=2)");MODULE_PARM(mem_speed, "i");MODULE_PARM_DESC(mem_speed, "Set memory access speed in ns");MODULE_PARM(force_size, "i");MODULE_PARM_DESC(force_size, "Force size of card in MiB (1-64)");MODULE_PARM(setvpp, "i");MODULE_PARM_DESC(setvpp, "Set Vpp (0=Never, 1=On writes, 2=Always on, default=0)");MODULE_PARM(vpp, "i");MODULE_PARM_DESC(vpp, "Vpp value in 1/10ths eg 33=3.3V 120=12V (Dangerous)");MODULE_PARM(mem_type, "i");MODULE_PARM_DESC(mem_type, "Set Memory type (0=Flash, 1=RAM, 2=ROM, default=0)");/* read/write{8,16} copy_{from,to} routines with window remapping to access whole card */static caddr_t remap_window(struct map_info *map, unsigned long to){	struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;	window_handle_t win = (window_handle_t)map->map_priv_2;	memreq_t mrq;	int ret;	if(!(dev->link.state & DEV_PRESENT)) {		DEBUG(1, "device removed state = 0x%4.4X", dev->link.state);		return 0;	}	mrq.CardOffset = to & ~(dev->win_size-1);	if(mrq.CardOffset != dev->offset) {		DEBUG(2, "Remapping window from 0x%8.8x to 0x%8.8x",		      dev->offset, mrq.CardOffset);		mrq.Page = 0;		if( (ret = pcmcia_map_mem_page(win, &mrq)) != CS_SUCCESS) {			cs_error(dev->link.handle, MapMemPage, ret);			return NULL;		}		dev->offset = mrq.CardOffset;	}	return dev->win_base + (to & (dev->win_size-1));}static map_word pcmcia_read8_remap(struct map_info *map, unsigned long ofs){	caddr_t addr;	map_word d = {{0}};	addr = remap_window(map, ofs);	if(!addr)		return d;	d.x[0] = readb(addr);	DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%02x", ofs, addr, d.x[0]);	return d;}static map_word pcmcia_read16_remap(struct map_info *map, unsigned long ofs){	caddr_t addr;	map_word d = {{0}};	addr = remap_window(map, ofs);	if(!addr)		return d;	d.x[0] = readw(addr);	DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%04x", ofs, addr, d.x[0]);	return d;}static void pcmcia_copy_from_remap(struct map_info *map, void *to, unsigned long from, ssize_t len){	struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;	unsigned long win_size = dev->win_size;	DEBUG(3, "to = %p from = %lu len = %u", to, from, len);	while(len) {		int toread = win_size - (from & (win_size-1));		caddr_t addr;		if(toread > len)			toread = len;				addr = remap_window(map, from);		if(!addr)			return;		DEBUG(4, "memcpy from %p to %p len = %d", addr, to, toread);		memcpy_fromio(to, addr, toread);		len -= toread;		to += toread;		from += toread;	}}static void pcmcia_write8_remap(struct map_info *map, map_word d, unsigned long adr){	caddr_t addr = remap_window(map, adr);	if(!addr)		return;	DEBUG(3, "adr = 0x%08lx (%p)  data = 0x%02x", adr, addr, d.x[0]);	writeb(d.x[0], addr);}static void pcmcia_write16_remap(struct map_info *map, map_word d, unsigned long adr){	caddr_t addr = remap_window(map, adr);	if(!addr)		return;	DEBUG(3, "adr = 0x%08lx (%p)  data = 0x%04x", adr, addr, d.x[0]);	writew(d.x[0], addr);}static void pcmcia_copy_to_remap(struct map_info *map, unsigned long to, const void *from, ssize_t len){	struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;	unsigned long win_size = dev->win_size;	DEBUG(3, "to = %lu from = %p len = %u", to, from, len);	while(len) {		int towrite = win_size - (to & (win_size-1));		caddr_t addr;		if(towrite > len)			towrite = len;		addr = remap_window(map, to);		if(!addr)			return;		DEBUG(4, "memcpy from %p to %p len = %d", from, addr, towrite);		memcpy_toio(addr, from, towrite);		len -= towrite;		to += towrite;		from += towrite;	}}/* read/write{8,16} copy_{from,to} routines with direct access */#define DEV_REMOVED(x)  (!(*(u_int *)x->map_priv_1 & DEV_PRESENT))static map_word pcmcia_read8(struct map_info *map, unsigned long ofs){	caddr_t win_base = (caddr_t)map->map_priv_2;	map_word d = {{0}};	if(DEV_REMOVED(map))		return d;	d.x[0] = readb(win_base + ofs);	DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%02x", ofs, win_base + ofs, d.x[0]);	return d;}static map_word pcmcia_read16(struct map_info *map, unsigned long ofs){	caddr_t win_base = (caddr_t)map->map_priv_2;	map_word d = {{0}};	if(DEV_REMOVED(map))		return d;	d.x[0] = readw(win_base + ofs);	DEBUG(3, "ofs = 0x%08lx (%p) data = 0x%04x", ofs, win_base + ofs, d.x[0]);	return d;}static void pcmcia_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len){	caddr_t win_base = (caddr_t)map->map_priv_2;	if(DEV_REMOVED(map))		return;	DEBUG(3, "to = %p from = %lu len = %u", to, from, len);	memcpy_fromio(to, win_base + from, len);}static void pcmcia_write8(struct map_info *map, u8 d, unsigned long adr){	caddr_t win_base = (caddr_t)map->map_priv_2;	if(DEV_REMOVED(map))		return;	DEBUG(3, "adr = 0x%08lx (%p)  data = 0x%02x", adr, win_base + adr, d);	writeb(d, win_base + adr);}static void pcmcia_write16(struct map_info *map, u16 d, unsigned long adr){	caddr_t win_base = (caddr_t)map->map_priv_2;	if(DEV_REMOVED(map))		return;	DEBUG(3, "adr = 0x%08lx (%p)  data = 0x%04x", adr, win_base + adr, d);	writew(d, win_base + adr);}static void pcmcia_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len){	caddr_t win_base = (caddr_t)map->map_priv_2;	if(DEV_REMOVED(map))		return;	DEBUG(3, "to = %lu from = %p len = %u", to, from, len);	memcpy_toio(win_base + to, from, len);}static void pcmciamtd_set_vpp(struct map_info *map, int on){	struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;	dev_link_t *link = &dev->link;	modconf_t mod;	int ret;	mod.Attributes = CONF_VPP1_CHANGE_VALID | CONF_VPP2_CHANGE_VALID;	mod.Vcc = 0;	mod.Vpp1 = mod.Vpp2 = on ? dev->vpp : 0;	DEBUG(2, "dev = %p on = %d vpp = %d\n", dev, on, dev->vpp);	ret = pcmcia_modify_configuration(link->handle, &mod);	if(ret != CS_SUCCESS) {		cs_error(link->handle, ModifyConfiguration, ret);	}}/* After a card is removed, pcmciamtd_release() will unregister the * device, and release the PCMCIA configuration.  If the device is * still open, this will be postponed until it is closed. */static void pcmciamtd_release(dev_link_t *link){	struct pcmciamtd_dev *dev = link->priv;	DEBUG(3, "link = 0x%p", link);	if (link->win) {		if(dev->win_base) {			iounmap(dev->win_base);			dev->win_base = NULL;		}		pcmcia_release_window(link->win);	}	pcmcia_release_configuration(link->handle);	link->state &= ~DEV_CONFIG;}static void card_settings(struct pcmciamtd_dev *dev, dev_link_t *link, int *new_name){	int rc;	tuple_t tuple;	cisparse_t parse;	u_char buf[64];	tuple.Attributes = 0;	tuple.TupleData = (cisdata_t *)buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 0;	tuple.DesiredTuple = RETURN_FIRST_TUPLE;	rc = pcmcia_get_first_tuple(link->handle, &tuple);	while(rc == CS_SUCCESS) {		rc = pcmcia_get_tuple_data(link->handle, &tuple);		if(rc != CS_SUCCESS) {			cs_error(link->handle, GetTupleData, rc);			break;		}		rc = pcmcia_parse_tuple(link->handle, &tuple, &parse);		if(rc != CS_SUCCESS) {			cs_error(link->handle, ParseTuple, rc);			break;		}				switch(tuple.TupleCode) {		case  CISTPL_FORMAT: {			cistpl_format_t *t = &parse.format;			(void)t; /* Shut up, gcc */			DEBUG(2, "Format type: %u, Error Detection: %u, offset = %u, length =%u",			      t->type, t->edc, t->offset, t->length);			break;					}					case CISTPL_DEVICE: {			cistpl_device_t *t = &parse.device;			int i;			DEBUG(2, "Common memory:");			dev->pcmcia_map.size = t->dev[0].size;			for(i = 0; i < t->ndev; i++) {				DEBUG(2, "Region %d, type = %u", i, t->dev[i].type);				DEBUG(2, "Region %d, wp = %u", i, t->dev[i].wp);				DEBUG(2, "Region %d, speed = %u ns", i, t->dev[i].speed);				DEBUG(2, "Region %d, size = %u bytes", i, t->dev[i].size);			}			break;		}					case CISTPL_VERS_1: {			cistpl_vers_1_t *t = &parse.version_1;			int i;			if(t->ns) {				dev->mtd_name[0] = '\0';				for(i = 0; i < t->ns; i++) {					if(i)						strcat(dev->mtd_name, " ");					strcat(dev->mtd_name, t->str+t->ofs[i]);				}			}			DEBUG(2, "Found name: %s", dev->mtd_name);			break;		}					case CISTPL_JEDEC_C: {			cistpl_jedec_t *t = &parse.jedec;			int i;			for(i = 0; i < t->nid; i++) {				DEBUG(2, "JEDEC: 0x%02x 0x%02x", t->id[i].mfr, t->id[i].info);			}			break;		}					case CISTPL_DEVICE_GEO: {			cistpl_device_geo_t *t = &parse.device_geo;			int i;			dev->pcmcia_map.bankwidth = t->geo[0].buswidth;			for(i = 0; i < t->ngeo; i++) {				DEBUG(2, "region: %d bankwidth = %u", i, t->geo[i].buswidth);				DEBUG(2, "region: %d erase_block = %u", i, t->geo[i].erase_block);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区电影在线观看| 欧美一级片免费看| 国产精品第五页| 极品美女销魂一区二区三区| 欧美一区二区三区免费在线看| 伊人性伊人情综合网| 一本色道久久综合亚洲91| 国产精品久久久久永久免费观看| 国产精品一区二区黑丝| 久久精品一区二区三区不卡| 国产一区二区三区免费看| 精品国产凹凸成av人导航| 狠狠网亚洲精品| 久久久99免费| 成人午夜碰碰视频| 国产精品初高中害羞小美女文| 成人av网站大全| 1区2区3区欧美| 91精品办公室少妇高潮对白| 樱花草国产18久久久久| 欧美午夜在线观看| 日日夜夜免费精品| 日韩色在线观看| 国产在线日韩欧美| 国产欧美一区二区三区鸳鸯浴 | 97se亚洲国产综合自在线观| 中文字幕一区二区三区四区| 91蝌蚪porny九色| 亚洲无人区一区| 69p69国产精品| 极品少妇xxxx偷拍精品少妇| 国产亚洲综合色| 99精品视频在线免费观看| 一区二区免费在线播放| 欧美日韩卡一卡二| 美国av一区二区| 久久精品一区二区三区不卡牛牛| 成人18视频日本| 亚洲综合网站在线观看| 91精品在线麻豆| 国产美女在线精品| 亚洲免费色视频| 欧美一区二区黄色| 成人在线综合网| 亚洲自拍另类综合| 欧美成人乱码一区二区三区| 成人免费的视频| 亚洲午夜一二三区视频| 欧美不卡一区二区三区| heyzo一本久久综合| 亚洲成a人片在线不卡一二三区 | 精品欧美乱码久久久久久 | 欧美系列一区二区| 老汉av免费一区二区三区| 国产精品欧美一级免费| 欧美日免费三级在线| 久久精品国产99久久6| 国产精品国产三级国产三级人妇| 欧美一a一片一级一片| 精东粉嫩av免费一区二区三区| 国产精品欧美一区喷水| 91精品国产欧美一区二区 | 精品一区二区三区在线播放 | 久久久久久免费网| 欧美亚洲综合另类| 国产在线播放一区三区四| 亚洲免费视频成人| 久久色成人在线| 在线精品视频免费观看| 国产乱码精品1区2区3区| 亚洲一区二区精品视频| 国产欧美日韩视频一区二区| 欧美三级视频在线观看 | 毛片av一区二区| 亚洲色图一区二区三区| 精品国产一区二区三区久久影院| 在线免费亚洲电影| 国产成人精品一区二区三区四区 | 91在线视频播放地址| 久久精品国产久精国产爱| 一区二区三区在线视频观看| 久久久久国产精品麻豆ai换脸| 欧美久久高跟鞋激| av午夜一区麻豆| 国产一区二区三区电影在线观看| 亚洲一区二区三区国产| 国产精品初高中害羞小美女文| 精品国产第一区二区三区观看体验| 欧美影片第一页| 成人av资源网站| 国产一区久久久| 奇米影视一区二区三区小说| 亚洲精品久久久久久国产精华液| 国产欧美日韩在线视频| 欧美成人免费网站| 678五月天丁香亚洲综合网| 色哟哟欧美精品| 国产99久久久久久免费看农村| 久久精品国产亚洲aⅴ | 亚洲成人资源在线| 亚洲欧美乱综合| 国产精品视频在线看| 精品三级在线看| 欧美裸体bbwbbwbbw| 欧美中文字幕一二三区视频| 色综合久久中文综合久久97 | 国产成人亚洲精品青草天美| 男人的j进女人的j一区| 亚洲成a天堂v人片| 亚洲一区国产视频| 亚洲精品国产视频| 综合亚洲深深色噜噜狠狠网站| 中文字幕+乱码+中文字幕一区| 精品国产三级a在线观看| 欧美一级理论片| 欧美久久久久免费| 欧美精选一区二区| 欧美福利一区二区| 欧美日韩成人综合在线一区二区 | 欧美日韩卡一卡二| 在线观看av一区| 一本一本久久a久久精品综合麻豆| 92国产精品观看| 97精品久久久久中文字幕| av资源站一区| 91片黄在线观看| 色婷婷激情综合| 色吧成人激情小说| 在线观看三级视频欧美| 欧美亚洲一区二区在线观看| 欧美视频在线一区二区三区 | 亚洲精品日韩综合观看成人91| 国产精品亲子伦对白| 中文字幕中文字幕中文字幕亚洲无线| 日本一区二区三区四区| 国产精品视频第一区| 国产精品久久久久久亚洲伦| 国产精品免费久久| 亚洲日韩欧美一区二区在线| 亚洲男同性恋视频| 亚洲一区在线观看视频| 天天综合日日夜夜精品| 日本vs亚洲vs韩国一区三区| 蜜臀av性久久久久av蜜臀妖精| 久久国产人妖系列| 国产裸体歌舞团一区二区| 成人性生交大片免费看中文网站| 成人综合激情网| 91色视频在线| 欧美色图第一页| 欧美一区二区精品| 久久综合色婷婷| 国产精品成人一区二区三区夜夜夜 | 亚洲少妇30p| 亚洲成av人片一区二区梦乃| 美日韩黄色大片| 国产精品一级片| 一本大道av伊人久久综合| 欧美日韩中文字幕一区二区| 日韩一区二区精品葵司在线| 久久精品视频在线看| 亚洲欧美自拍偷拍| 亚洲www啪成人一区二区麻豆| 久久国产免费看| av在线一区二区| 欧美日韩在线直播| 精品裸体舞一区二区三区| 国产精品久久久久久久久果冻传媒| 一区二区三区在线影院| 久久精品国产77777蜜臀| 成人禁用看黄a在线| 欧美群妇大交群中文字幕| 久久伊人蜜桃av一区二区| 亚洲同性同志一二三专区| 日韩电影在线看| 国产91对白在线观看九色| 欧美无乱码久久久免费午夜一区| 日韩美女一区二区三区四区| 一区在线中文字幕| 日韩va亚洲va欧美va久久| 成人性视频网站| 5566中文字幕一区二区电影| 国产女同互慰高潮91漫画| 亚洲一区二区黄色| 国产精品18久久久久久久网站| 一本大道久久a久久综合婷婷| 日韩欧美国产不卡| 亚洲视频在线观看一区| 蜜桃视频在线一区| 91麻豆swag| 欧美精品一区二区在线播放| 亚洲精品免费在线| 国产在线观看一区二区| 欧美三级中文字| 国产精品色婷婷久久58| 日韩av电影免费观看高清完整版 | 亚洲欧美日韩国产综合在线| 免费成人在线影院| 色综合天天做天天爱| 精品久久久久久久人人人人传媒 |