/*
*********************************************************************************************************
* Samsung ARM S3C2410 Software Frame
*
* (c) Copyright 2008-2010, LastRitter
* All Rights Reserved
*
* File :
* By : LastRitter
*********************************************************************************************************
*/
#include "Drives.h"
extern sdiparam st_SDIParam;
#define SDI_READ_ENDIANCHANGE
//#define SDI_READ_DEBUG
/*
*********************************************************************************************************
*
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note(s) :
*
*********************************************************************************************************
*/
static uint32 SDI_PolRead(uint32 uiNumber,int32 *puiBuffer)
{
uint32 uiReadCount,status;
#ifdef SDI_READ_ENDIANCHANGE
uint8 *pucTemp,ucTemp;
#endif
rSDIDCON=(1<<19)|(1<<17)|(st_SDIParam.uiWide<<16)|(2<<12)|(uiNumber<<0)|1<<14;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(uiNumber<2) // SINGLE_READ
{
do
rSDICCON=(0x1<<9)|(0x1<<8)|0x51; // sht_resp, wait_resp, dat, start, CMD17
while(!SDI_CheckCMDend(17, 1)); //-- Check end of CMD17
}
else // MULTI_READ
{
do
rSDICCON=(0x1<<9)|(0x1<<8)|0x52; // sht_resp, wait_resp, dat, start, CMD18
while(!SDI_CheckCMDend(18, 1)); //-- Check end of CMD18
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
uiReadCount=0;
while(uiReadCount<128*uiNumber) // 512*block bytes
{
if((rSDIDSTA&0x20)==0x20) // Check timeout
{
rSDIDSTA=0x1<<0x5; // Clear timeout flag
break;
}
status=rSDIFSTA;
if((status&0x1000)==0x1000) // Is Rx data?
{
puiBuffer[uiReadCount]=rSDIDAT;
#ifdef SDI_READ_ENDIANCHANGE
pucTemp=(uint8 *)(puiBuffer+uiReadCount);
ucTemp=*pucTemp;
*pucTemp=*(pucTemp+3);
*(pucTemp+3)=ucTemp;
ucTemp=*(pucTemp+1);
*(pucTemp+1)=*(pucTemp+2);
*(pucTemp+2)=ucTemp;
// Uart_Printf("%08x,",*(puiBuffer-1));
#endif
uiReadCount++;
}
}
Uart_Printf("read finish\n");
return 0;
}
/*
*********************************************************************************************************
*
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note(s) :
*
*********************************************************************************************************
*/
static int32 *psi_RxBuffer;
static uint32 ui_RxCount=0;
static void __irq SDI_ReadIRQ(void)
{
unsigned int i,status;
status=rSDIFSTA;
if( (status&0x200) == 0x200 ) // Check Last interrupt?
{
for(i=(status & 0x7f)/4;i>0;i--) //read reamin
{
*psi_RxBuffer++=rSDIDAT;
ui_RxCount++;
}
}
else if( (status&0x80) == 0x80 ) // Check Half interrupt?
{
for(i=0;i<8;i++)
{
*psi_RxBuffer++=rSDIDAT;
ui_RxCount++;
}
}
//ClearPending(INT_SDI);
}
/*
*********************************************************************************************************
*
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note(s) :
*
*********************************************************************************************************
*/
static uint32 SDI_IntRead(uint32 uiNumber,int32 uiaBuffer[])
{
psi_RxBuffer=uiaBuffer;
ui_RxCount=0;
// Uart_Printf("Read Mode : Interrupt\n");
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(uiNumber<2) // SINGLE_READ
{
do
rSDICCON=(0x1<<9)|(0x1<<8)|0x51; // sht_resp, wait_resp, dat, start, CMD17
while(!SDI_CheckCMDend(17, 1)); //-- Check end of CMD17
}
else // MULTI_READ
{
do
rSDICCON=(0x1<<9)|(0x1<<8)|0x52; // sht_resp, wait_resp, dat, start, CMD18
while(!SDI_CheckCMDend(18, 1)); //-- Check end of CMD18
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
pISR_SDI=(unsigned)SDI_ReadIRQ;
//rINTMSK = ~(INT_SDI);
rSDIIMSK=5; // Last & Rx FIFO half int.
while(ui_RxCount<128*uiNumber);
// rINTMSK |= (INT_SDI);
rSDIIMSK=0; // All mask
return 0;
}
/*
*********************************************************************************************************
*
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note(s) :
*
*********************************************************************************************************
*/
static uint32 ui_DMAReadEnd=0;
static void __irq SDI_ReadEndDMA(void)
{
// ClearPending(INT_DMA0);
rSDIDCON &= ~0x8000; //clear DMA bit, added by hzh
ui_DMAReadEnd=1;
}
/*
*********************************************************************************************************
*
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note(s) :
*
*********************************************************************************************************
*/
static uint32 SDI_DMARead(uint32 uiNumber,int32 uiaBuffer[],int32 siWide)
{
ui_DMAReadEnd=0;
// Uart_Printf("Read Mode : DMA\n");
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
pISR_DMA0=(unsigned)SDI_ReadEndDMA;
// rINTMSK = ~(INT_DMA0);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
rDISRC0=(int)(SDIDAT); // SDIDAT
rDISRCC0=(1<<1)+(1<<0); // APB, fix
rDIDST0=(unsigned int)(uiaBuffer); // Rx_buffer
rDIDSTC0=(0<<1)+(0<<0); // AHB, inc
rDCON0=(1UL<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*uiNumber;
//handshake, sync PCLK, TC int, single tx, single service, SDI, H/W request,
//auto-reload off, word, 128blk*num
rDMASKTRIG0=(0<<2)+(1<<1)+0; //no-stop, DMA2 channel on, no-sw trigger
rSDIDCON=(1<<19)|(1<<17)|(siWide<<16)|(1<<15)|(2<<12)|(uiNumber<<0);
// Rx after rsp, blk, 4bit bus, dma enable, Rx start, blk num
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(uiNumber<2) // SINGLE_READ
{
do
rSDICCON=(0x1<<9)|(0x1<<8)|0x51; // sht_resp, wait_resp, dat, start, CMD17
while(!SDI_CheckCMDend(17, 1)); //-- Check end of CMD17
}
else // MULTI_READ
{
do
rSDICCON=(0x1<<9)|(0x1<<8)|0x52; // sht_resp, wait_resp, dat, start, CMD18
while(!SDI_CheckCMDend(18, 1)); //-- Check end of CMD18
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#if( SD_DEBUG )
Uart_Printf("%x,%x,%x,%x,%x\n", rSDICCON, rSDICSTA, rSDIDCON, rSDIFSTA, block);
Uart_Printf("%x,%x,%x,%x,%x,%x,%x\n", rDISRCC0, rDISRC0, rDIDSTC0, rDIDST0, rDCON0, rDMASKTRIG0, rDSTAT0);
#endif
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
while(!ui_DMAReadEnd);
// rINTMSK |= (INT_DMA0);
rDMASKTRIG0=(1<<2); //DMA0 stop
return 0;
}
/*
*********************************************************************************************************
*
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note(s) : Check end of DATA
*
*********************************************************************
S3C2440 SD卡驱动程序
5星 · 超过95%的资源 需积分: 16 87 浏览量
2009-11-20
10:58:28
上传
评论 3
收藏 14KB RAR 举报
kgq398
- 粉丝: 0
- 资源: 2
最新资源
- 5.23-Java概述,JDK安装及注释、关键字、标识符、数据类型、变量、常量的介绍
- 《Python基础》实验三指导书(1).doc
- TensorFlow 深度学习、机器学习-任何能够用计算流图形来表达的计算,都可以使用TensorFlow
- 一个基于springboot+sureness的面向REST API资源无状态认证权限管理系统
- 王博外文文献.pdf
- python毕业设计基于社区检测的多任务聚类联邦学习项目源码+使用说明(高分项目).zip
- Javaweb项目源码-编程爱好者博客地带.zip
- java各个技术栈相关知识点
- PYthon代码 pdf合并
- 内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、 Redis
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页