athens: allow setting custom XTAL frequency.

This commit is contained in:
Maxim Poliakovski 2024-04-15 14:37:22 +02:00
parent ffa221192d
commit 781d9b46da
2 changed files with 9 additions and 2 deletions

View File

@ -54,7 +54,12 @@ AthensClocks::AthensClocks(uint8_t dev_addr)
// - dot clock VCO is disabled // - dot clock VCO is disabled
// - dot clock = reference clock / 2 // - dot clock = reference clock / 2
this->regs[AthensRegs::P2_MUX2] = 0x62; this->regs[AthensRegs::P2_MUX2] = 0x62;
}
AthensClocks::AthensClocks(uint8_t dev_addr, const float crystal_freq)
: AthensClocks(dev_addr)
{
this->xtal_freq = crystal_freq;
} }
void AthensClocks::start_transaction() void AthensClocks::start_transaction()
@ -132,13 +137,13 @@ int AthensClocks::get_dot_freq()
switch (mux) { switch (mux) {
case 0: // clock source -> dot cock VCO case 0: // clock source -> dot cock VCO
out_freq = ATHENS_XTAL * ((float)n2 / (float)(d2 * post_div)); out_freq = this->xtal_freq * ((float)n2 / (float)(d2 * post_div));
break; break;
case 1: // clock source -> system clock VCO case 1: // clock source -> system clock VCO
LOG_F(WARNING, "%s: system clock VCO not supported yet!", this->name.c_str()); LOG_F(WARNING, "%s: system clock VCO not supported yet!", this->name.c_str());
break; break;
case 2: // clock source -> crystal frequency case 2: // clock source -> crystal frequency
out_freq = ATHENS_XTAL / post_div; out_freq = this->xtal_freq / post_div;
break; break;
case 3: case 3:
LOG_F(WARNING, "%s: attempt to use reserved Mux value!", this->name.c_str()); LOG_F(WARNING, "%s: attempt to use reserved Mux value!", this->name.c_str());

View File

@ -53,6 +53,7 @@ class AthensClocks : public I2CDevice, public HWComponent
{ {
public: public:
AthensClocks(uint8_t dev_addr); AthensClocks(uint8_t dev_addr);
AthensClocks(uint8_t dev_addr, const float crystal_freq);
~AthensClocks() = default; ~AthensClocks() = default;
// I2CDevice methods // I2CDevice methods
@ -69,6 +70,7 @@ private:
uint8_t my_addr = 0; uint8_t my_addr = 0;
uint8_t reg_num = 0; uint8_t reg_num = 0;
int pos = 0; int pos = 0;
float xtal_freq = ATHENS_XTAL;
uint8_t regs[ATHENS_NUM_REGS] = {}; uint8_t regs[ATHENS_NUM_REGS] = {};
}; };