mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 05:32:47 +00:00
Fix backlight turning on issue
This commit is contained in:
parent
5104deff9e
commit
1a65b4e7f0
2
Makefile
2
Makefile
@ -33,7 +33,7 @@ ARCH := -DARM9 -march=armv5te -mthumb -mthumb-interwork -flto
|
|||||||
ASFLAGS := $(ARCH) -g -x assembler-with-cpp $(INCLUDE)
|
ASFLAGS := $(ARCH) -g -x assembler-with-cpp $(INCLUDE)
|
||||||
CFLAGS := $(ARCH) -g -Wall -Wextra -Wpedantic -Wcast-align -Wno-main -O2 \
|
CFLAGS := $(ARCH) -g -Wall -Wextra -Wpedantic -Wcast-align -Wno-main -O2 \
|
||||||
-mtune=arm946e-s -fomit-frame-pointer -ffast-math -std=gnu11 \
|
-mtune=arm946e-s -fomit-frame-pointer -ffast-math -std=gnu11 \
|
||||||
$(INCLUDE)
|
$(INCLUDE) -Wno-unused-function
|
||||||
|
|
||||||
CFLAGS += -DBUILD_NAME="\"$(TARGET) (`date +'%Y/%m/%d'`)\""
|
CFLAGS += -DBUILD_NAME="\"$(TARGET) (`date +'%Y/%m/%d'`)\""
|
||||||
|
|
||||||
|
@ -16,9 +16,38 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdbool.h>
|
#pragma once
|
||||||
#include "i2c.h"
|
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define I2C_STOP (1u)
|
||||||
|
#define I2C_START (1u<<1)
|
||||||
|
#define I2C_ERROR (1u<<2)
|
||||||
|
#define I2C_ACK (1u<<4)
|
||||||
|
#define I2C_DIRE_WRITE (0u)
|
||||||
|
#define I2C_DIRE_READ (1u<<5)
|
||||||
|
#define I2C_IRQ_ENABLE (1u<<6)
|
||||||
|
#define I2C_ENABLE (1u<<7)
|
||||||
|
|
||||||
|
#define I2C_GET_ACK(reg) ((bool)((reg)>>4 & 1u))
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
I2C_DEV_POWER = 0, // Unconfirmed
|
||||||
|
I2C_DEV_CAMERA = 1, // Unconfirmed
|
||||||
|
I2C_DEV_CAMERA2 = 2, // Unconfirmed
|
||||||
|
I2C_DEV_MCU = 3,
|
||||||
|
I2C_DEV_GYRO = 10,
|
||||||
|
I2C_DEV_DEBUG_PAD = 12,
|
||||||
|
I2C_DEV_IR = 13,
|
||||||
|
I2C_DEV_EEPROM = 14, // Unconfirmed
|
||||||
|
I2C_DEV_NFC = 15,
|
||||||
|
I2C_DEV_QTM = 16,
|
||||||
|
I2C_DEV_N3DS_HID = 17
|
||||||
|
} I2cDevice;
|
||||||
|
|
||||||
#define I2C1_REGS_BASE (0x10161000)
|
#define I2C1_REGS_BASE (0x10161000)
|
||||||
#define REG_I2C1_DATA *((vu8* )(I2C1_REGS_BASE + 0x00))
|
#define REG_I2C1_DATA *((vu8* )(I2C1_REGS_BASE + 0x00))
|
||||||
@ -65,14 +94,12 @@ static const struct
|
|||||||
{2, 0x54}
|
{2, 0x54}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline void i2cWaitBusy(vu8 *cntReg)
|
||||||
|
|
||||||
static void i2cWaitBusy(vu8 *cntReg)
|
|
||||||
{
|
{
|
||||||
while(*cntReg & I2C_ENABLE);
|
while(*cntReg & I2C_ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static vu8* i2cGetBusRegsBase(u8 busId)
|
static inline vu8* i2cGetBusRegsBase(u8 busId)
|
||||||
{
|
{
|
||||||
vu8 *base;
|
vu8 *base;
|
||||||
if(!busId) base = (vu8*)I2C1_REGS_BASE;
|
if(!busId) base = (vu8*)I2C1_REGS_BASE;
|
||||||
@ -134,7 +161,7 @@ static bool i2cStartTransfer(I2cDevice devId, u8 regAddr, bool read, vu8 *regsBa
|
|||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I2C_init(void)
|
static void I2C_init(void)
|
||||||
{
|
{
|
||||||
i2cWaitBusy(i2cGetBusRegsBase(0));
|
i2cWaitBusy(i2cGetBusRegsBase(0));
|
||||||
REG_I2C1_CNTEX = 2; // ?
|
REG_I2C1_CNTEX = 2; // ?
|
||||||
@ -149,7 +176,7 @@ void I2C_init(void)
|
|||||||
REG_I2C3_SCL = 1280; // ?
|
REG_I2C3_SCL = 1280; // ?
|
||||||
}
|
}
|
||||||
|
|
||||||
bool I2C_readRegBuf(I2cDevice devId, u8 regAddr, u8 *out, u32 size)
|
static bool I2C_readRegBuf(I2cDevice devId, u8 regAddr, u8 *out, u32 size)
|
||||||
{
|
{
|
||||||
const u8 busId = i2cDevTable[devId].busId;
|
const u8 busId = i2cDevTable[devId].busId;
|
||||||
vu8 *const i2cData = i2cGetBusRegsBase(busId);
|
vu8 *const i2cData = i2cGetBusRegsBase(busId);
|
||||||
@ -172,7 +199,7 @@ bool I2C_readRegBuf(I2cDevice devId, u8 regAddr, u8 *out, u32 size)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool I2C_writeReg(I2cDevice devId, u8 regAddr, u8 data)
|
static bool I2C_writeReg(I2cDevice devId, u8 regAddr, u8 data)
|
||||||
{
|
{
|
||||||
const u8 busId = i2cDevTable[devId].busId;
|
const u8 busId = i2cDevTable[devId].busId;
|
||||||
vu8 *const i2cData = i2cGetBusRegsBase(busId);
|
vu8 *const i2cData = i2cGetBusRegsBase(busId);
|
26
common/pxi.h
26
common/pxi.h
@ -46,32 +46,32 @@ enum {
|
|||||||
#define PXI_SYNC_TRIGGER_OLDARM (BIT(6))
|
#define PXI_SYNC_TRIGGER_OLDARM (BIT(6))
|
||||||
#define PXI_SYNC_ENABLE_IRQ (BIT(7))
|
#define PXI_SYNC_ENABLE_IRQ (BIT(7))
|
||||||
|
|
||||||
void PXI_SetRemote(u8 msg)
|
static inline void PXI_SetRemote(u8 msg)
|
||||||
{
|
{
|
||||||
*PXI_SYNC_SEND = msg;
|
*PXI_SYNC_SEND = msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 PXI_GetRemote(void)
|
static inline u8 PXI_GetRemote(void)
|
||||||
{
|
{
|
||||||
return *PXI_SYNC_RECV;
|
return *PXI_SYNC_RECV;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_WaitRemote(u8 msg)
|
static inline void PXI_WaitRemote(u8 msg)
|
||||||
{
|
{
|
||||||
while(*PXI_SYNC_RECV != msg);
|
while(*PXI_SYNC_RECV != msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_EnableIRQ(void)
|
static inline void PXI_EnableIRQ(void)
|
||||||
{
|
{
|
||||||
*PXI_SYNC_IRQ = PXI_SYNC_ENABLE_IRQ;
|
*PXI_SYNC_IRQ = PXI_SYNC_ENABLE_IRQ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_DisableIRQ(void)
|
static inline void PXI_DisableIRQ(void)
|
||||||
{
|
{
|
||||||
*PXI_SYNC_IRQ = 0;
|
*PXI_SYNC_IRQ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_Sync(void)
|
static inline void PXI_Sync(void)
|
||||||
{
|
{
|
||||||
#ifdef ARM9
|
#ifdef ARM9
|
||||||
*PXI_SYNC_IRQ |= PXI_SYNC_TRIGGER_MPCORE;
|
*PXI_SYNC_IRQ |= PXI_SYNC_TRIGGER_MPCORE;
|
||||||
@ -80,7 +80,7 @@ void PXI_Sync(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_Reset(void)
|
static void PXI_Reset(void)
|
||||||
{
|
{
|
||||||
*PXI_SYNC = 0;
|
*PXI_SYNC = 0;
|
||||||
*PXI_CNT = PXI_CNT_SEND_FIFO_FLUSH;
|
*PXI_CNT = PXI_CNT_SEND_FIFO_FLUSH;
|
||||||
@ -92,7 +92,7 @@ void PXI_Reset(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_Send(u32 w)
|
static void PXI_Send(u32 w)
|
||||||
{
|
{
|
||||||
while(*PXI_CNT & PXI_CNT_SEND_FIFO_FULL);
|
while(*PXI_CNT & PXI_CNT_SEND_FIFO_FULL);
|
||||||
do {
|
do {
|
||||||
@ -101,7 +101,7 @@ void PXI_Send(u32 w)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 PXI_Recv(void)
|
static u32 PXI_Recv(void)
|
||||||
{
|
{
|
||||||
u32 ret;
|
u32 ret;
|
||||||
while(*PXI_CNT & PXI_CNT_RECV_FIFO_EMPTY);
|
while(*PXI_CNT & PXI_CNT_RECV_FIFO_EMPTY);
|
||||||
@ -111,7 +111,7 @@ u32 PXI_Recv(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_SendArray(const u32 *w, u32 c)
|
static void PXI_SendArray(const u32 *w, u32 c)
|
||||||
{
|
{
|
||||||
if (c>PXI_FIFO_LEN) c=PXI_FIFO_LEN;
|
if (c>PXI_FIFO_LEN) c=PXI_FIFO_LEN;
|
||||||
for (u32 i=0; i<c; i++) {
|
for (u32 i=0; i<c; i++) {
|
||||||
@ -120,7 +120,7 @@ void PXI_SendArray(const u32 *w, u32 c)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_RecvArray(u32 *w, u32 c)
|
static void PXI_RecvArray(u32 *w, u32 c)
|
||||||
{
|
{
|
||||||
if (c>PXI_FIFO_LEN) c=PXI_FIFO_LEN;
|
if (c>PXI_FIFO_LEN) c=PXI_FIFO_LEN;
|
||||||
for (u32 i=0; i<c; i++) {
|
for (u32 i=0; i<c; i++) {
|
||||||
@ -129,12 +129,12 @@ void PXI_RecvArray(u32 *w, u32 c)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PXI_DoCMD(u8 cmd, u32 *args, u32 argc)
|
static void PXI_DoCMD(u8 cmd, u32 *args, u32 argc)
|
||||||
{
|
{
|
||||||
PXI_WaitRemote(PXI_READY);
|
PXI_WaitRemote(PXI_READY);
|
||||||
PXI_SendArray(args, argc);
|
PXI_SendArray(args, argc);
|
||||||
PXI_SetRemote(cmd);
|
PXI_SetRemote(cmd);
|
||||||
PXI_Sync();
|
PXI_Sync();
|
||||||
PXI_WaitRemote(PXI_READY);
|
PXI_WaitRemote(PXI_BUSY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include <gpulcd.h>
|
#include <gpulcd.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
void LCD_SetBrightness(u32 screen, u32 brightness)
|
void LCD_SetBrightness(u32 screen, u8 brightness)
|
||||||
{
|
{
|
||||||
vu32 *lcd_reg;
|
vu32 *lcd_reg;
|
||||||
if (screen & 1) {
|
if (screen & 1) {
|
||||||
@ -10,20 +10,19 @@ void LCD_SetBrightness(u32 screen, u32 brightness)
|
|||||||
} else {
|
} else {
|
||||||
lcd_reg = LCD_CFG(0x240);
|
lcd_reg = LCD_CFG(0x240);
|
||||||
}
|
}
|
||||||
*lcd_reg = brightness & 0xFF;
|
*lcd_reg = brightness;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LCD_Initialize(u32 brightness)
|
void LCD_Initialize(u8 brightness)
|
||||||
{
|
{
|
||||||
brightness &= 0xFF;
|
|
||||||
|
|
||||||
*LCD_CFG(0x014) = 0x00000001;
|
*LCD_CFG(0x014) = 0x00000001;
|
||||||
*LCD_CFG(0x00C) &= 0xFFFEFFFE;
|
*LCD_CFG(0x00C) &= 0xFFFEFFFE;
|
||||||
*LCD_CFG(0x240) = brightness;
|
*LCD_CFG(0x240) = brightness;
|
||||||
*LCD_CFG(0xA40) = brightness;
|
*LCD_CFG(0xA40) = brightness;
|
||||||
*LCD_CFG(0x244) = 0x1023E;
|
*LCD_CFG(0x244) = 0x1023E;
|
||||||
*LCD_CFG(0xA44) = 0x1023E;
|
*LCD_CFG(0xA44) = 0x1023E;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LCD_Deinitialize(void)
|
void LCD_Deinitialize(void)
|
||||||
@ -38,9 +37,8 @@ void LCD_Deinitialize(void)
|
|||||||
void GPU_PSCFill(u32 start, u32 end, u32 fv)
|
void GPU_PSCFill(u32 start, u32 end, u32 fv)
|
||||||
{
|
{
|
||||||
u32 mp;
|
u32 mp;
|
||||||
if (start > end) {
|
if (start > end)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
start = GPU_ADDR(start);
|
start = GPU_ADDR(start);
|
||||||
end = GPU_ADDR(end);
|
end = GPU_ADDR(end);
|
||||||
@ -74,7 +72,7 @@ void GPU_SetFramebuffers(const u32 *framebuffers)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GPU_SetFramebufferMode(u32 screen, u32 mode)
|
void GPU_SetFramebufferMode(u32 screen, u8 mode)
|
||||||
{
|
{
|
||||||
u32 stride, cfg;
|
u32 stride, cfg;
|
||||||
vu32 *fbcfg_reg, *fbstr_reg;
|
vu32 *fbcfg_reg, *fbstr_reg;
|
||||||
@ -140,6 +138,7 @@ void GPU_Init(void)
|
|||||||
*GPU_PDC0(0x6C) = VRAM_START;
|
*GPU_PDC0(0x6C) = VRAM_START;
|
||||||
*GPU_PDC0(0x70) = 0x00080340;
|
*GPU_PDC0(0x70) = 0x00080340;
|
||||||
*GPU_PDC0(0x74) = 0x00010501;
|
*GPU_PDC0(0x74) = 0x00010501;
|
||||||
|
*GPU_PDC0(0x78) = 0x00000000;
|
||||||
*GPU_PDC0(0x90) = 0x000003C0;
|
*GPU_PDC0(0x90) = 0x000003C0;
|
||||||
*GPU_PDC0(0x94) = VRAM_START;
|
*GPU_PDC0(0x94) = VRAM_START;
|
||||||
*GPU_PDC0(0x98) = VRAM_START;
|
*GPU_PDC0(0x98) = VRAM_START;
|
||||||
@ -174,6 +173,7 @@ void GPU_Init(void)
|
|||||||
*GPU_PDC1(0x6C) = VRAM_START;
|
*GPU_PDC1(0x6C) = VRAM_START;
|
||||||
*GPU_PDC1(0x70) = 0x00080300;
|
*GPU_PDC1(0x70) = 0x00080300;
|
||||||
*GPU_PDC1(0x74) = 0x00010501;
|
*GPU_PDC1(0x74) = 0x00010501;
|
||||||
|
*GPU_PDC1(0x78) = 0x00000000;
|
||||||
*GPU_PDC1(0x90) = 0x000003C0;
|
*GPU_PDC1(0x90) = 0x000003C0;
|
||||||
*GPU_PDC1(0x9C) = 0x00000000;
|
*GPU_PDC1(0x9C) = 0x00000000;
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#define LCD_CFG(x) ((vu32*)(0x10202000 + (x)))
|
#define LCD_CFG(x) ((vu32*)(0x10202000 + (x)))
|
||||||
void LCD_SetBrightness(u32 screen, u32 brightness);
|
void LCD_SetBrightness(u32 screen, u8 brightness);
|
||||||
void LCD_Deinitialize(void);
|
void LCD_Deinitialize(void);
|
||||||
|
|
||||||
#define GPU_PSC0(x) ((vu32*)(0x10400010 + (x)))
|
#define GPU_PSC0(x) ((vu32*)(0x10400010 + (x)))
|
||||||
@ -43,5 +43,5 @@ void GPU_PSCFill(u32 start, u32 end, u32 fv);
|
|||||||
#define PDC_FIXSTRIP (BIT(7))
|
#define PDC_FIXSTRIP (BIT(7))
|
||||||
|
|
||||||
void GPU_SetFramebuffers(const u32 *framebuffers);
|
void GPU_SetFramebuffers(const u32 *framebuffers);
|
||||||
void GPU_SetFramebufferMode(u32 screen, u32 mode);
|
void GPU_SetFramebufferMode(u32 screen, u8 mode);
|
||||||
void GPU_Init();
|
void GPU_Init();
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <cpu.h>
|
#include <cpu.h>
|
||||||
#include <pxi.h>
|
#include <pxi.h>
|
||||||
#include <gic.h>
|
#include <gic.h>
|
||||||
|
#include <i2c.h>
|
||||||
#include <gpulcd.h>
|
#include <gpulcd.h>
|
||||||
#include <vram.h>
|
#include <vram.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
@ -46,7 +47,7 @@ void PXI_IRQHandler(void)
|
|||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
u32 entry=0;
|
u32 entry;
|
||||||
PXI_Reset();
|
PXI_Reset();
|
||||||
|
|
||||||
GPU_Init();
|
GPU_Init();
|
||||||
@ -58,6 +59,8 @@ void main(void)
|
|||||||
GPU_SetFramebufferMode(0, PDC_RGB24);
|
GPU_SetFramebufferMode(0, PDC_RGB24);
|
||||||
GPU_SetFramebufferMode(1, PDC_RGB24);
|
GPU_SetFramebufferMode(1, PDC_RGB24);
|
||||||
|
|
||||||
|
I2C_writeReg(I2C_DEV_MCU, 0x22, 0x2A);
|
||||||
|
|
||||||
GIC_Reset();
|
GIC_Reset();
|
||||||
GIC_SetIRQ(IRQ_PXI_SYNC, PXI_IRQHandler);
|
GIC_SetIRQ(IRQ_PXI_SYNC, PXI_IRQHandler);
|
||||||
PXI_EnableIRQ();
|
PXI_EnableIRQ();
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of fastboot 3DS
|
|
||||||
* Copyright (C) 2017 derrek, profi200
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define I2C_STOP (1u)
|
|
||||||
#define I2C_START (1u<<1)
|
|
||||||
#define I2C_ERROR (1u<<2)
|
|
||||||
#define I2C_ACK (1u<<4)
|
|
||||||
#define I2C_DIRE_WRITE (0u)
|
|
||||||
#define I2C_DIRE_READ (1u<<5)
|
|
||||||
#define I2C_IRQ_ENABLE (1u<<6)
|
|
||||||
#define I2C_ENABLE (1u<<7)
|
|
||||||
|
|
||||||
#define I2C_GET_ACK(reg) ((bool)((reg)>>4 & 1u))
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
I2C_DEV_POWER = 0, // Unconfirmed
|
|
||||||
I2C_DEV_CAMERA = 1, // Unconfirmed
|
|
||||||
I2C_DEV_CAMERA2 = 2, // Unconfirmed
|
|
||||||
I2C_DEV_MCU = 3,
|
|
||||||
I2C_DEV_GYRO = 10,
|
|
||||||
I2C_DEV_DEBUG_PAD = 12,
|
|
||||||
I2C_DEV_IR = 13,
|
|
||||||
I2C_DEV_EEPROM = 14, // Unconfirmed
|
|
||||||
I2C_DEV_NFC = 15,
|
|
||||||
I2C_DEV_QTM = 16,
|
|
||||||
I2C_DEV_N3DS_HID = 17
|
|
||||||
} I2cDevice;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void I2C_init(void);
|
|
||||||
bool I2C_readRegBuf(I2cDevice devId, u8 regAddr, u8 *out, u32 size);
|
|
||||||
bool I2C_writeReg(I2cDevice devId, u8 regAddr, u8 data);
|
|
@ -18,11 +18,6 @@ void CheckBrightness() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenOn() {
|
|
||||||
wait_msec(3); // wait 3ms (cause profi200 said so)
|
|
||||||
I2C_writeReg(I2C_DEV_MCU, 0x22, 0x2A); // poweron LCD
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reboot() {
|
void Reboot() {
|
||||||
I2C_writeReg(I2C_DEV_MCU, 0x22, 1 << 0); // poweroff LCD to prevent MCU hangs
|
I2C_writeReg(I2C_DEV_MCU, 0x22, 1 << 0); // poweroff LCD to prevent MCU hangs
|
||||||
flushEntireDCache();
|
flushEntireDCache();
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
#include "godmode.h"
|
#include "godmode.h"
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
#include "pxi.h"
|
||||||
|
|
||||||
void main(int argc, char** argv)
|
void main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
(void) argv; // unused for now
|
(void) argv; // unused for now
|
||||||
|
|
||||||
// Screen on
|
// Wait for ARM11
|
||||||
ScreenOn();
|
PXI_WaitRemote(PXI_READY);
|
||||||
|
|
||||||
// Run the main program
|
// Run the main program
|
||||||
if (GodMode(argc) == GODMODE_EXIT_REBOOT) Reboot();
|
if (GodMode(argc) == GODMODE_EXIT_REBOOT) Reboot();
|
||||||
|
@ -116,13 +116,6 @@ _start_gm:
|
|||||||
strlt r3, [r2], #4
|
strlt r3, [r2], #4
|
||||||
blt .LXRQ_Install
|
blt .LXRQ_Install
|
||||||
|
|
||||||
@ Wait for the ARM11 to do its thing
|
|
||||||
mov r0, #0x20000000
|
|
||||||
.LWaitMPC:
|
|
||||||
ldr r1, [r0, #-4]
|
|
||||||
cmp r1, #0
|
|
||||||
bne .LWaitMPC
|
|
||||||
|
|
||||||
@ Enable caches / select low exception vectors
|
@ Enable caches / select low exception vectors
|
||||||
ldr r1, =(CR_ALT_VECTORS | CR_DISABLE_TBIT)
|
ldr r1, =(CR_ALT_VECTORS | CR_DISABLE_TBIT)
|
||||||
ldr r2, =(CR_ENABLE_MPU | CR_ENABLE_DCACHE | CR_ENABLE_ICACHE | \
|
ldr r2, =(CR_ENABLE_MPU | CR_ENABLE_DCACHE | CR_ENABLE_ICACHE | \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user