diff --git a/mLRS/Common/hal/esp/esp-device_conf.h b/mLRS/Common/hal/esp/esp-device_conf.h index 996b73503..603cb06a5 100644 --- a/mLRS/Common/hal/esp/esp-device_conf.h +++ b/mLRS/Common/hal/esp/esp-device_conf.h @@ -312,3 +312,10 @@ #define DEVICE_HAS_SX128x #define FREQUENCY_BAND_2P4_GHZ #endif + +#ifdef TX_ELRS_SENDUWING_INTERNAL_2400_ESP32 + #define DEVICE_NAME "SW Int 2.4G" + #define DEVICE_IS_TRANSMITTER + #define DEVICE_HAS_SX128x + #define FREQUENCY_BAND_2P4_GHZ +#endif diff --git a/mLRS/Common/hal/esp/esp-hal.h b/mLRS/Common/hal/esp/esp-hal.h index 7080df900..2c421eab9 100644 --- a/mLRS/Common/hal/esp/esp-hal.h +++ b/mLRS/Common/hal/esp/esp-hal.h @@ -170,3 +170,6 @@ #include "tx-hal-flysky-int-pa01-2400-esp32s3.h" #endif +#ifdef TX_ELRS_SENDUWING_INTERNAL_2400_ESP32 +#include "tx-hal-senduwing-int-2400-esp32.h" +#endif diff --git a/mLRS/Common/hal/esp/tx-hal-senduwing-int-2400-esp32.h b/mLRS/Common/hal/esp/tx-hal-senduwing-int-2400-esp32.h new file mode 100644 index 000000000..dda653778 --- /dev/null +++ b/mLRS/Common/hal/esp/tx-hal-senduwing-int-2400-esp32.h @@ -0,0 +1,173 @@ +//******************************************************* +// Copyright (c) MLRS project +// GPL3 +// https://www.gnu.org/licenses/gpl-3.0.de.html +//******************************************************* +// hal +//******************************************************* + +/* + Flashing ESP8285 backpack WiFi bridge: + - Board: Generic ESP8266 Module, define LED_IO 16 + - First flash can be via web browser/ELRS WiFi + - Need ELRS version of esptool from https://github.com/ExpressLRS/Backpack + - Power up radio, plug in USB, select VCP + - On Linux, run something like "Backpack/python/external/esptool/esptool.py --passthrough --port /dev/ttyACM0 --baud 115200 --before etx --after hard_reset write_flash 0x0000 ~/Arduino/build/mlrs-wireless-bridge-esp8266.ino.bin + + Flashing ESP32 module: + - Need ELRS python folder from https://github.com/ExpressLRS/ExpressLRS + - Power up radio, plug in USB, select VCP + - On Linux, run something like "python ExpressLRS/src/python/ETXinitPassthrough.py" + - Use Visual Studio Code or esptool (or maybe web flasher?) to flash via ACM serial port. + + Set the Internal RF to CRSF 400k baud in SYS->HARDWARE on EdgeTx radio +*/ + +//------------------------------------------------------- +// ESP32, SenduWing Tx, Internal SX1280 2400, for H17 +//------------------------------------------------------- + +#define DEVICE_HAS_JRPIN5 +#define DEVICE_HAS_SINGLE_LED +#define DEVICE_HAS_NO_SERIAL +#define DEVICE_HAS_NO_COM +#define DEVICE_HAS_ESP_WIFI_BRIDGE_ESP8266 +#define DEVICE_HAS_ESP_WIFI_BRIDGE_CONFIGURE +#define DEVICE_HAS_ESP_WIFI_BRIDGE_W_PASSTHRU_VIA_JRPIN5 +#define DEVICE_HAS_NO_DEBUG + + +//-- UARTS +// UARTB = serial port +// UARTC (or USB) = com (CLI) port +// UARTD = serial2 port or wireless bridge port +// UART = JR bay pin5, full duplex CRSF serial connection to radio - code still calls it JR bay pin5 +// UARTE = in port, SBus or whatever +// UARTF or SWUART = debug port + +#define UARTD_USE_SERIAL // serial2 or wireless bridge +#define UARTD_BAUD TX_SERIAL_BAUDRATE +#define UARTD_USE_TX_IO IO_P22 +#define UARTD_USE_RX_IO IO_P21 +#define UARTD_TXBUFSIZE TX_SERIAL_TXBUFSIZE +#define UARTD_RXBUFSIZE TX_SERIAL_RXBUFSIZE + +#define UART_USE_SERIAL1 // full duplex CRSF/MBridge (JR pin5) +#define UART_BAUD 400000 +#define UART_USE_TX_IO IO_P1 +#define UART_USE_RX_IO IO_P3 +#define UART_TXBUFSIZE 0 // TX_SERIAL_TXBUFSIZE +#define UART_RXBUFSIZE 0 // TX_SERIAL_RXBUFSIZE // 512 + +#define JR_PIN5_FULL_DUPLEX // internal module + +#define UARTF_USE_SERIAL2 // debug +#define UARTF_BAUD 115200 +#define UARTF_USE_TX_IO -1 // Or choose another unused pin/test pad +#define UARTF_USE_RX_IO -1 +#define UARTF_TXBUFSIZE 512 + + +//-- SX1: SX12xx & SPI + +#define SPI_CS_IO IO_P25 +#define SPI_MISO IO_P14 +#define SPI_MOSI IO_P27 +#define SPI_SCK IO_P26 +#define SPI_FREQUENCY 18000000L +#define SX_RESET IO_P4 +#define SX_DIO IO_P13 +#define SX_BUSY IO_P15 +#define SX_TX_EN IO_P32 +#define SX_RX_EN IO_P33 + +IRQHANDLER(void SX_DIO_EXTI_IRQHandler(void);) + +void sx_init_gpio(void) +{ + gpio_init(SX_RESET, IO_MODE_OUTPUT_PP_HIGH); + gpio_init(SX_DIO, IO_MODE_INPUT_ANALOG); + gpio_init(SX_BUSY, IO_MODE_INPUT_PU); + gpio_init(SX_TX_EN, IO_MODE_OUTPUT_PP_LOW); + gpio_init(SX_RX_EN, IO_MODE_OUTPUT_PP_LOW); +} + +IRAM_ATTR bool sx_busy_read(void) { return (gpio_read_activehigh(SX_BUSY)) ? true : false; } + +IRAM_ATTR void sx_amp_transmit(void) +{ + gpio_low(SX_RX_EN); + gpio_high(SX_TX_EN); +} + +IRAM_ATTR void sx_amp_receive(void) +{ + gpio_low(SX_TX_EN); + gpio_high(SX_RX_EN); +} + +void sx_dio_enable_exti_isr(void) { attachInterrupt(SX_DIO, SX_DIO_EXTI_IRQHandler, RISING); } +void sx_dio_init_exti_isroff(void) { detachInterrupt(SX_DIO); } +IRAM_ATTR void sx_dio_exti_isr_clearflag(void) {} + + +//-- Button + +void button_init(void) {} +IRAM_ATTR bool button_pressed(void) { return false; } + + +//-- LEDs + +//#define LED_RED -1 + +void leds_init(void) +{ + //gpio_init(LED_RED, IO_MODE_OUTPUT_PP_HIGH); +} + +IRAM_ATTR void led_red_off(void) { } +IRAM_ATTR void led_red_on(void) { } +IRAM_ATTR void led_red_toggle(void) { } + + +//-- ESP32 Wifi Bridge + +#define ESP_RESET IO_P20 // backpack_en +#define ESP_GPIO0 IO_P19 // backpack_boot inverted? +#define ESP_BOOTPIN IO_P0 // will always be IO_P0 + +uint8_t esp_bootpin() +{ + return gpio_read_activelow(ESP_BOOTPIN); +} + +void esp_init(void) +{ + // no need to configure ESP_BOOTPIN which will always be IO_P0 and is pull-up by default + gpio_init(ESP_GPIO0, IO_MODE_OUTPUT_PP_LOW); // high -> esp will start in bootloader mode + gpio_init(ESP_RESET, IO_MODE_OUTPUT_PP_LOW); // low -> esp is in reset +} + +IRAM_ATTR void esp_reset_high(void) { gpio_high(ESP_RESET); } +IRAM_ATTR void esp_reset_low(void) { gpio_low(ESP_RESET); } + +IRAM_ATTR void esp_gpio0_high(void) { gpio_low(ESP_GPIO0); } +IRAM_ATTR void esp_gpio0_low(void) { gpio_high(ESP_GPIO0); } + + +//-- POWER +// Need to confirm all of this! + +#define POWER_GAIN_DBM 26 // gain of a PA stage if present +#define POWER_SX1280_MAX SX1280_POWER_0_DBM // maximum allowed sx power +#define POWER_USE_DEFAULT_RFPOWER_CALC + +#define RFPOWER_DEFAULT 0 // index into rfpower_list array + +const rfpower_t rfpower_list[] = { + { .dbm = POWER_10_DBM, .mW = 10 }, + { .dbm = POWER_17_DBM, .mW = 50 }, + { .dbm = POWER_20_DBM, .mW = 100 }, + { .dbm = POWER_24_DBM, .mW = 250 }, +}; diff --git a/platformio.ini b/platformio.ini index 0169aa3a0..94fc6a6bd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -563,3 +563,14 @@ build_flags = -D TX_ELRS_FLYSKY_INTERNAL_PA01_2400_ESP32S3 extra_scripts = tools/vscode/build_env_etx.py + +[env:tx-senduwing-internal-2400] ; H17 +extends = env_common_tx_esp32 +board = esp32dev +build_src_filter = + ${env_common_tx_esp32.build_src_filter} + + +build_flags = + ${env_common_tx_esp32.build_flags} + -D TX_ELRS_SENDUWING_INTERNAL_2400_ESP32 +extra_scripts = tools/vscode/build_env_etx.py