diff --git a/framework/settings.c b/framework/settings.c index 2673dae..c1b6213 100644 --- a/framework/settings.c +++ b/framework/settings.c @@ -300,7 +300,6 @@ void settings_load_ini_begin(void) SystemSettings.loading_inifile = 0; } - void settings_load_ini_key(const char *restrict section, const char *restrict key, const char *restrict value) { // dbg("[%s] %s = %s", section, key, value); @@ -312,6 +311,7 @@ void settings_load_ini_key(const char *restrict section, const char *restrict ke if (streq(section, "SYSTEM")) { if (SystemSettings.loading_inifile == 0) { SystemSettings.loading_inifile = 'S'; + systemsettings_mco_teardown(); systemsettings_loadDefaults(); } @@ -356,4 +356,8 @@ void settings_load_ini_end(void) bool suc = ureg_finalize_all_init(); if (!suc) dbg("Some units failed to init!!"); } + + if (SystemSettings.loading_inifile == 'S') { + systemsettings_mco_init(); + } } diff --git a/framework/system_settings.c b/framework/system_settings.c index 73f8ae7..ec8c780 100644 --- a/framework/system_settings.c +++ b/framework/system_settings.c @@ -7,6 +7,8 @@ #include "utils/str_utils.h" #include "platform/lock_jumper.h" #include "cfg_utils.h" +#include "resources.h" +#include "unit_base.h" struct system_settings SystemSettings; @@ -15,6 +17,8 @@ void systemsettings_loadDefaults(void) { SystemSettings.visible_vcom = true; SystemSettings.ini_comments = true; + SystemSettings.enable_mco = false; + SystemSettings.mco_prediv = 7; } /** Load defaults and init flags */ @@ -31,18 +35,45 @@ void systemsettings_init(void) void systemsettings_save(PayloadBuilder *pb) { pb_char(pb, 'S'); - pb_u8(pb, 0); // settings format version + pb_u8(pb, 1); // settings format version { // system settings pb_bool(pb, SystemSettings.visible_vcom); pb_bool(pb, SystemSettings.ini_comments); + + pb_bool(pb, SystemSettings.enable_mco); + pb_u8(pb, SystemSettings.mco_prediv); } // end system settings } +void systemsettings_mco_teardown(void) +{ + if (SystemSettings.enable_mco) { + rsc_free(&UNIT_SYSTEM, R_PA8); + LL_RCC_ConfigMCO(LL_RCC_MCO1SOURCE_NOCLOCK, 0); + } +} + +void systemsettings_mco_init(void) +{ + if (SystemSettings.enable_mco) { + assert_param(rsc_claim(&UNIT_SYSTEM, R_PA8) == E_SUCCESS); + + assert_param(E_SUCCESS == hw_configure_gpiorsc_af(R_PA8, LL_GPIO_AF_0)); + LL_RCC_ConfigMCO(LL_RCC_MCO1SOURCE_SYSCLK, + SystemSettings.mco_prediv << RCC_CFGR_MCOPRE_Pos); + } else { + LL_RCC_ConfigMCO(LL_RCC_MCO1SOURCE_NOCLOCK, 0); + } +} + // from binary bool systemsettings_load(PayloadParser *pp) { if (pp_char(pp) != 'S') return false; + + systemsettings_mco_teardown(); + uint8_t version = pp_u8(pp); { // system settings @@ -50,9 +81,14 @@ bool systemsettings_load(PayloadParser *pp) SystemSettings.ini_comments = pp_bool(pp); // conditional fields based on version - (void) version; + if (version >= 1) { + SystemSettings.enable_mco = pp_bool(pp); + SystemSettings.mco_prediv = pp_u8(pp); + } } // end system settings + systemsettings_mco_init(); + return pp->ok; } @@ -65,10 +101,16 @@ void systemsettings_build_ini(IniWriter *iw) iw_section(iw, "SYSTEM"); iw_comment(iw, "Data link accessible as virtual comport (Y, N)"); - iw_entry(iw, "expose_vcom", str_yn(SystemSettings.visible_vcom)); + iw_entry_s(iw, "expose-vcom", str_yn(SystemSettings.visible_vcom)); iw_comment(iw, "Show comments in INI files (Y, N)"); - iw_entry(iw, "ini_comments", str_yn(SystemSettings.ini_comments)); + iw_entry_s(iw, "ini-comments", str_yn(SystemSettings.ini_comments)); + + iw_cmt_newline(iw); + iw_comment(iw, "Output core clock on PA8 (Y, N)"); + iw_entry_s(iw, "mco-enable", str_yn(SystemSettings.enable_mco)); + iw_comment(iw, "Output clock prediv (1,2,...,128)"); + iw_entry_d(iw, "mco-prediv", (1<