diff options
| author | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-07-07 13:22:53 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-11-11 00:08:15 +0100 |
| commit | 7861a52adf92a083bb2aed4c35f98d8035dce032 (patch) | |
| tree | 28cd3c40e4c878f730f5df3c1d93bdf91af490c3 /src/drv/ps1/rcnt | |
| parent | 7fc48e9216ff809da5f8055a50b0be17628ef1df (diff) | |
| download | wnix-7861a52adf92a083bb2aed4c35f98d8035dce032.tar.gz | |
Setup project skeleton
Diffstat (limited to 'src/drv/ps1/rcnt')
| -rw-r--r-- | src/drv/ps1/rcnt/CMakeLists.txt | 22 | ||||
| -rw-r--r-- | src/drv/ps1/rcnt/include/drv/ps1/rcnt.h | 45 | ||||
| -rw-r--r-- | src/drv/ps1/rcnt/private_include/drv/ps1/rcnt/regs.h | 36 | ||||
| -rw-r--r-- | src/drv/ps1/rcnt/src/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | src/drv/ps1/rcnt/src/init.c | 62 |
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; +} |
