summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/ao.h10
-rw-r--r--src/core/ao_config.c60
-rw-r--r--src/drivers/ao_cc115l.c5
-rw-r--r--src/drivers/ao_rf_cc115l.h2
-rw-r--r--src/drivers/ao_rfpa0133.c7
-rw-r--r--src/telegps-v0.1/ao_pins.h4
6 files changed, 80 insertions, 8 deletions
diff --git a/src/core/ao.h b/src/core/ao.h
index 6d617cfc..7c5c69b8 100644
--- a/src/core/ao.h
+++ b/src/core/ao.h
@@ -550,7 +550,7 @@ ao_radio_send_lots(ao_radio_fill_func fill);
* ao_radio_pa
*/
-#if AO_RADIO_HAS_PA
+#if HAS_RADIO_AMP
void
ao_radio_pa_on(void);
@@ -715,7 +715,7 @@ extern __xdata uint8_t ao_force_freq;
#endif
#define AO_CONFIG_MAJOR 1
-#define AO_CONFIG_MINOR 13
+#define AO_CONFIG_MINOR 14
#define AO_AES_LEN 16
@@ -743,6 +743,12 @@ struct ao_config {
struct ao_pyro pyro[AO_PYRO_NUM]; /* minor version 12 */
#endif
uint16_t aprs_interval; /* minor version 13 */
+#if HAS_RADIO_POWER
+ uint8_t radio_power; /* minor version 14 */
+#endif
+#if HAS_RADIO_AMP
+ uint8_t radio_amp; /* minor version 14 */
+#endif
};
#define AO_IGNITE_MODE_DUAL 0
diff --git a/src/core/ao_config.c b/src/core/ao_config.c
index 9c84fe60..73608a55 100644
--- a/src/core/ao_config.c
+++ b/src/core/ao_config.c
@@ -47,6 +47,8 @@ __xdata uint8_t ao_config_mutex;
#define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX ((uint32_t) 192 * (uint32_t) 1024)
#endif
#endif
+#define AO_CONFIG_DEFAULT_RADIO_POWER 0x60
+#define AO_CONFIG_DEFAULT_RADIO_AMP 0
#if HAS_EEPROM
static void
@@ -141,6 +143,14 @@ _ao_config_get(void)
#endif
if (minor < 13)
ao_config.aprs_interval = 0;
+#if HAS_RADIO_POWER
+ if (minor < 14)
+ ao_config.radio_power = AO_CONFIG_DEFAULT_RADIO_POWER;
+ #endif
+#if HAS_RADIO_AMP
+ if (minor < 14)
+ ao_config.radio_amp = AO_CONFIG_DEFAULT_RADIO_AMP;
+#endif
ao_config.minor = AO_CONFIG_MINOR;
ao_config_dirty = 1;
}
@@ -524,6 +534,48 @@ ao_config_aprs_set(void)
#endif /* HAS_APRS */
+#if HAS_RADIO_AMP
+
+void
+ao_config_radio_amp_show(void)
+{
+ printf ("Radio amp setting: %d\n", ao_config.radio_amp);
+}
+
+void
+ao_config_radio_amp_set(void)
+{
+ ao_cmd_decimal();
+ if (ao_cmd_status != ao_cmd_success)
+ return;
+ _ao_config_edit_start();
+ ao_config.radio_amp = ao_cmd_lex_i;
+ _ao_config_edit_finish();
+}
+
+#endif
+
+#if HAS_RADIO_POWER
+
+void
+ao_config_radio_power_show(void)
+{
+ printf ("Radio power setting: %d\n", ao_config.radio_power);
+}
+
+void
+ao_config_radio_power_set(void)
+{
+ ao_cmd_decimal();
+ if (ao_cmd_status != ao_cmd_success)
+ return;
+ _ao_config_edit_start();
+ ao_config.radio_power = ao_cmd_lex_i;
+ _ao_config_edit_finish();
+}
+
+#endif
+
struct ao_config_var {
__code char *str;
void (*set)(void) __reentrant;
@@ -557,6 +609,14 @@ __code struct ao_config_var ao_config_vars[] = {
ao_config_radio_enable_set, ao_config_radio_enable_show },
{ "f <cal>\0Radio calib (cal = rf/(xtal/2^16))",
ao_config_radio_cal_set, ao_config_radio_cal_show },
+#if HAS_RADIO_POWER
+ { "p <setting>\0Radio power setting (0-255)",
+ ao_config_radio_power_set, ao_config_radio_power_show },
+#endif
+#if HAS_RADIO_AMP
+ { "d <setting>\0Radio amplifier setting (0-3)",
+ ao_config_radio_amp_set, ao_config_radio_amp_show },
+#endif
#endif /* HAS_RADIO */
#if HAS_ACCEL
{ "a <+g> <-g>\0Accel calib (0 for auto)",
diff --git a/src/drivers/ao_cc115l.c b/src/drivers/ao_cc115l.c
index feff82af..5b0ec3d7 100644
--- a/src/drivers/ao_cc115l.c
+++ b/src/drivers/ao_cc115l.c
@@ -452,6 +452,7 @@ static void
ao_radio_get(uint8_t len)
{
static uint32_t last_radio_setting;
+ static uint8_t last_power_setting;
ao_mutex_get(&ao_radio_mutex);
if (!ao_radio_configured)
@@ -462,6 +463,10 @@ ao_radio_get(uint8_t len)
ao_radio_reg_write(CC115L_FREQ0, ao_config.radio_setting);
last_radio_setting = ao_config.radio_setting;
}
+ if (ao_config.radio_power != last_power_setting) {
+ ao_radio_reg_write(CC115L_PA, ao_config.radio_power);
+ last_power_setting = ao_config.radio_power;
+ }
ao_radio_set_len(len);
}
diff --git a/src/drivers/ao_rf_cc115l.h b/src/drivers/ao_rf_cc115l.h
index 6eb30bf2..50a730ab 100644
--- a/src/drivers/ao_rf_cc115l.h
+++ b/src/drivers/ao_rf_cc115l.h
@@ -80,4 +80,4 @@
CC115L_TEST1, 0x35, /* Various Test Settings */
CC115L_TEST0, 0x09, /* Various Test Settings */
- CC115L_PA, 0x60, /* Power setting (0dBm) */
+ CC115L_PA, 0x00, /* Power setting (0dBm) */
diff --git a/src/drivers/ao_rfpa0133.c b/src/drivers/ao_rfpa0133.c
index 70d5edba..a98e261a 100644
--- a/src/drivers/ao_rfpa0133.c
+++ b/src/drivers/ao_rfpa0133.c
@@ -17,10 +17,8 @@
#include "ao.h"
-static uint8_t power = 0;
-
static void
-ao_rfpa0133_set_power(void)
+ao_rfpa0133_set_power(uint8_t power)
{
ao_gpio_set(AO_PA_GAIN_8_GPIO, AO_PA_GAIN_8_PIN, AO_PA_GAIN_8, power & 1);
ao_gpio_set(AO_PA_GAIN_16_GPIO, AO_PA_GAIN_16_PIN, AO_PA_GAIN_16, (power >> 1) & 1);
@@ -29,7 +27,7 @@ ao_rfpa0133_set_power(void)
void
ao_radio_pa_on(void)
{
- ao_rfpa0133_set_power();
+ ao_rfpa0133_set_power(ao_config.radio_amp);
ao_gpio_set(AO_PA_POWER_GPIO, AO_PA_POWER_PIN, AO_PA_POWER, 1);
}
@@ -37,6 +35,7 @@ void
ao_radio_pa_off(void)
{
ao_gpio_set(AO_PA_POWER_GPIO, AO_PA_POWER_PIN, AO_PA_POWER, 0);
+ ao_rfpa0133_set_power(0);
}
void
diff --git a/src/telegps-v0.1/ao_pins.h b/src/telegps-v0.1/ao_pins.h
index 01f4a303..09574568 100644
--- a/src/telegps-v0.1/ao_pins.h
+++ b/src/telegps-v0.1/ao_pins.h
@@ -132,6 +132,8 @@
#define AO_RADIO_CAL_DEFAULT 0x10b6a5
+#define HAS_RADIO_POWER 1
+
#define AO_FEC_DEBUG 0
#define AO_CC115L_SPI_CS_PORT (&stm_gpiob)
#define AO_CC115L_SPI_CS_PIN 12
@@ -150,7 +152,7 @@
#define AO_CC115L_MARC_GPIO 0
#define AO_CC115L_MARC_GPIO_IOCFG CC115L_IOCFG0
-#define AO_RADIO_HAS_PA 1
+#define HAS_RADIO_AMP 1
/*
* Power amplifier (RFPA0133)