📄 mmc_read.c
字号:
/****************************************************************************\
* Copyright (C) 1999-2000 Texas Instruments Incorporated.
* All Rights Reserved
*------------------------------------------------------------------------------
* MODULE NAME... MMC
* FILENAME...... mmc_read.c
* DATE CREATED.. Thu May 24 14:48:09 2001
* PROJECT....... Chip Support Library
* COMPONENT..... Service Layer
* PREREQUISITS..
*------------------------------------------------------------------------------
*
* HISTORY:
* Created: Thu May 24 14:48:09 2001 (Automatic generation)
* Last Modified:
*
*------------------------------------------------------------------------------
* DESCRIPTION: Reads a block of data from MMC card
*
\*************************************************************************/
#define _MMC_MOD_
/*************************************************************************\
* Included Header Files *
\*************************************************************************/
#include <csl_mmc.h>
#if (_MMC_SUPPORT)
#pragma CODE_SECTION(MMC_read,".text:MMC_read")
/**************************************************************************
* MMC_read(MMC_Handle mmc, Uint32 cardAddr, Uint16 *buffer, Uint32 length)
* mmc - Handle of MMC device reserved by previous call to
* MMC_open()
* carAddr - Address on MMC Card where read starts
* buffer - Pointer to buffer where data should be stored
* length - number of bytes to transfer.
***************************************************************************/
int MMC_read(MMC_Handle mmc, Uint32 cardAddr, Uint16 *buffer, Uint32 length){
Uint16 old_intm;
Uint16 noWords;
Uint16 ready;
Uint16 error;
Uint16 done;
Uint16 crd;
Uint32 lastAddr;
ioport MMC_MmcRegObj *regs;
MMC_ASSERT_HANDLE(mmc, return);
old_intm = IRQ_globalDisable();
noWords = length/2;
lastAddr = cardAddr;
error = 0;
done = 0;
crd = mmc->currentCard;
regs = mmc->mmcRegs;
regs->mmcblen = length;
regs->mmcnblk = 1;
// Clear out response registers
MMC_clearResponse(mmc);
// Format and send command
if (MMC_FGET_H(mmc,MMCCTL,SPIEN)) {
MMC_FSET_H(mmc,MMCCTL,CSEN,1); //select card
}
regs->mmcargh = (Uint16)((cardAddr >> 16)& 0xFFFFu);
regs->mmcargl = (Uint16)(cardAddr & 0xFFFFu);
if (!(MMC_FGET_H(mmc,MMCCTL,SPIEN))) {
regs->mmccmd = MMC_READ_SINGLE_BLOCK|0xA000; //send command
}
else {
regs->mmccmd = MMC_READ_SINGLE_BLOCK|0xE000; // if spimode, add 80 init cycles
}
IRQ_globalRestore(old_intm);
// Make sure command was accepted and card is ready
// Waiting to see if i must do a getStatus command for this
// Read data
do {
do {
ready = MMC_getStatus(mmc, MMC_ST0_DRRDY);
error = MMC_getStatus(mmc, MMC_USE_LAST_STATUS | MMC_ST0_CRCRD | MMC_ST0_TOUTRD | MMC_ST0_SPIERR);
// Checking for early DATDNE
done |= MMC_getStatus(mmc, MMC_USE_LAST_STATUS | MMC_ST0_DATDNE);
}while( !error && !ready );
if(ready){
*buffer++ = regs->mmcdrr;
lastAddr += 2;
}
}while( !error && --noWords );
// Test to make sure that we see a DATDNE signal
if( (error == 0) && (done == 0) ) {
MMC_waitForFlag(mmc,MMC_ST0_DATDNE | MMC_ST0_TOUTRD);
error = mmc->status & MMC_ST0_TOUTRD;
}
mmc->cards[crd].lastAddrRead = lastAddr;
if (MMC_FGET_H(mmc,MMCCTL,SPIEN)) {
MMC_FSET_H(mmc,MMCCTL,CSEN,0);
}
// Check for errors.
return( error == 0 ? 0 : -1 );
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -