summaryrefslogtreecommitdiff
path: root/software
diff options
context:
space:
mode:
Diffstat (limited to 'software')
-rw-r--r--software/rda1846dongle/rda1846.c95
-rw-r--r--software/rda1846dongle/rda1846.h8
-rw-r--r--software/rda1846dongle/rda1846_defines.h1
-rw-r--r--software/rda1846dongle/rda1846dongle.c20
4 files changed, 89 insertions, 35 deletions
diff --git a/software/rda1846dongle/rda1846.c b/software/rda1846dongle/rda1846.c
index c806036..fec9c05 100644
--- a/software/rda1846dongle/rda1846.c
+++ b/software/rda1846dongle/rda1846.c
@@ -109,6 +109,11 @@ static uint8_t rda1846_read_register(const uint8_t addr, uint16_t* data)
}
+void rda1846_soft_reset(void)
+{
+ rda1846_write_register(RDA1846_REG_CTL, RDA1846_CTL_SOFT_RST);
+}
+
void rda1846_init(void)
{
TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000));
@@ -121,21 +126,47 @@ void rda1846_init(void)
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);
+ rda1846_write_register(RDA1846_REG_CTL, RDA1846_CTL_CH_12K5 | RDA1846_CTL_RX_M_TX_M);
- // use this if VOX, SQ, TXON_RF, RXON_RF are meant as outputs
+// rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_NONE);
+// rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_MIC);
+ rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_TONE2);
+
+// rda1846_write_register(RDA1846_REG_DTMF_CTL, RDA1846_DTMF_DUAL | RDA1846_DTMF_EN);
+// rda1846_write_register(RDA1846_REG_INT, RDA1846_INT_DTMF_IDLE);
+
+ rda1846_gpio_default();
+}
+
+void rda1846_gpio_default(void)
+{
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_TX_VOICE, RDA1846_TX_VOICE_MIC);
-// rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_TONE2);
+void rda1846_gpio_AA(void)
+{
+ rda1846_write_register(RDA1846_REG_GPIO, RDA1846_GPIO_7_HIGH | RDA1846_GPIO_6_LOW |
+ RDA1846_GPIO_5_HIGH | RDA1846_GPIO_4_LOW |
+ RDA1846_GPIO_3_HIGH | RDA1846_GPIO_2_LOW |
+ RDA1846_GPIO_1_HIGH | RDA1846_GPIO_0_LOW);
+}
-// rda1846_write_register(RDA1846_REG_DTMF_CTL, RDA1846_DTMF_DUAL | RDA1846_DTMF_EN);
+void rda1846_gpio_55(void)
+{
+ rda1846_write_register(RDA1846_REG_GPIO, RDA1846_GPIO_7_LOW | RDA1846_GPIO_6_HIGH |
+ RDA1846_GPIO_5_LOW | RDA1846_GPIO_4_HIGH |
+ RDA1846_GPIO_3_LOW | RDA1846_GPIO_2_HIGH |
+ RDA1846_GPIO_1_LOW | RDA1846_GPIO_0_HIGH);
+}
+
+void rda1846_gpio_off(void)
+{
+ rda1846_write_register(RDA1846_REG_GPIO, RDA1846_GPIO_7_HI_Z | RDA1846_GPIO_6_HI_Z |
+ RDA1846_GPIO_5_HI_Z | RDA1846_GPIO_4_HI_Z |
+ RDA1846_GPIO_3_HI_Z | RDA1846_GPIO_2_HI_Z |
+ RDA1846_GPIO_1_HI_Z | RDA1846_GPIO_0_HI_Z);
}
void rda1846_powerdown(void)
@@ -145,7 +176,7 @@ void rda1846_powerdown(void)
return;
data &= ~(RDA1846_CTL_PDN);
- rda1846_write_register(RDA1846_REG_CTL, data);
+ rda1846_write_register(RDA1846_REG_CTL, data);
}
void rda1846_wakeup(void)
@@ -155,7 +186,18 @@ void rda1846_wakeup(void)
return;
data |= RDA1846_CTL_PDN;
- rda1846_write_register(RDA1846_REG_CTL, data);
+ rda1846_write_register(RDA1846_REG_CTL, data);
+}
+
+
+void rda1846_idle(void)
+{
+ uint16_t data;
+ if(rda1846_read_register(RDA1846_REG_CTL, &data))
+ return;
+
+ data &= ~(RDA1846_CTL_TX | RDA1846_CTL_RX | RDA1846_CTL_CHIP_CAL);
+ rda1846_write_register(RDA1846_REG_CTL, data);
}
void rda1846_receive(void)
@@ -164,9 +206,9 @@ void rda1846_receive(void)
if(rda1846_read_register(RDA1846_REG_CTL, &data))
return;
- data |= RDA1846_CTL_RX;
+ data |= RDA1846_CTL_RX | RDA1846_CTL_CHIP_CAL;
data &= ~(RDA1846_CTL_TX);
- rda1846_write_register(RDA1846_REG_CTL, data);
+ rda1846_write_register(RDA1846_REG_CTL, data);
}
void rda1846_transmit(void)
@@ -176,23 +218,17 @@ void rda1846_transmit(void)
return;
data &= ~(RDA1846_CTL_RX);
- data |= RDA1846_CTL_TX;
- rda1846_write_register(RDA1846_REG_CTL, data);
+ data |= RDA1846_CTL_TX | RDA1846_CTL_CHIP_CAL;
+ rda1846_write_register(RDA1846_REG_CTL, data);
}
-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;
+ return ((int16_t)(data & 0x03FF) - 135*8);
}
int16_t rda1846_get_vssi(void)
@@ -209,7 +245,7 @@ uint16_t rda1846_get_flags(void)
uint16_t data;
if(rda1846_read_register(RDA1846_REG_FLAG, &data))
return 0xFFFF;
-
+
return data & 0x1687;
}
@@ -280,6 +316,7 @@ char* rda1846_regaddr_to_string(uint8_t addr)
case RDA1846_REG_VOX_OPEN: return "VOX_OPEN";
case RDA1846_REG_VOX_SHUT: return "VOX_SHUT";
case RDA1846_REG_SUBAUDIO: return "SUBAUDIO";
+ case RDA1846_REG_RX_VOICE: return "RX_VOICE";
case RDA1846_REG_SQ_OPEN: return "SQ_OPEN";
case RDA1846_REG_SQ_SHUT: return "SQ_SHUT";
case RDA1846_REG_DTMF_CTL: return "DTMF_CTL";
@@ -298,11 +335,13 @@ void rda1846_dump_register(void)
{
printf("RDA1846: register dump\r\n");
- const uint8_t regs[] = { RDA1846_REG_RF_BAND, RDA1846_REG_XTAL, RDA1846_REG_ADCLK,
- RDA1846_REG_CLK_MODE, RDA1846_REG_CTL, RDA1846_REG_INT,
- RDA1846_REG_GPIO, RDA1846_REG_TX_VOICE, RDA1846_REG_DTMF_CTL,
- RDA1846_REG_RSSI, RDA1846_REG_VSSI, RDA1846_REG_FLAG,
- RDA1846_REG_DTMF_OUT, RDA1846_REG_FREQH, RDA1846_REG_FREQL };
+ const uint8_t regs[] = { RDA1846_REG_CLK_MODE, RDA1846_REG_XTAL, RDA1846_REG_ADCLK,
+ RDA1846_REG_RF_BAND, RDA1846_REG_FREQH, RDA1846_REG_FREQL,
+ RDA1846_REG_CTL, RDA1846_REG_INT, RDA1846_REG_GPIO,
+ RDA1846_REG_PA_BIAS, RDA1846_REG_TX_VOICE, RDA1846_REG_VOX_OPEN, RDA1846_REG_VOX_SHUT,
+ RDA1846_REG_SUBAUDIO, RDA1846_REG_RX_VOICE, RDA1846_REG_SQ_OPEN, RDA1846_REG_SQ_SHUT,
+ RDA1846_REG_DTMF_CTL, RDA1846_REG_DTMF_OUT,
+ RDA1846_REG_RSSI, RDA1846_REG_VSSI, RDA1846_REG_FLAG };
int i;
for(i=0; i<sizeof(regs); ++i) {
diff --git a/software/rda1846dongle/rda1846.h b/software/rda1846dongle/rda1846.h
index 71d292b..c1db4a1 100644
--- a/software/rda1846dongle/rda1846.h
+++ b/software/rda1846dongle/rda1846.h
@@ -33,15 +33,21 @@
#ifndef MURSAT_rda1846_h_INCLUDED
#define MURSAT_rda1846_h_INCLUDED
-void rda1846_init(void);
void rda1846_soft_reset(void);
+void rda1846_init(void);
void rda1846_powerdown(void);
void rda1846_wakeup(void);
+void rda1846_idle(void);
void rda1846_receive(void);
void rda1846_transmit(void);
+void rda1846_gpio_default(void);
+void rda1846_gpio_55(void);
+void rda1846_gpio_AA(void);
+void rda1846_gpio_off(void);
+
int16_t rda1846_get_rssi(void);
int16_t rda1846_get_vssi(void);
uint16_t rda1846_get_flags(void);
diff --git a/software/rda1846dongle/rda1846_defines.h b/software/rda1846dongle/rda1846_defines.h
index ad08703..a6281dd 100644
--- a/software/rda1846dongle/rda1846_defines.h
+++ b/software/rda1846dongle/rda1846_defines.h
@@ -61,6 +61,7 @@
#define RDA1846_REG_VOX_OPEN 0x41
#define RDA1846_REG_VOX_SHUT 0x42
+#define RDA1846_REG_RX_VOICE 0x44
#define RDA1846_REG_SUBAUDIO 0x45
#define RDA1846_REG_SQ_OPEN 0x48
#define RDA1846_REG_SQ_SHUT 0x49
diff --git a/software/rda1846dongle/rda1846dongle.c b/software/rda1846dongle/rda1846dongle.c
index ebb97de..757356d 100644
--- a/software/rda1846dongle/rda1846dongle.c
+++ b/software/rda1846dongle/rda1846dongle.c
@@ -88,10 +88,12 @@ static void update_current_freq(void)
static void print_status(void)
{
int16_t rssi = rda1846_get_rssi();
- if(rssi < 0)
- printf("rssi: NaN dB\r\n");
- else
- printf("rssi: %d.%03d dB\r\n", (uint16_t)(rssi / 8), (uint16_t)((rssi % 8)*125));
+ printf("rssi: ");
+ if(rssi < 0) {
+ printf("-");
+ rssi*=-1;
+ }
+ printf("%d.%03d dB\r\n", (uint16_t)(rssi / 8), (uint16_t)((rssi % 8)*125));
int16_t vssi = rda1846_get_vssi();
if(vssi < 0)
@@ -121,13 +123,18 @@ static void print_dtmf(void)
static void handle_cmd(uint8_t cmd)
{
switch(cmd) {
- case '0': led_off(); printf("led OFF\r\n"); break;
- case '1': led_on(); printf("led ON\r\n"); break;
+ case '0': rda1846_gpio_AA(); led_off(); printf("led OFF\r\n"); break;
+ case '1': rda1846_gpio_55(); led_on(); printf("led ON\r\n"); break;
case 't': led_toggle(); printf("led TOGGLE\r\n"); break;
case '!': reset2bootloader(); break;
+
case 'r': rda1846_soft_reset(); printf("soft resetting RDA1846.\r\n"); break;
case 'i': rda1846_init(); printf("initializing RDA1846.\r\n"); break;
case 'F': set_default_freq(); break;
+
+ case 'g': rda1846_gpio_off(); printf("GPIO off\r\n"); break;
+ case 'G': rda1846_gpio_default(); printf("GPIO to defaults\r\n"); break;
+
case 'f': print_actual_freq(); break;
case 's': print_status(); break;
case 'd': print_dtmf(); break;
@@ -135,6 +142,7 @@ static void handle_cmd(uint8_t cmd)
case 'p': rda1846_powerdown(); break;
case 'P': rda1846_wakeup(); break;
+ case 'I': rda1846_idle(); break;
case 'R': rda1846_receive(); break;
case 'T': rda1846_transmit(); break;