diff --git a/libraries/config/common.mk b/libraries/config/common.mk
index 1ca25d4..2146502 100644
--- a/libraries/config/common.mk
+++ b/libraries/config/common.mk
@@ -108,15 +108,17 @@
DATA := data
INCLUDES := include
-GENERAL_SOURCE_DIRS=$1 $(foreach d,$(filter-out $1/arch $1/board $1/os $1/cpu $1,$(wildcard $1/*)),$(if $(wildcard $d/.),$(call DIR_WILDCARD,$d) $d,))
+GENERAL_SOURCE_DIRS=$1 $(foreach d,$(filter-out $1/arch $1/board $1/os $1/cpu $1,$(wildcard $1/*)),$(if $(wildcard $d/.),$(filter-out $d,$(call GENERAL_SOURCE_DIRS,$d)) $d,))
SPECIFIC_SOURCE_DIRS=$(if $(wildcard $1/$2/$3/.*),$1/$2/$3 $(call DIR_WILDCARD,$1/$2/$3),$(if $(wildcard $1/$2/generic/.*), $1/$2/generic $(call DIR_WILDCARD,$1/$2/generic),))
UNFILTERED_SOURCE_DIRS=$1 $(foreach d,$(wildcard $1/*),$(if $(wildcard $d/.),$(call DIR_WILDCARD,$d) $d,))
-ALL_SOURCE_DIRS=$(call GENERAL_SOURCE_DIRS,$1) \
- $(call SPECIFIC_SOURCE_DIRS,$1,arch,$(ATMOSPHERE_ARCH_DIR)) \
- $(call SPECIFIC_SOURCE_DIRS,$1,board,$(ATMOSPHERE_BOARD_DIR)) \
- $(call SPECIFIC_SOURCE_DIRS,$1,os,$(ATMOSPHERE_OS_DIR)) \
- $(call SPECIFIC_SOURCE_DIRS,$1,cpu,$(ATMOSPHERE_ARCH_DIR)/$(ATMOSPHERE_CPU_DIR))
+ALL_SOURCE_DIRS=$(foreach d,$(call GENERAL_SOURCE_DIRS,$1), \
+ $d \
+ $(call SPECIFIC_SOURCE_DIRS,$d,arch,$(ATMOSPHERE_ARCH_DIR)) \
+ $(call SPECIFIC_SOURCE_DIRS,$d,board,$(ATMOSPHERE_BOARD_DIR)) \
+ $(call SPECIFIC_SOURCE_DIRS,$d,os,$(ATMOSPHERE_OS_DIR)) \
+ $(call SPECIFIC_SOURCE_DIRS,$d,cpu,$(ATMOSPHERE_ARCH_DIR)/$(ATMOSPHERE_CPU_DIR)) \
+ )
SOURCES ?= $(call ALL_SOURCE_DIRS,source)
diff --git a/libraries/libstratosphere/include/stratosphere/gpio/driver/board/nintendo/nx/gpio_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/gpio/driver/board/nintendo/nx/gpio_driver_api.hpp
new file mode 100644
index 0000000..4245007
--- /dev/null
+++ b/libraries/libstratosphere/include/stratosphere/gpio/driver/board/nintendo/nx/gpio_driver_api.hpp
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include
+#include
+
+namespace ams::gpio::driver::board::nintendo_nx {
+
+ void Initialize(bool enable_interrupt_handlers);
+
+ void SetInitialGpioConfig();
+ void SetInitialWakePinConfig();
+
+}
diff --git a/libraries/libstratosphere/include/stratosphere/gpio/driver/board/nintendo_nx/gpio_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/gpio/driver/board/nintendo_nx/gpio_driver_api.hpp
deleted file mode 100644
index 4245007..0000000
--- a/libraries/libstratosphere/include/stratosphere/gpio/driver/board/nintendo_nx/gpio_driver_api.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-#include
-#include
-
-namespace ams::gpio::driver::board::nintendo_nx {
-
- void Initialize(bool enable_interrupt_handlers);
-
- void SetInitialGpioConfig();
- void SetInitialWakePinConfig();
-
-}
diff --git a/libraries/libstratosphere/include/stratosphere/gpio/driver/gpio_select_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/gpio/driver/gpio_select_driver_api.hpp
index 6025716..9f42097 100644
--- a/libraries/libstratosphere/include/stratosphere/gpio/driver/gpio_select_driver_api.hpp
+++ b/libraries/libstratosphere/include/stratosphere/gpio/driver/gpio_select_driver_api.hpp
@@ -22,7 +22,7 @@
#if defined(ATMOSPHERE_BOARD_NINTENDO_NX)
- #include
+ #include
namespace ams::gpio::driver::board {
diff --git a/libraries/libstratosphere/include/stratosphere/i2c/driver/board/nintendo/nx/i2c_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/i2c/driver/board/nintendo/nx/i2c_driver_api.hpp
new file mode 100644
index 0000000..67bf082
--- /dev/null
+++ b/libraries/libstratosphere/include/stratosphere/i2c/driver/board/nintendo/nx/i2c_driver_api.hpp
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include
+
+namespace ams::i2c::driver::board::nintendo_nx {
+
+ void Initialize();
+
+}
diff --git a/libraries/libstratosphere/include/stratosphere/i2c/driver/board/nintendo_nx/i2c_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/i2c/driver/board/nintendo_nx/i2c_driver_api.hpp
deleted file mode 100644
index 67bf082..0000000
--- a/libraries/libstratosphere/include/stratosphere/i2c/driver/board/nintendo_nx/i2c_driver_api.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-#include
-
-namespace ams::i2c::driver::board::nintendo_nx {
-
- void Initialize();
-
-}
diff --git a/libraries/libstratosphere/include/stratosphere/i2c/driver/i2c_select_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/i2c/driver/i2c_select_driver_api.hpp
index ce5f587..c9152ae 100644
--- a/libraries/libstratosphere/include/stratosphere/i2c/driver/i2c_select_driver_api.hpp
+++ b/libraries/libstratosphere/include/stratosphere/i2c/driver/i2c_select_driver_api.hpp
@@ -21,7 +21,7 @@
#if defined(ATMOSPHERE_BOARD_NINTENDO_NX)
- #include
+ #include
namespace ams::i2c::driver::board {
diff --git a/libraries/libstratosphere/include/stratosphere/pwm/driver/board/nintendo/nx/pwm_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/pwm/driver/board/nintendo/nx/pwm_driver_api.hpp
new file mode 100644
index 0000000..0a9b003
--- /dev/null
+++ b/libraries/libstratosphere/include/stratosphere/pwm/driver/board/nintendo/nx/pwm_driver_api.hpp
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include
+
+namespace ams::pwm::driver::board::nintendo_nx {
+
+ void Initialize();
+
+}
diff --git a/libraries/libstratosphere/include/stratosphere/pwm/driver/board/nintendo_nx/pwm_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/pwm/driver/board/nintendo_nx/pwm_driver_api.hpp
deleted file mode 100644
index 0a9b003..0000000
--- a/libraries/libstratosphere/include/stratosphere/pwm/driver/board/nintendo_nx/pwm_driver_api.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-#include
-
-namespace ams::pwm::driver::board::nintendo_nx {
-
- void Initialize();
-
-}
diff --git a/libraries/libstratosphere/include/stratosphere/pwm/driver/pwm_select_driver_api.hpp b/libraries/libstratosphere/include/stratosphere/pwm/driver/pwm_select_driver_api.hpp
index c9fbec5..4499240 100644
--- a/libraries/libstratosphere/include/stratosphere/pwm/driver/pwm_select_driver_api.hpp
+++ b/libraries/libstratosphere/include/stratosphere/pwm/driver/pwm_select_driver_api.hpp
@@ -20,7 +20,7 @@
#if defined(ATMOSPHERE_BOARD_NINTENDO_NX)
- #include
+ #include
namespace ams::pwm::driver::board {
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/gpio_driver_api.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/gpio_driver_api.cpp
new file mode 100644
index 0000000..513add6
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/gpio_driver_api.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "impl/gpio_driver_impl.hpp"
+#include "impl/gpio_initial_config.hpp"
+#include "impl/gpio_tegra_pad.hpp"
+
+namespace ams::gpio::driver::board::nintendo_nx {
+
+ namespace {
+
+ ams::gpio::driver::board::nintendo_nx::impl::DriverImpl *g_driver_impl = nullptr;
+
+ }
+
+ void Initialize(bool enable_interrupt_handlers) {
+ /* Check that we haven't previously initialized. */
+ AMS_ABORT_UNLESS(g_driver_impl == nullptr);
+
+ /* Get the device driver subsystem framework memory resource. */
+ auto *memory_resource = ddsf::GetMemoryResource();
+
+ /* Allocate a new driver. */
+ auto *driver_storage = static_cast(memory_resource->Allocate(sizeof(*g_driver_impl)));
+ AMS_ABORT_UNLESS(driver_storage != nullptr);
+
+ /* Construct the new driver. */
+ g_driver_impl = new (driver_storage) ams::gpio::driver::board::nintendo_nx::impl::DriverImpl(impl::GpioRegistersPhysicalAddress, impl::GpioRegistersSize);
+
+ /* Register the driver. */
+ gpio::driver::RegisterDriver(g_driver_impl);
+
+ /* Register interrupt handlers, if we should. */
+ if (enable_interrupt_handlers) {
+ for (size_t i = 0; i < util::size(impl::InterruptNameTable); ++i) {
+ /* Allocate a handler. */
+ impl::InterruptEventHandler *handler_storage = static_cast(memory_resource->Allocate(sizeof(impl::InterruptEventHandler)));
+ AMS_ABORT_UNLESS(handler_storage != nullptr);
+
+ /* Initialize the handler. */
+ impl::InterruptEventHandler *handler = new (handler_storage) impl::InterruptEventHandler;
+ handler->Initialize(g_driver_impl, impl::InterruptNameTable[i], static_cast(i));
+
+ /* Register the handler. */
+ gpio::driver::RegisterInterruptHandler(handler);
+ }
+ }
+
+ /* Create and register all pads. */
+ for (const auto &entry : impl::PadMapCombinationList) {
+ /* Allocate a pad for our device. */
+ impl::TegraPad *pad_storage = static_cast(memory_resource->Allocate(sizeof(impl::TegraPad)));
+ AMS_ABORT_UNLESS(pad_storage != nullptr);
+
+ /* Create a pad for our device. */
+ impl::TegraPad *pad = new (pad_storage) impl::TegraPad;
+ pad->SetParameters(entry.internal_number, impl::PadInfo{entry.wake_event});
+
+ /* Register the pad with our driver. */
+ g_driver_impl->RegisterDevice(pad);
+
+ /* Register the device code with our driver. */
+ R_ABORT_UNLESS(gpio::driver::RegisterDeviceCode(entry.device_code, pad));
+ }
+ }
+
+ void SetInitialGpioConfig() {
+ return impl::SetInitialGpioConfig();
+ }
+
+ void SetInitialWakePinConfig() {
+ return impl::SetInitialWakePinConfig();
+ }
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_driver_impl.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_driver_impl.cpp
new file mode 100644
index 0000000..aa152fb
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_driver_impl.cpp
@@ -0,0 +1,342 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "gpio_driver_impl.hpp"
+#include "gpio_register_accessor.hpp"
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ void InterruptEventHandler::Initialize(DriverImpl *drv, os::InterruptName intr, int ctlr) {
+ /* Set fields. */
+ this->driver = drv;
+ this->interrupt_name = intr;
+ this->controller_number = ctlr;
+
+ /* Initialize interrupt event. */
+ os::InitializeInterruptEvent(std::addressof(this->interrupt_event), intr, os::EventClearMode_ManualClear);
+
+ /* Initialize base. */
+ IEventHandler::Initialize(std::addressof(this->interrupt_event));
+ }
+
+ void InterruptEventHandler::HandleEvent() {
+ /* Lock the driver's interrupt mutex. */
+ std::scoped_lock lk(this->driver->interrupt_control_mutex);
+
+ /* Check each pad. */
+ bool found = false;
+ for (auto it = this->driver->interrupt_pad_list.begin(); !found && it != this->driver->interrupt_pad_list.end(); ++it) {
+ found = this->CheckAndHandleInterrupt(*it);
+ }
+
+ /* If we didn't find a pad, clear the interrupt event. */
+ if (!found) {
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ }
+ }
+
+ bool InterruptEventHandler::CheckAndHandleInterrupt(TegraPad &pad) {
+ /* Get the pad's number. */
+ const InternalGpioPadNumber pad_number = static_cast(pad.GetPadNumber());
+
+ /* Check if the pad matches our controller number. */
+ if (this->controller_number != ConvertInternalGpioPadNumberToController(pad_number)) {
+ return false;
+ }
+
+ /* Get the addresses of INT_STA, INT_ENB. */
+ const uintptr_t sta_address = GetGpioRegisterAddress(this->driver->gpio_virtual_address, GpioRegisterType_GPIO_INT_STA, pad_number);
+ const uintptr_t enb_address = GetGpioRegisterAddress(this->driver->gpio_virtual_address, GpioRegisterType_GPIO_INT_STA, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+
+ /* Check if both STA and ENB are set. */
+ if (reg::Read(sta_address, 1u << pad_index) == 0 || reg::Read(enb_address, 1u << pad_index) == 0) {
+ return false;
+ }
+
+ /* The pad is signaled. First, clear the enb bit. */
+ SetMaskedBit(enb_address, pad_index, 0);
+ reg::Read(enb_address);
+
+ /* Disable the interrupt on the pad. */
+ pad.SetInterruptEnabled(false);
+ this->driver->RemoveInterruptPad(std::addressof(pad));
+
+ /* Clear the interrupt event. */
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+
+ /* Signal the pad's bound event. */
+ pad.SignalInterruptBoundEvent();
+
+ return true;
+ }
+
+ DriverImpl::DriverImpl(dd::PhysicalAddress reg_paddr, size_t size) : gpio_physical_address(reg_paddr), gpio_virtual_address(), suspend_handler(this), interrupt_pad_list(), interrupt_control_mutex() {
+ /* Get the corresponding virtual address for our physical address. */
+ this->gpio_virtual_address = dd::QueryIoMapping(reg_paddr, size);
+ AMS_ABORT_UNLESS(this->gpio_virtual_address != 0);
+ }
+
+ void DriverImpl::InitializeDriver() {
+ /* Initialize our suspend handler. */
+ this->suspend_handler.Initialize(this->gpio_virtual_address);
+ }
+
+ void DriverImpl::FinalizeDriver() {
+ /* ... */
+ }
+
+ Result DriverImpl::InitializePad(Pad *pad) {
+ /* Validate arguments. */
+ AMS_ASSERT(pad != nullptr);
+
+ /* Convert the pad to an internal number. */
+ const InternalGpioPadNumber pad_number = pad->GetPadNumber();
+
+ /* Configure the pad as GPIO by modifying the appropriate bit in CNF. */
+ const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_CNF, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+ SetMaskedBit(pad_address, pad_index, 1);
+
+ /* Read the pad address to make sure our configuration takes. */
+ reg::Read(pad_address);
+
+ return ResultSuccess();
+ }
+
+ void DriverImpl::FinalizePad(Pad *pad) {
+ /* Validate arguments. */
+ AMS_ASSERT(pad != nullptr);
+
+ /* Nothing to do. */
+ AMS_UNUSED(pad);
+ }
+
+ Result DriverImpl::GetDirection(Direction *out, Pad *pad) const {
+ /* Validate arguments. */
+ AMS_ASSERT(out != nullptr);
+ AMS_ASSERT(pad != nullptr);
+
+ /* Convert the pad to an internal number. */
+ const InternalGpioPadNumber pad_number = pad->GetPadNumber();
+
+ /* Get the pad direction by reading the appropriate bit in OE */
+ const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_OE, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+
+ if (reg::Read(pad_address, 1u << pad_index) != 0) {
+ *out = Direction_Output;
+ } else {
+ *out = Direction_Input;
+ }
+
+ return ResultSuccess();
+
+ }
+
+ Result DriverImpl::SetDirection(Pad *pad, Direction direction) {
+ /* Validate arguments. */
+ AMS_ASSERT(pad != nullptr);
+
+ /* Convert the pad to an internal number. */
+ const InternalGpioPadNumber pad_number = pad->GetPadNumber();
+
+ /* Configure the pad direction by modifying the appropriate bit in OE */
+ const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_OE, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+ SetMaskedBit(pad_address, pad_index, direction);
+
+ /* Read the pad address to make sure our configuration takes. */
+ reg::Read(pad_address);
+
+ return ResultSuccess();
+ }
+
+ Result DriverImpl::GetValue(GpioValue *out, Pad *pad) const {
+ /* Validate arguments. */
+ AMS_ASSERT(out != nullptr);
+ AMS_ASSERT(pad != nullptr);
+
+ /* Convert the pad to an internal number. */
+ const InternalGpioPadNumber pad_number = pad->GetPadNumber();
+
+ /* Get the pad value by reading the appropriate bit in IN */
+ const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_IN, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+
+ if (reg::Read(pad_address, 1u << pad_index) != 0) {
+ *out = GpioValue_High;
+ } else {
+ *out = GpioValue_Low;
+ }
+
+ return ResultSuccess();
+ }
+
+ Result DriverImpl::SetValue(Pad *pad, GpioValue value) {
+ /* Validate arguments. */
+ AMS_ASSERT(pad != nullptr);
+
+ /* Convert the pad to an internal number. */
+ const InternalGpioPadNumber pad_number = pad->GetPadNumber();
+
+ /* Configure the pad value by modifying the appropriate bit in IN */
+ const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_IN, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+ SetMaskedBit(pad_address, pad_index, value);
+
+ /* Read the pad address to make sure our configuration takes. */
+ reg::Read(pad_address);
+
+ return ResultSuccess();
+ }
+
+ Result DriverImpl::GetInterruptMode(InterruptMode *out, Pad *pad) const {
+ /* Validate arguments. */
+ AMS_ASSERT(out != nullptr);
+ AMS_ASSERT(pad != nullptr);
+
+ /* Convert the pad to an internal number. */
+ const InternalGpioPadNumber pad_number = pad->GetPadNumber();
+
+ /* Get the pad mode by reading the appropriate bits in INT_LVL */
+ const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_INT_LVL, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+
+ switch ((reg::Read(pad_address) >> pad_index) & InternalInterruptMode_Mask) {
+ case InternalInterruptMode_LowLevel: *out = InterruptMode_LowLevel; break;
+ case InternalInterruptMode_HighLevel: *out = InterruptMode_HighLevel; break;
+ case InternalInterruptMode_RisingEdge: *out = InterruptMode_RisingEdge; break;
+ case InternalInterruptMode_FallingEdge: *out = InterruptMode_FallingEdge; break;
+ case InternalInterruptMode_AnyEdge: *out = InterruptMode_AnyEdge; break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ return ResultSuccess();
+ }
+
+ Result DriverImpl::SetInterruptMode(Pad *pad, InterruptMode mode) {
+ /* Validate arguments. */
+ AMS_ASSERT(pad != nullptr);
+
+ /* Convert the pad to an internal number. */
+ const InternalGpioPadNumber pad_number = pad->GetPadNumber();
+
+ /* Configure the pad mode by modifying the appropriate bits in INT_LVL */
+ const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_INT_LVL, pad_number);
+ const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
+
+ switch (mode) {
+ case InterruptMode_LowLevel: reg::ReadWrite(pad_address, InternalInterruptMode_LowLevel << pad_index, InternalInterruptMode_Mask << pad_index); break;
+ case InterruptMode_HighLevel: reg::ReadWrite(pad_address, InternalInterruptMode_HighLevel << pad_index, InternalInterruptMode_Mask << pad_index); break;
+ case InterruptMode_RisingEdge: reg::ReadWrite(pad_address, InternalInterruptMode_RisingEdge << pad_index, InternalInterruptMode_Mask << pad_index); break;
+ case InterruptMode_FallingEdge: reg::ReadWrite(pad_address, InternalInterruptMode_FallingEdge << pad_index, InternalInterruptMode_Mask << pad_index); break;
+ case InterruptMode_AnyEdge: reg::ReadWrite(pad_address, InternalInterruptMode_AnyEdge << pad_index, InternalInterruptMode_Mask << pad_index); break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ /* Read the pad address to make sure our configuration takes. */
+ reg::Read(pad_address);
+
+ return ResultSuccess();
+ }
+
+ Result DriverImpl::SetInterruptEnabled(Pad *pad, bool en) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::GetInterruptStatus(InterruptStatus *out, Pad *pad) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::ClearInterruptStatus(Pad *pad) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::GetDebounceEnabled(bool *out, Pad *pad) const {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::SetDebounceEnabled(Pad *pad, bool en) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::GetDebounceTime(s32 *out_ms, Pad *pad) const {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::SetDebounceTime(Pad *pad, s32 ms) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::GetUnknown22(u32 *out) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ void DriverImpl::Unknown23() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::SetValueForSleepState(Pad *pad, GpioValue value) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::IsWakeEventActive(bool *out, Pad *pad) const {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::SetWakeEventActiveFlagSetForDebug(Pad *pad, bool en) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::SetWakePinDebugMode(WakePinDebugMode mode) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::Suspend() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::SuspendLow() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::Resume() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result DriverImpl::ResumeLow() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_driver_impl.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_driver_impl.hpp
new file mode 100644
index 0000000..b78f341
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_driver_impl.hpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+#include "gpio_tegra_pad.hpp"
+#include "gpio_register_accessor.hpp"
+#include "gpio_suspend_handler.hpp"
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ class DriverImpl;
+
+ class InterruptEventHandler : public ddsf::IEventHandler {
+ private:
+ DriverImpl *driver;
+ os::InterruptName interrupt_name;
+ os::InterruptEventType interrupt_event;
+ int controller_number;
+ private:
+ bool CheckAndHandleInterrupt(TegraPad &pad);
+ public:
+ InterruptEventHandler() : IEventHandler(), driver(nullptr), interrupt_name(), interrupt_event(), controller_number() { /* ... */ }
+
+ void Initialize(DriverImpl *drv, os::InterruptName intr, int ctlr);
+
+ virtual void HandleEvent() override;
+ };
+
+ class DriverImpl : public ::ams::gpio::driver::IGpioDriver {
+ NON_COPYABLE(DriverImpl);
+ NON_MOVEABLE(DriverImpl);
+ AMS_DDSF_CASTABLE_TRAITS(ams::gpio::driver::board::nintendo_nx::impl::DriverImpl, ::ams::gpio::driver::IGpioDriver);
+ friend class InterruptEventHandler;
+ private:
+ dd::PhysicalAddress gpio_physical_address;
+ uintptr_t gpio_virtual_address;
+ SuspendHandler suspend_handler;
+ TegraPad::InterruptList interrupt_pad_list;
+ mutable os::SdkMutex interrupt_control_mutex;
+ public:
+ DriverImpl(dd::PhysicalAddress reg_paddr, size_t size);
+
+ virtual void InitializeDriver() override;
+ virtual void FinalizeDriver() override;
+
+ virtual Result InitializePad(Pad *pad) override;
+ virtual void FinalizePad(Pad *pad) override;
+
+ virtual Result GetDirection(Direction *out, Pad *pad) const override;
+ virtual Result SetDirection(Pad *pad, Direction direction) override;
+
+ virtual Result GetValue(GpioValue *out, Pad *pad) const override;
+ virtual Result SetValue(Pad *pad, GpioValue value) override;
+
+ virtual Result GetInterruptMode(InterruptMode *out, Pad *pad) const override;
+ virtual Result SetInterruptMode(Pad *pad, InterruptMode mode) override;
+
+ virtual Result SetInterruptEnabled(Pad *pad, bool en) override;
+
+ virtual Result GetInterruptStatus(InterruptStatus *out, Pad *pad) override;
+ virtual Result ClearInterruptStatus(Pad *pad) override;
+
+ virtual os::SdkMutex &GetInterruptControlMutex(const Pad &pad) const override {
+ AMS_UNUSED(pad);
+ return this->interrupt_control_mutex;
+ }
+
+ virtual Result GetDebounceEnabled(bool *out, Pad *pad) const override;
+ virtual Result SetDebounceEnabled(Pad *pad, bool en) override;
+
+ virtual Result GetDebounceTime(s32 *out_ms, Pad *pad) const override;
+ virtual Result SetDebounceTime(Pad *pad, s32 ms) override;
+
+ virtual Result GetUnknown22(u32 *out) override;
+ virtual void Unknown23() override;
+
+ virtual Result SetValueForSleepState(Pad *pad, GpioValue value) override;
+ virtual Result IsWakeEventActive(bool *out, Pad *pad) const override;
+ virtual Result SetWakeEventActiveFlagSetForDebug(Pad *pad, bool en) override;
+ virtual Result SetWakePinDebugMode(WakePinDebugMode mode) override;
+
+ virtual Result Suspend() override;
+ virtual Result SuspendLow() override;
+ virtual Result Resume() override;
+ virtual Result ResumeLow() override;
+ private:
+ static constexpr ALWAYS_INLINE TegraPad &GetTegraPad(Pad *pad) {
+ AMS_ASSERT(pad != nullptr);
+ return static_cast(*pad);
+ }
+
+ static ALWAYS_INLINE const PadInfo &GetInfo(Pad *pad) {
+ return GetTegraPad(pad).GetInfo();
+ }
+
+ static ALWAYS_INLINE PadStatus &GetStatus(Pad *pad) {
+ return GetTegraPad(pad).GetStatus();
+ }
+
+ void AddInterruptPad(TegraPad *pad) {
+ AMS_ASSERT(pad != nullptr);
+ if (!pad->IsLinkedToInterruptBoundPadList()) {
+ this->interrupt_pad_list.push_back(*pad);
+ }
+ }
+
+ void RemoveInterruptPad(TegraPad *pad) {
+ AMS_ASSERT(pad != nullptr);
+ if (pad->IsLinkedToInterruptBoundPadList()) {
+ this->interrupt_pad_list.erase(this->interrupt_pad_list.iterator_to(*pad));
+ }
+ }
+ };
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config.cpp
new file mode 100644
index 0000000..b6b1022
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "gpio_driver_impl.hpp"
+#include "gpio_initial_config.hpp"
+#include "gpio_wake_pin_config.hpp"
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ namespace {
+
+ spl::HardwareType GetHardwareType() {
+ /* Acquire access to spl: */
+ sm::ScopedServiceHolder spl_holder;
+ AMS_ABORT_UNLESS(static_cast(spl_holder));
+
+ /* Get config. */
+ return ::ams::spl::GetHardwareType();
+ }
+
+ #include "gpio_initial_wake_pin_config_icosa.inc"
+ /* #include "gpio_initial_wake_pin_config_copper.inc" */
+ #include "gpio_initial_wake_pin_config_hoag.inc"
+ #include "gpio_initial_wake_pin_config_iowa.inc"
+ #include "gpio_initial_wake_pin_config_calcio.inc"
+ #include "gpio_initial_wake_pin_config_aula.inc"
+
+ #include "gpio_initial_config_icosa.inc"
+ /* #include "gpio_initial_config_copper.inc" */
+ #include "gpio_initial_config_hoag.inc"
+ #include "gpio_initial_config_iowa.inc"
+ #include "gpio_initial_config_calcio.inc"
+ #include "gpio_initial_config_aula.inc"
+
+ }
+
+ void SetInitialGpioConfig() {
+ /* Set wake event levels, wake event enables. */
+ const GpioInitialConfig *configs = nullptr;
+ size_t num_configs = 0;
+
+ /* Select the correct config. */
+ switch (GetHardwareType()) {
+ case spl::HardwareType::Icosa:
+ configs = InitialGpioConfigsIcosa;
+ num_configs = NumInitialGpioConfigsIcosa;
+ break;
+ case spl::HardwareType::Hoag:
+ configs = InitialGpioConfigsHoag;
+ num_configs = NumInitialGpioConfigsHoag;
+ break;
+ case spl::HardwareType::Iowa:
+ configs = InitialGpioConfigsIowa;
+ num_configs = NumInitialGpioConfigsIowa;
+ break;
+ case spl::HardwareType::Calcio:
+ configs = InitialGpioConfigsCalcio;
+ num_configs = NumInitialGpioConfigsCalcio;
+ break;
+ case spl::HardwareType::Aula:
+ configs = InitialGpioConfigsAula;
+ num_configs = NumInitialGpioConfigsAula;
+ break;
+ case spl::HardwareType::Copper:
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ /* Check we can use our config. */
+ AMS_ABORT_UNLESS(configs != nullptr);
+
+ /* Apply the configs. */
+ {
+ /* Create a driver to use for the duration of our application. */
+ DriverImpl driver(GpioRegistersPhysicalAddress, GpioRegistersSize);
+ driver.InitializeDriver();
+
+ for (size_t i = 0; i < num_configs; ++i) {
+ /* Find the internal pad number for our device. */
+ bool found = false;
+ for (const auto &entry : PadMapCombinationList) {
+ if (entry.device_code == configs[i].device_code) {
+ /* We found an entry. */
+ found = true;
+
+ /* Create a pad for our device. */
+ TegraPad pad;
+ pad.SetParameters(entry.internal_number, PadInfo{entry.wake_event});
+
+ /* Initialize the pad. */
+ R_ABORT_UNLESS(driver.InitializePad(std::addressof(pad)));
+
+ /* Set the direction. */
+ R_ABORT_UNLESS(driver.SetDirection(std::addressof(pad), configs[i].direction));
+
+ /* If the direction is output, set the value. */
+ if (configs[i].direction == Direction_Output) {
+ R_ABORT_UNLESS(driver.SetValue(std::addressof(pad), configs[i].value));
+ }
+
+ /* Finalize the pad we made. */
+ driver.FinalizePad(std::addressof(pad));
+ break;
+ }
+ }
+
+ /* Ensure that we applied the config for the pad we wanted. */
+ AMS_ABORT_UNLESS(found);
+ }
+
+ /* Finalize the driver. */
+ driver.FinalizeDriver();
+ }
+ }
+
+ void SetInitialWakePinConfig() {
+ /* Ensure the wec driver is initialized. */
+ ams::wec::Initialize();
+
+ /* Set wake event levels, wake event enables. */
+ const WakePinConfig *configs = nullptr;
+ size_t num_configs = 0;
+
+ /* Select the correct config. */
+ switch (GetHardwareType()) {
+ case spl::HardwareType::Icosa:
+ configs = InitialWakePinConfigsIcosa;
+ num_configs = NumInitialWakePinConfigsIcosa;
+ break;
+ case spl::HardwareType::Hoag:
+ configs = InitialWakePinConfigsHoag;
+ num_configs = NumInitialWakePinConfigsHoag;
+ break;
+ case spl::HardwareType::Iowa:
+ configs = InitialWakePinConfigsIowa;
+ num_configs = NumInitialWakePinConfigsIowa;
+ break;
+ case spl::HardwareType::Calcio:
+ configs = InitialWakePinConfigsCalcio;
+ num_configs = NumInitialWakePinConfigsCalcio;
+ break;
+ case spl::HardwareType::Aula:
+ configs = InitialWakePinConfigsAula;
+ num_configs = NumInitialWakePinConfigsAula;
+ break;
+ case spl::HardwareType::Copper:
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ /* Check we can use our config. */
+ AMS_ABORT_UNLESS(configs != nullptr);
+
+ /* Apply the config. */
+ for (size_t i = 0; i < num_configs; ++i) {
+ wec::SetWakeEventLevel(configs[i].wake_event, configs[i].level);
+ wec::SetWakeEventEnabled(configs[i].wake_event, configs[i].enable);
+ }
+ }
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config.hpp
new file mode 100644
index 0000000..d577ccc
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config.hpp
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ struct GpioInitialConfig {
+ DeviceCode device_code;
+ gpio::Direction direction;
+ gpio::GpioValue value;
+ };
+
+ void SetInitialGpioConfig();
+ void SetInitialWakePinConfig();
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_aula.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_aula.inc
new file mode 100644
index 0000000..e1c90ee
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_aula.inc
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
+
+constexpr inline const GpioInitialConfig InitialGpioConfigsAula[] = {
+ { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
+ { DeviceCode_Debug0, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug1, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug2, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug3, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
+ { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
+ { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
+ { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
+ { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
+ { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_Vdd5V3En, Direction_Output, GpioValue_Low },
+ { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
+ { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
+ { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
+ { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
+ { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_RecoveryKey, Direction_Input, GpioValue_Low },
+ { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
+ { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_Low },
+ { DeviceCode_SdCd, Direction_Input, GpioValue_High },
+ { DeviceCode_SdWp, Direction_Input, GpioValue_High },
+ { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
+ { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtconDetU, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
+ { DeviceCode_ExtconChgU, Direction_Output, GpioValue_Low },
+ { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
+ { DeviceCode_ExtconDetS, Direction_Input, GpioValue_Low },
+ { DeviceCode_GpioPortH0, Direction_Input, GpioValue_Low },
+ { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
+ { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
+ { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtconChgS, Direction_Output, GpioValue_Low },
+};
+
+constexpr inline size_t NumInitialGpioConfigsAula = util::size(InitialGpioConfigsAula);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_calcio.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_calcio.inc
new file mode 100644
index 0000000..e20acc0
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_calcio.inc
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
+
+constexpr inline const GpioInitialConfig InitialGpioConfigsCalcio[] = {
+ { DeviceCode_Debug0, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug1, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug2, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug3, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_GpioPortF1, Direction_Output, GpioValue_Low },
+ { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
+ { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
+ { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
+ { DeviceCode_RecoveryKey, Direction_Input, GpioValue_High },
+ { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
+ { DeviceCode_SdCd, Direction_Input, GpioValue_High },
+ { DeviceCode_SdWp, Direction_Input, GpioValue_High },
+ { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
+ { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
+ { DeviceCode_Hdmi5VEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_UsbSwitchB1Oc, Direction_Input, GpioValue_High },
+ { DeviceCode_HdmiPdTrEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
+ { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
+ { DeviceCode_UsbSwitchB1En, Direction_Output, GpioValue_Low },
+ { DeviceCode_HdmiHpd, Direction_Input, GpioValue_Low },
+};
+
+constexpr inline size_t NumInitialGpioConfigsCalcio = util::size(InitialGpioConfigsCalcio);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_hoag.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_hoag.inc
new file mode 100644
index 0000000..97a45b2
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_hoag.inc
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
+
+constexpr inline const GpioInitialConfig InitialGpioConfigsHoag[] = {
+ { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
+ { DeviceCode_Debug0, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug1, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug2, Direction_Output, GpioValue_Low },
+ { DeviceCode_Debug3, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
+ { DeviceCode_McuIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
+ { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
+ { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
+ { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
+ { DeviceCode_McuBoot, Direction_Output, GpioValue_Low },
+ { DeviceCode_McuRst, Direction_Output, GpioValue_Low },
+ { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_Vdd5V3En, Direction_Output, GpioValue_Low },
+ { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
+ { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
+ { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
+ { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
+ { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_RecoveryKey, Direction_Input, GpioValue_High },
+ { DeviceCode_PowLcdBlEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_LcdGpio1, Direction_Input, GpioValue_High },
+ { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
+ { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_Low },
+ { DeviceCode_SdCd, Direction_Input, GpioValue_High },
+ { DeviceCode_SdWp, Direction_Input, GpioValue_High },
+ { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
+ { DeviceCode_NfcEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_NfcIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
+ { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
+ { DeviceCode_NfcRst, Direction_Output, GpioValue_Low },
+ { DeviceCode_GpioPortC7, Direction_Input, GpioValue_Low },
+ { DeviceCode_GpioPortD0, Direction_Input, GpioValue_Low },
+ { DeviceCode_GpioPortC5, Direction_Input, GpioValue_Low },
+ { DeviceCode_GpioPortC6, Direction_Input, GpioValue_Low },
+ { DeviceCode_GpioPortY7, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
+ { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
+ { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowLcdVddPEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowLcdVddNEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_McuPor, Direction_Output, GpioValue_Low },
+};
+
+constexpr inline size_t NumInitialGpioConfigsHoag = util::size(InitialGpioConfigsHoag);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_icosa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_icosa.inc
new file mode 100644
index 0000000..85800f5
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_icosa.inc
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
+
+constexpr inline const GpioInitialConfig InitialGpioConfigsIcosa[] = {
+ { DeviceCode_RamCode3, Direction_Input, GpioValue_High },
+ { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
+ { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowGc, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
+ { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
+ { DeviceCode_DebugControllerDet, Direction_Input, GpioValue_Low },
+ { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
+ { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
+ { DeviceCode_FanTach, Direction_Input, GpioValue_High },
+ { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_SdevCoaxSel1, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType0, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType1, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType2, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType3, Direction_Input, GpioValue_Low },
+ { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
+ { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
+ { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
+ { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_RecoveryKey, Direction_Input, GpioValue_Low },
+ { DeviceCode_PowLcdBlEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
+ { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_High },
+ { DeviceCode_SdCd, Direction_Input, GpioValue_High },
+ { DeviceCode_SdevCoaxSel0, Direction_Input, GpioValue_Low },
+ { DeviceCode_SdWp, Direction_Input, GpioValue_High },
+ { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
+ { DeviceCode_OtgFet1ForSdev, Direction_Output, GpioValue_Low },
+ { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtconDetU, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
+ { DeviceCode_ExtconChgU, Direction_Output, GpioValue_Low },
+ { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
+ { DeviceCode_Max77621GpuInt, Direction_Input, GpioValue_High },
+ { DeviceCode_OtgFet2ForSdev, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtconDetS, Direction_Input, GpioValue_Low },
+ { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
+ { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
+ { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowLcdVddPEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowLcdVddNEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_RamCode2, Direction_Input, GpioValue_High },
+ { DeviceCode_ExtconChgS, Direction_Output, GpioValue_Low },
+ { DeviceCode_Vdd50BEn, Direction_Output, GpioValue_Low },
+};
+
+constexpr inline size_t NumInitialGpioConfigsIcosa = util::size(InitialGpioConfigsIcosa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_iowa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_iowa.inc
new file mode 100644
index 0000000..1b71bd7
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_config_iowa.inc
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
+
+constexpr inline const GpioInitialConfig InitialGpioConfigsIowa[] = {
+ { DeviceCode_RamCode3, Direction_Input, GpioValue_High },
+ { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
+ { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
+ { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
+ { DeviceCode_DebugControllerDet, Direction_Input, GpioValue_Low },
+ { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
+ { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
+ { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
+ { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_SdevCoaxSel1, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType0, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType1, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType2, Direction_Input, GpioValue_Low },
+ { DeviceCode_ProdType3, Direction_Input, GpioValue_Low },
+ { DeviceCode_Vdd5V3En, Direction_Output, GpioValue_Low },
+ { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
+ { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
+ { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
+ { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
+ { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
+ { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_Low },
+ { DeviceCode_RecoveryKey, Direction_Input, GpioValue_Low },
+ { DeviceCode_PowLcdBlEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
+ { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_Low },
+ { DeviceCode_SdCd, Direction_Input, GpioValue_High },
+ { DeviceCode_SdevCoaxSel0, Direction_Input, GpioValue_Low },
+ { DeviceCode_SdWp, Direction_Input, GpioValue_High },
+ { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
+ { DeviceCode_OtgFet1ForSdev, Direction_Output, GpioValue_Low },
+ { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtconDetU, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
+ { DeviceCode_ExtconChgU, Direction_Output, GpioValue_Low },
+ { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
+ { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
+ { DeviceCode_OtgFet2ForSdev, Direction_Output, GpioValue_Low },
+ { DeviceCode_ExtconDetS, Direction_Input, GpioValue_Low },
+ { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
+ { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
+ { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
+ { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
+ { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
+ { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowLcdVddPEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_PowLcdVddNEn, Direction_Output, GpioValue_Low },
+ { DeviceCode_RamCode2, Direction_Input, GpioValue_High },
+ { DeviceCode_ExtconChgS, Direction_Output, GpioValue_Low },
+ { DeviceCode_Vdd50BEn, Direction_Output, GpioValue_Low },
+};
+
+constexpr inline size_t NumInitialGpioConfigsIowa = util::size(InitialGpioConfigsIowa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_aula.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_aula.inc
new file mode 100644
index 0000000..d955382
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_aula.inc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
+
+constexpr inline const WakePinConfig InitialWakePinConfigsAula[] = {
+ { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart2Cts, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
+ /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
+ { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_RtcIrq, }, */
+ { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_AlsProxInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_Utmip0, }, */
+ /* { ams::wec::WakeEvent_Utmip1, }, */
+ /* { ams::wec::WakeEvent_Utmip2, }, */
+ /* { ams::wec::WakeEvent_Utmip3, }, */
+ /* { ams::wec::WakeEvent_Uhsic, }, */
+ /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
+ { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
+};
+
+constexpr inline size_t NumInitialWakePinConfigsAula = util::size(InitialWakePinConfigsAula);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_calcio.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_calcio.inc
new file mode 100644
index 0000000..6cdd662
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_calcio.inc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
+
+constexpr inline const WakePinConfig InitialWakePinConfigsCalcio[] = {
+ { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ExtconDetS, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart2Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart3Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
+ /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
+ { ams::wec::WakeEvent_ExtconDetU, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_RtcIrq, }, */
+ { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonSlideSw, false, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_AlsProxInt, }, */
+ { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Bq24190Irq, false, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_Utmip0, }, */
+ /* { ams::wec::WakeEvent_Utmip1, }, */
+ /* { ams::wec::WakeEvent_Utmip2, }, */
+ /* { ams::wec::WakeEvent_Utmip3, }, */
+ /* { ams::wec::WakeEvent_Uhsic, }, */
+ /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
+ { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
+};
+
+constexpr inline size_t NumInitialWakePinConfigsCalcio = util::size(InitialWakePinConfigsCalcio);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_hoag.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_hoag.inc
new file mode 100644
index 0000000..177fcc5
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_hoag.inc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
+
+constexpr inline const WakePinConfig InitialWakePinConfigsHoag[] = {
+ { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_McuIrq, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart2Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
+ /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
+ { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_RtcIrq, }, */
+ { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_AlsProxInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_Utmip0, }, */
+ /* { ams::wec::WakeEvent_Utmip1, }, */
+ /* { ams::wec::WakeEvent_Utmip2, }, */
+ /* { ams::wec::WakeEvent_Utmip3, }, */
+ /* { ams::wec::WakeEvent_Uhsic, }, */
+ /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
+ { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdGpio1, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
+};
+
+constexpr inline size_t NumInitialWakePinConfigsHoag = util::size(InitialWakePinConfigsHoag);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_icosa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_icosa.inc
new file mode 100644
index 0000000..19c40e6
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_icosa.inc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
+
+constexpr inline const WakePinConfig InitialWakePinConfigsIcosa[] = {
+ { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart2Cts, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
+ /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
+ { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_RtcIrq, }, */
+ { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_AlsProxInt, }, */
+ { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_Utmip0, }, */
+ /* { ams::wec::WakeEvent_Utmip1, }, */
+ /* { ams::wec::WakeEvent_Utmip2, }, */
+ /* { ams::wec::WakeEvent_Utmip3, }, */
+ /* { ams::wec::WakeEvent_Uhsic, }, */
+ /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
+ { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
+};
+
+constexpr inline size_t NumInitialWakePinConfigsIcosa = util::size(InitialWakePinConfigsIcosa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_iowa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_iowa.inc
new file mode 100644
index 0000000..ebd8016
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_initial_wake_pin_config_iowa.inc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
+
+constexpr inline const WakePinConfig InitialWakePinConfigsIowa[] = {
+ { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart2Cts, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
+ /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
+ { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_RtcIrq, }, */
+ { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_AlsProxInt, }, */
+ { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
+ /* { ams::wec::WakeEvent_Utmip0, }, */
+ /* { ams::wec::WakeEvent_Utmip1, }, */
+ /* { ams::wec::WakeEvent_Utmip2, }, */
+ /* { ams::wec::WakeEvent_Utmip3, }, */
+ /* { ams::wec::WakeEvent_Uhsic, }, */
+ /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
+ { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
+ { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
+ { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
+};
+
+constexpr inline size_t NumInitialWakePinConfigsIowa = util::size(InitialWakePinConfigsIowa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_internal_pad_map_combination.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_internal_pad_map_combination.inc
new file mode 100644
index 0000000..a9ff372
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_internal_pad_map_combination.inc
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
+
+constexpr inline const PadMapCombination PadMapCombinationList[] = {
+ { DeviceCode_CodecLdoEnTemp, InternalGpioPadNumber_Port_Z_4, ams::wec::WakeEvent_None },
+ { DeviceCode_PowSdEn, InternalGpioPadNumber_Port_E_4, ams::wec::WakeEvent_None },
+ { DeviceCode_BtRst, InternalGpioPadNumber_Port_H_4, ams::wec::WakeEvent_None },
+ { DeviceCode_RamCode3, InternalGpioPadNumber_Port_BB_2, ams::wec::WakeEvent_None },
+ { DeviceCode_GameCardReset, InternalGpioPadNumber_Port_BB_3, ams::wec::WakeEvent_None },
+ { DeviceCode_CodecAlert, InternalGpioPadNumber_Port_BB_4, ams::wec::WakeEvent_None },
+ { DeviceCode_PowGc, InternalGpioPadNumber_Port_E_5, ams::wec::WakeEvent_None },
+ { DeviceCode_DebugControllerDet, InternalGpioPadNumber_Port_S_0, ams::wec::WakeEvent_None },
+ { DeviceCode_BattChgStatus, InternalGpioPadNumber_Port_S_1, ams::wec::WakeEvent_None },
+ { DeviceCode_BattChgEnableN, InternalGpioPadNumber_Port_S_6, ams::wec::WakeEvent_None },
+ { DeviceCode_FanTach, InternalGpioPadNumber_Port_S_7, ams::wec::WakeEvent_None },
+ { DeviceCode_Vdd50AEn, InternalGpioPadNumber_Port_A_5, ams::wec::WakeEvent_None },
+ { DeviceCode_SdevCoaxSel1, InternalGpioPadNumber_Port_P_0, ams::wec::WakeEvent_None },
+ { DeviceCode_ProdType0, InternalGpioPadNumber_Port_P_5, ams::wec::WakeEvent_None },
+ { DeviceCode_ProdType1, InternalGpioPadNumber_Port_P_4, ams::wec::WakeEvent_None },
+ { DeviceCode_ProdType2, InternalGpioPadNumber_Port_P_3, ams::wec::WakeEvent_None },
+ { DeviceCode_ProdType3, InternalGpioPadNumber_Port_P_2, ams::wec::WakeEvent_None },
+ { DeviceCode_TempAlert, InternalGpioPadNumber_Port_X_4, ams::wec::WakeEvent_None },
+ { DeviceCode_CodecHpDetIrq, InternalGpioPadNumber_Port_V_6, ams::wec::WakeEvent_None },
+ { DeviceCode_MotionInt, InternalGpioPadNumber_Port_X_2, ams::wec::WakeEvent_None },
+ { DeviceCode_TpIrq, InternalGpioPadNumber_Port_X_1, ams::wec::WakeEvent_None },
+ { DeviceCode_ButtonSleep2, InternalGpioPadNumber_Port_X_5, ams::wec::WakeEvent_None },
+ { DeviceCode_ButtonVolUp, InternalGpioPadNumber_Port_X_6, ams::wec::WakeEvent_None },
+ { DeviceCode_ButtonVolDn, InternalGpioPadNumber_Port_X_7, ams::wec::WakeEvent_None },
+ { DeviceCode_RecoveryKey, InternalGpioPadNumber_Port_Y_1, ams::wec::WakeEvent_None },
+ { DeviceCode_PowLcdBlEn, InternalGpioPadNumber_Port_V_1, ams::wec::WakeEvent_None },
+ { DeviceCode_LcdReset, InternalGpioPadNumber_Port_V_2, ams::wec::WakeEvent_None },
+ { DeviceCode_PdVconnEn, InternalGpioPadNumber_Port_K_5, ams::wec::WakeEvent_None },
+ { DeviceCode_PdRstN, InternalGpioPadNumber_Port_V_5, ams::wec::WakeEvent_None },
+ { DeviceCode_SdevCoaxSel0, InternalGpioPadNumber_Port_Z_2, ams::wec::WakeEvent_None },
+ { DeviceCode_SdWp, InternalGpioPadNumber_Port_Z_3, ams::wec::WakeEvent_None },
+ { DeviceCode_TpReset, InternalGpioPadNumber_Port_J_7, ams::wec::WakeEvent_None },
+ { DeviceCode_BtGpio2, InternalGpioPadNumber_Port_K_0, ams::wec::WakeEvent_None },
+ { DeviceCode_BtGpio3, InternalGpioPadNumber_Port_K_1, ams::wec::WakeEvent_None },
+ { DeviceCode_BtGpio4, InternalGpioPadNumber_Port_K_2, ams::wec::WakeEvent_None },
+ { DeviceCode_PowVcpuInt, InternalGpioPadNumber_Port_K_6, ams::wec::WakeEvent_None },
+ { DeviceCode_Max77621GpuInt, InternalGpioPadNumber_Port_K_7, ams::wec::WakeEvent_None },
+ { DeviceCode_ExtconChgU, InternalGpioPadNumber_Port_K_3, ams::wec::WakeEvent_None },
+ { DeviceCode_ExtconChgS, InternalGpioPadNumber_Port_CC_3, ams::wec::WakeEvent_None },
+ { DeviceCode_WifiRfDisable, InternalGpioPadNumber_Port_H_0, ams::wec::WakeEvent_None },
+ { DeviceCode_WifiReset, InternalGpioPadNumber_Port_H_1, ams::wec::WakeEvent_None },
+ { DeviceCode_ApWakeBt, InternalGpioPadNumber_Port_H_3, ams::wec::WakeEvent_None },
+ { DeviceCode_BtGpio5, InternalGpioPadNumber_Port_H_7, ams::wec::WakeEvent_None },
+ { DeviceCode_PowLcdVddPEn, InternalGpioPadNumber_Port_I_0, ams::wec::WakeEvent_None },
+ { DeviceCode_PowLcdVddNEn, InternalGpioPadNumber_Port_I_1, ams::wec::WakeEvent_None },
+ { DeviceCode_RamCode2, InternalGpioPadNumber_Port_CC_2, ams::wec::WakeEvent_None },
+ { DeviceCode_Vdd50BEn, InternalGpioPadNumber_Port_CC_4, ams::wec::WakeEvent_None },
+ { DeviceCode_OtgFet1ForSdev, InternalGpioPadNumber_Port_J_5, ams::wec::WakeEvent_None },
+ { DeviceCode_OtgFet2ForSdev, InternalGpioPadNumber_Port_L_0, ams::wec::WakeEvent_None },
+ { DeviceCode_ExtConWakeU, InternalGpioPadNumber_Port_H_6, ams::wec::WakeEvent_None },
+ { DeviceCode_ExtConWakeS, InternalGpioPadNumber_Port_E_6, ams::wec::WakeEvent_None },
+ { DeviceCode_ExtUart2Rts, InternalGpioPadNumber_Port_G_2, ams::wec::WakeEvent_None },
+ { DeviceCode_ExtUart3Rts, InternalGpioPadNumber_Port_D_3, ams::wec::WakeEvent_None },
+ { DeviceCode_Debug0, InternalGpioPadNumber_Port_E_0, ams::wec::WakeEvent_None },
+ { DeviceCode_Debug1, InternalGpioPadNumber_Port_E_1, ams::wec::WakeEvent_None },
+ { DeviceCode_Debug2, InternalGpioPadNumber_Port_E_2, ams::wec::WakeEvent_None },
+ { DeviceCode_Debug3, InternalGpioPadNumber_Port_E_3, ams::wec::WakeEvent_None },
+ { DeviceCode_NfcIrq, InternalGpioPadNumber_Port_J_4, ams::wec::WakeEvent_None },
+ { DeviceCode_NfcRst, InternalGpioPadNumber_Port_K_7, ams::wec::WakeEvent_None },
+ { DeviceCode_McuIrq, InternalGpioPadNumber_Port_E_7, ams::wec::WakeEvent_McuIrq },
+ { DeviceCode_McuBoot, InternalGpioPadNumber_Port_T_0, ams::wec::WakeEvent_None },
+ { DeviceCode_McuRst, InternalGpioPadNumber_Port_T_1, ams::wec::WakeEvent_None },
+ { DeviceCode_Vdd5V3En, InternalGpioPadNumber_Port_X_3, ams::wec::WakeEvent_None },
+ { DeviceCode_McuPor, InternalGpioPadNumber_Port_CC_5, ams::wec::WakeEvent_None },
+ { DeviceCode_NfcEn, InternalGpioPadNumber_Port_J_6, ams::wec::WakeEvent_None },
+ { DeviceCode_GpioPortC7, InternalGpioPadNumber_Port_C_7, ams::wec::WakeEvent_None },
+ { DeviceCode_GpioPortD0, InternalGpioPadNumber_Port_D_0, ams::wec::WakeEvent_None },
+ { DeviceCode_GpioPortC5, InternalGpioPadNumber_Port_C_5, ams::wec::WakeEvent_None },
+ { DeviceCode_GpioPortC6, InternalGpioPadNumber_Port_C_6, ams::wec::WakeEvent_None },
+ { DeviceCode_GpioPortY7, InternalGpioPadNumber_Port_Y_5, ams::wec::WakeEvent_None },
+ { DeviceCode_Hdmi5VEn, InternalGpioPadNumber_Port_C_0, ams::wec::WakeEvent_None },
+ { DeviceCode_UsbSwitchB1En, InternalGpioPadNumber_Port_C_1, ams::wec::WakeEvent_None },
+ { DeviceCode_HdmiPdTrEn, InternalGpioPadNumber_Port_C_2, ams::wec::WakeEvent_None },
+ { DeviceCode_UsbSwitchB1Oc, InternalGpioPadNumber_Port_CC_6, ams::wec::WakeEvent_None },
+ { DeviceCode_HdmiHpd, InternalGpioPadNumber_Port_CC_1, ams::wec::WakeEvent_None },
+ { DeviceCode_GpioPortF1, InternalGpioPadNumber_Port_F_1, ams::wec::WakeEvent_None },
+ { DeviceCode_GpioPortH0, InternalGpioPadNumber_Port_H_0, ams::wec::WakeEvent_None },
+ { DeviceCode_ExtconDetS, InternalGpioPadNumber_Port_E_6, ams::wec::WakeEvent_ExtconDetS },
+ { DeviceCode_GameCardCd, InternalGpioPadNumber_Port_S_3, ams::wec::WakeEvent_CamI2cSda },
+ { DeviceCode_BattMgicIrq, InternalGpioPadNumber_Port_Y_0, ams::wec::WakeEvent_ButtonSlideSw },
+ { DeviceCode_Bq24190Irq, InternalGpioPadNumber_Port_Z_0, ams::wec::WakeEvent_Bq24190Irq },
+ { DeviceCode_CradleIrq, InternalGpioPadNumber_Port_K_4, ams::wec::WakeEvent_CradleIrq },
+ { DeviceCode_BtWakeAp, InternalGpioPadNumber_Port_H_5, ams::wec::WakeEvent_BtWakeAp },
+ { DeviceCode_ExtconDetU, InternalGpioPadNumber_Port_H_6, ams::wec::WakeEvent_ExtconDetU },
+ { DeviceCode_WifiWakeHost, InternalGpioPadNumber_Port_H_2, ams::wec::WakeEvent_WifiWakeAp },
+ { DeviceCode_SdCd, InternalGpioPadNumber_Port_Z_1, ams::wec::WakeEvent_SdCd },
+ { DeviceCode_ExtUart2Cts, InternalGpioPadNumber_Port_G_3, ams::wec::WakeEvent_Uart2Cts },
+ { DeviceCode_ExtUart3Cts, InternalGpioPadNumber_Port_D_4, ams::wec::WakeEvent_Uart3Cts },
+ { DeviceCode_LcdGpio1, InternalGpioPadNumber_Port_V_3, ams::wec::WakeEvent_LcdGpio1 },
+ { DeviceCode_PmuIrq, InternalGpioPadNumber_None, ams::wec::WakeEvent_PwrIntN },
+};
+
+constexpr inline size_t PadMapCombinationListSize = util::size(PadMapCombinationList);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_register_accessor.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_register_accessor.hpp
new file mode 100644
index 0000000..c9b2f6e
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_register_accessor.hpp
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+#include "gpio_tegra_pad.hpp"
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ constexpr inline dd::PhysicalAddress GpioRegistersPhysicalAddress = 0x6000D000;
+ constexpr inline size_t GpioRegistersSize = 4_KB;
+
+ constexpr inline int GpioPerControllerBitWidth = 5;
+ constexpr inline int GpioControllerBitWidth = 3;
+
+ constexpr inline int PortPerControllerBitWidth = 2;
+ constexpr inline int PortPerController = (1 << PortPerControllerBitWidth);
+
+ constexpr inline int GpioPerPortBitWidth = 3;
+ constexpr inline int GpioPerPort = (1 << GpioPerPortBitWidth);
+
+ static_assert(PortPerControllerBitWidth + GpioPerPortBitWidth == GpioPerControllerBitWidth);
+ static_assert(PortPerController * GpioPerPort == (1 << GpioPerControllerBitWidth));
+
+ constexpr int ConvertInternalGpioPadNumberToController(InternalGpioPadNumber number) {
+ return (number >> GpioPerControllerBitWidth);
+ }
+
+ constexpr int ConvertInternalGpioPadNumberToPort(InternalGpioPadNumber number) {
+ return (number >> GpioControllerBitWidth);
+ }
+
+ constexpr InternalGpioPadNumber ConvertPortToInternalGpioPadNumber(int port) {
+ return static_cast(port << GpioControllerBitWidth);
+ }
+
+ constexpr int ConvertInternalGpioPadNumberToBitIndex(InternalGpioPadNumber number) {
+ return (number & (GpioPerPort - 1));
+ }
+
+ constexpr int ConvertPortNumberToOffset(int port_number) {
+ return (port_number & (PortPerController - 1));
+ }
+
+ enum GpioController {
+ GpioController_1 = 0,
+ GpioController_2 = 1,
+ GpioController_3 = 2,
+ GpioController_4 = 3,
+ GpioController_5 = 4,
+ GpioController_6 = 5,
+ GpioController_7 = 6,
+ GpioController_8 = 7,
+ GpioController_Count = 8,
+ };
+ static_assert(GpioController_Count == static_cast(1 << GpioControllerBitWidth));
+
+ constexpr inline os::InterruptName InterruptNameTable[GpioController_Count] = {
+ 64, /* GpioController_1 */
+ 65, /* GpioController_2 */
+ 66, /* GpioController_3 */
+ 67, /* GpioController_4 */
+ 87, /* GpioController_5 */
+ 119, /* GpioController_6 */
+ 121, /* GpioController_7 */
+ 157, /* GpioController_8 */
+ };
+
+ enum InternalInterruptMode {
+ InternalInterruptMode_LowLevel = 0x000000,
+ InternalInterruptMode_HighLevel = 0x000001,
+ InternalInterruptMode_RisingEdge = 0x000101,
+ InternalInterruptMode_FallingEdge = 0x000100,
+ InternalInterruptMode_AnyEdge = 0x010100,
+
+ InternalInterruptMode_Mask = 0x010101,
+ };
+
+ enum GpioRegisterType {
+ GpioRegisterType_GPIO_CNF = 0,
+ GpioRegisterType_GPIO_OE = 1,
+ GpioRegisterType_GPIO_OUT = 2,
+ GpioRegisterType_GPIO_IN = 3,
+ GpioRegisterType_GPIO_INT_STA = 4,
+ GpioRegisterType_GPIO_INT_ENB = 5,
+ GpioRegisterType_GPIO_INT_LVL = 6,
+ GpioRegisterType_GPIO_INT_CLR = 7,
+ GpioRegisterType_GPIO_DB_CTRL = 8,
+ GpioRegisterType_GPIO_DB_CNT = 9,
+ };
+
+ constexpr inline uintptr_t MaskedWriteAddressOffset = 0x80;
+ constexpr inline int MaskedWriteBitOffset = 8;
+
+ constexpr inline uintptr_t GetGpioRegisterAddress(uintptr_t gpio_address, GpioRegisterType reg_type, InternalGpioPadNumber pad_number) {
+ const auto controller = ConvertInternalGpioPadNumberToController(pad_number);
+ const auto port = ConvertInternalGpioPadNumberToPort(pad_number);
+ const auto offset = ConvertPortNumberToOffset(port);
+
+ switch (reg_type) {
+ default:
+ return gpio_address + (0x100 * controller) + (0x10 * reg_type) + (0x4 * offset);
+ case GpioRegisterType_GPIO_DB_CTRL:
+ return gpio_address + (0x100 * controller) + (0x10 * GpioRegisterType_GPIO_IN) + (0x4 * offset);
+ case GpioRegisterType_GPIO_DB_CNT:
+ return gpio_address + (0x100 * controller) + MaskedWriteAddressOffset + (0x10 * GpioRegisterType_GPIO_INT_CLR) + (0x4 * offset);
+ }
+ }
+
+ inline void SetMaskedBit(uintptr_t pad_address, int index, int value) {
+ const uintptr_t mask_address = pad_address + MaskedWriteAddressOffset;
+
+ reg::Write(mask_address, (1u << (MaskedWriteBitOffset + index)) | (static_cast(value) << index));
+ }
+
+ inline void SetMaskedBits(uintptr_t pad_address, unsigned int mask, unsigned int value) {
+ const uintptr_t mask_address = pad_address + MaskedWriteAddressOffset;
+
+ reg::Write(mask_address, (mask << MaskedWriteBitOffset) | (value));
+ }
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_suspend_handler.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_suspend_handler.cpp
new file mode 100644
index 0000000..a922b21
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_suspend_handler.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "gpio_suspend_handler.hpp"
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ void SuspendHandler::Initialize(uintptr_t gpio_vaddr) {
+ /* Set our gpio virtual address. */
+ this->gpio_virtual_address = gpio_vaddr;
+
+ /* Ensure that we can use the wec library. */
+ ams::wec::Initialize();
+ }
+
+ void SuspendHandler::SetValueForSleepState(TegraPad *pad, GpioValue value) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result SuspendHandler::IsWakeEventActive(bool *out, TegraPad *pad) const {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result SuspendHandler::SetWakeEventActiveFlagSetForDebug(TegraPad *pad, bool en) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ void SuspendHandler::SetWakePinDebugMode(WakePinDebugMode mode) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ void SuspendHandler::Suspend() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ void SuspendHandler::SuspendLow() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ void SuspendHandler::Resume() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ void SuspendHandler::ResumeLow() {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_suspend_handler.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_suspend_handler.hpp
new file mode 100644
index 0000000..faaf59b
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_suspend_handler.hpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+#include "gpio_tegra_pad.hpp"
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ class SuspendHandler {
+ NON_COPYABLE(SuspendHandler);
+ NON_MOVEABLE(SuspendHandler);
+ private:
+ struct RegisterValues {
+ u16 conf;
+ u8 oe;
+ u8 out;
+ u8 int_enb;
+ u32 int_lvl;
+ u8 db_ctrl;
+ u8 db_cnt;
+
+ void Reset() {
+ this->conf = 0;
+ this->oe = 0;
+ this->out = 0;
+ this->int_enb = 0;
+ this->int_lvl = 0;
+ this->db_ctrl = 0;
+ this->db_cnt = 0;
+ }
+ };
+
+ struct ValuesForSleepState {
+ u8 force_set;
+ u8 out;
+
+ void Reset() {
+ this->force_set = 0;
+ this->out = 0;
+ }
+ };
+ private:
+ ddsf::IDriver &driver;
+ uintptr_t gpio_virtual_address;
+ RegisterValues register_values[GpioPadPort_Count];
+ ValuesForSleepState values_for_sleep_state[GpioPadPort_Count];
+ private:
+ uintptr_t GetGpioVirtualAddress() const {
+ AMS_ASSERT(this->gpio_virtual_address != 0);
+ return this->gpio_virtual_address;
+ }
+ public:
+ explicit SuspendHandler(ddsf::IDriver *drv) : driver(*drv), gpio_virtual_address(0) {
+ for (auto &rv : this->register_values) {
+ rv.Reset();
+ }
+ for (auto &v : this->values_for_sleep_state) {
+ v.Reset();
+ }
+ }
+
+ void Initialize(uintptr_t gpio_vaddr);
+
+ void SetValueForSleepState(TegraPad *pad, GpioValue value);
+ Result IsWakeEventActive(bool *out, TegraPad *pad) const;
+ Result SetWakeEventActiveFlagSetForDebug(TegraPad *pad, bool en);
+ void SetWakePinDebugMode(WakePinDebugMode mode);
+
+ void Suspend();
+ void SuspendLow();
+ void Resume();
+ void ResumeLow();
+ };
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_tegra_pad.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_tegra_pad.hpp
new file mode 100644
index 0000000..67c0939
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_tegra_pad.hpp
@@ -0,0 +1,377 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ enum GpioPadPort {
+ GpioPadPort_A = 0,
+ GpioPadPort_B = 1,
+ GpioPadPort_C = 2,
+ GpioPadPort_D = 3,
+ GpioPadPort_E = 4,
+ GpioPadPort_F = 5,
+ GpioPadPort_G = 6,
+ GpioPadPort_H = 7,
+ GpioPadPort_I = 8,
+ GpioPadPort_J = 9,
+ GpioPadPort_K = 10,
+ GpioPadPort_L = 11,
+ GpioPadPort_M = 12,
+ GpioPadPort_N = 13,
+ GpioPadPort_O = 14,
+ GpioPadPort_P = 15,
+ GpioPadPort_Q = 16,
+ GpioPadPort_R = 17,
+ GpioPadPort_S = 18,
+ GpioPadPort_T = 19,
+ GpioPadPort_U = 20,
+ GpioPadPort_V = 21,
+ GpioPadPort_W = 22,
+ GpioPadPort_X = 23,
+ GpioPadPort_Y = 24,
+ GpioPadPort_Z = 25,
+ GpioPadPort_AA = 26,
+ GpioPadPort_BB = 27,
+ GpioPadPort_CC = 28,
+ GpioPadPort_DD = 29,
+ GpioPadPort_EE = 30,
+ GpioPadPort_FF = 31,
+ GpioPadPort_Count = 32,
+ };
+
+ using InternalGpioPadNumber = int;
+
+ constexpr unsigned int GetInternalGpioPadNumber(GpioPadPort port, unsigned int which) {
+ AMS_ASSERT(which < 8);
+
+ return (static_cast(port) * 8) + which;
+ }
+
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_None = -1;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_0 = 0x00;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_1 = 0x01;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_2 = 0x02;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_3 = 0x03;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_4 = 0x04;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_5 = 0x05;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_6 = 0x06;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_7 = 0x07;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_0 = 0x08;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_1 = 0x09;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_2 = 0x0A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_3 = 0x0B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_4 = 0x0C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_5 = 0x0D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_6 = 0x0E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_7 = 0x0F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_0 = 0x10;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_1 = 0x11;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_2 = 0x12;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_3 = 0x13;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_4 = 0x14;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_5 = 0x15;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_6 = 0x16;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_7 = 0x17;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_0 = 0x18;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_1 = 0x19;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_2 = 0x1A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_3 = 0x1B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_4 = 0x1C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_5 = 0x1D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_6 = 0x1E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_7 = 0x1F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_0 = 0x20;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_1 = 0x21;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_2 = 0x22;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_3 = 0x23;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_4 = 0x24;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_5 = 0x25;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_6 = 0x26;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_7 = 0x27;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_0 = 0x28;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_1 = 0x29;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_2 = 0x2A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_3 = 0x2B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_4 = 0x2C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_5 = 0x2D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_6 = 0x2E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_7 = 0x2F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_0 = 0x30;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_1 = 0x31;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_2 = 0x32;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_3 = 0x33;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_4 = 0x34;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_5 = 0x35;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_6 = 0x36;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_7 = 0x37;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_0 = 0x38;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_1 = 0x39;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_2 = 0x3A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_3 = 0x3B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_4 = 0x3C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_5 = 0x3D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_6 = 0x3E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_7 = 0x3F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_0 = 0x40;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_1 = 0x41;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_2 = 0x42;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_3 = 0x43;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_4 = 0x44;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_5 = 0x45;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_6 = 0x46;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_7 = 0x47;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_0 = 0x48;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_1 = 0x49;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_2 = 0x4A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_3 = 0x4B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_4 = 0x4C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_5 = 0x4D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_6 = 0x4E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_7 = 0x4F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_0 = 0x50;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_1 = 0x51;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_2 = 0x52;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_3 = 0x53;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_4 = 0x54;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_5 = 0x55;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_6 = 0x56;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_7 = 0x57;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_0 = 0x58;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_1 = 0x59;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_2 = 0x5A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_3 = 0x5B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_4 = 0x5C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_5 = 0x5D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_6 = 0x5E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_7 = 0x5F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_0 = 0x60;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_1 = 0x61;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_2 = 0x62;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_3 = 0x63;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_4 = 0x64;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_5 = 0x65;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_6 = 0x66;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_7 = 0x67;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_0 = 0x68;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_1 = 0x69;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_2 = 0x6A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_3 = 0x6B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_4 = 0x6C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_5 = 0x6D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_6 = 0x6E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_7 = 0x6F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_0 = 0x70;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_1 = 0x71;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_2 = 0x72;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_3 = 0x73;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_4 = 0x74;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_5 = 0x75;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_6 = 0x76;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_7 = 0x77;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_0 = 0x78;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_1 = 0x79;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_2 = 0x7A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_3 = 0x7B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_4 = 0x7C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_5 = 0x7D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_6 = 0x7E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_7 = 0x7F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_0 = 0x80;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_1 = 0x81;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_2 = 0x82;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_3 = 0x83;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_4 = 0x84;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_5 = 0x85;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_6 = 0x86;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_7 = 0x87;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_0 = 0x88;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_1 = 0x89;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_2 = 0x8A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_3 = 0x8B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_4 = 0x8C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_5 = 0x8D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_6 = 0x8E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_7 = 0x8F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_0 = 0x90;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_1 = 0x91;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_2 = 0x92;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_3 = 0x93;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_4 = 0x94;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_5 = 0x95;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_6 = 0x96;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_7 = 0x97;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_0 = 0x98;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_1 = 0x99;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_2 = 0x9A;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_3 = 0x9B;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_4 = 0x9C;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_5 = 0x9D;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_6 = 0x9E;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_7 = 0x9F;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_0 = 0xA0;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_1 = 0xA1;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_2 = 0xA2;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_3 = 0xA3;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_4 = 0xA4;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_5 = 0xA5;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_6 = 0xA6;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_7 = 0xA7;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_0 = 0xA8;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_1 = 0xA9;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_2 = 0xAA;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_3 = 0xAB;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_4 = 0xAC;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_5 = 0xAD;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_6 = 0xAE;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_7 = 0xAF;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_0 = 0xB0;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_1 = 0xB1;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_2 = 0xB2;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_3 = 0xB3;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_4 = 0xB4;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_5 = 0xB5;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_6 = 0xB6;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_7 = 0xB7;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_0 = 0xB8;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_1 = 0xB9;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_2 = 0xBA;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_3 = 0xBB;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_4 = 0xBC;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_5 = 0xBD;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_6 = 0xBE;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_7 = 0xBF;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_0 = 0xC0;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_1 = 0xC1;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_2 = 0xC2;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_3 = 0xC3;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_4 = 0xC4;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_5 = 0xC5;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_6 = 0xC6;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_7 = 0xC7;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_0 = 0xC8;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_1 = 0xC9;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_2 = 0xCA;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_3 = 0xCB;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_4 = 0xCC;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_5 = 0xCD;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_6 = 0xCE;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_7 = 0xCF;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_0 = 0xD0;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_1 = 0xD1;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_2 = 0xD2;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_3 = 0xD3;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_4 = 0xD4;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_5 = 0xD5;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_6 = 0xD6;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_7 = 0xD7;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_0 = 0xD8;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_1 = 0xD9;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_2 = 0xDA;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_3 = 0xDB;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_4 = 0xDC;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_5 = 0xDD;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_6 = 0xDE;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_7 = 0xDF;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_0 = 0xE0;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_1 = 0xE1;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_2 = 0xE2;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_3 = 0xE3;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_4 = 0xE4;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_5 = 0xE5;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_6 = 0xE6;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_7 = 0xE7;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_0 = 0xE8;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_1 = 0xE9;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_2 = 0xEA;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_3 = 0xEB;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_4 = 0xEC;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_5 = 0xED;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_6 = 0xEE;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_7 = 0xEF;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_0 = 0xF0;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_1 = 0xF1;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_2 = 0xF2;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_3 = 0xF3;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_4 = 0xF4;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_5 = 0xF5;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_6 = 0xF6;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_7 = 0xF7;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_0 = 0xF8;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_1 = 0xF9;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_2 = 0xFA;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_3 = 0xFB;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_4 = 0xFC;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_5 = 0xFD;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_6 = 0xFE;
+ constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_7 = 0xFF;
+
+ struct PadMapCombination {
+ DeviceCode device_code;
+ InternalGpioPadNumber internal_number;
+ wec::WakeEvent wake_event;
+ };
+
+ #include "gpio_internal_pad_map_combination.inc"
+
+ struct PadInfo {
+ wec::WakeEvent wake_event;
+
+ constexpr PadInfo() : wake_event(wec::WakeEvent_None) { /* ... */ }
+
+ constexpr explicit PadInfo(wec::WakeEvent we) : wake_event(we) { /* ... */ }
+
+ constexpr bool operator ==(const PadInfo &rhs) const { return this->wake_event == rhs.wake_event; }
+ constexpr bool operator !=(const PadInfo &rhs) const { return !(*this == rhs); }
+ };
+
+ struct PadStatus {
+ bool is_wake_active;
+ bool is_wake_active_debug;
+
+ constexpr PadStatus() : is_wake_active(false), is_wake_active_debug(false) { /* ... */ }
+ };
+
+ class TegraPad : public ::ams::gpio::driver::Pad {
+ AMS_DDSF_CASTABLE_TRAITS(ams::gpio::driver::board::nintendo_nx::impl::TegraPad, ::ams::gpio::driver::Pad);
+ private:
+ using Base = ::ams::gpio::driver::Pad;
+ private:
+ util::IntrusiveListNode interrupt_list_node;
+ PadInfo info;
+ PadStatus status;
+ public:
+ using InterruptListTraits = util::IntrusiveListMemberTraitsDeferredAssert<&TegraPad::interrupt_list_node>;
+ using InterruptList = typename InterruptListTraits::ListType;
+ friend class util::IntrusiveList>;
+ public:
+ TegraPad() : Pad(), interrupt_list_node(), info(), status() { /* ... */ }
+
+ const PadInfo &GetInfo() const { return this->info; }
+ PadStatus &GetStatus() { return this->status; }
+
+ void SetParameters(int pad, const PadInfo &i) {
+ Base::SetPadNumber(pad);
+ this->info = info;
+ }
+
+ bool IsLinkedToInterruptBoundPadList() const {
+ return this->interrupt_list_node.IsLinked();
+ }
+ };
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_wake_pin_config.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_wake_pin_config.hpp
new file mode 100644
index 0000000..9b25143
--- /dev/null
+++ b/libraries/libstratosphere/source/gpio/driver/board/nintendo/nx/impl/gpio_wake_pin_config.hpp
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::gpio::driver::board::nintendo_nx::impl {
+
+ struct WakePinConfig {
+ wec::WakeEvent wake_event;
+ bool enable;
+ wec::WakeEventLevel level;
+ };
+
+}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/gpio_driver_api.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/gpio_driver_api.cpp
deleted file mode 100644
index 513add6..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/gpio_driver_api.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "impl/gpio_driver_impl.hpp"
-#include "impl/gpio_initial_config.hpp"
-#include "impl/gpio_tegra_pad.hpp"
-
-namespace ams::gpio::driver::board::nintendo_nx {
-
- namespace {
-
- ams::gpio::driver::board::nintendo_nx::impl::DriverImpl *g_driver_impl = nullptr;
-
- }
-
- void Initialize(bool enable_interrupt_handlers) {
- /* Check that we haven't previously initialized. */
- AMS_ABORT_UNLESS(g_driver_impl == nullptr);
-
- /* Get the device driver subsystem framework memory resource. */
- auto *memory_resource = ddsf::GetMemoryResource();
-
- /* Allocate a new driver. */
- auto *driver_storage = static_cast(memory_resource->Allocate(sizeof(*g_driver_impl)));
- AMS_ABORT_UNLESS(driver_storage != nullptr);
-
- /* Construct the new driver. */
- g_driver_impl = new (driver_storage) ams::gpio::driver::board::nintendo_nx::impl::DriverImpl(impl::GpioRegistersPhysicalAddress, impl::GpioRegistersSize);
-
- /* Register the driver. */
- gpio::driver::RegisterDriver(g_driver_impl);
-
- /* Register interrupt handlers, if we should. */
- if (enable_interrupt_handlers) {
- for (size_t i = 0; i < util::size(impl::InterruptNameTable); ++i) {
- /* Allocate a handler. */
- impl::InterruptEventHandler *handler_storage = static_cast(memory_resource->Allocate(sizeof(impl::InterruptEventHandler)));
- AMS_ABORT_UNLESS(handler_storage != nullptr);
-
- /* Initialize the handler. */
- impl::InterruptEventHandler *handler = new (handler_storage) impl::InterruptEventHandler;
- handler->Initialize(g_driver_impl, impl::InterruptNameTable[i], static_cast(i));
-
- /* Register the handler. */
- gpio::driver::RegisterInterruptHandler(handler);
- }
- }
-
- /* Create and register all pads. */
- for (const auto &entry : impl::PadMapCombinationList) {
- /* Allocate a pad for our device. */
- impl::TegraPad *pad_storage = static_cast(memory_resource->Allocate(sizeof(impl::TegraPad)));
- AMS_ABORT_UNLESS(pad_storage != nullptr);
-
- /* Create a pad for our device. */
- impl::TegraPad *pad = new (pad_storage) impl::TegraPad;
- pad->SetParameters(entry.internal_number, impl::PadInfo{entry.wake_event});
-
- /* Register the pad with our driver. */
- g_driver_impl->RegisterDevice(pad);
-
- /* Register the device code with our driver. */
- R_ABORT_UNLESS(gpio::driver::RegisterDeviceCode(entry.device_code, pad));
- }
- }
-
- void SetInitialGpioConfig() {
- return impl::SetInitialGpioConfig();
- }
-
- void SetInitialWakePinConfig() {
- return impl::SetInitialWakePinConfig();
- }
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_driver_impl.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_driver_impl.cpp
deleted file mode 100644
index aa152fb..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_driver_impl.cpp
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "gpio_driver_impl.hpp"
-#include "gpio_register_accessor.hpp"
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- void InterruptEventHandler::Initialize(DriverImpl *drv, os::InterruptName intr, int ctlr) {
- /* Set fields. */
- this->driver = drv;
- this->interrupt_name = intr;
- this->controller_number = ctlr;
-
- /* Initialize interrupt event. */
- os::InitializeInterruptEvent(std::addressof(this->interrupt_event), intr, os::EventClearMode_ManualClear);
-
- /* Initialize base. */
- IEventHandler::Initialize(std::addressof(this->interrupt_event));
- }
-
- void InterruptEventHandler::HandleEvent() {
- /* Lock the driver's interrupt mutex. */
- std::scoped_lock lk(this->driver->interrupt_control_mutex);
-
- /* Check each pad. */
- bool found = false;
- for (auto it = this->driver->interrupt_pad_list.begin(); !found && it != this->driver->interrupt_pad_list.end(); ++it) {
- found = this->CheckAndHandleInterrupt(*it);
- }
-
- /* If we didn't find a pad, clear the interrupt event. */
- if (!found) {
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- }
- }
-
- bool InterruptEventHandler::CheckAndHandleInterrupt(TegraPad &pad) {
- /* Get the pad's number. */
- const InternalGpioPadNumber pad_number = static_cast(pad.GetPadNumber());
-
- /* Check if the pad matches our controller number. */
- if (this->controller_number != ConvertInternalGpioPadNumberToController(pad_number)) {
- return false;
- }
-
- /* Get the addresses of INT_STA, INT_ENB. */
- const uintptr_t sta_address = GetGpioRegisterAddress(this->driver->gpio_virtual_address, GpioRegisterType_GPIO_INT_STA, pad_number);
- const uintptr_t enb_address = GetGpioRegisterAddress(this->driver->gpio_virtual_address, GpioRegisterType_GPIO_INT_STA, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
-
- /* Check if both STA and ENB are set. */
- if (reg::Read(sta_address, 1u << pad_index) == 0 || reg::Read(enb_address, 1u << pad_index) == 0) {
- return false;
- }
-
- /* The pad is signaled. First, clear the enb bit. */
- SetMaskedBit(enb_address, pad_index, 0);
- reg::Read(enb_address);
-
- /* Disable the interrupt on the pad. */
- pad.SetInterruptEnabled(false);
- this->driver->RemoveInterruptPad(std::addressof(pad));
-
- /* Clear the interrupt event. */
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
-
- /* Signal the pad's bound event. */
- pad.SignalInterruptBoundEvent();
-
- return true;
- }
-
- DriverImpl::DriverImpl(dd::PhysicalAddress reg_paddr, size_t size) : gpio_physical_address(reg_paddr), gpio_virtual_address(), suspend_handler(this), interrupt_pad_list(), interrupt_control_mutex() {
- /* Get the corresponding virtual address for our physical address. */
- this->gpio_virtual_address = dd::QueryIoMapping(reg_paddr, size);
- AMS_ABORT_UNLESS(this->gpio_virtual_address != 0);
- }
-
- void DriverImpl::InitializeDriver() {
- /* Initialize our suspend handler. */
- this->suspend_handler.Initialize(this->gpio_virtual_address);
- }
-
- void DriverImpl::FinalizeDriver() {
- /* ... */
- }
-
- Result DriverImpl::InitializePad(Pad *pad) {
- /* Validate arguments. */
- AMS_ASSERT(pad != nullptr);
-
- /* Convert the pad to an internal number. */
- const InternalGpioPadNumber pad_number = pad->GetPadNumber();
-
- /* Configure the pad as GPIO by modifying the appropriate bit in CNF. */
- const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_CNF, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
- SetMaskedBit(pad_address, pad_index, 1);
-
- /* Read the pad address to make sure our configuration takes. */
- reg::Read(pad_address);
-
- return ResultSuccess();
- }
-
- void DriverImpl::FinalizePad(Pad *pad) {
- /* Validate arguments. */
- AMS_ASSERT(pad != nullptr);
-
- /* Nothing to do. */
- AMS_UNUSED(pad);
- }
-
- Result DriverImpl::GetDirection(Direction *out, Pad *pad) const {
- /* Validate arguments. */
- AMS_ASSERT(out != nullptr);
- AMS_ASSERT(pad != nullptr);
-
- /* Convert the pad to an internal number. */
- const InternalGpioPadNumber pad_number = pad->GetPadNumber();
-
- /* Get the pad direction by reading the appropriate bit in OE */
- const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_OE, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
-
- if (reg::Read(pad_address, 1u << pad_index) != 0) {
- *out = Direction_Output;
- } else {
- *out = Direction_Input;
- }
-
- return ResultSuccess();
-
- }
-
- Result DriverImpl::SetDirection(Pad *pad, Direction direction) {
- /* Validate arguments. */
- AMS_ASSERT(pad != nullptr);
-
- /* Convert the pad to an internal number. */
- const InternalGpioPadNumber pad_number = pad->GetPadNumber();
-
- /* Configure the pad direction by modifying the appropriate bit in OE */
- const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_OE, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
- SetMaskedBit(pad_address, pad_index, direction);
-
- /* Read the pad address to make sure our configuration takes. */
- reg::Read(pad_address);
-
- return ResultSuccess();
- }
-
- Result DriverImpl::GetValue(GpioValue *out, Pad *pad) const {
- /* Validate arguments. */
- AMS_ASSERT(out != nullptr);
- AMS_ASSERT(pad != nullptr);
-
- /* Convert the pad to an internal number. */
- const InternalGpioPadNumber pad_number = pad->GetPadNumber();
-
- /* Get the pad value by reading the appropriate bit in IN */
- const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_IN, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
-
- if (reg::Read(pad_address, 1u << pad_index) != 0) {
- *out = GpioValue_High;
- } else {
- *out = GpioValue_Low;
- }
-
- return ResultSuccess();
- }
-
- Result DriverImpl::SetValue(Pad *pad, GpioValue value) {
- /* Validate arguments. */
- AMS_ASSERT(pad != nullptr);
-
- /* Convert the pad to an internal number. */
- const InternalGpioPadNumber pad_number = pad->GetPadNumber();
-
- /* Configure the pad value by modifying the appropriate bit in IN */
- const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_IN, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
- SetMaskedBit(pad_address, pad_index, value);
-
- /* Read the pad address to make sure our configuration takes. */
- reg::Read(pad_address);
-
- return ResultSuccess();
- }
-
- Result DriverImpl::GetInterruptMode(InterruptMode *out, Pad *pad) const {
- /* Validate arguments. */
- AMS_ASSERT(out != nullptr);
- AMS_ASSERT(pad != nullptr);
-
- /* Convert the pad to an internal number. */
- const InternalGpioPadNumber pad_number = pad->GetPadNumber();
-
- /* Get the pad mode by reading the appropriate bits in INT_LVL */
- const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_INT_LVL, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
-
- switch ((reg::Read(pad_address) >> pad_index) & InternalInterruptMode_Mask) {
- case InternalInterruptMode_LowLevel: *out = InterruptMode_LowLevel; break;
- case InternalInterruptMode_HighLevel: *out = InterruptMode_HighLevel; break;
- case InternalInterruptMode_RisingEdge: *out = InterruptMode_RisingEdge; break;
- case InternalInterruptMode_FallingEdge: *out = InterruptMode_FallingEdge; break;
- case InternalInterruptMode_AnyEdge: *out = InterruptMode_AnyEdge; break;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
-
- return ResultSuccess();
- }
-
- Result DriverImpl::SetInterruptMode(Pad *pad, InterruptMode mode) {
- /* Validate arguments. */
- AMS_ASSERT(pad != nullptr);
-
- /* Convert the pad to an internal number. */
- const InternalGpioPadNumber pad_number = pad->GetPadNumber();
-
- /* Configure the pad mode by modifying the appropriate bits in INT_LVL */
- const uintptr_t pad_address = GetGpioRegisterAddress(this->gpio_virtual_address, GpioRegisterType_GPIO_INT_LVL, pad_number);
- const uintptr_t pad_index = ConvertInternalGpioPadNumberToBitIndex(pad_number);
-
- switch (mode) {
- case InterruptMode_LowLevel: reg::ReadWrite(pad_address, InternalInterruptMode_LowLevel << pad_index, InternalInterruptMode_Mask << pad_index); break;
- case InterruptMode_HighLevel: reg::ReadWrite(pad_address, InternalInterruptMode_HighLevel << pad_index, InternalInterruptMode_Mask << pad_index); break;
- case InterruptMode_RisingEdge: reg::ReadWrite(pad_address, InternalInterruptMode_RisingEdge << pad_index, InternalInterruptMode_Mask << pad_index); break;
- case InterruptMode_FallingEdge: reg::ReadWrite(pad_address, InternalInterruptMode_FallingEdge << pad_index, InternalInterruptMode_Mask << pad_index); break;
- case InterruptMode_AnyEdge: reg::ReadWrite(pad_address, InternalInterruptMode_AnyEdge << pad_index, InternalInterruptMode_Mask << pad_index); break;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
-
- /* Read the pad address to make sure our configuration takes. */
- reg::Read(pad_address);
-
- return ResultSuccess();
- }
-
- Result DriverImpl::SetInterruptEnabled(Pad *pad, bool en) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::GetInterruptStatus(InterruptStatus *out, Pad *pad) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::ClearInterruptStatus(Pad *pad) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::GetDebounceEnabled(bool *out, Pad *pad) const {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::SetDebounceEnabled(Pad *pad, bool en) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::GetDebounceTime(s32 *out_ms, Pad *pad) const {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::SetDebounceTime(Pad *pad, s32 ms) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::GetUnknown22(u32 *out) {
- /* TODO */
- AMS_ABORT();
- }
-
- void DriverImpl::Unknown23() {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::SetValueForSleepState(Pad *pad, GpioValue value) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::IsWakeEventActive(bool *out, Pad *pad) const {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::SetWakeEventActiveFlagSetForDebug(Pad *pad, bool en) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::SetWakePinDebugMode(WakePinDebugMode mode) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::Suspend() {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::SuspendLow() {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::Resume() {
- /* TODO */
- AMS_ABORT();
- }
-
- Result DriverImpl::ResumeLow() {
- /* TODO */
- AMS_ABORT();
- }
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_driver_impl.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_driver_impl.hpp
deleted file mode 100644
index b78f341..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_driver_impl.hpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-#include "gpio_tegra_pad.hpp"
-#include "gpio_register_accessor.hpp"
-#include "gpio_suspend_handler.hpp"
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- class DriverImpl;
-
- class InterruptEventHandler : public ddsf::IEventHandler {
- private:
- DriverImpl *driver;
- os::InterruptName interrupt_name;
- os::InterruptEventType interrupt_event;
- int controller_number;
- private:
- bool CheckAndHandleInterrupt(TegraPad &pad);
- public:
- InterruptEventHandler() : IEventHandler(), driver(nullptr), interrupt_name(), interrupt_event(), controller_number() { /* ... */ }
-
- void Initialize(DriverImpl *drv, os::InterruptName intr, int ctlr);
-
- virtual void HandleEvent() override;
- };
-
- class DriverImpl : public ::ams::gpio::driver::IGpioDriver {
- NON_COPYABLE(DriverImpl);
- NON_MOVEABLE(DriverImpl);
- AMS_DDSF_CASTABLE_TRAITS(ams::gpio::driver::board::nintendo_nx::impl::DriverImpl, ::ams::gpio::driver::IGpioDriver);
- friend class InterruptEventHandler;
- private:
- dd::PhysicalAddress gpio_physical_address;
- uintptr_t gpio_virtual_address;
- SuspendHandler suspend_handler;
- TegraPad::InterruptList interrupt_pad_list;
- mutable os::SdkMutex interrupt_control_mutex;
- public:
- DriverImpl(dd::PhysicalAddress reg_paddr, size_t size);
-
- virtual void InitializeDriver() override;
- virtual void FinalizeDriver() override;
-
- virtual Result InitializePad(Pad *pad) override;
- virtual void FinalizePad(Pad *pad) override;
-
- virtual Result GetDirection(Direction *out, Pad *pad) const override;
- virtual Result SetDirection(Pad *pad, Direction direction) override;
-
- virtual Result GetValue(GpioValue *out, Pad *pad) const override;
- virtual Result SetValue(Pad *pad, GpioValue value) override;
-
- virtual Result GetInterruptMode(InterruptMode *out, Pad *pad) const override;
- virtual Result SetInterruptMode(Pad *pad, InterruptMode mode) override;
-
- virtual Result SetInterruptEnabled(Pad *pad, bool en) override;
-
- virtual Result GetInterruptStatus(InterruptStatus *out, Pad *pad) override;
- virtual Result ClearInterruptStatus(Pad *pad) override;
-
- virtual os::SdkMutex &GetInterruptControlMutex(const Pad &pad) const override {
- AMS_UNUSED(pad);
- return this->interrupt_control_mutex;
- }
-
- virtual Result GetDebounceEnabled(bool *out, Pad *pad) const override;
- virtual Result SetDebounceEnabled(Pad *pad, bool en) override;
-
- virtual Result GetDebounceTime(s32 *out_ms, Pad *pad) const override;
- virtual Result SetDebounceTime(Pad *pad, s32 ms) override;
-
- virtual Result GetUnknown22(u32 *out) override;
- virtual void Unknown23() override;
-
- virtual Result SetValueForSleepState(Pad *pad, GpioValue value) override;
- virtual Result IsWakeEventActive(bool *out, Pad *pad) const override;
- virtual Result SetWakeEventActiveFlagSetForDebug(Pad *pad, bool en) override;
- virtual Result SetWakePinDebugMode(WakePinDebugMode mode) override;
-
- virtual Result Suspend() override;
- virtual Result SuspendLow() override;
- virtual Result Resume() override;
- virtual Result ResumeLow() override;
- private:
- static constexpr ALWAYS_INLINE TegraPad &GetTegraPad(Pad *pad) {
- AMS_ASSERT(pad != nullptr);
- return static_cast(*pad);
- }
-
- static ALWAYS_INLINE const PadInfo &GetInfo(Pad *pad) {
- return GetTegraPad(pad).GetInfo();
- }
-
- static ALWAYS_INLINE PadStatus &GetStatus(Pad *pad) {
- return GetTegraPad(pad).GetStatus();
- }
-
- void AddInterruptPad(TegraPad *pad) {
- AMS_ASSERT(pad != nullptr);
- if (!pad->IsLinkedToInterruptBoundPadList()) {
- this->interrupt_pad_list.push_back(*pad);
- }
- }
-
- void RemoveInterruptPad(TegraPad *pad) {
- AMS_ASSERT(pad != nullptr);
- if (pad->IsLinkedToInterruptBoundPadList()) {
- this->interrupt_pad_list.erase(this->interrupt_pad_list.iterator_to(*pad));
- }
- }
- };
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config.cpp
deleted file mode 100644
index b6b1022..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "gpio_driver_impl.hpp"
-#include "gpio_initial_config.hpp"
-#include "gpio_wake_pin_config.hpp"
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- namespace {
-
- spl::HardwareType GetHardwareType() {
- /* Acquire access to spl: */
- sm::ScopedServiceHolder spl_holder;
- AMS_ABORT_UNLESS(static_cast(spl_holder));
-
- /* Get config. */
- return ::ams::spl::GetHardwareType();
- }
-
- #include "gpio_initial_wake_pin_config_icosa.inc"
- /* #include "gpio_initial_wake_pin_config_copper.inc" */
- #include "gpio_initial_wake_pin_config_hoag.inc"
- #include "gpio_initial_wake_pin_config_iowa.inc"
- #include "gpio_initial_wake_pin_config_calcio.inc"
- #include "gpio_initial_wake_pin_config_aula.inc"
-
- #include "gpio_initial_config_icosa.inc"
- /* #include "gpio_initial_config_copper.inc" */
- #include "gpio_initial_config_hoag.inc"
- #include "gpio_initial_config_iowa.inc"
- #include "gpio_initial_config_calcio.inc"
- #include "gpio_initial_config_aula.inc"
-
- }
-
- void SetInitialGpioConfig() {
- /* Set wake event levels, wake event enables. */
- const GpioInitialConfig *configs = nullptr;
- size_t num_configs = 0;
-
- /* Select the correct config. */
- switch (GetHardwareType()) {
- case spl::HardwareType::Icosa:
- configs = InitialGpioConfigsIcosa;
- num_configs = NumInitialGpioConfigsIcosa;
- break;
- case spl::HardwareType::Hoag:
- configs = InitialGpioConfigsHoag;
- num_configs = NumInitialGpioConfigsHoag;
- break;
- case spl::HardwareType::Iowa:
- configs = InitialGpioConfigsIowa;
- num_configs = NumInitialGpioConfigsIowa;
- break;
- case spl::HardwareType::Calcio:
- configs = InitialGpioConfigsCalcio;
- num_configs = NumInitialGpioConfigsCalcio;
- break;
- case spl::HardwareType::Aula:
- configs = InitialGpioConfigsAula;
- num_configs = NumInitialGpioConfigsAula;
- break;
- case spl::HardwareType::Copper:
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
-
- /* Check we can use our config. */
- AMS_ABORT_UNLESS(configs != nullptr);
-
- /* Apply the configs. */
- {
- /* Create a driver to use for the duration of our application. */
- DriverImpl driver(GpioRegistersPhysicalAddress, GpioRegistersSize);
- driver.InitializeDriver();
-
- for (size_t i = 0; i < num_configs; ++i) {
- /* Find the internal pad number for our device. */
- bool found = false;
- for (const auto &entry : PadMapCombinationList) {
- if (entry.device_code == configs[i].device_code) {
- /* We found an entry. */
- found = true;
-
- /* Create a pad for our device. */
- TegraPad pad;
- pad.SetParameters(entry.internal_number, PadInfo{entry.wake_event});
-
- /* Initialize the pad. */
- R_ABORT_UNLESS(driver.InitializePad(std::addressof(pad)));
-
- /* Set the direction. */
- R_ABORT_UNLESS(driver.SetDirection(std::addressof(pad), configs[i].direction));
-
- /* If the direction is output, set the value. */
- if (configs[i].direction == Direction_Output) {
- R_ABORT_UNLESS(driver.SetValue(std::addressof(pad), configs[i].value));
- }
-
- /* Finalize the pad we made. */
- driver.FinalizePad(std::addressof(pad));
- break;
- }
- }
-
- /* Ensure that we applied the config for the pad we wanted. */
- AMS_ABORT_UNLESS(found);
- }
-
- /* Finalize the driver. */
- driver.FinalizeDriver();
- }
- }
-
- void SetInitialWakePinConfig() {
- /* Ensure the wec driver is initialized. */
- ams::wec::Initialize();
-
- /* Set wake event levels, wake event enables. */
- const WakePinConfig *configs = nullptr;
- size_t num_configs = 0;
-
- /* Select the correct config. */
- switch (GetHardwareType()) {
- case spl::HardwareType::Icosa:
- configs = InitialWakePinConfigsIcosa;
- num_configs = NumInitialWakePinConfigsIcosa;
- break;
- case spl::HardwareType::Hoag:
- configs = InitialWakePinConfigsHoag;
- num_configs = NumInitialWakePinConfigsHoag;
- break;
- case spl::HardwareType::Iowa:
- configs = InitialWakePinConfigsIowa;
- num_configs = NumInitialWakePinConfigsIowa;
- break;
- case spl::HardwareType::Calcio:
- configs = InitialWakePinConfigsCalcio;
- num_configs = NumInitialWakePinConfigsCalcio;
- break;
- case spl::HardwareType::Aula:
- configs = InitialWakePinConfigsAula;
- num_configs = NumInitialWakePinConfigsAula;
- break;
- case spl::HardwareType::Copper:
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
-
- /* Check we can use our config. */
- AMS_ABORT_UNLESS(configs != nullptr);
-
- /* Apply the config. */
- for (size_t i = 0; i < num_configs; ++i) {
- wec::SetWakeEventLevel(configs[i].wake_event, configs[i].level);
- wec::SetWakeEventEnabled(configs[i].wake_event, configs[i].enable);
- }
- }
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config.hpp
deleted file mode 100644
index d577ccc..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- struct GpioInitialConfig {
- DeviceCode device_code;
- gpio::Direction direction;
- gpio::GpioValue value;
- };
-
- void SetInitialGpioConfig();
- void SetInitialWakePinConfig();
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_aula.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_aula.inc
deleted file mode 100644
index e1c90ee..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_aula.inc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
-
-constexpr inline const GpioInitialConfig InitialGpioConfigsAula[] = {
- { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
- { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
- { DeviceCode_Debug0, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug1, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug2, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug3, Direction_Output, GpioValue_Low },
- { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
- { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
- { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
- { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
- { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
- { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
- { DeviceCode_Vdd5V3En, Direction_Output, GpioValue_Low },
- { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
- { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
- { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
- { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
- { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_RecoveryKey, Direction_Input, GpioValue_Low },
- { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
- { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
- { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_Low },
- { DeviceCode_SdCd, Direction_Input, GpioValue_High },
- { DeviceCode_SdWp, Direction_Input, GpioValue_High },
- { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
- { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtconDetU, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
- { DeviceCode_ExtconChgU, Direction_Output, GpioValue_Low },
- { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
- { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
- { DeviceCode_ExtconDetS, Direction_Input, GpioValue_Low },
- { DeviceCode_GpioPortH0, Direction_Input, GpioValue_Low },
- { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
- { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
- { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
- { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
- { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtconChgS, Direction_Output, GpioValue_Low },
-};
-
-constexpr inline size_t NumInitialGpioConfigsAula = util::size(InitialGpioConfigsAula);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_calcio.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_calcio.inc
deleted file mode 100644
index e20acc0..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_calcio.inc
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
-
-constexpr inline const GpioInitialConfig InitialGpioConfigsCalcio[] = {
- { DeviceCode_Debug0, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug1, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug2, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug3, Direction_Output, GpioValue_Low },
- { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
- { DeviceCode_GpioPortF1, Direction_Output, GpioValue_Low },
- { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
- { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
- { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
- { DeviceCode_RecoveryKey, Direction_Input, GpioValue_High },
- { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
- { DeviceCode_SdCd, Direction_Input, GpioValue_High },
- { DeviceCode_SdWp, Direction_Input, GpioValue_High },
- { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
- { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
- { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
- { DeviceCode_Hdmi5VEn, Direction_Output, GpioValue_Low },
- { DeviceCode_UsbSwitchB1Oc, Direction_Input, GpioValue_High },
- { DeviceCode_HdmiPdTrEn, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
- { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
- { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
- { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
- { DeviceCode_UsbSwitchB1En, Direction_Output, GpioValue_Low },
- { DeviceCode_HdmiHpd, Direction_Input, GpioValue_Low },
-};
-
-constexpr inline size_t NumInitialGpioConfigsCalcio = util::size(InitialGpioConfigsCalcio);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_hoag.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_hoag.inc
deleted file mode 100644
index 97a45b2..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_hoag.inc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
-
-constexpr inline const GpioInitialConfig InitialGpioConfigsHoag[] = {
- { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
- { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
- { DeviceCode_Debug0, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug1, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug2, Direction_Output, GpioValue_Low },
- { DeviceCode_Debug3, Direction_Output, GpioValue_Low },
- { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
- { DeviceCode_McuIrq, Direction_Input, GpioValue_High },
- { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
- { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
- { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
- { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
- { DeviceCode_McuBoot, Direction_Output, GpioValue_Low },
- { DeviceCode_McuRst, Direction_Output, GpioValue_Low },
- { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
- { DeviceCode_Vdd5V3En, Direction_Output, GpioValue_Low },
- { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
- { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
- { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
- { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
- { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_RecoveryKey, Direction_Input, GpioValue_High },
- { DeviceCode_PowLcdBlEn, Direction_Output, GpioValue_Low },
- { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
- { DeviceCode_LcdGpio1, Direction_Input, GpioValue_High },
- { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
- { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_Low },
- { DeviceCode_SdCd, Direction_Input, GpioValue_High },
- { DeviceCode_SdWp, Direction_Input, GpioValue_High },
- { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
- { DeviceCode_NfcEn, Direction_Output, GpioValue_Low },
- { DeviceCode_NfcIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
- { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
- { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
- { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
- { DeviceCode_NfcRst, Direction_Output, GpioValue_Low },
- { DeviceCode_GpioPortC7, Direction_Input, GpioValue_Low },
- { DeviceCode_GpioPortD0, Direction_Input, GpioValue_Low },
- { DeviceCode_GpioPortC5, Direction_Input, GpioValue_Low },
- { DeviceCode_GpioPortC6, Direction_Input, GpioValue_Low },
- { DeviceCode_GpioPortY7, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
- { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
- { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
- { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
- { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
- { DeviceCode_PowLcdVddPEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowLcdVddNEn, Direction_Output, GpioValue_Low },
- { DeviceCode_McuPor, Direction_Output, GpioValue_Low },
-};
-
-constexpr inline size_t NumInitialGpioConfigsHoag = util::size(InitialGpioConfigsHoag);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_icosa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_icosa.inc
deleted file mode 100644
index 85800f5..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_icosa.inc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
-
-constexpr inline const GpioInitialConfig InitialGpioConfigsIcosa[] = {
- { DeviceCode_RamCode3, Direction_Input, GpioValue_High },
- { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
- { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
- { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowGc, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
- { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
- { DeviceCode_DebugControllerDet, Direction_Input, GpioValue_Low },
- { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
- { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
- { DeviceCode_FanTach, Direction_Input, GpioValue_High },
- { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
- { DeviceCode_SdevCoaxSel1, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType0, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType1, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType2, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType3, Direction_Input, GpioValue_Low },
- { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
- { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
- { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
- { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_High },
- { DeviceCode_RecoveryKey, Direction_Input, GpioValue_Low },
- { DeviceCode_PowLcdBlEn, Direction_Output, GpioValue_Low },
- { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
- { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
- { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_High },
- { DeviceCode_SdCd, Direction_Input, GpioValue_High },
- { DeviceCode_SdevCoaxSel0, Direction_Input, GpioValue_Low },
- { DeviceCode_SdWp, Direction_Input, GpioValue_High },
- { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
- { DeviceCode_OtgFet1ForSdev, Direction_Output, GpioValue_Low },
- { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtconDetU, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
- { DeviceCode_ExtconChgU, Direction_Output, GpioValue_Low },
- { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
- { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
- { DeviceCode_Max77621GpuInt, Direction_Input, GpioValue_High },
- { DeviceCode_OtgFet2ForSdev, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtconDetS, Direction_Input, GpioValue_Low },
- { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
- { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
- { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
- { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
- { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
- { DeviceCode_PowLcdVddPEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowLcdVddNEn, Direction_Output, GpioValue_Low },
- { DeviceCode_RamCode2, Direction_Input, GpioValue_High },
- { DeviceCode_ExtconChgS, Direction_Output, GpioValue_Low },
- { DeviceCode_Vdd50BEn, Direction_Output, GpioValue_Low },
-};
-
-constexpr inline size_t NumInitialGpioConfigsIcosa = util::size(InitialGpioConfigsIcosa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_iowa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_iowa.inc
deleted file mode 100644
index 1b71bd7..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_config_iowa.inc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
-
-constexpr inline const GpioInitialConfig InitialGpioConfigsIowa[] = {
- { DeviceCode_RamCode3, Direction_Input, GpioValue_High },
- { DeviceCode_GameCardReset, Direction_Output, GpioValue_Low },
- { DeviceCode_CodecAlert, Direction_Input, GpioValue_Low },
- { DeviceCode_PowSdEn, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtConWakeS, Direction_Input, GpioValue_Low },
- { DeviceCode_GameCardCd, Direction_Input, GpioValue_High },
- { DeviceCode_DebugControllerDet, Direction_Input, GpioValue_Low },
- { DeviceCode_BattChgStatus, Direction_Input, GpioValue_Low },
- { DeviceCode_BattChgEnableN, Direction_Output, GpioValue_Low },
- { DeviceCode_FanTach, Direction_Input, GpioValue_Low },
- { DeviceCode_Vdd50AEn, Direction_Output, GpioValue_Low },
- { DeviceCode_SdevCoaxSel1, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType0, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType1, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType2, Direction_Input, GpioValue_Low },
- { DeviceCode_ProdType3, Direction_Input, GpioValue_Low },
- { DeviceCode_Vdd5V3En, Direction_Output, GpioValue_Low },
- { DeviceCode_TempAlert, Direction_Input, GpioValue_High },
- { DeviceCode_MotionInt, Direction_Input, GpioValue_Low },
- { DeviceCode_CodecHpDetIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_TpIrq, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonSleep2, Direction_Input, GpioValue_Low },
- { DeviceCode_ButtonVolUp, Direction_Input, GpioValue_High },
- { DeviceCode_ButtonVolDn, Direction_Input, GpioValue_High },
- { DeviceCode_BattMgicIrq, Direction_Input, GpioValue_Low },
- { DeviceCode_RecoveryKey, Direction_Input, GpioValue_Low },
- { DeviceCode_PowLcdBlEn, Direction_Output, GpioValue_Low },
- { DeviceCode_LcdReset, Direction_Output, GpioValue_Low },
- { DeviceCode_PdRstN, Direction_Output, GpioValue_Low },
- { DeviceCode_Bq24190Irq, Direction_Input, GpioValue_Low },
- { DeviceCode_SdCd, Direction_Input, GpioValue_High },
- { DeviceCode_SdevCoaxSel0, Direction_Input, GpioValue_Low },
- { DeviceCode_SdWp, Direction_Input, GpioValue_High },
- { DeviceCode_CodecLdoEnTemp, Direction_Output, GpioValue_Low },
- { DeviceCode_OtgFet1ForSdev, Direction_Output, GpioValue_Low },
- { DeviceCode_TpReset, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtconDetU, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio2, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio3, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio4, Direction_Input, GpioValue_Low },
- { DeviceCode_ExtconChgU, Direction_Output, GpioValue_Low },
- { DeviceCode_CradleIrq, Direction_Input, GpioValue_High },
- { DeviceCode_PdVconnEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowVcpuInt, Direction_Input, GpioValue_High },
- { DeviceCode_OtgFet2ForSdev, Direction_Output, GpioValue_Low },
- { DeviceCode_ExtconDetS, Direction_Input, GpioValue_Low },
- { DeviceCode_WifiRfDisable, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiReset, Direction_Output, GpioValue_Low },
- { DeviceCode_WifiWakeHost, Direction_Input, GpioValue_Low },
- { DeviceCode_ApWakeBt, Direction_Output, GpioValue_Low },
- { DeviceCode_BtRst, Direction_Output, GpioValue_Low },
- { DeviceCode_BtWakeAp, Direction_Input, GpioValue_Low },
- { DeviceCode_ExtConWakeU, Direction_Input, GpioValue_Low },
- { DeviceCode_BtGpio5, Direction_Output, GpioValue_Low },
- { DeviceCode_PowLcdVddPEn, Direction_Output, GpioValue_Low },
- { DeviceCode_PowLcdVddNEn, Direction_Output, GpioValue_Low },
- { DeviceCode_RamCode2, Direction_Input, GpioValue_High },
- { DeviceCode_ExtconChgS, Direction_Output, GpioValue_Low },
- { DeviceCode_Vdd50BEn, Direction_Output, GpioValue_Low },
-};
-
-constexpr inline size_t NumInitialGpioConfigsIowa = util::size(InitialGpioConfigsIowa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_aula.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_aula.inc
deleted file mode 100644
index d955382..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_aula.inc
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
-
-constexpr inline const WakePinConfig InitialWakePinConfigsAula[] = {
- { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart2Cts, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
- /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
- { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_RtcIrq, }, */
- { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_AlsProxInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_Utmip0, }, */
- /* { ams::wec::WakeEvent_Utmip1, }, */
- /* { ams::wec::WakeEvent_Utmip2, }, */
- /* { ams::wec::WakeEvent_Utmip3, }, */
- /* { ams::wec::WakeEvent_Uhsic, }, */
- /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
- { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
-};
-
-constexpr inline size_t NumInitialWakePinConfigsAula = util::size(InitialWakePinConfigsAula);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_calcio.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_calcio.inc
deleted file mode 100644
index 6cdd662..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_calcio.inc
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
-
-constexpr inline const WakePinConfig InitialWakePinConfigsCalcio[] = {
- { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ExtconDetS, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart2Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart3Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
- /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
- { ams::wec::WakeEvent_ExtconDetU, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_RtcIrq, }, */
- { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonSlideSw, false, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_AlsProxInt, }, */
- { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Bq24190Irq, false, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_Utmip0, }, */
- /* { ams::wec::WakeEvent_Utmip1, }, */
- /* { ams::wec::WakeEvent_Utmip2, }, */
- /* { ams::wec::WakeEvent_Utmip3, }, */
- /* { ams::wec::WakeEvent_Uhsic, }, */
- /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
- { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
-};
-
-constexpr inline size_t NumInitialWakePinConfigsCalcio = util::size(InitialWakePinConfigsCalcio);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_hoag.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_hoag.inc
deleted file mode 100644
index 177fcc5..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_hoag.inc
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
-
-constexpr inline const WakePinConfig InitialWakePinConfigsHoag[] = {
- { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_McuIrq, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart2Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
- /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
- { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_RtcIrq, }, */
- { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_AlsProxInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_Utmip0, }, */
- /* { ams::wec::WakeEvent_Utmip1, }, */
- /* { ams::wec::WakeEvent_Utmip2, }, */
- /* { ams::wec::WakeEvent_Utmip3, }, */
- /* { ams::wec::WakeEvent_Uhsic, }, */
- /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
- { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdGpio1, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
-};
-
-constexpr inline size_t NumInitialWakePinConfigsHoag = util::size(InitialWakePinConfigsHoag);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_icosa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_icosa.inc
deleted file mode 100644
index 19c40e6..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_icosa.inc
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
-
-constexpr inline const WakePinConfig InitialWakePinConfigsIcosa[] = {
- { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart2Cts, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
- /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
- { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_RtcIrq, }, */
- { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_AlsProxInt, }, */
- { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_Utmip0, }, */
- /* { ams::wec::WakeEvent_Utmip1, }, */
- /* { ams::wec::WakeEvent_Utmip2, }, */
- /* { ams::wec::WakeEvent_Utmip3, }, */
- /* { ams::wec::WakeEvent_Uhsic, }, */
- /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
- { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
-};
-
-constexpr inline size_t NumInitialWakePinConfigsIcosa = util::size(InitialWakePinConfigsIcosa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_iowa.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_iowa.inc
deleted file mode 100644
index ebd8016..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_initial_wake_pin_config_iowa.inc
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by wake_pin_gen.py, do not edit manually. */
-
-constexpr inline const WakePinConfig InitialWakePinConfigsIowa[] = {
- { ams::wec::WakeEvent_PexWakeN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortA6, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_QspiCsN, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Spi2Mosi, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ExtconDetS, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_McuIrq, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart2Cts, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart3Cts, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_WifiWakeAp, true, ams::wec::WakeEventLevel_High },
- /* { ams::wec::WakeEvent_AoTag2Pmc, }, */
- { ams::wec::WakeEvent_ExtconDetU, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_NfcInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen1I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen2I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CradleIrq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_GpioPortK6, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_RtcIrq, }, */
- { ams::wec::WakeEvent_Sdmmc1Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc2Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_HdmiCec, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Gen3I2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortL1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Clk_32kOut, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrI2cSda, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonPowerOn, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolUp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonVolDown, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ButtonSlideSw, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_ButtonHome, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_AlsProxInt, }, */
- { ams::wec::WakeEvent_TempAlert, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Bq24190Irq, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_SdCd, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ2, false, ams::wec::WakeEventLevel_Auto },
- /* { ams::wec::WakeEvent_Utmip0, }, */
- /* { ams::wec::WakeEvent_Utmip1, }, */
- /* { ams::wec::WakeEvent_Utmip2, }, */
- /* { ams::wec::WakeEvent_Utmip3, }, */
- /* { ams::wec::WakeEvent_Uhsic, }, */
- /* { ams::wec::WakeEvent_Wake2PmcXusbSystem, }, */
- { ams::wec::WakeEvent_Sdmmc3Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Sdmmc4Dat1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cScl, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_CamI2cSda, true, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_GpioPortZ5, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_DpHpd0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_PwrIntN, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_BtWakeAp, true, ams::wec::WakeEventLevel_Low },
- { ams::wec::WakeEvent_HdmiIntDpHpd, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn0, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_UsbVbusEn1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdRst, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdGpio1, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_LcdGpio2, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_Uart4Cts, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_ModemWakeAp, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_TouchInt, false, ams::wec::WakeEventLevel_Auto },
- { ams::wec::WakeEvent_MotionInt, false, ams::wec::WakeEventLevel_Auto },
-};
-
-constexpr inline size_t NumInitialWakePinConfigsIowa = util::size(InitialWakePinConfigsIowa);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_internal_pad_map_combination.inc b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_internal_pad_map_combination.inc
deleted file mode 100644
index a9ff372..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_internal_pad_map_combination.inc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by gpio_pad_gen.py, do not edit manually. */
-
-constexpr inline const PadMapCombination PadMapCombinationList[] = {
- { DeviceCode_CodecLdoEnTemp, InternalGpioPadNumber_Port_Z_4, ams::wec::WakeEvent_None },
- { DeviceCode_PowSdEn, InternalGpioPadNumber_Port_E_4, ams::wec::WakeEvent_None },
- { DeviceCode_BtRst, InternalGpioPadNumber_Port_H_4, ams::wec::WakeEvent_None },
- { DeviceCode_RamCode3, InternalGpioPadNumber_Port_BB_2, ams::wec::WakeEvent_None },
- { DeviceCode_GameCardReset, InternalGpioPadNumber_Port_BB_3, ams::wec::WakeEvent_None },
- { DeviceCode_CodecAlert, InternalGpioPadNumber_Port_BB_4, ams::wec::WakeEvent_None },
- { DeviceCode_PowGc, InternalGpioPadNumber_Port_E_5, ams::wec::WakeEvent_None },
- { DeviceCode_DebugControllerDet, InternalGpioPadNumber_Port_S_0, ams::wec::WakeEvent_None },
- { DeviceCode_BattChgStatus, InternalGpioPadNumber_Port_S_1, ams::wec::WakeEvent_None },
- { DeviceCode_BattChgEnableN, InternalGpioPadNumber_Port_S_6, ams::wec::WakeEvent_None },
- { DeviceCode_FanTach, InternalGpioPadNumber_Port_S_7, ams::wec::WakeEvent_None },
- { DeviceCode_Vdd50AEn, InternalGpioPadNumber_Port_A_5, ams::wec::WakeEvent_None },
- { DeviceCode_SdevCoaxSel1, InternalGpioPadNumber_Port_P_0, ams::wec::WakeEvent_None },
- { DeviceCode_ProdType0, InternalGpioPadNumber_Port_P_5, ams::wec::WakeEvent_None },
- { DeviceCode_ProdType1, InternalGpioPadNumber_Port_P_4, ams::wec::WakeEvent_None },
- { DeviceCode_ProdType2, InternalGpioPadNumber_Port_P_3, ams::wec::WakeEvent_None },
- { DeviceCode_ProdType3, InternalGpioPadNumber_Port_P_2, ams::wec::WakeEvent_None },
- { DeviceCode_TempAlert, InternalGpioPadNumber_Port_X_4, ams::wec::WakeEvent_None },
- { DeviceCode_CodecHpDetIrq, InternalGpioPadNumber_Port_V_6, ams::wec::WakeEvent_None },
- { DeviceCode_MotionInt, InternalGpioPadNumber_Port_X_2, ams::wec::WakeEvent_None },
- { DeviceCode_TpIrq, InternalGpioPadNumber_Port_X_1, ams::wec::WakeEvent_None },
- { DeviceCode_ButtonSleep2, InternalGpioPadNumber_Port_X_5, ams::wec::WakeEvent_None },
- { DeviceCode_ButtonVolUp, InternalGpioPadNumber_Port_X_6, ams::wec::WakeEvent_None },
- { DeviceCode_ButtonVolDn, InternalGpioPadNumber_Port_X_7, ams::wec::WakeEvent_None },
- { DeviceCode_RecoveryKey, InternalGpioPadNumber_Port_Y_1, ams::wec::WakeEvent_None },
- { DeviceCode_PowLcdBlEn, InternalGpioPadNumber_Port_V_1, ams::wec::WakeEvent_None },
- { DeviceCode_LcdReset, InternalGpioPadNumber_Port_V_2, ams::wec::WakeEvent_None },
- { DeviceCode_PdVconnEn, InternalGpioPadNumber_Port_K_5, ams::wec::WakeEvent_None },
- { DeviceCode_PdRstN, InternalGpioPadNumber_Port_V_5, ams::wec::WakeEvent_None },
- { DeviceCode_SdevCoaxSel0, InternalGpioPadNumber_Port_Z_2, ams::wec::WakeEvent_None },
- { DeviceCode_SdWp, InternalGpioPadNumber_Port_Z_3, ams::wec::WakeEvent_None },
- { DeviceCode_TpReset, InternalGpioPadNumber_Port_J_7, ams::wec::WakeEvent_None },
- { DeviceCode_BtGpio2, InternalGpioPadNumber_Port_K_0, ams::wec::WakeEvent_None },
- { DeviceCode_BtGpio3, InternalGpioPadNumber_Port_K_1, ams::wec::WakeEvent_None },
- { DeviceCode_BtGpio4, InternalGpioPadNumber_Port_K_2, ams::wec::WakeEvent_None },
- { DeviceCode_PowVcpuInt, InternalGpioPadNumber_Port_K_6, ams::wec::WakeEvent_None },
- { DeviceCode_Max77621GpuInt, InternalGpioPadNumber_Port_K_7, ams::wec::WakeEvent_None },
- { DeviceCode_ExtconChgU, InternalGpioPadNumber_Port_K_3, ams::wec::WakeEvent_None },
- { DeviceCode_ExtconChgS, InternalGpioPadNumber_Port_CC_3, ams::wec::WakeEvent_None },
- { DeviceCode_WifiRfDisable, InternalGpioPadNumber_Port_H_0, ams::wec::WakeEvent_None },
- { DeviceCode_WifiReset, InternalGpioPadNumber_Port_H_1, ams::wec::WakeEvent_None },
- { DeviceCode_ApWakeBt, InternalGpioPadNumber_Port_H_3, ams::wec::WakeEvent_None },
- { DeviceCode_BtGpio5, InternalGpioPadNumber_Port_H_7, ams::wec::WakeEvent_None },
- { DeviceCode_PowLcdVddPEn, InternalGpioPadNumber_Port_I_0, ams::wec::WakeEvent_None },
- { DeviceCode_PowLcdVddNEn, InternalGpioPadNumber_Port_I_1, ams::wec::WakeEvent_None },
- { DeviceCode_RamCode2, InternalGpioPadNumber_Port_CC_2, ams::wec::WakeEvent_None },
- { DeviceCode_Vdd50BEn, InternalGpioPadNumber_Port_CC_4, ams::wec::WakeEvent_None },
- { DeviceCode_OtgFet1ForSdev, InternalGpioPadNumber_Port_J_5, ams::wec::WakeEvent_None },
- { DeviceCode_OtgFet2ForSdev, InternalGpioPadNumber_Port_L_0, ams::wec::WakeEvent_None },
- { DeviceCode_ExtConWakeU, InternalGpioPadNumber_Port_H_6, ams::wec::WakeEvent_None },
- { DeviceCode_ExtConWakeS, InternalGpioPadNumber_Port_E_6, ams::wec::WakeEvent_None },
- { DeviceCode_ExtUart2Rts, InternalGpioPadNumber_Port_G_2, ams::wec::WakeEvent_None },
- { DeviceCode_ExtUart3Rts, InternalGpioPadNumber_Port_D_3, ams::wec::WakeEvent_None },
- { DeviceCode_Debug0, InternalGpioPadNumber_Port_E_0, ams::wec::WakeEvent_None },
- { DeviceCode_Debug1, InternalGpioPadNumber_Port_E_1, ams::wec::WakeEvent_None },
- { DeviceCode_Debug2, InternalGpioPadNumber_Port_E_2, ams::wec::WakeEvent_None },
- { DeviceCode_Debug3, InternalGpioPadNumber_Port_E_3, ams::wec::WakeEvent_None },
- { DeviceCode_NfcIrq, InternalGpioPadNumber_Port_J_4, ams::wec::WakeEvent_None },
- { DeviceCode_NfcRst, InternalGpioPadNumber_Port_K_7, ams::wec::WakeEvent_None },
- { DeviceCode_McuIrq, InternalGpioPadNumber_Port_E_7, ams::wec::WakeEvent_McuIrq },
- { DeviceCode_McuBoot, InternalGpioPadNumber_Port_T_0, ams::wec::WakeEvent_None },
- { DeviceCode_McuRst, InternalGpioPadNumber_Port_T_1, ams::wec::WakeEvent_None },
- { DeviceCode_Vdd5V3En, InternalGpioPadNumber_Port_X_3, ams::wec::WakeEvent_None },
- { DeviceCode_McuPor, InternalGpioPadNumber_Port_CC_5, ams::wec::WakeEvent_None },
- { DeviceCode_NfcEn, InternalGpioPadNumber_Port_J_6, ams::wec::WakeEvent_None },
- { DeviceCode_GpioPortC7, InternalGpioPadNumber_Port_C_7, ams::wec::WakeEvent_None },
- { DeviceCode_GpioPortD0, InternalGpioPadNumber_Port_D_0, ams::wec::WakeEvent_None },
- { DeviceCode_GpioPortC5, InternalGpioPadNumber_Port_C_5, ams::wec::WakeEvent_None },
- { DeviceCode_GpioPortC6, InternalGpioPadNumber_Port_C_6, ams::wec::WakeEvent_None },
- { DeviceCode_GpioPortY7, InternalGpioPadNumber_Port_Y_5, ams::wec::WakeEvent_None },
- { DeviceCode_Hdmi5VEn, InternalGpioPadNumber_Port_C_0, ams::wec::WakeEvent_None },
- { DeviceCode_UsbSwitchB1En, InternalGpioPadNumber_Port_C_1, ams::wec::WakeEvent_None },
- { DeviceCode_HdmiPdTrEn, InternalGpioPadNumber_Port_C_2, ams::wec::WakeEvent_None },
- { DeviceCode_UsbSwitchB1Oc, InternalGpioPadNumber_Port_CC_6, ams::wec::WakeEvent_None },
- { DeviceCode_HdmiHpd, InternalGpioPadNumber_Port_CC_1, ams::wec::WakeEvent_None },
- { DeviceCode_GpioPortF1, InternalGpioPadNumber_Port_F_1, ams::wec::WakeEvent_None },
- { DeviceCode_GpioPortH0, InternalGpioPadNumber_Port_H_0, ams::wec::WakeEvent_None },
- { DeviceCode_ExtconDetS, InternalGpioPadNumber_Port_E_6, ams::wec::WakeEvent_ExtconDetS },
- { DeviceCode_GameCardCd, InternalGpioPadNumber_Port_S_3, ams::wec::WakeEvent_CamI2cSda },
- { DeviceCode_BattMgicIrq, InternalGpioPadNumber_Port_Y_0, ams::wec::WakeEvent_ButtonSlideSw },
- { DeviceCode_Bq24190Irq, InternalGpioPadNumber_Port_Z_0, ams::wec::WakeEvent_Bq24190Irq },
- { DeviceCode_CradleIrq, InternalGpioPadNumber_Port_K_4, ams::wec::WakeEvent_CradleIrq },
- { DeviceCode_BtWakeAp, InternalGpioPadNumber_Port_H_5, ams::wec::WakeEvent_BtWakeAp },
- { DeviceCode_ExtconDetU, InternalGpioPadNumber_Port_H_6, ams::wec::WakeEvent_ExtconDetU },
- { DeviceCode_WifiWakeHost, InternalGpioPadNumber_Port_H_2, ams::wec::WakeEvent_WifiWakeAp },
- { DeviceCode_SdCd, InternalGpioPadNumber_Port_Z_1, ams::wec::WakeEvent_SdCd },
- { DeviceCode_ExtUart2Cts, InternalGpioPadNumber_Port_G_3, ams::wec::WakeEvent_Uart2Cts },
- { DeviceCode_ExtUart3Cts, InternalGpioPadNumber_Port_D_4, ams::wec::WakeEvent_Uart3Cts },
- { DeviceCode_LcdGpio1, InternalGpioPadNumber_Port_V_3, ams::wec::WakeEvent_LcdGpio1 },
- { DeviceCode_PmuIrq, InternalGpioPadNumber_None, ams::wec::WakeEvent_PwrIntN },
-};
-
-constexpr inline size_t PadMapCombinationListSize = util::size(PadMapCombinationList);
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_register_accessor.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_register_accessor.hpp
deleted file mode 100644
index c9b2f6e..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_register_accessor.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-#include "gpio_tegra_pad.hpp"
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- constexpr inline dd::PhysicalAddress GpioRegistersPhysicalAddress = 0x6000D000;
- constexpr inline size_t GpioRegistersSize = 4_KB;
-
- constexpr inline int GpioPerControllerBitWidth = 5;
- constexpr inline int GpioControllerBitWidth = 3;
-
- constexpr inline int PortPerControllerBitWidth = 2;
- constexpr inline int PortPerController = (1 << PortPerControllerBitWidth);
-
- constexpr inline int GpioPerPortBitWidth = 3;
- constexpr inline int GpioPerPort = (1 << GpioPerPortBitWidth);
-
- static_assert(PortPerControllerBitWidth + GpioPerPortBitWidth == GpioPerControllerBitWidth);
- static_assert(PortPerController * GpioPerPort == (1 << GpioPerControllerBitWidth));
-
- constexpr int ConvertInternalGpioPadNumberToController(InternalGpioPadNumber number) {
- return (number >> GpioPerControllerBitWidth);
- }
-
- constexpr int ConvertInternalGpioPadNumberToPort(InternalGpioPadNumber number) {
- return (number >> GpioControllerBitWidth);
- }
-
- constexpr InternalGpioPadNumber ConvertPortToInternalGpioPadNumber(int port) {
- return static_cast(port << GpioControllerBitWidth);
- }
-
- constexpr int ConvertInternalGpioPadNumberToBitIndex(InternalGpioPadNumber number) {
- return (number & (GpioPerPort - 1));
- }
-
- constexpr int ConvertPortNumberToOffset(int port_number) {
- return (port_number & (PortPerController - 1));
- }
-
- enum GpioController {
- GpioController_1 = 0,
- GpioController_2 = 1,
- GpioController_3 = 2,
- GpioController_4 = 3,
- GpioController_5 = 4,
- GpioController_6 = 5,
- GpioController_7 = 6,
- GpioController_8 = 7,
- GpioController_Count = 8,
- };
- static_assert(GpioController_Count == static_cast(1 << GpioControllerBitWidth));
-
- constexpr inline os::InterruptName InterruptNameTable[GpioController_Count] = {
- 64, /* GpioController_1 */
- 65, /* GpioController_2 */
- 66, /* GpioController_3 */
- 67, /* GpioController_4 */
- 87, /* GpioController_5 */
- 119, /* GpioController_6 */
- 121, /* GpioController_7 */
- 157, /* GpioController_8 */
- };
-
- enum InternalInterruptMode {
- InternalInterruptMode_LowLevel = 0x000000,
- InternalInterruptMode_HighLevel = 0x000001,
- InternalInterruptMode_RisingEdge = 0x000101,
- InternalInterruptMode_FallingEdge = 0x000100,
- InternalInterruptMode_AnyEdge = 0x010100,
-
- InternalInterruptMode_Mask = 0x010101,
- };
-
- enum GpioRegisterType {
- GpioRegisterType_GPIO_CNF = 0,
- GpioRegisterType_GPIO_OE = 1,
- GpioRegisterType_GPIO_OUT = 2,
- GpioRegisterType_GPIO_IN = 3,
- GpioRegisterType_GPIO_INT_STA = 4,
- GpioRegisterType_GPIO_INT_ENB = 5,
- GpioRegisterType_GPIO_INT_LVL = 6,
- GpioRegisterType_GPIO_INT_CLR = 7,
- GpioRegisterType_GPIO_DB_CTRL = 8,
- GpioRegisterType_GPIO_DB_CNT = 9,
- };
-
- constexpr inline uintptr_t MaskedWriteAddressOffset = 0x80;
- constexpr inline int MaskedWriteBitOffset = 8;
-
- constexpr inline uintptr_t GetGpioRegisterAddress(uintptr_t gpio_address, GpioRegisterType reg_type, InternalGpioPadNumber pad_number) {
- const auto controller = ConvertInternalGpioPadNumberToController(pad_number);
- const auto port = ConvertInternalGpioPadNumberToPort(pad_number);
- const auto offset = ConvertPortNumberToOffset(port);
-
- switch (reg_type) {
- default:
- return gpio_address + (0x100 * controller) + (0x10 * reg_type) + (0x4 * offset);
- case GpioRegisterType_GPIO_DB_CTRL:
- return gpio_address + (0x100 * controller) + (0x10 * GpioRegisterType_GPIO_IN) + (0x4 * offset);
- case GpioRegisterType_GPIO_DB_CNT:
- return gpio_address + (0x100 * controller) + MaskedWriteAddressOffset + (0x10 * GpioRegisterType_GPIO_INT_CLR) + (0x4 * offset);
- }
- }
-
- inline void SetMaskedBit(uintptr_t pad_address, int index, int value) {
- const uintptr_t mask_address = pad_address + MaskedWriteAddressOffset;
-
- reg::Write(mask_address, (1u << (MaskedWriteBitOffset + index)) | (static_cast(value) << index));
- }
-
- inline void SetMaskedBits(uintptr_t pad_address, unsigned int mask, unsigned int value) {
- const uintptr_t mask_address = pad_address + MaskedWriteAddressOffset;
-
- reg::Write(mask_address, (mask << MaskedWriteBitOffset) | (value));
- }
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_suspend_handler.cpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_suspend_handler.cpp
deleted file mode 100644
index a922b21..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_suspend_handler.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "gpio_suspend_handler.hpp"
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- void SuspendHandler::Initialize(uintptr_t gpio_vaddr) {
- /* Set our gpio virtual address. */
- this->gpio_virtual_address = gpio_vaddr;
-
- /* Ensure that we can use the wec library. */
- ams::wec::Initialize();
- }
-
- void SuspendHandler::SetValueForSleepState(TegraPad *pad, GpioValue value) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result SuspendHandler::IsWakeEventActive(bool *out, TegraPad *pad) const {
- /* TODO */
- AMS_ABORT();
- }
-
- Result SuspendHandler::SetWakeEventActiveFlagSetForDebug(TegraPad *pad, bool en) {
- /* TODO */
- AMS_ABORT();
- }
-
- void SuspendHandler::SetWakePinDebugMode(WakePinDebugMode mode) {
- /* TODO */
- AMS_ABORT();
- }
-
- void SuspendHandler::Suspend() {
- /* TODO */
- AMS_ABORT();
- }
-
- void SuspendHandler::SuspendLow() {
- /* TODO */
- AMS_ABORT();
- }
-
- void SuspendHandler::Resume() {
- /* TODO */
- AMS_ABORT();
- }
-
- void SuspendHandler::ResumeLow() {
- /* TODO */
- AMS_ABORT();
- }
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_suspend_handler.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_suspend_handler.hpp
deleted file mode 100644
index faaf59b..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_suspend_handler.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-#include "gpio_tegra_pad.hpp"
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- class SuspendHandler {
- NON_COPYABLE(SuspendHandler);
- NON_MOVEABLE(SuspendHandler);
- private:
- struct RegisterValues {
- u16 conf;
- u8 oe;
- u8 out;
- u8 int_enb;
- u32 int_lvl;
- u8 db_ctrl;
- u8 db_cnt;
-
- void Reset() {
- this->conf = 0;
- this->oe = 0;
- this->out = 0;
- this->int_enb = 0;
- this->int_lvl = 0;
- this->db_ctrl = 0;
- this->db_cnt = 0;
- }
- };
-
- struct ValuesForSleepState {
- u8 force_set;
- u8 out;
-
- void Reset() {
- this->force_set = 0;
- this->out = 0;
- }
- };
- private:
- ddsf::IDriver &driver;
- uintptr_t gpio_virtual_address;
- RegisterValues register_values[GpioPadPort_Count];
- ValuesForSleepState values_for_sleep_state[GpioPadPort_Count];
- private:
- uintptr_t GetGpioVirtualAddress() const {
- AMS_ASSERT(this->gpio_virtual_address != 0);
- return this->gpio_virtual_address;
- }
- public:
- explicit SuspendHandler(ddsf::IDriver *drv) : driver(*drv), gpio_virtual_address(0) {
- for (auto &rv : this->register_values) {
- rv.Reset();
- }
- for (auto &v : this->values_for_sleep_state) {
- v.Reset();
- }
- }
-
- void Initialize(uintptr_t gpio_vaddr);
-
- void SetValueForSleepState(TegraPad *pad, GpioValue value);
- Result IsWakeEventActive(bool *out, TegraPad *pad) const;
- Result SetWakeEventActiveFlagSetForDebug(TegraPad *pad, bool en);
- void SetWakePinDebugMode(WakePinDebugMode mode);
-
- void Suspend();
- void SuspendLow();
- void Resume();
- void ResumeLow();
- };
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_tegra_pad.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_tegra_pad.hpp
deleted file mode 100644
index 67c0939..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_tegra_pad.hpp
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- enum GpioPadPort {
- GpioPadPort_A = 0,
- GpioPadPort_B = 1,
- GpioPadPort_C = 2,
- GpioPadPort_D = 3,
- GpioPadPort_E = 4,
- GpioPadPort_F = 5,
- GpioPadPort_G = 6,
- GpioPadPort_H = 7,
- GpioPadPort_I = 8,
- GpioPadPort_J = 9,
- GpioPadPort_K = 10,
- GpioPadPort_L = 11,
- GpioPadPort_M = 12,
- GpioPadPort_N = 13,
- GpioPadPort_O = 14,
- GpioPadPort_P = 15,
- GpioPadPort_Q = 16,
- GpioPadPort_R = 17,
- GpioPadPort_S = 18,
- GpioPadPort_T = 19,
- GpioPadPort_U = 20,
- GpioPadPort_V = 21,
- GpioPadPort_W = 22,
- GpioPadPort_X = 23,
- GpioPadPort_Y = 24,
- GpioPadPort_Z = 25,
- GpioPadPort_AA = 26,
- GpioPadPort_BB = 27,
- GpioPadPort_CC = 28,
- GpioPadPort_DD = 29,
- GpioPadPort_EE = 30,
- GpioPadPort_FF = 31,
- GpioPadPort_Count = 32,
- };
-
- using InternalGpioPadNumber = int;
-
- constexpr unsigned int GetInternalGpioPadNumber(GpioPadPort port, unsigned int which) {
- AMS_ASSERT(which < 8);
-
- return (static_cast(port) * 8) + which;
- }
-
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_None = -1;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_0 = 0x00;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_1 = 0x01;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_2 = 0x02;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_3 = 0x03;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_4 = 0x04;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_5 = 0x05;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_6 = 0x06;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_A_7 = 0x07;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_0 = 0x08;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_1 = 0x09;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_2 = 0x0A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_3 = 0x0B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_4 = 0x0C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_5 = 0x0D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_6 = 0x0E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_B_7 = 0x0F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_0 = 0x10;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_1 = 0x11;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_2 = 0x12;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_3 = 0x13;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_4 = 0x14;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_5 = 0x15;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_6 = 0x16;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_C_7 = 0x17;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_0 = 0x18;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_1 = 0x19;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_2 = 0x1A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_3 = 0x1B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_4 = 0x1C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_5 = 0x1D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_6 = 0x1E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_D_7 = 0x1F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_0 = 0x20;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_1 = 0x21;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_2 = 0x22;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_3 = 0x23;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_4 = 0x24;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_5 = 0x25;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_6 = 0x26;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_E_7 = 0x27;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_0 = 0x28;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_1 = 0x29;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_2 = 0x2A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_3 = 0x2B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_4 = 0x2C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_5 = 0x2D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_6 = 0x2E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_F_7 = 0x2F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_0 = 0x30;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_1 = 0x31;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_2 = 0x32;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_3 = 0x33;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_4 = 0x34;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_5 = 0x35;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_6 = 0x36;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_G_7 = 0x37;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_0 = 0x38;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_1 = 0x39;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_2 = 0x3A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_3 = 0x3B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_4 = 0x3C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_5 = 0x3D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_6 = 0x3E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_H_7 = 0x3F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_0 = 0x40;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_1 = 0x41;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_2 = 0x42;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_3 = 0x43;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_4 = 0x44;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_5 = 0x45;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_6 = 0x46;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_I_7 = 0x47;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_0 = 0x48;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_1 = 0x49;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_2 = 0x4A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_3 = 0x4B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_4 = 0x4C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_5 = 0x4D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_6 = 0x4E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_J_7 = 0x4F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_0 = 0x50;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_1 = 0x51;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_2 = 0x52;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_3 = 0x53;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_4 = 0x54;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_5 = 0x55;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_6 = 0x56;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_K_7 = 0x57;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_0 = 0x58;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_1 = 0x59;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_2 = 0x5A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_3 = 0x5B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_4 = 0x5C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_5 = 0x5D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_6 = 0x5E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_L_7 = 0x5F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_0 = 0x60;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_1 = 0x61;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_2 = 0x62;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_3 = 0x63;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_4 = 0x64;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_5 = 0x65;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_6 = 0x66;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_M_7 = 0x67;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_0 = 0x68;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_1 = 0x69;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_2 = 0x6A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_3 = 0x6B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_4 = 0x6C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_5 = 0x6D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_6 = 0x6E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_N_7 = 0x6F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_0 = 0x70;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_1 = 0x71;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_2 = 0x72;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_3 = 0x73;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_4 = 0x74;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_5 = 0x75;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_6 = 0x76;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_O_7 = 0x77;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_0 = 0x78;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_1 = 0x79;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_2 = 0x7A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_3 = 0x7B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_4 = 0x7C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_5 = 0x7D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_6 = 0x7E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_P_7 = 0x7F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_0 = 0x80;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_1 = 0x81;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_2 = 0x82;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_3 = 0x83;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_4 = 0x84;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_5 = 0x85;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_6 = 0x86;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Q_7 = 0x87;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_0 = 0x88;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_1 = 0x89;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_2 = 0x8A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_3 = 0x8B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_4 = 0x8C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_5 = 0x8D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_6 = 0x8E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_R_7 = 0x8F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_0 = 0x90;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_1 = 0x91;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_2 = 0x92;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_3 = 0x93;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_4 = 0x94;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_5 = 0x95;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_6 = 0x96;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_S_7 = 0x97;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_0 = 0x98;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_1 = 0x99;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_2 = 0x9A;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_3 = 0x9B;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_4 = 0x9C;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_5 = 0x9D;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_6 = 0x9E;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_T_7 = 0x9F;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_0 = 0xA0;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_1 = 0xA1;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_2 = 0xA2;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_3 = 0xA3;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_4 = 0xA4;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_5 = 0xA5;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_6 = 0xA6;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_U_7 = 0xA7;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_0 = 0xA8;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_1 = 0xA9;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_2 = 0xAA;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_3 = 0xAB;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_4 = 0xAC;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_5 = 0xAD;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_6 = 0xAE;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_V_7 = 0xAF;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_0 = 0xB0;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_1 = 0xB1;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_2 = 0xB2;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_3 = 0xB3;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_4 = 0xB4;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_5 = 0xB5;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_6 = 0xB6;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_W_7 = 0xB7;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_0 = 0xB8;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_1 = 0xB9;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_2 = 0xBA;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_3 = 0xBB;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_4 = 0xBC;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_5 = 0xBD;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_6 = 0xBE;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_X_7 = 0xBF;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_0 = 0xC0;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_1 = 0xC1;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_2 = 0xC2;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_3 = 0xC3;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_4 = 0xC4;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_5 = 0xC5;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_6 = 0xC6;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Y_7 = 0xC7;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_0 = 0xC8;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_1 = 0xC9;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_2 = 0xCA;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_3 = 0xCB;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_4 = 0xCC;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_5 = 0xCD;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_6 = 0xCE;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_Z_7 = 0xCF;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_0 = 0xD0;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_1 = 0xD1;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_2 = 0xD2;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_3 = 0xD3;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_4 = 0xD4;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_5 = 0xD5;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_6 = 0xD6;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_AA_7 = 0xD7;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_0 = 0xD8;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_1 = 0xD9;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_2 = 0xDA;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_3 = 0xDB;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_4 = 0xDC;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_5 = 0xDD;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_6 = 0xDE;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_BB_7 = 0xDF;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_0 = 0xE0;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_1 = 0xE1;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_2 = 0xE2;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_3 = 0xE3;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_4 = 0xE4;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_5 = 0xE5;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_6 = 0xE6;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_CC_7 = 0xE7;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_0 = 0xE8;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_1 = 0xE9;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_2 = 0xEA;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_3 = 0xEB;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_4 = 0xEC;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_5 = 0xED;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_6 = 0xEE;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_DD_7 = 0xEF;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_0 = 0xF0;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_1 = 0xF1;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_2 = 0xF2;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_3 = 0xF3;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_4 = 0xF4;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_5 = 0xF5;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_6 = 0xF6;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_EE_7 = 0xF7;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_0 = 0xF8;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_1 = 0xF9;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_2 = 0xFA;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_3 = 0xFB;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_4 = 0xFC;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_5 = 0xFD;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_6 = 0xFE;
- constexpr inline InternalGpioPadNumber InternalGpioPadNumber_Port_FF_7 = 0xFF;
-
- struct PadMapCombination {
- DeviceCode device_code;
- InternalGpioPadNumber internal_number;
- wec::WakeEvent wake_event;
- };
-
- #include "gpio_internal_pad_map_combination.inc"
-
- struct PadInfo {
- wec::WakeEvent wake_event;
-
- constexpr PadInfo() : wake_event(wec::WakeEvent_None) { /* ... */ }
-
- constexpr explicit PadInfo(wec::WakeEvent we) : wake_event(we) { /* ... */ }
-
- constexpr bool operator ==(const PadInfo &rhs) const { return this->wake_event == rhs.wake_event; }
- constexpr bool operator !=(const PadInfo &rhs) const { return !(*this == rhs); }
- };
-
- struct PadStatus {
- bool is_wake_active;
- bool is_wake_active_debug;
-
- constexpr PadStatus() : is_wake_active(false), is_wake_active_debug(false) { /* ... */ }
- };
-
- class TegraPad : public ::ams::gpio::driver::Pad {
- AMS_DDSF_CASTABLE_TRAITS(ams::gpio::driver::board::nintendo_nx::impl::TegraPad, ::ams::gpio::driver::Pad);
- private:
- using Base = ::ams::gpio::driver::Pad;
- private:
- util::IntrusiveListNode interrupt_list_node;
- PadInfo info;
- PadStatus status;
- public:
- using InterruptListTraits = util::IntrusiveListMemberTraitsDeferredAssert<&TegraPad::interrupt_list_node>;
- using InterruptList = typename InterruptListTraits::ListType;
- friend class util::IntrusiveList>;
- public:
- TegraPad() : Pad(), interrupt_list_node(), info(), status() { /* ... */ }
-
- const PadInfo &GetInfo() const { return this->info; }
- PadStatus &GetStatus() { return this->status; }
-
- void SetParameters(int pad, const PadInfo &i) {
- Base::SetPadNumber(pad);
- this->info = info;
- }
-
- bool IsLinkedToInterruptBoundPadList() const {
- return this->interrupt_list_node.IsLinked();
- }
- };
-
-}
diff --git a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_wake_pin_config.hpp b/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_wake_pin_config.hpp
deleted file mode 100644
index 9b25143..0000000
--- a/libraries/libstratosphere/source/gpio/driver/board/nintendo_nx/impl/gpio_wake_pin_config.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-namespace ams::gpio::driver::board::nintendo_nx::impl {
-
- struct WakePinConfig {
- wec::WakeEvent wake_event;
- bool enable;
- wec::WakeEventLevel level;
- };
-
-}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/i2c_bus_device_map.inc b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/i2c_bus_device_map.inc
new file mode 100644
index 0000000..3017020
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/i2c_bus_device_map.inc
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by i2cgen.py, do not edit manually. */
+
+constexpr inline const I2cDeviceDefinition I2c1DeviceList[] = {
+ { DeviceCode_ClassicController, 0x52 },
+ { DeviceCode_Nct72, 0x4C },
+ { DeviceCode_Alc5639, 0x1C },
+ { DeviceCode_Bq24193, 0x6B },
+ { DeviceCode_Max17050, 0x36 },
+ { DeviceCode_Bm92t30mwv, 0x18 },
+};
+
+constexpr inline const I2cDeviceDefinition I2c2DeviceList[] = {
+ { DeviceCode_Ina226Vdd15v0Hb, 0x40 },
+ { DeviceCode_Ina226VsysCpuDs, 0x41 },
+ { DeviceCode_Ina226VsysGpuDs, 0x44 },
+ { DeviceCode_Ina226VsysDdrDs, 0x45 },
+ { DeviceCode_Ina226VsysAp, 0x46 },
+ { DeviceCode_Ina226VsysBlDs, 0x47 },
+ { DeviceCode_Bh1730, 0x29 },
+ { DeviceCode_Ina226VsysCore, 0x48 },
+ { DeviceCode_Ina226Soc1V8, 0x49 },
+ { DeviceCode_Ina226Lpddr1V8, 0x4A },
+ { DeviceCode_Ina226Reg1V32, 0x4B },
+ { DeviceCode_Ina226Vdd3V3Sys, 0x4D },
+ { DeviceCode_Ina226VddDdr0V6, 0x4E },
+ { DeviceCode_HoagNfcIc, 0x08 },
+};
+
+constexpr inline const I2cDeviceDefinition I2c3DeviceList[] = {
+ { DeviceCode_Ftm3bd56, 0x49 },
+};
+
+constexpr inline const I2cDeviceDefinition I2c4DeviceList[] = {
+ { DeviceCode_HdmiDdc, 0x50 },
+ { DeviceCode_HdmiScdc, 0x54 },
+ { DeviceCode_HdmiHdcp, 0x3A },
+};
+
+constexpr inline const I2cDeviceDefinition I2c5DeviceList[] = {
+ { DeviceCode_Max77620Rtc, 0x68 },
+ { DeviceCode_Max77620Pmic, 0x3C },
+ { DeviceCode_Max77621Cpu, 0x1B },
+ { DeviceCode_Max77621Gpu, 0x1C },
+ { DeviceCode_Fan53528, 0x52 },
+ { DeviceCode_Max77812_3, 0x31 },
+ { DeviceCode_Max77812_2, 0x33 },
+};
+
+constexpr inline const I2cBusDefinition I2cBusList[] = {
+ { DeviceCode_I2c1, 0x7000C000, 0x100, SpeedMode_Standard, 70, I2c1DeviceList, util::size(I2c1DeviceList) },
+ { DeviceCode_I2c2, 0x7000C400, 0x100, SpeedMode_Fast, 116, I2c2DeviceList, util::size(I2c2DeviceList) },
+ { DeviceCode_I2c3, 0x7000C500, 0x100, SpeedMode_Fast, 124, I2c3DeviceList, util::size(I2c3DeviceList) },
+ { DeviceCode_I2c4, 0x7000C700, 0x100, SpeedMode_Standard, 152, I2c4DeviceList, util::size(I2c4DeviceList) },
+ { DeviceCode_I2c5, 0x7000D000, 0x100, SpeedMode_Fast, 85, I2c5DeviceList, util::size(I2c5DeviceList) },
+};
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/i2c_driver_api.cpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/i2c_driver_api.cpp
new file mode 100644
index 0000000..bab1817
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/i2c_driver_api.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "impl/i2c_bus_manager.hpp"
+#include "impl/i2c_device_property_manager.hpp"
+
+namespace ams::i2c::driver::board::nintendo_nx {
+
+ namespace {
+
+ struct I2cDeviceDefinition {
+ DeviceCode device_code;
+ u8 slave_address;
+ };
+
+ struct I2cBusDefinition {
+ DeviceCode device_code;
+ dd::PhysicalAddress registers_phys_addr;
+ size_t registers_size;
+ SpeedMode speed_mode;
+ os::InterruptName interrupt_name;
+ const I2cDeviceDefinition *devices;
+ size_t num_devices;
+
+ constexpr bool IsPowerBus() const {
+ return this->device_code == DeviceCode_I2c5;
+ }
+ };
+
+ #include "i2c_bus_device_map.inc"
+
+ void CheckSpeedMode(SpeedMode speed_mode) {
+ switch (speed_mode) {
+ case SpeedMode_Standard: break;
+ case SpeedMode_Fast: break;
+ case SpeedMode_FastPlus: break;
+ case SpeedMode_HighSpeed: break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+ }
+
+ void Initialize(impl::I2cBusAccessorManager &bus_manager, impl::I2cDevicePropertyManager &device_manager) {
+ /* Create an accessor for each bus. */
+ for (const auto &bus_def : I2cBusList) {
+ /* Check that the speed mode is valid. */
+ CheckSpeedMode(bus_def.speed_mode);
+
+ /* Find the bus. */
+ auto *bus = bus_manager.Find([&bus_def](const auto &it) {
+ return it.GetRegistersPhysicalAddress() == bus_def.registers_phys_addr;
+ });
+
+ /* If the bus doesn't exist, create it. */
+ if (bus == nullptr) {
+ /* Allocate the bus. */
+ bus = bus_manager.Allocate();
+
+ /* Initialize the bus. */
+ bus->Initialize(bus_def.registers_phys_addr, bus_def.registers_size, bus_def.interrupt_name, bus_def.IsPowerBus(), bus_def.speed_mode);
+
+ /* Register the bus. */
+ i2c::driver::RegisterDriver(bus);
+ }
+
+ /* Set the bus's device code. */
+ bus->RegisterDeviceCode(bus_def.device_code);
+
+ /* Allocate and register the devices for the bus. */
+ for (size_t i = 0; i < bus_def.num_devices; ++i) {
+ /* Get the device definition. */
+ const auto &entry = bus_def.devices[i];
+
+ /* Allocate the device. */
+ I2cDeviceProperty *device = device_manager.Allocate(entry.slave_address, AddressingMode_SevenBit);
+
+ /* Register the device with our bus. */
+ bus->RegisterDevice(device);
+
+ /* Register the device code with our driver. */
+ R_ABORT_UNLESS(i2c::driver::RegisterDeviceCode(entry.device_code, device));
+ }
+ }
+ }
+
+ }
+
+ void Initialize() {
+ /* TODO: Should these be moved into getters? They're only used here, and they never destruct. */
+ static impl::I2cBusAccessorManager s_bus_accessor_manager(ddsf::GetMemoryResource());
+ static impl::I2cDevicePropertyManager s_device_manager(ddsf::GetMemoryResource());
+
+ return Initialize(s_bus_accessor_manager, s_device_manager);
+ }
+
+}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_accessor.cpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_accessor.cpp
new file mode 100644
index 0000000..5e8dff8
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_accessor.cpp
@@ -0,0 +1,771 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "i2c_bus_accessor.hpp"
+
+namespace ams::i2c::driver::board::nintendo_nx::impl {
+
+ namespace {
+
+ constexpr inline TimeSpan Timeout = TimeSpan::FromMilliSeconds(100);
+
+ #define IO_PACKET_BITS_MASK(NAME) REG_NAMED_BITS_MASK (_IMPL_IO_PACKET_, NAME)
+ #define IO_PACKET_BITS_VALUE(NAME, VALUE) REG_NAMED_BITS_VALUE (_IMPL_IO_PACKET_, NAME, VALUE)
+ #define IO_PACKET_BITS_ENUM(NAME, ENUM) REG_NAMED_BITS_ENUM (_IMPL_IO_PACKET_, NAME, ENUM)
+ #define IO_PACKET_BITS_ENUM_SEL(NAME, __COND__, TRUE_ENUM, FALSE_ENUM) REG_NAMED_BITS_ENUM_SEL(_IMPL_IO_PACKET_, NAME, __COND__, TRUE_ENUM, FALSE_ENUM)
+
+ #define DEFINE_IO_PACKET_REG(NAME, __OFFSET__, __WIDTH__) REG_DEFINE_NAMED_REG (_IMPL_IO_PACKET_, NAME, __OFFSET__, __WIDTH__)
+ #define DEFINE_IO_PACKET_REG_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE) REG_DEFINE_NAMED_BIT_ENUM (_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE)
+ #define DEFINE_IO_PACKET_REG_TWO_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE, TWO, THREE) REG_DEFINE_NAMED_TWO_BIT_ENUM (_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE, TWO, THREE)
+ #define DEFINE_IO_PACKET_REG_THREE_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN) REG_DEFINE_NAMED_THREE_BIT_ENUM(_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN)
+ #define DEFINE_IO_PACKET_REG_FOUR_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELVE, THIRTEEN, FOURTEEN, FIFTEEN) REG_DEFINE_NAMED_FOUR_BIT_ENUM (_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELVE, THIRTEEN, FOURTEEN, FIFTEEN)
+
+ DEFINE_IO_PACKET_REG_THREE_BIT_ENUM(HEADER_WORD0_PKT_TYPE, 0, REQUEST, RESPONSE, INTERRUPT, STOP, RSVD4, RSVD5, RSVD6, RSVD7);
+ DEFINE_IO_PACKET_REG_FOUR_BIT_ENUM(HEADER_WORD0_PROTOCOL, 4, RSVD0, I2C, RSVD2, RSVD3, RSVD4, RSVD5, RSVD6, RSVD7, RSVD8, RSVD9, RSVD10, RSVD11, RSVD12, RSVD13, RSVD14, RSVD15)
+ DEFINE_IO_PACKET_REG(HEADER_WORD0_CONTROLLER_ID, 12, 4);
+ DEFINE_IO_PACKET_REG(HEADER_WORD0_PKT_ID, 16, 8);
+ DEFINE_IO_PACKET_REG_TWO_BIT_ENUM(HEADER_WORD0_PROT_HDR_SZ, 28, 1_WORD, 2_WORD, 3_WORD, 4_WORD);
+
+ DEFINE_IO_PACKET_REG(HEADER_WORD1_PAYLOAD_SIZE, 0, 12);
+
+ DEFINE_IO_PACKET_REG(PROTOCOL_HEADER_SLAVE_ADDR, 0, 10);
+ DEFINE_IO_PACKET_REG(PROTOCOL_HEADER_HS_MASTER_ADDR, 12, 3);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_CONTINUE_XFER, 15, USE_REPEAT_START_TOP, CONTINUE);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_REPEAT_START_STOP, 16, STOP_CONDITION, REPEAT_START_CONDITION);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_IE, 17, DISABLE, ENABLE);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_ADDRESS_MODE, 18, SEVEN_BIT, TEN_BIT);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_READ_WRITE, 19, WRITE, READ);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_SEND_START_BYTE, 20, DISABLE, ENABLE);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_CONTINUE_ON_NACK, 21, DISABLE, ENABLE);
+ DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_HS_MODE, 22, DISABLE, ENABLE);
+
+ }
+
+ void I2cBusAccessor::Initialize(dd::PhysicalAddress reg_paddr, size_t reg_size, os::InterruptName intr, bool pb, SpeedMode sm) {
+ AMS_ASSERT(this->state == State::NotInitialized);
+
+ this->is_power_bus = pb;
+ this->speed_mode = sm;
+ this->interrupt_name = intr;
+ this->registers_phys_addr = reg_paddr;
+ this->registers_size = reg_size;
+ this->state = State::Initializing;
+ }
+
+ void I2cBusAccessor::RegisterDeviceCode(DeviceCode dc) {
+ AMS_ASSERT(this->state == State::Initializing);
+
+ this->device_code = dc;
+ }
+
+ void I2cBusAccessor::InitializeDriver() {
+ AMS_ASSERT(this->state == State::Initializing);
+
+ this->registers = reinterpret_cast(dd::QueryIoMapping(this->registers_phys_addr, this->registers_size));
+ AMS_ABORT_UNLESS(this->registers != nullptr);
+
+ this->state = State::Initialized;
+ }
+
+ void I2cBusAccessor::FinalizeDriver() {
+ AMS_ASSERT(this->state == State::Initialized);
+ this->state = State::Initializing;
+ }
+
+ Result I2cBusAccessor::InitializeDevice(I2cDeviceProperty *device) {
+ /* Check that the device is valid. */
+ AMS_ASSERT(device != nullptr);
+ AMS_ASSERT(this->state == State::Initialized);
+
+ /* Acquire exclusive access. */
+ std::scoped_lock lk(this->user_count_mutex);
+
+ /* Increment our user count -- if we're already open, we're done. */
+ AMS_ASSERT(this->user_count >= 0);
+ ++this->user_count;
+ R_SUCCEED_IF(this->user_count > 1);
+
+ /* Initialize our interrupt event. */
+ os::InitializeInterruptEvent(std::addressof(this->interrupt_event), this->interrupt_name, os::EventClearMode_ManualClear);
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+
+ /* If we're not power bus, perform power management init. */
+ if (!this->is_power_bus) {
+ /* Initialize regulator library. */
+ regulator::Initialize();
+
+ /* Try to open regulator session. */
+ R_TRY(this->TryOpenRegulatorSession());
+
+ /* If we have a regulator session, set voltage to 2.9V. */
+ if (this->has_regulator_session) {
+ /* NOTE: Nintendo does not check the result, here. */
+ regulator::SetVoltageValue(std::addressof(this->regulator_session), 2'900'000u);
+ }
+
+ /* Initialize clock/reset library. */
+ clkrst::Initialize();
+ }
+
+ /* Execute initial config. */
+ this->ExecuteInitialConfig();
+
+ /* If we have a regulator session, enable voltage. */
+ if (!this->is_power_bus && this->has_regulator_session) {
+ /* Check whether voltage was already enabled. */
+ const bool was_enabled = regulator::GetVoltageEnabled(std::addressof(this->regulator_session));
+
+ /* NOTE: Nintendo does not check the result of this call. */
+ regulator::SetVoltageEnabled(std::addressof(this->regulator_session), true);
+
+ /* If we enabled voltage, delay to give our enable time to take. */
+ if (!was_enabled) {
+ os::SleepThread(TimeSpan::FromMicroSeconds(560));
+ }
+ }
+
+ return ResultSuccess();
+ }
+
+ void I2cBusAccessor::FinalizeDevice(I2cDeviceProperty *device) {
+ /* Check that the device is valid. */
+ AMS_ASSERT(device != nullptr);
+ AMS_ASSERT(this->state == State::Initialized);
+
+ /* Acquire exclusive access. */
+ std::scoped_lock lk(this->user_count_mutex);
+
+ /* Increment our user count -- if we're not the last user, we're done. */
+ AMS_ASSERT(this->user_count > 0);
+ --this->user_count;
+ if (this->user_count > 0) {
+ return;
+ }
+
+ /* Finalize our interrupt event. */
+ os::FinalizeInterruptEvent(std::addressof(this->interrupt_event));
+
+ /* If we have a regulator session, disable voltage. */
+ if (this->has_regulator_session) {
+ /* NOTE: Nintendo does not check the result of this call. */
+ regulator::SetVoltageEnabled(std::addressof(this->regulator_session), false);
+ }
+
+ /* Finalize the clock/reset library. */
+ clkrst::Finalize();
+
+ /* If we have a regulator session, close it. */
+ if (this->has_regulator_session) {
+ regulator::CloseSession(std::addressof(this->regulator_session));
+ this->has_regulator_session = false;
+ }
+
+ /* Finalize the regulator library. */
+ regulator::Finalize();
+ }
+
+ Result I2cBusAccessor::Send(I2cDeviceProperty *device, const void *src, size_t src_size, TransactionOption option) {
+ /* Check pre-conditions. */
+ AMS_ASSERT(device != nullptr);
+ AMS_ASSERT(src != nullptr);
+ AMS_ASSERT(src_size > 0);
+
+ if (this->is_power_bus) {
+ AMS_ASSERT(this->state == State::Initialized || this->state == State::Suspended);
+ } else {
+ AMS_ASSERT(this->state == State::Initialized);
+ }
+
+ /* Send the data. */
+ return this->Send(static_cast(src), src_size, option, device->GetAddress(), device->GetAddressingMode());
+ }
+
+ Result I2cBusAccessor::Receive(void *dst, size_t dst_size, I2cDeviceProperty *device, TransactionOption option) {
+ /* Check pre-conditions. */
+ AMS_ASSERT(device != nullptr);
+ AMS_ASSERT(dst != nullptr);
+ AMS_ASSERT(dst_size > 0);
+
+ if (this->is_power_bus) {
+ AMS_ASSERT(this->state == State::Initialized || this->state == State::Suspended);
+ } else {
+ AMS_ASSERT(this->state == State::Initialized);
+ }
+
+ /* Send the data. */
+ return this->Receive(static_cast(dst), dst_size, option, device->GetAddress(), device->GetAddressingMode());
+ }
+
+ void I2cBusAccessor::SuspendBus() {
+ /* Check that state is valid. */
+ AMS_ASSERT(this->state == State::Initialized);
+
+ /* Acquire exclusive access. */
+ std::scoped_lock lk(this->user_count_mutex);
+
+ /* If we need to, disable clock/voltage appropriately. */
+ if (!this->is_power_bus && this->user_count > 0) {
+ /* Disable clock. */
+ {
+ /* Open a clkrst session. */
+ clkrst::ClkRstSession clkrst_session;
+ R_ABORT_UNLESS(clkrst::OpenSession(std::addressof(clkrst_session), this->device_code));
+ ON_SCOPE_EXIT { clkrst::CloseSession(std::addressof(clkrst_session)); };
+
+ /* Set clock disabled for the session. */
+ clkrst::SetClockDisabled(std::addressof(clkrst_session));
+ }
+
+ /* Disable voltage. */
+ if (this->has_regulator_session) {
+ regulator::SetVoltageEnabled(std::addressof(this->regulator_session), false);
+ }
+ }
+
+ /* Update state. */
+ this->state = State::Suspended;
+ }
+
+ void I2cBusAccessor::SuspendPowerBus() {
+ /* Check that state is valid. */
+ AMS_ASSERT(this->state == State::Suspended);
+
+ /* Acquire exclusive access. */
+ std::scoped_lock lk(this->user_count_mutex);
+
+ /* If we need to, disable clock/voltage appropriately. */
+ if (this->is_power_bus && this->user_count > 0) {
+ /* Nothing should actually be done here. */
+ }
+
+ /* Update state. */
+ this->state = State::PowerBusSuspended;
+ }
+
+ void I2cBusAccessor::ResumeBus() {
+ /* Check that state is valid. */
+ AMS_ASSERT(this->state == State::Suspended);
+
+ /* Acquire exclusive access. */
+ std::scoped_lock lk(this->user_count_mutex);
+
+ /* If we need to, enable clock/voltage appropriately. */
+ if (!this->is_power_bus && this->user_count > 0) {
+ /* Enable voltage. */
+ if (this->has_regulator_session) {
+ /* Check whether voltage was already enabled. */
+ const bool was_enabled = regulator::GetVoltageEnabled(std::addressof(this->regulator_session));
+
+ /* NOTE: Nintendo does not check the result of this call. */
+ regulator::SetVoltageEnabled(std::addressof(this->regulator_session), true);
+
+ /* If we enabled voltage, delay to give our enable time to take. */
+ if (!was_enabled) {
+ os::SleepThread(TimeSpan::FromMicroSeconds(560));
+ }
+ }
+
+ /* Execute initial config, which will enable clock as relevant. */
+ this->ExecuteInitialConfig();
+ }
+
+ /* Update state. */
+ this->state = State::Initialized;
+ }
+
+ void I2cBusAccessor::ResumePowerBus() {
+ /* Check that state is valid. */
+ AMS_ASSERT(this->state == State::PowerBusSuspended);
+
+ /* Acquire exclusive access. */
+ std::scoped_lock lk(this->user_count_mutex);
+
+ /* If we need to, enable clock/voltage appropriately. */
+ if (this->is_power_bus && this->user_count > 0) {
+ /* Execute initial config, which will enable clock as relevant. */
+ this->ExecuteInitialConfig();
+ }
+
+ /* Update state. */
+ this->state = State::Suspended;
+ }
+
+ Result I2cBusAccessor::TryOpenRegulatorSession() {
+ /* Ensure we track the session. */
+ this->has_regulator_session = true;
+ auto s_guard = SCOPE_GUARD { this->has_regulator_session = false; };
+
+ /* Try to open the session. */
+ R_TRY_CATCH(regulator::OpenSession(std::addressof(this->regulator_session), this->device_code)) {
+ R_CATCH(ddsf::ResultDeviceCodeNotFound) {
+ /* It's okay if the device isn't found, but we don't have a session if so. */
+ this->has_regulator_session = false;
+ }
+ } R_END_TRY_CATCH;
+
+ /* We opened (or not). */
+ s_guard.Cancel();
+ return ResultSuccess();
+ }
+
+ void I2cBusAccessor::ExecuteInitialConfig() {
+ /* Lock exclusive access to registers. */
+ std::scoped_lock lk(this->register_mutex);
+
+ /* Reset the controller. */
+ this->ResetController();
+
+ /* Set clock registers. */
+ this->SetClockRegisters(this->speed_mode);
+
+ /* Set packet mode registers. */
+ this->SetPacketModeRegisters();
+
+ /* Flush fifos. */
+ this->FlushFifos();
+ }
+
+ Result I2cBusAccessor::Send(const u8 *src, size_t src_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode) {
+ /* Acquire exclusive access to the registers. */
+ std::scoped_lock lk(this->register_mutex);
+
+ /* Configure interrupt mask, clear interrupt status. */
+ reg::Write(this->registers->interrupt_mask_register, I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_TFIFO_DATA_REQ_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_ARB_LOST_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_NOACK_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_PACKET_XFER_COMPLETE_INT_EN, ENABLE));
+
+ reg::Write(this->registers->interrupt_status_register, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ARB_LOST, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_NOACK, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_RFIFO_UNF, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_TFIFO_OVF, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_PACKET_XFER_COMPLETE, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ALL_PACKETS_XFER_COMPLETE, SET));
+
+ /* Write the header. */
+ this->WriteHeader(Xfer_Write, src_size, option, slave_address, addressing_mode);
+
+ /* Setup tracking variables for the data. */
+ const u8 *cur = src;
+ size_t remaining = src_size;
+
+ while (true) {
+ /* Get the number of empty bytes in the fifo status. */
+ const u32 empty = reg::GetValue(this->registers->fifo_status, I2C_REG_BITS_MASK(FIFO_STATUS_TX_FIFO_EMPTY_CNT));
+
+ /* Write up to (empty) bytes to the fifo. */
+ for (u32 i = 0; remaining > 0 && i < empty; ++i) {
+ /* Build the data word to send. */
+ const size_t cur_bytes = std::min(remaining, sizeof(u32));
+
+ u32 word = 0;
+ for (size_t j = 0; j < cur_bytes; ++j) {
+ word |= cur[j] << (BITSIZEOF(u8) * j);
+ }
+
+ /* Write the data word. */
+ reg::Write(this->registers->tx_packet_fifo, word);
+
+ /* Advance. */
+ cur += cur_bytes;
+ remaining -= cur_bytes;
+ }
+
+ /* If we're done, break. */
+ if (remaining == 0) {
+ break;
+ }
+
+ /* Wait for our current data to send. */
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ if (!os::TimedWaitInterruptEvent(std::addressof(this->interrupt_event), Timeout)) {
+ /* We timed out. */
+ this->HandleTransactionError(i2c::ResultBusBusy());
+
+ this->DisableInterruptMask();
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ return i2c::ResultTimeout();
+ }
+
+ /* Check and handle any errors. */
+ R_TRY(this->CheckAndHandleError());
+ }
+
+ /* Configure interrupt mask to not care about tfifo data req. */
+ reg::Write(this->registers->interrupt_mask_register, I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_ARB_LOST_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_NOACK_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_PACKET_XFER_COMPLETE_INT_EN, ENABLE));
+
+ /* Wait for the packet transfer to complete. */
+ while (true) {
+ /* Check and handle any errors. */
+ R_TRY(this->CheckAndHandleError());
+
+ /* Check if packet transfer is done. */
+ if (reg::HasValue(this->registers->interrupt_status_register, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_PACKET_XFER_COMPLETE, SET))) {
+ break;
+ }
+
+ /* Wait for our the packet to transfer. */
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ if (!os::TimedWaitInterruptEvent(std::addressof(this->interrupt_event), Timeout)) {
+ /* We timed out. */
+ this->HandleTransactionError(i2c::ResultBusBusy());
+
+ this->DisableInterruptMask();
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ return i2c::ResultTimeout();
+ }
+ }
+
+ /* Check and handle any errors. */
+ R_TRY(this->CheckAndHandleError());
+
+ /* We're done. */
+ this->DisableInterruptMask();
+ return ResultSuccess();
+ }
+
+ Result I2cBusAccessor::Receive(u8 *dst, size_t dst_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode) {
+ /* Acquire exclusive access to the registers. */
+ std::scoped_lock lk(this->register_mutex);
+
+ /* Configure interrupt mask, clear interrupt status. */
+ reg::Write(this->registers->interrupt_mask_register, I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_RFIFO_DATA_REQ_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_ARB_LOST_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_NOACK_INT_EN, ENABLE),
+ I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_PACKET_XFER_COMPLETE_INT_EN, ENABLE));
+
+ reg::Write(this->registers->interrupt_status_register, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ARB_LOST, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_NOACK, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_RFIFO_UNF, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_TFIFO_OVF, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_PACKET_XFER_COMPLETE, SET),
+ I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ALL_PACKETS_XFER_COMPLETE, SET));
+
+ /* Write the header. */
+ this->WriteHeader(Xfer_Read, dst_size, option, slave_address, addressing_mode);
+
+ /* Setup tracking variables for the data. */
+ u8 *cur = dst;
+ size_t remaining = dst_size;
+
+ while (remaining > 0) {
+ /* Wait for data to come in. */
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ if (!os::TimedWaitInterruptEvent(std::addressof(this->interrupt_event), Timeout)) {
+ /* We timed out. */
+ this->HandleTransactionError(i2c::ResultBusBusy());
+
+ this->DisableInterruptMask();
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ return i2c::ResultTimeout();
+ }
+
+ /* Check and handle any errors. */
+ R_TRY(this->CheckAndHandleError());
+
+ /* Get the number of full bytes in the fifo status. */
+ const u32 full = reg::GetValue(this->registers->fifo_status, I2C_REG_BITS_MASK(FIFO_STATUS_RX_FIFO_FULL_CNT));
+
+ /* Determine how many words we can read. */
+ const size_t cur_words = std::min(util::DivideUp(remaining, sizeof(u32)), static_cast(full));
+
+ /* Read the correct number of words from the fifo. */
+ for (size_t i = 0; i < cur_words; ++i) {
+ /* Read the word from the fifo. */
+ const u32 word = reg::Read(this->registers->rx_fifo);
+
+ /* Copy bytes from the word. */
+ const size_t cur_bytes = std::min(remaining, sizeof(u32));
+ for (size_t j = 0; j < cur_bytes; ++j) {
+ cur[j] = (word >> (BITSIZEOF(u8) * j)) & 0xFF;
+ }
+
+ /* Advance. */
+ cur += cur_bytes;
+ remaining -= cur_bytes;
+ }
+ }
+
+ /* We're done. */
+ return ResultSuccess();
+ }
+
+ void I2cBusAccessor::WriteHeader(Xfer xfer, size_t size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode) {
+ /* Parse interesting values from our arguments. */
+ const bool is_read = xfer == Xfer_Read;
+ const bool is_7_bit = addressing_mode == AddressingMode_SevenBit;
+ const bool is_stop = (option & TransactionOption_StopCondition) != 0;
+ const bool is_hs = this->speed_mode == SpeedMode_HighSpeed;
+ const u32 slave_addr = ((static_cast(slave_address) & 0x7F) << 1) | (is_read ? 1 : 0);
+
+ /* Flush fifos. */
+ this->FlushFifos();
+
+ /* Enqueue the first header word. */
+ reg::Write(this->registers->tx_packet_fifo, IO_PACKET_BITS_ENUM (HEADER_WORD0_PROT_HDR_SZ, 1_WORD),
+ IO_PACKET_BITS_VALUE(HEADER_WORD0_PKT_ID, 0),
+ IO_PACKET_BITS_VALUE(HEADER_WORD0_CONTROLLER_ID, 0),
+ IO_PACKET_BITS_ENUM (HEADER_WORD0_PROTOCOL, I2C),
+ IO_PACKET_BITS_ENUM (HEADER_WORD0_PKT_TYPE, REQUEST));
+
+ /* Enqueue the second header word. */
+ reg::Write(this->registers->tx_packet_fifo, IO_PACKET_BITS_VALUE(HEADER_WORD1_PAYLOAD_SIZE, static_cast(size - 1)));
+
+ /* Enqueue the protocol header word. */
+ reg::Write(this->registers->tx_packet_fifo, IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_HS_MODE, is_hs, ENABLE, DISABLE),
+ IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_CONTINUE_ON_NACK, DISABLE),
+ IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_SEND_START_BYTE, DISABLE),
+ IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_READ_WRITE, is_read, READ, WRITE),
+ IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_ADDRESS_MODE, is_7_bit, SEVEN_BIT, TEN_BIT),
+ IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_IE, ENABLE),
+ IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_REPEAT_START_STOP, is_stop, STOP_CONDITION, REPEAT_START_CONDITION),
+ IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_CONTINUE_XFER, USE_REPEAT_START_TOP),
+ IO_PACKET_BITS_VALUE (PROTOCOL_HEADER_HS_MASTER_ADDR, 0),
+ IO_PACKET_BITS_VALUE (PROTOCOL_HEADER_SLAVE_ADDR, slave_addr));
+ }
+
+ void I2cBusAccessor::ResetController() const {
+ /* Reset the controller. */
+ if (!this->is_power_bus) {
+ /* Open a clkrst session. */
+ clkrst::ClkRstSession clkrst_session;
+ R_ABORT_UNLESS(clkrst::OpenSession(std::addressof(clkrst_session), this->device_code));
+ ON_SCOPE_EXIT { clkrst::CloseSession(std::addressof(clkrst_session)); };
+
+ /* Reset the controller, setting clock rate to 408 MHz / 5 (to account for clock divisor). */
+ /* NOTE: Nintendo does not check result for any of these calls. */
+ clkrst::SetResetAsserted(std::addressof(clkrst_session));
+ clkrst::SetClockRate(std::addressof(clkrst_session), 408'000'000 / (4 + 1));
+ clkrst::SetResetDeasserted(std::addressof(clkrst_session));
+ }
+ }
+
+ void I2cBusAccessor::ClearBus() const {
+ /* Try to clear the bus up to three times. */
+ constexpr int MaxRetryCount = 3;
+ constexpr int BusyLoopMicroSeconds = 1000;
+
+ int try_count = 0;
+ bool need_retry;
+ do {
+ /* Update trackers. */
+ ++try_count;
+ need_retry = false;
+
+ /* Reset the controller. */
+ this->ResetController();
+
+ /* Configure the sclk threshold for bus clear config. */
+ reg::Write(this->registers->bus_clear_config, I2C_REG_BITS_VALUE(BUS_CLEAR_CONFIG_BC_SCLK_THRESHOLD, 9));
+
+ /* Set stop cond and terminate in bus clear config. */
+ reg::ReadWrite(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_STOP_COND, STOP));
+ reg::ReadWrite(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_TERMINATE, IMMEDIATE));
+
+ /* Set master config load, busy loop up to 1ms for it to take. */
+ reg::ReadWrite(this->registers->config_load, I2C_REG_BITS_ENUM(CONFIG_LOAD_MSTR_CONFIG_LOAD, ENABLE));
+
+ const os::Tick start_tick_a = os::GetSystemTick();
+ while (reg::HasValue(this->registers->config_load, I2C_REG_BITS_ENUM(CONFIG_LOAD_MSTR_CONFIG_LOAD, ENABLE))) {
+ if ((os::GetSystemTick() - start_tick_a).ToTimeSpan().GetMicroSeconds() > BusyLoopMicroSeconds) {
+ need_retry = true;
+ break;
+ }
+ }
+
+ if (need_retry) {
+ continue;
+ }
+
+ /* Set bus clear enable, wait up to 1ms for it to take. */
+ reg::ReadWrite(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_ENABLE, ENABLE));
+
+ const os::Tick start_tick_b = os::GetSystemTick();
+ while (reg::HasValue(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_ENABLE, ENABLE))) {
+ if ((os::GetSystemTick() - start_tick_b).ToTimeSpan().GetMicroSeconds() > BusyLoopMicroSeconds) {
+ need_retry = true;
+ break;
+ }
+ }
+
+ if (need_retry) {
+ continue;
+ }
+
+ /* Wait up to 1ms for the bus clear to complete. */
+ const os::Tick start_tick_c = os::GetSystemTick();
+ while (reg::HasValue(this->registers->bus_clear_status, I2C_REG_BITS_ENUM(BUS_CLEAR_STATUS_BC_STATUS, NOT_CLEARED))) {
+ if ((os::GetSystemTick() - start_tick_c).ToTimeSpan().GetMicroSeconds() > BusyLoopMicroSeconds) {
+ need_retry = true;
+ break;
+ }
+ }
+
+ if (need_retry) {
+ continue;
+ }
+ } while (try_count < MaxRetryCount && need_retry);
+ }
+
+ void I2cBusAccessor::SetClockRegisters(SpeedMode speed_mode) {
+ /* Determine parameters for the speed mode. */
+ u32 t_high, t_low, clk_div, debounce, src_div;
+ bool high_speed = false;
+
+ if (this->is_power_bus) {
+ t_high = 0x02;
+ t_low = 0x04;
+ clk_div = 0x05;
+ debounce = 0x02;
+ src_div = 0; /* unused */
+ } else {
+ switch (speed_mode) {
+ case SpeedMode_Standard:
+ t_high = 0x02;
+ t_low = 0x04;
+ clk_div = 0x19;
+ debounce = 0x02;
+ src_div = 0x13;
+ break;
+ case SpeedMode_Fast:
+ t_high = 0x02;
+ t_low = 0x04;
+ clk_div = 0x19;
+ debounce = 0x02;
+ src_div = 0x04;
+ break;
+ case SpeedMode_FastPlus:
+ t_high = 0x02;
+ t_low = 0x04;
+ clk_div = 0x10;
+ debounce = 0x00;
+ src_div = 0x02;
+ break;
+ case SpeedMode_HighSpeed:
+ t_high = 0x03;
+ t_low = 0x08;
+ clk_div = 0x02;
+ debounce = 0x00;
+ src_div = 0x02;
+ high_speed = true;
+ break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+ }
+
+ /* Write the clock divisors. */
+ if (high_speed) {
+ reg::Write(this->registers->hs_interface_timing_0, I2C_REG_BITS_VALUE(HS_INTERFACE_TIMING_0_HS_THIGH, t_high),
+ I2C_REG_BITS_VALUE(HS_INTERFACE_TIMING_0_HS_TLOW, t_low));
+
+ reg::Write(this->registers->clk_divisor_register, I2C_REG_BITS_VALUE(CLK_DIVISOR_REGISTER_HSMODE, clk_div));
+ } else {
+ reg::Write(this->registers->interface_timing_0, I2C_REG_BITS_VALUE(INTERFACE_TIMING_0_THIGH, t_high),
+ I2C_REG_BITS_VALUE(INTERFACE_TIMING_0_TLOW, t_low));
+
+ reg::Write(this->registers->clk_divisor_register, I2C_REG_BITS_VALUE(CLK_DIVISOR_REGISTER_STD_FAST_MODE, clk_div));
+ }
+
+ /* Configure debounce. */
+ reg::Write(this->registers->cnfg, I2C_REG_BITS_VALUE(I2C_CNFG_DEBOUNCE_CNT, debounce));
+ reg::Read(this->registers->cnfg);
+
+ /* Set the clock rate, if we should. */
+ if (!this->is_power_bus) {
+ /* Open a clkrst session. */
+ clkrst::ClkRstSession clkrst_session;
+ R_ABORT_UNLESS(clkrst::OpenSession(std::addressof(clkrst_session), this->device_code));
+ ON_SCOPE_EXIT { clkrst::CloseSession(std::addressof(clkrst_session)); };
+
+ /* Reset the controller, setting clock rate to 408 MHz / (src_div + 1). */
+ /* NOTE: Nintendo does not check result for any of these calls. */
+ clkrst::SetResetAsserted(std::addressof(clkrst_session));
+ clkrst::SetClockRate(std::addressof(clkrst_session), 408'000'000 / (src_div + 1));
+ clkrst::SetResetDeasserted(std::addressof(clkrst_session));
+ }
+ }
+
+ void I2cBusAccessor::SetPacketModeRegisters() {
+ /* Set packet mode enable. */
+ reg::ReadWrite(this->registers->cnfg, I2C_REG_BITS_ENUM(I2C_CNFG_PACKET_MODE_EN, GO));
+
+ /* Set master config load. */
+ reg::ReadWrite(this->registers->config_load, I2C_REG_BITS_ENUM(CONFIG_LOAD_MSTR_CONFIG_LOAD, ENABLE));
+
+ /* Set tx/fifo triggers to default (maximum values). */
+ reg::Write(this->registers->fifo_control, I2C_REG_BITS_VALUE(FIFO_CONTROL_RX_FIFO_TRIG, 7),
+ I2C_REG_BITS_VALUE(FIFO_CONTROL_TX_FIFO_TRIG, 7));
+ }
+
+ Result I2cBusAccessor::FlushFifos() {
+ /* Flush the fifo. */
+ reg::Write(this->registers->fifo_control, I2C_REG_BITS_VALUE(FIFO_CONTROL_RX_FIFO_TRIG, 7),
+ I2C_REG_BITS_VALUE(FIFO_CONTROL_TX_FIFO_TRIG, 7),
+ I2C_REG_BITS_ENUM (FIFO_CONTROL_RX_FIFO_FLUSH, SET),
+ I2C_REG_BITS_ENUM (FIFO_CONTROL_TX_FIFO_FLUSH, SET));
+
+ /* Wait up to 5 ms for the flush to complete. */
+ int count = 0;
+ while (!reg::HasValue(this->registers->fifo_control, I2C_REG_BITS_ENUM(FIFO_CONTROL_FIFO_FLUSH, RX_UNSET_TX_UNSET))) {
+ R_UNLESS((++count < 5), i2c::ResultBusBusy());
+ os::SleepThread(TimeSpan::FromMilliSeconds(1));
+ }
+
+ return ResultSuccess();
+ }
+
+ Result I2cBusAccessor::GetTransactionResult() const {
+ /* Get packet status/interrupt status. */
+ volatile u32 packet_status = reg::Read(this->registers->packet_transfer_status);
+ volatile u32 interrupt_status = reg::Read(this->registers->interrupt_status_register);
+
+ /* Check for ack. */
+ R_UNLESS(reg::HasValue(packet_status, I2C_REG_BITS_ENUM(PACKET_TRANSFER_STATUS_NOACK_FOR_DATA, UNSET)), i2c::ResultNoAck());
+ R_UNLESS(reg::HasValue(packet_status, I2C_REG_BITS_ENUM(PACKET_TRANSFER_STATUS_NOACK_FOR_ADDR, UNSET)), i2c::ResultNoAck());
+ R_UNLESS(reg::HasValue(interrupt_status, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_NOACK, UNSET)), i2c::ResultNoAck());
+
+ /* If we lost arbitration, we'll need to clear the bus. */
+ auto clear_guard = SCOPE_GUARD { this->ClearBus(); };
+
+ /* Check for arb lost. */
+ R_UNLESS(reg::HasValue(packet_status, I2C_REG_BITS_ENUM(PACKET_TRANSFER_STATUS_ARB_LOST, UNSET)), i2c::ResultBusBusy());
+ R_UNLESS(reg::HasValue(interrupt_status, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ARB_LOST, UNSET)), i2c::ResultBusBusy());
+
+ clear_guard.Cancel();
+ return ResultSuccess();
+ }
+
+ void I2cBusAccessor::HandleTransactionError(Result result) {
+ R_TRY_CATCH(result) {
+ R_CATCH(i2c::ResultNoAck, i2c::ResultBusBusy) {
+ /* Reset the controller. */
+ this->ResetController();
+
+ /* Set clock registers. */
+ this->SetClockRegisters(this->speed_mode);
+
+ /* Set packet mode registers. */
+ this->SetPacketModeRegisters();
+
+ /* Flush fifos. */
+ this->FlushFifos();
+ }
+ } R_END_TRY_CATCH_WITH_ABORT_UNLESS;
+ }
+
+}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_accessor.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_accessor.hpp
new file mode 100644
index 0000000..8691dba
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_accessor.hpp
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include "i2c_i2c_registers.hpp"
+
+namespace ams::i2c::driver::board::nintendo_nx::impl {
+
+ class I2cBusAccessor : public ::ams::i2c::driver::II2cDriver {
+ NON_COPYABLE(I2cBusAccessor);
+ NON_MOVEABLE(I2cBusAccessor);
+ AMS_DDSF_CASTABLE_TRAITS(ams::i2c::driver::board::nintendo_nx::impl::I2cBusAccessor, ::ams::i2c::driver::II2cDriver);
+ private:
+ enum class State {
+ NotInitialized = 0,
+ Initializing = 1,
+ Initialized = 2,
+ Suspended = 3,
+ PowerBusSuspended = 4,
+ };
+
+ enum Xfer {
+ Xfer_Write = 0,
+ Xfer_Read = 1,
+ };
+ private:
+ volatile I2cRegisters *registers;
+ SpeedMode speed_mode;
+ os::InterruptEventType interrupt_event;
+ int user_count;
+ os::SdkMutex user_count_mutex;
+ os::SdkMutex register_mutex;
+ regulator::RegulatorSession regulator_session;
+ bool has_regulator_session;
+ State state;
+ os::SdkMutex transaction_order_mutex;
+ bool is_power_bus;
+ dd::PhysicalAddress registers_phys_addr;
+ size_t registers_size;
+ os::InterruptName interrupt_name;
+ DeviceCode device_code;
+ util::IntrusiveListNode bus_accessor_list_node;
+ public:
+ using BusAccessorListTraits = util::IntrusiveListMemberTraitsDeferredAssert<&I2cBusAccessor::bus_accessor_list_node>;
+ using BusAccessorList = typename BusAccessorListTraits::ListType;
+ friend class util::IntrusiveList>;
+ public:
+ I2cBusAccessor()
+ : registers(nullptr), speed_mode(SpeedMode_Fast), user_count(0), user_count_mutex(),
+ register_mutex(), has_regulator_session(false), state(State::NotInitialized), transaction_order_mutex(),
+ is_power_bus(false), registers_phys_addr(0), registers_size(0), interrupt_name(), device_code(-1), bus_accessor_list_node()
+ {
+ /* ... */
+ }
+
+ void Initialize(dd::PhysicalAddress reg_paddr, size_t reg_size, os::InterruptName intr, bool pb, SpeedMode sm);
+ void RegisterDeviceCode(DeviceCode device_code);
+
+ SpeedMode GetSpeedMode() const { return this->speed_mode; }
+ dd::PhysicalAddress GetRegistersPhysicalAddress() const { return this->registers_phys_addr; }
+ size_t GetRegistersSize() const { return this->registers_size; }
+ os::InterruptName GetInterruptName() const { return this->interrupt_name; }
+ private:
+ Result TryOpenRegulatorSession();
+
+ void ExecuteInitialConfig();
+
+ Result Send(const u8 *src, size_t src_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode);
+ Result Receive(u8 *dst, size_t dst_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode);
+
+ void WriteHeader(Xfer xfer, size_t size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode);
+
+ void ResetController() const;
+ void ClearBus() const;
+ void SetClockRegisters(SpeedMode speed_mode);
+ void SetPacketModeRegisters();
+
+ Result FlushFifos();
+
+ Result GetTransactionResult() const;
+ void HandleTransactionError(Result result);
+
+ void DisableInterruptMask() {
+ reg::Write(this->registers->interrupt_mask_register, 0);
+ reg::Read(this->registers->interrupt_mask_register);
+ }
+
+ Result CheckAndHandleError() {
+ const Result result = this->GetTransactionResult();
+ this->HandleTransactionError(result);
+ if (R_FAILED(result)) {
+ this->DisableInterruptMask();
+ os::ClearInterruptEvent(std::addressof(this->interrupt_event));
+ return result;
+ }
+
+ return ResultSuccess();
+ }
+ public:
+ virtual void InitializeDriver() override;
+ virtual void FinalizeDriver() override;
+
+ virtual Result InitializeDevice(I2cDeviceProperty *device) override;
+ virtual void FinalizeDevice(I2cDeviceProperty *device) override;
+
+ virtual Result Send(I2cDeviceProperty *device, const void *src, size_t src_size, TransactionOption option) override;
+ virtual Result Receive(void *dst, size_t dst_size, I2cDeviceProperty *device, TransactionOption option) override;
+
+ virtual os::SdkMutex &GetTransactionOrderMutex() override {
+ return this->transaction_order_mutex;
+ }
+
+ virtual void SuspendBus() override;
+ virtual void SuspendPowerBus() override;
+
+ virtual void ResumeBus() override;
+ virtual void ResumePowerBus() override;
+
+ virtual const DeviceCode &GetDeviceCode() const override {
+ return this->device_code;
+ }
+ };
+
+}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_manager.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_manager.hpp
new file mode 100644
index 0000000..64ae466
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_bus_manager.hpp
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include "i2c_bus_accessor.hpp"
+#include "i2c_i_allocator.hpp"
+
+namespace ams::i2c::driver::board::nintendo_nx::impl {
+
+ class I2cBusAccessorManager : public IAllocator {
+ /* ... */
+ };
+
+}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_device_property_manager.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_device_property_manager.hpp
new file mode 100644
index 0000000..726d876
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_device_property_manager.hpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include "i2c_i_allocator.hpp"
+
+namespace ams::i2c::driver::board::nintendo_nx::impl {
+
+ class I2cDevicePropertyManager : public IAllocator {
+ /* ... */
+ };
+
+}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_i2c_registers.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_i2c_registers.hpp
new file mode 100644
index 0000000..c8925ce
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_i2c_registers.hpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::i2c::driver::board::nintendo_nx::impl {
+
+ struct I2cRegisters {
+ volatile u32 cnfg;
+ volatile u32 cmd_addr0;
+ volatile u32 cmd_addr1;
+ volatile u32 cmd_data1;
+ volatile u32 cmd_data2;
+ volatile u32 _14;
+ volatile u32 _18;
+ volatile u32 status;
+ volatile u32 sl_cnfg;
+ volatile u32 sl_rcvd;
+ volatile u32 sl_status;
+ volatile u32 sl_addr1;
+ volatile u32 sl_addr2;
+ volatile u32 tlow_sext;
+ volatile u32 _38;
+ volatile u32 sl_delay_count;
+ volatile u32 sl_int_mask;
+ volatile u32 sl_int_source;
+ volatile u32 sl_int_set;
+ volatile u32 _4c;
+ volatile u32 tx_packet_fifo;
+ volatile u32 rx_fifo;
+ volatile u32 packet_transfer_status;
+ volatile u32 fifo_control;
+ volatile u32 fifo_status;
+ volatile u32 interrupt_mask_register;
+ volatile u32 interrupt_status_register;
+ volatile u32 clk_divisor_register;
+ volatile u32 interrupt_source_register;
+ volatile u32 interrupt_set_register;
+ volatile u32 slv_tx_packet_fifo;
+ volatile u32 slv_rx_fifo;
+ volatile u32 slv_packet_status;
+ volatile u32 bus_clear_config;
+ volatile u32 bus_clear_status;
+ volatile u32 config_load;
+ volatile u32 _90;
+ volatile u32 interface_timing_0;
+ volatile u32 interface_timing_1;
+ volatile u32 hs_interface_timing_0;
+ volatile u32 hs_interface_timing_1;
+ };
+ static_assert(sizeof(I2cRegisters) == 0xA4);
+
+}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_i_allocator.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_i_allocator.hpp
new file mode 100644
index 0000000..270c882
--- /dev/null
+++ b/libraries/libstratosphere/source/i2c/driver/board/nintendo/nx/impl/i2c_i_allocator.hpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::i2c::driver::board::nintendo_nx::impl {
+
+ template
+ class IAllocator {
+ private:
+ using T = typename ListType::value_type;
+ private:
+ ams::MemoryResource *memory_resource;
+ ListType list;
+ mutable os::SdkMutex list_lock;
+ public:
+ IAllocator(ams::MemoryResource *mr) : memory_resource(mr), list(), list_lock() { /* ... */ }
+
+ ~IAllocator() {
+ std::scoped_lock lk(this->list_lock);
+
+ /* Remove all entries. */
+ auto it = this->list.begin();
+ while (it != this->list.end()) {
+ T *obj = std::addressof(*it);
+ it = this->list.erase(it);
+
+ obj->~T();
+ this->memory_resource->Deallocate(obj, sizeof(T));
+ }
+ }
+
+ template
+ T *Allocate(Args &&...args) {
+ std::scoped_lock lk(this->list_lock);
+
+ /* Allocate space for the object. */
+ void *storage = this->memory_resource->Allocate(sizeof(T), alignof(T));
+ AMS_ABORT_UNLESS(storage != nullptr);
+
+ /* Construct the object. */
+ T *t = new (static_cast(storage)) T(std::forward(args)...);
+
+ /* Link the object into our list. */
+ this->list.push_back(*t);
+
+ return t;
+ }
+
+ template
+ T *Find(F f) {
+ std::scoped_lock lk(this->list_lock);
+
+ for (T &it : this->list) {
+ if (f(static_cast(it))) {
+ return std::addressof(it);
+ }
+ }
+
+ return nullptr;
+ }
+
+ /* TODO: Support free */
+ };
+
+}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/i2c_bus_device_map.inc b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/i2c_bus_device_map.inc
deleted file mode 100644
index 3017020..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/i2c_bus_device_map.inc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by i2cgen.py, do not edit manually. */
-
-constexpr inline const I2cDeviceDefinition I2c1DeviceList[] = {
- { DeviceCode_ClassicController, 0x52 },
- { DeviceCode_Nct72, 0x4C },
- { DeviceCode_Alc5639, 0x1C },
- { DeviceCode_Bq24193, 0x6B },
- { DeviceCode_Max17050, 0x36 },
- { DeviceCode_Bm92t30mwv, 0x18 },
-};
-
-constexpr inline const I2cDeviceDefinition I2c2DeviceList[] = {
- { DeviceCode_Ina226Vdd15v0Hb, 0x40 },
- { DeviceCode_Ina226VsysCpuDs, 0x41 },
- { DeviceCode_Ina226VsysGpuDs, 0x44 },
- { DeviceCode_Ina226VsysDdrDs, 0x45 },
- { DeviceCode_Ina226VsysAp, 0x46 },
- { DeviceCode_Ina226VsysBlDs, 0x47 },
- { DeviceCode_Bh1730, 0x29 },
- { DeviceCode_Ina226VsysCore, 0x48 },
- { DeviceCode_Ina226Soc1V8, 0x49 },
- { DeviceCode_Ina226Lpddr1V8, 0x4A },
- { DeviceCode_Ina226Reg1V32, 0x4B },
- { DeviceCode_Ina226Vdd3V3Sys, 0x4D },
- { DeviceCode_Ina226VddDdr0V6, 0x4E },
- { DeviceCode_HoagNfcIc, 0x08 },
-};
-
-constexpr inline const I2cDeviceDefinition I2c3DeviceList[] = {
- { DeviceCode_Ftm3bd56, 0x49 },
-};
-
-constexpr inline const I2cDeviceDefinition I2c4DeviceList[] = {
- { DeviceCode_HdmiDdc, 0x50 },
- { DeviceCode_HdmiScdc, 0x54 },
- { DeviceCode_HdmiHdcp, 0x3A },
-};
-
-constexpr inline const I2cDeviceDefinition I2c5DeviceList[] = {
- { DeviceCode_Max77620Rtc, 0x68 },
- { DeviceCode_Max77620Pmic, 0x3C },
- { DeviceCode_Max77621Cpu, 0x1B },
- { DeviceCode_Max77621Gpu, 0x1C },
- { DeviceCode_Fan53528, 0x52 },
- { DeviceCode_Max77812_3, 0x31 },
- { DeviceCode_Max77812_2, 0x33 },
-};
-
-constexpr inline const I2cBusDefinition I2cBusList[] = {
- { DeviceCode_I2c1, 0x7000C000, 0x100, SpeedMode_Standard, 70, I2c1DeviceList, util::size(I2c1DeviceList) },
- { DeviceCode_I2c2, 0x7000C400, 0x100, SpeedMode_Fast, 116, I2c2DeviceList, util::size(I2c2DeviceList) },
- { DeviceCode_I2c3, 0x7000C500, 0x100, SpeedMode_Fast, 124, I2c3DeviceList, util::size(I2c3DeviceList) },
- { DeviceCode_I2c4, 0x7000C700, 0x100, SpeedMode_Standard, 152, I2c4DeviceList, util::size(I2c4DeviceList) },
- { DeviceCode_I2c5, 0x7000D000, 0x100, SpeedMode_Fast, 85, I2c5DeviceList, util::size(I2c5DeviceList) },
-};
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/i2c_driver_api.cpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/i2c_driver_api.cpp
deleted file mode 100644
index bab1817..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/i2c_driver_api.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "impl/i2c_bus_manager.hpp"
-#include "impl/i2c_device_property_manager.hpp"
-
-namespace ams::i2c::driver::board::nintendo_nx {
-
- namespace {
-
- struct I2cDeviceDefinition {
- DeviceCode device_code;
- u8 slave_address;
- };
-
- struct I2cBusDefinition {
- DeviceCode device_code;
- dd::PhysicalAddress registers_phys_addr;
- size_t registers_size;
- SpeedMode speed_mode;
- os::InterruptName interrupt_name;
- const I2cDeviceDefinition *devices;
- size_t num_devices;
-
- constexpr bool IsPowerBus() const {
- return this->device_code == DeviceCode_I2c5;
- }
- };
-
- #include "i2c_bus_device_map.inc"
-
- void CheckSpeedMode(SpeedMode speed_mode) {
- switch (speed_mode) {
- case SpeedMode_Standard: break;
- case SpeedMode_Fast: break;
- case SpeedMode_FastPlus: break;
- case SpeedMode_HighSpeed: break;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
- }
-
- void Initialize(impl::I2cBusAccessorManager &bus_manager, impl::I2cDevicePropertyManager &device_manager) {
- /* Create an accessor for each bus. */
- for (const auto &bus_def : I2cBusList) {
- /* Check that the speed mode is valid. */
- CheckSpeedMode(bus_def.speed_mode);
-
- /* Find the bus. */
- auto *bus = bus_manager.Find([&bus_def](const auto &it) {
- return it.GetRegistersPhysicalAddress() == bus_def.registers_phys_addr;
- });
-
- /* If the bus doesn't exist, create it. */
- if (bus == nullptr) {
- /* Allocate the bus. */
- bus = bus_manager.Allocate();
-
- /* Initialize the bus. */
- bus->Initialize(bus_def.registers_phys_addr, bus_def.registers_size, bus_def.interrupt_name, bus_def.IsPowerBus(), bus_def.speed_mode);
-
- /* Register the bus. */
- i2c::driver::RegisterDriver(bus);
- }
-
- /* Set the bus's device code. */
- bus->RegisterDeviceCode(bus_def.device_code);
-
- /* Allocate and register the devices for the bus. */
- for (size_t i = 0; i < bus_def.num_devices; ++i) {
- /* Get the device definition. */
- const auto &entry = bus_def.devices[i];
-
- /* Allocate the device. */
- I2cDeviceProperty *device = device_manager.Allocate(entry.slave_address, AddressingMode_SevenBit);
-
- /* Register the device with our bus. */
- bus->RegisterDevice(device);
-
- /* Register the device code with our driver. */
- R_ABORT_UNLESS(i2c::driver::RegisterDeviceCode(entry.device_code, device));
- }
- }
- }
-
- }
-
- void Initialize() {
- /* TODO: Should these be moved into getters? They're only used here, and they never destruct. */
- static impl::I2cBusAccessorManager s_bus_accessor_manager(ddsf::GetMemoryResource());
- static impl::I2cDevicePropertyManager s_device_manager(ddsf::GetMemoryResource());
-
- return Initialize(s_bus_accessor_manager, s_device_manager);
- }
-
-}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_accessor.cpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_accessor.cpp
deleted file mode 100644
index 5e8dff8..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_accessor.cpp
+++ /dev/null
@@ -1,771 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "i2c_bus_accessor.hpp"
-
-namespace ams::i2c::driver::board::nintendo_nx::impl {
-
- namespace {
-
- constexpr inline TimeSpan Timeout = TimeSpan::FromMilliSeconds(100);
-
- #define IO_PACKET_BITS_MASK(NAME) REG_NAMED_BITS_MASK (_IMPL_IO_PACKET_, NAME)
- #define IO_PACKET_BITS_VALUE(NAME, VALUE) REG_NAMED_BITS_VALUE (_IMPL_IO_PACKET_, NAME, VALUE)
- #define IO_PACKET_BITS_ENUM(NAME, ENUM) REG_NAMED_BITS_ENUM (_IMPL_IO_PACKET_, NAME, ENUM)
- #define IO_PACKET_BITS_ENUM_SEL(NAME, __COND__, TRUE_ENUM, FALSE_ENUM) REG_NAMED_BITS_ENUM_SEL(_IMPL_IO_PACKET_, NAME, __COND__, TRUE_ENUM, FALSE_ENUM)
-
- #define DEFINE_IO_PACKET_REG(NAME, __OFFSET__, __WIDTH__) REG_DEFINE_NAMED_REG (_IMPL_IO_PACKET_, NAME, __OFFSET__, __WIDTH__)
- #define DEFINE_IO_PACKET_REG_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE) REG_DEFINE_NAMED_BIT_ENUM (_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE)
- #define DEFINE_IO_PACKET_REG_TWO_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE, TWO, THREE) REG_DEFINE_NAMED_TWO_BIT_ENUM (_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE, TWO, THREE)
- #define DEFINE_IO_PACKET_REG_THREE_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN) REG_DEFINE_NAMED_THREE_BIT_ENUM(_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN)
- #define DEFINE_IO_PACKET_REG_FOUR_BIT_ENUM(NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELVE, THIRTEEN, FOURTEEN, FIFTEEN) REG_DEFINE_NAMED_FOUR_BIT_ENUM (_IMPL_IO_PACKET_, NAME, __OFFSET__, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELVE, THIRTEEN, FOURTEEN, FIFTEEN)
-
- DEFINE_IO_PACKET_REG_THREE_BIT_ENUM(HEADER_WORD0_PKT_TYPE, 0, REQUEST, RESPONSE, INTERRUPT, STOP, RSVD4, RSVD5, RSVD6, RSVD7);
- DEFINE_IO_PACKET_REG_FOUR_BIT_ENUM(HEADER_WORD0_PROTOCOL, 4, RSVD0, I2C, RSVD2, RSVD3, RSVD4, RSVD5, RSVD6, RSVD7, RSVD8, RSVD9, RSVD10, RSVD11, RSVD12, RSVD13, RSVD14, RSVD15)
- DEFINE_IO_PACKET_REG(HEADER_WORD0_CONTROLLER_ID, 12, 4);
- DEFINE_IO_PACKET_REG(HEADER_WORD0_PKT_ID, 16, 8);
- DEFINE_IO_PACKET_REG_TWO_BIT_ENUM(HEADER_WORD0_PROT_HDR_SZ, 28, 1_WORD, 2_WORD, 3_WORD, 4_WORD);
-
- DEFINE_IO_PACKET_REG(HEADER_WORD1_PAYLOAD_SIZE, 0, 12);
-
- DEFINE_IO_PACKET_REG(PROTOCOL_HEADER_SLAVE_ADDR, 0, 10);
- DEFINE_IO_PACKET_REG(PROTOCOL_HEADER_HS_MASTER_ADDR, 12, 3);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_CONTINUE_XFER, 15, USE_REPEAT_START_TOP, CONTINUE);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_REPEAT_START_STOP, 16, STOP_CONDITION, REPEAT_START_CONDITION);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_IE, 17, DISABLE, ENABLE);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_ADDRESS_MODE, 18, SEVEN_BIT, TEN_BIT);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_READ_WRITE, 19, WRITE, READ);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_SEND_START_BYTE, 20, DISABLE, ENABLE);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_CONTINUE_ON_NACK, 21, DISABLE, ENABLE);
- DEFINE_IO_PACKET_REG_BIT_ENUM(PROTOCOL_HEADER_HS_MODE, 22, DISABLE, ENABLE);
-
- }
-
- void I2cBusAccessor::Initialize(dd::PhysicalAddress reg_paddr, size_t reg_size, os::InterruptName intr, bool pb, SpeedMode sm) {
- AMS_ASSERT(this->state == State::NotInitialized);
-
- this->is_power_bus = pb;
- this->speed_mode = sm;
- this->interrupt_name = intr;
- this->registers_phys_addr = reg_paddr;
- this->registers_size = reg_size;
- this->state = State::Initializing;
- }
-
- void I2cBusAccessor::RegisterDeviceCode(DeviceCode dc) {
- AMS_ASSERT(this->state == State::Initializing);
-
- this->device_code = dc;
- }
-
- void I2cBusAccessor::InitializeDriver() {
- AMS_ASSERT(this->state == State::Initializing);
-
- this->registers = reinterpret_cast(dd::QueryIoMapping(this->registers_phys_addr, this->registers_size));
- AMS_ABORT_UNLESS(this->registers != nullptr);
-
- this->state = State::Initialized;
- }
-
- void I2cBusAccessor::FinalizeDriver() {
- AMS_ASSERT(this->state == State::Initialized);
- this->state = State::Initializing;
- }
-
- Result I2cBusAccessor::InitializeDevice(I2cDeviceProperty *device) {
- /* Check that the device is valid. */
- AMS_ASSERT(device != nullptr);
- AMS_ASSERT(this->state == State::Initialized);
-
- /* Acquire exclusive access. */
- std::scoped_lock lk(this->user_count_mutex);
-
- /* Increment our user count -- if we're already open, we're done. */
- AMS_ASSERT(this->user_count >= 0);
- ++this->user_count;
- R_SUCCEED_IF(this->user_count > 1);
-
- /* Initialize our interrupt event. */
- os::InitializeInterruptEvent(std::addressof(this->interrupt_event), this->interrupt_name, os::EventClearMode_ManualClear);
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
-
- /* If we're not power bus, perform power management init. */
- if (!this->is_power_bus) {
- /* Initialize regulator library. */
- regulator::Initialize();
-
- /* Try to open regulator session. */
- R_TRY(this->TryOpenRegulatorSession());
-
- /* If we have a regulator session, set voltage to 2.9V. */
- if (this->has_regulator_session) {
- /* NOTE: Nintendo does not check the result, here. */
- regulator::SetVoltageValue(std::addressof(this->regulator_session), 2'900'000u);
- }
-
- /* Initialize clock/reset library. */
- clkrst::Initialize();
- }
-
- /* Execute initial config. */
- this->ExecuteInitialConfig();
-
- /* If we have a regulator session, enable voltage. */
- if (!this->is_power_bus && this->has_regulator_session) {
- /* Check whether voltage was already enabled. */
- const bool was_enabled = regulator::GetVoltageEnabled(std::addressof(this->regulator_session));
-
- /* NOTE: Nintendo does not check the result of this call. */
- regulator::SetVoltageEnabled(std::addressof(this->regulator_session), true);
-
- /* If we enabled voltage, delay to give our enable time to take. */
- if (!was_enabled) {
- os::SleepThread(TimeSpan::FromMicroSeconds(560));
- }
- }
-
- return ResultSuccess();
- }
-
- void I2cBusAccessor::FinalizeDevice(I2cDeviceProperty *device) {
- /* Check that the device is valid. */
- AMS_ASSERT(device != nullptr);
- AMS_ASSERT(this->state == State::Initialized);
-
- /* Acquire exclusive access. */
- std::scoped_lock lk(this->user_count_mutex);
-
- /* Increment our user count -- if we're not the last user, we're done. */
- AMS_ASSERT(this->user_count > 0);
- --this->user_count;
- if (this->user_count > 0) {
- return;
- }
-
- /* Finalize our interrupt event. */
- os::FinalizeInterruptEvent(std::addressof(this->interrupt_event));
-
- /* If we have a regulator session, disable voltage. */
- if (this->has_regulator_session) {
- /* NOTE: Nintendo does not check the result of this call. */
- regulator::SetVoltageEnabled(std::addressof(this->regulator_session), false);
- }
-
- /* Finalize the clock/reset library. */
- clkrst::Finalize();
-
- /* If we have a regulator session, close it. */
- if (this->has_regulator_session) {
- regulator::CloseSession(std::addressof(this->regulator_session));
- this->has_regulator_session = false;
- }
-
- /* Finalize the regulator library. */
- regulator::Finalize();
- }
-
- Result I2cBusAccessor::Send(I2cDeviceProperty *device, const void *src, size_t src_size, TransactionOption option) {
- /* Check pre-conditions. */
- AMS_ASSERT(device != nullptr);
- AMS_ASSERT(src != nullptr);
- AMS_ASSERT(src_size > 0);
-
- if (this->is_power_bus) {
- AMS_ASSERT(this->state == State::Initialized || this->state == State::Suspended);
- } else {
- AMS_ASSERT(this->state == State::Initialized);
- }
-
- /* Send the data. */
- return this->Send(static_cast(src), src_size, option, device->GetAddress(), device->GetAddressingMode());
- }
-
- Result I2cBusAccessor::Receive(void *dst, size_t dst_size, I2cDeviceProperty *device, TransactionOption option) {
- /* Check pre-conditions. */
- AMS_ASSERT(device != nullptr);
- AMS_ASSERT(dst != nullptr);
- AMS_ASSERT(dst_size > 0);
-
- if (this->is_power_bus) {
- AMS_ASSERT(this->state == State::Initialized || this->state == State::Suspended);
- } else {
- AMS_ASSERT(this->state == State::Initialized);
- }
-
- /* Send the data. */
- return this->Receive(static_cast(dst), dst_size, option, device->GetAddress(), device->GetAddressingMode());
- }
-
- void I2cBusAccessor::SuspendBus() {
- /* Check that state is valid. */
- AMS_ASSERT(this->state == State::Initialized);
-
- /* Acquire exclusive access. */
- std::scoped_lock lk(this->user_count_mutex);
-
- /* If we need to, disable clock/voltage appropriately. */
- if (!this->is_power_bus && this->user_count > 0) {
- /* Disable clock. */
- {
- /* Open a clkrst session. */
- clkrst::ClkRstSession clkrst_session;
- R_ABORT_UNLESS(clkrst::OpenSession(std::addressof(clkrst_session), this->device_code));
- ON_SCOPE_EXIT { clkrst::CloseSession(std::addressof(clkrst_session)); };
-
- /* Set clock disabled for the session. */
- clkrst::SetClockDisabled(std::addressof(clkrst_session));
- }
-
- /* Disable voltage. */
- if (this->has_regulator_session) {
- regulator::SetVoltageEnabled(std::addressof(this->regulator_session), false);
- }
- }
-
- /* Update state. */
- this->state = State::Suspended;
- }
-
- void I2cBusAccessor::SuspendPowerBus() {
- /* Check that state is valid. */
- AMS_ASSERT(this->state == State::Suspended);
-
- /* Acquire exclusive access. */
- std::scoped_lock lk(this->user_count_mutex);
-
- /* If we need to, disable clock/voltage appropriately. */
- if (this->is_power_bus && this->user_count > 0) {
- /* Nothing should actually be done here. */
- }
-
- /* Update state. */
- this->state = State::PowerBusSuspended;
- }
-
- void I2cBusAccessor::ResumeBus() {
- /* Check that state is valid. */
- AMS_ASSERT(this->state == State::Suspended);
-
- /* Acquire exclusive access. */
- std::scoped_lock lk(this->user_count_mutex);
-
- /* If we need to, enable clock/voltage appropriately. */
- if (!this->is_power_bus && this->user_count > 0) {
- /* Enable voltage. */
- if (this->has_regulator_session) {
- /* Check whether voltage was already enabled. */
- const bool was_enabled = regulator::GetVoltageEnabled(std::addressof(this->regulator_session));
-
- /* NOTE: Nintendo does not check the result of this call. */
- regulator::SetVoltageEnabled(std::addressof(this->regulator_session), true);
-
- /* If we enabled voltage, delay to give our enable time to take. */
- if (!was_enabled) {
- os::SleepThread(TimeSpan::FromMicroSeconds(560));
- }
- }
-
- /* Execute initial config, which will enable clock as relevant. */
- this->ExecuteInitialConfig();
- }
-
- /* Update state. */
- this->state = State::Initialized;
- }
-
- void I2cBusAccessor::ResumePowerBus() {
- /* Check that state is valid. */
- AMS_ASSERT(this->state == State::PowerBusSuspended);
-
- /* Acquire exclusive access. */
- std::scoped_lock lk(this->user_count_mutex);
-
- /* If we need to, enable clock/voltage appropriately. */
- if (this->is_power_bus && this->user_count > 0) {
- /* Execute initial config, which will enable clock as relevant. */
- this->ExecuteInitialConfig();
- }
-
- /* Update state. */
- this->state = State::Suspended;
- }
-
- Result I2cBusAccessor::TryOpenRegulatorSession() {
- /* Ensure we track the session. */
- this->has_regulator_session = true;
- auto s_guard = SCOPE_GUARD { this->has_regulator_session = false; };
-
- /* Try to open the session. */
- R_TRY_CATCH(regulator::OpenSession(std::addressof(this->regulator_session), this->device_code)) {
- R_CATCH(ddsf::ResultDeviceCodeNotFound) {
- /* It's okay if the device isn't found, but we don't have a session if so. */
- this->has_regulator_session = false;
- }
- } R_END_TRY_CATCH;
-
- /* We opened (or not). */
- s_guard.Cancel();
- return ResultSuccess();
- }
-
- void I2cBusAccessor::ExecuteInitialConfig() {
- /* Lock exclusive access to registers. */
- std::scoped_lock lk(this->register_mutex);
-
- /* Reset the controller. */
- this->ResetController();
-
- /* Set clock registers. */
- this->SetClockRegisters(this->speed_mode);
-
- /* Set packet mode registers. */
- this->SetPacketModeRegisters();
-
- /* Flush fifos. */
- this->FlushFifos();
- }
-
- Result I2cBusAccessor::Send(const u8 *src, size_t src_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode) {
- /* Acquire exclusive access to the registers. */
- std::scoped_lock lk(this->register_mutex);
-
- /* Configure interrupt mask, clear interrupt status. */
- reg::Write(this->registers->interrupt_mask_register, I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_TFIFO_DATA_REQ_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_ARB_LOST_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_NOACK_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_PACKET_XFER_COMPLETE_INT_EN, ENABLE));
-
- reg::Write(this->registers->interrupt_status_register, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ARB_LOST, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_NOACK, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_RFIFO_UNF, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_TFIFO_OVF, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_PACKET_XFER_COMPLETE, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ALL_PACKETS_XFER_COMPLETE, SET));
-
- /* Write the header. */
- this->WriteHeader(Xfer_Write, src_size, option, slave_address, addressing_mode);
-
- /* Setup tracking variables for the data. */
- const u8 *cur = src;
- size_t remaining = src_size;
-
- while (true) {
- /* Get the number of empty bytes in the fifo status. */
- const u32 empty = reg::GetValue(this->registers->fifo_status, I2C_REG_BITS_MASK(FIFO_STATUS_TX_FIFO_EMPTY_CNT));
-
- /* Write up to (empty) bytes to the fifo. */
- for (u32 i = 0; remaining > 0 && i < empty; ++i) {
- /* Build the data word to send. */
- const size_t cur_bytes = std::min(remaining, sizeof(u32));
-
- u32 word = 0;
- for (size_t j = 0; j < cur_bytes; ++j) {
- word |= cur[j] << (BITSIZEOF(u8) * j);
- }
-
- /* Write the data word. */
- reg::Write(this->registers->tx_packet_fifo, word);
-
- /* Advance. */
- cur += cur_bytes;
- remaining -= cur_bytes;
- }
-
- /* If we're done, break. */
- if (remaining == 0) {
- break;
- }
-
- /* Wait for our current data to send. */
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- if (!os::TimedWaitInterruptEvent(std::addressof(this->interrupt_event), Timeout)) {
- /* We timed out. */
- this->HandleTransactionError(i2c::ResultBusBusy());
-
- this->DisableInterruptMask();
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- return i2c::ResultTimeout();
- }
-
- /* Check and handle any errors. */
- R_TRY(this->CheckAndHandleError());
- }
-
- /* Configure interrupt mask to not care about tfifo data req. */
- reg::Write(this->registers->interrupt_mask_register, I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_ARB_LOST_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_NOACK_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_PACKET_XFER_COMPLETE_INT_EN, ENABLE));
-
- /* Wait for the packet transfer to complete. */
- while (true) {
- /* Check and handle any errors. */
- R_TRY(this->CheckAndHandleError());
-
- /* Check if packet transfer is done. */
- if (reg::HasValue(this->registers->interrupt_status_register, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_PACKET_XFER_COMPLETE, SET))) {
- break;
- }
-
- /* Wait for our the packet to transfer. */
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- if (!os::TimedWaitInterruptEvent(std::addressof(this->interrupt_event), Timeout)) {
- /* We timed out. */
- this->HandleTransactionError(i2c::ResultBusBusy());
-
- this->DisableInterruptMask();
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- return i2c::ResultTimeout();
- }
- }
-
- /* Check and handle any errors. */
- R_TRY(this->CheckAndHandleError());
-
- /* We're done. */
- this->DisableInterruptMask();
- return ResultSuccess();
- }
-
- Result I2cBusAccessor::Receive(u8 *dst, size_t dst_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode) {
- /* Acquire exclusive access to the registers. */
- std::scoped_lock lk(this->register_mutex);
-
- /* Configure interrupt mask, clear interrupt status. */
- reg::Write(this->registers->interrupt_mask_register, I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_RFIFO_DATA_REQ_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_ARB_LOST_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_NOACK_INT_EN, ENABLE),
- I2C_REG_BITS_ENUM(INTERRUPT_MASK_REGISTER_PACKET_XFER_COMPLETE_INT_EN, ENABLE));
-
- reg::Write(this->registers->interrupt_status_register, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ARB_LOST, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_NOACK, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_RFIFO_UNF, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_TFIFO_OVF, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_PACKET_XFER_COMPLETE, SET),
- I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ALL_PACKETS_XFER_COMPLETE, SET));
-
- /* Write the header. */
- this->WriteHeader(Xfer_Read, dst_size, option, slave_address, addressing_mode);
-
- /* Setup tracking variables for the data. */
- u8 *cur = dst;
- size_t remaining = dst_size;
-
- while (remaining > 0) {
- /* Wait for data to come in. */
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- if (!os::TimedWaitInterruptEvent(std::addressof(this->interrupt_event), Timeout)) {
- /* We timed out. */
- this->HandleTransactionError(i2c::ResultBusBusy());
-
- this->DisableInterruptMask();
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- return i2c::ResultTimeout();
- }
-
- /* Check and handle any errors. */
- R_TRY(this->CheckAndHandleError());
-
- /* Get the number of full bytes in the fifo status. */
- const u32 full = reg::GetValue(this->registers->fifo_status, I2C_REG_BITS_MASK(FIFO_STATUS_RX_FIFO_FULL_CNT));
-
- /* Determine how many words we can read. */
- const size_t cur_words = std::min(util::DivideUp(remaining, sizeof(u32)), static_cast(full));
-
- /* Read the correct number of words from the fifo. */
- for (size_t i = 0; i < cur_words; ++i) {
- /* Read the word from the fifo. */
- const u32 word = reg::Read(this->registers->rx_fifo);
-
- /* Copy bytes from the word. */
- const size_t cur_bytes = std::min(remaining, sizeof(u32));
- for (size_t j = 0; j < cur_bytes; ++j) {
- cur[j] = (word >> (BITSIZEOF(u8) * j)) & 0xFF;
- }
-
- /* Advance. */
- cur += cur_bytes;
- remaining -= cur_bytes;
- }
- }
-
- /* We're done. */
- return ResultSuccess();
- }
-
- void I2cBusAccessor::WriteHeader(Xfer xfer, size_t size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode) {
- /* Parse interesting values from our arguments. */
- const bool is_read = xfer == Xfer_Read;
- const bool is_7_bit = addressing_mode == AddressingMode_SevenBit;
- const bool is_stop = (option & TransactionOption_StopCondition) != 0;
- const bool is_hs = this->speed_mode == SpeedMode_HighSpeed;
- const u32 slave_addr = ((static_cast(slave_address) & 0x7F) << 1) | (is_read ? 1 : 0);
-
- /* Flush fifos. */
- this->FlushFifos();
-
- /* Enqueue the first header word. */
- reg::Write(this->registers->tx_packet_fifo, IO_PACKET_BITS_ENUM (HEADER_WORD0_PROT_HDR_SZ, 1_WORD),
- IO_PACKET_BITS_VALUE(HEADER_WORD0_PKT_ID, 0),
- IO_PACKET_BITS_VALUE(HEADER_WORD0_CONTROLLER_ID, 0),
- IO_PACKET_BITS_ENUM (HEADER_WORD0_PROTOCOL, I2C),
- IO_PACKET_BITS_ENUM (HEADER_WORD0_PKT_TYPE, REQUEST));
-
- /* Enqueue the second header word. */
- reg::Write(this->registers->tx_packet_fifo, IO_PACKET_BITS_VALUE(HEADER_WORD1_PAYLOAD_SIZE, static_cast(size - 1)));
-
- /* Enqueue the protocol header word. */
- reg::Write(this->registers->tx_packet_fifo, IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_HS_MODE, is_hs, ENABLE, DISABLE),
- IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_CONTINUE_ON_NACK, DISABLE),
- IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_SEND_START_BYTE, DISABLE),
- IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_READ_WRITE, is_read, READ, WRITE),
- IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_ADDRESS_MODE, is_7_bit, SEVEN_BIT, TEN_BIT),
- IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_IE, ENABLE),
- IO_PACKET_BITS_ENUM_SEL(PROTOCOL_HEADER_REPEAT_START_STOP, is_stop, STOP_CONDITION, REPEAT_START_CONDITION),
- IO_PACKET_BITS_ENUM (PROTOCOL_HEADER_CONTINUE_XFER, USE_REPEAT_START_TOP),
- IO_PACKET_BITS_VALUE (PROTOCOL_HEADER_HS_MASTER_ADDR, 0),
- IO_PACKET_BITS_VALUE (PROTOCOL_HEADER_SLAVE_ADDR, slave_addr));
- }
-
- void I2cBusAccessor::ResetController() const {
- /* Reset the controller. */
- if (!this->is_power_bus) {
- /* Open a clkrst session. */
- clkrst::ClkRstSession clkrst_session;
- R_ABORT_UNLESS(clkrst::OpenSession(std::addressof(clkrst_session), this->device_code));
- ON_SCOPE_EXIT { clkrst::CloseSession(std::addressof(clkrst_session)); };
-
- /* Reset the controller, setting clock rate to 408 MHz / 5 (to account for clock divisor). */
- /* NOTE: Nintendo does not check result for any of these calls. */
- clkrst::SetResetAsserted(std::addressof(clkrst_session));
- clkrst::SetClockRate(std::addressof(clkrst_session), 408'000'000 / (4 + 1));
- clkrst::SetResetDeasserted(std::addressof(clkrst_session));
- }
- }
-
- void I2cBusAccessor::ClearBus() const {
- /* Try to clear the bus up to three times. */
- constexpr int MaxRetryCount = 3;
- constexpr int BusyLoopMicroSeconds = 1000;
-
- int try_count = 0;
- bool need_retry;
- do {
- /* Update trackers. */
- ++try_count;
- need_retry = false;
-
- /* Reset the controller. */
- this->ResetController();
-
- /* Configure the sclk threshold for bus clear config. */
- reg::Write(this->registers->bus_clear_config, I2C_REG_BITS_VALUE(BUS_CLEAR_CONFIG_BC_SCLK_THRESHOLD, 9));
-
- /* Set stop cond and terminate in bus clear config. */
- reg::ReadWrite(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_STOP_COND, STOP));
- reg::ReadWrite(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_TERMINATE, IMMEDIATE));
-
- /* Set master config load, busy loop up to 1ms for it to take. */
- reg::ReadWrite(this->registers->config_load, I2C_REG_BITS_ENUM(CONFIG_LOAD_MSTR_CONFIG_LOAD, ENABLE));
-
- const os::Tick start_tick_a = os::GetSystemTick();
- while (reg::HasValue(this->registers->config_load, I2C_REG_BITS_ENUM(CONFIG_LOAD_MSTR_CONFIG_LOAD, ENABLE))) {
- if ((os::GetSystemTick() - start_tick_a).ToTimeSpan().GetMicroSeconds() > BusyLoopMicroSeconds) {
- need_retry = true;
- break;
- }
- }
-
- if (need_retry) {
- continue;
- }
-
- /* Set bus clear enable, wait up to 1ms for it to take. */
- reg::ReadWrite(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_ENABLE, ENABLE));
-
- const os::Tick start_tick_b = os::GetSystemTick();
- while (reg::HasValue(this->registers->bus_clear_config, I2C_REG_BITS_ENUM(BUS_CLEAR_CONFIG_BC_ENABLE, ENABLE))) {
- if ((os::GetSystemTick() - start_tick_b).ToTimeSpan().GetMicroSeconds() > BusyLoopMicroSeconds) {
- need_retry = true;
- break;
- }
- }
-
- if (need_retry) {
- continue;
- }
-
- /* Wait up to 1ms for the bus clear to complete. */
- const os::Tick start_tick_c = os::GetSystemTick();
- while (reg::HasValue(this->registers->bus_clear_status, I2C_REG_BITS_ENUM(BUS_CLEAR_STATUS_BC_STATUS, NOT_CLEARED))) {
- if ((os::GetSystemTick() - start_tick_c).ToTimeSpan().GetMicroSeconds() > BusyLoopMicroSeconds) {
- need_retry = true;
- break;
- }
- }
-
- if (need_retry) {
- continue;
- }
- } while (try_count < MaxRetryCount && need_retry);
- }
-
- void I2cBusAccessor::SetClockRegisters(SpeedMode speed_mode) {
- /* Determine parameters for the speed mode. */
- u32 t_high, t_low, clk_div, debounce, src_div;
- bool high_speed = false;
-
- if (this->is_power_bus) {
- t_high = 0x02;
- t_low = 0x04;
- clk_div = 0x05;
- debounce = 0x02;
- src_div = 0; /* unused */
- } else {
- switch (speed_mode) {
- case SpeedMode_Standard:
- t_high = 0x02;
- t_low = 0x04;
- clk_div = 0x19;
- debounce = 0x02;
- src_div = 0x13;
- break;
- case SpeedMode_Fast:
- t_high = 0x02;
- t_low = 0x04;
- clk_div = 0x19;
- debounce = 0x02;
- src_div = 0x04;
- break;
- case SpeedMode_FastPlus:
- t_high = 0x02;
- t_low = 0x04;
- clk_div = 0x10;
- debounce = 0x00;
- src_div = 0x02;
- break;
- case SpeedMode_HighSpeed:
- t_high = 0x03;
- t_low = 0x08;
- clk_div = 0x02;
- debounce = 0x00;
- src_div = 0x02;
- high_speed = true;
- break;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
- }
-
- /* Write the clock divisors. */
- if (high_speed) {
- reg::Write(this->registers->hs_interface_timing_0, I2C_REG_BITS_VALUE(HS_INTERFACE_TIMING_0_HS_THIGH, t_high),
- I2C_REG_BITS_VALUE(HS_INTERFACE_TIMING_0_HS_TLOW, t_low));
-
- reg::Write(this->registers->clk_divisor_register, I2C_REG_BITS_VALUE(CLK_DIVISOR_REGISTER_HSMODE, clk_div));
- } else {
- reg::Write(this->registers->interface_timing_0, I2C_REG_BITS_VALUE(INTERFACE_TIMING_0_THIGH, t_high),
- I2C_REG_BITS_VALUE(INTERFACE_TIMING_0_TLOW, t_low));
-
- reg::Write(this->registers->clk_divisor_register, I2C_REG_BITS_VALUE(CLK_DIVISOR_REGISTER_STD_FAST_MODE, clk_div));
- }
-
- /* Configure debounce. */
- reg::Write(this->registers->cnfg, I2C_REG_BITS_VALUE(I2C_CNFG_DEBOUNCE_CNT, debounce));
- reg::Read(this->registers->cnfg);
-
- /* Set the clock rate, if we should. */
- if (!this->is_power_bus) {
- /* Open a clkrst session. */
- clkrst::ClkRstSession clkrst_session;
- R_ABORT_UNLESS(clkrst::OpenSession(std::addressof(clkrst_session), this->device_code));
- ON_SCOPE_EXIT { clkrst::CloseSession(std::addressof(clkrst_session)); };
-
- /* Reset the controller, setting clock rate to 408 MHz / (src_div + 1). */
- /* NOTE: Nintendo does not check result for any of these calls. */
- clkrst::SetResetAsserted(std::addressof(clkrst_session));
- clkrst::SetClockRate(std::addressof(clkrst_session), 408'000'000 / (src_div + 1));
- clkrst::SetResetDeasserted(std::addressof(clkrst_session));
- }
- }
-
- void I2cBusAccessor::SetPacketModeRegisters() {
- /* Set packet mode enable. */
- reg::ReadWrite(this->registers->cnfg, I2C_REG_BITS_ENUM(I2C_CNFG_PACKET_MODE_EN, GO));
-
- /* Set master config load. */
- reg::ReadWrite(this->registers->config_load, I2C_REG_BITS_ENUM(CONFIG_LOAD_MSTR_CONFIG_LOAD, ENABLE));
-
- /* Set tx/fifo triggers to default (maximum values). */
- reg::Write(this->registers->fifo_control, I2C_REG_BITS_VALUE(FIFO_CONTROL_RX_FIFO_TRIG, 7),
- I2C_REG_BITS_VALUE(FIFO_CONTROL_TX_FIFO_TRIG, 7));
- }
-
- Result I2cBusAccessor::FlushFifos() {
- /* Flush the fifo. */
- reg::Write(this->registers->fifo_control, I2C_REG_BITS_VALUE(FIFO_CONTROL_RX_FIFO_TRIG, 7),
- I2C_REG_BITS_VALUE(FIFO_CONTROL_TX_FIFO_TRIG, 7),
- I2C_REG_BITS_ENUM (FIFO_CONTROL_RX_FIFO_FLUSH, SET),
- I2C_REG_BITS_ENUM (FIFO_CONTROL_TX_FIFO_FLUSH, SET));
-
- /* Wait up to 5 ms for the flush to complete. */
- int count = 0;
- while (!reg::HasValue(this->registers->fifo_control, I2C_REG_BITS_ENUM(FIFO_CONTROL_FIFO_FLUSH, RX_UNSET_TX_UNSET))) {
- R_UNLESS((++count < 5), i2c::ResultBusBusy());
- os::SleepThread(TimeSpan::FromMilliSeconds(1));
- }
-
- return ResultSuccess();
- }
-
- Result I2cBusAccessor::GetTransactionResult() const {
- /* Get packet status/interrupt status. */
- volatile u32 packet_status = reg::Read(this->registers->packet_transfer_status);
- volatile u32 interrupt_status = reg::Read(this->registers->interrupt_status_register);
-
- /* Check for ack. */
- R_UNLESS(reg::HasValue(packet_status, I2C_REG_BITS_ENUM(PACKET_TRANSFER_STATUS_NOACK_FOR_DATA, UNSET)), i2c::ResultNoAck());
- R_UNLESS(reg::HasValue(packet_status, I2C_REG_BITS_ENUM(PACKET_TRANSFER_STATUS_NOACK_FOR_ADDR, UNSET)), i2c::ResultNoAck());
- R_UNLESS(reg::HasValue(interrupt_status, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_NOACK, UNSET)), i2c::ResultNoAck());
-
- /* If we lost arbitration, we'll need to clear the bus. */
- auto clear_guard = SCOPE_GUARD { this->ClearBus(); };
-
- /* Check for arb lost. */
- R_UNLESS(reg::HasValue(packet_status, I2C_REG_BITS_ENUM(PACKET_TRANSFER_STATUS_ARB_LOST, UNSET)), i2c::ResultBusBusy());
- R_UNLESS(reg::HasValue(interrupt_status, I2C_REG_BITS_ENUM(INTERRUPT_STATUS_REGISTER_ARB_LOST, UNSET)), i2c::ResultBusBusy());
-
- clear_guard.Cancel();
- return ResultSuccess();
- }
-
- void I2cBusAccessor::HandleTransactionError(Result result) {
- R_TRY_CATCH(result) {
- R_CATCH(i2c::ResultNoAck, i2c::ResultBusBusy) {
- /* Reset the controller. */
- this->ResetController();
-
- /* Set clock registers. */
- this->SetClockRegisters(this->speed_mode);
-
- /* Set packet mode registers. */
- this->SetPacketModeRegisters();
-
- /* Flush fifos. */
- this->FlushFifos();
- }
- } R_END_TRY_CATCH_WITH_ABORT_UNLESS;
- }
-
-}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_accessor.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_accessor.hpp
deleted file mode 100644
index 8691dba..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_accessor.hpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-#include "i2c_i2c_registers.hpp"
-
-namespace ams::i2c::driver::board::nintendo_nx::impl {
-
- class I2cBusAccessor : public ::ams::i2c::driver::II2cDriver {
- NON_COPYABLE(I2cBusAccessor);
- NON_MOVEABLE(I2cBusAccessor);
- AMS_DDSF_CASTABLE_TRAITS(ams::i2c::driver::board::nintendo_nx::impl::I2cBusAccessor, ::ams::i2c::driver::II2cDriver);
- private:
- enum class State {
- NotInitialized = 0,
- Initializing = 1,
- Initialized = 2,
- Suspended = 3,
- PowerBusSuspended = 4,
- };
-
- enum Xfer {
- Xfer_Write = 0,
- Xfer_Read = 1,
- };
- private:
- volatile I2cRegisters *registers;
- SpeedMode speed_mode;
- os::InterruptEventType interrupt_event;
- int user_count;
- os::SdkMutex user_count_mutex;
- os::SdkMutex register_mutex;
- regulator::RegulatorSession regulator_session;
- bool has_regulator_session;
- State state;
- os::SdkMutex transaction_order_mutex;
- bool is_power_bus;
- dd::PhysicalAddress registers_phys_addr;
- size_t registers_size;
- os::InterruptName interrupt_name;
- DeviceCode device_code;
- util::IntrusiveListNode bus_accessor_list_node;
- public:
- using BusAccessorListTraits = util::IntrusiveListMemberTraitsDeferredAssert<&I2cBusAccessor::bus_accessor_list_node>;
- using BusAccessorList = typename BusAccessorListTraits::ListType;
- friend class util::IntrusiveList>;
- public:
- I2cBusAccessor()
- : registers(nullptr), speed_mode(SpeedMode_Fast), user_count(0), user_count_mutex(),
- register_mutex(), has_regulator_session(false), state(State::NotInitialized), transaction_order_mutex(),
- is_power_bus(false), registers_phys_addr(0), registers_size(0), interrupt_name(), device_code(-1), bus_accessor_list_node()
- {
- /* ... */
- }
-
- void Initialize(dd::PhysicalAddress reg_paddr, size_t reg_size, os::InterruptName intr, bool pb, SpeedMode sm);
- void RegisterDeviceCode(DeviceCode device_code);
-
- SpeedMode GetSpeedMode() const { return this->speed_mode; }
- dd::PhysicalAddress GetRegistersPhysicalAddress() const { return this->registers_phys_addr; }
- size_t GetRegistersSize() const { return this->registers_size; }
- os::InterruptName GetInterruptName() const { return this->interrupt_name; }
- private:
- Result TryOpenRegulatorSession();
-
- void ExecuteInitialConfig();
-
- Result Send(const u8 *src, size_t src_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode);
- Result Receive(u8 *dst, size_t dst_size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode);
-
- void WriteHeader(Xfer xfer, size_t size, TransactionOption option, u16 slave_address, AddressingMode addressing_mode);
-
- void ResetController() const;
- void ClearBus() const;
- void SetClockRegisters(SpeedMode speed_mode);
- void SetPacketModeRegisters();
-
- Result FlushFifos();
-
- Result GetTransactionResult() const;
- void HandleTransactionError(Result result);
-
- void DisableInterruptMask() {
- reg::Write(this->registers->interrupt_mask_register, 0);
- reg::Read(this->registers->interrupt_mask_register);
- }
-
- Result CheckAndHandleError() {
- const Result result = this->GetTransactionResult();
- this->HandleTransactionError(result);
- if (R_FAILED(result)) {
- this->DisableInterruptMask();
- os::ClearInterruptEvent(std::addressof(this->interrupt_event));
- return result;
- }
-
- return ResultSuccess();
- }
- public:
- virtual void InitializeDriver() override;
- virtual void FinalizeDriver() override;
-
- virtual Result InitializeDevice(I2cDeviceProperty *device) override;
- virtual void FinalizeDevice(I2cDeviceProperty *device) override;
-
- virtual Result Send(I2cDeviceProperty *device, const void *src, size_t src_size, TransactionOption option) override;
- virtual Result Receive(void *dst, size_t dst_size, I2cDeviceProperty *device, TransactionOption option) override;
-
- virtual os::SdkMutex &GetTransactionOrderMutex() override {
- return this->transaction_order_mutex;
- }
-
- virtual void SuspendBus() override;
- virtual void SuspendPowerBus() override;
-
- virtual void ResumeBus() override;
- virtual void ResumePowerBus() override;
-
- virtual const DeviceCode &GetDeviceCode() const override {
- return this->device_code;
- }
- };
-
-}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_manager.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_manager.hpp
deleted file mode 100644
index 64ae466..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_bus_manager.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-#include "i2c_bus_accessor.hpp"
-#include "i2c_i_allocator.hpp"
-
-namespace ams::i2c::driver::board::nintendo_nx::impl {
-
- class I2cBusAccessorManager : public IAllocator {
- /* ... */
- };
-
-}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_device_property_manager.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_device_property_manager.hpp
deleted file mode 100644
index 726d876..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_device_property_manager.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-#include "i2c_i_allocator.hpp"
-
-namespace ams::i2c::driver::board::nintendo_nx::impl {
-
- class I2cDevicePropertyManager : public IAllocator {
- /* ... */
- };
-
-}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_i2c_registers.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_i2c_registers.hpp
deleted file mode 100644
index c8925ce..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_i2c_registers.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-namespace ams::i2c::driver::board::nintendo_nx::impl {
-
- struct I2cRegisters {
- volatile u32 cnfg;
- volatile u32 cmd_addr0;
- volatile u32 cmd_addr1;
- volatile u32 cmd_data1;
- volatile u32 cmd_data2;
- volatile u32 _14;
- volatile u32 _18;
- volatile u32 status;
- volatile u32 sl_cnfg;
- volatile u32 sl_rcvd;
- volatile u32 sl_status;
- volatile u32 sl_addr1;
- volatile u32 sl_addr2;
- volatile u32 tlow_sext;
- volatile u32 _38;
- volatile u32 sl_delay_count;
- volatile u32 sl_int_mask;
- volatile u32 sl_int_source;
- volatile u32 sl_int_set;
- volatile u32 _4c;
- volatile u32 tx_packet_fifo;
- volatile u32 rx_fifo;
- volatile u32 packet_transfer_status;
- volatile u32 fifo_control;
- volatile u32 fifo_status;
- volatile u32 interrupt_mask_register;
- volatile u32 interrupt_status_register;
- volatile u32 clk_divisor_register;
- volatile u32 interrupt_source_register;
- volatile u32 interrupt_set_register;
- volatile u32 slv_tx_packet_fifo;
- volatile u32 slv_rx_fifo;
- volatile u32 slv_packet_status;
- volatile u32 bus_clear_config;
- volatile u32 bus_clear_status;
- volatile u32 config_load;
- volatile u32 _90;
- volatile u32 interface_timing_0;
- volatile u32 interface_timing_1;
- volatile u32 hs_interface_timing_0;
- volatile u32 hs_interface_timing_1;
- };
- static_assert(sizeof(I2cRegisters) == 0xA4);
-
-}
diff --git a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_i_allocator.hpp b/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_i_allocator.hpp
deleted file mode 100644
index 270c882..0000000
--- a/libraries/libstratosphere/source/i2c/driver/board/nintendo_nx/impl/i2c_i_allocator.hpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-namespace ams::i2c::driver::board::nintendo_nx::impl {
-
- template
- class IAllocator {
- private:
- using T = typename ListType::value_type;
- private:
- ams::MemoryResource *memory_resource;
- ListType list;
- mutable os::SdkMutex list_lock;
- public:
- IAllocator(ams::MemoryResource *mr) : memory_resource(mr), list(), list_lock() { /* ... */ }
-
- ~IAllocator() {
- std::scoped_lock lk(this->list_lock);
-
- /* Remove all entries. */
- auto it = this->list.begin();
- while (it != this->list.end()) {
- T *obj = std::addressof(*it);
- it = this->list.erase(it);
-
- obj->~T();
- this->memory_resource->Deallocate(obj, sizeof(T));
- }
- }
-
- template
- T *Allocate(Args &&...args) {
- std::scoped_lock lk(this->list_lock);
-
- /* Allocate space for the object. */
- void *storage = this->memory_resource->Allocate(sizeof(T), alignof(T));
- AMS_ABORT_UNLESS(storage != nullptr);
-
- /* Construct the object. */
- T *t = new (static_cast(storage)) T(std::forward(args)...);
-
- /* Link the object into our list. */
- this->list.push_back(*t);
-
- return t;
- }
-
- template
- T *Find(F f) {
- std::scoped_lock lk(this->list_lock);
-
- for (T &it : this->list) {
- if (f(static_cast(it))) {
- return std::addressof(it);
- }
- }
-
- return nullptr;
- }
-
- /* TODO: Support free */
- };
-
-}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_board_driver_api.cpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_board_driver_api.cpp
new file mode 100644
index 0000000..fc35ce9
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_board_driver_api.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "pinmux_pad_index.hpp"
+#include "pinmux_board_driver_api.hpp"
+#include "pinmux_platform_pads.hpp"
+
+namespace ams::pinmux::driver::board::nintendo_nx {
+
+ namespace {
+
+ constinit bool g_initialized = false;
+
+ #include "pinmux_initial_pad_config_icosa.inc"
+ #include "pinmux_initial_pad_config_hoag.inc"
+ #include "pinmux_initial_pad_config_iowa.inc"
+ #include "pinmux_initial_pad_config_calcio.inc"
+ #include "pinmux_initial_pad_config_aula.inc"
+
+ #include "pinmux_initial_drive_pad_config.inc"
+ #include "pinmux_initial_drive_pad_config_hoag.inc"
+
+ }
+
+ bool IsInitialized() {
+ return g_initialized;
+ }
+
+ void Initialize() {
+ InitializePlatformPads();
+ g_initialized = true;
+ }
+
+ void Finalize() {
+ /* ... */
+ }
+
+ void SetInitialConfig() {
+ const PinmuxPadConfig *configs = nullptr;
+ size_t num_configs = 0;
+ bool is_mariko = false;
+ switch (spl::GetHardwareType()) {
+ case spl::HardwareType::Icosa:
+ configs = PinmuxPadConfigsIcosa;
+ num_configs = NumPinmuxPadConfigsIcosa;
+ is_mariko = false;
+ break;
+ case spl::HardwareType::Hoag:
+ configs = PinmuxPadConfigsHoag;
+ num_configs = NumPinmuxPadConfigsHoag;
+ is_mariko = true;
+ break;
+ case spl::HardwareType::Iowa:
+ configs = PinmuxPadConfigsIowa;
+ num_configs = NumPinmuxPadConfigsIowa;
+ is_mariko = true;
+ break;
+ case spl::HardwareType::Calcio:
+ configs = PinmuxPadConfigsCalcio;
+ num_configs = NumPinmuxPadConfigsCalcio;
+ is_mariko = true;
+ break;
+ case spl::HardwareType::Aula:
+ configs = PinmuxPadConfigsAula;
+ num_configs = NumPinmuxPadConfigsAula;
+ is_mariko = true;
+ break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ AMS_ABORT_UNLESS(configs != nullptr);
+
+ for (size_t i = 0; i < num_configs; ++i) {
+ UpdateSinglePinmuxPad(configs[i]);
+ }
+
+ if (is_mariko) {
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Clk, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Cmd, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat0, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat1, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat2, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat3, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat4, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat5, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat6, 0x2000, 0x2000 });
+ UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat7, 0x2000, 0x2000 });
+ }
+ }
+
+ void SetInitialDrivePadConfig() {
+ const PinmuxDrivePadConfig *configs = nullptr;
+ size_t num_configs = 0;
+ switch (spl::GetHardwareType()) {
+ case spl::HardwareType::Icosa:
+ configs = PinmuxDrivePadConfigs;
+ num_configs = NumPinmuxDrivePadConfigs;
+ break;
+ case spl::HardwareType::Hoag:
+ configs = PinmuxDrivePadConfigsHoag;
+ num_configs = NumPinmuxDrivePadConfigsHoag;
+ break;
+ case spl::HardwareType::Iowa:
+ configs = PinmuxDrivePadConfigs;
+ num_configs = NumPinmuxDrivePadConfigs;
+ break;
+ case spl::HardwareType::Calcio:
+ configs = PinmuxDrivePadConfigs;
+ num_configs = NumPinmuxDrivePadConfigs;
+ break;
+ case spl::HardwareType::Aula:
+ configs = PinmuxDrivePadConfigs;
+ num_configs = NumPinmuxDrivePadConfigs;
+ break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ AMS_ABORT_UNLESS(configs != nullptr);
+
+ for (size_t i = 0; i < num_configs; ++i) {
+ UpdateSinglePinmuxDrivePad(configs[i]);
+ }
+ }
+
+}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_board_driver_api.hpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_board_driver_api.hpp
new file mode 100644
index 0000000..48be15d
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_board_driver_api.hpp
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::pinmux::driver::board::nintendo_nx {
+
+ bool IsInitialized();
+
+ void Initialize();
+ void Finalize();
+
+ void SetInitialConfig();
+ void SetInitialDrivePadConfig();
+
+}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_drive_pad_characters.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_drive_pad_characters.inc
new file mode 100644
index 0000000..a6ed61f
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_drive_pad_characters.inc
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_character_gen.py, do not edit manually. */
+
+constexpr inline const PinmuxDrivePadCharacter PinmuxDrivePadCharacters[] = {
+ { 0x08E4, 0x01F1F000, "AlsProxInt" },
+ { 0x08E8, 0x01F1F000, "ApReady" },
+ { 0x08EC, 0x01F1F000, "ApWakeBt" },
+ { 0x08F0, 0x01F1F000, "ApWakeNfc" },
+ { 0x08F4, 0x01F1F000, "AudMclk" },
+ { 0x08F8, 0x01F1F000, "BattBcl" },
+ { 0x08FC, 0x01F1F000, "BtRst" },
+ { 0x0900, 0x01F1F000, "BtWakeAp" },
+ { 0x0904, 0x01F1F000, "ButtonHome" },
+ { 0x0908, 0x01F1F000, "ButtonPowerOn" },
+ { 0x090C, 0x01F1F000, "ButtonSlideSw" },
+ { 0x0910, 0x01F1F000, "ButtonVolDown" },
+ { 0x0914, 0x01F1F000, "ButtonVolUp" },
+ { 0x0918, 0x01F1F000, "Cam1Mclk" },
+ { 0x091C, 0x01F1F000, "Cam1Pwdn" },
+ { 0x0920, 0x01F1F000, "Cam1Strobe" },
+ { 0x0924, 0x01F1F000, "Cam2Mclk" },
+ { 0x0928, 0x01F1F000, "Cam2Pwdn" },
+ { 0x092C, 0x01F1F000, "CamAfEn" },
+ { 0x0930, 0x01F1F000, "CamFlashEn" },
+ { 0x0934, 0x01F1F000, "CamI2cScl" },
+ { 0x0938, 0x01F1F000, "CamI2cSda" },
+ { 0x093C, 0x01F1F000, "CamRst" },
+ { 0x0940, 0x01F1F000, "Clk32kIn" },
+ { 0x0944, 0x01F1F000, "Clk32kOut" },
+ { 0x0948, 0x01F1F000, "ClkReq" },
+ { 0x094C, 0x01F1F000, "CorePwrReq" },
+ { 0x0950, 0x01F1F000, "CpuPwrReq" },
+ { 0x0954, 0xF0000000, "Dap1Din" },
+ { 0x0958, 0xF0000000, "Dap1Dout" },
+ { 0x095C, 0xF0000000, "Dap1Fs" },
+ { 0x0960, 0xF0000000, "Dap1Sclk" },
+ { 0x0964, 0xF0000000, "Dap2Din" },
+ { 0x0968, 0xF0000000, "Dap2Dout" },
+ { 0x096C, 0xF0000000, "Dap2Fs" },
+ { 0x0970, 0xF0000000, "Dap2Sclk" },
+ { 0x0974, 0x01F1F000, "Dap4Din" },
+ { 0x0978, 0x01F1F000, "Dap4Dout" },
+ { 0x097C, 0x01F1F000, "Dap4Fs" },
+ { 0x0980, 0x01F1F000, "Dap4Sclk" },
+ { 0x0984, 0x01F1F000, "Dmic1Clk" },
+ { 0x0988, 0x01F1F000, "Dmic1Dat" },
+ { 0x098C, 0x01F1F000, "Dmic2Clk" },
+ { 0x0990, 0x01F1F000, "Dmic2Dat" },
+ { 0x0994, 0x01F1F000, "Dmic3Clk" },
+ { 0x0998, 0x01F1F000, "Dmic3Dat" },
+ { 0x099C, 0x01F1F000, "DpHpd" },
+ { 0x09A0, 0x01F1F000, "DvfsClk" },
+ { 0x09A4, 0x01F1F000, "DvfsPwm" },
+ { 0x09A8, 0x01F1F000, "Gen1I2cScl" },
+ { 0x09AC, 0x01F1F000, "Gen1I2cSda" },
+ { 0x09B0, 0x01F1F000, "Gen2I2cScl" },
+ { 0x09B4, 0x01F1F000, "Gen2I2cSda" },
+ { 0x09B8, 0x01F1F000, "Gen3I2cScl" },
+ { 0x09BC, 0x01F1F000, "Gen3I2cSda" },
+ { 0x09C0, 0x01F1F000, "GpioPa6" },
+ { 0x09C4, 0x01F1F000, "GpioPcc7" },
+ { 0x09C8, 0x01F1F000, "GpioPe6" },
+ { 0x09CC, 0x01F1F000, "GpioPe7" },
+ { 0x09D0, 0x01F1F000, "GpioPh6" },
+ { 0x09D4, 0xF0000000, "GpioPk0" },
+ { 0x09D8, 0xF0000000, "GpioPk1" },
+ { 0x09DC, 0xF0000000, "GpioPk2" },
+ { 0x09E0, 0xF0000000, "GpioPk3" },
+ { 0x09E4, 0xF0000000, "GpioPk4" },
+ { 0x09E8, 0xF0000000, "GpioPk5" },
+ { 0x09EC, 0xF0000000, "GpioPk6" },
+ { 0x09F0, 0xF0000000, "GpioPk7" },
+ { 0x09F4, 0xF0000000, "GpioPl0" },
+ { 0x09F8, 0xF0000000, "GpioPl1" },
+ { 0x09FC, 0x07F7F000, "GpioPz0" },
+ { 0x0A00, 0x07F7F000, "GpioPz1" },
+ { 0x0A04, 0x07F7F000, "GpioPz2" },
+ { 0x0A08, 0x07F7F000, "GpioPz3" },
+ { 0x0A0C, 0x07F7F000, "GpioPz4" },
+ { 0x0A10, 0x07F7F000, "GpioPz5" },
+ { 0x0A14, 0x01F1F000, "GpioX1Aud" },
+ { 0x0A18, 0x01F1F000, "GpioX3Aud" },
+ { 0x0A1C, 0x01F1F000, "GpsEn" },
+ { 0x0A20, 0x01F1F000, "GpsRst" },
+ { 0x0A24, 0x01F1F000, "HdmiCec" },
+ { 0x0A28, 0x01F1F000, "HdmiIntDpHpd" },
+ { 0x0A2C, 0x01F1F000, "JtagRtck" },
+ { 0x0A30, 0x01F1F000, "LcdBlEn" },
+ { 0x0A34, 0x01F1F000, "LcdBlPwm" },
+ { 0x0A38, 0x01F1F000, "LcdGpio1" },
+ { 0x0A3C, 0x01F1F000, "LcdGpio2" },
+ { 0x0A40, 0x01F1F000, "LcdRst" },
+ { 0x0A44, 0x01F1F000, "LcdTe" },
+ { 0x0A48, 0x01F1F000, "ModemWakeAp" },
+ { 0x0A4C, 0x01F1F000, "MotionInt" },
+ { 0x0A50, 0x01F1F000, "NfcEn" },
+ { 0x0A54, 0x01F1F000, "NfcInt" },
+ { 0x0A58, 0x01F1F000, "PexL0ClkReqN" },
+ { 0x0A5C, 0x01F1F000, "PexL0RstN" },
+ { 0x0A60, 0x01F1F000, "PexL1ClkreqN" },
+ { 0x0A64, 0x01F1F000, "PexL1RstN" },
+ { 0x0A68, 0x01F1F000, "PexWakeN" },
+ { 0x0A6C, 0x01F1F000, "PwrI2cScl" },
+ { 0x0A70, 0x01F1F000, "PwrI2cSda" },
+ { 0x0A74, 0x01F1F000, "PwrIntN" },
+ { 0x0A78, 0x07F7F000, "QspiComp" },
+ { 0x0A90, 0xF0000000, "QspiSck" },
+ { 0x0A94, 0x01F1F000, "SataLedActive" },
+ { 0x0A98, 0xF7F7F000, "Sdmmc1Pad" },
+ { 0x0AB0, 0xF7F7F000, "Sdmmc3Pad" },
+ { 0x0AC8, 0x01F1F000, "Shutdown" },
+ { 0x0ACC, 0x01F1F000, "SpdifIn" },
+ { 0x0AD0, 0x01F1F000, "SpdifOut" },
+ { 0x0AD4, 0xF0000000, "Spi1Cs0" },
+ { 0x0AD8, 0xF0000000, "Spi1Cs1" },
+ { 0x0ADC, 0xF0000000, "Spi1Miso" },
+ { 0x0AE0, 0xF0000000, "Spi1Mosi" },
+ { 0x0AE4, 0xF0000000, "Spi1Sck" },
+ { 0x0AE8, 0xF0000000, "Spi2Cs0" },
+ { 0x0AEC, 0xF0000000, "Spi2Cs1" },
+ { 0x0AF0, 0xF0000000, "Spi2Miso" },
+ { 0x0AF4, 0xF0000000, "Spi2Mosi" },
+ { 0x0AF8, 0xF0000000, "Spi2Sck" },
+ { 0x0AFC, 0xF0000000, "Spi4Cs0" },
+ { 0x0B00, 0xF0000000, "Spi4Miso" },
+ { 0x0B04, 0xF0000000, "Spi4Mosi" },
+ { 0x0B08, 0xF0000000, "Spi4Sck" },
+ { 0x0B0C, 0x01F1F000, "TempAlert" },
+ { 0x0B10, 0x01F1F000, "TouchClk" },
+ { 0x0B14, 0x01F1F000, "TouchInt" },
+ { 0x0B18, 0x01F1F000, "TouchRst" },
+ { 0x0B1C, 0x01F1F000, "Uart1Cts" },
+ { 0x0B20, 0x01F1F000, "Uart1Rts" },
+ { 0x0B24, 0x01F1F000, "Uart1Rx" },
+ { 0x0B28, 0x01F1F000, "Uart1Tx" },
+ { 0x0B2C, 0x01F1F000, "Uart2Cts" },
+ { 0x0B30, 0x01F1F000, "Uart2Rts" },
+ { 0x0B34, 0x01F1F000, "Uart2Rx" },
+ { 0x0B38, 0x01F1F000, "Uart2Tx" },
+ { 0x0B3C, 0x01F1F000, "Uart3Cts" },
+ { 0x0B40, 0x01F1F000, "Uart3Rts" },
+ { 0x0B44, 0x01F1F000, "Uart3Rx" },
+ { 0x0B48, 0x01F1F000, "Uart3Tx" },
+ { 0x0B4C, 0x01F1F000, "Uart4Cts" },
+ { 0x0B50, 0x01F1F000, "Uart4Rts" },
+ { 0x0B54, 0x01F1F000, "Uart4Rx" },
+ { 0x0B58, 0x01F1F000, "Uart4Tx" },
+ { 0x0B5C, 0x01F1F000, "UsbVbusEn0" },
+ { 0x0B60, 0x01F1F000, "UsbVbusEn1" },
+ { 0x0B64, 0x01F1F000, "WifiEn" },
+ { 0x0B68, 0x01F1F000, "WifiRst" },
+ { 0x0B6C, 0x01F1F000, "WifiWakeAp" },
+};
+
+constexpr inline size_t NumPinmuxDrivePadCharacters = util::size(PinmuxDrivePadCharacters);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_drive_pad_config.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_drive_pad_config.inc
new file mode 100644
index 0000000..2caa615
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_drive_pad_config.inc
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by drive_pad_initial_config.py, do not edit manually. */
+
+constexpr inline const PinmuxDrivePadConfig PinmuxDrivePadConfigs[] = {
+ { PinmuxDrivePadIndex_AudMclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Cam1Mclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Cam2Mclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamAfEn, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamFlashEn, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamI2cScl, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamI2cSda, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Din, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Dout, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Fs, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Sclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic1Clk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic1Dat, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic2Clk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic2Dat, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic3Clk, 0x01F1F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic3Dat, 0x01F1F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_DvfsClk, 0x01F1F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_DvfsPwm, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen1I2cScl, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen1I2cSda, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen2I2cScl, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen2I2cSda, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen3I2cScl, 0x00007000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen3I2cSda, 0x00007000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioPz0, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioPz1, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioX1Aud, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioX3Aud, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_PwrI2cScl, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_PwrI2cSda, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_TouchClk, 0x01414000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Cts, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Rts, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Rx, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Tx, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Spi1Cs0, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Cs1, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Miso, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Mosi, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Sck, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Cs0, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Cs1, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Miso, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Mosi, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Sck, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Sdmmc3Pad, 0x51212000, 0xF1F1F000 },
+};
+
+constexpr inline const size_t NumPinmuxDrivePadConfigs = util::size(PinmuxDrivePadConfigs);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_drive_pad_config_hoag.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_drive_pad_config_hoag.inc
new file mode 100644
index 0000000..8831b8f
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_drive_pad_config_hoag.inc
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by drive_pad_initial_config.py, do not edit manually. */
+
+constexpr inline const PinmuxDrivePadConfig PinmuxDrivePadConfigsHoag[] = {
+ { PinmuxDrivePadIndex_AudMclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Cam1Mclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Cam2Mclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamAfEn, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamFlashEn, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamI2cScl, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_CamI2cSda, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Din, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Dout, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Fs, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dap4Sclk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic1Clk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic1Dat, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic2Clk, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic2Dat, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic3Clk, 0x01F1F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Dmic3Dat, 0x01F1F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_DvfsClk, 0x01F1F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_DvfsPwm, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen1I2cScl, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen1I2cSda, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen2I2cScl, 0x00004000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen2I2cSda, 0x00004000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen3I2cScl, 0x00007000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Gen3I2cSda, 0x00007000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioPz0, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioPz1, 0x01010000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioX1Aud, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_GpioX3Aud, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_PwrI2cScl, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_PwrI2cSda, 0x0001F000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_TouchClk, 0x01414000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Cts, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Rts, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Rx, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Uart3Tx, 0x01404000, 0x01F1F000 },
+ { PinmuxDrivePadIndex_Spi1Cs0, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Cs1, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Miso, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Mosi, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi1Sck, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Cs0, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Cs1, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Miso, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Mosi, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Spi2Sck, 0x00000000, 0xF0000000 },
+ { PinmuxDrivePadIndex_Sdmmc3Pad, 0x51212000, 0xF1F1F000 },
+};
+
+constexpr inline const size_t NumPinmuxDrivePadConfigsHoag = util::size(PinmuxDrivePadConfigsHoag);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_aula.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_aula.inc
new file mode 100644
index 0000000..14bcc76
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_aula.inc
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
+
+constexpr inline const PinmuxPadConfig PinmuxPadConfigsAula[] = {
+{ PinmuxPadIndex_AudMclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Clk, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
+{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Clk32kOut, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Uart2Rx, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart2Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart2Cts, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Spi4Mosi, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Spi4Miso, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Spi4Sck, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Spi4Cs0, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart3Cts, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Dmic1Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic1Dat, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic2Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic2Dat, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
+{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_AlsProxInt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonSlideSw, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ButtonHome, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPz0, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Uart2Tx, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
+{ PinmuxPadIndex_GpioPk3, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_Uart3Tx, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_WifiEn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
+{ PinmuxPadIndex_SpdifIn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DvfsClk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam1Mclk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdBlPwm, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdBlEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz5, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
+{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000000 },
+{ PinmuxPadIndex_Dap4Din, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPk7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPl0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_NfcEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_NfcInt, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_SpdifOut, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_UsbVbusEn0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
+};
+
+constexpr inline const size_t NumPinmuxPadConfigsAula = util::size(PinmuxPadConfigsAula);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_calcio.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_calcio.inc
new file mode 100644
index 0000000..94bca5c
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_calcio.inc
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
+
+constexpr inline const PinmuxPadConfig PinmuxPadConfigsCalcio[] = {
+{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
+{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Clk32kOut, 0x00000001, 0x0000007F },
+{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_HdmiCec, 0x00000240, 0x0000027F },
+{ PinmuxPadIndex_Dmic1Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic1Dat, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic2Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic2Dat, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPe6, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_Gen3I2cSda, 0x00000204, 0x0000027F },
+{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonHome, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
+{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_Spi1Mosi, 0x0000000C, 0x0000007F },
+{ PinmuxPadIndex_Spi1Miso, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_Spi1Sck, 0x0000000C, 0x0000007F },
+{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPh6, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
+{ PinmuxPadIndex_DpHpd0, 0x00000004, 0x0000007F },
+{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000024, 0x0000027F },
+{ PinmuxPadIndex_AudMclk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DvfsClk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioX1Aud, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioX3Aud, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap1Din, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap1Dout, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap1Fs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap1Sclk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Gen3I2cScl, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamI2cSda, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam1Mclk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam2Mclk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamFlashEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_SataLedActive, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_AlsProxInt, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_MotionInt, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_TouchRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_TouchInt, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ButtonSlideSw, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdBlPwm, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdBlEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz4, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz5, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000018 },
+{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000018 },
+{ PinmuxPadIndex_Dap4Din, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap4Sclk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Gen2I2cScl, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Gen2I2cSda, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Tx, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Rx, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Rts, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Cts, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPk3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPk5, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPk7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPl0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPl1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi4Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi4Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi4Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi4Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart3Tx, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart3Rx, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart3Rts, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart3Cts, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_NfcEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_NfcInt, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_SpdifOut, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_SpdifIn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_UsbVbusEn0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
+};
+
+constexpr inline const size_t NumPinmuxPadConfigsCalcio = util::size(PinmuxPadConfigsCalcio);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_hoag.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_hoag.inc
new file mode 100644
index 0000000..d0efa99
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_hoag.inc
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
+
+constexpr inline const PinmuxPadConfig PinmuxPadConfigsHoag[] = {
+{ PinmuxPadIndex_AudMclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Clk, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_TouchClk, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_LcdBlPwm, 0x00000001, 0x00000067 },
+{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
+{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Clk32kOut, 0x00000001, 0x0000007F },
+{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart3Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart3Cts, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Dmic1Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic1Dat, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic2Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic2Dat, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPe7, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
+{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Cam2Pwdn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Cam1Strobe, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_AlsProxInt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonSlideSw, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ButtonHome, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_LcdBlEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_LcdGpio1, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPz0, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dap4Dout, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dap4Fs, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
+{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk7, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Spi4Mosi, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Spi4Miso, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Spi4Sck, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Spi4Cs0, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
+{ PinmuxPadIndex_NfcEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_NfcInt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_UsbVbusEn1, 0x00000204, 0x00000267 },
+{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DvfsClk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam1Mclk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPz5, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
+{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000000 },
+{ PinmuxPadIndex_Dap4Din, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Tx, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Rx, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Rts, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Uart2Cts, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPk3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPl0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_SpdifOut, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_SpdifIn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_UsbVbusEn0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
+};
+
+constexpr inline const size_t NumPinmuxPadConfigsHoag = util::size(PinmuxPadConfigsHoag);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_icosa.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_icosa.inc
new file mode 100644
index 0000000..e1cee6f
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_icosa.inc
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
+
+constexpr inline const PinmuxPadConfig PinmuxPadConfigsIcosa[] = {
+{ PinmuxPadIndex_AudMclk, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x00000267 },
+{ PinmuxPadIndex_PexL1ClkreqN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x00000267 },
+{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_Sdmmc1Clk, 0x00000048, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_LcdBlPwm, 0x00000001, 0x00000067 },
+{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
+{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Clk32kOut, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_GpioPz5, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000060 },
+{ PinmuxPadIndex_PwrIntN, 0x00000030, 0x00000078 },
+{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Uart2Rx, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart2Rts, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart2Cts, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Spi4Mosi, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Spi4Miso, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Spi4Sck, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Spi4Cs0, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart3Cts, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_QspiIo0, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_QspiIo1, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_QspiSck, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_QspiCsN, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_DvfsClk, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dmic3Dat, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
+{ PinmuxPadIndex_Cam1Mclk, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Cam1Pwdn, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Sdmmc3Clk, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonPowerOn, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonSlideSw, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonHome, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_LcdBlEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPz0, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz2, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dap4Din, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Uart2Tx, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
+{ PinmuxPadIndex_GpioPk3, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk7, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPl0, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Uart3Tx, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
+{ PinmuxPadIndex_NfcEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_NfcInt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_SpdifOut, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_SpdifIn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_UsbVbusEn0, 0x00000004, 0x00000267 },
+{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic1Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic1Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic2Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic2Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_AlsProxInt, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
+{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
+};
+
+constexpr inline const size_t NumPinmuxPadConfigsIcosa = util::size(PinmuxPadConfigsIcosa);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_iowa.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_iowa.inc
new file mode 100644
index 0000000..3b0022e
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_initial_pad_config_iowa.inc
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
+
+constexpr inline const PinmuxPadConfig PinmuxPadConfigsIowa[] = {
+{ PinmuxPadIndex_AudMclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
+{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Clk, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000040, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000050, 0x0000007F },
+{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_LcdBlPwm, 0x00000001, 0x00000067 },
+{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
+{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Clk32kOut, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_GpioPz5, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
+{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
+{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
+{ PinmuxPadIndex_Uart2Rx, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart2Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart2Cts, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
+{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Spi4Mosi, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Spi4Miso, 0x00000030, 0x0000007F },
+{ PinmuxPadIndex_Spi4Sck, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Spi4Cs0, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart3Cts, 0x00000020, 0x0000007F },
+{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
+{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
+{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000020, 0x0000027F },
+{ PinmuxPadIndex_DvfsClk, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
+{ PinmuxPadIndex_Cam1Mclk, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Sdmmc3Clk, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_AlsProxInt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_ButtonSlideSw, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ButtonHome, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_LcdBlEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPz0, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz2, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dap4Din, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Uart2Tx, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
+{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
+{ PinmuxPadIndex_GpioPk3, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_GpioPl0, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_Uart3Tx, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
+{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
+{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
+{ PinmuxPadIndex_NfcEn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_NfcInt, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_SpdifOut, 0x00000034, 0x0000007F },
+{ PinmuxPadIndex_SpdifIn, 0x00000004, 0x00000067 },
+{ PinmuxPadIndex_UsbVbusEn0, 0x00000004, 0x00000267 },
+{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic1Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic1Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic2Clk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic2Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
+{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000000 },
+{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPk7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
+{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
+};
+
+constexpr inline const size_t NumPinmuxPadConfigsIowa = util::size(PinmuxPadConfigsIowa);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_pad_characters.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_pad_characters.inc
new file mode 100644
index 0000000..a84081d
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_pad_characters.inc
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_character_gen.py, do not edit manually. */
+
+constexpr inline const PinmuxPadCharacter PinmuxPadCharacters[] = {
+ { 0x3000, 0x072FF, 0x01, "Sdmmc1Clk" },
+ { 0x3004, 0x072FF, 0x02, "Sdmmc1Cmd" },
+ { 0x3008, 0x072FF, 0x02, "Sdmmc1Dat3" },
+ { 0x300C, 0x072FF, 0x02, "Sdmmc1Dat2" },
+ { 0x3010, 0x072FF, 0x02, "Sdmmc1Dat1" },
+ { 0x3014, 0x072FF, 0x01, "Sdmmc1Dat0" },
+ { 0x301C, 0x072FF, 0x01, "Sdmmc3Clk" },
+ { 0x3020, 0x072FF, 0x01, "Sdmmc3Cmd" },
+ { 0x3024, 0x072FF, 0x01, "Sdmmc3Dat0" },
+ { 0x3028, 0x072FF, 0x01, "Sdmmc3Dat1" },
+ { 0x302C, 0x072FF, 0x01, "Sdmmc3Dat2" },
+ { 0x3030, 0x072FF, 0x01, "Sdmmc3Dat3" },
+ { 0x3038, 0x01DFF, 0x01, "PexL0RstN" },
+ { 0x303C, 0x01DFF, 0x01, "PexL0ClkreqN" },
+ { 0x3040, 0x01DFF, 0x01, "PexWakeN" },
+ { 0x3044, 0x01DFF, 0x01, "PexL1RstN" },
+ { 0x3048, 0x01DFF, 0x01, "PexL1ClkreqN" },
+ { 0x304C, 0x019FF, 0x01, "SataLedActive" },
+ { 0x3050, 0x1F2FF, 0x01, "Spi1Mosi" },
+ { 0x3054, 0x1F2FF, 0x01, "Spi1Miso" },
+ { 0x3058, 0x1F2FF, 0x01, "Spi1Sck" },
+ { 0x305C, 0x1F2FF, 0x01, "Spi1Cs0" },
+ { 0x3060, 0x1F2FF, 0x01, "Spi1Cs1" },
+ { 0x3064, 0x072FF, 0x02, "Spi2Mosi" },
+ { 0x3068, 0x072FF, 0x02, "Spi2Miso" },
+ { 0x306C, 0x072FF, 0x02, "Spi2Sck" },
+ { 0x3070, 0x072FF, 0x02, "Spi2Cs0" },
+ { 0x3074, 0x072FF, 0x01, "Spi2Cs1" },
+ { 0x3078, 0x1F2FF, 0x01, "Spi4Mosi" },
+ { 0x307C, 0x1F2FF, 0x01, "Spi4Miso" },
+ { 0x3080, 0x1F2FF, 0x01, "Spi4Sck" },
+ { 0x3084, 0x1F2FF, 0x01, "Spi4Cs0" },
+ { 0x3088, 0x072FF, 0x01, "QspiSck" },
+ { 0x308C, 0x072FF, 0x01, "QspiCsN" },
+ { 0x3090, 0x072FF, 0x01, "QspiIo0" },
+ { 0x3094, 0x072FF, 0x01, "QspiIo1" },
+ { 0x3098, 0x072FF, 0x01, "QspiIo2" },
+ { 0x309C, 0x072FF, 0x01, "QspiIo3" },
+ { 0x30A4, 0x019FF, 0x02, "Dmic1Clk" },
+ { 0x30A8, 0x019FF, 0x02, "Dmic1Dat" },
+ { 0x30AC, 0x019FF, 0x02, "Dmic2Clk" },
+ { 0x30B0, 0x019FF, 0x02, "Dmic2Dat" },
+ { 0x30B4, 0x019FF, 0x02, "Dmic3Clk" },
+ { 0x30B8, 0x019FF, 0x02, "Dmic3Dat" },
+ { 0x30BC, 0x01DFF, 0x01, "Gen1I2cScl" },
+ { 0x30C0, 0x01DFF, 0x01, "Gen1I2cSda" },
+ { 0x30C4, 0x01DFF, 0x01, "Gen2I2cScl" },
+ { 0x30C8, 0x01DFF, 0x01, "Gen2I2cSda" },
+ { 0x30CC, 0x01DFF, 0x01, "Gen3I2cScl" },
+ { 0x30D0, 0x01DFF, 0x01, "Gen3I2cSda" },
+ { 0x30D4, 0x01DFF, 0x02, "CamI2cScl" },
+ { 0x30D8, 0x01DFF, 0x02, "CamI2cSda" },
+ { 0x30DC, 0x01DFF, 0x01, "PwrI2cScl" },
+ { 0x30E0, 0x01DFF, 0x01, "PwrI2cSda" },
+ { 0x30E4, 0x019FF, 0x01, "Uart1Tx" },
+ { 0x30E8, 0x019FF, 0x01, "Uart1Rx" },
+ { 0x30EC, 0x019FF, 0x01, "Uart1Rts" },
+ { 0x30F0, 0x019FF, 0x01, "Uart1Cts" },
+ { 0x30F4, 0x019FF, 0x00, "Uart2Tx" },
+ { 0x30F8, 0x019FF, 0x00, "Uart2Rx" },
+ { 0x30FC, 0x019FF, 0x02, "Uart2Rts" },
+ { 0x3100, 0x019FF, 0x02, "Uart2Cts" },
+ { 0x3104, 0x019FF, 0x02, "Uart3Tx" },
+ { 0x3108, 0x019FF, 0x02, "Uart3Rx" },
+ { 0x310C, 0x019FF, 0x02, "Uart3Rts" },
+ { 0x3110, 0x019FF, 0x02, "Uart3Cts" },
+ { 0x3114, 0x019FF, 0x02, "Uart4Tx" },
+ { 0x3118, 0x019FF, 0x02, "Uart4Rx" },
+ { 0x311C, 0x019FF, 0x02, "Uart4Rts" },
+ { 0x3120, 0x019FF, 0x02, "Uart4Cts" },
+ { 0x3124, 0x072FF, 0x01, "Dap1Fs" },
+ { 0x3128, 0x072FF, 0x01, "Dap1Din" },
+ { 0x312C, 0x072FF, 0x01, "Dap1Dout" },
+ { 0x3130, 0x072FF, 0x01, "Dap1Sclk" },
+ { 0x3134, 0x072FF, 0x01, "Dap2Fs" },
+ { 0x3138, 0x072FF, 0x01, "Dap2Din" },
+ { 0x313C, 0x072FF, 0x01, "Dap2Dout" },
+ { 0x3140, 0x072FF, 0x01, "Dap2Sclk" },
+ { 0x3144, 0x072FF, 0x01, "Dap4Fs" },
+ { 0x3148, 0x072FF, 0x01, "Dap4Din" },
+ { 0x314C, 0x072FF, 0x01, "Dap4Dout" },
+ { 0x3150, 0x072FF, 0x01, "Dap4Sclk" },
+ { 0x3154, 0x072FF, 0x01, "Cam1Mclk" },
+ { 0x3158, 0x072FF, 0x01, "Cam2Mclk" },
+ { 0x315C, 0x072FF, 0x01, "JtagRtck" },
+ { 0x3160, 0x0118C, 0xFF, "Clk32kIn" },
+ { 0x3164, 0x072FF, 0x02, "Clk32kOut" },
+ { 0x3168, 0x01DFF, 0x01, "BattBcl" },
+ { 0x316C, 0x011CC, 0xFF, "ClkReq" },
+ { 0x3170, 0x011CC, 0xFF, "CpuPwrReq" },
+ { 0x3174, 0x011CC, 0xFF, "PwrIntN" },
+ { 0x3178, 0x011CC, 0xFF, "Shutdown" },
+ { 0x317C, 0x011CC, 0xFF, "CorePwrReq" },
+ { 0x3180, 0x019FF, 0x01, "AudMclk" },
+ { 0x3184, 0x019FF, 0x00, "DvfsPwm" },
+ { 0x3188, 0x019FF, 0x00, "DvfsClk" },
+ { 0x318C, 0x019FF, 0x00, "GpioX1Aud" },
+ { 0x3190, 0x019FF, 0x00, "GpioX3Aud" },
+ { 0x3194, 0x01DFF, 0x00, "GpioPcc7" },
+ { 0x3198, 0x01DFF, 0x01, "HdmiCec" },
+ { 0x319C, 0x01DFF, 0x01, "HdmiIntDpHpd" },
+ { 0x31A0, 0x019FF, 0x01, "SpdifOut" },
+ { 0x31A4, 0x019FF, 0x01, "SpdifIn" },
+ { 0x31A8, 0x01DFF, 0x01, "UsbVbusEn0" },
+ { 0x31AC, 0x01DFF, 0x01, "UsbVbusEn1" },
+ { 0x31B0, 0x019FF, 0x01, "DpHpd0" },
+ { 0x31B4, 0x019FF, 0x00, "WifiEn" },
+ { 0x31B8, 0x019FF, 0x00, "WifiRst" },
+ { 0x31BC, 0x019FF, 0x00, "WifiWakeAp" },
+ { 0x31C0, 0x019FF, 0x00, "ApWakeBt" },
+ { 0x31C4, 0x019FF, 0x00, "BtRst" },
+ { 0x31C8, 0x019FF, 0x00, "BtWakeAp" },
+ { 0x31CC, 0x019FF, 0x00, "ApWakeNfc" },
+ { 0x31D0, 0x019FF, 0x00, "NfcEn" },
+ { 0x31D4, 0x019FF, 0x00, "NfcInt" },
+ { 0x31D8, 0x019FF, 0x00, "GpsEn" },
+ { 0x31DC, 0x019FF, 0x00, "GpsRst" },
+ { 0x31E0, 0x019FF, 0x01, "CamRst" },
+ { 0x31E4, 0x019FF, 0x02, "CamAfEn" },
+ { 0x31E8, 0x019FF, 0x02, "CamFlashEn" },
+ { 0x31EC, 0x019FF, 0x01, "Cam1Pwdn" },
+ { 0x31F0, 0x019FF, 0x01, "Cam2Pwdn" },
+ { 0x31F4, 0x019FF, 0x01, "Cam1Strobe" },
+ { 0x31F8, 0x019FF, 0x01, "LcdTe" },
+ { 0x31FC, 0x019FF, 0x03, "LcdBlPwm" },
+ { 0x3200, 0x019FF, 0x00, "LcdBlEn" },
+ { 0x3204, 0x019FF, 0x00, "LcdRst" },
+ { 0x3208, 0x019FF, 0x01, "LcdGpio1" },
+ { 0x320C, 0x019FF, 0x02, "LcdGpio2" },
+ { 0x3210, 0x019FF, 0x00, "ApReady" },
+ { 0x3214, 0x019FF, 0x00, "TouchRst" },
+ { 0x3218, 0x019FF, 0x01, "TouchClk" },
+ { 0x321C, 0x019FF, 0x00, "ModemWakeAp" },
+ { 0x3220, 0x019FF, 0x00, "TouchInt" },
+ { 0x3224, 0x019FF, 0x00, "MotionInt" },
+ { 0x3228, 0x019FF, 0x00, "AlsProxInt" },
+ { 0x322C, 0x019FF, 0x00, "TempAlert" },
+ { 0x3230, 0x019FF, 0x00, "ButtonPowerOn" },
+ { 0x3234, 0x019FF, 0x00, "ButtonVolUp" },
+ { 0x3238, 0x019FF, 0x00, "ButtonVolDown" },
+ { 0x323C, 0x019FF, 0x00, "ButtonSlideSw" },
+ { 0x3240, 0x019FF, 0x00, "ButtonHome" },
+ { 0x3244, 0x019FF, 0x01, "GpioPa6" },
+ { 0x3248, 0x019FF, 0x00, "GpioPe6" },
+ { 0x324C, 0x019FF, 0x00, "GpioPe7" },
+ { 0x3250, 0x019FF, 0x00, "GpioPh6" },
+ { 0x3254, 0x072FF, 0x02, "GpioPk0" },
+ { 0x3258, 0x072FF, 0x02, "GpioPk1" },
+ { 0x325C, 0x072FF, 0x02, "GpioPk2" },
+ { 0x3260, 0x072FF, 0x02, "GpioPk3" },
+ { 0x3264, 0x072FF, 0x01, "GpioPk4" },
+ { 0x3268, 0x072FF, 0x01, "GpioPk5" },
+ { 0x326C, 0x072FF, 0x01, "GpioPk6" },
+ { 0x3270, 0x072FF, 0x01, "GpioPk7" },
+ { 0x3274, 0x072FF, 0x00, "GpioPl0" },
+ { 0x3278, 0x072FF, 0x01, "GpioPl1" },
+ { 0x327C, 0x072FF, 0x01, "GpioPz0" },
+ { 0x3280, 0x072FF, 0x02, "GpioPz1" },
+ { 0x3284, 0x072FF, 0x02, "GpioPz2" },
+ { 0x3288, 0x072FF, 0x01, "GpioPz3" },
+ { 0x328C, 0x072FF, 0x01, "GpioPz4" },
+ { 0x3290, 0x072FF, 0x01, "GpioPz5" },
+ { 0x3294, 0x1F2FF, 0x02, "Sdmmc2Dat0" },
+ { 0x3298, 0x1F2FF, 0x02, "Sdmmc2Dat1" },
+ { 0x329C, 0x1F2FF, 0x02, "Sdmmc2Dat2" },
+ { 0x32A0, 0x1F2FF, 0x02, "Sdmmc2Dat3" },
+ { 0x32A4, 0x1F2FF, 0x02, "Sdmmc2Dat4" },
+ { 0x32A8, 0x1F2FF, 0x02, "Sdmmc2Dat5" },
+ { 0x32AC, 0x1F2FF, 0x02, "Sdmmc2Dat6" },
+ { 0x32B0, 0x1F2FF, 0x02, "Sdmmc2Dat7" },
+ { 0x32B4, 0x1F2FF, 0x02, "Sdmmc2Clk" },
+ { 0x32B8, 0x1F2FF, 0x00, "Sdmmc2Clkb" },
+ { 0x32BC, 0x1F2FF, 0x02, "Sdmmc2Cmd" },
+ { 0x32C0, 0x1F2FF, 0x00, "Sdmmc2Dqs" },
+ { 0x32C4, 0x1F2FF, 0x00, "Sdmmc2Dqsb" },
+};
+
+constexpr inline size_t NumPinmuxPadCharacters = util::size(PinmuxPadCharacters);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_pad_index.hpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_pad_index.hpp
new file mode 100644
index 0000000..df2dc59
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_pad_index.hpp
@@ -0,0 +1,348 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by pinmux_character_gen.py, do not edit manually. */
+
+#pragma once
+
+enum PinmuxPadIndex {
+ PinmuxPadIndex_Sdmmc1Clk = 0,
+ PinmuxPadIndex_Sdmmc1Cmd = 1,
+ PinmuxPadIndex_Sdmmc1Dat3 = 2,
+ PinmuxPadIndex_Sdmmc1Dat2 = 3,
+ PinmuxPadIndex_Sdmmc1Dat1 = 4,
+ PinmuxPadIndex_Sdmmc1Dat0 = 5,
+ PinmuxPadIndex_Sdmmc3Clk = 6,
+ PinmuxPadIndex_Sdmmc3Cmd = 7,
+ PinmuxPadIndex_Sdmmc3Dat0 = 8,
+ PinmuxPadIndex_Sdmmc3Dat1 = 9,
+ PinmuxPadIndex_Sdmmc3Dat2 = 10,
+ PinmuxPadIndex_Sdmmc3Dat3 = 11,
+ PinmuxPadIndex_PexL0RstN = 12,
+ PinmuxPadIndex_PexL0ClkreqN = 13,
+ PinmuxPadIndex_PexWakeN = 14,
+ PinmuxPadIndex_PexL1RstN = 15,
+ PinmuxPadIndex_PexL1ClkreqN = 16,
+ PinmuxPadIndex_SataLedActive = 17,
+ PinmuxPadIndex_Spi1Mosi = 18,
+ PinmuxPadIndex_Spi1Miso = 19,
+ PinmuxPadIndex_Spi1Sck = 20,
+ PinmuxPadIndex_Spi1Cs0 = 21,
+ PinmuxPadIndex_Spi1Cs1 = 22,
+ PinmuxPadIndex_Spi2Mosi = 23,
+ PinmuxPadIndex_Spi2Miso = 24,
+ PinmuxPadIndex_Spi2Sck = 25,
+ PinmuxPadIndex_Spi2Cs0 = 26,
+ PinmuxPadIndex_Spi2Cs1 = 27,
+ PinmuxPadIndex_Spi4Mosi = 28,
+ PinmuxPadIndex_Spi4Miso = 29,
+ PinmuxPadIndex_Spi4Sck = 30,
+ PinmuxPadIndex_Spi4Cs0 = 31,
+ PinmuxPadIndex_QspiSck = 32,
+ PinmuxPadIndex_QspiCsN = 33,
+ PinmuxPadIndex_QspiIo0 = 34,
+ PinmuxPadIndex_QspiIo1 = 35,
+ PinmuxPadIndex_QspiIo2 = 36,
+ PinmuxPadIndex_QspiIo3 = 37,
+ PinmuxPadIndex_Dmic1Clk = 38,
+ PinmuxPadIndex_Dmic1Dat = 39,
+ PinmuxPadIndex_Dmic2Clk = 40,
+ PinmuxPadIndex_Dmic2Dat = 41,
+ PinmuxPadIndex_Dmic3Clk = 42,
+ PinmuxPadIndex_Dmic3Dat = 43,
+ PinmuxPadIndex_Gen1I2cScl = 44,
+ PinmuxPadIndex_Gen1I2cSda = 45,
+ PinmuxPadIndex_Gen2I2cScl = 46,
+ PinmuxPadIndex_Gen2I2cSda = 47,
+ PinmuxPadIndex_Gen3I2cScl = 48,
+ PinmuxPadIndex_Gen3I2cSda = 49,
+ PinmuxPadIndex_CamI2cScl = 50,
+ PinmuxPadIndex_CamI2cSda = 51,
+ PinmuxPadIndex_PwrI2cScl = 52,
+ PinmuxPadIndex_PwrI2cSda = 53,
+ PinmuxPadIndex_Uart1Tx = 54,
+ PinmuxPadIndex_Uart1Rx = 55,
+ PinmuxPadIndex_Uart1Rts = 56,
+ PinmuxPadIndex_Uart1Cts = 57,
+ PinmuxPadIndex_Uart2Tx = 58,
+ PinmuxPadIndex_Uart2Rx = 59,
+ PinmuxPadIndex_Uart2Rts = 60,
+ PinmuxPadIndex_Uart2Cts = 61,
+ PinmuxPadIndex_Uart3Tx = 62,
+ PinmuxPadIndex_Uart3Rx = 63,
+ PinmuxPadIndex_Uart3Rts = 64,
+ PinmuxPadIndex_Uart3Cts = 65,
+ PinmuxPadIndex_Uart4Tx = 66,
+ PinmuxPadIndex_Uart4Rx = 67,
+ PinmuxPadIndex_Uart4Rts = 68,
+ PinmuxPadIndex_Uart4Cts = 69,
+ PinmuxPadIndex_Dap1Fs = 70,
+ PinmuxPadIndex_Dap1Din = 71,
+ PinmuxPadIndex_Dap1Dout = 72,
+ PinmuxPadIndex_Dap1Sclk = 73,
+ PinmuxPadIndex_Dap2Fs = 74,
+ PinmuxPadIndex_Dap2Din = 75,
+ PinmuxPadIndex_Dap2Dout = 76,
+ PinmuxPadIndex_Dap2Sclk = 77,
+ PinmuxPadIndex_Dap4Fs = 78,
+ PinmuxPadIndex_Dap4Din = 79,
+ PinmuxPadIndex_Dap4Dout = 80,
+ PinmuxPadIndex_Dap4Sclk = 81,
+ PinmuxPadIndex_Cam1Mclk = 82,
+ PinmuxPadIndex_Cam2Mclk = 83,
+ PinmuxPadIndex_JtagRtck = 84,
+ PinmuxPadIndex_Clk32kIn = 85,
+ PinmuxPadIndex_Clk32kOut = 86,
+ PinmuxPadIndex_BattBcl = 87,
+ PinmuxPadIndex_ClkReq = 88,
+ PinmuxPadIndex_CpuPwrReq = 89,
+ PinmuxPadIndex_PwrIntN = 90,
+ PinmuxPadIndex_Shutdown = 91,
+ PinmuxPadIndex_CorePwrReq = 92,
+ PinmuxPadIndex_AudMclk = 93,
+ PinmuxPadIndex_DvfsPwm = 94,
+ PinmuxPadIndex_DvfsClk = 95,
+ PinmuxPadIndex_GpioX1Aud = 96,
+ PinmuxPadIndex_GpioX3Aud = 97,
+ PinmuxPadIndex_GpioPcc7 = 98,
+ PinmuxPadIndex_HdmiCec = 99,
+ PinmuxPadIndex_HdmiIntDpHpd = 100,
+ PinmuxPadIndex_SpdifOut = 101,
+ PinmuxPadIndex_SpdifIn = 102,
+ PinmuxPadIndex_UsbVbusEn0 = 103,
+ PinmuxPadIndex_UsbVbusEn1 = 104,
+ PinmuxPadIndex_DpHpd0 = 105,
+ PinmuxPadIndex_WifiEn = 106,
+ PinmuxPadIndex_WifiRst = 107,
+ PinmuxPadIndex_WifiWakeAp = 108,
+ PinmuxPadIndex_ApWakeBt = 109,
+ PinmuxPadIndex_BtRst = 110,
+ PinmuxPadIndex_BtWakeAp = 111,
+ PinmuxPadIndex_ApWakeNfc = 112,
+ PinmuxPadIndex_NfcEn = 113,
+ PinmuxPadIndex_NfcInt = 114,
+ PinmuxPadIndex_GpsEn = 115,
+ PinmuxPadIndex_GpsRst = 116,
+ PinmuxPadIndex_CamRst = 117,
+ PinmuxPadIndex_CamAfEn = 118,
+ PinmuxPadIndex_CamFlashEn = 119,
+ PinmuxPadIndex_Cam1Pwdn = 120,
+ PinmuxPadIndex_Cam2Pwdn = 121,
+ PinmuxPadIndex_Cam1Strobe = 122,
+ PinmuxPadIndex_LcdTe = 123,
+ PinmuxPadIndex_LcdBlPwm = 124,
+ PinmuxPadIndex_LcdBlEn = 125,
+ PinmuxPadIndex_LcdRst = 126,
+ PinmuxPadIndex_LcdGpio1 = 127,
+ PinmuxPadIndex_LcdGpio2 = 128,
+ PinmuxPadIndex_ApReady = 129,
+ PinmuxPadIndex_TouchRst = 130,
+ PinmuxPadIndex_TouchClk = 131,
+ PinmuxPadIndex_ModemWakeAp = 132,
+ PinmuxPadIndex_TouchInt = 133,
+ PinmuxPadIndex_MotionInt = 134,
+ PinmuxPadIndex_AlsProxInt = 135,
+ PinmuxPadIndex_TempAlert = 136,
+ PinmuxPadIndex_ButtonPowerOn = 137,
+ PinmuxPadIndex_ButtonVolUp = 138,
+ PinmuxPadIndex_ButtonVolDown = 139,
+ PinmuxPadIndex_ButtonSlideSw = 140,
+ PinmuxPadIndex_ButtonHome = 141,
+ PinmuxPadIndex_GpioPa6 = 142,
+ PinmuxPadIndex_GpioPe6 = 143,
+ PinmuxPadIndex_GpioPe7 = 144,
+ PinmuxPadIndex_GpioPh6 = 145,
+ PinmuxPadIndex_GpioPk0 = 146,
+ PinmuxPadIndex_GpioPk1 = 147,
+ PinmuxPadIndex_GpioPk2 = 148,
+ PinmuxPadIndex_GpioPk3 = 149,
+ PinmuxPadIndex_GpioPk4 = 150,
+ PinmuxPadIndex_GpioPk5 = 151,
+ PinmuxPadIndex_GpioPk6 = 152,
+ PinmuxPadIndex_GpioPk7 = 153,
+ PinmuxPadIndex_GpioPl0 = 154,
+ PinmuxPadIndex_GpioPl1 = 155,
+ PinmuxPadIndex_GpioPz0 = 156,
+ PinmuxPadIndex_GpioPz1 = 157,
+ PinmuxPadIndex_GpioPz2 = 158,
+ PinmuxPadIndex_GpioPz3 = 159,
+ PinmuxPadIndex_GpioPz4 = 160,
+ PinmuxPadIndex_GpioPz5 = 161,
+ PinmuxPadIndex_Sdmmc2Dat0 = 162,
+ PinmuxPadIndex_Sdmmc2Dat1 = 163,
+ PinmuxPadIndex_Sdmmc2Dat2 = 164,
+ PinmuxPadIndex_Sdmmc2Dat3 = 165,
+ PinmuxPadIndex_Sdmmc2Dat4 = 166,
+ PinmuxPadIndex_Sdmmc2Dat5 = 167,
+ PinmuxPadIndex_Sdmmc2Dat6 = 168,
+ PinmuxPadIndex_Sdmmc2Dat7 = 169,
+ PinmuxPadIndex_Sdmmc2Clk = 170,
+ PinmuxPadIndex_Sdmmc2Clkb = 171,
+ PinmuxPadIndex_Sdmmc2Cmd = 172,
+ PinmuxPadIndex_Sdmmc2Dqs = 173,
+ PinmuxPadIndex_Sdmmc2Dqsb = 174,
+};
+
+enum PinmuxDrivePadIndex {
+ PinmuxDrivePadIndex_AlsProxInt = 0,
+ PinmuxDrivePadIndex_ApReady = 1,
+ PinmuxDrivePadIndex_ApWakeBt = 2,
+ PinmuxDrivePadIndex_ApWakeNfc = 3,
+ PinmuxDrivePadIndex_AudMclk = 4,
+ PinmuxDrivePadIndex_BattBcl = 5,
+ PinmuxDrivePadIndex_BtRst = 6,
+ PinmuxDrivePadIndex_BtWakeAp = 7,
+ PinmuxDrivePadIndex_ButtonHome = 8,
+ PinmuxDrivePadIndex_ButtonPowerOn = 9,
+ PinmuxDrivePadIndex_ButtonSlideSw = 10,
+ PinmuxDrivePadIndex_ButtonVolDown = 11,
+ PinmuxDrivePadIndex_ButtonVolUp = 12,
+ PinmuxDrivePadIndex_Cam1Mclk = 13,
+ PinmuxDrivePadIndex_Cam1Pwdn = 14,
+ PinmuxDrivePadIndex_Cam1Strobe = 15,
+ PinmuxDrivePadIndex_Cam2Mclk = 16,
+ PinmuxDrivePadIndex_Cam2Pwdn = 17,
+ PinmuxDrivePadIndex_CamAfEn = 18,
+ PinmuxDrivePadIndex_CamFlashEn = 19,
+ PinmuxDrivePadIndex_CamI2cScl = 20,
+ PinmuxDrivePadIndex_CamI2cSda = 21,
+ PinmuxDrivePadIndex_CamRst = 22,
+ PinmuxDrivePadIndex_Clk32kIn = 23,
+ PinmuxDrivePadIndex_Clk32kOut = 24,
+ PinmuxDrivePadIndex_ClkReq = 25,
+ PinmuxDrivePadIndex_CorePwrReq = 26,
+ PinmuxDrivePadIndex_CpuPwrReq = 27,
+ PinmuxDrivePadIndex_Dap1Din = 28,
+ PinmuxDrivePadIndex_Dap1Dout = 29,
+ PinmuxDrivePadIndex_Dap1Fs = 30,
+ PinmuxDrivePadIndex_Dap1Sclk = 31,
+ PinmuxDrivePadIndex_Dap2Din = 32,
+ PinmuxDrivePadIndex_Dap2Dout = 33,
+ PinmuxDrivePadIndex_Dap2Fs = 34,
+ PinmuxDrivePadIndex_Dap2Sclk = 35,
+ PinmuxDrivePadIndex_Dap4Din = 36,
+ PinmuxDrivePadIndex_Dap4Dout = 37,
+ PinmuxDrivePadIndex_Dap4Fs = 38,
+ PinmuxDrivePadIndex_Dap4Sclk = 39,
+ PinmuxDrivePadIndex_Dmic1Clk = 40,
+ PinmuxDrivePadIndex_Dmic1Dat = 41,
+ PinmuxDrivePadIndex_Dmic2Clk = 42,
+ PinmuxDrivePadIndex_Dmic2Dat = 43,
+ PinmuxDrivePadIndex_Dmic3Clk = 44,
+ PinmuxDrivePadIndex_Dmic3Dat = 45,
+ PinmuxDrivePadIndex_DpHpd = 46,
+ PinmuxDrivePadIndex_DvfsClk = 47,
+ PinmuxDrivePadIndex_DvfsPwm = 48,
+ PinmuxDrivePadIndex_Gen1I2cScl = 49,
+ PinmuxDrivePadIndex_Gen1I2cSda = 50,
+ PinmuxDrivePadIndex_Gen2I2cScl = 51,
+ PinmuxDrivePadIndex_Gen2I2cSda = 52,
+ PinmuxDrivePadIndex_Gen3I2cScl = 53,
+ PinmuxDrivePadIndex_Gen3I2cSda = 54,
+ PinmuxDrivePadIndex_GpioPa6 = 55,
+ PinmuxDrivePadIndex_GpioPcc7 = 56,
+ PinmuxDrivePadIndex_GpioPe6 = 57,
+ PinmuxDrivePadIndex_GpioPe7 = 58,
+ PinmuxDrivePadIndex_GpioPh6 = 59,
+ PinmuxDrivePadIndex_GpioPk0 = 60,
+ PinmuxDrivePadIndex_GpioPk1 = 61,
+ PinmuxDrivePadIndex_GpioPk2 = 62,
+ PinmuxDrivePadIndex_GpioPk3 = 63,
+ PinmuxDrivePadIndex_GpioPk4 = 64,
+ PinmuxDrivePadIndex_GpioPk5 = 65,
+ PinmuxDrivePadIndex_GpioPk6 = 66,
+ PinmuxDrivePadIndex_GpioPk7 = 67,
+ PinmuxDrivePadIndex_GpioPl0 = 68,
+ PinmuxDrivePadIndex_GpioPl1 = 69,
+ PinmuxDrivePadIndex_GpioPz0 = 70,
+ PinmuxDrivePadIndex_GpioPz1 = 71,
+ PinmuxDrivePadIndex_GpioPz2 = 72,
+ PinmuxDrivePadIndex_GpioPz3 = 73,
+ PinmuxDrivePadIndex_GpioPz4 = 74,
+ PinmuxDrivePadIndex_GpioPz5 = 75,
+ PinmuxDrivePadIndex_GpioX1Aud = 76,
+ PinmuxDrivePadIndex_GpioX3Aud = 77,
+ PinmuxDrivePadIndex_GpsEn = 78,
+ PinmuxDrivePadIndex_GpsRst = 79,
+ PinmuxDrivePadIndex_HdmiCec = 80,
+ PinmuxDrivePadIndex_HdmiIntDpHpd = 81,
+ PinmuxDrivePadIndex_JtagRtck = 82,
+ PinmuxDrivePadIndex_LcdBlEn = 83,
+ PinmuxDrivePadIndex_LcdBlPwm = 84,
+ PinmuxDrivePadIndex_LcdGpio1 = 85,
+ PinmuxDrivePadIndex_LcdGpio2 = 86,
+ PinmuxDrivePadIndex_LcdRst = 87,
+ PinmuxDrivePadIndex_LcdTe = 88,
+ PinmuxDrivePadIndex_ModemWakeAp = 89,
+ PinmuxDrivePadIndex_MotionInt = 90,
+ PinmuxDrivePadIndex_NfcEn = 91,
+ PinmuxDrivePadIndex_NfcInt = 92,
+ PinmuxDrivePadIndex_PexL0ClkReqN = 93,
+ PinmuxDrivePadIndex_PexL0RstN = 94,
+ PinmuxDrivePadIndex_PexL1ClkreqN = 95,
+ PinmuxDrivePadIndex_PexL1RstN = 96,
+ PinmuxDrivePadIndex_PexWakeN = 97,
+ PinmuxDrivePadIndex_PwrI2cScl = 98,
+ PinmuxDrivePadIndex_PwrI2cSda = 99,
+ PinmuxDrivePadIndex_PwrIntN = 100,
+ PinmuxDrivePadIndex_QspiComp = 101,
+ PinmuxDrivePadIndex_QspiSck = 102,
+ PinmuxDrivePadIndex_SataLedActive = 103,
+ PinmuxDrivePadIndex_Sdmmc1Pad = 104,
+ PinmuxDrivePadIndex_Sdmmc3Pad = 105,
+ PinmuxDrivePadIndex_Shutdown = 106,
+ PinmuxDrivePadIndex_SpdifIn = 107,
+ PinmuxDrivePadIndex_SpdifOut = 108,
+ PinmuxDrivePadIndex_Spi1Cs0 = 109,
+ PinmuxDrivePadIndex_Spi1Cs1 = 110,
+ PinmuxDrivePadIndex_Spi1Miso = 111,
+ PinmuxDrivePadIndex_Spi1Mosi = 112,
+ PinmuxDrivePadIndex_Spi1Sck = 113,
+ PinmuxDrivePadIndex_Spi2Cs0 = 114,
+ PinmuxDrivePadIndex_Spi2Cs1 = 115,
+ PinmuxDrivePadIndex_Spi2Miso = 116,
+ PinmuxDrivePadIndex_Spi2Mosi = 117,
+ PinmuxDrivePadIndex_Spi2Sck = 118,
+ PinmuxDrivePadIndex_Spi4Cs0 = 119,
+ PinmuxDrivePadIndex_Spi4Miso = 120,
+ PinmuxDrivePadIndex_Spi4Mosi = 121,
+ PinmuxDrivePadIndex_Spi4Sck = 122,
+ PinmuxDrivePadIndex_TempAlert = 123,
+ PinmuxDrivePadIndex_TouchClk = 124,
+ PinmuxDrivePadIndex_TouchInt = 125,
+ PinmuxDrivePadIndex_TouchRst = 126,
+ PinmuxDrivePadIndex_Uart1Cts = 127,
+ PinmuxDrivePadIndex_Uart1Rts = 128,
+ PinmuxDrivePadIndex_Uart1Rx = 129,
+ PinmuxDrivePadIndex_Uart1Tx = 130,
+ PinmuxDrivePadIndex_Uart2Cts = 131,
+ PinmuxDrivePadIndex_Uart2Rts = 132,
+ PinmuxDrivePadIndex_Uart2Rx = 133,
+ PinmuxDrivePadIndex_Uart2Tx = 134,
+ PinmuxDrivePadIndex_Uart3Cts = 135,
+ PinmuxDrivePadIndex_Uart3Rts = 136,
+ PinmuxDrivePadIndex_Uart3Rx = 137,
+ PinmuxDrivePadIndex_Uart3Tx = 138,
+ PinmuxDrivePadIndex_Uart4Cts = 139,
+ PinmuxDrivePadIndex_Uart4Rts = 140,
+ PinmuxDrivePadIndex_Uart4Rx = 141,
+ PinmuxDrivePadIndex_Uart4Tx = 142,
+ PinmuxDrivePadIndex_UsbVbusEn0 = 143,
+ PinmuxDrivePadIndex_UsbVbusEn1 = 144,
+ PinmuxDrivePadIndex_WifiEn = 145,
+ PinmuxDrivePadIndex_WifiRst = 146,
+ PinmuxDrivePadIndex_WifiWakeAp = 147,
+};
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_platform_pads.cpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_platform_pads.cpp
new file mode 100644
index 0000000..7efce9d
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_platform_pads.cpp
@@ -0,0 +1,641 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "pinmux_pad_index.hpp"
+#include "pinmux_board_driver_api.hpp"
+#include "pinmux_platform_pads.hpp"
+
+namespace ams::pinmux::driver::board::nintendo_nx {
+
+ namespace {
+
+ uintptr_t g_apb_misc_virtual_address = dd::QueryIoMapping(0x70000000, 0x4000);
+
+ enum PinmuxPadMask : u32 {
+ PinmuxPadMask_Pm = 0x3,
+ PinmuxPadMask_Pupd = 0xC,
+ PinmuxPadMask_Tristate = 0x10,
+ PinmuxPadMask_Park = 0x20,
+ PinmuxPadMask_EInput = 0x40,
+ PinmuxPadMask_Lock = 0x80,
+ PinmuxPadMask_ELpdr = 0x100,
+ PinmuxPadMask_EHsm = 0x200,
+ PinmuxPadMask_EIoHv = 0x400,
+ PinmuxPadMask_EOd = 0x800,
+ PinmuxPadMask_ESchmt = 0x1000,
+ PinmuxPadMask_DrvType = 0x6000,
+ PinmuxPadMask_Preemp = 0x8000,
+ PinmuxPadMask_IoReset = 0x10000,
+ };
+
+ enum PinmuxPadBitOffset : u32 {
+ PinmuxPadBitOffset_Pm = 0x0,
+ PinmuxPadBitOffset_Pupd = 0x2,
+ PinmuxPadBitOffset_Tristate = 0x4,
+ PinmuxPadBitOffset_Park = 0x5,
+ PinmuxPadBitOffset_EInput = 0x6,
+ PinmuxPadBitOffset_Lock = 0x7,
+ PinmuxPadBitOffset_ELpdr = 0x8,
+ PinmuxPadBitOffset_EHsm = 0x9,
+ PinmuxPadBitOffset_EIoHv = 0xA,
+ PinmuxPadBitOffset_EOd = 0xB,
+ PinmuxPadBitOffset_ESchmt = 0xC,
+ PinmuxPadBitOffset_DrvType = 0xD,
+ PinmuxPadBitOffset_Preemp = 0xF,
+ PinmuxPadBitOffset_IoReset = 0x10,
+ };
+
+ enum PinmuxOptBitMask : u32 {
+ PinmuxOptBitMask_Pm = 0x7,
+ PinmuxOptBitMask_Pupd = 0x18,
+ PinmuxOptBitMask_Dir = 0x60,
+ PinmuxOptBitMask_Lock = 0x80,
+ PinmuxOptBitMask_IoReset = 0x100,
+ PinmuxOptBitMask_IoHv = 0x200,
+ PinmuxOptBitMask_Park = 0x400,
+ PinmuxOptBitMask_Lpdr = 0x800,
+ PinmuxOptBitMask_Hsm = 0x1000,
+ PinmuxOptBitMask_Schmt = 0x2000,
+ PinmuxOptBitMask_DrvType = 0xC000,
+ PinmuxOptBitMask_Preemp = 0x10000,
+ };
+
+ enum PinmuxOptBitOffset {
+ PinmuxOptBitOffset_Pm = 0x0,
+ PinmuxOptBitOffset_Pupd = 0x3,
+ PinmuxOptBitOffset_Dir = 0x5,
+ PinmuxOptBitOffset_Lock = 0x7,
+ PinmuxOptBitOffset_IoReset = 0x8,
+ PinmuxOptBitOffset_IoHv = 0x9,
+ PinmuxOptBitOffset_Park = 0xA,
+ PinmuxOptBitOffset_Lpdr = 0xB,
+ PinmuxOptBitOffset_Hsm = 0xC,
+ PinmuxOptBitOffset_Schmt = 0xD,
+ PinmuxOptBitOffset_DrvType = 0xE,
+ PinmuxOptBitOffset_Preemp = 0x10,
+ };
+
+ enum PinmuxDrivePadMask : u32{
+ PinmuxDrivePadMask_DrvDn = 0x0001F000,
+ PinmuxDrivePadMask_DrvUp = 0x01F00000,
+ PinmuxDrivePadMask_CzDrvDn = 0x0007F000,
+ PinmuxDrivePadMask_CzDrvUp = 0x07F00000,
+ PinmuxDrivePadMask_SlwR = 0x30000000,
+ PinmuxDrivePadMask_SlwF = 0xC0000000,
+ };
+
+ enum PinmuxDrivePadBitOffset : u32 {
+ PinmuxDrivePadBitOffset_DrvDn = 12,
+ PinmuxDrivePadBitOffset_DrvUp = 20,
+ PinmuxDrivePadBitOffset_CzDrvDn = 12,
+ PinmuxDrivePadBitOffset_CzDrvUp = 20,
+ PinmuxDrivePadBitOffset_SlwR = 28,
+ PinmuxDrivePadBitOffset_SlwF = 30,
+ };
+
+ enum PinmuxDriveOptBitMask : u32 {
+ PinmuxDriveOptBitMask_DrvDn = 0x0001F000,
+ PinmuxDriveOptBitMask_DrvUp = 0x01F00000,
+ PinmuxDriveOptBitMask_CzDrvDn = 0x0007F000,
+ PinmuxDriveOptBitMask_CzDrvUp = 0x07F00000,
+ PinmuxDriveOptBitMask_SlwR = 0x30000000,
+ PinmuxDriveOptBitMask_SlwF = 0xC0000000,
+ };
+
+ enum PinmuxDriveOptBitOffset : u32 {
+ PinmuxDriveOptBitOffset_DrvDn = 12,
+ PinmuxDriveOptBitOffset_DrvUp = 20,
+ PinmuxDriveOptBitOffset_CzDrvDn = 12,
+ PinmuxDriveOptBitOffset_CzDrvUp = 20,
+ PinmuxDriveOptBitOffset_SlwR = 28,
+ PinmuxDriveOptBitOffset_SlwF = 30,
+ };
+
+ enum PinmuxOpt : u32 {
+ /* Pm */
+ PinmuxOpt_Gpio = 0x4,
+ PinmuxOpt_Unused = 0x5,
+
+ /* Pupd */
+ PinmuxOpt_NoPupd = 0x0,
+ PinmuxOpt_PullDown = 0x8,
+ PinmuxOpt_PullUp = 0x10,
+
+ /* Dir */
+ PinmuxOpt_Output = 0x0,
+ PinmuxOpt_Input = 0x20,
+ PinmuxOpt_Bidirection = 0x40,
+ PinmuxOpt_OpenDrain = 0x60,
+
+ /* Lock */
+ PinmuxOpt_Unlock = 0x0,
+ PinmuxOpt_Lock = 0x80,
+
+ /* IoReset */
+ PinmuxOpt_DisableIoReset = 0x0,
+ PinmuxOpt_EnableIoReset = 0x100,
+
+ /* IoHv */
+ PinmuxOpt_NormalVoltage = 0x0,
+ PinmuxOpt_HighVoltage = 0x200,
+
+ /* Park */
+ PinmuxOpt_ResetOnLowPower = 0x0,
+ PinmuxOpt_ParkOnLowPower = 0x400,
+
+ /* Lpdr */
+ PinmuxOpt_DisableBaseDriver = 0x0,
+ PinmuxOpt_EnableBaseDriver = 0x800,
+
+ /* Hsm */
+ PinmuxOpt_DisableHighSpeedMode = 0x0,
+ PinmuxOpt_EnableHighSpeedMode = 0x1000,
+
+ /* Schmt */
+ PinmuxOpt_CmosMode = 0x0,
+ PinmuxOpt_SchmittTrigger = 0x2000,
+
+ /* DrvType */
+ PinmuxOpt_DrvType1X = 0x0,
+ PinmuxOpt_DrvType2X = 0x4000,
+ PinmuxOpt_DrvType3X = 0x8000,
+ PinmuxOpt_DrvType4X = 0xC000,
+
+ /* Preemp */
+ PinmuxOpt_DisablePreemp = 0x0,
+ PinmuxOpt_EnablePreemp = 0x10000,
+ };
+
+ enum PinmuxPadPm : u32 {
+ PinmuxPadPm_Default = 0xFFFFFFFF,
+ PinmuxPadPm_Pm0 = 0x0,
+ PinmuxPadPm_Pm1 = 0x1,
+ PinmuxPadPm_Pm2 = 0x2,
+ PinmuxPadPm_Pm3 = 0x3,
+ PinmuxPadPm_Safe = 0x4,
+ };
+
+ struct PinmuxPadCharacter {
+ u32 reg_offset;
+ u32 reg_mask;
+ u8 safe_func;
+ const char *pad_name;
+ };
+
+ struct PinmuxDrivePadCharacter {
+ u32 reg_offset;
+ u32 reg_mask;
+ const char *pad_name;
+ };
+
+ #include "pinmux_pad_characters.inc"
+ #include "pinmux_drive_pad_characters.inc"
+
+ class PinmuxPad {
+ private:
+ u32 reg_address;
+ u32 reg_mask;
+ u32 reg_value;
+ u8 safe_func;
+ const char *pad_name;
+ private:
+ bool IsValidRegisterAddress() const {
+ return this->reg_address - 0x70003000 <= 0x2C4;
+ }
+
+ uintptr_t GetRegisterAddress() const {
+ return g_apb_misc_virtual_address + (this->reg_address - 0x70000000);
+ }
+
+ bool UpdateBits(u32 value, u32 offset, u32 mask) {
+ if ((this->reg_mask & mask) != 0) {
+ if ((value & (mask >> offset)) != ((this->reg_value & mask) >> offset)) {
+ this->reg_value = (this->reg_value & ~mask) | ((value << offset) & mask);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ u32 ReadReg() const {
+ if (this->IsValidRegisterAddress()) {
+ return reg::Read(this->GetRegisterAddress());
+ } else {
+ return 0;
+ }
+ }
+
+ void WriteReg() const {
+ if (this->IsValidRegisterAddress()) {
+ reg::Write(this->GetRegisterAddress(), this->reg_value);
+ }
+ }
+
+ bool IsLocked() const {
+ return (this->reg_value & PinmuxPadMask_Lock) != 0;
+ }
+
+ void UpdatePm(u8 v) {
+ if (v != 0xFF) {
+ if (v == PinmuxPadPm_Safe) {
+ v = this->safe_func;
+ }
+ this->UpdateBits(v, PinmuxPadBitOffset_Pm, PinmuxPadMask_Pm);
+ }
+ }
+
+ void UpdatePupd(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_Pupd, PinmuxPadMask_Pupd);
+ }
+ }
+
+ void UpdateTristate(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_Tristate, PinmuxPadMask_Tristate);
+ }
+ }
+
+ void UpdateEInput(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_EInput, PinmuxPadMask_EInput);
+ }
+ }
+
+ void UpdateEOd(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_EOd, PinmuxPadMask_EOd);
+ }
+ }
+
+ void UpdateLock(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_Lock, PinmuxPadMask_Lock);
+ }
+ }
+
+ void UpdateIoReset(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_IoReset, PinmuxPadMask_IoReset);
+ }
+ }
+
+ void UpdatePark(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_Park, PinmuxPadMask_Park);
+ }
+ }
+
+ void UpdateELpdr(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_ELpdr, PinmuxPadMask_ELpdr);
+ }
+ }
+
+ void UpdateEHsm(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_EHsm, PinmuxPadMask_EHsm);
+ }
+ }
+
+ void UpdateEIoHv(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_EIoHv, PinmuxPadMask_EIoHv);
+ }
+ }
+
+ void UpdateESchmt(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_ESchmt, PinmuxPadMask_ESchmt);
+ }
+ }
+
+ void UpdatePreemp(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_Preemp, PinmuxPadMask_Preemp);
+ }
+ }
+
+ void UpdateDrvType(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxPadBitOffset_DrvType, PinmuxPadMask_DrvType);
+ }
+ }
+ public:
+ constexpr PinmuxPad() : reg_address(), reg_mask(), reg_value(), safe_func(), pad_name() { /* ... */ }
+
+ void UpdatePinmuxPad(u32 config, u32 config_mask) {
+ /* Update register value. */
+ this->reg_value = this->ReadReg();
+
+ /* Check if we're locked. */
+ if (this->IsLocked()) {
+ return;
+ }
+
+ /* Update PM. */
+ if ((config_mask & PinmuxOptBitMask_Pm) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Pm);
+ u8 pm = PinmuxPadPm_Safe;
+ if (opt != PinmuxOpt_Gpio) {
+ if (opt == PinmuxOpt_Unused) {
+ this->UpdatePupd(true);
+ this->UpdateTristate(true);
+ this->UpdateEInput(0);
+ } else if (opt <= PinmuxOpt_Unused) {
+ pm = opt >> PinmuxOptBitOffset_Pm;
+ }
+ }
+ this->UpdatePm(pm);
+ }
+
+ /* Update pupd. */
+ if ((config_mask & PinmuxOptBitMask_Pupd) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Pupd);
+ if (opt == PinmuxOpt_NoPupd || opt == PinmuxOpt_PullDown || opt == PinmuxOpt_PullUp) {
+ this->UpdatePupd(opt >> PinmuxOptBitOffset_Pupd);
+ }
+ }
+
+ /* Update direction. */
+ if ((config_mask & PinmuxOptBitMask_Dir) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Dir);
+ if (opt == PinmuxOpt_Output) {
+ this->UpdateTristate(false);
+ this->UpdateEInput(false);
+ if ((this->reg_mask & PinmuxPadMask_EOd) != 0) {
+ this->UpdateEOd(false);
+ }
+ } else if (opt == PinmuxOpt_Input) {
+ this->UpdateTristate(true);
+ this->UpdateEInput(true);
+ if ((this->reg_mask & PinmuxPadMask_EOd) != 0) {
+ this->UpdateEOd(false);
+ }
+ } else if (opt == PinmuxOpt_Bidirection) {
+ this->UpdateTristate(false);
+ this->UpdateEInput(true);
+ if ((this->reg_mask & PinmuxPadMask_EOd) != 0) {
+ this->UpdateEOd(false);
+ }
+ } else if (opt == PinmuxOpt_OpenDrain) {
+ this->UpdateTristate(false);
+ this->UpdateEInput(true);
+ this->UpdateEOd(true);
+ }
+ }
+
+ /* Update Lock. */
+ if ((config_mask & PinmuxOptBitMask_Lock) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Lock);
+ this->UpdateLock(opt != 0);
+ }
+
+ /* Update IoReset. */
+ if ((config_mask & PinmuxOptBitMask_IoReset) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_IoReset);
+ this->UpdateIoReset(opt != 0);
+ }
+
+ /* Update Park. */
+ if ((config_mask & PinmuxOptBitMask_Park) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Park);
+ this->UpdatePark(opt != 0);
+ }
+
+ /* Update Lpdr. */
+ if ((config_mask & PinmuxOptBitMask_Lpdr) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Lpdr);
+ this->UpdateELpdr(opt != 0);
+ }
+
+ /* Update Hsm. */
+ if ((config_mask & PinmuxOptBitMask_Hsm) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Hsm);
+ this->UpdateEHsm(opt != 0);
+ }
+
+ /* Update IoHv. */
+ if ((config_mask & PinmuxOptBitMask_IoHv) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_IoHv);
+ this->UpdateEIoHv(opt != 0);
+ }
+
+ /* Update Schmt. */
+ if ((config_mask & PinmuxOptBitMask_Schmt) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Schmt);
+ this->UpdateESchmt(opt != 0);
+ }
+
+ /* Update Preemp. */
+ if ((config_mask & PinmuxOptBitMask_Preemp) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_Preemp);
+ this->UpdatePreemp(opt != 0);
+ }
+
+ /* Update drive type. */
+ if ((config_mask & PinmuxOptBitMask_DrvType) != 0) {
+ const auto opt = (config & PinmuxOptBitMask_DrvType);
+ this->UpdateDrvType(opt >> PinmuxOptBitOffset_DrvType);
+ }
+
+ /* Write the updated register value. */
+ this->WriteReg();
+ }
+
+ void SetCharacter(const PinmuxPadCharacter &character) {
+ this->reg_address = character.reg_offset + 0x70000000;
+ this->reg_mask = character.reg_mask;
+ this->safe_func = character.safe_func;
+ this->reg_value = this->ReadReg();
+ this->pad_name = character.pad_name;
+
+ if ((this->reg_mask & this->reg_value & PinmuxPadMask_Park) != 0) {
+ this->reg_value &= ~(PinmuxPadMask_Park);
+ }
+
+ this->WriteReg();
+ }
+ };
+
+ class PinmuxDrivePad {
+ private:
+ u32 reg_address;
+ u32 reg_mask;
+ u32 reg_value;
+ u8 safe_func;
+ const char *pad_name;
+ private:
+ bool IsValidRegisterAddress() const {
+ return this->reg_address - 0x700008E4 <= 0x288;
+ }
+
+ uintptr_t GetRegisterAddress() const {
+ return g_apb_misc_virtual_address + (this->reg_address - 0x70000000);
+ }
+
+ bool UpdateBits(u32 value, u32 offset, u32 mask) {
+ if ((this->reg_mask & mask) != 0) {
+ if ((value & (mask >> offset)) != ((this->reg_value & mask) >> offset)) {
+ this->reg_value = (this->reg_value & ~mask) | ((value << offset) & mask);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ u32 ReadReg() const {
+ if (this->IsValidRegisterAddress()) {
+ return reg::Read(this->GetRegisterAddress());
+ } else {
+ return 0;
+ }
+ }
+
+ void WriteReg() const {
+ if (this->IsValidRegisterAddress()) {
+ reg::Write(this->GetRegisterAddress(), this->reg_value);
+ }
+ }
+
+ bool IsCzDrvDn() const {
+ return (this->reg_mask & PinmuxDrivePadMask_CzDrvDn) == PinmuxDrivePadMask_CzDrvDn;
+ }
+
+ bool IsCzDrvUp() const {
+ return (this->reg_mask & PinmuxDrivePadMask_CzDrvUp) == PinmuxDrivePadMask_CzDrvUp;
+ }
+
+ void UpdateDrvDn(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxDrivePadBitOffset_DrvDn, PinmuxDrivePadMask_DrvDn);
+ }
+ }
+
+ void UpdateDrvUp(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxDrivePadBitOffset_DrvUp, PinmuxDrivePadMask_DrvUp);
+ }
+ }
+
+ void UpdateCzDrvDn(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxDrivePadBitOffset_CzDrvDn, PinmuxDrivePadMask_CzDrvDn);
+ }
+ }
+
+ void UpdateCzDrvUp(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxDrivePadBitOffset_CzDrvUp, PinmuxDrivePadMask_CzDrvUp);
+ }
+ }
+
+ void UpdateSlwR(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxDrivePadBitOffset_SlwR, PinmuxDrivePadMask_SlwR);
+ }
+ }
+
+ void UpdateSlwF(u8 v) {
+ if (v != 0xFF) {
+ this->UpdateBits(v, PinmuxDrivePadBitOffset_SlwF, PinmuxDrivePadMask_SlwF);
+ }
+ }
+ public:
+ constexpr PinmuxDrivePad() : reg_address(), reg_mask(), reg_value(), pad_name() { /* ... */ }
+
+ void UpdatePinmuxDrivePad(u32 config, u32 config_mask) {
+ /* Update register value. */
+ this->reg_value = this->ReadReg();
+
+ /* Update drvdn. */
+ if ((config_mask & PinmuxDriveOptBitMask_DrvDn) != 0) {
+ if (this->IsCzDrvDn()) {
+ const auto opt = (config & PinmuxDriveOptBitMask_CzDrvDn);
+ this->UpdateCzDrvDn(opt >> PinmuxDriveOptBitOffset_CzDrvDn);
+ } else {
+ const auto opt = (config & PinmuxDriveOptBitMask_DrvDn);
+ this->UpdateDrvDn(opt >> PinmuxDriveOptBitOffset_DrvDn);
+ }
+ }
+
+ /* Update drvup. */
+ if ((config_mask & PinmuxDriveOptBitMask_DrvUp) != 0) {
+ if (this->IsCzDrvUp()) {
+ const auto opt = (config & PinmuxDriveOptBitMask_CzDrvUp);
+ this->UpdateCzDrvUp(opt >> PinmuxDriveOptBitOffset_CzDrvUp);
+ } else {
+ const auto opt = (config & PinmuxDriveOptBitMask_DrvUp);
+ this->UpdateDrvUp(opt >> PinmuxDriveOptBitOffset_DrvUp);
+ }
+ }
+
+ /* Update slwr */
+ if ((config_mask & PinmuxDriveOptBitMask_SlwR) != 0) {
+ const auto opt = (config & PinmuxDriveOptBitMask_SlwR);
+ this->UpdateSlwR(opt >> PinmuxDriveOptBitOffset_SlwR);
+ }
+
+ /* Update slwf */
+ if ((config_mask & PinmuxDriveOptBitMask_SlwR) != 0) {
+ const auto opt = (config & PinmuxDriveOptBitMask_SlwF);
+ this->UpdateSlwF(opt >> PinmuxDriveOptBitOffset_SlwF);
+ }
+
+ /* Write the updated register value. */
+ this->WriteReg();
+ }
+
+ void SetCharacter(const PinmuxDrivePadCharacter &character) {
+ this->reg_address = character.reg_offset + 0x70000000;
+ this->reg_mask = character.reg_mask;
+ this->reg_value = this->ReadReg();
+ this->pad_name = character.pad_name;
+ }
+ };
+
+ constinit std::array g_pinmux_pads{};
+ constinit std::array g_pinmux_drive_pads{};
+
+ }
+
+ void InitializePlatformPads() {
+ /* Initialize all pads. */
+ for (size_t i = 0; i < NumPinmuxPadCharacters; ++i) {
+ g_pinmux_pads[i].SetCharacter(PinmuxPadCharacters[i]);
+ }
+
+ /* Update all drive pads. */
+ for (size_t i = 0; i < NumPinmuxDrivePadCharacters; ++i) {
+ g_pinmux_drive_pads[i].SetCharacter(PinmuxDrivePadCharacters[i]);
+ }
+ }
+
+ void UpdateSinglePinmuxPad(const PinmuxPadConfig &config) {
+ if (IsInitialized()) {
+ g_pinmux_pads[config.index].UpdatePinmuxPad(config.option, config.option_mask);
+ }
+ }
+
+ void UpdateSinglePinmuxDrivePad(const PinmuxDrivePadConfig &config) {
+ if (IsInitialized()) {
+ g_pinmux_drive_pads[config.index].UpdatePinmuxDrivePad(config.option, config.option_mask);
+ }
+ }
+
+}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_platform_pads.hpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_platform_pads.hpp
new file mode 100644
index 0000000..144bf52
--- /dev/null
+++ b/libraries/libstratosphere/source/pinmux/driver/board/nintendo/nx/pinmux_platform_pads.hpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::pinmux::driver::board::nintendo_nx {
+
+ struct PinmuxPadConfig {
+ u32 index;
+ u32 option;
+ u32 option_mask;
+ };
+
+ struct PinmuxDrivePadConfig {
+ u32 index;
+ u32 option;
+ u32 option_mask;
+ };
+
+ void InitializePlatformPads();
+
+ void UpdateSinglePinmuxPad(const PinmuxPadConfig &config);
+ void UpdateSinglePinmuxDrivePad(const PinmuxDrivePadConfig &config);
+
+}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_board_driver_api.cpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_board_driver_api.cpp
deleted file mode 100644
index fc35ce9..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_board_driver_api.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "pinmux_pad_index.hpp"
-#include "pinmux_board_driver_api.hpp"
-#include "pinmux_platform_pads.hpp"
-
-namespace ams::pinmux::driver::board::nintendo_nx {
-
- namespace {
-
- constinit bool g_initialized = false;
-
- #include "pinmux_initial_pad_config_icosa.inc"
- #include "pinmux_initial_pad_config_hoag.inc"
- #include "pinmux_initial_pad_config_iowa.inc"
- #include "pinmux_initial_pad_config_calcio.inc"
- #include "pinmux_initial_pad_config_aula.inc"
-
- #include "pinmux_initial_drive_pad_config.inc"
- #include "pinmux_initial_drive_pad_config_hoag.inc"
-
- }
-
- bool IsInitialized() {
- return g_initialized;
- }
-
- void Initialize() {
- InitializePlatformPads();
- g_initialized = true;
- }
-
- void Finalize() {
- /* ... */
- }
-
- void SetInitialConfig() {
- const PinmuxPadConfig *configs = nullptr;
- size_t num_configs = 0;
- bool is_mariko = false;
- switch (spl::GetHardwareType()) {
- case spl::HardwareType::Icosa:
- configs = PinmuxPadConfigsIcosa;
- num_configs = NumPinmuxPadConfigsIcosa;
- is_mariko = false;
- break;
- case spl::HardwareType::Hoag:
- configs = PinmuxPadConfigsHoag;
- num_configs = NumPinmuxPadConfigsHoag;
- is_mariko = true;
- break;
- case spl::HardwareType::Iowa:
- configs = PinmuxPadConfigsIowa;
- num_configs = NumPinmuxPadConfigsIowa;
- is_mariko = true;
- break;
- case spl::HardwareType::Calcio:
- configs = PinmuxPadConfigsCalcio;
- num_configs = NumPinmuxPadConfigsCalcio;
- is_mariko = true;
- break;
- case spl::HardwareType::Aula:
- configs = PinmuxPadConfigsAula;
- num_configs = NumPinmuxPadConfigsAula;
- is_mariko = true;
- break;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
-
- AMS_ABORT_UNLESS(configs != nullptr);
-
- for (size_t i = 0; i < num_configs; ++i) {
- UpdateSinglePinmuxPad(configs[i]);
- }
-
- if (is_mariko) {
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Clk, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Cmd, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat0, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat1, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat2, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat3, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat4, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat5, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat6, 0x2000, 0x2000 });
- UpdateSinglePinmuxPad({ PinmuxPadIndex_Sdmmc2Dat7, 0x2000, 0x2000 });
- }
- }
-
- void SetInitialDrivePadConfig() {
- const PinmuxDrivePadConfig *configs = nullptr;
- size_t num_configs = 0;
- switch (spl::GetHardwareType()) {
- case spl::HardwareType::Icosa:
- configs = PinmuxDrivePadConfigs;
- num_configs = NumPinmuxDrivePadConfigs;
- break;
- case spl::HardwareType::Hoag:
- configs = PinmuxDrivePadConfigsHoag;
- num_configs = NumPinmuxDrivePadConfigsHoag;
- break;
- case spl::HardwareType::Iowa:
- configs = PinmuxDrivePadConfigs;
- num_configs = NumPinmuxDrivePadConfigs;
- break;
- case spl::HardwareType::Calcio:
- configs = PinmuxDrivePadConfigs;
- num_configs = NumPinmuxDrivePadConfigs;
- break;
- case spl::HardwareType::Aula:
- configs = PinmuxDrivePadConfigs;
- num_configs = NumPinmuxDrivePadConfigs;
- break;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
-
- AMS_ABORT_UNLESS(configs != nullptr);
-
- for (size_t i = 0; i < num_configs; ++i) {
- UpdateSinglePinmuxDrivePad(configs[i]);
- }
- }
-
-}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_board_driver_api.hpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_board_driver_api.hpp
deleted file mode 100644
index 48be15d..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_board_driver_api.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-namespace ams::pinmux::driver::board::nintendo_nx {
-
- bool IsInitialized();
-
- void Initialize();
- void Finalize();
-
- void SetInitialConfig();
- void SetInitialDrivePadConfig();
-
-}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_drive_pad_characters.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_drive_pad_characters.inc
deleted file mode 100644
index a6ed61f..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_drive_pad_characters.inc
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_character_gen.py, do not edit manually. */
-
-constexpr inline const PinmuxDrivePadCharacter PinmuxDrivePadCharacters[] = {
- { 0x08E4, 0x01F1F000, "AlsProxInt" },
- { 0x08E8, 0x01F1F000, "ApReady" },
- { 0x08EC, 0x01F1F000, "ApWakeBt" },
- { 0x08F0, 0x01F1F000, "ApWakeNfc" },
- { 0x08F4, 0x01F1F000, "AudMclk" },
- { 0x08F8, 0x01F1F000, "BattBcl" },
- { 0x08FC, 0x01F1F000, "BtRst" },
- { 0x0900, 0x01F1F000, "BtWakeAp" },
- { 0x0904, 0x01F1F000, "ButtonHome" },
- { 0x0908, 0x01F1F000, "ButtonPowerOn" },
- { 0x090C, 0x01F1F000, "ButtonSlideSw" },
- { 0x0910, 0x01F1F000, "ButtonVolDown" },
- { 0x0914, 0x01F1F000, "ButtonVolUp" },
- { 0x0918, 0x01F1F000, "Cam1Mclk" },
- { 0x091C, 0x01F1F000, "Cam1Pwdn" },
- { 0x0920, 0x01F1F000, "Cam1Strobe" },
- { 0x0924, 0x01F1F000, "Cam2Mclk" },
- { 0x0928, 0x01F1F000, "Cam2Pwdn" },
- { 0x092C, 0x01F1F000, "CamAfEn" },
- { 0x0930, 0x01F1F000, "CamFlashEn" },
- { 0x0934, 0x01F1F000, "CamI2cScl" },
- { 0x0938, 0x01F1F000, "CamI2cSda" },
- { 0x093C, 0x01F1F000, "CamRst" },
- { 0x0940, 0x01F1F000, "Clk32kIn" },
- { 0x0944, 0x01F1F000, "Clk32kOut" },
- { 0x0948, 0x01F1F000, "ClkReq" },
- { 0x094C, 0x01F1F000, "CorePwrReq" },
- { 0x0950, 0x01F1F000, "CpuPwrReq" },
- { 0x0954, 0xF0000000, "Dap1Din" },
- { 0x0958, 0xF0000000, "Dap1Dout" },
- { 0x095C, 0xF0000000, "Dap1Fs" },
- { 0x0960, 0xF0000000, "Dap1Sclk" },
- { 0x0964, 0xF0000000, "Dap2Din" },
- { 0x0968, 0xF0000000, "Dap2Dout" },
- { 0x096C, 0xF0000000, "Dap2Fs" },
- { 0x0970, 0xF0000000, "Dap2Sclk" },
- { 0x0974, 0x01F1F000, "Dap4Din" },
- { 0x0978, 0x01F1F000, "Dap4Dout" },
- { 0x097C, 0x01F1F000, "Dap4Fs" },
- { 0x0980, 0x01F1F000, "Dap4Sclk" },
- { 0x0984, 0x01F1F000, "Dmic1Clk" },
- { 0x0988, 0x01F1F000, "Dmic1Dat" },
- { 0x098C, 0x01F1F000, "Dmic2Clk" },
- { 0x0990, 0x01F1F000, "Dmic2Dat" },
- { 0x0994, 0x01F1F000, "Dmic3Clk" },
- { 0x0998, 0x01F1F000, "Dmic3Dat" },
- { 0x099C, 0x01F1F000, "DpHpd" },
- { 0x09A0, 0x01F1F000, "DvfsClk" },
- { 0x09A4, 0x01F1F000, "DvfsPwm" },
- { 0x09A8, 0x01F1F000, "Gen1I2cScl" },
- { 0x09AC, 0x01F1F000, "Gen1I2cSda" },
- { 0x09B0, 0x01F1F000, "Gen2I2cScl" },
- { 0x09B4, 0x01F1F000, "Gen2I2cSda" },
- { 0x09B8, 0x01F1F000, "Gen3I2cScl" },
- { 0x09BC, 0x01F1F000, "Gen3I2cSda" },
- { 0x09C0, 0x01F1F000, "GpioPa6" },
- { 0x09C4, 0x01F1F000, "GpioPcc7" },
- { 0x09C8, 0x01F1F000, "GpioPe6" },
- { 0x09CC, 0x01F1F000, "GpioPe7" },
- { 0x09D0, 0x01F1F000, "GpioPh6" },
- { 0x09D4, 0xF0000000, "GpioPk0" },
- { 0x09D8, 0xF0000000, "GpioPk1" },
- { 0x09DC, 0xF0000000, "GpioPk2" },
- { 0x09E0, 0xF0000000, "GpioPk3" },
- { 0x09E4, 0xF0000000, "GpioPk4" },
- { 0x09E8, 0xF0000000, "GpioPk5" },
- { 0x09EC, 0xF0000000, "GpioPk6" },
- { 0x09F0, 0xF0000000, "GpioPk7" },
- { 0x09F4, 0xF0000000, "GpioPl0" },
- { 0x09F8, 0xF0000000, "GpioPl1" },
- { 0x09FC, 0x07F7F000, "GpioPz0" },
- { 0x0A00, 0x07F7F000, "GpioPz1" },
- { 0x0A04, 0x07F7F000, "GpioPz2" },
- { 0x0A08, 0x07F7F000, "GpioPz3" },
- { 0x0A0C, 0x07F7F000, "GpioPz4" },
- { 0x0A10, 0x07F7F000, "GpioPz5" },
- { 0x0A14, 0x01F1F000, "GpioX1Aud" },
- { 0x0A18, 0x01F1F000, "GpioX3Aud" },
- { 0x0A1C, 0x01F1F000, "GpsEn" },
- { 0x0A20, 0x01F1F000, "GpsRst" },
- { 0x0A24, 0x01F1F000, "HdmiCec" },
- { 0x0A28, 0x01F1F000, "HdmiIntDpHpd" },
- { 0x0A2C, 0x01F1F000, "JtagRtck" },
- { 0x0A30, 0x01F1F000, "LcdBlEn" },
- { 0x0A34, 0x01F1F000, "LcdBlPwm" },
- { 0x0A38, 0x01F1F000, "LcdGpio1" },
- { 0x0A3C, 0x01F1F000, "LcdGpio2" },
- { 0x0A40, 0x01F1F000, "LcdRst" },
- { 0x0A44, 0x01F1F000, "LcdTe" },
- { 0x0A48, 0x01F1F000, "ModemWakeAp" },
- { 0x0A4C, 0x01F1F000, "MotionInt" },
- { 0x0A50, 0x01F1F000, "NfcEn" },
- { 0x0A54, 0x01F1F000, "NfcInt" },
- { 0x0A58, 0x01F1F000, "PexL0ClkReqN" },
- { 0x0A5C, 0x01F1F000, "PexL0RstN" },
- { 0x0A60, 0x01F1F000, "PexL1ClkreqN" },
- { 0x0A64, 0x01F1F000, "PexL1RstN" },
- { 0x0A68, 0x01F1F000, "PexWakeN" },
- { 0x0A6C, 0x01F1F000, "PwrI2cScl" },
- { 0x0A70, 0x01F1F000, "PwrI2cSda" },
- { 0x0A74, 0x01F1F000, "PwrIntN" },
- { 0x0A78, 0x07F7F000, "QspiComp" },
- { 0x0A90, 0xF0000000, "QspiSck" },
- { 0x0A94, 0x01F1F000, "SataLedActive" },
- { 0x0A98, 0xF7F7F000, "Sdmmc1Pad" },
- { 0x0AB0, 0xF7F7F000, "Sdmmc3Pad" },
- { 0x0AC8, 0x01F1F000, "Shutdown" },
- { 0x0ACC, 0x01F1F000, "SpdifIn" },
- { 0x0AD0, 0x01F1F000, "SpdifOut" },
- { 0x0AD4, 0xF0000000, "Spi1Cs0" },
- { 0x0AD8, 0xF0000000, "Spi1Cs1" },
- { 0x0ADC, 0xF0000000, "Spi1Miso" },
- { 0x0AE0, 0xF0000000, "Spi1Mosi" },
- { 0x0AE4, 0xF0000000, "Spi1Sck" },
- { 0x0AE8, 0xF0000000, "Spi2Cs0" },
- { 0x0AEC, 0xF0000000, "Spi2Cs1" },
- { 0x0AF0, 0xF0000000, "Spi2Miso" },
- { 0x0AF4, 0xF0000000, "Spi2Mosi" },
- { 0x0AF8, 0xF0000000, "Spi2Sck" },
- { 0x0AFC, 0xF0000000, "Spi4Cs0" },
- { 0x0B00, 0xF0000000, "Spi4Miso" },
- { 0x0B04, 0xF0000000, "Spi4Mosi" },
- { 0x0B08, 0xF0000000, "Spi4Sck" },
- { 0x0B0C, 0x01F1F000, "TempAlert" },
- { 0x0B10, 0x01F1F000, "TouchClk" },
- { 0x0B14, 0x01F1F000, "TouchInt" },
- { 0x0B18, 0x01F1F000, "TouchRst" },
- { 0x0B1C, 0x01F1F000, "Uart1Cts" },
- { 0x0B20, 0x01F1F000, "Uart1Rts" },
- { 0x0B24, 0x01F1F000, "Uart1Rx" },
- { 0x0B28, 0x01F1F000, "Uart1Tx" },
- { 0x0B2C, 0x01F1F000, "Uart2Cts" },
- { 0x0B30, 0x01F1F000, "Uart2Rts" },
- { 0x0B34, 0x01F1F000, "Uart2Rx" },
- { 0x0B38, 0x01F1F000, "Uart2Tx" },
- { 0x0B3C, 0x01F1F000, "Uart3Cts" },
- { 0x0B40, 0x01F1F000, "Uart3Rts" },
- { 0x0B44, 0x01F1F000, "Uart3Rx" },
- { 0x0B48, 0x01F1F000, "Uart3Tx" },
- { 0x0B4C, 0x01F1F000, "Uart4Cts" },
- { 0x0B50, 0x01F1F000, "Uart4Rts" },
- { 0x0B54, 0x01F1F000, "Uart4Rx" },
- { 0x0B58, 0x01F1F000, "Uart4Tx" },
- { 0x0B5C, 0x01F1F000, "UsbVbusEn0" },
- { 0x0B60, 0x01F1F000, "UsbVbusEn1" },
- { 0x0B64, 0x01F1F000, "WifiEn" },
- { 0x0B68, 0x01F1F000, "WifiRst" },
- { 0x0B6C, 0x01F1F000, "WifiWakeAp" },
-};
-
-constexpr inline size_t NumPinmuxDrivePadCharacters = util::size(PinmuxDrivePadCharacters);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_drive_pad_config.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_drive_pad_config.inc
deleted file mode 100644
index 2caa615..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_drive_pad_config.inc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by drive_pad_initial_config.py, do not edit manually. */
-
-constexpr inline const PinmuxDrivePadConfig PinmuxDrivePadConfigs[] = {
- { PinmuxDrivePadIndex_AudMclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Cam1Mclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Cam2Mclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamAfEn, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamFlashEn, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamI2cScl, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamI2cSda, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Din, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Dout, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Fs, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Sclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic1Clk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic1Dat, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic2Clk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic2Dat, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic3Clk, 0x01F1F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic3Dat, 0x01F1F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_DvfsClk, 0x01F1F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_DvfsPwm, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen1I2cScl, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen1I2cSda, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen2I2cScl, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen2I2cSda, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen3I2cScl, 0x00007000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen3I2cSda, 0x00007000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioPz0, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioPz1, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioX1Aud, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioX3Aud, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_PwrI2cScl, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_PwrI2cSda, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_TouchClk, 0x01414000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Cts, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Rts, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Rx, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Tx, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Spi1Cs0, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Cs1, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Miso, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Mosi, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Sck, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Cs0, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Cs1, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Miso, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Mosi, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Sck, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Sdmmc3Pad, 0x51212000, 0xF1F1F000 },
-};
-
-constexpr inline const size_t NumPinmuxDrivePadConfigs = util::size(PinmuxDrivePadConfigs);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_drive_pad_config_hoag.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_drive_pad_config_hoag.inc
deleted file mode 100644
index 8831b8f..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_drive_pad_config_hoag.inc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by drive_pad_initial_config.py, do not edit manually. */
-
-constexpr inline const PinmuxDrivePadConfig PinmuxDrivePadConfigsHoag[] = {
- { PinmuxDrivePadIndex_AudMclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Cam1Mclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Cam2Mclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamAfEn, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamFlashEn, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamI2cScl, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_CamI2cSda, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Din, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Dout, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Fs, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dap4Sclk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic1Clk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic1Dat, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic2Clk, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic2Dat, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic3Clk, 0x01F1F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Dmic3Dat, 0x01F1F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_DvfsClk, 0x01F1F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_DvfsPwm, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen1I2cScl, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen1I2cSda, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen2I2cScl, 0x00004000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen2I2cSda, 0x00004000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen3I2cScl, 0x00007000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Gen3I2cSda, 0x00007000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioPz0, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioPz1, 0x01010000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioX1Aud, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_GpioX3Aud, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_PwrI2cScl, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_PwrI2cSda, 0x0001F000, 0x01F1F000 },
- { PinmuxDrivePadIndex_TouchClk, 0x01414000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Cts, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Rts, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Rx, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Uart3Tx, 0x01404000, 0x01F1F000 },
- { PinmuxDrivePadIndex_Spi1Cs0, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Cs1, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Miso, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Mosi, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi1Sck, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Cs0, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Cs1, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Miso, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Mosi, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Spi2Sck, 0x00000000, 0xF0000000 },
- { PinmuxDrivePadIndex_Sdmmc3Pad, 0x51212000, 0xF1F1F000 },
-};
-
-constexpr inline const size_t NumPinmuxDrivePadConfigsHoag = util::size(PinmuxDrivePadConfigsHoag);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_aula.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_aula.inc
deleted file mode 100644
index 14bcc76..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_aula.inc
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
-
-constexpr inline const PinmuxPadConfig PinmuxPadConfigsAula[] = {
-{ PinmuxPadIndex_AudMclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Clk, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
-{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Clk32kOut, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Uart2Rx, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart2Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart2Cts, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Spi4Mosi, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Spi4Miso, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Spi4Sck, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Spi4Cs0, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart3Cts, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Dmic1Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic1Dat, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic2Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic2Dat, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
-{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_AlsProxInt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonSlideSw, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ButtonHome, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPz0, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Uart2Tx, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
-{ PinmuxPadIndex_GpioPk3, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_Uart3Tx, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_WifiEn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
-{ PinmuxPadIndex_SpdifIn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DvfsClk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam1Mclk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdBlPwm, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdBlEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz5, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
-{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000000 },
-{ PinmuxPadIndex_Dap4Din, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPk7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPl0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_NfcEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_NfcInt, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_SpdifOut, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_UsbVbusEn0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
-};
-
-constexpr inline const size_t NumPinmuxPadConfigsAula = util::size(PinmuxPadConfigsAula);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_calcio.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_calcio.inc
deleted file mode 100644
index 94bca5c..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_calcio.inc
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
-
-constexpr inline const PinmuxPadConfig PinmuxPadConfigsCalcio[] = {
-{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
-{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Clk32kOut, 0x00000001, 0x0000007F },
-{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_HdmiCec, 0x00000240, 0x0000027F },
-{ PinmuxPadIndex_Dmic1Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic1Dat, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic2Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic2Dat, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPe6, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_Gen3I2cSda, 0x00000204, 0x0000027F },
-{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonHome, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
-{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_Spi1Mosi, 0x0000000C, 0x0000007F },
-{ PinmuxPadIndex_Spi1Miso, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_Spi1Sck, 0x0000000C, 0x0000007F },
-{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPh6, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
-{ PinmuxPadIndex_DpHpd0, 0x00000004, 0x0000007F },
-{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000024, 0x0000027F },
-{ PinmuxPadIndex_AudMclk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DvfsClk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioX1Aud, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioX3Aud, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap1Din, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap1Dout, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap1Fs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap1Sclk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Gen3I2cScl, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamI2cSda, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam1Mclk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam2Mclk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamFlashEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_SataLedActive, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_AlsProxInt, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_MotionInt, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_TouchRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_TouchInt, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ButtonSlideSw, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdBlPwm, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdBlEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz4, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz5, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000018 },
-{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000018 },
-{ PinmuxPadIndex_Dap4Din, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap4Sclk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Gen2I2cScl, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Gen2I2cSda, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Tx, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Rx, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Rts, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Cts, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPk3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPk5, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPk7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPl0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPl1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi4Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi4Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi4Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi4Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart3Tx, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart3Rx, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart3Rts, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart3Cts, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_NfcEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_NfcInt, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_SpdifOut, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_SpdifIn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_UsbVbusEn0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
-};
-
-constexpr inline const size_t NumPinmuxPadConfigsCalcio = util::size(PinmuxPadConfigsCalcio);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_hoag.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_hoag.inc
deleted file mode 100644
index d0efa99..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_hoag.inc
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
-
-constexpr inline const PinmuxPadConfig PinmuxPadConfigsHoag[] = {
-{ PinmuxPadIndex_AudMclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Clk, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_TouchClk, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_LcdBlPwm, 0x00000001, 0x00000067 },
-{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
-{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Clk32kOut, 0x00000001, 0x0000007F },
-{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart3Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart3Cts, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Dmic1Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic1Dat, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic2Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic2Dat, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPe7, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
-{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Cam2Pwdn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Cam1Strobe, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_AlsProxInt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonSlideSw, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ButtonHome, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_LcdBlEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_LcdGpio1, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPz0, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dap4Dout, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dap4Fs, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
-{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk7, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Spi4Mosi, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Spi4Miso, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Spi4Sck, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Spi4Cs0, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
-{ PinmuxPadIndex_NfcEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_NfcInt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_UsbVbusEn1, 0x00000204, 0x00000267 },
-{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DvfsClk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam1Mclk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPz5, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
-{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000000 },
-{ PinmuxPadIndex_Dap4Din, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Tx, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Rx, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Rts, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Uart2Cts, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPk3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPl0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_SpdifOut, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_SpdifIn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_UsbVbusEn0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
-};
-
-constexpr inline const size_t NumPinmuxPadConfigsHoag = util::size(PinmuxPadConfigsHoag);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_icosa.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_icosa.inc
deleted file mode 100644
index e1cee6f..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_icosa.inc
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
-
-constexpr inline const PinmuxPadConfig PinmuxPadConfigsIcosa[] = {
-{ PinmuxPadIndex_AudMclk, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x00000267 },
-{ PinmuxPadIndex_PexL1ClkreqN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x00000267 },
-{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_Sdmmc1Clk, 0x00000048, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_LcdBlPwm, 0x00000001, 0x00000067 },
-{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
-{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Clk32kOut, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_GpioPz5, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000060 },
-{ PinmuxPadIndex_PwrIntN, 0x00000030, 0x00000078 },
-{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Uart2Rx, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart2Rts, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart2Cts, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Spi4Mosi, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Spi4Miso, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Spi4Sck, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Spi4Cs0, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart3Cts, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_QspiIo0, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_QspiIo1, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_QspiSck, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_QspiCsN, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_DvfsClk, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dmic3Dat, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
-{ PinmuxPadIndex_Cam1Mclk, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Cam1Pwdn, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Sdmmc3Clk, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonPowerOn, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonSlideSw, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonHome, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_LcdBlEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPz0, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz2, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dap4Din, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Uart2Tx, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
-{ PinmuxPadIndex_GpioPk3, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk7, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPl0, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Uart3Tx, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
-{ PinmuxPadIndex_NfcEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_NfcInt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_SpdifOut, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_SpdifIn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_UsbVbusEn0, 0x00000004, 0x00000267 },
-{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic1Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic1Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic2Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic2Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_AlsProxInt, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
-{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
-};
-
-constexpr inline const size_t NumPinmuxPadConfigsIcosa = util::size(PinmuxPadConfigsIcosa);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_iowa.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_iowa.inc
deleted file mode 100644
index 3b0022e..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_initial_pad_config_iowa.inc
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_initial_config.py, do not edit manually. */
-
-constexpr inline const PinmuxPadConfig PinmuxPadConfigsIowa[] = {
-{ PinmuxPadIndex_AudMclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap1Dout, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Fs, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap1Sclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Gen3I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen3I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL0ClkreqN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_PexL0RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexL1ClkreqN, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PexL1RstN, 0x00000000, 0x0000027F },
-{ PinmuxPadIndex_PexWakeN, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_Sdmmc1Clk, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Cmd, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc1Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Clk, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Cmd, 0x00000040, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat0, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat1, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat2, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat3, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat4, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat5, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat6, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc2Dat7, 0x00000050, 0x0000007F },
-{ PinmuxPadIndex_Shutdown, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_LcdBlPwm, 0x00000001, 0x00000067 },
-{ PinmuxPadIndex_LcdGpio2, 0x00000001, 0x0000007F },
-{ PinmuxPadIndex_PwrI2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_PwrI2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Clk32kIn, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Clk32kOut, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_GpioPz5, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_CorePwrReq, 0x00000000, 0x00000078 },
-{ PinmuxPadIndex_PwrIntN, 0x00000020, 0x00000078 },
-{ PinmuxPadIndex_Gen1I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen1I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cScl, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Gen2I2cSda, 0x00000040, 0x0000027F },
-{ PinmuxPadIndex_Uart2Rx, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart2Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart2Cts, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart1Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rx, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Uart1Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart1Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_JtagRtck, 0x00000000, 0x00000067 },
-{ PinmuxPadIndex_GpioPl1, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Spi4Mosi, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Spi4Miso, 0x00000030, 0x0000007F },
-{ PinmuxPadIndex_Spi4Sck, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Spi4Cs0, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart3Rx, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart3Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart3Cts, 0x00000020, 0x0000007F },
-{ PinmuxPadIndex_Uart4Tx, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rx, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Uart4Rts, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Uart4Cts, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Din, 0x00000028, 0x0000007F },
-{ PinmuxPadIndex_Dap2Dout, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Fs, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_Dap2Sclk, 0x00000000, 0x0000007F },
-{ PinmuxPadIndex_HdmiIntDpHpd, 0x00000020, 0x0000027F },
-{ PinmuxPadIndex_DvfsClk, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioX1Aud, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioX3Aud, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Dmic3Clk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPe6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_CamI2cSda, 0x00000034, 0x0000027F },
-{ PinmuxPadIndex_Cam1Mclk, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Cam2Mclk, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_CamFlashEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Cam1Pwdn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_SataLedActive, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Sdmmc3Clk, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat0, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat1, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat2, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_Sdmmc3Dat3, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_AlsProxInt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_TempAlert, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_MotionInt, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_TouchRst, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_TouchInt, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonPowerOn, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolUp, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonVolDown, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_ButtonSlideSw, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ButtonHome, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_LcdBlEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_LcdRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_ApReady, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPz0, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPz1, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz2, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_GpioPz3, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPz4, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dap4Din, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Dap4Sclk, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Uart2Tx, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPk0, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk1, 0x0000004C, 0x0000007F },
-{ PinmuxPadIndex_GpioPk2, 0x00000044, 0x0000007F },
-{ PinmuxPadIndex_GpioPk3, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk4, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPk5, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_GpioPk6, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_GpioPl0, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_Uart3Tx, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_WifiEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_WifiWakeAp, 0x0000002C, 0x0000007F },
-{ PinmuxPadIndex_ApWakeBt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtRst, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_BtWakeAp, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_GpioPh6, 0x00000024, 0x0000007F },
-{ PinmuxPadIndex_ApWakeNfc, 0x00000004, 0x0000007F },
-{ PinmuxPadIndex_NfcEn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_NfcInt, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_SpdifOut, 0x00000034, 0x0000007F },
-{ PinmuxPadIndex_SpdifIn, 0x00000004, 0x00000067 },
-{ PinmuxPadIndex_UsbVbusEn0, 0x00000004, 0x00000267 },
-{ PinmuxPadIndex_DvfsPwm, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi2Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic1Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic1Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic2Clk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic2Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dmic3Dat, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPe7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamI2cScl, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_CamAfEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam2Pwdn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Cam1Strobe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPa6, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Clkb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc2Dqsb, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Sdmmc3Cmd, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_TouchClk, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ModemWakeAp, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdTe, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_LcdGpio1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_ClkReq, 0x00000000, 0x00000000 },
-{ PinmuxPadIndex_CpuPwrReq, 0x00000000, 0x00000000 },
-{ PinmuxPadIndex_Dap4Dout, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Dap4Fs, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPk7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Mosi, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Miso, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Sck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_Spi1Cs1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsEn, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpsRst, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiSck, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiCsN, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo2, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_QspiIo3, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_GpioPcc7, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_UsbVbusEn1, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_DpHpd0, 0x00000005, 0x00000007 },
-{ PinmuxPadIndex_HdmiCec, 0x00000005, 0x00000007 },
-};
-
-constexpr inline const size_t NumPinmuxPadConfigsIowa = util::size(PinmuxPadConfigsIowa);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_pad_characters.inc b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_pad_characters.inc
deleted file mode 100644
index a84081d..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_pad_characters.inc
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_character_gen.py, do not edit manually. */
-
-constexpr inline const PinmuxPadCharacter PinmuxPadCharacters[] = {
- { 0x3000, 0x072FF, 0x01, "Sdmmc1Clk" },
- { 0x3004, 0x072FF, 0x02, "Sdmmc1Cmd" },
- { 0x3008, 0x072FF, 0x02, "Sdmmc1Dat3" },
- { 0x300C, 0x072FF, 0x02, "Sdmmc1Dat2" },
- { 0x3010, 0x072FF, 0x02, "Sdmmc1Dat1" },
- { 0x3014, 0x072FF, 0x01, "Sdmmc1Dat0" },
- { 0x301C, 0x072FF, 0x01, "Sdmmc3Clk" },
- { 0x3020, 0x072FF, 0x01, "Sdmmc3Cmd" },
- { 0x3024, 0x072FF, 0x01, "Sdmmc3Dat0" },
- { 0x3028, 0x072FF, 0x01, "Sdmmc3Dat1" },
- { 0x302C, 0x072FF, 0x01, "Sdmmc3Dat2" },
- { 0x3030, 0x072FF, 0x01, "Sdmmc3Dat3" },
- { 0x3038, 0x01DFF, 0x01, "PexL0RstN" },
- { 0x303C, 0x01DFF, 0x01, "PexL0ClkreqN" },
- { 0x3040, 0x01DFF, 0x01, "PexWakeN" },
- { 0x3044, 0x01DFF, 0x01, "PexL1RstN" },
- { 0x3048, 0x01DFF, 0x01, "PexL1ClkreqN" },
- { 0x304C, 0x019FF, 0x01, "SataLedActive" },
- { 0x3050, 0x1F2FF, 0x01, "Spi1Mosi" },
- { 0x3054, 0x1F2FF, 0x01, "Spi1Miso" },
- { 0x3058, 0x1F2FF, 0x01, "Spi1Sck" },
- { 0x305C, 0x1F2FF, 0x01, "Spi1Cs0" },
- { 0x3060, 0x1F2FF, 0x01, "Spi1Cs1" },
- { 0x3064, 0x072FF, 0x02, "Spi2Mosi" },
- { 0x3068, 0x072FF, 0x02, "Spi2Miso" },
- { 0x306C, 0x072FF, 0x02, "Spi2Sck" },
- { 0x3070, 0x072FF, 0x02, "Spi2Cs0" },
- { 0x3074, 0x072FF, 0x01, "Spi2Cs1" },
- { 0x3078, 0x1F2FF, 0x01, "Spi4Mosi" },
- { 0x307C, 0x1F2FF, 0x01, "Spi4Miso" },
- { 0x3080, 0x1F2FF, 0x01, "Spi4Sck" },
- { 0x3084, 0x1F2FF, 0x01, "Spi4Cs0" },
- { 0x3088, 0x072FF, 0x01, "QspiSck" },
- { 0x308C, 0x072FF, 0x01, "QspiCsN" },
- { 0x3090, 0x072FF, 0x01, "QspiIo0" },
- { 0x3094, 0x072FF, 0x01, "QspiIo1" },
- { 0x3098, 0x072FF, 0x01, "QspiIo2" },
- { 0x309C, 0x072FF, 0x01, "QspiIo3" },
- { 0x30A4, 0x019FF, 0x02, "Dmic1Clk" },
- { 0x30A8, 0x019FF, 0x02, "Dmic1Dat" },
- { 0x30AC, 0x019FF, 0x02, "Dmic2Clk" },
- { 0x30B0, 0x019FF, 0x02, "Dmic2Dat" },
- { 0x30B4, 0x019FF, 0x02, "Dmic3Clk" },
- { 0x30B8, 0x019FF, 0x02, "Dmic3Dat" },
- { 0x30BC, 0x01DFF, 0x01, "Gen1I2cScl" },
- { 0x30C0, 0x01DFF, 0x01, "Gen1I2cSda" },
- { 0x30C4, 0x01DFF, 0x01, "Gen2I2cScl" },
- { 0x30C8, 0x01DFF, 0x01, "Gen2I2cSda" },
- { 0x30CC, 0x01DFF, 0x01, "Gen3I2cScl" },
- { 0x30D0, 0x01DFF, 0x01, "Gen3I2cSda" },
- { 0x30D4, 0x01DFF, 0x02, "CamI2cScl" },
- { 0x30D8, 0x01DFF, 0x02, "CamI2cSda" },
- { 0x30DC, 0x01DFF, 0x01, "PwrI2cScl" },
- { 0x30E0, 0x01DFF, 0x01, "PwrI2cSda" },
- { 0x30E4, 0x019FF, 0x01, "Uart1Tx" },
- { 0x30E8, 0x019FF, 0x01, "Uart1Rx" },
- { 0x30EC, 0x019FF, 0x01, "Uart1Rts" },
- { 0x30F0, 0x019FF, 0x01, "Uart1Cts" },
- { 0x30F4, 0x019FF, 0x00, "Uart2Tx" },
- { 0x30F8, 0x019FF, 0x00, "Uart2Rx" },
- { 0x30FC, 0x019FF, 0x02, "Uart2Rts" },
- { 0x3100, 0x019FF, 0x02, "Uart2Cts" },
- { 0x3104, 0x019FF, 0x02, "Uart3Tx" },
- { 0x3108, 0x019FF, 0x02, "Uart3Rx" },
- { 0x310C, 0x019FF, 0x02, "Uart3Rts" },
- { 0x3110, 0x019FF, 0x02, "Uart3Cts" },
- { 0x3114, 0x019FF, 0x02, "Uart4Tx" },
- { 0x3118, 0x019FF, 0x02, "Uart4Rx" },
- { 0x311C, 0x019FF, 0x02, "Uart4Rts" },
- { 0x3120, 0x019FF, 0x02, "Uart4Cts" },
- { 0x3124, 0x072FF, 0x01, "Dap1Fs" },
- { 0x3128, 0x072FF, 0x01, "Dap1Din" },
- { 0x312C, 0x072FF, 0x01, "Dap1Dout" },
- { 0x3130, 0x072FF, 0x01, "Dap1Sclk" },
- { 0x3134, 0x072FF, 0x01, "Dap2Fs" },
- { 0x3138, 0x072FF, 0x01, "Dap2Din" },
- { 0x313C, 0x072FF, 0x01, "Dap2Dout" },
- { 0x3140, 0x072FF, 0x01, "Dap2Sclk" },
- { 0x3144, 0x072FF, 0x01, "Dap4Fs" },
- { 0x3148, 0x072FF, 0x01, "Dap4Din" },
- { 0x314C, 0x072FF, 0x01, "Dap4Dout" },
- { 0x3150, 0x072FF, 0x01, "Dap4Sclk" },
- { 0x3154, 0x072FF, 0x01, "Cam1Mclk" },
- { 0x3158, 0x072FF, 0x01, "Cam2Mclk" },
- { 0x315C, 0x072FF, 0x01, "JtagRtck" },
- { 0x3160, 0x0118C, 0xFF, "Clk32kIn" },
- { 0x3164, 0x072FF, 0x02, "Clk32kOut" },
- { 0x3168, 0x01DFF, 0x01, "BattBcl" },
- { 0x316C, 0x011CC, 0xFF, "ClkReq" },
- { 0x3170, 0x011CC, 0xFF, "CpuPwrReq" },
- { 0x3174, 0x011CC, 0xFF, "PwrIntN" },
- { 0x3178, 0x011CC, 0xFF, "Shutdown" },
- { 0x317C, 0x011CC, 0xFF, "CorePwrReq" },
- { 0x3180, 0x019FF, 0x01, "AudMclk" },
- { 0x3184, 0x019FF, 0x00, "DvfsPwm" },
- { 0x3188, 0x019FF, 0x00, "DvfsClk" },
- { 0x318C, 0x019FF, 0x00, "GpioX1Aud" },
- { 0x3190, 0x019FF, 0x00, "GpioX3Aud" },
- { 0x3194, 0x01DFF, 0x00, "GpioPcc7" },
- { 0x3198, 0x01DFF, 0x01, "HdmiCec" },
- { 0x319C, 0x01DFF, 0x01, "HdmiIntDpHpd" },
- { 0x31A0, 0x019FF, 0x01, "SpdifOut" },
- { 0x31A4, 0x019FF, 0x01, "SpdifIn" },
- { 0x31A8, 0x01DFF, 0x01, "UsbVbusEn0" },
- { 0x31AC, 0x01DFF, 0x01, "UsbVbusEn1" },
- { 0x31B0, 0x019FF, 0x01, "DpHpd0" },
- { 0x31B4, 0x019FF, 0x00, "WifiEn" },
- { 0x31B8, 0x019FF, 0x00, "WifiRst" },
- { 0x31BC, 0x019FF, 0x00, "WifiWakeAp" },
- { 0x31C0, 0x019FF, 0x00, "ApWakeBt" },
- { 0x31C4, 0x019FF, 0x00, "BtRst" },
- { 0x31C8, 0x019FF, 0x00, "BtWakeAp" },
- { 0x31CC, 0x019FF, 0x00, "ApWakeNfc" },
- { 0x31D0, 0x019FF, 0x00, "NfcEn" },
- { 0x31D4, 0x019FF, 0x00, "NfcInt" },
- { 0x31D8, 0x019FF, 0x00, "GpsEn" },
- { 0x31DC, 0x019FF, 0x00, "GpsRst" },
- { 0x31E0, 0x019FF, 0x01, "CamRst" },
- { 0x31E4, 0x019FF, 0x02, "CamAfEn" },
- { 0x31E8, 0x019FF, 0x02, "CamFlashEn" },
- { 0x31EC, 0x019FF, 0x01, "Cam1Pwdn" },
- { 0x31F0, 0x019FF, 0x01, "Cam2Pwdn" },
- { 0x31F4, 0x019FF, 0x01, "Cam1Strobe" },
- { 0x31F8, 0x019FF, 0x01, "LcdTe" },
- { 0x31FC, 0x019FF, 0x03, "LcdBlPwm" },
- { 0x3200, 0x019FF, 0x00, "LcdBlEn" },
- { 0x3204, 0x019FF, 0x00, "LcdRst" },
- { 0x3208, 0x019FF, 0x01, "LcdGpio1" },
- { 0x320C, 0x019FF, 0x02, "LcdGpio2" },
- { 0x3210, 0x019FF, 0x00, "ApReady" },
- { 0x3214, 0x019FF, 0x00, "TouchRst" },
- { 0x3218, 0x019FF, 0x01, "TouchClk" },
- { 0x321C, 0x019FF, 0x00, "ModemWakeAp" },
- { 0x3220, 0x019FF, 0x00, "TouchInt" },
- { 0x3224, 0x019FF, 0x00, "MotionInt" },
- { 0x3228, 0x019FF, 0x00, "AlsProxInt" },
- { 0x322C, 0x019FF, 0x00, "TempAlert" },
- { 0x3230, 0x019FF, 0x00, "ButtonPowerOn" },
- { 0x3234, 0x019FF, 0x00, "ButtonVolUp" },
- { 0x3238, 0x019FF, 0x00, "ButtonVolDown" },
- { 0x323C, 0x019FF, 0x00, "ButtonSlideSw" },
- { 0x3240, 0x019FF, 0x00, "ButtonHome" },
- { 0x3244, 0x019FF, 0x01, "GpioPa6" },
- { 0x3248, 0x019FF, 0x00, "GpioPe6" },
- { 0x324C, 0x019FF, 0x00, "GpioPe7" },
- { 0x3250, 0x019FF, 0x00, "GpioPh6" },
- { 0x3254, 0x072FF, 0x02, "GpioPk0" },
- { 0x3258, 0x072FF, 0x02, "GpioPk1" },
- { 0x325C, 0x072FF, 0x02, "GpioPk2" },
- { 0x3260, 0x072FF, 0x02, "GpioPk3" },
- { 0x3264, 0x072FF, 0x01, "GpioPk4" },
- { 0x3268, 0x072FF, 0x01, "GpioPk5" },
- { 0x326C, 0x072FF, 0x01, "GpioPk6" },
- { 0x3270, 0x072FF, 0x01, "GpioPk7" },
- { 0x3274, 0x072FF, 0x00, "GpioPl0" },
- { 0x3278, 0x072FF, 0x01, "GpioPl1" },
- { 0x327C, 0x072FF, 0x01, "GpioPz0" },
- { 0x3280, 0x072FF, 0x02, "GpioPz1" },
- { 0x3284, 0x072FF, 0x02, "GpioPz2" },
- { 0x3288, 0x072FF, 0x01, "GpioPz3" },
- { 0x328C, 0x072FF, 0x01, "GpioPz4" },
- { 0x3290, 0x072FF, 0x01, "GpioPz5" },
- { 0x3294, 0x1F2FF, 0x02, "Sdmmc2Dat0" },
- { 0x3298, 0x1F2FF, 0x02, "Sdmmc2Dat1" },
- { 0x329C, 0x1F2FF, 0x02, "Sdmmc2Dat2" },
- { 0x32A0, 0x1F2FF, 0x02, "Sdmmc2Dat3" },
- { 0x32A4, 0x1F2FF, 0x02, "Sdmmc2Dat4" },
- { 0x32A8, 0x1F2FF, 0x02, "Sdmmc2Dat5" },
- { 0x32AC, 0x1F2FF, 0x02, "Sdmmc2Dat6" },
- { 0x32B0, 0x1F2FF, 0x02, "Sdmmc2Dat7" },
- { 0x32B4, 0x1F2FF, 0x02, "Sdmmc2Clk" },
- { 0x32B8, 0x1F2FF, 0x00, "Sdmmc2Clkb" },
- { 0x32BC, 0x1F2FF, 0x02, "Sdmmc2Cmd" },
- { 0x32C0, 0x1F2FF, 0x00, "Sdmmc2Dqs" },
- { 0x32C4, 0x1F2FF, 0x00, "Sdmmc2Dqsb" },
-};
-
-constexpr inline size_t NumPinmuxPadCharacters = util::size(PinmuxPadCharacters);
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_pad_index.hpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_pad_index.hpp
deleted file mode 100644
index df2dc59..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_pad_index.hpp
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-/* NOTE: This file is auto-generated by pinmux_character_gen.py, do not edit manually. */
-
-#pragma once
-
-enum PinmuxPadIndex {
- PinmuxPadIndex_Sdmmc1Clk = 0,
- PinmuxPadIndex_Sdmmc1Cmd = 1,
- PinmuxPadIndex_Sdmmc1Dat3 = 2,
- PinmuxPadIndex_Sdmmc1Dat2 = 3,
- PinmuxPadIndex_Sdmmc1Dat1 = 4,
- PinmuxPadIndex_Sdmmc1Dat0 = 5,
- PinmuxPadIndex_Sdmmc3Clk = 6,
- PinmuxPadIndex_Sdmmc3Cmd = 7,
- PinmuxPadIndex_Sdmmc3Dat0 = 8,
- PinmuxPadIndex_Sdmmc3Dat1 = 9,
- PinmuxPadIndex_Sdmmc3Dat2 = 10,
- PinmuxPadIndex_Sdmmc3Dat3 = 11,
- PinmuxPadIndex_PexL0RstN = 12,
- PinmuxPadIndex_PexL0ClkreqN = 13,
- PinmuxPadIndex_PexWakeN = 14,
- PinmuxPadIndex_PexL1RstN = 15,
- PinmuxPadIndex_PexL1ClkreqN = 16,
- PinmuxPadIndex_SataLedActive = 17,
- PinmuxPadIndex_Spi1Mosi = 18,
- PinmuxPadIndex_Spi1Miso = 19,
- PinmuxPadIndex_Spi1Sck = 20,
- PinmuxPadIndex_Spi1Cs0 = 21,
- PinmuxPadIndex_Spi1Cs1 = 22,
- PinmuxPadIndex_Spi2Mosi = 23,
- PinmuxPadIndex_Spi2Miso = 24,
- PinmuxPadIndex_Spi2Sck = 25,
- PinmuxPadIndex_Spi2Cs0 = 26,
- PinmuxPadIndex_Spi2Cs1 = 27,
- PinmuxPadIndex_Spi4Mosi = 28,
- PinmuxPadIndex_Spi4Miso = 29,
- PinmuxPadIndex_Spi4Sck = 30,
- PinmuxPadIndex_Spi4Cs0 = 31,
- PinmuxPadIndex_QspiSck = 32,
- PinmuxPadIndex_QspiCsN = 33,
- PinmuxPadIndex_QspiIo0 = 34,
- PinmuxPadIndex_QspiIo1 = 35,
- PinmuxPadIndex_QspiIo2 = 36,
- PinmuxPadIndex_QspiIo3 = 37,
- PinmuxPadIndex_Dmic1Clk = 38,
- PinmuxPadIndex_Dmic1Dat = 39,
- PinmuxPadIndex_Dmic2Clk = 40,
- PinmuxPadIndex_Dmic2Dat = 41,
- PinmuxPadIndex_Dmic3Clk = 42,
- PinmuxPadIndex_Dmic3Dat = 43,
- PinmuxPadIndex_Gen1I2cScl = 44,
- PinmuxPadIndex_Gen1I2cSda = 45,
- PinmuxPadIndex_Gen2I2cScl = 46,
- PinmuxPadIndex_Gen2I2cSda = 47,
- PinmuxPadIndex_Gen3I2cScl = 48,
- PinmuxPadIndex_Gen3I2cSda = 49,
- PinmuxPadIndex_CamI2cScl = 50,
- PinmuxPadIndex_CamI2cSda = 51,
- PinmuxPadIndex_PwrI2cScl = 52,
- PinmuxPadIndex_PwrI2cSda = 53,
- PinmuxPadIndex_Uart1Tx = 54,
- PinmuxPadIndex_Uart1Rx = 55,
- PinmuxPadIndex_Uart1Rts = 56,
- PinmuxPadIndex_Uart1Cts = 57,
- PinmuxPadIndex_Uart2Tx = 58,
- PinmuxPadIndex_Uart2Rx = 59,
- PinmuxPadIndex_Uart2Rts = 60,
- PinmuxPadIndex_Uart2Cts = 61,
- PinmuxPadIndex_Uart3Tx = 62,
- PinmuxPadIndex_Uart3Rx = 63,
- PinmuxPadIndex_Uart3Rts = 64,
- PinmuxPadIndex_Uart3Cts = 65,
- PinmuxPadIndex_Uart4Tx = 66,
- PinmuxPadIndex_Uart4Rx = 67,
- PinmuxPadIndex_Uart4Rts = 68,
- PinmuxPadIndex_Uart4Cts = 69,
- PinmuxPadIndex_Dap1Fs = 70,
- PinmuxPadIndex_Dap1Din = 71,
- PinmuxPadIndex_Dap1Dout = 72,
- PinmuxPadIndex_Dap1Sclk = 73,
- PinmuxPadIndex_Dap2Fs = 74,
- PinmuxPadIndex_Dap2Din = 75,
- PinmuxPadIndex_Dap2Dout = 76,
- PinmuxPadIndex_Dap2Sclk = 77,
- PinmuxPadIndex_Dap4Fs = 78,
- PinmuxPadIndex_Dap4Din = 79,
- PinmuxPadIndex_Dap4Dout = 80,
- PinmuxPadIndex_Dap4Sclk = 81,
- PinmuxPadIndex_Cam1Mclk = 82,
- PinmuxPadIndex_Cam2Mclk = 83,
- PinmuxPadIndex_JtagRtck = 84,
- PinmuxPadIndex_Clk32kIn = 85,
- PinmuxPadIndex_Clk32kOut = 86,
- PinmuxPadIndex_BattBcl = 87,
- PinmuxPadIndex_ClkReq = 88,
- PinmuxPadIndex_CpuPwrReq = 89,
- PinmuxPadIndex_PwrIntN = 90,
- PinmuxPadIndex_Shutdown = 91,
- PinmuxPadIndex_CorePwrReq = 92,
- PinmuxPadIndex_AudMclk = 93,
- PinmuxPadIndex_DvfsPwm = 94,
- PinmuxPadIndex_DvfsClk = 95,
- PinmuxPadIndex_GpioX1Aud = 96,
- PinmuxPadIndex_GpioX3Aud = 97,
- PinmuxPadIndex_GpioPcc7 = 98,
- PinmuxPadIndex_HdmiCec = 99,
- PinmuxPadIndex_HdmiIntDpHpd = 100,
- PinmuxPadIndex_SpdifOut = 101,
- PinmuxPadIndex_SpdifIn = 102,
- PinmuxPadIndex_UsbVbusEn0 = 103,
- PinmuxPadIndex_UsbVbusEn1 = 104,
- PinmuxPadIndex_DpHpd0 = 105,
- PinmuxPadIndex_WifiEn = 106,
- PinmuxPadIndex_WifiRst = 107,
- PinmuxPadIndex_WifiWakeAp = 108,
- PinmuxPadIndex_ApWakeBt = 109,
- PinmuxPadIndex_BtRst = 110,
- PinmuxPadIndex_BtWakeAp = 111,
- PinmuxPadIndex_ApWakeNfc = 112,
- PinmuxPadIndex_NfcEn = 113,
- PinmuxPadIndex_NfcInt = 114,
- PinmuxPadIndex_GpsEn = 115,
- PinmuxPadIndex_GpsRst = 116,
- PinmuxPadIndex_CamRst = 117,
- PinmuxPadIndex_CamAfEn = 118,
- PinmuxPadIndex_CamFlashEn = 119,
- PinmuxPadIndex_Cam1Pwdn = 120,
- PinmuxPadIndex_Cam2Pwdn = 121,
- PinmuxPadIndex_Cam1Strobe = 122,
- PinmuxPadIndex_LcdTe = 123,
- PinmuxPadIndex_LcdBlPwm = 124,
- PinmuxPadIndex_LcdBlEn = 125,
- PinmuxPadIndex_LcdRst = 126,
- PinmuxPadIndex_LcdGpio1 = 127,
- PinmuxPadIndex_LcdGpio2 = 128,
- PinmuxPadIndex_ApReady = 129,
- PinmuxPadIndex_TouchRst = 130,
- PinmuxPadIndex_TouchClk = 131,
- PinmuxPadIndex_ModemWakeAp = 132,
- PinmuxPadIndex_TouchInt = 133,
- PinmuxPadIndex_MotionInt = 134,
- PinmuxPadIndex_AlsProxInt = 135,
- PinmuxPadIndex_TempAlert = 136,
- PinmuxPadIndex_ButtonPowerOn = 137,
- PinmuxPadIndex_ButtonVolUp = 138,
- PinmuxPadIndex_ButtonVolDown = 139,
- PinmuxPadIndex_ButtonSlideSw = 140,
- PinmuxPadIndex_ButtonHome = 141,
- PinmuxPadIndex_GpioPa6 = 142,
- PinmuxPadIndex_GpioPe6 = 143,
- PinmuxPadIndex_GpioPe7 = 144,
- PinmuxPadIndex_GpioPh6 = 145,
- PinmuxPadIndex_GpioPk0 = 146,
- PinmuxPadIndex_GpioPk1 = 147,
- PinmuxPadIndex_GpioPk2 = 148,
- PinmuxPadIndex_GpioPk3 = 149,
- PinmuxPadIndex_GpioPk4 = 150,
- PinmuxPadIndex_GpioPk5 = 151,
- PinmuxPadIndex_GpioPk6 = 152,
- PinmuxPadIndex_GpioPk7 = 153,
- PinmuxPadIndex_GpioPl0 = 154,
- PinmuxPadIndex_GpioPl1 = 155,
- PinmuxPadIndex_GpioPz0 = 156,
- PinmuxPadIndex_GpioPz1 = 157,
- PinmuxPadIndex_GpioPz2 = 158,
- PinmuxPadIndex_GpioPz3 = 159,
- PinmuxPadIndex_GpioPz4 = 160,
- PinmuxPadIndex_GpioPz5 = 161,
- PinmuxPadIndex_Sdmmc2Dat0 = 162,
- PinmuxPadIndex_Sdmmc2Dat1 = 163,
- PinmuxPadIndex_Sdmmc2Dat2 = 164,
- PinmuxPadIndex_Sdmmc2Dat3 = 165,
- PinmuxPadIndex_Sdmmc2Dat4 = 166,
- PinmuxPadIndex_Sdmmc2Dat5 = 167,
- PinmuxPadIndex_Sdmmc2Dat6 = 168,
- PinmuxPadIndex_Sdmmc2Dat7 = 169,
- PinmuxPadIndex_Sdmmc2Clk = 170,
- PinmuxPadIndex_Sdmmc2Clkb = 171,
- PinmuxPadIndex_Sdmmc2Cmd = 172,
- PinmuxPadIndex_Sdmmc2Dqs = 173,
- PinmuxPadIndex_Sdmmc2Dqsb = 174,
-};
-
-enum PinmuxDrivePadIndex {
- PinmuxDrivePadIndex_AlsProxInt = 0,
- PinmuxDrivePadIndex_ApReady = 1,
- PinmuxDrivePadIndex_ApWakeBt = 2,
- PinmuxDrivePadIndex_ApWakeNfc = 3,
- PinmuxDrivePadIndex_AudMclk = 4,
- PinmuxDrivePadIndex_BattBcl = 5,
- PinmuxDrivePadIndex_BtRst = 6,
- PinmuxDrivePadIndex_BtWakeAp = 7,
- PinmuxDrivePadIndex_ButtonHome = 8,
- PinmuxDrivePadIndex_ButtonPowerOn = 9,
- PinmuxDrivePadIndex_ButtonSlideSw = 10,
- PinmuxDrivePadIndex_ButtonVolDown = 11,
- PinmuxDrivePadIndex_ButtonVolUp = 12,
- PinmuxDrivePadIndex_Cam1Mclk = 13,
- PinmuxDrivePadIndex_Cam1Pwdn = 14,
- PinmuxDrivePadIndex_Cam1Strobe = 15,
- PinmuxDrivePadIndex_Cam2Mclk = 16,
- PinmuxDrivePadIndex_Cam2Pwdn = 17,
- PinmuxDrivePadIndex_CamAfEn = 18,
- PinmuxDrivePadIndex_CamFlashEn = 19,
- PinmuxDrivePadIndex_CamI2cScl = 20,
- PinmuxDrivePadIndex_CamI2cSda = 21,
- PinmuxDrivePadIndex_CamRst = 22,
- PinmuxDrivePadIndex_Clk32kIn = 23,
- PinmuxDrivePadIndex_Clk32kOut = 24,
- PinmuxDrivePadIndex_ClkReq = 25,
- PinmuxDrivePadIndex_CorePwrReq = 26,
- PinmuxDrivePadIndex_CpuPwrReq = 27,
- PinmuxDrivePadIndex_Dap1Din = 28,
- PinmuxDrivePadIndex_Dap1Dout = 29,
- PinmuxDrivePadIndex_Dap1Fs = 30,
- PinmuxDrivePadIndex_Dap1Sclk = 31,
- PinmuxDrivePadIndex_Dap2Din = 32,
- PinmuxDrivePadIndex_Dap2Dout = 33,
- PinmuxDrivePadIndex_Dap2Fs = 34,
- PinmuxDrivePadIndex_Dap2Sclk = 35,
- PinmuxDrivePadIndex_Dap4Din = 36,
- PinmuxDrivePadIndex_Dap4Dout = 37,
- PinmuxDrivePadIndex_Dap4Fs = 38,
- PinmuxDrivePadIndex_Dap4Sclk = 39,
- PinmuxDrivePadIndex_Dmic1Clk = 40,
- PinmuxDrivePadIndex_Dmic1Dat = 41,
- PinmuxDrivePadIndex_Dmic2Clk = 42,
- PinmuxDrivePadIndex_Dmic2Dat = 43,
- PinmuxDrivePadIndex_Dmic3Clk = 44,
- PinmuxDrivePadIndex_Dmic3Dat = 45,
- PinmuxDrivePadIndex_DpHpd = 46,
- PinmuxDrivePadIndex_DvfsClk = 47,
- PinmuxDrivePadIndex_DvfsPwm = 48,
- PinmuxDrivePadIndex_Gen1I2cScl = 49,
- PinmuxDrivePadIndex_Gen1I2cSda = 50,
- PinmuxDrivePadIndex_Gen2I2cScl = 51,
- PinmuxDrivePadIndex_Gen2I2cSda = 52,
- PinmuxDrivePadIndex_Gen3I2cScl = 53,
- PinmuxDrivePadIndex_Gen3I2cSda = 54,
- PinmuxDrivePadIndex_GpioPa6 = 55,
- PinmuxDrivePadIndex_GpioPcc7 = 56,
- PinmuxDrivePadIndex_GpioPe6 = 57,
- PinmuxDrivePadIndex_GpioPe7 = 58,
- PinmuxDrivePadIndex_GpioPh6 = 59,
- PinmuxDrivePadIndex_GpioPk0 = 60,
- PinmuxDrivePadIndex_GpioPk1 = 61,
- PinmuxDrivePadIndex_GpioPk2 = 62,
- PinmuxDrivePadIndex_GpioPk3 = 63,
- PinmuxDrivePadIndex_GpioPk4 = 64,
- PinmuxDrivePadIndex_GpioPk5 = 65,
- PinmuxDrivePadIndex_GpioPk6 = 66,
- PinmuxDrivePadIndex_GpioPk7 = 67,
- PinmuxDrivePadIndex_GpioPl0 = 68,
- PinmuxDrivePadIndex_GpioPl1 = 69,
- PinmuxDrivePadIndex_GpioPz0 = 70,
- PinmuxDrivePadIndex_GpioPz1 = 71,
- PinmuxDrivePadIndex_GpioPz2 = 72,
- PinmuxDrivePadIndex_GpioPz3 = 73,
- PinmuxDrivePadIndex_GpioPz4 = 74,
- PinmuxDrivePadIndex_GpioPz5 = 75,
- PinmuxDrivePadIndex_GpioX1Aud = 76,
- PinmuxDrivePadIndex_GpioX3Aud = 77,
- PinmuxDrivePadIndex_GpsEn = 78,
- PinmuxDrivePadIndex_GpsRst = 79,
- PinmuxDrivePadIndex_HdmiCec = 80,
- PinmuxDrivePadIndex_HdmiIntDpHpd = 81,
- PinmuxDrivePadIndex_JtagRtck = 82,
- PinmuxDrivePadIndex_LcdBlEn = 83,
- PinmuxDrivePadIndex_LcdBlPwm = 84,
- PinmuxDrivePadIndex_LcdGpio1 = 85,
- PinmuxDrivePadIndex_LcdGpio2 = 86,
- PinmuxDrivePadIndex_LcdRst = 87,
- PinmuxDrivePadIndex_LcdTe = 88,
- PinmuxDrivePadIndex_ModemWakeAp = 89,
- PinmuxDrivePadIndex_MotionInt = 90,
- PinmuxDrivePadIndex_NfcEn = 91,
- PinmuxDrivePadIndex_NfcInt = 92,
- PinmuxDrivePadIndex_PexL0ClkReqN = 93,
- PinmuxDrivePadIndex_PexL0RstN = 94,
- PinmuxDrivePadIndex_PexL1ClkreqN = 95,
- PinmuxDrivePadIndex_PexL1RstN = 96,
- PinmuxDrivePadIndex_PexWakeN = 97,
- PinmuxDrivePadIndex_PwrI2cScl = 98,
- PinmuxDrivePadIndex_PwrI2cSda = 99,
- PinmuxDrivePadIndex_PwrIntN = 100,
- PinmuxDrivePadIndex_QspiComp = 101,
- PinmuxDrivePadIndex_QspiSck = 102,
- PinmuxDrivePadIndex_SataLedActive = 103,
- PinmuxDrivePadIndex_Sdmmc1Pad = 104,
- PinmuxDrivePadIndex_Sdmmc3Pad = 105,
- PinmuxDrivePadIndex_Shutdown = 106,
- PinmuxDrivePadIndex_SpdifIn = 107,
- PinmuxDrivePadIndex_SpdifOut = 108,
- PinmuxDrivePadIndex_Spi1Cs0 = 109,
- PinmuxDrivePadIndex_Spi1Cs1 = 110,
- PinmuxDrivePadIndex_Spi1Miso = 111,
- PinmuxDrivePadIndex_Spi1Mosi = 112,
- PinmuxDrivePadIndex_Spi1Sck = 113,
- PinmuxDrivePadIndex_Spi2Cs0 = 114,
- PinmuxDrivePadIndex_Spi2Cs1 = 115,
- PinmuxDrivePadIndex_Spi2Miso = 116,
- PinmuxDrivePadIndex_Spi2Mosi = 117,
- PinmuxDrivePadIndex_Spi2Sck = 118,
- PinmuxDrivePadIndex_Spi4Cs0 = 119,
- PinmuxDrivePadIndex_Spi4Miso = 120,
- PinmuxDrivePadIndex_Spi4Mosi = 121,
- PinmuxDrivePadIndex_Spi4Sck = 122,
- PinmuxDrivePadIndex_TempAlert = 123,
- PinmuxDrivePadIndex_TouchClk = 124,
- PinmuxDrivePadIndex_TouchInt = 125,
- PinmuxDrivePadIndex_TouchRst = 126,
- PinmuxDrivePadIndex_Uart1Cts = 127,
- PinmuxDrivePadIndex_Uart1Rts = 128,
- PinmuxDrivePadIndex_Uart1Rx = 129,
- PinmuxDrivePadIndex_Uart1Tx = 130,
- PinmuxDrivePadIndex_Uart2Cts = 131,
- PinmuxDrivePadIndex_Uart2Rts = 132,
- PinmuxDrivePadIndex_Uart2Rx = 133,
- PinmuxDrivePadIndex_Uart2Tx = 134,
- PinmuxDrivePadIndex_Uart3Cts = 135,
- PinmuxDrivePadIndex_Uart3Rts = 136,
- PinmuxDrivePadIndex_Uart3Rx = 137,
- PinmuxDrivePadIndex_Uart3Tx = 138,
- PinmuxDrivePadIndex_Uart4Cts = 139,
- PinmuxDrivePadIndex_Uart4Rts = 140,
- PinmuxDrivePadIndex_Uart4Rx = 141,
- PinmuxDrivePadIndex_Uart4Tx = 142,
- PinmuxDrivePadIndex_UsbVbusEn0 = 143,
- PinmuxDrivePadIndex_UsbVbusEn1 = 144,
- PinmuxDrivePadIndex_WifiEn = 145,
- PinmuxDrivePadIndex_WifiRst = 146,
- PinmuxDrivePadIndex_WifiWakeAp = 147,
-};
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_platform_pads.cpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_platform_pads.cpp
deleted file mode 100644
index 7efce9d..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_platform_pads.cpp
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "pinmux_pad_index.hpp"
-#include "pinmux_board_driver_api.hpp"
-#include "pinmux_platform_pads.hpp"
-
-namespace ams::pinmux::driver::board::nintendo_nx {
-
- namespace {
-
- uintptr_t g_apb_misc_virtual_address = dd::QueryIoMapping(0x70000000, 0x4000);
-
- enum PinmuxPadMask : u32 {
- PinmuxPadMask_Pm = 0x3,
- PinmuxPadMask_Pupd = 0xC,
- PinmuxPadMask_Tristate = 0x10,
- PinmuxPadMask_Park = 0x20,
- PinmuxPadMask_EInput = 0x40,
- PinmuxPadMask_Lock = 0x80,
- PinmuxPadMask_ELpdr = 0x100,
- PinmuxPadMask_EHsm = 0x200,
- PinmuxPadMask_EIoHv = 0x400,
- PinmuxPadMask_EOd = 0x800,
- PinmuxPadMask_ESchmt = 0x1000,
- PinmuxPadMask_DrvType = 0x6000,
- PinmuxPadMask_Preemp = 0x8000,
- PinmuxPadMask_IoReset = 0x10000,
- };
-
- enum PinmuxPadBitOffset : u32 {
- PinmuxPadBitOffset_Pm = 0x0,
- PinmuxPadBitOffset_Pupd = 0x2,
- PinmuxPadBitOffset_Tristate = 0x4,
- PinmuxPadBitOffset_Park = 0x5,
- PinmuxPadBitOffset_EInput = 0x6,
- PinmuxPadBitOffset_Lock = 0x7,
- PinmuxPadBitOffset_ELpdr = 0x8,
- PinmuxPadBitOffset_EHsm = 0x9,
- PinmuxPadBitOffset_EIoHv = 0xA,
- PinmuxPadBitOffset_EOd = 0xB,
- PinmuxPadBitOffset_ESchmt = 0xC,
- PinmuxPadBitOffset_DrvType = 0xD,
- PinmuxPadBitOffset_Preemp = 0xF,
- PinmuxPadBitOffset_IoReset = 0x10,
- };
-
- enum PinmuxOptBitMask : u32 {
- PinmuxOptBitMask_Pm = 0x7,
- PinmuxOptBitMask_Pupd = 0x18,
- PinmuxOptBitMask_Dir = 0x60,
- PinmuxOptBitMask_Lock = 0x80,
- PinmuxOptBitMask_IoReset = 0x100,
- PinmuxOptBitMask_IoHv = 0x200,
- PinmuxOptBitMask_Park = 0x400,
- PinmuxOptBitMask_Lpdr = 0x800,
- PinmuxOptBitMask_Hsm = 0x1000,
- PinmuxOptBitMask_Schmt = 0x2000,
- PinmuxOptBitMask_DrvType = 0xC000,
- PinmuxOptBitMask_Preemp = 0x10000,
- };
-
- enum PinmuxOptBitOffset {
- PinmuxOptBitOffset_Pm = 0x0,
- PinmuxOptBitOffset_Pupd = 0x3,
- PinmuxOptBitOffset_Dir = 0x5,
- PinmuxOptBitOffset_Lock = 0x7,
- PinmuxOptBitOffset_IoReset = 0x8,
- PinmuxOptBitOffset_IoHv = 0x9,
- PinmuxOptBitOffset_Park = 0xA,
- PinmuxOptBitOffset_Lpdr = 0xB,
- PinmuxOptBitOffset_Hsm = 0xC,
- PinmuxOptBitOffset_Schmt = 0xD,
- PinmuxOptBitOffset_DrvType = 0xE,
- PinmuxOptBitOffset_Preemp = 0x10,
- };
-
- enum PinmuxDrivePadMask : u32{
- PinmuxDrivePadMask_DrvDn = 0x0001F000,
- PinmuxDrivePadMask_DrvUp = 0x01F00000,
- PinmuxDrivePadMask_CzDrvDn = 0x0007F000,
- PinmuxDrivePadMask_CzDrvUp = 0x07F00000,
- PinmuxDrivePadMask_SlwR = 0x30000000,
- PinmuxDrivePadMask_SlwF = 0xC0000000,
- };
-
- enum PinmuxDrivePadBitOffset : u32 {
- PinmuxDrivePadBitOffset_DrvDn = 12,
- PinmuxDrivePadBitOffset_DrvUp = 20,
- PinmuxDrivePadBitOffset_CzDrvDn = 12,
- PinmuxDrivePadBitOffset_CzDrvUp = 20,
- PinmuxDrivePadBitOffset_SlwR = 28,
- PinmuxDrivePadBitOffset_SlwF = 30,
- };
-
- enum PinmuxDriveOptBitMask : u32 {
- PinmuxDriveOptBitMask_DrvDn = 0x0001F000,
- PinmuxDriveOptBitMask_DrvUp = 0x01F00000,
- PinmuxDriveOptBitMask_CzDrvDn = 0x0007F000,
- PinmuxDriveOptBitMask_CzDrvUp = 0x07F00000,
- PinmuxDriveOptBitMask_SlwR = 0x30000000,
- PinmuxDriveOptBitMask_SlwF = 0xC0000000,
- };
-
- enum PinmuxDriveOptBitOffset : u32 {
- PinmuxDriveOptBitOffset_DrvDn = 12,
- PinmuxDriveOptBitOffset_DrvUp = 20,
- PinmuxDriveOptBitOffset_CzDrvDn = 12,
- PinmuxDriveOptBitOffset_CzDrvUp = 20,
- PinmuxDriveOptBitOffset_SlwR = 28,
- PinmuxDriveOptBitOffset_SlwF = 30,
- };
-
- enum PinmuxOpt : u32 {
- /* Pm */
- PinmuxOpt_Gpio = 0x4,
- PinmuxOpt_Unused = 0x5,
-
- /* Pupd */
- PinmuxOpt_NoPupd = 0x0,
- PinmuxOpt_PullDown = 0x8,
- PinmuxOpt_PullUp = 0x10,
-
- /* Dir */
- PinmuxOpt_Output = 0x0,
- PinmuxOpt_Input = 0x20,
- PinmuxOpt_Bidirection = 0x40,
- PinmuxOpt_OpenDrain = 0x60,
-
- /* Lock */
- PinmuxOpt_Unlock = 0x0,
- PinmuxOpt_Lock = 0x80,
-
- /* IoReset */
- PinmuxOpt_DisableIoReset = 0x0,
- PinmuxOpt_EnableIoReset = 0x100,
-
- /* IoHv */
- PinmuxOpt_NormalVoltage = 0x0,
- PinmuxOpt_HighVoltage = 0x200,
-
- /* Park */
- PinmuxOpt_ResetOnLowPower = 0x0,
- PinmuxOpt_ParkOnLowPower = 0x400,
-
- /* Lpdr */
- PinmuxOpt_DisableBaseDriver = 0x0,
- PinmuxOpt_EnableBaseDriver = 0x800,
-
- /* Hsm */
- PinmuxOpt_DisableHighSpeedMode = 0x0,
- PinmuxOpt_EnableHighSpeedMode = 0x1000,
-
- /* Schmt */
- PinmuxOpt_CmosMode = 0x0,
- PinmuxOpt_SchmittTrigger = 0x2000,
-
- /* DrvType */
- PinmuxOpt_DrvType1X = 0x0,
- PinmuxOpt_DrvType2X = 0x4000,
- PinmuxOpt_DrvType3X = 0x8000,
- PinmuxOpt_DrvType4X = 0xC000,
-
- /* Preemp */
- PinmuxOpt_DisablePreemp = 0x0,
- PinmuxOpt_EnablePreemp = 0x10000,
- };
-
- enum PinmuxPadPm : u32 {
- PinmuxPadPm_Default = 0xFFFFFFFF,
- PinmuxPadPm_Pm0 = 0x0,
- PinmuxPadPm_Pm1 = 0x1,
- PinmuxPadPm_Pm2 = 0x2,
- PinmuxPadPm_Pm3 = 0x3,
- PinmuxPadPm_Safe = 0x4,
- };
-
- struct PinmuxPadCharacter {
- u32 reg_offset;
- u32 reg_mask;
- u8 safe_func;
- const char *pad_name;
- };
-
- struct PinmuxDrivePadCharacter {
- u32 reg_offset;
- u32 reg_mask;
- const char *pad_name;
- };
-
- #include "pinmux_pad_characters.inc"
- #include "pinmux_drive_pad_characters.inc"
-
- class PinmuxPad {
- private:
- u32 reg_address;
- u32 reg_mask;
- u32 reg_value;
- u8 safe_func;
- const char *pad_name;
- private:
- bool IsValidRegisterAddress() const {
- return this->reg_address - 0x70003000 <= 0x2C4;
- }
-
- uintptr_t GetRegisterAddress() const {
- return g_apb_misc_virtual_address + (this->reg_address - 0x70000000);
- }
-
- bool UpdateBits(u32 value, u32 offset, u32 mask) {
- if ((this->reg_mask & mask) != 0) {
- if ((value & (mask >> offset)) != ((this->reg_value & mask) >> offset)) {
- this->reg_value = (this->reg_value & ~mask) | ((value << offset) & mask);
- }
- return true;
- } else {
- return false;
- }
- }
-
- u32 ReadReg() const {
- if (this->IsValidRegisterAddress()) {
- return reg::Read(this->GetRegisterAddress());
- } else {
- return 0;
- }
- }
-
- void WriteReg() const {
- if (this->IsValidRegisterAddress()) {
- reg::Write(this->GetRegisterAddress(), this->reg_value);
- }
- }
-
- bool IsLocked() const {
- return (this->reg_value & PinmuxPadMask_Lock) != 0;
- }
-
- void UpdatePm(u8 v) {
- if (v != 0xFF) {
- if (v == PinmuxPadPm_Safe) {
- v = this->safe_func;
- }
- this->UpdateBits(v, PinmuxPadBitOffset_Pm, PinmuxPadMask_Pm);
- }
- }
-
- void UpdatePupd(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_Pupd, PinmuxPadMask_Pupd);
- }
- }
-
- void UpdateTristate(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_Tristate, PinmuxPadMask_Tristate);
- }
- }
-
- void UpdateEInput(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_EInput, PinmuxPadMask_EInput);
- }
- }
-
- void UpdateEOd(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_EOd, PinmuxPadMask_EOd);
- }
- }
-
- void UpdateLock(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_Lock, PinmuxPadMask_Lock);
- }
- }
-
- void UpdateIoReset(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_IoReset, PinmuxPadMask_IoReset);
- }
- }
-
- void UpdatePark(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_Park, PinmuxPadMask_Park);
- }
- }
-
- void UpdateELpdr(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_ELpdr, PinmuxPadMask_ELpdr);
- }
- }
-
- void UpdateEHsm(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_EHsm, PinmuxPadMask_EHsm);
- }
- }
-
- void UpdateEIoHv(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_EIoHv, PinmuxPadMask_EIoHv);
- }
- }
-
- void UpdateESchmt(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_ESchmt, PinmuxPadMask_ESchmt);
- }
- }
-
- void UpdatePreemp(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_Preemp, PinmuxPadMask_Preemp);
- }
- }
-
- void UpdateDrvType(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxPadBitOffset_DrvType, PinmuxPadMask_DrvType);
- }
- }
- public:
- constexpr PinmuxPad() : reg_address(), reg_mask(), reg_value(), safe_func(), pad_name() { /* ... */ }
-
- void UpdatePinmuxPad(u32 config, u32 config_mask) {
- /* Update register value. */
- this->reg_value = this->ReadReg();
-
- /* Check if we're locked. */
- if (this->IsLocked()) {
- return;
- }
-
- /* Update PM. */
- if ((config_mask & PinmuxOptBitMask_Pm) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Pm);
- u8 pm = PinmuxPadPm_Safe;
- if (opt != PinmuxOpt_Gpio) {
- if (opt == PinmuxOpt_Unused) {
- this->UpdatePupd(true);
- this->UpdateTristate(true);
- this->UpdateEInput(0);
- } else if (opt <= PinmuxOpt_Unused) {
- pm = opt >> PinmuxOptBitOffset_Pm;
- }
- }
- this->UpdatePm(pm);
- }
-
- /* Update pupd. */
- if ((config_mask & PinmuxOptBitMask_Pupd) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Pupd);
- if (opt == PinmuxOpt_NoPupd || opt == PinmuxOpt_PullDown || opt == PinmuxOpt_PullUp) {
- this->UpdatePupd(opt >> PinmuxOptBitOffset_Pupd);
- }
- }
-
- /* Update direction. */
- if ((config_mask & PinmuxOptBitMask_Dir) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Dir);
- if (opt == PinmuxOpt_Output) {
- this->UpdateTristate(false);
- this->UpdateEInput(false);
- if ((this->reg_mask & PinmuxPadMask_EOd) != 0) {
- this->UpdateEOd(false);
- }
- } else if (opt == PinmuxOpt_Input) {
- this->UpdateTristate(true);
- this->UpdateEInput(true);
- if ((this->reg_mask & PinmuxPadMask_EOd) != 0) {
- this->UpdateEOd(false);
- }
- } else if (opt == PinmuxOpt_Bidirection) {
- this->UpdateTristate(false);
- this->UpdateEInput(true);
- if ((this->reg_mask & PinmuxPadMask_EOd) != 0) {
- this->UpdateEOd(false);
- }
- } else if (opt == PinmuxOpt_OpenDrain) {
- this->UpdateTristate(false);
- this->UpdateEInput(true);
- this->UpdateEOd(true);
- }
- }
-
- /* Update Lock. */
- if ((config_mask & PinmuxOptBitMask_Lock) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Lock);
- this->UpdateLock(opt != 0);
- }
-
- /* Update IoReset. */
- if ((config_mask & PinmuxOptBitMask_IoReset) != 0) {
- const auto opt = (config & PinmuxOptBitMask_IoReset);
- this->UpdateIoReset(opt != 0);
- }
-
- /* Update Park. */
- if ((config_mask & PinmuxOptBitMask_Park) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Park);
- this->UpdatePark(opt != 0);
- }
-
- /* Update Lpdr. */
- if ((config_mask & PinmuxOptBitMask_Lpdr) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Lpdr);
- this->UpdateELpdr(opt != 0);
- }
-
- /* Update Hsm. */
- if ((config_mask & PinmuxOptBitMask_Hsm) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Hsm);
- this->UpdateEHsm(opt != 0);
- }
-
- /* Update IoHv. */
- if ((config_mask & PinmuxOptBitMask_IoHv) != 0) {
- const auto opt = (config & PinmuxOptBitMask_IoHv);
- this->UpdateEIoHv(opt != 0);
- }
-
- /* Update Schmt. */
- if ((config_mask & PinmuxOptBitMask_Schmt) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Schmt);
- this->UpdateESchmt(opt != 0);
- }
-
- /* Update Preemp. */
- if ((config_mask & PinmuxOptBitMask_Preemp) != 0) {
- const auto opt = (config & PinmuxOptBitMask_Preemp);
- this->UpdatePreemp(opt != 0);
- }
-
- /* Update drive type. */
- if ((config_mask & PinmuxOptBitMask_DrvType) != 0) {
- const auto opt = (config & PinmuxOptBitMask_DrvType);
- this->UpdateDrvType(opt >> PinmuxOptBitOffset_DrvType);
- }
-
- /* Write the updated register value. */
- this->WriteReg();
- }
-
- void SetCharacter(const PinmuxPadCharacter &character) {
- this->reg_address = character.reg_offset + 0x70000000;
- this->reg_mask = character.reg_mask;
- this->safe_func = character.safe_func;
- this->reg_value = this->ReadReg();
- this->pad_name = character.pad_name;
-
- if ((this->reg_mask & this->reg_value & PinmuxPadMask_Park) != 0) {
- this->reg_value &= ~(PinmuxPadMask_Park);
- }
-
- this->WriteReg();
- }
- };
-
- class PinmuxDrivePad {
- private:
- u32 reg_address;
- u32 reg_mask;
- u32 reg_value;
- u8 safe_func;
- const char *pad_name;
- private:
- bool IsValidRegisterAddress() const {
- return this->reg_address - 0x700008E4 <= 0x288;
- }
-
- uintptr_t GetRegisterAddress() const {
- return g_apb_misc_virtual_address + (this->reg_address - 0x70000000);
- }
-
- bool UpdateBits(u32 value, u32 offset, u32 mask) {
- if ((this->reg_mask & mask) != 0) {
- if ((value & (mask >> offset)) != ((this->reg_value & mask) >> offset)) {
- this->reg_value = (this->reg_value & ~mask) | ((value << offset) & mask);
- }
- return true;
- } else {
- return false;
- }
- }
-
- u32 ReadReg() const {
- if (this->IsValidRegisterAddress()) {
- return reg::Read(this->GetRegisterAddress());
- } else {
- return 0;
- }
- }
-
- void WriteReg() const {
- if (this->IsValidRegisterAddress()) {
- reg::Write(this->GetRegisterAddress(), this->reg_value);
- }
- }
-
- bool IsCzDrvDn() const {
- return (this->reg_mask & PinmuxDrivePadMask_CzDrvDn) == PinmuxDrivePadMask_CzDrvDn;
- }
-
- bool IsCzDrvUp() const {
- return (this->reg_mask & PinmuxDrivePadMask_CzDrvUp) == PinmuxDrivePadMask_CzDrvUp;
- }
-
- void UpdateDrvDn(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxDrivePadBitOffset_DrvDn, PinmuxDrivePadMask_DrvDn);
- }
- }
-
- void UpdateDrvUp(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxDrivePadBitOffset_DrvUp, PinmuxDrivePadMask_DrvUp);
- }
- }
-
- void UpdateCzDrvDn(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxDrivePadBitOffset_CzDrvDn, PinmuxDrivePadMask_CzDrvDn);
- }
- }
-
- void UpdateCzDrvUp(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxDrivePadBitOffset_CzDrvUp, PinmuxDrivePadMask_CzDrvUp);
- }
- }
-
- void UpdateSlwR(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxDrivePadBitOffset_SlwR, PinmuxDrivePadMask_SlwR);
- }
- }
-
- void UpdateSlwF(u8 v) {
- if (v != 0xFF) {
- this->UpdateBits(v, PinmuxDrivePadBitOffset_SlwF, PinmuxDrivePadMask_SlwF);
- }
- }
- public:
- constexpr PinmuxDrivePad() : reg_address(), reg_mask(), reg_value(), pad_name() { /* ... */ }
-
- void UpdatePinmuxDrivePad(u32 config, u32 config_mask) {
- /* Update register value. */
- this->reg_value = this->ReadReg();
-
- /* Update drvdn. */
- if ((config_mask & PinmuxDriveOptBitMask_DrvDn) != 0) {
- if (this->IsCzDrvDn()) {
- const auto opt = (config & PinmuxDriveOptBitMask_CzDrvDn);
- this->UpdateCzDrvDn(opt >> PinmuxDriveOptBitOffset_CzDrvDn);
- } else {
- const auto opt = (config & PinmuxDriveOptBitMask_DrvDn);
- this->UpdateDrvDn(opt >> PinmuxDriveOptBitOffset_DrvDn);
- }
- }
-
- /* Update drvup. */
- if ((config_mask & PinmuxDriveOptBitMask_DrvUp) != 0) {
- if (this->IsCzDrvUp()) {
- const auto opt = (config & PinmuxDriveOptBitMask_CzDrvUp);
- this->UpdateCzDrvUp(opt >> PinmuxDriveOptBitOffset_CzDrvUp);
- } else {
- const auto opt = (config & PinmuxDriveOptBitMask_DrvUp);
- this->UpdateDrvUp(opt >> PinmuxDriveOptBitOffset_DrvUp);
- }
- }
-
- /* Update slwr */
- if ((config_mask & PinmuxDriveOptBitMask_SlwR) != 0) {
- const auto opt = (config & PinmuxDriveOptBitMask_SlwR);
- this->UpdateSlwR(opt >> PinmuxDriveOptBitOffset_SlwR);
- }
-
- /* Update slwf */
- if ((config_mask & PinmuxDriveOptBitMask_SlwR) != 0) {
- const auto opt = (config & PinmuxDriveOptBitMask_SlwF);
- this->UpdateSlwF(opt >> PinmuxDriveOptBitOffset_SlwF);
- }
-
- /* Write the updated register value. */
- this->WriteReg();
- }
-
- void SetCharacter(const PinmuxDrivePadCharacter &character) {
- this->reg_address = character.reg_offset + 0x70000000;
- this->reg_mask = character.reg_mask;
- this->reg_value = this->ReadReg();
- this->pad_name = character.pad_name;
- }
- };
-
- constinit std::array g_pinmux_pads{};
- constinit std::array g_pinmux_drive_pads{};
-
- }
-
- void InitializePlatformPads() {
- /* Initialize all pads. */
- for (size_t i = 0; i < NumPinmuxPadCharacters; ++i) {
- g_pinmux_pads[i].SetCharacter(PinmuxPadCharacters[i]);
- }
-
- /* Update all drive pads. */
- for (size_t i = 0; i < NumPinmuxDrivePadCharacters; ++i) {
- g_pinmux_drive_pads[i].SetCharacter(PinmuxDrivePadCharacters[i]);
- }
- }
-
- void UpdateSinglePinmuxPad(const PinmuxPadConfig &config) {
- if (IsInitialized()) {
- g_pinmux_pads[config.index].UpdatePinmuxPad(config.option, config.option_mask);
- }
- }
-
- void UpdateSinglePinmuxDrivePad(const PinmuxDrivePadConfig &config) {
- if (IsInitialized()) {
- g_pinmux_drive_pads[config.index].UpdatePinmuxDrivePad(config.option, config.option_mask);
- }
- }
-
-}
diff --git a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_platform_pads.hpp b/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_platform_pads.hpp
deleted file mode 100644
index 144bf52..0000000
--- a/libraries/libstratosphere/source/pinmux/driver/board/nintendo_nx/pinmux_platform_pads.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-namespace ams::pinmux::driver::board::nintendo_nx {
-
- struct PinmuxPadConfig {
- u32 index;
- u32 option;
- u32 option_mask;
- };
-
- struct PinmuxDrivePadConfig {
- u32 index;
- u32 option;
- u32 option_mask;
- };
-
- void InitializePlatformPads();
-
- void UpdateSinglePinmuxPad(const PinmuxPadConfig &config);
- void UpdateSinglePinmuxDrivePad(const PinmuxDrivePadConfig &config);
-
-}
diff --git a/libraries/libstratosphere/source/pinmux/driver/pinmux_select_board_impl.hpp b/libraries/libstratosphere/source/pinmux/driver/pinmux_select_board_impl.hpp
index 1bf2c9a..1da07ae 100644
--- a/libraries/libstratosphere/source/pinmux/driver/pinmux_select_board_impl.hpp
+++ b/libraries/libstratosphere/source/pinmux/driver/pinmux_select_board_impl.hpp
@@ -18,7 +18,7 @@
#if defined(ATMOSPHERE_BOARD_NINTENDO_NX)
- #include "board/nintendo_nx/pinmux_board_driver_api.hpp"
+ #include "board/nintendo/nx/pinmux_board_driver_api.hpp"
namespace ams::pinmux::driver::board {
using namespace ams::pinmux::driver::board::nintendo_nx;
}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_battery_driver.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_battery_driver.cpp
new file mode 100644
index 0000000..c1b3be2
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_battery_driver.cpp
@@ -0,0 +1,474 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "../../../powctl_device_management.hpp"
+#include "powctl_retry_helper.hpp"
+#include "powctl_battery_driver.hpp"
+#include "powctl_max17050_driver.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ namespace {
+
+ constinit std::optional g_battery_device;
+
+ Max17050Driver &GetMax17050Driver() {
+ static Max17050Driver s_max17050_driver;
+ return s_max17050_driver;
+ }
+
+ constexpr inline const double SenseResistorValue = 0.005;
+
+ }
+
+ BatteryDevice::BatteryDevice(bool ev) : use_event_handler(ev), event_handler() {
+ if (this->use_event_handler) {
+ /* Create the system event. */
+ os::CreateSystemEvent(std::addressof(this->system_event), os::EventClearMode_ManualClear, true);
+
+ /* Create the handler. */
+ this->event_handler.emplace(this);
+
+ /* Register the event handler. */
+ powctl::impl::RegisterInterruptHandler(std::addressof(*this->event_handler));
+ }
+ }
+
+ /* Generic API. */
+ void BatteryDriver::InitializeDriver() {
+ /* Initialize gpio library. */
+ gpio::Initialize();
+
+ /* Create battery device. */
+ g_battery_device.emplace(this->IsEventHandlerEnabled());
+
+ /* Initialize the Max17050Driver. */
+ {
+ size_t battery_vendor_size;
+ char battery_vendor[0x18] = {};
+ if (R_FAILED(cal::GetBatteryVendor(std::addressof(battery_vendor_size), battery_vendor, sizeof(battery_vendor)))) {
+ battery_vendor[7] = 'A';
+ battery_vendor_size = 0;
+ }
+
+ u8 battery_version = 0;
+ if (R_FAILED(cal::GetBatteryVersion(std::addressof(battery_version)))) {
+ battery_version = 0;
+ }
+
+ GetMax17050Driver().Initialize(battery_vendor, battery_version);
+ }
+
+ /* Register our device. */
+ this->RegisterDevice(std::addressof(*g_battery_device));
+
+ /* Register the charger device's code. */
+ R_ABORT_UNLESS(powctl::impl::RegisterDeviceCode(powctl::DeviceCode_Max17050, std::addressof(*g_battery_device)));
+
+ }
+
+ void BatteryDriver::FinalizeDriver() {
+ /* Unregister the charger device code. */
+ powctl::impl::UnregisterDeviceCode(powctl::DeviceCode_Max17050);
+
+ /* Unregister our device. */
+ this->UnregisterDevice(std::addressof(*g_battery_device));
+
+ /* Finalize Max17050Driver. */
+ GetMax17050Driver().Finalize();
+
+ /* Destroy the charger device. */
+ g_battery_device = std::nullopt;
+
+ /* Finalize gpio library. */
+ gpio::Finalize();
+ }
+
+ Result BatteryDriver::GetDeviceSystemEvent(os::SystemEventType **out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Check that we support event handlers. */
+ R_UNLESS(this->IsEventHandlerEnabled(), powctl::ResultNotAvailable());
+
+ *out = device->SafeCastTo().GetSystemEvent();
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetDeviceInterruptEnabled(IDevice *device, bool enable) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Set the interrupt enable. */
+ device->SafeCastTo().SetInterruptEnabled(enable);
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetDeviceErrorStatus(u32 *out, IDevice *device) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result BatteryDriver::SetDeviceErrorStatus(IDevice *device, u32 status) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result BatteryDriver::GetBatterySocRep(float *out_percent, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_percent != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double percent;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetSocRep(std::addressof(percent)));
+
+ /* Set output. */
+ *out_percent = percent;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatterySocVf(float *out_percent, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_percent != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double percent;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetSocVf(std::addressof(percent)));
+
+ /* Set output. */
+ *out_percent = percent;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryFullCapacity(int *out_mah, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mah != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double mah;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetFullCapacity(std::addressof(mah), SenseResistorValue));
+
+ /* Set output. */
+ *out_mah = mah;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryRemainingCapacity(int *out_mah, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mah != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double mah;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetRemainingCapacity(std::addressof(mah), SenseResistorValue));
+
+ /* Set output. */
+ *out_mah = mah;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryPercentageMinimumAlertThreshold(IDevice *device, float percentage) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetPercentageMinimumAlertThreshold(percentage));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryPercentageMaximumAlertThreshold(IDevice *device, float percentage) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetPercentageMaximumAlertThreshold(percentage));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryPercentageFullThreshold(IDevice *device, float percentage) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetPercentageFullThreshold(percentage));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryAverageCurrent(int *out_ma, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_ma != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double ma;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAverageCurrent(std::addressof(ma), SenseResistorValue));
+
+ /* Set output. */
+ *out_ma = ma;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryCurrent(int *out_ma, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_ma != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double ma;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetCurrent(std::addressof(ma), SenseResistorValue));
+
+ /* Set output. */
+ *out_ma = ma;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryInternalState(void *dst, size_t *out_size, IDevice *device, size_t dst_size) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(dst != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(out_size != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(dst_size == sizeof(max17050::InternalState), powctl::ResultInvalidArgument());
+ R_UNLESS(util::IsAligned(reinterpret_cast(dst), alignof(max17050::InternalState)), powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().ReadInternalState());
+ GetMax17050Driver().GetInternalState(static_cast(dst));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryInternalState(IDevice *device, const void *src, size_t src_size) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(src != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(src_size == sizeof(max17050::InternalState), powctl::ResultInvalidArgument());
+ R_UNLESS(util::IsAligned(reinterpret_cast(src), alignof(max17050::InternalState)), powctl::ResultInvalidArgument());
+
+ GetMax17050Driver().SetInternalState(*static_cast(src));
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().WriteInternalState());
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryNeedToRestoreParameters(bool *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetNeedToRestoreParameters(out));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryNeedToRestoreParameters(IDevice *device, bool en) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Set the value. */
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetNeedToRestoreParameters(en));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::IsBatteryI2cShutdownEnabled(bool *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().IsI2cShutdownEnabled(out));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryI2cShutdownEnabled(IDevice *device, bool en) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Set the value. */
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetI2cShutdownEnabled(en));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::IsBatteryPresent(bool *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the battery status. */
+ u16 status;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetStatus(std::addressof(status)));
+
+ /* Set output. */
+ *out = (status & 0x0008) == 0;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryCycles(int *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the battery cycles. */
+ u16 cycles;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetCycles(std::addressof(cycles)));
+
+ /* Set output. */
+ *out = cycles;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryCycles(IDevice *device, int cycles) {
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(cycles == 0, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().ResetCycles());
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryAge(float *out_percent, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_percent != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double percent;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAge(std::addressof(percent)));
+
+ /* Set output. */
+ *out_percent = percent;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryTemperature(float *out_c, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_c != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double temp;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetTemperature(std::addressof(temp)));
+
+ /* Set output. */
+ *out_c = temp;
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryMaximumTemperature(float *out_c, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_c != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ u8 max_temp;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetMaximumTemperature(std::addressof(max_temp)));
+
+ /* Set output. */
+ *out_c = static_cast(max_temp);
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryTemperatureMinimumAlertThreshold(IDevice *device, float c) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetTemperatureMinimumAlertThreshold(c));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryTemperatureMaximumAlertThreshold(IDevice *device, float c) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetTemperatureMaximumAlertThreshold(c));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryVCell(int *out_mv, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetVCell(out_mv));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryAverageVCell(int *out_mv, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAverageVCell(out_mv));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryAverageVCellTime(TimeSpan *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ double ms;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAverageVCellTime(std::addressof(ms)));
+
+ /* Set output. */
+ *out = TimeSpan::FromMicroSeconds(static_cast(ms * 1000.0));
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryVoltageMinimumAlertThreshold(IDevice *device, int mv) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetVoltageMinimumAlertThreshold(mv));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::GetBatteryOpenCircuitVoltage(int *out_mv, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Get the value. */
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetOpenCircuitVoltage(out_mv));
+
+ return ResultSuccess();
+ }
+
+ Result BatteryDriver::SetBatteryVoltageMaximumAlertThreshold(IDevice *device, int mv) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetVoltageMaximumAlertThreshold(mv));
+
+ return ResultSuccess();
+ }
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_battery_driver.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_battery_driver.hpp
new file mode 100644
index 0000000..1221e0b
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_battery_driver.hpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include "../../../powctl_i_power_control_driver.hpp"
+#include "powctl_interrupt_event_handler.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ class BatteryDevice : public powctl::impl::IDevice {
+ NON_COPYABLE(BatteryDevice);
+ NON_MOVEABLE(BatteryDevice);
+ AMS_DDSF_CASTABLE_TRAITS(ams::powctl::impl::board::nintendo_nx::BatteryDevice, ::ams::powctl::impl::IDevice);
+ private:
+ bool use_event_handler;
+ std::optional event_handler;
+ os::SystemEventType system_event;
+ public:
+ BatteryDevice(bool ev);
+
+ os::SystemEventType *GetSystemEvent() { return std::addressof(this->system_event); }
+
+ void SetInterruptEnabled(bool en) {
+ if (this->use_event_handler) {
+ this->event_handler->SetInterruptEnabled(en);
+ }
+ }
+ };
+
+ class BatteryDriver : public IPowerControlDriver {
+ NON_COPYABLE(BatteryDriver);
+ NON_MOVEABLE(BatteryDriver);
+ AMS_DDSF_CASTABLE_TRAITS(ams::powctl::impl::board::nintendo_nx::BatteryDriver, ::ams::powctl::impl::IPowerControlDriver);
+ public:
+ BatteryDriver(bool ev) : IPowerControlDriver(ev) { /* ... */ }
+
+ /* Generic API. */
+ virtual void InitializeDriver() override;
+ virtual void FinalizeDriver() override;
+
+ virtual Result GetDeviceSystemEvent(os::SystemEventType **out, IDevice *device) override;
+ virtual Result SetDeviceInterruptEnabled(IDevice *device, bool enable) override;
+
+ virtual Result GetDeviceErrorStatus(u32 *out, IDevice *device) override;
+ virtual Result SetDeviceErrorStatus(IDevice *device, u32 status) override;
+
+ /* Battery API. */
+ virtual Result GetBatterySocRep(float *out_percent, IDevice *device) override;
+
+ virtual Result GetBatterySocVf(float *out_percent, IDevice *device) override;
+
+ virtual Result GetBatteryFullCapacity(int *out_mah, IDevice *device) override;
+ virtual Result GetBatteryRemainingCapacity(int *out_mah, IDevice *device) override;
+
+ virtual Result SetBatteryPercentageMinimumAlertThreshold(IDevice *device, float percentage) override;
+ virtual Result SetBatteryPercentageMaximumAlertThreshold(IDevice *device, float percentage) override;
+ virtual Result SetBatteryPercentageFullThreshold(IDevice *device, float percentage) override;
+
+ virtual Result GetBatteryAverageCurrent(int *out_ma, IDevice *device) override;
+ virtual Result GetBatteryCurrent(int *out_ma, IDevice *device) override;
+
+ virtual Result GetBatteryInternalState(void *dst, size_t *out_size, IDevice *device, size_t dst_size) override;
+ virtual Result SetBatteryInternalState(IDevice *device, const void *src, size_t src_size) override;
+
+ virtual Result GetBatteryNeedToRestoreParameters(bool *out, IDevice *device) override;
+ virtual Result SetBatteryNeedToRestoreParameters(IDevice *device, bool en) override;
+
+ virtual Result IsBatteryI2cShutdownEnabled(bool *out, IDevice *device) override;
+ virtual Result SetBatteryI2cShutdownEnabled(IDevice *device, bool en) override;
+
+ virtual Result IsBatteryPresent(bool *out, IDevice *device) override;
+
+ virtual Result GetBatteryCycles(int *out, IDevice *device) override;
+ virtual Result SetBatteryCycles(IDevice *device, int cycles) override;
+
+ virtual Result GetBatteryAge(float *out_percent, IDevice *device) override;
+
+ virtual Result GetBatteryTemperature(float *out_c, IDevice *device) override;
+ virtual Result GetBatteryMaximumTemperature(float *out_c, IDevice *device) override;
+
+ virtual Result SetBatteryTemperatureMinimumAlertThreshold(IDevice *device, float c) override;
+ virtual Result SetBatteryTemperatureMaximumAlertThreshold(IDevice *device, float c) override;
+
+ virtual Result GetBatteryVCell(int *out_mv, IDevice *device) override;
+ virtual Result GetBatteryAverageVCell(int *out_mv, IDevice *device) override;
+
+ virtual Result GetBatteryAverageVCellTime(TimeSpan *out, IDevice *device) override;
+
+ virtual Result SetBatteryVoltageMinimumAlertThreshold(IDevice *device, int mv) override;
+
+ virtual Result GetBatteryOpenCircuitVoltage(int *out_mv, IDevice *device) override;
+
+ virtual Result SetBatteryVoltageMaximumAlertThreshold(IDevice *device, int mv) override;
+
+ /* Unsupported Charger API. */
+ virtual Result GetChargerChargeCurrentState(ChargeCurrentState *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerChargeCurrentState(IDevice *device, ChargeCurrentState state) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetChargerFastChargeCurrentLimit(int *out_ma, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerFastChargeCurrentLimit(IDevice *device, int ma) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetChargerChargeVoltageLimit(int *out_mv, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerChargeVoltageLimit(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetChargerChargerConfiguration(IDevice *device, ChargerConfiguration cfg) override { return powctl::ResultNotSupported(); }
+
+ virtual Result IsChargerHiZEnabled(bool *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerHiZEnabled(IDevice *device, bool en) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetChargerInputCurrentLimit(int *out_ma, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerInputCurrentLimit(IDevice *device, int ma) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetChargerInputVoltageLimit(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetChargerBoostModeCurrentLimit(IDevice *device, int ma) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetChargerChargerStatus(ChargerStatus *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result IsChargerWatchdogTimerEnabled(bool *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerWatchdogTimerEnabled(IDevice *device, bool en) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetChargerWatchdogTimerTimeout(IDevice *device, TimeSpan timeout) override { return powctl::ResultNotSupported(); }
+ virtual Result ResetChargerWatchdogTimer(IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetChargerBatteryCompensation(int *out_mo, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerBatteryCompensation(IDevice *device, int mo) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetChargerVoltageClamp(int *out_mv, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetChargerVoltageClamp(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
+ };
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_board_impl.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_board_impl.cpp
new file mode 100644
index 0000000..4fe399e
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_board_impl.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "../../../powctl_device_management.hpp"
+#include "powctl_board_impl.hpp"
+#include "powctl_battery_driver.hpp"
+#include "powctl_charger_driver.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ namespace {
+
+ constinit std::optional g_charger_driver;
+ constinit std::optional g_battery_driver;
+
+ void InitializeChargerDriver(bool use_event_handlers) {
+ /* Create the charger driver. */
+ g_charger_driver.emplace(use_event_handlers);
+
+ /* Register the driver. */
+ powctl::impl::RegisterDriver(std::addressof(*g_charger_driver));
+ }
+
+ void InitializeBatteryDriver(bool use_event_handlers) {
+ /* Create the battery driver. */
+ g_battery_driver.emplace(use_event_handlers);
+
+ /* Register the driver. */
+ powctl::impl::RegisterDriver(std::addressof(*g_battery_driver));
+ }
+
+ void FinalizeChargerDriver() {
+ /* Unregister the driver. */
+ powctl::impl::UnregisterDriver(std::addressof(*g_charger_driver));
+
+ /* Destroy the battery driver. */
+ g_charger_driver = std::nullopt;
+ }
+
+ void FinalizeBatteryDriver() {
+ /* Unregister the driver. */
+ powctl::impl::UnregisterDriver(std::addressof(*g_battery_driver));
+
+ /* Destroy the battery driver. */
+ g_battery_driver = std::nullopt;
+ }
+
+ }
+
+ void Initialize(bool use_event_handlers) {
+ InitializeChargerDriver(use_event_handlers);
+ InitializeBatteryDriver(use_event_handlers);
+ }
+
+ void Finalize() {
+ FinalizeBatteryDriver();
+ FinalizeChargerDriver();
+ }
+
+}
\ No newline at end of file
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_board_impl.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_board_impl.hpp
new file mode 100644
index 0000000..902c5e9
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_board_impl.hpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+#include "powctl_interrupt_event_handler.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ void Initialize(bool use_event_handlers);
+ void Finalize();
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_bq24193_driver.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_bq24193_driver.cpp
new file mode 100644
index 0000000..32fa8a9
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_bq24193_driver.cpp
@@ -0,0 +1,413 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "powctl_bq24193_driver.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ namespace bq24193 {
+
+ constexpr inline u8 InputSourceControl = 0x00;
+ constexpr inline u8 PowerOnConfiguration = 0x01;
+ constexpr inline u8 ChargeCurrentControl = 0x02;
+ constexpr inline u8 PreChargeTerminationCurrentControl = 0x03;
+ constexpr inline u8 ChargeVoltageControl = 0x04;
+ constexpr inline u8 ChargeTerminationTimerControl = 0x05;
+ constexpr inline u8 IrCompensationThermalRegulationControl = 0x06;
+ constexpr inline u8 MiscOperationControl = 0x07;
+ constexpr inline u8 SystemStatus = 0x08;
+ constexpr inline u8 Fault = 0x09;
+ constexpr inline u8 VendorPartRevisionStatus = 0x0A;
+
+ constexpr u8 EncodePreChargeCurrentLimit(int ma) {
+ constexpr int Minimum = 128;
+ constexpr int Maximum = 2048;
+ ma = std::max(std::min(ma, Maximum), Minimum);
+
+ return static_cast((static_cast(ma - Minimum) >> 7) << 4);
+ }
+
+ constexpr u8 EncodeTerminationCurrentLimit(int ma) {
+ constexpr int Minimum = 128;
+ constexpr int Maximum = 2048;
+ ma = std::max(std::min(ma, Maximum), Minimum);
+
+ return static_cast((static_cast(ma - Minimum) >> 7) << 0);
+ }
+
+ constexpr u8 EncodeMinimumSystemVoltageLimit(int mv) {
+ constexpr int Minimum = 3000;
+ constexpr int Maximum = 3700;
+ mv = std::max(std::min(mv, Maximum), Minimum);
+
+ return static_cast(((mv - Minimum) / 100) << 1);
+ }
+
+ constexpr u8 EncodeFastChargeCurrentLimit(int ma) {
+ constexpr int Minimum = 512;
+ constexpr int Maximum = 4544;
+ ma = std::max(std::min(ma, Maximum), Minimum);
+
+ return static_cast((static_cast(ma - Minimum) >> 6) << 2);
+ }
+
+ constexpr int DecodeFastChargeCurrentLimit(u8 reg) {
+ constexpr int Minimum = 512;
+
+ return Minimum + (static_cast(reg & 0xFC) << 4);
+ }
+
+ static_assert(DecodeFastChargeCurrentLimit(EncodeFastChargeCurrentLimit(512)) == 512);
+ static_assert(DecodeFastChargeCurrentLimit(EncodeFastChargeCurrentLimit(4544)) == 4544);
+ static_assert(DecodeFastChargeCurrentLimit(EncodeFastChargeCurrentLimit(576)) == 576);
+
+ constexpr u8 EncodeChargeVoltageLimit(int mv) {
+ constexpr int Minimum = 3504;
+ constexpr int Maximum = 4400;
+ mv = std::max(std::min(mv, Maximum), Minimum);
+
+ return static_cast((static_cast(mv - Minimum) >> 4) << 2);
+ }
+
+ constexpr int DecodeChargeVoltageLimit(u8 reg) {
+ constexpr int Minimum = 3504;
+
+ return Minimum + (static_cast(reg & 0xFC) << 2);
+ }
+
+ static_assert(DecodeChargeVoltageLimit(EncodeChargeVoltageLimit(3504)) == 3504);
+ static_assert(DecodeChargeVoltageLimit(EncodeChargeVoltageLimit(4400)) == 4400);
+ static_assert(DecodeChargeVoltageLimit(EncodeChargeVoltageLimit(3520)) == 3520);
+
+ constexpr u8 EncodeChargerConfiguration(bq24193::ChargerConfiguration cfg) {
+ switch (cfg) {
+ case ChargerConfiguration_ChargeDisable: return 0x00;
+ case ChargerConfiguration_ChargeBattery: return 0x10;
+ case ChargerConfiguration_Otg: return 0x20;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+ }
+
+ constexpr u8 EncodeWatchdogTimerSetting(int seconds) {
+ if (seconds == 0) {
+ return 0x00;
+ } else if (seconds < 80) {
+ return 0x10;
+ } else if (seconds < 160) {
+ return 0x20;
+ } else {
+ return 0x30;
+ }
+ }
+
+ constexpr u8 EncodeBatteryCompensation(int mo) {
+ constexpr int Minimum = 0;
+ constexpr int Maximum = 70;
+ mo = std::max(std::min(mo, Maximum), Minimum);
+
+ return static_cast((static_cast(mo - Minimum) / 10) << 5);
+ }
+
+ constexpr int DecodeBatteryCompensation(u8 reg) {
+ constexpr int Minimum = 0;
+
+ return Minimum + (static_cast(reg & 0xE0) >> 5) * 10;
+ }
+
+ static_assert(DecodeBatteryCompensation(EncodeBatteryCompensation(0)) == 0);
+ static_assert(DecodeBatteryCompensation(EncodeBatteryCompensation(70)) == 70);
+ static_assert(DecodeBatteryCompensation(EncodeBatteryCompensation(30)) == 30);
+
+ constexpr u8 EncodeVoltageClamp(int mv) {
+ constexpr int Minimum = 0;
+ constexpr int Maximum = 112;
+ mv = std::max(std::min(mv, Maximum), Minimum);
+
+ return static_cast((static_cast(mv - Minimum) >> 4) << 2);
+ }
+
+ constexpr int DecodeVoltageClamp(u8 reg) {
+ constexpr int Minimum = 0;
+
+ return Minimum + (static_cast(reg & 0x1C) << 2);
+ }
+
+ static_assert(DecodeVoltageClamp(EncodeVoltageClamp(0)) == 0);
+ static_assert(DecodeVoltageClamp(EncodeVoltageClamp(112)) == 112);
+ static_assert(DecodeVoltageClamp(EncodeVoltageClamp(64)) == 64);
+
+ constexpr u8 EncodeInputCurrentLimit(int ma) {
+ if (ma < 150) {
+ return 0;
+ } else if (ma < 500) {
+ return 1;
+ } else if (ma < 900) {
+ return 2;
+ } else if (ma < 1200) {
+ return 3;
+ } else if (ma < 1500) {
+ return 4;
+ } else if (ma < 2000) {
+ return 5;
+ } else if (ma < 3000) {
+ return 6;
+ } else{
+ return 7;
+ }
+ }
+
+ constexpr int DecodeInputCurrentLimit(u8 reg) {
+ switch (reg & 0x07) {
+ case 0: return 100;
+ case 1: return 150;
+ case 2: return 500;
+ case 3: return 900;
+ case 4: return 1200;
+ case 5: return 1500;
+ case 6: return 2000;
+ case 7: return 3000;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+ }
+
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(100)) == 100);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(150)) == 150);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(500)) == 500);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(900)) == 900);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(1200)) == 1200);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(1500)) == 1500);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(2000)) == 2000);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(3000)) == 3000);
+
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(0)) == 100);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(9999)) == 3000);
+
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(149)) == 100);
+ static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(151)) == 150);
+
+ constexpr u8 EncodeInputVoltageLimit(int mv) {
+ constexpr int Minimum = 3880;
+ constexpr int Maximum = 5080;
+ mv = std::max(std::min(mv, Maximum), Minimum);
+
+ return static_cast(((static_cast(mv - Minimum) / 80) & 0xF) << 3);
+ }
+
+ constexpr u8 EncodeBoostModeCurrentLimit(int ma) {
+ return ma >= 1300 ? 1 : 0;
+ }
+
+ constexpr bq24193::ChargerStatus DecodeChargerStatus(u8 reg) {
+ switch (reg & 0x30) {
+ case 0x00: return bq24193::ChargerStatus_NotCharging;
+ case 0x10: return bq24193::ChargerStatus_PreCharge;
+ case 0x20: return bq24193::ChargerStatus_FastCharging;
+ case 0x30: return bq24193::ChargerStatus_ChargeTerminationDone;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+ }
+
+ }
+
+ namespace {
+
+ ALWAYS_INLINE Result ReadWriteRegister(const i2c::I2cSession &session, u8 address, u8 mask, u8 value) {
+ /* Read the current value. */
+ u8 cur_val;
+ R_TRY(i2c::ReadSingleRegister(session, address, std::addressof(cur_val)));
+
+ /* Update the value. */
+ const u8 new_val = (cur_val & ~mask) | (value & mask);
+ R_TRY(i2c::WriteSingleRegister(session, address, new_val));
+
+ return ResultSuccess();
+ }
+
+ }
+
+ Result Bq24193Driver::InitializeSession() {
+ /* Set fast charge current limit. */
+ R_TRY(this->SetFastChargeCurrentLimit(512));
+
+ /* Disable force 20 percent charge. */
+ R_TRY(this->SetForce20PercentChargeCurrent(false));
+
+ /* Set pre-charge current limit. */
+ R_TRY(this->SetPreChargeCurrentLimit(128));
+
+ /* Set termination current limit. */
+ R_TRY(this->SetTerminationCurrentLimit(128));
+
+ /* Set minimum system voltage limit. */
+ R_TRY(this->SetMinimumSystemVoltageLimit(3000));
+
+ /* Set watchdog timer setting. */
+ R_TRY(this->SetWatchdogTimerSetting(0));
+
+ /* Disable charging safety timer. */
+ R_TRY(this->SetChargingSafetyTimerEnabled(false));
+
+ /* Reset the watchdog timer. */
+ R_TRY(this->ResetWatchdogTimer());
+
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetPreChargeCurrentLimit(int ma) {
+ return ReadWriteRegister(this->i2c_session, bq24193::PreChargeTerminationCurrentControl, 0xF0, bq24193::EncodePreChargeCurrentLimit(ma));
+ }
+
+ Result Bq24193Driver::SetTerminationCurrentLimit(int ma) {
+ return ReadWriteRegister(this->i2c_session, bq24193::PreChargeTerminationCurrentControl, 0x0F, bq24193::EncodeTerminationCurrentLimit(ma));
+ }
+
+ Result Bq24193Driver::SetMinimumSystemVoltageLimit(int mv) {
+ return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x0E, bq24193::EncodeMinimumSystemVoltageLimit(mv));
+ }
+
+ Result Bq24193Driver::SetChargingSafetyTimerEnabled(bool en) {
+ return ReadWriteRegister(this->i2c_session, bq24193::ChargeTerminationTimerControl, 0x08, en ? 0x08 : 0x00);
+ }
+
+ Result Bq24193Driver::GetForce20PercentChargeCurrent(bool *out) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::ChargeCurrentControl, std::addressof(val)));
+
+ /* Extract the value. */
+ *out = (val & 0x01) != 0;
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetForce20PercentChargeCurrent(bool en) {
+ return ReadWriteRegister(this->i2c_session, bq24193::ChargeCurrentControl, 0x01, en ? 0x01 : 0x00);
+ }
+
+ Result Bq24193Driver::GetFastChargeCurrentLimit(int *out_ma) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::ChargeCurrentControl, std::addressof(val)));
+
+ /* Extract the value. */
+ *out_ma = bq24193::DecodeFastChargeCurrentLimit(val);
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetFastChargeCurrentLimit(int ma) {
+ return ReadWriteRegister(this->i2c_session, bq24193::ChargeCurrentControl, 0xFC, bq24193::EncodeFastChargeCurrentLimit(ma));
+ }
+
+ Result Bq24193Driver::GetChargeVoltageLimit(int *out_mv) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::ChargeVoltageControl, std::addressof(val)));
+
+ /* Extract the value. */
+ *out_mv = bq24193::DecodeChargeVoltageLimit(val);
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetChargeVoltageLimit(int mv) {
+ return ReadWriteRegister(this->i2c_session, bq24193::ChargeVoltageControl, 0xFC, bq24193::EncodeChargeVoltageLimit(mv));
+ }
+
+ Result Bq24193Driver::SetChargerConfiguration(bq24193::ChargerConfiguration cfg) {
+ return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x30, bq24193::EncodeChargerConfiguration(cfg));
+ }
+
+ Result Bq24193Driver::IsHiZEnabled(bool *out) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::InputSourceControl, std::addressof(val)));
+
+ /* Extract the value. */
+ *out = (val & 0x80) != 0;
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetHiZEnabled(bool en) {
+ return ReadWriteRegister(this->i2c_session, bq24193::InputSourceControl, 0x80, en ? 0x80 : 0x00);
+ }
+
+ Result Bq24193Driver::GetInputCurrentLimit(int *out_ma) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::InputSourceControl, std::addressof(val)));
+
+ /* Extract the value. */
+ *out_ma = bq24193::DecodeInputCurrentLimit(val);
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetInputCurrentLimit(int ma) {
+ return ReadWriteRegister(this->i2c_session, bq24193::InputSourceControl, 0x07, bq24193::EncodeInputCurrentLimit(ma));
+ }
+
+ Result Bq24193Driver::SetInputVoltageLimit(int mv) {
+ return ReadWriteRegister(this->i2c_session, bq24193::InputSourceControl, 0x78, bq24193::EncodeInputVoltageLimit(mv));
+ }
+
+ Result Bq24193Driver::SetBoostModeCurrentLimit(int ma) {
+ return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x01, bq24193::EncodeBoostModeCurrentLimit(ma));
+ }
+
+ Result Bq24193Driver::GetChargerStatus(bq24193::ChargerStatus *out) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::SystemStatus, std::addressof(val)));
+
+ /* Extract the value. */
+ *out = bq24193::DecodeChargerStatus(val);
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::ResetWatchdogTimer() {
+ return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x40, 0x40);
+ }
+
+ Result Bq24193Driver::SetWatchdogTimerSetting(int seconds) {
+ return ReadWriteRegister(this->i2c_session, bq24193::ChargeTerminationTimerControl, 0x30, bq24193::EncodeWatchdogTimerSetting(seconds));
+ }
+
+ Result Bq24193Driver::GetBatteryCompensation(int *out_mo) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, std::addressof(val)));
+
+ /* Extract the value. */
+ *out_mo = bq24193::DecodeBatteryCompensation(val);
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetBatteryCompensation(int mo) {
+ return ReadWriteRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, 0xE0, bq24193::EncodeBatteryCompensation(mo));
+ }
+
+ Result Bq24193Driver::GetVoltageClamp(int *out_mv) {
+ /* Get the register. */
+ u8 val;
+ R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, std::addressof(val)));
+
+ /* Extract the value. */
+ *out_mv = bq24193::DecodeVoltageClamp(val);
+ return ResultSuccess();
+ }
+
+ Result Bq24193Driver::SetVoltageClamp(int mv) {
+ return ReadWriteRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, 0x1C, bq24193::EncodeVoltageClamp(mv));
+ }
+
+}
\ No newline at end of file
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_bq24193_driver.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_bq24193_driver.hpp
new file mode 100644
index 0000000..01d9b90
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_bq24193_driver.hpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ namespace bq24193 {
+
+ enum ChargerConfiguration {
+ ChargerConfiguration_ChargeDisable = 0,
+ ChargerConfiguration_ChargeBattery = 1,
+ ChargerConfiguration_Otg = 2,
+ };
+
+ enum ChargerStatus {
+ ChargerStatus_NotCharging = 0,
+ ChargerStatus_PreCharge = 1,
+ ChargerStatus_FastCharging = 2,
+ ChargerStatus_ChargeTerminationDone = 3,
+ };
+
+ }
+
+ class Bq24193Driver {
+ private:
+ os::SdkMutex mutex;
+ int init_count;
+ i2c::I2cSession i2c_session;
+ private:
+ Result InitializeSession();
+ public:
+ Bq24193Driver() : mutex(), init_count(0), i2c_session() {
+ /* ... */
+ }
+
+ void Initialize() {
+ std::scoped_lock lk(this->mutex);
+ if ((this->init_count++) == 0) {
+ /* Initialize i2c library. */
+ i2c::InitializeEmpty();
+
+ /* Open session. */
+ R_ABORT_UNLESS(i2c::OpenSession(std::addressof(this->i2c_session), i2c::DeviceCode_Bq24193));
+
+ /* Initialize session. */
+ R_ABORT_UNLESS(this->InitializeSession());
+ }
+ }
+
+ void Finalize() {
+ std::scoped_lock lk(this->mutex);
+ if ((--this->init_count) == 0) {
+ /* Close session. */
+ i2c::CloseSession(this->i2c_session);
+
+ /* Finalize i2c library. */
+ i2c::Finalize();
+ }
+ }
+
+ Result SetPreChargeCurrentLimit(int ma);
+ Result SetTerminationCurrentLimit(int ma);
+
+ Result SetMinimumSystemVoltageLimit(int mv);
+
+ Result SetChargingSafetyTimerEnabled(bool en);
+
+ Result GetForce20PercentChargeCurrent(bool *out);
+ Result SetForce20PercentChargeCurrent(bool en);
+
+ Result GetFastChargeCurrentLimit(int *out_ma);
+ Result SetFastChargeCurrentLimit(int ma);
+
+ Result GetChargeVoltageLimit(int *out_mv);
+ Result SetChargeVoltageLimit(int mv);
+
+ Result SetChargerConfiguration(bq24193::ChargerConfiguration cfg);
+
+ Result IsHiZEnabled(bool *out);
+ Result SetHiZEnabled(bool en);
+
+ Result GetInputCurrentLimit(int *out_ma);
+ Result SetInputCurrentLimit(int ma);
+
+ Result SetInputVoltageLimit(int mv);
+
+ Result SetBoostModeCurrentLimit(int ma);
+
+ Result GetChargerStatus(bq24193::ChargerStatus *out);
+
+ Result ResetWatchdogTimer();
+ Result SetWatchdogTimerSetting(int seconds);
+
+ Result GetBatteryCompensation(int *out_mo);
+ Result SetBatteryCompensation(int mo);
+
+ Result GetVoltageClamp(int *out_mv);
+ Result SetVoltageClamp(int mv);
+ };
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_charger_driver.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_charger_driver.cpp
new file mode 100644
index 0000000..08e1c9a
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_charger_driver.cpp
@@ -0,0 +1,369 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "../../../powctl_device_management.hpp"
+#include "powctl_retry_helper.hpp"
+#include "powctl_charger_driver.hpp"
+#include "powctl_bq24193_driver.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ namespace {
+
+ constinit std::optional g_charger_device;
+
+ Bq24193Driver &GetBq24193Driver() {
+ static Bq24193Driver s_bq24193_driver;
+ return s_bq24193_driver;
+ }
+
+ }
+
+ ChargerDevice::ChargerDevice(bool ev) : gpio_pad_session(), watchdog_timer_enabled(false), watchdog_timer_timeout(0), use_event_handler(ev), event_handler() {
+ if (this->use_event_handler) {
+ /* Create the system event. */
+ os::CreateSystemEvent(std::addressof(this->system_event), os::EventClearMode_ManualClear, true);
+
+ /* Create the handler. */
+ this->event_handler.emplace(this);
+
+ /* Register the event handler. */
+ powctl::impl::RegisterInterruptHandler(std::addressof(*this->event_handler));
+ }
+ }
+
+ /* Generic API. */
+ void ChargerDriver::InitializeDriver() {
+ /* Initialize Bq24193Driver */
+ GetBq24193Driver().Initialize();
+
+ /* Initialize gpio library. */
+ gpio::Initialize();
+
+ /* Create charger device. */
+ g_charger_device.emplace(this->IsEventHandlerEnabled());
+
+ /* Open the device's gpio session. */
+ R_ABORT_UNLESS(gpio::OpenSession(g_charger_device->GetPadSession(), gpio::DeviceCode_BattChgEnableN));
+
+ /* Configure the gpio session as output. */
+ gpio::SetDirection(g_charger_device->GetPadSession(), gpio::Direction_Output);
+
+ /* Register our device. */
+ this->RegisterDevice(std::addressof(*g_charger_device));
+
+ /* Register the charger device's code. */
+ R_ABORT_UNLESS(powctl::impl::RegisterDeviceCode(powctl::DeviceCode_Bq24193, std::addressof(*g_charger_device)));
+ }
+
+ void ChargerDriver::FinalizeDriver() {
+ /* Unregister the charger device code. */
+ powctl::impl::UnregisterDeviceCode(powctl::DeviceCode_Bq24193);
+
+ /* Unregister our device. */
+ this->UnregisterDevice(std::addressof(*g_charger_device));
+
+ /* Close the device's gpio session. */
+ gpio::CloseSession(g_charger_device->GetPadSession());
+
+ /* Destroy the charger device. */
+ g_charger_device = std::nullopt;
+
+ /* Finalize gpio library. */
+ gpio::Finalize();
+
+ /* Finalize Bq24193Driver. */
+ GetBq24193Driver().Finalize();
+ }
+
+ Result ChargerDriver::GetDeviceSystemEvent(os::SystemEventType **out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Check that we support event handlers. */
+ R_UNLESS(this->IsEventHandlerEnabled(), powctl::ResultNotAvailable());
+
+ *out = device->SafeCastTo().GetSystemEvent();
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetDeviceInterruptEnabled(IDevice *device, bool enable) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Set the interrupt enable. */
+ device->SafeCastTo().SetInterruptEnabled(enable);
+
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::GetDeviceErrorStatus(u32 *out, IDevice *device) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ Result ChargerDriver::SetDeviceErrorStatus(IDevice *device, u32 status) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ /* Charger API. */
+ Result ChargerDriver::GetChargerChargeCurrentState(ChargeCurrentState *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ /* Check if we're not charging. */
+ if (gpio::GetValue(device->SafeCastTo().GetPadSession()) == gpio::GpioValue_High) {
+ *out = ChargeCurrentState_NotCharging;
+ } else {
+ /* Get force 20 percent charge state. */
+ bool force_20_percent;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().GetForce20PercentChargeCurrent(std::addressof(force_20_percent)));
+
+ /* Set output appropriately. */
+ if (force_20_percent) {
+ *out = ChargeCurrentState_ChargingForce20Percent;
+ } else {
+ *out = ChargeCurrentState_Charging;
+ }
+ }
+
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerChargeCurrentState(IDevice *device, ChargeCurrentState state) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ switch (state) {
+ case ChargeCurrentState_NotCharging:
+ gpio::SetValue(device->SafeCastTo().GetPadSession(), gpio::GpioValue_High);
+ break;
+ case ChargeCurrentState_ChargingForce20Percent:
+ case ChargeCurrentState_Charging:
+ gpio::SetValue(device->SafeCastTo().GetPadSession(), gpio::GpioValue_Low);
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetForce20PercentChargeCurrent(state == ChargeCurrentState_ChargingForce20Percent));
+ break;
+ case ChargeCurrentState_Unknown:
+ return powctl::ResultInvalidArgument();
+ }
+
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::GetChargerFastChargeCurrentLimit(int *out_ma, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_ma != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().GetFastChargeCurrentLimit(out_ma));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerFastChargeCurrentLimit(IDevice *device, int ma) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetFastChargeCurrentLimit(ma));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::GetChargerChargeVoltageLimit(int *out_mv, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().GetChargeVoltageLimit(out_mv));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerChargeVoltageLimit(IDevice *device, int mv) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetChargeVoltageLimit(mv));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerChargerConfiguration(IDevice *device, ChargerConfiguration cfg) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ bq24193::ChargerConfiguration bq_cfg;
+ switch (cfg) {
+ case ChargerConfiguration_ChargeDisable: bq_cfg = bq24193::ChargerConfiguration_ChargeDisable; break;
+ case ChargerConfiguration_ChargeBattery: bq_cfg = bq24193::ChargerConfiguration_ChargeBattery; break;
+ case ChargerConfiguration_Otg: bq_cfg = bq24193::ChargerConfiguration_Otg; break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetChargerConfiguration(bq_cfg));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::IsChargerHiZEnabled(bool *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().IsHiZEnabled(out));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerHiZEnabled(IDevice *device, bool en) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetHiZEnabled(en));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::GetChargerInputCurrentLimit(int *out_ma, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_ma != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().GetInputCurrentLimit(out_ma));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerInputCurrentLimit(IDevice *device, int ma) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetInputCurrentLimit(ma));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerInputVoltageLimit(IDevice *device, int mv) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetInputVoltageLimit(mv));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerBoostModeCurrentLimit(IDevice *device, int ma) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetBoostModeCurrentLimit(ma));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::GetChargerChargerStatus(ChargerStatus *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ bq24193::ChargerStatus bq_status;
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().GetChargerStatus(std::addressof(bq_status)));
+
+ switch (bq_status) {
+ case bq24193::ChargerStatus_NotCharging:
+ *out = ChargerStatus_NotCharging;
+ break;
+ case bq24193::ChargerStatus_PreCharge:
+ case bq24193::ChargerStatus_FastCharging:
+ *out = ChargerStatus_Charging;
+ break;
+ case bq24193::ChargerStatus_ChargeTerminationDone:
+ *out = ChargerStatus_ChargeTerminationDone;
+ break;
+ AMS_UNREACHABLE_DEFAULT_CASE();
+ }
+
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::IsChargerWatchdogTimerEnabled(bool *out, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ *out = device->SafeCastTo().IsWatchdogTimerEnabled();
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerWatchdogTimerEnabled(IDevice *device, bool en) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ auto &charger_device = device->SafeCastTo();
+
+ if (en) {
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().ResetWatchdogTimer());
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetWatchdogTimerSetting(charger_device.GetWatchdogTimerTimeout().GetSeconds()));
+ } else {
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetWatchdogTimerSetting(0));
+ }
+
+ charger_device.SetWatchdogTimerEnabled(en);
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerWatchdogTimerTimeout(IDevice *device, TimeSpan timeout) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ device->SafeCastTo().SetWatchdogTimerTimeout(timeout);
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::ResetChargerWatchdogTimer(IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().ResetWatchdogTimer());
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::GetChargerBatteryCompensation(int *out_mo, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mo != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().GetBatteryCompensation(out_mo));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerBatteryCompensation(IDevice *device, int mo) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetBatteryCompensation(mo));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::GetChargerVoltageClamp(int *out_mv, IDevice *device) {
+ /* Validate arguments. */
+ R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().GetVoltageClamp(out_mv));
+ return ResultSuccess();
+ }
+
+ Result ChargerDriver::SetChargerVoltageClamp(IDevice *device, int mv) {
+ /* Validate arguments. */
+ R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
+
+ AMS_POWCTL_R_TRY_WITH_RETRY(GetBq24193Driver().SetVoltageClamp(mv));
+ return ResultSuccess();
+ }
+
+}
\ No newline at end of file
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_charger_driver.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_charger_driver.hpp
new file mode 100644
index 0000000..680d44c
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_charger_driver.hpp
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include "../../../powctl_i_power_control_driver.hpp"
+#include "powctl_interrupt_event_handler.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ class ChargerDevice : public powctl::impl::IDevice {
+ NON_COPYABLE(ChargerDevice);
+ NON_MOVEABLE(ChargerDevice);
+ AMS_DDSF_CASTABLE_TRAITS(ams::powctl::impl::board::nintendo_nx::ChargerDevice, ::ams::powctl::impl::IDevice);
+ private:
+ gpio::GpioPadSession gpio_pad_session;
+ bool watchdog_timer_enabled;
+ TimeSpan watchdog_timer_timeout;
+ bool use_event_handler;
+ std::optional event_handler;
+ os::SystemEventType system_event;
+ public:
+ ChargerDevice(bool ev);
+
+ bool IsWatchdogTimerEnabled() const { return this->watchdog_timer_enabled; }
+ void SetWatchdogTimerEnabled(bool en) { this->watchdog_timer_enabled = en; }
+
+ TimeSpan GetWatchdogTimerTimeout() const { return this->watchdog_timer_timeout; }
+ void SetWatchdogTimerTimeout(TimeSpan ts) { this->watchdog_timer_timeout = ts; }
+
+ gpio::GpioPadSession *GetPadSession() { return std::addressof(this->gpio_pad_session); }
+
+ os::SystemEventType *GetSystemEvent() { return std::addressof(this->system_event); }
+
+ void SetInterruptEnabled(bool en) {
+ if (this->use_event_handler) {
+ this->event_handler->SetInterruptEnabled(en);
+ }
+ }
+ };
+
+ class ChargerDriver : public IPowerControlDriver {
+ NON_COPYABLE(ChargerDriver);
+ NON_MOVEABLE(ChargerDriver);
+ AMS_DDSF_CASTABLE_TRAITS(ams::powctl::impl::board::nintendo_nx::ChargerDriver, ::ams::powctl::impl::IPowerControlDriver);
+ public:
+ ChargerDriver(bool ev) : IPowerControlDriver(ev) { /* ... */ }
+
+ /* Generic API. */
+ virtual void InitializeDriver() override;
+ virtual void FinalizeDriver() override;
+
+ virtual Result GetDeviceSystemEvent(os::SystemEventType **out, IDevice *device) override;
+ virtual Result SetDeviceInterruptEnabled(IDevice *device, bool enable) override;
+
+ virtual Result GetDeviceErrorStatus(u32 *out, IDevice *device) override;
+ virtual Result SetDeviceErrorStatus(IDevice *device, u32 status) override;
+
+ /* Charger API. */
+ virtual Result GetChargerChargeCurrentState(ChargeCurrentState *out, IDevice *device) override;
+ virtual Result SetChargerChargeCurrentState(IDevice *device, ChargeCurrentState state) override;
+
+ virtual Result GetChargerFastChargeCurrentLimit(int *out_ma, IDevice *device) override;
+ virtual Result SetChargerFastChargeCurrentLimit(IDevice *device, int ma) override;
+
+ virtual Result GetChargerChargeVoltageLimit(int *out_mv, IDevice *device) override;
+ virtual Result SetChargerChargeVoltageLimit(IDevice *device, int mv) override;
+
+ virtual Result SetChargerChargerConfiguration(IDevice *device, ChargerConfiguration cfg) override;
+
+ virtual Result IsChargerHiZEnabled(bool *out, IDevice *device) override;
+ virtual Result SetChargerHiZEnabled(IDevice *device, bool en) override;
+
+ virtual Result GetChargerInputCurrentLimit(int *out_ma, IDevice *device) override;
+ virtual Result SetChargerInputCurrentLimit(IDevice *device, int ma) override;
+
+ virtual Result SetChargerInputVoltageLimit(IDevice *device, int mv) override;
+
+ virtual Result SetChargerBoostModeCurrentLimit(IDevice *device, int ma) override;
+
+ virtual Result GetChargerChargerStatus(ChargerStatus *out, IDevice *device) override;
+
+ virtual Result IsChargerWatchdogTimerEnabled(bool *out, IDevice *device) override;
+ virtual Result SetChargerWatchdogTimerEnabled(IDevice *device, bool en) override;
+
+ virtual Result SetChargerWatchdogTimerTimeout(IDevice *device, TimeSpan timeout) override;
+ virtual Result ResetChargerWatchdogTimer(IDevice *device) override;
+
+ virtual Result GetChargerBatteryCompensation(int *out_mo, IDevice *device) override;
+ virtual Result SetChargerBatteryCompensation(IDevice *device, int mo) override;
+
+ virtual Result GetChargerVoltageClamp(int *out_mv, IDevice *device) override;
+ virtual Result SetChargerVoltageClamp(IDevice *device, int mv) override;
+
+ /* Unsupported Battery API. */
+ virtual Result GetBatterySocRep(float *out_percent, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatterySocVf(float *out_percent, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryFullCapacity(int *out_mah, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result GetBatteryRemainingCapacity(int *out_mah, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetBatteryPercentageMinimumAlertThreshold(IDevice *device, float percentage) override { return powctl::ResultNotSupported(); }
+ virtual Result SetBatteryPercentageMaximumAlertThreshold(IDevice *device, float percentage) override { return powctl::ResultNotSupported(); }
+ virtual Result SetBatteryPercentageFullThreshold(IDevice *device, float percentage) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryAverageCurrent(int *out_ma, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result GetBatteryCurrent(int *out_ma, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryInternalState(void *dst, size_t *out_size, IDevice *device, size_t dst_size) override { return powctl::ResultNotSupported(); }
+ virtual Result SetBatteryInternalState(IDevice *device, const void *src, size_t src_size) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryNeedToRestoreParameters(bool *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetBatteryNeedToRestoreParameters(IDevice *device, bool en) override { return powctl::ResultNotSupported(); }
+
+ virtual Result IsBatteryI2cShutdownEnabled(bool *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetBatteryI2cShutdownEnabled(IDevice *device, bool en) override { return powctl::ResultNotSupported(); }
+
+ virtual Result IsBatteryPresent(bool *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryCycles(int *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result SetBatteryCycles(IDevice *device, int cycles) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryAge(float *out_percent, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryTemperature(float *out_c, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result GetBatteryMaximumTemperature(float *out_c, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetBatteryTemperatureMinimumAlertThreshold(IDevice *device, float c) override { return powctl::ResultNotSupported(); }
+ virtual Result SetBatteryTemperatureMaximumAlertThreshold(IDevice *device, float c) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryVCell(int *out_mv, IDevice *device) override { return powctl::ResultNotSupported(); }
+ virtual Result GetBatteryAverageVCell(int *out_mv, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryAverageVCellTime(TimeSpan *out, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetBatteryVoltageMinimumAlertThreshold(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
+
+ virtual Result GetBatteryOpenCircuitVoltage(int *out_mv, IDevice *device) override { return powctl::ResultNotSupported(); }
+
+ virtual Result SetBatteryVoltageMaximumAlertThreshold(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
+ };
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_interrupt_event_handler.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_interrupt_event_handler.cpp
new file mode 100644
index 0000000..360abec
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_interrupt_event_handler.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "powctl_interrupt_event_handler.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ void ChargerInterruptEventHandler::SignalEvent(IDevice *device) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+ void BatteryInterruptEventHandler::SignalEvent(IDevice *device) {
+ /* TODO */
+ AMS_ABORT();
+ }
+
+}
\ No newline at end of file
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_interrupt_event_handler.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_interrupt_event_handler.hpp
new file mode 100644
index 0000000..b445302
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_interrupt_event_handler.hpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include "../../../powctl_i_power_control_driver.hpp"
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ template
+ class InterruptEventHandler : public ddsf::IEventHandler {
+ private:
+ IDevice *device;
+ gpio::GpioPadSession gpio_session;
+ os::SystemEventType gpio_system_event;
+ os::SdkMutex mutex;
+ public:
+ InterruptEventHandler(IDevice *dv) : IEventHandler(), device(dv), mutex() {
+ /* Initialize the gpio session. */
+ Derived::Initialize(std::addressof(this->gpio_session), std::addressof(this->gpio_system_event));
+
+ /* Initialize ourselves as an event handler. */
+ IEventHandler::Initialize(std::addressof(this->gpio_system_event));
+ }
+
+ os::SystemEventType *GetSystemEvent() {
+ return std::addressof(this->gpio_system_event);
+ }
+
+ void SetInterruptEnabled(bool en) {
+ std::scoped_lock lk(this->mutex);
+
+ gpio::SetInterruptEnable(std::addressof(this->gpio_session), en);
+ }
+
+ virtual void HandleEvent() override final {
+ /* Acquire exclusive access to ourselves. */
+ std::scoped_lock lk(this->mutex);
+
+ /* Clear our interrupt status. */
+ gpio::ClearInterruptStatus(std::addressof(this->gpio_session));
+
+ /* Clear our system event. */
+ os::ClearSystemEvent(std::addressof(this->gpio_system_event));
+
+ /* Signal the event. */
+ static_cast(this)->SignalEvent(this->device);
+ }
+ };
+
+ class ChargerInterruptEventHandler : public InterruptEventHandler {
+ friend class InterruptEventHandler;
+ private:
+ static void Initialize(gpio::GpioPadSession *session, os::SystemEventType *event) {
+ /* Open the gpio session. */
+ R_ABORT_UNLESS(gpio::OpenSession(session, gpio::DeviceCode_Bq24190Irq));
+
+ /* Configure the gpio session. */
+ gpio::SetDirection(session, gpio::Direction_Input);
+ gpio::SetInterruptMode(session, gpio::InterruptMode_FallingEdge);
+ gpio::SetInterruptEnable(session, true);
+
+ /* Bind the interrupt event. */
+ R_ABORT_UNLESS(gpio::BindInterrupt(event, session));
+ }
+
+ void SignalEvent(IDevice *device);
+ public:
+ ChargerInterruptEventHandler(IDevice *dv) : InterruptEventHandler(dv) { /* ... */ }
+ };
+
+ class BatteryInterruptEventHandler : public InterruptEventHandler {
+ friend class InterruptEventHandler;
+ private:
+ static void Initialize(gpio::GpioPadSession *session, os::SystemEventType *event) {
+ /* Open the gpio session. */
+ R_ABORT_UNLESS(gpio::OpenSession(session, gpio::DeviceCode_BattMgicIrq));
+
+ /* Configure the gpio session. */
+ gpio::SetDirection(session, gpio::Direction_Input);
+ gpio::SetInterruptMode(session, gpio::InterruptMode_LowLevel);
+
+ /* Bind the interrupt event. */
+ R_ABORT_UNLESS(gpio::BindInterrupt(event, session));
+ }
+
+ void SignalEvent(IDevice *device);
+ public:
+ BatteryInterruptEventHandler(IDevice *dv) : InterruptEventHandler(dv) { /* ... */ }
+ };
+
+}
\ No newline at end of file
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_custom_parameters.inc b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_custom_parameters.inc
new file mode 100644
index 0000000..03c5a02
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_custom_parameters.inc
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/* NOTE: This file is auto-generated by max17050_parameters_gen.py, do not edit manually. */
+
+constexpr inline const CustomParameters CustomParameters0A = {
+ .relaxcfg = 0x203B,
+ .rcomp0 = 0x0053,
+ .tempco = 0x1C22,
+ .ichgterm = 0x0333,
+ .tgain = 0xE1F6,
+ .toff = 0x2BF2,
+ .vempty = 0xA05F,
+ .qresidual00 = 0x5786,
+ .qresidual10 = 0x3184,
+ .qresidual20 = 0x1E00,
+ .qresidual30 = 0x1502,
+ .fullcap = 0x2476,
+ .vffullcap = 0x2476,
+ .modeltbl = {
+ 0x9FF0, 0xAD30, 0xB5D0, 0xB9C0, 0xBAD0, 0xBBE0, 0xBC30, 0xBC90,
+ 0xBCE0, 0xBD40, 0xBE70, 0xC0E0, 0xC4E0, 0xC890, 0xCC90, 0xD0F0,
+ 0x0170, 0x0480, 0x0590, 0x0BE0, 0x0A00, 0x3C00, 0x3810, 0x3A00,
+ 0x3A30, 0x19F0, 0x0EF0, 0x0AF0, 0x0BD0, 0x07F0, 0x06F0, 0x06F0,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ },
+ .fullsocthr = 0x5F00,
+ .iavgempty = 0x1D2A,
+};
+
+constexpr inline const CustomParameters CustomParameters0R = {
+ .relaxcfg = 0x203B,
+ .rcomp0 = 0x0048,
+ .tempco = 0x2034,
+ .ichgterm = 0x0333,
+ .tgain = 0xE1F6,
+ .toff = 0x2BF2,
+ .vempty = 0xA05F,
+ .qresidual00 = 0x5A00,
+ .qresidual10 = 0x3B00,
+ .qresidual20 = 0x0F80,
+ .qresidual30 = 0x0B02,
+ .fullcap = 0x2466,
+ .vffullcap = 0x2466,
+ .modeltbl = {
+ 0x9C50, 0xAD90, 0xB270, 0xB6A0, 0xB8F0, 0xBB10, 0xBC00, 0xBD00,
+ 0xBD70, 0xBE70, 0xBF50, 0xC1F0, 0xC380, 0xC590, 0xC8E0, 0xD0B0,
+ 0x00D0, 0x0150, 0x0300, 0x0D00, 0x0E00, 0x1900, 0x2AC0, 0x2830,
+ 0x1760, 0x18F0, 0x0DF0, 0x0BC0, 0x0DF0, 0x0BF0, 0x06F0, 0x06F0,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ },
+ .fullsocthr = 0x5F00,
+ .iavgempty = 0x1D2A,
+};
+
+constexpr inline const CustomParameters CustomParameters0M = {
+ .relaxcfg = 0x203B,
+ .rcomp0 = 0x0085,
+ .tempco = 0x1625,
+ .ichgterm = 0x0333,
+ .tgain = 0xE1F6,
+ .toff = 0x2BF2,
+ .vempty = 0xA05F,
+ .qresidual00 = 0x3100,
+ .qresidual10 = 0x1B00,
+ .qresidual20 = 0x1000,
+ .qresidual30 = 0x0C81,
+ .fullcap = 0x227A,
+ .vffullcap = 0x227A,
+ .modeltbl = {
+ 0xA340, 0xB840, 0xB900, 0xBB70, 0xBC90, 0xBD20, 0xBDC0, 0xBEA0,
+ 0xBF70, 0xC030, 0xC210, 0xC3F0, 0xC800, 0xC9E0, 0xCCA0, 0xD090,
+ 0x0160, 0x3800, 0x0800, 0x1E00, 0x2550, 0x3060, 0x15D0, 0x1810,
+ 0x1490, 0x0B80, 0x0BF0, 0x0AF0, 0x0CB0, 0x06F0, 0x09D0, 0x09D0,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ },
+ .fullsocthr = 0x5F00,
+ .iavgempty = 0x1D2A,
+};
+
+constexpr inline const CustomParameters CustomParameters1 = {
+ .relaxcfg = 0x203B,
+ .rcomp0 = 0x0040,
+ .tempco = 0x1624,
+ .ichgterm = 0x0333,
+ .tgain = 0xE1F6,
+ .toff = 0x2BF2,
+ .vempty = 0xA05F,
+ .qresidual00 = 0x4690,
+ .qresidual10 = 0x2605,
+ .qresidual20 = 0x1605,
+ .qresidual30 = 0x0F05,
+ .fullcap = 0x1AE4,
+ .vffullcap = 0x1AE4,
+ .modeltbl = {
+ 0x8B50, 0x9C20, 0xACF0, 0xB160, 0xB3A0, 0xB5B0, 0xB950, 0xBBE0,
+ 0xBDC0, 0xBEF0, 0xC140, 0xC250, 0xC600, 0xC960, 0xCCE0, 0xD060,
+ 0x0070, 0x00F0, 0x0440, 0x0400, 0x0500, 0x0400, 0x0D00, 0x3270,
+ 0x0FB0, 0x0AF0, 0x10F0, 0x0CE0, 0x09E0, 0x07F0, 0x06F0, 0x06F0,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ },
+ .fullsocthr = 0x5F00,
+ .iavgempty = 0x1584,
+};
+
+constexpr inline const CustomParameters CustomParameters2A = {
+ .relaxcfg = 0x203B,
+ .rcomp0 = 0x004A,
+ .tempco = 0x1D23,
+ .ichgterm = 0x0333,
+ .tgain = 0xE1F6,
+ .toff = 0x2BF2,
+ .vempty = 0xA05F,
+ .qresidual00 = 0x4000,
+ .qresidual10 = 0x1E80,
+ .qresidual20 = 0x0D83,
+ .qresidual30 = 0x0783,
+ .fullcap = 0x1C20,
+ .vffullcap = 0x1C20,
+ .modeltbl = {
+ 0x8040, 0x9A30, 0xB430, 0xB770, 0xBAB0, 0xBBC0, 0xBD00, 0xBE50,
+ 0xBF70, 0xC0D0, 0xC300, 0xC590, 0xC960, 0xCD40, 0xD1F0, 0xD5C0,
+ 0x0040, 0x0060, 0x0510, 0x0D30, 0x16C0, 0x2160, 0x1380, 0x1A10,
+ 0x0EC0, 0x0CE0, 0x08F0, 0x0940, 0x0920, 0x06F0, 0x06C0, 0x06C0,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ },
+ .fullsocthr = 0x5500,
+ .iavgempty = 0x1680,
+};
+
+constexpr inline const CustomParameters CustomParameters2R = {
+ .relaxcfg = 0x203B,
+ .rcomp0 = 0x004C,
+ .tempco = 0x2D32,
+ .ichgterm = 0x0333,
+ .tgain = 0xE1F6,
+ .toff = 0x2BF2,
+ .vempty = 0xA05F,
+ .qresidual00 = 0x5900,
+ .qresidual10 = 0x2900,
+ .qresidual20 = 0x1100,
+ .qresidual30 = 0x0B00,
+ .fullcap = 0x1CCE,
+ .vffullcap = 0x1CCE,
+ .modeltbl = {
+ 0x8E10, 0x9FC0, 0xA880, 0xB750, 0xBA10, 0xBB30, 0xBD20, 0xBE80,
+ 0xC0A0, 0xC350, 0xC670, 0xC8C0, 0xCCF0, 0xD050, 0xD140, 0xD5F0,
+ 0x0020, 0x00D0, 0x0200, 0x0E00, 0x1300, 0x1B00, 0x1930, 0x1150,
+ 0x0BF0, 0x07E0, 0x0AD0, 0x06F0, 0x07F0, 0x0EF0, 0x04F0, 0x04F0,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ },
+ .fullsocthr = 0x5500,
+ .iavgempty = 0x170B,
+};
+
+constexpr inline const CustomParameters CustomParameters2M = {
+ .relaxcfg = 0x203B,
+ .rcomp0 = 0x0049,
+ .tempco = 0x222A,
+ .ichgterm = 0x0333,
+ .tgain = 0xE1F6,
+ .toff = 0x2BF2,
+ .vempty = 0xA05F,
+ .qresidual00 = 0x4F00,
+ .qresidual10 = 0x2680,
+ .qresidual20 = 0x1205,
+ .qresidual30 = 0x0C87,
+ .fullcap = 0x1C68,
+ .vffullcap = 0x1C68,
+ .modeltbl = {
+ 0x8E40, 0xB570, 0xB8F0, 0xBB00, 0xBC20, 0xBCC0, 0xBE30, 0xBFE0,
+ 0xC200, 0xC400, 0xC720, 0xCB50, 0xCF00, 0xD100, 0xD480, 0xD5C0,
+ 0x00C0, 0x0C00, 0x0A10, 0x1800, 0x2C00, 0x1C10, 0x12D0, 0x09F0,
+ 0x0AF0, 0x0850, 0x09F0, 0x06F0, 0x06B0, 0x07E0, 0x01D0, 0x01D0,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+ },
+ .fullsocthr = 0x5500,
+ .iavgempty = 0x16B9,
+};
+
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_driver.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_driver.cpp
new file mode 100644
index 0000000..424c65b
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_driver.cpp
@@ -0,0 +1,744 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include
+#include "powctl_max17050_driver.hpp"
+
+#if defined(ATMOSPHERE_ARCH_ARM64)
+#include
+#endif
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ namespace max17050 {
+
+ constexpr inline u8 Status = 0x00;
+ constexpr inline u8 VAlrtThreshold = 0x01;
+ constexpr inline u8 TAlrtThreshold = 0x02;
+ constexpr inline u8 SocAlrtThreshold = 0x03;
+ constexpr inline u8 AtRate = 0x04;
+ constexpr inline u8 RemCapRep = 0x05;
+ constexpr inline u8 SocRep = 0x06;
+ constexpr inline u8 Age = 0x07;
+ constexpr inline u8 Temperature = 0x08;
+ constexpr inline u8 VCell = 0x09;
+ constexpr inline u8 Current = 0x0A;
+ constexpr inline u8 AverageCurrent = 0x0B;
+
+ constexpr inline u8 SocMix = 0x0D;
+ constexpr inline u8 SocAv = 0x0E;
+ constexpr inline u8 RemCapMix = 0x0F;
+ constexpr inline u8 FullCap = 0x10;
+ constexpr inline u8 Tte = 0x11;
+ constexpr inline u8 QResidual00 = 0x12;
+ constexpr inline u8 FullSocThr = 0x13;
+
+
+ constexpr inline u8 AverageTemp = 0x16;
+ constexpr inline u8 Cycles = 0x17;
+ constexpr inline u8 DesignCap = 0x18;
+ constexpr inline u8 AverageVCell = 0x19;
+ constexpr inline u8 MaxMinTemp = 0x1A;
+ constexpr inline u8 MaxMinVoltage = 0x1B;
+ constexpr inline u8 MaxMinCurrent = 0x1C;
+ constexpr inline u8 Config = 0x1D;
+ constexpr inline u8 IChgTerm = 0x1E;
+ constexpr inline u8 RemCapAv = 0x1F;
+
+ constexpr inline u8 Version = 0x21;
+ constexpr inline u8 QResidual10 = 0x22;
+ constexpr inline u8 FullCapNom = 0x23;
+ constexpr inline u8 TempNom = 0x24;
+ constexpr inline u8 TempLim = 0x25;
+
+ constexpr inline u8 Ain = 0x27;
+ constexpr inline u8 LearnCfg = 0x28;
+ constexpr inline u8 FilterCfg = 0x29;
+ constexpr inline u8 RelaxCfg = 0x2A;
+ constexpr inline u8 MiscCfg = 0x2B;
+ constexpr inline u8 TGain = 0x2C;
+ constexpr inline u8 TOff = 0x2D;
+ constexpr inline u8 CGain = 0x2E;
+ constexpr inline u8 COff = 0x2F;
+
+
+ constexpr inline u8 QResidual20 = 0x32;
+
+
+ constexpr inline u8 FullCap0 = 0x35;
+ constexpr inline u8 IAvgEmpty = 0x36;
+ constexpr inline u8 FCtc = 0x37;
+ constexpr inline u8 RComp0 = 0x38;
+ constexpr inline u8 TempCo = 0x39;
+ constexpr inline u8 VEmpty = 0x3A;
+
+
+ constexpr inline u8 FStat = 0x3D;
+ constexpr inline u8 Timer = 0x3E;
+ constexpr inline u8 ShdnTimer = 0x3F;
+
+
+ constexpr inline u8 QResidual30 = 0x42;
+
+
+ constexpr inline u8 DQAcc = 0x45;
+ constexpr inline u8 DPAcc = 0x46;
+
+ constexpr inline u8 SocVf0 = 0x48;
+
+ constexpr inline u8 Qh0 = 0x4C;
+ constexpr inline u8 Qh = 0x4D;
+
+ constexpr inline u8 SocVfAccess = 0x60;
+
+ constexpr inline u8 ModelAccess0 = 0x62;
+ constexpr inline u8 ModelAccess1 = 0x63;
+
+ constexpr inline u8 ModelChrTblStart = 0x80;
+ constexpr inline u8 ModelChrTblEnd = 0xB0;
+
+
+ constexpr inline u8 VFocV = 0xFB;
+ constexpr inline u8 SocVf = 0xFF;
+
+ constexpr inline size_t ModelChrTblSize = ModelChrTblEnd - ModelChrTblStart;
+
+ namespace {
+
+ struct CustomParameters {
+ u16 relaxcfg;
+ u16 rcomp0;
+ u16 tempco;
+ u16 ichgterm;
+ u16 tgain;
+ u16 toff;
+ u16 vempty;
+ u16 qresidual00;
+ u16 qresidual10;
+ u16 qresidual20;
+ u16 qresidual30;
+ u16 fullcap;
+ u16 vffullcap;
+ u16 modeltbl[ModelChrTblSize];
+ u16 fullsocthr;
+ u16 iavgempty;
+ };
+
+ #include "powctl_max17050_custom_parameters.inc"
+
+ const CustomParameters &GetCustomParameters(const char *battery_vendor, u8 battery_version) {
+ if (battery_version == 2) {
+ if (battery_vendor[7] == 'M') {
+ return CustomParameters2M;
+ } else if (battery_vendor[7] == 'R') {
+ return CustomParameters2R;
+ } else /* if (battery_vendor[7] == 'A') */ {
+ return CustomParameters2A;
+ }
+ } else if (battery_version == 1) {
+ return CustomParameters1;
+ } else /* if (battery_version == 0) */ {
+ if (battery_vendor[7] == 'M') {
+ return CustomParameters0M;
+ } else if (battery_vendor[7] == 'R') {
+ return CustomParameters0R;
+ } else /* if (battery_vendor[7] == 'A') */ {
+ return CustomParameters0A;
+ }
+ }
+ }
+
+ }
+
+ }
+
+ namespace {
+
+ ALWAYS_INLINE Result ReadWriteRegister(const i2c::I2cSession &session, u8 address, u16 mask, u16 value) {
+ /* Read the current value. */
+ u16 cur_val;
+ R_TRY(i2c::ReadSingleRegister(session, address, std::addressof(cur_val)));
+
+ /* Update the value. */
+ const u16 new_val = (cur_val & ~mask) | (value & mask);
+ R_TRY(i2c::WriteSingleRegister(session, address, new_val));
+
+ return ResultSuccess();
+ }
+
+ ALWAYS_INLINE Result ReadRegister(const i2c::I2cSession &session, u8 address, u16 *out) {
+ return i2c::ReadSingleRegister(session, address, out);
+ }
+
+ ALWAYS_INLINE Result WriteRegister(const i2c::I2cSession &session, u8 address, u16 val) {
+ return i2c::WriteSingleRegister(session, address, val);
+ }
+
+ ALWAYS_INLINE bool WriteValidateRegister(const i2c::I2cSession &session, u8 address, u16 val) {
+ /* Write the value. */
+ R_ABORT_UNLESS(WriteRegister(session, address, val));
+
+ /* Give it time to take. */
+ os::SleepThread(TimeSpan::FromMilliSeconds(3));
+
+ /* Read it back. */
+ u16 new_val;
+ R_ABORT_UNLESS(ReadRegister(session, address, std::addressof(new_val)));
+
+ return new_val == val;
+ }
+
+ ALWAYS_INLINE Result ReadWriteValidateRegister(const i2c::I2cSession &session, u8 address, u16 mask, u16 value) {
+ /* Read the current value. */
+ u16 cur_val;
+ R_TRY(i2c::ReadSingleRegister(session, address, std::addressof(cur_val)));
+
+ /* Update the value. */
+ const u16 new_val = (cur_val & ~mask) | (value & mask);
+ while (!WriteValidateRegister(session, address, new_val)) { /* ... */ }
+
+ return ResultSuccess();
+ }
+
+ double CoerceToDouble(u64 value) {
+ static_assert(sizeof(value) == sizeof(double));
+
+ double d;
+ __builtin_memcpy(std::addressof(d), std::addressof(value), sizeof(d));
+ return d;
+ }
+
+ double ExponentiateTwoToPower(s16 exponent, double scale) {
+ if (exponent >= 1024) {
+ exponent = exponent - 1023;
+ scale = scale * 8.98846567e307;
+ if (exponent >= 1024) {
+ exponent = std::min(exponent, 2046) - 1023;
+ scale = scale * 8.98846567e307;
+ }
+ } else if (exponent <= -1023) {
+ exponent = exponent + 969;
+ scale = scale * 2.00416836e-292;
+ if (exponent <= -1023) {
+ exponent = std::max(exponent, -1991) + 969;
+ scale = scale * 2.00416836e-292;
+ }
+ }
+ return scale * CoerceToDouble(static_cast(exponent + 1023) << 52);
+ }
+
+ }
+
+ Result Max17050Driver::InitializeSession(const char *battery_vendor, u8 battery_version) {
+ /* Get the custom parameters. */
+ const auto ¶ms = max17050::GetCustomParameters(battery_vendor, battery_version);
+
+ /* We only want to write the parameters on power on reset. */
+ R_SUCCEED_IF(!this->IsPowerOnReset());
+
+ /* Set that we need to restore parameters. */
+ R_TRY(this->SetNeedToRestoreParameters(true));
+
+ /* Wait for our configuration to take. */
+ os::SleepThread(TimeSpan::FromMilliSeconds(500));
+
+ /* Write initial config. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::Config, 0x7210));
+
+ /* Write initial filter config. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::FilterCfg, 0x8784));
+
+ /* Write relax config. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::RelaxCfg, params.relaxcfg));
+
+ /* Write initial learn config. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::LearnCfg, 0x2603));
+
+ /* Write fullsocthr. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::FullSocThr, params.fullsocthr));
+
+ /* Write iavgempty. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::IAvgEmpty, params.iavgempty));
+
+ /* Unlock model table, write model table. */
+ do {
+ R_TRY(this->UnlockModelTable());
+ R_TRY(this->SetModelTable(params.modeltbl));
+ } while (!this->IsModelTableSet(params.modeltbl));
+
+ /* Lock the model table, trying up to ten times. */
+ {
+ size_t i = 0;
+ while (true) {
+ ++i;
+
+ R_TRY(this->LockModelTable());
+
+ if (this->IsModelTableLocked()) {
+ break;
+ }
+
+ R_SUCCEED_IF(i >= 10);
+ }
+ }
+
+ /* Write and validate rcomp0 */
+ while (!WriteValidateRegister(this->i2c_session, max17050::RComp0, params.rcomp0)) { /* ... */ }
+
+ /* Write and validate tempco */
+ while (!WriteValidateRegister(this->i2c_session, max17050::TempCo, params.tempco)) { /* ... */ }
+
+ /* Write ichgterm. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::IChgTerm, params.ichgterm));
+
+ /* Write tgain. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::TGain, params.tgain));
+
+ /* Write toff. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::TOff, params.toff));
+
+ /* Write and validate vempty. */
+ while (!WriteValidateRegister(this->i2c_session, max17050::VEmpty, params.vempty)) { /* ... */ }
+
+ /* Write and validate qresidual. */
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual00, params.qresidual00)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual10, params.qresidual10)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual20, params.qresidual20)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual30, params.qresidual30)) { /* ... */ }
+
+ /* Write capacity parameters. */
+ while (!WriteValidateRegister(this->i2c_session, max17050::FullCap, params.fullcap)) { /* ... */ }
+ R_TRY(WriteRegister(this->i2c_session, max17050::DesignCap, params.vffullcap));
+ while (!WriteValidateRegister(this->i2c_session, max17050::FullCapNom, params.vffullcap)) { /* ... */ }
+
+ /* Give some time for configuration to take. */
+ os::SleepThread(TimeSpan::FromMilliSeconds(350));
+
+ /* Write vfsoc to vfsoc0, qh, to qh0. */
+ u16 vfsoc, qh;
+ {
+ R_TRY(ReadRegister(this->i2c_session, max17050::SocVf, std::addressof(vfsoc)));
+ R_TRY(this->UnlockVfSoc());
+ while (!WriteValidateRegister(this->i2c_session, max17050::SocVf0, vfsoc)) { /* ... */ }
+ R_TRY(ReadRegister(this->i2c_session, max17050::Qh, std::addressof(qh)));
+ R_TRY(WriteRegister(this->i2c_session, max17050::Qh0, qh));
+ R_TRY(this->LockVfSoc());
+ }
+
+ /* Reset cycles. */
+ while (!WriteValidateRegister(this->i2c_session, max17050::Cycles, 0x0060)) { /* ... */ }
+
+ /* Load new capacity parameters. */
+ const u16 remcap = static_cast((vfsoc * params.vffullcap) / 0x6400);
+ const u16 repcap = static_cast(remcap * (params.fullcap / params.vffullcap));
+ const u16 dpacc = 0x0C80;
+ const u16 dqacc = params.vffullcap / 0x10;
+ while (!WriteValidateRegister(this->i2c_session, max17050::RemCapMix, remcap)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::RemCapRep, repcap)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::DPAcc, dpacc)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::DQAcc, dqacc)) { /* ... */ }
+
+ /* Write capacity parameters. */
+ while (!WriteValidateRegister(this->i2c_session, max17050::FullCap, params.fullcap)) { /* ... */ }
+ R_TRY(WriteRegister(this->i2c_session, max17050::DesignCap, params.vffullcap));
+ while (!WriteValidateRegister(this->i2c_session, max17050::FullCapNom, params.vffullcap)) { /* ... */ }
+
+ /* Write soc rep. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::SocRep, vfsoc));
+
+ /* Clear power on reset. */
+ R_TRY(ReadWriteValidateRegister(this->i2c_session, max17050::Status, 0x0002, 0x0000));
+
+ /* Set cgain. */
+ R_TRY(WriteRegister(this->i2c_session, max17050::CGain, 0x7FFF));
+
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::SetMaximumShutdownTimerThreshold() {
+ return WriteRegister(this->i2c_session, max17050::ShdnTimer, 0xE000);
+ }
+
+ bool Max17050Driver::IsPowerOnReset() {
+ /* Get the register. */
+ u16 val;
+ R_ABORT_UNLESS(ReadRegister(this->i2c_session, max17050::Status, std::addressof(val)));
+
+ /* Extract the value. */
+ return (val & 0x0002) != 0;
+ }
+
+ Result Max17050Driver::LockVfSoc() {
+ return WriteRegister(this->i2c_session, max17050::SocVfAccess, 0x0000);
+ }
+
+ Result Max17050Driver::UnlockVfSoc() {
+ return WriteRegister(this->i2c_session, max17050::SocVfAccess, 0x0080);
+ }
+
+ Result Max17050Driver::LockModelTable() {
+ R_TRY(WriteRegister(this->i2c_session, max17050::ModelAccess0, 0x0000));
+ R_TRY(WriteRegister(this->i2c_session, max17050::ModelAccess1, 0x0000));
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::UnlockModelTable() {
+ R_TRY(WriteRegister(this->i2c_session, max17050::ModelAccess0, 0x0059));
+ R_TRY(WriteRegister(this->i2c_session, max17050::ModelAccess1, 0x00C4));
+ return ResultSuccess();
+ }
+
+ bool Max17050Driver::IsModelTableLocked() {
+ for (size_t i = 0; i < max17050::ModelChrTblSize; ++i) {
+ u16 val;
+ R_ABORT_UNLESS(ReadRegister(this->i2c_session, max17050::ModelChrTblStart + i, std::addressof(val)));
+
+ if (val != 0) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ Result Max17050Driver::SetModelTable(const u16 *model_table) {
+ for (size_t i = 0; i < max17050::ModelChrTblSize; ++i) {
+ R_TRY(WriteRegister(this->i2c_session, max17050::ModelChrTblStart + i, model_table[i]));
+ }
+
+ return ResultSuccess();
+ }
+
+ bool Max17050Driver::IsModelTableSet(const u16 *model_table) {
+ for (size_t i = 0; i < max17050::ModelChrTblSize; ++i) {
+ u16 val;
+ R_ABORT_UNLESS(ReadRegister(this->i2c_session, max17050::ModelChrTblStart + i, std::addressof(val)));
+
+ if (val != model_table[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ Result Max17050Driver::ReadInternalState() {
+ R_TRY(ReadRegister(this->i2c_session, max17050::RComp0, std::addressof(this->internal_state.rcomp0)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::TempCo, std::addressof(this->internal_state.tempco)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::FullCap, std::addressof(this->internal_state.fullcap)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::Cycles, std::addressof(this->internal_state.cycles)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::FullCapNom, std::addressof(this->internal_state.fullcapnom)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::IAvgEmpty, std::addressof(this->internal_state.iavgempty)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::QResidual00, std::addressof(this->internal_state.qresidual00)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::QResidual10, std::addressof(this->internal_state.qresidual10)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::QResidual20, std::addressof(this->internal_state.qresidual20)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::QResidual30, std::addressof(this->internal_state.qresidual30)));
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::WriteInternalState() {
+ while (!WriteValidateRegister(this->i2c_session, max17050::RComp0, this->internal_state.rcomp0)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::TempCo, this->internal_state.tempco)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::FullCapNom, this->internal_state.fullcapnom)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::IAvgEmpty, this->internal_state.iavgempty)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual00, this->internal_state.qresidual00)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual10, this->internal_state.qresidual10)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual20, this->internal_state.qresidual20)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::QResidual30, this->internal_state.qresidual30)) { /* ... */ }
+
+ os::SleepThread(TimeSpan::FromMilliSeconds(350));
+
+ u16 fullcap0, socmix;
+ R_TRY(ReadRegister(this->i2c_session, max17050::FullCap0, std::addressof(fullcap0)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::SocMix, std::addressof(socmix)));
+
+ while (!WriteValidateRegister(this->i2c_session, max17050::RemCapMix, static_cast((fullcap0 * socmix) / 0x6400))) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::FullCap, this->internal_state.fullcap)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::DPAcc, 0x0C80)) { /* ... */ }
+ while (!WriteValidateRegister(this->i2c_session, max17050::DQAcc, this->internal_state.fullcapnom / 0x10)) { /* ... */ }
+
+ os::SleepThread(TimeSpan::FromMilliSeconds(350));
+
+ while (!WriteValidateRegister(this->i2c_session, max17050::Cycles, this->internal_state.cycles)) { /* ... */ }
+ if (this->internal_state.cycles >= 0x100) {
+ while (!WriteValidateRegister(this->i2c_session, max17050::LearnCfg, 0x2673)) { /* ... */ }
+ }
+
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetSocRep(double *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::SocRep, std::addressof(val)));
+
+ /* Set output. */
+ *out = static_cast(val) * 0.00390625;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetSocVf(double *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::SocVf, std::addressof(val)));
+
+ /* Set output. */
+ *out = static_cast(val) * 0.00390625;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetFullCapacity(double *out, double sense_resistor) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+ AMS_ABORT_UNLESS(sense_resistor > 0.0);
+
+ /* Read the values. */
+ u16 cgain, fullcap;
+ R_TRY(ReadRegister(this->i2c_session, max17050::CGain, std::addressof(cgain)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::FullCap, std::addressof(fullcap)));
+
+ /* Set output. */
+ *out = ((static_cast(fullcap) * 0.005) / sense_resistor) / (static_cast(cgain) * 0.0000610351562);
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetRemainingCapacity(double *out, double sense_resistor) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+ AMS_ABORT_UNLESS(sense_resistor > 0.0);
+
+ /* Read the values. */
+ u16 cgain, remcap;
+ R_TRY(ReadRegister(this->i2c_session, max17050::CGain, std::addressof(cgain)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::RemCapRep, std::addressof(remcap)));
+
+ /* Set output. */
+ *out = ((static_cast(remcap) * 0.005) / sense_resistor) / (static_cast(cgain) * 0.0000610351562);
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::SetPercentageMinimumAlertThreshold(int percentage) {
+ return ReadWriteRegister(this->i2c_session, max17050::SocAlrtThreshold, 0x00FF, static_cast(percentage));
+ }
+
+ Result Max17050Driver::SetPercentageMaximumAlertThreshold(int percentage) {
+ return ReadWriteRegister(this->i2c_session, max17050::SocAlrtThreshold, 0xFF00, static_cast(static_cast(percentage)) << 8);
+ }
+
+ Result Max17050Driver::SetPercentageFullThreshold(double percentage) {
+ #if defined(ATMOSPHERE_ARCH_ARM64)
+ const u16 val = vcvtd_n_s64_f64(percentage, BITSIZEOF(u8));
+ #else
+ #error "Unknown architecture for floating point -> fixed point"
+ #endif
+
+ return WriteRegister(this->i2c_session, max17050::FullSocThr, val);
+ }
+
+ Result Max17050Driver::GetAverageCurrent(double *out, double sense_resistor) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+ AMS_ABORT_UNLESS(sense_resistor > 0.0);
+
+ /* Read the values. */
+ u16 cgain, coff, avg_current;
+ R_TRY(ReadRegister(this->i2c_session, max17050::CGain, std::addressof(cgain)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::COff, std::addressof(coff)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::AverageCurrent, std::addressof(avg_current)));
+
+ /* Set output. */
+ *out = (((static_cast(avg_current) - (static_cast(coff) + static_cast(coff))) / (static_cast(cgain) * 0.0000610351562)) * 1.5625) / (sense_resistor * 1000.0);
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetCurrent(double *out, double sense_resistor) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+ AMS_ABORT_UNLESS(sense_resistor > 0.0);
+
+ /* Read the values. */
+ u16 cgain, coff, current;
+ R_TRY(ReadRegister(this->i2c_session, max17050::CGain, std::addressof(cgain)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::COff, std::addressof(coff)));
+ R_TRY(ReadRegister(this->i2c_session, max17050::Current, std::addressof(current)));
+
+ /* Set output. */
+ *out = (((static_cast(current) - (static_cast(coff) + static_cast(coff))) / (static_cast(cgain) * 0.0000610351562)) * 1.5625) / (sense_resistor * 1000.0);
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetNeedToRestoreParameters(bool *out) {
+ /* Get the register. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::MiscCfg, std::addressof(val)));
+
+ /* Extract the value. */
+ *out = (val & 0x8000) != 0;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::SetNeedToRestoreParameters(bool en) {
+ return ReadWriteRegister(this->i2c_session, max17050::MiscCfg, 0x8000, en ? 0x8000 : 0);
+ }
+
+ Result Max17050Driver::IsI2cShutdownEnabled(bool *out) {
+ /* Get the register. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::Config, std::addressof(val)));
+
+ /* Extract the value. */
+ *out = (val & 0x0040) != 0;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::SetI2cShutdownEnabled(bool en) {
+ return ReadWriteRegister(this->i2c_session, max17050::Config, 0x0040, en ? 0x0040 : 0);
+ }
+
+ Result Max17050Driver::GetStatus(u16 *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ return ReadRegister(this->i2c_session, max17050::Status, out);
+ }
+
+ Result Max17050Driver::GetCycles(u16 *out) {
+ /* Get the register. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::Cycles, std::addressof(val)));
+
+ /* Extract the value. */
+ *out = std::max(val, 0x60) - 0x60;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::ResetCycles() {
+ return WriteRegister(this->i2c_session, max17050::Cycles, 0x0060);
+ }
+
+ Result Max17050Driver::GetAge(double *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::Age, std::addressof(val)));
+
+ /* Set output. */
+ *out = static_cast(val) * 0.00390625;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetTemperature(double *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::Temperature, std::addressof(val)));
+
+ /* Set output. */
+ *out = static_cast(val) * 0.00390625;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetMaximumTemperature(u8 *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::MaxMinTemp, std::addressof(val)));
+
+ /* Set output. */
+ *out = static_cast(val >> 8);
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::SetTemperatureMinimumAlertThreshold(int c) {
+ return ReadWriteRegister(this->i2c_session, max17050::TAlrtThreshold, 0x00FF, static_cast(c));
+ }
+
+ Result Max17050Driver::SetTemperatureMaximumAlertThreshold(int c) {
+ return ReadWriteRegister(this->i2c_session, max17050::TAlrtThreshold, 0xFF00, static_cast(static_cast(c)) << 8);
+ }
+
+ Result Max17050Driver::GetVCell(int *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::VCell, std::addressof(val)));
+
+ /* Set output. */
+ *out = (625 * (val >> 3)) / 1000;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetAverageVCell(int *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::AverageVCell, std::addressof(val)));
+
+ /* Set output. */
+ *out = (625 * (val >> 3)) / 1000;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetAverageVCellTime(double *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::FilterCfg, std::addressof(val)));
+
+ /* Set output. */
+ *out = 175.8 * ExponentiateTwoToPower(6 + ((val >> 4) & 7), 1.0);
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::GetOpenCircuitVoltage(int *out) {
+ /* Validate parameters. */
+ AMS_ABORT_UNLESS(out != nullptr);
+
+ /* Read the value. */
+ u16 val;
+ R_TRY(ReadRegister(this->i2c_session, max17050::VFocV, std::addressof(val)));
+
+ /* Set output. */
+ *out = (1250 * (val >> 4)) / 1000;
+ return ResultSuccess();
+ }
+
+ Result Max17050Driver::SetVoltageMinimumAlertThreshold(int mv) {
+ return ReadWriteRegister(this->i2c_session, max17050::VAlrtThreshold, 0x00FF, static_cast(util::DivideUp(mv, 20)));
+ }
+
+ Result Max17050Driver::SetVoltageMaximumAlertThreshold(int mv) {
+ return ReadWriteRegister(this->i2c_session, max17050::VAlrtThreshold, 0xFF00, static_cast(static_cast(mv / 20)) << 8);
+ }
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_driver.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_driver.hpp
new file mode 100644
index 0000000..7d01e30
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_max17050_driver.hpp
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::powctl::impl::board::nintendo_nx {
+
+ namespace max17050 {
+
+ struct InternalState {
+ u16 rcomp0;
+ u16 tempco;
+ u16 fullcap;
+ u16 cycles;
+ u16 fullcapnom;
+ u16 iavgempty;
+ u16 qresidual00;
+ u16 qresidual10;
+ u16 qresidual20;
+ u16 qresidual30;
+ };
+
+ }
+
+ class Max17050Driver {
+ private:
+ os::SdkMutex mutex;
+ int init_count;
+ i2c::I2cSession i2c_session;
+ max17050::InternalState internal_state;
+ private:
+ Result InitializeSession(const char *battery_vendor, u8 battery_version);
+ Result SetMaximumShutdownTimerThreshold();
+
+ bool IsPowerOnReset();
+ Result LockVfSoc();
+ Result UnlockVfSoc();
+ Result LockModelTable();
+ Result UnlockModelTable();
+ bool IsModelTableLocked();
+ Result SetModelTable(const u16 *model_table);
+ bool IsModelTableSet(const u16 *model_table);
+ public:
+ Max17050Driver() : mutex(), init_count(0), i2c_session(), internal_state() {
+ /* ... */
+ }
+
+ void Initialize(const char *battery_vendor, u8 battery_version) {
+ std::scoped_lock lk(this->mutex);
+ if ((this->init_count++) == 0) {
+ /* Initialize i2c library. */
+ i2c::InitializeEmpty();
+
+ /* Open session. */
+ R_ABORT_UNLESS(i2c::OpenSession(std::addressof(this->i2c_session), i2c::DeviceCode_Max17050));
+
+ /* Initialize session. */
+ R_ABORT_UNLESS(this->InitializeSession(battery_vendor, battery_version));
+
+ /* Set shutdown timer threshold to the maximum value. */
+ R_ABORT_UNLESS(this->SetMaximumShutdownTimerThreshold());
+ }
+ }
+
+ void Finalize() {
+ std::scoped_lock lk(this->mutex);
+ if ((--this->init_count) == 0) {
+ /* Close session. */
+ i2c::CloseSession(this->i2c_session);
+
+ /* Finalize i2c library. */
+ i2c::Finalize();
+ }
+ }
+
+ Result ReadInternalState();
+ Result WriteInternalState();
+
+ void GetInternalState(max17050::InternalState *dst) {
+ *dst = this->internal_state;
+ }
+
+ void SetInternalState(const max17050::InternalState &src) {
+ this->internal_state = src;
+ }
+
+ Result GetSocRep(double *out);
+ Result GetSocVf(double *out);
+
+ Result GetFullCapacity(double *out, double sense_resistor);
+ Result GetRemainingCapacity(double *out, double sense_resistor);
+
+ Result SetPercentageMinimumAlertThreshold(int percentage);
+ Result SetPercentageMaximumAlertThreshold(int percentage);
+
+ Result SetPercentageFullThreshold(double percentage);
+
+ Result GetAverageCurrent(double *out, double sense_resistor);
+ Result GetCurrent(double *out, double sense_resistor);
+
+ Result GetNeedToRestoreParameters(bool *out);
+ Result SetNeedToRestoreParameters(bool en);
+
+ Result IsI2cShutdownEnabled(bool *out);
+ Result SetI2cShutdownEnabled(bool en);
+
+ Result GetStatus(u16 *out);
+
+ Result GetCycles(u16 *out);
+ Result ResetCycles();
+
+ Result GetAge(double *out);
+
+ Result GetTemperature(double *out);
+
+ Result GetMaximumTemperature(u8 *out);
+
+ Result SetTemperatureMinimumAlertThreshold(int c);
+ Result SetTemperatureMaximumAlertThreshold(int c);
+
+ Result GetVCell(int *out);
+ Result GetAverageVCell(int *out);
+ Result GetAverageVCellTime(double *out);
+
+ Result GetOpenCircuitVoltage(int *out);
+
+ Result SetVoltageMinimumAlertThreshold(int mv);
+ Result SetVoltageMaximumAlertThreshold(int mv);
+ };
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_retry_helper.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_retry_helper.hpp
new file mode 100644
index 0000000..d431099
--- /dev/null
+++ b/libraries/libstratosphere/source/powctl/impl/board/nintendo/nx/powctl_retry_helper.hpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2018-2020 Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+
+namespace ams::powctl::impl {
+
+ constexpr inline const TimeSpan PowerControlRetryTimeout = TimeSpan::FromSeconds(10);
+ constexpr inline const TimeSpan PowerControlRetryInterval = TimeSpan::FromMilliSeconds(20);
+
+ #define AMS_POWCTL_R_TRY_WITH_RETRY(__EXPR__) \
+ ({ \
+ TimeSpan __powctl_retry_current_time = 0; \
+ while (true) { \
+ const Result __powctl_retry_result = (__EXPR__); \
+ if (R_SUCCEEDED(__powctl_retry_result)) { \
+ break; \
+ } \
+ \
+ __powctl_retry_current_time += PowerControlRetryInterval; \
+ R_UNLESS(__powctl_retry_current_time < PowerControlRetryTimeout, __powctl_retry_result); \
+ \
+ os::SleepThread(PowerControlRetryInterval); \
+ } \
+ })
+
+
+}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_battery_driver.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_battery_driver.cpp
deleted file mode 100644
index f346025..0000000
--- a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_battery_driver.cpp
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "../../powctl_device_management.hpp"
-#include "powctl_retry_helper.hpp"
-#include "powctl_battery_driver.hpp"
-#include "powctl_max17050_driver.hpp"
-
-namespace ams::powctl::impl::board::nintendo_nx {
-
- namespace {
-
- constinit std::optional g_battery_device;
-
- Max17050Driver &GetMax17050Driver() {
- static Max17050Driver s_max17050_driver;
- return s_max17050_driver;
- }
-
- constexpr inline const double SenseResistorValue = 0.005;
-
- }
-
- BatteryDevice::BatteryDevice(bool ev) : use_event_handler(ev), event_handler() {
- if (this->use_event_handler) {
- /* Create the system event. */
- os::CreateSystemEvent(std::addressof(this->system_event), os::EventClearMode_ManualClear, true);
-
- /* Create the handler. */
- this->event_handler.emplace(this);
-
- /* Register the event handler. */
- powctl::impl::RegisterInterruptHandler(std::addressof(*this->event_handler));
- }
- }
-
- /* Generic API. */
- void BatteryDriver::InitializeDriver() {
- /* Initialize gpio library. */
- gpio::Initialize();
-
- /* Create battery device. */
- g_battery_device.emplace(this->IsEventHandlerEnabled());
-
- /* Initialize the Max17050Driver. */
- {
- size_t battery_vendor_size;
- char battery_vendor[0x18] = {};
- if (R_FAILED(cal::GetBatteryVendor(std::addressof(battery_vendor_size), battery_vendor, sizeof(battery_vendor)))) {
- battery_vendor[7] = 'A';
- battery_vendor_size = 0;
- }
-
- u8 battery_version = 0;
- if (R_FAILED(cal::GetBatteryVersion(std::addressof(battery_version)))) {
- battery_version = 0;
- }
-
- GetMax17050Driver().Initialize(battery_vendor, battery_version);
- }
-
- /* Register our device. */
- this->RegisterDevice(std::addressof(*g_battery_device));
-
- /* Register the charger device's code. */
- R_ABORT_UNLESS(powctl::impl::RegisterDeviceCode(powctl::DeviceCode_Max17050, std::addressof(*g_battery_device)));
-
- }
-
- void BatteryDriver::FinalizeDriver() {
- /* Unregister the charger device code. */
- powctl::impl::UnregisterDeviceCode(powctl::DeviceCode_Max17050);
-
- /* Unregister our device. */
- this->UnregisterDevice(std::addressof(*g_battery_device));
-
- /* Finalize Max17050Driver. */
- GetMax17050Driver().Finalize();
-
- /* Destroy the charger device. */
- g_battery_device = std::nullopt;
-
- /* Finalize gpio library. */
- gpio::Finalize();
- }
-
- Result BatteryDriver::GetDeviceSystemEvent(os::SystemEventType **out, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Check that we support event handlers. */
- R_UNLESS(this->IsEventHandlerEnabled(), powctl::ResultNotAvailable());
-
- *out = device->SafeCastTo().GetSystemEvent();
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetDeviceInterruptEnabled(IDevice *device, bool enable) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Set the interrupt enable. */
- device->SafeCastTo().SetInterruptEnabled(enable);
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetDeviceErrorStatus(u32 *out, IDevice *device) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result BatteryDriver::SetDeviceErrorStatus(IDevice *device, u32 status) {
- /* TODO */
- AMS_ABORT();
- }
-
- Result BatteryDriver::GetBatterySocRep(float *out_percent, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_percent != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double percent;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetSocRep(std::addressof(percent)));
-
- /* Set output. */
- *out_percent = percent;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatterySocVf(float *out_percent, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_percent != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double percent;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetSocVf(std::addressof(percent)));
-
- /* Set output. */
- *out_percent = percent;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryFullCapacity(int *out_mah, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_mah != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double mah;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetFullCapacity(std::addressof(mah), SenseResistorValue));
-
- /* Set output. */
- *out_mah = mah;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryRemainingCapacity(int *out_mah, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_mah != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double mah;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetRemainingCapacity(std::addressof(mah), SenseResistorValue));
-
- /* Set output. */
- *out_mah = mah;
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryPercentageMinimumAlertThreshold(IDevice *device, float percentage) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetPercentageMinimumAlertThreshold(percentage));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryPercentageMaximumAlertThreshold(IDevice *device, float percentage) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetPercentageMaximumAlertThreshold(percentage));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryPercentageFullThreshold(IDevice *device, float percentage) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetPercentageFullThreshold(percentage));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryAverageCurrent(int *out_ma, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_ma != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double ma;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAverageCurrent(std::addressof(ma), SenseResistorValue));
-
- /* Set output. */
- *out_ma = ma;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryCurrent(int *out_ma, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_ma != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double ma;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetCurrent(std::addressof(ma), SenseResistorValue));
-
- /* Set output. */
- *out_ma = ma;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryInternalState(void *dst, size_t *out_size, IDevice *device, size_t dst_size) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(dst != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(out_size != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(dst_size == sizeof(max17050::InternalState), powctl::ResultInvalidArgument());
- R_UNLESS(util::IsAligned(reinterpret_cast(dst), alignof(max17050::InternalState)), powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().ReadInternalState());
- GetMax17050Driver().GetInternalState(static_cast(dst));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryInternalState(IDevice *device, const void *src, size_t src_size) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(src != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(src_size == sizeof(max17050::InternalState), powctl::ResultInvalidArgument());
- R_UNLESS(util::IsAligned(reinterpret_cast(src), alignof(max17050::InternalState)), powctl::ResultInvalidArgument());
-
- GetMax17050Driver().SetInternalState(*static_cast(src));
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().WriteInternalState());
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryNeedToRestoreParameters(bool *out, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetNeedToRestoreParameters(out));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryNeedToRestoreParameters(IDevice *device, bool en) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Set the value. */
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetNeedToRestoreParameters(en));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::IsBatteryI2cShutdownEnabled(bool *out, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().IsI2cShutdownEnabled(out));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryI2cShutdownEnabled(IDevice *device, bool en) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Set the value. */
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetI2cShutdownEnabled(en));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::IsBatteryPresent(bool *out, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the battery status. */
- u16 status;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetStatus(std::addressof(status)));
-
- /* Set output. */
- *out = (status & 0x0008) == 0;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryCycles(int *out, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the battery cycles. */
- u16 cycles;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetCycles(std::addressof(cycles)));
-
- /* Set output. */
- *out = cycles;
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryCycles(IDevice *device, int cycles) {
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(cycles == 0, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().ResetCycles());
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryAge(float *out_percent, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_percent != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double percent;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAge(std::addressof(percent)));
-
- /* Set output. */
- *out_percent = percent;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryTemperature(float *out_c, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_c != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double temp;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetTemperature(std::addressof(temp)));
-
- /* Set output. */
- *out_c = temp;
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryMaximumTemperature(float *out_c, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_c != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- u8 max_temp;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetMaximumTemperature(std::addressof(max_temp)));
-
- /* Set output. */
- *out_c = static_cast(max_temp);
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryTemperatureMinimumAlertThreshold(IDevice *device, float c) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetTemperatureMinimumAlertThreshold(c));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryTemperatureMaximumAlertThreshold(IDevice *device, float c) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetTemperatureMaximumAlertThreshold(c));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryVCell(int *out_mv, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetVCell(out_mv));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryAverageVCell(int *out_mv, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAverageVCell(out_mv));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryAverageVCellTime(TimeSpan *out, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- double ms;
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetAverageVCellTime(std::addressof(ms)));
-
- /* Set output. */
- *out = TimeSpan::FromMicroSeconds(static_cast(ms * 1000.0));
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryVoltageMinimumAlertThreshold(IDevice *device, int mv) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetVoltageMinimumAlertThreshold(mv));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::GetBatteryOpenCircuitVoltage(int *out_mv, IDevice *device) {
- /* Validate arguments. */
- R_UNLESS(out_mv != nullptr, powctl::ResultInvalidArgument());
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- /* Get the value. */
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().GetOpenCircuitVoltage(out_mv));
-
- return ResultSuccess();
- }
-
- Result BatteryDriver::SetBatteryVoltageMaximumAlertThreshold(IDevice *device, int mv) {
- /* Validate arguments. */
- R_UNLESS(device != nullptr, powctl::ResultInvalidArgument());
-
- AMS_POWCTL_R_TRY_WITH_RETRY(GetMax17050Driver().SetVoltageMaximumAlertThreshold(mv));
-
- return ResultSuccess();
- }
-
-}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_battery_driver.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_battery_driver.hpp
deleted file mode 100644
index 995b7dc..0000000
--- a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_battery_driver.hpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-#include "../../powctl_i_power_control_driver.hpp"
-#include "powctl_interrupt_event_handler.hpp"
-
-namespace ams::powctl::impl::board::nintendo_nx {
-
- class BatteryDevice : public powctl::impl::IDevice {
- NON_COPYABLE(BatteryDevice);
- NON_MOVEABLE(BatteryDevice);
- AMS_DDSF_CASTABLE_TRAITS(ams::powctl::impl::board::nintendo_nx::BatteryDevice, ::ams::powctl::impl::IDevice);
- private:
- bool use_event_handler;
- std::optional event_handler;
- os::SystemEventType system_event;
- public:
- BatteryDevice(bool ev);
-
- os::SystemEventType *GetSystemEvent() { return std::addressof(this->system_event); }
-
- void SetInterruptEnabled(bool en) {
- if (this->use_event_handler) {
- this->event_handler->SetInterruptEnabled(en);
- }
- }
- };
-
- class BatteryDriver : public IPowerControlDriver {
- NON_COPYABLE(BatteryDriver);
- NON_MOVEABLE(BatteryDriver);
- AMS_DDSF_CASTABLE_TRAITS(ams::powctl::impl::board::nintendo_nx::BatteryDriver, ::ams::powctl::impl::IPowerControlDriver);
- public:
- BatteryDriver(bool ev) : IPowerControlDriver(ev) { /* ... */ }
-
- /* Generic API. */
- virtual void InitializeDriver() override;
- virtual void FinalizeDriver() override;
-
- virtual Result GetDeviceSystemEvent(os::SystemEventType **out, IDevice *device) override;
- virtual Result SetDeviceInterruptEnabled(IDevice *device, bool enable) override;
-
- virtual Result GetDeviceErrorStatus(u32 *out, IDevice *device) override;
- virtual Result SetDeviceErrorStatus(IDevice *device, u32 status) override;
-
- /* Battery API. */
- virtual Result GetBatterySocRep(float *out_percent, IDevice *device) override;
-
- virtual Result GetBatterySocVf(float *out_percent, IDevice *device) override;
-
- virtual Result GetBatteryFullCapacity(int *out_mah, IDevice *device) override;
- virtual Result GetBatteryRemainingCapacity(int *out_mah, IDevice *device) override;
-
- virtual Result SetBatteryPercentageMinimumAlertThreshold(IDevice *device, float percentage) override;
- virtual Result SetBatteryPercentageMaximumAlertThreshold(IDevice *device, float percentage) override;
- virtual Result SetBatteryPercentageFullThreshold(IDevice *device, float percentage) override;
-
- virtual Result GetBatteryAverageCurrent(int *out_ma, IDevice *device) override;
- virtual Result GetBatteryCurrent(int *out_ma, IDevice *device) override;
-
- virtual Result GetBatteryInternalState(void *dst, size_t *out_size, IDevice *device, size_t dst_size) override;
- virtual Result SetBatteryInternalState(IDevice *device, const void *src, size_t src_size) override;
-
- virtual Result GetBatteryNeedToRestoreParameters(bool *out, IDevice *device) override;
- virtual Result SetBatteryNeedToRestoreParameters(IDevice *device, bool en) override;
-
- virtual Result IsBatteryI2cShutdownEnabled(bool *out, IDevice *device) override;
- virtual Result SetBatteryI2cShutdownEnabled(IDevice *device, bool en) override;
-
- virtual Result IsBatteryPresent(bool *out, IDevice *device) override;
-
- virtual Result GetBatteryCycles(int *out, IDevice *device) override;
- virtual Result SetBatteryCycles(IDevice *device, int cycles) override;
-
- virtual Result GetBatteryAge(float *out_percent, IDevice *device) override;
-
- virtual Result GetBatteryTemperature(float *out_c, IDevice *device) override;
- virtual Result GetBatteryMaximumTemperature(float *out_c, IDevice *device) override;
-
- virtual Result SetBatteryTemperatureMinimumAlertThreshold(IDevice *device, float c) override;
- virtual Result SetBatteryTemperatureMaximumAlertThreshold(IDevice *device, float c) override;
-
- virtual Result GetBatteryVCell(int *out_mv, IDevice *device) override;
- virtual Result GetBatteryAverageVCell(int *out_mv, IDevice *device) override;
-
- virtual Result GetBatteryAverageVCellTime(TimeSpan *out, IDevice *device) override;
-
- virtual Result SetBatteryVoltageMinimumAlertThreshold(IDevice *device, int mv) override;
-
- virtual Result GetBatteryOpenCircuitVoltage(int *out_mv, IDevice *device) override;
-
- virtual Result SetBatteryVoltageMaximumAlertThreshold(IDevice *device, int mv) override;
-
- /* Unsupported Charger API. */
- virtual Result GetChargerChargeCurrentState(ChargeCurrentState *out, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerChargeCurrentState(IDevice *device, ChargeCurrentState state) override { return powctl::ResultNotSupported(); }
-
- virtual Result GetChargerFastChargeCurrentLimit(int *out_ma, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerFastChargeCurrentLimit(IDevice *device, int ma) override { return powctl::ResultNotSupported(); }
-
- virtual Result GetChargerChargeVoltageLimit(int *out_mv, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerChargeVoltageLimit(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
-
- virtual Result SetChargerChargerConfiguration(IDevice *device, ChargerConfiguration cfg) override { return powctl::ResultNotSupported(); }
-
- virtual Result IsChargerHiZEnabled(bool *out, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerHiZEnabled(IDevice *device, bool en) override { return powctl::ResultNotSupported(); }
-
- virtual Result GetChargerInputCurrentLimit(int *out_ma, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerInputCurrentLimit(IDevice *device, int ma) override { return powctl::ResultNotSupported(); }
-
- virtual Result SetChargerInputVoltageLimit(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
-
- virtual Result SetChargerBoostModeCurrentLimit(IDevice *device, int ma) override { return powctl::ResultNotSupported(); }
-
- virtual Result GetChargerChargerStatus(ChargerStatus *out, IDevice *device) override { return powctl::ResultNotSupported(); }
-
- virtual Result IsChargerWatchdogTimerEnabled(bool *out, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerWatchdogTimerEnabled(IDevice *device, bool en) override { return powctl::ResultNotSupported(); }
-
- virtual Result SetChargerWatchdogTimerTimeout(IDevice *device, TimeSpan timeout) override { return powctl::ResultNotSupported(); }
- virtual Result ResetChargerWatchdogTimer(IDevice *device) override { return powctl::ResultNotSupported(); }
-
- virtual Result GetChargerBatteryCompensation(int *out_mo, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerBatteryCompensation(IDevice *device, int mo) override { return powctl::ResultNotSupported(); }
-
- virtual Result GetChargerVoltageClamp(int *out_mv, IDevice *device) override { return powctl::ResultNotSupported(); }
- virtual Result SetChargerVoltageClamp(IDevice *device, int mv) override { return powctl::ResultNotSupported(); }
- };
-
-}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_board_impl.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_board_impl.cpp
deleted file mode 100644
index c22f7ed..0000000
--- a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_board_impl.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "../../powctl_device_management.hpp"
-#include "powctl_board_impl.hpp"
-#include "powctl_battery_driver.hpp"
-#include "powctl_charger_driver.hpp"
-
-namespace ams::powctl::impl::board::nintendo_nx {
-
- namespace {
-
- constinit std::optional g_charger_driver;
- constinit std::optional g_battery_driver;
-
- void InitializeChargerDriver(bool use_event_handlers) {
- /* Create the charger driver. */
- g_charger_driver.emplace(use_event_handlers);
-
- /* Register the driver. */
- powctl::impl::RegisterDriver(std::addressof(*g_charger_driver));
- }
-
- void InitializeBatteryDriver(bool use_event_handlers) {
- /* Create the battery driver. */
- g_battery_driver.emplace(use_event_handlers);
-
- /* Register the driver. */
- powctl::impl::RegisterDriver(std::addressof(*g_battery_driver));
- }
-
- void FinalizeChargerDriver() {
- /* Unregister the driver. */
- powctl::impl::UnregisterDriver(std::addressof(*g_charger_driver));
-
- /* Destroy the battery driver. */
- g_charger_driver = std::nullopt;
- }
-
- void FinalizeBatteryDriver() {
- /* Unregister the driver. */
- powctl::impl::UnregisterDriver(std::addressof(*g_battery_driver));
-
- /* Destroy the battery driver. */
- g_battery_driver = std::nullopt;
- }
-
- }
-
- void Initialize(bool use_event_handlers) {
- InitializeChargerDriver(use_event_handlers);
- InitializeBatteryDriver(use_event_handlers);
- }
-
- void Finalize() {
- FinalizeBatteryDriver();
- FinalizeChargerDriver();
- }
-
-}
\ No newline at end of file
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_board_impl.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_board_impl.hpp
deleted file mode 100644
index 902c5e9..0000000
--- a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_board_impl.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-#include
-
-#include "powctl_interrupt_event_handler.hpp"
-
-namespace ams::powctl::impl::board::nintendo_nx {
-
- void Initialize(bool use_event_handlers);
- void Finalize();
-
-}
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_bq24193_driver.cpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_bq24193_driver.cpp
deleted file mode 100644
index 32fa8a9..0000000
--- a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_bq24193_driver.cpp
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#include
-#include "powctl_bq24193_driver.hpp"
-
-namespace ams::powctl::impl::board::nintendo_nx {
-
- namespace bq24193 {
-
- constexpr inline u8 InputSourceControl = 0x00;
- constexpr inline u8 PowerOnConfiguration = 0x01;
- constexpr inline u8 ChargeCurrentControl = 0x02;
- constexpr inline u8 PreChargeTerminationCurrentControl = 0x03;
- constexpr inline u8 ChargeVoltageControl = 0x04;
- constexpr inline u8 ChargeTerminationTimerControl = 0x05;
- constexpr inline u8 IrCompensationThermalRegulationControl = 0x06;
- constexpr inline u8 MiscOperationControl = 0x07;
- constexpr inline u8 SystemStatus = 0x08;
- constexpr inline u8 Fault = 0x09;
- constexpr inline u8 VendorPartRevisionStatus = 0x0A;
-
- constexpr u8 EncodePreChargeCurrentLimit(int ma) {
- constexpr int Minimum = 128;
- constexpr int Maximum = 2048;
- ma = std::max(std::min(ma, Maximum), Minimum);
-
- return static_cast((static_cast(ma - Minimum) >> 7) << 4);
- }
-
- constexpr u8 EncodeTerminationCurrentLimit(int ma) {
- constexpr int Minimum = 128;
- constexpr int Maximum = 2048;
- ma = std::max(std::min(ma, Maximum), Minimum);
-
- return static_cast((static_cast(ma - Minimum) >> 7) << 0);
- }
-
- constexpr u8 EncodeMinimumSystemVoltageLimit(int mv) {
- constexpr int Minimum = 3000;
- constexpr int Maximum = 3700;
- mv = std::max(std::min(mv, Maximum), Minimum);
-
- return static_cast(((mv - Minimum) / 100) << 1);
- }
-
- constexpr u8 EncodeFastChargeCurrentLimit(int ma) {
- constexpr int Minimum = 512;
- constexpr int Maximum = 4544;
- ma = std::max(std::min(ma, Maximum), Minimum);
-
- return static_cast((static_cast(ma - Minimum) >> 6) << 2);
- }
-
- constexpr int DecodeFastChargeCurrentLimit(u8 reg) {
- constexpr int Minimum = 512;
-
- return Minimum + (static_cast(reg & 0xFC) << 4);
- }
-
- static_assert(DecodeFastChargeCurrentLimit(EncodeFastChargeCurrentLimit(512)) == 512);
- static_assert(DecodeFastChargeCurrentLimit(EncodeFastChargeCurrentLimit(4544)) == 4544);
- static_assert(DecodeFastChargeCurrentLimit(EncodeFastChargeCurrentLimit(576)) == 576);
-
- constexpr u8 EncodeChargeVoltageLimit(int mv) {
- constexpr int Minimum = 3504;
- constexpr int Maximum = 4400;
- mv = std::max(std::min(mv, Maximum), Minimum);
-
- return static_cast((static_cast(mv - Minimum) >> 4) << 2);
- }
-
- constexpr int DecodeChargeVoltageLimit(u8 reg) {
- constexpr int Minimum = 3504;
-
- return Minimum + (static_cast(reg & 0xFC) << 2);
- }
-
- static_assert(DecodeChargeVoltageLimit(EncodeChargeVoltageLimit(3504)) == 3504);
- static_assert(DecodeChargeVoltageLimit(EncodeChargeVoltageLimit(4400)) == 4400);
- static_assert(DecodeChargeVoltageLimit(EncodeChargeVoltageLimit(3520)) == 3520);
-
- constexpr u8 EncodeChargerConfiguration(bq24193::ChargerConfiguration cfg) {
- switch (cfg) {
- case ChargerConfiguration_ChargeDisable: return 0x00;
- case ChargerConfiguration_ChargeBattery: return 0x10;
- case ChargerConfiguration_Otg: return 0x20;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
- }
-
- constexpr u8 EncodeWatchdogTimerSetting(int seconds) {
- if (seconds == 0) {
- return 0x00;
- } else if (seconds < 80) {
- return 0x10;
- } else if (seconds < 160) {
- return 0x20;
- } else {
- return 0x30;
- }
- }
-
- constexpr u8 EncodeBatteryCompensation(int mo) {
- constexpr int Minimum = 0;
- constexpr int Maximum = 70;
- mo = std::max(std::min(mo, Maximum), Minimum);
-
- return static_cast((static_cast(mo - Minimum) / 10) << 5);
- }
-
- constexpr int DecodeBatteryCompensation(u8 reg) {
- constexpr int Minimum = 0;
-
- return Minimum + (static_cast(reg & 0xE0) >> 5) * 10;
- }
-
- static_assert(DecodeBatteryCompensation(EncodeBatteryCompensation(0)) == 0);
- static_assert(DecodeBatteryCompensation(EncodeBatteryCompensation(70)) == 70);
- static_assert(DecodeBatteryCompensation(EncodeBatteryCompensation(30)) == 30);
-
- constexpr u8 EncodeVoltageClamp(int mv) {
- constexpr int Minimum = 0;
- constexpr int Maximum = 112;
- mv = std::max(std::min(mv, Maximum), Minimum);
-
- return static_cast((static_cast(mv - Minimum) >> 4) << 2);
- }
-
- constexpr int DecodeVoltageClamp(u8 reg) {
- constexpr int Minimum = 0;
-
- return Minimum + (static_cast(reg & 0x1C) << 2);
- }
-
- static_assert(DecodeVoltageClamp(EncodeVoltageClamp(0)) == 0);
- static_assert(DecodeVoltageClamp(EncodeVoltageClamp(112)) == 112);
- static_assert(DecodeVoltageClamp(EncodeVoltageClamp(64)) == 64);
-
- constexpr u8 EncodeInputCurrentLimit(int ma) {
- if (ma < 150) {
- return 0;
- } else if (ma < 500) {
- return 1;
- } else if (ma < 900) {
- return 2;
- } else if (ma < 1200) {
- return 3;
- } else if (ma < 1500) {
- return 4;
- } else if (ma < 2000) {
- return 5;
- } else if (ma < 3000) {
- return 6;
- } else{
- return 7;
- }
- }
-
- constexpr int DecodeInputCurrentLimit(u8 reg) {
- switch (reg & 0x07) {
- case 0: return 100;
- case 1: return 150;
- case 2: return 500;
- case 3: return 900;
- case 4: return 1200;
- case 5: return 1500;
- case 6: return 2000;
- case 7: return 3000;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
- }
-
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(100)) == 100);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(150)) == 150);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(500)) == 500);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(900)) == 900);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(1200)) == 1200);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(1500)) == 1500);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(2000)) == 2000);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(3000)) == 3000);
-
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(0)) == 100);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(9999)) == 3000);
-
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(149)) == 100);
- static_assert(DecodeInputCurrentLimit(EncodeInputCurrentLimit(151)) == 150);
-
- constexpr u8 EncodeInputVoltageLimit(int mv) {
- constexpr int Minimum = 3880;
- constexpr int Maximum = 5080;
- mv = std::max(std::min(mv, Maximum), Minimum);
-
- return static_cast(((static_cast(mv - Minimum) / 80) & 0xF) << 3);
- }
-
- constexpr u8 EncodeBoostModeCurrentLimit(int ma) {
- return ma >= 1300 ? 1 : 0;
- }
-
- constexpr bq24193::ChargerStatus DecodeChargerStatus(u8 reg) {
- switch (reg & 0x30) {
- case 0x00: return bq24193::ChargerStatus_NotCharging;
- case 0x10: return bq24193::ChargerStatus_PreCharge;
- case 0x20: return bq24193::ChargerStatus_FastCharging;
- case 0x30: return bq24193::ChargerStatus_ChargeTerminationDone;
- AMS_UNREACHABLE_DEFAULT_CASE();
- }
- }
-
- }
-
- namespace {
-
- ALWAYS_INLINE Result ReadWriteRegister(const i2c::I2cSession &session, u8 address, u8 mask, u8 value) {
- /* Read the current value. */
- u8 cur_val;
- R_TRY(i2c::ReadSingleRegister(session, address, std::addressof(cur_val)));
-
- /* Update the value. */
- const u8 new_val = (cur_val & ~mask) | (value & mask);
- R_TRY(i2c::WriteSingleRegister(session, address, new_val));
-
- return ResultSuccess();
- }
-
- }
-
- Result Bq24193Driver::InitializeSession() {
- /* Set fast charge current limit. */
- R_TRY(this->SetFastChargeCurrentLimit(512));
-
- /* Disable force 20 percent charge. */
- R_TRY(this->SetForce20PercentChargeCurrent(false));
-
- /* Set pre-charge current limit. */
- R_TRY(this->SetPreChargeCurrentLimit(128));
-
- /* Set termination current limit. */
- R_TRY(this->SetTerminationCurrentLimit(128));
-
- /* Set minimum system voltage limit. */
- R_TRY(this->SetMinimumSystemVoltageLimit(3000));
-
- /* Set watchdog timer setting. */
- R_TRY(this->SetWatchdogTimerSetting(0));
-
- /* Disable charging safety timer. */
- R_TRY(this->SetChargingSafetyTimerEnabled(false));
-
- /* Reset the watchdog timer. */
- R_TRY(this->ResetWatchdogTimer());
-
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetPreChargeCurrentLimit(int ma) {
- return ReadWriteRegister(this->i2c_session, bq24193::PreChargeTerminationCurrentControl, 0xF0, bq24193::EncodePreChargeCurrentLimit(ma));
- }
-
- Result Bq24193Driver::SetTerminationCurrentLimit(int ma) {
- return ReadWriteRegister(this->i2c_session, bq24193::PreChargeTerminationCurrentControl, 0x0F, bq24193::EncodeTerminationCurrentLimit(ma));
- }
-
- Result Bq24193Driver::SetMinimumSystemVoltageLimit(int mv) {
- return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x0E, bq24193::EncodeMinimumSystemVoltageLimit(mv));
- }
-
- Result Bq24193Driver::SetChargingSafetyTimerEnabled(bool en) {
- return ReadWriteRegister(this->i2c_session, bq24193::ChargeTerminationTimerControl, 0x08, en ? 0x08 : 0x00);
- }
-
- Result Bq24193Driver::GetForce20PercentChargeCurrent(bool *out) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::ChargeCurrentControl, std::addressof(val)));
-
- /* Extract the value. */
- *out = (val & 0x01) != 0;
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetForce20PercentChargeCurrent(bool en) {
- return ReadWriteRegister(this->i2c_session, bq24193::ChargeCurrentControl, 0x01, en ? 0x01 : 0x00);
- }
-
- Result Bq24193Driver::GetFastChargeCurrentLimit(int *out_ma) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::ChargeCurrentControl, std::addressof(val)));
-
- /* Extract the value. */
- *out_ma = bq24193::DecodeFastChargeCurrentLimit(val);
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetFastChargeCurrentLimit(int ma) {
- return ReadWriteRegister(this->i2c_session, bq24193::ChargeCurrentControl, 0xFC, bq24193::EncodeFastChargeCurrentLimit(ma));
- }
-
- Result Bq24193Driver::GetChargeVoltageLimit(int *out_mv) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::ChargeVoltageControl, std::addressof(val)));
-
- /* Extract the value. */
- *out_mv = bq24193::DecodeChargeVoltageLimit(val);
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetChargeVoltageLimit(int mv) {
- return ReadWriteRegister(this->i2c_session, bq24193::ChargeVoltageControl, 0xFC, bq24193::EncodeChargeVoltageLimit(mv));
- }
-
- Result Bq24193Driver::SetChargerConfiguration(bq24193::ChargerConfiguration cfg) {
- return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x30, bq24193::EncodeChargerConfiguration(cfg));
- }
-
- Result Bq24193Driver::IsHiZEnabled(bool *out) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::InputSourceControl, std::addressof(val)));
-
- /* Extract the value. */
- *out = (val & 0x80) != 0;
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetHiZEnabled(bool en) {
- return ReadWriteRegister(this->i2c_session, bq24193::InputSourceControl, 0x80, en ? 0x80 : 0x00);
- }
-
- Result Bq24193Driver::GetInputCurrentLimit(int *out_ma) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::InputSourceControl, std::addressof(val)));
-
- /* Extract the value. */
- *out_ma = bq24193::DecodeInputCurrentLimit(val);
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetInputCurrentLimit(int ma) {
- return ReadWriteRegister(this->i2c_session, bq24193::InputSourceControl, 0x07, bq24193::EncodeInputCurrentLimit(ma));
- }
-
- Result Bq24193Driver::SetInputVoltageLimit(int mv) {
- return ReadWriteRegister(this->i2c_session, bq24193::InputSourceControl, 0x78, bq24193::EncodeInputVoltageLimit(mv));
- }
-
- Result Bq24193Driver::SetBoostModeCurrentLimit(int ma) {
- return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x01, bq24193::EncodeBoostModeCurrentLimit(ma));
- }
-
- Result Bq24193Driver::GetChargerStatus(bq24193::ChargerStatus *out) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::SystemStatus, std::addressof(val)));
-
- /* Extract the value. */
- *out = bq24193::DecodeChargerStatus(val);
- return ResultSuccess();
- }
-
- Result Bq24193Driver::ResetWatchdogTimer() {
- return ReadWriteRegister(this->i2c_session, bq24193::PowerOnConfiguration, 0x40, 0x40);
- }
-
- Result Bq24193Driver::SetWatchdogTimerSetting(int seconds) {
- return ReadWriteRegister(this->i2c_session, bq24193::ChargeTerminationTimerControl, 0x30, bq24193::EncodeWatchdogTimerSetting(seconds));
- }
-
- Result Bq24193Driver::GetBatteryCompensation(int *out_mo) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, std::addressof(val)));
-
- /* Extract the value. */
- *out_mo = bq24193::DecodeBatteryCompensation(val);
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetBatteryCompensation(int mo) {
- return ReadWriteRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, 0xE0, bq24193::EncodeBatteryCompensation(mo));
- }
-
- Result Bq24193Driver::GetVoltageClamp(int *out_mv) {
- /* Get the register. */
- u8 val;
- R_TRY(i2c::ReadSingleRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, std::addressof(val)));
-
- /* Extract the value. */
- *out_mv = bq24193::DecodeVoltageClamp(val);
- return ResultSuccess();
- }
-
- Result Bq24193Driver::SetVoltageClamp(int mv) {
- return ReadWriteRegister(this->i2c_session, bq24193::IrCompensationThermalRegulationControl, 0x1C, bq24193::EncodeVoltageClamp(mv));
- }
-
-}
\ No newline at end of file
diff --git a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_bq24193_driver.hpp b/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_bq24193_driver.hpp
deleted file mode 100644
index 01d9b90..0000000
--- a/libraries/libstratosphere/source/powctl/impl/board/nintendo_nx/powctl_bq24193_driver.hpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2018-2020 Atmosphère-NX
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see