support DMA4-7 on SD

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@177 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
shirait 2007-07-05 12:37:21 +00:00
parent 7b1d5b2e2c
commit 648b43924d
3 changed files with 65 additions and 14 deletions

View File

@ -575,8 +575,6 @@ u16 SD_MultiReadBlock(u32 ulOffset)
SD_TransReadyFPGA(); /* INFOレジスタ初期化 */
if( !SDCARD_UseFifoFlag) { /* FIFOを使わないとき */
SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読出し要求割込み許可*/
}else{
SD_OrFPGA(SD_INFO2_MASK, SD_INFO2_MASK_BRE);
}
/* 読み込み開始アドレス(オフセット)設定 */
@ -1171,9 +1169,7 @@ u16 SD_MultiWriteBlock(u32 ulOffset)
SD_TransReadyFPGA(); /* INFOレジスタ初期化 */
#if (SD_FIFO_EMPTY_FLAG_NEW == 1) // FIFO Emptyフラグ仕様変更後
if( SDCARD_UseFifoFlag) { /* FIFOを使うとき */
SD_OrFPGA( SD_INFO2_MASK, SD_INFO2_MASK_BWE); /* SDカードからのデータ書込み要求割込み禁止 */
}else{
if( !(SDCARD_UseFifoFlag)) { /* FIFOを使わないとき */
SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み許可 */
}
#else // FIFO Emptyフラグ仕様変更前

View File

@ -394,7 +394,11 @@ SDMC_ERR_CODE sdmcInit( SDMC_DMA_NO dma_no, void (*func1)(),void (*func2)())
SDMC_ERR_CODE api_result;
/**/
sdmc_dma_no = dma_no;
if( (dma_no < 4) || (dma_no == SDMC_NOUSE_DMA)) {
sdmc_dma_no = dma_no;
}else{
return( SDMC_ERR_PARAM);
}
if( sdmc_tsk_created == FALSE) {
/*---------- OS準備 ----------*/
@ -993,6 +997,10 @@ SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),Sd
OSMessage recv_dat;
SDMC_ERR_CODE api_result; //SDCARD関数の返り値
if( bufsize == 0) {
return( SDMC_ERR_PARAM);
}
SdMsg.buf = buf;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
@ -1026,15 +1034,31 @@ SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),Sd
*---------------------------------------------------------------------------*/
static SDMC_ERR_CODE SDCARDi_ReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info)
{
u32* DmaReg;
SDMC_ERR_CODE result;
/* FIFO Empty割り込み無効、FIFO Full割り込み有効 */
*(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FEIE)) | SDIF_CNT_FFIE;
if( sdmc_dma_no == SDMC_NOUSE_DMA) {
/* FIFO Empty割り込み無効、FIFO Full割り込み有効 */
*(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FEIE)) | SDIF_CNT_FFIE;
}else{
*(SDIF_CNT) = (*(SDIF_CNT) & (~(SDIF_CNT_FFIE | SDIF_CNT_FEIE)));
}
*(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */
*(SDIF_FSC) = bufsize;
*(SDIF_CNT) |= (SDIF_CNT_FCLR | SDIF_CNT_USEFIFO); /* FIFO使用フラグON */
CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */
if( sdmc_dma_no != SDMC_NOUSE_DMA) {
DmaReg = (u32*)(REG_DMA4SAD_ADDR + (0x1C * sdmc_dma_no));
*(u32*)(DmaReg+6) = 0; //reg_MI_DMA4CNT
*(u32*)(DmaReg++) = (u32)SDIF_FI; //reg_MI_DMA4SAD
*(u32*)(DmaReg++) = (u32)buf; //reg_MI_DMA4DAD
*(u32*)(DmaReg++) = ((SDCARD_SectorSize / sizeof(u32)) * bufsize); //総転送ワード数(reg_MI_DMA4TCNT)
*(u32*)(DmaReg++) = (SDCARD_SectorSize / sizeof(u32)); //転送ワード数(reg_MI_DMA4WCNT)
*(u32*)(DmaReg++) = 0; //インターバル(reg_MI_DMA4BCNT)
*(u32*)(DmaReg+1) = REG_MI_DMA4CNT_E_MASK | 0x08000000 | 0x00070000 | 0x4000; //SD起動、128WC, SRC-FIX(reg_MI_DMA4CNT)
}
result = SDCARDi_Read( buf, bufsize, offset, func, info);
/* FIFO無効に */
@ -1064,6 +1088,10 @@ SDMC_ERR_CODE sdmcRead(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcRe
OSMessage recv_dat;
SDMC_ERR_CODE api_result;
if( bufsize == 0) {
return( SDMC_ERR_PARAM);
}
SdMsg.buf = buf;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
@ -1873,6 +1901,10 @@ SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcR
OSMessage recv_dat;
SDMC_ERR_CODE api_result;
if( bufsize == 0) {
return( SDMC_ERR_PARAM);
}
SdMsg.buf = buf;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
@ -1906,11 +1938,16 @@ SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcR
*---------------------------------------------------------------------------*/
static SDMC_ERR_CODE SDCARDi_WriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info)
{
u32* DmaReg;
SDMC_ERR_CODE result;
#if (SD_FIFO_EMPTY_FLAG_NEW == 1)
/* FIFO Full割り込み無効、FIFO Empty割り込み有効 */
*(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FFIE)) | SDIF_CNT_FEIE;
if( sdmc_dma_no == SDMC_NOUSE_DMA) {
/* FIFO Full割り込み無効、FIFO Empty割り込み有効 */
*(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FFIE)) | SDIF_CNT_FEIE;
}else{
*(SDIF_CNT) = (*(SDIF_CNT) & (~(SDIF_CNT_FFIE | SDIF_CNT_FEIE)));
}
#else
/* FIFO割り込み禁止 */
*(SDIF_CNT) = (*(SDIF_CNT) & (~(SDIF_CNT_FFIE | SDIF_CNT_FEIE)));
@ -1921,6 +1958,17 @@ static SDMC_ERR_CODE SDCARDi_WriteFifo(void* buf,u32 bufsize,u32 offset,void(*fu
*(SDIF_CNT) |= (SDIF_CNT_FCLR | SDIF_CNT_USEFIFO); /* FIFO使用フラグON */
CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */
if( sdmc_dma_no != SDMC_NOUSE_DMA) {
DmaReg = (u32*)(REG_DMA4SAD_ADDR + (0x1C * sdmc_dma_no));
*(u32*)(DmaReg+6) = 0; //reg_MI_DMA4CNT
*(u32*)(DmaReg++) = (u32)buf + SDCARD_SectorSize; //reg_MI_DMA4SAD (new FIFO emptyのときは1セクタ後から)
*(u32*)(DmaReg++) = (u32)SDIF_FI; //reg_MI_DMA4DAD
*(u32*)(DmaReg++) = ((SDCARD_SectorSize / sizeof(u32)) * (bufsize-1)); //総転送ワード数(reg_MI_DMA4TCNT)
*(u32*)(DmaReg++) = (SDCARD_SectorSize / sizeof(u32)); //転送ワード数(reg_MI_DMA4WCNT)
*(u32*)(DmaReg++) = 0; //インターバル(reg_MI_DMA4BCNT)
*(u32*)(DmaReg+1) = REG_MI_DMA4CNT_E_MASK | 0x08000000 | 0x00070000 | 0x0800; //SD起動、128WC, DEST-FIX(reg_MI_DMA4CNT)
}
result = SDCARDi_Write( buf, bufsize, offset, func, info);
/* FIFO無効に */
@ -1950,6 +1998,10 @@ SDMC_ERR_CODE sdmcWrite(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResul
OSMessage recv_dat;
SDMC_ERR_CODE api_result;
if( bufsize == 0) {
return( SDMC_ERR_PARAM);
}
SdMsg.buf = buf;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
@ -2451,7 +2503,7 @@ static void SDCARD_Intr_Thread( void* arg)
#if (SD_FIFO_EMPTY_FLAG_NEW == 1)
#else
}else{
/*----- FIFO-EmptyFlag未修正の場合、Writeの1回目はBWE割り込みに頼る必要がある -----*/
/*----- FIFO-EmptyFlag未修正の場合、WriteはBWE割り込みに頼る必要がある -----*/
if( SD_CheckFPGAReg( SD_INFO2, (SD_INFO2_MASK_BRE | SD_INFO2_MASK_BWE))) {
// OS_TPrintf( ">>>SD Intr(R/W Req)\n");
//ここで自動的にラッパーのFIFO<->SD_BUF0間で通信が行われる
@ -2466,7 +2518,10 @@ static void SDCARD_Intr_Thread( void* arg)
/* ALL_END */
sd_info1 = SD_INFO1;
if( (SD_CheckFPGAReg( sd_info1, SD_INFO1_ALL_END))&&(ulSDCARD_RestSectorCount<=0)) {
if( (SD_CheckFPGAReg( sd_info1, SD_INFO1_ALL_END))&&
((ulSDCARD_RestSectorCount<=0) || (sdmc_dma_no != SDMC_NOUSE_DMA))) {
// while( (*SDIF_CNT & SDIF_CNT_NEMP)) {}; /* FIFOにデータが残っているうちは終了しない */
ulSDCARD_RestSectorCount = 0; //DMA使用のときはデクリメントされてないので
// OS_TPrintf( ">>>SD Intr(End or Err) %d\n", i);
(void)OS_ClearIrqCheckFlag( OS_IE_SD);
*(vu16*)CTR_INT_IF = CTR_IE_SD_MASK; /*SD割り込みのIF解除*/

View File

@ -141,7 +141,7 @@ void TwlSpMain(void)
MI_DmaFill32( 2, BlockBuf2, 0x00FF00FF, 512*3);
/*SDドライバ初期化*/
result = sdmcInit( SDMC_NOUSE_DMA, NULL, NULL);
result = sdmcInit( SDMC_USE_DMA_4/*SDMC_NOUSE_DMA*/, NULL, NULL);
if( result != SDMC_NORMAL) {
PRINTDEBUG( "sdmcInit : failed\n");
while( 1) {};
@ -215,7 +215,7 @@ void TwlSpMain(void)
MI_DmaFill32( 2, BlockBuf2, 0x00FF00FF, 512*3);
DEBUG_BEGIN();
result = sdmcWriteFifo( (void*)0x02004000, 2, 1, NULL, &SdResult);
result = sdmcWriteFifo( (void*)0x02004000, 10000, 1, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcWriteFifo failed.\n");
}else{