亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
2021中文字幕一区亚洲| 91网站在线播放| 国产高清精品网站| 99综合影院在线| 在线国产电影不卡| 欧美成人aa大片| 欧美国产精品一区二区三区| 中文字幕佐山爱一区二区免费| 亚洲精品一二三区| 视频在线观看91| 粉嫩嫩av羞羞动漫久久久| 91福利区一区二区三区| 精品欧美乱码久久久久久1区2区| 国产精品欧美一区喷水| 亚洲观看高清完整版在线观看| 久久99国产精品久久99果冻传媒| 99精品偷自拍| 日韩三级在线免费观看| 一色屋精品亚洲香蕉网站| 日韩精品久久理论片| 成人黄色国产精品网站大全在线免费观看| 欧美影院午夜播放| 久久精品视频网| 午夜精品国产更新| 波多野结衣在线一区| 777亚洲妇女| 国产欧美日韩激情| 亚洲一区二区在线视频| 蜜桃av一区二区三区| 不卡的av中国片| 欧美精品日日鲁夜夜添| 欧美成人猛片aaaaaaa| 中文字幕第一区二区| 香蕉影视欧美成人| 国产精品66部| 欧美视频一区在线观看| 91精品久久久久久久91蜜桃| 亚洲精品在线一区二区| 国产网站一区二区| 亚洲成人第一页| 成人白浆超碰人人人人| 日韩一级二级三级| 亚洲欧美日韩在线播放| 激情久久久久久久久久久久久久久久| 97久久精品人人做人人爽50路| 欧美日韩一二三区| 国产女主播一区| 青青草一区二区三区| 91视视频在线观看入口直接观看www | 中文字幕一区二区三区乱码在线| 偷拍一区二区三区四区| av午夜精品一区二区三区| 日韩午夜中文字幕| 亚洲免费毛片网站| 国产乱码字幕精品高清av| 欧洲精品在线观看| 国产午夜久久久久| 亚洲成人免费视| 欧美一区二区三区四区在线观看| 亚洲视频免费在线观看| 国产精品一区二区果冻传媒| 91精品国产手机| 亚洲美女淫视频| 丁香婷婷深情五月亚洲| 日韩一区二区三区四区| 一区二区三区.www| 国产成人免费高清| 日韩精品一区二| 日本成人中文字幕在线视频| 色综合久久天天综合网| 日韩久久精品一区| 五月天精品一区二区三区| 日本高清不卡一区| 国产精品福利一区二区| 国产黄色精品视频| 久久综合一区二区| 黑人精品欧美一区二区蜜桃| 日韩一区二区高清| 亚洲一区在线观看网站| 欧美午夜理伦三级在线观看| 一区二区三区影院| 91成人看片片| 一区二区三区免费网站| 一本到一区二区三区| 亚洲天天做日日做天天谢日日欢 | 日韩欧美一区二区不卡| 亚洲福利国产精品| 欧美日韩五月天| 亚洲国产成人高清精品| 欧美天天综合网| 一区二区高清视频在线观看| 91理论电影在线观看| 久久久久亚洲综合| 国产精品综合二区| 国产精品理论片在线观看| 成人午夜视频福利| 国产精品久久久久久久第一福利| 高清不卡一二三区| 国产精品污网站| 91在线丨porny丨国产| 亚洲日本在线看| 色综合久久中文字幕| 亚洲永久精品国产| 欧美日韩国产高清一区二区三区| 日韩精品成人一区二区在线| 欧美精品少妇一区二区三区| 麻豆精品视频在线观看视频| 久久久久国色av免费看影院| 91丨九色丨黑人外教| 日韩在线一区二区三区| 精品少妇一区二区三区| 国产夫妻精品视频| 国产精品免费视频观看| 国产精品一区二区91| 国产欧美日韩在线看| 99精品国产热久久91蜜凸| 亚洲小说春色综合另类电影| 欧美一卡二卡在线| 国产精品自拍在线| 亚洲少妇屁股交4| 欧洲生活片亚洲生活在线观看| 日本不卡中文字幕| 久久精品水蜜桃av综合天堂| 91丨porny丨在线| 丝袜国产日韩另类美女| 久久夜色精品国产噜噜av| 95精品视频在线| 亚洲成人免费视| 亚洲精品一区二区三区影院| av在线不卡电影| 日本sm残虐另类| 国产精品久久久久7777按摩 | 欧美日韩高清不卡| 精品一区二区三区在线播放视频 | 亚洲精品乱码久久久久久久久 | 亚洲一区二区视频在线观看| 2020国产精品| 91九色02白丝porn| 国产一区二区三区在线观看免费| 中文字幕 久热精品 视频在线| 91免费国产视频网站| 久久成人免费日本黄色| 亚洲欧美经典视频| 精品日韩欧美一区二区| 色网站国产精品| 国产一区二区视频在线播放| 亚洲蜜臀av乱码久久精品| 亚洲精品一区二区三区香蕉| 日本精品一区二区三区高清 | 精品成人佐山爱一区二区| www.亚洲免费av| 捆绑变态av一区二区三区| 亚洲视频一二三| 日韩精品中文字幕一区| 91福利国产成人精品照片| 国产成人午夜视频| 午夜免费久久看| 自拍偷拍亚洲激情| 精品国产免费一区二区三区四区| 91黄色小视频| 成人99免费视频| 国产在线不卡视频| 亚洲激情图片一区| 国产精品午夜在线| 欧美不卡视频一区| 欧美日韩亚洲不卡| 色婷婷综合视频在线观看| 国产成人av一区二区| 国内精品国产成人国产三级粉色| 蜜臀av性久久久久蜜臀aⅴ| 天天av天天翘天天综合网| 亚洲免费观看高清完整版在线观看熊 | 亚洲精品视频在线观看网站| 久久久久成人黄色影片| 日韩午夜在线影院| 欧美精品v国产精品v日韩精品| 91视频国产观看| 国内成+人亚洲+欧美+综合在线| 日韩黄色小视频| 亚洲影视在线播放| 亚洲欧美日韩综合aⅴ视频| 国产精品日日摸夜夜摸av| 欧美电视剧在线观看完整版| 欧美日韩亚洲丝袜制服| 成人高清免费在线播放| 国产乱理伦片在线观看夜一区| 蜜桃av一区二区| 亚洲高清视频的网址| 亚洲欧美一区二区三区极速播放 | 欧美丰满少妇xxxxx高潮对白| 91蜜桃免费观看视频| 成人免费高清视频| 国产精品66部| 国产suv精品一区二区三区| 精品中文av资源站在线观看| 蜜乳av一区二区三区| 久久爱另类一区二区小说| 国产美女一区二区| 国产传媒久久文化传媒| caoporn国产精品|