X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fdrivers%2Fao_cc1120.c;h=231d14d4357e9e803871dbc00a419a5a7722c6d8;hb=e6d236fdc615625fbbf28377453f920729e49b0f;hp=a1d78d9ca13aa331ca07ac061686415f2fc2509e;hpb=e09e35471e788b88909ff01037fb8e0e4eabcd7d;p=fw%2Faltos diff --git a/src/drivers/ao_cc1120.c b/src/drivers/ao_cc1120.c index a1d78d9c..231d14d4 100644 --- a/src/drivers/ao_cc1120.c +++ b/src/drivers/ao_cc1120.c @@ -18,12 +18,14 @@ #include #include #include +#include uint8_t ao_radio_wake; uint8_t ao_radio_mutex; uint8_t ao_radio_abort; #define CC1120_DEBUG 1 +#define CC1120_TRACE 0 uint32_t ao_radio_cal = 0x6ca333; @@ -42,7 +44,7 @@ ao_radio_reg_read(uint16_t addr) uint8_t data[2]; uint8_t d; -#if CC1120_DEBUG +#if CC1120_TRACE printf("\t\tao_radio_reg_read (%04x): ", addr); flush(); #endif if (CC1120_IS_EXTENDED(addr)) { @@ -61,7 +63,7 @@ ao_radio_reg_read(uint16_t addr) ao_radio_spi_send(data, d); ao_radio_spi_recv(data, 1); ao_radio_deselect(); -#if CC1120_DEBUG +#if CC1120_TRACE printf (" %02x\n", data[0]); #endif return data[0]; @@ -73,7 +75,7 @@ ao_radio_reg_write(uint16_t addr, uint8_t value) uint8_t data[3]; uint8_t d; -#if CC1120_DEBUG +#if CC1120_TRACE printf("\t\tao_radio_reg_write (%04x): %02x\n", addr, value); #endif if (CC1120_IS_EXTENDED(addr)) { @@ -99,13 +101,13 @@ ao_radio_strobe(uint8_t addr) { uint8_t in; -#if CC1120_DEBUG +#if CC1120_TRACE printf("\t\tao_radio_strobe (%02x): ", addr); flush(); #endif ao_radio_select(); ao_radio_duplex(&addr, &in, 1); ao_radio_deselect(); -#if CC1120_DEBUG +#if CC1120_TRACE printf("%02x\n", in); flush(); #endif return in; @@ -149,12 +151,10 @@ ao_radio_fifo_write_fixed(uint8_t data, uint8_t len) CC1120_FIFO); uint8_t status; - printf ("num tx bytes: %d\n", ao_radio_reg_read(CC1120_NUM_TXBYTES)); ao_radio_select(); ao_radio_duplex(&addr, &status, 1); ao_radio_spi_send_fixed(data, len); ao_radio_deselect(); - printf ("num tx bytes: %d\n", ao_radio_reg_read(CC1120_NUM_TXBYTES)); return status; } @@ -223,10 +223,6 @@ static const uint16_t rdf_setup[] = { (0 << CC1120_PKT_CFG0_UART_SWAP_EN)), }; -#define int_pin(w) printf("\t%s: %d\n", \ - w,\ - (AO_CC1120_INT_PORT.idr >> AO_CC1120_INT_PIN) & 1) - static uint8_t ao_radio_marc_status(void) { @@ -245,65 +241,35 @@ ao_radio_rx_done(void) return ao_radio_marc_status() == CC1120_MARC_STATUS1_RX_FINISHED; } +static void +ao_radio_start_tx(void) +{ + ao_radio_reg_write(CC1120_IOCFG2, CC1120_IOCFG_GPIO_CFG_RX0TX1_CFG); + ao_exti_enable(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN); + ao_radio_strobe(CC1120_STX); +} + void ao_radio_rdf(uint8_t len) { int i; ao_radio_get(len); - ao_radio_abort = 0; + ao_radio_wake = 0; for (i = 0; i < sizeof (rdf_setup) / sizeof (rdf_setup[0]); i += 2) ao_radio_reg_write(rdf_setup[i], rdf_setup[i+1]); -#if 0 - int_pin ("Before CFG"); - ao_radio_reg_write(CC1120_IOCFG2, CC1120_IOCFG_GPIO_CFG_RX0TX1_CFG); - int_pin ("After CFG"); -#endif - ao_radio_fifo_write_fixed(ao_radio_rdf_value, len); - ao_radio_reg_write(CC1120_PKT_LEN, len); - - printf ("packet length: %d\n", ao_radio_reg_read(CC1120_PKT_LEN)); - - ao_radio_strobe(CC1120_STX); + ao_radio_start_tx(); - for (i = 0; i < 20; i++) { - printf ("%d ", i); flush(); - printf ("Status %02x ", ao_radio_status()); flush(); - printf ("num_tx_bytes %d ", ao_radio_reg_read(CC1120_NUM_TXBYTES)); flush(); - printf ("marc status %x\n", ao_radio_marc_status()); flush(); - ao_delay(AO_MS_TO_TICKS(50)); - } - -#if 0 - ao_exti_enable(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN); - int_pin ("After strobe"); - ao_delay(AO_MS_TO_TICKS(100)); - int_pin ("After delay"); cli(); - for (i = 0; i < 20; i++) { -#if CC1120_DEBUG - ao_delay(AO_MS_TO_TICKS(50)); - int_pin ("Waited"); - printf ("Status %02x num_tx_bytes %d marc status %x\n", - ao_radio_status(), - ao_radio_reg_read(CC1120_NUM_TXBYTES), - ao_radio_marc_status()); -#else + while (!ao_radio_wake && !ao_radio_abort) ao_sleep(&ao_radio_wake); -#endif - } + sei(); -#endif - printf ("num_tx_bytes %d marc status %x\n", - ao_radio_reg_read(CC1120_NUM_TXBYTES), - ao_radio_marc_status()); -#if 0 if (!ao_radio_tx_done()) ao_radio_idle(); -#endif ao_radio_set_packet(); ao_radio_put(); } @@ -335,7 +301,7 @@ ao_radio_test(void) #endif ao_radio_get(0xff); ao_radio_strobe(CC1120_STX); -#if CC1120_DEBUG +#if CC1120_TRACE { int t; for (t = 0; t < 10; t++) { printf ("status: %02x\n", ao_radio_status()); @@ -363,24 +329,45 @@ ao_radio_test(void) void ao_radio_send(void *d, uint8_t size) { - uint8_t marc_status; - + uint8_t marc_status; + static uint8_t prepare[128]; + uint8_t prepare_len; + static uint8_t encode[256]; + uint8_t encode_len; + static uint8_t interleave[256]; + uint8_t interleave_len; + + ao_fec_dump_bytes(d, size, "Input"); + +#if 1 + prepare_len = ao_fec_prepare(d, size, prepare); + ao_fec_dump_bytes(prepare, prepare_len, "Prepare"); + + ao_fec_whiten(prepare, prepare_len, prepare); + ao_fec_dump_bytes(prepare, prepare_len, "Whiten"); + + encode_len = ao_fec_encode(prepare, prepare_len, encode); + ao_fec_dump_bytes(encode, encode_len, "Encode"); + + interleave_len = ao_fec_interleave(encode, encode_len, interleave); + ao_fec_dump_bytes(interleave, interleave_len, "Interleave"); + ao_radio_get(interleave_len); + ao_radio_fifo_write(interleave, interleave_len); +#else ao_radio_get(size); - ao_radio_wake = 0; ao_radio_fifo_write(d, size); - ao_exti_enable(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN); - ao_radio_strobe(CC1120_STX); +#endif + + ao_radio_wake = 0; + + ao_radio_start_tx(); + cli(); - for (;;) { - if (ao_radio_wake) { - marc_status = ao_radio_marc_status(); - if (marc_status != CC1120_MARC_STATUS1_NO_FAILURE) - break; - ao_radio_wake = 0; - } + while (!ao_radio_wake && !ao_radio_abort) ao_sleep(&ao_radio_wake); - } sei(); + if (!ao_radio_tx_done()) + ao_radio_idle(); ao_radio_put(); } @@ -397,6 +384,7 @@ ao_radio_recv(__xdata void *d, uint8_t size) cli(); for (;;) { if (ao_radio_abort) + break; if (ao_radio_wake) { marc_status = ao_radio_marc_status(); @@ -449,7 +437,7 @@ static const uint16_t packet_setup[] = { CC1120_DRATE0, ((PACKET_DRATE_M >> 0) & 0xff), CC1120_PKT_CFG2, ((CC1120_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1120_PKT_CFG2_CCA_MODE) | (CC1120_PKT_CFG2_PKT_FORMAT_NORMAL << CC1120_PKT_CFG2_PKT_FORMAT)), - CC1120_PKT_CFG1, ((1 << CC1120_PKT_CFG1_WHITE_DATA) | + CC1120_PKT_CFG1, ((0 << CC1120_PKT_CFG1_WHITE_DATA) | (CC1120_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1120_PKT_CFG1_ADDR_CHECK_CFG) | (CC1120_PKT_CFG1_CRC_CFG_DISABLED << CC1120_PKT_CFG1_CRC_CFG) | (1 << CC1120_PKT_CFG1_APPEND_STATUS)), @@ -505,14 +493,10 @@ ao_radio_setup(void) for (i = 0; i < sizeof (radio_setup) / sizeof (radio_setup[0]); i += 2) ao_radio_reg_write(radio_setup[i], radio_setup[i+1]); - /* Enable marc status interrupt on gpio 2 pin */ - ao_radio_reg_write(CC1120_IOCFG2, CC1120_IOCFG_GPIO_CFG_MARC_MCU_WAKEUP); + ao_radio_set_packet(); - /* Enable the EXTI interrupt for the appropriate pin */ -// ao_enable_port(AO_CC1120_INT_PORT); -// ao_exti_setup(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN, AO_EXTI_MODE_FALLING, ao_radio_isr); + ao_config_get(); - ao_radio_set_packet(); ao_radio_configured = 1; } @@ -741,7 +725,22 @@ static void ao_radio_show(void) { } static void ao_radio_beep(void) { - ao_radio_rdf(120); + ao_radio_rdf(RDF_PACKET_LEN); +} + +static void ao_radio_packet(void) { + static uint8_t packet[] = { +#if 1 + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +#else + 3, 1, 2, 3 +#endif + }; + + ao_radio_send(packet, sizeof (packet)); } #endif @@ -751,6 +750,7 @@ static const struct ao_cmds ao_radio_cmds[] = { #if CC1120_DEBUG { ao_radio_show, "R\0Show CC1120 status" }, { ao_radio_beep, "b\0Emit an RDF beacon" }, + { ao_radio_packet, "p\0Send a test packet" }, #endif { 0, NULL } }; @@ -771,5 +771,10 @@ ao_radio_init(void) AO_CC1120_SPI_CS_PORT.bsrr = (1 << AO_CC1120_SPI_CS_PIN); if (i == 10000) ao_panic(AO_PANIC_SELF_TEST); + + /* Enable the EXTI interrupt for the appropriate pin */ + ao_enable_port(AO_CC1120_INT_PORT); + ao_exti_setup(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN, AO_EXTI_MODE_FALLING, ao_radio_isr); + ao_cmd_register(&ao_radio_cmds[0]); }