From cc92f2504616d4b44f594a69a889fd4a2cac2bc8 Mon Sep 17 00:00:00 2001 From: Richard Li Date: Wed, 9 Jun 2021 16:10:45 +0800 Subject: [PATCH] Fixed NV14 build, added flysky build script and target in build-gh.sh --- radio/src/datastructs.h | 2 +- radio/src/gui/colorlcd/model_curves.cpp | 10 ++- radio/src/lua/CMakeLists.txt | 1 + radio/src/lua/api_general.cpp | 2 + radio/src/pulses/afhds3.h | 3 + .../src/storage/conversions/datastructs_219.h | 6 +- radio/src/targets/nv14/CMakeLists.txt | 66 ++++++++++++++++--- radio/src/targets/nv14/adc_driver.cpp | 4 +- radio/src/targets/nv14/board.cpp | 9 ++- radio/src/targets/nv14/board.h | 19 +++++- .../src/targets/nv14/bootloader/boot_menu.cpp | 4 +- radio/src/targets/nv14/extmodule_driver.cpp | 2 +- radio/src/targets/nv14/hal.h | 51 +++++++++++++- radio/src/targets/nv14/lcd_driver.cpp | 62 ++++++++++++++++- radio/src/targets/nv14/libopenui_config.h | 4 +- radio/src/targets/nv14/pwr_driver.cpp | 20 +++--- radio/src/targets/nv14/touch_driver.cpp | 3 +- tools/build-gh.sh | 3 + 18 files changed, 226 insertions(+), 45 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index eeccb77b6..08afe8281 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -582,7 +582,7 @@ PACK(struct CustomScreenData { #define TOPBAR_DATA #endif -#if defined(PCBHORUS) || defined(PCBTARANIS) +#if defined(PCBHORUS) || defined(PCBTARANIS) || defined(PCBNV14) #define SCRIPT_DATA \ NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); #else diff --git a/radio/src/gui/colorlcd/model_curves.cpp b/radio/src/gui/colorlcd/model_curves.cpp index fdf2295c0..085bdf3b2 100644 --- a/radio/src/gui/colorlcd/model_curves.cpp +++ b/radio/src/gui/colorlcd/model_curves.cpp @@ -168,7 +168,9 @@ class CurveEditWindow : public Page curve.type = newValue; } SET_DIRTY(); - curveEdit->update(); + curveEdit->updatePreview(); + curveDataEdit->clear(); + curveDataEdit->update(); } }); @@ -190,7 +192,9 @@ class CurveEditWindow : public Page } curve.points = newValue; SET_DIRTY(); - curveEdit->update(); + curveEdit->updatePreview(); + curveDataEdit->clear(); + curveDataEdit->update(); } }); edit->setSuffix(STR_PTS); @@ -202,7 +206,7 @@ class CurveEditWindow : public Page [=](int32_t newValue) { g_model.curves[index].smooth = newValue; SET_DIRTY(); - curveEdit->update(); + curveEdit->updatePreview(); }); grid.nextLine(); } diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt index c1cd80a12..cab6bcd4f 100644 --- a/radio/src/lua/CMakeLists.txt +++ b/radio/src/lua/CMakeLists.txt @@ -33,4 +33,5 @@ if(PYTHONINTERP_FOUND) add_lua_export_target(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12) add_lua_export_target(t8 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T8) add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16) + add_lua_export_target(nv14 ${LUA_INCLUDES} -DPCBFLYSKY -DPCBNV14) endif() diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 9ef7577b2..aa7a5a643 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -64,6 +64,8 @@ #include "lua/lua_exports_x9d+2019.inc" #elif defined(PCBTARANIS) #include "lua/lua_exports_x9d.inc" +#elif defined(PCBNV14) + #include "lua/lua_exports_nv14.inc" #endif #if defined(SIMU) diff --git a/radio/src/pulses/afhds3.h b/radio/src/pulses/afhds3.h index 5d687bc0e..c3edc33cd 100644 --- a/radio/src/pulses/afhds3.h +++ b/radio/src/pulses/afhds3.h @@ -93,7 +93,10 @@ struct Data void reset() { +#if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) +#else pulsesSize = 0; +#endif } #if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) diff --git a/radio/src/storage/conversions/datastructs_219.h b/radio/src/storage/conversions/datastructs_219.h index ef83d2471..3f30c69b3 100644 --- a/radio/src/storage/conversions/datastructs_219.h +++ b/radio/src/storage/conversions/datastructs_219.h @@ -27,7 +27,7 @@ #define NUM_SWITCHES_219 10 #elif defined(PCBXLITE) ||defined(PCBXLITES) #define NUM_SWITCHES_219 6 -#elif defined(RADIO_TLITE) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_T8) +#elif defined(RADIO_TLITE) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_T8) || defined(PCBNV14) #define NUM_SWITCHES_219 8 #elif defined(PCBX7) || defined(PCBX7ACCESS) #define NUM_SWITCHES_219 8 @@ -49,7 +49,7 @@ #elif defined(PCBX9LITE) #define NUM_POTS_219 1 #define NUM_SLIDERS_219 0 -#elif defined(RADIO_T8) || defined(RADIO_TLITE) || defined(PCBXLITE) || defined(PCBX7) +#elif defined(RADIO_T8) || defined(RADIO_TLITE) || defined(PCBXLITE) || defined(PCBX7) || defined(PCBNV14) #define NUM_POTS_219 2 #define NUM_SLIDERS_219 0 #elif defined(PCBX9E) @@ -113,7 +113,7 @@ #define MAX_CURVE_POINTS_219 512 #endif -#if defined(PCBHORUS) +#if defined(PCBHORUS) || defined(PCBNV14) #define MAX_MODELS_219 60 #define MAX_OUTPUT_CHANNELS_219 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES_219 9 diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index 2bf624a70..10c476d1b 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -14,6 +14,8 @@ set(STORAGE_FORMAT BIN) set(HAPTIC YES) set(GUI_DIR colorlcd) set(BITMAPS_DIR 480x272) +set(HARDWARE_EXTERNAL_MODULE YES) +set(AUX_SERIAL ON) # set(NAVIGATION_TYPE touch) set(TARGET_DIR nv14) add_definitions(-DHARDWARE_TRAINER_JACK) @@ -42,17 +44,19 @@ add_definitions(-DBATTERY_CHARGE) # -DSOFTWARE_VOLUME set(TARGET_SRC ${TARGET_SRC} audio_spi_driver.cpp + ../common/arm/stm32/mixer_scheduler_driver.cpp ) +#set(FIRMWARE_TARGET_SRC +# ${FIRMWARE_TARGET_SRC} +# x12s_adc_driver.cpp +# ) + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} - x12s_adc_driver.cpp - ) - -set(FIRMWARE_TARGET_SRC - ${FIRMWARE_TARGET_SRC} + adc_driver.cpp battery_driver.cpp - hallStick_driver.cpp + ../horus/flyskyHallStick_driver.cpp ) set(BITMAPS_TARGET nv14_bitmaps) @@ -73,7 +77,9 @@ add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE}) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) add_definitions(-DCROSSFIRE_NATIVE) add_definitions(-DFLYSKY_HALL_STICKS_REVERSE) -add_definitions(-DHALL_STICKS) +add_definitions(-DFLYSKY_HALL_STICKS) +add_definitions(-DHARDWARE_EXTERNAL_MODULE) +add_definitions(-DAUX_SERIAL) #add_definitions(-DFLYSKY_AUTO_POWER_DOWN) if(STICKS_DEAD_ZONE) @@ -149,12 +155,52 @@ set(STM32LIB_SRC STM32F4xx_StdPeriph_Driver/src/stm32f4xx_syscfg.c ) +MACRO(GET_GCC_INCLUDE_PATH gcc_include_path) + if (WIN32) + execute_process(COMMAND arm-none-eabi-gcc -v -x c -E NUL ERROR_VARIABLE _gcc_output OUTPUT_QUIET) + else() + execute_process(COMMAND arm-none-eabi-gcc -v -x c -E - INPUT_FILE /dev/null ERROR_VARIABLE _gcc_output OUTPUT_QUIET) + endif() + + # Build an array of string from the GCC output + string(REPLACE "\n" ";" _gcc_output "${_gcc_output}") + + set(_capture_include FALSE) + set(_include_path "") + + # Go through the lines and capture between '"#include <...> search starts here:"' and 'End of search list.' + foreach(_line ${_gcc_output}) + if(${_line} STREQUAL "End of search list.") + set(_capture_include FALSE) + endif() + + if(_capture_include) + # Remove the leading and trailing empty characters + string(REPLACE "\r" "" _line ${_line}) + string(SUBSTRING "${_line}" 1 -1 _line) + set(_include_path "${_include_path}" "-I${_line}") + endif() + + if(${_line} STREQUAL "#include <...> search starts here:") + set(_capture_include TRUE) + endif() + endforeach() + set(${gcc_include_path} ${_include_path}) +ENDMACRO() + if(PYTHONINTERP_FOUND) - add_custom_target(datacopy + GET_GCC_INCLUDE_PATH(arm_gcc_include_path) + + add_custom_command( + OUTPUT ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp WORKING_DIRECTORY ${RADIO_DIRECTORY}/src - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBFLYSKY -DPCBNV14 -DCPUARM -DCOLORLCD -DBACKUP > storage/datacopy.cpp + COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBFLYSKY -DPCBNV14 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Igui/colorlcd -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/libopenui/src -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Include ${arm_gcc_include_path} -Wno-pragma-once-outside-header > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py - ) + ) + + add_custom_target(datacopy + DEPENDS ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp + ) endif() set(LUA_EXPORT lua_export_nv14) diff --git a/radio/src/targets/nv14/adc_driver.cpp b/radio/src/targets/nv14/adc_driver.cpp index 60cc4a00b..be68f6559 100644 --- a/radio/src/targets/nv14/adc_driver.cpp +++ b/radio/src/targets/nv14/adc_driver.cpp @@ -68,7 +68,7 @@ #define FIRST_ANALOG_ADC 0 #define NUM_MAIN_ANALOGS_ADC 10 #define NUM_MAIN_ANALOGS_ADC_EXT (NUM_MAIN_ANALOGS - 10) -#elif defined(PCBNV14) && defined(HALL_STICKS) +#elif defined(PCBNV14) && defined(FLYSKY_HALL_STICKS) #define FIRST_ANALOG_ADC 4 #define NUM_MAIN_ANALOGS_ADC 9 #else @@ -147,7 +147,7 @@ void adcInit() ADC_MAIN->SQR2 = (ADC_CHANNEL_SWE<<0) + (ADC_CHANNEL_SWF<<5) + (ADC_CHANNEL_LIBATT<<10) + (ADC_CHANNEL_DRYBATT<<15); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_POT2<<5) + (ADC_CHANNEL_SWA<<10) + (ADC_CHANNEL_SWB<<15) + (ADC_CHANNEL_SWC<<20) + (ADC_CHANNEL_SWD<<25); // conversions 1 to 6 #elif defined(PCBNV14) - #if !defined(HALL_STICKS) + #if !defined(FLYSKY_HALL_STICKS) ADC_MAIN->SQR1 |= (ADC_CHANNEL_BATT <<0 ); ADC_MAIN->SQR2 = (ADC_CHANNEL_SWA << 0) + (ADC_CHANNEL_SWC << 5) + (ADC_CHANNEL_SWE << 10) + (ADC_CHANNEL_SWF << 15) + (ADC_CHANNEL_SWG << 20) + (ADC_CHANNEL_SWH << 25); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 diff --git a/radio/src/targets/nv14/board.cpp b/radio/src/targets/nv14/board.cpp index 65ea598e4..809c8c62b 100644 --- a/radio/src/targets/nv14/board.cpp +++ b/radio/src/targets/nv14/board.cpp @@ -29,6 +29,9 @@ extern "C" { } #endif +extern void flysky_hall_stick_init( void ); +extern void flysky_hall_stick_loop( void ); + HardwareOptions hardwareOptions; void watchdogInit(unsigned int duration) @@ -84,7 +87,7 @@ void interrupt1ms() if (pre_scale == 10) { pre_scale = 0; #if !defined(SIMU) - if (boardState == BOARD_STARTED) hall_stick_loop(); + if (boardState == BOARD_STARTED) flysky_hall_stick_loop(); #endif DEBUG_TIMER_START(debugTimerPer10ms); DEBUG_TIMER_SAMPLE(debugTimerPer10msPeriod); @@ -144,7 +147,7 @@ void delay_self(int count) #define RCC_APB1PeriphOther (TELEMETRY_RCC_APB1Periph |\ TRAINER_RCC_APB1Periph |\ INTMODULE_RCC_APB1Periph |\ - HALL_RCC_APB1Periph |\ + FLYSKY_HALL_RCC_APB1Periph |\ EXTMODULE_RCC_APB1Periph |\ INTMODULE_RCC_APB1Periph |\ AUX_SERIAL_RCC_APB1Periph \ @@ -229,7 +232,7 @@ void boardInit() backlightInit(); lcdInit(); #if defined(FLYSKY_HALL_STICKS) - hall_stick_init(FLYSKY_HALL_BAUDRATE); + flysky_hall_stick_init(); #endif usbInit(); hapticInit(); diff --git a/radio/src/targets/nv14/board.h b/radio/src/targets/nv14/board.h index db90d841d..56d04e499 100644 --- a/radio/src/targets/nv14/board.h +++ b/radio/src/targets/nv14/board.h @@ -34,7 +34,7 @@ #endif #include "touch_driver.h" -#include "hallStick_driver.h" +//#include "hallStick_driver.h" #include "lcd_driver.h" #include "battery_driver.h" @@ -128,7 +128,8 @@ void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable, uint16_t parity, void intmoduleSendBuffer(const uint8_t * data, uint8_t size); void intmoduleSendNextFrame(); -void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted); +//void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted); +void extmoduleSerialStart(); void extmoduleSendNextFrame(); void extmoduleSendInvertedByte(uint8_t byte); @@ -146,6 +147,7 @@ enum EnumKeys KEY_PGUP, KEY_PGDN, KEY_UP, + KEY_MODEL = KEY_UP, // TODO: just fixed for compile error, seems this is quite different from horus definition. KEY_DOWN, KEY_RIGHT, KEY_LEFT, @@ -332,6 +334,8 @@ enum CalibratedAnalogs { CALIBRATED_STICK4, CALIBRATED_POT1, CALIBRATED_POT2, + CALIBRATED_SLIDER_REAR_LEFT, + CALIBRATED_SLIDER_REAR_RIGHT, CALIBRATED_SWA, CALIBRATED_SWB, CALIBRATED_SWC, @@ -374,6 +378,11 @@ void pwrSoftReboot(); void pwrOff(); void pwrResetHandler(); bool pwrPressed(); +#if defined(PWR_EXTRA_SWITCH_GPIO) + bool pwrForcePressed(); +#else + #define pwrForcePressed() false +#endif uint32_t pwrPressedDuration();; #if defined(SIMU) || defined(NO_UNEXPECTED_SHUTDOWN) #define UNEXPECTED_SHUTDOWN() (false) @@ -493,9 +502,13 @@ void hapticOff(); void hapticOn(uint32_t pwmPercent); // Second serial port driver -#define AUX_SERIAL +//#define AUX_SERIAL #define DEBUG_BAUDRATE 115200 +#define LUA_DEFAULT_BAUDRATE 115200 extern uint8_t auxSerialMode; +#if defined __cplusplus +void auxSerialSetup(unsigned int baudrate, bool dma, uint16_t length = USART_WordLength_8b, uint16_t parity = USART_Parity_No, uint16_t stop = USART_StopBits_1); +#endif void auxSerialInit(unsigned int mode, unsigned int protocol); void auxSerialPutc(char c); #define auxSerialTelemetryInit(protocol) auxSerialInit(UART_MODE_TELEMETRY, protocol) diff --git a/radio/src/targets/nv14/bootloader/boot_menu.cpp b/radio/src/targets/nv14/bootloader/boot_menu.cpp index 41d48140a..a689cacab 100644 --- a/radio/src/targets/nv14/bootloader/boot_menu.cpp +++ b/radio/src/targets/nv14/bootloader/boot_menu.cpp @@ -79,8 +79,8 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) lcd->drawText(center, 200, "for mass storage", CENTERED | DEFAULT_COLOR); bootloaderDrawFooter(); - lcd->drawText(center, LCD_H - DOUBLE_PADDING, "Current Firmware:", CENTERED | DEFAULT_COLOR); - lcd->drawText(center, LCD_H - DEFAULT_PADDING, getOtherVersion(nullptr), CENTERED | DEFAULT_COLOR); + lcd->drawText(center, LCD_H - DOUBLE_PADDING, "Current Firmware:", CENTERED | DEFAULT_COLOR); + lcd->drawText(center, LCD_H - DEFAULT_PADDING, getFirmwareVersion(nullptr), CENTERED | DEFAULT_COLOR); } else if (st == ST_USB) { //lcd->drawBitmap(136, 98, &BMP_USB_PLUGGED); diff --git a/radio/src/targets/nv14/extmodule_driver.cpp b/radio/src/targets/nv14/extmodule_driver.cpp index aacaf9cfd..489f105f4 100644 --- a/radio/src/targets/nv14/extmodule_driver.cpp +++ b/radio/src/targets/nv14/extmodule_driver.cpp @@ -148,7 +148,7 @@ void extmodulePpmStart() NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); } -void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted) +void extmoduleSerialStart() { } diff --git a/radio/src/targets/nv14/hal.h b/radio/src/targets/nv14/hal.h index a7a57b872..eba39e872 100644 --- a/radio/src/targets/nv14/hal.h +++ b/radio/src/targets/nv14/hal.h @@ -99,7 +99,7 @@ // ADC #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) -#if !defined(HALL_STICKS) +#if !defined(FLYSKY_HALL_STICKS) #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_2 // PA.02 #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_3 // PA.03 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_4 // PA.04 @@ -127,7 +127,7 @@ #define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5) #define ADC_GPIOF_PINS (GPIO_Pin_8 | GPIO_Pin_10) -#if !defined(HALL_STICKS) +#if !defined(FLYSKY_HALL_STICKS) #define ADC_CHANNEL_STICK_LH ADC_Channel_2 // ADC123_IN2 -> ADC1_IN2 #define ADC_CHANNEL_STICK_LV ADC_Channel_3 // ADC123_IN3 -> ADC1_IN3 #define ADC_CHANNEL_STICK_RH ADC_Channel_4 // ADC12_IN4 -> ADC1_IN4 @@ -160,7 +160,8 @@ // Power #define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOI -#define PWR_GPIO GPIOI +#define PWR_ON_GPIO GPIOI +#define PWR_SWITCH_GPIO GPIOI #define PWR_SWITCH_GPIO_REG PWR_GPIO->IDR #define PWR_SWITCH_GPIO_PIN GPIO_Pin_11 // PI.11 #define PWR_ON_GPIO_PIN GPIO_Pin_14 // PI.14 @@ -205,6 +206,11 @@ //used in BOOTLOADER #define SERIAL_RCC_AHB1Periph 0 #define SERIAL_RCC_APB1Periph 0 +#define AUX2_SERIAL_RCC_AHB1Periph 0 +#define AUX2_SERIAL_RCC_APB1Periph 0 +#define AUX2_SERIAL_RCC_APB2Periph 0 +#define KEYS_BACKLIGHT_RCC_AHB1Periph 0 + // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 @@ -357,6 +363,37 @@ #define HAPTIC_TIMER_MODE TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE #define HAPTIC_TIMER_COMPARE_VALUE HAPTIC_GPIO_TIMER->CCR1 +// Flysky Hall Stick +#if defined(FLYSKY_HALL_STICKS) + #if defined (RADIO_TX16S) + #define FLYSKY_HALL_STICKS_REVERSE + #endif + + #define FLYSKY_HALL_SERIAL_USART UART4 + #define FLYSKY_HALL_SERIAL_GPIO GPIOA + #define FLYSKY_HALL_DMA_Channel DMA_Channel_4 + #define FLYSKY_HALL_SERIAL_TX_GPIO_PIN GPIO_Pin_0 // PA.00 + #define FLYSKY_HALL_SERIAL_RX_GPIO_PIN GPIO_Pin_1 // PA.01 + #define FLYSKY_HALL_SERIAL_TX_GPIO_PinSource GPIO_PinSource0 + #define FLYSKY_HALL_SERIAL_RX_GPIO_PinSource GPIO_PinSource1 + #define FLYSKY_HALL_SERIAL_GPIO_AF GPIO_AF_UART4 + + #define FLYSKY_HALL_RCC_AHB1Periph RCC_AHB1Periph_DMA1 + #define FLYSKY_HALL_RCC_APB1Periph RCC_APB1Periph_UART4 + + #define FLYSKY_HALL_SERIAL_USART_IRQHandler UART4_IRQHandler + #define FLYSKY_HALL_SERIAL_USART_IRQn UART4_IRQn + #define FLYSKY_HALL_SERIAL_RX_DMA_Stream_IRQn DMA1_Stream2_IRQn + #define FLYSKY_HALL_SERIAL_TX_DMA_Stream_IRQn DMA1_Stream4_IRQn + #define FLYSKY_HALL_DMA_Stream_RX DMA1_Stream2 + #define FLYSKY_HALL_DMA_Stream_TX DMA1_Stream4 + #define FLYSKY_HALL_DMA_TX_FLAG_TC DMA_IT_TCIF4 + + #define FLYSKY_HALL_RX_DMA_Stream_IRQHandler DMA1_Stream2_IRQHandler + #define FLYSKY_HALL_TX_DMA_Stream_IRQHandler DMA1_Stream4_IRQHandler + +#endif + // Internal Module #define HARDWARE_INTERNAL_MODULE #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_DMA1) @@ -399,6 +436,7 @@ #define EXTMODULE_PULSES #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_11 +#define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define EXTMODULE_PWR_FIX_GPIO GPIOA #define EXTMODULE_PWR_FIX_GPIO_PIN GPIO_Pin_2 // PA.02 #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_DMA2) @@ -519,4 +557,11 @@ #define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7 #define TIMER_2MHz_TIMER TIM7 +// Mixer scheduler timer +#define MIXER_SCHEDULER_TIMER_RCC_APB1Periph RCC_APB1Periph_TIM13 +#define MIXER_SCHEDULER_TIMER TIM13 +#define MIXER_SCHEDULER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) +#define MIXER_SCHEDULER_TIMER_IRQn TIM8_UP_TIM13_IRQn +#define MIXER_SCHEDULER_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler + #endif // _HAL_H_ diff --git a/radio/src/targets/nv14/lcd_driver.cpp b/radio/src/targets/nv14/lcd_driver.cpp index c1b19906f..007d7e446 100644 --- a/radio/src/targets/nv14/lcd_driver.cpp +++ b/radio/src/targets/nv14/lcd_driver.cpp @@ -23,6 +23,7 @@ uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; +uint8_t LCD_SCRATCH_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t currentLayer = LCD_FIRST_LAYER; lcdSpiInitFucPtr lcdInitFunction; @@ -1273,7 +1274,8 @@ BitmapBuffer lcdBuffer1(BMP_RGB565, LCD_W, LCD_H, (uint16_t *) LCD_FIRST_FRAME_BUFFER); BitmapBuffer lcdBuffer2(BMP_RGB565, LCD_W, LCD_H, (uint16_t *) LCD_SECOND_FRAME_BUFFER); -BitmapBuffer * lcd = &lcdBuffer1; +BitmapBuffer * lcdFront = &lcdBuffer1; +BitmapBuffer * lcd = &lcdBuffer2; void LCD_SetLayer(uint32_t layer) { if (layer == LCD_FIRST_LAYER) { @@ -1455,6 +1457,54 @@ void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_ while (DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET); } +// same as DMACopyAlphaBitmap(), but with an 8 bit mask for each pixel (used by fonts) +void DMACopyAlphaMask(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint8_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h, uint16_t bg_color) +{ + TRACE("++++++"); + DMA2D_DeInit(); + + DMA2D_InitTypeDef DMA2D_InitStruct; + DMA2D_InitStruct.DMA2D_Mode = DMA2D_M2M_BLEND; + DMA2D_InitStruct.DMA2D_CMode = CM_RGB565; + DMA2D_InitStruct.DMA2D_OutputMemoryAdd = CONVERT_PTR_UINT(dest + y*destw + x); + DMA2D_InitStruct.DMA2D_OutputBlue = 0; + DMA2D_InitStruct.DMA2D_OutputGreen = 0; + DMA2D_InitStruct.DMA2D_OutputRed = 0; + DMA2D_InitStruct.DMA2D_OutputAlpha = 0; + DMA2D_InitStruct.DMA2D_OutputOffset = destw - w; + DMA2D_InitStruct.DMA2D_NumberOfLine = h; + DMA2D_InitStruct.DMA2D_PixelPerLine = w; + DMA2D_Init(&DMA2D_InitStruct); + + DMA2D_FG_InitTypeDef DMA2D_FG_InitStruct; + DMA2D_FG_StructInit(&DMA2D_FG_InitStruct); + DMA2D_FG_InitStruct.DMA2D_FGMA = CONVERT_PTR_UINT(src + srcy*srcw + srcx); + DMA2D_FG_InitStruct.DMA2D_FGO = srcw - w; + DMA2D_FG_InitStruct.DMA2D_FGCM = CM_A8; // 8 bit inputs every time + DMA2D_FG_InitStruct.DMA2D_FGPFC_ALPHA_MODE = NO_MODIF_ALPHA_VALUE; + DMA2D_FG_InitStruct.DMA2D_FGPFC_ALPHA_VALUE = 0; + DMA2D_FG_InitStruct.DMA2D_FGC_RED = GET_RED(bg_color); // 8 bit red + DMA2D_FG_InitStruct.DMA2D_FGC_GREEN = GET_GREEN(bg_color); // 8 bit green + DMA2D_FG_InitStruct.DMA2D_FGC_BLUE = GET_BLUE(bg_color); // 8 bit blue + + DMA2D_FGConfig(&DMA2D_FG_InitStruct); + + DMA2D_BG_InitTypeDef DMA2D_BG_InitStruct; + DMA2D_BG_StructInit(&DMA2D_BG_InitStruct); + DMA2D_BG_InitStruct.DMA2D_BGMA = CONVERT_PTR_UINT(dest + y*destw + x); + DMA2D_BG_InitStruct.DMA2D_BGO = destw - w; + DMA2D_BG_InitStruct.DMA2D_BGCM = CM_RGB565; + DMA2D_BG_InitStruct.DMA2D_BGPFC_ALPHA_MODE = NO_MODIF_ALPHA_VALUE; + DMA2D_BG_InitStruct.DMA2D_BGPFC_ALPHA_VALUE = 0; + DMA2D_BGConfig(&DMA2D_BG_InitStruct); + + /* Start Transfer */ + DMA2D_StartTransfer(); + + /* Wait for CTC Flag activation */ + while (DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET); +} + void DMABitmapConvert(uint16_t * dest, const uint8_t * src, uint16_t w, uint16_t h, uint32_t format) { DMA2D_DeInit(); @@ -1532,6 +1582,16 @@ int lcdRestoreBackupBuffer() return 1; } +uint16_t* lcdGetBackupBuffer() +{ + return (uint16_t*)LCD_BACKUP_FRAME_BUFFER; +} + +uint16_t* lcdGetScratchBuffer() +{ + return (uint16_t*)LCD_SCRATCH_FRAME_BUFFER; +} + void lcdRefresh() { if (currentLayer == LCD_FIRST_LAYER) { diff --git a/radio/src/targets/nv14/libopenui_config.h b/radio/src/targets/nv14/libopenui_config.h index 50a1606d5..a24c6fef9 100644 --- a/radio/src/targets/nv14/libopenui_config.h +++ b/radio/src/targets/nv14/libopenui_config.h @@ -86,7 +86,7 @@ constexpr uint32_t ALERT_BUTTON_TOP = 300; constexpr uint32_t PAGE_TITLE_TOP = 4; constexpr uint32_t PAGE_TITLE_LEFT = 70; -enum LcdColorIndex +/*enum LcdColorIndex { DEFAULT_COLOR_INDEX, DEFAULT_BGCOLOR_INDEX, @@ -130,7 +130,7 @@ enum LcdColorIndex TABLE_HEADER_BGCOLOR_INDEX, TABLE_BGCOLOR_INDEX, -}; +};*/ enum FontIndex { diff --git a/radio/src/targets/nv14/pwr_driver.cpp b/radio/src/targets/nv14/pwr_driver.cpp index b78cf7f3f..65f653b39 100644 --- a/radio/src/targets/nv14/pwr_driver.cpp +++ b/radio/src/targets/nv14/pwr_driver.cpp @@ -32,13 +32,13 @@ void pwrInit() GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(PWR_GPIO, &GPIO_InitStructure); + GPIO_Init(PWR_ON_GPIO, &GPIO_InitStructure); // TODO move this elsewhere! // Init Module PWR - //GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); - //GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; - //GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); + //GPIO_ResetBits(INTMODULE_PWR_ON_GPIO, INTMODULE_PWR_ON_GPIO_PIN); + //GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_ON_GPIO_PIN; + //GPIO_Init(INTMODULE_PWR_ON_GPIO, &GPIO_InitStructure); //Bluetooth GPIO_SetBits(BLUETOOTH_ON_GPIO, BLUETOOTH_ON_GPIO_PIN); @@ -48,7 +48,7 @@ void pwrInit() // Init PWR SWITCH PIN GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; - GPIO_Init(PWR_GPIO, &GPIO_InitStructure); + GPIO_Init(PWR_ON_GPIO, &GPIO_InitStructure); // Init SD-DETECT PIN GPIO_ResetBits(SD_PRESENT_GPIO, SD_PRESENT_GPIO_PIN); @@ -56,16 +56,16 @@ void pwrInit() GPIO_Init(SD_PRESENT_GPIO, &GPIO_InitStructure); //turn power off - GPIO_ResetBits(PWR_GPIO, PWR_ON_GPIO_PIN); + GPIO_ResetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); //turn Bluetooth off - GPIO_ResetBits(PWR_GPIO, BLUETOOTH_ON_GPIO_PIN); + GPIO_ResetBits(PWR_ON_GPIO, BLUETOOTH_ON_GPIO_PIN); boardState = BOARD_POWER_OFF; } void pwrOn() { - GPIO_SetBits(PWR_GPIO, PWR_ON_GPIO_PIN); + GPIO_SetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); boardState = BOARD_POWER_ON; } @@ -78,12 +78,12 @@ void pwrOff() // Shutdown the Haptic hapticDone(); boardState = BOARD_POWER_OFF; - GPIO_ResetBits(PWR_GPIO, PWR_ON_GPIO_PIN); + GPIO_ResetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); } bool pwrPressed() { - return GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; + return GPIO_ReadInputDataBit(PWR_ON_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; } void pwrResetHandler() diff --git a/radio/src/targets/nv14/touch_driver.cpp b/radio/src/targets/nv14/touch_driver.cpp index 72234dd0d..07a81996e 100644 --- a/radio/src/targets/nv14/touch_driver.cpp +++ b/radio/src/targets/nv14/touch_driver.cpp @@ -473,7 +473,8 @@ void handleTouch() touchState.startY = touchState.y; touchState.event = TE_DOWN; if (g_eeGeneral.backlightMode & e_backlight_mode_keys) - backlightOn(); // TODO is that the best place ? + backlightEnable(BACKLIGHT_LEVEL_MAX); + // backlightOn(); // TODO is that the best place ? } else if (touchState.event == TE_DOWN) { if (dx >= SLIDE_RANGE || dx <= -SLIDE_RANGE || dy >= SLIDE_RANGE || dy <= -SLIDE_RANGE) { diff --git a/tools/build-gh.sh b/tools/build-gh.sh index 2ccc0f914..d97eff033 100755 --- a/tools/build-gh.sh +++ b/tools/build-gh.sh @@ -133,6 +133,9 @@ case $FLAVOR in TX16S_FS) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S -DFLYSKY_HALL_STICKS=ON" ;; + NV14) + BUILD_OPTIONS+="-DPCB=NV14" + ;; esac cmake ${BUILD_OPTIONS} "${SRCDIR}"