SD/NANDとのデータ転送をユーザ関数で行える手段を追加

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@110 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
Shirait 2007-06-06 07:55:36 +00:00
parent 384ba7db4e
commit a3c0852954
5 changed files with 207 additions and 80 deletions

View File

@ -843,7 +843,7 @@ u16 MMCP_BusTest( BOOL readflag)
Returns: TRUE : BRE割り込み発生
FALSE : BWE割り込み発生
*---------------------------------------------------------------------------*/
s16 SD_FPGA_irq(void)
BOOL SD_FPGA_irq(void)
{
/*--- FIFOを使うとき ---*/
if( SDCARD_UseFifoFlag) {

View File

@ -325,7 +325,7 @@ u16 MMCP_WriteBusWidth(s16 b4bit);
u16 MMCP_BusTest( BOOL readflag);
s16 SD_FPGA_irq(void); /* カード転送要求時のFPGAの制御 */
BOOL SD_FPGA_irq(void); /* カード転送要求時のFPGAの制御 */
void SD_StopTransmission(void); /* カード転送終了をFPGAに通知する。 */
void SD_TransEndFPGA(void); /* カード転送の終了処理(割り込みマスクを戻す) */
u16 SD_CheckStatus(BOOL bRead); /* Normal response command カードステータスのチェック */

View File

@ -160,6 +160,10 @@ u16 SDCARD_WP_TEMPORARY; /*
u16* pSDCARD_BufferAddr; /* 保存用データ格納バッファアドレス */
sdmcTransferFunction SDCARD_USR_TRANSFER_FUNC = NULL; /* ユーザ転送関数 */
//sdmcTransferFunction CURRENT_TRANSFER_FUNC; /* カレント転送関数 */
BOOL SDCARD_DataFlag; /* データフラグ(転送種別) */
u32 ulSDCARD_SectorCount; /* 転送セクタ数 */
u32 ulSDCARD_RestSectorCount; /* 残り転送セクタ数 */
u32 SDCARD_SectorSize; /* セクタサイズ デフォルト 512bytes */
@ -1005,6 +1009,8 @@ SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),Sd
#endif
SDMC_ERR_CODE api_result; //SDCARD関数の返り値
SDCARD_USR_TRANSFER_FUNC = NULL; //ライブラリ内部関数によるリード
SdMsg.buf = buf;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
@ -1023,6 +1029,41 @@ SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),Sd
return api_result;
}
/*---------------------------------------------------------------------------*
Name: sdmcReadFifoDirect
Description: read from card.
FIFOを使用してカードからの読み出し
Arguments: buf :
bufsize :
offset :
info :
Returns: 0 : success
> 0 : error
*---------------------------------------------------------------------------*/
SDMC_ERR_CODE sdmcReadFifoDirect(sdmcTransferFunction usr_func,
u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info)
{
SDCARDMsg SdMsg;
SDMC_ERR_CODE api_result; //SDCARD関数の返り値
SDCARD_USR_TRANSFER_FUNC = usr_func; //User関数による直接リード
SdMsg.buf = NULL;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
SdMsg.func = func;
SdMsg.info = info;
SdMsg.operation = SD_OPERATION_READ_WITH_FIFO;
api_result = SDCARD_Thread( &SdMsg);
return api_result;
}
/*---------------------------------------------------------------------------*
Name: SDCARDi_ReadFifo
@ -1057,6 +1098,7 @@ static SDMC_ERR_CODE SDCARDi_ReadFifo(void* buf,u32 bufsize,u32 offset,void(*fun
return result;
}
#if 0
/*---------------------------------------------------------------------------*
Name: sdmcRead
@ -1098,6 +1140,7 @@ SDMC_ERR_CODE sdmcRead(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcRe
return api_result;
}
#endif
/*---------------------------------------------------------------------------*
Name: SDCARDi_Read
@ -1129,6 +1172,7 @@ static SDMC_ERR_CODE SDCARDi_Read(void* buf,u32 bufsize,u32 offset,void(*func)(v
ulSDCARD_RestSectorCount = bufsize; /* 残り転送セクタ数の設定 */
pSDCARD_BufferAddr = buf; /* データ格納バッファのアドレスを設定 */
SDCARD_DataFlag = TRUE;
SDCARD_ATC0_Flag = FALSE; /* 全ATC処理完了フラグクリア */
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
@ -1192,6 +1236,23 @@ static SDMC_ERR_CODE SDCARDi_Read(void* buf,u32 bufsize,u32 offset,void(*func)(v
return SDCARD_ErrStatus;
}
/*---------------------------------------------------------------------------*
Name: sdmcSetTransferFunction
Description:
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
/*
void sdmcSetTransferFunction( sdmcTransferFunction usr_func)
{
SDCARD_USR_TRANSFER_FUNC = usr_func;
}*/
/*---------------------------------------------------------------------------*
Name: SDCARD_FPGA_irq
@ -1221,15 +1282,39 @@ static void SDCARD_FPGA_irq(void)
TransCount = (u16)(SDCARD_SectorSize/2); /* 転送カウント設定 (16bit転送なのでセクタサイズの半分) */
}
}
/*-------- ユーザ関数(データ転送、Fifoモード時に有効) --------*/
if(( SDCARD_DataFlag == TRUE)&&( SDCARD_USR_TRANSFER_FUNC != NULL)&&
( SDCARD_UseFifoFlag)) {
SDCARD_USR_TRANSFER_FUNC( (void*)SDIF_FI, SDCARD_SectorSize, bRead);
TransCount = 0;
/*転送終了*/
if( ulSDCARD_RestSectorCount <= 0) { /* 要求セクタ数リード完了したか? */
if( bRead == FALSE) {
if( SDCARD_UseFifoFlag) { /* FIFOを使用するときは */
while( (*SDIF_CNT & SDIF_CNT_NEMP)) {}; /* FIFOにデータが残っているうちは終了しない */
}
}
if(SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE)){ /* SD_SECCNTレジスタがEnableか? */
if( bRead) {
SD_DisableSeccnt(); /* SD_SECCNTレジスタ無効設定 */
}
}else{ /* SD_SECCNTレジスタがDisableのとき */
SD_StopTransmission(); /* カード転送終了をFPGAに通知CMD12発行 */
}
}
SDCARD_ATC0_irq(); /* 転送完了後の処理 */
}else{
/*--- SDカードからのリード時 ---*/
if(bRead){
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);
MI_DmaRecv32( sdmc_dma_no, (void*)SDIF_FI, pSDCARD_BufferAddr, SDCARD_SectorSize);
}else{
MI_DmaRecv16( sdmc_dma_no, (void*)SD_BUF0, pSDCARD_BufferAddr, SDCARD_SectorSize);//TransCount*2);
MI_DmaRecv16( sdmc_dma_no, (void*)SD_BUF0, pSDCARD_BufferAddr, SDCARD_SectorSize);
}
TransCount = 0;
/*転送終了*/
@ -1318,6 +1403,7 @@ static void SDCARD_FPGA_irq(void)
}
}
}
}
}
}
@ -1620,6 +1706,7 @@ static u16 i_sdmcSendSCR(void)
pSDCARD_BufferAddr = SD_SCR; /* データ格納バッファのアドレスを設定 */
/* 転送前の準備処理 */
SDCARD_DataFlag = FALSE;
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
@ -1775,6 +1862,7 @@ static u16 SDCARD_SD_Status(void)
pSDCARD_BufferAddr = SD_SDSTATUS; /* データ格納バッファのアドレスを設定 */
/* 転送前の準備処理 */
SDCARD_DataFlag = FALSE;
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
@ -1849,6 +1937,7 @@ int MMCP_SetBusWidth( BOOL b4bit)
pSDCARD_info = NULL;
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;
pSDCARD_BufferAddr = &TestData; /* データ格納バッファのアドレスを設定 */
SDCARD_DataFlag = FALSE;
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
@ -1875,6 +1964,7 @@ int MMCP_SetBusWidth( BOOL b4bit)
/**/
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */
pSDCARD_BufferAddr = &Resid; /* データ格納バッファのアドレスを設定 */
SDCARD_DataFlag = FALSE;
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
@ -1934,8 +2024,8 @@ static u16 i_sdmcCheckWP(void)
return SDCARD_ErrStatus;
}
else if (SD_port_number == SDCARD_PORT1) /* ポート1のとき */
{
if(!(SD_CheckFPGAReg(EXT_WP,EXT_WP_PORT1))) { //WPフラグが立っていないか?
{ /*TWLのポート1はライトプロテクトビットが常に0プロテクト状態なので反転して評価*/
if((SD_CheckFPGAReg(EXT_WP,EXT_WP_PORT1))) { //WPフラグが立っていないか?
SDCARD_ErrStatus |= SDMC_ERR_WP; //エラーフラグのWPエラービットを立てる
}else{ //WPフラグが立っていたとき
SDCARD_ErrStatus &= ~SDMC_ERR_WP; //エラーフラグのWPエラービットを落とす
@ -1969,6 +2059,8 @@ SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcR
#endif
SDMC_ERR_CODE api_result;
SDCARD_USR_TRANSFER_FUNC = NULL; //ライブラリ内部関数によるリード
SdMsg.buf = buf;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
@ -1987,6 +2079,42 @@ SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcR
return api_result;
}
/*---------------------------------------------------------------------------*
Name: sdmcWriteFifoDirect
Description: write to card.
FIFOを使用してカードへの書き込み
Arguments: buf :
bufsize :
offset :
info :
Returns: 0 : success
> 0 : error
*---------------------------------------------------------------------------*/
SDMC_ERR_CODE sdmcWriteFifoDirect(sdmcTransferFunction usr_func,
u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info)
{
SDCARDMsg SdMsg;
OSMessage recv_dat;
SDMC_ERR_CODE api_result;
SDCARD_USR_TRANSFER_FUNC = usr_func; //User関数による直接リード
SdMsg.buf = NULL;
SdMsg.bufsize = bufsize;
SdMsg.offset = offset;
SdMsg.func = func;
SdMsg.info = info;
SdMsg.operation = SD_OPERATION_WRITE_WITH_FIFO;
api_result = SDCARD_Thread( &SdMsg);
return api_result;
}
/*---------------------------------------------------------------------------*
Name: SDCARDi_WriteFifo
@ -2020,7 +2148,7 @@ static SDMC_ERR_CODE SDCARDi_WriteFifo(void* buf,u32 bufsize,u32 offset,void(*fu
return result;
}
#if 0
/*---------------------------------------------------------------------------*
Name: sdmcWrite
@ -2062,6 +2190,7 @@ SDMC_ERR_CODE sdmcWrite(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResul
return api_result;
}
#endif
/*---------------------------------------------------------------------------*
Name: SDCARDi_Write
@ -2102,6 +2231,7 @@ static SDMC_ERR_CODE SDCARDi_Write(void* buf,u32 bufsize,u32 offset,void(*func)(
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = bufsize;
pSDCARD_BufferAddr = buf; /* データ格納バッファのアドレスを設定 */
SDCARD_DataFlag = TRUE;
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */
@ -2224,6 +2354,7 @@ static u16 i_sdmcGetResid(u32 *pResid)
ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */
pSDCARD_BufferAddr = Resid; /* データ格納バッファのアドレスを設定 */
SDCARD_DataFlag = FALSE;
SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */
SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */
SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */

View File

@ -32,9 +32,28 @@ static void VBlankIntr(void);
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
u32 BlockBuf[512/4];
u32 BlockBuf2[512/4];
u32 BlockBuf[(512*3)/4];
u32 BlockBuf2[(512*3)/4];
/*バッファオフセット*/
static u32 my_buf_offset = 0;
/*ユーザ転送関数*/
void MY_SdTransfer( void* sd_adr, u32 size, BOOL read_flag)
{
if( read_flag) { //リード
MI_DmaRecv32( 2, sd_adr, (void*)((u32)BlockBuf2 + my_buf_offset), size);
}else{ //ライト
MI_DmaSend32( 2, (void*)((u32)BlockBuf + my_buf_offset), sd_adr, size);
}
my_buf_offset += size;
}
/*バッファオフセットのリセット関数*/
void MY_SdTransferRewind( void)
{
my_buf_offset = 0;
}
/*---------------------------------------------------------------------------*
Name: TwlSpMain
@ -80,9 +99,12 @@ void TwlSpMain(void)
/**/
PRINTDEBUG("Sample program starts.\n");
// rtfs_init();
MI_DmaFill32( 2, BlockBuf, 0x55AA55AA, 512*3);
MI_DmaFill32( 2, BlockBuf2, 0x00FF00FF, 512*3);
/*SDドライバ初期化*/
result = sdmcInit( SDMC_USE_DMA_2, NULL, NULL);
result = sdmcInit( SDMC_NOUSE_DMA, NULL, NULL);
if( result != 0) {
PRINTDEBUG( "sdmcInit : failed\n");
while( 1) {};
@ -90,7 +112,8 @@ void TwlSpMain(void)
PRINTDEBUG( "sdmcInit : success\n");
}
/*--- SDからブロックリード ---*/
#if 0
/*--- SDへブロックライトリード ---*/
result = sdmcSelect( (u16)SDMC_PORT_CARD);
if( result != 0) {
PRINTDEBUG( "sdmcSelect failed.\n");
@ -98,15 +121,22 @@ void TwlSpMain(void)
PRINTDEBUG( "sdmcSelect success.\n");
}
result = sdmcReadFifo( BlockBuf, 1, 0, NULL, &SdResult);
result = sdmcWriteFifo( BlockBuf, 3, 10, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcWriteFifo failed.\n");
}else{
PRINTDEBUG( "sdmcWriteFifo success.\n");
}
result = sdmcReadFifo( BlockBuf2, 3, 10, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcReadFifo failed.\n");
}else{
PRINTDEBUG( "sdmcReadFifo success.\n");
}
/*----------------------------*/
/*NANDからブロックリード*/
#else
/*NANDからブロックライト/リード*/
result = sdmcSelect( (u16)SDMC_PORT_NAND);
if( result != 0) {
PRINTDEBUG( "sdmcSelect failed.\n");
@ -114,72 +144,24 @@ void TwlSpMain(void)
PRINTDEBUG( "sdmcSelect success.\n");
}
result = sdmcReadFifo( BlockBuf2, 1, 0, NULL, &SdResult);
MY_SdTransferRewind();
result = sdmcWriteFifoDirect( (sdmcTransferFunction)&MY_SdTransfer, 3, 10, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcReadFifo failed.\n");
PRINTDEBUG( "sdmcWriteFifoDirect failed.\n");
}else{
PRINTDEBUG( "sdmcReadFifo success.\n");
PRINTDEBUG( "sdmcWriteFifoDirect success.\n");
}
MY_SdTransferRewind();
result = sdmcReadFifoDirect( (sdmcTransferFunction)&MY_SdTransfer, 3, 10, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcReadFifoDirect failed.\n");
}else{
PRINTDEBUG( "sdmcReadFifoDirect success.\n");
}
/*----------------------------*/
/*--- SDからブロックリード ---*/
result = sdmcSelect( (u16)SDMC_PORT_CARD);
if( result != 0) {
PRINTDEBUG( "sdmcSelect failed.\n");
}else{
PRINTDEBUG( "sdmcSelect success.\n");
}
result = sdmcReadFifo( BlockBuf2, 1, 0, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcReadFifo failed.\n");
}else{
PRINTDEBUG( "sdmcReadFifo success.\n");
}
/*----------------------------*/
/*NANDからブロックリード*/
result = sdmcSelect( (u16)SDMC_PORT_NAND);
if( result != 0) {
PRINTDEBUG( "sdmcSelect failed.\n");
}else{
PRINTDEBUG( "sdmcSelect success.\n");
}
result = sdmcReadFifo( BlockBuf, 1, 0, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcReadFifo failed.\n");
}else{
PRINTDEBUG( "sdmcReadFifo success.\n");
}
/*----------------------------*/
/*SDへブロックライト*/
/* MI_CpuFill8( BlockBuf2, 0xA5, 512);
result = sdmcWriteFifo( BlockBuf2, 1, 0, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcWriteFifo failed.\n");
}
PRINTDEBUG( "sdmcWriteFifo success.\n");
*/
/*SDからブロックリード*/
/* result = sdmcReadFifo( BlockBuf2, 1, 0, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcReadFifo failed.\n");
}
PRINTDEBUG( "sdmcReadFifo success.\n");
*/
/*SDへブロックライト*/
/* result = sdmcWriteFifo( BlockBuf, 1, 0, NULL, &SdResult);
if( result != 0) {
PRINTDEBUG( "sdmcWriteFifo failed.\n");
}
PRINTDEBUG( "sdmcWriteFifo success.\n");
*/
#endif
/*デバイスドライバの登録*/
/* if( sdmcRtfsAttach( 4) == FALSE) { //sdmcをEドライブにする
PRINTDEBUG( "sdmcRtfsAttach failed.\n");

View File

@ -101,6 +101,14 @@ BOOL sdmcRtfsAttach( int driveno);
BOOL sdmcCheckMedia( void);
/*********************************************
*********************************************/
typedef void (*sdmcTransferFunction)( void* sd_adr, u32 size, BOOL read_flag);
//void sdmcSetTransferFunction( sdmcTransferFunction usr_func);
/*********************************************
API
*********************************************/
@ -111,14 +119,20 @@ 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 sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info);
SDMC_ERR_CODE sdmcReadFifoDirect( sdmcTransferFunction usr_func,
u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info);
/*リードする*/
SDMC_ERR_CODE sdmcRead(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 sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info);
SDMC_ERR_CODE sdmcWriteFifoDirect(sdmcTransferFunction usr_func,
u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info);
/*ライトする*/
SDMC_ERR_CODE sdmcWrite(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);
/*ポート選択*/
u16 sdmcSelectedNo(void);