mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
boot: fix gpio configuration access errors
This commit is contained in:
parent
505324f625
commit
520b5f6c59
1 changed files with 12 additions and 12 deletions
|
@ -18,7 +18,7 @@
|
|||
#include "boot_gpio_map.hpp"
|
||||
|
||||
static bool g_initialized_gpio_vaddr = false;
|
||||
static void *g_gpio_vaddr = nullptr;
|
||||
static uintptr_t g_gpio_vaddr = 0;
|
||||
|
||||
static inline u32 GetGpioPadDescriptor(u32 gpio_pad_name) {
|
||||
if (gpio_pad_name >= GpioPadNameMax) {
|
||||
|
@ -28,20 +28,20 @@ static inline u32 GetGpioPadDescriptor(u32 gpio_pad_name) {
|
|||
return GpioMap[gpio_pad_name];
|
||||
}
|
||||
|
||||
static void *GetGpioBaseAddress() {
|
||||
static uintptr_t GetGpioBaseAddress() {
|
||||
if (!g_initialized_gpio_vaddr) {
|
||||
u64 vaddr;
|
||||
if (R_FAILED(svcQueryIoMapping(&vaddr, Boot::GpioPhysicalBase, 0x1000))) {
|
||||
std::abort();
|
||||
}
|
||||
g_gpio_vaddr = reinterpret_cast<void *>(g_gpio_vaddr);
|
||||
g_gpio_vaddr = vaddr;
|
||||
g_initialized_gpio_vaddr = true;
|
||||
}
|
||||
return g_gpio_vaddr;
|
||||
}
|
||||
|
||||
u32 Boot::GpioConfigure(u32 gpio_pad_name) {
|
||||
void *gpio_base_vaddr = GetGpioBaseAddress();
|
||||
uintptr_t gpio_base_vaddr = GetGpioBaseAddress();
|
||||
|
||||
/* Fetch this GPIO's pad descriptor */
|
||||
const u32 gpio_pad_desc = GetGpioPadDescriptor(gpio_pad_name);
|
||||
|
@ -58,16 +58,16 @@ u32 Boot::GpioConfigure(u32 gpio_pad_name) {
|
|||
u32 gpio_cnf_val = ((0x01 << ((gpio_pad_desc & 0x07) | 0x08)) | (0x01 << (gpio_pad_desc & 0x07)));
|
||||
|
||||
/* Write to the appropriate GPIO_CNF_x register (upper offset) */
|
||||
*(reinterpret_cast<u32 *>(gpio_base_vaddr) + gpio_reg_offset + 0x80) = gpio_cnf_val;
|
||||
*(reinterpret_cast<volatile u32 *>(gpio_base_vaddr + gpio_reg_offset + 0x80)) = gpio_cnf_val;
|
||||
|
||||
/* Do a dummy read from GPIO_CNF_x register (lower offset) */
|
||||
gpio_cnf_val = *(reinterpret_cast<u32 *>(gpio_base_vaddr) + gpio_reg_offset);
|
||||
gpio_cnf_val = *(reinterpret_cast<volatile u32 *>(gpio_base_vaddr + gpio_reg_offset));
|
||||
|
||||
return gpio_cnf_val;
|
||||
}
|
||||
|
||||
u32 Boot::GpioSetDirection(u32 gpio_pad_name, GpioDirection dir) {
|
||||
void *gpio_base_vaddr = GetGpioBaseAddress();
|
||||
uintptr_t gpio_base_vaddr = GetGpioBaseAddress();
|
||||
|
||||
/* Fetch this GPIO's pad descriptor */
|
||||
const u32 gpio_pad_desc = GetGpioPadDescriptor(gpio_pad_name);
|
||||
|
@ -84,16 +84,16 @@ u32 Boot::GpioSetDirection(u32 gpio_pad_name, GpioDirection dir) {
|
|||
u32 gpio_oe_val = ((0x01 << ((gpio_pad_desc & 0x07) | 0x08)) | (static_cast<u32>(dir) << (gpio_pad_desc & 0x07)));
|
||||
|
||||
/* Write to the appropriate GPIO_OE_x register (upper offset) */
|
||||
*(reinterpret_cast<u32 *>(gpio_base_vaddr) + gpio_reg_offset + 0x90) = gpio_oe_val;
|
||||
*(reinterpret_cast<volatile u32 *>(gpio_base_vaddr + gpio_reg_offset + 0x90)) = gpio_oe_val;
|
||||
|
||||
/* Do a dummy read from GPIO_OE_x register (lower offset) */
|
||||
gpio_oe_val = *(reinterpret_cast<u32 *>(gpio_base_vaddr) + gpio_reg_offset);
|
||||
gpio_oe_val = *(reinterpret_cast<volatile u32 *>(gpio_base_vaddr + gpio_reg_offset));
|
||||
|
||||
return gpio_oe_val;
|
||||
}
|
||||
|
||||
u32 Boot::GpioSetValue(u32 gpio_pad_name, GpioValue val) {
|
||||
void *gpio_base_vaddr = GetGpioBaseAddress();
|
||||
uintptr_t gpio_base_vaddr = GetGpioBaseAddress();
|
||||
|
||||
/* Fetch this GPIO's pad descriptor */
|
||||
const u32 gpio_pad_desc = GetGpioPadDescriptor(gpio_pad_name);
|
||||
|
@ -110,10 +110,10 @@ u32 Boot::GpioSetValue(u32 gpio_pad_name, GpioValue val) {
|
|||
u32 gpio_out_val = ((0x01 << ((gpio_pad_desc & 0x07) | 0x08)) | (static_cast<u32>(val) << (gpio_pad_desc & 0x07)));
|
||||
|
||||
/* Write to the appropriate GPIO_OUT_x register (upper offset) */
|
||||
*(reinterpret_cast<u32 *>(gpio_base_vaddr) + gpio_reg_offset + 0xA0) = gpio_out_val;
|
||||
*(reinterpret_cast<volatile u32 *>(gpio_base_vaddr + gpio_reg_offset + 0xA0)) = gpio_out_val;
|
||||
|
||||
/* Do a dummy read from GPIO_OUT_x register (lower offset) */
|
||||
gpio_out_val = *(reinterpret_cast<u32 *>(gpio_base_vaddr) + gpio_reg_offset);
|
||||
gpio_out_val = *(reinterpret_cast<volatile u32 *>(gpio_base_vaddr + gpio_reg_offset));
|
||||
|
||||
return gpio_out_val;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue