added MCO function for oscillator debugging
This commit is contained in:
@@ -300,7 +300,6 @@ void settings_load_ini_begin(void)
|
|||||||
SystemSettings.loading_inifile = 0;
|
SystemSettings.loading_inifile = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void settings_load_ini_key(const char *restrict section, const char *restrict key, const char *restrict value)
|
void settings_load_ini_key(const char *restrict section, const char *restrict key, const char *restrict value)
|
||||||
{
|
{
|
||||||
// dbg("[%s] %s = %s", section, key, 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 (streq(section, "SYSTEM")) {
|
||||||
if (SystemSettings.loading_inifile == 0) {
|
if (SystemSettings.loading_inifile == 0) {
|
||||||
SystemSettings.loading_inifile = 'S';
|
SystemSettings.loading_inifile = 'S';
|
||||||
|
systemsettings_mco_teardown();
|
||||||
systemsettings_loadDefaults();
|
systemsettings_loadDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,4 +356,8 @@ void settings_load_ini_end(void)
|
|||||||
bool suc = ureg_finalize_all_init();
|
bool suc = ureg_finalize_all_init();
|
||||||
if (!suc) dbg("Some units failed to 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 "utils/str_utils.h"
|
||||||
#include "platform/lock_jumper.h"
|
#include "platform/lock_jumper.h"
|
||||||
#include "cfg_utils.h"
|
#include "cfg_utils.h"
|
||||||
|
#include "resources.h"
|
||||||
|
#include "unit_base.h"
|
||||||
|
|
||||||
struct system_settings SystemSettings;
|
struct system_settings SystemSettings;
|
||||||
|
|
||||||
@@ -15,6 +17,8 @@ void systemsettings_loadDefaults(void)
|
|||||||
{
|
{
|
||||||
SystemSettings.visible_vcom = true;
|
SystemSettings.visible_vcom = true;
|
||||||
SystemSettings.ini_comments = true;
|
SystemSettings.ini_comments = true;
|
||||||
|
SystemSettings.enable_mco = false;
|
||||||
|
SystemSettings.mco_prediv = 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Load defaults and init flags */
|
/** Load defaults and init flags */
|
||||||
@@ -31,18 +35,45 @@ void systemsettings_init(void)
|
|||||||
void systemsettings_save(PayloadBuilder *pb)
|
void systemsettings_save(PayloadBuilder *pb)
|
||||||
{
|
{
|
||||||
pb_char(pb, 'S');
|
pb_char(pb, 'S');
|
||||||
pb_u8(pb, 0); // settings format version
|
pb_u8(pb, 1); // settings format version
|
||||||
|
|
||||||
{ // system settings
|
{ // system settings
|
||||||
pb_bool(pb, SystemSettings.visible_vcom);
|
pb_bool(pb, SystemSettings.visible_vcom);
|
||||||
pb_bool(pb, SystemSettings.ini_comments);
|
pb_bool(pb, SystemSettings.ini_comments);
|
||||||
|
|
||||||
|
pb_bool(pb, SystemSettings.enable_mco);
|
||||||
|
pb_u8(pb, SystemSettings.mco_prediv);
|
||||||
} // end system settings
|
} // 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
|
// from binary
|
||||||
bool systemsettings_load(PayloadParser *pp)
|
bool systemsettings_load(PayloadParser *pp)
|
||||||
{
|
{
|
||||||
if (pp_char(pp) != 'S') return false;
|
if (pp_char(pp) != 'S') return false;
|
||||||
|
|
||||||
|
systemsettings_mco_teardown();
|
||||||
|
|
||||||
uint8_t version = pp_u8(pp);
|
uint8_t version = pp_u8(pp);
|
||||||
|
|
||||||
{ // system settings
|
{ // system settings
|
||||||
@@ -50,9 +81,14 @@ bool systemsettings_load(PayloadParser *pp)
|
|||||||
SystemSettings.ini_comments = pp_bool(pp);
|
SystemSettings.ini_comments = pp_bool(pp);
|
||||||
|
|
||||||
// conditional fields based on version
|
// 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
|
} // end system settings
|
||||||
|
|
||||||
|
systemsettings_mco_init();
|
||||||
|
|
||||||
return pp->ok;
|
return pp->ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,10 +101,16 @@ void systemsettings_build_ini(IniWriter *iw)
|
|||||||
iw_section(iw, "SYSTEM");
|
iw_section(iw, "SYSTEM");
|
||||||
|
|
||||||
iw_comment(iw, "Data link accessible as virtual comport (Y, N)");
|
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_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 systemsettings_load_ini(const char *restrict key, const char *restrict value)
|
||||||
{
|
{
|
||||||
bool suc = true;
|
bool suc = true;
|
||||||
if (streq(key, "expose_vcom")) {
|
if (streq(key, "expose-vcom")) {
|
||||||
bool yn = cfg_bool_parse(value, &suc);
|
bool yn = cfg_bool_parse(value, &suc);
|
||||||
if (suc) SystemSettings.visible_vcom = yn;
|
if (suc) SystemSettings.visible_vcom = yn;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (streq(key, "ini_comments")) {
|
if (streq(key, "ini-comments")) {
|
||||||
bool yn = cfg_bool_parse(value, &suc);
|
bool yn = cfg_bool_parse(value, &suc);
|
||||||
if (suc) SystemSettings.ini_comments = yn;
|
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;
|
return suc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
struct system_settings {
|
struct system_settings {
|
||||||
bool visible_vcom;
|
bool visible_vcom;
|
||||||
bool ini_comments;
|
bool ini_comments;
|
||||||
|
bool enable_mco;
|
||||||
|
uint8_t mco_prediv;
|
||||||
|
|
||||||
// Support flags put here for scoping, but not atcually part of the persistent settings
|
// 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
|
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);
|
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
|
#endif //GEX_SYSTEM_SETTINGS_H
|
||||||
|
|||||||
Reference in New Issue
Block a user