亚洲欧美第一页_禁久久精品乱码_粉嫩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,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费高清在线| 久久99精品久久久| 日韩精品最新网址| 99热精品一区二区| 久久精品国产亚洲5555| 亚洲综合视频在线| 国产精品―色哟哟| 日韩欧美视频在线| 欧美中文字幕一区二区三区| 国产91露脸合集magnet| 久久精品免费观看| 亚洲高清一区二区三区| 亚洲色欲色欲www| 久久精品视频在线看| 欧美一区二区日韩一区二区| 色综合天天视频在线观看| 国产精品123| 久久精品国产久精国产爱| 一区二区三区在线免费视频 | voyeur盗摄精品| 国产精品一二三四| 久久se这里有精品| 秋霞av亚洲一区二区三| 性做久久久久久久免费看| 亚洲免费毛片网站| 亚洲视频1区2区| 国产精品美女久久久久久久久久久| 精品国产一区二区三区不卡| 日韩免费性生活视频播放| 91精品综合久久久久久| 欧美亚洲国产怡红院影院| 色综合久久久久| 99精品黄色片免费大全| 99免费精品在线| 不卡的av电影在线观看| 成人国产精品免费观看动漫 | 欧洲一区二区三区在线| av电影在线不卡| 大美女一区二区三区| 国产91丝袜在线播放0| 国产一区 二区| 国产精品一区二区在线看| 国产美女精品在线| 国产成人精品免费网站| 成人一区二区视频| 97久久久精品综合88久久| 91首页免费视频| 在线免费观看视频一区| 欧美日韩日本视频| 欧美高清一级片在线| 4hu四虎永久在线影院成人| 91精品欧美一区二区三区综合在| 91精品中文字幕一区二区三区| 欧美一区欧美二区| 日韩美女一区二区三区| 久久久www成人免费毛片麻豆| 久久久噜噜噜久久中文字幕色伊伊| 精品久久久久久久久久久久包黑料| 久久综合中文字幕| 国产精品热久久久久夜色精品三区| 国产精品久久久久久久久免费桃花| ...xxx性欧美| 香港成人在线视频| 看电视剧不卡顿的网站| 丰满岳乱妇一区二区三区| 91丝袜国产在线播放| 欧美午夜宅男影院| 69堂成人精品免费视频| 久久综合久久鬼色中文字| 国产精品第一页第二页第三页| 亚洲精品成人在线| 蜜桃久久av一区| 不卡欧美aaaaa| 色94色欧美sute亚洲线路二| 欧美一区二区三区在线观看| 国产午夜亚洲精品理论片色戒| 日韩理论片在线| 蜜桃一区二区三区在线观看| 国产成人av在线影院| 欧美体内she精高潮| 欧美大片顶级少妇| 综合精品久久久| 蜜桃91丨九色丨蝌蚪91桃色| 成人理论电影网| 51午夜精品国产| 国产精品理论片| 日本不卡高清视频| 99精品久久只有精品| 日韩视频一区二区三区在线播放 | 成人一区在线看| 日韩一级精品视频在线观看| 最新日韩av在线| 狠狠狠色丁香婷婷综合激情 | 亚洲精品国产无套在线观| 七七婷婷婷婷精品国产| 成人91在线观看| 欧美一区二区三区的| 一区二区三区四区激情| 国产一区二区精品久久91| 欧美亚洲日本国产| 国产精品国产三级国产三级人妇| 日产国产欧美视频一区精品| 91免费国产在线| 久久精品日产第一区二区三区高清版 | 日韩国产一区二| 色综合中文字幕| 日本一区二区三级电影在线观看| 天堂久久一区二区三区| 91最新地址在线播放| ww亚洲ww在线观看国产| 日产欧产美韩系列久久99| 欧美午夜理伦三级在线观看| 亚洲欧洲精品一区二区精品久久久 | 日韩在线播放一区二区| 一本色道综合亚洲| 国产精品美女久久久久久久网站| 久久99国产精品久久99果冻传媒| 欧美日韩国产电影| 亚洲一区在线观看免费观看电影高清| 国产酒店精品激情| 欧美成人a在线| 美女视频黄久久| 欧美一级片在线看| 天天色天天操综合| 欧美日韩中文字幕精品| 一区二区三区在线免费播放| 99久久精品免费看国产免费软件| 欧美国产成人精品| 国产成人自拍网| 国产日产欧产精品推荐色| 国产美女一区二区三区| 久久久久久毛片| 国产精品白丝jk黑袜喷水| 久久久蜜桃精品| 粉嫩嫩av羞羞动漫久久久| 国产日本亚洲高清| 国产99精品在线观看| 亚洲国产精品国自产拍av| 国产成人日日夜夜| 国产精品欧美一区二区三区| av午夜一区麻豆| 亚洲美女偷拍久久| 在线视频一区二区三| 亚洲午夜一二三区视频| 欧美日本在线看| 日本欧美一区二区| 日韩午夜电影av| 国产在线国偷精品产拍免费yy| 久久久久综合网| 成人免费毛片嘿嘿连载视频| 亚洲人成影院在线观看| 欧美日韩一二区| 日本午夜精品一区二区三区电影| 欧美刺激脚交jootjob| 国产露脸91国语对白| 国产精品免费丝袜| 欧美性一二三区| 精品在线你懂的| 中文字幕在线免费不卡| 欧美日韩在线免费视频| 日本中文一区二区三区| 久久久久久久久久久久久女国产乱| 国产91在线|亚洲| 亚洲在线免费播放| 日韩精品资源二区在线| 成人午夜激情在线| 亚洲午夜久久久久久久久电影院| 欧美一级艳片视频免费观看| 国产精品911| 亚洲午夜私人影院| 久久久亚洲综合| 欧美最猛黑人xxxxx猛交| 精品亚洲成a人| 亚洲乱码精品一二三四区日韩在线| 8x福利精品第一导航| 国产a久久麻豆| 亚洲成人一区在线| 久久天堂av综合合色蜜桃网| 日本久久电影网| 九九热在线视频观看这里只有精品| 亚洲欧美怡红院| 欧美mv和日韩mv的网站| 色综合欧美在线视频区| 国产一区二区在线免费观看| 一区二区三区美女| 精品成a人在线观看| 欧美亚洲综合另类| 国产成人av一区二区| 日韩av在线播放中文字幕| 国产精品灌醉下药二区| 日韩午夜中文字幕| 在线看国产日韩| 粉嫩在线一区二区三区视频| 欧美a一区二区| 亚洲一区在线免费观看| 国产三级精品三级在线专区| 欧美一卡2卡三卡4卡5免费| 色视频成人在线观看免| 高清日韩电视剧大全免费| 日韩高清在线观看|