boot: fix gpio configuration access errors

This commit is contained in:
Michael Scire 2019-05-02 17:56:04 -07:00
parent 505324f625
commit 520b5f6c59

View file

@ -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;
} }