build: add support for jade core/v2.0c
What changed, and why it matters
This commit adds support for a new hardware variant called Jade Core (jade_v2c), which is a Jade Plus device without a camera or battery. The changes are purely build, configuration, release-script, and documentation updates to recognize the new board type. There is no indication of any security vulnerability being fixed or introduced.
No security action required. Treat as routine hardware-enablement commit.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit introduces the JADE_V2C board type across Kconfig, sdkconfig defaults, CI/GitLab build pipelines, release scripts, OTA tooling, and test scripts. It mirrors the existing JADE_V2 support but disables camera/battery-related features. No runtime logic changes affecting cryptography, authentication, memory safety, or secure boot were observed.
Changed components
build configuration (sdkconfig defaults)CI/GitLab pipelinesrelease and signing scriptsOTA/update tooling (jade_ota.py, update_jade_fw.py)test tooling (test_jade.py, jade_attest.py)documentation (README.md, REPRODUCIBLE.md)Inspect captured patch +275 / −25
diff --git a/.github/workflows/github-actions-test.yml b/.github/workflows/github-actions-test.yml
index c4182cf..d7b1835 100644
--- a/.github/workflows/github-actions-test.yml
+++ b/.github/workflows/github-actions-test.yml
@@ -28,3 +28,17 @@ jobs:
esp_idf_version: v5.4
target: esp32s3
command: ./tools/switch_to.sh jade_v2 --dev --log --jtag && idf.py size all
+
+ build_v2c:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v5
+ with:
+ submodules: 'recursive'
+ - name: build Jade Core
+ uses: espressif/esp-idf-ci-action@v1
+ with:
+ esp_idf_version: v5.4
+ target: esp32s3
+ command: ./tools/switch_to.sh jade_v2c --dev --log --jtag && idf.py size all
diff --git a/README.md b/README.md
index 02ffb3e..af1878a 100644
--- a/README.md
+++ b/README.md
@@ -60,6 +60,7 @@ There are currently three Jade device targets:
- jade: The original Jade 1.0 with a selection wheel.
- jade_v1_1: Jade 1.1, which has a rocker/jog-wheel in place of the selection wheel.
- jade_v2: Jade Plus, with a larger screen and left/right selection buttons in place of a wheel or rocker.
+- jade_v2c: Jade Core, Jade Plus without camera and battery.
Change `jade` in any calls to the `switch_to.sh` script below to the
appropriate device you wish to target from the list above.
diff --git a/REPRODUCIBLE.md b/REPRODUCIBLE.md
index 767b06a..70e660e 100755
--- a/REPRODUCIBLE.md
+++ b/REPRODUCIBLE.md
@@ -79,6 +79,7 @@ A diff of `./build/jade_signed.bin` against `./build/jade.bin` should just show
| Jade 1.0 (true wheel) | --hw-target jade |
| Jade 1.1 (rocker/jog-wheel) | --hw-target jade1.1 |
| Jade 2.0 (two buttons) | --hw-target jade2.0 |
+| Jade 2.0c (2.0, no camera/battery) | --hw-target jade2.0c |
eg:
```
diff --git a/configs/sdkconfig_dev_jade_v2c.defaults b/configs/sdkconfig_dev_jade_v2c.defaults
new file mode 100644
index 0000000..b1697c0
--- /dev/null
+++ b/configs/sdkconfig_dev_jade_v2c.defaults
@@ -0,0 +1,84 @@
+# dev jade v2c
+CONFIG_APP_REPRODUCIBLE_BUILD=y
+CONFIG_BF20A6_SUPPORT=n
+CONFIG_BF3005_SUPPORT=n
+CONFIG_BOARD_TYPE_JADE_V2C=y
+CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
+CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y
+CONFIG_BOOTLOADER_WDT_ENABLE=n
+CONFIG_BT_ENABLED=y
+CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=517
+CONFIG_BT_NIMBLE_ENABLED=y
+CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=11
+CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=5632
+CONFIG_BT_NIMBLE_LOG_LEVEL_NONE=y
+CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
+CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y
+CONFIG_BT_NIMBLE_NVS_PERSIST=y
+CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n
+CONFIG_BT_NIMBLE_ROLE_CENTRAL=n
+CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
+CONFIG_BT_NIMBLE_SM_LEGACY=n
+CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="j"
+CONFIG_BUTTON_LONG_PRESS_HOLD_SERIAL_TIME_MS=100
+CONFIG_BUTTON_LONG_PRESS_TIME_MS=500
+CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
+CONFIG_COMPILER_OPTIMIZATION_SIZE=y
+CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=y
+CONFIG_COMPILER_WARN_WRITE_STRINGS=y
+CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
+CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
+CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
+CONFIG_ESP_ERR_TO_NAME_LOOKUP=n
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=12288
+CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=n
+CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=n
+CONFIG_ESP_SYSTEM_BBPLL_RECALIB=n
+CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y
+CONFIG_ESP_TASK_WDT_EN=n
+CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=n
+CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=n
+CONFIG_ESP_WIFI_IRAM_OPT=n
+CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=n
+CONFIG_ESP_WIFI_NVS_ENABLED=n
+CONFIG_ESP_WIFI_RX_IRAM_OPT=n
+CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
+CONFIG_FATFS_LFN_HEAP=y
+CONFIG_FATFS_VFS_FSTAT_BLKSIZE=4096
+CONFIG_FATFS_VOLUME_COUNT=1
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3
+CONFIG_GC032A_SUPPORT=n
+CONFIG_GC2145_SUPPORT=n
+CONFIG_IDF_TARGET="esp32s3"
+CONFIG_LOG_DEFAULT_LEVEL_NONE=y
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
+CONFIG_NEWLIB_NANO_FORMAT=y
+CONFIG_NT99141_SUPPORT=n
+CONFIG_OV2640_SUPPORT=n
+CONFIG_OV3660_SUPPORT=n
+CONFIG_OV5640_SUPPORT=n
+CONFIG_OV7670_SUPPORT=n
+CONFIG_OV7725_SUPPORT=n
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitionss3.csv"
+CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y
+CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=n
+CONFIG_SC030IOT_SUPPORT=n
+CONFIG_SPIRAM=y
+CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
+CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y
+CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=256
+CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
+CONFIG_SPIRAM_MEMTEST=n
+CONFIG_SPIRAM_MODE_OCT=y
+CONFIG_SPIRAM_RODATA=y
+CONFIG_SPIRAM_SPEED_80M=y
+CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
+CONFIG_SPI_FLASH_VERIFY_WRITE=y
+CONFIG_SPI_MASTER_ISR_IN_IRAM=n
+CONFIG_SPI_SLAVE_ISR_IN_IRAM=n
+CONFIG_TINYUSB_CDC_ENABLED=y
+CONFIG_TINYUSB_CDC_RX_BUFSIZE=64
+CONFIG_TINYUSB_DESC_MANUFACTURER_STRING="Blockstream"
+CONFIG_TINYUSB_DESC_PRODUCT_STRING="Jade Core"
diff --git a/gitlab/dev_fw.yml b/gitlab/dev_fw.yml
index a049fb8..4f44126 100644
--- a/gitlab/dev_fw.yml
+++ b/gitlab/dev_fw.yml
@@ -34,3 +34,13 @@ build_dev_jade_v2_noradio:
extends: .build_dev_template
before_script:
- . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2 --dev --noradio
+
+build_dev_jade_v2c:
+ extends: .build_dev_template
+ before_script:
+ - . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2c --dev
+
+build_dev_jade_v2c_noradio:
+ extends: .build_dev_template
+ before_script:
+ - . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2c --dev --noradio
diff --git a/gitlab/prod_fw.yml b/gitlab/prod_fw.yml
index 1afd81b..fea4ec3 100644
--- a/gitlab/prod_fw.yml
+++ b/gitlab/prod_fw.yml
@@ -34,3 +34,13 @@ build_prod_jade_v2_noradio:
extends: .build_prod_template
before_script:
- . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2 --noradio
+
+build_prod_jade_v2c:
+ extends: .build_prod_template
+ before_script:
+ - . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2c
+
+build_prod_jade_v2c_noradio:
+ extends: .build_prod_template
+ before_script:
+ - . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2c --noradio
diff --git a/gitlab/release.yml b/gitlab/release.yml
index 3ee7bd3..81e3630 100644
--- a/gitlab/release.yml
+++ b/gitlab/release.yml
@@ -15,12 +15,16 @@ create_release_files:
- build_prod_jade_v1_1_noradio
- build_prod_jade_v2
- build_prod_jade_v2_noradio
+ - build_prod_jade_v2c
+ - build_prod_jade_v2c_noradio
- build_dev_jade
- build_dev_jade_noradio
- build_dev_jade_v1_1
- build_dev_jade_v1_1_noradio
- build_dev_jade_v2
- build_dev_jade_v2_noradio
+ - build_dev_jade_v2c
+ - build_dev_jade_v2c_noradio
artifacts:
expire_in: 14 days
when: on_success
diff --git a/gitlab/stage_release.sh b/gitlab/stage_release.sh
index e6a1922..5c8cf85 100755
--- a/gitlab/stage_release.sh
+++ b/gitlab/stage_release.sh
@@ -16,7 +16,7 @@ export STAGING_DIR="release/staging/$LABEL"
# prod builds
mkdir -p $STAGING_DIR
-(cd $STAGING_DIR && mkdir jade jade1.1 jade2.0 jadedev jade1.1dev jade2.0dev)
+(cd $STAGING_DIR && mkdir jade jade1.1 jade2.0 jade2.0c jadedev jade1.1dev jade2.0dev jade2.0cdev)
cp -r $STAGING_DIR $UPLOAD_DIR
cp -r build_prod_jade $STAGING_DIR/jade/build_prod
cp -r build_prod_jade_noradio $STAGING_DIR/jade/build_noradio_prod
@@ -24,10 +24,13 @@ cp -r build_prod_jade_v1_1 $STAGING_DIR/jade1.1/build_v1_1_prod
cp -r build_prod_jade_v1_1_noradio $STAGING_DIR/jade1.1/build_v1_1_noradio_prod
cp -r build_prod_jade_v2 $STAGING_DIR/jade2.0/build_v2_prod
cp -r build_prod_jade_v2_noradio $STAGING_DIR/jade2.0/build_v2_noradio_prod
+cp -r build_prod_jade_v2c $STAGING_DIR/jade2.0c/build_v2c_prod
+cp -r build_prod_jade_v2c_noradio $STAGING_DIR/jade2.0c/build_v2c_noradio_prod
# dev builds
cp -r build_dev_jade build_dev_jade_noradio $STAGING_DIR/jadedev
cp -r build_dev_jade_v1_1 build_dev_jade_v1_1_noradio $STAGING_DIR/jade1.1dev
cp -r build_dev_jade_v2 build_dev_jade_v2_noradio $STAGING_DIR/jade2.0dev
+cp -r build_dev_jade_v2c build_dev_jade_v2c_noradio $STAGING_DIR/jade2.0cdev
# sign dev builds
cd release
./scripts/devfw.sh $LABEL
diff --git a/gitlab/test_fw.yml b/gitlab/test_fw.yml
index 43979e3..deffc70 100644
--- a/gitlab/test_fw.yml
+++ b/gitlab/test_fw.yml
@@ -43,6 +43,15 @@ build_test_jade_v2_noradio_ci:
before_script:
- . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2 --dev --debug --ci --log --jtag --noradio
+build_test_jade_v2c_ci:
+ extends: .build_test_template
+ before_script:
+ - . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2c --dev --debug --ci --log --jtag
+
+build_test_jade_v2c_noradio_ci:
+ extends: .build_test_template
+ before_script:
+ - . $HOME/esp/esp-idf/export.sh && ./tools/switch_to.sh jade_v2c --dev --debug --ci --log --jtag --noradio
build_test_qemu:
extends: .build_test_template
diff --git a/jade_attest.py b/jade_attest.py
index 43bb620..6b5cb12 100755
--- a/jade_attest.py
+++ b/jade_attest.py
@@ -21,7 +21,8 @@ device_logger = logging.getLogger('jadepy.jade-device')
device_logger.setLevel(logging.INFO)
device_logger.addHandler(jadehandler)
-ESP32S3_CHIP_BOARDS = ['JADE_V2', 'TTGO_TDISPLAYS3', 'TTGO_TDISPLAYS3PROCAMERA', 'M5CORES3']
+ESP32S3_CHIP_BOARDS = ['JADE_V2', 'JADE_V2C', 'TTGO_TDISPLAYS3', 'TTGO_TDISPLAYS3PROCAMERA',
+ 'M5CORES3']
RSA_KEY_LEN = 4096
RSA_EXPONENT = 65537
diff --git a/jade_ota.py b/jade_ota.py
index 4722fcf..2d4c75e 100755
--- a/jade_ota.py
+++ b/jade_ota.py
@@ -297,7 +297,8 @@ def ota(args, jade, info, extended_replies):
features = info.get('JADE_FEATURES')
hw_target = {'JADE': 'jade',
'JADE_V1.1': 'jade1.1',
- 'JADE_V2': 'jade2.0'}.get(board_type if board_type else 'JADE')
+ 'JADE_V2': 'jade2.0',
+ 'JADE_V2C': 'jade2.0c'}.get(board_type if board_type else 'JADE')
build_type = {'SB': '', 'DEV': 'dev'}.get(features)
if hw_target is None or build_type is None:
logger.error(f'Unsupported hardware: {board_type} / {features}')
@@ -442,7 +443,7 @@ if __name__ == '__main__':
dest='hwtarget',
help='Hardware target for downloading firmware. Defaults to jade',
choices=['jade', 'jadedev', 'jade1.1', 'jade1.1dev',
- 'jade2.0', 'jade2.0dev'],
+ 'jade2.0', 'jade2.0dev', 'jade2.0c', 'jade2.0cdev'],
default=None)
parser.add_argument('--release',
action='store',
diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild
index c88d257..439c826 100644
--- a/main/Kconfig.projbuild
+++ b/main/Kconfig.projbuild
@@ -68,6 +68,11 @@ menu "Blockstream Jade"
select HAS_BATTERY
select BOARD_TYPE_JADE_ANY
select BOARD_TYPE_JADE_V2_ANY
+ config BOARD_TYPE_JADE_V2C
+ bool "Blockstream Jade Core (Jade v2, no camera, no battery)"
+ select HAS_AXP
+ select BOARD_TYPE_JADE_ANY
+ select BOARD_TYPE_JADE_V2_ANY
config BOARD_TYPE_M5_FIRE
bool "M5Stack Fire"
select HAS_IP5306
diff --git a/main/main.c b/main/main.c
index cc12bec..4a610d1 100644
--- a/main/main.c
+++ b/main/main.c
@@ -57,9 +57,9 @@ uint8_t macid[6];
#if !defined(CONFIG_BOARD_TYPE_JADE_ANY) || !defined(CONFIG_BOARD_TYPE_JADE_V1_ANY)
#error "JADE/JADE_V1_1 requires JADE_ANY and JADE_V1_ANY"
#endif
-#elif defined(CONFIG_BOARD_TYPE_JADE_V2)
+#elif defined(CONFIG_BOARD_TYPE_JADE_V2) || defined(CONFIG_BOARD_TYPE_JADE_V2C)
#if !defined(CONFIG_BOARD_TYPE_JADE_ANY) || !defined(CONFIG_BOARD_TYPE_JADE_V2_ANY)
-#error "JADE_V2 requires JADE_ANY and JADE_V2_ANY"
+#error "JADE_V2/JADE_V2C requires JADE_ANY and JADE_V2_ANY"
#endif
#elif defined(CONFIG_BOARD_TYPE_JADE_ANY) || defined(CONFIG_BOARD_TYPE_JADE_V1_ANY) \
|| defined(CONFIG_BOARD_TYPE_JADE_V2_ANY)
diff --git a/main/process/ota_defines.h b/main/process/ota_defines.h
index 41fc673..57c3382 100644
--- a/main/process/ota_defines.h
+++ b/main/process/ota_defines.h
@@ -23,6 +23,8 @@
#define JADE_OTA_BOARD_TYPE "JADE_V1.1" // Jade 1.1 (with jog wheel)
#elif defined(CONFIG_BOARD_TYPE_JADE_V2)
#define JADE_OTA_BOARD_TYPE "JADE_V2" // Jade 2 (with physical buttons)
+#elif defined(CONFIG_BOARD_TYPE_JADE_V2C)
+#define JADE_OTA_BOARD_TYPE "JADE_V2C" // Jade Core (Jade 2, no camera/battery)
#elif defined(CONFIG_BOARD_TYPE_M5_FIRE)
#define JADE_OTA_BOARD_TYPE "M5FIRE"
#elif defined(CONFIG_BOARD_TYPE_M5_BLACK_GRAY)
diff --git a/production/sdkconfig_jade_v2c_prod.defaults b/production/sdkconfig_jade_v2c_prod.defaults
new file mode 100644
index 0000000..c7239b8
--- /dev/null
+++ b/production/sdkconfig_jade_v2c_prod.defaults
@@ -0,0 +1,96 @@
+# jade v2c prod
+CONFIG_APP_REPRODUCIBLE_BUILD=y
+CONFIG_BF20A6_SUPPORT=n
+CONFIG_BF3005_SUPPORT=n
+CONFIG_BOARD_TYPE_JADE_V2C=y
+CONFIG_BOOTLOADER_APP_ANTI_ROLLBACK=y
+CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
+CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y
+CONFIG_BOOTLOADER_WDT_ENABLE=n
+CONFIG_BOOT_ROM_LOG_ALWAYS_OFF=y
+CONFIG_BT_ENABLED=y
+CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=517
+CONFIG_BT_NIMBLE_ENABLED=y
+CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=11
+CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=5632
+CONFIG_BT_NIMBLE_LOG_LEVEL_NONE=y
+CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
+CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y
+CONFIG_BT_NIMBLE_NVS_PERSIST=y
+CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n
+CONFIG_BT_NIMBLE_ROLE_CENTRAL=n
+CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
+CONFIG_BT_NIMBLE_SM_LEGACY=n
+CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="j"
+CONFIG_BUTTON_LONG_PRESS_HOLD_SERIAL_TIME_MS=100
+CONFIG_BUTTON_LONG_PRESS_TIME_MS=500
+CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
+CONFIG_COMPILER_OPTIMIZATION_SIZE=y
+CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=y
+CONFIG_COMPILER_WARN_WRITE_STRINGS=y
+CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
+CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
+CONFIG_ESP_CONSOLE_NONE=y
+CONFIG_ESP_CONSOLE_SECONDARY_NONE=y
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
+CONFIG_ESP_ERR_TO_NAME_LOOKUP=n
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=12288
+CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=n
+CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=n
+CONFIG_ESP_SYSTEM_BBPLL_RECALIB=n
+CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT=y
+CONFIG_ESP_TASK_WDT_EN=n
+CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=n
+CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=n
+CONFIG_ESP_WIFI_IRAM_OPT=n
+CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=n
+CONFIG_ESP_WIFI_NVS_ENABLED=n
+CONFIG_ESP_WIFI_RX_IRAM_OPT=n
+CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
+CONFIG_FATFS_LFN_HEAP=y
+CONFIG_FATFS_VFS_FSTAT_BLKSIZE=4096
+CONFIG_FATFS_VOLUME_COUNT=1
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3
+CONFIG_GC032A_SUPPORT=n
+CONFIG_GC2145_SUPPORT=n
+CONFIG_IDF_TARGET="esp32s3"
+CONFIG_LOG_DEFAULT_LEVEL_NONE=y
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
+CONFIG_MBEDTLS_ECP_RESTARTABLE=y
+CONFIG_NEWLIB_NANO_FORMAT=y
+CONFIG_NT99141_SUPPORT=n
+CONFIG_OV2640_SUPPORT=n
+CONFIG_OV3660_SUPPORT=n
+CONFIG_OV5640_SUPPORT=n
+CONFIG_OV7670_SUPPORT=n
+CONFIG_OV7725_SUPPORT=n
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitionss3.csv"
+CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y
+CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=n
+CONFIG_SC030IOT_SUPPORT=n
+CONFIG_SECURE_BOOT=y
+CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES=n
+CONFIG_SECURE_BOOT_INSECURE=y
+CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS=y
+CONFIG_SECURE_DISABLE_ROM_DL_MODE=y
+CONFIG_SECURE_FLASH_ENCRYPTION_MODE_RELEASE=y
+CONFIG_SECURE_FLASH_ENC_ENABLED=y
+CONFIG_SPIRAM=y
+CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
+CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y
+CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=256
+CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
+CONFIG_SPIRAM_MEMTEST=n
+CONFIG_SPIRAM_MODE_OCT=y
+CONFIG_SPIRAM_RODATA=y
+CONFIG_SPIRAM_SPEED_80M=y
+CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
+CONFIG_SPI_FLASH_VERIFY_WRITE=y
+CONFIG_SPI_MASTER_ISR_IN_IRAM=n
+CONFIG_SPI_SLAVE_ISR_IN_IRAM=n
+CONFIG_TINYUSB_CDC_ENABLED=y
+CONFIG_TINYUSB_CDC_RX_BUFSIZE=64
+CONFIG_TINYUSB_DESC_MANUFACTURER_STRING="Blockstream"
+CONFIG_TINYUSB_DESC_PRODUCT_STRING="Jade Core"
+CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=n
diff --git a/release/scripts/checkfwsvr.sh b/release/scripts/checkfwsvr.sh
index f53bcf3..b58f81d 100755
--- a/release/scripts/checkfwsvr.sh
+++ b/release/scripts/checkfwsvr.sh
@@ -4,7 +4,7 @@ LOCAL_DIR="${1:-fwsvr_mirror}"
MISSING_LOG="missing.log"
EXTRA_LOG="extra.log"
GCLOUD_BUCKET="gs://jadefw.blockstream.com/bin"
-HWDIRS="jade jade1.1 jade2.0 jadedev jade1.1dev jade2.0dev"
+HWDIRS="jade jade1.1 jade2.0 jade2.0c jadedev jade1.1dev jade2.0dev jade2.0cdev"
if [ $(basename $PWD) != "release" ]; then
if [ $(basename $PWD) != "staging" ]; then
diff --git a/release/scripts/devfw.sh b/release/scripts/devfw.sh
index bb27951..927c9b7 100755
--- a/release/scripts/devfw.sh
+++ b/release/scripts/devfw.sh
@@ -3,7 +3,7 @@
set -e
INDEX="BETA"
-DEVDIRS="jadedev jade1.1dev jade2.0dev"
+DEVDIRS="jadedev jade1.1dev jade2.0dev jade2.0cdev"
BUILDDIRS="./build_dev_jade*"
FW_PATTERN="*_fw.bin"
HASH_PATTERN="*_fw.bin.hash"
diff --git a/release/scripts/mkdeltas.sh b/release/scripts/mkdeltas.sh
index 895c916..03b08d0 100755
--- a/release/scripts/mkdeltas.sh
+++ b/release/scripts/mkdeltas.sh
@@ -1,7 +1,7 @@
#!/bin/bash
INDEX="DELTAS"
-HWDIRS="jade jade1.1 jade2.0 jadedev jade1.1dev jade2.0dev"
+HWDIRS="jade jade1.1 jade2.0 jade2.0c jadedev jade1.1dev jade2.0dev jade2.0cdev"
PATTERN_BLE="_ble_*_fw.bin"
PATTERN_NORADIO="_noradio_*_fw.bin"
diff --git a/release/scripts/mkhashes.sh b/release/scripts/mkhashes.sh
index a5a4941..75ef89b 100755
--- a/release/scripts/mkhashes.sh
+++ b/release/scripts/mkhashes.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-HWDIRS="jade jade1.1 jade2.0 jadedev jade1.1dev jade2.0dev"
+HWDIRS="jade jade1.1 jade2.0 jade2.0c jadedev jade1.1dev jade2.0dev jade2.0cdev"
STAGING="staging"
UPLOAD="upload"
diff --git a/release/scripts/mkindexes.sh b/release/scripts/mkindexes.sh
index ae77a36..5f4ff44 100755
--- a/release/scripts/mkindexes.sh
+++ b/release/scripts/mkindexes.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-HWDIRS="jade jade1.1 jade2.0 jadedev jade1.1dev jade2.0dev"
+HWDIRS="jade jade1.1 jade2.0 jade2.0c jadedev jade1.1dev jade2.0dev jade2.0cdev"
STAGING="staging"
UPLOAD="upload"
diff --git a/release/scripts/prepver.sh b/release/scripts/prepver.sh
index e11c032..2c9a202 100755
--- a/release/scripts/prepver.sh
+++ b/release/scripts/prepver.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-HWDIRS="jade jade1.1 jade2.0 jadedev jade1.1dev jade2.0dev"
+HWDIRS="jade jade1.1 jade2.0 jade2.0c jadedev jade1.1dev jade2.0dev jade2.0cdev"
STAGING="staging"
UPLOAD="upload"
diff --git a/release/scripts/prodfw.sh b/release/scripts/prodfw.sh
index 99c804c..e562874 100755
--- a/release/scripts/prodfw.sh
+++ b/release/scripts/prodfw.sh
@@ -1,7 +1,7 @@
#!/bin/bash
INDEX="BETA"
-PRODDIRS="jade jade1.1 jade2.0"
+PRODDIRS="jade jade1.1 jade2.0 jade2.0c"
BUILDDIRS="./build_*"
FW_PATTERN="*_fw.bin"
HASH_PATTERN="*_fw.bin.hash"
diff --git a/release/scripts/promotebeta.sh b/release/scripts/promotebeta.sh
index 326bc02..03c2935 100755
--- a/release/scripts/promotebeta.sh
+++ b/release/scripts/promotebeta.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-HWDIRS="jade jade1.1 jade2.0 jadedev jade1.1dev jade2.0dev"
+HWDIRS="jade jade1.1 jade2.0 jade2.0c jadedev jade1.1dev jade2.0dev jade2.0cdev"
STAGING="staging"
UPLOAD="upload"
diff --git a/release/scripts/v2applysigs.sh b/release/scripts/v2applysigs.sh
index 5f0fba9..fba948f 100755
--- a/release/scripts/v2applysigs.sh
+++ b/release/scripts/v2applysigs.sh
@@ -11,7 +11,7 @@ shift
SIGNER_KEY_LABELS="$@"
WORKING_DIR_PREFIX="staging/${VER_DIR}"
-HWDIRS="jade2.0"
+HWDIRS="jade2.0 jade2.0c"
BLEDIR="build_v2_prod"
NORADIODIR="build_v2_noradio_prod"
diff --git a/release/scripts/v2jadesign.sh b/release/scripts/v2jadesign.sh
index e4e270f..5aba0a5 100755
--- a/release/scripts/v2jadesign.sh
+++ b/release/scripts/v2jadesign.sh
@@ -35,7 +35,7 @@ if [ -z "${VER_DIR}" -o -z "${KEY_LABEL}" ]; then
fi
WORKING_DIR_PREFIX="staging/${VER_DIR}"
-HWDIRS="jade2.0"
+HWDIRS="jade2.0 jade2.0c"
# Can log if required
LOGGING=""
diff --git a/release/scripts/v2sign.sh b/release/scripts/v2sign.sh
index a1bceba..871760a 100755
--- a/release/scripts/v2sign.sh
+++ b/release/scripts/v2sign.sh
@@ -11,7 +11,7 @@ VER_DIR="${1}"
KEY_LABEL="${2}"
WORKING_DIR_PREFIX="staging/${VER_DIR}"
-HWDIRS="jade2.0"
+HWDIRS="jade2.0 jade2.0c"
# Relative paths from where it will be referenced in fw dir
KEY="../../../scripts/${KEY_LABEL}.pem"
diff --git a/test_jade.py b/test_jade.py
index 58fd9b3..df349fc 100644
--- a/test_jade.py
+++ b/test_jade.py
@@ -179,7 +179,8 @@ PINSERVER_DEFAULT_ONION = 'http://mrrxtq6tjpbnbm7vh5jt6mpjctn7ggyfy5wegvbeff3x7j
# The number of values expected back in version info
NUM_VALUES_VERINFO = 20
-ESP32S3_CHIP_BOARDS = ['JADE_V2', 'TTGO_TDISPLAYS3', 'TTGO_TDISPLAYS3PROCAMERA', 'M5CORES3']
+ESP32S3_CHIP_BOARDS = ['JADE_V2', 'JADE_V2C', 'TTGO_TDISPLAYS3', 'TTGO_TDISPLAYS3PROCAMERA',
+ 'M5CORES3']
TEST_MNEMONIC = 'fish inner face ginger orchard permit useful method fence \
kidney chuckle party favorite sunset draw limb science crane oval letter \
diff --git a/tools/check_default_configs.sh b/tools/check_default_configs.sh
index 280a95d..949e204 100755
--- a/tools/check_default_configs.sh
+++ b/tools/check_default_configs.sh
@@ -11,12 +11,15 @@ export IDF_CCACHE_ENABLE=1
rm -fr sdkconfig sdkconfig.defaults build managed_components
-# Jade v2 (Jade Plus)
+# Jade v2/v2c (Jade Plus & Jade Core)
idf.py set-target esp32s3
-for filename in production/*_jade_v2_*.defaults configs/*_jade_v2*.defaults; do
+for filename in production/*_jade_v2*.defaults configs/*_jade_v2*.defaults; do
rm -fr sdkconfig sdkconfig.defaults
idf.py -D SDKCONFIG_DEFAULTS="${filename}" reconfigure save-defconfig
- tail -n +4 sdkconfig.defaults | LC_ALL=C sort -o ${filename}
+ tail -n +4 sdkconfig.defaults | LC_ALL=C sort -o ${filename}.tmp
+ # add the first line from the original file back if it was a comment
+ head -n 1 ${filename} | grep -q '^#' && echo "$(head -n 1 ${filename}; cat ${filename}.tmp)" > ${filename}.tmp
+ mv ${filename}.tmp ${filename}
done
# Jade v1.0/v1.1
@@ -25,6 +28,9 @@ for filename in production/*jade*.defaults configs/*jade*.defaults; do
[[ $filename == *"v2"* ]] && continue
rm -fr sdkconfig sdkconfig.defaults
idf.py -D SDKCONFIG_DEFAULTS="${filename}" reconfigure save-defconfig
- tail -n +4 sdkconfig.defaults | LC_ALL=C sort -o ${filename}
+ tail -n +4 sdkconfig.defaults | LC_ALL=C sort -o ${filename}.tmp
+ # add the first line from the original file back if it was a comment
+ head -n 1 ${filename} | grep -q '^#' && echo "$(head -n 1 ${filename}; cat ${filename}.tmp)" > ${filename}.tmp
+ mv ${filename}.tmp ${filename}
done
rm -fr sdkconfig sdkconfig.defaults build managed_components
diff --git a/tools/switch_to.sh b/tools/switch_to.sh
index f3819f7..9774cad 100755
--- a/tools/switch_to.sh
+++ b/tools/switch_to.sh
@@ -20,7 +20,7 @@ function usage {
if [ -n "$1" ]; then
echo "error: $1" >&2
fi
- echo "${0} jade|jade_v1_1|jade_v2|qemu [OPTIONS]"
+ echo "${0} jade|jade_v1_1|jade_v2|jade_v2c|qemu [OPTIONS]"
echo "WARNING: THIS SCRIPT IS FOR JADE DEVELOPMENT ONLY";
echo "JADE OPTIONS:"
echo " --noradio Disable Bluetooth support"
@@ -74,6 +74,7 @@ while true; do
jade) CONFIG=$1; ARCH="esp32"; shift ;;
jade_v1_1) CONFIG=$1; ARCH="esp32"; shift ;;
jade_v2) CONFIG=$1; ARCH="esp32s3"; shift ;;
+ jade_v2c) CONFIG=$1; ARCH="esp32s3"; shift ;;
qemu) CONFIG=$1; ARCH="esp32"; shift ;;
--dev) DEVELOPMENT="y"; shift ;;
--noradio) NORADIO=1; shift ;;
@@ -169,7 +170,7 @@ if [ -n "$NORADIO" ]; then
# add settings (Jade v1.x)
set_config CONFIG_ESP_WIFI_IRAM_OPT n
set_config CONFIG_ESP_WIFI_RX_IRAM_OPT n
- elif [ "$CONFIG" = "jade_v2" ]; then
+ elif [ "$CONFIG" = "jade_v2" ] || [ "$CONFIG" = "jade_v2c" ]; then
# remove settings (Jade v2)
remove_config CONFIG_BT_NIMBLE_LOG_LEVEL_NONE
else
diff --git a/update_jade_fw.py b/update_jade_fw.py
index 0c44d5d..f174a3b 100755
--- a/update_jade_fw.py
+++ b/update_jade_fw.py
@@ -78,7 +78,8 @@ def download_file(verinfo, release):
features = verinfo.get('JADE_FEATURES')
hw_target = {'JADE': 'jade',
'JADE_V1.1': 'jade1.1',
- 'JADE_V2': 'jade2.0'}.get(board_type if board_type else 'JADE')
+ 'JADE_V2': 'jade2.0',
+ 'JADE_V2C': 'jade2.0c'}.get(board_type if board_type else 'JADE')
build_type = {'SB': '', 'DEV': 'dev'}.get(features)
if hw_target is None or build_type is None:
logger.error(f'Unsupported hardware: {board_type} / {features}')
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.