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

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

?? mci.c

?? Hello I Send som Source Code Aboat LPC2000
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*****************************************************************************
 *   mci.c:  SD/MMC module file for NXP LPC23xx/24xx Family Microprocessors
 *
 *   Copyright(C) 2006, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2006.07.20  ver 1.00    Prelimnary version, first Release
 *
******************************************************************************/
#include "LPC23xx.h"                        /* LPC23xx/24xx definitions */
#include "type.h"
#include "irq.h"
#include "mci.h"
#include "dma.h"

volatile DWORD MCI_DataErrorProcess_count = 0;
volatile DWORD MCI_DATA_END_InterruptService_count = 0;
volatile DWORD MCI_FIFOInterruptService_count = 0;
volatile DWORD MCI_CmdProcess_count = 0;

volatile DWORD CmdCRCErrCount = 0;
volatile DWORD CmdTimeoutErrCount = 0;
volatile DWORD CmdRespEndCount = 0;
volatile DWORD CmdSentCount = 0;
volatile DWORD CmdActiveCount = 0;

volatile DWORD DataCRCErrCount = 0;
volatile DWORD DataTimeoutErrCount = 0;
volatile DWORD DataTxUnderrunErrCount = 0;
volatile DWORD DataRxOverrunErrCount = 0;
volatile DWORD DataStartbitErrCount = 0;

volatile DWORD DataEndCount = 0;
volatile DWORD DataBlockEndCount = 0;
volatile DWORD MCI_Block_End_Flag = 0;

volatile DWORD DataTxActiveCount = 0;
volatile DWORD DataRxActiveCount = 0;

volatile DWORD DataFIFOCount = 0;
volatile DWORD DataRxFIFOCount = 0;
volatile DWORD DataTxFIFOCount = 0;

volatile DWORD CardRCA;
volatile DWORD MCI_CardType;

/* Assembly modules using the ARM block transfer instruction in readfifo.s. */
extern  DWORD MCI_ReadFifo(DWORD * dest);
extern  DWORD MCI_WriteFifo(DWORD * src);

volatile BYTE *WriteBlock = (BYTE *)(DMA_SRC); /* treat WriteBlock as a constant address */
volatile BYTE *ReadBlock  = (BYTE *)(DMA_DST); /* treat ReadBlock as a constant address */

volatile DWORD TXBlockCounter=0, RXBlockCounter=0;
/******************************************************************************
** Function name:		MCI_Interrupt related
**
** Descriptions:		MCI interrupt handler and related APIs
**
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void MCI_TXEnable( void )
{
#if MCI_DMA_ENABLED
  MCI_MASK0 |= ((DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* Enable TX interrupts only */
  MCI_MASK1 |= ((DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* Enable TX interrupts only */
#else
  MCI_MASK0 |= ((FIFO_TX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* FIFO TX interrupts only */
  MCI_MASK1 |= ((FIFO_TX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* FIFO TX interrupts only */
#endif
  return;
}
/*****************************************************************/

void MCI_TXDisable( void )
{
#if MCI_DMA_ENABLED
  MCI_MASK0 &= ~((DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* Enable TX interrupts only */
  MCI_MASK1 &= ~((DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* Enable TX interrupts only */
#else
  MCI_MASK0 &= ~((FIFO_TX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* FIFO TX interrupts only */
  MCI_MASK1 &= ~((FIFO_TX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_TX_INT_MASK));	/* FIFO TX interrupts only */
#endif
  return;
}

/*****************************************************************/
void MCI_RXEnable( void )
{
#if MCI_DMA_ENABLED
  MCI_MASK0 |= ((DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* Enable RX interrupts only */
  MCI_MASK1 |= ((DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* Enable RX interrupts only */
#else
  MCI_MASK0 |= ((FIFO_RX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* FIFO RX interrupts only */
  MCI_MASK1 |= ((FIFO_RX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* FIFO RX interrupts only */
#endif
  return;
}

/*****************************************************************/

void MCI_RXDisable( void )
{
#if MCI_DMA_ENABLED
  MCI_MASK0 &= ~((DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* Enable TX interrupts only */
  MCI_MASK1 &= ~((DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* Enable TX interrupts only */
#else
  MCI_MASK0 &= ~((FIFO_RX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* FIFO TX interrupts only */
  MCI_MASK1 &= ~((FIFO_RX_INT_MASK)|(DATA_END_INT_MASK)|(ERR_RX_INT_MASK));	/* FIFO TX interrupts only */
#endif
  return;
}

/******************************************************************************
** Function name:		MCI_CheckStatus
**
** Descriptions:		MCI Check status before and after the block read and 
**						write. Right after the block read and write, this routine 
**						is important that, even the FIFO is empty, complete
**						block has been sent, but, data is still being written
**						to the card, this routine is to ensure that the data
**						has been written based on the state of the card, not
**						by the length being set.  
**
** parameters:			None
** Returned value:		TRUE or FALSE
** 
******************************************************************************/
DWORD MCI_CheckStatus( void )
{
  DWORD respValue;
  while ( 1 )
  {
	if ( (respValue = MCI_Send_Status()) == INVALID_RESPONSE )
	{
	  break;
	}
	else
	{
	  /* The only valid state is TRANS per MMC and SD state diagram.
	  RCV state may be seen, but, I have found that it happens
	  only when TX_ACTIVE or RX_ACTIVE occurs before the WRITE_BLOCK and 
	  READ_BLOCK cmds are being sent, which is not a valid sequence. */  
	  if ( (respValue & (0x0F << 8)) == 0x0900 )
	  {
		return ( TRUE );
	  }
	}
  }
  return ( FALSE );
}

/******************************************************************************
** Function name:		MCI_CmdProcess
**
** Descriptions:		Called by MCI interrupt handler
**						To simplify the process, for card initialization, the 
**						CMD interrupts are disabled.
**						
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void MCI_CmdProcess( void )
{
  DWORD MCIStatus;

  MCIStatus = MCI_STATUS;
  if ( MCIStatus &  MCI_CMD_CRC_FAIL )
  {
	CmdCRCErrCount++;
	MCI_CLEAR =  MCI_CMD_CRC_FAIL;
  }
  if ( MCIStatus &  MCI_CMD_TIMEOUT )
  {
	CmdTimeoutErrCount++;
	MCI_CLEAR =  MCI_CMD_TIMEOUT;
  }
  /* Cmd Resp End or Cmd Sent */
  if ( MCIStatus &  MCI_CMD_RESP_END )
  {
	CmdRespEndCount++;
	MCI_CLEAR =  MCI_CMD_RESP_END;
  }
  if ( MCIStatus &  MCI_CMD_SENT )
  {
	CmdSentCount++;
	MCI_CLEAR =  MCI_CMD_SENT;
  }
  if ( MCIStatus &  MCI_CMD_ACTIVE )
  {
	CmdActiveCount++;
	MCI_CLEAR =  MCI_CMD_ACTIVE;
  }
  return;
}

/******************************************************************************
** Function name:		MCI_DataErrorProcess
**
** Descriptions:		Called by MCI interrupt handler
**						Process data error. 
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void MCI_DataErrorProcess( void )
{
  DWORD MCIStatus;

  MCIStatus = MCI_STATUS;
  if ( MCIStatus &  MCI_DATA_CRC_FAIL )
  {
	DataCRCErrCount++;
	MCI_CLEAR = MCI_DATA_CRC_FAIL;
  }
  if ( MCIStatus &  MCI_DATA_TIMEOUT )
  {
	DataTimeoutErrCount++;
	MCI_CLEAR =  MCI_DATA_TIMEOUT;
  }
  /* Underrun or overrun */
  if ( MCIStatus &  MCI_TX_UNDERRUN )
  {
	DataTxUnderrunErrCount++;
	MCI_CLEAR = MCI_TX_UNDERRUN;
  }
  if ( MCIStatus &  MCI_RX_OVERRUN )
  {
	DataRxOverrunErrCount++;
	MCI_CLEAR =  MCI_RX_OVERRUN;
  }
  /* Start bit error on data signal */
  if ( MCIStatus &  MCI_START_BIT_ERR )
  {
	DataStartbitErrCount++;
	MCI_CLEAR =  MCI_START_BIT_ERR;
  }
  return;
}

/******************************************************************************
** Function name:		MCI_DATA_END_InterruptService
**
** Descriptions:		Called by MCI interrupt handler
**						This is the last interrupt module processing 
**                      the block write and	read to and from the MM card.
**					 
**                      FIFO interrupts are also used when DMA is disabled                                   
**						This routine simply clears the
**                      MCI_Block_End_Flag, and increments counters for debug
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void MCI_DATA_END_InterruptService( void )
{
  DWORD MCIStatus;

  MCIStatus = MCI_STATUS;
  if ( MCIStatus &  MCI_DATA_END )		/* Data end, and Data block end  */
  {
	DataEndCount++;
	MCI_CLEAR = MCI_DATA_END;
	return;
  }
  if ( MCIStatus &  MCI_DATA_BLK_END )
  {
	DataBlockEndCount++;
	MCI_CLEAR =  MCI_DATA_BLK_END;
	MCI_TXDisable();
	MCI_Block_End_Flag = 0;
	return;
  }
	
  /* Tx active  */
  if ( MCIStatus & MCI_TX_ACTIVE )
  {
	DataTxActiveCount++;
  }
  /* Rx active  */
  if ( MCIStatus & MCI_RX_ACTIVE )
  {
	DataRxActiveCount++;
  }
  return;
}

/******************************************************************************
** Function name:	MCI_FIFOInterruptService
**
** Descriptions:	Called by MCI interrupt handler when using FIFO 
**					interrupts and DMA is disabled
**						
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void MCI_FIFOInterruptService( void )
{
#if !MCI_DMA_ENABLED
  DWORD MCIStatus; 

  MCIStatus = MCI_STATUS;
  if ( MCIStatus & (FIFO_TX_INT_MASK ) )
  {
	DataTxFIFOCount++;			 /* if using TX_HALF_EMPTY remove one WriteFifo below */
	if ( MCIStatus & MCI_TX_HALF_EMPTY ) /* empty is multiple of 512 block size */
	{
	  MCI_WriteFifo((DWORD *)&WriteBlock[TXBlockCounter]); /* write 8 words to fifo */
	  TXBlockCounter += 32;
	}
	if (TXBlockCounter == BLOCK_LENGTH)	/* block complete */
	{
	  TXBlockCounter = 0;
	  MCI_MASK0 &= ~(FIFO_TX_INT_MASK);  /* disable FIFO int until next block write */
	  MCI_MASK1 &= ~(FIFO_TX_INT_MASK); 
	  /* wait for SD card to complete sending data i.e MCI_DATA_BLK_END interrupt */
	}
  }
  else if ( MCIStatus & (FIFO_RX_INT_MASK) )
  {
	DataRxFIFOCount++;
	if ( MCIStatus & MCI_RX_HALF_FULL )	/* if using RX_HALF_FULL remove one ReadFIFO below */
	{
	  MCI_ReadFifo((DWORD *)&ReadBlock[RXBlockCounter]); /* read 8 words from fifo */
	  RXBlockCounter += 32;
	}
	if (RXBlockCounter == BLOCK_LENGTH)	/* block complete */
	{
	  RXBlockCounter = 0;
	}
  }
#endif
  DataFIFOCount++;
  return;
}

/******************************************************************************
** Function name:		MCI_IRQHandler
**
** Descriptions:		MCI interrupt handler
**						The handler to handle the block data write and read
**						not for the commands.
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void MCI_IRQHandler (void) __irq 
{
  DWORD MCI_Status;

  MCI_Status = MCI_STATUS;	   
  /* handle MCI_STATUS interrupt */
  if ( MCI_Status & DATA_ERR_INT_MASK )
  {
	MCI_DataErrorProcess();
	MCI_DataErrorProcess_count++;
	VICVectAddr = 0;		/* Acknowledge Interrupt */
	return;
  }
  if ( MCI_Status & DATA_END_INT_MASK )
  {
	MCI_DATA_END_InterruptService();
	MCI_DATA_END_InterruptService_count++;
	VICVectAddr = 0;		/* Acknowledge Interrupt */
	return;
  }
  else if ( MCI_Status & FIFO_INT_MASK )
  {
	MCI_FIFOInterruptService();
	MCI_FIFOInterruptService_count++;
	VICVectAddr = 0;		/* Acknowledge Interrupt */
	return;
  }
  else if ( MCI_Status & CMD_INT_MASK )
  {
	MCI_CmdProcess();
	MCI_CmdProcess_count++;
	VICVectAddr = 0;		/* Acknowledge Interrupt */
	return;
  }
  VICVectAddr = 0;		/* Acknowledge Interrupt */
}

/******************************************************************************
** Function name:		MCI_Set_MCIClock
**
** Descriptions:		Set MCI clock rate, during initialization phase < 400K
**						during data phase < 20Mhz. 		
**
** parameters:			Clock rate to be set			
** Returned value:		None
** 
******************************************************************************/
void MCI_Set_MCIClock( DWORD ClockRate )
{
  DWORD i, ClkValue = 0;

  if ( ClockRate == SLOW_RATE ) 
	ClkValue |= MCLKDIV_SLOW;	/* slow clock */
  else if ( ClockRate == NORMAL_RATE ) 
	ClkValue |= MCLKDIV_NORMAL;/* normal clock */

  MCI_CLOCK &= ~(0xFF); /* clear clock divider */
  MCI_CLOCK |= (1 << 8)  |ClkValue;
  for ( i = 0; i < 0x10; i++ );	/* delay 3MCLK + 2PCLK before next write */
  return;
}

/******************************************************************************
** Function name:		SD_Set_BusWidth
**
** Descriptions:		1-bit bus or 4-bit bus.
**
** parameters:			bus width			
** Returned value:		TRUE or FALSE
** 
******************************************************************************/
DWORD SD_Set_BusWidth( DWORD width )
{
  DWORD i;

  for ( i = 0; i < 0x10; i++ );	/* delay 3MCLK + 2PCLK  */
  if ( width == SD_1_BIT )
  { 
	MCI_CLOCK &=  ~(1 << 11);	/* 1 bit bus */
  }
  else if ( width == SD_4_BIT )
  { 
	MCI_CLOCK |=  (1 << 11);/* 4 bit bus */
  }
	
  if ( MCI_Send_ACMD_Bus_Width( BUS_WIDTH_4BITS ) == FALSE ) 
  {
	return( FALSE );
  }
  return TRUE;
}

/******************************************************************************
** Function name:		MCI_Init
**
** Descriptions:		Set MCI clock and power registers, setup VIC for
**						data interrupt.		
**
** parameters:			None
** Returned value:		true or fase, if VIC table is full, return false
** 
******************************************************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人一级电影| 91精品国产综合久久福利| 不卡一区二区在线| 欧美日韩在线三级| 国产精品欧美一区二区三区| 亚洲第一av色| 成人三级在线视频| 欧美成人一区二区| 亚洲国产欧美一区二区三区丁香婷| 久久99精品久久久久久国产越南| 色狠狠综合天天综合综合| 久久天堂av综合合色蜜桃网| 亚洲午夜久久久久久久久电影院| 国产剧情一区在线| 欧美日韩精品一区二区天天拍小说| 中文子幕无线码一区tr| 美女视频免费一区| 精品视频999| 亚洲三级免费观看| 成人av午夜影院| 国产欧美一区二区精品婷婷| 日日欢夜夜爽一区| 欧美在线免费观看视频| 亚洲男人的天堂网| 99久久精品免费看| 国产精品久久久久久久久免费丝袜| 久久99久久99| 亚洲精品一区二区三区四区高清 | 91蝌蚪porny| 久久精品一区二区三区不卡| 视频在线观看一区二区三区| 欧洲视频一区二区| 一区二区在线观看不卡| 91亚洲国产成人精品一区二区三 | 精品久久久久久综合日本欧美| 亚洲一卡二卡三卡四卡| 99视频在线精品| 国产精品家庭影院| av欧美精品.com| 成人免费在线观看入口| av中文字幕一区| 亚洲另类在线一区| 欧美在线综合视频| 午夜精品久久久久久久久| 3d动漫精品啪啪1区2区免费 | 亚洲视频狠狠干| 91精品1区2区| 亚洲6080在线| 欧美电视剧在线观看完整版| 麻豆成人综合网| 久久先锋影音av鲁色资源网| 国产成人综合在线| 成人欧美一区二区三区| 欧美亚洲综合在线| 男人的天堂久久精品| 久久这里只有精品首页| 粉嫩绯色av一区二区在线观看 | 欧美日韩中文字幕精品| 日韩电影免费一区| 久久蜜桃一区二区| 91在线观看视频| 日本伊人午夜精品| 国产亚洲成年网址在线观看| 91蜜桃视频在线| 蜜臀久久99精品久久久久宅男| 久久免费美女视频| 91黄视频在线| 国产麻豆91精品| 亚洲激情六月丁香| 日韩欧美一区二区久久婷婷| 成人激情动漫在线观看| 日日摸夜夜添夜夜添精品视频 | 国产欧美精品一区| 91久久奴性调教| 国产一区在线观看视频| 亚洲精品久久久久久国产精华液| 538prom精品视频线放| 成人午夜视频在线观看| 天堂资源在线中文精品| 中文字幕在线观看一区| 91精品在线一区二区| 国产成人av一区二区三区在线观看| 国产精品国产精品国产专区不蜜 | 制服丝袜国产精品| 99re成人精品视频| 热久久久久久久| 亚洲欧美日韩久久精品| 久久先锋影音av鲁色资源| 欧美日韩国产不卡| 成人精品一区二区三区中文字幕| 日韩av二区在线播放| 依依成人精品视频| 欧美国产欧美综合| 日韩视频免费直播| 欧美日韩视频专区在线播放| k8久久久一区二区三区 | 亚洲女人****多毛耸耸8| 日韩美女主播在线视频一区二区三区| 99国产精品久久久久久久久久| 久久狠狠亚洲综合| 无码av免费一区二区三区试看| 国产欧美精品一区二区色综合 | 国产精品欧美精品| 精品欧美乱码久久久久久| 欧美色倩网站大全免费| 日本高清不卡在线观看| 成人免费观看av| 国产成人精品三级麻豆| 国产精品白丝jk黑袜喷水| 久久66热re国产| 丝袜亚洲精品中文字幕一区| 亚洲国产一区二区在线播放| |精品福利一区二区三区| 欧美国产欧美亚州国产日韩mv天天看完整 | 国产成人av电影在线观看| 亚洲特级片在线| 中文字幕第一页久久| 26uuu国产日韩综合| 日韩一区二区三区视频在线观看| 欧美狂野另类xxxxoooo| 4hu四虎永久在线影院成人| 欧美疯狂做受xxxx富婆| 欧美精品乱码久久久久久按摩| 欧美亚洲综合在线| 欧美欧美欧美欧美首页| 欧美精品99久久久**| 日韩一二在线观看| 精品蜜桃在线看| 欧美精彩视频一区二区三区| 国产亲近乱来精品视频| 中文字幕亚洲精品在线观看| 亚洲免费观看高清| 亚洲国产精品综合小说图片区| 午夜婷婷国产麻豆精品| 日本亚洲最大的色成网站www| 日韩精品高清不卡| 男人操女人的视频在线观看欧美| 麻豆精品国产91久久久久久| 国产麻豆视频一区| av不卡在线观看| 欧美性猛交xxxx乱大交退制版| 欧美日韩精品电影| 欧美大片免费久久精品三p| 久久久99久久| 亚洲另类春色校园小说| 青青草91视频| eeuss鲁片一区二区三区| 色视频成人在线观看免| 91精品国产综合久久国产大片 | 欧美乱妇15p| 亚洲精品在线一区二区| 国产精品久久久久久久久久免费看| 一区二区三区中文字幕电影 | 亚洲人成网站色在线观看 | 亚洲手机成人高清视频| 日本中文字幕一区二区视频 | 精品国内片67194| 国产精品国产馆在线真实露脸| 午夜视频一区在线观看| 岛国精品在线播放| 欧美日韩aaaaaa| 日本一区二区在线不卡| 日韩不卡一区二区三区| 成人免费高清视频在线观看| 91精品欧美综合在线观看最新| 亚洲欧洲精品一区二区三区 | 日韩女优毛片在线| 亚洲免费观看在线观看| 国产精品一二三四区| 欧美丰满美乳xxx高潮www| 国产精品久久久久影院亚瑟 | 亚洲综合图片区| 国产成人免费视频一区| 欧美一区二区三区公司| 亚洲精品乱码久久久久久| 国产精品亚洲综合一区在线观看| 欧美日免费三级在线| 中文字幕在线一区免费| 国产一区二区三区蝌蚪| 91精品久久久久久久久99蜜臂| 亚洲视频一二区| 成人亚洲精品久久久久软件| 日韩视频一区二区| 婷婷综合在线观看| 色婷婷av一区二区三区软件 | 亚洲一区二区三区四区五区黄| 成人免费毛片嘿嘿连载视频| 日韩欧美三级在线| 午夜精品免费在线观看| 欧美性做爰猛烈叫床潮| 亚洲色图19p| 91免费视频网| 中文字幕在线一区免费| 成人黄色国产精品网站大全在线免费观看 | 国产成人av一区| 欧美大片在线观看| 久久成人羞羞网站| 欧美日韩精品电影| 首页亚洲欧美制服丝腿| 欧美另类高清zo欧美|