Here is the source code for it.
brightness.s:
Code:
.thumb
@ all of the following are 16 bit
.equ REG_SPICNT, 0x040001C0
.equ REG_SPIDATA, 0x040001C2
.equ REG_KEYINPUT, 0x04000130
.equ KEYS_L_R_SELECT, ((1<<9) | (1<<8) | (1<<2))
.equ KEYS_UP, (1<<6)
.equ KEYS_DOWN, (1<<7)
.equ PM_CONTROL_REG, 0
.equ PM_LITE_BRIGHT_REG, 4
.equ PM_BACKLIGHTS, ((1<<2) | (1<<3))
.equ SPI_BUSY, 0x80
cheat_header:
.word 0x94000130, ((~KEYS_L_R_SELECT & 0xFFFF) << 16) @ Button activator
.word 0xC2000001, (brightnessHandler_end - brightnessHandler) @ Execute custom function in thumb mode
brightnessHandler:
push {r4-r7, lr}
adr r2, old_key_state
ldr r4, =REG_KEYINPUT
ldrh r3, [r4] @ Current key state
ldrh r1, [r2] @ Old key state
strh r3, [r2] @ Save current key state for next time
cmp r3, r1 @ if keys in same state as before
beq brightnessHandler_exit
@ must be done before calling readPowerMangement or writePowerManagement
add r4, #(REG_SPICNT - REG_KEYINPUT)
mov r5, #SPI_BUSY
@ Old power management setting
mov r0, #PM_CONTROL_REG
bl readPowerMangement
mov r6, r0 @ r6 = old power management setting
@ Old backlight level setting
mov r0, #PM_LITE_BRIGHT_REG
bl readPowerMangement
mov r7, #0x03
and r7, r0 @ r7 = old backlight level setting
mov r1, #KEYS_UP
tst r3, r1
beq brightnessHandler_keyUp
mov r1, #KEYS_DOWN
tst r3, r1
beq brightnessHandler_keyDown
b brightnessHandler_exit
brightnessHandler_keyUp:
@ enable backlights if off
mov r1, #PM_BACKLIGHTS
tst r1, r6
beq brightnessHandler_turnOnScreens
@ increase brightness
cmp r7, #0x03
beq brightnessHandler_exit
add r1, r7, #1
mov r0, #PM_LITE_BRIGHT_REG
bl writePowerManagement
b brightnessHandler_exit
brightnessHandler_turnOnScreens:
@ enable backlights
orr r1, r6
b brightnessHandler_setScreenStatus
brightnessHandler_keyDown:
@ get ready to disable backlights if needed
mov r1, #PM_BACKLIGHTS
bic r6, r1
mov r1, r6
@ turn off screens if already on lowest level
cmp r7, #0x00
beq brightnessHandler_setScreenStatus
@ reduce brightness
sub r1, r7, #1
mov r0, #PM_LITE_BRIGHT_REG
bl writePowerManagement
b brightnessHandler_exit
brightnessHandler_setScreenStatus:
@ set new power management control
mov r0, #PM_CONTROL_REG
bl writePowerManagement
brightnessHandler_exit:
pop {r4-r7}
pop {r3}
bx r3
old_key_state:
.hword 0x0000
readPowerMangement:
add r0, #(1<<7)
mov r1, #0
@ fall through to _writePowerManagement
writePowerManagement: @ (reg, command)
@ while (REG_SPICNT & SPI_BUSY);
writePowerManagement_loop1:
ldrh r2, [r4]
tst r2, r5
bne writePowerManagement_loop1
@ REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHZ | SPI_BYTE_MODE | SPI_CONTINUOUS | SPI_DEVICE_POWER;
ldr r2, =((1<<15) | 2 | (0<<10) | (1<<11) | (0<<8)) | (((1<<15) | 2 | (0<<10) | (0<<8)) << 16)
strh r2, [r4]
@ REG_SPIDATA = reg;
strh r0, [r4, #2]
@ while (REG_SPICNT & SPI_BUSY);
writePowerManagement_loop2:
ldrh r0, [r4]
tst r0, r5
bne writePowerManagement_loop2
@ REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHZ | SPI_BYTE_MODE | SPI_DEVICE_POWER;
lsr r2, #16
strh r2, [r4]
@ REG_SPIDATA = command;
strh r1, [r4, #2]
@ while (REG_SPICNT & SPI_BUSY);
writePowerManagement_loop3:
ldrh r2, [r4]
tst r2, r5
bne writePowerManagement_loop3
@ return REG_SPIDATA & 0xFF;
ldrh r0, [r4, #2]
mov r1, #0xff
and r0, r1
bx lr
constant_pool:
.pool
.align 3
brightnessHandler_end:
cheat_footer:
.word 0xd2000000, 0x00000000 @ End if
Makefile:
Code:
include $(DEVKITARM)/ds_rules
brightness.cht : brightness.bin
@od -A n -t x4 -w8 $< > $@
@echo Raw cheat codes written to $@
brightness.bin : brightness.o
$(OBJCOPY) -O binary $< $@
brightness.o : brightness.s