diff options
| author | Derek Hensley <hensley.derek58@gmail.com> | 2025-01-21 08:34:12 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-21 09:34:12 -0700 |
| commit | f013a028f42a1b11134bc5f22f28e9f48236b6f0 (patch) | |
| tree | 494da42deed3acac82e26dbdfc28f89e961f16ef | |
| parent | 7c3634c2fbfa2756445435d62f0e20c2465cbfc8 (diff) | |
sFRm_flashrom OK (#240)
* YAML setup
* func_800CDF78_jp
* func_800CDEDC_jp
* func_800CDCC0_jp
* func_800CDE54_jp
* func_800CDB10_jp
* func_800CDECC_jp
* func_800CE04C_jp
* func_800CDBE0_jp
* func_800CDBF0_jp
* func_800CDC10_jp
* func_800CDC30_jp
* func_800CDDE0_jp
* func_800CE090_jp
* func_800CE0E8_jp
* func_800CE110_jp
* Cleanup
| -rw-r--r-- | include/6F17B0.h | 25 | ||||
| -rw-r--r-- | include/6F1DC0.h | 10 | ||||
| -rw-r--r-- | include/code_variables.h | 14 | ||||
| -rw-r--r-- | include/m_thread.h | 2 | ||||
| -rw-r--r-- | include/sFRm_flashrom.h | 32 | ||||
| -rw-r--r-- | linker_scripts/jp/symbol_addrs_code.txt | 41 | ||||
| -rw-r--r-- | src/code/sFRm_flashrom.c | 209 | ||||
| -rw-r--r-- | yamls/jp/code.yaml | 9 |
8 files changed, 279 insertions, 63 deletions
diff --git a/include/6F17B0.h b/include/6F17B0.h deleted file mode 100644 index 3ae179f..0000000 --- a/include/6F17B0.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef C_6F17B0_H -#define C_6F17B0_H - -#include "ultra64.h" - -// void func_800CDB10_jp(); -// void func_800CDBE0_jp(); -// void func_800CDBF0_jp(); -// void func_800CDC10_jp(); -// void func_800CDC30_jp(); -// void func_800CDCC0_jp(); -// void func_800CDDE0_jp(); -// void func_800CDE54_jp(); -// void func_800CDECC_jp(); -// void func_800CDEDC_jp(); -// void func_800CDF78_jp(); -// void func_800CE04C_jp(); -// void func_800CE090_jp(); -// void func_800CE0E8_jp(); -// void func_800CE110_jp(); -// void func_800CE120_jp(); -// void func_800CE1CC_jp(); -// void func_800CE328_jp(); - -#endif diff --git a/include/6F1DC0.h b/include/6F1DC0.h new file mode 100644 index 0000000..f0a0c1e --- /dev/null +++ b/include/6F1DC0.h @@ -0,0 +1,10 @@ +#ifndef C_6F1DC0_H +#define C_6F1DC0_H + +#include "ultra64.h" + +// void func_800CE120_jp(); +// void func_800CE1CC_jp(); +// void func_800CE328_jp(); + +#endif diff --git a/include/code_variables.h b/include/code_variables.h index 45c637c..228cb9c 100644 --- a/include/code_variables.h +++ b/include/code_variables.h @@ -758,7 +758,7 @@ extern s32 fuusen_DEBUG_mode_flag; // extern UNK_TYPE D_8010EF30_jp; // extern UNK_TYPE D_8010EF48_jp; // extern UNK_TYPE D_8010EF50_jp; -// extern UNK_TYPE D_8010EF60_jp; + extern char D_8010EF70_jp[]; extern vs32 D_8010EFB0_jp; // TODO: Determine where this goes @@ -1901,18 +1901,6 @@ extern u16 D_80000400[]; // extern UNK_TYPE B_FLT_801446D0_jp; // extern UNK_TYPE B_801446D4_jp; // extern UNK_TYPE B_801446DB_jp; -// extern UNK_TYPE B_801446E0_jp; -// extern UNK_TYPE B_801446F8_jp; -// extern UNK_TYPE B_80144700_jp; -// extern UNK_TYPE B_80144718_jp; -// extern UNK_TYPE B_80144B18_jp; -// extern UNK_TYPE B_80144B38_jp; -// extern UNK_TYPE B_80144CE8_jp; -// extern UNK_TYPE B_80144CEC_jp; -// extern UNK_TYPE B_80144CFC_jp; -// extern UNK_TYPE B_80144D04_jp; -// extern UNK_TYPE B_80144D0C_jp; -// extern UNK_TYPE B_80144D14_jp; // extern UNK_TYPE B_80145390_jp; // extern UNK_TYPE B_80145610_jp; diff --git a/include/m_thread.h b/include/m_thread.h index 0f6936e..3906cac 100644 --- a/include/m_thread.h +++ b/include/m_thread.h @@ -9,8 +9,10 @@ #define M_THREAD_ID_DMAMGR 8 #define M_THREAD_ID_IRQMGR 9 #define M_THREAD_ID_AUDIOMGR 10 +#define M_THREAD_ID_FLASHROM 13 #define M_PRIORITY_GRAPH 8 +#define M_PRIORITY_FLASHROM 9 #define M_PRIORITY_DMAMGR_LOW 10 // Used when decompressing files #define M_PRIORITY_AUDIOMGR 11 #define M_PRIORITY_IDLE 12 diff --git a/include/sFRm_flashrom.h b/include/sFRm_flashrom.h new file mode 100644 index 0000000..cfebe2b --- /dev/null +++ b/include/sFRm_flashrom.h @@ -0,0 +1,32 @@ +#ifndef SFRM_FLASHROM_H +#define SFRM_FLASHROM_H + +#include "ultra64.h" +#include "unk.h" + +typedef struct FlashromRequest { + /* 0x00 */ s32 type; + /* 0x04 */ s32 response; + /* 0x08 */ void* addr; + /* 0x0C */ u32 pageNum; + /* 0x10 */ u32 pageCount; + /* 0x14 */ OSMesgQueue queue; + /* 0x2C */ OSMesg msgBuf[1]; +} FlashromRequest; // size = 0x30 + +#define FLASHROM_REQUEST_WRITE 1 +#define FLASHROM_REQUEST_READ 2 + +s32 sFRm_Init(void); +s32 sFRm_IsInit(void); +s32 sFRm_EraseAll(void); +s32 sFRm_WritePage(void* addr, u32 pageNum); +s32 sFRm_ReadPage(void* addr, u32 pageNum); +void sFRm_InitRequest(void); +void sFRm_WriteAsync(void* addr, u32 pageNum, u32 pageCount); +s32 sFRm_IsBusy(void); +s32 sFRm_AwaitResult(void); +void sFRm_WriteSync(void* addr, u32 pageNum, u32 pageCount); +s32 sFRm_GetResult(void); + +#endif diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt index 5b1cab9..9439a58 100644 --- a/linker_scripts/jp/symbol_addrs_code.txt +++ b/linker_scripts/jp/symbol_addrs_code.txt @@ -3229,21 +3229,21 @@ sCPk_DeleteFile = 0x800CD9F0; // type:func sCPk_FileState = 0x800CDA4C; // type:func sCPk_FileNum = 0x800CDA90; // type:func sCPk_RepairID = 0x800CDAD0; // type:func -func_800CDB10_jp = 0x800CDB10; // type:func -func_800CDBE0_jp = 0x800CDBE0; // type:func -func_800CDBF0_jp = 0x800CDBF0; // type:func -func_800CDC10_jp = 0x800CDC10; // type:func -func_800CDC30_jp = 0x800CDC30; // type:func -func_800CDCC0_jp = 0x800CDCC0; // type:func -func_800CDDE0_jp = 0x800CDDE0; // type:func -func_800CDE54_jp = 0x800CDE54; // type:func -func_800CDECC_jp = 0x800CDECC; // type:func -func_800CDEDC_jp = 0x800CDEDC; // type:func -func_800CDF78_jp = 0x800CDF78; // type:func -func_800CE04C_jp = 0x800CE04C; // type:func -func_800CE090_jp = 0x800CE090; // type:func -func_800CE0E8_jp = 0x800CE0E8; // type:func -func_800CE110_jp = 0x800CE110; // type:func +sFRm_Init = 0x800CDB10; // type:func +sFRm_IsInit = 0x800CDBE0; // type:func +sFRm_EraseSector = 0x800CDBF0; // type:func +sFRm_EraseAll = 0x800CDC10; // type:func +sFRm_WritePage = 0x800CDC30; // type:func +sFRm_Write = 0x800CDCC0; // type:func +sFRm_ReadPage = 0x800CDDE0; // type:func +sFRm_Read = 0x800CDE54; // type:func +sFRm_InitRequest = 0x800CDECC; // type:func +sFRm_proc = 0x800CDEDC; // type:func +sFRm_WriteAsync = 0x800CDF78; // type:func +sFRm_IsBusy = 0x800CE04C; // type:func +sFRm_AwaitResult = 0x800CE090; // type:func +sFRm_WriteSync = 0x800CE0E8; // type:func +sFRm_GetResult = 0x800CE110; // type:func func_800CE120_jp = 0x800CE120; // type:func func_800CE1CC_jp = 0x800CE1CC; // type:func func_800CE328_jp = 0x800CE328; // type:func @@ -4961,7 +4961,7 @@ D_8010EF2C_jp = 0x8010EF2C; // D_8010EF30_jp = 0x8010EF30; // D_8010EF48_jp = 0x8010EF48; // type:u16 D_8010EF50_jp = 0x8010EF50; // -D_8010EF60_jp = 0x8010EF60; // +sFlashromIsInit = 0x8010EF60; // type:s32 size:0x4 D_8010EF70_jp = 0x8010EF70; // S_ongenpos_refuse_fg = 0x8010EF80; // gamePT = 0x8010EF90; // @@ -6135,14 +6135,9 @@ B_801446E0_jp = 0x801446E0; // B_801446F8_jp = 0x801446F8; // B_80144700_jp = 0x80144700; // B_80144718_jp = 0x80144718; // -B_80144B18_jp = 0x80144B18; // +B_80144B18_jp = 0x80144B18; // size:0x1C B_80144B38_jp = 0x80144B38; // -B_80144CE8_jp = 0x80144CE8; // -B_80144CEC_jp = 0x80144CEC; // -B_80144CFC_jp = 0x80144CFC; // -B_80144D04_jp = 0x80144D04; // -B_80144D0C_jp = 0x80144D0C; // -B_80144D14_jp = 0x80144D14; // +B_80144CE8_jp = 0x80144CE8; // size:0x30 audiomgr_class_p = 0x80144D20; // audiomgr_class = 0x80144D28; // type:s8 B_80144E00_jp = 0x80144E00; // diff --git a/src/code/sFRm_flashrom.c b/src/code/sFRm_flashrom.c new file mode 100644 index 0000000..589ba3d --- /dev/null +++ b/src/code/sFRm_flashrom.c @@ -0,0 +1,209 @@ +#include "sFRm_flashrom.h" + +#include "libu64/stackcheck.h" +#include "os_internal_flash.h" + +#include "macros.h" +#include "m_thread.h" +#include "stack.h" + +OSMesgQueue sFlashromMsgQueue; +OSMesg sFlashromMsgBuf[1]; +OSIoMesg sFlashromIOMsg; + +STACK(sFlashromStack, 0x400); +StackEntry sFlashromStackInfo; +OSThread sFlashromThread; +FlashromRequest sFlashromRequest; + +s32 sFlashromIsInit = FALSE; + +s32 sFRm_Init(void) { + s32 ret = TRUE; + u32 type; + u32 maker; + + osFlashInit(); + sFRm_InitRequest(); + osCreateMesgQueue(&sFlashromMsgQueue, sFlashromMsgBuf, ARRAY_COUNT(sFlashromMsgBuf)); + osFlashReadId(&type, &maker); + + switch (maker) { + case FLASH_VERSION_MX_PROTO_A: + break; + + case FLASH_VERSION_MX_A: + break; + + case FLASH_VERSION_MX_C: + break; + + case FLASH_VERSION_MX_B_AND_D: + break; + + case FLASH_VERSION_MEI: + break; + + default: + ret = FALSE; + break; + } + + if (ret == TRUE) { + sFlashromIsInit = TRUE; + } + + return ret; +} + +s32 sFRm_IsInit(void) { + return sFlashromIsInit; +} + +s32 sFRm_EraseSector(u32 pageNum) { + return osFlashSectorErase(pageNum); +} + +s32 sFRm_EraseAll(void) { + return osFlashAllErase(); +} + +s32 sFRm_WritePage(void* addr, u32 pageNum) { + s32 ret = -1; + s32 err; + + osWritebackDCache(addr, FLASH_BLOCK_SIZE); + err = osFlashWriteBuffer(&sFlashromIOMsg, OS_MESG_PRI_NORMAL, addr, &sFlashromMsgQueue); + osRecvMesg(&sFlashromMsgQueue, NULL, OS_MESG_BLOCK); + + if ((err != -1) && (err == 0)) { + ret = osFlashWriteArray(pageNum); + } + + return ret; +} + +s32 sFRm_Write(void* addr, u32 pageNum, u32 pageCount) { + s32 ret; + s32 retries; + u32 i; + + if ((pageNum % FLASH_BLOCK_SIZE) != 0) { + return 1; + } + + osWritebackDCache(addr, pageCount * FLASH_BLOCK_SIZE); + + retries = 3; + do { + ret = osFlashSectorErase(pageNum); + if (ret == -1) { + return ret; + } + + for (i = 0; i < pageCount; i++) { + ret = osFlashWriteBuffer(&sFlashromIOMsg, OS_MESG_PRI_NORMAL, (u8*)addr + i * FLASH_BLOCK_SIZE, + &sFlashromMsgQueue); + osRecvMesg(&sFlashromMsgQueue, NULL, OS_MESG_BLOCK); + if (ret == -1) { + break; + } + + ret = osFlashWriteArray(pageNum + i); + if (ret == -1) { + break; + } + } + retries--; + } while ((ret == -1) && (retries != 0)); + + return ret; +} + +s32 sFRm_ReadPage(void* addr, u32 pageNum) { + s32 ret; + + osInvalDCache(addr, FLASH_BLOCK_SIZE); + ret = osFlashReadArray(&sFlashromIOMsg, 0, pageNum, addr, 1, &sFlashromMsgQueue); + osRecvMesg(&sFlashromMsgQueue, NULL, OS_MESG_BLOCK); + + return ret; +} + +s32 sFRm_Read(void* addr, u32 pageNum, u32 pageCount) { + s32 ret; + OSIoMesg msg; + + osInvalDCache(addr, pageCount * FLASH_BLOCK_SIZE); + ret = osFlashReadArray(&msg, OS_MESG_PRI_NORMAL, pageNum, addr, pageCount, &sFlashromMsgQueue); + osRecvMesg(&sFlashromMsgQueue, NULL, OS_MESG_BLOCK); + return ret; +} + +void sFRm_InitRequest(void) { + FlashromRequest* req = &sFlashromRequest; + + req->type = 0; +} + +void sFRm_proc(void* arg) { + FlashromRequest* req = (FlashromRequest*)arg; + + switch (req->type) { + case FLASHROM_REQUEST_WRITE: + req->response = sFRm_Write(req->addr, req->pageNum, req->pageCount); + osSendMesg(&req->queue, (OSMesg)req->response, OS_MESG_BLOCK); + break; + + case FLASHROM_REQUEST_READ: + req->response = sFRm_Read(req->addr, req->pageNum, req->pageCount); + osSendMesg(&req->queue, (OSMesg)req->response, OS_MESG_BLOCK); + break; + } +} + +void sFRm_WriteAsync(void* addr, u32 pageNum, u32 pageCount) { + FlashromRequest* req = &sFlashromRequest; + + req->type = FLASHROM_REQUEST_WRITE; + req->addr = addr; + req->pageNum = pageNum; + req->pageCount = pageCount; + + osCreateMesgQueue(&req->queue, req->msgBuf, ARRAY_COUNT(req->msgBuf)); + StackCheck_Init(&sFlashromStackInfo, sFlashromStack, STACK_TOP(sFlashromStack), 0, 0x100, "sFRm_flashrom"); + osCreateThread(&sFlashromThread, M_THREAD_ID_FLASHROM, sFRm_proc, &sFlashromRequest, STACK_TOP(sFlashromStack), + M_PRIORITY_FLASHROM); + osStartThread(&sFlashromThread); +} + +s32 sFRm_IsBusy(void) { + FlashromRequest* req = &sFlashromRequest; + + if (sFRm_IsInit() != 1) { + return -1; + } + + return MQ_IS_FULL(&req->queue); +} + +s32 sFRm_AwaitResult(void) { + FlashromRequest* req = &sFlashromRequest; + + osRecvMesg(&req->queue, NULL, OS_MESG_BLOCK); + osDestroyThread(&sFlashromThread); + StackCheck_Check(&sFlashromStackInfo); + StackCheck_Cleanup(&sFlashromStackInfo); + return req->response; +} + +void sFRm_WriteSync(void* addr, u32 pageNum, u32 pageCount) { + sFRm_WriteAsync(addr, pageNum, pageCount); + sFRm_AwaitResult(); +} + +s32 sFRm_GetResult(void) { + FlashromRequest* req = &sFlashromRequest; + + return req->response; +} diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml index 019bf93..4e12fab 100644 --- a/yamls/jp/code.yaml +++ b/yamls/jp/code.yaml @@ -88,7 +88,8 @@ - [0x6EE540, c, code/m_view] - [0x6EFC20, asm, code/6EFC20] - [0x6F12E0, c, code/s_cpak] - - [0x6F17B0, asm, code/6F17B0] + - [0x6F17B0, c, code/sFRm_flashrom] + - [0x6F1DC0, asm, code/6F1DC0] - [0x6F2150, c, code/m_roll_lib] - [0x6F2EE0, c, code/PreRender] - [0x6F5180, c, code/THA_GA] @@ -197,6 +198,8 @@ - [0x732AF0, .data, code/m_time] - [0x732BA0, .data, code/m_view] - [0x732BB0, data, code/732BB0] + - [0x732C00, .data, code/sFRm_flashrom] + - [0x732C10, data, code/732C10] - [0x732C20, .data, code/audio] - [0x732C30, .data, code/game] - [0x732C40, .data, code/main] @@ -268,7 +271,8 @@ - [0x73B780, .rodata, code/m_time] - [0x73B7D0, .rodata, code/m_view] - [0x73B7E0, rodata, code/73B7E0] - - [0x73B830, rodata, code/73B830] + - [0x73B830, .rodata, code/sFRm_flashrom] + - [0x73B840, rodata, code/6F1DC0] - [0x73B880, .rodata, code/m_roll_lib] - [0x73B890, .rodata, code/audio] - [0x73B920, .rodata, code/audioMgr] @@ -325,6 +329,7 @@ - { start: 0x73F4D0, type: .bss, vram: 0x80144660, name: code/m_room_type } - { start: 0x73F4D0, type: .bss, vram: 0x80144670, name: code/m_submenu } - { start: 0x73F4D0, type: bss, vram: 0x80144690, name: code/80144690 } + - { start: 0x73F4D0, type: .bss, vram: 0x801446E0, name: code/sFRm_flashrom } - { start: 0x73F4D0, type: .bss, vram: 0x80144D20, name: code/audioMgr } - { start: 0x73F4D0, type: .bss, vram: 0x80144FC0, name: code/cfbinfo } - { start: 0x73F4D0, type: .bss, vram: 0x80145020, name: code/game } |
