diff options
Diffstat (limited to 'src')
33 files changed, 1132 insertions, 507 deletions
| diff --git a/src/Makefile b/src/Makefile index 20126de6..a5d7b0f3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -35,6 +35,7 @@ ARMM3DIRS=\  	telegps-v1.0 telegps-v1.0/flash-loader \  	telelco-v0.2 telelco-v0.2/flash-loader \  	telescience-v0.2 telescience-v0.2/flash-loader \ +	teledongle-v1.9 teledongle-v1.9/flash-loader \  	teleballoon-v2.0  ARMM0DIRS=\ diff --git a/src/attiny/ao_arch.h b/src/attiny/ao_arch.h index 8140dd30..6ca12af6 100644 --- a/src/attiny/ao_arch.h +++ b/src/attiny/ao_arch.h @@ -31,6 +31,8 @@  #define AO_STACK_SIZE	116 +#define AO_PORT_TYPE	uint8_t +  /* Various definitions to make GCC look more like SDCC */  #define ao_arch_naked_declare	__attribute__((naked)) diff --git a/src/avr/ao_arch.h b/src/avr/ao_arch.h index d626e830..f8c7f042 100644 --- a/src/avr/ao_arch.h +++ b/src/avr/ao_arch.h @@ -41,6 +41,8 @@  #define AO_STACK_SIZE	116  #endif +#define AO_PORT_TYPE	uint8_t +  /* Various definitions to make GCC look more like SDCC */  #define ao_arch_naked_declare	__attribute__((naked)) diff --git a/src/cc1111/ao_arch.h b/src/cc1111/ao_arch.h index fcac331b..b3c6b5dc 100644 --- a/src/cc1111/ao_arch.h +++ b/src/cc1111/ao_arch.h @@ -40,6 +40,8 @@  #define AO_STACK_END	0xfe  #define AO_STACK_SIZE	(AO_STACK_END - AO_STACK_START + 1) +#define AO_PORT_TYPE	uint8_t +  #define ao_arch_reboot() do {					\  	WDCTL = WDCTL_EN | WDCTL_MODE_WATCHDOG | WDCTL_INT_64;	\  	ao_delay(AO_SEC_TO_TICKS(2));				\ diff --git a/src/drivers/ao_cc115l.c b/src/drivers/ao_cc115l.c index cf61acfe..9e116d62 100644 --- a/src/drivers/ao_cc115l.c +++ b/src/drivers/ao_cc115l.c @@ -246,6 +246,8 @@ ao_radio_idle(void)  	}  	/* Flush any pending TX bytes */  	ao_radio_strobe(CC115L_SFTX); +	/* Make sure the RF calibration is current */ +	ao_radio_strobe(CC115L_SCAL);  }  /* @@ -325,23 +327,22 @@ static const struct {  static const uint16_t packet_setup[] = {  	CC115L_MDMCFG3,		(PACKET_DRATE_M), -	CC115L_MDMCFG2,		(0x00 | -				 (CC115L_MDMCFG2_MOD_FORMAT_GFSK << CC115L_MDMCFG2_MOD_FORMAT) | +	CC115L_MDMCFG2,		((CC115L_MDMCFG2_MOD_FORMAT_GFSK << CC115L_MDMCFG2_MOD_FORMAT) |  				 (0 << CC115L_MDMCFG2_MANCHESTER_EN) |  				 (CC115L_MDMCFG2_SYNC_MODE_16BITS << CC115L_MDMCFG2_SYNC_MODE)),  };  /* - * RDF deviation is 5kHz + * RDF deviation is 3kHz   *   *	fdev = fosc >> 17 * (8 + dev_m) << dev_e   * - *     	26e6 / (2 ** 17) * (8 + 4) * (2 ** 1) = 4761Hz + *     	26e6 / (2 ** 17) * (8 + 7) * (2 ** 0) = 2975   */ -#define RDF_DEV_E	1 -#define RDF_DEV_M	4 +#define RDF_DEV_E	0 +#define RDF_DEV_M	7  /*   * For our RDF beacon, set the symbol rate to 2kBaud (for a 1kHz tone) @@ -364,8 +365,7 @@ static const uint16_t rdf_setup[] = {  	CC115L_MDMCFG4,		((0xf << 4) |  				 (RDF_DRATE_E << CC115L_MDMCFG4_DRATE_E)),  	CC115L_MDMCFG3,		(RDF_DRATE_M), -	CC115L_MDMCFG2,		(0x00 | -				 (CC115L_MDMCFG2_MOD_FORMAT_GFSK << CC115L_MDMCFG2_MOD_FORMAT) | +	CC115L_MDMCFG2,		((CC115L_MDMCFG2_MOD_FORMAT_GFSK << CC115L_MDMCFG2_MOD_FORMAT) |  				 (0 << CC115L_MDMCFG2_MANCHESTER_EN) |  				 (CC115L_MDMCFG2_SYNC_MODE_NONE << CC115L_MDMCFG2_SYNC_MODE)),  }; @@ -401,8 +401,7 @@ static const uint16_t aprs_setup[] = {  	CC115L_MDMCFG4,		((0xf << 4) |  				 (APRS_DRATE_E << CC115L_MDMCFG4_DRATE_E)),  	CC115L_MDMCFG3,		(APRS_DRATE_M), -	CC115L_MDMCFG2,		(0x00 | -				 (CC115L_MDMCFG2_MOD_FORMAT_GFSK << CC115L_MDMCFG2_MOD_FORMAT) | +	CC115L_MDMCFG2,		((CC115L_MDMCFG2_MOD_FORMAT_GFSK << CC115L_MDMCFG2_MOD_FORMAT) |  				 (0 << CC115L_MDMCFG2_MANCHESTER_EN) |  				 (CC115L_MDMCFG2_SYNC_MODE_NONE << CC115L_MDMCFG2_SYNC_MODE)),  }; @@ -491,16 +490,21 @@ 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_MDMCFG1,			    (0x00 | -					     (CC115L_MDMCFG1_NUM_PREAMBLE_4 << CC115L_MDMCFG1_NUM_PREAMBLE) | -					     (1 << CC115L_MDMCFG1_CHANSPC_E)), +	CC115L_MDMCFG1,					/* Modem Configuration */ +		((CC115L_MDMCFG1_NUM_PREAMBLE_4 << CC115L_MDMCFG1_NUM_PREAMBLE) | +		 (1 << CC115L_MDMCFG1_CHANSPC_E)),  	CC115L_MDMCFG0,			    248,	/* Channel spacing M value (100kHz channels) */ +	CC115L_MCSM1,			    0x30,	/* Main Radio Control State Machine Configuration */          CC115L_MCSM0,                       0x38,       /* Main Radio Control State Machine Configuration */          CC115L_RESERVED_0X20,               0xfb,       /* Use setting from SmartRF Studio */ +	CC115L_FREND0,			    0x10,	/* Front End TX Configuration */          CC115L_FSCAL3,                      0xe9,       /* Frequency Synthesizer Calibration */          CC115L_FSCAL2,                      0x2a,       /* Frequency Synthesizer Calibration */          CC115L_FSCAL1,                      0x00,       /* Frequency Synthesizer Calibration */          CC115L_FSCAL0,                      0x1f,       /* Frequency Synthesizer Calibration */ +	CC115L_RESERVED_0X29,		    0x59,	/* RESERVED */ +	CC115L_RESERVED_0X2A,		    0x7f,	/* RESERVED */ +	CC115L_RESERVED_0X2B,		    0x3f,	/* RESERVED */          CC115L_TEST2,                       0x81,       /* Various Test Settings */          CC115L_TEST1,                       0x35,       /* Various Test Settings */          CC115L_TEST0,                       0x09,       /* Various Test Settings */ @@ -508,6 +512,12 @@ static const uint16_t radio_setup[] = {  static uint8_t	ao_radio_configured = 0; +#if HAS_RADIO_POWER +#define RADIO_POWER	ao_config.radio_power +#else +#define RADIO_POWER	0xc0 +#endif +  static void  ao_radio_setup(void)  { @@ -523,6 +533,8 @@ ao_radio_setup(void)  	ao_config_get(); +	ao_radio_reg_write(CC115L_PA, RADIO_POWER); +  	ao_radio_strobe(CC115L_SCAL);  	ao_radio_configured = 1; @@ -553,6 +565,8 @@ ao_radio_get(void)  		ao_radio_reg_write(CC115L_FREQ1, ao_config.radio_setting >> 8);  		ao_radio_reg_write(CC115L_FREQ0, ao_config.radio_setting);  		last_radio_setting = ao_config.radio_setting; +		/* Make sure the RF calibration is current */ +		ao_radio_strobe(CC115L_SCAL);  	}  	if (ao_config.radio_rate != last_radio_rate) {  		ao_radio_mode &= ~AO_RADIO_MODE_BITS_PACKET_TX; @@ -666,23 +680,11 @@ ao_radio_rdf_abort(void)  #define POWER_STEP	0x08 -#if HAS_RADIO_POWER -#define RADIO_POWER	ao_config.radio_power -#else -#define RADIO_POWER	0xc0 -#endif -  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 < RADIO_POWER; power += POWER_STEP) -		ao_radio_reg_write(CC115L_PA, power); -	if (power != RADIO_POWER) -		ao_radio_reg_write(CC115L_PA, RADIO_POWER);  }  static void diff --git a/src/drivers/ao_cc1200.c b/src/drivers/ao_cc1200.c index a69cdc11..8546900e 100644 --- a/src/drivers/ao_cc1200.c +++ b/src/drivers/ao_cc1200.c @@ -21,30 +21,30 @@  #include <ao_fec.h>  #include <ao_packet.h> -#define AO_RADIO_MAX_RECV	sizeof(struct ao_packet) -#define AO_RADIO_MAX_SEND	sizeof(struct ao_packet) -  static uint8_t ao_radio_mutex;  static uint8_t ao_radio_wake;		/* radio ready. Also used as sleep address */  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_marc_status;	/* Last read MARC status value */ -static uint8_t ao_radio_tx_finished;	/* MARC status indicates TX finished */  int8_t	ao_radio_rssi;			/* Last received RSSI value */ -#define CC1200_DEBUG	1 -#define CC1200_TRACE	1 +#ifndef CC1200_DEBUG +#define CC1200_DEBUG		0 +#endif + +#ifndef CC1200_LOW_LEVEL_DEBUG +#define CC1200_LOW_LEVEL_DEBUG	0 +#endif + +#define CC1200_TRACE		0 +#define CC1200_APRS_TRACE	0  extern const uint32_t	ao_radio_cal; -#define FOSC	32000000 +#define FOSC	40000000 -#define ao_radio_try_select(task_id)	ao_spi_try_get_mask(AO_CC1200_SPI_CS_PORT,(1 << AO_CC1200_SPI_CS_PIN),AO_CC1200_SPI_BUS,AO_SPI_SPEED_125kHz, task_id) -#define ao_radio_select()	ao_spi_get_mask(AO_CC1200_SPI_CS_PORT,(1 << AO_CC1200_SPI_CS_PIN),AO_CC1200_SPI_BUS,AO_SPI_SPEED_125kHz) +#define ao_radio_select()	ao_spi_get_mask(AO_CC1200_SPI_CS_PORT,(1 << AO_CC1200_SPI_CS_PIN),AO_CC1200_SPI_BUS,AO_SPI_SPEED_FAST)  #define ao_radio_deselect()	ao_spi_put_mask(AO_CC1200_SPI_CS_PORT,(1 << AO_CC1200_SPI_CS_PIN),AO_CC1200_SPI_BUS) -#define ao_radio_spi_send_sync(d,l)	ao_spi_send_sync((d), (l), AO_CC1200_SPI_BUS)  #define ao_radio_spi_send(d,l)	ao_spi_send((d), (l), AO_CC1200_SPI_BUS)  #define ao_radio_spi_send_fixed(d,l) ao_spi_send_fixed((d), (l), AO_CC1200_SPI_BUS)  #define ao_radio_spi_recv(d,l)	ao_spi_recv((d), (l), AO_CC1200_SPI_BUS) @@ -128,7 +128,6 @@ ao_radio_strobe(uint8_t addr)  	return in;  } -#if 0  static uint8_t  ao_radio_fifo_read(uint8_t *data, uint8_t len)  { @@ -143,7 +142,6 @@ ao_radio_fifo_read(uint8_t *data, uint8_t len)  	ao_radio_deselect();  	return status;  } -#endif  static uint8_t  ao_radio_fifo_write_start(void) @@ -164,7 +162,7 @@ static inline uint8_t ao_radio_fifo_write_stop(uint8_t status) {  }  static uint8_t -ao_radio_fifo_write(uint8_t *data, uint8_t len) +ao_radio_fifo_write(const uint8_t *data, uint8_t len)  {  	uint8_t	status = ao_radio_fifo_write_start();  	ao_radio_spi_send(data, len); @@ -185,13 +183,11 @@ ao_radio_tx_fifo_space(void)  	return CC1200_FIFO_SIZE - ao_radio_reg_read(CC1200_NUM_TXBYTES);  } -#if CC1200_DEBUG || CC1200_TRACE  static uint8_t  ao_radio_status(void)  {  	return ao_radio_strobe (CC1200_SNOP);  } -#endif  void  ao_radio_recv_abort(void) @@ -202,25 +198,6 @@ ao_radio_recv_abort(void)  #define ao_radio_rdf_value 0x55 -static uint8_t -ao_radio_get_marc_status(void) -{ -	return ao_radio_reg_read(CC1200_MARC_STATUS1); -} - -static void -ao_radio_check_marc_status(void) -{ -	ao_radio_mcu_wake = 0; -	ao_radio_marc_status = ao_radio_get_marc_status(); - -	/* Anyt other than 'tx/rx finished' means an error occurred */ -	if (ao_radio_marc_status & ~(CC1200_MARC_STATUS1_TX_FINISHED|CC1200_MARC_STATUS1_RX_FINISHED)) -		ao_radio_abort = 1; -	if (ao_radio_marc_status & (CC1200_MARC_STATUS1_TX_FINISHED)) -		ao_radio_tx_finished = 1; -} -  static void  ao_radio_isr(void)  { @@ -232,13 +209,18 @@ ao_radio_isr(void)  static void  ao_radio_start_tx(void)  { -	ao_exti_set_callback(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN, ao_radio_isr);  	ao_exti_enable(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN); -	ao_radio_tx_finished = 0;  	ao_radio_strobe(CC1200_STX);  }  static void +ao_radio_start_rx(void) +{ +	ao_exti_enable(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN); +	ao_radio_strobe(CC1200_SRX); +} + +static void  ao_radio_idle(void)  {  	for (;;) { @@ -250,37 +232,40 @@ ao_radio_idle(void)  		if (state == CC1200_STATUS_STATE_RX_FIFO_ERROR)  			ao_radio_strobe(CC1200_SFRX);  	} -	/* Flush any pending TX bytes */ +	/* Flush any pending data in the fifos */  	ao_radio_strobe(CC1200_SFTX); +	ao_radio_strobe(CC1200_SFRX); +	/* Make sure the RF calibration is current */ +	ao_radio_strobe(CC1200_SCAL);  }  /*   * Packet deviation   * - *	fdev = fosc >> 24 * (256 + dev_m) << dev_e + *	fdev = fosc >> 22 * (256 + dev_m) << dev_e   *   * Deviation for 38400 baud should be 20.5kHz:   * - *     	32e6Hz / (2 ** 24) * (256 + 80) * (2 ** 5) = 20508Hz + *     	40e6 / (2 ** 22) * (256 + 13) * (2 ** 3) = 20523Hz   *   * Deviation for 9600 baud should be 5.125kHz:   * - *     	32e6Hz / (2 ** 24) * (256 + 80) * (2 ** 3) = 5127Hz + *     	40e6 / (2 ** 22) * (256 + 13) * (2 ** 1) = 5131Hz   *   * Deviation for 2400 baud should be 1.28125kHz, but cc1111 and   * cc115l can't do that, so we'll use 1.5kHz instead:   * - *     	32e6Hz / (2 ** 24) * (256 + 137) * (2 ** 1) = 1499Hz + *     	40e6 / (2 ** 21) * (79) = 1506Hz   */ -#define PACKET_DEV_M_384	80 -#define PACKET_DEV_E_384	5 +#define PACKET_DEV_M_384	13 +#define PACKET_DEV_E_384	3 -#define PACKET_DEV_M_96		80 -#define PACKET_DEV_E_96		3 +#define PACKET_DEV_M_96		13 +#define PACKET_DEV_E_96		1 -#define PACKET_DEV_M_24		137 -#define PACKET_DEV_E_24		1 +#define PACKET_DEV_M_24		79 +#define PACKET_DEV_E_24		0  /*   * For our packet data @@ -299,37 +284,37 @@ ao_radio_idle(void)   *   * Symbol rate 38400 Baud:   * - *	DATARATE_M = 239914 - *	DATARATE_E = 9 - *	CHANBW = 79.4 (79.4) + *	DATARATE_M = 1013008 + *	DATARATE_E = 8 + *	CHANBW = 104.16667   *   * Symbol rate 9600 Baud:   * - *	DATARATE_M = 239914 - *	DATARATE_E = 7 - *	CHANBW = 19.9 (round to 19.8) + *	DATARATE_M = 1013008 + *	DATARATE_E = 6 + *	CHANBW = 26.042 (round to 19.8)   *   * Symbol rate 2400 Baud:   * - *	DATARATE_M = 239914 - *	DATARATE_E = 5 + *	DATARATE_M = 1013008 + *	DATARATE_E = 4   *	CHANBW = 5.0 (round to 9.5)   */ -#define PACKET_SYMBOL_RATE_M	239914 +#define PACKET_SYMBOL_RATE_M		1013008 -#define PACKET_SYMBOL_RATE_E_384	9 +#define PACKET_SYMBOL_RATE_E_384	8  /* 200 / 2 = 100 */  #define PACKET_CHAN_BW_384	((CC1200_CHAN_BW_ADC_CIC_DECFACT_12 << CC1200_CHAN_BW_ADC_CIC_DECFACT) | \ -				 (21 << CC1200_CHAN_BW_BB_CIC_DECFACT)) +				 (16 << CC1200_CHAN_BW_BB_CIC_DECFACT)) -#define PACKET_SYMBOL_RATE_E_96	7 +#define PACKET_SYMBOL_RATE_E_96		6  /* 200 / 10 = 20 */  #define PACKET_CHAN_BW_96	((CC1200_CHAN_BW_ADC_CIC_DECFACT_48 << CC1200_CHAN_BW_ADC_CIC_DECFACT) | \ -				 (21 << CC1200_CHAN_BW_BB_CIC_DECFACT)) +				 (16 << CC1200_CHAN_BW_BB_CIC_DECFACT)) -#define PACKET_SYMBOL_RATE_E_24	5 +#define PACKET_SYMBOL_RATE_E_24		4  /* 200 / 25 = 8 */  #define PACKET_CHAN_BW_24	((CC1200_CHAN_BW_ADC_CIC_DECFACT_48 << CC1200_CHAN_BW_ADC_CIC_DECFACT) | \  				 (44 << CC1200_CHAN_BW_BB_CIC_DECFACT)) @@ -337,17 +322,17 @@ ao_radio_idle(void)  static const uint16_t packet_setup[] = {  	CC1200_SYMBOL_RATE1,		((PACKET_SYMBOL_RATE_M >> 8) & 0xff),  	CC1200_SYMBOL_RATE0,		((PACKET_SYMBOL_RATE_M >> 0) & 0xff), -	CC1200_PKT_CFG2,	((CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | -				 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), -	CC1200_PKT_CFG1,	((0 << CC1200_PKT_CFG1_WHITE_DATA) | -				 (CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1200_PKT_CFG1_ADDR_CHECK_CFG) | -				 (CC1200_PKT_CFG1_CRC_CFG_DISABLED << CC1200_PKT_CFG1_CRC_CFG) | -				 (0 << CC1200_PKT_CFG1_APPEND_STATUS)), -	CC1200_PKT_CFG0,	((0 << CC1200_PKT_CFG0_RESERVED7) | -				 (CC1200_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1200_PKT_CFG0_LENGTH_CONFIG) | -				 (0 << CC1200_PKT_CFG0_PKG_BIT_LEN) | -				 (0 << CC1200_PKT_CFG0_UART_MODE_EN) | -				 (0 << CC1200_PKT_CFG0_UART_SWAP_EN)), +        CC1200_PKT_CFG2,                            	 /* Packet Configuration Reg. 2 */ +		((0 << CC1200_PKT_CFG2_FG_MODE_EN) | +		 (CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | +		 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), +        CC1200_PKT_CFG1,                                 /* Packet Configuration Reg. 1 */ +		((1 << CC1200_PKT_CFG1_FEC_EN) | +		 (1 << CC1200_PKT_CFG1_WHITE_DATA) | +		 (0 << CC1200_PKT_CFG1_PN9_SWAP_EN) | +		 (CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1200_PKT_CFG1_ADDR_CHECK_CFG) | +		 (CC1200_PKT_CFG1_CRC_CFG_CRC16_INIT_ONES << CC1200_PKT_CFG1_CRC_CFG) | +		 (1 << CC1200_PKT_CFG1_APPEND_STATUS)),          CC1200_PREAMBLE_CFG1,	((CC1200_PREAMBLE_CFG1_NUM_PREAMBLE_4_BYTES << CC1200_PREAMBLE_CFG1_NUM_PREAMBLE) |  				 (CC1200_PREAMBLE_CFG1_PREAMBLE_WORD_AA << CC1200_PREAMBLE_CFG1_PREAMBLE_WORD)),  }; @@ -357,10 +342,14 @@ static const uint16_t packet_setup_384[] = {  	CC1200_MODCFG_DEV_E,	((CC1200_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1200_MODCFG_DEV_E_MODEM_MODE) |  				 (CC1200_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1200_MODCFG_DEV_E_MOD_FORMAT) |  				 (PACKET_DEV_E_384 << CC1200_MODCFG_DEV_E_DEV_E)), -	CC1200_SYMBOL_RATE2,		((PACKET_SYMBOL_RATE_E_384 << CC1200_SYMBOL_RATE2_DATARATE_E) | +	CC1200_SYMBOL_RATE2,	((PACKET_SYMBOL_RATE_E_384 << CC1200_SYMBOL_RATE2_DATARATE_E) |  				 (((PACKET_SYMBOL_RATE_M >> 16) & CC1200_SYMBOL_RATE2_DATARATE_M_19_16_MASK) << CC1200_SYMBOL_RATE2_DATARATE_M_19_16)),  	CC1200_CHAN_BW,		PACKET_CHAN_BW_384, -	CC1200_PA_CFG0,		0x7b, +        CC1200_MDMCFG2,                                  /* General Modem Parameter Configuration Reg. 2 */ +		((CC1200_MDMCFG2_ASK_SHAPE_8 << CC1200_MDMCFG2_ASK_SHAPE) | +		 (CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_0 << CC1200_MDMCFG2_SYMBOL_MAP_CFG) | +		 (CC1200_MDMCFG2_UPSAMPLER_P_8 << CC1200_MDMCFG2_UPSAMPLER_P) | +		 (0 << CC1200_MDMCFG2_CFM_DATA_EN)),  };  static const uint16_t packet_setup_96[] = { @@ -368,10 +357,14 @@ static const uint16_t packet_setup_96[] = {  	CC1200_MODCFG_DEV_E,	((CC1200_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1200_MODCFG_DEV_E_MODEM_MODE) |  				 (CC1200_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1200_MODCFG_DEV_E_MOD_FORMAT) |  				 (PACKET_DEV_E_96 << CC1200_MODCFG_DEV_E_DEV_E)), -	CC1200_SYMBOL_RATE2,		((PACKET_SYMBOL_RATE_E_96 << CC1200_SYMBOL_RATE2_DATARATE_E) | +	CC1200_SYMBOL_RATE2,	((PACKET_SYMBOL_RATE_E_96 << CC1200_SYMBOL_RATE2_DATARATE_E) |  				 (((PACKET_SYMBOL_RATE_M >> 16) & CC1200_SYMBOL_RATE2_DATARATE_M_19_16_MASK) << CC1200_SYMBOL_RATE2_DATARATE_M_19_16)),  	CC1200_CHAN_BW,		PACKET_CHAN_BW_96, -	CC1200_PA_CFG0,		0x7d, +        CC1200_MDMCFG2,                                  /* General Modem Parameter Configuration Reg. 2 */ +		((CC1200_MDMCFG2_ASK_SHAPE_8 << CC1200_MDMCFG2_ASK_SHAPE) | +		 (CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_0 << CC1200_MDMCFG2_SYMBOL_MAP_CFG) | +		 (CC1200_MDMCFG2_UPSAMPLER_P_32 << CC1200_MDMCFG2_UPSAMPLER_P) | +		 (0 << CC1200_MDMCFG2_CFM_DATA_EN)),  };  static const uint16_t packet_setup_24[] = { @@ -379,34 +372,27 @@ static const uint16_t packet_setup_24[] = {  	CC1200_MODCFG_DEV_E,	((CC1200_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1200_MODCFG_DEV_E_MODEM_MODE) |  				 (CC1200_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1200_MODCFG_DEV_E_MOD_FORMAT) |  				 (PACKET_DEV_E_24 << CC1200_MODCFG_DEV_E_DEV_E)), -	CC1200_SYMBOL_RATE2,		((PACKET_SYMBOL_RATE_E_24 << CC1200_SYMBOL_RATE2_DATARATE_E) | +	CC1200_SYMBOL_RATE2,	((PACKET_SYMBOL_RATE_E_24 << CC1200_SYMBOL_RATE2_DATARATE_E) |  				 (((PACKET_SYMBOL_RATE_M >> 16) & CC1200_SYMBOL_RATE2_DATARATE_M_19_16_MASK) << CC1200_SYMBOL_RATE2_DATARATE_M_19_16)),  	CC1200_CHAN_BW,		PACKET_CHAN_BW_24, -	CC1200_PA_CFG0,		0x7e, -}; - -static const uint16_t packet_tx_setup[] = { -	CC1200_PKT_CFG2,	((CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | -				 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), -	AO_CC1200_INT_GPIO_IOCFG, 		CC1200_IOCFG_GPIO_CFG_RX0TX1_CFG, -}; - -static const uint16_t packet_rx_setup[] = { -	CC1200_PKT_CFG2,	((CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | -				 (CC1200_PKT_CFG2_PKT_FORMAT_SYNCHRONOUS_SERIAL << CC1200_PKT_CFG2_PKT_FORMAT)), -	AO_CC1200_INT_GPIO_IOCFG, 		CC1200_IOCFG_GPIO_CFG_CLKEN_SOFT, +        CC1200_MDMCFG2,                                  /* General Modem Parameter Configuration Reg. 2 */ +		((CC1200_MDMCFG2_ASK_SHAPE_8 << CC1200_MDMCFG2_ASK_SHAPE) | +		 (CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_0 << CC1200_MDMCFG2_SYMBOL_MAP_CFG) | +		 (CC1200_MDMCFG2_UPSAMPLER_P_64 << CC1200_MDMCFG2_UPSAMPLER_P) | +		 (0 << CC1200_MDMCFG2_CFM_DATA_EN)),  };  /* - * RDF deviation is 5kHz + * RDF deviation is 3kHz   * - *	fdev = fosc >> 24 * (256 + dev_m) << dev_e + *	fdev = fosc >> 22 * (256 + dev_m) << dev_e	dev_e != 0 + *	fdev = fosc >> 21 * dev_m			dev_e == 0   * - *     	32e6Hz / (2 ** 24) * (256 + 71) * (2 ** 3) = 4989 + *     	40e6 / (2 ** 21) * 157 = 2995Hz   */ -#define RDF_DEV_E	3 -#define RDF_DEV_M	71 +#define RDF_DEV_E	0 +#define RDF_DEV_M	157  /*   * For our RDF beacon, set the symbol rate to 2kBaud (for a 1kHz tone) @@ -415,13 +401,13 @@ static const uint16_t packet_rx_setup[] = {   *	Rdata = -------------------------------------- * fosc   *		             2 ** 39   * - *	DATARATE_M = 25166 - *	DATARATE_E = 5 + *	DATARATE_M = 669411 + *	DATARATE_E = 4   *   * To make the tone last for 200ms, we need 2000 * .2 = 400 bits or 50 bytes   */ -#define RDF_SYMBOL_RATE_E	5 -#define RDF_SYMBOL_RATE_M	25166 +#define RDF_SYMBOL_RATE_E	4 +#define RDF_SYMBOL_RATE_M	669411  #define RDF_PACKET_LEN	50  static const uint16_t rdf_setup[] = { @@ -429,36 +415,42 @@ static const uint16_t rdf_setup[] = {  	CC1200_MODCFG_DEV_E,	((CC1200_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1200_MODCFG_DEV_E_MODEM_MODE) |  				 (CC1200_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1200_MODCFG_DEV_E_MOD_FORMAT) |  				 (RDF_DEV_E << CC1200_MODCFG_DEV_E_DEV_E)), -	CC1200_SYMBOL_RATE2,		((RDF_SYMBOL_RATE_E << CC1200_SYMBOL_RATE2_DATARATE_E) | +	CC1200_SYMBOL_RATE2,	((RDF_SYMBOL_RATE_E << CC1200_SYMBOL_RATE2_DATARATE_E) |  				 (((RDF_SYMBOL_RATE_M >> 16) & CC1200_SYMBOL_RATE2_DATARATE_M_19_16_MASK) << CC1200_SYMBOL_RATE2_DATARATE_M_19_16)), -	CC1200_SYMBOL_RATE1,		((RDF_SYMBOL_RATE_M >> 8) & 0xff), -	CC1200_SYMBOL_RATE0,		((RDF_SYMBOL_RATE_M >> 0) & 0xff), -	CC1200_PKT_CFG2,	((CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | -				 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), -	CC1200_PKT_CFG1,	((0 << CC1200_PKT_CFG1_WHITE_DATA) | -				 (CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1200_PKT_CFG1_ADDR_CHECK_CFG) | -				 (CC1200_PKT_CFG1_CRC_CFG_DISABLED << CC1200_PKT_CFG1_CRC_CFG) | -				 (0 << CC1200_PKT_CFG1_APPEND_STATUS)), -	CC1200_PKT_CFG0,	((0 << CC1200_PKT_CFG0_RESERVED7) | -				 (CC1200_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1200_PKT_CFG0_LENGTH_CONFIG) | -				 (0 << CC1200_PKT_CFG0_PKG_BIT_LEN) | -				 (0 << CC1200_PKT_CFG0_UART_MODE_EN) | -				 (0 << CC1200_PKT_CFG0_UART_SWAP_EN)), -        CC1200_PREAMBLE_CFG1,	((CC1200_PREAMBLE_CFG1_NUM_PREAMBLE_NONE << CC1200_PREAMBLE_CFG1_NUM_PREAMBLE) | -				 (CC1200_PREAMBLE_CFG1_PREAMBLE_WORD_AA << CC1200_PREAMBLE_CFG1_PREAMBLE_WORD)), -	CC1200_PA_CFG0,		0x7e, +	CC1200_SYMBOL_RATE1,	((RDF_SYMBOL_RATE_M >> 8) & 0xff), +	CC1200_SYMBOL_RATE0,	((RDF_SYMBOL_RATE_M >> 0) & 0xff), +        CC1200_PKT_CFG2,                            	 /* Packet Configuration Reg. 2 */ +		((0 << CC1200_PKT_CFG2_FG_MODE_EN) | +		 (CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | +		 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), +        CC1200_PKT_CFG1,                                 /* Packet Configuration Reg. 1 */ +		((0 << CC1200_PKT_CFG1_FEC_EN) | +		 (0 << CC1200_PKT_CFG1_WHITE_DATA) | +		 (0 << CC1200_PKT_CFG1_PN9_SWAP_EN) | +		 (CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1200_PKT_CFG1_ADDR_CHECK_CFG) | +		 (CC1200_PKT_CFG1_CRC_CFG_DISABLED << CC1200_PKT_CFG1_CRC_CFG) | +		 (0 << CC1200_PKT_CFG1_APPEND_STATUS)), +        CC1200_PREAMBLE_CFG1, +		((CC1200_PREAMBLE_CFG1_NUM_PREAMBLE_NONE << CC1200_PREAMBLE_CFG1_NUM_PREAMBLE) | +		 (CC1200_PREAMBLE_CFG1_PREAMBLE_WORD_AA << CC1200_PREAMBLE_CFG1_PREAMBLE_WORD)), +        CC1200_MDMCFG2,                                  /* General Modem Parameter Configuration Reg. 2 */ +		((0 << CC1200_MDMCFG2_ASK_SHAPE) | +		 (0 << CC1200_MDMCFG2_SYMBOL_MAP_CFG) | +		 (12 << CC1200_MDMCFG2_UPSAMPLER_P) | +		 (0 << CC1200_MDMCFG2_CFM_DATA_EN)),  };  /*   * APRS deviation is 3kHz   * - *	fdev = fosc >> 24 * (256 + dev_m) << dev_e + *	fdev = fosc >> 22 * (256 + dev_m) << dev_e	dev_e != 0 + *	fdev = fosc >> 21 * dev_m			dev_e == 0   * - *     	32e6Hz / (2 ** 24) * (256 + 137) * (2 ** 2) = 2998Hz + *     	40e6 / (2 ** 21) * 157 = 2995Hz   */ -#define APRS_DEV_E	2 -#define APRS_DEV_M	137 +#define APRS_DEV_E	0 +#define APRS_DEV_M	157  /*   * For our APRS beacon, set the symbol rate to 9.6kBaud (8x oversampling for 1200 baud data rate) @@ -467,33 +459,48 @@ static const uint16_t rdf_setup[] = {   *	Rdata = -------------------------------------- * fosc   *		             2 ** 39   * - *	DATARATE_M = 239914 - *	DATARATE_E = 7 + *	DATARATE_M = 1013008 + *	DATARATE_E = 6   *   *	Rdata = 9599.998593330383301   *   */ -#define APRS_SYMBOL_RATE_E	7 -#define APRS_SYMBOL_RATE_M	239914 +#define APRS_SYMBOL_RATE_E	6 +#define APRS_SYMBOL_RATE_M	1013008  static const uint16_t aprs_setup[] = {  	CC1200_DEVIATION_M,	APRS_DEV_M,  	CC1200_MODCFG_DEV_E,	((CC1200_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1200_MODCFG_DEV_E_MODEM_MODE) |  				 (CC1200_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1200_MODCFG_DEV_E_MOD_FORMAT) |  				 (APRS_DEV_E << CC1200_MODCFG_DEV_E_DEV_E)), -	CC1200_SYMBOL_RATE2,		((APRS_SYMBOL_RATE_E << CC1200_SYMBOL_RATE2_DATARATE_E) | +	CC1200_SYMBOL_RATE2,	((APRS_SYMBOL_RATE_E << CC1200_SYMBOL_RATE2_DATARATE_E) |  				 (((APRS_SYMBOL_RATE_M >> 16) & CC1200_SYMBOL_RATE2_DATARATE_M_19_16_MASK) << CC1200_SYMBOL_RATE2_DATARATE_M_19_16)), -	CC1200_SYMBOL_RATE1,		((APRS_SYMBOL_RATE_M >> 8) & 0xff), -	CC1200_SYMBOL_RATE0,		((APRS_SYMBOL_RATE_M >> 0) & 0xff), -	CC1200_PKT_CFG2,	((CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | -				 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), -	CC1200_PKT_CFG1,	((0 << CC1200_PKT_CFG1_WHITE_DATA) | -				 (CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1200_PKT_CFG1_ADDR_CHECK_CFG) | -				 (CC1200_PKT_CFG1_CRC_CFG_DISABLED << CC1200_PKT_CFG1_CRC_CFG) | -				 (0 << CC1200_PKT_CFG1_APPEND_STATUS)), -        CC1200_PREAMBLE_CFG1,	((CC1200_PREAMBLE_CFG1_NUM_PREAMBLE_NONE << CC1200_PREAMBLE_CFG1_NUM_PREAMBLE) | -				 (CC1200_PREAMBLE_CFG1_PREAMBLE_WORD_AA << CC1200_PREAMBLE_CFG1_PREAMBLE_WORD)), -	CC1200_PA_CFG0,		0x7d, +	CC1200_SYMBOL_RATE1,	((APRS_SYMBOL_RATE_M >> 8) & 0xff), +	CC1200_SYMBOL_RATE0,	((APRS_SYMBOL_RATE_M >> 0) & 0xff), +        CC1200_PKT_CFG2,                            	 /* Packet Configuration Reg. 2 */ +		((0 << CC1200_PKT_CFG2_FG_MODE_EN) | +		 (CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | +		 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), +        CC1200_PKT_CFG1,                                 /* Packet Configuration Reg. 1 */ +		((0 << CC1200_PKT_CFG1_FEC_EN) | +		 (0 << CC1200_PKT_CFG1_WHITE_DATA) | +		 (0 << CC1200_PKT_CFG1_PN9_SWAP_EN) | +		 (CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1200_PKT_CFG1_ADDR_CHECK_CFG) | +		 (CC1200_PKT_CFG1_CRC_CFG_DISABLED << CC1200_PKT_CFG1_CRC_CFG) | +		 (0 << CC1200_PKT_CFG1_APPEND_STATUS)), +        CC1200_PKT_CFG0,                                 /* Packet Configuration Reg. 0 */ +		((CC1200_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1200_PKT_CFG0_LENGTH_CONFIG) | +		 (0 << CC1200_PKT_CFG0_PKG_BIT_LEN) | +		 (0 << CC1200_PKT_CFG0_UART_MODE_EN) | +		 (0 << CC1200_PKT_CFG0_UART_SWAP_EN)), +        CC1200_PREAMBLE_CFG1, +		((CC1200_PREAMBLE_CFG1_NUM_PREAMBLE_NONE << CC1200_PREAMBLE_CFG1_NUM_PREAMBLE) | +		 (CC1200_PREAMBLE_CFG1_PREAMBLE_WORD_AA << CC1200_PREAMBLE_CFG1_PREAMBLE_WORD)), +        CC1200_MDMCFG2,                                  /* General Modem Parameter Configuration Reg. 2 */ +		((CC1200_MDMCFG2_ASK_SHAPE_8 << CC1200_MDMCFG2_ASK_SHAPE) | +		 (CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_0 << CC1200_MDMCFG2_SYMBOL_MAP_CFG) | +		 (CC1200_MDMCFG2_UPSAMPLER_P_8 << CC1200_MDMCFG2_UPSAMPLER_P) | +		 (0 << CC1200_MDMCFG2_CFM_DATA_EN)),  };  /* @@ -521,14 +528,12 @@ static const uint16_t test_setup[] = {  				 (CC1200_PREAMBLE_CFG1_PREAMBLE_WORD_AA << CC1200_PREAMBLE_CFG1_PREAMBLE_WORD)),  }; -#define AO_PKT_CFG0_INFINITE ((0 << CC1200_PKT_CFG0_RESERVED7) |	\ -			      (CC1200_PKT_CFG0_LENGTH_CONFIG_INFINITE << CC1200_PKT_CFG0_LENGTH_CONFIG) | \ +#define AO_PKT_CFG0_INFINITE ((CC1200_PKT_CFG0_LENGTH_CONFIG_INFINITE << CC1200_PKT_CFG0_LENGTH_CONFIG) | \  			      (0 << CC1200_PKT_CFG0_PKG_BIT_LEN) |	\  			      (0 << CC1200_PKT_CFG0_UART_MODE_EN) |	\  			      (0 << CC1200_PKT_CFG0_UART_SWAP_EN)) -#define AO_PKT_CFG0_FIXED ((0 << CC1200_PKT_CFG0_RESERVED7) |		\ -			   (CC1200_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1200_PKT_CFG0_LENGTH_CONFIG) | \ +#define AO_PKT_CFG0_FIXED ((CC1200_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1200_PKT_CFG0_LENGTH_CONFIG) | \  			   (0 << CC1200_PKT_CFG0_PKG_BIT_LEN) |		\  			   (0 << CC1200_PKT_CFG0_UART_MODE_EN) |	\  			   (0 << CC1200_PKT_CFG0_UART_SWAP_EN)) @@ -536,10 +541,9 @@ static const uint16_t test_setup[] = {  static uint16_t ao_radio_mode;  #define AO_RADIO_MODE_BITS_PACKET	1 -#define AO_RADIO_MODE_BITS_PACKET_TX	2  #define AO_RADIO_MODE_BITS_TX_BUF	4  #define AO_RADIO_MODE_BITS_TX_FINISH	8 -#define AO_RADIO_MODE_BITS_PACKET_RX	16 +#define AO_RADIO_MODE_BITS_RX		16  #define AO_RADIO_MODE_BITS_RDF		32  #define AO_RADIO_MODE_BITS_APRS		64  #define AO_RADIO_MODE_BITS_TEST		128 @@ -547,14 +551,13 @@ static uint16_t ao_radio_mode;  #define AO_RADIO_MODE_BITS_FIXED	512  #define AO_RADIO_MODE_NONE		0 -#define AO_RADIO_MODE_PACKET_TX_BUF	(AO_RADIO_MODE_BITS_PACKET | AO_RADIO_MODE_BITS_PACKET_TX | AO_RADIO_MODE_BITS_TX_BUF) -#define AO_RADIO_MODE_PACKET_TX_FINISH	(AO_RADIO_MODE_BITS_PACKET | AO_RADIO_MODE_BITS_PACKET_TX | AO_RADIO_MODE_BITS_TX_FINISH) -#define AO_RADIO_MODE_PACKET_RX		(AO_RADIO_MODE_BITS_PACKET | AO_RADIO_MODE_BITS_PACKET_RX) -#define AO_RADIO_MODE_RDF		(AO_RADIO_MODE_BITS_RDF | AO_RADIO_MODE_BITS_TX_FINISH) -#define AO_RADIO_MODE_APRS_BUF		(AO_RADIO_MODE_BITS_APRS | AO_RADIO_MODE_BITS_INFINITE | AO_RADIO_MODE_BITS_TX_BUF) -#define AO_RADIO_MODE_APRS_LAST_BUF	(AO_RADIO_MODE_BITS_APRS | AO_RADIO_MODE_BITS_FIXED | AO_RADIO_MODE_BITS_TX_BUF) -#define AO_RADIO_MODE_APRS_FINISH	(AO_RADIO_MODE_BITS_APRS | AO_RADIO_MODE_BITS_FIXED | AO_RADIO_MODE_BITS_TX_FINISH) -#define AO_RADIO_MODE_TEST		(AO_RADIO_MODE_BITS_TEST | AO_RADIO_MODE_BITS_INFINITE | AO_RADIO_MODE_BITS_TX_BUF) +#define AO_RADIO_MODE_PACKET_TX		(AO_RADIO_MODE_BITS_PACKET | AO_RADIO_MODE_BITS_FIXED    | AO_RADIO_MODE_BITS_TX_FINISH) +#define AO_RADIO_MODE_PACKET_RX		(AO_RADIO_MODE_BITS_PACKET | AO_RADIO_MODE_BITS_FIXED    | AO_RADIO_MODE_BITS_RX) +#define AO_RADIO_MODE_RDF		(AO_RADIO_MODE_BITS_RDF    | AO_RADIO_MODE_BITS_FIXED    | AO_RADIO_MODE_BITS_TX_FINISH) +#define AO_RADIO_MODE_APRS_BUF		(AO_RADIO_MODE_BITS_APRS   | AO_RADIO_MODE_BITS_INFINITE | AO_RADIO_MODE_BITS_TX_BUF) +#define AO_RADIO_MODE_APRS_LAST_BUF	(AO_RADIO_MODE_BITS_APRS   | AO_RADIO_MODE_BITS_FIXED    | AO_RADIO_MODE_BITS_TX_BUF) +#define AO_RADIO_MODE_APRS_FINISH	(AO_RADIO_MODE_BITS_APRS   | AO_RADIO_MODE_BITS_FIXED    | AO_RADIO_MODE_BITS_TX_FINISH) +#define AO_RADIO_MODE_TEST		(AO_RADIO_MODE_BITS_TEST   | AO_RADIO_MODE_BITS_INFINITE | AO_RADIO_MODE_BITS_TX_BUF)  static void  _ao_radio_set_regs(const uint16_t *regs, int nreg) @@ -596,17 +599,20 @@ ao_radio_set_mode(uint16_t new_mode)  		}  	} -	if (changes & AO_RADIO_MODE_BITS_PACKET_TX) -		ao_radio_set_regs(packet_tx_setup); - -	if (changes & AO_RADIO_MODE_BITS_TX_BUF) +	if (changes & AO_RADIO_MODE_BITS_TX_BUF) {  		ao_radio_reg_write(AO_CC1200_INT_GPIO_IOCFG, CC1200_IOCFG_GPIO_CFG_TXFIFO_THR); +		ao_exti_set_mode(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN, AO_EXTI_MODE_FALLING|AO_EXTI_PRIORITY_HIGH); +	} -	if (changes & AO_RADIO_MODE_BITS_TX_FINISH) -		ao_radio_reg_write(AO_CC1200_INT_GPIO_IOCFG, CC1200_IOCFG_GPIO_CFG_RX0TX1_CFG); +	if (changes & AO_RADIO_MODE_BITS_TX_FINISH) { +		ao_radio_reg_write(AO_CC1200_INT_GPIO_IOCFG, CC1200_IOCFG_GPIO_CFG_PKT_SYNC_RXTX); +		ao_exti_set_mode(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN, AO_EXTI_MODE_FALLING|AO_EXTI_PRIORITY_HIGH); +	} -	if (changes & AO_RADIO_MODE_BITS_PACKET_RX) -		ao_radio_set_regs(packet_rx_setup); +	if (changes & AO_RADIO_MODE_BITS_RX) { +		ao_radio_reg_write(AO_CC1200_INT_GPIO_IOCFG, CC1200_IOCFG_GPIO_CFG_MARC_MCU_WAKEUP); +		ao_exti_set_mode(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN, AO_EXTI_MODE_RISING|AO_EXTI_PRIORITY_HIGH); +	}  	if (changes & AO_RADIO_MODE_BITS_RDF)  		ao_radio_set_regs(rdf_setup); @@ -635,12 +641,14 @@ static uint8_t	ao_radio_configured = 0;  static void  ao_radio_setup(void)  { -//	ao_radio_strobe(CC1200_SRES); +	ao_radio_strobe(CC1200_SRES);  	ao_radio_set_regs(radio_setup);  	ao_radio_mode = 0; +	ao_radio_idle(); +  	ao_config_get();  	ao_radio_configured = 1; @@ -672,6 +680,7 @@ ao_radio_get(uint8_t len)  		ao_radio_reg_write(CC1200_FREQ1, ao_config.radio_setting >> 8);  		ao_radio_reg_write(CC1200_FREQ0, ao_config.radio_setting);  		last_radio_setting = ao_config.radio_setting; +		ao_radio_strobe(CC1200_SCAL);  	}  	if (ao_config.radio_rate != last_radio_rate) {  		ao_radio_mode &= ~AO_RADIO_MODE_BITS_PACKET; @@ -682,6 +691,43 @@ ao_radio_get(uint8_t len)  #define ao_radio_put()	ao_mutex_put(&ao_radio_mutex) +static inline uint8_t +ao_radio_state(void) +{ +	return (ao_radio_status() >> CC1200_STATUS_STATE) & CC1200_STATUS_STATE_MASK; +} + +#if CC1200_DEBUG +void +ao_radio_show_state(char *where) +{ +	printf("%s: state %d len %d rxbytes %d\n", +	       where, ao_radio_state(), +	       ao_radio_reg_read(CC1200_PKT_LEN), +	       ao_radio_reg_read(CC1200_NUM_RXBYTES)); +} +#else +#define ao_radio_show_state(where) +#endif + +/* Wait for the radio to signal an interrupt + */ +static void +ao_radio_wait_isr(uint16_t timeout) +{ +	if (timeout) +		ao_alarm(timeout); + +	ao_arch_block_interrupts(); +	while (!ao_radio_wake && !ao_radio_abort) +		if (ao_sleep(&ao_radio_wake)) +			ao_radio_abort = 1; +	ao_arch_release_interrupts(); + +	if (timeout) +		ao_clear_alarm(); +} +  static void  ao_rdf_start(uint8_t len)  { @@ -690,20 +736,15 @@ ao_rdf_start(uint8_t len)  	ao_radio_set_mode(AO_RADIO_MODE_RDF);  	ao_radio_wake = 0; -  }  static void -ao_rdf_run(void) +ao_radio_run(void)  { +	ao_radio_wake = 0; +	ao_radio_abort = 0;  	ao_radio_start_tx(); - -	ao_arch_block_interrupts(); -	while (!ao_radio_wake && !ao_radio_abort && !ao_radio_mcu_wake) -		ao_sleep(&ao_radio_wake); -	ao_arch_release_interrupts(); -	if (ao_radio_mcu_wake) -		ao_radio_check_marc_status(); +	ao_radio_wait_isr(0);  	if (!ao_radio_wake)  		ao_radio_idle();  	ao_radio_put(); @@ -716,7 +757,7 @@ ao_radio_rdf(void)  	ao_radio_fifo_write_fixed(ao_radio_rdf_value, AO_RADIO_RDF_LEN); -	ao_rdf_run(); +	ao_radio_run();  }  void @@ -738,7 +779,7 @@ ao_radio_continuity(uint8_t c)  	ao_radio_spi_send_fixed(0x00, AO_RADIO_CONT_PAUSE_LEN);  	status = ao_radio_fifo_write_stop(status);  	(void) status; -	ao_rdf_run(); +	ao_radio_run();  }  void @@ -794,29 +835,18 @@ ao_radio_test_cmd(void)  	}  } -static void -ao_radio_wait_isr(uint16_t timeout) -{ -	if (timeout) -		ao_alarm(timeout); -	ao_arch_block_interrupts(); -	while (!ao_radio_wake && !ao_radio_mcu_wake && !ao_radio_abort) -		if (ao_sleep(&ao_radio_wake)) -			ao_radio_abort = 1; -	ao_arch_release_interrupts(); -	if (timeout) -		ao_clear_alarm(); -	if (ao_radio_mcu_wake) -		ao_radio_check_marc_status(); -} -  void  ao_radio_send(const void *d, uint8_t size)  { -	(void) d; -	(void) size; +	ao_radio_get(size); +	ao_radio_set_mode(AO_RADIO_MODE_PACKET_TX); + +	ao_radio_fifo_write(d, size); + +	ao_radio_run();  } +  #define AO_RADIO_LOTS	64  void @@ -829,6 +859,7 @@ ao_radio_send_aprs(ao_radio_fill_func fill)  	uint8_t	started = 0;  	uint8_t	fifo_space; +	ao_radio_abort = 0;  	ao_radio_get(0xff);  	fifo_space = CC1200_FIFO_SIZE;  	while (!done) { @@ -837,6 +868,9 @@ ao_radio_send_aprs(ao_radio_fill_func fill)  			done = 1;  			cnt = -cnt;  		} +#if CC1200_APRS_TRACE +		printf("APRS fill %d bytes done %d\n", cnt, done); +#endif  		total += cnt;  		/* At the last buffer, set the total length */ @@ -849,8 +883,11 @@ ao_radio_send_aprs(ao_radio_fill_func fill)  			/* Wait for some space in the fifo */  			while (!ao_radio_abort && (fifo_space = ao_radio_tx_fifo_space()) == 0) { +#if CC1200_APRS_TRACE +				printf("APRS space %d cnt %d\n", fifo_space, cnt); flush(); +#endif  				ao_radio_wake = 0; -				ao_radio_wait_isr(0); +				ao_radio_wait_isr(AO_MS_TO_TICKS(1000));  			}  			if (ao_radio_abort)  				break; @@ -867,33 +904,194 @@ ao_radio_send_aprs(ao_radio_fill_func fill)  			} else  				ao_radio_set_mode(AO_RADIO_MODE_APRS_BUF); +			ao_exti_enable(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN); +  			ao_radio_fifo_write(b, this_len);  			b += this_len; - +#if CC1200_APRS_TRACE +			printf("APRS write fifo %d space now %d\n", this_len, ao_radio_tx_fifo_space()); +#endif  			if (!started) { -				ao_radio_start_tx(); +#if CC1200_APRS_TRACE +				printf("APRS start\n"); +#endif +				ao_radio_strobe(CC1200_STX); +#if CC1200_APRS_TRACE +				{ int t; +					for (t = 0; t < 20; t++) { +						uint8_t	status = ao_radio_status(); +						uint8_t space = ao_radio_tx_fifo_space(); +						printf ("status: %02x fifo %d\n", status, space); +						if ((status >> 4) == 2) +							break; +						ao_delay(AO_MS_TO_TICKS(0)); +					} +				} +#endif  				started = 1; -			} else -				ao_exti_enable(AO_CC1200_INT_PORT, AO_CC1200_INT_PIN); +			}  		}  		if (ao_radio_abort) {  			ao_radio_idle();  			break;  		} -		/* Wait for the transmitter to go idle */ -		ao_radio_wake = 0; -		ao_radio_wait_isr(0);  	} +	/* Wait for the transmitter to go idle */ +	ao_radio_wake = 0; +#if CC1200_APRS_TRACE +	printf("APRS wait idle\n"); flush(); +#endif +	ao_radio_wait_isr(AO_MS_TO_TICKS(1000)); +#if CC1200_APRS_TRACE +	printf("APRS abort %d\n", ao_radio_abort); +#endif  	ao_radio_put();  } +#if 0 +static uint8_t +ao_radio_marc_state(void) +{ +	return ao_radio_reg_read(CC1200_MARCSTATE); +} + +static uint8_t +ao_radio_modem_status1(void) +{ +	return ao_radio_reg_read(CC1200_MODEM_STATUS1); +} + +static uint8_t +ao_radio_modem_status0(void) +{ +	return ao_radio_reg_read(CC1200_MODEM_STATUS0); +} + +struct ao_radio_state { +	char	where[4]; +	uint8_t	marc_state; +	uint8_t marc_status1; +	uint8_t marc_status0; +	uint8_t	modem_status1; +	uint8_t	modem_status0; +}; + +static void +ao_radio_fill_state(char *where, struct ao_radio_state *s) +{ +	strcpy(s->where, where); +	s->marc_state = ao_radio_marc_state(); +	s->marc_status1 = ao_radio_reg_read(CC1200_MARC_STATUS1); +	s->marc_status0 = ao_radio_reg_read(CC1200_MARC_STATUS0); +	s->modem_status1 = ao_radio_modem_status1(); +	s->modem_status0 = ao_radio_modem_status0(); +} + +static void +ao_radio_dump_state(struct ao_radio_state *s) +{ +	printf ("%s: marc %2x marc1 %2x marc0 %2x modem1 %2x modem0 %2x\n", +		s->where, s->marc_state, s->marc_status1, s->marc_status0, s->modem_status1, s->modem_status0); +} +#endif +  uint8_t  ao_radio_recv(__xdata void *d, uint8_t size, uint8_t timeout)  { -	(void) d; -	(void) size; -	(void) timeout; -	return 0; +	uint8_t	success = 0; + +	ao_radio_abort = 0; +	ao_radio_get(size - 2); +	ao_radio_set_mode(AO_RADIO_MODE_PACKET_RX); +	ao_radio_wake = 0; +	ao_radio_start_rx(); + +	while (!ao_radio_abort) { +		ao_radio_wait_isr(timeout); +		if (ao_radio_wake) { +			uint8_t		marc_status1 = ao_radio_reg_read(CC1200_MARC_STATUS1); + +			/* Check the receiver status to see what happened +			 */ +			switch (marc_status1) { +			case CC1200_MARC_STATUS1_RX_FINISHED: +			case CC1200_MARC_STATUS1_ADDRESS: +			case CC1200_MARC_STATUS1_CRC: +				/* Normal return, go fetch the bytes from the FIFO +				 * and give them back to the caller +				 */ +				success = 1; +				break; +			case CC1200_MARC_STATUS1_RX_TIMEOUT: +			case CC1200_MARC_STATUS1_RX_TERMINATION: +			case CC1200_MARC_STATUS1_EWOR_SYNC_LOST: +			case CC1200_MARC_STATUS1_MAXIMUM_LENGTH: +			case CC1200_MARC_STATUS1_RX_FIFO_OVERFLOW: +			case CC1200_MARC_STATUS1_RX_FIFO_UNDERFLOW: +				/* Something weird happened; reset the radio and +				 * return failure +				 */ +				success = 0; +				break; +			default: +				/* some other status; go wait for the radio to do something useful +				 */ +				continue; +			} +			break; +		} else { +			uint8_t modem_status1 = ao_radio_reg_read(CC1200_MODEM_STATUS1); + +			/* Check to see if the packet header has been seen, in which case we'll +			 * want to keep waiting for the rest of the packet to appear +			 */ +			if (modem_status1 & (1 << CC1200_MODEM_STATUS1_SYNC_FOUND)) +			{ +				ao_radio_abort = 0; + +				/* Set a timeout based on the packet length so that we make sure to +				 * wait long enough to receive the whole thing. +				 * +				 * timeout = bits * FEC expansion / rate +				 */ +				switch (ao_config.radio_rate) { +				default: +				case AO_RADIO_RATE_38400: +					timeout = AO_MS_TO_TICKS(size * (8 * 2 * 10) / 384) + 1; +					break; +				case AO_RADIO_RATE_9600: +					timeout = AO_MS_TO_TICKS(size * (8 * 2 * 10) / 96) + 1; +					break; +				case AO_RADIO_RATE_2400: +					timeout = AO_MS_TO_TICKS(size * (8 * 2 * 10) / 24) + 1; +					break; +				} +			} +		} +	} + +	if (success) { +		int8_t	rssi; +		uint8_t	status; + +		status = ao_radio_fifo_read(d, size); +		(void) status; +		rssi = ((int8_t *) d)[size - 2]; +		ao_radio_rssi = rssi; + +		/* Bound it to the representable range */ +		if (rssi > -11) +			rssi = -11; + +		/* Write it back to the packet */ +		((int8_t *) d)[size-2] = AO_RADIO_FROM_RSSI(rssi); +	} else { +		ao_radio_idle(); +		ao_radio_rssi = 0; +	} + +	ao_radio_put(); +	return success;  } @@ -932,6 +1130,7 @@ static const struct ao_cc1200_reg ao_cc1200_reg[] = {  	{ .addr = CC1200_PREAMBLE_CFG0,	.name = "PREAMBLE_CFG0" },  	{ .addr = CC1200_IQIC,	.name = "IQIC" },  	{ .addr = CC1200_CHAN_BW,	.name = "CHAN_BW" }, +	{ .addr = CC1200_MDMCFG2,	.name = "MDMCFG2" },  	{ .addr = CC1200_MDMCFG1,	.name = "MDMCFG1" },  	{ .addr = CC1200_MDMCFG0,	.name = "MDMCFG0" },  	{ .addr = CC1200_SYMBOL_RATE2,	.name = "SYMBOL_RATE2" }, @@ -1064,8 +1263,8 @@ static const struct ao_cc1200_reg ao_cc1200_reg[] = {  	{ .addr = CC1200_PARTNUMBER,	.name = "PARTNUMBER" },  	{ .addr = CC1200_PARTVERSION,	.name = "PARTVERSION" },  	{ .addr = CC1200_SERIAL_STATUS,	.name = "SERIAL_STATUS" }, -	{ .addr = CC1200_RX_STATUS,	.name = "RX_STATUS" }, -	{ .addr = CC1200_TX_STATUS,	.name = "TX_STATUS" }, +	{ .addr = CC1200_MODEM_STATUS1,	.name = "MODEM_STATUS1" }, +	{ .addr = CC1200_MODEM_STATUS0,	.name = "MODEM_STATUS0" },  	{ .addr = CC1200_MARC_STATUS1,	.name = "MARC_STATUS1" },  	{ .addr = CC1200_MARC_STATUS0,	.name = "MARC_STATUS0" },  	{ .addr = CC1200_PA_IFAMP_TEST,	.name = "PA_IFAMP_TEST" }, @@ -1091,11 +1290,17 @@ static const struct ao_cc1200_reg ao_cc1200_reg[] = {  #define AO_NUM_CC1200_REG	(sizeof ao_cc1200_reg / sizeof ao_cc1200_reg[0]) +static uint8_t +ao_radio_get_marc_status(void) +{ +	return ao_radio_reg_read(CC1200_MARC_STATUS1); +} +  static void ao_radio_show(void) { -	uint8_t	status = ao_radio_status(); +	uint8_t	status;  	unsigned int	i; -	ao_radio_get(0xff); +	ao_mutex_get(&ao_radio_mutex);  	status = ao_radio_status();  	printf ("Status:   %02x\n", status);  	printf ("CHIP_RDY: %d\n", (status >> CC1200_STATUS_CHIP_RDY) & 1); @@ -1141,6 +1346,8 @@ ao_radio_test_recv(void)  		printf (" RSSI %d", AO_RSSI_FROM_RADIO(bytes[32]));  		for (b = 0; b < 32; b++)  			printf (" %02x", bytes[b]); + +		printf (" RSSI %02x LQI %02x", bytes[32], bytes[33]);  		printf ("\n");  	}  } @@ -1151,12 +1358,15 @@ ao_radio_test_recv(void)  static void  ao_radio_aprs(void)  { +#if PACKET_HAS_SLAVE  	ao_packet_slave_stop(); +#endif  	ao_aprs_send();  }  #endif  #endif +#if CC1200_LOW_LEVEL_DEBUG  static void  ao_radio_strobe_test(void)  { @@ -1204,6 +1414,7 @@ ao_radio_read_test(void)  	data = ao_radio_reg_read(addr);  	printf ("Read %04x = %02x\n", addr, data);  } +#endif  static const struct ao_cmds ao_radio_cmds[] = {  	{ ao_radio_test_cmd,	"C <1 start, 0 stop, none both>\0Radio carrier test" }, @@ -1216,9 +1427,11 @@ static const struct ao_cmds ao_radio_cmds[] = {  	{ ao_radio_packet,	"p\0Send a test packet" },  	{ ao_radio_test_recv,	"q\0Recv a test packet" },  #endif -	{ ao_radio_strobe_test,	"S <value>\0Strobe radio" }, +#if CC1200_LOW_LEVEL_DEBUG +	{ ao_radio_strobe_test,	"A <value>\0Strobe radio" },  	{ ao_radio_write_test,	"W <addr> <value>\0Write radio reg" }, -	{ ao_radio_read_test,	"R <addr>\0Read radio reg" }, +	{ ao_radio_read_test,	"B <addr>\0Read radio reg" }, +#endif  	{ 0, NULL }  }; diff --git a/src/drivers/ao_cc1200.h b/src/drivers/ao_cc1200.h index 987f9bda..b04775fd 100644 --- a/src/drivers/ao_cc1200.h +++ b/src/drivers/ao_cc1200.h @@ -27,7 +27,7 @@  #define  CC1200_IOCFG_GPIO_INV		6  #define  CC1200_IOCFG_GPIO_CFG		0  #define  CC1200_IOCFG_GPIO_CFG_RXFIFO_THR	0 -#define  CC1200_IOCFG_GPIO_CFG_RXFIFO_THR_PKT	1	 +#define  CC1200_IOCFG_GPIO_CFG_RXFIFO_THR_PKT	1  #define  CC1200_IOCFG_GPIO_CFG_TXFIFO_THR	2  #define  CC1200_IOCFG_GPIO_CFG_TXFIFO_THR_PKT	3  #define  CC1200_IOCFG_GPIO_CFG_RXFIFO_OVERFLOW	4 @@ -101,7 +101,6 @@  #define  CC1200_IOCFG_GPIO_CFG_EXT_OSC_EN		60  #define  CC1200_IOCFG_GPIO_CFG_MASK	0x3f -#define CC1200_IOCFG3		0x00  #define CC1200_IOCFG2		0x01  #define CC1200_IOCFG1		0x02  #define CC1200_IOCFG0		0x03 @@ -141,21 +140,21 @@  #define CC1200_DEVIATION_M	0x0a  #define CC1200_MODCFG_DEV_E	0x0b -#define CC1200_MODCFG_DEV_E_MODEM_MODE		6 +#define  CC1200_MODCFG_DEV_E_MODEM_MODE		6  #define  CC1200_MODCFG_DEV_E_MODEM_MODE_NORMAL		0  #define  CC1200_MODCFG_DEV_E_MODEM_MODE_DSSS_REPEAT	1  #define  CC1200_MODCFG_DEV_E_MODEM_MODE_DSSS_PN		2  #define  CC1200_MODCFG_DEV_E_MODEM_MODE_CARRIER_SENSE	3  #define  CC1200_MODCFG_DEV_E_MODEM_MODE_MASK		3 -#define CC1200_MODCFG_DEV_E_MOD_FORMAT		3 -#define CC1200_MODCFG_DEV_E_MOD_FORMAT_2_FSK		0 -#define CC1200_MODCFG_DEV_E_MOD_FORMAT_2_GFSK		1 -#define CC1200_MODCFG_DEV_E_MOD_FORMAT_ASK_OOK		3 -#define CC1200_MODCFG_DEV_E_MOD_FORMAT_4_FSK		4 -#define CC1200_MODCFG_DEV_E_MOD_FORMAT_4_GFSK		5 -#define CC1200_MODCFG_DEV_E_MOD_FORMAT_MASK		7 -#define CC1200_MODCFG_DEV_E_DEV_E		0 -#define CC1200_MODCFG_DEV_E_DEV_E_MASK		7 +#define  CC1200_MODCFG_DEV_E_MOD_FORMAT		3 +#define  CC1200_MODCFG_DEV_E_MOD_FORMAT_2_FSK		0 +#define  CC1200_MODCFG_DEV_E_MOD_FORMAT_2_GFSK		1 +#define  CC1200_MODCFG_DEV_E_MOD_FORMAT_ASK_OOK		3 +#define  CC1200_MODCFG_DEV_E_MOD_FORMAT_4_FSK		4 +#define  CC1200_MODCFG_DEV_E_MOD_FORMAT_4_GFSK		5 +#define  CC1200_MODCFG_DEV_E_MOD_FORMAT_MASK		7 +#define  CC1200_MODCFG_DEV_E_DEV_E		0 +#define  CC1200_MODCFG_DEV_E_DEV_E_MASK		7  #define CC1200_DCFILT_CFG	0x0c  #define CC1200_PREAMBLE_CFG1	0x0d @@ -226,10 +225,10 @@  #define  CC1200_MDMCFG0_VITERBI_EN		2  #define CC1200_SYMBOL_RATE2	0x13 -#define CC1200_SYMBOL_RATE2_DATARATE_E			4 -#define CC1200_SYMBOL_RATE2_DATARATE_E_MASK		0xf -#define CC1200_SYMBOL_RATE2_DATARATE_M_19_16		0 -#define CC1200_SYMBOL_RATE2_DATARATE_M_19_16_MASK	0xf +#define  CC1200_SYMBOL_RATE2_DATARATE_E			4 +#define  CC1200_SYMBOL_RATE2_DATARATE_E_MASK		0xf +#define  CC1200_SYMBOL_RATE2_DATARATE_M_19_16		0 +#define  CC1200_SYMBOL_RATE2_DATARATE_M_19_16_MASK	0xf  #define CC1200_SYMBOL_RATE1	0x14  #define CC1200_SYMBOL_RATE0	0x15 @@ -338,6 +337,8 @@  #define CC1200_WOR_EVENT0_LSB	0x24  #define CC1200_RXDCM_TIME	0x25  #define CC1200_PKT_CFG2		0x26 +#define  CC1200_PKT_CFG2_BYTE_SWAP_EN	6 +#define  CC1200_PKT_CFG2_FG_MODE_EN	5  #define  CC1200_PKT_CFG2_CCA_MODE	2  #define  CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR		0  #define  CC1200_PKT_CFG2_CCA_MODE_RSSI_THRESHOLD	1 @@ -353,19 +354,20 @@  #define  CC1200_PKT_CFG2_PKT_FORMAT_MASK		3  #define CC1200_PKT_CFG1		0x27 +#define  CC1200_PKT_CFG1_FEC_EN		7  #define  CC1200_PKT_CFG1_WHITE_DATA	6 -#define  CC1200_PKT_CFG1_ADDR_CHECK_CFG	4 +#define  CC1200_PKT_CFG1_PN9_SWAP_EN	5 +#define  CC1200_PKT_CFG1_ADDR_CHECK_CFG	3  #define  CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE		0  #define  CC1200_PKT_CFG1_ADDR_CHECK_CFG_CHECK		1  #define  CC1200_PKT_CFG1_ADDR_CHECK_CFG_00_BROADCAST	2  #define  CC1200_PKT_CFG1_ADDR_CHECK_CFG_00_FF_BROADCAST	3  #define  CC1200_PKT_CFG1_ADDR_CHECK_CFG_MASK		3 -#define  CC1200_PKT_CFG1_CRC_CFG	2 +#define  CC1200_PKT_CFG1_CRC_CFG	1  #define  CC1200_PKT_CFG1_CRC_CFG_DISABLED		0  #define  CC1200_PKT_CFG1_CRC_CFG_CRC16_INIT_ONES	1  #define  CC1200_PKT_CFG1_CRC_CFG_CRC16_INIT_ZEROS	2  #define  CC1200_PKT_CFG1_CRC_CFG_MASK			3 -#define  CC1200_PKT_CFG1_BYTE_SWAP_EN	1  #define  CC1200_PKT_CFG1_APPEND_STATUS	0  #define CC1200_PKT_CFG0		0x28 @@ -382,13 +384,29 @@  #define  CC1200_PKT_CFG0_UART_SWAP_EN	0  #define CC1200_RFEND_CFG1	0x29 +#define  CC1200_RFEND_CFG1_RXOFF_MODE	4 +#define  CC1200_RFEND_CFG1_RXOFF_MODE_IDLE	0 +#define  CC1200_RFEND_CFG1_RXOFF_MODE_FSTXON	1 +#define  CC1200_RFEND_CFG1_RXOFF_MODE_TX	2 +#define  CC1200_RFEND_CFG1_RXOFF_MODE_RX	3 +#define  CC1200_RFEND_CFG1_RX_TIME	1 +#define  CC1200_RFEND_CFG1_RX_TIME_INFINITE	7 +#define  CC1200_RFEND_CFG1_RX_TIME_QUAL	0  #define CC1200_RFEND_CFG0	0x2a +#define  CC1200_RFEND_CFG0_CAL_END_WAKE_UP_EN	6 +#define  CC1200_RFEND_CFG0_TXOFF_MODE		4 +#define  CC1200_RFEND_CFG0_TXOFF_MODE_IDLE	0 +#define  CC1200_RFEND_CFG0_TXOFF_MODE_FSTXON	1 +#define  CC1200_RFEND_CFG0_TXOFF_MODE_TX	2 +#define  CC1200_RFEND_CFG0_TXOFF_MODE_RX	3 +#define  CC1200_RFEND_CFG0_TERM_ON_BAD_PACKET_EN 3 +#define  CC1200_RFEND_CFG0_ANT_DIV_RX_TERM_CFG	0  #define CC1200_PA_CFG1		0x2b  #define CC1200_PA_CFG0		0x2c  #define CC1200_ASK_CFG		0x2d  #define CC1200_PKT_LEN		0x2e -#define CC1200_EXTENDED	0x2f +#define CC1200_EXTENDED		0x2f  /* Command strobes */  #define CC1200_SRES		0x30 @@ -424,10 +442,25 @@  #define CC1200_ECG_CFG		(CC1200_EXTENDED_BIT | 0x04)  #define CC1200_MDMCFG2		(CC1200_EXTENDED_BIT | 0x05) -# define CC1200_MDMCFG2_ASK_SHAPE	6 -# define CC1200_MDMCFG2_SYMBOL_MAP_CFG	4 -# define CC1200_MDMCFG2_UPSAMPLER_P	1 -# define CC1200_MDMCFG2_CFM_DATA_EN	0 +#define  CC1200_MDMCFG2_ASK_SHAPE	6 +#define  CC1200_MDMCFG2_ASK_SHAPE_8		0 +#define  CC1200_MDMCFG2_ASK_SHAPE_16		1 +#define  CC1200_MDMCFG2_ASK_SHAPE_32		2 +#define  CC1200_MDMCFG2_ASK_SHAPE_128		3 +#define  CC1200_MDMCFG2_SYMBOL_MAP_CFG	4 +#define  CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_0	0 +#define  CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_1	1 +#define  CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_2	2 +#define  CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_3	3 +#define  CC1200_MDMCFG2_UPSAMPLER_P	1 +#define  CC1200_MDMCFG2_UPSAMPLER_P_1		0 +#define  CC1200_MDMCFG2_UPSAMPLER_P_2		1 +#define  CC1200_MDMCFG2_UPSAMPLER_P_4		2 +#define  CC1200_MDMCFG2_UPSAMPLER_P_8		3 +#define  CC1200_MDMCFG2_UPSAMPLER_P_16		4 +#define  CC1200_MDMCFG2_UPSAMPLER_P_32		5 +#define  CC1200_MDMCFG2_UPSAMPLER_P_64		6 +#define  CC1200_MDMCFG2_CFM_DATA_EN	0  #define CC1200_EXT_CTRL		(CC1200_EXTENDED_BIT | 0x06)  #define CC1200_RCCAL_FINE	(CC1200_EXTENDED_BIT | 0x07) @@ -527,23 +560,39 @@  #define CC1200_PARTNUMBER	(CC1200_EXTENDED_BIT | 0x8f)  #define CC1200_PARTVERSION	(CC1200_EXTENDED_BIT | 0x90)  #define CC1200_SERIAL_STATUS	(CC1200_EXTENDED_BIT | 0x91) -#define CC1200_RX_STATUS	(CC1200_EXTENDED_BIT | 0x92) -#define CC1200_TX_STATUS	(CC1200_EXTENDED_BIT | 0x93) +#define CC1200_MODEM_STATUS1	(CC1200_EXTENDED_BIT | 0x92) +#define  CC1200_MODEM_STATUS1_SYNC_FOUND	7 +#define  CC1200_MODEM_STATUS1_RXFIFO_FULL	6 +#define  CC1200_MODEM_STATUS1_RXFIFO_THR	5 +#define  CC1200_MODEM_STATUS1_RXFIFO_EMPTY	4 +#define  CC1200_MODEM_STATUS1_RXFIFO_OVERFLOW	3 +#define  CC1200_MODEM_STATUS1_RXFIFO_UNDERFLOW	2 +#define  CC1200_MODEM_STATUS1_PQT_REACHED	1 +#define  CC1200_MODEM_STATUS1_PQT_VALID		0 + +#define CC1200_MODEM_STATUS0	(CC1200_EXTENDED_BIT | 0x93) +#define  CC1200_MODEM_STATUS0_FEC_RX_OVERFLOW	6 +#define  CC1200_MODEM_STATUS0_SYNC_SENT		4 +#define  CC1200_MODEM_STATUS0_TXFIFO_FULL	3 +#define  CC1200_MODEM_STATUS0_TXFIFO_THR	2 +#define  CC1200_MODEM_STATUS0_TXFIFO_OVERFLOW	1 +#define  CC1200_MODEM_STATUS0_TXFIFO_UNDERFLOW	0 +  #define CC1200_MARC_STATUS1	(CC1200_EXTENDED_BIT | 0x94) -# define CC1200_MARC_STATUS1_NO_FAILURE		0 -# define CC1200_MARC_STATUS1_RX_TIMEOUT		1 -# define CC1200_MARC_STATUS1_RX_TERMINATION	2 -# define CC1200_MARC_STATUS1_EWOR_SYNC_LOST	3 -# define CC1200_MARC_STATUS1_MAXIMUM_LENGTH	4 -# define CC1200_MARC_STATUS1_ADDRESS		5 -# define CC1200_MARC_STATUS1_CRC		6 -# define CC1200_MARC_STATUS1_TX_FIFO_OVERFLOW	7 -# define CC1200_MARC_STATUS1_TX_FIFO_UNDERFLOW	8 -# define CC1200_MARC_STATUS1_RX_FIFO_OVERFLOW	9 -# define CC1200_MARC_STATUS1_RX_FIFO_UNDERFLOW	10 -# define CC1200_MARC_STATUS1_TX_ON_CCA_FAILED	11 -# define CC1200_MARC_STATUS1_TX_FINISHED	0x40 -# define CC1200_MARC_STATUS1_RX_FINISHED	0x80 +#define  CC1200_MARC_STATUS1_NO_FAILURE		0 +#define  CC1200_MARC_STATUS1_RX_TIMEOUT		1 +#define  CC1200_MARC_STATUS1_RX_TERMINATION	2 +#define  CC1200_MARC_STATUS1_EWOR_SYNC_LOST	3 +#define  CC1200_MARC_STATUS1_MAXIMUM_LENGTH	4 +#define  CC1200_MARC_STATUS1_ADDRESS		5 +#define  CC1200_MARC_STATUS1_CRC		6 +#define  CC1200_MARC_STATUS1_TX_FIFO_OVERFLOW	7 +#define  CC1200_MARC_STATUS1_TX_FIFO_UNDERFLOW	8 +#define  CC1200_MARC_STATUS1_RX_FIFO_OVERFLOW	9 +#define  CC1200_MARC_STATUS1_RX_FIFO_UNDERFLOW	10 +#define  CC1200_MARC_STATUS1_TX_ON_CCA_FAILED	11 +#define  CC1200_MARC_STATUS1_TX_FINISHED	0x40 +#define  CC1200_MARC_STATUS1_RX_FINISHED	0x80  #define CC1200_MARC_STATUS0	(CC1200_EXTENDED_BIT | 0x95)  #define CC1200_PA_IFAMP_TEST	(CC1200_EXTENDED_BIT | 0x96)  #define CC1200_FSRF_TEST	(CC1200_EXTENDED_BIT | 0x97) diff --git a/src/drivers/ao_cc1200_CC1200.h b/src/drivers/ao_cc1200_CC1200.h index 670e89ef..c5497196 100644 --- a/src/drivers/ao_cc1200_CC1200.h +++ b/src/drivers/ao_cc1200_CC1200.h @@ -7,34 +7,100 @@   *   ***************************************************************/ +/* + * Values affecting receive sensitivity: + * + * + *	PQT		- sets how good the preamble needs to look before + *			  we start looking for a sync word + *	SYNC_THR	- sets how good the sync needs to be before we + *			  start decoding a packet + */ + +/* Values depending on data rate + * + *	DCFILT_BW_SETTLE + *	DCFILT_BW + */ + +#ifndef AO_CC1200_AGC_GAIN_ADJUST +#define AO_CC1200_AGC_GAIN_ADJUST	-81 +#endif          CC1200_IOCFG2,                       0x06,       /* GPIO2 IO Pin Configuration */ -        CC1200_SYNC1,                        0x6e,       /* Sync Word Configuration [15:8] */ -        CC1200_SYNC0,                        0x4e,       /* Sync Word Configuration [7:0] */ -        CC1200_SYNC_CFG1,                    0xea,       /* Sync Word Detection Configuration Reg. 1 */ +	CC1200_SYNC3,		             0xD3,	 /* Sync Word Configuration [23:16] */ +	CC1200_SYNC2,		             0x91,	 /* Sync Word Configuration [23:16] */ +        CC1200_SYNC1,                        0xD3,       /* Sync Word Configuration [15:8] */ +        CC1200_SYNC0,                        0x91,       /* Sync Word Configuration [7:0] */ +        CC1200_SYNC_CFG1,                                /* Sync Word Detection Configuration Reg. 1 */ +		((CC1200_SYNC_CFG1_SYNC_MODE_16_BITS << CC1200_SYNC_CFG1_SYNC_MODE) | +		 (11 << CC1200_SYNC_CFG1_SYNC_THR)), +        CC1200_SYNC_CFG0,                                /* Sync Word Detection Configuration Reg. 0 */ +		((1 << CC1200_SYNC_CFG0_AUTO_CLEAR) | +		 (0 << CC1200_SYNC_CFG0_RX_CONFIG_LIMITATION) | +		 (1 << CC1200_SYNC_CFG0_PQT_GATING_EN) | +		 (0 << CC1200_SYNC_CFG0_EXT_SYNC_DETECT) | +		 (CC1200_SYNC_CFG0_SYNC_STRICT_SYNC_CHECK_DISABLED << CC1200_SYNC_CFG0_SYNC_STRICT_SYNC_CHECK)),          CC1200_DEVIATION_M,                  0x50,       /* Frequency Deviation Configuration */          CC1200_DCFILT_CFG,                   0x5d,       /* Digital DC Removal Configuration */ -        CC1200_PREAMBLE_CFG0,                0x8a,       /* Preamble Detection Configuration Reg. 0 */ +        CC1200_PREAMBLE_CFG0,       			 /* Preamble Detection Configuration Reg. 0 */ +		((1 << CC1200_PREAMBLE_CFG0_PQT_EN) | +		 (CC1200_PREAMBLE_CFG0_PQT_VALID_TIMEOUT_11 << CC1200_PREAMBLE_CFG0_PQT_VALID_TIMEOUT) | +		 (15 << CC1200_PREAMBLE_CFG0_PQT)),          CC1200_IQIC,                         0xcb,       /* Digital Image Channel Compensation Configuration */          CC1200_CHAN_BW,                      0x11,       /* Channel Filter Configuration */          CC1200_MDMCFG1,                      0x40,       /* General Modem Parameter Configuration Reg. 1 */          CC1200_MDMCFG0,                      0x05,       /* General Modem Parameter Configuration Reg. 0 */          CC1200_SYMBOL_RATE2,                 0x93,       /* Symbol Rate Configuration Exponent and Mantissa [1.. */ -        CC1200_AGC_REF,                      0x37,       /* AGC Reference Level Configuration */ +        CC1200_AGC_REF,                      0x27,       /* AGC Reference Level Configuration */          CC1200_AGC_CS_THR,                   0xec,       /* Carrier Sense Threshold Configuration */ +	CC1200_AGC_GAIN_ADJUST,				 /* RSSI adjustment */ +		AO_CC1200_AGC_GAIN_ADJUST,          CC1200_AGC_CFG1,                     0x51,       /* Automatic Gain Control Configuration Reg. 1 */          CC1200_AGC_CFG0,                     0x87,       /* Automatic Gain Control Configuration Reg. 0 */ -        CC1200_FIFO_CFG,                     0x00,       /* FIFO Configuration */ -        CC1200_FS_CFG,                       0x14,       /* Frequency Synthesizer Configuration */ -        CC1200_PKT_CFG2,                     0x20,       /* Packet Configuration Reg. 2 */ -        CC1200_PKT_CFG1,                     0xc3,       /* Packet Configuration Reg. 1 */ -        CC1200_PKT_CFG0,                     0x20,       /* Packet Configuration Reg. 0 */ +        CC1200_FIFO_CFG,                     0x40,       /* FIFO Configuration */ +	CC1200_SETTLING_CFG,	                         /* Frequency Synthesizer Calibration and Settling Configuration */ +		((CC1200_SETTLING_CFG_FS_AUTOCAL_EVERY_4TH_TIME << CC1200_SETTLING_CFG_FS_AUTOCAL) | +		 (CC1200_SETTLING_CFG_LOCK_TIME_75_30 << CC1200_SETTLING_CFG_LOCK_TIME) | +		 (CC1200_SETTLING_CFG_FSREG_TIME_60 << CC1200_SETTLING_CFG_FSREG_TIME)), +        CC1200_FS_CFG,                                   /* Frequency Synthesizer Configuration */ +		((1 << CC1200_FS_CFG_LOCK_EN) | +		 (CC1200_FS_CFG_FSD_BANDSELECT_410_480 << CC1200_FS_CFG_FSD_BANDSELECT)), +        CC1200_PKT_CFG2,                            	 /* Packet Configuration Reg. 2 */ +		((0 << CC1200_PKT_CFG2_FG_MODE_EN) | +		 (CC1200_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1200_PKT_CFG2_CCA_MODE) | +		 (CC1200_PKT_CFG2_PKT_FORMAT_NORMAL << CC1200_PKT_CFG2_PKT_FORMAT)), +        CC1200_PKT_CFG1,                                 /* Packet Configuration Reg. 1 */ +		((1 << CC1200_PKT_CFG1_FEC_EN) | +		 (1 << CC1200_PKT_CFG1_WHITE_DATA) | +		 (0 << CC1200_PKT_CFG1_PN9_SWAP_EN) | +		 (CC1200_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1200_PKT_CFG1_ADDR_CHECK_CFG) | +		 (CC1200_PKT_CFG1_CRC_CFG_CRC16_INIT_ONES << CC1200_PKT_CFG1_CRC_CFG) | +		 (1 << CC1200_PKT_CFG1_APPEND_STATUS)), +        CC1200_PKT_CFG0,                                 /* Packet Configuration Reg. 0 */ +		((CC1200_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1200_PKT_CFG0_LENGTH_CONFIG) | +		 (0 << CC1200_PKT_CFG0_PKG_BIT_LEN) | +		 (0 << CC1200_PKT_CFG0_UART_MODE_EN) | +		 (0 << CC1200_PKT_CFG0_UART_SWAP_EN)), +	CC1200_RFEND_CFG1,				 /* RFEND Configuration Reg. 1 */ +		((CC1200_RFEND_CFG1_RXOFF_MODE_IDLE << CC1200_RFEND_CFG1_RXOFF_MODE) | +		 (CC1200_RFEND_CFG1_RX_TIME_INFINITE << CC1200_RFEND_CFG1_RX_TIME) | +		 (0 << CC1200_RFEND_CFG1_RX_TIME_QUAL)), +	CC1200_RFEND_CFG0,				 /* RFEND Configuration Reg. 0 */ +		((0 << CC1200_RFEND_CFG0_CAL_END_WAKE_UP_EN) | +		 (CC1200_RFEND_CFG0_TXOFF_MODE_IDLE << CC1200_RFEND_CFG0_TXOFF_MODE) | +		 (1 << CC1200_RFEND_CFG0_TERM_ON_BAD_PACKET_EN) | +		 (0 << CC1200_RFEND_CFG0_ANT_DIV_RX_TERM_CFG)),          CC1200_PA_CFG1,                      0x3f,       /* Power Amplifier Configuration Reg. 1 */          CC1200_PA_CFG0,                      0x53,       /* Power Amplifier Configuration Reg. 0 */          CC1200_PKT_LEN,                      0xff,       /* Packet Length Configuration */          CC1200_IF_MIX_CFG,                   0x1c,       /* IF Mix Configuration */          CC1200_FREQOFF_CFG,                  0x22,       /* Frequency Offset Correction Configuration */ -        CC1200_MDMCFG2,                      0x0c,       /* General Modem Parameter Configuration Reg. 2 */ +        CC1200_MDMCFG2,                                  /* General Modem Parameter Configuration Reg. 2 */ +		((CC1200_MDMCFG2_ASK_SHAPE_8 << CC1200_MDMCFG2_ASK_SHAPE) | +		 (CC1200_MDMCFG2_SYMBOL_MAP_CFG_MODE_0 << CC1200_MDMCFG2_SYMBOL_MAP_CFG) | +		 (CC1200_MDMCFG2_UPSAMPLER_P_8 << CC1200_MDMCFG2_UPSAMPLER_P) | +		 (0 << CC1200_MDMCFG2_CFM_DATA_EN)),          CC1200_FREQ2,                        0x6c,       /* Frequency Configuration [23:16] */          CC1200_FREQ1,                        0xa3,       /* Frequency Configuration [15:8] */          CC1200_FREQ0,                        0x33,       /* Frequency Configuration [7:0] */ diff --git a/src/kernel/ao.h b/src/kernel/ao.h index ad5bbf8e..16d600aa 100644 --- a/src/kernel/ao.h +++ b/src/kernel/ao.h @@ -43,10 +43,6 @@  #define HAS_TASK	1  #endif -#ifndef AO_PORT_TYPE -#define AO_PORT_TYPE uint8_t -#endif -  typedef AO_PORT_TYPE ao_port_t;  #if HAS_TASK @@ -518,15 +514,9 @@ struct ao_telemetry_raw_recv {  /* Set delay between telemetry reports (0 to disable) */ -#ifdef AO_SEND_ALL_BARO -#define AO_TELEMETRY_INTERVAL_PAD	AO_MS_TO_TICKS(100) -#define AO_TELEMETRY_INTERVAL_FLIGHT	AO_MS_TO_TICKS(100) -#define AO_TELEMETRY_INTERVAL_RECOVER	AO_MS_TO_TICKS(100) -#else  #define AO_TELEMETRY_INTERVAL_PAD	AO_MS_TO_TICKS(1000)  #define AO_TELEMETRY_INTERVAL_FLIGHT	AO_MS_TO_TICKS(100)  #define AO_TELEMETRY_INTERVAL_RECOVER	AO_MS_TO_TICKS(1000) -#endif  void  ao_telemetry_reset_interval(void); @@ -662,6 +652,7 @@ union ao_monitor {  extern __xdata union ao_monitor ao_monitor_ring[AO_MONITOR_RING];  #define ao_monitor_ring_next(n)	(((n) + 1) & (AO_MONITOR_RING - 1)) +#define ao_monitor_ring_prev(n)	(((n) - 1) & (AO_MONITOR_RING - 1))  extern __data uint8_t ao_monitoring;  extern __data uint8_t ao_monitor_head; diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c index 6b8a1813..8dab7c42 100644 --- a/src/kernel/ao_config.c +++ b/src/kernel/ao_config.c @@ -557,10 +557,10 @@ ao_config_radio_rate_set(void) __reentrant  	}  	_ao_config_edit_start();  	ao_config.radio_rate = ao_cmd_lex_i; +	_ao_config_edit_finish();  #if HAS_TELEMETRY  	ao_telemetry_reset_interval();  #endif -	_ao_config_edit_finish();  #if HAS_RADIO_RECV  	ao_radio_recv_abort();  #endif @@ -684,6 +684,9 @@ ao_config_radio_enable_set(void) __reentrant  	_ao_config_edit_start();  	ao_config.radio_enable = ao_cmd_lex_i;  	_ao_config_edit_finish(); +#if HAS_TELEMETRY && HAS_RADIO_RATE +	ao_telemetry_reset_interval(); +#endif  }  #endif /* HAS_RADIO */ @@ -735,6 +738,7 @@ ao_config_aprs_set(void)  	_ao_config_edit_start();  	ao_config.aprs_interval = ao_cmd_lex_i;  	_ao_config_edit_finish(); +	ao_telemetry_reset_interval();  }  #endif /* HAS_APRS */ @@ -825,6 +829,9 @@ ao_config_tracker_set(void)  	ao_config.tracker_motion = m;  	ao_config.tracker_interval = i;  	_ao_config_edit_finish(); +#if HAS_TELEMETRY +	ao_telemetry_reset_interval(); +#endif  }  #endif /* HAS_TRACKER */ diff --git a/src/kernel/ao_gps_print.c b/src/kernel/ao_gps_print.c index d26021da..6d9ee346 100644 --- a/src/kernel/ao_gps_print.c +++ b/src/kernel/ao_gps_print.c @@ -20,8 +20,8 @@  #endif  #include "ao_telem.h" -#ifndef AO_TELEMETRY_LOCATION_ALTITUDE -#define AO_TELEMETRY_LOCATION_ALTITUDE(l)	((l)->altitude) +#ifndef AO_GPS_ORIG_ALTITUDE +#define AO_GPS_ORIG_ALTITUDE(l)	((l)->altitude)  #endif  void @@ -46,7 +46,7 @@ ao_gps_print(__xdata struct ao_gps_orig *gps_data) __reentrant  	       AO_TELEM_GPS_ALTITUDE " %d ",  	       (long) gps_data->latitude,  	       (long) gps_data->longitude, -	       AO_TELEMETRY_LOCATION_ALTITUDE(gps_data)); +	       AO_GPS_ORIG_ALTITUDE(gps_data));  	if (gps_data->flags & AO_GPS_DATE_VALID)  		printf(AO_TELEM_GPS_YEAR " %d " diff --git a/src/kernel/ao_monitor.c b/src/kernel/ao_monitor.c index 2d75c41c..cba0d80a 100644 --- a/src/kernel/ao_monitor.c +++ b/src/kernel/ao_monitor.c @@ -94,9 +94,18 @@ __xdata struct ao_task ao_monitor_blink_task;  void  ao_monitor_blink(void)  { +#ifdef AO_MONITOR_BAD +	uint8_t		*recv; +#endif  	for (;;) {  		ao_sleep(DATA_TO_XDATA(&ao_monitor_head)); -		ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100)); +#ifdef AO_MONITOR_BAD +		recv = (uint8_t *) &ao_monitor_ring[ao_monitor_ring_prev(ao_monitor_head)]; +		if (ao_monitoring && !(recv[ao_monitoring + 1] & AO_RADIO_STATUS_CRC_OK)) +			ao_led_for(AO_MONITOR_BAD, AO_MS_TO_TICKS(100)); +		else +#endif +			ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100));  	}  }  #endif diff --git a/src/kernel/ao_telemetry.c b/src/kernel/ao_telemetry.c index 27306a34..e2197f7a 100644 --- a/src/kernel/ao_telemetry.c +++ b/src/kernel/ao_telemetry.c @@ -19,19 +19,32 @@  #include "ao_log.h"  #include "ao_product.h" -#ifndef HAS_RDF -#define HAS_RDF 1 -#endif -  static __pdata uint16_t ao_telemetry_interval;  #if HAS_RADIO_RATE  static __xdata uint16_t ao_telemetry_desired_interval;  #endif +/* TeleMetrum v1.0 just doesn't have enough space to + * manage the more complicated telemetry scheduling, so + * it loses the ability to disable telem/rdf separately + */ + +#if defined(TELEMETRUM_V_1_0) +#define SIMPLIFY +#endif + +#ifdef SIMPLIFY +#define ao_telemetry_time time +#define RDF_SPACE	__pdata +#else +#define RDF_SPACE	__xdata +static __pdata uint16_t ao_telemetry_time; +#endif +  #if HAS_RDF -static __pdata uint8_t ao_rdf = 0; -static __pdata uint16_t ao_rdf_time; +static RDF_SPACE uint8_t ao_rdf = 0; +static RDF_SPACE uint16_t ao_rdf_time;  #endif  #if HAS_APRS @@ -120,7 +133,9 @@ ao_send_mega_sensor(void)  	telemetry.generic.tick = packet->tick;  	telemetry.generic.type = AO_TELEMETRY_MEGA_SENSOR; +#if HAS_MPU6000  	telemetry.mega_sensor.orient = ao_sample_orient; +#endif  	telemetry.mega_sensor.accel = ao_data_accel(packet);  	telemetry.mega_sensor.pres = ao_data_pres(packet);  	telemetry.mega_sensor.temp = ao_data_temp(packet); @@ -269,30 +284,6 @@ ao_send_mini(void)  #endif /* AO_SEND_MINI */ -#ifdef AO_SEND_ALL_BARO -static uint8_t		ao_baro_sample; - -static void -ao_send_baro(void) -{ -	uint8_t		sample = ao_sample_data; -	uint8_t		samples = (sample - ao_baro_sample) & (AO_DATA_RING - 1); - -	if (samples > 12) { -		ao_baro_sample = (ao_baro_sample + (samples - 12)) & (AO_DATA_RING - 1); -		samples = 12; -	} -	telemetry.generic.tick = ao_data_ring[sample].tick; -	telemetry.generic.type = AO_TELEMETRY_BARO; -	telemetry.baro.samples = samples; -	for (sample = 0; sample < samples; sample++) { -		telemetry.baro.baro[sample] = ao_data_ring[ao_baro_sample].adc.pres; -		ao_baro_sample = ao_data_ring_next(ao_baro_sample); -	} -	ao_radio_send(&telemetry, sizeof (telemetry)); -} -#endif -  static __pdata int8_t ao_telemetry_config_max;  static __pdata int8_t ao_telemetry_config_cur; @@ -332,6 +323,7 @@ ao_send_configuration(void)  #if HAS_GPS +static __pdata int8_t ao_telemetry_gps_max;  static __pdata int8_t ao_telemetry_loc_cur;  static __pdata int8_t ao_telemetry_sat_cur; @@ -348,7 +340,7 @@ ao_send_location(void)  		telemetry.location.tick = ao_gps_tick;  		ao_mutex_put(&ao_gps_mutex);  		ao_radio_send(&telemetry, sizeof (telemetry)); -		ao_telemetry_loc_cur = ao_telemetry_config_max; +		ao_telemetry_loc_cur = ao_telemetry_gps_max;  	}  } @@ -365,7 +357,7 @@ ao_send_satellite(void)  		       AO_MAX_GPS_TRACKING * sizeof (struct ao_telemetry_satellite_info));  		ao_mutex_put(&ao_gps_mutex);  		ao_radio_send(&telemetry, sizeof (telemetry)); -		ao_telemetry_sat_cur = ao_telemetry_config_max; +		ao_telemetry_sat_cur = ao_telemetry_gps_max;  	}  }  #endif @@ -411,6 +403,7 @@ ao_telemetry(void)  		while (ao_telemetry_interval == 0)  			ao_sleep(&telemetry);  		time = ao_time(); +		ao_telemetry_time = time;  #if HAS_RDF  		ao_rdf_time = time;  #endif @@ -418,79 +411,85 @@ ao_telemetry(void)  		ao_aprs_time = time;  #endif  		while (ao_telemetry_interval) { -#if HAS_APRS +			time = ao_time() + AO_SEC_TO_TICKS(100); +#ifndef SIMPLIFY  			if (!(ao_config.radio_enable & AO_RADIO_DISABLE_TELEMETRY))  #endif  			{ -#ifdef AO_SEND_ALL_BARO -				ao_send_baro(); +#ifndef SIMPLIFY +				if ( (int16_t) (ao_time() - ao_telemetry_time) >= 0)  #endif - -#if HAS_FLIGHT +				{ +					ao_telemetry_time = ao_time() + ao_telemetry_interval;  # ifdef AO_SEND_MEGA -				ao_send_mega_sensor(); -				ao_send_mega_data(); +					ao_send_mega_sensor(); +					ao_send_mega_data();  # endif  # ifdef AO_SEND_METRUM -				ao_send_metrum_sensor(); -				ao_send_metrum_data(); +					ao_send_metrum_sensor(); +					ao_send_metrum_data();  # endif  # ifdef AO_SEND_MINI -				ao_send_mini(); +					ao_send_mini();  # endif  # ifdef AO_TELEMETRY_SENSOR -				ao_send_sensor(); +					ao_send_sensor();  # endif -#endif /* HAS_FLIGHT */ -  #if HAS_COMPANION -				if (ao_companion_running) -					ao_send_companion(); +					if (ao_companion_running) +						ao_send_companion();  #endif -				ao_send_configuration();  #if HAS_GPS -				ao_send_location(); -				ao_send_satellite(); +					ao_send_location(); +					ao_send_satellite(); +#endif +					ao_send_configuration(); +				} +#ifndef SIMPLIFY +				time = ao_telemetry_time;  #endif  			} -#ifndef AO_SEND_ALL_BARO  #if HAS_RDF -			if (ao_rdf && -#if HAS_APRS -			    !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF) && -#endif /* HAS_APRS */ -			    (int16_t) (ao_time() - ao_rdf_time) >= 0) +			if (ao_rdf +#ifndef SIMPLIFY +			    && !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF) +#endif +				)  			{ +				if ((int16_t) (ao_time() - ao_rdf_time) >= 0) {  #if HAS_IGNITE_REPORT -				uint8_t	c; -#endif /* HAS_IGNITE_REPORT */ -				ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS; +					uint8_t	c; +#endif +					ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS;  #if HAS_IGNITE_REPORT -				if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter())) -					ao_radio_continuity(c); -				else -#endif /* HAS_IGNITE_REPORT*/ -					ao_radio_rdf(); +					if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter())) +						ao_radio_continuity(c); +					else +#endif +						ao_radio_rdf(); +				} +#ifndef SIMPLIFY +				if ((int16_t) (time - ao_rdf_time) > 0) +					time = ao_rdf_time; +#endif  			}  #endif /* HAS_RDF */  #if HAS_APRS -			if (ao_config.aprs_interval != 0 && -			    (int16_t) (ao_time() - ao_aprs_time) >= 0) -			{ -				ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval); -				ao_aprs_send(); +			if (ao_config.aprs_interval != 0) { +				if ((int16_t) (ao_time() - ao_aprs_time) >= 0) { +					ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval); +					ao_aprs_send(); +				} +				if ((int16_t) (time - ao_aprs_time) > 0) +					time = ao_aprs_time;  			}  #endif /* HAS_APRS */ -#endif /* !AO_SEND_ALL_BARO */ -			time += ao_telemetry_interval;  			delay = time - ao_time();  			if (delay > 0) {  				ao_alarm(delay);  				ao_sleep(&telemetry);  				ao_clear_alarm();  			} -			else -				time = ao_time();  		}  	}  } @@ -547,21 +546,31 @@ ao_telemetry_set_interval(uint16_t interval)  	ao_telemetry_companion_cur = cur;  #endif -	ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval; -#if HAS_COMPANION -	if (ao_telemetry_config_max > cur) -		cur++; -	ao_telemetry_config_cur = cur; -#endif -  #if HAS_GPS -	if (ao_telemetry_config_max > cur) +	ao_telemetry_gps_max = AO_SEC_TO_TICKS(1) / interval; +	if (ao_telemetry_gps_max > cur)  		cur++;  	ao_telemetry_loc_cur = cur; -	if (ao_telemetry_config_max > cur) +	if (ao_telemetry_gps_max > cur)  		cur++;  	ao_telemetry_sat_cur = cur;  #endif + +	ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval; +	if (ao_telemetry_config_max > cur) +		cur++; +	ao_telemetry_config_cur = cur; + +#ifndef SIMPLIFY +	ao_telemetry_time =  +#if HAS_RDF +		ao_rdf_time = +#endif +#if HAS_APRS +		ao_aprs_time = +#endif +		ao_time(); +#endif  	ao_wakeup(&telemetry);  } diff --git a/src/kernel/ao_telemetry.h b/src/kernel/ao_telemetry.h index 83d432cf..711e0d36 100644 --- a/src/kernel/ao_telemetry.h +++ b/src/kernel/ao_telemetry.h @@ -116,12 +116,16 @@ struct ao_telemetry_location {  	/* 32 */  }; -#if HAS_GPS -  #ifndef HAS_WIDE_GPS  #define HAS_WIDE_GPS	1  #endif +#ifdef HAS_TELEMETRY +#ifndef HAS_RDF +#define HAS_RDF		1 +#endif +#endif +  #if HAS_WIDE_GPS  typedef int32_t		gps_alt_t;  #define AO_TELEMETRY_LOCATION_ALTITUDE(l) 	(((gps_alt_t) (l)->altitude_high << 16) | ((l)->altitude_low)) @@ -135,8 +139,6 @@ typedef int16_t		gps_alt_t;  						  (l)->altitude_low = (a)))  #endif /* HAS_WIDE_GPS */ -#endif /* HAS_GPS */ -  #define AO_TELEMETRY_SATELLITE		0x06  struct ao_telemetry_satellite_info { diff --git a/src/lpc/ao_arch_funcs.h b/src/lpc/ao_arch_funcs.h index 21a7a8e5..69f2cbfb 100644 --- a/src/lpc/ao_arch_funcs.h +++ b/src/lpc/ao_arch_funcs.h @@ -30,8 +30,19 @@  #define ao_gpio_get(port, bit, pin) 	(lpc_gpio.byte[lpc_all_bit(port,bit)]) +#define PORT0_JTAG_REGS	((1 << 11) | (1 << 12) | (1 << 14)) + +static inline void lpc_set_gpio(int port, int bit) { +	if (port == 0 && (1 << bit) & (PORT0_JTAG_REGS)) { +		vuint32_t *_ioconf = &lpc_ioconf.pio0_0 + ((port)*24+(bit)); + +		*_ioconf = (*_ioconf & ~LPC_IOCONF_FUNC_MASK) | LPC_IOCONF_FUNC_PIO0_11; +	} +} +  #define ao_enable_output(port,bit,pin,v) do {			\  		ao_enable_port(port);				\ +		lpc_set_gpio(port,bit);				\  		ao_gpio_set(port, bit, pin, v);			\  		lpc_gpio.dir[port] |= (1 << bit);		\  	} while (0) @@ -52,6 +63,7 @@  #define ao_enable_input(port,bit,mode) do {				\  		ao_enable_port(port);					\ +		lpc_set_gpio(port,bit);					\  		lpc_gpio.dir[port] &= ~(1 << bit);			\  		ao_gpio_set_mode(port,bit,mode);			\  	} while (0) @@ -201,7 +213,7 @@ void  ao_spi_put(uint8_t spi_index);  void -ao_spi_send(void *block, uint16_t len, uint8_t spi_index); +ao_spi_send(const void *block, uint16_t len, uint8_t spi_index);  void  ao_spi_send_fixed(uint8_t value, uint16_t len, uint8_t spi_index); @@ -210,7 +222,7 @@ void  ao_spi_recv(void *block, uint16_t len, uint8_t spi_index);  void -ao_spi_duplex(void *out, void *in, uint16_t len, uint8_t spi_index); +ao_spi_duplex(const void *out, void *in, uint16_t len, uint8_t spi_index);  extern uint16_t	ao_spi_speed[LPC_NUM_SPI]; diff --git a/src/lpc/ao_led_lpc.c b/src/lpc/ao_led_lpc.c index d983437c..a0b293b9 100644 --- a/src/lpc/ao_led_lpc.c +++ b/src/lpc/ao_led_lpc.c @@ -59,6 +59,15 @@ void  ao_led_init(AO_PORT_TYPE enable)  {  	ao_led_enable = enable; -	lpc_scb.sysahbclkctrl |= (1 << LPC_SCB_SYSAHBCLKCTRL_GPIO); +	ao_enable_port(LED_PORT); +	if (LED_PORT == 0) { +		if (enable & (1 << 11)) +			lpc_ioconf.pio0_11 = LPC_IOCONF_FUNC_PIO0_11 | (1 << LPC_IOCONF_ADMODE); +		if (enable & (1 << 12)) +			lpc_ioconf.pio0_12 = LPC_IOCONF_FUNC_PIO0_12 | (1 << LPC_IOCONF_ADMODE); +		if (enable & (1 << 14)) +			lpc_ioconf.pio0_14 = LPC_IOCONF_FUNC_PIO0_14 | (1 << LPC_IOCONF_ADMODE); +	}  	lpc_gpio.dir[LED_PORT] |= enable; +	ao_led_off(enable);  } diff --git a/src/lpc/ao_spi_lpc.c b/src/lpc/ao_spi_lpc.c index e72b8286..bc8f9c69 100644 --- a/src/lpc/ao_spi_lpc.c +++ b/src/lpc/ao_spi_lpc.c @@ -43,9 +43,9 @@ static struct lpc_ssp * const ao_lpc_ssp[LPC_NUM_SPI] = { &lpc_ssp0, &lpc_ssp1 }  	} while (0)  void -ao_spi_send(void *block, uint16_t len, uint8_t id) +ao_spi_send(const void *block, uint16_t len, uint8_t id)  { -	uint8_t	*b = block; +	const uint8_t	*b = block;  	struct lpc_ssp *lpc_ssp = ao_lpc_ssp[id];  	spi_loop(len, *b++, (void)); @@ -69,9 +69,9 @@ ao_spi_recv(void *block, uint16_t len, uint8_t id)  }  void -ao_spi_duplex(void *out, void *in, uint16_t len, uint8_t id) +ao_spi_duplex(const void *out, void *in, uint16_t len, uint8_t id)  { -	uint8_t	*o = out; +	const uint8_t	*o = out;  	uint8_t	*i = in;  	struct lpc_ssp *lpc_ssp = ao_lpc_ssp[id]; diff --git a/src/microsplash/.gitignore b/src/microsplash/.gitignore new file mode 100644 index 00000000..5f6fe3b2 --- /dev/null +++ b/src/microsplash/.gitignore @@ -0,0 +1,2 @@ +ao_product.h +microsplash-* diff --git a/src/microwater/Makefile b/src/microsplash/Makefile index a49cda4b..10cb825b 100644 --- a/src/microwater/Makefile +++ b/src/microsplash/Makefile @@ -48,14 +48,14 @@ INC=\  	altitude-pa.h  IDPRODUCT=0 -PRODUCT=MicroWater-v0.1 +PRODUCT=MicroSplash-v0.1  PRODUCT_DEF=-DMICROPEAK  CFLAGS = $(PRODUCT_DEF) -I. -I../attiny -I../kernel -I.. -I../drivers -I../product  CFLAGS += -g -mmcu=$(MCU) -Wall -Wstrict-prototypes -O2 -mcall-prologues -DATTINY  NICKLE=nickle -PROG=microwater-v0.1 +PROG=microsplash-v1.0  SRC=$(ALTOS_SRC)  OBJ=$(SRC:.c=.o) diff --git a/src/microwater/ao_pins.h b/src/microsplash/ao_pins.h index 37885ec2..37885ec2 100644 --- a/src/microwater/ao_pins.h +++ b/src/microsplash/ao_pins.h diff --git a/src/microwater/.gitignore b/src/microwater/.gitignore deleted file mode 100644 index 0573d989..00000000 --- a/src/microwater/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -ao_product.h -microwater-* diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h index 7ad3b4b8..42f1a2e5 100644 --- a/src/stm/ao_arch_funcs.h +++ b/src/stm/ao_arch_funcs.h @@ -74,7 +74,7 @@ void  ao_spi_put(uint8_t spi_index);  void -ao_spi_send(void *block, uint16_t len, uint8_t spi_index); +ao_spi_send(const void *block, uint16_t len, uint8_t spi_index);  void  ao_spi_send_fixed(uint8_t value, uint16_t len, uint8_t spi_index); diff --git a/src/stm/ao_spi_stm.c b/src/stm/ao_spi_stm.c index 885af544..7eaa3924 100644 --- a/src/stm/ao_spi_stm.c +++ b/src/stm/ao_spi_stm.c @@ -42,7 +42,7 @@ static const struct ao_spi_stm_info ao_spi_stm_info[STM_NUM_SPI] = {  static uint8_t	spi_dev_null;  void -ao_spi_send(void *block, uint16_t len, uint8_t spi_index) +ao_spi_send(const void *block, uint16_t len, uint8_t spi_index)  {  	struct stm_spi *stm_spi = ao_spi_stm_info[AO_SPI_INDEX(spi_index)].stm_spi;  	uint8_t	mosi_dma_index = ao_spi_stm_info[AO_SPI_INDEX(spi_index)].mosi_dma_index; @@ -51,7 +51,7 @@ ao_spi_send(void *block, uint16_t len, uint8_t spi_index)  	/* Set up the transmit DMA to deliver data */  	ao_dma_set_transfer(mosi_dma_index,  			    &stm_spi->dr, -			    block, +			    (void *) block,  			    len,  			    (0 << STM_DMA_CCR_MEM2MEM) |  			    (STM_DMA_CCR_PL_MEDIUM << STM_DMA_CCR_PL) | diff --git a/src/teledongle-v1.8/.gitignore b/src/teledongle-v1.8/.gitignore new file mode 100644 index 00000000..9a30cbb6 --- /dev/null +++ b/src/teledongle-v1.8/.gitignore @@ -0,0 +1,2 @@ +ao_product.h +teledongle-*.elf diff --git a/src/teledongle-v1.8/Makefile b/src/teledongle-v1.8/Makefile new file mode 100644 index 00000000..6c05ce9f --- /dev/null +++ b/src/teledongle-v1.8/Makefile @@ -0,0 +1,88 @@ +# +# AltOS build +# +# + +include ../stm/Makefile.defs + +INC = \ +	ao.h \ +	ao_arch.h \ +	ao_arch_funcs.h \ +	ao_boot.h \ +	ao_pins.h \ +	ao_product.h \ +	ao_task.h \ +	ao_whiten.h \ +	stm32l.h \ +	ao_cc1200.h \ +	ao_cc1200_CC1200.h \ +	Makefile + +#PROFILE=ao_profile.c +#PROFILE_DEF=-DAO_PROFILE=1 + +#SAMPLE_PROFILE=ao_sample_profile.c \ +#	ao_sample_profile_timer.c +#SAMPLE_PROFILE_DEF=-DHAS_SAMPLE_PROFILE=1 + +#STACK_GUARD=ao_mpu_stm.c +#STACK_GUARD_DEF=-DHAS_STACK_GUARD=1 + +ALTOS_SRC = \ +	ao_boot_chain.c \ +	ao_interrupt.c \ +	ao_product.c \ +	ao_romconfig.c \ +	ao_cc1200.c \ +	ao_cmd.c \ +	ao_config.c \ +	ao_task.c \ +	ao_led.c \ +	ao_stdio.c \ +	ao_panic.c \ +	ao_timer.c \ +	ao_mutex.c \ +	ao_freq.c \ +	ao_dma_stm.c \ +	ao_spi_stm.c \ +	ao_usb_stm.c \ +	ao_exti_stm.c \ +	ao_send_packet.c \ +	ao_eeprom_stm.c \ +	ao_monitor.c \ +	ao_packet_master.c \ +	ao_packet.c + +PRODUCT=TeleDongle-v1.8 +PRODUCT_DEF=-DTELEDONGLE +IDPRODUCT=0x000c + +CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) $(SAMPLE_PROFILE_DEF) $(STACK_GUARD_DEF) -Os -g + +PROGNAME=teledongle-v1.8 +PROG=$(PROGNAME)-$(VERSION).elf +HEX=$(PROGNAME)-$(VERSION).ihx + +SRC=$(ALTOS_SRC) ao_teledongle.c +OBJ=$(SRC:.c=.o) + +all: $(PROG) $(HEX) + +$(PROG): Makefile $(OBJ) altos.ld +	$(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(LIBS) + +$(OBJ): $(INC) + +ao_product.h: ao-make-product.5c ../Version +	$(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@ + +distclean:	clean + +clean: +	rm -f *.o $(PROGNAME)-*.elf $(PROGNAME)-*.ihx +	rm -f ao_product.h + +install: + +uninstall: diff --git a/src/teledongle-v1.8/ao_pins.h b/src/teledongle-v1.8/ao_pins.h new file mode 100644 index 00000000..cff3e5e8 --- /dev/null +++ b/src/teledongle-v1.8/ao_pins.h @@ -0,0 +1,147 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +/* Using TeleMetrum v1.9 board */ + +#ifndef _AO_PINS_H_ +#define _AO_PINS_H_ + +#define HAS_TASK_QUEUE		1 + +/* 8MHz High speed external crystal */ +#define AO_HSE			8000000 + +/* PLLVCO = 96MHz (so that USB will work) */ +#define AO_PLLMUL		12 +#define AO_RCC_CFGR_PLLMUL	(STM_RCC_CFGR_PLLMUL_12) + +/* SYSCLK = 32MHz (no need to go faster than CPU) */ +#define AO_PLLDIV		3 +#define AO_RCC_CFGR_PLLDIV	(STM_RCC_CFGR_PLLDIV_3) + +/* HCLK = 32MHz (CPU clock) */ +#define AO_AHB_PRESCALER	1 +#define AO_RCC_CFGR_HPRE_DIV	STM_RCC_CFGR_HPRE_DIV_1 + +/* Run APB1 at 16MHz (HCLK/2) */ +#define AO_APB1_PRESCALER	2 +#define AO_RCC_CFGR_PPRE1_DIV	STM_RCC_CFGR_PPRE2_DIV_2 + +/* Run APB2 at 16MHz (HCLK/2) */ +#define AO_APB2_PRESCALER	2 +#define AO_RCC_CFGR_PPRE2_DIV	STM_RCC_CFGR_PPRE2_DIV_2 + +#define HAS_SERIAL_1		0 +#define USE_SERIAL_1_STDIN	0 +#define SERIAL_1_PB6_PB7	0 +#define SERIAL_1_PA9_PA10	0 + +#define HAS_SERIAL_2		0 +#define USE_SERIAL_2_STDIN	0 +#define SERIAL_2_PA2_PA3	0 +#define SERIAL_2_PD5_PD6	0 + +#define HAS_SERIAL_3		0 +#define USE_SERIAL_3_STDIN	0 +#define SERIAL_3_PB10_PB11	0 +#define SERIAL_3_PC10_PC11	0 +#define SERIAL_3_PD8_PD9	0 + +#define HAS_EEPROM		1 +#define USE_INTERNAL_FLASH	1 +#define USE_STORAGE_CONFIG	0 +#define USE_EEPROM_CONFIG	1 +#define HAS_USB			1 +#define HAS_BEEP		0 +#define HAS_RADIO		1 +#define HAS_TELEMETRY		0 +#define HAS_RSSI		0 + +#define HAS_SPI_1		0 +#define SPI_1_PA5_PA6_PA7	0	/* Barometer */ +#define SPI_1_PB3_PB4_PB5	0 +#define SPI_1_PE13_PE14_PE15	0	/* Accelerometer */ + +#define HAS_SPI_2		1 +#define SPI_2_PB13_PB14_PB15	1	/* Radio */ +#define SPI_2_PD1_PD3_PD4	0 +#define SPI_2_OSPEEDR		STM_OSPEEDR_10MHz + +#define SPI_2_PORT		(&stm_gpiob) +#define SPI_2_SCK_PIN		13 +#define SPI_2_MISO_PIN		14 +#define SPI_2_MOSI_PIN		15 + +#define PACKET_HAS_SLAVE	0 +#define PACKET_HAS_MASTER	1 + +#define LOW_LEVEL_DEBUG		0 + +#define LED_PORT_0_ENABLE	STM_RCC_AHBENR_GPIOCEN +#define LED_PORT_0		(&stm_gpioc) +#define LED_PORT_0_MASK		(0xffff) +#define LED_PORT_0_SHIFT	0 +#define LED_PIN_RED		8 +#define LED_PIN_GREEN		9 +#define AO_LED_RED		(1 << LED_PIN_RED) +#define AO_LED_GREEN		(1 << LED_PIN_GREEN) + +#define LEDS_AVAILABLE		(AO_LED_RED | AO_LED_GREEN) + +#define HAS_GPS			0 +#define HAS_FLIGHT		0 +#define HAS_ADC			0 +#define HAS_LOG			0 + +/* + * Telemetry monitoring + */ +#define HAS_MONITOR		1 +#define LEGACY_MONITOR		0 +#define HAS_MONITOR_PUT		1 +#define AO_MONITOR_LED		AO_LED_GREEN +#define AO_MONITOR_BAD		AO_LED_RED + +/* + * Radio (cc1200) + */ + +/* gets pretty close to 434.550 */ + +#define AO_RADIO_CAL_DEFAULT 	5695733 + +#define AO_FEC_DEBUG		0 +#define AO_CC1200_SPI_CS_PORT	(&stm_gpioc) +#define AO_CC1200_SPI_CS_PIN	5 +#define AO_CC1200_SPI_BUS	AO_SPI_2_PB13_PB14_PB15 +#define AO_CC1200_SPI		stm_spi2 + +#define AO_CC1200_INT_PORT	(&stm_gpioe) +#define AO_CC1200_INT_PIN	1 + +#define AO_CC1200_INT_GPIO	2 +#define AO_CC1200_INT_GPIO_IOCFG	CC1200_IOCFG2 + +/* + * Profiling Viterbi decoding + */ + +#ifndef AO_PROFILE +#define AO_PROFILE	       	0 +#endif + +#endif /* _AO_PINS_H_ */ diff --git a/src/teledongle-v1.8/ao_teledongle.c b/src/teledongle-v1.8/ao_teledongle.c new file mode 100644 index 00000000..5ce6b15b --- /dev/null +++ b/src/teledongle-v1.8/ao_teledongle.c @@ -0,0 +1,54 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <ao.h> +#include <ao_exti.h> +#include <ao_packet.h> +#include <ao_send_packet.h> + +int +main(void) +{ +	ao_clock_init(); + +#if HAS_STACK_GUARD +	ao_mpu_init(); +#endif + +	ao_task_init(); +	ao_led_init(LEDS_AVAILABLE); +	ao_led_on(AO_LED_RED); +	ao_timer_init(); + +	ao_spi_init(); +	ao_dma_init(); +	ao_exti_init(); + +	ao_cmd_init(); + +	ao_usb_init(); +	ao_radio_init(); +	ao_monitor_init(); +	ao_packet_master_init(); +	ao_send_packet_init(); + +	ao_config_init(); + +	ao_led_off(AO_LED_RED); +	ao_start_scheduler(); +	return 0; +} diff --git a/src/teledongle-v1.9/Makefile b/src/teledongle-v1.9/Makefile index a8999c27..78deb9e2 100644 --- a/src/teledongle-v1.9/Makefile +++ b/src/teledongle-v1.9/Makefile @@ -3,7 +3,7 @@  #  # -include ../stm/Makefile.defs +include ../lpc/Makefile.defs  INC = \  	ao.h \ @@ -14,26 +14,11 @@ INC = \  	ao_product.h \  	ao_task.h \  	ao_whiten.h \ -	stm32l.h \ +	lpc.h \ +	ao_cc1200.h \ +	ao_cc1200_CC1200.h \  	Makefile -#PROFILE=ao_profile.c -#PROFILE_DEF=-DAO_PROFILE=1 - -#SAMPLE_PROFILE=ao_sample_profile.c \ -#	ao_sample_profile_timer.c -#SAMPLE_PROFILE_DEF=-DHAS_SAMPLE_PROFILE=1 - -#STACK_GUARD=ao_mpu_stm.c -#STACK_GUARD_DEF=-DHAS_STACK_GUARD=1 - -#	ao_monitor.c \ -#	ao_rssi.c \ -#	ao_send_packet.c \ -#	ao_packet_master.c \ -#	ao_packet.c - -  ALTOS_SRC = \  	ao_boot_chain.c \  	ao_interrupt.c \ @@ -43,23 +28,25 @@ ALTOS_SRC = \  	ao_cmd.c \  	ao_config.c \  	ao_task.c \ -	ao_led.c \ +	ao_led_lpc.c \  	ao_stdio.c \  	ao_panic.c \ -	ao_timer.c \ +	ao_timer_lpc.c \  	ao_mutex.c \  	ao_freq.c \ -	ao_dma_stm.c \ -	ao_spi_stm.c \ -	ao_usb_stm.c \ -	ao_exti_stm.c \ -	ao_eeprom_stm.c +	ao_spi_lpc.c \ +	ao_usb_lpc.c \ +	ao_exti_lpc.c \ +	ao_send_packet.c \ +	ao_monitor.c \ +	ao_packet_master.c \ +	ao_packet.c  PRODUCT=TeleDongle-v1.9  PRODUCT_DEF=-DTELEDONGLE  IDPRODUCT=0x000c -CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) $(SAMPLE_PROFILE_DEF) $(STACK_GUARD_DEF) -Os -g +CFLAGS = $(PRODUCT_DEF) $(LPC_CFLAGS) -Os -g  PROGNAME=teledongle-v1.9  PROG=$(PROGNAME)-$(VERSION).elf @@ -78,6 +65,9 @@ $(OBJ): $(INC)  ao_product.h: ao-make-product.5c ../Version  	$(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@ +load: $(PROG) +	lpc-load $(PROG) +  distclean:	clean  clean: diff --git a/src/teledongle-v1.9/ao_pins.h b/src/teledongle-v1.9/ao_pins.h index bbc42a5d..f8889c4a 100644 --- a/src/teledongle-v1.9/ao_pins.h +++ b/src/teledongle-v1.9/ao_pins.h @@ -20,83 +20,49 @@  #ifndef _AO_PINS_H_  #define _AO_PINS_H_ -#define HAS_TASK_QUEUE		1 - -/* 8MHz High speed external crystal */ -#define AO_HSE			8000000 - -/* PLLVCO = 96MHz (so that USB will work) */ -#define AO_PLLMUL		12 -#define AO_RCC_CFGR_PLLMUL	(STM_RCC_CFGR_PLLMUL_12) - -/* SYSCLK = 32MHz (no need to go faster than CPU) */ -#define AO_PLLDIV		3 -#define AO_RCC_CFGR_PLLDIV	(STM_RCC_CFGR_PLLDIV_3) - -/* HCLK = 32MHz (CPU clock) */ -#define AO_AHB_PRESCALER	1 -#define AO_RCC_CFGR_HPRE_DIV	STM_RCC_CFGR_HPRE_DIV_1 +#define AO_STACK_SIZE	324 -/* Run APB1 at 16MHz (HCLK/2) */ -#define AO_APB1_PRESCALER	2 -#define AO_RCC_CFGR_PPRE1_DIV	STM_RCC_CFGR_PPRE2_DIV_2 +#define HAS_TASK_QUEUE		1 -/* Run APB2 at 16MHz (HCLK/2) */ -#define AO_APB2_PRESCALER	2 -#define AO_RCC_CFGR_PPRE2_DIV	STM_RCC_CFGR_PPRE2_DIV_2 +#define IS_FLASH_LOADER	0 -#define HAS_SERIAL_1		0 -#define USE_SERIAL_1_STDIN	0 -#define SERIAL_1_PB6_PB7	0 -#define SERIAL_1_PA9_PA10	0 +/* Crystal on the board */ +#define AO_LPC_CLKIN	12000000 -#define HAS_SERIAL_2		0 -#define USE_SERIAL_2_STDIN	0 -#define SERIAL_2_PA2_PA3	0 -#define SERIAL_2_PD5_PD6	0 +/* Main clock frequency. 48MHz for USB so we don't use the USB PLL */ +#define AO_LPC_CLKOUT	48000000 -#define HAS_SERIAL_3		0 -#define USE_SERIAL_3_STDIN	0 -#define SERIAL_3_PB10_PB11	0 -#define SERIAL_3_PC10_PC11	0 -#define SERIAL_3_PD8_PD9	0 +/* System clock frequency */ +#define AO_LPC_SYSCLK	24000000 -#define HAS_EEPROM		1 -#define USE_INTERNAL_FLASH	1 +#define HAS_EEPROM		0 +#define USE_INTERNAL_FLASH	0  #define USE_STORAGE_CONFIG	0 -#define USE_EEPROM_CONFIG	1 +#define USE_EEPROM_CONFIG	0 +  #define HAS_USB			1 +#define HAS_USB_CONNECT		0 +#define HAS_USB_VBUS		0 +#define HAS_USB_PULLUP		1 +#define AO_USB_PULLUP_PORT	0 +#define AO_USB_PULLUP_PIN	20 +  #define HAS_BEEP		0  #define HAS_RADIO		1  #define HAS_TELEMETRY		0 -#define HAS_RSSI		1 - -#define HAS_SPI_1		0 -#define SPI_1_PA5_PA6_PA7	0	/* Barometer */ -#define SPI_1_PB3_PB4_PB5	0 -#define SPI_1_PE13_PE14_PE15	0	/* Accelerometer */ - -#define HAS_SPI_2		1 -#define SPI_2_PB13_PB14_PB15	1	/* Radio */ -#define SPI_2_PD1_PD3_PD4	0 -#define SPI_2_OSPEEDR		STM_OSPEEDR_10MHz +#define HAS_RSSI		0 -#define SPI_2_PORT		(&stm_gpiob) -#define SPI_2_SCK_PIN		13 -#define SPI_2_MISO_PIN		14 -#define SPI_2_MOSI_PIN		15 +#define HAS_SPI_0		1 +#define SPI_SCK0_P0_6		1  #define PACKET_HAS_SLAVE	0  #define PACKET_HAS_MASTER	1  #define LOW_LEVEL_DEBUG		0 -#define LED_PORT_0_ENABLE	STM_RCC_AHBENR_GPIOCEN -#define LED_PORT_0		(&stm_gpioc) -#define LED_PORT_0_MASK		(0xffff) -#define LED_PORT_0_SHIFT	0 -#define LED_PIN_RED		8 -#define LED_PIN_GREEN		9 +#define LED_PORT		0 +#define LED_PIN_RED		14 +#define LED_PIN_GREEN		7  #define AO_LED_RED		(1 << LED_PIN_RED)  #define AO_LED_GREEN		(1 << LED_PIN_GREEN) @@ -110,10 +76,11 @@  /*   * Telemetry monitoring   */ -#define HAS_MONITOR		0 +#define HAS_MONITOR		1  #define LEGACY_MONITOR		0  #define HAS_MONITOR_PUT		1  #define AO_MONITOR_LED		AO_LED_GREEN +#define AO_MONITOR_BAD		AO_LED_RED  /*   * Radio (cc1200) @@ -121,16 +88,16 @@  /* gets pretty close to 434.550 */ -#define AO_RADIO_CAL_DEFAULT 	0x6ca333 +#define AO_RADIO_CAL_DEFAULT 	5695733  #define AO_FEC_DEBUG		0 -#define AO_CC1200_SPI_CS_PORT	(&stm_gpioc) -#define AO_CC1200_SPI_CS_PIN	5 -#define AO_CC1200_SPI_BUS	AO_SPI_2_PB13_PB14_PB15 -#define AO_CC1200_SPI		stm_spi2 +#define AO_CC1200_SPI_CS_PORT	0 +#define AO_CC1200_SPI_CS_PIN	3 +#define AO_CC1200_SPI_BUS	0 +#define AO_CC1200_SPI		0 -#define AO_CC1200_INT_PORT	(&stm_gpioe) -#define AO_CC1200_INT_PIN	1 +#define AO_CC1200_INT_PORT	0 +#define AO_CC1200_INT_PIN	2  #define AO_CC1200_INT_GPIO	2  #define AO_CC1200_INT_GPIO_IOCFG	CC1200_IOCFG2 diff --git a/src/teledongle-v1.9/ao_teledongle.c b/src/teledongle-v1.9/ao_teledongle.c index ac1e3c9f..02b93efe 100644 --- a/src/teledongle-v1.9/ao_teledongle.c +++ b/src/teledongle-v1.9/ao_teledongle.c @@ -35,20 +35,19 @@ main(void)  	ao_timer_init();  	ao_spi_init(); -	ao_dma_init();  	ao_exti_init();  	ao_cmd_init();  	ao_usb_init();  	ao_radio_init(); -//	ao_monitor_init(); -//	ao_rssi_init(AO_LED_RED); -//	ao_packet_master_init(); -//	ao_send_packet_init(); +	ao_monitor_init(); +	ao_packet_master_init(); +	ao_send_packet_init();  	ao_config_init(); +	ao_led_off(AO_LED_RED);  	ao_start_scheduler();  	return 0;  } diff --git a/src/teledongle-v1.9/flash-loader/Makefile b/src/teledongle-v1.9/flash-loader/Makefile index 70ddaad4..a5642b46 100644 --- a/src/teledongle-v1.9/flash-loader/Makefile +++ b/src/teledongle-v1.9/flash-loader/Makefile @@ -4,4 +4,4 @@  TOPDIR=../..  HARDWARE=teledongle-v1.9 -include $(TOPDIR)/stm/Makefile-flash.defs +include $(TOPDIR)/lpc/Makefile-flash.defs diff --git a/src/teledongle-v1.9/flash-loader/ao_pins.h b/src/teledongle-v1.9/flash-loader/ao_pins.h index 1af92f13..aee5be27 100644 --- a/src/teledongle-v1.9/flash-loader/ao_pins.h +++ b/src/teledongle-v1.9/flash-loader/ao_pins.h @@ -18,17 +18,18 @@  #ifndef _AO_PINS_H_  #define _AO_PINS_H_ -/* External crystal at 8MHz */ -#define AO_HSE		8000000 +#include <ao_flash_lpc_pins.h> -#include <ao_flash_stm_pins.h> +/* Debug port TXD (pin 6) */ -/* Companion port cs_companion0 PD0 */ - -#define AO_BOOT_PIN		1 -#define AO_BOOT_APPLICATION_GPIO	stm_gpiod -#define AO_BOOT_APPLICATION_PIN		0 +#define AO_BOOT_PIN			1 +#define AO_BOOT_APPLICATION_GPIO	0 +#define AO_BOOT_APPLICATION_PIN		19  #define AO_BOOT_APPLICATION_VALUE	1  #define AO_BOOT_APPLICATION_MODE	AO_EXTI_MODE_PULL_UP +#define HAS_USB_PULLUP	1 +#define AO_USB_PULLUP_PORT	0 +#define AO_USB_PULLUP_PIN	20 +  #endif /* _AO_PINS_H_ */ diff --git a/src/test/ao_gps_test_ublox.c b/src/test/ao_gps_test_ublox.c index 5ea205d6..83efbb4f 100644 --- a/src/test/ao_gps_test_ublox.c +++ b/src/test/ao_gps_test_ublox.c @@ -59,6 +59,7 @@ struct ao_telemetry_location {  typedef int32_t		gps_alt_t;  #define AO_TELEMETRY_LOCATION_ALTITUDE(l) 	(((gps_alt_t) (l)->altitude_high << 16) | ((l)->altitude_low)) +#define AO_GPS_ORIG_ALTITUDE(l)			AO_TELEMETRY_LOCATION_ALTITUDE(l)  #define AO_TELEMETRY_LOCATION_SET_ALTITUDE(l,a) (((l)->altitude_high = (a) >> 16), \  						 ((l)->altitude_low = (a))) | 
