X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fdrivers%2Fao_cc115l.c;h=d9b9a89b7f29649a147203abe06277711a95f367;hb=3d5db24708b37d86eac187169e2553a408dfeb83;hp=9a4908b501d0030b7f9a2fd169a2bf7bb51d72a3;hpb=a0628541e1bfc3e4a122cc824188ed53fddf733e;p=fw%2Faltos diff --git a/src/drivers/ao_cc115l.c b/src/drivers/ao_cc115l.c index 9a4908b5..d9b9a89b 100644 --- a/src/drivers/ao_cc115l.c +++ b/src/drivers/ao_cc115l.c @@ -23,14 +23,12 @@ #define AO_RADIO_MAX_SEND sizeof (struct ao_telemetry_generic) -static uint8_t ao_radio_mutex; +uint8_t ao_radio_mutex; static uint8_t ao_radio_fifo; /* fifo drained interrupt received */ static uint8_t ao_radio_done; /* tx done interrupt received */ static uint8_t ao_radio_wake; /* sleep address for radio interrupts */ static uint8_t ao_radio_abort; /* radio operation should abort */ -static uint8_t ao_radio_mcu_wake; /* MARC status change */ -static uint8_t ao_radio_marcstate; /* Last read MARC state value */ /* Debugging commands */ #define CC115L_DEBUG 0 @@ -54,8 +52,8 @@ struct ao_cc115l_reg { #if CC115L_TRACE -const static struct ao_cc115l_reg ao_cc115l_reg[]; -const static char *cc115l_state_name[]; +static const struct ao_cc115l_reg ao_cc115l_reg[]; +static const char *cc115l_state_name[]; enum ao_cc115l_trace_type { trace_strobe, @@ -90,6 +88,8 @@ static void trace_add(enum ao_cc115l_trace_type type, int16_t addr, int16_t valu case trace_strobe: comment = cc115l_state_name[(value >> 4) & 0x7]; break; + default: + break; } trace[trace_i].type = type; trace[trace_i].addr = addr; @@ -106,7 +106,6 @@ static uint8_t ao_radio_reg_read(uint8_t addr) { uint8_t data[1]; - uint8_t d; data[0] = ((1 << CC115L_READ) | (0 << CC115L_BURST) | @@ -123,7 +122,6 @@ static void ao_radio_reg_write(uint8_t addr, uint8_t value) { uint8_t data[2]; - uint8_t d; trace_add(trace_write, addr, value, NULL); data[0] = ((0 << CC115L_READ) | @@ -135,11 +133,11 @@ ao_radio_reg_write(uint8_t addr, uint8_t value) ao_radio_deselect(); } +#if UNUSED static void ao_radio_burst_read_start (uint16_t addr) { uint8_t data[1]; - uint8_t d; data[0] = ((1 << CC115L_READ) | (1 << CC115L_BURST) | @@ -153,6 +151,7 @@ ao_radio_burst_read_stop (void) { ao_radio_deselect(); } +#endif static uint8_t @@ -200,20 +199,22 @@ ao_radio_tx_fifo_space(void) return CC115L_FIFO_SIZE - (ao_radio_reg_read(CC115L_TXBYTES) & CC115L_TXBYTES_NUM_TX_BYTES_MASK); } +#if CC115L_DEBUG static uint8_t ao_radio_status(void) { return ao_radio_strobe (CC115L_SNOP); } -#define ao_radio_rdf_value 0x55 - static uint8_t ao_radio_get_marcstate(void) { return ao_radio_reg_read(CC115L_MARCSTATE) & CC115L_MARCSTATE_MASK; } - +#endif + +#define ao_radio_rdf_value 0x55 + static void ao_radio_done_isr(void) { @@ -232,11 +233,6 @@ ao_radio_fifo_isr(void) ao_wakeup(&ao_radio_wake); } -static void -ao_radio_start_tx(void) -{ -} - static void ao_radio_idle(void) { @@ -245,6 +241,8 @@ ao_radio_idle(void) uint8_t state = ao_radio_strobe(CC115L_SIDLE); if ((state >> CC115L_STATUS_STATE) == CC115L_STATUS_STATE_IDLE) break; + if ((state >> CC115L_STATUS_STATE) == CC115L_STATUS_STATE_TX_FIFO_UNDERFLOW) + ao_radio_strobe(CC115L_SFTX); } /* Flush any pending TX bytes */ ao_radio_strobe(CC115L_SFTX); @@ -328,11 +326,13 @@ static const uint16_t rdf_setup[] = { }; /* - * APRS deviation is the same as RDF + * APRS deviation is 3kHz + * + * 26e6 / (2 ** 17) * (8 + 7) * (2 ** 0) = 2975 */ -#define APRS_DEV_E RDF_DEV_E -#define APRS_DEV_M RDF_DEV_M +#define APRS_DEV_E 0 +#define APRS_DEV_M 7 /* * For our APRS beacon, set the symbol rate to 9.6kBaud (8x oversampling for 1200 baud data rate) @@ -397,7 +397,7 @@ static void ao_radio_set_mode(uint16_t new_mode) { uint16_t changes; - int i; + unsigned int i; if (new_mode == ao_radio_mode) return; @@ -442,15 +442,10 @@ static const uint16_t radio_setup[] = { AO_CC115L_DONE_INT_GPIO_IOCFG, CC115L_IOCFG_GPIO_CFG_PA_PD | (1 << CC115L_IOCFG_GPIO_INV), CC115L_FIFOTHR, 0x47, /* TX FIFO Thresholds */ - CC115L_FREQ2, 0x10, /* Frequency Control Word, High Byte */ - CC115L_FREQ1, 0xb6, /* Frequency Control Word, Middle Byte */ - CC115L_FREQ0, 0xa5, /* Frequency Control Word, Low Byte */ - CC115L_MDMCFG2, 0x13, /* Modem Configuration */ CC115L_MDMCFG1, (0x00 | (CC115L_MDMCFG1_NUM_PREAMBLE_4 << CC115L_MDMCFG1_NUM_PREAMBLE) | (1 << CC115L_MDMCFG1_CHANSPC_E)), CC115L_MDMCFG0, 248, /* Channel spacing M value (100kHz channels) */ - CC115L_DEVIATN, 0x35, /* Modem Deviation Setting */ CC115L_MCSM0, 0x38, /* Main Radio Control State Machine Configuration */ CC115L_RESERVED_0X20, 0xfb, /* Use setting from SmartRF Studio */ CC115L_FSCAL3, 0xe9, /* Frequency Synthesizer Calibration */ @@ -460,7 +455,6 @@ static const uint16_t radio_setup[] = { CC115L_TEST2, 0x81, /* Various Test Settings */ CC115L_TEST1, 0x35, /* Various Test Settings */ CC115L_TEST0, 0x09, /* Various Test Settings */ - CC115L_PA, 0x00, /* Power setting (as low as possible) */ }; static uint8_t ao_radio_configured = 0; @@ -468,7 +462,7 @@ static uint8_t ao_radio_configured = 0; static void ao_radio_setup(void) { - int i; + unsigned int i; ao_radio_strobe(CC115L_SRES); ao_delay(AO_MS_TO_TICKS(10)); @@ -480,6 +474,8 @@ ao_radio_setup(void) ao_config_get(); + ao_radio_strobe(CC115L_SCAL); + ao_radio_configured = 1; } @@ -498,7 +494,6 @@ static void ao_radio_get(void) { static uint32_t last_radio_setting; - static uint8_t last_power_setting; ao_mutex_get(&ao_radio_mutex); if (!ao_radio_configured) @@ -509,10 +504,6 @@ ao_radio_get(void) 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; - } } static void @@ -573,6 +564,7 @@ ao_radio_tone_run(struct ao_radio_tone *tones, int ntones) ao_radio_tone = tones; ao_radio_tone_current = 0; ao_radio_tone_offset = 0; + ao_radio_tone_count = ntones; _ao_radio_send_lots(ao_radio_tone_fill, AO_RADIO_MODE_RDF); ao_radio_put(); } @@ -618,6 +610,20 @@ ao_radio_rdf_abort(void) ao_wakeup(&ao_radio_wake); } +#define POWER_STEP 0x08 + +static void +ao_radio_stx(void) +{ + uint8_t power; + ao_radio_pa_on(); + ao_radio_reg_write(CC115L_PA, 0); + ao_radio_strobe(CC115L_STX); + for (power = POWER_STEP; power < ao_config.radio_power; power += POWER_STEP) + ao_radio_reg_write(CC115L_PA, power); + ao_radio_reg_write(CC115L_PA, ao_config.radio_power); +} + static void ao_radio_test_cmd(void) { @@ -637,11 +643,10 @@ ao_radio_test_cmd(void) ao_packet_slave_stop(); #endif ao_radio_get(); - ao_radio_set_len(0xff); - ao_radio_set_mode(AO_RADIO_MODE_PACKET_TX | AO_RADIO_MODE_BITS_FIXED); ao_radio_strobe(CC115L_SFTX); - ao_radio_pa_on(); - ao_radio_strobe(CC115L_STX); + ao_radio_set_len(0xff); + ao_radio_set_mode(AO_RADIO_MODE_RDF); + ao_radio_stx(); radio_on = 1; } if (mode == 3) { @@ -659,12 +664,14 @@ ao_radio_test_cmd(void) } } +#if CC115L_TRACE static inline int16_t ao_radio_gpio_bits(void) { - return AO_CC115L_DONE_INT_PORT->idr & ((1 << AO_CC115L_FIFO_INT_PIN) | - (1 << AO_CC115L_DONE_INT_PIN)); + return ((ao_gpio_get(AO_CC115L_DONE_INT_PORT, AO_CC115L_DONE_INT_PIN, AO_CC115L_DONE_INT) << 1) | + ao_gpio_get(AO_CC115L_FIFO_INT_PORT, AO_CC115L_FIFO_INT_PIN, AO_CC115L_FIFO_INT)); } +#endif static void ao_radio_wait_fifo(void) @@ -720,8 +727,6 @@ ao_radio_send_fill(uint8_t *buf, int16_t len) void ao_radio_send(const void *d, uint8_t size) { - int i; - ao_radio_get(); ao_radio_send_len = ao_fec_encode(d, size, tx_data); ao_radio_send_buf = tx_data; @@ -742,6 +747,10 @@ _ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode) uint8_t fifo_space; fifo_space = CC115L_FIFO_SIZE; + ao_radio_abort = 0; + + ao_radio_strobe(CC115L_SFTX); + ao_radio_done = 0; ao_radio_fifo = 0; while (!done) { @@ -788,8 +797,7 @@ _ao_radio_send_lots(ao_radio_fill_func fill, uint8_t mode) ao_exti_enable(AO_CC115L_DONE_INT_PORT, AO_CC115L_DONE_INT_PIN); if (!started) { - ao_radio_pa_on(); - ao_radio_strobe(CC115L_STX); + ao_radio_stx(); started = 1; } } @@ -811,7 +819,7 @@ ao_radio_send_aprs(ao_radio_fill_func fill) } #if CC115L_DEBUG -const static char *cc115l_state_name[] = { +static const char *cc115l_state_name[] = { [CC115L_STATUS_STATE_IDLE] = "IDLE", [CC115L_STATUS_STATE_TX] = "TX", [CC115L_STATUS_STATE_FSTXON] = "FSTXON", @@ -820,7 +828,7 @@ const static char *cc115l_state_name[] = { [CC115L_STATUS_STATE_TX_FIFO_UNDERFLOW] = "TX_FIFO_UNDERFLOW", }; -const static struct ao_cc115l_reg ao_cc115l_reg[] = { +static const struct ao_cc115l_reg ao_cc115l_reg[] = { { .addr = CC115L_IOCFG2, .name = "IOCFG2" }, { .addr = CC115L_IOCFG1, .name = "IOCFG1" }, { .addr = CC115L_IOCFG0, .name = "IOCFG0" }, @@ -866,7 +874,7 @@ const static struct ao_cc115l_reg ao_cc115l_reg[] = { static void ao_radio_show(void) { uint8_t status = ao_radio_status(); - int i; + unsigned int i; ao_radio_get(); status = ao_radio_status(); @@ -899,7 +907,6 @@ static void ao_radio_packet(void) { ao_radio_send(packet, sizeof (packet)); } -#endif /* CC115L_DEBUG */ #if HAS_APRS #include @@ -913,6 +920,7 @@ ao_radio_aprs() ao_aprs_send(); } #endif +#endif /* CC115L_DEBUG */ static const struct ao_cmds ao_radio_cmds[] = { { ao_radio_test_cmd, "C <1 start, 0 stop, none both>\0Radio carrier test" }, @@ -930,7 +938,9 @@ static const struct ao_cmds ao_radio_cmds[] = { void ao_radio_init(void) { +#if 0 int i; +#endif ao_radio_configured = 0; ao_spi_init_cs (AO_CC115L_SPI_CS_PORT, (1 << AO_CC115L_SPI_CS_PIN));