feat: add support for RadioMaster TX16S MK3 (#7017)
Co-authored-by: philmoz <phil.a.mitchell@gmail.com> Co-authored-by: 3djc <3djc@gh.com> Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com>
@@ -128,6 +128,7 @@ body:
|
||||
- RadioMaster TX12 / TX12MK2
|
||||
- RadioMaster TX15
|
||||
- RadioMaster TX16S / TX16SMK2
|
||||
- RadioMaster TX16SMK3
|
||||
- RadioMaster Zorro
|
||||
- Other (Please specify below)
|
||||
validations:
|
||||
|
||||
@@ -33,6 +33,7 @@ jobs:
|
||||
- x9dp2019
|
||||
- tx15
|
||||
- tx16s
|
||||
- tx16smk3
|
||||
- nv14
|
||||
- el18
|
||||
- pl18
|
||||
@@ -95,6 +96,7 @@ jobs:
|
||||
- tx12mk2;boxer;gx12
|
||||
- tx15
|
||||
- tx16s
|
||||
- tx16smk3
|
||||
- f16
|
||||
- v12;v14;v16
|
||||
- x10;x10express
|
||||
|
||||
@@ -26,6 +26,7 @@ jobs:
|
||||
- t20;t20v2;t14
|
||||
- tx12mk2;boxer;gx12
|
||||
- tx16s
|
||||
- tx16smk3
|
||||
- f16
|
||||
- v16
|
||||
- x10;x10express
|
||||
|
||||
@@ -117,6 +117,21 @@ void BoardJson::afterLoadFixups(Board::Type board, InputsTable * inputs, Switche
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_RADIOMASTER_TX16SMK3(board)) {
|
||||
if (getInputIndex(inputs, "LIGHT", Board::LVT_TAG) < 0) {
|
||||
InputDefn defn;
|
||||
defn.type = AIT_FLEX;
|
||||
defn.tag = "LIGHT";
|
||||
defn.name = "Ambient light";
|
||||
defn.shortName = "Light";
|
||||
defn.flexType = FLEX_POT;
|
||||
defn.inverted = false;
|
||||
defn.cfgYaml = Board::LVT_TAG;
|
||||
defn.refYaml = Board::LVT_TAG; // non-default
|
||||
inputs->insert(inputs->end(), defn);
|
||||
}
|
||||
}
|
||||
|
||||
// Flex switches are not listed in json file for these radios
|
||||
int count = IS_RADIOMASTER_TX16S(board) || IS_RADIOMASTER_MT12(board) ? 2 : 0;
|
||||
|
||||
|
||||
@@ -137,6 +137,8 @@ uint32_t Boards::getFourCC(Type board)
|
||||
return 0x3878746F;
|
||||
case BOARD_RADIOMASTER_TX15:
|
||||
return 0x4978746F;
|
||||
case BOARD_RADIOMASTER_TX16SMK3:
|
||||
return 0x4978746F;
|
||||
case BOARD_RADIOMASTER_TX12:
|
||||
return 0x4178746F;
|
||||
case BOARD_RADIOMASTER_TX12_MK2:
|
||||
@@ -214,6 +216,7 @@ int Boards::getEEpromSize(Board::Type board)
|
||||
case BOARD_JUMPER_T16:
|
||||
case BOARD_JUMPER_T18:
|
||||
case BOARD_RADIOMASTER_TX16S:
|
||||
case BOARD_RADIOMASTER_TX16SMK3:
|
||||
case BOARD_RADIOMASTER_TX15:
|
||||
case BOARD_FLYSKY_NV14:
|
||||
case BOARD_FLYSKY_EL18:
|
||||
@@ -276,6 +279,7 @@ int Boards::getFlashSize(Type board)
|
||||
case BOARD_JUMPER_T16:
|
||||
case BOARD_JUMPER_T18:
|
||||
case BOARD_RADIOMASTER_TX16S:
|
||||
case BOARD_RADIOMASTER_TX16SMK3:
|
||||
case BOARD_RADIOMASTER_TX15:
|
||||
case BOARD_FLYSKY_NV14:
|
||||
case BOARD_FLYSKY_EL18:
|
||||
@@ -387,27 +391,25 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
|
||||
return 1;
|
||||
|
||||
case LcdHeight:
|
||||
if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board))
|
||||
if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board) || IS_RADIOMASTER_TX16SMK3(board))
|
||||
return 480;
|
||||
else if (IS_FAMILY_HORUS_OR_T16(board))
|
||||
return 272;
|
||||
else if (IS_FAMILY_PL18(board) || IS_JUMPER_T15(board) || IS_JUMPER_T15PRO(board) || IS_FLYSKY_ST16(board) || IS_RADIOMASTER_TX15(board))
|
||||
return 320;
|
||||
else if (IS_FLYSKY_PA01(board))
|
||||
return 240;
|
||||
else if (IS_FAMILY_HORUS_OR_T16(board))
|
||||
return 272;
|
||||
else
|
||||
return 64;
|
||||
|
||||
case LcdWidth:
|
||||
if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board) || IS_FLYSKY_PA01(board))
|
||||
if (IS_RADIOMASTER_TX16SMK3(board))
|
||||
return 800;
|
||||
else if (IS_FAMILY_HORUS_OR_T16(board) || IS_RADIOMASTER_TX15(board) || IS_FAMILY_PL18(board) || IS_FLYSKY_ST16(board))
|
||||
return 480;
|
||||
else if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board) || IS_FLYSKY_PA01(board))
|
||||
return 320;
|
||||
else if (IS_FAMILY_PL18(board) || IS_FLYSKY_ST16(board))
|
||||
return 480;
|
||||
else if (IS_FAMILY_HORUS_OR_T16(board) || IS_RADIOMASTER_TX15(board))
|
||||
return 480;
|
||||
else if (IS_TARANIS_SMALL(board))
|
||||
return 128;
|
||||
else if (IS_TARANIS(board))
|
||||
else if (IS_TARANIS(board) && !IS_TARANIS_SMALL(board))
|
||||
return 212;
|
||||
else
|
||||
return 128;
|
||||
@@ -427,7 +429,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
|
||||
return IS_RADIOMASTER_MT12(board);
|
||||
|
||||
case FunctionSwitchColors:
|
||||
return IS_RADIOMASTER_GX12(board) || IS_FLYSKY_ST16(board) || IS_FLYSKY_PA01(board) || IS_RADIOMASTER_TX15(board);
|
||||
return IS_RADIOMASTER_GX12(board) || IS_FLYSKY_ST16(board) || IS_FLYSKY_PA01(board) || IS_RADIOMASTER_TX15(board) || IS_RADIOMASTER_TX16SMK3(board);
|
||||
|
||||
default:
|
||||
return getBoardJson(board)->getCapability(capability);
|
||||
@@ -659,6 +661,8 @@ QString Boards::getBoardName(Board::Type board)
|
||||
return "Radiomaster TX12 Mark II";
|
||||
case BOARD_RADIOMASTER_TX16S:
|
||||
return "Radiomaster TX16S";
|
||||
case BOARD_RADIOMASTER_TX16SMK3:
|
||||
return "Radiomaster TX16SMK3";
|
||||
case BOARD_RADIOMASTER_TX15:
|
||||
return "Radiomaster TX15";
|
||||
case BOARD_RADIOMASTER_ZORRO:
|
||||
@@ -799,6 +803,7 @@ int Boards::getDefaultInternalModules(Board::Type board)
|
||||
case BOARD_HELLORADIOSKY_V14:
|
||||
case BOARD_HELLORADIOSKY_V16:
|
||||
case BOARD_RADIOMASTER_TX15:
|
||||
case BOARD_RADIOMASTER_TX16SMK3:
|
||||
case BOARD_IFLIGHT_COMMANDO8:
|
||||
case BOARD_JUMPER_BUMBLEBEE:
|
||||
case BOARD_JUMPER_T12MAX:
|
||||
@@ -866,6 +871,7 @@ void Boards::getBattRange(Board::Type board, int& vmin, int& vmax, unsigned int&
|
||||
case BOARD_X10:
|
||||
case BOARD_X10_EXPRESS:
|
||||
case BOARD_RADIOMASTER_TX16S:
|
||||
case BOARD_RADIOMASTER_TX16SMK3:
|
||||
case BOARD_RADIOMASTER_TX15:
|
||||
case BOARD_JUMPER_T16:
|
||||
case BOARD_JUMPER_T18:
|
||||
|
||||
@@ -65,6 +65,7 @@ namespace Board {
|
||||
BOARD_JUMPER_T15PRO,
|
||||
BOARD_JUMPER_T16,
|
||||
BOARD_RADIOMASTER_TX16S,
|
||||
BOARD_RADIOMASTER_TX16SMK3,
|
||||
BOARD_RADIOMASTER_TX15,
|
||||
BOARD_JUMPER_T18,
|
||||
BOARD_JUMPER_T20,
|
||||
@@ -572,6 +573,11 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board)
|
||||
return board == Board::BOARD_RADIOMASTER_TX16S;
|
||||
}
|
||||
|
||||
inline bool IS_RADIOMASTER_TX16SMK3(Board::Type board)
|
||||
{
|
||||
return board == Board::BOARD_RADIOMASTER_TX16SMK3;
|
||||
}
|
||||
|
||||
inline bool IS_RADIOMASTER_TX15(Board::Type board)
|
||||
{
|
||||
return board == Board::BOARD_RADIOMASTER_TX15;
|
||||
@@ -634,13 +640,14 @@ inline bool IS_HELLORADIOSKY_V16(Board::Type board)
|
||||
|
||||
inline bool IS_FAMILY_T16(Board::Type board)
|
||||
{
|
||||
return board == Board::BOARD_JUMPER_T15 ||
|
||||
return board == Board::BOARD_FATFISH_F16 ||
|
||||
board == Board::BOARD_HELLORADIOSKY_V16 ||
|
||||
board == Board::BOARD_JUMPER_T15 ||
|
||||
board == Board::BOARD_JUMPER_T16 ||
|
||||
board == Board::BOARD_JUMPER_T18 ||
|
||||
board == Board::BOARD_RADIOMASTER_TX15 ||
|
||||
board == Board::BOARD_RADIOMASTER_TX16S ||
|
||||
board == Board::BOARD_FATFISH_F16 ||
|
||||
board == Board::BOARD_HELLORADIOSKY_V16 ||
|
||||
board == Board::BOARD_RADIOMASTER_TX15;
|
||||
board == Board::BOARD_RADIOMASTER_TX16SMK3;
|
||||
}
|
||||
|
||||
inline bool IS_FAMILY_T12(Board::Type board)
|
||||
|
||||
@@ -213,6 +213,8 @@ void GeneralSettings::init()
|
||||
strcpy(bluetoothName, "st16");
|
||||
else if (IS_RADIOMASTER_TX15(board))
|
||||
strcpy(bluetoothName, "tx15");
|
||||
else if (IS_RADIOMASTER_TX16SMK3(board))
|
||||
strcpy(bluetoothName, "tx16smk3");
|
||||
else if (IS_FAMILY_HORUS_OR_T16(board))
|
||||
strcpy(bluetoothName, "horus");
|
||||
else if (IS_TARANIS_X9E(board) || IS_TARANIS_SMALL(board))
|
||||
|
||||
@@ -329,7 +329,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
|
||||
IS_RADIOMASTER_BOXER(board) || IS_RADIOMASTER_GX12(board) || IS_RADIOMASTER_MT12(board) ||
|
||||
IS_RADIOMASTER_POCKET(board) || IS_RADIOMASTER_TX12(board) || IS_RADIOMASTER_TX12_MK2(board) ||
|
||||
IS_RADIOMASTER_TX16S(board) || IS_RADIOMASTER_ZORRO(board) || IS_RADIOMASTER_TX15(board) || IS_JUMPER_T15PRO(board) ||
|
||||
IS_FLYSKY_PA01(board) || IS_FLYSKY_ST16(board));
|
||||
IS_FLYSKY_PA01(board) || IS_FLYSKY_ST16(board) ||
|
||||
IS_RADIOMASTER_TX16SMK3(board));
|
||||
case HasSoftwareSerialPower:
|
||||
return IS_RADIOMASTER_TX16S(board);
|
||||
case HasIntModuleMulti:
|
||||
@@ -852,6 +853,13 @@ void registerOpenTxFirmwares()
|
||||
firmware->addOption("flyskygimbals", Firmware::tr("Support hardware mod: FlySky Paladin EV Gimbals"));
|
||||
registerOpenTxFirmware(firmware);
|
||||
|
||||
/* Radiomaster TX16SMK3 board */
|
||||
firmware = new OpenTxFirmware(FIRMWAREID("tx16smk3"), Firmware::tr("Radiomaster TX16SMK3"), BOARD_RADIOMASTER_TX16SMK3);
|
||||
addOpenTxFrskyOptions(firmware);
|
||||
addOpenTxRfOptions(firmware, FLEX);
|
||||
firmware->addOptionsGroup({opt_bt, opt_internal_gps});
|
||||
registerOpenTxFirmware(firmware);
|
||||
|
||||
/* Radiomaster Zorro board */
|
||||
firmware = new OpenTxFirmware(FIRMWAREID("zorro"), QCoreApplication::translate("Firmware", "Radiomaster Zorro"), Board::BOARD_RADIOMASTER_ZORRO);
|
||||
addOpenTxCommonOptions(firmware);
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
["RadioMaster TX12MK2", "tx12mk2-"],
|
||||
["RadioMaster TX15", "tx15-"],
|
||||
["RadioMaster TX16S", "tx16s-"],
|
||||
["RadioMaster TX16SMK3", "tx16smk3-"],
|
||||
["RadioMaster Zorro","zorro-"]
|
||||
],
|
||||
"changelog": "- Major initial bug fixes"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
include(CMakeForceCompiler)
|
||||
include(Bitmaps)
|
||||
|
||||
set(PCB_TYPES X9LITE X9LITES X7 XLITE XLITES X9D X9D+ X9E X10 X12S PL18 T15PRO ST16 PA01 TX15)
|
||||
set(PCB_TYPES X9LITE X9LITES X7 XLITE XLITES X9D X9D+ X9E X10 X12S PL18 T15PRO ST16 PA01 TX15 TX16SMK3)
|
||||
set(RADIO_LANGUAGES CN CZ DA DE EN ES FI FR HE HU IT JP KO NL PL PT RU SE SK TW UA)
|
||||
set(TTS_LANGUAGES CN CZ DA DE EN ES FI FR HE HU IT JP KO NL PL PT RU SE SK TW UA)
|
||||
|
||||
@@ -99,6 +99,8 @@ elseif(PCB STREQUAL PA01)
|
||||
include(targets/pa01/CMakeLists.txt)
|
||||
elseif(PCB STREQUAL TX15)
|
||||
include(targets/tx15/CMakeLists.txt)
|
||||
elseif(PCB STREQUAL TX16SMK3)
|
||||
include(targets/tx16smk3/CMakeLists.txt)
|
||||
elseif(PCB STREQUAL STM32H7S78_DK)
|
||||
include(targets/stm32h7s78-dk/CMakeLists.txt)
|
||||
elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
|
||||
@@ -424,6 +426,14 @@ if(DISABLE_MCUCHECK)
|
||||
add_definitions(-DDISABLE_MCUCHECK)
|
||||
endif()
|
||||
|
||||
if(SIZE_TARGET_MEM_DEFINE MATCHES 32768)
|
||||
add_definitions(-DSDRAM_32M)
|
||||
elseif(SIZE_TARGET_MEM_DEFINE MATCHES 16384)
|
||||
add_definitions(-DSDRAM_16M)
|
||||
else(SIZE_TARGET_MEM_DEFINE MATCHES 8192)
|
||||
add_definitions(-DSDRAM_8M)
|
||||
endif()
|
||||
|
||||
set(SRC
|
||||
${SRC}
|
||||
edgetx.cpp
|
||||
|
||||
@@ -184,7 +184,7 @@ extern "C" void DMA1_Stream4_IRQHandler(void)
|
||||
if (stm32_dma_check_ht_flag(I2S_DMA, I2S_DMA_Stream)) {
|
||||
audio_update_dma_buffer(0);
|
||||
}
|
||||
|
||||
|
||||
if (stm32_dma_check_tc_flag(I2S_DMA, I2S_DMA_Stream)) {
|
||||
audio_update_dma_buffer(1);
|
||||
}
|
||||
|
||||
@@ -29,6 +29,12 @@
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
typedef void (*lcdSpiInitFucPtr)(void);
|
||||
typedef unsigned int LcdReadIDFucPtr( void );
|
||||
|
||||
extern lcdSpiInitFucPtr lcdOffFunction;
|
||||
extern lcdSpiInitFucPtr lcdOnFunction;
|
||||
|
||||
static const stm32_pulse_timer_t _bl_timer = {
|
||||
.GPIO = (gpio_t)BACKLIGHT_GPIO,
|
||||
.GPIO_Alternate = BACKLIGHT_GPIO_AF,
|
||||
@@ -51,7 +57,7 @@ void backlightLowInit()
|
||||
|
||||
void backlightInit()
|
||||
{
|
||||
stm32_pulse_init(&_bl_timer, 1000000);
|
||||
stm32_pulse_init(&_bl_timer, 100000);
|
||||
stm32_pulse_config_output(&_bl_timer, true, LL_TIM_OCMODE_PWM1, 100);
|
||||
LL_TIM_SetAutoReload(_bl_timer.TIMx, 100);
|
||||
LL_TIM_EnableCounter(_bl_timer.TIMx);
|
||||
|
||||
@@ -202,7 +202,7 @@ static SwitchHwPos _get_switch_pos(uint8_t idx)
|
||||
}
|
||||
else if (!def->Pin_low) {
|
||||
// 2POS switch
|
||||
if ((state & def->Pin_high) == 0) {
|
||||
if ((state & def->Pin_high) != 0) {
|
||||
pos = SWITCH_HW_DOWN;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
/*
|
||||
* 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 "stm32_hal_ll.h"
|
||||
#include "stm32_hal.h"
|
||||
#include "edgetx_types.h"
|
||||
#include "dma2d.h"
|
||||
#include "hal.h"
|
||||
#include "delays_driver.h"
|
||||
#include "debug.h"
|
||||
#include "lcd.h"
|
||||
#include "lcd_driver_800.h"
|
||||
#include "board.h"
|
||||
|
||||
#include "hal/gpio.h"
|
||||
#include "stm32_gpio.h"
|
||||
#include "stm32_qspi.h"
|
||||
|
||||
uint8_t TouchControllerType = 0; // 0: other; 1: CST836U
|
||||
static const uint16_t lcd_phys_w = LCD_PHYS_W;
|
||||
static const uint16_t lcd_phys_h = LCD_PHYS_H;
|
||||
|
||||
static LTDC_HandleTypeDef hltdc;
|
||||
static void* initialFrameBuffer = nullptr;
|
||||
|
||||
static volatile uint8_t _frame_addr_reloaded = 0;
|
||||
|
||||
static void startLcdRefresh(lv_disp_drv_t *disp_drv, uint16_t *buffer,
|
||||
const rect_t ©_area)
|
||||
{
|
||||
(void)disp_drv;
|
||||
(void)copy_area;
|
||||
|
||||
// given the data cache size, this is probably
|
||||
// faster than cleaning by address
|
||||
SCB_CleanDCache();
|
||||
|
||||
LTDC_Layer1->CFBAR = (uint32_t)buffer;
|
||||
// reload shadow registers on vertical blank
|
||||
_frame_addr_reloaded = 0;
|
||||
LTDC->SRCR = LTDC_SRCR_VBR;
|
||||
|
||||
__HAL_LTDC_ENABLE_IT(&hltdc, LTDC_IT_LI);
|
||||
|
||||
// wait for reload
|
||||
// TODO: replace through some smarter mechanism without busy wait
|
||||
while(_frame_addr_reloaded == 0);
|
||||
}
|
||||
|
||||
lcdSpiInitFucPtr lcdInitFunction;
|
||||
lcdSpiInitFucPtr lcdOffFunction;
|
||||
lcdSpiInitFucPtr lcdOnFunction;
|
||||
uint32_t lcdPixelClock;
|
||||
|
||||
volatile uint8_t LCD_ReadBuffer[24] = { 0, 0 };
|
||||
|
||||
static void LCD_AF_GPIOConfig(void)
|
||||
{
|
||||
const gpio_t _lcd_af_gpios[] = {
|
||||
GPIO_PIN(GPIOI, 12), GPIO_PIN(GPIOI, 13), GPIO_PIN(GPIOI, 14),
|
||||
|
||||
GPIO_PIN(GPIOJ, 1), GPIO_PIN(GPIOJ, 2), GPIO_PIN(GPIOJ, 3),
|
||||
GPIO_PIN(GPIOJ, 4), GPIO_PIN(GPIOJ, 5), GPIO_PIN(GPIOJ, 6),
|
||||
GPIO_PIN(GPIOJ, 9), GPIO_PIN(GPIOJ, 10), GPIO_PIN(GPIOJ, 11),
|
||||
GPIO_PIN(GPIOJ, 14), GPIO_PIN(GPIOJ, 15),
|
||||
|
||||
GPIO_PIN(GPIOK, 0), GPIO_PIN(GPIOK, 1), GPIO_PIN(GPIOK, 2),
|
||||
GPIO_PIN(GPIOK, 3), GPIO_PIN(GPIOK, 4), GPIO_PIN(GPIOK, 5),
|
||||
GPIO_PIN(GPIOK, 6), GPIO_PIN(GPIOK, 7),
|
||||
};
|
||||
|
||||
for (unsigned i = 0; i < sizeof(_lcd_af_gpios) / sizeof(_lcd_af_gpios[0]); i++) {
|
||||
gpio_init_af(_lcd_af_gpios[i], GPIO_AF14, GPIO_SPEED_FREQ_LOW);
|
||||
}
|
||||
}
|
||||
|
||||
static void lcdSpiConfig(void)
|
||||
{
|
||||
LL_GPIO_InitTypeDef GPIO_InitStructure;
|
||||
LL_GPIO_StructInit(&GPIO_InitStructure);
|
||||
|
||||
GPIO_InitStructure.Pin = LCD_RESET_GPIO_PIN;
|
||||
GPIO_InitStructure.Speed = LL_GPIO_SPEED_FREQ_LOW;
|
||||
GPIO_InitStructure.Mode = LL_GPIO_MODE_OUTPUT;
|
||||
GPIO_InitStructure.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
GPIO_InitStructure.Pull = LL_GPIO_PULL_NO;
|
||||
LL_GPIO_Init(LCD_RESET_GPIO, &GPIO_InitStructure);
|
||||
}
|
||||
|
||||
void lcdDelay() {
|
||||
delay_01us(1);
|
||||
}
|
||||
|
||||
static void lcdReset() {
|
||||
|
||||
LCD_NRST_HIGH();
|
||||
delay_ms(1);
|
||||
|
||||
LCD_NRST_LOW(); // RESET();
|
||||
delay_ms(10);
|
||||
|
||||
LCD_NRST_HIGH();
|
||||
delay_ms(100);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void LCD_Init_LTDC() {
|
||||
hltdc.Instance = LTDC;
|
||||
|
||||
/* Configure PLLSAI prescalers for LCD */
|
||||
/* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
|
||||
/* PLLSAI_VCO Output = PLLSAI_VCO Input * lcdPixelclock * 16 = XX Mhz */
|
||||
/* PLLLCDCLK = PLLSAI_VCO Output/PLL_LTDC = PLLSAI_VCO/4 = YY Mhz */
|
||||
/* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = YY/4 = lcdPixelClock Mhz */
|
||||
// uint32_t clock = (lcdPixelClock*16) / 1000000; // clock*16 in MHz
|
||||
// RCC_PeriphCLKInitTypeDef clkConfig;
|
||||
// clkConfig.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
|
||||
// clkConfig.PLLI2S
|
||||
// clkConfig.PLLSAI.PLLSAIN = clock;
|
||||
// clkConfig.PLLSAI.PLLSAIR = 4;
|
||||
// clkConfig.PLLSAIDivQ = 6;
|
||||
// clkConfig.PLLSAIDivR = RCC_PLLSAIDIVR_4;
|
||||
// HAL_RCCEx_PeriphCLKConfig(&clkConfig);
|
||||
|
||||
/* LTDC Configuration *********************************************************/
|
||||
/* Polarity configuration */
|
||||
/* Initialize the horizontal synchronization polarity as active low */
|
||||
hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
|
||||
/* Initialize the vertical synchronization polarity as active low */
|
||||
hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
|
||||
/* Initialize the data enable polarity as active low */
|
||||
hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
|
||||
/* Initialize the pixel clock polarity as input pixel clock */
|
||||
hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IIPC;
|
||||
|
||||
/* Configure R,G,B component values for LCD background color */
|
||||
hltdc.Init.Backcolor.Red = 0;
|
||||
hltdc.Init.Backcolor.Green = 0;
|
||||
hltdc.Init.Backcolor.Blue = 0;
|
||||
|
||||
/* Configure horizontal synchronization width */
|
||||
hltdc.Init.HorizontalSync = HSW-1;
|
||||
/* Configure vertical synchronization height */
|
||||
hltdc.Init.VerticalSync = VSH-1;
|
||||
/* Configure accumulated horizontal back porch */
|
||||
hltdc.Init.AccumulatedHBP = HSW+HBP-1;
|
||||
/* Configure accumulated vertical back porch */
|
||||
hltdc.Init.AccumulatedVBP = VSH+VBP-1;
|
||||
/* Configure accumulated active width */
|
||||
hltdc.Init.AccumulatedActiveW = lcd_phys_w + HBP+HSW-1;
|
||||
/* Configure accumulated active height */
|
||||
hltdc.Init.AccumulatedActiveH = lcd_phys_h + VBP+VSH-1;
|
||||
/* Configure total width */
|
||||
hltdc.Init.TotalWidth = lcd_phys_w + HBP + HFP + HSW -1;
|
||||
/* Configure total height */
|
||||
hltdc.Init.TotalHeigh = lcd_phys_h + VBP + VFP+VSH-1;
|
||||
|
||||
HAL_LTDC_Init(&hltdc);
|
||||
|
||||
// Configure IRQ (line)
|
||||
NVIC_SetPriority(LTDC_IRQn, LTDC_IRQ_PRIO);
|
||||
NVIC_EnableIRQ(LTDC_IRQn);
|
||||
|
||||
// Trigger on last line
|
||||
HAL_LTDC_ProgramLineEvent(&hltdc, lcd_phys_h);
|
||||
__HAL_LTDC_ENABLE_IT(&hltdc, LTDC_IT_LI);
|
||||
}
|
||||
|
||||
void LCD_LayerInit() {
|
||||
auto& layer = hltdc.LayerCfg[0];
|
||||
|
||||
/* Windowing configuration */
|
||||
layer.WindowX0 = 0;
|
||||
layer.WindowX1 = lcd_phys_w;
|
||||
layer.WindowY0 = 0;
|
||||
layer.WindowY1 = lcd_phys_h;
|
||||
|
||||
/* Pixel Format configuration*/
|
||||
layer.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
|
||||
|
||||
/* Alpha constant (255 totally opaque) */
|
||||
layer.Alpha = 255;
|
||||
|
||||
/* Default Color configuration (configure A,R,G,B component values) */
|
||||
layer.Backcolor.Blue = 0;
|
||||
layer.Backcolor.Green = 0;
|
||||
layer.Backcolor.Red = 0;
|
||||
layer.Alpha0 = 0;
|
||||
|
||||
/* Configure blending factors */
|
||||
layer.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
|
||||
layer.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
|
||||
|
||||
layer.ImageWidth = lcd_phys_w;
|
||||
layer.ImageHeight = lcd_phys_h;
|
||||
|
||||
/* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */
|
||||
layer.FBStartAdress = (intptr_t)initialFrameBuffer;
|
||||
|
||||
/* Initialize LTDC layer 1 */
|
||||
HAL_LTDC_ConfigLayer(&hltdc, &hltdc.LayerCfg[0], 0);
|
||||
|
||||
/* dithering activation */
|
||||
HAL_LTDC_EnableDither(&hltdc);
|
||||
}
|
||||
|
||||
extern "C"
|
||||
void lcdSetInitalFrameBuffer(void* fbAddress)
|
||||
{
|
||||
initialFrameBuffer = fbAddress;
|
||||
}
|
||||
|
||||
const char* boardLcdType = "";
|
||||
|
||||
extern "C"
|
||||
void lcdInit(void)
|
||||
{
|
||||
#if defined(LCD_SPI_CONFLICTS_WITH_QSPI)
|
||||
stm32_qspi_nor_deinit();
|
||||
#endif
|
||||
|
||||
/* Configure the LCD SPI+RESET pins */
|
||||
lcdSpiConfig();
|
||||
|
||||
/* Reset the LCD --------------------------------------------------------*/
|
||||
lcdReset();
|
||||
|
||||
/* Configure the LCD Control pins */
|
||||
LCD_AF_GPIOConfig();
|
||||
|
||||
/* Send LCD initialization commands */
|
||||
TRACE("LCD INIT (default): ST7365");
|
||||
boardLcdType = "ST7365 (Default)";
|
||||
|
||||
__HAL_RCC_LTDC_CLK_ENABLE();
|
||||
|
||||
LCD_Init_LTDC();
|
||||
LCD_LayerInit();
|
||||
|
||||
// Enable LCD display
|
||||
__HAL_LTDC_ENABLE(&hltdc);
|
||||
|
||||
lcdSetFlushCb(startLcdRefresh);
|
||||
|
||||
#if defined(LCD_SPI_CONFLICTS_WITH_QSPI)
|
||||
stm32_qspi_nor_init();
|
||||
stm32_qspi_nor_memory_mapped();
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void LTDC_IRQHandler(void)
|
||||
{
|
||||
__HAL_LTDC_CLEAR_FLAG(&hltdc, LTDC_FLAG_LI);
|
||||
__HAL_LTDC_DISABLE_IT(&hltdc, LTDC_IT_LI);
|
||||
_frame_addr_reloaded = 1;
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "bsp_io.h"
|
||||
|
||||
#define HBP ( 16 )
|
||||
#define VBP ( 8 )
|
||||
|
||||
#define HSW ( 4 )
|
||||
#define VSH ( 4 )
|
||||
|
||||
#define HFP ( 16 )
|
||||
#define VFP ( 8 )
|
||||
|
||||
typedef void (*lcdSpiInitFucPtr)(void);
|
||||
typedef unsigned int LcdReadIDFucPtr( void );
|
||||
|
||||
extern lcdSpiInitFucPtr lcdInitFunction;
|
||||
extern lcdSpiInitFucPtr lcdOffFunction;
|
||||
extern lcdSpiInitFucPtr lcdOnFunction;
|
||||
|
||||
#define SET_IO_INPUT( PORT, PIN ) LL_GPIO_SetPinMode( PORT, PIN, LL_GPIO_MODE_INPUT )
|
||||
#define SET_IO_OUTPUT( PORT, PIN ) LL_GPIO_SetPinMode( PORT, PIN, LL_GPIO_MODE_OUTPUT )
|
||||
|
||||
#define LCD_NRST_HIGH() LL_GPIO_SetOutputPin(LCD_RESET_GPIO, LCD_RESET_GPIO_PIN)
|
||||
#define LCD_NRST_LOW() LL_GPIO_ResetOutputPin(LCD_RESET_GPIO, LCD_RESET_GPIO_PIN)
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* 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 "edgetx.h"
|
||||
#include "luminosity_sensor.h"
|
||||
#include "hal/adc_driver.h"
|
||||
|
||||
static uint32_t luxEMA = 0;
|
||||
static bool luxInitialized = false;
|
||||
|
||||
bool getPeriodicLuxSensorValue()
|
||||
{
|
||||
if (adcGetMaxInputs(ADC_INPUT_LUX) < 1) return false;
|
||||
|
||||
uint16_t newValue = anaIn(adcGetInputOffset(ADC_INPUT_LUX));
|
||||
|
||||
if (!luxInitialized) {
|
||||
// Initialize EMA with first reading
|
||||
luxEMA = (uint32_t)newValue << 8; // Scale up for precision
|
||||
luxInitialized = true;
|
||||
} else {
|
||||
// EMA formula with alpha = 26/256 ≈ 0.102
|
||||
int32_t diff = ((int32_t)newValue << 8) - (int32_t)luxEMA;
|
||||
luxEMA = luxEMA + ((diff * 26) >> 8);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint16_t getLuxSensorValue()
|
||||
{
|
||||
return luxEMA >> 8; // Scale back down
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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 <stdint.h>
|
||||
#include "edgetx_types.h"
|
||||
|
||||
#pragma once
|
||||
|
||||
bool getPeriodicLuxSensorValue();
|
||||
uint16_t getLuxSensorValue();
|
||||
@@ -96,6 +96,9 @@ extern "C" void SDRAM_GPIOConfig(void)
|
||||
/* GPIOG configuration */
|
||||
gpio_init_af(GPIO_PIN(GPIOG, 0), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH);
|
||||
gpio_init_af(GPIO_PIN(GPIOG, 1), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH);
|
||||
#if defined(SDRAM_32M)
|
||||
gpio_init_af(GPIO_PIN(GPIOG, 2), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH);
|
||||
#endif
|
||||
gpio_init_af(GPIO_PIN(GPIOG, 4), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH);
|
||||
gpio_init_af(GPIO_PIN(GPIOG, 5), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH);
|
||||
gpio_init_af(GPIO_PIN(GPIOG, 8), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH);
|
||||
@@ -194,8 +197,13 @@ extern "C" void SDRAM_Init(void)
|
||||
|
||||
/* FMC SDRAM control configuration */
|
||||
FMC_SDRAMInitStructure.SDBank = FMC_SDRAM_BANK2;
|
||||
#if defined(SDRAM_32M)
|
||||
FMC_SDRAMInitStructure.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
|
||||
FMC_SDRAMInitStructure.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
|
||||
#else
|
||||
FMC_SDRAMInitStructure.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
|
||||
FMC_SDRAMInitStructure.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
|
||||
#endif
|
||||
FMC_SDRAMInitStructure.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
|
||||
FMC_SDRAMInitStructure.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
|
||||
FMC_SDRAMInitStructure.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
|
||||
|
||||
@@ -94,7 +94,11 @@ BOOTSTRAP void SystemClock_Config(void)
|
||||
LL_RCC_PLL3_SetN(4);
|
||||
LL_RCC_PLL3_SetP(2);
|
||||
LL_RCC_PLL3_SetQ(2);
|
||||
#if defined(RADIO_TX16SMK3)
|
||||
LL_RCC_PLL3_SetR(8); // 24 MHz
|
||||
#else
|
||||
LL_RCC_PLL3_SetR(18);
|
||||
#endif
|
||||
LL_RCC_PLL3_Enable();
|
||||
while (LL_RCC_PLL3_IsReady() != 1) {
|
||||
}
|
||||
@@ -105,7 +109,7 @@ BOOTSTRAP void SystemClock_Config(void)
|
||||
LL_AHB2_GRP1_PERIPH_D2SRAM3);
|
||||
|
||||
/* Set periph clock sources */
|
||||
LL_RCC_SetSPIClockSource(LL_RCC_SPI123_CLKSOURCE_PLL1Q);
|
||||
LL_RCC_SetSPIClockSource(LL_RCC_SPI123_CLKSOURCE_PLL1Q);
|
||||
LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLL1Q);
|
||||
LL_RCC_SetADCClockSource(LL_RCC_ADC_CLKSOURCE_CLKP);
|
||||
}
|
||||
|
||||
@@ -520,6 +520,10 @@ enum MixSources {
|
||||
MIXSRC_MIN,
|
||||
MIXSRC_MAX,
|
||||
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
MIXSRC_LIGHT,
|
||||
#endif
|
||||
|
||||
MIXSRC_FIRST_HELI SKIP,
|
||||
MIXSRC_LAST_HELI SKIP = MIXSRC_FIRST_HELI + 2,
|
||||
|
||||
@@ -588,8 +592,9 @@ enum SrcTypes {
|
||||
SRC_TX = 1 << 16,
|
||||
SRC_TIMER = 1 << 17,
|
||||
SRC_TELEM = 1 << 18,
|
||||
SRC_NONE = 1 << 19,
|
||||
SRC_INVERT = 1 << 20,
|
||||
SRC_LIGHT = 1 << 19,
|
||||
SRC_NONE = 1 << 30,
|
||||
SRC_INVERT = 1 << 31,
|
||||
};
|
||||
|
||||
enum BacklightMode {
|
||||
|
||||
@@ -78,7 +78,7 @@ static inline void check_struct()
|
||||
|
||||
#if defined(PCBXLITES)
|
||||
CHKSIZE(RadioData, 950);
|
||||
#elif defined(RADIO_ST16) || defined(PCBPA01) || defined(RADIO_TX15) || defined(RADIO_T15PRO)
|
||||
#elif defined(RADIO_ST16) || defined(PCBPA01) || defined(RADIO_TX15) || defined(RADIO_T15PRO) || defined(RADIO_TX16SMK3)
|
||||
CHKSIZE(RadioData, 1181);
|
||||
#elif defined(COLORLCD)
|
||||
CHKSIZE(RadioData, 1061);
|
||||
@@ -112,6 +112,8 @@ static inline void check_struct()
|
||||
CHKSIZE(ModelData, 7582);
|
||||
#elif defined(RADIO_T15)
|
||||
CHKSIZE(ModelData, 6867);
|
||||
#elif defined(RADIO_TX16SMK3)
|
||||
CHKSIZE(ModelData, 7642);
|
||||
#elif defined(RADIO_H7RS)
|
||||
// CHKSIZE()
|
||||
#elif defined(PCBHORUS)
|
||||
|
||||
@@ -78,6 +78,10 @@
|
||||
#include "lua/custom_allocator.h"
|
||||
#endif
|
||||
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
#include "luminosity_sensor.h"
|
||||
#endif
|
||||
|
||||
RadioData g_eeGeneral;
|
||||
ModelData g_model;
|
||||
|
||||
@@ -238,6 +242,10 @@ void per10ms()
|
||||
if (mixWarning & 4) if(((g_tmr10ms&0xFF)==128) || ((g_tmr10ms&0xFF)==136) || ((g_tmr10ms&0xFF)==144)) AUDIO_MIX_WARNING(3);
|
||||
#endif
|
||||
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
getPeriodicLuxSensorValue();
|
||||
#endif
|
||||
|
||||
outputTelemetryBuffer.per10ms();
|
||||
|
||||
heartbeat |= HEART_TIMER_10MS;
|
||||
@@ -2016,6 +2024,12 @@ void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFla
|
||||
if (flags)
|
||||
*flags |= PREC1;
|
||||
}
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
else if (asrc == MIXSRC_LIGHT) {
|
||||
valMax = 100;
|
||||
valMin = -valMax;
|
||||
}
|
||||
#endif
|
||||
else if (asrc == MIXSRC_TX_TIME) {
|
||||
valMax = 23 * 60 + 59;
|
||||
valMin = 0;
|
||||
|
||||
@@ -109,6 +109,10 @@ PLAY_FUNCTION(playValue, mixsrc_t idx)
|
||||
PLAY_DURATION(val * 60, PLAY_TIME);
|
||||
} else if (idx == MIXSRC_TX_VOLTAGE) {
|
||||
PLAY_NUMBER(val, UNIT_VOLTS, PREC1);
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
} else if (idx == MIXSRC_LIGHT) {
|
||||
PLAY_NUMBER(val, UNIT_RAW, 0);
|
||||
#endif
|
||||
} else {
|
||||
if (idx <= MIXSRC_LAST_CH) {
|
||||
val = calcRESXto100(val);
|
||||
|
||||
@@ -42,13 +42,7 @@ class SourceChoiceMenuToolbar : public MenuToolbar
|
||||
addButton(CHAR_LUA, MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, nullptr,
|
||||
STR_MENU_LUA);
|
||||
#endif
|
||||
#if defined(PCBHORUS)
|
||||
auto lastSource = MIXSRC_LAST_SPACEMOUSE;
|
||||
#elif defined(IMU)
|
||||
auto lastSource = MIXSRC_TILT_Y;
|
||||
#else
|
||||
auto lastSource = MIXSRC_LAST_STICK;
|
||||
#endif
|
||||
auto lastSource = MIXSRC_MIN - 1;
|
||||
addButton(
|
||||
CHAR_STICK, MIXSRC_FIRST_STICK, lastSource,
|
||||
[=](int16_t index) {
|
||||
@@ -62,6 +56,9 @@ class SourceChoiceMenuToolbar : public MenuToolbar
|
||||
addButton(
|
||||
CHAR_FUNCTION, MIXSRC_MIN, MIXSRC_LAST_TIMER,
|
||||
[=](int16_t index) {
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
if (index == MIXSRC_LIGHT) return true;
|
||||
#endif
|
||||
return (index >= MIXSRC_MIN && index <= MIXSRC_MAX) ||
|
||||
(index >= MIXSRC_TX_VOLTAGE && index <= MIXSRC_LAST_TIMER);
|
||||
},
|
||||
|
||||
@@ -251,18 +251,22 @@ InputMixGroupBase::InputMixGroupBase(Window* parent, mixsrc_t idx) :
|
||||
etx_font(label, FONT_XS_INDEX, LV_STATE_USER_1);
|
||||
}
|
||||
|
||||
void InputMixGroupBase::adjustHeight()
|
||||
void InputMixGroupBase::_adjustHeight(coord_t y)
|
||||
{
|
||||
if (getLineCount() == 0) setHeight(ListLineButton::BTN_H + PAD_SMALL * 2);
|
||||
|
||||
coord_t y = PAD_OUTLINE;
|
||||
for (auto it = lines.cbegin(); it != lines.cend(); ++it) {
|
||||
auto line = *it;
|
||||
line->updateHeight();
|
||||
line->updatePos(InputMixButtonBase::LN_X, y);
|
||||
y += line->height() + PAD_OUTLINE;
|
||||
}
|
||||
setHeight(y + PAD_BORDER * 2);
|
||||
setHeight(y + PAD_BORDER * 2 + PAD_OUTLINE);
|
||||
}
|
||||
|
||||
void InputMixGroupBase::adjustHeight()
|
||||
{
|
||||
_adjustHeight(0);
|
||||
}
|
||||
|
||||
void InputMixGroupBase::addLine(InputMixButtonBase* line)
|
||||
|
||||
@@ -37,7 +37,7 @@ class ListLineButton : public ButtonBase
|
||||
|
||||
virtual void refresh() = 0;
|
||||
|
||||
static constexpr coord_t BTN_H = EdgeTxStyles::STD_FONT_HEIGHT + PAD_BORDER * 2 + PAD_TINY * 2;
|
||||
static constexpr coord_t BTN_H = EdgeTxStyles::STD_FONT_HEIGHT + PAD_BORDER * 2 + PAD_OUTLINE * 2;
|
||||
static constexpr coord_t GRP_W = LCD_W - PAD_SMALL * 2;
|
||||
|
||||
protected:
|
||||
@@ -72,7 +72,7 @@ class InputMixButtonBase : public ListLineButton
|
||||
#else
|
||||
static LAYOUT_VAL_SCALED(LN_X, 73)
|
||||
#endif
|
||||
static constexpr coord_t BTN_W = ListLineButton::GRP_W - LN_X - PAD_BORDER * 2 - PAD_OUTLINE;
|
||||
static constexpr coord_t BTN_W = ListLineButton::GRP_W - LN_X - PAD_BORDER * 2 - PAD_OUTLINE * 2;
|
||||
static constexpr coord_t WGT_X = PAD_TINY;
|
||||
static constexpr coord_t WGT_Y = PAD_TINY;
|
||||
static LAYOUT_VAL_SCALED(WGT_W, 50)
|
||||
@@ -122,6 +122,8 @@ class InputMixGroupBase : public Window
|
||||
mixsrc_t idx;
|
||||
lv_obj_t* label;
|
||||
std::list<InputMixButtonBase*> lines;
|
||||
|
||||
void _adjustHeight(coord_t y);
|
||||
};
|
||||
|
||||
class InputMixPageBase : public PageGroupItem
|
||||
|
||||
@@ -57,10 +57,17 @@
|
||||
#endif
|
||||
#if LV_MEM_CUSTOM == 0
|
||||
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
|
||||
#if defined(SIMU)
|
||||
#define LV_MEM_SIZE (4 * 1024U * 1024U) /*[bytes]*/
|
||||
#if defined(SDRAM_32M)
|
||||
#define LV_MEM 8
|
||||
#elif defined(SDRAM_16M)
|
||||
#define LV_MEM 4
|
||||
#else
|
||||
#define LV_MEM_SIZE (2 * 1024U * 1024U) /*[bytes]*/
|
||||
#define LV_MEM 2
|
||||
#endif
|
||||
#if defined(SIMU)
|
||||
#define LV_MEM_SIZE (LV_MEM * 2 * 1024U * 1024U) /*[bytes]*/
|
||||
#else
|
||||
#define LV_MEM_SIZE (LV_MEM * 1024U * 1024U) /*[bytes]*/
|
||||
#endif
|
||||
|
||||
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
|
||||
|
||||
@@ -124,7 +124,11 @@ class CurveDataEdit : public Window
|
||||
}
|
||||
|
||||
static LAYOUT_VAL_SCALED(ROW_HEIGHT, 82)
|
||||
#if WIDE_LAYOUT
|
||||
static LAYOUT_VAL_SCALED(NUM_BTN_WIDTH, 50)
|
||||
#else
|
||||
static LAYOUT_VAL_SCALED(NUM_BTN_WIDTH, 47)
|
||||
#endif
|
||||
static LAYOUT_VAL_SCALED(NUM_HDR_HEIGHT, 15)
|
||||
static LAYOUT_VAL_SCALED(PTNUM_X, 15)
|
||||
static LAYOUT_VAL_SCALED(PTNUM_H, 13)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
#define ETX_STATE_LS_ACTIVE LV_STATE_USER_1
|
||||
#define ETX_STATE_V1_SMALL_FONT LV_STATE_USER_1
|
||||
#define ETX_STATE_V1_SMALL_FONT LV_STATE_USER_2
|
||||
|
||||
static const lv_coord_t col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(3),
|
||||
LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
@@ -214,14 +214,7 @@ class MixGroup : public InputMixGroupBase
|
||||
|
||||
void adjustHeight() override
|
||||
{
|
||||
coord_t y = monitorVisible ? CHNUM_Y : PAD_OUTLINE;
|
||||
for (auto it = lines.cbegin(); it != lines.cend(); ++it) {
|
||||
auto line = *it;
|
||||
line->updateHeight();
|
||||
line->updatePos(InputMixButtonBase::LN_X, y);
|
||||
y += line->height() + PAD_OUTLINE;
|
||||
}
|
||||
setHeight(y + PAD_BORDER * 2);
|
||||
_adjustHeight(monitorVisible ? CHNUM_Y : 0);
|
||||
}
|
||||
|
||||
static LAYOUT_VAL_SCALED(CHNUM_Y, 17)
|
||||
|
||||
@@ -450,6 +450,11 @@ void drawSourceCustomValue(coord_t x, coord_t y, mixsrc_t source, int32_t value,
|
||||
else if (source == MIXSRC_TX_VOLTAGE) {
|
||||
lcdDrawNumber(x, y, value, flags|PREC1);
|
||||
}
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
else if (source == MIXSRC_LIGHT) {
|
||||
lcdDrawNumber(x, y, value, flags);
|
||||
}
|
||||
#endif
|
||||
#if defined(INTERNAL_GPS)
|
||||
else if (source == MIXSRC_TX_GPS) {
|
||||
if (gpsData.fix) {
|
||||
|
||||
@@ -262,6 +262,9 @@ static struct sourceAvailableCheck sourceChecks[] = {
|
||||
#if defined(IMU)
|
||||
{ MIXSRC_TILT_X, MIXSRC_TILT_Y, SRC_TILT, sourceIsAvailable },
|
||||
#endif
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
{ MIXSRC_LIGHT, MIXSRC_LIGHT, SRC_LIGHT, sourceIsAvailable },
|
||||
#endif
|
||||
#if defined(PCBHORUS)
|
||||
{ MIXSRC_FIRST_SPACEMOUSE, MIXSRC_LAST_SPACEMOUSE, SRC_SPACEMOUSE, isSourceSpacemouseAvailable },
|
||||
#endif
|
||||
@@ -298,7 +301,7 @@ bool checkSourceAvailable(int source, uint32_t sourceTypes)
|
||||
}
|
||||
|
||||
#define SRC_COMMON \
|
||||
SRC_STICK | SRC_POT | SRC_TILT | SRC_SPACEMOUSE | SRC_MINMAX | SRC_TRIM | \
|
||||
SRC_STICK | SRC_POT | SRC_TILT | SRC_LIGHT | SRC_SPACEMOUSE | SRC_MINMAX | SRC_TRIM | \
|
||||
SRC_SWITCH | SRC_FUNC_SWITCH | SRC_LOGICAL_SWITCH | SRC_TRAINER | SRC_GVAR
|
||||
|
||||
bool isSourceAvailable(int source)
|
||||
@@ -310,7 +313,7 @@ bool isSourceAvailable(int source)
|
||||
|
||||
bool isSourceAvailableForBacklightOrVolume(int source)
|
||||
{
|
||||
return checkSourceAvailable(source, SRC_SWITCH | SRC_POT | SRC_NONE);
|
||||
return checkSourceAvailable(source, SRC_SWITCH | SRC_POT | SRC_LIGHT | SRC_NONE);
|
||||
}
|
||||
|
||||
bool isLogicalSwitchAvailable(int index)
|
||||
|
||||
@@ -42,6 +42,7 @@ enum {
|
||||
ADC_INPUT_FLEX,
|
||||
ADC_INPUT_VBAT,
|
||||
ADC_INPUT_RTC_BAT,
|
||||
ADC_INPUT_LUX,
|
||||
ADC_INPUT_ALL,
|
||||
};
|
||||
|
||||
|
||||
@@ -495,7 +495,7 @@ LROT_BEGIN(lvgllib, NULL, 0)
|
||||
LROT_NUMENTRY(SRC_ALL, 0xFFFFFFFF)
|
||||
LROT_NUMENTRY(SRC_INPUT, SRC_INPUT)
|
||||
LROT_NUMENTRY(SRC_LUA, SRC_LUA)
|
||||
LROT_NUMENTRY(SRC_STICK, SRC_STICK|SRC_TILT|SRC_SPACEMOUSE)
|
||||
LROT_NUMENTRY(SRC_STICK, SRC_STICK|SRC_TILT|SRC_LIGHT|SRC_SPACEMOUSE)
|
||||
LROT_NUMENTRY(SRC_POT, SRC_POT)
|
||||
LROT_NUMENTRY(SRC_OTHER, SRC_MINMAX|SRC_TX|SRC_TIMER)
|
||||
LROT_NUMENTRY(SRC_HELI, SRC_HELI)
|
||||
|
||||
@@ -372,6 +372,10 @@ const LuaSingleField luaSingleFields[] = {
|
||||
{MIXSRC_TILT_Y, "tilty", "Tilt Y"},
|
||||
#endif
|
||||
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
{MIXSRC_LIGHT, "light", "Light Sensor"},
|
||||
#endif
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
{MIXSRC_SPACEMOUSE_A, "sma", "SpaceMouse A"},
|
||||
{MIXSRC_SPACEMOUSE_B, "smb", "SpaceMouse B"},
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
#include "hal/switch_driver.h"
|
||||
#include "hal/audio_driver.h"
|
||||
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
#include "luminosity_sensor.h"
|
||||
#endif
|
||||
|
||||
#define DELAY_POS_MARGIN 3
|
||||
|
||||
uint8_t s_mixer_first_run_done = false;
|
||||
@@ -403,6 +407,12 @@ getvalue_t _getValue(mixsrc_t i, bool* valid)
|
||||
return RESX;
|
||||
}
|
||||
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
else if (i == MIXSRC_LIGHT) {
|
||||
return getLuxSensorValue() - RESX;
|
||||
}
|
||||
#endif
|
||||
|
||||
else if (i <= MIXSRC_LAST_HELI) {
|
||||
#if defined(HELI)
|
||||
return cyc_anas[i - MIXSRC_FIRST_HELI];
|
||||
|
||||
@@ -40,6 +40,8 @@ elseif(PCB STREQUAL PA01)
|
||||
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_pa01.cpp)
|
||||
elseif(PCB STREQUAL TX15)
|
||||
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tx15.cpp)
|
||||
elseif(PCB STREQUAL TX16SMK3)
|
||||
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tx16smk3.cpp)
|
||||
elseif(PCB STREQUAL X7)
|
||||
if(PCBREV STREQUAL TPRO)
|
||||
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tpro.cpp)
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
#include "yaml_datastructs_tx15.cpp"
|
||||
#elif defined(PCBT15)
|
||||
#include "yaml_datastructs_t15pro.cpp"
|
||||
#elif defined(PCBTX16SMK3)
|
||||
#include "yaml_datastructs_tx16smk3.cpp"
|
||||
#elif defined(PCBPL18)
|
||||
#if defined(RADIO_NB4P)
|
||||
#include "yaml_datastructs_nb4p.cpp"
|
||||
|
||||
@@ -734,7 +734,13 @@ char *getSourceString(char (&destRef)[L], mixsrc_t idx, bool defaultOnly)
|
||||
strncpy(dest, STR_MENU_MIN, dest_len - 1);
|
||||
} else if (idx == MIXSRC_MAX) {
|
||||
strncpy(dest, STR_MENU_MAX, dest_len - 1);
|
||||
} else if (idx <= MIXSRC_LAST_HELI) {
|
||||
}
|
||||
#if defined(LUMINOSITY_SENSOR)
|
||||
else if (idx == MIXSRC_LIGHT) {
|
||||
strncpy(dest, STR_SRC_LIGHT, dest_len - 1);
|
||||
}
|
||||
#endif
|
||||
else if (idx <= MIXSRC_LAST_HELI) {
|
||||
idx -= MIXSRC_FIRST_HELI;
|
||||
getStringAtIndex(dest, STR_CYC_VSRCRAW, idx);
|
||||
} else if (idx <= MIXSRC_LAST_TRIM) {
|
||||
|
||||
@@ -29,8 +29,8 @@ set(TARGET_LINKER_DIR stm32f429_sdram)
|
||||
set(TARGET_EXTRAM_START 0xC0000000)
|
||||
|
||||
if(PCBREV STREQUAL PL18U)
|
||||
set(TARGET_SDRAM_SIZE 32768K)
|
||||
set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM1=32768")
|
||||
set(TARGET_EXTRAM_SIZE 32M)
|
||||
else()
|
||||
set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM1=8192")
|
||||
endif()
|
||||
|
||||
@@ -32,6 +32,8 @@ void enableVBatBridge(){}
|
||||
void disableVBatBridge(){}
|
||||
bool isVBatBridgeEnabled(){ return false; }
|
||||
|
||||
uint16_t getLuxSensorValue() { return 1024; }
|
||||
|
||||
uint16_t getBatteryVoltage()
|
||||
{
|
||||
if (adcGetMaxInputs(ADC_INPUT_VBAT) < 1) return 0;
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
bool boardBacklightOn = false;
|
||||
bool isBacklightEnabled() { return boardBacklightOn; }
|
||||
|
||||
bool getPeriodicLuxSensorValue() { return true; }
|
||||
|
||||
void backlightInit() {}
|
||||
|
||||
#if !defined(COLORLCD)
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" ON)
|
||||
option(PXX1 "PXX1 protocol support" ON)
|
||||
option(PXX2 "PXX2 protocol support" OFF)
|
||||
option(AFHDS3 "AFHDS3 TX Module" ON)
|
||||
option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON)
|
||||
option(GHOST "Ghost TX Module" ON)
|
||||
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(INTERNAL_GPS "Support for internal GPS" ON)
|
||||
|
||||
set(FIRMWARE_QSPI YES)
|
||||
set(FIRMWARE_FORMAT_UF2 YES)
|
||||
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
|
||||
set(CPU_TYPE STM32H7)
|
||||
set(HSE_VALUE 48000000)
|
||||
set(SDCARD YES)
|
||||
set(STORAGE_MODELSLIST YES)
|
||||
set(HAPTIC YES)
|
||||
set(GUI_DIR colorlcd)
|
||||
set(BITMAPS_DIR 800x480)
|
||||
set(TARGET_DIR tx16smk3)
|
||||
set(RTC_BACKUP_RAM YES)
|
||||
set(PPM_LIMITS_SYMETRICAL YES)
|
||||
set(USB_SERIAL ON CACHE BOOL "Enable USB serial (CDC)")
|
||||
set(HARDWARE_EXTERNAL_MODULE YES)
|
||||
set(INTERNAL_MODULE_AFHDS3 NO)
|
||||
set(ROTARY_ENCODER YES)
|
||||
set(FUNCTION_SWITCHES_WITH_RGB YES)
|
||||
set(FLEXSW "2" CACHE STRING "Max flex inputs usable as switches")
|
||||
set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS")
|
||||
|
||||
#option(STICKS_DEAD_ZONE "Enable sticks dead zone" YES)
|
||||
|
||||
# IMU support
|
||||
set(IMU ON)
|
||||
add_definitions(-DIMU_ICM4207C)
|
||||
|
||||
# for size report script
|
||||
set(CPU_TYPE_FULL STM32H750xB)
|
||||
set(TARGET_LINKER_DIR stm32h750_sdram)
|
||||
set(TARGET_EXTRAM_START 0xD0000000)
|
||||
set(TARGET_EXTRAM_SIZE 32M)
|
||||
set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM1=32768")
|
||||
set(FIRMWARE_STRIP_BOOTLOADER YES)
|
||||
|
||||
add_definitions(-DPCBTX16SMK3 -DPCBHORUS)
|
||||
add_definitions(-DBATTERY_CHARGE)
|
||||
add_definitions(-DSTM32_SUPPORT_32BIT_TIMERS)
|
||||
add_definitions(-DFIRMWARE_QSPI)
|
||||
add_definitions(-DFIRMWARE_FORMAT_UF2)
|
||||
add_definitions(-DUSE_CUSTOM_EXTI_IRQ)
|
||||
add_definitions(-DUSB_CHARGER)
|
||||
add_definitions(-DLUMINOSITY_SENSOR)
|
||||
|
||||
set(FLAVOUR tx16smk3)
|
||||
add_definitions(-DRADIO_TX16SMK3)
|
||||
add_definitions(-DMANUFACTURER_RADIOMASTER)
|
||||
|
||||
# defines existing internal modules
|
||||
set(INTERNAL_MODULES CRSF CACHE STRING "Internal modules")
|
||||
set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module")
|
||||
|
||||
set(BITMAPS_TARGET bm800_bitmaps)
|
||||
set(FONTS_TARGET x12_fonts)
|
||||
set(LCD_DRIVER lcd_driver.cpp)
|
||||
set(HARDWARE_TOUCH YES)
|
||||
set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${BITMAPS_TARGET})
|
||||
set(FIRMWARE_DEPENDENCIES datacopy)
|
||||
set(SOFTWARE_KEYBOARD ON)
|
||||
set(FUNCTION_SWITCHES ON)
|
||||
set(USB_CHARGER YES)
|
||||
set(AUX_SERIAL YES)
|
||||
set(AUX2_SERIAL YES)
|
||||
|
||||
add_definitions(
|
||||
-DSTM32H750XBTx -DSTM32H750xx
|
||||
-DSDRAM -DCCMRAM
|
||||
-DCOLORLCD -DLIBOPENUI
|
||||
-DHARDWARE_TOUCH -DHARDWARE_KEYS -DSOFTWARE_KEYBOARD
|
||||
-DWS2812_MAX_LEDS=26
|
||||
)
|
||||
|
||||
set(SDRAM ON)
|
||||
|
||||
add_definitions(-DAUDIO -DVOICE -DRTCLOCK)
|
||||
add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE})
|
||||
add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
|
||||
|
||||
if(STICKS_DEAD_ZONE)
|
||||
add_definitions(-DSTICK_DEAD_ZONE)
|
||||
endif()
|
||||
|
||||
if(NOT UNEXPECTED_SHUTDOWN)
|
||||
add_definitions(-DNO_UNEXPECTED_SHUTDOWN)
|
||||
endif()
|
||||
|
||||
if(DISK_CACHE)
|
||||
set(SRC ${SRC} disk_cache.cpp)
|
||||
add_definitions(-DDISK_CACHE)
|
||||
endif()
|
||||
|
||||
if(FUNCTION_SWITCHES_WITH_RGB)
|
||||
set(FUNCTION_SWITCHES YES)
|
||||
add_definitions(-DFUNCTION_SWITCHES)
|
||||
add_definitions(-DFUNCTION_SWITCHES_RGB_LEDS)
|
||||
endif()
|
||||
|
||||
if(FUNCTION_SWITCHES)
|
||||
add_definitions(-DFUNCTION_SWITCHES)
|
||||
endif()
|
||||
|
||||
if(INTERNAL_GPS)
|
||||
message("-- Internal GPS enabled")
|
||||
add_definitions(-DINTERNAL_GPS)
|
||||
add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE})
|
||||
set(SRC ${SRC} gps.cpp gps_nmea.cpp gps_ubx.cpp)
|
||||
endif()
|
||||
|
||||
set(AFHDS3 ON)
|
||||
|
||||
# VCP CLI
|
||||
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
|
||||
set(CLI ON CACHE BOOL "Enable CLI")
|
||||
|
||||
set(BOARD rm-h750)
|
||||
|
||||
include_directories(boards/${BOARD})
|
||||
|
||||
set(TARGET_SRC_DIR targets/${TARGET_DIR})
|
||||
set(BOARD_SRC_DIR boards/${BOARD})
|
||||
|
||||
set(BOARD_COMMON_SRC
|
||||
${BOARD_SRC_DIR}/board.cpp
|
||||
${BOARD_SRC_DIR}/bsp_io.cpp
|
||||
${TARGET_SRC_DIR}/key_driver.cpp
|
||||
${BOARD_SRC_DIR}/lcd_driver_800.cpp
|
||||
${BOARD_SRC_DIR}/backlight_driver.cpp
|
||||
${BOARD_SRC_DIR}/haptic_driver.cpp
|
||||
${BOARD_SRC_DIR}/extflash_driver.cpp
|
||||
${BOARD_SRC_DIR}/usb_charger_driver.cpp
|
||||
targets/common/arm/stm32/abnormal_reboot.cpp
|
||||
targets/common/arm/stm32/delays_driver.cpp
|
||||
targets/common/arm/stm32/dma2d.cpp
|
||||
targets/common/arm/stm32/flash_driver.cpp
|
||||
targets/common/arm/stm32/pwr_driver.cpp
|
||||
targets/common/arm/stm32/rotary_encoder_driver.cpp
|
||||
targets/common/arm/stm32/rtc_driver.cpp
|
||||
targets/common/arm/stm32/watchdog_driver.cpp
|
||||
drivers/pca95xx.cpp
|
||||
)
|
||||
|
||||
# Bootloader board library
|
||||
add_library(board_bl OBJECT EXCLUDE_FROM_ALL
|
||||
${BOARD_COMMON_SRC}
|
||||
${BOARD_SRC_DIR}/sdram_driver.cpp
|
||||
${RADIO_SRC_DIR}/gui/colorlcd/boot_menu.cpp
|
||||
targets/common/arm/stm32/stm32_qspi.cpp
|
||||
targets/common/arm/stm32/stm32_pulse_driver.cpp
|
||||
)
|
||||
add_dependencies(board_bl minimal_board_lib)
|
||||
set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $<TARGET_OBJECTS:board_bl>)
|
||||
|
||||
set(CMSIS_SRC ${BOARD_SRC_DIR}/system_clock.c)
|
||||
|
||||
# Firmware board library
|
||||
add_library(board OBJECT EXCLUDE_FROM_ALL
|
||||
${BOARD_COMMON_SRC}
|
||||
${BOARD_SRC_DIR}/tp_gt911.cpp
|
||||
${BOARD_SRC_DIR}/audio_driver.cpp
|
||||
${BOARD_SRC_DIR}/luminosity_sensor.cpp
|
||||
drivers/icm42607C.cpp
|
||||
drivers/imu_filter.cpp
|
||||
drivers/tas2505.cpp
|
||||
targets/common/arm/stm32/heartbeat_driver.cpp
|
||||
targets/common/arm/stm32/mixer_scheduler_driver.cpp
|
||||
targets/common/arm/stm32/module_timer_driver.cpp
|
||||
targets/common/arm/stm32/stm32_pulse_driver.cpp
|
||||
targets/common/arm/stm32/stm32_softserial_driver.cpp
|
||||
targets/common/arm/stm32/stm32_qspi.cpp
|
||||
targets/common/arm/stm32/stm32_i2s.cpp
|
||||
targets/common/arm/stm32/stm32_switch_driver.cpp
|
||||
targets/common/arm/stm32/stm32_ws2812.cpp
|
||||
targets/common/arm/stm32/trainer_driver.cpp
|
||||
)
|
||||
add_dependencies(board board_lib)
|
||||
set(FIRMWARE_SRC ${FIRMWARE_SRC} $<TARGET_OBJECTS:board>)
|
||||
|
||||
include_directories(${RADIO_SRC_DIR}/fonts/colorlcd gui/${GUI_DIR} gui/${GUI_DIR}/layouts)
|
||||
|
||||
if(BOOTLOADER)
|
||||
set(FIRMWARE_TARGET_SRC
|
||||
${FIRMWARE_TARGET_SRC}
|
||||
../../bootloader/loadboot.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
set(SRC
|
||||
${SRC}
|
||||
io/frsky_firmware_update.cpp
|
||||
io/multi_firmware_update.cpp
|
||||
)
|
||||
|
||||
if (MULTIMODULE)
|
||||
add_definitions(-DMULTI_PROTOLIST)
|
||||
set(SRC ${SRC}
|
||||
io/multi_protolist.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
# Make malloc() thread-safe
|
||||
add_definitions(-DTHREADSAFE_MALLOC)
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "drivers/pca95xx.h"
|
||||
#include "hal/switch_driver.h"
|
||||
|
||||
#define IO_EXPANDER_I2C_BUS I2C_Bus_1
|
||||
#define IO_EXPANDER1_I2C_ADDR 0x74
|
||||
#define IO_EXPANDER2_I2C_ADDR 0x75
|
||||
|
||||
// Port expander 2 (0x74)
|
||||
#define BSP_TR6U PCA95XX_PIN_7
|
||||
#define BSP_TR6D PCA95XX_PIN_6
|
||||
#define BSP_TR4R PCA95XX_PIN_8
|
||||
#define BSP_TR4L PCA95XX_PIN_9
|
||||
#define BSP_TR2D PCA95XX_PIN_10
|
||||
#define BSP_TR2U PCA95XX_PIN_11
|
||||
#define BSP_TR1D PCA95XX_PIN_12
|
||||
#define BSP_TR1U PCA95XX_PIN_13
|
||||
#define BSP_TR3R PCA95XX_PIN_14
|
||||
#define BSP_TR3L PCA95XX_PIN_15
|
||||
|
||||
extern uint8_t isSwitch3Pos(uint8_t idx);
|
||||
|
||||
int bsp_io_init();
|
||||
uint32_t bsp_io_read_switches();
|
||||
uint32_t bsp_io_read_fs_switches();
|
||||
uint32_t bsp_get_fs_switches();
|
||||
|
||||
uint16_t bsp_input_get();
|
||||
struct stm32_switch_t;
|
||||
|
||||
//TODO compute from json
|
||||
constexpr uint32_t IO_EXPANDER1_MASK = 0xFFFF;
|
||||
constexpr uint32_t IO_EXPANDER2_MASK = 0xFFFF;
|
||||
@@ -0,0 +1,624 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
STM32H750
|
||||
|
||||
SDMMC uses own DMA controler
|
||||
|
||||
DMA1
|
||||
Stream0: LED_STRIP_TIMER_DMA_STREAM
|
||||
Stream1: INTMODULE_DMA_STREAM
|
||||
Stream2: FLYSKY_HALL_DMA_Stream_RX
|
||||
Stream3: TELEMETRY_DMA_Stream_RX
|
||||
Stream4: I2S_DMA_Stream
|
||||
Stream5: INTMODULE_RX_DMA_STREAM
|
||||
Stream6: AUX2_SERIAL_DMA_RX_STREAM
|
||||
Stream7: TELEMETRY_DMA_Stream_TX
|
||||
|
||||
DMA2
|
||||
Stream0: ADC_EXT_DMA_STREAM (do not move)
|
||||
Stream1: AUX_SERIAL_DMA_TX_STREAM
|
||||
Stream2: AUX_SERIAL_DMA_RX_STREAM
|
||||
Stream3: EXTMODULE_TIMER_DMA_STREAM
|
||||
Stream4: ADC_DMA_STREAM (do not move)
|
||||
Stream5: EXTMODULE_USART_RX_DMA_STREAM
|
||||
Stream6: EXTMODULE_USART_TX_DMA_STREAM
|
||||
Stream7: AUX2_SERIAL_DMA_TX_STREAM
|
||||
|
||||
TIM1: BACKLIGHT_TIMER
|
||||
TIM2: LED_STRIP_TIMER
|
||||
TIM3: HAPTIC_GPIO_TIMER
|
||||
TIM4:
|
||||
TIM5: EXTMODULE_TIMER
|
||||
TIM7:
|
||||
TIM8: TRAINER_TIMER
|
||||
TIM12: MIXER_SCHEDULER_TIMER
|
||||
TIM14: MS_TIMER
|
||||
TIM15: PDM
|
||||
TIM16:
|
||||
TIM17: ROTARY_ENCODER_TIMER
|
||||
|
||||
USART1: TELEMETRY_USART
|
||||
USART2: EXTMODULE_USART
|
||||
USART3: AUX2_SERIAL_USART
|
||||
USART4:
|
||||
USART5: AUX_SERIAL_USART
|
||||
USART6: INTMODULE_USART
|
||||
*/
|
||||
|
||||
#ifndef _HAL_H_
|
||||
#define _HAL_H_
|
||||
|
||||
#define CPU_FREQ 480000000
|
||||
|
||||
#define PERI1_FREQUENCY 120000000
|
||||
#define PERI2_FREQUENCY 120000000
|
||||
#define TIMER_MULT_APB1 2
|
||||
#define TIMER_MULT_APB2 2
|
||||
|
||||
// Keys
|
||||
#define KEYS_GPIO_REG_PAGEDN GPIOA
|
||||
#define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_8 // PA.08
|
||||
#define KEYS_GPIO_REG_PAGEUP GPIOG
|
||||
#define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_7 // PG.07
|
||||
#define KEYS_GPIO_REG_SYS GPIOB
|
||||
#define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_2 // PB.02
|
||||
#define KEYS_GPIO_REG_ENTER GPIOG
|
||||
#define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_12 // PG.12
|
||||
#define KEYS_GPIO_REG_MDL GPIOE
|
||||
#define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_3 // PE.03
|
||||
#define KEYS_GPIO_REG_EXIT GPIOG
|
||||
#define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_3 // PG.03
|
||||
#define KEYS_GPIO_REG_TELE GPIOI
|
||||
#define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_15 // PI.15
|
||||
|
||||
// Trims
|
||||
#define TRIMS_GPIO_REG_LHL
|
||||
#define TRIMS_GPIO_PIN_LHL
|
||||
|
||||
#define TRIMS_GPIO_REG_LHR
|
||||
#define TRIMS_GPIO_PIN_LHR
|
||||
|
||||
#define TRIMS_GPIO_REG_LVD
|
||||
#define TRIMS_GPIO_PIN_LVD
|
||||
|
||||
#define TRIMS_GPIO_REG_LVU
|
||||
#define TRIMS_GPIO_PIN_LVU
|
||||
|
||||
#define TRIMS_GPIO_REG_RHL
|
||||
#define TRIMS_GPIO_PIN_RHL
|
||||
|
||||
#define TRIMS_GPIO_REG_RHR
|
||||
#define TRIMS_GPIO_PIN_RHR
|
||||
|
||||
#define TRIMS_GPIO_REG_RVD
|
||||
#define TRIMS_GPIO_PIN_RVD
|
||||
|
||||
#define TRIMS_GPIO_REG_RVU
|
||||
#define TRIMS_GPIO_PIN_RVU
|
||||
|
||||
#define TRIMS_GPIO_REG_RSD
|
||||
#define TRIMS_GPIO_PIN_RSD
|
||||
|
||||
#define TRIMS_GPIO_REG_RSU
|
||||
#define TRIMS_GPIO_PIN_RSU
|
||||
|
||||
#define TRIMS_GPIO_REG_LSD GPIOH
|
||||
#define TRIMS_GPIO_PIN_LSD LL_GPIO_PIN_15
|
||||
|
||||
#define TRIMS_GPIO_REG_LSU GPIOH
|
||||
#define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_13
|
||||
|
||||
// Extender Switches
|
||||
#define SWITCHES_A_3POS
|
||||
#define SWITCHES_GPIO_REG_A_H
|
||||
#define SWITCHES_GPIO_PIN_A_H PCA95XX_P15
|
||||
#define SWITCHES_GPIO_REG_A_L
|
||||
#define SWITCHES_GPIO_PIN_A_L PCA95XX_P14
|
||||
|
||||
#define SWITCHES_B_3POS
|
||||
#define SWITCHES_GPIO_REG_B_H
|
||||
#define SWITCHES_GPIO_PIN_B_H PCA95XX_P13
|
||||
#define SWITCHES_GPIO_REG_B_L
|
||||
#define SWITCHES_GPIO_PIN_B_L PCA95XX_P12
|
||||
|
||||
#define SWITCHES_C_3POS
|
||||
#define SWITCHES_GPIO_REG_C_H
|
||||
#define SWITCHES_GPIO_PIN_C_H PCA95XX_P11
|
||||
#define SWITCHES_GPIO_REG_C_L
|
||||
#define SWITCHES_GPIO_PIN_C_L PCA95XX_P10
|
||||
|
||||
#define SWITCHES_D_3POS
|
||||
#define SWITCHES_GPIO_REG_D_H
|
||||
#define SWITCHES_GPIO_PIN_D_H PCA95XX_P7
|
||||
#define SWITCHES_GPIO_REG_D_L
|
||||
#define SWITCHES_GPIO_PIN_D_L PCA95XX_P6
|
||||
|
||||
#define SWITCHES_E_3POS
|
||||
#define SWITCHES_GPIO_REG_E_H
|
||||
#define SWITCHES_GPIO_PIN_E_H PCA95XX_P16
|
||||
#define SWITCHES_GPIO_REG_E_L
|
||||
#define SWITCHES_GPIO_PIN_E_L PCA95XX_P17
|
||||
|
||||
#define SWITCHES_F_2POS
|
||||
#define SWITCHES_GPIO_REG_F
|
||||
#define SWITCHES_GPIO_PIN_F PCA95XX_P1
|
||||
|
||||
#define SWITCHES_G_3POS
|
||||
#define SWITCHES_GPIO_REG_G_H
|
||||
#define SWITCHES_GPIO_PIN_G_H PCA95XX_P4
|
||||
#define SWITCHES_GPIO_REG_G_L
|
||||
#define SWITCHES_GPIO_PIN_G_L PCA95XX_P5
|
||||
|
||||
#define SWITCHES_H_2POS
|
||||
#define SWITCHES_GPIO_REG_H
|
||||
#define SWITCHES_GPIO_PIN_H PCA95XX_P0
|
||||
|
||||
#define SWITCHES_I_2POS
|
||||
#define SWITCHES_GPIO_REG_I
|
||||
#define SWITCHES_GPIO_PIN_I PCA95XX_P2
|
||||
|
||||
#define SWITCHES_J_2POS
|
||||
#define SWITCHES_GPIO_REG_J
|
||||
#define SWITCHES_GPIO_PIN_J PCA95XX_P3
|
||||
|
||||
// function switches
|
||||
//SW1
|
||||
#define SWITCHES_GPIO_REG_K
|
||||
#define SWITCHES_GPIO_PIN_K PCA95XX_P0
|
||||
#define SWITCHES_K_CFS_IDX 0
|
||||
#define FUNCTION_SWITCH_1 SK
|
||||
//SW2
|
||||
#define SWITCHES_GPIO_REG_L
|
||||
#define SWITCHES_GPIO_PIN_L PCA95XX_P1
|
||||
#define SWITCHES_L_CFS_IDX 1
|
||||
#define FUNCTION_SWITCH_2 SL
|
||||
//SW3
|
||||
#define SWITCHES_GPIO_REG_M
|
||||
#define SWITCHES_GPIO_PIN_M PCA95XX_P2
|
||||
#define SWITCHES_M_CFS_IDX 2
|
||||
#define FUNCTION_SWITCH_3 SM
|
||||
//SW4
|
||||
#define SWITCHES_GPIO_REG_N
|
||||
#define SWITCHES_GPIO_PIN_N PCA95XX_P3
|
||||
#define SWITCHES_N_CFS_IDX 3
|
||||
#define FUNCTION_SWITCH_4 SN
|
||||
//SW5
|
||||
#define SWITCHES_GPIO_REG_O
|
||||
#define SWITCHES_GPIO_PIN_O PCA95XX_P4
|
||||
#define SWITCHES_O_CFS_IDX 4
|
||||
#define FUNCTION_SWITCH_5 SO
|
||||
//SW6
|
||||
#define SWITCHES_GPIO_REG_P
|
||||
#define SWITCHES_GPIO_PIN_P PCA95XX_P5
|
||||
#define SWITCHES_P_CFS_IDX 5
|
||||
#define FUNCTION_SWITCH_6 SP
|
||||
|
||||
// Expanders
|
||||
#define IO_INT_GPIO GPIO_PIN(GPIOD, 3)
|
||||
#define IO_RESET_GPIO GPIO_PIN(GPIOG, 10)
|
||||
#if !defined(USE_EXTI3_IRQ)
|
||||
#define USE_EXTI3_IRQ
|
||||
#define EXTI3_IRQ_Priority 9
|
||||
#endif
|
||||
|
||||
// ADC
|
||||
#define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_6 // PA.06
|
||||
#define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_3 // PC.03
|
||||
#define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_4 // PC.04
|
||||
#define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_5 // PC.05
|
||||
|
||||
#define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_1 // PC.01 POT1
|
||||
#define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_1 // PB.01 POT2
|
||||
#define ADC_GPIO_PIN_BATT LL_GPIO_PIN_3 // PH.03
|
||||
|
||||
#define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_2 // PH.02 VRC/LS
|
||||
#define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_7 // PA.07 VRD/RS
|
||||
|
||||
#define ADC_GPIO_PIN_LUX LL_GPIO_PIN_0 // PB.00 Light Sensor
|
||||
|
||||
#define ADC_GPIO_PIN_EXT1 LL_GPIO_PIN_5 // PA.05,ADC1_CH19
|
||||
#define ADC_GPIO_PIN_EXT2 LL_GPIO_PIN_5 // PH.05,ADC3_CH16
|
||||
|
||||
#define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_SLIDER2|ADC_GPIO_PIN_EXT1)
|
||||
#define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_LUX)
|
||||
#define ADC_GPIOC_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_POT1)
|
||||
#define ADC_GPIOH_PINS (ADC_GPIO_PIN_BATT | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_EXT2)
|
||||
|
||||
|
||||
#define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_3 // ADC12_INP3
|
||||
#define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_13 // ADC12_INP13
|
||||
#define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_4 // ADC12_INP4
|
||||
#define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_8 // ADC12_INP8
|
||||
|
||||
// Each ADC cannot map more than 8 channels, otherwise it will cause problems
|
||||
#define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_11 // ADC12_INP11
|
||||
#define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_5 // ADC12_INP5
|
||||
#define ADC_CHANNEL_BATT LL_ADC_CHANNEL_14 // ADC3_INP14
|
||||
#define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC3_INP17
|
||||
#define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_13 // ADC3_INP13
|
||||
#define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_7 // ADC12_INP7
|
||||
|
||||
#define ADC_CHANNEL_LUX LL_ADC_CHANNEL_9 // ADC12_INP9 -> Light Sensor
|
||||
|
||||
#define ADC_CHANNEL_EXT1 LL_ADC_CHANNEL_19 // ADC1_IN19
|
||||
#define ADC_CHANNEL_EXT2 LL_ADC_CHANNEL_16 // ADC3_IN16
|
||||
|
||||
#define ADC_MAIN ADC1
|
||||
#define ADC_DMA DMA2
|
||||
#define ADC_DMA_CHANNEL LL_DMAMUX1_REQ_ADC1
|
||||
#define ADC_DMA_STREAM LL_DMA_STREAM_4
|
||||
#define ADC_DMA_STREAM_IRQ DMA2_Stream4_IRQn
|
||||
#define ADC_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler
|
||||
#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_8CYCLES_5
|
||||
|
||||
#define ADC_EXT ADC3
|
||||
#define ADC_EXT_CHANNELS { ADC_CHANNEL_SLIDER1, ADC_CHANNEL_BATT, ADC_CHANNEL_RTC_BAT, ADC_CHANNEL_EXT2 }
|
||||
#define ADC_EXT_DMA DMA2
|
||||
#define ADC_EXT_DMA_CHANNEL LL_DMAMUX1_REQ_ADC3
|
||||
#define ADC_EXT_DMA_STREAM LL_DMA_STREAM_0
|
||||
#define ADC_EXT_DMA_STREAM_IRQ DMA2_Stream0_IRQn
|
||||
#define ADC_EXT_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler
|
||||
#define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_8CYCLES_5
|
||||
|
||||
#define ADC_VREF_PREC2 330
|
||||
|
||||
#define ADC_DIRECTION { \
|
||||
0,-1,0,-1, /* gimbals */ \
|
||||
-1,-1, /* pots */ \
|
||||
0,-1, /* sliders */ \
|
||||
0,0, /* ext */ \
|
||||
0, /* vbat */ \
|
||||
0, /* rtc_bat */ \
|
||||
0 /* lux sensor */ \
|
||||
}
|
||||
|
||||
// Serial gimbal sync port
|
||||
#define HALL_SYNC GPIO_PIN(GPIOH, 11)
|
||||
|
||||
#define USE_EXTI9_5_IRQ // used for I2C port extender interrupt
|
||||
#define EXTI9_5_IRQ_Priority 5
|
||||
|
||||
// Power
|
||||
#define PWR_SWITCH_GPIO GPIO_PIN(GPIOA, 4)
|
||||
#define PWR_ON_GPIO GPIO_PIN(GPIOH, 12)
|
||||
|
||||
// Chargers (USB and wireless)
|
||||
#define UCHARGER_GPIO GPIO_PIN(GPIOD, 11)
|
||||
#define UCHARGER_EN_GPIO GPIO_PIN(GPIOB, 12)
|
||||
|
||||
// TODO! Check IOLL1 to PI.01 connectivity!
|
||||
|
||||
// S.Port update connector
|
||||
#define HAS_SPORT_UPDATE_CONNECTOR() (false)
|
||||
|
||||
// Telemetry
|
||||
#define TELEMETRY_SET_INPUT 0
|
||||
#define TELEMETRY_TX_GPIO GPIO_PIN(GPIOA, 9)
|
||||
#define TELEMETRY_RX_GPIO GPIO_UNDEF
|
||||
#define TELEMETRY_USART USART1
|
||||
#define TELEMETRY_USART_IRQn USART1_IRQn
|
||||
#define TELEMETRY_DMA DMA1
|
||||
#define TELEMETRY_DMA_Stream_TX LL_DMA_STREAM_7
|
||||
#define TELEMETRY_DMA_Channel_TX LL_DMAMUX1_REQ_USART1_TX
|
||||
#define TELEMETRY_DMA_TX_Stream_IRQ DMA1_Stream7_IRQn
|
||||
#define TELEMETRY_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler
|
||||
#define TELEMETRY_DMA_Stream_RX LL_DMA_STREAM_3
|
||||
#define TELEMETRY_DMA_Channel_RX LL_DMAMUX1_REQ_USART1_RX
|
||||
#define TELEMETRY_USART_IRQHandler USART1_IRQHandler
|
||||
|
||||
// Software IRQ (Prio 5 -> FreeRTOS compatible)
|
||||
#define TELEMETRY_USE_CUSTOM_EXTI
|
||||
#define CUSTOM_EXTI_IRQ_NAME ETH_WKUP_IRQ
|
||||
#define ETH_WKUP_IRQ_Priority 5
|
||||
#define CUSTOM_EXTI_IRQ_LINE 86
|
||||
#define TELEMETRY_RX_FRAME_EXTI_LINE CUSTOM_EXTI_IRQ_LINE
|
||||
|
||||
// USB
|
||||
#define USB_GPIO GPIOA
|
||||
#define USB_GPIO_VBUS GPIO_PIN(GPIOH, 11)
|
||||
#define USB_GPIO_DM GPIO_PIN(GPIOA, 11)
|
||||
#define USB_GPIO_DP GPIO_PIN(GPIOA, 12)
|
||||
#define USB_GPIO_AF GPIO_AF10
|
||||
|
||||
// LCD
|
||||
|
||||
#define LTDC_IRQ_PRIO 4
|
||||
#define DMA_SCREEN_IRQ_PRIO 6
|
||||
|
||||
#define LCD_RESET_GPIO GPIOJ
|
||||
#define LCD_RESET_GPIO_PIN LL_GPIO_PIN_12
|
||||
|
||||
// Backlight
|
||||
#define BACKLIGHT_GPIO GPIO_PIN(GPIOA, 10) // TIM1_CH3
|
||||
#define BACKLIGHT_TIMER TIM1
|
||||
#define BACKLIGHT_TIMER_CHANNEL LL_TIM_CHANNEL_CH3
|
||||
#define BACKLIGHT_GPIO_AF GPIO_AF1
|
||||
#define BACKLIGHT_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
|
||||
|
||||
// QSPI Flash
|
||||
#define QSPI_CLK_GPIO GPIO_PIN(GPIOF, 10)
|
||||
#define QSPI_CLK_GPIO_AF GPIO_AF9
|
||||
#define QSPI_CS_GPIO GPIO_PIN(GPIOG, 6)
|
||||
#define QSPI_CS_GPIO_AF GPIO_AF10
|
||||
#define QSPI_MISO_GPIO GPIO_PIN(GPIOF, 9)
|
||||
#define QSPI_MISO_GPIO_AF GPIO_AF10
|
||||
#define QSPI_MOSI_GPIO GPIO_PIN(GPIOF, 8)
|
||||
#define QSPI_MOSI_GPIO_AF GPIO_AF10
|
||||
#define QSPI_WP_GPIO GPIO_PIN(GPIOF, 7)
|
||||
#define QSPI_WP_GPIO_AF GPIO_AF9
|
||||
#define QSPI_HOLD_GPIO GPIO_PIN(GPIOF, 6)
|
||||
#define QSPI_HOLD_GPIO_AF GPIO_AF9
|
||||
#define QSPI_FLASH_SIZE 0x1000000
|
||||
|
||||
|
||||
// SD
|
||||
#define SD_SDIO SDMMC1
|
||||
#define SD_SDIO_CLK_DIV(fq) (HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC) / (2 * fq))
|
||||
#define SD_SDIO_TRANSFER_CLK_DIV SD_SDIO_CLK_DIV(24000000) // Hz
|
||||
|
||||
#define SD2_PRESENT_GPIO GPIO_PIN(GPIOH, 8) // PH.08
|
||||
#define SD2_SDIO SDMMC2
|
||||
#define SD2_SDIO_PIN_D0 GPIO_PIN(GPIOB, 14)
|
||||
#define SD2_SDIO_AF_D0 GPIO_AF9
|
||||
#define SD2_SDIO_PIN_D1 GPIO_PIN(GPIOB, 15)
|
||||
#define SD2_SDIO_AF_D1 GPIO_AF9
|
||||
#define SD2_SDIO_PIN_D2 GPIO_PIN(GPIOG, 11)
|
||||
#define SD2_SDIO_AF_D2 GPIO_AF10
|
||||
#define SD2_SDIO_PIN_D3 GPIO_PIN(GPIOB, 4)
|
||||
#define SD2_SDIO_AF_D3 GPIO_AF9
|
||||
#define SD2_SDIO_PIN_CLK GPIO_PIN(GPIOD, 6)
|
||||
#define SD2_SDIO_AF_CLK GPIO_AF11
|
||||
#define SD2_SDIO_PIN_CMD GPIO_PIN(GPIOD, 7)
|
||||
#define SD2_SDIO_AF_CMD GPIO_AF11
|
||||
#define SD2_SDIO_TRANSFER_CLK_DIV SD_SDIO_CLK_DIV(24000000) // Hz
|
||||
|
||||
#define STORAGE_USE_SDIO
|
||||
|
||||
|
||||
// AUDIO
|
||||
#define AUDIO_I2C I2C_Bus_2
|
||||
#define AUDIO_SPI SPI2
|
||||
#define AUDIO_RESET_PIN GPIO_PIN(GPIOH, 10)
|
||||
#define AUDIO_HP_DETECT_PIN GPIO_PIN(GPIOH, 14)
|
||||
#define I2S_DMA DMA1
|
||||
#define I2S_DMA_Stream LL_DMA_STREAM_4
|
||||
#define I2S_DMA_Stream_Request LL_DMAMUX1_REQ_SPI2_TX
|
||||
#define I2S_DMA_Stream_IRQn DMA1_Stream4_IRQn
|
||||
#define I2S_DMA_Stream_IRQHandler DMA1_Stream4_IRQHandler
|
||||
|
||||
// I2C Bus
|
||||
#define I2C_B1 I2C4
|
||||
#define I2C_B1_SDA_GPIO GPIO_PIN(GPIOD, 13) // PD.13
|
||||
#define I2C_B1_SCL_GPIO GPIO_PIN(GPIOD, 12) // PD.12
|
||||
#define I2C_B1_GPIO_AF LL_GPIO_AF_4
|
||||
#define I2C_B1_CLK_RATE 400000
|
||||
|
||||
#define I2C_B2 I2C1
|
||||
#define I2C_B2_SDA_GPIO GPIO_PIN(GPIOB, 9) // PB.09
|
||||
#define I2C_B2_SCL_GPIO GPIO_PIN(GPIOB, 8) // PB.08
|
||||
#define I2C_B2_GPIO_AF LL_GPIO_AF_4
|
||||
#define I2C_B2_CLK_RATE 400000
|
||||
|
||||
// Haptic: TIM3_CH2
|
||||
#define HAPTIC_PWM
|
||||
#define HAPTIC_GPIO GPIO_PIN(GPIOC, 7)
|
||||
#define HAPTIC_GPIO_TIMER TIM3
|
||||
#define HAPTIC_GPIO_AF GPIO_AF2
|
||||
#define HAPTIC_TIMER_OUTPUT_ENABLE TIM_CCER_CC2E | TIM_CCER_CC2NE;
|
||||
#define HAPTIC_TIMER_MODE TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2PE
|
||||
#define HAPTIC_TIMER_COMPARE_VALUE HAPTIC_GPIO_TIMER->CCR2
|
||||
|
||||
// LED Strip
|
||||
#define LED_STRIP_LENGTH 26 // 6POS + 2 rings of 10
|
||||
#define BLING_LED_STRIP_START 6
|
||||
#define BLING_LED_STRIP_LENGTH 20
|
||||
#define CFS_LED_STRIP_START 0
|
||||
#define CFS_LED_STRIP_LENGTH 6
|
||||
#define CFS_LEDS_PER_SWITCH 1
|
||||
#define LED_STRIP_GPIO GPIO_PIN(GPIOA, 0) // PA.00 / TIM2_CH1
|
||||
#define LED_STRIP_GPIO_AF LL_GPIO_AF_1 // TIM1/2/16/17
|
||||
#define LED_STRIP_TIMER TIM2
|
||||
#define LED_STRIP_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
|
||||
#define LED_STRIP_TIMER_CHANNEL LL_TIM_CHANNEL_CH1
|
||||
#define LED_STRIP_TIMER_DMA DMA1
|
||||
#define LED_STRIP_TIMER_DMA_CHANNEL LL_DMAMUX1_REQ_TIM2_UP
|
||||
#define LED_STRIP_TIMER_DMA_STREAM LL_DMA_STREAM_0
|
||||
#define LED_STRIP_TIMER_DMA_IRQn DMA1_Stream0_IRQn
|
||||
#define LED_STRIP_TIMER_DMA_IRQHandler DMA1_Stream0_IRQHandler
|
||||
#define LED_STRIP_REFRESH_PERIOD 50 //ms
|
||||
|
||||
#define STATUS_LEDS
|
||||
#define GPIO_LED_GPIO_ON gpio_set
|
||||
#define GPIO_LED_GPIO_OFF gpio_clear
|
||||
#define LED_RED_GPIO GPIO_PIN(GPIOI, 8) // PI.08
|
||||
#define LED_GREEN_GPIO GPIO_PIN(GPIOI, 11) // PI.11
|
||||
#define LED_BLUE_GPIO GPIO_PIN(GPIOI, 10) // PI.10
|
||||
|
||||
// Internal Module
|
||||
#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOB, 13) // PB.13
|
||||
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOH, 9) // PH.09
|
||||
#define INTMODULE_BOOTCMD_DEFAULT 0
|
||||
#define INTMODULE_TX_GPIO GPIO_PIN(GPIOG, 14)
|
||||
#define INTMODULE_RX_GPIO GPIO_PIN(GPIOG, 9)
|
||||
#define INTMODULE_USART USART6
|
||||
#define INTMODULE_GPIO_AF LL_GPIO_AF_7
|
||||
#define INTMODULE_USART_IRQn USART6_IRQn
|
||||
#define INTMODULE_USART_IRQHandler USART6_IRQHandler
|
||||
#define INTMODULE_DMA DMA1
|
||||
#define INTMODULE_DMA_STREAM LL_DMA_STREAM_1
|
||||
#define INTMODULE_DMA_STREAM_IRQ DMA1_Stream1_IRQn
|
||||
#define INTMODULE_DMA_FLAG_TC DMA_FLAG_TCIF1
|
||||
#define INTMODULE_DMA_CHANNEL LL_DMAMUX1_REQ_USART6_TX
|
||||
#define INTMODULE_RX_DMA DMA1
|
||||
#define INTMODULE_RX_DMA_STREAM LL_DMA_STREAM_5
|
||||
#define INTMODULE_RX_DMA_CHANNEL LL_DMAMUX1_REQ_USART6_RX
|
||||
#define INTMODULE_RX_DMA_Stream_IRQn DMA1_Stream5_IRQn
|
||||
#define INTMODULE_RX_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler
|
||||
|
||||
// External Module
|
||||
#define EXTMODULE
|
||||
#define EXTMODULE_PULSES
|
||||
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 4) // PD.04
|
||||
#define EXTMODULE_TX_GPIO GPIO_PIN(GPIOA, 2) // TIM2_CH3, TIM5_CH3,TIM15_CH1,
|
||||
#define EXTMODULE_RX_GPIO GPIO_PIN(GPIOA, 3)
|
||||
#define EXTMODULE_TX_GPIO_AF LL_GPIO_AF_3 // TIM5_CH3
|
||||
#define EXTMODULE_TIMER TIM5
|
||||
#define EXTMODULE_TIMER_32BITS
|
||||
#define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH3
|
||||
#define EXTMODULE_TIMER_IRQn TIM5_IRQn
|
||||
#define EXTMODULE_TIMER_IRQHandler TIM5_IRQHandler
|
||||
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
|
||||
#define EXTMODULE_TIMER_TX_GPIO_AF LL_GPIO_AF_2
|
||||
|
||||
|
||||
//USART
|
||||
#define EXTMODULE_USART USART2
|
||||
#define EXTMODULE_USART_TX_DMA DMA2
|
||||
#define EXTMODULE_USART_TX_DMA_CHANNEL LL_DMAMUX1_REQ_USART2_TX
|
||||
#define EXTMODULE_USART_TX_DMA_STREAM LL_DMA_STREAM_6
|
||||
#define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMAMUX1_REQ_USART2_RX
|
||||
#define EXTMODULE_USART_RX_DMA_STREAM LL_DMA_STREAM_5
|
||||
#define EXTMODULE_USART_IRQHandler USART2_IRQHandler
|
||||
#define EXTMODULE_USART_IRQn USART2_IRQn
|
||||
|
||||
//TIMER
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMAMUX1_REQ_TIM5_UP
|
||||
#define EXTMODULE_TIMER_DMA DMA2
|
||||
#define EXTMODULE_TIMER_DMA_STREAM LL_DMA_STREAM_6
|
||||
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream6_IRQn
|
||||
#define EXTMODULE_TIMER_DMA_IRQHandler DMA2_Stream6_IRQHandler
|
||||
|
||||
// Trainer Port
|
||||
#define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA)
|
||||
|
||||
#define TRAINER_IN_GPIO GPIO_PIN(GPIOI, 6)
|
||||
#define TRAINER_IN_TIMER_Channel LL_TIM_CHANNEL_CH2
|
||||
|
||||
#define TRAINER_OUT_GPIO GPIO_PIN(GPIOI, 5)
|
||||
#define TRAINER_OUT_TIMER_Channel LL_TIM_CHANNEL_CH1
|
||||
|
||||
#define TRAINER_TIMER TIM8
|
||||
#define TRAINER_TIMER_IRQn TIM8_CC_IRQn
|
||||
#define TRAINER_TIMER_IRQHandler TIM8_CC_IRQHandler
|
||||
#define TRAINER_GPIO_AF LL_GPIO_AF_3
|
||||
#define TRAINER_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
|
||||
|
||||
#define TRAINER_DETECT_GPIO GPIO_PIN(GPIOH, 4)
|
||||
|
||||
// AUX ports
|
||||
#define AUX_SERIAL_TX_GPIO GPIO_PIN(GPIOB, 6) // PB.06
|
||||
#define AUX_SERIAL_RX_GPIO GPIO_PIN(GPIOB, 5) // PB.05
|
||||
#define AUX_SERIAL_USART UART5
|
||||
#define AUX_SERIAL_USART_IRQHandler UART5_IRQHandler
|
||||
#define AUX_SERIAL_USART_IRQn UART5_IRQn
|
||||
#define AUX_SERIAL_DMA_TX DMA2
|
||||
#define AUX_SERIAL_DMA_TX_STREAM LL_DMA_STREAM_1
|
||||
#define AUX_SERIAL_DMA_TX_CHANNEL LL_DMAMUX1_REQ_UART5_TX
|
||||
#define AUX_SERIAL_DMA_RX DMA2
|
||||
#define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_2
|
||||
#define AUX_SERIAL_DMA_RX_CHANNEL LL_DMAMUX1_REQ_UART5_RX
|
||||
#define AUX_SERIAL_PWR_GPIO GPIO_PIN(GPIOB, 7) // PB.07
|
||||
|
||||
#define AUX2_SERIAL_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10
|
||||
#define AUX2_SERIAL_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
|
||||
#define AUX2_SERIAL_USART USART3
|
||||
#define AUX2_SERIAL_USART_IRQHandler USART3_IRQHandler
|
||||
#define AUX2_SERIAL_USART_IRQn USART3_IRQn
|
||||
#define AUX2_SERIAL_DMA_TX DMA2
|
||||
#define AUX2_SERIAL_DMA_TX_STREAM LL_DMA_STREAM_7
|
||||
#define AUX2_SERIAL_DMA_TX_CHANNEL LL_DMAMUX1_REQ_USART3_TX
|
||||
#define AUX2_SERIAL_DMA_RX DMA1
|
||||
#define AUX2_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_6
|
||||
#define AUX2_SERIAL_DMA_RX_CHANNEL LL_DMAMUX1_REQ_USART3_RX
|
||||
#define AUX2_SERIAL_PWR_GPIO GPIO_PIN(GPIOC, 13) // PC.13
|
||||
|
||||
// Touch
|
||||
#define TOUCH_I2C_BUS I2C_Bus_1
|
||||
#define TOUCH_INT_GPIO GPIO_PIN(GPIOE, 2) // PE.02
|
||||
#define TOUCH_RST_GPIO GPIO_PIN(GPIOJ, 13) // PJ.13
|
||||
|
||||
// TOUCH_INT_EXTI IRQ
|
||||
#if !defined(USE_EXTI2_IRQ)
|
||||
#define USE_EXTI2_IRQ
|
||||
#define EXTI2_IRQ_Priority 9
|
||||
#endif
|
||||
|
||||
#define IMU_I2C_BUS I2C_Bus_2
|
||||
#define IMU_I2C_ADDRESS 0x6A
|
||||
#define IMU_INT_GPIO GPIO_PIN(GPIOG, 13) // PG.13
|
||||
#if !defined(USE_EXTI15_10_IRQ)
|
||||
#define USE_EXTI15_10_IRQ
|
||||
#define EXTI15_10_IRQ_Priority 6
|
||||
#endif
|
||||
|
||||
//ROTARY emulation for trims as buttons
|
||||
#define ROTARY_ENCODER_NAVIGATION
|
||||
// Rotary Encoder
|
||||
#define ROTARY_ENCODER_INVERTED
|
||||
#define ROTARY_ENCODER_GPIO_A GPIOI
|
||||
#define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_7
|
||||
#define ROTARY_ENCODER_GPIO_B GPIOJ
|
||||
#define ROTARY_ENCODER_GPIO_PIN_B LL_GPIO_PIN_8
|
||||
#define ROTARY_ENCODER_POSITION() (((ROTARY_ENCODER_GPIO_A->IDR >> 7) & 0x01)|((ROTARY_ENCODER_GPIO_B->IDR >> 7) & 0x02))
|
||||
#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_7
|
||||
#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_8
|
||||
#if !defined(USE_EXTI7_IRQ)
|
||||
#define USE_EXTI7_IRQ
|
||||
#define EXTI7_IRQ_Priority 5
|
||||
#endif
|
||||
#if !defined(USE_EXTI8_IRQ)
|
||||
#define USE_EXTI8_IRQ
|
||||
#define EXTI8_IRQ_Priority 5
|
||||
#endif
|
||||
#define ROTARY_ENCODER_EXTI_PORT_A LL_SYSCFG_EXTI_PORTI
|
||||
#define ROTARY_ENCODER_EXTI_PORT_B LL_SYSCFG_EXTI_PORTJ
|
||||
#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE7
|
||||
#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE8
|
||||
#define ROTARY_ENCODER_TIMER TIM17
|
||||
#define ROTARY_ENCODER_TIMER_IRQn TIM17_IRQn
|
||||
#define ROTARY_ENCODER_TIMER_IRQHandler TIM17_IRQHandler
|
||||
|
||||
// Millisecond timer
|
||||
#define MS_TIMER TIM14
|
||||
#define MS_TIMER_IRQn TIM8_TRG_COM_TIM14_IRQn
|
||||
#define MS_TIMER_IRQHandler TIM8_TRG_COM_TIM14_IRQHandler
|
||||
|
||||
// Mixer scheduler timer
|
||||
#define MIXER_SCHEDULER_TIMER TIM12
|
||||
#define MIXER_SCHEDULER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
|
||||
#define MIXER_SCHEDULER_TIMER_IRQn TIM8_BRK_TIM12_IRQn
|
||||
#define MIXER_SCHEDULER_TIMER_IRQHandler TIM8_BRK_TIM12_IRQHandler
|
||||
|
||||
#define LCD_W 800
|
||||
#define LCD_H 480
|
||||
|
||||
#define LCD_PHYS_W LCD_W
|
||||
#define LCD_PHYS_H LCD_H
|
||||
|
||||
#define LCD_DEPTH 16
|
||||
|
||||
#define LSE_DRIVE_STRENGTH RCC_LSEDRIVE_HIGH
|
||||
|
||||
#endif // _HAL_H_
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* 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/key_driver.h"
|
||||
|
||||
#include "bsp_io.h"
|
||||
#include "stm32_hal_ll.h"
|
||||
#include "stm32_gpio_driver.h"
|
||||
#include "stm32_i2c_driver.h"
|
||||
|
||||
#include "hal.h"
|
||||
#include "delays_driver.h"
|
||||
#include "keys.h"
|
||||
|
||||
#include "stm32_keys.inc"
|
||||
#include "debug.h"
|
||||
|
||||
void keysInit() {
|
||||
_init_keys();
|
||||
_init_trims();
|
||||
}
|
||||
|
||||
uint32_t readKeys() { return _read_keys(); }
|
||||
|
||||
/* The output bit-order has to be:
|
||||
0 LHL TR3L (Left equals down)
|
||||
1 LHR TR3R
|
||||
2 LVD TR1D
|
||||
3 LVU TR1U
|
||||
4 RVD TR2D
|
||||
5 RVU TR2U
|
||||
6 RHL TR4L
|
||||
7 RHR TR4R
|
||||
*/
|
||||
|
||||
enum PhysicalTrims {
|
||||
TR3L = 0,
|
||||
TR3R,
|
||||
TR1D = 2,
|
||||
TR1U,
|
||||
TR2D = 4,
|
||||
TR2U,
|
||||
TR4L = 6,
|
||||
TR4R,
|
||||
TR5U = 8,
|
||||
TR5D,
|
||||
TR6U = 10,
|
||||
TR6D
|
||||
};
|
||||
|
||||
uint32_t readTrims()
|
||||
{
|
||||
uint32_t result = 0;
|
||||
uint32_t keys = bsp_get_fs_switches();
|
||||
|
||||
#define _TRIM(t) \
|
||||
if ((keys & BSP_##t) == 0) result |= 1 << t;
|
||||
|
||||
_TRIM(TR1U);
|
||||
_TRIM(TR1D);
|
||||
_TRIM(TR3L);
|
||||
_TRIM(TR3R);
|
||||
_TRIM(TR2U);
|
||||
_TRIM(TR2D);
|
||||
_TRIM(TR4L);
|
||||
_TRIM(TR4R);
|
||||
if (!LL_GPIO_IsInputPinSet(GPIOH, LL_GPIO_PIN_15)) result |= (1 << TR5U);
|
||||
if (!LL_GPIO_IsInputPinSet(GPIOH, LL_GPIO_PIN_13)) result |= (1 << TR5D);
|
||||
_TRIM(TR6U);
|
||||
_TRIM(TR6D);
|
||||
|
||||
#undef _TRIM
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _USB_DESCRIPTOR_H_
|
||||
#define _USB_DESCRIPTOR_H_
|
||||
|
||||
#define USB_NAME "TX16SMK3"
|
||||
#define USB_MANUFACTURER 'R', 'M', ' ', ' ', ' ', ' ', ' ', ' ' /* 8 bytes */
|
||||
#define USB_PRODUCT 'T', 'X', '1', '6', 'S', 'M', 'K', '3' /* 8 Bytes */
|
||||
|
||||
#endif // _USB_DESCRIPTOR_H_
|
||||
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -371,6 +371,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -372,6 +372,7 @@
|
||||
#define TR_SRC_BATT "Bat."
|
||||
#define TR_SRC_TIME "Čas"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Čas"
|
||||
|
||||
#define TR_VTMRMODES_1 "VYP"
|
||||
|
||||
@@ -373,6 +373,7 @@
|
||||
#define TR_SRC_BATT "Bat."
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tid"
|
||||
|
||||
#define TR_VTMRMODES_1 "FRA"
|
||||
|
||||
@@ -372,6 +372,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "AUS"
|
||||
|
||||
@@ -371,6 +371,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -369,6 +369,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -370,6 +370,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -373,6 +373,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "H_M"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Chrono"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -374,6 +374,7 @@
|
||||
#define TR_SRC_BATT "סוללה"
|
||||
#define TR_SRC_TIME "זמן"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -371,6 +371,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -370,6 +370,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -369,6 +369,7 @@
|
||||
#define TR_SRC_BATT "배터리"
|
||||
#define TR_SRC_TIME "시간"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "타이머"
|
||||
|
||||
|
||||
|
||||
@@ -371,6 +371,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "UIT"
|
||||
|
||||
@@ -370,6 +370,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "WYŁ"
|
||||
|
||||
@@ -371,6 +371,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "DESL"
|
||||
|
||||
@@ -373,6 +373,7 @@
|
||||
#define TR_SRC_BATT "АКБ"
|
||||
#define TR_SRC_TIME "Время"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "ТМР"
|
||||
|
||||
#define TR_VTMRMODES_1 "Вык"
|
||||
|
||||
@@ -373,6 +373,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Tid"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "Av"
|
||||
|
||||
@@ -369,6 +369,7 @@
|
||||
#define TR_SRC_BATT "Batt"
|
||||
#define TR_SRC_TIME "Time"
|
||||
#define TR_SRC_GPS "GPS"
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Tmr"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -372,6 +372,7 @@
|
||||
#define TR_SRC_BATT "Batt" /* use english */
|
||||
#define TR_SRC_TIME "Час"
|
||||
#define TR_SRC_GPS "GPS" /* use english */
|
||||
#define TR_SRC_LIGHT "Ambient light"
|
||||
#define TR_SRC_TIMER "Тмр"
|
||||
|
||||
#define TR_VTMRMODES_1 "OFF"
|
||||
|
||||
@@ -946,6 +946,7 @@
|
||||
#define STR_SPORT_UPDATE_POWER_MODE currentLangStrings->STR_SPORT_UPDATE_POWER_MODE
|
||||
#define STR_SRC_BATT currentLangStrings->STR_SRC_BATT
|
||||
#define STR_SRC_GPS currentLangStrings->STR_SRC_GPS
|
||||
#define STR_SRC_LIGHT currentLangStrings->STR_SRC_LIGHT
|
||||
#define STR_SRC_TIME currentLangStrings->STR_SRC_TIME
|
||||
#define STR_SRC_TIMER currentLangStrings->STR_SRC_TIMER
|
||||
#define STR_STACK_AUDIO currentLangStrings->STR_STACK_AUDIO
|
||||
|
||||
@@ -945,6 +945,7 @@ STR(SPLASHSCREEN)
|
||||
STR(SPORT_UPDATE_POWER_MODE)
|
||||
STR(SRC_BATT)
|
||||
STR(SRC_GPS)
|
||||
STR(SRC_LIGHT)
|
||||
STR(SRC_TIME)
|
||||
STR(SRC_TIMER)
|
||||
STR(STACK_AUDIO)
|
||||
|
||||
@@ -100,6 +100,11 @@ class ADCInputParser:
|
||||
'name': 'RTC_BAT',
|
||||
'suffix': 'RTC_BAT',
|
||||
},
|
||||
{
|
||||
'type': 'LUX',
|
||||
'name': 'LUX',
|
||||
'suffix': 'LUX',
|
||||
},
|
||||
{
|
||||
'range': AZ_seq(),
|
||||
'type': ADCInput.TYPE_SWITCH,
|
||||
@@ -237,7 +242,7 @@ class ADCInputParser:
|
||||
if 'PWM_STICKS' in self.hw_defs:
|
||||
ch = self.hw_defs.get(f'STICK_PWM_CHANNEL_{adc_input.name}')
|
||||
adc_input.pwm_channel = idx if ch is None else ch
|
||||
if adc_input.type != 'VBAT' and adc_input.type != 'RTC_BAT':
|
||||
if adc_input.type != 'VBAT' and adc_input.type != 'RTC_BAT' and adc_input.type != 'LUX':
|
||||
d = self.dirs[idx]
|
||||
if d < 0:
|
||||
adc_input.inverted = True
|
||||
|
||||
@@ -48,12 +48,22 @@ static const etx_hal_adc_input_t _rtc_bat_inputs[] = {
|
||||
{% endfor %}
|
||||
};
|
||||
|
||||
{% set n_inputs = rtc_bat_offset + n_rtc_bat %}
|
||||
{% set lux_offset = rtc_bat_offset + n_rtc_bat %}
|
||||
{% set lux_inputs = adc_inputs.inputs | selectattr('type', '==', 'LUX') | list %}
|
||||
{% set n_lux = lux_inputs | count %}
|
||||
static const etx_hal_adc_input_t _lux_inputs[] = {
|
||||
{% for input in lux_inputs %}
|
||||
{ "{{ input.name }}", nullptr, nullptr },
|
||||
{% endfor %}
|
||||
};
|
||||
|
||||
{% set n_inputs = lux_offset + n_lux %}
|
||||
static const etx_hal_adc_inputs_t _hal_inputs[] = {
|
||||
{ {{ n_mains }}, 0, _main_inputs },
|
||||
{ {{ n_flex }}, {{ flex_offset }}, _flex_inputs },
|
||||
{ {{ n_vbat }}, {{ vbat_offset }}, _vbat_inputs },
|
||||
{ {{ n_rtc_bat }}, {{ rtc_bat_offset }}, _rtc_bat_inputs },
|
||||
{ {{ n_lux }}, {{ lux_offset }}, _lux_inputs },
|
||||
{ {{ n_inputs }}, 0, nullptr },
|
||||
};
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ KEYS = [
|
||||
|
||||
KEY_LABELS = [
|
||||
{
|
||||
"targets": {"boxer", "f16", "mt12", "gx12", "pocket", "tx12", "tx12mk2", "tx16s", "v16", "zorro"},
|
||||
"targets": {"boxer", "f16", "mt12", "gx12", "pocket", "tx12", "tx12mk2", "tx16s", "tx16smk3","v16", "zorro"},
|
||||
"keys": {
|
||||
"EXIT": { "label": "RTN" }
|
||||
}
|
||||
|
||||
@@ -89,6 +89,73 @@ LEGACY_NAMES = [
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"targets": {"tx16smk3"},
|
||||
"inputs": {
|
||||
"LH": {
|
||||
"yaml": "Rud",
|
||||
"lua": "rud",
|
||||
"description": "Rudder"
|
||||
},
|
||||
"LV": {
|
||||
"yaml": "Ele",
|
||||
"lua": "ele",
|
||||
"description": "Elevator"
|
||||
},
|
||||
"RV": {
|
||||
"yaml": "Thr",
|
||||
"lua": "thr",
|
||||
"description": "Throttle"
|
||||
},
|
||||
"RH": {
|
||||
"yaml": "Ail",
|
||||
"lua": "ail",
|
||||
"description": "Aileron"
|
||||
},
|
||||
"P1": {
|
||||
"yaml": "S1",
|
||||
"lua": "s1",
|
||||
"label": "S1",
|
||||
"short_label": "1",
|
||||
"description": "Potentiometer S1"
|
||||
},
|
||||
"P2": {
|
||||
"yaml": "S2",
|
||||
"lua": "s2",
|
||||
"label": "S2",
|
||||
"short_label": "2",
|
||||
"description": "Potentiometer S2"
|
||||
},
|
||||
"SL1": {
|
||||
"yaml": "LS",
|
||||
"lua": "ls",
|
||||
"label": "LS",
|
||||
"short_label": "L",
|
||||
"description": "Left slider"
|
||||
},
|
||||
"SL2": {
|
||||
"yaml": "RS",
|
||||
"lua": "rs",
|
||||
"label": "RS",
|
||||
"short_label": "R",
|
||||
"description": "Right slider"
|
||||
},
|
||||
"EXT1": {
|
||||
"yaml": "EXT1",
|
||||
"lua": "ext1",
|
||||
"label": "EXT1",
|
||||
"short_label": "E1",
|
||||
"description": "Ext 1"
|
||||
},
|
||||
"EXT2": {
|
||||
"yaml": "EXT2",
|
||||
"lua": "ext2",
|
||||
"label": "EXT2",
|
||||
"short_label": "E2",
|
||||
"description": "Ext 2"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"targets": {"t15", "t15pro", "tx15"},
|
||||
"inputs": {
|
||||
|
||||
@@ -157,6 +157,14 @@ POT_CONFIG = {
|
||||
"SL1": {"default": "SLIDER"},
|
||||
"SL2": {"default": "SLIDER"}
|
||||
},
|
||||
"tx16smk3": {
|
||||
"P1": {"default": "POT_CENTER"},
|
||||
"P2": {"default": "POT_CENTER"},
|
||||
"SL1": {"default": "SLIDER"},
|
||||
"SL2": {"default": "SLIDER"},
|
||||
"EXT1": {"default": "NONE"},
|
||||
"EXT2": {"default": "NONE"},
|
||||
},
|
||||
"f16": {
|
||||
"P1": {"default": "POT_CENTER"},
|
||||
"P2": {"default": "MULTIPOS"},
|
||||
|
||||
@@ -420,6 +420,26 @@ SWITCH_CONFIG = {
|
||||
"SG": {"default": "3POS"},
|
||||
"SH": {"default": "TOGGLE"}
|
||||
},
|
||||
"tx16smk3": {
|
||||
"SA": {"default": "3POS"},
|
||||
"SB": {"default": "3POS"},
|
||||
"SC": {"default": "3POS"},
|
||||
"SD": {"default": "3POS"},
|
||||
"SE": {"default": "3POS"},
|
||||
"SF": {"default": "2POS"},
|
||||
"SG": {"default": "3POS"},
|
||||
"SH": {"default": "2POS"},
|
||||
#optional
|
||||
"SI": {"default": "NONE"},
|
||||
"SJ": {"default": "NONE"},
|
||||
# custom switches
|
||||
"SK": {"default": "2POS"},
|
||||
"SL": {"default": "2POS"},
|
||||
"SM": {"default": "2POS"},
|
||||
"SN": {"default": "2POS"},
|
||||
"SO": {"default": "2POS"},
|
||||
"SP": {"default": "2POS"},
|
||||
},
|
||||
"f16": {
|
||||
"SA": {"default": "3POS"},
|
||||
"SB": {"default": "3POS"},
|
||||
|
||||
@@ -125,6 +125,9 @@ get_target_build_options() {
|
||||
tx16s)
|
||||
BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S"
|
||||
;;
|
||||
tx16smk3)
|
||||
BUILD_OPTIONS+="-DPCB=TX16SMK3"
|
||||
;;
|
||||
f16)
|
||||
BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=F16"
|
||||
;;
|
||||
|
||||
@@ -219,7 +219,7 @@ declare -a simulator_plugins=(
|
||||
t8 t12 t12max tx12 tx12mk2 t15 t15pro t16 t18 t20 t20v2
|
||||
xlite xlites
|
||||
x10 x10express x12s
|
||||
zorro tx16s tx15
|
||||
zorro tx16s tx16smk3 tx15
|
||||
commando8 boxer pocket mt12 gx12
|
||||
tlite tpro tprov2 tpros bumblebee lr3pro t14
|
||||
nv14 el18 pl18 pl18ev pl18u st16 pa01
|
||||
|
||||
@@ -9,7 +9,7 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
: "${SRCDIR:=$(dirname "$(pwd)/$0")/..}"
|
||||
|
||||
: ${FLAVOR:="nv14;el18;pl18;pl18ev;nb4p;st16;t12;t12max;t15;t15pro;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;gx12;tx12;tx12mk2;boxer;tx16s;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v14;v12;tx15"}
|
||||
: ${FLAVOR:="nv14;el18;pl18;pl18ev;nb4p;st16;t12;t12max;t15;t15pro;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;gx12;tx12;tx12mk2;boxer;tx16s;tx16smk3;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v14;v12;tx15"}
|
||||
: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"}
|
||||
|
||||
# wipe build directory clean
|
||||
|
||||
@@ -11,7 +11,7 @@ if [[ -n ${GCC_ARM} ]] ; then
|
||||
export PATH=${GCC_ARM}:$PATH
|
||||
fi
|
||||
|
||||
: ${FLAVOR:="t15;tx16s;pl18;nv14;pl18u;nb4p;x9d;x9dp2019;x9e;xlite;xlites;x7;tpro;t20;f16;gx12;st16;pa01;tx15;t15pro"}
|
||||
: ${FLAVOR:="t15;tx16s;pl18;nv14;pl18u;nb4p;x9d;x9dp2019;x9e;xlite;xlites;x7;tpro;t20;f16;gx12;st16;pa01;tx15;t15pro;tx16smk3"}
|
||||
: ${SRCDIR:=$(dirname "$(pwd)/$0")/..}
|
||||
|
||||
: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DDISABLE_COMPANION=YES -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"}
|
||||
|
||||