mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
忘れ物追加、SDドライバのDMA対応、MI_DmaRecv32/16追加
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@103 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
parent
25677ae79a
commit
5d2e961a86
@ -46,7 +46,7 @@
|
|||||||
extern u16 BgBak[32*32];
|
extern u16 BgBak[32*32];
|
||||||
//u16 sdcard_request_flag; //カードからのデータ転送要求の有無フラグ
|
//u16 sdcard_request_flag; //カードからのデータ転送要求の有無フラグ
|
||||||
static BOOL thread_flag;
|
static BOOL thread_flag;
|
||||||
|
static u32 sdmc_dma_no;
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
global変数
|
global変数
|
||||||
@ -399,18 +399,22 @@ static void SDCARD_Dmy_Handler( void)
|
|||||||
Description: Initialize SD interface and SD card.
|
Description: Initialize SD interface and SD card.
|
||||||
初期化
|
初期化
|
||||||
|
|
||||||
Arguments: func1 : カード挿入時コールバック関数
|
Arguments: dma_no : 使用するDMA番号
|
||||||
|
func1 : カード挿入時コールバック関数
|
||||||
func2 : カード排出時コールバック関数
|
func2 : カード排出時コールバック関数
|
||||||
|
|
||||||
Returns: 0 : success
|
Returns: 0 : success
|
||||||
> 0 : error code
|
> 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;
|
// SDCARDMsg SdMsg;
|
||||||
// u32 init_msg;
|
// u32 init_msg;
|
||||||
SDMC_ERR_CODE api_result;
|
SDMC_ERR_CODE api_result;
|
||||||
|
|
||||||
|
/**/
|
||||||
|
sdmc_dma_no = dma_no;
|
||||||
|
|
||||||
if( sdmc_tsk_created == FALSE) {
|
if( sdmc_tsk_created == FALSE) {
|
||||||
/*---------- OS準備 ----------*/
|
/*---------- OS準備 ----------*/
|
||||||
if( !OS_IsAlarmAvailable()) { /* アラームチェック(OS_InitAlarm済みか?) */
|
if( !OS_IsAlarmAvailable()) { /* アラームチェック(OS_InitAlarm済みか?) */
|
||||||
@ -1213,50 +1217,59 @@ static void SDCARD_FPGA_irq(void)
|
|||||||
|
|
||||||
/*--- SDカードからのリード時 ---*/
|
/*--- SDカードからのリード時 ---*/
|
||||||
if(bRead){
|
if(bRead){
|
||||||
while(TransCount != 0){ /* 転送カウント分のループ */
|
if( sdmc_dma_no != SDMC_NOUSE_DMA) {
|
||||||
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
if( TransCount != 0) {
|
||||||
*((u32*)pSDCARD_BufferAddr) = *(SDIF_FI); /* 32bit読み出し */
|
if( SDCARD_UseFifoFlag) {
|
||||||
}else{ /*--- FIFOを使わないとき ---*/
|
MI_DmaRecv32( sdmc_dma_no, (void*)SDIF_FI, pSDCARD_BufferAddr, SDCARD_SectorSize);//TransCount*4);
|
||||||
*(pSDCARD_BufferAddr) = *(SD_BUF0); /* 16bit読み出し */
|
}else{
|
||||||
}
|
MI_DmaRecv16( sdmc_dma_no, (void*)SD_BUF0, pSDCARD_BufferAddr, SDCARD_SectorSize);//TransCount*2);
|
||||||
TransCount = (u16)(TransCount-1); /* 転送カウントのデクリメント */
|
}
|
||||||
if(TransCount == 0){ /* 転送カウント分終了? */
|
TransCount = 0;
|
||||||
|
/*転送終了*/
|
||||||
if( ulSDCARD_RestSectorCount <= 0) { /* 要求セクタ数リード完了したか? */
|
if( ulSDCARD_RestSectorCount <= 0) { /* 要求セクタ数リード完了したか? */
|
||||||
if(SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE)){ /* SD_SECCNTレジスタがEnableか? */
|
if(SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE)){ /* SD_SECCNTレジスタがEnableか? */
|
||||||
// SD_DisableSeccnt(); /* SD_SECCNTレジスタ無効設定 */
|
SD_DisableSeccnt(); /* SD_SECCNTレジスタ無効設定 */
|
||||||
}else{ /* SD_SECCNTレジスタがDisableのとき */
|
}else{ /* SD_SECCNTレジスタがDisableのとき */
|
||||||
SD_StopTransmission(); /* カード転送終了をFPGAに通知(CMD12発行) */
|
SD_StopTransmission(); /* カード転送終了をFPGAに通知(CMD12発行) */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SDCARD_ATC0_irq(); /* 転送完了後の処理 */
|
SDCARD_ATC0_irq(); /* 転送完了後の処理 */
|
||||||
}
|
}
|
||||||
if( SDCARD_UseFifoFlag) {
|
}else{
|
||||||
pSDCARD_BufferAddr+=2; /* 読込みデータのバッファアドレスをインクリメント */
|
while(TransCount != 0){ /* 転送カウント分のループ */
|
||||||
}else{
|
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
||||||
pSDCARD_BufferAddr++; /* 読込みデータのバッファアドレスをインクリメント */
|
*((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カードへのライト時 ---*/
|
}else{ /*--- SDカードへのライト時 ---*/
|
||||||
while(TransCount != 0){ /* 転送カウント分のループ */
|
if( sdmc_dma_no != SDMC_NOUSE_DMA) {
|
||||||
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
if( TransCount != 0) {
|
||||||
#if (CTR_DEF_ENVIRONMENT_DSEMU == 1)
|
if( SDCARD_UseFifoFlag) {
|
||||||
*(vu16*)0x08030200 = 1; /* ブレッドボード固有の先読み無効 */
|
MI_DmaSend32( sdmc_dma_no, pSDCARD_BufferAddr, SDIF_FI, SDCARD_SectorSize);
|
||||||
#endif
|
}else{
|
||||||
*(SDIF_FI) = *((u32*)pSDCARD_BufferAddr); /* 32bit書き込み */
|
MI_DmaSend16( sdmc_dma_no, pSDCARD_BufferAddr, SDIF_FI, SDCARD_SectorSize);
|
||||||
#if (CTR_DEF_ENVIRONMENT_DSEMU == 1)
|
}
|
||||||
*(vu16*)0x08030200 = 0; /* ブレッドボード固有の先読み有効 */
|
TransCount = 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( ulSDCARD_RestSectorCount <= 0){ /* 要求セクタ数ライト完了? */
|
if( ulSDCARD_RestSectorCount <= 0){ /* 要求セクタ数ライト完了? */
|
||||||
if( SDCARD_UseFifoFlag) { /* FIFOを使用するときは */
|
if( SDCARD_UseFifoFlag) { /* FIFOを使用するときは */
|
||||||
while( (*SDIF_CNT & SDIF_CNT_NEMP)) {}; /* FIFOにデータが残っているうちは終了しない */
|
while( (*SDIF_CNT & SDIF_CNT_NEMP)) {}; /* FIFOにデータが残っているうちは終了しない */
|
||||||
@ -1269,10 +1282,32 @@ static void SDCARD_FPGA_irq(void)
|
|||||||
}
|
}
|
||||||
SDCARD_ATC0_irq(); /* 転送完了後の処理 */
|
SDCARD_ATC0_irq(); /* 転送完了後の処理 */
|
||||||
}
|
}
|
||||||
if( SDCARD_UseFifoFlag) {
|
}else{
|
||||||
pSDCARD_BufferAddr+=2; /* 書込みデータのバッファアドレスをインクリメント */
|
while(TransCount != 0){ /* 転送カウント分のループ */
|
||||||
}else{
|
if( SDCARD_UseFifoFlag) { /*--- FIFOを使うとき ---*/
|
||||||
pSDCARD_BufferAddr++; /* 書込みデータのバッファアドレスをインクリメント */
|
*(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++; /* 書込みデータのバッファアドレスをインクリメント */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,6 +35,7 @@ INCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/mi/common/include \
|
|||||||
|
|
||||||
SRCS = \
|
SRCS = \
|
||||||
mi_dma.c \
|
mi_dma.c \
|
||||||
|
mi_dma_patch.c \
|
||||||
mi_exDma.c \
|
mi_exDma.c \
|
||||||
mi_dma_hblank.c \
|
mi_dma_hblank.c \
|
||||||
mi_dma_vblank.c \
|
mi_dma_vblank.c \
|
||||||
|
|||||||
@ -29,7 +29,7 @@ TARGET_BIN = main.axf
|
|||||||
SRCS = main.c
|
SRCS = main.c
|
||||||
|
|
||||||
INCDIR += $(TWLSDK_ROOT)/include/twl \
|
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 \
|
$(TWLSDK_ROOT)/include/twl/fatfs/ARM7 \
|
||||||
|
|
||||||
LLIBRARY_DIRS = $(TWLSDK_ROOT)/lib/ARM-BB/Release
|
LLIBRARY_DIRS = $(TWLSDK_ROOT)/lib/ARM-BB/Release
|
||||||
|
|||||||
120
include/twl/devices/rom_sdmc/ARM7/sdmc.h
Normal file
120
include/twl/devices/rom_sdmc/ARM7/sdmc.h
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
|
||||||
|
#ifndef __SDMC_H__
|
||||||
|
#define __SDMC_H__
|
||||||
|
|
||||||
|
#include <twl.h>
|
||||||
|
#include <rtfs.h>
|
||||||
|
|
||||||
|
|
||||||
|
#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__*/
|
||||||
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include <nitro/mi.h>
|
#include <nitro/mi.h>
|
||||||
|
|
||||||
|
#include <twl/mi/dma_patch.h>
|
||||||
#include <twl/mi/exDma.h>
|
#include <twl/mi/exDma.h>
|
||||||
#include <twl/mi/wram_abc.h>
|
#include <twl/mi/wram_abc.h>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user