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>
This commit is contained in:
3djc
2026-01-25 14:08:05 +10:00
committed by GitHub
co-authored by philmoz 3djc Peter Feerick
parent 5394e84871
commit be496b66b6
86 changed files with 2789 additions and 60 deletions
+1
View File
@@ -128,6 +128,7 @@ body:
- RadioMaster TX12 / TX12MK2
- RadioMaster TX15
- RadioMaster TX16S / TX16SMK2
- RadioMaster TX16SMK3
- RadioMaster Zorro
- Other (Please specify below)
validations:
+2
View File
@@ -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
+1
View File
@@ -26,6 +26,7 @@ jobs:
- t20;t20v2;t14
- tx12mk2;boxer;gx12
- tx16s
- tx16smk3
- f16
- v16
- x10;x10express
+15
View File
@@ -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;
+18 -12
View File
@@ -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:
+11 -4
View File
@@ -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);
+1
View File
@@ -38,6 +38,7 @@
["RadioMaster TX12MK2", "tx12mk2-"],
["RadioMaster TX15", "tx15-"],
["RadioMaster TX16S", "tx16s-"],
["RadioMaster TX16SMK3", "tx16smk3-"],
["RadioMaster Zorro","zorro-"]
],
"changelog": "- Major initial bug fixes"
+11 -1
View File
@@ -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
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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 {
+275
View File
@@ -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 &copy_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;
}
+46
View File
@@ -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;
+5 -1
View File
@@ -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);
}
+7 -2
View File
@@ -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 {
+3 -1
View File
@@ -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)
+14
View File
@@ -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;
+4
View File
@@ -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
+10 -3
View File
@@ -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};
+1 -8
View File
@@ -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) {
+5 -2
View File
@@ -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)
+1
View File
@@ -42,6 +42,7 @@ enum {
ADC_INPUT_FLEX,
ADC_INPUT_VBAT,
ADC_INPUT_RTC_BAT,
ADC_INPUT_LUX,
ADC_INPUT_ALL,
};
+1 -1
View File
@@ -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)
+4
View File
@@ -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"},
+10
View File
@@ -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];
+2
View File
@@ -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"
File diff suppressed because it is too large Load Diff
+7 -1
View File
@@ -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) {
+1 -1
View File
@@ -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()
+2
View File
@@ -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)
+212
View File
@@ -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)
+55
View File
@@ -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;
+624
View File
@@ -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_
+93
View File
@@ -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_
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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 "타이머"
+1
View File
@@ -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"
+1
View File
@@ -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Ł"
+1
View File
@@ -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"
+1
View File
@@ -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 "Вык"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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
+1
View File
@@ -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)
+6 -1
View File
@@ -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
+11 -1
View File
@@ -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 },
};
+1 -1
View File
@@ -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" }
}
+67
View File
@@ -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": {
+8
View File
@@ -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"},
+20
View File
@@ -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"},
+3
View File
@@ -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"
;;
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"}