From 499092b479bb760a5c5523fe1b697241534ced82 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 22 Dec 2013 18:17:24 +0100 Subject: [PATCH 1/7] Fixes #155 --- src/targets/sky9x/adc_driver.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/targets/sky9x/adc_driver.cpp b/src/targets/sky9x/adc_driver.cpp index 1d09ef988..e3adf33a3 100644 --- a/src/targets/sky9x/adc_driver.cpp +++ b/src/targets/sky9x/adc_driver.cpp @@ -45,12 +45,12 @@ const char ana_direction[NUMBER_ANALOG] = {1, 1, 0, 1 ,0 ,1 ,0, 0, 0}; // Settings for mode register ADC_MR // USEQ off - silicon problem, doesn't work -// TRANSFER = 1 -// TRACKTIM = 4 (5 clock periods) -// ANACH = 0 -// SETTLING = 1 (not used if ANACH = 0) -// STARTUP = 1 (8 clock periods) -// PRESCAL = 3.6 MHz clock (between 1 and 20MHz) +// TRANSFER = 3 +// TRACKTIM = 15 (16 clock periods) +// ANACH = 1 +// SETTLING = 6 (not used if ANACH = 0) +// STARTUP = 6 (96 clock periods) +// PRESCAL = 9.0 MHz clock (between 1 and 20MHz) // FREERUN = 0 // FWUP = 0 // SLEEP = 0 @@ -66,7 +66,7 @@ void adcInit() // Enable peripheral clock ADC = bit 29 PMC->PMC_PCER0 |= 0x20000000L ; // Enable peripheral clock to ADC padc = ADC ; - padc->ADC_MR = 0x14110000 | timer ; // 0001 0100 0001 0001 xxxx xxxx 0000 0000 + padc->ADC_MR = 0x3FB60000 | timer ; // 0011 1111 1011 0110 xxxx xxxx 0000 0000 padc->ADC_ACR = ADC_ACR_TSON ; // Turn on temp sensor #if defined(REVA) padc->ADC_CHER = 0x0000E23E ; // channels 1,2,3,4,5,9,13,14,15 From 0f242f556569ada998da490300711740ae6e23b2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 23 Dec 2013 10:42:57 +0100 Subject: [PATCH 2/7] [Taranis] No more audio freeze! --- src/audio_arm.cpp | 3 ++- src/targets/taranis/audio_driver.cpp | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/audio_arm.cpp b/src/audio_arm.cpp index 8b6bf9b44..428e75856 100644 --- a/src/audio_arm.cpp +++ b/src/audio_arm.cpp @@ -325,8 +325,9 @@ void AudioQueue::pushBuffer(AudioBuffer *buffer) { buffer->state = AUDIO_BUFFER_FILLED; - if (dacQueue(buffer)) + if (dacQueue(buffer)) { buffer->state = AUDIO_BUFFER_PLAYING; + } bufferWIdx = nextBufferIdx(bufferWIdx); } diff --git a/src/targets/taranis/audio_driver.cpp b/src/targets/taranis/audio_driver.cpp index d0b0508aa..5dc714fd5 100644 --- a/src/targets/taranis/audio_driver.cpp +++ b/src/targets/taranis/audio_driver.cpp @@ -95,8 +95,10 @@ void dacInit() bool dacQueue(AudioBuffer *buffer) { + __disable_irq(); if (dacIdle) { dacIdle = false; + __enable_irq(); DMA1_Stream5->CR &= ~DMA_SxCR_EN ; // Disable DMA channel DMA1->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5 ; // Write ones to clear bits DMA1_Stream5->M0AR = CONVERT_PTR(buffer->data); @@ -107,6 +109,7 @@ bool dacQueue(AudioBuffer *buffer) return true; } else { + __enable_irq(); return false; } } From 132aa15ab6a86d0b750edc675e41c34dd2333b67 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 23 Dec 2013 15:18:00 +0100 Subject: [PATCH 3/7] [Taranis] Best fix for the audio freeze by Mike, thanks! --- src/audio_arm.cpp | 6 +++++- src/targets/taranis/audio_driver.cpp | 3 --- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/audio_arm.cpp b/src/audio_arm.cpp index 428e75856..c3d311514 100644 --- a/src/audio_arm.cpp +++ b/src/audio_arm.cpp @@ -325,11 +325,15 @@ void AudioQueue::pushBuffer(AudioBuffer *buffer) { buffer->state = AUDIO_BUFFER_FILLED; + __disable_irq(); + + bufferWIdx = nextBufferIdx(bufferWIdx); + if (dacQueue(buffer)) { buffer->state = AUDIO_BUFFER_PLAYING; } - bufferWIdx = nextBufferIdx(bufferWIdx); + __enable_irq(); } void mix(uint16_t * result, int sample, unsigned int fade) diff --git a/src/targets/taranis/audio_driver.cpp b/src/targets/taranis/audio_driver.cpp index 5dc714fd5..d0b0508aa 100644 --- a/src/targets/taranis/audio_driver.cpp +++ b/src/targets/taranis/audio_driver.cpp @@ -95,10 +95,8 @@ void dacInit() bool dacQueue(AudioBuffer *buffer) { - __disable_irq(); if (dacIdle) { dacIdle = false; - __enable_irq(); DMA1_Stream5->CR &= ~DMA_SxCR_EN ; // Disable DMA channel DMA1->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5 ; // Write ones to clear bits DMA1_Stream5->M0AR = CONVERT_PTR(buffer->data); @@ -109,7 +107,6 @@ bool dacQueue(AudioBuffer *buffer) return true; } else { - __enable_irq(); return false; } } From b185cc7fd89983a2a52babe7566e809475d1c81a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 27 Dec 2013 10:33:45 +0100 Subject: [PATCH 4/7] Fix for #197 (non audio chunks > 256 bytes) --- src/audio_arm.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/audio_arm.cpp b/src/audio_arm.cpp index c3d311514..8864bdf4e 100644 --- a/src/audio_arm.cpp +++ b/src/audio_arm.cpp @@ -373,10 +373,13 @@ int AudioQueue::mixWav(AudioContext &context, AudioBuffer *buffer, int volume, u result = FR_DENIED; } while (result == FR_OK && memcmp(wavSamplesPtr, "data", 4) != 0) { - result = (size < 256 ? f_read(&context.state.wav.file, wavBuffer, size+8, &read) : FR_DENIED); - if (read != size+8) result = FR_DENIED; - wavSamplesPtr = (uint32_t *)(wavBuffer + size); - size = wavSamplesPtr[1]; + result = f_lseek(&context.state.wav.file, f_tell(&context.state.wav.file)+size); + if (result == FR_OK) { + result = f_read(&context.state.wav.file, wavBuffer, 8, &read); + if (read != 8) result = FR_DENIED; + wavSamplesPtr = (uint32_t *)wavBuffer; + size = wavSamplesPtr[1]; + } } context.state.wav.size = size; } From c1778246016c5e07226f076a1a6115279e2bfdd8 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 4 Jan 2014 18:21:08 +0100 Subject: [PATCH 5/7] Reinstate A2 alarms in D16 mode for the 3rd party adapter --- src/telemetry/frsky_sport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/telemetry/frsky_sport.cpp b/src/telemetry/frsky_sport.cpp index 5ea7a2846..4b8c68a5f 100644 --- a/src/telemetry/frsky_sport.cpp +++ b/src/telemetry/frsky_sport.cpp @@ -576,11 +576,11 @@ void telemetryWakeup() } } else if (alarmsCheckStep == 2) { - if (alarmRaised(1, 1) && g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_D8) { + if (alarmRaised(1, 1)) { AUDIO_A2_RED(); alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ } - else if (alarmRaised(1, 0) && g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_D8) { + else if (alarmRaised(1, 0)) { AUDIO_A2_ORANGE(); alarmsCheckTime = get_tmr10ms() + 300; /* next check in 3seconds */ } From 4ffe49ef01fc2db191e5dfca1a6c15ac30b898d9 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 4 Jan 2014 20:41:19 +0100 Subject: [PATCH 6/7] A2 was also disabled in custom switches in D16 mode --- src/opentx.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/opentx.cpp b/src/opentx.cpp index 6f02ebd2f..574da915f 100644 --- a/src/opentx.cpp +++ b/src/opentx.cpp @@ -1013,11 +1013,6 @@ bool getSwitch(int8_t swtch) if (cs->v1 >= MIXSRC_FIRST_TELEM) { if ((!TELEMETRY_STREAMING() && cs->v1 >= MIXSRC_FIRST_TELEM+TELEM_FIRST_STREAMED_VALUE-1) || IS_FAI_FORBIDDEN(cs->v1-1)) return swtch > 0 ? false : true; - -#if defined (PCBTARANIS) - if (cs->v1 == MIXSRC_FIRST_TELEM+TELEM_A2-1 && g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_X16) - return swtch > 0 ? false : true; -#endif y = convertCswTelemValue(cs); From 300d6af0860fa366b54fafe908200a35a03f5b87 Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Sat, 4 Jan 2014 18:11:33 +0100 Subject: [PATCH 7/7] Avoid Telemetry Lost / Telemetry Recovered voice alerts playing back to back when using the Reset Telemetry / Flight functions --- src/telemetry/frsky_sport.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/telemetry/frsky_sport.cpp b/src/telemetry/frsky_sport.cpp index 4b8c68a5f..c5ef5c309 100644 --- a/src/telemetry/frsky_sport.cpp +++ b/src/telemetry/frsky_sport.cpp @@ -639,6 +639,7 @@ void FrskyValueWithMinMax::set(uint8_t value) void resetTelemetry() { memclear(&frskyData, sizeof(frskyData)); + telemetryState = TELEMETRY_INIT; #if defined(FRSKY_HUB) frskyData.hub.gpsLatitude_bp = 2;