From 5d2e961a8630d08eef706c83756d678896bd50db Mon Sep 17 00:00:00 2001 From: Shirait Date: Tue, 5 Jun 2007 09:11:08 +0000 Subject: [PATCH] =?UTF-8?q?=E5=BF=98=E3=82=8C=E7=89=A9=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=80=81SD=E3=83=89=E3=83=A9=E3=82=A4=E3=83=90=E3=81=AEDMA?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C=E3=80=81MI=5FDmaRecv32/16=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@103 4ee2a332-4b2b-5046-8439-1ba90f034370 --- build/libraries/devices/rom_sdmc/ARM7/sdmc.c | 115 +++++++++++------- build/libraries/mi/ARM7/Makefile | 1 + build/tests/fatfs/fatfs_sd/ARM7/Makefile | 2 +- include/twl/devices/rom_sdmc/ARM7/sdmc.h | 120 +++++++++++++++++++ include/twl/mi.h | 1 + 5 files changed, 198 insertions(+), 41 deletions(-) create mode 100644 include/twl/devices/rom_sdmc/ARM7/sdmc.h diff --git a/build/libraries/devices/rom_sdmc/ARM7/sdmc.c b/build/libraries/devices/rom_sdmc/ARM7/sdmc.c index a9815c6..5fc1b47 100644 --- a/build/libraries/devices/rom_sdmc/ARM7/sdmc.c +++ b/build/libraries/devices/rom_sdmc/ARM7/sdmc.c @@ -46,7 +46,7 @@ extern u16 BgBak[32*32]; //u16 sdcard_request_flag; //カードからのデータ転送要求の有無フラグ static BOOL thread_flag; - +static u32 sdmc_dma_no; /*********************************************************************** global変数 @@ -399,18 +399,22 @@ static void SDCARD_Dmy_Handler( void) Description: Initialize SD interface and SD card. 初期化 - Arguments: func1 : カード挿入時コールバック関数 + Arguments: dma_no : 使用するDMA番号 + func1 : カード挿入時コールバック関数 func2 : カード排出時コールバック関数 Returns: 0 : success > 0 : error code *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcInit(void (*func1)(),void (*func2)()) +SDMC_ERR_CODE sdmcInit( SDMC_DMA_NO dma_no, void (*func1)(),void (*func2)()) { // SDCARDMsg SdMsg; // u32 init_msg; SDMC_ERR_CODE api_result; + /**/ + sdmc_dma_no = dma_no; + if( sdmc_tsk_created == FALSE) { /*---------- OS準備 ----------*/ if( !OS_IsAlarmAvailable()) { /* アラームチェック(OS_InitAlarm済みか?) */ @@ -1213,50 +1217,59 @@ static void SDCARD_FPGA_irq(void) /*--- SDカードからのリード時 ---*/ if(bRead){ - while(TransCount != 0){ /* 転送カウント分のループ */ - if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/ - *((u32*)pSDCARD_BufferAddr) = *(SDIF_FI); /* 32bit読み出し */ - }else{ /*--- FIFOを使わないとき ---*/ - *(pSDCARD_BufferAddr) = *(SD_BUF0); /* 16bit読み出し */ - } - TransCount = (u16)(TransCount-1); /* 転送カウントのデクリメント */ - if(TransCount == 0){ /* 転送カウント分終了? */ + if( sdmc_dma_no != SDMC_NOUSE_DMA) { + if( TransCount != 0) { + if( SDCARD_UseFifoFlag) { + MI_DmaRecv32( sdmc_dma_no, (void*)SDIF_FI, pSDCARD_BufferAddr, SDCARD_SectorSize);//TransCount*4); + }else{ + MI_DmaRecv16( sdmc_dma_no, (void*)SD_BUF0, pSDCARD_BufferAddr, SDCARD_SectorSize);//TransCount*2); + } + TransCount = 0; + /*転送終了*/ if( ulSDCARD_RestSectorCount <= 0) { /* 要求セクタ数リード完了したか? */ if(SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE)){ /* SD_SECCNTレジスタがEnableか? */ -// SD_DisableSeccnt(); /* SD_SECCNTレジスタ無効設定 */ + SD_DisableSeccnt(); /* SD_SECCNTレジスタ無効設定 */ }else{ /* SD_SECCNTレジスタがDisableのとき */ SD_StopTransmission(); /* カード転送終了をFPGAに通知(CMD12発行) */ } } SDCARD_ATC0_irq(); /* 転送完了後の処理 */ } - if( SDCARD_UseFifoFlag) { - pSDCARD_BufferAddr+=2; /* 読込みデータのバッファアドレスをインクリメント */ - }else{ - pSDCARD_BufferAddr++; /* 読込みデータのバッファアドレスをインクリメント */ + }else{ + while(TransCount != 0){ /* 転送カウント分のループ */ + if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/ + *((u32*)pSDCARD_BufferAddr) = *(SDIF_FI); /* 32bit読み出し */ + }else{ /*--- FIFOを使わないとき ---*/ + *(pSDCARD_BufferAddr) = *(SD_BUF0); /* 16bit読み出し */ + } + TransCount = (u16)(TransCount-1); /* 転送カウントのデクリメント */ + if(TransCount == 0){ /* 転送カウント分終了? */ + if( ulSDCARD_RestSectorCount <= 0) { /* 要求セクタ数リード完了したか? */ + if(SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE)){ /* SD_SECCNTレジスタがEnableか? */ + // SD_DisableSeccnt(); /* SD_SECCNTレジスタ無効設定 */ + }else{ /* SD_SECCNTレジスタがDisableのとき */ + SD_StopTransmission(); /* カード転送終了をFPGAに通知(CMD12発行) */ + } + } + SDCARD_ATC0_irq(); /* 転送完了後の処理 */ + } + if( SDCARD_UseFifoFlag) { + pSDCARD_BufferAddr+=2; /* 読込みデータのバッファアドレスをインクリメント */ + }else{ + pSDCARD_BufferAddr++; /* 読込みデータのバッファアドレスをインクリメント */ + } } } }else{ /*--- SDカードへのライト時 ---*/ - while(TransCount != 0){ /* 転送カウント分のループ */ - if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/ -#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - *(vu16*)0x08030200 = 1; /* ブレッドボード固有の先読み無効 */ -#endif - *(SDIF_FI) = *((u32*)pSDCARD_BufferAddr); /* 32bit書き込み */ -#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - *(vu16*)0x08030200 = 0; /* ブレッドボード固有の先読み有効 */ -#endif - }else{ /*--- FIFOを使わないとき ---*/ -#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - *(vu16*)0x08030200 = 1; /* ブレッドボード固有の先読み無効 */ -#endif - *(SD_BUF0) = *(pSDCARD_BufferAddr); /* 16bit書き込み */ -#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - *(vu16*)0x08030200 = 0; /* ブレッドボード固有の先読み有効 */ -#endif - } - TransCount = (u16)(TransCount-1); /* 転送カウントのデクリメント */ - if(TransCount == 0){ /* 転送カウント分終了? */ + if( sdmc_dma_no != SDMC_NOUSE_DMA) { + if( TransCount != 0) { + if( SDCARD_UseFifoFlag) { + MI_DmaSend32( sdmc_dma_no, pSDCARD_BufferAddr, SDIF_FI, SDCARD_SectorSize); + }else{ + MI_DmaSend16( sdmc_dma_no, pSDCARD_BufferAddr, SDIF_FI, SDCARD_SectorSize); + } + TransCount = 0; + /*転送終了*/ if( ulSDCARD_RestSectorCount <= 0){ /* 要求セクタ数ライト完了? */ if( SDCARD_UseFifoFlag) { /* FIFOを使用するときは */ while( (*SDIF_CNT & SDIF_CNT_NEMP)) {}; /* FIFOにデータが残っているうちは終了しない */ @@ -1269,10 +1282,32 @@ static void SDCARD_FPGA_irq(void) } SDCARD_ATC0_irq(); /* 転送完了後の処理 */ } - if( SDCARD_UseFifoFlag) { - pSDCARD_BufferAddr+=2; /* 書込みデータのバッファアドレスをインクリメント */ - }else{ - pSDCARD_BufferAddr++; /* 書込みデータのバッファアドレスをインクリメント */ + }else{ + while(TransCount != 0){ /* 転送カウント分のループ */ + if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/ + *(SDIF_FI) = *((u32*)pSDCARD_BufferAddr); /* 32bit書き込み */ + }else{ /*--- FIFOを使わないとき ---*/ + *(SD_BUF0) = *(pSDCARD_BufferAddr); /* 16bit書き込み */ + } + TransCount = (u16)(TransCount-1); /* 転送カウントのデクリメント */ + if(TransCount == 0){ /* 転送カウント分終了? */ + if( ulSDCARD_RestSectorCount <= 0){ /* 要求セクタ数ライト完了? */ + if( SDCARD_UseFifoFlag) { /* FIFOを使用するときは */ + while( (*SDIF_CNT & SDIF_CNT_NEMP)) {}; /* FIFOにデータが残っているうちは終了しない */ + } + if(SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE)){ /* SD_SECCNTレジスタがEnableか? */ + // SD_DisableSeccnt(); /* SD_SECCNTレジスタ無効設定 */ + }else{ /* SD_SECCNTレジスタがDisableのとき */ + SD_StopTransmission(); /* カード転送終了をFPGAに通知(CMD12発行) */ + } + } + SDCARD_ATC0_irq(); /* 転送完了後の処理 */ + } + if( SDCARD_UseFifoFlag) { + pSDCARD_BufferAddr+=2; /* 書込みデータのバッファアドレスをインクリメント */ + }else{ + pSDCARD_BufferAddr++; /* 書込みデータのバッファアドレスをインクリメント */ + } } } } diff --git a/build/libraries/mi/ARM7/Makefile b/build/libraries/mi/ARM7/Makefile index 6bec087..21fadf4 100644 --- a/build/libraries/mi/ARM7/Makefile +++ b/build/libraries/mi/ARM7/Makefile @@ -35,6 +35,7 @@ INCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/mi/common/include \ SRCS = \ mi_dma.c \ + mi_dma_patch.c \ mi_exDma.c \ mi_dma_hblank.c \ mi_dma_vblank.c \ diff --git a/build/tests/fatfs/fatfs_sd/ARM7/Makefile b/build/tests/fatfs/fatfs_sd/ARM7/Makefile index dee4706..59abbd8 100644 --- a/build/tests/fatfs/fatfs_sd/ARM7/Makefile +++ b/build/tests/fatfs/fatfs_sd/ARM7/Makefile @@ -29,7 +29,7 @@ TARGET_BIN = main.axf SRCS = main.c INCDIR += $(TWLSDK_ROOT)/include/twl \ - $(TWLSDK_ROOT)/include/twl/devices/sdmc/ARM7 \ + $(TWLSDK_ROOT)/include/twl/devices/rom_sdmc/ARM7 \ $(TWLSDK_ROOT)/include/twl/fatfs/ARM7 \ LLIBRARY_DIRS = $(TWLSDK_ROOT)/lib/ARM-BB/Release diff --git a/include/twl/devices/rom_sdmc/ARM7/sdmc.h b/include/twl/devices/rom_sdmc/ARM7/sdmc.h new file mode 100644 index 0000000..dc74363 --- /dev/null +++ b/include/twl/devices/rom_sdmc/ARM7/sdmc.h @@ -0,0 +1,120 @@ + +#ifndef __SDMC_H__ +#define __SDMC_H__ + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/********************************************* + DMA番号 +*********************************************/ +typedef enum { + SDMC_USE_DMA_0 = 0, + SDMC_USE_DMA_1 = 1, + SDMC_USE_DMA_2 = 2, + SDMC_USE_DMA_3 = 3, + SDMC_NOUSE_DMA = 0xFF +}SDMC_DMA_NO; + + +/********************************************* + カードエラーコード(カードエラーステータス設定値)アプリケーション固有のSDCARD_ErrStatusに対して +*********************************************/ +typedef enum { + SDMC_NORMAL = 0, /* 正常終了 */ + SDMC_ERR_COMMAND = 0x0001, /* CMDエラー */ + SDMC_ERR_CRC = 0x0002, /* CRCエラー */ + SDMC_ERR_END = 0x0004, /* 実行エラー */ + SDMC_ERR_TIMEOUT = 0x0008, /* コマンドタイムアウト */ + SDMC_ERR_FIFO_OVF = 0x0010, /* FIFO オーバーフローエラー(INFO2のIllegal write access to buffer) */ + SDMC_ERR_FIFO_UDF = 0x0020, /* FIFO アンダーフローエラー(INFO2のIllegal read access to buffer) */ + SDMC_ERR_WP = 0x0040, /* WriteProtectによる書き込みエラー */ + SDMC_ERR_FPGA_TIMEOUT = 0x0100, /* FPGA アクセスタイムアウト */ + SDMC_ERR_PARAM = 0x0200, /* コマンドパラメータエラー */ + SDMC_ERR_R1_STATUS = 0x0800, /* Normal response command カードステータス エラー */ + SDMC_ERR_NUM_WR_SECTORS = 0x1000, /* 書き込み完了セクタ数 エラー */ + SDMC_ERR_RESET = 0x2000, /* 初期化カードリセットコマンド時1.5秒タイムアウトエラー */ + SDMC_ERR_ILA = 0x4000, /* イリーガルアクセスエラー */ + SDMC_ERR_INFO_DETECT = 0x8000 /* カード排出時判別エラービット(IO3) */ +}SDMC_ERR_CODE; + + +/********************************************* + SDドライバ処理結果通知情報構造体 +*********************************************/ +typedef struct { + u16 b_flags; /* 処理内容 */ + u16 result; /* 実行結果 */ + u32 resid; /* 読み(書き)サイズ */ +} SdmcResultInfo; + + +/********************************************* + SDスペック構造体 +*********************************************/ +typedef struct { + u32 csd_ver2_flag; //CSDフォーマットバージョン(SDHCのときは1) + u32 memory_capacity; //data areaのサイズ(512Byte単位) + u32 protected_capacity; //protected areaのサイズ(512Byte単位) + u32 card_capacity; //カード全体のサイズ(512Byte単位) + + u32 adjusted_memory_capacity; //memory_capacityをシリンダ(heads*secptrack)の倍数に調整したサイズ(cylinders*heads*secptrackになる) + + u16 heads; + u16 secptrack; + u16 cylinders; + u16 SC; //sectors per cluster + u16 BU; + u16 RDE; //number of root dir entries(512 fix) + u32 SS; //sector size(512 fix) + u32 RSC; //reserved sector count(1 fix) +// u32 TS; //total sectors + u16 FATBITS; //16 or 32 + u16 SF; //sectors per FAT + u32 SSA; //sectors in system area + u32 NOM; //sectors in master boot record +} SdmcSpec; + + +/********************************************* + RTFS用ドライバインタフェース +*********************************************/ +BOOL sdmcRtfsIo( int driveno, dword block, void* buffer, word count, BOOLEAN reading); +int sdmcRtfsCtrl( int driveno, int opcode, void* pargs); +BOOL sdmcRtfsAttach( int driveno); + +BOOL sdmcCheckMedia( void); + + +/********************************************* + 基本API +*********************************************/ +SDMC_ERR_CODE sdmcInit( SDMC_DMA_NO dma_no, void (*func1)(),void (*func2)());/* カードドライバ初期化 */ +SDMC_ERR_CODE sdmcReset( void); /* カードリセット */ + +SDMC_ERR_CODE sdmcGetStatus(u16 *status); /* カードドライバの現在の状態を取得する */ +u32 sdmcGetCardSize(void); /* カード全サイズの取得 */ + +/*SD I/FのFIFOを使ってリードする(高速)*/ +SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info);/* テスト用カードリード */ +/*リードする*/ +SDMC_ERR_CODE sdmcRead(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); /* テスト用カードリード */ + +/*SD I/FのFIFOを使ってライトする(高速)*/ +SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info);/* テスト用カードライト */ +/*ライトする*/ +SDMC_ERR_CODE sdmcWrite(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); /* テスト用カードライト */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /*__SDMC_H__*/ diff --git a/include/twl/mi.h b/include/twl/mi.h index fdcf66b..8c39d91 100644 --- a/include/twl/mi.h +++ b/include/twl/mi.h @@ -19,6 +19,7 @@ #include +#include #include #include