feat: support for HelloRadioSky V16 (#5317)

Co-authored-by: Peter Feerick <pfeerick@users.noreply.github.com>
This commit is contained in:
richardclli
2024-09-02 09:45:59 +10:00
committed by GitHub
co-authored by Peter Feerick
parent 4426f56cb9
commit 17bf9dc813
45 changed files with 1062 additions and 46 deletions
+1 -1
View File
@@ -368,7 +368,7 @@ void audioTask(void * pdata)
setSampleRate(AUDIO_SAMPLE_RATE);
#if defined(PCBX12S) || defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(PCBX12S) || defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
// The audio amp needs ~2s to start
RTOS_WAIT_MS(1000); // 1s
#endif
@@ -43,7 +43,11 @@ static StaticTimer_t rgbLedTimerBuffer;
void rgbSetLedColor(uint8_t led, uint8_t r, uint8_t g, uint8_t b)
{
#if defined(SIXPOS_SWITCH_INDEX)
ws2812_set_color(led + 6, r, g, b);
#else
ws2812_set_color(led, r, g, b);
#endif
}
void rgbLedColorApply()
+8
View File
@@ -65,6 +65,10 @@
#include "telemetry/crossfire.h"
#endif
#if defined(CSD203_SENSOR)
#include "csd203_sensor.h"
#endif
#if !defined(SIMU)
#include <malloc.h>
#endif
@@ -209,6 +213,10 @@ void timer_10ms()
}
#endif
#if defined(CSD203_SENSOR) && !defined(SIMU)
readCSD203();
#endif
telemetryInterrupt10ms();
// These moved here from evalFlightModeMixes() to improve beep trigger reliability.
+13
View File
@@ -29,6 +29,10 @@ const etx_hal_adc_inputs_t* _hal_adc_inputs = nullptr;
static uint16_t adcValues[MAX_ANALOG_INPUTS] __DMA;
#if defined(CSD203_SENSOR)
extern uint16_t getCSD203BatteryVoltage(void);
#endif
bool adcInit(const etx_hal_adc_driver_t* driver)
{
// If there is an init function, it MUST succeed
@@ -243,6 +247,11 @@ uint16_t getRTCBatteryVoltage()
uint16_t getAnalogValue(uint8_t index)
{
if (index >= MAX_ANALOG_INPUTS) return 0;
#if defined(SIXPOS_SWITCH_INDEX) && !defined(SIMU)
if (index == SIXPOS_SWITCH_INDEX)
return getSixPosAnalogValue(adcValues[index]);
else
#endif
return adcValues[index];
}
@@ -297,6 +306,9 @@ tmr10ms_t jitterResetTime = 0;
uint16_t getBatteryVoltage()
{
#if defined(CSD203_SENSOR) && !defined(SIMU)
return getCSD203BatteryVoltage() / 10;
#else
// using filtered ADC value on purpose
if (adcGetMaxInputs(ADC_INPUT_VBAT) < 1) return 0;
int32_t instant_vbat = anaIn(adcGetInputOffset(ADC_INPUT_VBAT));
@@ -321,6 +333,7 @@ uint16_t getBatteryVoltage()
return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration)) /
BATTERY_DIVIDER);
#endif
#endif
}
static uint32_t apply_low_pass_filter(uint32_t v, uint32_t v_prev,
+5 -1
View File
@@ -3213,7 +3213,11 @@ LROT_BEGIN(etxcst, NULL, 0)
LROT_NUMENTRY( PLAY_BACKGROUND, PLAY_BACKGROUND )
LROT_NUMENTRY( TIMEHOUR, TIMEHOUR )
#if defined(LED_STRIP_GPIO)
LROT_NUMENTRY( LED_STRIP_LENGTH, LED_STRIP_LENGTH )
#if defined(RADIO_V16)
LROT_NUMENTRY( LED_STRIP_LENGTH, LED_STRIP_LENGTH - 6)
#else
LROT_NUMENTRY( LED_STRIP_LENGTH, LED_STRIP_LENGTH )
#endif
#endif
LROT_NUMENTRY( UNIT_RAW, UNIT_RAW )
LROT_NUMENTRY( UNIT_VOLTS, UNIT_VOLTS )
@@ -82,22 +82,23 @@ static void _led_dbg_init() {
#endif
#if defined(STM32_SUPPORT_32BIT_TIMERS)
typedef uint32_t led_timer_value_t;
#else
typedef uint16_t led_timer_value_t;
#endif
uint8_t pulse_inc = 1;
// DMA buffer contains pulses for 2 LED at a time
// (allows for refill at HT and TC)
#if defined(STM32_SUPPORT_32BIT_TIMERS)
static led_timer_value_t _led_dma_buffer[WS2821_DMA_BUFFER_LEN * 2] __DMA;
#else
static led_timer_value_t _led_dma_buffer[WS2821_DMA_BUFFER_LEN] __DMA;
#endif
static uint8_t _led_seq_cnt;
static void _fill_byte(uint8_t c, led_timer_value_t* dma_buffer)
{
for (int i = 0; i < 8; i++) {
dma_buffer[i] = c & 0x80 ? WS2812_ONE : WS2812_ZERO;
dma_buffer[i*pulse_inc] = c & 0x80 ? WS2812_ONE : WS2812_ZERO;
c <<= 1;
}
}
@@ -106,14 +107,14 @@ static void _fill_pulses(const uint8_t* colors, led_timer_value_t* dma_buffer, u
{
for (uint32_t i = 0; i < len; i++) {
_fill_byte(*colors, dma_buffer);
dma_buffer += 8;
dma_buffer += 8 * pulse_inc;
colors++;
}
}
static inline uint32_t _calc_offset(uint8_t tc)
{
return tc * WS2821_DMA_BUFFER_HALF_LEN;
return tc * WS2821_DMA_BUFFER_HALF_LEN * pulse_inc;
}
static void _update_dma_buffer(const stm32_pulse_timer_t* tim, uint8_t tc)
@@ -131,7 +132,7 @@ static void _update_dma_buffer(const stm32_pulse_timer_t* tim, uint8_t tc)
// no need to reset the buffer after 2 cycles
if (_led_seq_cnt < _led_strip_len + 2) {
auto offset = _calc_offset(tc);
auto size = WS2821_DMA_BUFFER_HALF_LEN * sizeof(led_timer_value_t);
auto size = WS2821_DMA_BUFFER_HALF_LEN * sizeof(led_timer_value_t) * pulse_inc;
memset(&_led_dma_buffer[offset], 0, size);
}
_led_seq_cnt++;
@@ -191,7 +192,7 @@ static void _init_timer(const stm32_pulse_timer_t* tim)
_led_set_dma_periph_addr(tim);
LL_DMA_SetMode(tim->DMAx, tim->DMA_Stream, LL_DMA_MODE_CIRCULAR);
LL_DMA_SetDataLength(tim->DMAx, tim->DMA_Stream, WS2821_DMA_BUFFER_LEN);
LL_DMA_SetDataLength(tim->DMAx, tim->DMA_Stream, WS2821_DMA_BUFFER_LEN * pulse_inc);
LL_DMA_SetMemoryAddress(tim->DMAx, tim->DMA_Stream, (uint32_t)_led_dma_buffer);
// we need to use a higher prio to avoid having
@@ -202,6 +203,7 @@ static void _init_timer(const stm32_pulse_timer_t* tim)
void ws2812_init(const stm32_pulse_timer_t* timer, uint8_t strip_len, uint8_t type)
{
WS2812_DBG_INIT;
pulse_inc = IS_TIM_32B_COUNTER_INSTANCE(timer->TIMx) ? 2 : 1;
memset(_led_colors, 0, sizeof(_led_colors));
memset(_led_dma_buffer, 0, sizeof(_led_dma_buffer));
@@ -32,7 +32,7 @@
// Maximum number of supported LEDs
#if !defined(WS2812_MAX_LEDS)
# define WS2812_MAX_LEDS 8
# define WS2812_MAX_LEDS 48
#endif
// Number of LED periods used for trailing reset
+19 -1
View File
@@ -117,11 +117,25 @@ if (PCB STREQUAL X10)
set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module")
option(BLUETOOTH "Support for bluetooth module" OFF)
option(INTERNAL_GPS "Support for internal NMEA GPS" OFF)
set(DEFAULT_THEME "DARKBLUE")
add_definitions(-DMANUFACTURER_FATFISH)
set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS")
set(FLEXSW "2" CACHE STRING "Max flex inputs usable as switches")
set(VIDEO_SWITCH ON)
elseif (PCBREV STREQUAL V16)
set(FLAVOUR v16)
add_definitions(-DRADIO_V16)
add_definitions(-DRADIO_FAMILY_T16)
set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module")
option(BLUETOOTH "Support for bluetooth module" OFF)
option(INTERNAL_GPS "Support for internal NMEA GPS" OFF)
add_definitions(-DMANUFACTURER_HELLORADIOSKY)
set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS")
set(FLEXSW "2" CACHE STRING "Max flex inputs usable as switches")
set(AUX2_SERIAL OFF)
set(HAS_CSD203_SENSOR ON)
if (BLUETOOTH)
set(AUX_SERIAL OFF)
endif()
elseif (PCBREV STREQUAL T18)
set(FLAVOUR t18)
add_definitions(-DRADIO_T18)
@@ -331,6 +345,10 @@ if(USB_CHARGER)
target_sources(board PRIVATE ${TARGET_SRC_DIR}/usb_charger_driver.cpp)
endif()
if(HAS_CSD203_SENSOR)
set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} csd203_sensor.cpp)
add_definitions(-DCSD203_SENSOR)
endif()
set(FIRMWARE_SRC
${FIRMWARE_SRC}
targets/common/arm/loadboot.cpp
+70
View File
@@ -22,6 +22,7 @@
#include "stm32_hal.h"
#include "stm32_hal_ll.h"
#include "stm32_gpio.h"
#include "stm32_ws2812.h"
#include "hal/adc_driver.h"
#include "hal/trainer_driver.h"
@@ -34,6 +35,7 @@
#include "boards/generic_stm32/module_ports.h"
#include "boards/generic_stm32/intmodule_heartbeat.h"
#include "boards/generic_stm32/analog_inputs.h"
#include "boards/generic_stm32/rgb_leds.h"
#include "timers_driver.h"
#include "dataconstants.h"
@@ -48,6 +50,23 @@
#include "flysky_gimbal_driver.h"
#endif
#if defined(CSD203_SENSOR)
#include "csd203_sensor.h"
#endif
#if defined(LED_STRIP_GPIO)
// Common LED driver
extern const stm32_pulse_timer_t _led_timer;
void ledStripOff()
{
for (uint8_t i = 0; i < LED_STRIP_LENGTH; i++) {
ws2812_set_color(i, 0, 0, 0);
}
ws2812_update(&_led_timer);
}
#endif
HardwareOptions hardwareOptions;
bool boardBacklightOn = false;
@@ -63,6 +82,44 @@ void boardBLInit()
#if !defined(BOOT)
#include "edgetx.h"
#if defined(SIXPOS_SWITCH_INDEX)
uint8_t lastADCState = 0;
uint8_t sixPosState = 0;
bool dirty = true;
uint16_t getSixPosAnalogValue(uint16_t adcValue)
{
uint8_t currentADCState = 0;
if (adcValue > 3800)
currentADCState = 6;
else if (adcValue > 3100)
currentADCState = 5;
else if (adcValue > 2300)
currentADCState = 4;
else if (adcValue > 1500)
currentADCState = 3;
else if (adcValue > 1000)
currentADCState = 2;
else if (adcValue > 400)
currentADCState = 1;
if (lastADCState != currentADCState) {
lastADCState = currentADCState;
} else if (lastADCState != 0 && lastADCState - 1 != sixPosState) {
sixPosState = lastADCState - 1;
dirty = true;
}
if (dirty) {
for (uint8_t i = 0; i < 6; i++) {
if (i == sixPosState)
ws2812_set_color(i, SIXPOS_LED_RED, SIXPOS_LED_GREEN, SIXPOS_LED_BLUE);
else
ws2812_set_color(i, 0, 0, 0);
}
ws2812_update(&_led_timer);
}
return (4096/5)*(sixPosState);
}
#endif
void boardInit()
{
#if defined(RADIO_FAMILY_T16)
@@ -163,9 +220,22 @@ void boardInit()
timersInit();
#if defined(HARDWARE_TOUCH) && !defined(SIMU)
touchPanelInit();
#endif
#if defined(CSD203_SENSOR)
initCSD203();
#endif
usbInit();
hapticInit();
#if defined(LED_STRIP_GPIO)
ws2812_init(&_led_timer, LED_STRIP_LENGTH, WS2812_GRB);
ledStripOff();
#endif
#if defined(BLUETOOTH)
bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, true);
#endif
+7 -3
View File
@@ -145,7 +145,7 @@ enum {
#endif
// POTS and SLIDERS default configuration
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
#define XPOS_CALIB_DEFAULT {0x3, 0xc, 0x15, 0x1e, 0x26}
#endif
@@ -197,6 +197,10 @@ uint32_t pwrPressedDuration();
void usbChargerInit();
bool usbChargerLed();
#if defined(RADIO_V16)
uint16_t getSixPosAnalogValue(uint16_t adcValue);
#endif
// Led driver
void ledInit();
void ledOff();
@@ -288,7 +292,7 @@ void telemetryPortInvertedInit(uint32_t baudrate);
// Aux serial port driver
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
#define DEBUG_BAUDRATE 400000
#define LUA_DEFAULT_BAUDRATE 115200
#else
@@ -315,7 +319,7 @@ void bluetoothWriteWakeup();
uint8_t bluetoothIsWriting();
void bluetoothDisable();
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
#define BATTERY_DIVIDER 1495
#else
#define BATTERY_DIVIDER 1629
+410
View File
@@ -0,0 +1,410 @@
/*
* 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 "csd203_sensor.h"
#include <stdlib.h>
#include <string.h>
#include "debug.h"
#include "delays_driver.h"
#include "edgetx_types.h"
#include "hal.h"
#include "rtos.h"
#include "stm32_exti_driver.h"
#include "stm32_gpio_driver.h"
#include "stm32_hal.h"
#include "stm32_hal_ll.h"
#include "stm32_i2c_driver.h"
// clang-format off
/* CSD203 Regsistor map */
#define CONFIGURATION 0X00
/*Read Only*/
#define SHUNT_VOLTAGE 0X01
#define BUS_VOLTAGE 0X02
#define POWER 0X03
#define CURRENT 0x04
/*Read Only*/
#define CALIBRATION 0x05
#define MASKENABLE 0x06
#define ALERTLIMIT 0x07
#define ManufacturerID 0xFE //Manufacturer ID Register
#define DieID 0xFF //Die ID Register
#define ManIDCode 0x4153 //CHIP ID
/*Calibration Calculation parameter*/
/* This Parameter Gain*10000K*/
#define CalParam 51200
/* ↓ add your shunt here ↓ */
#define CSD_CONFIG_Rs_1mR 1
#define CSD_CONFIG_Rs_2mR 2
#define CSD_CONFIG_Rs_5mR 5
#define CSD_CONFIG_Rs_10mR 10
#define CSD_CONFIG_Rs_20mR 20
#define CSD_CONFIG_Rs_50mR 50
#define CSD_CONFIG_CurrentLsb1mA 10
#define CSD_CONFIG_CurrentLsb2mA 20
#define CSD_CONFIG_CurrentLsb5mA 50
#define CSD_CONFIG_CurrentLsb10mA 100
#define CSD_CONFIG_CurrentLsb20mA 200
/*Calibration Calculation parameter*/
/* CSD203 Regsistor Config*/
#define CSD_CONFIG_RST 1
#define CSD_CONFIG_UnRST 0
#define CSD_CONFIG_Avg1 0
#define CSD_CONFIG_Avg4 1
#define CSD_CONFIG_Avg16 2
#define CSD_CONFIG_Avg64 3
#define CSD_CONFIG_Avg128 4
#define CSD_CONFIG_Avg256 5
#define CSD_CONFIG_Avg512 6
#define CSD_CONFIG_Avg1024 7
#define CSD_CONFIG_VBUS_CT1_1mS 4
#define CSD_CONFIG_VShunt_CT1_1mS 4
#define CSD_CONFIG_ShuntBus_CON 7
#define CSD_CONFIG_ADDR_A1_GND_A0_GND 64
#define CSD_CONFIG_ADDR_A1_GND_VS_GND 65
#define CSD_CONFIG_ADDR_A1_GND_SDA_GND 66
#define CSD_CONFIG_ADDR_A1_GND_SCL_GND 67
#define CSD_CONFIG_ADDR_A1_VS_A0_GND 68
#define CSD_CONFIG_ADDR_A1_VS_A0_VS 69
#define CSD_CONFIG_ADDR_A1_VS_A0_SDA 70
#define CSD_CONFIG_ADDR_A1_VS_A0_SCL 71
#define CSD_CONFIG_ADDR_A1_SDA_A0_GND 72
#define CSD_CONFIG_ADDR_A1_SDA_A0_VS 73
#define CSD_CONFIG_ADDR_A1_SDA_A0_SDA 74
#define CSD_CONFIG_ADDR_A1_SDA_A0_SCL 75
#define CSD_CONFIG_ADDR_A1_SCL_A0_GND 76
#define CSD_CONFIG_ADDR_A1_SCL_A0_VS 77
#define CSD_CONFIG_ADDR_A1_SCL_A0_SDA 78
#define CSD_CONFIG_ADDR_A1_SCL_A0_SCL 79
/******************/
/*CSD Alert Option*/
/******************/
/*Vshunt Voltage Over Voltage*/
#define CSD_ALERT_VShunt_OVA_ON 1
#define CSD_ALERT_VShunt_OVA_OFF 0
/*Vshunt Voltage Under Voltage*/
#define CSD_ALERT_VShunt_UVA_ON 1
#define CSD_ALERT_VShunt_UVA_OFF 0
/*VBus Voltage Over Voltage*/
#define CSD_ALERT_VBUS_OVA_ON 1
#define CSD_ALERT_VBUS_OVA_OFF 0
/*VBus Voltage Under Voltage*/
#define CSD_ALERT_VBUS_UVA_ON 1
#define CSD_ALERT_VBUS_UVA_OFF 0
/* Power Over Limit */
#define CSD_ALERT_Power_Over_ON 1
#define CSD_ALERT_Power_Over_OFF 0
/* ADC Coversion Ready */
#define CSD_ALERT_CoversionReady_ON 1
#define CSD_ALERT_CoversionReady_OFF 0
#define CSD_ALERT_CNVR_FLAG_ON 1
#define CSD_ALERT_CNVR_FLAG_OFF 0
/* ALERT Function Flag and Alert latch Work Together */
#define CSD_ALERT_ALERT_FLAG_ON 1
#define CSD_ALERT_ALERT_FLAG_OFF 0
#define CSD_ALERT_ALERT_Latch_ON 1
#define CSD_ALERT_ALERT_Latch_OFF 0
/*Power over flow */
#define CSD_ALERT_OVF_ON 1
#define CSD_ALERT_OVF_OFF 0
/*Alert Pin */
#define CSD_ALERT_APOL_ActiveLow 1
#define CSD_ALERT_APOL_ActiveHigh 0
// clang-format on
/*CSD Basic Configuration struct*/
typedef struct {
uint8_t DeviceADDR;
uint8_t RST;
uint8_t Average;
uint8_t VBUS_Conv_Time;
uint8_t VShunt_Conv_Time;
uint8_t Mode;
uint16_t CurrentLSB;
uint16_t Rshunt;
} CSD_CONFIG;
/*CSD Basic Configuration struct*/
/*CSD ALERT Configuration struct*/
typedef struct {
uint8_t VShunt_OVA;
uint8_t VShuntUVA;
uint8_t VBUS_OVA;
uint8_t VBUS_UVA;
uint8_t Power_OVER_Limit;
uint8_t CNVR;
uint8_t ALERT_FLAG;
uint8_t CNVR_FLAG;
uint8_t OVF;
uint8_t APOL;
uint8_t ALERT_Latch;
} CSD_ALERT;
/*CSD ALERT Configuration struct*/
void CSD203_Init(CSD_CONFIG *CSD203_CFG); // Initialise CSD203 config
uint16_t CSD203_ReadVbus(CSD_CONFIG *CSD203_CFG); // Read Vbus Voltage
uint16_t CSD203_ReadRshunt(CSD_CONFIG *CSD203_CFG); // Read Rshunt
uint16_t CSD203_ReadPower(CSD_CONFIG *CSD203_CFG); // Read Power
uint16_t CSD203_ReadCurrent(CSD_CONFIG *CSD203_CFG); // Read Current
void IIC_DUT_W(uint8_t addr, uint8_t reg, uint16_t data);
uint16_t IIC_DUT_R(uint8_t addr, uint8_t reg);
bool CSD203MainInitFlag = false;
bool CSD203InInitFlag = false;
bool CSD203ExtInitFlag = false;
bool IICReadStatusFlag = false;
static uint16_t csd203extvbus = 0;
static CSD_CONFIG CSD203_MainSensorCFG;
static CSD_CONFIG CSD203_InSensorCFG;
static CSD_CONFIG CSD203_ExtSensorCFG;
bool I2C_CSD203_WriteRegister(uint8_t I2C_ADDR, uint8_t reg, uint8_t *buf,
uint8_t len)
{
uint8_t uAddrAndBuf[6];
uAddrAndBuf[0] = (uint8_t)(reg & 0x00FF);
if (len > 0) {
for (int i = 0; i < len; i++) {
uAddrAndBuf[i + 1] = buf[i];
}
}
if (stm32_i2c_master_tx(TOUCH_I2C_BUS, I2C_ADDR, uAddrAndBuf, len + 1, 100) <
0) {
TRACE("I2C B1 ERROR: WriteRegister failed");
return false;
}
return true;
}
bool I2C_CSD203_ReadRegister(uint8_t I2C_ADDR, uint8_t reg, uint8_t *buf,
uint8_t len)
{
uint8_t uRegAddr[2];
// uRegAddr[0] = (uint8_t)((reg & 0xFF00) >> 8);
uRegAddr[0] = (uint8_t)(reg & 0x00FF);
if (stm32_i2c_master_tx(TOUCH_I2C_BUS, I2C_ADDR, uRegAddr, 1, 100) < 0) {
TRACE("I2C B1 ERROR: ReadRegister write reg address failed");
return false;
}
if (stm32_i2c_master_rx(TOUCH_I2C_BUS, I2C_ADDR, buf, len, 100) < 0) {
TRACE("I2C B1 ERROR: ReadRegister read reg address failed");
return false;
}
return true;
}
void IIC_DUT_W(uint8_t addr, uint8_t reg, uint16_t data)
{
uint8_t buf[2];
buf[0] = data >> 8;
buf[1] = data & 0xff;
I2C_CSD203_WriteRegister(addr, reg, buf, 2);
}
uint16_t IIC_DUT_R(uint8_t addr, uint8_t reg)
{
uint8_t buf[2];
I2C_CSD203_ReadRegister(addr, reg, buf, 2);
return buf[0] << 8 | buf[1];
}
void CSD203_Init(CSD_CONFIG *CSD203_CFG)
{
uint16_t Data = 0, ADDR = 0;
Data |= (CSD203_CFG->RST) << 15;
Data |= (CSD203_CFG->Average) << 9;
Data |= (CSD203_CFG->VBUS_Conv_Time) << 5;
Data |= (CSD203_CFG->VShunt_Conv_Time) << 2;
Data |= CSD203_CFG->Mode;
ADDR = (CSD203_CFG->DeviceADDR);
IIC_DUT_W(ADDR, CONFIGURATION, Data);
Data = CalParam / ((CSD203_CFG->CurrentLSB) * (CSD203_CFG->Rshunt));
IIC_DUT_W(ADDR, CALIBRATION, Data);
}
/*Read Vbus*/
uint16_t CSD203_ReadVbus(CSD_CONFIG *CSD203_CFG)
{
uint16_t Data = 0, ADDR = 0;
ADDR = (CSD203_CFG->DeviceADDR);
Data = IIC_DUT_R(ADDR, BUS_VOLTAGE);
return Data;
}
/*Read Rshunt*/
uint16_t CSD203_ReadRshunt(CSD_CONFIG *CSD203_CFG)
{
uint16_t Data = 0, ADDR = 0;
ADDR = (CSD203_CFG->DeviceADDR);
Data = IIC_DUT_R(ADDR, SHUNT_VOLTAGE);
return Data;
}
/*Read Power*/
uint16_t CSD203_ReadPower(CSD_CONFIG *CSD203_CFG)
{
uint16_t Data = 0, ADDR = 0;
ADDR = (CSD203_CFG->DeviceADDR);
Data = IIC_DUT_R(ADDR, POWER);
return Data;
}
uint16_t CSD203_ReadCurrent(CSD_CONFIG *CSD203_CFG)
{
uint16_t Data = 0, ADDR = 0;
ADDR = (CSD203_CFG->DeviceADDR);
Data = IIC_DUT_R(ADDR, CURRENT);
return Data;
}
uint16_t CSD203_ReadCONFIGURATION(CSD_CONFIG *CSD203_CFG)
{
uint16_t Data = 0, ADDR = 0;
ADDR = (CSD203_CFG->DeviceADDR);
Data = IIC_DUT_R(ADDR, CONFIGURATION);
return Data;
}
uint16_t CSD203_ReadManufacturerID(CSD_CONFIG *CSD203_CFG)
{
uint16_t Data = 0, ADDR = 0;
ADDR = (CSD203_CFG->DeviceADDR);
Data = IIC_DUT_R(ADDR, ManufacturerID);
return Data;
}
void initCSD203(void)
{
CSD203MainInitFlag = false;
CSD203InInitFlag = false;
CSD203ExtInitFlag = false;
// TRACE("202 test ..."); //A0=CLK A1=SDA RadioSky
CSD203_MainSensorCFG.RST = CSD_CONFIG_RST;
CSD203_MainSensorCFG.Average = CSD_CONFIG_Avg16;
CSD203_MainSensorCFG.VBUS_Conv_Time = CSD_CONFIG_VBUS_CT1_1mS;
CSD203_MainSensorCFG.VShunt_Conv_Time = CSD_CONFIG_VShunt_CT1_1mS;
CSD203_MainSensorCFG.Rshunt = CSD_CONFIG_Rs_10mR;
CSD203_MainSensorCFG.CurrentLSB = CSD_CONFIG_CurrentLsb1mA;
CSD203_MainSensorCFG.Mode = 7;
CSD203_MainSensorCFG.DeviceADDR = CSD_CONFIG_ADDR_A1_VS_A0_GND; // 100 0100
// CSD203_MainSensorCFG.DeviceADDR=CSD_CONFIG_ADDR_A1_GND_A0_GND;
CSD203_InSensorCFG.RST = CSD_CONFIG_RST;
CSD203_InSensorCFG.Average = CSD_CONFIG_Avg16;
CSD203_InSensorCFG.VBUS_Conv_Time = CSD_CONFIG_VBUS_CT1_1mS;
CSD203_InSensorCFG.VShunt_Conv_Time = CSD_CONFIG_VShunt_CT1_1mS;
CSD203_InSensorCFG.Rshunt = CSD_CONFIG_Rs_10mR;
CSD203_InSensorCFG.CurrentLSB = CSD_CONFIG_CurrentLsb1mA;
CSD203_InSensorCFG.Mode = 7;
CSD203_InSensorCFG.DeviceADDR = CSD_CONFIG_ADDR_A1_VS_A0_VS; // 100 0101
// CSD203_InSensorCFG.DeviceADDR=CSD_CONFIG_ADDR_A1_GND_A0_GND;
CSD203_ExtSensorCFG.RST = CSD_CONFIG_RST;
CSD203_ExtSensorCFG.Average = CSD_CONFIG_Avg16;
CSD203_ExtSensorCFG.VBUS_Conv_Time = CSD_CONFIG_VBUS_CT1_1mS;
CSD203_ExtSensorCFG.VShunt_Conv_Time = CSD_CONFIG_VShunt_CT1_1mS;
CSD203_ExtSensorCFG.Rshunt = CSD_CONFIG_Rs_10mR;
CSD203_ExtSensorCFG.CurrentLSB = CSD_CONFIG_CurrentLsb1mA;
CSD203_ExtSensorCFG.Mode = 7;
CSD203_ExtSensorCFG.DeviceADDR = CSD_CONFIG_ADDR_A1_GND_VS_GND; // 100 0001
// CSD203_ExtSensorCFG.DeviceADDR=CSD_CONFIG_ADDR_A1_GND_A0_GND;
CSD203_Init(&CSD203_MainSensorCFG);
delay_ms(1);
uint16_t cfg = CSD203_ReadManufacturerID(&CSD203_MainSensorCFG);
if (cfg == ManIDCode) {
CSD203_ReadCurrent(&CSD203_MainSensorCFG);
CSD203MainInitFlag = true;
}
delay_ms(5);
CSD203_Init(&CSD203_InSensorCFG);
delay_ms(1);
cfg = CSD203_ReadManufacturerID(&CSD203_InSensorCFG);
if (cfg == ManIDCode) {
CSD203_ReadCurrent(&CSD203_InSensorCFG);
CSD203InInitFlag = true;
}
delay_ms(5);
CSD203_Init(&CSD203_ExtSensorCFG);
delay_ms(1);
cfg = CSD203_ReadManufacturerID(&CSD203_ExtSensorCFG);
if (cfg == ManIDCode) {
CSD203_ReadCurrent(&CSD203_ExtSensorCFG);
CSD203ExtInitFlag = true;
}
}
uint16_t getCSD203BatteryVoltage(void)
{ // 1000=1000mV
return csd203extvbus;
}
void readCSD203(void)
{ // 5ms
static uint16_t GetSenSorStep = 0;
if (IICReadStatusFlag == true) return;
IICReadStatusFlag = true;
if (GetSenSorStep == 0 && CSD203MainInitFlag == true) {
CSD203_ReadCurrent(&CSD203_MainSensorCFG);
CSD203_ReadVbus(&CSD203_MainSensorCFG);
} else if (GetSenSorStep == 1 && CSD203InInitFlag == true) {
CSD203_ReadCurrent(&CSD203_InSensorCFG);
CSD203_ReadVbus(&CSD203_InSensorCFG);
} else if (GetSenSorStep == 2 && CSD203ExtInitFlag == true) {
CSD203_ReadCurrent(&CSD203_ExtSensorCFG);
csd203extvbus = (CSD203_ReadVbus(&CSD203_ExtSensorCFG) * 1.25);
// TRACE("Vbat=%d\r",csd203extvbus);
}
IICReadStatusFlag = false;
if (++GetSenSorStep >= 3) GetSenSorStep = 0;
}
+25
View File
@@ -0,0 +1,25 @@
/*
* 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
void initCSD203(void);
void readCSD203(void);
+166 -27
View File
@@ -45,7 +45,7 @@
#define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_6 // PI.06
#define KEYS_GPIO_REG_TELE GPIOC
#define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_4 // PC.04
#elif defined(RADIO_TX16S) || defined(RADIO_F16)
#elif defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
#define KEYS_GPIO_REG_ENTER GPIOI
#define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_8 // PI.08
#define KEYS_GPIO_REG_PAGEUP GPIOC
@@ -265,6 +265,14 @@
#endif
#endif
// 6POS SW
#if defined(RADIO_V16)
#define SIXPOS_SWITCH_INDEX 5
#define SIXPOS_LED_RED 255
#define SIXPOS_LED_GREEN 255
#define SIXPOS_LED_BLUE 255
#endif
// Trims
#if defined(RADIO_T15)
#define TRIMS_GPIO_REG_LHL GPIOD
@@ -309,7 +317,7 @@
#define TRIMS_GPIO_REG_LSU GPIOB
#define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_13 // PB.13
#elif defined(PCBX10)
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
#define TRIMS_GPIO_REG_LHL GPIOA
#define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_6 // PA.06
#define TRIMS_GPIO_REG_LHR GPIOC
@@ -392,6 +400,55 @@
#define ADC_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler
#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES
#define ADC_VREF_PREC2 600
#elif defined(RADIO_V16)
#define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_0 // PA.00
#define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_1 // PA.01
#define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_3 // PA.03
#define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_2 // PA.02
#define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_2 // PC.00 // ADC123_IN10 -> ADC3_IN10
#define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_1 // PC.02 // ADC123_IN12 -> ADC3_IN12
#define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_0 // PC.01 // ADC123_IN11 -> ADC3_IN11
#define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_5 // PA.05
#define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_3 // PC.03
#define ADC_GPIO_PIN_BATT LL_GPIO_PIN_7 // PF.07
#define ADC_GPIO_PIN_EXT1 LL_GPIO_PIN_8 // PF.08
#define ADC_GPIO_PIN_EXT2 LL_GPIO_PIN_9 // PF.09
#define ADC_GPIO_PIN_EXT3 ADC_GPIO_PIN_STICK_RH
#define ADC_GPIO_PIN_EXT4 ADC_GPIO_PIN_STICK_RV
#define ADC_GPIOA_PINS_FS (LL_GPIO_PIN_2 | LL_GPIO_PIN_3)
#define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_SLIDER1)
#define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_SLIDER2)
#define ADC_GPIOF_PINS (ADC_GPIO_PIN_EXT1 | ADC_GPIO_PIN_EXT2)
#define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_0 // ADC123_IN0 -> ADC3_IN0
#define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_1 // ADC123_IN1 -> ADC3_IN1
#define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_2 // ADC123_IN2 -> ADC3_IN2
#define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_3 // ADC123_IN3 -> ADC3_IN3
#define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_12 // ADC123_IN10 -> ADC3_IN10
#define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_11 // ADC123_IN12 -> ADC3_IN12
#define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_10 // ADC123_IN11 -> ADC3_IN11
#define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_5 // ADC12_IN5 -> ADC1_IN5
#define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_13 // ADC123_IN13 -> ADC1_IN13
#define ADC_CHANNEL_EXT1 LL_ADC_CHANNEL_6 // ADC3_IN6 -> ADC3_IN6
#define ADC_CHANNEL_EXT2 LL_ADC_CHANNEL_7 // ADC3_IN7 -> ADC3_IN7
#define ADC_CHANNEL_EXT3 LL_ADC_CHANNEL_2 // ADC3_IN2: same as RH
#define ADC_CHANNEL_EXT4 LL_ADC_CHANNEL_3 // ADC3_IN3: same as RV
#define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC1_IN18
#define ADC_MAIN ADC3
#define ADC_EXT ADC1
#define ADC_EXT_CHANNELS { ADC_CHANNEL_SLIDER1, ADC_CHANNEL_SLIDER2, ADC_CHANNEL_RTC_BAT }
#define ADC_EXT_DMA DMA2
#define ADC_EXT_DMA_CHANNEL LL_DMA_CHANNEL_0
#define ADC_EXT_DMA_STREAM LL_DMA_STREAM_4
#define ADC_EXT_DMA_STREAM_IRQ DMA2_Stream4_IRQn
#define ADC_EXT_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler
#define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES
#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES
#define ADC_DMA DMA2
#define ADC_DMA_CHANNEL LL_DMA_CHANNEL_2
#define ADC_DMA_STREAM LL_DMA_STREAM_0
#define ADC_DMA_STREAM_IRQ DMA2_Stream0_IRQn
#define ADC_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler
#define ADC_VREF_PREC2 660
#elif defined(PCBX10)
#if defined(RADIO_T15)
#define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_1 // PA.01
@@ -422,7 +479,7 @@
#define ADC_GPIO_PIN_EXT3 ADC_GPIO_PIN_STICK_RH
#define ADC_GPIO_PIN_EXT4 ADC_GPIO_PIN_STICK_RV
#endif
#if !(defined(RADIO_TX16S) || defined(RADIO_F16)) && !defined(RADIO_T15)
#if !(defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_T15) || defined(RADIO_V16))
#define PWM_STICKS
#define PWM_TIMER TIM5
#define PWM_GPIO GPIOA
@@ -470,7 +527,17 @@
#define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC1_IN18
#define ADC_MAIN ADC3
#define ADC_EXT ADC1
#define ADC_EXT_CHANNELS { ADC_CHANNEL_RTC_BAT }
#if defined(RADIO_V16)
#define ADC_EXT_CHANNELS { ADC_CHANNEL_SLIDER1, ADC_CHANNEL_SLIDER2, ADC_CHANNEL_RTC_BAT }
// Required DMA for more than one channel for EXT_ADC
#define ADC_EXT_DMA DMA2
#define ADC_EXT_DMA_CHANNEL LL_DMA_CHANNEL_0
#define ADC_EXT_DMA_STREAM LL_DMA_STREAM_4
#define ADC_EXT_DMA_STREAM_IRQ DMA2_Stream4_IRQn
#define ADC_EXT_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler
#else
#define ADC_EXT_CHANNELS { ADC_CHANNEL_RTC_BAT }
#endif
#define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES
#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES
#define ADC_DMA DMA2
@@ -480,7 +547,7 @@
#define ADC_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler
// VBat divider is /4 on F42x and F43x devices
#if defined(RADIO_TX16S) || defined(RADIO_T15) || defined(RADIO_F16)
#if defined(RADIO_TX16S) || defined(RADIO_T15) || defined(RADIO_F16) || defined(RADIO_V16)
#define ADC_VREF_PREC2 660
#elif defined(RADIO_T16) || defined(RADIO_T18)
#define ADC_VREF_PREC2 600
@@ -497,6 +564,8 @@
#define ADC_DIRECTION {1,-1,1,-1, -1,1,-1, -1,1,1,1, -1,1 }
#elif defined(RADIO_TX16S) || defined(RADIO_F16)
#define ADC_DIRECTION {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 }
#elif defined(RADIO_V16)
#define ADC_DIRECTION {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 }
#elif defined(PCBX10)
#define ADC_DIRECTION {1,-1,1,-1, -1,1,-1, 1,-1,1,1, 1,-1 }
#elif defined(PCBX12S)
@@ -511,6 +580,9 @@
#define PWR_ON_GPIO GPIO_PIN(GPIOJ, 1) // PJ.01
#define PWR_SWITCH_GPIO GPIO_PIN(GPIOJ, 0) // PJ.00
#define PWR_EXTRA_SWITCH_GPIO GPIO_PIN(GPIOB, 0) // PB.00
#elif defined(RADIO_V16)
#define PWR_ON_GPIO GPIO_PIN(GPIOB, 2) // PB.02
#define PWR_SWITCH_GPIO GPIO_PIN(GPIOJ, 0) // PJ.00
#else
#define PWR_ON_GPIO GPIO_PIN(GPIOJ, 1) // PJ.01
#define PWR_SWITCH_GPIO GPIO_PIN(GPIOJ, 0) // PJ.00
@@ -574,19 +646,34 @@
// Serial Port (DEBUG)
#if defined(AUX_SERIAL)
#define AUX_SERIAL_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10
#define AUX_SERIAL_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define AUX_SERIAL_USART USART3
#define AUX_SERIAL_USART_IRQHandler USART3_IRQHandler
#define AUX_SERIAL_USART_IRQn USART3_IRQn
#define AUX_SERIAL_DMA_TX DMA1
#define AUX_SERIAL_DMA_TX_STREAM LL_DMA_STREAM_3
#define AUX_SERIAL_DMA_TX_CHANNEL LL_DMA_CHANNEL_4
#define AUX_SERIAL_DMA_RX DMA1
#define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_1
#define AUX_SERIAL_DMA_RX_CHANNEL LL_DMA_CHANNEL_4
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(RADIO_V16)
#define AUX_SERIAL_TX_GPIO GPIO_PIN(GPIOG, 14) // PG.14
#define AUX_SERIAL_RX_GPIO GPIO_PIN(GPIOG, 9) // PG.09
#define AUX_SERIAL_USART USART6
#define AUX_SERIAL_USART_IRQHandler USART6_IRQHandler
#define AUX_SERIAL_USART_IRQn USART6_IRQn
#define AUX_SERIAL_DMA_TX DMA2
#define AUX_SERIAL_DMA_TX_STREAM LL_DMA_STREAM_7
#define AUX_SERIAL_DMA_TX_CHANNEL LL_DMA_CHANNEL_5
#define AUX_SERIAL_DMA_RX DMA2
#define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_2
#define AUX_SERIAL_DMA_RX_CHANNEL LL_DMA_CHANNEL_5
#define AUX_SERIAL_PWR_GPIO GPIO_PIN(GPIOA, 15) // PA.15
#else
#define AUX_SERIAL_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10
#define AUX_SERIAL_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define AUX_SERIAL_USART USART3
#define AUX_SERIAL_USART_IRQHandler USART3_IRQHandler
#define AUX_SERIAL_USART_IRQn USART3_IRQn
#define AUX_SERIAL_DMA_TX DMA1
#define AUX_SERIAL_DMA_TX_STREAM LL_DMA_STREAM_3
#define AUX_SERIAL_DMA_TX_CHANNEL LL_DMA_CHANNEL_4
#define AUX_SERIAL_DMA_RX DMA1
#define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_1
#define AUX_SERIAL_DMA_RX_CHANNEL LL_DMA_CHANNEL_4
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#define AUX_SERIAL_PWR_GPIO GPIO_PIN(GPIOA, 15) // PA.15
#endif
#endif
#endif
@@ -615,6 +702,24 @@
#endif
// Telemetry
#if defined(RADIO_V16)
#define TELEMETRY_RX_REV_GPIO GPIO_PIN(GPIOH, 7) // PH.07
#define TELEMETRY_TX_REV_GPIO GPIO_PIN(GPIOH, 7) // PH.07
#define TELEMETRY_DIR_GPIO GPIO_PIN(GPIOD, 4) // PD.04
#define TELEMETRY_SET_INPUT 0
#define TELEMETRY_GPIO GPIOD
#define TELEMETRY_TX_GPIO GPIO_PIN(GPIOD, 5) // PD.05
#define TELEMETRY_RX_GPIO GPIO_PIN(GPIOD, 6) // PD.06
#define TELEMETRY_USART USART2
#define TELEMETRY_DMA DMA1
#define TELEMETRY_DMA_Stream_TX LL_DMA_STREAM_6
#define TELEMETRY_DMA_Channel_TX LL_DMA_CHANNEL_4
#define TELEMETRY_DMA_TX_Stream_IRQ DMA1_Stream6_IRQn
#define TELEMETRY_DMA_TX_IRQHandler DMA1_Stream6_IRQHandler
#define TELEMETRY_DMA_TX_FLAG_TC DMA_IT_TCIF6
#define TELEMETRY_USART_IRQHandler USART2_IRQHandler
#define TELEMETRY_USART_IRQn USART2_IRQn
#else
#define TELEMETRY_DIR_GPIO GPIO_PIN(GPIOD, 4) // PD.04
#define TELEMETRY_SET_INPUT 0
#define TELEMETRY_GPIO GPIOD
@@ -648,6 +753,7 @@
#define TELEMETRY_TIMER TIM11
#define TELEMETRY_TIMER_IRQn TIM1_TRG_COM_TIM11_IRQn
#define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler
#endif
// Software IRQ (Prio 5 -> FreeRTOS compatible)
#define TELEMETRY_RX_FRAME_EXTI_LINE LL_EXTI_LINE_4
@@ -677,7 +783,7 @@
#elif defined(PCBX10)
#define LCD_GPIO_NRST GPIO_PIN(GPIOI, 10) // PI.10
#endif
#if defined(PCBX10) && !defined(RADIO_T18)
#if defined(PCBX10) && !defined(RADIO_T18) && !defined(RADIO_V16)
#define LCD_VERTICAL_INVERT
#endif
#define LTDC_IRQ_PRIO 4
@@ -810,7 +916,7 @@
#endif
#if defined(RADIO_FAMILY_T16)
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
#define AUDIO_UNMUTE_DELAY 150 // ms
#else
#define AUDIO_UNMUTE_DELAY 120 // ms
@@ -843,7 +949,7 @@
#endif // HARDWARE_TOUCH
// First I2C Bus
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(PCBX12S) || defined(RADIO_T15)
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(PCBX12S) || defined(RADIO_T15) || defined(RADIO_V16)
#define I2C_B1 I2C1
#define I2C_B1_SCL_GPIO GPIO_PIN(GPIOB, 8) // PB.08
#define I2C_B1_SDA_GPIO GPIO_PIN(GPIOB, 9) // PB.09
@@ -864,7 +970,7 @@
#define I2C_B2_SDA_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define I2C_B2_GPIO_AF LL_GPIO_AF_4 // I2C2
#define I2C_B2_CLK_RATE 400000
#if defined(RADIO_TX16S) || defined(RADIO_F16)
#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(RADIO_V16)
#define I2C_B2_PWR_GPIO GPIO_PIN(GPIOA, 15) // PA.15
#endif
#endif
@@ -913,6 +1019,22 @@
// #define FLYSKY_HALL_DMA_Stream_TX LL_DMA_STREAM_4
#endif
#if defined(RADIO_V16)
// LED Strip
#define LED_STRIP_LENGTH 40
#define LED_STRIP_GPIO GPIO_PIN(GPIOA, 10) // PA.10 / TIM1_CH3
#define LED_STRIP_GPIO_AF LL_GPIO_AF_1 // TIM1/2
#define LED_STRIP_TIMER TIM1
#define LED_STRIP_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define LED_STRIP_TIMER_CHANNEL LL_TIM_CHANNEL_CH3
#define LED_STRIP_TIMER_DMA DMA2
#define LED_STRIP_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_6
#define LED_STRIP_TIMER_DMA_STREAM LL_DMA_STREAM_5
#define LED_STRIP_TIMER_DMA_IRQn DMA2_Stream5_IRQn
#define LED_STRIP_TIMER_DMA_IRQHandler DMA2_Stream5_IRQHandler
#define LED_STRIP_REFRESH_PERIOD 50 //ms
#endif
// Internal PXX1 Module:
// -> let's assume all internal XJT modules used are either X10 or X12S type
#define EXTERNAL_ANTENNA
@@ -932,15 +1054,21 @@
#define INTMODULE_RX_DMA_CHANNEL LL_DMA_CHANNEL_4
#if defined(PCBX12S)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOC, 2) // PC.02
#elif defined(RADIO_V16)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOB, 0) // PB.00
#elif defined(PCBX10)
#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOI, 9) // PI.09
#endif
#define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
#if defined(RADIO_V16)
#define INTMODULE_BOOTCMD_DEFAULT 1 // RESET
#else
#define INTMODULE_BOOTCMD_DEFAULT 0 // RESET
#endif
// External Module
#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOB, 3) // PB.03
#define EXTERNAL_MODULE_PWR_OFF() gpio_clear(EXTMODULE_PWR_GPIO)
#if defined(PCBX10) && defined(PCBREV_EXPRESS)
#if (defined(PCBX10) && defined(PCBREV_EXPRESS)) || defined(RADIO_V16)
#define EXTMODULE_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10 (TIM2_CH3)
#define EXTMODULE_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF1
@@ -964,6 +1092,10 @@
#define EXTMODULE_USART_TX_DMA_STREAM LL_DMA_STREAM_3
#define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMA_CHANNEL_4
#define EXTMODULE_USART_RX_DMA_STREAM LL_DMA_STREAM_1
#if defined(RADIO_V16)
#define EXTMODULE_TX_INVERT_GPIO GPIO_PIN(GPIOI, 2) // PI.02
#define EXTMODULE_RX_INVERT_GPIO GPIO_PIN(GPIOI, 9) // PI.09
#endif
#elif defined(PCBX10) || PCBREV >= 13
#define EXTMODULE_TX_GPIO GPIO_PIN(GPIOA, 10) // PA.10 (TIM1_CH3)
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF1
@@ -995,10 +1127,17 @@
// Heartbeat
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_GPIO GPIO_PIN(GPIOD, 12) // PD.12 / TIM4_CH1
#define INTMODULE_HEARTBEAT_EXTI_PORT LL_SYSCFG_EXTI_PORTH
#define INTMODULE_HEARTBEAT_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE12
#define INTMODULE_HEARTBEAT_EXTI_LINE LL_EXTI_LINE_12
#if defined(RADIO_V16)
#define INTMODULE_HEARTBEAT_GPIO GPIO_PIN(GPIOB, 11) // PB.11 / TIM2_CH4
#define INTMODULE_HEARTBEAT_EXTI_PORT LL_SYSCFG_EXTI_PORTB
#define INTMODULE_HEARTBEAT_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE11
#define INTMODULE_HEARTBEAT_EXTI_LINE LL_EXTI_LINE_11
#else
#define INTMODULE_HEARTBEAT_GPIO GPIO_PIN(GPIOD, 12) // PD.12 / TIM4_CH1
#define INTMODULE_HEARTBEAT_EXTI_PORT LL_SYSCFG_EXTI_PORTH
#define INTMODULE_HEARTBEAT_EXTI_SYS_LINE LL_SYSCFG_EXTI_LINE12
#define INTMODULE_HEARTBEAT_EXTI_LINE LL_EXTI_LINE_12
#endif
// INTMODULE_HEARTBEAT_EXTI IRQ
#if !defined(USE_EXTI15_10_IRQ)
#define USE_EXTI15_10_IRQ
+4
View File
@@ -49,4 +49,8 @@
#define USB_NAME "FrSky X10"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'X', '1', '0', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */
#elif defined(RADIO_V16)
#define USB_NAME "HelloRadioSky V16"
#define USB_MANUFACTURER 'H', 'R', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'V', '1', '6', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */
#endif