summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2025-01-21 08:34:12 -0800
committerGitHub <noreply@github.com>2025-01-21 09:34:12 -0700
commitf013a028f42a1b11134bc5f22f28e9f48236b6f0 (patch)
tree494da42deed3acac82e26dbdfc28f89e961f16ef
parent7c3634c2fbfa2756445435d62f0e20c2465cbfc8 (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.h25
-rw-r--r--include/6F1DC0.h10
-rw-r--r--include/code_variables.h14
-rw-r--r--include/m_thread.h2
-rw-r--r--include/sFRm_flashrom.h32
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt41
-rw-r--r--src/code/sFRm_flashrom.c209
-rw-r--r--yamls/jp/code.yaml9
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 }