aboutsummaryrefslogtreecommitdiff
path: root/src/drv/ps1/rcnt
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2025-07-07 13:22:53 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2025-11-11 00:08:15 +0100
commit7861a52adf92a083bb2aed4c35f98d8035dce032 (patch)
tree28cd3c40e4c878f730f5df3c1d93bdf91af490c3 /src/drv/ps1/rcnt
parent7fc48e9216ff809da5f8055a50b0be17628ef1df (diff)
downloadwnix-7861a52adf92a083bb2aed4c35f98d8035dce032.tar.gz
Setup project skeleton
Diffstat (limited to 'src/drv/ps1/rcnt')
-rw-r--r--src/drv/ps1/rcnt/CMakeLists.txt22
-rw-r--r--src/drv/ps1/rcnt/include/drv/ps1/rcnt.h45
-rw-r--r--src/drv/ps1/rcnt/private_include/drv/ps1/rcnt/regs.h36
-rw-r--r--src/drv/ps1/rcnt/src/CMakeLists.txt19
-rw-r--r--src/drv/ps1/rcnt/src/init.c62
5 files changed, 184 insertions, 0 deletions
diff --git a/src/drv/ps1/rcnt/CMakeLists.txt b/src/drv/ps1/rcnt/CMakeLists.txt
new file mode 100644
index 0000000..f5b5171
--- /dev/null
+++ b/src/drv/ps1/rcnt/CMakeLists.txt
@@ -0,0 +1,22 @@
+# wnix, a Unix-like operating system for WebAssembly applications.
+# Copyright (C) 2025 Xavier Del Campo Romero
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+add_library(drv_ps1_rcnt)
+add_subdirectory(src)
+target_include_directories(drv_ps1_rcnt PUBLIC include PRIVATE private_include)
+target_link_libraries(drv_ps1_rcnt
+ PUBLIC c
+ PRIVATE drv_ps1_bios drv_ps1_irq drv_ps1_event)
diff --git a/src/drv/ps1/rcnt/include/drv/ps1/rcnt.h b/src/drv/ps1/rcnt/include/drv/ps1/rcnt.h
new file mode 100644
index 0000000..831012c
--- /dev/null
+++ b/src/drv/ps1/rcnt/include/drv/ps1/rcnt.h
@@ -0,0 +1,45 @@
+/*
+ * wnix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef DRV_PS1_RCNT_H
+#define DRV_PS1_RCNT_H
+
+#include <stdint.h>
+
+union drv_ps1_rcnt_cfg
+{
+ struct
+ {
+ uint32_t sync_enable :1, sync_mode :2, reset :1, irq_tgt :1,
+ irq_max :1, repeat :1, pulse_toggle :1, clocksrc :2, intreq :1;
+ } bits;
+
+ uint32_t word;
+};
+
+enum drv_ps1_rcnt
+{
+ DRV_PS1_RCNT0,
+ DRV_PS1_RCNT1,
+ DRV_PS1_RCNT2
+};
+
+int drv_ps1_rcnt_init(enum drv_ps1_rcnt rcnt, uint16_t target,
+ const union drv_ps1_rcnt_cfg *cfg, int (*f)(void));
+
+#endif
diff --git a/src/drv/ps1/rcnt/private_include/drv/ps1/rcnt/regs.h b/src/drv/ps1/rcnt/private_include/drv/ps1/rcnt/regs.h
new file mode 100644
index 0000000..a6c9750
--- /dev/null
+++ b/src/drv/ps1/rcnt/private_include/drv/ps1/rcnt/regs.h
@@ -0,0 +1,36 @@
+/*
+ * wnix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef DRV_PS1_RCNT_REGS_H
+#define DRV_PS1_RCNT_REGS_H
+
+#include <drv/ps1/rcnt.h>
+#include <stdint.h>
+
+struct rcnt_value
+{
+ uint32_t value :16, :16;
+};
+
+#define RCNT_BASE(n) (0x1f801100 + (n << 4))
+#define RCNT_REG(n, m) (RCNT_BASE(n) + m)
+#define RCNT_VALUE(n) ((volatile struct rcnt_value *)RCNT_REG(n, 0))
+#define RCNT_MODE(n) ((volatile union drv_ps1_rcnt_cfg *)RCNT_REG(n, 4))
+#define RCNT_TARGET(n) ((volatile struct rcnt_value *)RCNT_REG(n, 8))
+
+#endif
diff --git a/src/drv/ps1/rcnt/src/CMakeLists.txt b/src/drv/ps1/rcnt/src/CMakeLists.txt
new file mode 100644
index 0000000..4e8eb88
--- /dev/null
+++ b/src/drv/ps1/rcnt/src/CMakeLists.txt
@@ -0,0 +1,19 @@
+# wnix, a Unix-like operating system for WebAssembly applications.
+# Copyright (C) 2025 Xavier Del Campo Romero
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+target_sources(drv_ps1_rcnt PRIVATE
+ init.c
+)
diff --git a/src/drv/ps1/rcnt/src/init.c b/src/drv/ps1/rcnt/src/init.c
new file mode 100644
index 0000000..0c4327c
--- /dev/null
+++ b/src/drv/ps1/rcnt/src/init.c
@@ -0,0 +1,62 @@
+/*
+ * wnix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <drv/ps1/rcnt.h>
+#include <drv/ps1/rcnt/regs.h>
+#include <drv/ps1/event.h>
+#include <drv/ps1/irq.h>
+#include <drv/ps1/bios.h>
+#include <stddef.h>
+#include <stdint.h>
+
+int drv_ps1_rcnt_init(const enum drv_ps1_rcnt rcnt, const uint16_t target,
+ const union drv_ps1_rcnt_cfg *const cfg, int (*const f)(void))
+{
+ int class;
+
+ EnterCriticalSection();
+ RCNT_TARGET(rcnt)->value = target;
+ *RCNT_MODE(rcnt) = *cfg;
+
+ switch (rcnt)
+ {
+ case DRV_PS1_RCNT0:
+ I_MASK->bits.tmr0 = 1;
+ class = CLASS_RTC0;
+ break;
+ case DRV_PS1_RCNT1:
+ I_MASK->bits.tmr1 = 1;
+ class = CLASS_RTC1;
+ break;
+ case DRV_PS1_RCNT2:
+ I_MASK->bits.tmr2 = 1;
+ class = CLASS_RTC2;
+ break;
+ }
+
+ ExitCriticalSection();
+
+ const int event = drv_ps1_event_open(class, SPEC_INTERRUPTED,
+ MODE_EXECUTE, f);
+
+ if (event == -1)
+ return -1;
+
+ drv_ps1_event_enable(event);
+ return 0;
+}