mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-08-12 10:53:42 +00:00
b2bf0f2459
* Added PRO button to analog_audio.cpp for debugging metallic ringing sounds in Audio app. Ensured consitency to 4MHz in analog_audio.cpp * Restored blutooth after loss. * Added several sampling rates to analog_audio for testing. * Ran format-code.sh * Fixed 0x03 mode for DC/Q-INV/Q-SHFT being set at every tuning and sample rate change. This was the root cause for loss of bluetooth before. Sample rate, and frequency can now be changed without need for manually resetting DC/Q-INV/Q-SHIFT settings. Updated method for setting frequncies in praline so that we have more testing options. * Ran format-code.sh and cleaned up stale comments. * Addressed comments, and removed commented line, opting for higher register values, 5E and 5D. Added WFM Debug View to support testing demodulation ringing. * Addressed comments in PR conversation to clean comments and ensure consistency at initializtion accross updated methods and displays. * Ran format-code.sh * Set initial legacy state. Improved readability of clocking initialization settings. Updated set_sampling_frequency, and udpate_bandwidth to set decimation values in the fpga_registers to avoid aliasing in low band frequencies. * Updated clock_manager to use correct clock and clock parameters for audio pll. Ran format-code.sh.
124 lines
3.4 KiB
C++
124 lines
3.4 KiB
C++
/*
|
|
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
|
*
|
|
* This file is part of PortaPack.
|
|
*
|
|
* 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 2, 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; see the file COPYING. If not, write to
|
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __CLOCK_MANAGER_H__
|
|
#define __CLOCK_MANAGER_H__
|
|
|
|
#include "string_format.hpp"
|
|
#include "ch.h"
|
|
#include "hal.h"
|
|
|
|
#include "i2c_pp.hpp"
|
|
#include "si5351.hpp"
|
|
|
|
#include "lpc43xx_cpp.hpp"
|
|
using namespace lpc43xx;
|
|
|
|
class ClockManager {
|
|
public:
|
|
enum ReferenceSource {
|
|
Xtal, /* 10 MHz crystal onboard the HackRF */
|
|
PortaPack, /* 10 MHz TCXO on 20180820 and newer PortaPack revisions. */
|
|
External, /* HackRF external clock input SMA, or from PortaPack with TCXO feature. */
|
|
};
|
|
using ReferenceFrequency = uint32_t;
|
|
|
|
typedef struct {
|
|
ReferenceSource source;
|
|
ReferenceFrequency frequency;
|
|
} Reference;
|
|
|
|
constexpr ClockManager(
|
|
I2C& i2c0,
|
|
si5351::Si5351& clock_generator)
|
|
: i2c0(i2c0),
|
|
clock_generator(clock_generator),
|
|
reference({ReferenceSource::Xtal, 10000000}) {
|
|
}
|
|
|
|
void init_clock_generator();
|
|
void shutdown();
|
|
|
|
void start_audio_pll();
|
|
void stop_audio_pll();
|
|
|
|
void set_base_audio_clock_divider(const size_t divisor);
|
|
|
|
void enable_codec_clocks();
|
|
void disable_codec_clocks();
|
|
|
|
void enable_if_clocks();
|
|
void disable_if_clocks();
|
|
|
|
void set_sampling_frequency(const uint32_t frequency);
|
|
|
|
uint32_t get_sampling_frequency() const {
|
|
return _base_band_frequency;
|
|
};
|
|
|
|
void set_reference_ppb(const int32_t ppb);
|
|
|
|
#ifdef PRALINE
|
|
uint8_t get_resampling_n() const { return _resampling_n; }
|
|
|
|
// Si5351 diagnostic methods
|
|
uint8_t si5351_read_status() { return clock_generator.device_status(); }
|
|
uint8_t si5351_read_register(uint8_t reg) { return clock_generator.read_register(reg); }
|
|
void si5351_write_register(uint8_t reg, uint8_t value) { clock_generator.write_register(reg, value); }
|
|
#endif
|
|
|
|
uint32_t get_frequency_monitor_measurement_in_hertz();
|
|
|
|
Reference get_reference() const;
|
|
std::string get_source();
|
|
std::string get_freq();
|
|
|
|
void enable_clock_output(bool enable);
|
|
|
|
private:
|
|
I2C& i2c0;
|
|
si5351::Si5351& clock_generator;
|
|
Reference reference;
|
|
|
|
uint32_t _base_band_frequency{20000000};
|
|
|
|
void set_gp_clkin_to_clkin_direct();
|
|
|
|
void start_frequency_monitor_measurement(const cgu::CLK_SEL clk_sel);
|
|
void wait_For_frequency_monitor_measurement_done();
|
|
|
|
void set_m4_clock_to_irc();
|
|
|
|
void set_m4_clock_to_pll1();
|
|
|
|
uint32_t measure_gp_clkin_frequency();
|
|
|
|
ReferenceSource detect_reference_source();
|
|
Reference choose_reference();
|
|
bool loss_of_signal();
|
|
|
|
#ifdef PRALINE
|
|
uint8_t _resampling_n{0}; // Current decimation factor (log2)
|
|
#endif
|
|
};
|
|
|
|
#endif /*__CLOCK_MANAGER_H__*/
|