#pragma once /* * This file is part of open_agb_firm * Copyright (C) 2023 derrek, profi200 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "types.h" #include "arm11/drivers/mcu_regmap.h" #ifdef __cplusplus extern "C" { #endif #define DEFAULT_MCU_IRQ_MASK (~(MCU_IRQ_TOP_BL_ON | MCU_IRQ_TOP_BL_OFF | MCU_IRQ_BOT_BL_ON | \ MCU_IRQ_BOT_BL_OFF | MCU_IRQ_LCD_POWER_ON | MCU_IRQ_LCD_POWER_OFF | \ MCU_IRQ_VOL_SLIDER_CHANGE | MCU_IRQ_BATT_CHARGE_START | \ MCU_IRQ_BATT_CHARGE_STOP | MCU_IRQ_ACC_DATA_READY | MCU_IRQ_ACC_RW_DONE | \ MCU_IRQ_WATCHDOG | MCU_IRQ_SHELL_OPEN | MCU_IRQ_SHELL_CLOSE | \ MCU_IRQ_WIFI_PRESS | MCU_IRQ_HOME_RELEASE | MCU_IRQ_HOME_PRESS | \ MCU_IRQ_POWER_HELD | MCU_IRQ_POWER_PRESS)) typedef struct { u8 s; // Second. u8 min; // Minute. u8 h; // Hour. u8 dow; // Unused day of week. u8 d; // Day. u8 mon; // Month. u8 y; // Year. } RtcTimeDate; typedef struct { u8 min; // Minute. u8 h; // Hour. u8 d; // Day. u8 mon; // Month. u8 y; // Year. } AlarmTimeDate; typedef struct { s16 x; s16 y; s16 z; } AccData; /*typedef struct { // 6 bytes timestamps. // 336 bytes step counts. } PedometerHistory;*/ typedef enum { SYS_MODEL_3DS = 0u, // Nintendo 3DS (CTR). SYS_MODEL_3DS_XL = 1u, // Nintendo 3DS LL/XL (SPR). SYS_MODEL_N3DS = 2u, // New Nintendo 3DS (KTR). SYS_MODEL_2DS = 3u, // Nintendo 2DS (FTR). SYS_MODEL_N3DS_XL = 4u, // New Nintendo 3DS LL/XL (RED). SYS_MODEL_N2DS_XL = 5u // New Nintendo 2DS LL/XL (JAN). } McuSysModel; // TODO: For most functions check if the return value on error makes sense. /** * @brief Initializes the MCU driver. For libn3ds internal usage only. */ void MCU_init(void); /** * @brief Reboots the MCU. * * @return Returns true on success and false on failure. */ //bool MCU_reboot(void); /** * @brief { function_description } * * @param[in] mask The mask * * @return { description_of_the_return_value } */ u32 MCU_getIrqs(u32 mask); /** * @brief { function_description } * * @param[in] mask The mask * * @return { description_of_the_return_value } */ u32 MCU_waitIrqs(u32 mask); /** * @brief Reads the MCU firmware version. * * @return Returns the MCU firmware version. */ u16 MCU_getFirmwareVersion(void); /** * @brief Reads MCU status bits. * * @return Returns the MCU status bits. */ u8 MCU_getStatus(void); /** * @brief { function_description } * * @param[in] status The status * * @return { description_of_the_return_value } */ bool MCU_setStatus(u8 status); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getLcdVcomTop(void); /** * @brief { function_description } * * @param[in] vcom The vcom * * @return { description_of_the_return_value } */ bool MCU_setLcdVcomTop(u8 vcom); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getLcdVcomBot(void); /** * @brief { function_description } * * @param[in] vcom The vcom * * @return { description_of_the_return_value } */ bool MCU_setLcdVcomBot(u8 vcom); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_get3dSliderPosition(void); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getVolumeSliderPosition(void); /** * @brief { function_description } * * @return { description_of_the_return_value } */ s8 MCU_getBatteryTemperature(void); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getBatteryLevel(void); /** * @brief { function_description } * * @return { description_of_the_return_value } */ float MCU_getBatteryVoltage(void); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u16 MCU_getExternalHardwareStatus(void); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u32 MCU_getIrqMask(void); /** * @brief { function_description } * * @param[in] mask The mask * * @return { description_of_the_return_value } */ bool MCU_setIrqMask(u32 mask); void MCU_sysPowerOff(void); void MCU_sysReboot(void); /** * @brief { function_description } * * @param[in] bits The bits * * @return { description_of_the_return_value } */ bool MCU_setTwlIrq(u8 bits); /** * @brief { function_description } * * @param[in] bits The bits */ void MCU_setLcdPower(u8 bits); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getPoweroffDelay(void); /** * @brief { function_description } * * @param[in] delay The delay * * @return { description_of_the_return_value } */ bool MCU_setPoweroffDelay(u8 delay); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getRegister0x25(void); /** * @brief { function_description } * * @param[in] data The data * * @return { description_of_the_return_value } */ bool MCU_setRegister0x25(u8 data); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getRegister0x26(void); /** * @brief { function_description } * * @param[in] data The data * * @return { description_of_the_return_value } */ bool MCU_setRegister0x26(u8 data); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getVolumeSliderPositionRaw(void); /** * @brief { function_description } * * @param[in] data The data * * @return { description_of_the_return_value } */ bool MCU_setVolumeSliderPositionRaw(u8 data); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getLedMasterBrightness(void); /** * @brief { function_description } * * @param[in] brightness The brightness * * @return { description_of_the_return_value } */ bool MCU_setLedMasterBrightness(u8 brightness); /** * @brief { function_description } * * @return The power led pattern. */ PwrLedPattern MCU_getPowerLedPattern(void); /** * @brief { function_description } * * @param[in] patt The pattern * * @return { description_of_the_return_value } */ bool MCU_setPowerLedPattern(const PwrLedPattern patt); /** * @brief { function_description } * * @param[in] patt The pattern * * @return { description_of_the_return_value } */ bool MCU_setLowPowerLedPattern(const u32 patt); // TODO: Figure out the pattern bytes. Apparently default 0x55555555. /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getWifiLedState(void); /** * @brief { function_description } * * @param[in] state The state * * @return { description_of_the_return_value } */ bool MCU_setWifiLedState(u8 state); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getCameraLedState(void); /** * @brief { function_description } * * @param[in] state The state * * @return { description_of_the_return_value } */ bool MCU_setCameraLedState(u8 state); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_get3dLedState(void); /** * @brief { function_description } * * @param[in] state The state * * @return { description_of_the_return_value } */ bool MCU_set3dLedState(u8 state); /** * @brief { function_description } * * @param[in] patt The pattern * * @return { description_of_the_return_value } */ bool MCU_setInfoLedPattern(const InfoLedPattern *const patt); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getInfoLedStatus(void); /** * @brief { function_description } * * @param timeDate The time date * * @return { description_of_the_return_value } */ bool MCU_getRtcTimeDate(RtcTimeDate *timeDate); /** * @brief { function_description } * * @param[in] timeDate The time date * * @return { description_of_the_return_value } */ bool MCU_setRtcTimeDate(const RtcTimeDate *timeDate); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getRtcErrorCorrection(void); /** * @brief { function_description } * * @param[in] correction The correction * * @return { description_of_the_return_value } */ bool MCU_setRtcErrorCorrection(u8 correction); /** * @brief { function_description } * * @param timeDate The time date * * @return { description_of_the_return_value } */ bool MCU_getAlarmTimeDate(AlarmTimeDate *timeDate); /** * @brief { function_description } * * @param[in] timeDate The time date * * @return { description_of_the_return_value } */ bool MCU_setAlarmTimeDate(const AlarmTimeDate *timeDate); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u16 MCU_getRtcTick(void); /** * @brief { function_description } * * @param[in] data The data * * @return { description_of_the_return_value } */ bool MCU_setRegister0x3F(u8 data); /** * @brief { function_description } * * @return The acc configuration. */ AccCfg MCU_getAccelerometerConfig(void); /** * @brief { function_description } * * @param[in] cfg The configuration * * @return { description_of_the_return_value } */ bool MCU_setAccelerometerConfig(AccCfg cfg); /** * @brief { function_description } * * @param[in] reg The register * * @return { description_of_the_return_value } */ u8 MCU_readAccelerometerRegister(u8 reg); /** * @brief { function_description } * * @param[in] reg The register * @param[in] data The data * * @return { description_of_the_return_value } */ bool MCU_writeAccelerometerRegister(u8 reg, u8 data); /** * @brief { function_description } * * @param samples The samples * * @return { description_of_the_return_value } */ bool MCU_getAccelerometerSamples(AccData *samples); /** * @brief { function_description } * * @param[in] steps The steps * * @return { description_of_the_return_value } */ bool MCU_setPedometerStepCount(u32 steps); // TODO: Reg 0x4E. /** * @brief { function_description } * * @param history The history * * @return { description_of_the_return_value } */ bool MCU_getPedometerHistory(u8 history[6 + 336]); // TODO: Struct. /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getRegister0x50(void); /** * @brief { function_description } * * @param[in] data The data * * @return { description_of_the_return_value } */ bool MCU_setRegister0x50(u8 data); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getRegister0x51(void); /** * @brief { function_description } * * @param[in] data The data * * @return { description_of_the_return_value } */ bool MCU_setRegister0x51(u8 data); /** * @brief { function_description } * * @param minMax The minimum maximum * * @return { description_of_the_return_value } */ bool MCU_getVolumeSliderCalibrationPoints(u8 minMax[2]); /** * @brief { function_description } * * @param[in] minMax The minimum maximum * * @return { description_of_the_return_value } */ bool MCU_setVolumeSliderCalibrationPoints(const u8 minMax[2]); /** * @brief { function_description } * * @param[in] off Off * @param out The out * @param[in] size The size * * @return { description_of_the_return_value } */ bool MCU_getFreeRamData(u8 off, u8 *out, u8 size); /** * @brief { function_description } * * @param[in] off Off * @param[in] in { parameter_description } * @param[in] size The size * * @return { description_of_the_return_value } */ bool MCU_setFreeRamData(u8 off, const u8 *in, u8 size); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getConsoleType(void); /** * @brief { function_description } * * @return The mcu system model. */ McuSysModel MCU_getSystemModel(void); /** * @brief { function_description } * * @return { description_of_the_return_value } */ u8 MCU_getEarlyButtonsHeld(void); /** * @brief Reads a single MCU register. * * @param[in] reg The MCU register to read. * * @return The MCU register data. */ u8 MCU_readReg(McuReg reg); /** * @brief Writes a single MCU register. * * @param[in] reg The MCU register to write. * @param[in] data The data to write. * * @return Returns true on success and false on failure. */ bool MCU_writeReg(McuReg reg, u8 data); /** * @brief Reads multiple MCU registers or buffers behind registers. * * @param[in] reg The MCU register(s) to read. * @param out The output data pointer. * @param[in] size The output buffer size. * * @return Returns true on success and false on failure. */ bool MCU_readRegArray(McuReg reg, void *out, u32 size); /** * @brief Writes multiple MCU registers or buffers behind registers. * * @param[in] reg The MCU register(s) to write. * @param[in] in The input data pointer. * @param[in] size The input data size. * * @return Returns true on success and false on failure. */ bool MCU_writeRegArray(McuReg reg, const void *const in, u32 size); #ifdef __cplusplus } // extern "C" #endif