mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-25 21:22: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)
|
||||
CFLAGS := $(ARCH) -g -Wall -Wextra -Wpedantic -Wcast-align -Wno-main -O2 \
|
||||
-mtune=arm946e-s -fomit-frame-pointer -ffast-math -std=gnu11 \
|
||||
$(INCLUDE)
|
||||
$(INCLUDE) -Wno-unused-function
|
||||
|
||||
CFLAGS += -DBUILD_NAME="\"$(TARGET) (`date +'%Y/%m/%d'`)\""
|
||||
|
||||
|
@ -16,9 +16,38 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "i2c.h"
|
||||
#pragma once
|
||||
|
||||
#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 REG_I2C1_DATA *((vu8* )(I2C1_REGS_BASE + 0x00))
|
||||
@ -65,14 +94,12 @@ static const struct
|
||||
{2, 0x54}
|
||||
};
|
||||
|
||||
|
||||
|
||||
static void i2cWaitBusy(vu8 *cntReg)
|
||||
static inline void i2cWaitBusy(vu8 *cntReg)
|
||||
{
|
||||
while(*cntReg & I2C_ENABLE);
|
||||
}
|
||||
|
||||
static vu8* i2cGetBusRegsBase(u8 busId)
|
||||
static inline vu8* i2cGetBusRegsBase(u8 busId)
|
||||
{
|
||||
vu8 *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;
|
||||
}
|
||||
|
||||
void I2C_init(void)
|
||||
static void I2C_init(void)
|
||||
{
|
||||
i2cWaitBusy(i2cGetBusRegsBase(0));
|
||||
REG_I2C1_CNTEX = 2; // ?
|
||||
@ -149,7 +176,7 @@ void I2C_init(void)
|
||||
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;
|
||||
vu8 *const i2cData = i2cGetBusRegsBase(busId);
|
||||
@ -172,7 +199,7 @@ bool I2C_readRegBuf(I2cDevice devId, u8 regAddr, u8 *out, u32 size)
|
||||
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;
|
||||
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_ENABLE_IRQ (BIT(7))
|
||||
|
||||
void PXI_SetRemote(u8 msg)
|
||||
static inline void PXI_SetRemote(u8 msg)
|
||||
{
|
||||
*PXI_SYNC_SEND = msg;
|
||||
}
|
||||
|
||||
u8 PXI_GetRemote(void)
|
||||
static inline u8 PXI_GetRemote(void)
|
||||
{
|
||||
return *PXI_SYNC_RECV;
|
||||
}
|
||||
|
||||
void PXI_WaitRemote(u8 msg)
|
||||
static inline void PXI_WaitRemote(u8 msg)
|
||||
{
|
||||
while(*PXI_SYNC_RECV != msg);
|
||||
}
|
||||
|
||||
void PXI_EnableIRQ(void)
|
||||
static inline void PXI_EnableIRQ(void)
|
||||
{
|
||||
*PXI_SYNC_IRQ = PXI_SYNC_ENABLE_IRQ;
|
||||
}
|
||||
|
||||
void PXI_DisableIRQ(void)
|
||||
static inline void PXI_DisableIRQ(void)
|
||||
{
|
||||
*PXI_SYNC_IRQ = 0;
|
||||
}
|
||||
|
||||
void PXI_Sync(void)
|
||||
static inline void PXI_Sync(void)
|
||||
{
|
||||
#ifdef ARM9
|
||||
*PXI_SYNC_IRQ |= PXI_SYNC_TRIGGER_MPCORE;
|
||||
@ -80,7 +80,7 @@ void PXI_Sync(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void PXI_Reset(void)
|
||||
static void PXI_Reset(void)
|
||||
{
|
||||
*PXI_SYNC = 0;
|
||||
*PXI_CNT = PXI_CNT_SEND_FIFO_FLUSH;
|
||||
@ -92,7 +92,7 @@ void PXI_Reset(void)
|
||||
return;
|
||||
}
|
||||
|
||||
void PXI_Send(u32 w)
|
||||
static void PXI_Send(u32 w)
|
||||
{
|
||||
while(*PXI_CNT & PXI_CNT_SEND_FIFO_FULL);
|
||||
do {
|
||||
@ -101,7 +101,7 @@ void PXI_Send(u32 w)
|
||||
return;
|
||||
}
|
||||
|
||||
u32 PXI_Recv(void)
|
||||
static u32 PXI_Recv(void)
|
||||
{
|
||||
u32 ret;
|
||||
while(*PXI_CNT & PXI_CNT_RECV_FIFO_EMPTY);
|
||||
@ -111,7 +111,7 @@ u32 PXI_Recv(void)
|
||||
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;
|
||||
for (u32 i=0; i<c; i++) {
|
||||
@ -120,7 +120,7 @@ void PXI_SendArray(const u32 *w, u32 c)
|
||||
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;
|
||||
for (u32 i=0; i<c; i++) {
|
||||
@ -129,12 +129,12 @@ void PXI_RecvArray(u32 *w, u32 c)
|
||||
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_SendArray(args, argc);
|
||||
PXI_SetRemote(cmd);
|
||||
PXI_Sync();
|
||||
PXI_WaitRemote(PXI_READY);
|
||||
PXI_WaitRemote(PXI_BUSY);
|
||||
return;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <gpulcd.h>
|
||||
#include <types.h>
|
||||
|
||||
void LCD_SetBrightness(u32 screen, u32 brightness)
|
||||
void LCD_SetBrightness(u32 screen, u8 brightness)
|
||||
{
|
||||
vu32 *lcd_reg;
|
||||
if (screen & 1) {
|
||||
@ -10,20 +10,19 @@ void LCD_SetBrightness(u32 screen, u32 brightness)
|
||||
} else {
|
||||
lcd_reg = LCD_CFG(0x240);
|
||||
}
|
||||
*lcd_reg = brightness & 0xFF;
|
||||
*lcd_reg = brightness;
|
||||
return;
|
||||
}
|
||||
|
||||
void LCD_Initialize(u32 brightness)
|
||||
void LCD_Initialize(u8 brightness)
|
||||
{
|
||||
brightness &= 0xFF;
|
||||
|
||||
*LCD_CFG(0x014) = 0x00000001;
|
||||
*LCD_CFG(0x00C) &= 0xFFFEFFFE;
|
||||
*LCD_CFG(0x240) = brightness;
|
||||
*LCD_CFG(0xA40) = brightness;
|
||||
*LCD_CFG(0x244) = 0x1023E;
|
||||
*LCD_CFG(0xA44) = 0x1023E;
|
||||
return;
|
||||
}
|
||||
|
||||
void LCD_Deinitialize(void)
|
||||
@ -38,9 +37,8 @@ void LCD_Deinitialize(void)
|
||||
void GPU_PSCFill(u32 start, u32 end, u32 fv)
|
||||
{
|
||||
u32 mp;
|
||||
if (start > end) {
|
||||
if (start > end)
|
||||
return;
|
||||
}
|
||||
|
||||
start = GPU_ADDR(start);
|
||||
end = GPU_ADDR(end);
|
||||
@ -74,7 +72,7 @@ void GPU_SetFramebuffers(const u32 *framebuffers)
|
||||
return;
|
||||
}
|
||||
|
||||
void GPU_SetFramebufferMode(u32 screen, u32 mode)
|
||||
void GPU_SetFramebufferMode(u32 screen, u8 mode)
|
||||
{
|
||||
u32 stride, cfg;
|
||||
vu32 *fbcfg_reg, *fbstr_reg;
|
||||
@ -140,6 +138,7 @@ void GPU_Init(void)
|
||||
*GPU_PDC0(0x6C) = VRAM_START;
|
||||
*GPU_PDC0(0x70) = 0x00080340;
|
||||
*GPU_PDC0(0x74) = 0x00010501;
|
||||
*GPU_PDC0(0x78) = 0x00000000;
|
||||
*GPU_PDC0(0x90) = 0x000003C0;
|
||||
*GPU_PDC0(0x94) = VRAM_START;
|
||||
*GPU_PDC0(0x98) = VRAM_START;
|
||||
@ -174,6 +173,7 @@ void GPU_Init(void)
|
||||
*GPU_PDC1(0x6C) = VRAM_START;
|
||||
*GPU_PDC1(0x70) = 0x00080300;
|
||||
*GPU_PDC1(0x74) = 0x00010501;
|
||||
*GPU_PDC1(0x78) = 0x00000000;
|
||||
*GPU_PDC1(0x90) = 0x000003C0;
|
||||
*GPU_PDC1(0x9C) = 0x00000000;
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
#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);
|
||||
|
||||
#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))
|
||||
|
||||
void GPU_SetFramebuffers(const u32 *framebuffers);
|
||||
void GPU_SetFramebufferMode(u32 screen, u32 mode);
|
||||
void GPU_SetFramebufferMode(u32 screen, u8 mode);
|
||||
void GPU_Init();
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <cpu.h>
|
||||
#include <pxi.h>
|
||||
#include <gic.h>
|
||||
#include <i2c.h>
|
||||
#include <gpulcd.h>
|
||||
#include <vram.h>
|
||||
#include <types.h>
|
||||
@ -46,7 +47,7 @@ void PXI_IRQHandler(void)
|
||||
|
||||
void main(void)
|
||||
{
|
||||
u32 entry=0;
|
||||
u32 entry;
|
||||
PXI_Reset();
|
||||
|
||||
GPU_Init();
|
||||
@ -58,6 +59,8 @@ void main(void)
|
||||
GPU_SetFramebufferMode(0, PDC_RGB24);
|
||||
GPU_SetFramebufferMode(1, PDC_RGB24);
|
||||
|
||||
I2C_writeReg(I2C_DEV_MCU, 0x22, 0x2A);
|
||||
|
||||
GIC_Reset();
|
||||
GIC_SetIRQ(IRQ_PXI_SYNC, PXI_IRQHandler);
|
||||
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;
|
||||
}
|
||||
|
||||
void ScreenOn() {
|
||||
wait_msec(3); // wait 3ms (cause profi200 said so)
|
||||
I2C_writeReg(I2C_DEV_MCU, 0x22, 0x2A); // poweron LCD
|
||||
}
|
||||
|
||||
void Reboot() {
|
||||
I2C_writeReg(I2C_DEV_MCU, 0x22, 1 << 0); // poweroff LCD to prevent MCU hangs
|
||||
flushEntireDCache();
|
||||
|
@ -1,12 +1,13 @@
|
||||
#include "godmode.h"
|
||||
#include "power.h"
|
||||
#include "pxi.h"
|
||||
|
||||
void main(int argc, char** argv)
|
||||
{
|
||||
(void) argv; // unused for now
|
||||
|
||||
// Screen on
|
||||
ScreenOn();
|
||||
// Wait for ARM11
|
||||
PXI_WaitRemote(PXI_READY);
|
||||
|
||||
// Run the main program
|
||||
if (GodMode(argc) == GODMODE_EXIT_REBOOT) Reboot();
|
||||
|
@ -116,13 +116,6 @@ _start_gm:
|
||||
strlt r3, [r2], #4
|
||||
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
|
||||
ldr r1, =(CR_ALT_VECTORS | CR_DISABLE_TBIT)
|
||||
ldr r2, =(CR_ENABLE_MPU | CR_ENABLE_DCACHE | CR_ENABLE_ICACHE | \
|
||||
|
Loading…
x
Reference in New Issue
Block a user