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:
shirait 2007-07-05 11:01:01 +00:00
parent a2c8036766
commit 7b1d5b2e2c
5 changed files with 147 additions and 81 deletions

View File

@ -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));

View File

@ -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;
}
}
}
}

View File

@ -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 */

View File

@ -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

View File

@ -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;