?? sd_reader_routines.c
字號:
#include <unistd.h>
#include <sys/alt_cache.h>
#include "sd_reader_routines.h"
#include "sd_reader_regs.h"
typedef struct
{
int done;
alt_dma_rxchan rx;
void* sd_reader_base;
} SD_DMA_HANDLE, *LPSD_DMA_HANDLE;
int sd_reader_init( void* sd_reader_base )
{
IOWR_SD_READER_STATE( sd_reader_base, SD_READER_RESET_BIT );
if( (IORD_SD_READER_STATE( sd_reader_base ) & SD_READER_STATE_RDMASK) != SD_READER_INIT_STATE )
{
return -1;
}//end if
return 0;
}//end sd_reader_init
inline int sd_reader_query_cardready( void* sd_reader_base )
{
return( IORD_SD_READER_STATE( sd_reader_base ) & SD_READER_CARDREADY_BIT );
}//end sd_reader_query_cardready
inline int sd_reader_query_dataready( void* sd_reader_base )
{
return( IORD_SD_READER_STATE( sd_reader_base ) & SD_READER_DATAREADY_BIT );
}//end sd_reader_query_dataready
int sd_reader_request_initcard( void* sd_reader_base )
{
IOWR_SD_READER_STATE( sd_reader_base, SD_READER_INITCARD_BIT );
return 0;
}//end sd_reader_request_initcard
inline int sd_reader_request_read( void* sd_reader_base, alt_u32 secindex, int autoreread )
{
IOWR_SD_READER_READADDRLO( sd_reader_base, (alt_u16)(secindex & 0xFFFF) );
IOWR_SD_READER_READADDRHI( sd_reader_base, (alt_u16)((secindex >> 16) & 0xFFFF) );
IOWR_SD_READER_STATE( sd_reader_base, SD_READER_READCARD_BIT | (autoreread ? SD_READER_AUTOREREAD_BIT : 0) );
return 0;
}//end sd_reader_request_read
int sd_reader_request_streamread( void* sd_reader_base, alt_u32 secindex )
{
IOWR_SD_READER_READADDRLO( sd_reader_base, (alt_u16)(secindex & 0xFFFF) );
IOWR_SD_READER_READADDRHI( sd_reader_base, (alt_u16)((secindex >> 16) & 0xFFFF) );
IOWR_SD_READER_STATE( sd_reader_base, SD_READER_STREAMREAD_BIT );
return 0;
}//end sd_reader_request_streamread
int sd_reader_request_stopread( void* sd_reader_base )
{
IOWR_SD_READER_STATE( sd_reader_base, 0 );
return 0;
}//end sd_reader_request_stopread
static void dma_done( void* handle, void* data )
{
LPSD_DMA_HANDLE rh = (LPSD_DMA_HANDLE)handle;
alt_dma_rxchan_ioctl( rh->rx, ALT_DMA_RX_ONLY_OFF, rh->sd_reader_base );
rh->done = 1;
}//end dma_done;
int sd_reader_read( alt_dma_rxchan rx, void* sd_reader_base, void* data, int size, int* crcerr )
{
const int READ_BLOCK_CNT = size >> 1;
volatile SD_DMA_HANDLE handle;
int res = -1;
int i;
//while( !sd_reader_query_dataready( sd_reader_base ) );
if( rx == NULL )
{
for( i = 0; i < READ_BLOCK_CNT; ++i )
{
((alt_u16*)data)[i] = IORD_SD_READER_DATA( sd_reader_base );
}//end for
res = 0;
}
else{// DMA
handle.done = 0;
handle.rx = rx;
handle.sd_reader_base = sd_reader_base;
res = alt_dma_rxchan_ioctl( rx, ALT_DMA_RX_ONLY_ON, sd_reader_base );
if( res < 0 )
{
return res;
}//end if
alt_dcache_flush( data, size );
res = alt_dma_rxchan_prepare( rx, data, size, dma_done, (void*)&handle );
if( res < 0 )
{
return res;
}//end if
while( !handle.done )
{
usleep(10);
}//end while
}//end if
if( res == 0 && crcerr != NULL )
{
*crcerr = IORD_SD_READER_STATE( sd_reader_base ) & SD_READER_CRCERR_BIT ;
}//end if
return res;
}//end sd_reader_read
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -