From 30b79c2fe7ef183623bf11ce9b02cf1d9d415217 Mon Sep 17 00:00:00 2001
From: TuxSH <1922548+TuxSH@users.noreply.github.com>
Date: Fri, 6 Mar 2020 18:54:57 +0000
Subject: [PATCH] thermosphere: pinmux driver C++
---
.../t210/hvisor_drivers_tegra_t210_pinmux.hpp | 255 ++++++++++++++++++
1 file changed, 255 insertions(+)
create mode 100644 thermosphere/src/drivers/tegra/t210/hvisor_drivers_tegra_t210_pinmux.hpp
diff --git a/thermosphere/src/drivers/tegra/t210/hvisor_drivers_tegra_t210_pinmux.hpp b/thermosphere/src/drivers/tegra/t210/hvisor_drivers_tegra_t210_pinmux.hpp
new file mode 100644
index 000000000..26f2e3bf5
--- /dev/null
+++ b/thermosphere/src/drivers/tegra/t210/hvisor_drivers_tegra_t210_pinmux.hpp
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2019-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 "../../../defines.hpp"
+
+#define CONFIGURE_UART_DECL(n)\
+void ConfigureUart##n() const\
+{\
+ m_regs->uart##n##_tx = 0;\
+ m_regs->uart##n##_rx = INPUT | PULL_UP;\
+ m_regs->uart##n##_rts = 0;\
+ m_regs->uart##n##_cts = INPUT | PULL_DOWN;\
+}
+
+namespace ams::hvisor::drivers::tegra::t210 {
+
+ class Pinmux final {
+ private:
+ struct Registers {
+ u32 sdmmc1_clk;
+ u32 sdmmc1_cmd;
+ u32 sdmmc1_dat3;
+ u32 sdmmc1_dat2;
+ u32 sdmmc1_dat1;
+ u32 sdmmc1_dat0;
+ u32 _r18;
+ u32 sdmmc3_clk;
+ u32 sdmmc3_cmd;
+ u32 sdmmc3_dat0;
+ u32 sdmmc3_dat1;
+ u32 sdmmc3_dat2;
+ u32 sdmmc3_dat3;
+ u32 _r34;
+ u32 pex_l0_rst_n;
+ u32 pex_l0_clkreq_n;
+ u32 pex_wake_n;
+ u32 pex_l1_rst_n;
+ u32 pex_l1_clkreq_n;
+ u32 sata_led_active;
+ u32 spi1_mosi;
+ u32 spi1_miso;
+ u32 spi1_sck;
+ u32 spi1_cs0;
+ u32 spi1_cs1;
+ u32 spi2_mosi;
+ u32 spi2_miso;
+ u32 spi2_sck;
+ u32 spi2_cs0;
+ u32 spi2_cs1;
+ u32 spi4_mosi;
+ u32 spi4_miso;
+ u32 spi4_sck;
+ u32 spi4_cs0;
+ u32 qspi_sck;
+ u32 qspi_cs_n;
+ u32 qspi_io0;
+ u32 qspi_io1;
+ u32 qspi_io2;
+ u32 qspi_io3;
+ u32 _ra0;
+ u32 dmic1_clk;
+ u32 dmic1_dat;
+ u32 dmic2_clk;
+ u32 dmic2_dat;
+ u32 dmic3_clk;
+ u32 dmic3_dat;
+ u32 gen1_i2c_scl;
+ u32 gen1_i2c_sda;
+ u32 gen2_i2c_scl;
+ u32 gen2_i2c_sda;
+ u32 gen3_i2c_scl;
+ u32 gen3_i2c_sda;
+ u32 cam_i2c_scl;
+ u32 cam_i2c_sda;
+ u32 pwr_i2c_scl;
+ u32 pwr_i2c_sda;
+ u32 uart1_tx;
+ u32 uart1_rx;
+ u32 uart1_rts;
+ u32 uart1_cts;
+ u32 uart2_tx;
+ u32 uart2_rx;
+ u32 uart2_rts;
+ u32 uart2_cts;
+ u32 uart3_tx;
+ u32 uart3_rx;
+ u32 uart3_rts;
+ u32 uart3_cts;
+ u32 uart4_tx;
+ u32 uart4_rx;
+ u32 uart4_rts;
+ u32 uart4_cts;
+ u32 dap1_fs;
+ u32 dap1_din;
+ u32 dap1_dout;
+ u32 dap1_sclk;
+ u32 dap2_fs;
+ u32 dap2_din;
+ u32 dap2_dout;
+ u32 dap2_sclk;
+ u32 dap4_fs;
+ u32 dap4_din;
+ u32 dap4_dout;
+ u32 dap4_sclk;
+ u32 cam1_mclk;
+ u32 cam2_mclk;
+ u32 jtag_rtck;
+ u32 clk_32k_in;
+ u32 clk_32k_out;
+ u32 batt_bcl;
+ u32 clk_req;
+ u32 cpu_pwr_req;
+ u32 pwr_int_n;
+ u32 shutdown;
+ u32 core_pwr_req;
+ u32 aud_mclk;
+ u32 dvfs_pwm;
+ u32 dvfs_clk;
+ u32 gpio_x1_aud;
+ u32 gpio_x3_aud;
+ u32 pcc7;
+ u32 hdmi_cec;
+ u32 hdmi_int_dp_hpd;
+ u32 spdif_out;
+ u32 spdif_in;
+ u32 usb_vbus_en0;
+ u32 usb_vbus_en1;
+ u32 dp_hpd0;
+ u32 wifi_en;
+ u32 wifi_rst;
+ u32 wifi_wake_ap;
+ u32 ap_wake_bt;
+ u32 bt_rst;
+ u32 bt_wake_ap;
+ u32 ap_wake_nfc;
+ u32 nfc_en;
+ u32 nfc_int;
+ u32 gps_en;
+ u32 gps_rst;
+ u32 cam_rst;
+ u32 cam_af_en;
+ u32 cam_flash_en;
+ u32 cam1_pwdn;
+ u32 cam2_pwdn;
+ u32 cam1_strobe;
+ u32 lcd_te;
+ u32 lcd_bl_pwm;
+ u32 lcd_bl_en;
+ u32 lcd_rst;
+ u32 lcd_gpio1;
+ u32 lcd_gpio2;
+ u32 ap_ready;
+ u32 touch_rst;
+ u32 touch_clk;
+ u32 modem_wake_ap;
+ u32 touch_int;
+ u32 motion_int;
+ u32 als_prox_int;
+ u32 temp_alert;
+ u32 button_power_on;
+ u32 button_vol_up;
+ u32 button_vol_down;
+ u32 button_slide_sw;
+ u32 button_home;
+ u32 pa6;
+ u32 pe6;
+ u32 pe7;
+ u32 ph6;
+ u32 pk0;
+ u32 pk1;
+ u32 pk2;
+ u32 pk3;
+ u32 pk4;
+ u32 pk5;
+ u32 pk6;
+ u32 pk7;
+ u32 pl0;
+ u32 pl1;
+ u32 pz0;
+ u32 pz1;
+ u32 pz2;
+ u32 pz3;
+ u32 pz4;
+ u32 pz5;
+ };
+ static_assert(std::is_standard_layout_v);
+ static_assert(std::is_trivial_v);
+
+ enum Flags : u32 {
+ PREEMP_ENABLED = BIT(15),
+
+ DRIVE_1X = 0 << 13,
+ DRIVE_2X = 1 << 13,
+ DRIVE_3X = 2 << 13,
+ DRIVE_4X = 3 << 13,
+
+ SCHMT_ENABLED = BIT(12),
+ OD_ENABLED = BIT(11),
+ IO_HV_ENABLED = BIT(10),
+ HSM_ENABLED = BIT(9),
+ LPDR_ENABLED = BIT(8),
+ LOCKED = BIT(7),
+ INPUT = BIT(6),
+ PARKED = BIT(5),
+ TRISTATE = BIT(4),
+
+ PULL_NONE = 0 << 2,
+ PULL_DOWN = 1 << 2,
+ PULL_UP = 2 << 2,
+
+ SELECT_FUNCTION0 = 0 << 0,
+ SELECT_FUNCTION1 = 1 << 0,
+ SELECT_FUNCTION2 = 2 << 0,
+ SELECT_FUNCTION3 = 3 << 0,
+ };
+
+ private:
+ // TODO friend
+ volatile Registers *m_regs = nullptr;
+
+ public:
+ CONFIGURE_UART_DECL(1)
+ CONFIGURE_UART_DECL(2)
+ CONFIGURE_UART_DECL(3)
+ CONFIGURE_UART_DECL(4)
+
+ void ConfigureUart(u32 id)
+ {
+ switch (id) {
+ case 0: ConfigureUart1(); break;
+ case 1: ConfigureUart2(); break;
+ case 2: ConfigureUart3(); break;
+ case 3: ConfigureUart4(); break;
+ default: break;
+ }
+ }
+ };
+}
+
+#undef CONFIGURE_UART_DECL
\ No newline at end of file