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

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

?? mci_device.c

?? AT91SAM9263的SD卡驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : mci_device.c
//* Object              : TEST DataFlash Functions
//* Creation            : FB   26/11/2002
//*
//*----------------------------------------------------------------------------

#include "AT91C_MCI_Device.h"

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_SendCommand
//* \brief Generic function to send a command to the MMC or SDCard
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_SendCommand (
	AT91PS_MciDevice pMCI_Device,
	unsigned int Cmd,
	unsigned int Arg)
{
	unsigned int	error,status;
	//unsigned int	tick=0;

    // Send the command
    AT91C_BASE_MCI->MCI_ARGR = Arg;
    AT91C_BASE_MCI->MCI_CMDR = Cmd;

	// wait for CMDRDY Status flag to read the response
	do
	{
		status = AT91C_BASE_MCI->MCI_SR;
		//tick++;
	}
	while( !(status & AT91C_MCI_CMDRDY) );//&& (tick<100) );

    // Test error  ==> if crc error and response R3 ==> don't check error
    error = (AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR;
	if(error != 0 )
	{
		// if the command is SEND_OP_COND the CRC error flag is always present (cf : R3 response)
		if ( (Cmd != AT91C_SDCARD_APP_OP_COND_CMD) && (Cmd != AT91C_MMC_SEND_OP_COND_CMD) )
			return ((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR);
		else
		{
			if (error != AT91C_MCI_RCRCE)
				return ((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR);
		}
	}
    return AT91C_CMD_SEND_OK;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_SDCard_SendAppCommand
//* \brief Specific function to send a specific command to the SDCard
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_SDCard_SendAppCommand (
	AT91PS_MciDevice pMCI_Device,
	unsigned int Cmd_App,
	unsigned int Arg	)
{
	unsigned int status;
	//unsigned int	tick=0;

	// Send the CMD55 for application specific command
    AT91C_BASE_MCI->MCI_ARGR = (pMCI_Device->pMCI_DeviceFeatures->Relative_Card_Address << 16 );
    AT91C_BASE_MCI->MCI_CMDR = AT91C_APP_CMD;

	// wait for CMDRDY Status flag to read the response
	do
	{
		status = AT91C_BASE_MCI->MCI_SR;
		//tick++;
	}
	while( !(status & AT91C_MCI_CMDRDY) );//&& (tick<100) );	
    // if an error occurs
    if (((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR) != 0 )
		return ((AT91C_BASE_MCI->MCI_SR) & AT91C_MCI_SR_ERROR);
    // check if it is a specific command and then send the command
	if ( (Cmd_App && AT91C_SDCARD_APP_ALL_CMD) == 0)
		return AT91C_CMD_SEND_ERROR;
   return( AT91F_MCI_SendCommand(pMCI_Device,Cmd_App,Arg) );
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_GetStatusSd
//* \brief Addressed card sends its status register
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_GetStatusSd(AT91PS_MciDevice pMCI_Device,unsigned int relative_card_address)
{
	if (AT91F_MCI_SendCommand(pMCI_Device,
								AT91C_SEND_STATUS_CMD,
								relative_card_address <<16) == AT91C_CMD_SEND_OK)
    	return (AT91C_BASE_MCI->MCI_RSPR[0]);

    return AT91C_CMD_SEND_ERROR;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_Device_Handler
//* \brief MCI C interrupt handler
//*----------------------------------------------------------------------------
void AT91F_MCI_Device_Handler(
	AT91PS_MciDevice pMCI_Device,
	unsigned int status)
{
	// If End of Tx Buffer Empty interrupt occurred
	if ( status & AT91C_MCI_TXBUFE )
    {
		AT91C_BASE_MCI->MCI_IDR = AT91C_MCI_TXBUFE;
 		AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_TXTDIS;
        	
		pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_IDLE;
	}	// End of if AT91C_MCI_TXBUFF		
	
    // If End of Rx Buffer Full interrupt occurred
    if ( status & AT91C_MCI_RXBUFF )
    {        
       	AT91C_BASE_MCI->MCI_IDR = AT91C_MCI_RXBUFF;
 		AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_RXTDIS;
	
		pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_IDLE;
	}	// End of if AT91C_MCI_RXBUFF

}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_ReadBlock
//* \brief Read an ENTIRE block or PARTIAL block
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_ReadBlock(
	AT91PS_MciDevice pMCI_Device,
	int src,
	unsigned int *dataBuffer,
	int sizeToRead )
{
    ////////////////////////////////////////////////////////////////////////////////////////////
    if(pMCI_Device->pMCI_DeviceDesc->state != AT91C_MCI_IDLE)
    	return AT91C_READ_ERROR;
    
    if( (AT91F_MCI_GetStatusSd(pMCI_Device,pMCI_Device->pMCI_DeviceFeatures->Relative_Card_Address) & AT91C_SR_READY_FOR_DATA) != AT91C_SR_READY_FOR_DATA)
    	return AT91C_READ_ERROR;
    	
    if ( (src + sizeToRead) > pMCI_Device->pMCI_DeviceFeatures->Memory_Capacity )
		return AT91C_READ_ERROR;

    // If source does not fit a begin of a block
	if ( (src % pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length) != 0 )
		return AT91C_READ_ERROR;
   
     // Test if the MMC supports Partial Read Block
     // ALWAYS SUPPORTED IN SD Memory Card
     if( (sizeToRead < pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length) 
    	&& (pMCI_Device->pMCI_DeviceFeatures->Read_Partial == 0x00) )
   		return AT91C_READ_ERROR;
   		
    if( sizeToRead > pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length)
   		return AT91C_READ_ERROR;
    ////////////////////////////////////////////////////////////////////////////////////////////
      
    // Init Mode Register
	AT91C_BASE_MCI->MCI_MR |= ((pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length << 16) | AT91C_MCI_PDCMODE);
	 
    if (sizeToRead %4)
		sizeToRead = (sizeToRead /4)+1;
	else
		sizeToRead = sizeToRead/4;

	AT91C_BASE_PDC_MCI->PDC_PTCR = (AT91C_PDC_TXTDIS | AT91C_PDC_RXTDIS);
    AT91C_BASE_PDC_MCI->PDC_RPR  = (unsigned int)dataBuffer;
    AT91C_BASE_PDC_MCI->PDC_RCR  = sizeToRead;

	// Send the Read single block command
    if ( AT91F_MCI_SendCommand(pMCI_Device, AT91C_READ_SINGLE_BLOCK_CMD, src) != AT91C_CMD_SEND_OK )
    	return AT91C_READ_ERROR;

	pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_RX_SINGLE_BLOCK;

	// Enable AT91C_MCI_RXBUFF Interrupt
    AT91C_BASE_MCI->MCI_IER = AT91C_MCI_RXBUFF;

	// (PDC) Receiver Transfer Enable
	AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_RXTEN;
	
	return AT91C_READ_OK;
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_MCI_WriteBlock
//* \brief  Write an ENTIRE block but not always PARTIAL block !!!
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_WriteBlock(
	AT91PS_MciDevice pMCI_Device,
	int dest,
	unsigned int *dataBuffer,
	int sizeToWrite )
{
    ////////////////////////////////////////////////////////////////////////////////////////////
	if( pMCI_Device->pMCI_DeviceDesc->state != AT91C_MCI_IDLE)
    	return AT91C_WRITE_ERROR;
    
    if( (AT91F_MCI_GetStatusSd(pMCI_Device,pMCI_Device->pMCI_DeviceFeatures->Relative_Card_Address) & AT91C_SR_READY_FOR_DATA) != AT91C_SR_READY_FOR_DATA)
    	return AT91C_WRITE_ERROR;
    	
    if ( (dest + sizeToWrite) > pMCI_Device->pMCI_DeviceFeatures->Memory_Capacity )
		return AT91C_WRITE_ERROR;

    // If source does not fit a begin of a block
	if ( (dest % pMCI_Device->pMCI_DeviceFeatures->Max_Read_DataBlock_Length) != 0 )
		return AT91C_WRITE_ERROR;
   
    // Test if the MMC supports Partial Write Block 
    if( (sizeToWrite < pMCI_Device->pMCI_DeviceFeatures->Max_Write_DataBlock_Length) 
    	&& (pMCI_Device->pMCI_DeviceFeatures->Write_Partial == 0x00) )
   		return AT91C_WRITE_ERROR;
   		
   	if( sizeToWrite > pMCI_Device->pMCI_DeviceFeatures->Max_Write_DataBlock_Length )
   		return AT91C_WRITE_ERROR;
    ////////////////////////////////////////////////////////////////////////////////////////////
  
    // Init Mode Register
	AT91C_BASE_MCI->MCI_MR |= ((pMCI_Device->pMCI_DeviceFeatures->Max_Write_DataBlock_Length << 16) | AT91C_MCI_PDCMODE);
	
	if (sizeToWrite %4)
		sizeToWrite = (sizeToWrite /4)+1;
	else
		sizeToWrite = sizeToWrite/4;

	// Init PDC for write sequence
    AT91C_BASE_PDC_MCI->PDC_PTCR = (AT91C_PDC_TXTDIS | AT91C_PDC_RXTDIS);
    AT91C_BASE_PDC_MCI->PDC_TPR = (unsigned int) dataBuffer;
    AT91C_BASE_PDC_MCI->PDC_TCR = sizeToWrite;

	// Send the write single block command
    if ( AT91F_MCI_SendCommand(pMCI_Device, AT91C_WRITE_BLOCK_CMD, dest) != AT91C_CMD_SEND_OK)
    	return AT91C_WRITE_ERROR;

	pMCI_Device->pMCI_DeviceDesc->state = AT91C_MCI_TX_SINGLE_BLOCK;

	// Enable AT91C_MCI_TXBUFE Interrupt
    AT91C_BASE_MCI->MCI_IER = AT91C_MCI_TXBUFE;
  
  	// Enables TX for PDC transfert requests
    AT91C_BASE_PDC_MCI->PDC_PTCR = AT91C_PDC_TXTEN;
  
	return AT91C_WRITE_OK;
}

//*------------------------------------------------------------------------------------------------------------
//* \fn    AT91F_MCI_MMC_SelectCard
//* \brief Toggles a card between the Stand_by and Transfer states or between Programming and Disconnect states
//*------------------------------------------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_MMC_SelectCard(AT91PS_MciDevice pMCI_Device, unsigned int relative_card_address)
{
    int status;
	
	//* Check if the MMC card chosen is already the selected one
	status = AT91F_MCI_GetStatusSd(pMCI_Device,relative_card_address);

	if (status < 0)
		return AT91C_CARD_SELECTED_ERROR;

	if ((status & AT91C_SR_CARD_SELECTED) == AT91C_SR_CARD_SELECTED)
		return AT91C_CARD_SELECTED_OK;

	//* Search for the MMC Card to be selected, status = the Corresponding Device Number
	status = 0;
	while( (pMCI_Device->pMCI_DeviceFeatures[status].Relative_Card_Address != relative_card_address)
		   && (status < AT91C_MAX_MCI_CARDS) )
		status++;

	if (status > AT91C_MAX_MCI_CARDS)
    	return AT91C_CARD_SELECTED_ERROR;

    if (AT91F_MCI_SendCommand( pMCI_Device,
    								   AT91C_SEL_DESEL_CARD_CMD,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人综合网站| 波多野结衣一区二区三区| 亚洲综合激情另类小说区| 中文字幕高清一区| 中文字幕精品三区| 国产精品乱码一区二区三区软件| 2022国产精品视频| 欧美精品一区二区不卡| 亚洲精品一区二区三区精华液| 日韩一区二区免费视频| 日韩亚洲欧美成人一区| 精品精品国产高清a毛片牛牛 | 欧美网站大全在线观看| 日本伦理一区二区| 欧美日韩三级视频| 91精品国产乱码| 日韩三级伦理片妻子的秘密按摩| 欧美va亚洲va在线观看蝴蝶网| 日韩欧美在线观看一区二区三区| 日韩美女主播在线视频一区二区三区 | 91在线国内视频| 在线观看一区二区精品视频| 欧美三级韩国三级日本一级| 欧美二区乱c少妇| 精品久久久久一区二区国产| 久久久久久亚洲综合影院红桃| 欧美激情一区在线| 亚洲女与黑人做爰| 日韩不卡一二三区| 国产资源在线一区| 成人午夜看片网址| 欧美视频你懂的| 精品久久久久久久久久久久久久久 | 91精品欧美综合在线观看最新| 欧美一区二区精品| 国产拍欧美日韩视频二区| 亚洲精品日韩一| 日本欧美久久久久免费播放网| 国产一区二区伦理| 色呦呦网站一区| 欧美一区二区三区电影| 国产精品丝袜在线| 午夜欧美视频在线观看| 国产一区福利在线| 色婷婷综合久久久久中文| 日韩欧美电影一区| 日韩一区欧美小说| 免费的国产精品| 成人高清视频在线| 欧美一区二区日韩| 成人欧美一区二区三区| 日本vs亚洲vs韩国一区三区二区| 国产91高潮流白浆在线麻豆| 在线免费观看日韩欧美| 欧美精品一区二区三区很污很色的 | 在线视频亚洲一区| 26uuuu精品一区二区| 亚洲黄一区二区三区| 久久国产人妖系列| 日本福利一区二区| 精品播放一区二区| 亚洲一区二区三区四区五区黄| 国模娜娜一区二区三区| 欧美影视一区二区三区| 国产视频视频一区| 免费人成在线不卡| 91福利在线观看| 亚洲国产精品t66y| 久久不见久久见中文字幕免费| 91官网在线免费观看| 中文一区二区在线观看| 美女一区二区久久| 欧美日韩在线综合| 《视频一区视频二区| 国产毛片精品视频| 欧美一区二区三区四区久久| 亚洲免费在线看| 国产69精品久久777的优势| 欧美一级精品大片| 亚洲成人免费视频| 91国产福利在线| 亚洲另类春色国产| 不卡一卡二卡三乱码免费网站| 337p日本欧洲亚洲大胆精品| 免费看日韩a级影片| 在线观看网站黄不卡| 亚洲欧美日韩国产中文在线| 国产91精品在线观看| 久久色成人在线| 国精品**一区二区三区在线蜜桃| 欧美日本在线观看| 午夜亚洲福利老司机| 日本黄色一区二区| 亚洲精品久久久蜜桃| av不卡在线观看| 中文字幕五月欧美| 菠萝蜜视频在线观看一区| 精品剧情v国产在线观看在线| 蜜桃91丨九色丨蝌蚪91桃色| 制服丝袜国产精品| 日本不卡123| 精品日韩一区二区三区| 精品一二线国产| 337p粉嫩大胆色噜噜噜噜亚洲| 美国欧美日韩国产在线播放| 91精品视频网| 激情综合一区二区三区| 亚洲精品在线免费观看视频| 精品一区二区三区香蕉蜜桃| 精品捆绑美女sm三区| 国产一区二区导航在线播放| 久久夜色精品一区| 成人国产精品免费网站| 国产精品国产三级国产aⅴ原创| 高清av一区二区| 亚洲欧洲精品一区二区三区不卡| 99久久精品一区| 亚洲永久精品国产| 91精品国产乱码久久蜜臀| 激情综合网天天干| 国产精品免费视频网站| 色综合色狠狠综合色| 亚洲一区在线播放| 这里是久久伊人| 激情五月播播久久久精品| 欧美国产在线观看| 91久久精品一区二区| 日本亚洲视频在线| 久久久久久亚洲综合影院红桃| 不卡一区二区中文字幕| 一区二区三区欧美日| 91精品福利在线一区二区三区| 麻豆精品在线播放| 国产精品久久久久一区| 在线一区二区三区| 麻豆精品在线播放| 国产精品久久久久久户外露出 | 91国内精品野花午夜精品| 视频一区在线视频| wwwwxxxxx欧美| 91美女精品福利| 蜜桃av噜噜一区二区三区小说| 久久色在线视频| 在线免费一区三区| 久久99久久精品欧美| 国产精品久久久久影院亚瑟| 欧美网站一区二区| 国产精品一区二区91| 一二三四区精品视频| 欧美xfplay| 色哟哟国产精品| 国内精品国产三级国产a久久| 亚洲欧美综合网| 91麻豆精品国产91久久久资源速度 | 粉嫩欧美一区二区三区高清影视| 亚洲激情一二三区| 日韩午夜精品视频| 91免费在线看| 国产麻豆视频精品| 亚洲国产精品一区二区久久恐怖片 | 国产在线国偷精品免费看| 亚洲欧美偷拍三级| 日韩欧美色综合| 91丨九色丨蝌蚪富婆spa| 久久精品久久久精品美女| 亚洲精品欧美综合四区| 国产日韩在线不卡| 欧美一区二区三区婷婷月色 | 中文字幕在线观看不卡视频| 欧美丰满一区二区免费视频| 99久久99久久综合| 激情都市一区二区| 婷婷综合久久一区二区三区| 欧美国产国产综合| 日韩无一区二区| 欧美视频一区二区三区在线观看| 成人午夜在线播放| 国产一区二区女| 美女视频黄a大片欧美| 亚洲资源在线观看| 18欧美乱大交hd1984| 久久精品日韩一区二区三区| 欧美一卡二卡三卡| 欧美色爱综合网| 色又黄又爽网站www久久| 成人高清av在线| 国内成人精品2018免费看| 视频一区视频二区中文字幕| 亚洲自拍偷拍图区| 最新国产の精品合集bt伙计| 欧美国产精品一区二区| 欧美不卡一区二区三区| 在线成人午夜影院| 欧美色精品在线视频| 91成人在线观看喷潮| 色婷婷综合久久久中文一区二区| 99国产精品国产精品毛片| 成人在线视频一区| 高清在线观看日韩| 国产成人鲁色资源国产91色综|