[tuxdroid-svn] r1313 - in firmware: fuxusb/branches/new_rf/src tuxaudio/branches/new_rf
Status: Beta
Brought to you by:
ks156
From: jaguarondi <c2m...@c2...> - 2008-07-08 10:57:16
|
Author: jaguarondi Date: 2008-07-08 12:57:20 +0200 (Tue, 08 Jul 2008) New Revision: 1313 Modified: firmware/fuxusb/branches/new_rf/src/spi_task.c firmware/tuxaudio/branches/new_rf/communication.c Log: * Added an ACK on commands bewteen tuxaudio and tuxcore. This slows down the data rate but we don't need much for data anyway. I'd leave like this until there's a real need to do otherwise. Modified: firmware/fuxusb/branches/new_rf/src/spi_task.c =================================================================== --- firmware/fuxusb/branches/new_rf/src/spi_task.c 2008-07-08 08:30:39 UTC (rev 1312) +++ firmware/fuxusb/branches/new_rf/src/spi_task.c 2008-07-08 10:57:20 UTC (rev 1313) @@ -31,6 +31,7 @@ #include "fifo_spk.h" #include "fifo_mic.h" #include "fifo_stt.h" +#include "common/defines.h" /** * \brief spi_slave enum define the steps of the SPI frame. @@ -72,30 +73,8 @@ static bit spi_ready = 0; static bit spi_Start_Flag = 0; -/** \name SPI frame constants - * @{ */ -/** Size of the audio data in the SPI frame */ -// XXX Double frame -#define AUDIO_SPK_SIZE 34 -#define AUDIO_MIC_SIZE 17 - -/* Bits of the config byte */ -#define _BV(x) (1<<x) -#define CFG_CRCOK_MK _BV(0) -#define CFG_DATA_MK _BV(1) -#define CFG_AUDIO_MK _BV(2) -#define CFG_PREVAUDIO_MK _BV(3) - -/* SPI frame organization */ -#define SPI_SIZE 50 -#define SPI_IDX_OFFSET 0 -#define SPI_CONFIG_OFFSET 1 -#define SPI_DATA_OFFSET 3 -#define SPI_AUDIO_OFFSET (SPI_DATA_OFFSET + CMD_SIZE) -/*! @} */ - static uint8_t spi_in[SPI_SIZE], spi_out[SPI_SIZE], spi_idx; -static uint8_t idx_in, idx_out; +static uint8_t frame_in_idx, frame_out_idx; /** * \brief Reset the SPI task to the defaults states. @@ -196,7 +175,6 @@ */ void spi_task(void) { - uint8_t config; uint8_t i; static bit prev_spi_start = False; @@ -228,13 +206,38 @@ } else if (spi_idx >= SPI_SIZE) { + uint8_t config_in = 0; + static uint8_t config_out = 0; + spi_idx = 0; - /* Prepare next SPI frame to be sent to the RF */ - config = 0; - if (new_command_received) + config_in = spi_in[SPI_CONFIG_OFFSET]; + + /* Incoming data */ + if (frame_in_idx != spi_in[SPI_IDX_OFFSET]) { + frame_in_idx = spi_in[SPI_IDX_OFFSET]; + if ((!(config_in & CFG_DATA_MK)) != (!(config_out & CFG_ACK_MK))) + { + for (i=0; i<CMD_SIZE; i++) + { + FIFO_STT_put(spi_in[i+SPI_DATA_OFFSET]); + } + /* Ack the data */ + config_out ^= CFG_ACK_MK; + } + if (config_in & CFG_AUDIO_MK) + { + FIFO_MIC_put_n(&spi_in[SPI_AUDIO_OFFSET], AUDIO_MIC_SIZE); + } + } + + /* Outgoing data, add commands and/or audio. */ + spi_out[SPI_IDX_OFFSET] = frame_out_idx++; + if ((!(config_out & CFG_DATA_MK)) == (!(config_in & CFG_ACK_MK)) && + new_command_received) + { new_command_received = False; - config |= CFG_DATA_MK; + config_out ^= CFG_DATA_MK; for (i=0; i<CMD_SIZE; i++) { spi_out[i+SPI_DATA_OFFSET] = command_received[i]; @@ -242,44 +245,14 @@ } if (FIFO_SPK_length() >= AUDIO_SPK_SIZE) { - config |= CFG_AUDIO_MK; + config_out |= CFG_AUDIO_MK; FIFO_SPK_get_n(&spi_out[SPI_AUDIO_OFFSET], AUDIO_SPK_SIZE); } - - - /* Store the frame index and the config byte. */ - spi_out[SPI_IDX_OFFSET] = idx_out++; - spi_out[SPI_CONFIG_OFFSET] = config; - - /* XXX debug */ - /*for (i=0; i<SPI_SIZE; i++)*/ - /*spi_out[i] = 0x00;//1<<(i&7);*/ - /*for (i=23; i<45; i++)*/ - /*spi_out[i] = 0x00;//1<<(i&7);*/ - /*for (i=45; i<SPI_SIZE; i+=1)*/ - /*spi_out[i] = 0x01;*/ - /*for (i=40; i<50; i++)*/ - /*spi_out[i] = 0x55;*/ - - /* Store and increment the index of the frame. */ - - /* Process last SPI frame received from the RF */ - if (idx_in != spi_in[SPI_IDX_OFFSET]) + else { - idx_in = spi_in[SPI_IDX_OFFSET]; - config = spi_in[SPI_CONFIG_OFFSET]; - if (config & CFG_DATA_MK) - { - for (i=0; i<CMD_SIZE; i++) - { - FIFO_STT_put(spi_in[i+SPI_DATA_OFFSET]); - } - } - if (config & CFG_AUDIO_MK) - { - FIFO_MIC_put_n(&spi_in[SPI_AUDIO_OFFSET], AUDIO_MIC_SIZE); - } + config_out &= ~CFG_AUDIO_MK; } + spi_out[SPI_CONFIG_OFFSET] = config_out; } P3_6 = 0; /* XXX debug */ } Modified: firmware/tuxaudio/branches/new_rf/communication.c =================================================================== --- firmware/tuxaudio/branches/new_rf/communication.c 2008-07-08 08:30:39 UTC (rev 1312) +++ firmware/tuxaudio/branches/new_rf/communication.c 2008-07-08 10:57:20 UTC (rev 1313) @@ -242,26 +242,6 @@ * SPI communication */ -/** \name SPI frame constants - * @{ */ -/** Size of the audio data in the SPI frame */ -#define AUDIO_SPK_SIZE 34 -#define AUDIO_MIC_SIZE 17 - -/* Bits of the config byte */ -#define CFG_CRCOK_MK _BV(0) -#define CFG_DATA_MK _BV(1) -#define CFG_AUDIO_MK _BV(2) -#define CFG_PREVAUDIO_MK _BV(3) - -/* SPI frame organization */ -#define SPI_SIZE 51 -#define SPI_IDX_OFFSET 0 -#define SPI_CONFIG_OFFSET 1 -#define SPI_DATA_OFFSET 3 -#define SPI_AUDIO_OFFSET (SPI_DATA_OFFSET + CMD_SIZE) -/*! @} */ - static uint8_t frame_in_idx, frame_out_idx; static uint8_t spi_in[52], spi_out[52], spi_idx; @@ -280,8 +260,6 @@ //PORTB &= ~0x80; // XXX DEBUG } - -/* XXX add an spi_config byte as register that could be checked by bits */ /* INT0 (PD0) Interrupt on SPIACK signal. */ ISR(SIG_INTERRUPT0) { @@ -341,8 +319,8 @@ } /** - * \brief Service routine that handles the regular communication tasks like sending - * and fetching commands. + * \brief Service routine that handles the regular communication tasks like + * sending and fetching commands. */ void communication_task(void) { @@ -356,47 +334,29 @@ /* Fill and process RF data. */ if (spi_idx >= SPI_SIZE) { - uint8_t config; + uint8_t config_in; + static uint8_t config_out; uint8_t i; spi_idx = 0; + config_in = spi_in[SPI_CONFIG_OFFSET]; - /* Add data and/or audio if necessary. */ - config = 0; - if (FifoLength(rf_cmdout_buf) >= CMD_SIZE) - { - config |= CFG_DATA_MK; - for (i=0; i<CMD_SIZE; i++) - { - FifoGet(rf_cmdout_buf, &spi_out[i+SPI_DATA_OFFSET]); - } - } - if (FifoLength(ADCFifo) >= AUDIO_MIC_SIZE) - { - config |= CFG_AUDIO_MK; - for (i=0; i<AUDIO_MIC_SIZE; i++) - { - FifoGet(ADCFifo, &spi_out[i+SPI_AUDIO_OFFSET]); - } - } - spi_out[SPI_IDX_OFFSET] = frame_out_idx++; - spi_out[SPI_CONFIG_OFFSET] = config; - /* Incoming data */ if (frame_in_idx != spi_in[SPI_IDX_OFFSET]) { //PORTB |= 0x80; // XXX DEBUG frame_in_idx = spi_in[SPI_IDX_OFFSET]; - config = spi_in[SPI_CONFIG_OFFSET]; - if (config & CFG_DATA_MK) + if ((!(config_in & CFG_DATA_MK)) != (!(config_out & CFG_ACK_MK))) { /* Parse the command and forward to tuxcore if it isn't * dropped. */ uint8_t *cmd = &spi_in[SPI_DATA_OFFSET]; if (!parse_cmd(cmd)) queue_core_cmd(cmd); + /* Ack the data by toggling the bit */ + config_out ^= CFG_ACK_MK; } - if (config & CFG_AUDIO_MK) + if (config_in & CFG_AUDIO_MK) { adapt_audio_rate(); @@ -414,6 +374,31 @@ } //else //PORTB |= 0x80; // XXX DEBUG + + /* Outgoing data, add commands and/or audio. */ + spi_out[SPI_IDX_OFFSET] = frame_out_idx++; + if ((!(config_out & CFG_DATA_MK)) == (!(config_in & CFG_ACK_MK)) && + FifoLength(rf_cmdout_buf) >= CMD_SIZE) + { + config_out ^= CFG_DATA_MK; + for (i=0; i<CMD_SIZE; i++) + { + FifoGet(rf_cmdout_buf, &spi_out[i+SPI_DATA_OFFSET]); + } + } + if (FifoLength(ADCFifo) >= AUDIO_MIC_SIZE) + { + config_out |= CFG_AUDIO_MK; + for (i=0; i<AUDIO_MIC_SIZE; i++) + { + FifoGet(ADCFifo, &spi_out[i+SPI_AUDIO_OFFSET]); + } + } + else + { + config_out &= ~CFG_AUDIO_MK; + } + spi_out[SPI_CONFIG_OFFSET] = config_out; } /* If busy, pass. */ |