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"
|
#include "boot_gpio_map.hpp"
|
||||||
|
|
||||||
static bool g_initialized_gpio_vaddr = false;
|
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) {
|
static inline u32 GetGpioPadDescriptor(u32 gpio_pad_name) {
|
||||||
if (gpio_pad_name >= GpioPadNameMax) {
|
if (gpio_pad_name >= GpioPadNameMax) {
|
||||||
|
@ -28,20 +28,20 @@ static inline u32 GetGpioPadDescriptor(u32 gpio_pad_name) {
|
||||||
return GpioMap[gpio_pad_name];
|
return GpioMap[gpio_pad_name];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *GetGpioBaseAddress() {
|
static uintptr_t GetGpioBaseAddress() {
|
||||||
if (!g_initialized_gpio_vaddr) {
|
if (!g_initialized_gpio_vaddr) {
|
||||||
u64 vaddr;
|
u64 vaddr;
|
||||||
if (R_FAILED(svcQueryIoMapping(&vaddr, Boot::GpioPhysicalBase, 0x1000))) {
|
if (R_FAILED(svcQueryIoMapping(&vaddr, Boot::GpioPhysicalBase, 0x1000))) {
|
||||||
std::abort();
|
std::abort();
|
||||||
}
|
}
|
||||||
g_gpio_vaddr = reinterpret_cast<void *>(g_gpio_vaddr);
|
g_gpio_vaddr = vaddr;
|
||||||
g_initialized_gpio_vaddr = true;
|
g_initialized_gpio_vaddr = true;
|
||||||
}
|
}
|
||||||
return g_gpio_vaddr;
|
return g_gpio_vaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Boot::GpioConfigure(u32 gpio_pad_name) {
|
u32 Boot::GpioConfigure(u32 gpio_pad_name) {
|
||||||
void *gpio_base_vaddr = GetGpioBaseAddress();
|
uintptr_t gpio_base_vaddr = GetGpioBaseAddress();
|
||||||
|
|
||||||
/* Fetch this GPIO's pad descriptor */
|
/* Fetch this GPIO's pad descriptor */
|
||||||
const u32 gpio_pad_desc = GetGpioPadDescriptor(gpio_pad_name);
|
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)));
|
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) */
|
/* 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) */
|
/* 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;
|
return gpio_cnf_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Boot::GpioSetDirection(u32 gpio_pad_name, GpioDirection dir) {
|
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 */
|
/* Fetch this GPIO's pad descriptor */
|
||||||
const u32 gpio_pad_desc = GetGpioPadDescriptor(gpio_pad_name);
|
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)));
|
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) */
|
/* 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) */
|
/* 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;
|
return gpio_oe_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 Boot::GpioSetValue(u32 gpio_pad_name, GpioValue 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 */
|
/* Fetch this GPIO's pad descriptor */
|
||||||
const u32 gpio_pad_desc = GetGpioPadDescriptor(gpio_pad_name);
|
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)));
|
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) */
|
/* 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) */
|
/* 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;
|
return gpio_out_val;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue