Fix backlight turning on issue

This commit is contained in:
Wolfvak 2017-08-22 23:23:17 -03:00 committed by d0k3
parent 5104deff9e
commit 1a65b4e7f0
10 changed files with 67 additions and 104 deletions

View File

@ -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'`)\""

View File

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

View File

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

View File

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

View File

@ -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();

View File

@ -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();

View File

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

View File

@ -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();

View File

@ -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();

View File

@ -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 | \