diff --git a/software/firmware/binaries/README.md b/software/firmware/binaries/README.md
index 28b702dd2..b8efb4760 100644
--- a/software/firmware/binaries/README.md
+++ b/software/firmware/binaries/README.md
@@ -19,7 +19,7 @@
Model|Instructions|Firmware folder
---|:---:|:---:
-[Standalone Edition](https://github.com/lyusupov/SoftRF/wiki/Standalone-Edition)|[NodeMCU](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#nodemcu)
[ESP32-C3](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#esp32-c3)|[NodeMCU](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/NodeMCU/SoftRF)
[ESP32C3](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/ESP32C3/SoftRF)
+[Standalone Edition](https://github.com/lyusupov/SoftRF/wiki/Standalone-Edition)|[NodeMCU](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#nodemcu)
[ESP32-C3](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#esp32-c3)
[ESP32-C6](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#esp32-c6)|[NodeMCU](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/NodeMCU/SoftRF)
[ESP32C3](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/ESP32C3/SoftRF)
ESP32C6
[Prime Edition Mk2](https://github.com/lyusupov/SoftRF/wiki/Prime-Edition-MkII)|[ESP32](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#esp32)|[ESP32](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/ESP32/SoftRF)
[Prime Edition Mk3](https://github.com/lyusupov/SoftRF/wiki/Prime-Edition-MkIII)|[ESP32-S3](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#esp32-s3)|[ESP32S3](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/ESP32S3/SoftRF/MassStorage)
[Ham Edition](https://github.com/lyusupov/SoftRF/wiki/Ham-Edition)|[ESP32-S3](https://github.com/lyusupov/SoftRF/blob/master/software/firmware/binaries/README.md#esp32-s3)|[ESP32S3](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/ESP32S3/SoftRF/MassStorage)
@@ -71,7 +71,7 @@ Model|Instructions|Firmware folder
## ESP32
-1. Take ESP32 flash download tool from this location: https://www.espressif.com/en/support/download/other-tools
+1. Take ESP32 flash download tool from this location: http://www.espressif.com/en/support/download/other-tools
You might also need to install:
* a [driver for the CP210X USB to UART bridge from Silicon Labs](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) or
* [CH9102F driver](https://github.com/Xinyuan-LilyGO/CH9102_Driver)
@@ -316,7 +316,7 @@ The Bootloader is capable to self-program an application firmware into the devic
## ESP32-C3
-1. Take ESP32 flash download tool from this location: https://www.espressif.com/en/support/download/other-tools
+1. Take ESP32 flash download tool from this location: http://www.espressif.com/en/support/download/other-tools
2. Download an appropriate version of SoftRF firmware from [this location](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/ESP32C3/SoftRF) and unzip the archive ;
@@ -340,7 +340,7 @@ The Bootloader is capable to self-program an application firmware into the devic
## ESP32-C6
-1. Take ESP32 flash download tool from this location: https://www.espressif.com/en/support/download/other-tools
+1. Take ESP32 flash download tool from this location: http://www.espressif.com/en/support/download/other-tools
2. Download an appropriate version of SoftRF firmware from [this location](https://github.com/lyusupov/SoftRF/tree/master/software/firmware/binaries/ESP32C6/SoftRF) and unzip the archive ;
diff --git a/software/firmware/source/SoftRF/src/platform/ESP32.cpp b/software/firmware/source/SoftRF/src/platform/ESP32.cpp
index c79ab4cee..b7231f952 100644
--- a/software/firmware/source/SoftRF/src/platform/ESP32.cpp
+++ b/software/firmware/source/SoftRF/src/platform/ESP32.cpp
@@ -1260,6 +1260,12 @@ static void ESP32_setup()
#if defined(CONFIG_IDF_TARGET_ESP32C3)
} else if (esp32_board == ESP32_C3_DEVKIT) {
+#if ARDUINO_USB_CDC_ON_BOOT
+ SerialOutput.begin(SERIAL_OUT_BR, SERIAL_OUT_BITS,
+ SOC_GPIO_PIN_C3_CONS_RX,
+ SOC_GPIO_PIN_C3_CONS_TX);
+#endif /* ARDUINO_USB_CDC_ON_BOOT */
+
lmic_pins.nss = SOC_GPIO_PIN_C3_SS;
lmic_pins.rst = LMIC_UNUSED_PIN;
lmic_pins.busy = SOC_GPIO_PIN_C3_TXE;
@@ -1269,12 +1275,24 @@ static void ESP32_setup()
#if defined(CONFIG_IDF_TARGET_ESP32C6)
} else if (esp32_board == ESP32_C6_DEVKIT) {
+#if ARDUINO_USB_CDC_ON_BOOT
+ SerialOutput.begin(SERIAL_OUT_BR, SERIAL_OUT_BITS,
+ SOC_GPIO_PIN_C6_CONS_RX,
+ SOC_GPIO_PIN_C6_CONS_TX);
+#endif /* ARDUINO_USB_CDC_ON_BOOT */
+
lmic_pins.nss = SOC_GPIO_PIN_C6_SS;
lmic_pins.rst = LMIC_UNUSED_PIN;
lmic_pins.busy = SOC_GPIO_PIN_C6_TXE;
} else if (esp32_board == ESP32_LILYGO_T3C6) {
+#if ARDUINO_USB_CDC_ON_BOOT
+ SerialOutput.begin(SERIAL_OUT_BR, SERIAL_OUT_BITS,
+ SOC_GPIO_PIN_T3C6_CONS_RX,
+ SOC_GPIO_PIN_T3C6_CONS_TX);
+#endif /* ARDUINO_USB_CDC_ON_BOOT */
+
lmic_pins.nss = SOC_GPIO_PIN_T3C6_SS;
lmic_pins.rst = SOC_GPIO_PIN_T3C6_RST;
lmic_pins.busy = SOC_GPIO_PIN_T3C6_BUSY;
@@ -1382,9 +1400,16 @@ static void ESP32_setup()
}
#endif /* TBD */
+#elif ARDUINO_USB_CDC_ON_BOOT && \
+ (defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6))
+
+ Serial.begin(SERIAL_OUT_BR);
+
+ for (int i=0; i < 20; i++) {if (Serial) break; else delay(100);}
+
#else
Serial.begin(SERIAL_OUT_BR, SERIAL_OUT_BITS);
-#endif /* ARDUINO_USB_CDC_ON_BOOT && (CONFIG_IDF_TARGET_ESP32S2 || S3) */
+#endif /* ARDUINO_USB_CDC_ON_BOOT */
#if defined(CONFIG_IDF_TARGET_ESP32S3)
ui = &ui_settings;
@@ -2827,8 +2852,7 @@ static void ESP32_EEPROM_extension(int cmd)
#endif /* CONFIG_IDF_TARGET_ESP32S3 */
if (cmd == EEPROM_EXT_LOAD) {
-#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32C3) || \
- defined(USE_USB_HOST)
+#if defined(CONFIG_IDF_TARGET_ESP32) || defined(USE_USB_HOST)
if (settings->nmea_out == NMEA_USB) {
settings->nmea_out = NMEA_UART;
}
@@ -2840,9 +2864,10 @@ static void ESP32_EEPROM_extension(int cmd)
}
#endif /* CONFIG_IDF_TARGET_ESP32 */
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || \
- defined(CONFIG_IDF_TARGET_ESP32C3)
+ defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)
if (settings->bluetooth != BLUETOOTH_NONE) {
-#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
+#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || \
+ defined(CONFIG_IDF_TARGET_ESP32C6)
settings->bluetooth = BLUETOOTH_LE_HM10_SERIAL;
#else
settings->bluetooth = BLUETOOTH_NONE;
@@ -2852,7 +2877,7 @@ static void ESP32_EEPROM_extension(int cmd)
// if (hw_info.model == SOFTRF_MODEL_HAM) {
// settings->power_save |= POWER_SAVE_NORECEIVE;
// }
-#endif /* CONFIG_IDF_TARGET_ESP32S2 || S3 || C3 */
+#endif /* CONFIG_IDF_TARGET_ESP32S2 || S3 || C3 || C6 */
/* AUTO and UK RF bands are deprecated since Release v1.3 */
if (settings->band == RF_BAND_AUTO || settings->band == RF_BAND_UK) {
@@ -4647,6 +4672,82 @@ IODev_ops_t ESP32SX_USBSerial_ops = {
#endif /* USE_USB_HOST || ARDUINO_USB_CDC_ON_BOOT */
#endif /* CONFIG_IDF_TARGET_ESP32S2 */
+#if ARDUINO_USB_MODE && \
+ (defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6))
+
+#define USB_TX_FIFO_SIZE (MAX_TRACKING_OBJECTS * 65 + 75 + 75 + 42 + 20)
+#define USB_RX_FIFO_SIZE (256)
+
+#if ARDUINO_USB_CDC_ON_BOOT
+#define USBSerial Serial
+#else
+#if defined(CONFIG_IDF_TARGET_ESP32C6)
+#define USBSerial HWCDCSerial
+#endif /* CONFIG_IDF_TARGET_ESP32C6 */
+#endif /* ARDUINO_USB_CDC_ON_BOOT */
+
+static void ESP32CX_USB_setup()
+{
+ /* native CDC (HWCDC) */
+ USBSerial.setRxBufferSize(USB_RX_FIFO_SIZE);
+ USBSerial.setTxBufferSize(USB_TX_FIFO_SIZE);
+}
+
+static void ESP32CX_USB_loop()
+{
+
+}
+
+static void ESP32CX_USB_fini()
+{
+
+}
+
+static int ESP32CX_USB_available()
+{
+ int rval = 0;
+
+ if (USBSerial) {
+ rval = USBSerial.available();
+ }
+
+ return rval;
+}
+
+static int ESP32CX_USB_read()
+{
+ int rval = -1;
+
+ if (USBSerial) {
+ rval = USBSerial.read();
+ }
+
+ return rval;
+}
+
+static size_t ESP32CX_USB_write(const uint8_t *buffer, size_t size)
+{
+ size_t rval = size;
+
+ /* Espressif native CDC (HWCDC) */
+ if (USBSerial && (size < USBSerial.availableForWrite())) {
+ rval = USBSerial.write(buffer, size);
+ }
+
+ return rval;
+}
+
+IODev_ops_t ESP32CX_USBSerial_ops = {
+ "ESP32CX USB",
+ ESP32CX_USB_setup,
+ ESP32CX_USB_loop,
+ ESP32CX_USB_fini,
+ ESP32CX_USB_available,
+ ESP32CX_USB_read,
+ ESP32CX_USB_write
+};
+#endif /* CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 */
+
#if defined(CONFIG_IDF_TARGET_ESP32S3)
static bool ESP32_ADB_setup()
{
@@ -4808,6 +4909,9 @@ const SoC_ops_t ESP32_ops = {
#if (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)) && \
(ARDUINO_USB_CDC_ON_BOOT || defined(USE_USB_HOST))
&ESP32SX_USBSerial_ops,
+#elif ARDUINO_USB_MODE && \
+ (defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6))
+ &ESP32CX_USBSerial_ops,
#else
NULL,
#endif /* USE_USB_HOST */
diff --git a/software/firmware/source/SoftRF/src/platform/ESP32.h b/software/firmware/source/SoftRF/src/platform/ESP32.h
index d1d08504d..c9db9df88 100644
--- a/software/firmware/source/SoftRF/src/platform/ESP32.h
+++ b/software/firmware/source/SoftRF/src/platform/ESP32.h
@@ -56,7 +56,13 @@
#define SerialOutput Serial0
#endif /* ARDUINO_USB_CDC_ON_BOOT */
#elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)
+#if ARDUINO_USB_CDC_ON_BOOT
+#define UATSerial Serial0
+#undef SerialOutput
+#define SerialOutput Serial0
+#else
#define UATSerial Serial
+#endif /* ARDUINO_USB_CDC_ON_BOOT */
#else
#error "This ESP32 family build variant is not supported!"
#endif /* CONFIG_IDF_TARGET_ESP32 */
diff --git a/software/firmware/source/SoftRF/src/ui/Web.cpp b/software/firmware/source/SoftRF/src/ui/Web.cpp
index 77af20093..84fe76e59 100644
--- a/software/firmware/source/SoftRF/src/ui/Web.cpp
+++ b/software/firmware/source/SoftRF/src/ui/Web.cpp
@@ -368,7 +368,8 @@ void handleSettings() {
offset += len;
size -= len;
- } else if (SoC->id == SOC_ESP32S3 || SoC->id == SOC_ESP32C3) {
+ } else if (SoC->id == SOC_ESP32S3 || SoC->id == SOC_ESP32C3 ||
+ SoC->id == SOC_ESP32C6) {
snprintf_P ( offset, size,
PSTR("\
@@ -446,7 +447,8 @@ void handleSettings() {
/* SoC specific part 2 */
if (SoC->id == SOC_ESP32 || SoC->id == SOC_ESP32S3 ||
- SoC->id == SOC_ESP32C3 || SoC->id == SOC_RP2040) {
+ SoC->id == SOC_ESP32C3 || SoC->id == SOC_ESP32C6 ||
+ SoC->id == SOC_RP2040) {
snprintf_P ( offset, size,
PSTR("\
\
@@ -459,6 +461,7 @@ void handleSettings() {
size -= len;
}
if (SoC->id == SOC_ESP32S2 || SoC->id == SOC_ESP32S3 ||
+ SoC->id == SOC_ESP32C3 || SoC->id == SOC_ESP32C6 ||
SoC->id == SOC_RP2040) {
snprintf_P ( offset, size,
PSTR(""),
@@ -493,7 +496,8 @@ void handleSettings() {
#if !defined(EXCLUDE_BLUETOOTH)
/* SoC specific part 3 */
if (SoC->id == SOC_ESP32 || SoC->id == SOC_ESP32S3 ||
- SoC->id == SOC_ESP32C3 || SoC->id == SOC_RP2040) {
+ SoC->id == SOC_ESP32C3 || SoC->id == SOC_ESP32C6 ||
+ SoC->id == SOC_RP2040) {
snprintf_P ( offset, size,
PSTR(""),
(settings->gdl90 == GDL90_BLUETOOTH ? "selected" : ""), GDL90_BLUETOOTH);
@@ -505,6 +509,7 @@ void handleSettings() {
#endif /* EXCLUDE_BLUETOOTH */
if (SoC->id == SOC_ESP32S2 || SoC->id == SOC_ESP32S3 ||
+ SoC->id == SOC_ESP32C3 || SoC->id == SOC_ESP32C6 ||
SoC->id == SOC_RP2040) {
snprintf_P ( offset, size,
PSTR(""),
@@ -537,7 +542,8 @@ void handleSettings() {
#if !defined(EXCLUDE_BLUETOOTH)
/* SoC specific part 4 */
if (SoC->id == SOC_ESP32 || SoC->id == SOC_ESP32S3 ||
- SoC->id == SOC_ESP32C3 || SoC->id == SOC_RP2040) {
+ SoC->id == SOC_ESP32C3 || SoC->id == SOC_ESP32C6 ||
+ SoC->id == SOC_RP2040) {
snprintf_P ( offset, size,
PSTR(""),
(settings->d1090 == D1090_BLUETOOTH ? "selected" : ""), D1090_BLUETOOTH);
@@ -549,6 +555,7 @@ void handleSettings() {
#endif /* EXCLUDE_BLUETOOTH */
if (SoC->id == SOC_ESP32S2 || SoC->id == SOC_ESP32S3 ||
+ SoC->id == SOC_ESP32C3 || SoC->id == SOC_ESP32C6 ||
SoC->id == SOC_RP2040) {
snprintf_P ( offset, size,
PSTR(""),