Skip to content

Instantly share code, notes, and snippets.

@kynex7510
Last active July 23, 2025 14:52
Show Gist options
  • Select an option

  • Save kynex7510/8aee8daed4e593c4bdcd1cc7f6f3a6c6 to your computer and use it in GitHub Desktop.

Select an option

Save kynex7510/8aee8daed4e593c4bdcd1cc7f6f3a6c6 to your computer and use it in GitHub Desktop.
libn3ds stereoscopic 3D
// Common expander presets used by the QTM sysmodule.
static const u16 g_ExpanderPresetsHigh[14] = {
0x1C0F,
0x181F,
0x103F,
0x107E,
0x10FC,
0x11F8,
0x13F0,
0x17E0,
0x1FC0,
0x1F81,
0x1F03,
0x1E07,
0x1FFF, // 2D.
0x11F0, // O3DS (SS3D disabled).
};
static const u16 g_ExpanderPresetsLow[14] = {
0x3F0,
0x7E0,
0xFC0,
0xF81,
0xF03,
0xE07,
0xC0F,
0x81F,
0x3F,
0x7E,
0xFC,
0x1F8,
0, // 2D.
0xE0F // O3DS (SS3D disabled).
};
// Many thanks to TuxSH.
static inline void expanderInit(void) {
GPIO_config(GPIO_3_11, GPIO_OUTPUT);
GPIO_write(GPIO_3_11, 1);
const u16 zero = 0;
I2C_writeArray(I2C_DEV_IO_EXP, 6, &zero, sizeof(u16));
I2C_writeArray(I2C_DEV_IO_EXP, 2, &zero, sizeof(u16));
}
static inline void expanderExit(void) {
GPIO_config(GPIO_3_11, GPIO_OUTPUT);
GPIO_write(GPIO_3_11, 0);
}
static inline void setExpanderPresets(u16 polarityHigh, u16 polarityLow) {
I2C_writeArray(I2C_DEV_IO_EXP, 2, &polarityHigh, sizeof(u16));
I2C_writeArray(I2C_DEV_IO_EXP, 2, &polarityLow, sizeof(u16));
}
static void enable3DEffect(McuSysModel model) {
if (model == SYS_MODEL_3DS || model == SYS_MODEL_3DS_XL) {
getLcdRegs()->parallax_cnt = (PARALLAX_CNT_PWM0_EN | PARALLAX_CNT_PWM1_EN);
} else if (model == SYS_MODEL_N3DS || model == SYS_MODEL_N3DS_XL) {
expanderInit();
setExpanderPresets(g_ExpanderPresetsHigh[13], g_ExpanderPresetsLow[13]);
}
GFX_setFormat(GFX_BGR8, GFX_BGR565, GFX_TOP_3D);
// TODO: luminance.
}
static void disable3DEffect(McuSysModel model) {
if (model == SYS_MODEL_3DS || model == SYS_MODEL_3DS_XL) {
getLcdRegs()->parallax_cnt = 0;
} else if (model == SYS_MODEL_N3DS || model == SYS_MODEL_N3DS_XL) {
expanderExit();
}
GFX_setFormat(GFX_BGR8, GFX_BGR565, GFX_TOP_2D);
GFX_setLcdLuminance(80);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment