⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd_reader_routines.c

📁 SD卡读卡器模块的VHDL及软件驱动代码
💻 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 + -