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

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

?? mmc_pxa.c

?? linux下mmc_sd卡的驅動.rar
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* *  linux/drivers/mmc/mmc_pxa.c  *      driver for Cotulla MMC controller  * *  Authors:    Vladimir Shebordaev, Igor Oblakov    *  Copyright:  MontaVista Software Inc. * *  $Id: mmc_pxa.c,v 0.3.1.12 2002/09/25 19:25:48 ted Exp ted $ * *  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. *//*  The driver is modified by Ray.xian, the driver can support MMC and SD in PXA270 *  my  E-mail: mingrayxian@163.com   */#include <linux/version.h>#include <linux/config.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/slab.h>#include <linux/sched.h>#include <linux/delay.h>#include <asm/hardware.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/dma.h>#include <asm/uaccess.h>#include <asm/semaphore.h>#include <mmc/types.h>#include <mmc/mmc.h>#include <mmc/ioctl.h>//#define CONFIG_MMC_DEBUG//#define CONFIG_MMC_DEBUG_VERBOSE 0#include "types.h"#include "mmc.h"#include "mmc_pxa.h"#include <asm-arm/arch-pxa/pxa-regs.h>static mmc_controller_t host = NULL;static inline int pxa_mmc_send_cmd55( mmc_controller_t );//init GPIOstatic void init_gpio(void){ //MMCLK PIN32 OUT-AF2  GPCR1 |= 0x1;  GPDR1 = GPDR1 | (1<<0);  GAFR1_L = (GAFR1_L&0xfffffffc)  | (2<<0); //MMDAT0 PIN92  GPSR2 |= 0x10000000;  GPDR2 |= 0x10000000;  // GPDR2 = GPDR2 & ~(1<<28) ;  GAFR2_U = (GAFR2_U & 0xfcffffff) | (1<<24) ; //MMDAT1 PIN109  GPSR3 |= (1<<13);  GPDR3 |= (1<<13);  GAFR3_L = (GAFR3_L & 0xf3ffffff) | (1<<26) ; //MMDAT2 PIN110  GPSR3 |= (1<<14);  GPDR3 |= (1<<14);  GAFR3_L = (GAFR3_L & 0xcfffffff) | (1<<28); //MMDAT3 PIN111  GPSR3 |= (1<<15);  GPDR3 |= (1<<15);    GAFR3_L = (GAFR3_L & 0x3fffffff) | (1<<30); //MMCMD PIN112  GPSR3 |= 0x00010000;  GPDR3 |= 0x00010000;  //GPDR3 = GPDR3 & ~(1<<16);  GAFR3_U = (GAFR3_U & 0xfffffffc) | (1<<0);   //  GPSR3 |= 0x0000e000;  GPDR3 |= 0x0000e000;  GAFR3_L = (GAFR3_L & 0x03ffffff) | 0x54000000;}/* service routines */static inline int pxa_mmc_check_state( mmc_controller_t ctrlr, pxa_mmc_state_t state ){    int ret = -1;    pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data;        if ( hostdata->state != state ) {        //MMC_DEBUG( MMC_DEBUG_LEVEL3,  "state (%s vs %s)\n",  PXA_MMC_STATE_LABEL( hostdata->state ),  PXA_MMC_STATE_LABEL( state ) );        goto error;    }    ret = 0;error:              return ret;}static inline void pxa_mmc_set_state( mmc_controller_t ctrlr, pxa_mmc_state_t state ){	pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data;    	hostdata->state = state;}static inline int pxa_mmc_init_completion( mmc_controller_t ctrlr, u32 mask ){	int ret = -1;	pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data;    	if ( xchg( &hostdata->busy, 1 ) ) {		MMC_DEBUG( MMC_DEBUG_LEVEL3, "another interrupt "			"is already been expected\n" );		goto error;	}    #if CONFIG_MMC_DEBUG_IRQ 	hostdata->irqcnt = 1000;#endif	init_completion( &hostdata->completion );    	MMC_I_MASK = MMC_I_MASK_ALL & ~mask;	ret = 0;error:	return ret;}#if CONFIG_MMC_DEBUG_IRQ static struct timer_list timer;static void wait_timeo( unsigned long arg ) {	pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)arg;	hostdata->timeo = 1;	complete( &hostdata->completion );	return;}#endifstatic inline int pxa_mmc_wait_for_completion( mmc_controller_t ctrlr, u32 mask ){	int ret = -1;	pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data;    	if ( !xchg( &hostdata->busy, 1 ) ) {        	MMC_DEBUG( MMC_DEBUG_LEVEL0, "there were no "				"interrupt awaited for\n" );		goto error;	}#if CONFIG_MMC_DEBUG_IRQ    	hostdata->timeo = 0;    	del_timer( &timer );	timer.function = wait_timeo;	timer.expires = jiffies + 1UL*HZ;	timer.data = (unsigned long)hostdata;	add_timer( &timer );#endif	wait_for_completion( &hostdata->completion );#if CONFIG_MMC_DEBUG_IRQ    	del_timer( &timer );	if ( hostdata->timeo ) {		MMC_DEBUG( MMC_DEBUG_LEVEL3, "irq timed out: " "mask=%x stat=%x\n", mask, MMC_STAT );		goto error;	}#endif		/*  verify interrupt */	//if ( (mask == ~0UL) || !( hostdata->mmc_i_reg & ~mask ) ) 		ret = 0;    error:	xchg( &hostdata->busy, 0 ); 	return ret;}static inline int pxa_mmc_stop_bus_clock( mmc_controller_t ctrlr ){	int ret = -1;    	if ( !pxa_mmc_check_state( ctrlr, PXA_MMC_FSM_CLK_OFF ) )		{ goto out;}			if ( !pxa_mmc_check_state( ctrlr, PXA_MMC_FSM_BUFFER_IN_TRANSIT ) ) {		MMC_DEBUG( MMC_DEBUG_LEVEL3, "BUFFER_IN_TRANSIT\n" );	        goto error;	}        		if ( pxa_mmc_init_completion( ctrlr, MMC_I_MASK_CLK_IS_OFF ) )		{ goto error;}    	MMC_STRPCL = MMC_STRPCL_STOP_CLK;		if ( pxa_mmc_wait_for_completion( ctrlr, MMC_I_REG_CLK_IS_OFF ) )	{goto error;}                      /* MMC_I_MASK = MMC_I_MASK_ALL ;            MMC_STRPCL |= 1;            while(!(MMC_I_REG & (1<<4)) )              {              }            printk(KERN_EMERG"%s::%s::MMC_I_REG is 0x%08x\n", __FILE__, __FUNCTION__, MMC_I_REG);           */     	//MMC_DEBUG( MMC_DEBUG_LEVEL3, "clock is off\n" );	pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_CLK_OFF ); out:	ret = 0;error:	return ret;}static inline int pxa_mmc_start_bus_clock( mmc_controller_t ctrlr ){	int ret = -1;	pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data;    	if ( (hostdata->state != PXA_MMC_FSM_CLK_OFF)	     && (hostdata->state != PXA_MMC_FSM_END_IO) ) {		MMC_DEBUG( MMC_DEBUG_LEVEL3, "illegal state %s\n", PXA_MMC_STATE_LABEL( hostdata->state ) );		goto error;	}    	MMC_STRPCL = MMC_STRPCL_START_CLK;	wmb();	//MMC_DEBUG( MMC_DEBUG_LEVEL3, "clock is on\n" ); 	ret = 0;error:	return ret;}/* int pxa_mmc_complete_cmd( mmc_controller_t ctrlr, mmc_response_fmt_t response )Effects: initializes completion to wait for END_CMD_RES intr,         waits for intr to occur, checks controller and card status Requiers: controller is in CLK_OFF stateModifies: moves controller to the END_CMD stateReturns: */ static mmc_error_t pxa_mmc_complete_cmd( mmc_controller_t ctrlr, mmc_response_fmt_t format, int send_abort ){	mmc_error_t ret = MMC_ERROR_GENERIC;	pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data;	int mask, nwords;	u32 status;    	MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD%d(0x%04x%04x)\n", MMC_CMD & 0x3f, MMC_ARGH, MMC_ARGL);/* FIXME: check arguments */    	if ( (hostdata->state != PXA_MMC_FSM_CLK_OFF)	     && (hostdata->state != PXA_MMC_FSM_END_IO) ) {		MMC_DEBUG( MMC_DEBUG_LEVEL3, "illegal state %s\n",				PXA_MMC_STATE_LABEL( hostdata->state ) );		goto error;	}    	mask = MMC_I_MASK_END_CMD_RES;	if ( pxa_mmc_init_completion( ctrlr, mask ) )		goto error;    	MMC_PRTBUF = MMC_PRTBUF_BUF_FULL; /* start the clock */	if ( pxa_mmc_start_bus_clock( ctrlr ) )		goto error;    /* wait for END_CMD_RES intr */	if ( pxa_mmc_wait_for_completion( ctrlr, MMC_I_REG_END_CMD_RES ) )		goto error;/* check status */    /*modify here*/   {  register int i;      nwords = (format == MMC_NORESPONSE) ? 0 :		(format == MMC_R1) ? 3 : 		(format == MMC_R2) ? 8 :		(format == MMC_R3) ? 3 :		(format == MMC_R6) ? 3 :		-1;	ret = nwords;       // printk("nword is 0x%d\n", nwords);        for ( i = nwords - 1; i >= 0 ; i-- ) {			u32 res = MMC_RES;			int ibase = i<<1;                       // printk(__FILE__" RESPONE is 0x%08x\n", res);			hostdata->mmc_res[ibase] = ((u8 *)&res)[0];			hostdata->mmc_res[ibase + 1] = ((u8 *)&res)[1];			--ret;	 	}      }  /*modify here*/	if ( hostdata->mmc_stat & MMC_STAT_TIME_OUT_RESPONSE ) {		// MMC_DEBUG(MMC_DEBUG_LEVEL3, "response timeout\n");		ret = MMC_ERROR_TIME_OUT_RESPONSE;		goto error;    	} else if ( hostdata->mmc_stat & MMC_STAT_READ_TIME_OUT ) {		// MMC_DEBUG(MMC_DEBUG_LEVEL3, "read timeout\n");		ret = MMC_ERROR_READ_TIME_OUT;		goto error;    	} else if ( hostdata->mmc_stat & MMC_STAT_RES_CRC_ERROR ) {		// MMC_DEBUG(MMC_DEBUG_LEVEL3, "response crc err\n");                if ( ((MMC_CMD & 2)|| (MMC_CMD & 9) || (MMC_CMD & 10) )  && (hostdata->mmc_res[ ((nwords-1)<<1)] & 0x80 ))                {                        //printk("MMC_STAT_RES_CRC_ERROR occour, the word [127]is 0x%08x\n",  hostdata->mmc_res[(nwords-1)<<1]);                }                else 		  { ret = MMC_ERROR_RES_CRC_ERROR;	 	   goto error;}    	} else if ( hostdata->mmc_stat & MMC_STAT_CRC_READ_ERROR ) {		// MMC_DEBUG(MMC_DEBUG_LEVEL3, "read crc err\n");		ret = MMC_ERROR_CRC_READ_ERROR;		goto error;        	} else if ( hostdata->mmc_stat & MMC_STAT_CRC_WRITE_ERROR ) {		// MMC_DEBUG(MMC_DEBUG_LEVEL3, "write crc err\n");		ret = MMC_ERROR_CRC_WRITE_ERROR;		goto error;	}  /*  	nwords = (format == MMC_NORESPONSE) ? 0 :		(format == MMC_R1) ? 3 : 		(format == MMC_R2) ? 8 :		(format == MMC_R3) ? 3 : 		-1;	ret = nwords;        printk(__FILE__" "__FUNCTION__"nword is 0x%d\n", nwords);*/	if ( nwords > 0 ) {//		register int i;/*		MMC_DEBUG( MMC_DEBUG_LEVEL3, "nwords=%d\n", nwords );		for ( i = nwords - 1; i >= 0 ; i-- ) {			u32 res = MMC_RES;			int ibase = i<<1;                        printk(__FILE__" "__FUNCTION__"RESPONE is 0x%08x\n", res);			hostdata->mmc_res[ibase] = ((u8 *)&res)[0];			hostdata->mmc_res[ibase + 1] = ((u8 *)&res)[1];			--ret;		}  */ #ifdef CONFIG_MMC_DEBUG		switch ( format ) {		case MMC_R1:			MMC_DUMP_R1( ctrlr );			break;		case MMC_R2:			MMC_DUMP_R2( ctrlr );			break;		case MMC_R3:			MMC_DUMP_R3( ctrlr );			break;		default:			MMC_DEBUG( MMC_DEBUG_LEVEL3, 					"unknown response format\n" );			ret = MMC_ERROR_GENERIC;			goto error;		}#endif/* check card status for R1(b) commands */		if ( format == MMC_R1 ) {			u8 cmd;						((u8 *)&status)[0] = hostdata->mmc_res[1];			((u8 *)&status)[1] = hostdata->mmc_res[2];			((u8 *)&status)[2] = hostdata->mmc_res[3];			((u8 *)&status)[3] = hostdata->mmc_res[4];			cmd = PXA_MMC_RESPONSE( ctrlr, 5 )&0x3f;			/*MMC_DEBUG( MMC_DEBUG_LEVEL3, 			//printk( KERN_INFO __FUNCTION__"():                         "cmd=%u status: 0x%08x\n",                        cmd, status );                         */                       			switch ( cmd ) {			case 11:			case 18:			case 20:			case 25:				if ( !(status & 0x00000100) ) /* FIXME */					goto mmc_error;			default:				break;			}			if ( status & MMC_CARD_STATUS_OUT_OF_RANGE ) {				ret = MMC_ERROR_OUT_OF_RANGE;				goto mmc_error;		    	} else if ( status & MMC_CARD_STATUS_ADDRESS_ERROR ) {				ret = MMC_ERROR_ADDRESS_ERROR;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_BLOCK_LEN_ERROR ) {				ret = MMC_ERROR_ADDRESS_ERROR;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_ERASE_SEQ_ERROR ) {				ret = MMC_ERROR_ERASE_SEQ_ERROR;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_ERASE_PARAM ) {				ret = MMC_ERROR_ERASE_PARAM;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_WP_VIOLATION ) {				ret = MMC_ERROR_WP_VIOLATION;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_CARD_IS_LOCKED ) {				ret = MMC_ERROR_CARD_IS_LOCKED;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_LOCK_UNLOCK_FAILED ) {				ret = MMC_ERROR_LOCK_UNLOCK_FAILED;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_COM_CRC_ERROR ) {				ret = MMC_ERROR_COM_CRC_ERROR;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_ILLEGAL_COMMAND ) {			//	ret = MMC_ERROR_ILLEGAL_COMMAND;			//	goto mmc_error;			} else if ( status & MMC_CARD_STATUS_CARD_ECC_FAILED ) {				ret = MMC_ERROR_CARD_ECC_FAILED;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_CC_ERROR ) {				ret = MMC_ERROR_CC_ERROR;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_ERROR ) {				ret = MMC_ERROR_ERROR;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_UNDERRUN ) {				ret = MMC_ERROR_UNDERRUN;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_OVERRUN ) {				ret = MMC_ERROR_OVERRUN;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_CID_CSD_OVERWRITE ) {				ret = MMC_ERROR_CID_CSD_OVERWRITE;				goto mmc_error;			} else if ( status & MMC_CARD_STATUS_ERASE_RESET ) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品国产a| 成人av免费网站| 国产精品一区二区久久不卡| 一本色道久久综合精品竹菊| 精品免费日韩av| 亚洲国产你懂的| 97se亚洲国产综合自在线观| 久久一区二区视频| 午夜影视日本亚洲欧洲精品| 91首页免费视频| 26uuu国产日韩综合| 琪琪久久久久日韩精品| 欧美制服丝袜第一页| 亚洲婷婷国产精品电影人久久| 国产精品久久久久久久久免费樱桃 | 亚洲美女视频在线| 从欧美一区二区三区| 精品久久久久久无| 日韩av电影免费观看高清完整版 | 在线播放亚洲一区| 亚洲美腿欧美偷拍| av亚洲精华国产精华| 2021国产精品久久精品| 美女网站色91| 日韩视频免费观看高清完整版| 亚洲一区二区黄色| 欧美三级三级三级爽爽爽| 亚洲久草在线视频| 欧美性受xxxx黑人xyx性爽| 一区二区三区不卡在线观看| 色噜噜偷拍精品综合在线| 亚洲日本中文字幕区| 97超碰欧美中文字幕| 一区二区三区在线观看欧美| 色94色欧美sute亚洲线路二| 亚洲女爱视频在线| 欧美三级在线视频| 日韩电影网1区2区| 精品国产乱码久久久久久夜甘婷婷| 美女脱光内衣内裤视频久久影院| 精品国产91亚洲一区二区三区婷婷| 美女视频免费一区| 国产欧美综合色| 91丨porny丨国产入口| 亚洲gay无套男同| 欧美mv日韩mv国产网站| 国产精品一级在线| 亚洲欧洲精品一区二区三区不卡 | 亚洲国产视频一区| 91精品国产欧美一区二区成人| 日韩影院精彩在线| 2021久久国产精品不只是精品| 国产高清精品久久久久| 亚洲欧美国产毛片在线| 51午夜精品国产| 国产91在线|亚洲| 亚洲一区精品在线| 精品99久久久久久| 不卡的av在线| 日韩av中文字幕一区二区三区| 日韩欧美亚洲一区二区| 岛国精品在线观看| 亚洲一区二区三区四区在线免费观看 | 国产一区二区网址| 综合电影一区二区三区 | 日本成人在线视频网站| 国产亚洲婷婷免费| 在线视频国内一区二区| 免费成人在线视频观看| 国产精品乱子久久久久| 欧美精品一二三| 成人理论电影网| 日韩精品1区2区3区| 国产精品三级在线观看| 日韩亚洲欧美在线观看| a在线欧美一区| 久久国内精品自在自线400部| 亚洲精品国产一区二区精华液| 精品少妇一区二区三区免费观看| 成a人片国产精品| 久久99精品久久久久| 亚洲精品中文字幕乱码三区| 久久久久九九视频| 日韩一区二区影院| 在线观看一区日韩| 懂色av中文字幕一区二区三区| 三级在线观看一区二区| ...av二区三区久久精品| 久久综合av免费| 制服丝袜在线91| 欧美午夜一区二区三区免费大片| 高清在线不卡av| 韩国三级电影一区二区| 日本aⅴ精品一区二区三区 | 色综合久久天天| 国产福利一区在线| 蜜桃久久精品一区二区| 亚洲成人一二三| 亚洲精品成人在线| 国产精品传媒在线| 中文一区一区三区高中清不卡| 精品国产sm最大网站免费看| 51久久夜色精品国产麻豆| 欧美精品日日鲁夜夜添| 欧美日本乱大交xxxxx| 99精品热视频| 91亚洲精品一区二区乱码| 成人白浆超碰人人人人| 成人一区二区三区视频在线观看 | 久久久蜜臀国产一区二区| 日韩免费视频一区| 精品成人一区二区三区四区| 精品国产乱码久久久久久免费| 欧美成人一区二区三区片免费 | 亚洲视频在线观看一区| 欧美国产精品v| 国产精品国产三级国产普通话三级 | 日韩一区二区三区四区五区六区| 88在线观看91蜜桃国自产| 884aa四虎影成人精品一区| 3d成人动漫网站| 精品日本一线二线三线不卡| 26uuu国产在线精品一区二区| 国产亚洲欧美激情| 欧美国产丝袜视频| 亚洲人成网站影音先锋播放| 一区二区在线观看av| 亚洲国产日韩a在线播放| 三级成人在线视频| 国内外成人在线视频| 国产精品香蕉一区二区三区| www.av亚洲| 欧美日韩日本视频| 精品国产自在久精品国产| 欧美激情一区二区三区蜜桃视频| 亚洲欧美视频一区| 日韩国产在线一| 激情六月婷婷久久| 不卡一卡二卡三乱码免费网站| 在线观看视频一区| 制服丝袜日韩国产| 国产午夜亚洲精品不卡| 亚洲免费观看视频| 日本不卡的三区四区五区| 国产成人午夜片在线观看高清观看| 白白色 亚洲乱淫| 欧美日韩精品一区二区三区蜜桃| www一区二区| 一区二区三区自拍| 久久精品99国产精品| 成人18视频在线播放| 欧美一级二级在线观看| 国产精品久久久久久久久果冻传媒| 亚洲国产日韩在线一区模特| 国产精品一区二区在线观看网站| 91在线观看高清| 欧美成人欧美edvon| 一区二区三区在线高清| 国产乱码精品1区2区3区| 欧美性三三影院| 国产精品免费人成网站| 男男成人高潮片免费网站| 成人动漫视频在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 婷婷丁香久久五月婷婷| 波多野结衣的一区二区三区| 日韩免费视频一区| 亚洲第一在线综合网站| 成人午夜在线播放| 日韩美女一区二区三区| 亚洲一区二区精品久久av| 成人精品一区二区三区中文字幕| 日韩三区在线观看| 亚洲综合久久久久| 波多野结衣在线一区| 欧美videos中文字幕| 亚洲电影在线播放| 成人av网址在线| 日本一区二区免费在线| 精品制服美女丁香| 欧美精品视频www在线观看| 亚洲欧美二区三区| 成人av电影免费在线播放| 久久久亚洲综合| 狠狠色丁香久久婷婷综| 欧美一级免费大片| 亚洲高清三级视频| 欧美体内she精高潮| 亚洲视频免费看| 不卡视频免费播放| 亚洲视频一区二区在线| 成人免费视频国产在线观看| 国产日产欧美一区二区视频| 韩国成人在线视频| 国产亚洲一区二区三区四区| 懂色av中文一区二区三区| 欧美国产日韩精品免费观看| 不卡大黄网站免费看| ㊣最新国产の精品bt伙计久久| 91色视频在线|