summaryrefslogtreecommitdiff
path: root/software/rda1846dongle/rda1846.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/rda1846dongle/rda1846.c')
-rw-r--r--software/rda1846dongle/rda1846.c79
1 files changed, 60 insertions, 19 deletions
diff --git a/software/rda1846dongle/rda1846.c b/software/rda1846dongle/rda1846.c
index 6c14aae..46b29cc 100644
--- a/software/rda1846dongle/rda1846.c
+++ b/software/rda1846dongle/rda1846.c
@@ -25,25 +25,7 @@
#include <stdio.h>
#include "rda1846.h"
-
-#define RDA1846_CHIP_ADDR 0xE2
-#define RDA1846_ADDR_W (0<<7)
-#define RDA1846_ADDR_R (1<<7)
-#define RDA1846_ADDR_LIMIT 0x7F
-
-#define RDA1846_RF_BAND_2M 0x00C0
-#define RDA1846_BAND_LOW 134000
-#define RDA1846_BAND_HIGH 174000
-#define RDA1846_XTAL_FREQ 12288
-#define RDA1846_ADCLK_FREQ 6144
-#define RDA1846_CLK_MODE (1<<0)
-
-#define RDA1846_REG_CLK_MODE 0x04
-#define RDA1846_REG_RF_BAND 0x0F
-#define RDA1846_REG_FREQH 0x29
-#define RDA1846_REG_FREQL 0x2A
-#define RDA1846_REG_XTAL 0x2B
-#define RDA1846_REG_ADCLK 0x2C
+#include "rda1846_defines.h"
static uint8_t rda1846_write_register_raw(const uint8_t addr, const uint16_t data)
{
@@ -135,6 +117,65 @@ void rda1846_init(void)
rda1846_write_register(RDA1846_REG_XTAL, RDA1846_XTAL_FREQ);
rda1846_write_register(RDA1846_REG_ADCLK, RDA1846_ADCLK_FREQ);
rda1846_write_register(RDA1846_REG_CLK_MODE, RDA1846_CLK_MODE);
+
+ rda1846_write_register(RDA1846_REG_CTL, RDA1846_CTL_CH_12K5 | RDA1846_CTL_RX_M_TX_M | RDA1846_CTL_RX);
+ rda1846_write_register(RDA1846_REG_INT, RDA1846_INT_DTMF_IDLE);
+
+ // use this if VOX, SQ, TXON_RF, RXON_RF are meant as outputs
+ rda1846_write_register(RDA1846_REG_GPIO, RDA1846_GPIO_7_VOX | RDA1846_GPIO_6_SQ |
+ RDA1846_GPIO_5_TXON_RF | RDA1846_GPIO_4_RXON_RF |
+ RDA1846_GPIO_2_INT);
+ // use this if VOX, SQ, TXON_RF, RXON_RF are meant as inputs
+// rda1846_write_register(RDA1846_REG_GPIO, RDA1846_GPIO_2_INT);
+
+ rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_NONE);
+ rda1846_write_register(RDA1846_REG_DTMF_CTL, RDA1846_DTMF_DUAL | RDA1846_DTMF_EN);
+}
+
+void rda1846_soft_reset(void)
+{
+ rda1846_write_register(RDA1846_REG_CTL, RDA1846_CTL_SOFT_RST);
+}
+
+
+int16_t rda1846_get_rssi(void)
+{
+ uint16_t data;
+ if(rda1846_read_register(RDA1846_REG_RSSI, &data))
+ return -1;
+
+ return (int16_t)data;
+}
+
+int16_t rda1846_get_vssi(void)
+{
+ uint16_t data;
+ if(rda1846_read_register(RDA1846_REG_VSSI, &data))
+ return -1;
+
+ return (int16_t)data;
+}
+
+uint16_t rda1846_get_flags(void)
+{
+ uint16_t data;
+ if(rda1846_read_register(RDA1846_REG_VSSI, &data))
+ return 0xFFFF;
+
+ return data;
+}
+
+uint8_t rda1846_get_dtmf(uint8_t* idx1, uint8_t* idx2, uint8_t* code)
+{
+ uint16_t data;
+ if(rda1846_read_register(RDA1846_REG_DTMF_OUT, &data))
+ return 1;
+
+ if(idx1) *idx1 = (uint8_t)((data & 0x0380)>>7);
+ if(idx2) *idx2 = (uint8_t)((data & 0x0070)>>4);
+ if(code) *code = (uint8_t)(data & 0x000F);
+
+ return 0;
}
int32_t rda1846_get_freq_kHz(void)