diff options
Diffstat (limited to 'src/drivers/ao_cc115l.c')
-rw-r--r-- | src/drivers/ao_cc115l.c | 168 |
1 files changed, 109 insertions, 59 deletions
diff --git a/src/drivers/ao_cc115l.c b/src/drivers/ao_cc115l.c index d9b9a89b..829ac60b 100644 --- a/src/drivers/ao_cc115l.c +++ b/src/drivers/ao_cc115l.c @@ -45,17 +45,70 @@ static uint8_t ao_radio_abort; /* radio operation should abort */ #define ao_radio_spi_recv(d,l) ao_spi_recv((d), (l), AO_CC115L_SPI_BUS) #define ao_radio_duplex(o,i,l) ao_spi_duplex((o), (i), (l), AO_CC115L_SPI_BUS) +#if CC115L_DEBUG struct ao_cc115l_reg { uint16_t addr; char *name; }; -#if CC115L_TRACE +static const struct ao_cc115l_reg ao_cc115l_reg[] = { + { .addr = CC115L_IOCFG2, .name = "IOCFG2" }, + { .addr = CC115L_IOCFG1, .name = "IOCFG1" }, + { .addr = CC115L_IOCFG0, .name = "IOCFG0" }, + { .addr = CC115L_FIFOTHR, .name = "FIFOTHR" }, + { .addr = CC115L_SYNC1, .name = "SYNC1" }, + { .addr = CC115L_SYNC0, .name = "SYNC0" }, + { .addr = CC115L_PKTLEN, .name = "PKTLEN" }, + { .addr = CC115L_PKTCTRL0, .name = "PKTCTRL0" }, + { .addr = CC115L_CHANNR, .name = "CHANNR" }, + { .addr = CC115L_FSCTRL0, .name = "FSCTRL0" }, + { .addr = CC115L_FREQ2, .name = "FREQ2" }, + { .addr = CC115L_FREQ1, .name = "FREQ1" }, + { .addr = CC115L_FREQ0, .name = "FREQ0" }, + { .addr = CC115L_MDMCFG4, .name = "MDMCFG4" }, + { .addr = CC115L_MDMCFG3, .name = "MDMCFG3" }, + { .addr = CC115L_MDMCFG2, .name = "MDMCFG2" }, + { .addr = CC115L_MDMCFG1, .name = "MDMCFG1" }, + { .addr = CC115L_MDMCFG0, .name = "MDMCFG0" }, + { .addr = CC115L_DEVIATN, .name = "DEVIATN" }, + { .addr = CC115L_MCSM1, .name = "MCSM1" }, + { .addr = CC115L_MCSM0, .name = "MCSM0" }, + { .addr = CC115L_RESERVED_0X20, .name = "RESERVED_0X20" }, + { .addr = CC115L_FREND0, .name = "FREND0" }, + { .addr = CC115L_FSCAL3, .name = "FSCAL3" }, + { .addr = CC115L_FSCAL2, .name = "FSCAL2" }, + { .addr = CC115L_FSCAL1, .name = "FSCAL1" }, + { .addr = CC115L_FSCAL0, .name = "FSCAL0" }, + { .addr = CC115L_RESERVED_0X29, .name = "RESERVED_0X29" }, + { .addr = CC115L_RESERVED_0X2A, .name = "RESERVED_0X2A" }, + { .addr = CC115L_RESERVED_0X2B, .name = "RESERVED_0X2B" }, + { .addr = CC115L_TEST2, .name = "TEST2" }, + { .addr = CC115L_TEST1, .name = "TEST1" }, + { .addr = CC115L_TEST0, .name = "TEST0" }, + { .addr = CC115L_PARTNUM, .name = "PARTNUM" }, + { .addr = CC115L_VERSION, .name = "VERSION" }, + { .addr = CC115L_MARCSTATE, .name = "MARCSTATE" }, + { .addr = CC115L_PKTSTATUS, .name = "PKTSTATUS" }, + { .addr = CC115L_TXBYTES, .name = "TXBYTES" }, + { .addr = CC115L_PA, .name = "PA" }, +}; -static const struct ao_cc115l_reg ao_cc115l_reg[]; -static const char *cc115l_state_name[]; +#define AO_NUM_CC115L_REG (sizeof ao_cc115l_reg / sizeof ao_cc115l_reg[0]) + +static const char *cc115l_state_name[8] = { + [CC115L_STATUS_STATE_IDLE] = "IDLE", + [CC115L_STATUS_STATE_TX] = "TX", + [CC115L_STATUS_STATE_FSTXON] = "FSTXON", + [CC115L_STATUS_STATE_CALIBRATE] = "CALIBRATE", + [CC115L_STATUS_STATE_SETTLING] = "SETTLING", + [CC115L_STATUS_STATE_TX_FIFO_UNDERFLOW] = "TX_FIFO_UNDERFLOW", +}; +#endif + +#if CC115L_TRACE enum ao_cc115l_trace_type { + trace_empty, trace_strobe, trace_read, trace_write, @@ -63,14 +116,17 @@ enum ao_cc115l_trace_type { trace_line, }; +static const char trace_type_letter[] = "ESRWDL"; + struct ao_cc115l_trace { enum ao_cc115l_trace_type type; + int16_t time; int16_t addr; int16_t value; const char *comment; }; -#define NUM_TRACE 256 +#define NUM_TRACE 128 static struct ao_cc115l_trace trace[NUM_TRACE]; static int trace_i; @@ -78,12 +134,18 @@ static int trace_disable; static void trace_add(enum ao_cc115l_trace_type type, int16_t addr, int16_t value, const char *comment) { + unsigned int i; if (trace_disable) return; switch (type) { case trace_read: case trace_write: - comment = ao_cc115l_reg[addr].name; + comment = "UNKNOWN"; + for (i = 0; i < AO_NUM_CC115L_REG; i++) + if (ao_cc115l_reg[i].addr == addr) { + comment = ao_cc115l_reg[i].name; + break; + } break; case trace_strobe: comment = cc115l_state_name[(value >> 4) & 0x7]; @@ -91,6 +153,9 @@ static void trace_add(enum ao_cc115l_trace_type type, int16_t addr, int16_t valu default: break; } + if (comment == NULL) + comment = "no comment"; + trace[trace_i].time = ao_time(); trace[trace_i].type = type; trace[trace_i].addr = addr; trace[trace_i].value = value; @@ -98,6 +163,29 @@ static void trace_add(enum ao_cc115l_trace_type type, int16_t addr, int16_t valu if (++trace_i == NUM_TRACE) trace_i = 0; } + +static void +trace_dump(void) +{ + int i, j; + + for (j = 0; j < NUM_TRACE; j++) { + i = j + trace_i; + if (i >= NUM_TRACE) + i -= NUM_TRACE; + if (trace[i].type != trace_empty) { + printf ("%3d %5d %c addr %04x value %04x comment %s\n", + j, + trace[i].time, + trace_type_letter[trace[i].type], + trace[i].addr, + trace[i].value, + trace[i].comment); + flush(); + } + } +} + #else #define trace_add(t,a,v,c) #endif @@ -131,6 +219,9 @@ ao_radio_reg_write(uint8_t addr, uint8_t value) ao_radio_select(); ao_radio_spi_send(data, 2); ao_radio_deselect(); +#if CC115L_TRACE + (void) ao_radio_reg_read(addr); +#endif } #if UNUSED @@ -610,18 +701,25 @@ ao_radio_rdf_abort(void) ao_wakeup(&ao_radio_wake); } -#define POWER_STEP 0x08 +static uint8_t ao_cc115l_power_on[] = { 0x03, 0x17, 0x50, 0xc5, 0xc0 }; static void ao_radio_stx(void) { uint8_t power; +#if HAS_RADIO_POWER ao_radio_pa_on(); +#endif ao_radio_reg_write(CC115L_PA, 0); ao_radio_strobe(CC115L_STX); +#if HAS_RADIO_POWER 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); +#else + for (power = 0; power < sizeof (ao_cc115l_power_on); power++) + ao_radio_reg_write(CC115L_PA, ao_cc115l_power_on[power]); +#endif } static void @@ -819,59 +917,6 @@ ao_radio_send_aprs(ao_radio_fill_func fill) } #if CC115L_DEBUG -static const char *cc115l_state_name[] = { - [CC115L_STATUS_STATE_IDLE] = "IDLE", - [CC115L_STATUS_STATE_TX] = "TX", - [CC115L_STATUS_STATE_FSTXON] = "FSTXON", - [CC115L_STATUS_STATE_CALIBRATE] = "CALIBRATE", - [CC115L_STATUS_STATE_SETTLING] = "SETTLING", - [CC115L_STATUS_STATE_TX_FIFO_UNDERFLOW] = "TX_FIFO_UNDERFLOW", -}; - -static const struct ao_cc115l_reg ao_cc115l_reg[] = { - { .addr = CC115L_IOCFG2, .name = "IOCFG2" }, - { .addr = CC115L_IOCFG1, .name = "IOCFG1" }, - { .addr = CC115L_IOCFG0, .name = "IOCFG0" }, - { .addr = CC115L_FIFOTHR, .name = "FIFOTHR" }, - { .addr = CC115L_SYNC1, .name = "SYNC1" }, - { .addr = CC115L_SYNC0, .name = "SYNC0" }, - { .addr = CC115L_PKTLEN, .name = "PKTLEN" }, - { .addr = CC115L_PKTCTRL0, .name = "PKTCTRL0" }, - { .addr = CC115L_CHANNR, .name = "CHANNR" }, - { .addr = CC115L_FSCTRL0, .name = "FSCTRL0" }, - { .addr = CC115L_FREQ2, .name = "FREQ2" }, - { .addr = CC115L_FREQ1, .name = "FREQ1" }, - { .addr = CC115L_FREQ0, .name = "FREQ0" }, - { .addr = CC115L_MDMCFG4, .name = "MDMCFG4" }, - { .addr = CC115L_MDMCFG3, .name = "MDMCFG3" }, - { .addr = CC115L_MDMCFG2, .name = "MDMCFG2" }, - { .addr = CC115L_MDMCFG1, .name = "MDMCFG1" }, - { .addr = CC115L_MDMCFG0, .name = "MDMCFG0" }, - { .addr = CC115L_DEVIATN, .name = "DEVIATN" }, - { .addr = CC115L_MCSM1, .name = "MCSM1" }, - { .addr = CC115L_MCSM0, .name = "MCSM0" }, - { .addr = CC115L_RESERVED_0X20, .name = "RESERVED_0X20" }, - { .addr = CC115L_FREND0, .name = "FREND0" }, - { .addr = CC115L_FSCAL3, .name = "FSCAL3" }, - { .addr = CC115L_FSCAL2, .name = "FSCAL2" }, - { .addr = CC115L_FSCAL1, .name = "FSCAL1" }, - { .addr = CC115L_FSCAL0, .name = "FSCAL0" }, - { .addr = CC115L_RESERVED_0X29, .name = "RESERVED_0X29" }, - { .addr = CC115L_RESERVED_0X2A, .name = "RESERVED_0X2A" }, - { .addr = CC115L_RESERVED_0X2B, .name = "RESERVED_0X2B" }, - { .addr = CC115L_TEST2, .name = "TEST2" }, - { .addr = CC115L_TEST1, .name = "TEST1" }, - { .addr = CC115L_TEST0, .name = "TEST0" }, - { .addr = CC115L_PARTNUM, .name = "PARTNUM" }, - { .addr = CC115L_VERSION, .name = "VERSION" }, - { .addr = CC115L_MARCSTATE, .name = "MARCSTATE" }, - { .addr = CC115L_PKTSTATUS, .name = "PKTSTATUS" }, - { .addr = CC115L_TXBYTES, .name = "TXBYTES" }, - { .addr = CC115L_PA, .name = "PA" }, -}; - -#define AO_NUM_CC115L_REG (sizeof ao_cc115l_reg / sizeof ao_cc115l_reg[0]) - static void ao_radio_show(void) { uint8_t status = ao_radio_status(); unsigned int i; @@ -931,6 +976,9 @@ static const struct ao_cmds ao_radio_cmds[] = { { ao_radio_show, "R\0Show CC115L status" }, { ao_radio_beep, "b\0Emit an RDF beacon" }, { ao_radio_packet, "p\0Send a test packet" }, +#if CC115L_TRACE + { trace_dump, "D\0Dump CC115L trace" }, +#endif #endif { 0, NULL } }; @@ -945,6 +993,8 @@ ao_radio_init(void) ao_radio_configured = 0; ao_spi_init_cs (AO_CC115L_SPI_CS_PORT, (1 << AO_CC115L_SPI_CS_PIN)); + ao_enable_output(0, 23, PIN, 1); + #if 0 AO_CC115L_SPI_CS_PORT->bsrr = ((uint32_t) (1 << AO_CC115L_SPI_CS_PIN)); for (i = 0; i < 10000; i++) { |