mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
fix SD driver (new fifo empty flag)
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@176 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
parent
a2c8036766
commit
7b1d5b2e2c
@ -26,6 +26,8 @@
|
||||
|
||||
#define ADD_CHECK 1
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
グローバル
|
||||
***********************************************************************/
|
||||
@ -573,8 +575,10 @@ 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);
|
||||
}
|
||||
|
||||
|
||||
/* 読み込み開始アドレス(オフセット)設定 */
|
||||
SD_SetFPGA(SD_ARG0,(((LELONG *)&ulOffset)->dt2word.low));
|
||||
SD_SetFPGA(SD_ARG1,(((LELONG *)&ulOffset)->dt2word.high));
|
||||
@ -851,10 +855,14 @@ s16 SD_FPGA_irq(void)
|
||||
if( SD_CheckFPGAReg( *SDIF_CNT_L, (u16)SDIF_CNT_FFIE)) { /* FULL割り込み許可のとき */
|
||||
return TRUE;
|
||||
}else{
|
||||
#if (SD_FIFO_EMPTY_FLAG_NEW == 1) //FIFO Emptyフラグ仕様変更後
|
||||
return FALSE;
|
||||
#else //FIFO Emptyフラグ仕様変更前
|
||||
if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BWE)){ /* SDカードからのデータ書込み要求あり? */
|
||||
SD_AndFPGA(SD_INFO2,(~SD_INFO2_BWE)); /* SD用バッファ制御 Write Enable リセット*/
|
||||
}
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
}else{ /*--- FIFOを使わないとき ---*/
|
||||
if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BRE)){ /* SDカードからのデータ読出し要求あり? */
|
||||
@ -1161,9 +1169,16 @@ u16 SD_MultiWriteBlock(u32 ulOffset)
|
||||
PRINTDEBUG( " CMD25 (WRITE_MULTIPLE_BLOCK)\n");
|
||||
|
||||
SD_TransReadyFPGA(); /* INFOレジスタ初期化 */
|
||||
// if( !SDCARD_UseFifoFlag) { /* FIFOを使わないとき */
|
||||
|
||||
#if (SD_FIFO_EMPTY_FLAG_NEW == 1) // FIFO Emptyフラグ仕様変更後
|
||||
if( SDCARD_UseFifoFlag) { /* FIFOを使うとき */
|
||||
SD_OrFPGA( SD_INFO2_MASK, SD_INFO2_MASK_BWE); /* SDカードからのデータ書込み要求割込み禁止 */
|
||||
}else{
|
||||
SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み許可 */
|
||||
// }
|
||||
}
|
||||
#else // FIFO Emptyフラグ仕様変更前
|
||||
SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み許可 */
|
||||
#endif
|
||||
|
||||
/* 書き込み開始オフセット設定 */
|
||||
SD_SetFPGA(SD_ARG0,(((LELONG *)&ulOffset)->dt2word.low));
|
||||
|
||||
@ -80,6 +80,7 @@ u64 sd_stack[SD_STACK_SIZE / sizeof(u64)];
|
||||
u64 sd_intr_stack[SD_STACK_SIZE / sizeof(u64)];
|
||||
#endif
|
||||
|
||||
u16 sdmc_dma_no = SDMC_NOUSE_DMA;
|
||||
/* drsdmc.cでも参照 */
|
||||
SdmcSpec sdmc_current_spec; //TODO:ポート切り替え時、Port0とPort1に保存するように
|
||||
|
||||
@ -134,8 +135,8 @@ static void SDCARD_Dmy_Handler( void); /*
|
||||
static void SDCARD_Timer_irq(void* arg); /* タイムアウト割り込みハンドラ */
|
||||
static void SDCARD_irq_Handler( void); /* SD-IPからの割り込みハンドラ */
|
||||
static void SDCARD_FPGA_irq(void); /* カードリードライト割り込み処理 */
|
||||
static void SDCARD_ATC0_irq(void); /* ATC0転送完了割り込み処理 */
|
||||
static void SYSFPGA_irq(void); /* SYSFPGAエラー割り込み処理 */
|
||||
static void SDCARD_ReadyToEnd( void);
|
||||
|
||||
/*ポート1は無線固定なのでポート選択関数は公開しない*/
|
||||
static u16 i_sdmcSelectedNo(void); /* カードポートの選択 */
|
||||
@ -198,7 +199,6 @@ SDPortContext SDPort1Context;
|
||||
|
||||
u32 ulSDCARD_Size; /* カード全セクタ数 */
|
||||
|
||||
volatile s16 SDCARD_ATC0_Flag; /* 全ATC完了フラグ */
|
||||
volatile s16 SDCARD_FPGA_Flag; /* FPGA処理完了フラグ */
|
||||
volatile s16 SDCARD_EndFlag; /* 転送処理完了フラグ */
|
||||
|
||||
@ -356,7 +356,7 @@ static void i_sdmcDisable( void)
|
||||
*---------------------------------------------------------------------------*/
|
||||
void SDCARD_irq_Handler( void)
|
||||
{
|
||||
PRINTDEBUG( "SD irq!\n");
|
||||
// OS_TPrintf( "SD irq!\n");
|
||||
OS_SetIrqCheckFlag( OS_IE_SD);
|
||||
// sdmc_intr_wakeup_count++;
|
||||
// OS_WakeupThreadDirect( &sdmc_intr_tsk);
|
||||
@ -393,6 +393,9 @@ SDMC_ERR_CODE sdmcInit( SDMC_DMA_NO dma_no, void (*func1)(),void (*func2)())
|
||||
{
|
||||
SDMC_ERR_CODE api_result;
|
||||
|
||||
/**/
|
||||
sdmc_dma_no = dma_no;
|
||||
|
||||
if( sdmc_tsk_created == FALSE) {
|
||||
/*---------- OS準備 ----------*/
|
||||
if( !OS_IsAlarmAvailable()) { /* アラームチェック(OS_InitAlarm済みか?) */
|
||||
@ -1029,7 +1032,7 @@ static SDMC_ERR_CODE SDCARDi_ReadFifo(void* buf,u32 bufsize,u32 offset,void(*fun
|
||||
*(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FEIE)) | SDIF_CNT_FFIE;
|
||||
*(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */
|
||||
*(SDIF_FSC) = bufsize;
|
||||
*(SDIF_CNT) |= SDIF_CNT_USEFIFO; /* FIFO使用フラグON */
|
||||
*(SDIF_CNT) |= (SDIF_CNT_FCLR | SDIF_CNT_USEFIFO); /* FIFO使用フラグON */
|
||||
CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */
|
||||
|
||||
result = SDCARDi_Read( buf, bufsize, offset, func, info);
|
||||
@ -1108,7 +1111,6 @@ static SDMC_ERR_CODE SDCARDi_Read(void* buf,u32 bufsize,u32 offset,void(*func)(v
|
||||
ulSDCARD_RestSectorCount = bufsize; /* 残り転送セクタ数の設定 */
|
||||
pSDCARD_BufferAddr = buf; /* データ格納バッファのアドレスを設定 */
|
||||
|
||||
SDCARD_ATC0_Flag = FALSE; /* 全ATC処理完了フラグクリア */
|
||||
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
|
||||
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
|
||||
SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */
|
||||
@ -1197,15 +1199,16 @@ static void SDCARD_FPGA_irq(void)
|
||||
/* FIFOを使わないとき:BREかBWEかを調べ、INFO2の当該割り込み要求フラグをクリアする */
|
||||
bRead = SD_FPGA_irq();
|
||||
|
||||
if( ulSDCARD_RestSectorCount) { /* 残りセクタ数が有る時 */
|
||||
ulSDCARD_RestSectorCount--; /* 残りセクタ数をデクリメント */
|
||||
|
||||
/*--- SDカードからのリード時 ---*/
|
||||
if(bRead){
|
||||
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
||||
MyCpuRecv32( (u32*)SDIF_FI, (u32*)pSDCARD_BufferAddr, SDCARD_SectorSize);
|
||||
}else{ /*--- FIFOを使わないとき ---*/
|
||||
MyCpuRecv16( (u16*)SD_BUF0, pSDCARD_BufferAddr, SDCARD_SectorSize);
|
||||
if( ulSDCARD_RestSectorCount > 0) {
|
||||
// if( ulSDCARD_RestSectorCount == 1) { TTT();}
|
||||
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
||||
MyCpuRecv32( (u32*)SDIF_FI, (u32*)pSDCARD_BufferAddr, SDCARD_SectorSize);
|
||||
}else{ /*--- FIFOを使わないとき ---*/
|
||||
MyCpuRecv16( (u16*)SD_BUF0, pSDCARD_BufferAddr, SDCARD_SectorSize);
|
||||
}
|
||||
ulSDCARD_RestSectorCount--; /* 残りセクタ数をデクリメント */
|
||||
}
|
||||
if( ulSDCARD_RestSectorCount <= 0) { /* 要求セクタ数リード完了したか? */
|
||||
if(SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE)){ /* SD_SECCNTレジスタがEnableか? */
|
||||
@ -1215,11 +1218,15 @@ static void SDCARD_FPGA_irq(void)
|
||||
}
|
||||
}
|
||||
}else{ /*--- SDカードへのライト時 ---*/
|
||||
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
||||
MI_CpuSend32( pSDCARD_BufferAddr, SDIF_FI, SDCARD_SectorSize);
|
||||
}else{ /*--- FIFOを使わないとき ---*/
|
||||
MI_CpuSend16( pSDCARD_BufferAddr, SD_BUF0, SDCARD_SectorSize);
|
||||
}
|
||||
if( ulSDCARD_RestSectorCount > 0) {
|
||||
if( ulSDCARD_RestSectorCount == 1) { SDCARD_ReadyToEnd();}
|
||||
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
||||
MI_CpuSend32( pSDCARD_BufferAddr, SDIF_FI, SDCARD_SectorSize);
|
||||
}else{ /*--- FIFOを使わないとき ---*/
|
||||
MI_CpuSend16( pSDCARD_BufferAddr, SD_BUF0, SDCARD_SectorSize);
|
||||
}
|
||||
ulSDCARD_RestSectorCount--; /* 残りセクタ数をデクリメント */
|
||||
}
|
||||
if( ulSDCARD_RestSectorCount <= 0){ /* 要求セクタ数ライト完了? */
|
||||
if( SDCARD_UseFifoFlag) { /* FIFOを使用するときは */
|
||||
while( (*SDIF_CNT & SDIF_CNT_NEMP)) {}; /* FIFOにデータが残っているうちは終了しない */
|
||||
@ -1232,47 +1239,27 @@ static void SDCARD_FPGA_irq(void)
|
||||
}
|
||||
}
|
||||
/* リード/ライト共通処理 */
|
||||
SDCARD_ATC0_irq(); /* 転送完了後の処理 */
|
||||
pSDCARD_BufferAddr+=(512/2); /* 書込みデータのバッファアドレスをインクリメント */
|
||||
}
|
||||
SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */
|
||||
pSDCARD_BufferAddr+=(512/2); /* 書込みデータのバッファアドレスをインクリメント */
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: SDCARD_ATC0_irq
|
||||
Name: SDCARD_ReadyToEnd
|
||||
|
||||
Description:
|
||||
カードとの転送終了時に行う処理。
|
||||
カードとの最終セクタ転送前に行う処理。
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void SDCARD_ATC0_irq(void)
|
||||
static void SDCARD_ReadyToEnd( void)
|
||||
{
|
||||
/*--- 残りセクタ数が 0 のとき ---*/
|
||||
if( ulSDCARD_RestSectorCount == 0) {
|
||||
SDCARD_ATC0_Flag = TRUE; /* 全ATC完了フラグセット */
|
||||
|
||||
/* 転送完了 */
|
||||
if( SDCARD_FPGA_Flag) { /* 転送終了時の割り込み処理(SYSFPGA_irq)が完了している? */
|
||||
SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */
|
||||
SD_TransEndFPGA(); /* 転送終了処理(割り込みマスクを禁止に戻す) */
|
||||
if( SDCARD_EndFlag == FALSE) { /* 転送処理完了フラグが立っていない? */
|
||||
SDCARD_EndFlag = TRUE; /* 転送処理完了フラグをセット */
|
||||
if( pSDCARD_info) {
|
||||
pSDCARD_info->result = SDCARD_ErrStatus; /* SdmcResultInfo に情報設定 */
|
||||
pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) *
|
||||
SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{ /*--- 残りセクタ数が 0 でないとき ---*/
|
||||
SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */
|
||||
#if TIMEOUT
|
||||
SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */
|
||||
#endif
|
||||
}
|
||||
*(SDIF_CNT) = (*(SDIF_CNT) & (~(SDIF_CNT_FFIE | SDIF_CNT_FEIE)));
|
||||
SD_OrFPGA( SD_INFO2_MASK, SD_INFO2_MASK_BWE); /* SDカードからのデータ書込み要求割込み禁止 */
|
||||
SD_OrFPGA( SD_INFO2_MASK, SD_INFO2_MASK_BRE); /* SDカードからのデータ書込み要求割込み禁止 */
|
||||
SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
@ -1345,7 +1332,8 @@ static void SYSFPGA_irq(void)
|
||||
if( SD_INFO_ERROR_VALUE & SD_INFO1_MASK_ALL_END) { /* R/W access all end 割込み発生か? */
|
||||
SD_OrFPGA( SD_INFO1_MASK, SD_INFO1_MASK_ALL_END); /* INFO1の access all end 割込み禁止 */
|
||||
SDCARD_FPGA_Flag = TRUE; /* R/Wアクセス終了(IP処理完了)フラグセット */
|
||||
if( SDCARD_ATC0_Flag) { /* 転送完了処理(SDCARD_ATC0_irq)が完了しているか? */
|
||||
|
||||
// OS_TPrintf( "SYS\n");
|
||||
SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */
|
||||
SD_TransEndFPGA(); /* 転送終了処理(割り込みマスクを禁止に戻す) */
|
||||
if( SDCARD_EndFlag == FALSE) { /* 転送が終了していないか? */
|
||||
@ -1356,8 +1344,9 @@ static void SYSFPGA_irq(void)
|
||||
SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */
|
||||
}
|
||||
} /* 転送が終了済みのとき */
|
||||
|
||||
return;
|
||||
} /* 全ATC完了フラグ OFF の場合 */
|
||||
|
||||
if( SDCARD_ErrStatus != SDMC_NORMAL) { /* エラーが発生している場合 */
|
||||
SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */
|
||||
if( SDCARD_EndFlag == FALSE) { /* 転送が終了していないか? */
|
||||
@ -1532,7 +1521,6 @@ static u16 i_sdmcSendSCR(void)
|
||||
pSDCARD_BufferAddr = SD_SCR; /* データ格納バッファのアドレスを設定 */
|
||||
|
||||
/* 転送前の準備処理 */
|
||||
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
|
||||
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
|
||||
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
|
||||
SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */
|
||||
@ -1693,7 +1681,6 @@ static u16 SDCARD_SD_Status(void)
|
||||
pSDCARD_BufferAddr = SD_SDSTATUS; /* データ格納バッファのアドレスを設定 */
|
||||
|
||||
/* 転送前の準備処理 */
|
||||
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
|
||||
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
|
||||
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
|
||||
SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */
|
||||
@ -1772,7 +1759,6 @@ int MMCP_SetBusWidth( BOOL b4bit)
|
||||
pSDCARD_info = NULL;
|
||||
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;
|
||||
pSDCARD_BufferAddr = &TestData; /* データ格納バッファのアドレスを設定 */
|
||||
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
|
||||
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
|
||||
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
|
||||
SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */
|
||||
@ -1798,7 +1784,6 @@ int MMCP_SetBusWidth( BOOL b4bit)
|
||||
/**/
|
||||
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */
|
||||
pSDCARD_BufferAddr = &Resid; /* データ格納バッファのアドレスを設定 */
|
||||
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
|
||||
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
|
||||
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
|
||||
SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */
|
||||
@ -1922,12 +1907,18 @@ 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)
|
||||
{
|
||||
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;
|
||||
#else
|
||||
/* FIFO割り込み禁止 */
|
||||
*(SDIF_CNT) = (*(SDIF_CNT) & (~(SDIF_CNT_FFIE | SDIF_CNT_FEIE)));
|
||||
#endif
|
||||
|
||||
*(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */
|
||||
*(SDIF_FSC) = bufsize;
|
||||
*(SDIF_CNT) |= SDIF_CNT_USEFIFO; /* FIFO使用フラグON */
|
||||
*(SDIF_CNT) |= (SDIF_CNT_FCLR | SDIF_CNT_USEFIFO); /* FIFO使用フラグON */
|
||||
CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */
|
||||
|
||||
result = SDCARDi_Write( buf, bufsize, offset, func, info);
|
||||
@ -2015,7 +2006,6 @@ static SDMC_ERR_CODE SDCARDi_Write(void* buf,u32 bufsize,u32 offset,void(*func)(
|
||||
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = bufsize;
|
||||
pSDCARD_BufferAddr = buf; /* データ格納バッファのアドレスを設定 */
|
||||
|
||||
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
|
||||
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
|
||||
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
|
||||
SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */
|
||||
@ -2027,6 +2017,16 @@ static SDMC_ERR_CODE SDCARDi_Write(void* buf,u32 bufsize,u32 offset,void(*func)(
|
||||
/* IPのSD_SECCNTレジスタ有効化、転送セクタ数設定(自動CMD12発行のため) */
|
||||
SD_EnableSeccnt( ulSDCARD_RestSectorCount);
|
||||
|
||||
|
||||
#if (SD_FIFO_EMPTY_FLAG_NEW == 1)
|
||||
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
||||
ulSDCARD_RestSectorCount--;
|
||||
MI_CpuSend32( pSDCARD_BufferAddr, SDIF_FI, SDCARD_SectorSize);
|
||||
pSDCARD_BufferAddr += (512/2);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*--- ライトコマンド発行 ---*/
|
||||
if( SDCARD_SDHCFlag) {
|
||||
SD_MultiWriteBlock( offset); /* ライトコマンド発行(引数:オフセット) */
|
||||
@ -2137,7 +2137,6 @@ static u16 i_sdmcGetResid(u32 *pResid)
|
||||
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */
|
||||
pSDCARD_BufferAddr = Resid; /* データ格納バッファのアドレスを設定 */
|
||||
|
||||
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
|
||||
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
|
||||
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
|
||||
SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */
|
||||
@ -2417,10 +2416,15 @@ static void SDCARD_Thread( void* arg)
|
||||
*---------------------------------------------------------------------------*/
|
||||
static void SDCARD_Intr_Thread( void* arg)
|
||||
{
|
||||
static i = 0;
|
||||
u16 sd_info1;//, sd_info2;
|
||||
OSIntrMode enabled;
|
||||
|
||||
|
||||
OS_EnableInterrupts();
|
||||
OS_EnableIrq();
|
||||
|
||||
while( 1) {
|
||||
i++;
|
||||
PRINTDEBUG( "Slp sdIntr\n");
|
||||
|
||||
OS_WaitIrq( FALSE, OS_IE_SD);
|
||||
@ -2428,37 +2432,42 @@ static void SDCARD_Intr_Thread( void* arg)
|
||||
(void)OS_ClearIrqCheckFlag( OS_IE_SD);
|
||||
*(vu16*)CTR_INT_IF = CTR_IE_SD_MASK; /*SD割り込みのIF解除*/
|
||||
|
||||
PRINTDEBUG( "sdIntr waked\n");
|
||||
// OS_TPrintf( "sdIntr waked\n");
|
||||
|
||||
|
||||
while( 1) {
|
||||
/*--- FIFOを使うとき ---*/
|
||||
if( SDCARD_UseFifoFlag) {
|
||||
sd_info1 = SD_INFO1;
|
||||
if( ((*SDIF_CNT & SDIF_CNT_FULL)&&(*SDIF_CNT & SDIF_CNT_FFIE)) ||
|
||||
((!(*SDIF_CNT & SDIF_CNT_NEMP))&&(*SDIF_CNT & SDIF_CNT_FEIE))) {
|
||||
if( (((*SDIF_CNT & SDIF_CNT_FULL)&&(*SDIF_CNT & SDIF_CNT_FFIE)) ||
|
||||
((!(*SDIF_CNT & SDIF_CNT_NEMP))&&(*SDIF_CNT & SDIF_CNT_FEIE)))
|
||||
){
|
||||
|
||||
PRINTDEBUG( ">>>SD Intr(FIFO)\n");// Full or Empty)\n");
|
||||
// OS_TPrintf( ">>>SD Intr(FIFO) %d\n", i);// Full or Empty)\n");
|
||||
OS_DisableIrqMask( OS_IE_SD);
|
||||
SDCARD_FPGA_irq(); /*カードからのリードライト要求割り込み*/
|
||||
OS_EnableIrqMask( OS_IE_SD);
|
||||
// break;
|
||||
|
||||
#if (SD_FIFO_EMPTY_FLAG_NEW == 1)
|
||||
#else
|
||||
}else{
|
||||
|
||||
/*----- FIFO-EmptyFlag未修正の場合、Writeの1回目はBWE割り込みに頼る必要がある -----*/
|
||||
if( SD_CheckFPGAReg( SD_INFO2, (SD_INFO2_MASK_BRE | SD_INFO2_MASK_BWE))) {
|
||||
PRINTDEBUG ( ">>>SD Intr(R/W Req)\n");
|
||||
// OS_TPrintf( ">>>SD Intr(R/W Req)\n");
|
||||
//ここで自動的にラッパーのFIFO<->SD_BUF0間で通信が行われる
|
||||
OS_DisableIrqMask( OS_IE_SD);
|
||||
SDCARD_FPGA_irq();
|
||||
OS_EnableIrqMask( OS_IE_SD);
|
||||
break;
|
||||
}
|
||||
/*----------*/
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
/* FIFO割り込みとALLEND割り込みがほぼ同時の場合に対応 */
|
||||
if( SD_CheckFPGAReg( sd_info1, SD_INFO1_ALL_END)) {
|
||||
PRINTDEBUG( ">>>SD Intr(End or Err)\n");
|
||||
/* ALL_END */
|
||||
sd_info1 = SD_INFO1;
|
||||
if( (SD_CheckFPGAReg( sd_info1, SD_INFO1_ALL_END))&&(ulSDCARD_RestSectorCount<=0)) {
|
||||
// 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解除*/
|
||||
OS_DisableIrqMask( OS_IE_SD);
|
||||
@ -2470,7 +2479,9 @@ static void SDCARD_Intr_Thread( void* arg)
|
||||
PRINTDEBUG( "wakeup\n");
|
||||
OS_WakeupThreadDirect( &sdmc_tsk);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
/*--- FIFOを使わないとき ---*/
|
||||
}else{
|
||||
if( SD_CheckFPGAReg( SD_INFO2, (SD_INFO2_MASK_BRE | SD_INFO2_MASK_BWE))) {
|
||||
@ -2490,6 +2501,8 @@ static void SDCARD_Intr_Thread( void* arg)
|
||||
OS_WakeupThreadDirect( &sdmc_tsk);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,6 +38,8 @@
|
||||
*********************************************/
|
||||
#define SD_DEBUG_PRINT_ON 0 /* デバッグ表示 */
|
||||
|
||||
#define SD_FIFO_EMPTY_FLAG_NEW 1 /* FIFOエンプティフラグ仕様変更前/後 */
|
||||
|
||||
#define WP_ena 1 /* ライトプロテクトのチェック有効 */
|
||||
#define TIMEOUT 1 /* FPGA Timeout none = FALSE */
|
||||
#define SCR 1 /* Send SCR Command = TRUE */
|
||||
|
||||
@ -23,6 +23,13 @@
|
||||
*---------------------------------------------------------------------------*/
|
||||
#define PRINTDEBUG OS_TPrintf
|
||||
|
||||
|
||||
#define DEBUG_DECLARE OSTick begin
|
||||
#define DEBUG_BEGIN() (begin=OS_GetTick())
|
||||
#define DEBUG_END(str) OS_TPrintf( "\n%s was consumed %d msec.\n", #str, (int)OS_TicksToMilliSeconds(OS_GetTick()-begin))
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
内部関数定義
|
||||
*---------------------------------------------------------------------------*/
|
||||
@ -88,6 +95,7 @@ void TwlSpMain(void)
|
||||
SdmcResultInfo SdResult;
|
||||
PCFD fd;
|
||||
CHKDISK_STATS dstat;
|
||||
DEBUG_DECLARE;
|
||||
|
||||
// OS初期化
|
||||
OS_Init();
|
||||
@ -192,6 +200,31 @@ void TwlSpMain(void)
|
||||
/*----------------------------*/
|
||||
|
||||
#else
|
||||
|
||||
sdmcSelect( (u16)SDMC_PORT_CARD);
|
||||
DEBUG_BEGIN();
|
||||
result = sdmcReadFifo( (void*)BlockBuf, 2, 1, NULL, &SdResult);
|
||||
if( result != 0) {
|
||||
PRINTDEBUG( "sdmcReadFifo failed.\n");
|
||||
}else{
|
||||
DEBUG_END(sdmcReadFifo);
|
||||
PRINTDEBUG( "sdmcReadFifo success.\n");
|
||||
}
|
||||
|
||||
MI_DmaFill32( 2, BlockBuf, 0x55AA55AA, 512*3);
|
||||
MI_DmaFill32( 2, BlockBuf2, 0x00FF00FF, 512*3);
|
||||
|
||||
DEBUG_BEGIN();
|
||||
result = sdmcWriteFifo( (void*)0x02004000, 2, 1, NULL, &SdResult);
|
||||
if( result != 0) {
|
||||
PRINTDEBUG( "sdmcWriteFifo failed.\n");
|
||||
}else{
|
||||
DEBUG_END(sdmcWriteFifo);
|
||||
PRINTDEBUG( "sdmcWriteFifo success.\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*デバイスドライバの登録*/
|
||||
PRINTDEBUG( "attach start\n");
|
||||
if( sdmcRtfsAttach( 4) == FALSE) { //sdmcをEドライブにする
|
||||
@ -223,7 +256,9 @@ void TwlSpMain(void)
|
||||
PRINTDEBUG( "pc_set_default_drive (E) success\n");
|
||||
/**/
|
||||
PRINTDEBUG( "pc_check_disk start. please wait.\n");
|
||||
DEBUG_BEGIN();
|
||||
pc_check_disk( (byte*)"E:", &dstat, 0, 1, 1);
|
||||
DEBUG_END(pc_check_disk);
|
||||
PRINTDEBUG( "pc_check_disk end.\n");
|
||||
}else{
|
||||
/*NANDからブロックライト/リード*/
|
||||
@ -265,12 +300,13 @@ void TwlSpMain(void)
|
||||
PRINTDEBUG( "po_close success.\n");
|
||||
/*----------*/
|
||||
|
||||
|
||||
if( pc_regression_test( (u8*)"E:", FALSE) == FALSE) {
|
||||
PRINTDEBUG( "pc_regression_test failed.\n");
|
||||
}else{
|
||||
PRINTDEBUG( "pc_regression_test success.\n");
|
||||
}
|
||||
DEBUG_BEGIN();
|
||||
if( pc_regression_test( (u8*)"E:", FALSE) == FALSE) {
|
||||
PRINTDEBUG( "pc_regression_test failed.\n");
|
||||
}else{
|
||||
DEBUG_END(pc_regression_test);
|
||||
PRINTDEBUG( "pc_regression_test success.\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -25,10 +25,10 @@ typedef enum {
|
||||
DMA”Ô<EFBFBD>†
|
||||
*********************************************/
|
||||
typedef enum {
|
||||
SDMC_USE_DMA_0 = 0,
|
||||
SDMC_USE_DMA_1 = 1,
|
||||
SDMC_USE_DMA_2 = 2,
|
||||
SDMC_USE_DMA_3 = 3,
|
||||
SDMC_USE_DMA_4 = 0,
|
||||
SDMC_USE_DMA_5 = 1,
|
||||
SDMC_USE_DMA_6 = 2,
|
||||
SDMC_USE_DMA_7 = 3,
|
||||
SDMC_NOUSE_DMA = 0xFF
|
||||
}SDMC_DMA_NO;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user