?? mmcio.c
字號:
/******************************************************************************
C H E A D E R F I L E
(c) Copyright Motorola Semiconductors Hong Kong Limited 1999 - 2002
ALL RIGHTS RESERVED
*******************************************************************************
Project Name : Portable Personal System Manager - GT version 2.0
Project No. : PDAPSM05
Title :
File Name : MMCIO.h
Last Modified: Jan 31, 2002
Description :
Assumptions : Hardware IO functions
Dependency Comments :
Project Specific Data :
******************************************************************************/
#include "mmclocal.h"
/******************************************************************************
Function Name : _PortAsetting()
Input Parameters : VOID
Output Parameters: VOID
Value returned : VOID
Description : Set Port A
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _PortRsetting()
{
//IODCR (0x8000 = 8mA, 0x0000 = 4mA) for IO drive strength
//*(P_U16)IODCR = 0x8000; //TEST
*(P_U8)PORT_PRPUEN =0x3f; //pull-up pull-down
*(P_U8)PORT_PRSEL =0x00; //dedicated io select
}
/******************************************************************************
Function Name : _MMCChectHardwareRevision()
Input Parameters : VOID
Output Parameters: VOID
Value returned : U32 0:Sucess 1: Error
Description : Check hardware revision
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCChectHardwareRevision()
{
U16 static HardwareID;
//obtain Hardware Revision No & Card Detect Input
HardwareID =*(P_U16)MMCR_REV_NO;
//Check the HardwareID is 0x0370
if(HardwareID!=0x0380)
return MMC_HARDWARE_REV; //Hardware Revision Error;
return 0;
}
/******************************************************************************
Function Name : _MMCSoftReset()
Input Parameters : VOID
Output Parameters: VOID
Value returned : U32 0:Success 1: Error
Description : Soft reset
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCSoftReset()
{
//system reset
_PortRsetting();
*(P_U16)MMCR_STR_STP_CLK=0x08;
while ((*(P_U16)MMCR_STATUS)!=0x00);
//system reset, MMC core enable & Stop clk
*(P_U16)MMCR_STR_STP_CLK=0x0d;
while ((*(P_U16)MMCR_STATUS)!=0x00);
//MMC Core enable & Stop clk
_MMCStopClk();
while ((*(P_U16)MMCR_STATUS)!=0x40);
//Set MMC Clock Rate Register PerScaler=0x6 ClockRate=0x6
*(P_U16)MMCR_CLK_RATE=0x36;
//Set MMC Read Time Out Register
*(P_U16)MMCR_READ_TO=0xFFFF;
//Set MMC Response Time-Out Register
*(P_U16)MMCR_RES_TO=0xFF;
//Set Block length register
*(P_U16)MMCR_BLK_LEN=MMC_BLOCK_SIZE;
//Set MMC Number of Blocks Register
*(P_U16)MMCR_NOB=1;
return 0;
}
/******************************************************************************
Function Name : _MMCSetCmd(U8 cmd,U32 arg,U32 ctrl)
Input Parameters : U8 cmd :Command Number
U32 arg :Command Argument
U32 ctrl :Command Control register
Output Parameters: VOID
Value returned : U32 0:Success 1: Error
Description : Set some command registers
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCSetCmd(U8 cmd,U32 arg,U32 ctrl)
{
TRACE(" ----------------------------------------\n");
TRACE(" CMD%02d Arg: 0x%08X Ctrl: 0x%04X\n",cmd,arg,ctrl);
*(P_U16)MMCR_CMD=cmd;
*(P_U16)MMCR_ARGUMENTH=arg>>16;
*(P_U16)MMCR_ARGUMENTL=arg&0xFFFF;
*(P_U16)MMCR_CMD_DAT_CONT=ctrl;
_gLastErrorCmd=cmd;
}
/******************************************************************************
Function Name : _MMCIsRun()
Input Parameters : VOID
Output Parameters: VOID
Value returned : U8 0:Running 1: No Running
Description : Set some command registers
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
U8 _MMCIsRun()
{
if((*(P_U16)MMCR_STATUS)&0x100)
return 1;
else
return 0;
}
/******************************************************************************
Function Name : _MMCStartClk()
Input Parameters : VOID
Output Parameters: VOID
Value returned : VOID
Description : Start MMC Clock
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCStartClk()
{
*(P_U16)MMCR_STR_STP_CLK=0x06;
while(((*(P_U16)MMCR_STATUS)&0x100)==0);
}
/******************************************************************************
Function Name : _MMCStopClk()
Input Parameters : VOID
Output Parameters: VOID
Value returned : VOID
Description : Stop MMC Clock
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCStopClk()
{
int i;
U16 clk;
i=0;
*(P_U16)MMCR_STR_STP_CLK=0x05;
while(((*(P_U16)MMCR_STATUS)&0x100)!=0);
}
/******************************************************************************
Function Name : _MMCGetResponses(MMC_RESPONSES *pRS,U8 rsType)
Input Parameters : MMC_RESPONSES *pRS : buffer
U8 rsType : response type
Output Parameters: VOID
Value returned : VOID
Description : Get Response of MMC Command
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCGetResponses(MMC_RESPONSES *pRS,U8 rsType)
{
int i;
static U16 rs;
static U32 temp;
U8 *p;
if(rsType==MMCB_R1||rsType==MMCB_R6)
{
pRS->status=0;
rs=*(P_U16)MMCR_RES_FIFO;
pRS->status|=((U32)rs&0x00FF)<<24;
rs=*(P_U16)MMCR_RES_FIFO;
pRS->status|=((U32)rs)<<8;
rs=*(P_U16)MMCR_RES_FIFO;
pRS->status|=(rs&0xFF00)>>8;
TRACE(" Reponses-> 0x%08X\n",pRS->status);
}else if(rsType==MMCB_R3)
{
pRS->OCR=0;
rs=*(P_U16)MMCR_RES_FIFO;
temp=rs&0x00FF;
pRS->OCR|=temp<<24;
rs=*(P_U16)MMCR_RES_FIFO;
pRS->OCR|=((U32)rs)<<8;
rs=*(P_U16)MMCR_RES_FIFO;
pRS->OCR|=(rs&0xFF00)>>8;
TRACE(" Reponses-> 0x%08X\n",pRS->OCR);
}
else
{ p=pRS->CSD;
for(i=0;i<8;i++)
{
rs=*(P_U16)MMCR_RES_FIFO;
*(P_U16)p=rs;
p+=2;
}
TRACE(" Response-> ");
for(i=0;i<16;i++)
{
TRACE(" %02X",pRS->CSD[i]);
}
TRACE("\n");
}
}
/******************************************************************************
Function Name : _MMCSetBlockLenReg(U16 size)
Input Parameters : U16 size : Block Size
Output Parameters: VOID
Value returned : VOID
Description : Set block size register
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCSetBlockLenReg(U16 size)
{
*(P_U16)MMCR_BLK_LEN=size;
}
/******************************************************************************
Function Name : _MMCSetNumberOfBlockReg(U16 num)
Input Parameters : U16 num : Number of block
Output Parameters: VOID
Value returned : VOID
Description : Set Number of block register
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCSetNumberOfBlockReg(U16 num)
{
*(P_U16)MMCR_NOB=num;
}
/******************************************************************************
Function Name : _MMCClockSet(U8 speed)
Input Parameters : U8 0xFF High speed
Output Parameters: VOID
Value returned : VOID
Description : Set Number of block register
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCClockSet(U8 speed)
{
if(speed==0xFF)
{
*(P_U16)MMCR_CLK_RATE=0x4;
}
else
*(P_U16)MMCR_CLK_RATE=0x36;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -