From b3df113d3f85f7965f8fab4b035decf09a98b881 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Wed, 14 May 2008 06:56:20 +0000 Subject: [PATCH] =?UTF-8?q?WRAM=E7=B5=8C=E7=94=B1=E3=81=A7=E3=82=AB?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=83=AA=E3=83=BC=E3=83=89=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=9F=E3=82=81=E3=81=AE=E9=96=A2=E6=95=B0=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=EF=BC=88=E5=8B=95=E4=BD=9C=E6=9C=AA=E7=A2=BA=E8=AA=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1339 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/ARM9/include/fs_wram.h | 1 + .../sysmenu/ARM9/src/fs_wram.c | 67 ++++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/include/fs_wram.h b/build/libraries_sysmenu/sysmenu/ARM9/include/fs_wram.h index 2031a60e..2ddcf697 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/include/fs_wram.h +++ b/build/libraries_sysmenu/sysmenu/ARM9/include/fs_wram.h @@ -58,6 +58,7 @@ BOOL FS_InitWramTransfer( u32 priority ); arg コールバックに渡される引数 */ BOOL FS_ReadFileViaWram( FSFile *p_file, void *dst, s32 len, MIWramPos wram, s32 slot, MIWramSize size, FSWramCallback callback, void* arg ); +BOOL HOTSW_ReadCardViaWram( void *src, void *dst, s32 len, MIWramPos wram, s32 slot, MIWramSize size, FSWramCallback callback, void* arg ); /* FS_WriteFileViaWram FS/FATFSに対して同期Writeを行う diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c b/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c index 11b47cf7..be8d37e9 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/fs_wram.c @@ -17,6 +17,7 @@ #include #include "fs_wram.h" +#include /* 基本概念 @@ -106,7 +107,8 @@ typedef enum FSWramCommand { FS_WRAM_COMMAND_READ, - FS_WRAM_COMMAND_WRITE + FS_WRAM_COMMAND_WRITE, + FS_WRAM_COMMAND_READ_CARD } FSWramCommand; @@ -133,6 +135,7 @@ typedef struct FSWramWork FSWramCommand command; FSFile *p_file; + void *card_src; int nums; // WRAMスロット数 u32 base; // WRAMの先頭アドレス @@ -185,6 +188,11 @@ static void FSi_WramThread(void* arg) result = FS_ReadFile( FSiWramWork.p_file, cmd->addr, cmd->length ); //OS_TPrintf("%s: (0x%08X) %d msec\n", __func__, cmd->addr, (int)OS_TicksToMilliSeconds(OS_GetTick())); break; + case FS_WRAM_COMMAND_READ_CARD: + // カードリード + HOTSW_ReadCardData( FSiWramWork.card_src, cmd->addr, (u32)cmd->length); + result = cmd->length;//暫定 + break; case FS_WRAM_COMMAND_WRITE: result = FS_WriteFile( FSiWramWork.p_file, cmd->addr, cmd->length ); //OS_TPrintf("%s: (0x%08X) %d msec\n", __func__, cmd->addr, (int)OS_TicksToMilliSeconds(OS_GetTick())); @@ -359,6 +367,63 @@ static BOOL FSi_WriteWram(const u8* src, u32 len, MIWramPos wram, s32 slot, FSWr return TRUE; } +BOOL HOTSW_ReadCardViaWram( void *src, void *dst, s32 len, MIWramPos wram, s32 slot, MIWramSize size, FSWramCallback callback, void* arg ) +{ + OSIntrMode enabled = OS_DisableInterrupts(); + BOOL result; + int l,n; + SDK_ASSERT( wram != MI_WRAM_A ); + + if ( FSiWramWork.busy ) // 転送中 + { + OS_RestoreInterrupts(enabled); + return FALSE; + } + FSiWramWork.busy = TRUE; + OS_RestoreInterrupts(enabled); + + + // WRAMの確保 + FSiWramWork.base = MI_AllocWramSlot( wram, slot, size, MI_WRAM_ARM9 ); + if ( FSiWramWork.base == 0 ) + { + FSiWramWork.busy = FALSE; + OS_TPrintf("Cannot allocate WRAM %d, %d, %d\n", wram, slot, size); + return FALSE; + } + // cash care + DC_InvalidateRange((void *)FSiWramWork.base, size); + + + // パラメータ設定 + FSiWramWork.command = FS_WRAM_COMMAND_READ_CARD; + FSiWramWork.card_src = src; + FSiWramWork.nums = MI_WRAM_ENUM_TO_SIZE( size ) * 1024 / FS_WRAM_SLOT_SIZE; + + // 必要に応じて7側にスイッチ可能なWRAMとして指定 + n = 0; + for(l=0;lARM9起動 + result = FSi_ReadWram(dst, (u32)len, wram, slot, callback, arg); + + MI_FreeWramSlot( wram, slot, size, MI_WRAM_ARM9 ); + FSi_SetSwitchableWramSlots(0,0); // スイッチ可能WRAMの指定を元に戻す + FSiWramWork.busy = FALSE; + return result; +} + BOOL FS_ReadFileViaWram( FSFile *p_file, void *dst, s32 len, MIWramPos wram, s32 slot, MIWramSize size, FSWramCallback callback, void* arg ) { OSIntrMode enabled = OS_DisableInterrupts();