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

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

?? mx2_nand.c

?? nandflash k9g808u0a在pxa270的驅動,由于pxa270沒有nandflash接口
?? C
?? 第 1 頁 / 共 2 頁
字號:
/******************************************************************************	drivers/mtd/nand/mx2_nand.c	driver for i.MX21 on-chip NAND Flash controller.	tested with NAND Flash devices that come with MX21ADS board:	SAMSUNG K9F1208Q0A (8bit i/o)	SAMSUNG K9F5616Q0C (16Bit i/o)	Copyright (c) 2004 MontaVista Software, Inc. <source@mvista.com>	Based on mx2 nand support code from Motorola's MX21 BSP:	Copyright (C) 2003 Motorola Inc. Ltd	This program is free software; you can redistribute it and/or	modify it under the terms of the GNU General Public License	as published by the Free Software Foundation; either version 2	of the License, or (at your option) any later version.	This program is distributed in the hope that it will be useful,	but WITHOUT ANY WARRANTY; without even the implied warranty of	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the	GNU General Public License for more details.	You should have received a copy of the GNU General Public License	along with this program; if not, write to the Free Software	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.	********************************************************************************/#include <linux/slab.h>#include <linux/init.h>#include <linux/module.h>#include <linux/delay.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/types.h>#include <linux/mtd/mtd.h>#include <linux/mtd/nand.h>#include <linux/mtd/partitions.h>#include <linux/interrupt.h>#include <linux/ioport.h>#include <asm/arch/gpio.h>#include <asm/arch/pll.h>#include <asm/arch/hardware.h>static void mx2nand_setup_clock(void);#if 1 /*CEE LDM*/static char mx2nand_ldm_inited;#include <linux/device.h>extern void mx21_ldm_bus_register(struct device *device,                          struct device_driver *driver);extern void mx21_ldm_bus_unregister(struct device *device,                          struct device_driver *driver);static int mx2nand_freq_scale(struct bus_op_point * op, u32 level){	mx2nand_setup_clock();	return 0;}static struct device_driver __driver_ldm = {	.name = "mx2_nand",	.scale = mx2nand_freq_scale,};static struct device __device_ldm = {	.name = "NAND FLASH",	.bus_id = "mx2_nand",	.driver = &__driver_ldm,	.power_state = DPM_POWER_ON,};#endif#define NAND_FLASH_CONFIG2_INT 0x8000#define NAND_FLASH_CONFIG2_FCMD 0x1#define NAND_FLASH_CONFIG2_FADD 0x2#define NAND_FLASH_CONFIG2_FDI  0x4#define NAND_FLASH_CONFIG2_PAGE_OUT  0x8#define NAND_FLASH_CONFIG2_ID_OUT  0x10#define NAND_FLASH_CONFIG2_STATUS_OUT  0x20/*critical section*/#define MX2NAND_DECLARE_CS_FLAGS(name) u32 name#ifdef  CONFIG_MX2_16_BIT_NAND#define MX2NAND_ENTER_CS(x) do { \	save_flags(x); \	cli(); \	SYS_FMCR |= (1 << 4); \} while (0)#define MX2NAND_EXIT_CS(x) do { \	SYS_FMCR &= ~(1 << 4); \	restore_flags(x); \} while (0)#else#define MX2NAND_ENTER_CS(x) do { \	save_flags(x); \	cli(); \} while (0)#define MX2NAND_EXIT_CS(x) do { \	restore_flags(x); \} while (0)#endif#ifdef CONFIG_MTD_CMDLINE_PARTSconst char *mx2nand_probes[] = { "cmdlinepart", NULL };#endifstatic struct mtd_info *mx2nand_mtd = NULL;static u8 mx2nand_region_init;static u8 mx2nand_gpio_init;static void __init mx2nand_cleanup(void);#define NAND_TIMEOUT HZ*5struct mx2nand_priv {	u_char mode;	u_char cmd;	u32 offset;	u32 max_offset;};static uint8_t mx2nand_bi_pattern[] = { 0 };	/*bad block indicator pattern - I saw only 0's */#ifdef  CONFIG_MX2_16_BIT_NANDstatic struct nand_oobinfo mx2nand_oob = {	.useecc = MTD_NANDECC_AUTOPLACE,	.eccbytes = 0,		/* 0 instead of 3 to prevent writing attempts to ECC area */	.eccpos = {6, 7, 8},	/*no practical value - SW ECC write is disabled, handled by HW */	.oobfree = {{0, 6}, {12, 4}},	/*accessible bytes in the spare area */};static struct nand_bbt_descr mx2nand_bbt_descr = {	.options = 0,	.offs = 11,	.len = 1,	.pattern = mx2nand_bi_pattern,};#elsestatic struct nand_oobinfo mx2nand_oob = {	.useecc = MTD_NANDECC_AUTOPLACE,	.eccbytes = 0,		/* 0 instead of 3 to prevent writing attempts to ECC area */	.eccpos = {6, 7, 8},	/*no practical value - SW ECC write is disabled, handled by HW */	.oobfree = {{0, 5}, {11, 5}},	/*accessible bytes in the spare area */};static struct nand_bbt_descr mx2nand_bbt_descr = {	.options = 0,	.offs = 5,	.len = 1,	.pattern = mx2nand_bi_pattern,};#endifstatic intmx2nand_scan_bbt(struct mtd_info *mtd){	nand_scan_bbt(mtd, &mx2nand_bbt_descr);	return 0;}static intmx2nand_correct_data(struct mtd_info *mtd, u_char * dat,		     u_char * read_ecc, u_char * calc_ecc){/*ecc is handled entirely by the MX2 NFC*//*report ECC Uncorrectable error*/	if (NFC_ECC_STAT_RES & 0xA)		return -1;	else		return 0;}static voidmx2nand_enable_hwecc(struct mtd_info *mtd, int mode){/*ecc is handled entirely by the MX2 NFC*/}static intmx2nand_calculate_ecc(struct mtd_info *mtd, const u_char * dat,		      u_char * ecc_code){/*ecc is handled entirely by the MX2 NFC*/	return 0;}static voidmx2nand_wait(void){	unsigned long timeout;	timeout = jiffies + NAND_TIMEOUT;	while (!(NFC_NF_CONFIG2 & NAND_FLASH_CONFIG2_INT)) {		if (time_after(jiffies, timeout)) {			printk(KERN_ERR			       "MX2_NAND: timeout waiting for Nand command complete\n");			return;		}	}}static voidmx2nand_request_data(int cmd){	MX2NAND_DECLARE_CS_FLAGS(flags);	MX2NAND_ENTER_CS(flags);	switch (cmd) {	case NAND_CMD_READID:		NFC_NF_CONFIG2 = NAND_FLASH_CONFIG2_ID_OUT;		break;	case NAND_CMD_STATUS:		NFC_NF_CONFIG2 = NAND_FLASH_CONFIG2_STATUS_OUT;		break;	default:		NFC_NF_CONFIG2 = NAND_FLASH_CONFIG2_PAGE_OUT;	}	mx2nand_wait();	MX2NAND_EXIT_CS(flags);}static u_charmx2nand_read_byte(struct mtd_info *mtd){	struct nand_chip *chip_priv = mtd->priv;	struct mx2nand_priv *mx2_priv = chip_priv->priv;	char b;	u16 buf;	u32 offset = mx2_priv->offset;	int cmd = mx2_priv->cmd;	if (offset == 0) {		mx2nand_request_data(cmd);	}	if ((offset >= 512) || (cmd == NAND_CMD_READOOB))		buf = *((u16 *) NFC_SAB_BASE(3) + (offset >> 1));	else		buf = *((u16 *) NFC_MAB_BASE(3) + (offset >> 1));	b = ((u8 *) & buf)[offset & 0x1];#ifdef CONFIG_MX2_16_BIT_NAND	if (cmd == NAND_CMD_READID)		offset++;	/*skip 1 byte */#endif	offset++;	if (offset >= mx2_priv->max_offset)		offset = 0;	mx2_priv->offset = offset;	return b;}static u16mx2nand_read_word(struct mtd_info *mtd){	u8 buf[2];	buf[0] = mx2nand_read_byte(mtd);	buf[1] = mx2nand_read_byte(mtd);	return *(u16 *) buf;}static voidmx2nand_send_command(struct mtd_info *mtd, u8 cmd){	struct nand_chip *chip_priv = mtd->priv;	struct mx2nand_priv *mx2_priv = chip_priv->priv;	MX2NAND_DECLARE_CS_FLAGS(flags);	mx2_priv->cmd = cmd;	/*remember command for further				   internal handling */	if (cmd == NAND_CMD_PAGEPROG) {		MX2NAND_ENTER_CS(flags);		NFC_NF_CONFIG2 = NAND_FLASH_CONFIG2_FDI;		mx2nand_wait();		MX2NAND_EXIT_CS(flags);	}	/*send command */	NFC_NAND_FLASH_CMD = cmd;	MX2NAND_ENTER_CS(flags);	NFC_NF_CONFIG2 = NAND_FLASH_CONFIG2_FCMD;	if (cmd != NAND_CMD_RESET)		mx2nand_wait();	MX2NAND_EXIT_CS(flags);	/*extra command processing for read/write-prepare commands */	switch (cmd) {	case NAND_CMD_READ0:		NFC_NF_CONFIG1 = 0x8 | 0x2;	/*enable ECC, Spare + Main Area */		mx2_priv->offset = 0;		mx2_priv->max_offset = 528;		break;	case NAND_CMD_READOOB:		NFC_NF_CONFIG1 = 0xC | 0x2;	/*enable ECC, Spare Area Only */		mx2_priv->offset = 0;		mx2_priv->max_offset = 16;		break;	case NAND_CMD_READID:		NFC_NF_CONFIG1 = 0x8 | 0x2;	/*enable ECC, Spare + Main Area */		mx2_priv->offset = 0;#ifdef CONFIG_MX2_16_BIT_NAND		mx2_priv->max_offset = 12;#else		mx2_priv->max_offset = 6;#endif		break;	case NAND_CMD_STATUS:		NFC_NF_CONFIG1 = 0x8 | 0x2;	/*enable ECC, Spare + Main Area */		mx2_priv->offset = 0;		mx2_priv->max_offset = 1;		break;	}}static voidmx2nand_send_address(u8 addr){	MX2NAND_DECLARE_CS_FLAGS(flags);	NFC_NAND_FLASH_ADDR = addr;	MX2NAND_ENTER_CS(flags);	NFC_NF_CONFIG2 = NAND_FLASH_CONFIG2_FADD;	mx2nand_wait();	MX2NAND_EXIT_CS(flags);}static voidmx2nand_write_byte(struct mtd_info *mtd, u_char byte){	struct nand_chip *chip_priv = mtd->priv;	struct mx2nand_priv *mx2_priv = chip_priv->priv;	u32 offset;	u16 buf;	int cmd;	switch (mx2_priv->mode) {	case NAND_CTL_SETCLE:		mx2nand_send_command(mtd, byte);		break;	case NAND_CTL_SETALE:		mx2nand_send_address(byte);		break;	default:		offset = mx2_priv->offset;		cmd = mx2_priv->cmd;		if ((offset >= 512) || (cmd == NAND_CMD_READOOB))			buf = *((u16 *) NFC_SAB_BASE(3) + (offset >> 1));		else			buf = *((u16 *) NFC_MAB_BASE(3) + (offset >> 1));		((u8 *) & buf)[offset & 0x1] = byte;		if ((offset >= 512) || (cmd == NAND_CMD_READOOB))			*((u16 *) NFC_SAB_BASE(3) + (offset >> 1)) = buf;		else			*((u16 *) NFC_MAB_BASE(3) + (offset >> 1)) = buf;		offset++;		if (offset >= mx2_priv->max_offset)			offset = 0;		mx2_priv->offset = offset;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美高清在线视频| 夜夜精品视频一区二区| 色久优优欧美色久优优| 奇米888四色在线精品| 国产精品区一区二区三区| 欧美三级在线看| 国产电影精品久久禁18| 日韩电影在线免费看| 中文字幕一区二区三区在线观看 | 国产精品久久网站| 91精品婷婷国产综合久久竹菊| 成人一道本在线| 麻豆精品久久精品色综合| 亚洲丝袜另类动漫二区| 久久精品人人爽人人爽| 555www色欧美视频| 色av综合在线| heyzo一本久久综合| 国产精品亚洲一区二区三区妖精| 亚洲福利一二三区| 亚洲欧洲美洲综合色网| 国产清纯白嫩初高生在线观看91 | 激情五月婷婷综合网| 夜夜嗨av一区二区三区四季av| 精品日本一线二线三线不卡| 91在线视频播放| 国产很黄免费观看久久| 日本最新不卡在线| 亚洲一区二区在线免费看| 91精品免费观看| 91丨porny丨在线| 国产伦精一区二区三区| 亚洲成av人影院在线观看网| 国产精品青草久久| 欧美成人艳星乳罩| 欧美亚日韩国产aⅴ精品中极品| 高清shemale亚洲人妖| 视频一区中文字幕国产| 中文字幕一区二区5566日韩| 久久这里只有精品视频网| 91精品国产综合久久久蜜臀图片 | 色激情天天射综合网| 国产成人在线网站| 久久精品国产久精国产爱| 亚洲大片在线观看| 亚洲猫色日本管| 国产精品久久久久久久久动漫| 久久久亚洲综合| 欧美不卡激情三级在线观看| 欧美日精品一区视频| 色综合激情五月| av在线不卡观看免费观看| 成人午夜大片免费观看| 福利电影一区二区三区| 国产成人精品亚洲日本在线桃色 | 91在线码无精品| 99免费精品视频| av成人免费在线| 成人午夜激情视频| 白白色 亚洲乱淫| 成人av一区二区三区| yourporn久久国产精品| 97成人超碰视| av在线不卡免费看| av不卡免费在线观看| 91在线视频免费观看| 91久久线看在观草草青青| 日本韩国一区二区三区| 欧美亚洲高清一区| 51精品久久久久久久蜜臀| 91麻豆精品国产91久久久| 91精品国产综合久久小美女| 日韩你懂的电影在线观看| 亚洲精品一区二区三区福利 | 欧美中文字幕一区二区三区 | 日本电影亚洲天堂一区| 欧美日韩成人激情| 日韩欧美一级二级| 国产欧美综合在线| 国产精品嫩草影院av蜜臀| 国产精品美女www爽爽爽| 国产精品久久久久永久免费观看| 亚洲国产精品99久久久久久久久| 中文字幕一区二区三区视频| 亚洲综合色网站| 蜜臀av在线播放一区二区三区| 蜜臀av一级做a爰片久久| 国产一区二区影院| 99久久精品国产精品久久| 欧美色视频在线| 精品欧美一区二区在线观看| 久久久久久久网| 亚洲日本va午夜在线电影| 亚洲激情av在线| 男男gaygay亚洲| 成人av手机在线观看| 欧美婷婷六月丁香综合色| 精品国产乱码久久久久久免费| 国产精品久久久久久亚洲伦 | 狠狠v欧美v日韩v亚洲ⅴ| av不卡在线播放| 欧美一区二区三区人| 国产校园另类小说区| 一区二区日韩av| 国产一区二区0| 91久久国产最好的精华液| 欧美电影免费提供在线观看| 亚洲人一二三区| 国产一区二区在线看| 欧美亚洲高清一区| 国产色91在线| 欧美96一区二区免费视频| 成人精品一区二区三区中文字幕| 欧美巨大另类极品videosbest| 欧美激情在线一区二区| 日日摸夜夜添夜夜添亚洲女人| 成人av免费在线播放| 日韩午夜在线播放| 樱花影视一区二区| 国产精品2024| 91精品国产综合久久小美女| 亚洲欧美成人一区二区三区| 狠狠色丁香久久婷婷综| 欧美日韩激情一区二区三区| 国产精品久久久久影院老司| 久久av资源网| 欧美日本在线观看| 亚洲视频1区2区| 国产老妇另类xxxxx| 91精品久久久久久久99蜜桃 | 在线电影院国产精品| 亚洲丝袜制服诱惑| 国产v综合v亚洲欧| 欧美人妇做爰xxxⅹ性高电影 | 精品三级在线观看| 亚洲图片一区二区| 91美女在线看| 国产三级久久久| 亚洲黄色av一区| 色综合久久综合网欧美综合网| 久久久精品免费网站| 精品一二三四区| 欧美一区二区三区播放老司机| 亚洲线精品一区二区三区八戒| 丁香婷婷综合网| 久久精品一区四区| 精品一区二区在线看| 日韩精品一区二区三区四区视频| 日韩精品一二区| 7777女厕盗摄久久久| 亚洲午夜免费福利视频| 91麻豆国产福利在线观看| 中文字幕人成不卡一区| 成人动漫精品一区二区| 久久久夜色精品亚洲| 久久99精品一区二区三区三区| 欧美一级一区二区| 美脚の诱脚舐め脚责91| 日韩欧美亚洲一区二区| 久久99久久久欧美国产| 91精品国产色综合久久ai换脸 | 日韩av电影天堂| 欧美一区二区三区的| 美女视频网站久久| 欧美va亚洲va| 国产精品亚洲一区二区三区在线 | 99久久夜色精品国产网站| 国产精品美女久久久久久久| www.日本不卡| 一区二区三区产品免费精品久久75| 99re视频精品| 亚洲成人午夜影院| 欧美一区二区女人| 狠狠色狠狠色综合| 国产欧美日韩在线| 91亚洲男人天堂| 亚洲va在线va天堂| 欧美videossexotv100| 国产馆精品极品| 亚洲欧洲美洲综合色网| 欧美特级限制片免费在线观看| 亚洲私人黄色宅男| 7777精品伊人久久久大香线蕉经典版下载 | 一本色道**综合亚洲精品蜜桃冫| 国产精品色哟哟| 91极品视觉盛宴| 日本伊人色综合网| 久久久亚洲精品一区二区三区| 99riav久久精品riav| 亚洲超碰精品一区二区| 精品播放一区二区| 91麻豆swag| 婷婷六月综合网| 日本一区二区三区dvd视频在线| 91香蕉视频在线| 六月丁香婷婷久久| 日韩理论片在线| 欧美一区二区黄| a在线播放不卡| 蜜桃在线一区二区三区|