summaryrefslogtreecommitdiff
path: root/include/libnds/nds/system.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/libnds/nds/system.h')
-rw-r--r--include/libnds/nds/system.h248
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