diff options
Diffstat (limited to 'include/libnds/nds/system.h')
-rw-r--r-- | include/libnds/nds/system.h | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/include/libnds/nds/system.h b/include/libnds/nds/system.h new file mode 100644 index 0000000000..8e4e5b5920 --- /dev/null +++ b/include/libnds/nds/system.h @@ -0,0 +1,248 @@ +/*--------------------------------------------------------------------------------- + Power control, keys, and HV clock registers + + Copyright (C) 2005 + Jason Rogers (dovoto) + Dave Murphy (WinterMute) + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any + damages arising from the use of this software. + + Permission is granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you use + this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and + must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. + +---------------------------------------------------------------------------------*/ + +//! NDS hardware definitions. +/*! \file system.h + + These definitions are usually only touched during + the initialization of the program. +*/ + +#ifndef NDS_SYSTEM_INCLUDE +#define NDS_SYSTEM_INCLUDE + +//! LCD status register. +#define REG_DISPSTAT (*(vu16*)0x04000004) + +//! The display currently in a vertical blank. +#define DISP_IN_VBLANK BIT(0) + +//! The display currently in a horizontal blank. +#define DISP_IN_HBLANK BIT(1) + +//! Current scanline and %DISP_Y match. +#define DISP_YTRIGGERED BIT(2) + +//! Interrupt on vertical blank. +#define DISP_VBLANK_IRQ BIT(3) + +//! Interrupt on horizontal blank. +#define DISP_HBLANK_IRQ BIT(4) + +//! Interrupt when current scanline and %DISP_Y match. +#define DISP_YTRIGGER_IRQ BIT(5) + +static inline +void SetYtrigger(int Yvalue) { + REG_DISPSTAT = (REG_DISPSTAT & 0x007F ) | (Yvalue << 8) | (( Yvalue & 0x100 ) >> 2) ; +} + +//! Current display scanline. +#define REG_VCOUNT (*(vu16*)0x4000006) + + +//! Halt control register. +/*! Writing 0x40 to HALT_CR activates GBA mode. + %HALT_CR can only be accessed via the BIOS. +*/ +#define HALT_CR (*(vuint16*)0x04000300) + +//! Power control register. +/*! This register controls what hardware should + be turned on or off. +*/ +#define REG_POWERCNT *(vu16*)0x4000304 + +//! Turns on specified hardware. +/*! This function should only be called after %powerSET. + + \param on What to power on. +*/ +static inline +void powerON(int on) { REG_POWERCNT |= on;} + +//! Turns on only the specified hardware. +/*! Use this function to power on basic hardware types you + wish to use throughout your program. + + \param on What to power on. +*/ +static inline void powerSET(int on) { REG_POWERCNT = on;} + +//! Turns off the specified hardware. +/*! \param off What to power off. +*/ +static inline void powerOFF(int off) { REG_POWERCNT &= ~off;} + +#ifdef ARM9 +#ifdef DOXYGEN +//! Power-controlled hardware devices accessable to the ARM9. +/*! Used with %powerON, %powerSET, and %powerOFF functions. + Note that these should only be used when programming for + the ARM9. Trying to boot up these hardware devices via + the ARM7 would lead to unexpected results. +*/ +enum ARM9_power +{ + POWER_LCD, //!< Controls the power for both LCD screens. + POWER_2D_A, //!< Controls the power for the main 2D core. + POWER_MATRIX, //!< Controls the power for the 3D matrix. + POWER_3D_CORE, //!< Controls the power for the main 3D core. + POWER_2D_B, //!< Controls the power for the sub 2D core. + POWER_SWAP_LCDS, //!< Controls which screen should use the main core. +}; +#else +#define POWER_LCD BIT(0) +#define POWER_2D_A BIT(1) +#define POWER_MATRIX BIT(2) +#define POWER_3D_CORE BIT(3) +#define POWER_2D_B BIT(9) +#define POWER_SWAP_LCDS BIT(15) +#endif /* DOXYGEN */ + +//! Enables power to all hardware required for 2D video. +#define POWER_ALL_2D (POWER_LCD |POWER_2D_A |POWER_2D_B) + +//! Enables power to all hardware required for 3D video. +#define POWER_ALL (POWER_ALL_2D | POWER_3D_CORE | POWER_MATRIX) + +//! Switches the screens. +static inline void lcdSwap(void) { REG_POWERCNT ^= POWER_SWAP_LCDS; } + +//! Forces the main core to display on the top. +static inline void lcdMainOnTop(void) { REG_POWERCNT |= POWER_SWAP_LCDS; } + +//! Forces the main core to display on the bottom. +static inline void lcdMainOnBottom(void) { REG_POWERCNT &= ~POWER_SWAP_LCDS; } +#endif + +#ifdef ARM7 +#ifdef DOXYGEN +//! Power-controlled hardware devices accessable to the ARM7. +/*! Note that these should only be used when programming for + the ARM7. Trying to boot up these hardware devices via + the ARM9 would lead to unexpected results. +*/ +enum ARM7_power +{ + POWER_SOUND, //!< Controls the power for the sound controller. + POWER_UNKNOWN, //!< Controls the power for an unknown device. +}; +#else +#define POWER_SOUND BIT(0) +#define POWER_UNKNOWN BIT(1) +#endif /* DOXYGEN */ + +void readUserSettings(void); + +#endif /* ARM7 */ + +//! User's DS settings. +/*! \struct tPERSONAL_DATA + + Defines the structure the DS firmware uses for transfer + of the user's settings to the booted program. +*/ +typedef struct tPERSONAL_DATA { + u8 RESERVED0[2]; //!< ??? (0x05 0x00). + + u8 theme; //!< The user's theme color (0-15). + u8 birthMonth; //!< The user's birth month (1-12). + u8 birthDay; //!< The user's birth day (1-31). + + u8 RESERVED1[1]; //!< ??? + + s16 name[10]; //!< The user's name in UTF-16 format. + u16 nameLen; //!< The length of the user's name in characters. + + s16 message[26]; //!< The user's message. + u16 messageLen; //!< The length of the user's message in characters. + + u8 alarmHour; //!< What hour the alarm clock is set to (0-23). + u8 alarmMinute; //!< What minute the alarm clock is set to (0-59). + //0x027FFCD3 alarm minute + + u8 RESERVED2[4]; //!< ??? + //0x027FFCD4 ?? + + u16 calX1; //!< Touchscreen calibration: first X touch + u16 calY1; //!< Touchscreen calibration: first Y touch + u8 calX1px; //!< Touchscreen calibration: first X touch pixel + u8 calY1px; //!< Touchscreen calibration: first X touch pixel + + u16 calX2; //!< Touchscreen calibration: second X touch + u16 calY2; //!< Touchscreen calibration: second Y touch + u8 calX2px; //!< Touchscreen calibration: second X touch pixel + u8 calY2px; //!< Touchscreen calibration: second Y touch pixel + + packed_struct { + unsigned language : 3; //!< User's language. + unsigned gbaScreen : 1; //!< GBA screen selection (lower screen if set, otherwise upper screen). + unsigned defaultBrightness : 2; //!< Brightness level at power on, dslite. + unsigned autoMode : 1; //!< The DS should boot from the DS cart or GBA cart automatically if one is inserted. + unsigned RESERVED1 : 2; //!< ??? + unsigned settingsLost : 1; //!< User Settings Lost (0=Normal, 1=Prompt/Settings Lost) + unsigned RESERVED2 : 6; //!< ??? + } _user_data; + + u16 RESERVED3; + u32 rtcOffset; + u32 RESERVED4; +} PACKED PERSONAL_DATA ; + +//! Key input register. +/*! On the ARM9, the hinge "button," the touch status, and the + X and Y buttons cannot be accessed directly. +*/ +#define REG_KEYINPUT (*(vuint16*)0x04000130) + +//! Key input control register. +#define REG_KEYCNT (*(vuint16*)0x04000132) + +//! Default location for the user's personal data (see %PERSONAL_DATA). +#define PersonalData ((PERSONAL_DATA*)0x27FFC80) + +//! argv structure +/*! \struct __argv + + structure used to set up argc/argv on the DS + +*/ +struct __argv { + int argvMagic; //!< argv magic number, set to 0x5f617267 ('_arg') if valid + char *commandLine; //!< base address of command line, set of null terminated strings + int length; //!< total length of command line +}; + +//! Default location for the libnds argv structure. +#define libnds_argv ((struct __argv *)0x027FFF70) + +// argv struct magic number +#define argvMagic 0x5f617267 + +#endif |