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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mci_device.c

?? ARM9 AT9200 
?? 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_GetStatus
//* \brief Addressed card sends its status register
//*----------------------------------------------------------------------------
AT91S_MCIDeviceStatus AT91F_MCI_GetStatus(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_GetStatus(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_GetStatus(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_GetStatus(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,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品亚洲精品国产欧美| 国产精品少妇自拍| 国产91精品久久久久久久网曝门| 国产精品国产三级国产普通话99 | 日韩高清一级片| 国产精品久久午夜| 日韩美一区二区三区| 色呦呦一区二区三区| 国产精品资源在线观看| 婷婷开心激情综合| 成人欧美一区二区三区| 久久久另类综合| 欧美高清视频在线高清观看mv色露露十八| 国产一区二区在线观看视频| 亚洲成人一区在线| 亚洲视频在线观看一区| 久久久久一区二区三区四区| 欧美一级欧美三级在线观看| 日本韩国精品一区二区在线观看| 国产成人aaaa| 美腿丝袜亚洲色图| 午夜久久电影网| 亚洲免费观看高清在线观看| 中文字幕欧美日本乱码一线二线 | 久久精品男人天堂av| 91精品国产综合久久福利软件| 色综合中文综合网| 亚洲高清免费一级二级三级| 国产精品盗摄一区二区三区| 久久精品一区四区| 欧美电影免费观看完整版| 欧美日韩另类国产亚洲欧美一级| 97精品久久久午夜一区二区三区| 国产一区二区三区在线观看精品| 美女一区二区三区| 日本欧美一区二区| 日韩精品一二区| 日韩av成人高清| 青青草国产精品97视觉盛宴| 日本最新不卡在线| 免费在线观看不卡| 男人的天堂久久精品| 免费三级欧美电影| 久久国产夜色精品鲁鲁99| 免费日本视频一区| 国产成人综合视频| 国产69精品久久777的优势| 岛国一区二区三区| av不卡在线观看| 91理论电影在线观看| 色综合中文字幕国产 | 一区二区三区中文字幕| 亚洲欧美偷拍三级| 亚洲一区二区综合| 日韩精品五月天| 久久精工是国产品牌吗| 国产一区二区免费视频| 国产成人精品一区二| 99精品视频在线观看| 在线视频观看一区| 91麻豆精品国产91久久久更新时间| 欧美一区二区三区在线观看视频| 欧美大片在线观看一区| 久久久亚洲高清| 亚洲人精品一区| 亚洲18色成人| 精品一区二区三区视频在线观看| 国产剧情一区二区| 91蜜桃视频在线| 欧美日韩成人一区二区| 精品少妇一区二区三区日产乱码| 久久精品视频网| 一区二区三区中文在线| 日韩在线a电影| 成人免费观看av| 欧美三级电影在线看| 欧美电影精品一区二区| 亚洲欧美中日韩| 五月婷婷综合在线| 国产精品伊人色| 在线视频综合导航| 精品国产污污免费网站入口 | 一区二区三区四区在线播放| 日韩精品欧美精品| 成人av资源在线| 欧美另类z0zxhd电影| 国产亚洲欧美中文| 午夜私人影院久久久久| 国产成人亚洲综合a∨婷婷 | 日韩精品一区二区三区swag| 1024国产精品| 久久99热狠狠色一区二区| 91亚洲国产成人精品一区二区三| 欧美一区二区久久久| 综合激情网...| 国产综合久久久久久鬼色 | 国产传媒欧美日韩成人| 欧美日韩国产综合视频在线观看| 亚洲国产精品传媒在线观看| 亚洲动漫第一页| 成人av电影在线网| 337p日本欧洲亚洲大胆色噜噜| 亚洲综合色成人| 床上的激情91.| 日韩精品一区二区三区在线播放| 亚洲精品成a人| 成人在线视频一区| 日韩欧美的一区二区| 亚洲午夜羞羞片| 91丨九色丨黑人外教| 久久精品一级爱片| 极品美女销魂一区二区三区| 欧美精品乱码久久久久久按摩| 一区二区久久久久久| 丰满白嫩尤物一区二区| 日韩欧美国产一区二区在线播放| 亚洲一区在线观看视频| 国产成人夜色高潮福利影视| 欧美一级久久久| 有坂深雪av一区二区精品| 午夜久久久久久久久 | 69av一区二区三区| 1024成人网| 91视频国产资源| 国产视频一区在线观看| 蜜桃精品视频在线| 色狠狠av一区二区三区| 久久老女人爱爱| 日本 国产 欧美色综合| 国产福利一区二区| 日韩亚洲欧美高清| 日韩av电影天堂| 欧美三级乱人伦电影| 精品国产91亚洲一区二区三区婷婷| 日韩电影在线免费看| 欧美中文字幕不卡| 亚洲精品免费视频| 99久久久无码国产精品| 久久久精品日韩欧美| 久久激情五月婷婷| 欧美成人福利视频| 日本不卡一区二区三区 | 成人欧美一区二区三区白人| 成人在线综合网| 日本一区二区视频在线观看| 国产制服丝袜一区| 日韩丝袜情趣美女图片| 美脚の诱脚舐め脚责91| 91精品国产免费| 午夜精品福利久久久| 欧美人狂配大交3d怪物一区| 亚洲精品欧美激情| 欧美美女直播网站| 天堂久久久久va久久久久| 欧美老肥妇做.爰bbww视频| 亚洲成人免费影院| 日韩一区二区高清| 久久se这里有精品| 精品国产乱码久久久久久久| 国产一区二区三区在线看麻豆| 日韩一区二区三区视频在线观看| 精品夜夜嗨av一区二区三区| 久久品道一品道久久精品| 国产老女人精品毛片久久| 国产喂奶挤奶一区二区三区| 国产精品一区二区三区四区| 久久久久久久久久久电影| 风间由美一区二区av101| 一区在线播放视频| 在线欧美日韩精品| 麻豆一区二区三| 国产免费成人在线视频| jlzzjlzz亚洲女人18| 一区二区三区在线视频观看58| 欧美mv和日韩mv国产网站| 成人免费视频视频| 一区二区三区高清不卡| 欧美一区二区免费| 97久久超碰精品国产| 日日欢夜夜爽一区| 26uuuu精品一区二区| 北条麻妃国产九九精品视频| 日韩精品视频网站| 中文字幕av一区 二区| 欧美在线影院一区二区| 九九**精品视频免费播放| 亚洲精品视频免费看| 欧美巨大另类极品videosbest| 国产一区二区不卡| 亚洲最新在线观看| 欧美综合久久久| 日韩电影在线观看一区| 久久久亚洲精品一区二区三区 | 亚洲成a人在线观看| 精品国产三级电影在线观看| 99热这里都是精品| 国内精品国产成人国产三级粉色| 中文字幕综合网| 日韩女同互慰一区二区| 91色|porny|