feat(tx15): support for KCX BT audio (#6777)

This commit is contained in:
3djc
2025-11-30 10:50:46 +10:00
committed by GitHub
parent 9414308ebd
commit bc875e68d9
29 changed files with 155 additions and 1 deletions
+30
View File
@@ -1,3 +1,24 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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.
*/
#include "drivers/tas2505.h"
#include "stm32_dma.h"
@@ -141,11 +162,20 @@ static void audio_update_dma_buffer(uint8_t tc)
bool audioHeadphoneDetect()
{
#if defined(KCX_BTAUDIO)
return gpio_read(AUDIO_HP_DETECT_PIN) || gpio_read(BTAUDIO_LINKED_GPIO);
#else
return gpio_read(AUDIO_HP_DETECT_PIN);
#endif
}
void audioSetVolume(uint8_t volume)
{
#if defined(KCX_BTAUDIO)
// KCX need a volume boost
if (btAudioLinked())
volume = volume + (volume >> 2);
#endif
tas2505_set_volume(&_tas2505, volume * 9 / 10, audioHeadphoneDetect()); // TX15 HP cannot handle the full power of TAS2505
}
+4
View File
@@ -135,6 +135,10 @@ void boardInit()
// enable interrupts
__enable_irq();
#if defined(KCX_BTAUDIO)
btAudioInit();
#endif
ledInit();
boardInitModulePorts();
+44
View File
@@ -0,0 +1,44 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* 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.
*/
#include "hal.h"
#include "stm32_gpio_driver.h"
#include "stm32_gpio.h"
#include "os/sleep.h"
void btAudioInit()
{
gpio_init(BTAUDIO_LINKED_GPIO, GPIO_IN, GPIO_PIN_SPEED_LOW);
gpio_init(BTAUDIO_CONNECT_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW);
gpio_set(BTAUDIO_CONNECT_GPIO);
}
bool btAudioLinked()
{
return gpio_read(BTAUDIO_LINKED_GPIO);
}
void btAudioConnect()
{
gpio_clear(BTAUDIO_CONNECT_GPIO);
sleep_ms(100);
gpio_set(BTAUDIO_CONNECT_GPIO);
}
@@ -255,6 +255,17 @@ static SetupLineDef soundPageSetupLines[] = {
GET_SET_DEFAULT(g_eeGeneral.backgroundVolume)))->setPos(x, y);
}
},
#if defined(KCX_BTAUDIO)
{
STR_DEF(STR_BTAUDIO),
[](Window* parent, coord_t x, coord_t y) {
new TextButton(parent, {x, y, 0, 0}, STR_PAIRING, [=]() {
btAudioConnect();
return 0;
});
}
},
#endif
};
#endif
+5
View File
@@ -36,3 +36,8 @@ bool audioHeadphoneDetect();
void audioSetVolume(uint8_t volume);
void audioConsumeCurrentBuffer();
#if defined(KCX_BTAUDIO)
void btAudioInit();
bool btAudioLinked();
void btAudioConnect();
#endif
+4
View File
@@ -29,6 +29,10 @@ bool audioHeadphoneDetect()
}
#endif
void btAudioInit() {}
bool btAudioLinked() { return false; }
void btAudioConnect() {}
#if !defined(SOFTWARE_VOLUME)
static int _simu_volume = 0;
+12 -1
View File
@@ -8,7 +8,8 @@ option(MODULE_SIZE_STD "Standard size TX Module" ON)
option(LUA_MIXER "Enable LUA mixer/model scripts support" ON)
option(DISK_CACHE "Enable SD card disk cache" ON)
option(BLUETOOTH "FrSky BT module support" OFF)
option(FLYSKY_GIMBAL "Serial gimbal support" ON)
option(FLYSKY_GIMBAL "Serial gimbal support" OFF)
option(KCX_BTAUDIO "KCX_BTAUDIO audio emitter installed" OFF)
set(FIRMWARE_QSPI YES)
set(FIRMWARE_FORMAT_UF2 YES)
@@ -32,6 +33,9 @@ set(FUNCTION_SWITCHES_WITH_RGB YES)
# BT and serial gimbal share same UART
if(BLUETOOTH)
set(FLYSKY_GIMBAL OFF)
set(KCX_BTAUDIO OFF)
elseif(KCX_BTAUDIO)
set(FLYSKY_GIMBAL OFF)
endif()
#option(STICK_DEAD_ZONE "Enable sticks dead zone" YES)
@@ -150,6 +154,13 @@ if(BLUETOOTH)
)
endif()
if(KCX_BTAUDIO)
set(BOARD_COMMON_SRC ${BOARD_COMMON_SRC}
drivers/kcx_btaudio.cpp
)
add_definitions(-DKCX_BTAUDIO)
endif()
# Bootloader board library
add_library(board_bl OBJECT EXCLUDE_FROM_ALL
${BOARD_COMMON_SRC}
+3
View File
@@ -504,6 +504,9 @@ TIM17: ROTARY_ENCODER_TIMER
#define BT_TX_GPIO GPIO_PIN(GPIOB, 9)
#define BT_RX_GPIO GPIO_PIN(GPIOB, 8)
#define BT_EN_GPIO GPIO_PIN(GPIOH, 11)
#elif defined(KCX_BTAUDIO)
#define BTAUDIO_LINKED_GPIO GPIO_PIN(GPIOH, 11)
#define BTAUDIO_CONNECT_GPIO GPIO_PIN(GPIOB, 9)
#endif
#if defined(FLYSKY_GIMBAL)
+2
View File
@@ -1014,6 +1014,8 @@
#define TR_RECEIVER_RESET "是否复位接收机?"
#define TR_SHARE "分享"
#define TR_BIND "对频"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("注册", "注册"))
#define TR_MODULE_RANGE BUTTON(TR("测距", "测距"))
#define TR_RANGE_TEST "距离测试(低功率)"
+2
View File
@@ -1012,6 +1012,8 @@
#define TR_RECEIVER_RESET "Resetovat přijímač?"
#define TR_SHARE "Sdílet"
#define TR_BIND "Párovat"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Registrovat"))
#define TR_MODULE_RANGE BUTTON(TR("Rng", "Dosah"))
#define TR_RANGE_TEST "Test dosahu"
+2
View File
@@ -1019,6 +1019,8 @@
#define TR_RECEIVER_RESET "Nulstil modtager?"
#define TR_SHARE "Del"
#define TR_BIND "Tilslut"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Registrer"))
#define TR_MODULE_RANGE BUTTON(TR("Ræk", "Rækkevidde"))
#define TR_RANGE_TEST "Test af rækkevidde"
+2
View File
@@ -1008,6 +1008,8 @@
#define TR_RECEIVER_RESET "Empfänger resetten?"
#define TR_SHARE "Share"
#define TR_BIND "Binden"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Register"))
#define TR_MODULE_RANGE BUTTON(TR("Rng", "Reichweite"))
#define TR_RANGE_TEST "Reichweitentest"
+2
View File
@@ -1015,6 +1015,8 @@
#define TR_RECEIVER_RESET "Reset receiver?"
#define TR_SHARE "Share"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Register"))
#define TR_MODULE_RANGE BUTTON(TR("Rng", "Range"))
#define TR_RANGE_TEST "Range Test"
+2
View File
@@ -1008,6 +1008,8 @@
#define TR_RECEIVER_RESET "Reset receptor?"
#define TR_SHARE "Compartido"
#define TR_BIND "Emparejar"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Registrar"))
#define TR_MODULE_RANGE "[Lim.]"
#define TR_RANGE_TEST "Range test"
+2
View File
@@ -1008,6 +1008,8 @@
#define TR_RECEIVER_RESET "Reset receiver?"
#define TR_SHARE "Share"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Register"))
#define TR_MODULE_RANGE "[Range]"
#define TR_RANGE_TEST "Range test"
+2
View File
@@ -1012,6 +1012,8 @@
#define TR_RECEIVER_RESET "Réinit. récept.?"
#define TR_SHARE "Partager"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Enr", "Enregistr."))
#define TR_MODULE_RANGE BUTTON(TR("Prt", "Port."))
#define TR_RANGE_TEST "Test de portée"
+2
View File
@@ -1017,6 +1017,8 @@
#define TR_RECEIVER_RESET "? איפוס מקלט"
#define TR_SHARE "שיתוף"
#define TR_BIND "צימוד"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Register"))
#define TR_MODULE_RANGE BUTTON(TR("Rng", "בדיקת טווח קליטה"))
#define TR_RANGE_TEST "בדיקת טווח"
+2
View File
@@ -1014,6 +1014,8 @@
#define TR_RECEIVER_RESET "Resetto RX?"
#define TR_SHARE "Condividere"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Registrare"))
#define TR_MODULE_RANGE TR("[Rng]","[Range]")
#define TR_RANGE_TEST "Test del link radio a bassa potenza"
+2
View File
@@ -1013,6 +1013,8 @@
#define TR_RECEIVER_RESET "受信機をリセットしますか?"
#define TR_SHARE "共有"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "登録"))
#define TR_MODULE_RANGE BUTTON(TR("Rng", "受信強度"))
#define TR_RANGE_TEST "受信強度テスト"
+2
View File
@@ -1060,6 +1060,8 @@
#define TR_RECEIVER_RESET "수신기를 초기화할까요?"
#define TR_SHARE "공유"
#define TR_BIND "바인딩"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("등록", "등록"))
#define TR_MODULE_RANGE BUTTON(TR("범위", "범위 테스트"))
#define TR_RANGE_TEST "범위 테스트"
+2
View File
@@ -1010,6 +1010,8 @@
#define TR_RECEIVER_RESET "Reset receiver?"
#define TR_SHARE "Share"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Register"))
#define TR_MODULE_RANGE TR("[Rng]", "[Range]")
#define TR_RANGE_TEST "Range test"
+2
View File
@@ -1007,6 +1007,8 @@
#define TR_RECEIVER_RESET "Reset receiver?"
#define TR_SHARE "Share"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Register"))
#define TR_MODULE_RANGE TR("[Zas]","Zasięg")
#define TR_RANGE_TEST "Test zasięgu"
+2
View File
@@ -1015,6 +1015,8 @@
#define TR_RECEIVER_RESET "Reset receiver?"
#define TR_SHARE "Share"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Register"))
#define TR_MODULE_RANGE BUTTON(TR("Rng", "Range"))
#define TR_RANGE_TEST "Range Test"
+2
View File
@@ -1016,6 +1016,8 @@
#define TR_RECEIVER_RESET "Сбросить приемник?"
#define TR_SHARE "Поделиться"
#define TR_BIND "Bind"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Рег", "Регистр"))
#define TR_MODULE_RANGE BUTTON(TR("Диап", "Диапазон"))
#define TR_RANGE_TEST "Тест диапазона"
+2
View File
@@ -1015,6 +1015,8 @@
#define TR_RECEIVER_RESET "Återställ mottagare?"
#define TR_SHARE "Dela"
#define TR_BIND "Parkopplar"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Reg", "Registrera"))
#define TR_MODULE_RANGE BUTTON(TR("Tst", "Testa"))
#define TR_RANGE_TEST "Test av radiolänkkvalitet (begränsad signalstyrka)"
+2
View File
@@ -1011,6 +1011,8 @@
#define TR_RECEIVER_RESET "是否重啟接收機?"
#define TR_SHARE "分享"
#define TR_BIND "對頻"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("註冊", "註冊"))
#define TR_MODULE_RANGE BUTTON(TR("測距", "測距"))
#define TR_RANGE_TEST "距離測試(低功率)"
+2
View File
@@ -1015,6 +1015,8 @@
#define TR_RECEIVER_RESET "Скинути приймач?"
#define TR_SHARE "Поділитися"
#define TR_BIND "Прив'язати"
#define TR_PAIRING "Pairing"
#define TR_BTAUDIO "BT Audio"
#define TR_REGISTER BUTTON(TR("Регі.", "Регістр"))
#define TR_MODULE_RANGE BUTTON(TR("Діап.", "Діапазон"))
#define TR_RANGE_TEST "Тест діапазону"
+2
View File
@@ -429,6 +429,8 @@
#define STR_BEEPCTR currentLangStrings->STR_BEEPCTR
#define STR_BG_VOLUME currentLangStrings->STR_BG_VOLUME
#define STR_BIND currentLangStrings->STR_BIND
#define STR_PAIRING currentLangStrings->STR_PAIRING
#define STR_BTAUDIO currentLangStrings->STR_BTAUDIO
#define STR_BINDING_CH1_8_TELEM_OFF currentLangStrings->STR_BINDING_CH1_8_TELEM_OFF
#define STR_BINDING_CH1_8_TELEM_ON currentLangStrings->STR_BINDING_CH1_8_TELEM_ON
#define STR_BINDING_CH9_16_TELEM_OFF currentLangStrings->STR_BINDING_CH9_16_TELEM_OFF
+2
View File
@@ -428,6 +428,8 @@ STR(BEEPCOUNTDOWN)
STR(BEEPCTR)
STR(BG_VOLUME)
STR(BIND)
STR(PAIRING)
STR(BTAUDIO)
STR(BINDING_CH1_8_TELEM_OFF)
STR(BINDING_CH1_8_TELEM_ON)
STR(BINDING_CH9_16_TELEM_OFF)