added MCO function for oscillator debugging

remotes/github/master
Ondřej Hruška 6 years ago
parent f9200fcc7d
commit e046be30b2
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 6
      framework/settings.c
  2. 76
      framework/system_settings.c
  3. 5
      framework/system_settings.h

@ -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();
}
}

@ -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<<SystemSettings.mco_prediv));
}
/**
@ -77,15 +119,37 @@ void systemsettings_build_ini(IniWriter *iw)
bool systemsettings_load_ini(const char *restrict key, const char *restrict value)
{
bool suc = true;
if (streq(key, "expose_vcom")) {
if (streq(key, "expose-vcom")) {
bool yn = cfg_bool_parse(value, &suc);
if (suc) SystemSettings.visible_vcom = yn;
}
if (streq(key, "ini_comments")) {
if (streq(key, "ini-comments")) {
bool yn = cfg_bool_parse(value, &suc);
if (suc) SystemSettings.ini_comments = yn;
}
if (streq(key, "mco-enable")) {
bool yn = cfg_bool_parse(value, &suc);
if (suc) SystemSettings.enable_mco = yn;
}
if (streq(key, "mco-prediv")) {
int val = cfg_u8_parse(value, &suc);
if (suc) {
switch (val) {
case 1: SystemSettings.mco_prediv = 0; break;
case 2: SystemSettings.mco_prediv = 1; break;
case 4: SystemSettings.mco_prediv = 2; break;
case 8: SystemSettings.mco_prediv = 3; break;
case 16: SystemSettings.mco_prediv = 4; break;
case 32: SystemSettings.mco_prediv = 5; break;
case 64: SystemSettings.mco_prediv = 6; break;
default:
case 128: SystemSettings.mco_prediv = 7; break;
}
}
}
return suc;
}

@ -18,6 +18,8 @@
struct system_settings {
bool visible_vcom;
bool ini_comments;
bool enable_mco;
uint8_t mco_prediv;
// Support flags put here for scoping, but not atcually part of the persistent settings
volatile bool editable; //!< True if we booted with the LOCK jumper removed
@ -60,4 +62,7 @@ void systemsettings_build_ini(IniWriter *iw);
*/
bool systemsettings_load_ini(const char *restrict key, const char *restrict value);
void systemsettings_mco_teardown(void);
void systemsettings_mco_init(void);
#endif //GEX_SYSTEM_SETTINGS_H

Loading…
Cancel
Save