summaryrefslogtreecommitdiff
path: root/lib/ultralib/src/io/controller.c
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2023-03-28 23:42:56 -0300
committerGitHub <noreply@github.com>2023-03-29 03:42:56 +0100
commitd66a21685f45d130f980e8a5ec7b08cfe189e40b (patch)
treef11b3b09dc5772e419fe08d3d0ead4e778def57f /lib/ultralib/src/io/controller.c
parent6a5e64cc4c26398cc607bb02cdc12a056ddf42d1 (diff)
Initial repo setup (#1)
* git subrepo clone git@github.com:ethteck/splat.git tools/splat subrepo: subdir: "tools/splat" merged: "4fec014" upstream: origin: "git@github.com:ethteck/splat.git" branch: "master" commit: "4fec014" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * gitignore * decompress_baserom.py * Initial yaml * run flib * more yaml stuff * Builds an uncompressed ROM * setup ido download * git subrepo clone git@github.com:simonlindholm/asm-differ.git tools/asm-differ subrepo: subdir: "tools/asm-differ" merged: "ae40866" upstream: origin: "git@github.com:simonlindholm/asm-differ.git" branch: "main" commit: "ae40866" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo clone git@github.com:simonlindholm/asm-processor.git tools/asm-processor subrepo: subdir: "tools/asm-processor" merged: "bbd86ea" upstream: origin: "git@github.com:simonlindholm/asm-processor.git" branch: "main" commit: "bbd86ea" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo clone (merge) git@github.com:EllipticEllipsis/fado.git tools/fado subrepo: subdir: "tools/fado" merged: "8d896ee" upstream: origin: "git@github.com:EllipticEllipsis/fado.git" branch: "master" commit: "8d896ee" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * setup ido in makefile * data and rodata * add automatic file splits * bootstrap most symbol_addrs * git subrepo clone --branch=irix git@github.com:hensldm/ultralib.git lib/ultralib subrepo: subdir: "lib/ultralib" merged: "0d1e095" upstream: origin: "git@github.com:hensldm/ultralib.git" branch: "irix" commit: "0d1e095" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * setup ido building * various tooling * git subrepo pull tools/asm-differ subrepo: subdir: "tools/asm-differ" merged: "857b398" upstream: origin: "git@github.com:simonlindholm/asm-differ.git" branch: "main" commit: "857b398" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * Change defines to match IDO * review * newlin * update gitignore * Windows error * D_01000000 * yeet settings.json * yeet * git subrepo clone git@github.com:decompals/ultralib.git lib/ultralib subrepo: subdir: "lib/ultralib" merged: "d03b2a3" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "d03b2a3" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * clangformat and clangtidy * Setup a bunch of headers * bootstrap boot and code functions and variables headers * global.h * update format.py includes * -D_MIPS_SZLONG=32 * format.py: --verbose * Update tools/decompress_baserom.py Co-authored-by: Derek Hensley <hensley.derek58@gmail.com> * Add libc to global.h * review * yeet saved_regs * yeet headers * yeet _MSC_VER * more header cleanup * add readme licensing note --------- Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
Diffstat (limited to 'lib/ultralib/src/io/controller.c')
-rw-r--r--lib/ultralib/src/io/controller.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/ultralib/src/io/controller.c b/lib/ultralib/src/io/controller.c
new file mode 100644
index 0000000..db9b769
--- /dev/null
+++ b/lib/ultralib/src/io/controller.c
@@ -0,0 +1,99 @@
+#include "macros.h"
+#include "PR/os_internal.h"
+#include "controller.h"
+
+s32 __osContinitialized = 0;
+
+OSPifRam __osContPifRam ALIGNED(16);
+u8 __osContLastCmd;
+u8 __osMaxControllers;
+
+OSTimer __osEepromTimer;
+OSMesgQueue __osEepromTimerQ ALIGNED(8);
+OSMesg __osEepromTimerMsg;
+
+s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) {
+ OSMesg dummy;
+ s32 ret = 0;
+ OSTime t;
+ OSTimer mytimer;
+ OSMesgQueue timerMesgQueue;
+
+ if (__osContinitialized != 0) {
+ return 0;
+ }
+
+ __osContinitialized = 1;
+
+ t = osGetTime();
+ if (t < OS_USEC_TO_CYCLES(500000)) {
+ osCreateMesgQueue(&timerMesgQueue, &dummy, 1);
+ osSetTimer(&mytimer, OS_USEC_TO_CYCLES(500000) - t, 0, &timerMesgQueue, &dummy);
+ osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK);
+ }
+
+ __osMaxControllers = 4;
+
+ __osPackRequestData(CONT_CMD_REQUEST_STATUS);
+
+ ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray);
+ osRecvMesg(mq, &dummy, OS_MESG_BLOCK);
+
+ ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray);
+ osRecvMesg(mq, &dummy, OS_MESG_BLOCK);
+
+ __osContGetInitData(bitpattern, data);
+ __osContLastCmd = CONT_CMD_REQUEST_STATUS;
+ __osSiCreateAccessQueue();
+ osCreateMesgQueue(&__osEepromTimerQ, &__osEepromTimerMsg, 1);
+
+ return ret;
+}
+
+void __osContGetInitData(u8* pattern, OSContStatus* data) {
+ u8* ptr;
+ __OSContRequesFormat requestHeader;
+ s32 i;
+ u8 bits;
+
+ bits = 0;
+ ptr = __osContPifRam.ramarray;
+ for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestHeader), data++) {
+ requestHeader = *(__OSContRequesFormat*)ptr;
+ data->errno = CHNL_ERR(requestHeader);
+ if (data->errno == 0) {
+ data->type = requestHeader.typel << 8 | requestHeader.typeh;
+ data->status = requestHeader.status;
+
+ bits |= 1 << i;
+ }
+ }
+ *pattern = bits;
+}
+
+void __osPackRequestData(u8 cmd) {
+ u8* ptr;
+ __OSContRequesFormat requestHeader;
+ s32 i;
+
+ for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) {
+ __osContPifRam.ramarray[i] = 0;
+ }
+
+ __osContPifRam.pifstatus = CONT_CMD_EXE;
+ ptr = __osContPifRam.ramarray;
+ requestHeader.dummy = CONT_CMD_NOP;
+ requestHeader.txsize = CONT_CMD_RESET_TX;
+ requestHeader.rxsize = CONT_CMD_RESET_RX;
+ requestHeader.cmd = cmd;
+ requestHeader.typeh = CONT_CMD_NOP;
+ requestHeader.typel = CONT_CMD_NOP;
+ requestHeader.status = CONT_CMD_NOP;
+ requestHeader.dummy1 = CONT_CMD_NOP;
+
+ for (i = 0; i < __osMaxControllers; i++) {
+ *(__OSContRequesFormat*)ptr = requestHeader;
+ ptr += sizeof(requestHeader);
+ }
+ *ptr = CONT_CMD_END;
+}