Last active
July 23, 2025 14:52
-
-
Save kynex7510/8aee8daed4e593c4bdcd1cc7f6f3a6c6 to your computer and use it in GitHub Desktop.
libn3ds stereoscopic 3D
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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