OpenRTX/platform/drivers/baseband/HR_C6000.h

117 wiersze
3.9 KiB
C++

/***************************************************************************
* Copyright (C) 2021 - 2025 by Federico Amedeo Izzo IU2NUO, *
* Niccolò Izzo IU2KIN *
* Frederik Saraci IU2NRO *
* Silvano Seva IU2KWO *
* *
* 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 3 of the License, 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; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#ifndef HRC6000_H
#define HRC6000_H
#include <datatypes.h>
#include "HR_Cx000.h"
enum class C6000_SpiOpModes : uint8_t
{
AUX = 1, ///< Auxiliary configuration registers.
DATA = 2, ///< Write TX data register and read RX data register.
SOUND = 3, ///< Voice prompt sample register.
CONFIG = 4, ///< Main configuration registers.
AMBE3K = 5, ///< AMBE3000 configuration register.
DATA_R = 6, ///< Write RX data register and read TX data register.
AMBE1K = 7 ///< AMBE1000 configuration register.
};
class HR_C6000 : public HR_Cx000 < C6000_SpiOpModes >
{
public:
/**
* Constructor.
*
* @param uSpi: pointer to SPI device for "user" SPI interface.
* @param uCs: gpioPin object for "user" SPI chip select.
*/
HR_C6000(const struct spiDevice *uSpi, const struct gpioPin uCs) :
HR_Cx000< C6000_SpiOpModes >(uSpi, uCs) { }
/**
* Configure CTCSS tone transmission.
*
* @param tone: CTCSS tone frequency.
* @param deviation: CTCSS tone deviation.
*/
void setTxCtcss(const tone_t tone, const uint8_t deviation);
/**
* Configure CTCSS tone detection.
*
* @param tone: CTCSS tone frequency.
*/
void setRxCtcss(const tone_t tone);
/**
* Test if RX CTCSS tone has been detected.
*
* @return true if RX CTCSS tone has been detected.
*/
inline bool ctcssDetected()
{
uint8_t reg = readCfgRegister(0x93);
return ((reg & 0x01) != 0) ? true : false;
}
/**
* Disable all tone encode and decode.
*/
inline void disableTones()
{
writeCfgRegister(0xA1, 0x00); // Disable all tones
}
/**
* Transmit a tone of a given frequency.
*
* @param freq: tone frequency in Hz.
* @param deviation: tone deviation.
*/
void sendTone(const uint32_t freq, const uint8_t deviation);
private:
/**
* Write a register with 16-bit address.
*
* @param opMode: "operating mode" specifier, see datasheet for details.
* @param addr: register address.
* @param value: value to be written.
*/
void writeReg16(const C6000_SpiOpModes opMode, const uint16_t addr, const uint8_t value)
{
uint8_t data[4];
data[0] = static_cast< uint8_t >(opMode) | 0x40;
data[2] = (addr >> 8) & 0x07;
data[1] = addr & 0xFF;
data[3] = value;
ScopedChipSelect cs(uSpi, uCs);
spi_send(uSpi, data, 4);
}
};
#endif /* HRC6000_H */