diff --git a/arch/rp2040/rp2040.ini b/arch/rp2040/rp2040.ini
index 6660cccd2..9eea340bf 100644
--- a/arch/rp2040/rp2040.ini
+++ b/arch/rp2040/rp2040.ini
@@ -1,6 +1,6 @@
; Common settings for rp2040 Processor based targets
[rp2040_base]
-platform = https://github.com/maxgerhardt/platform-raspberrypi.git
+platform = https://github.com/maxgerhardt/platform-raspberrypi.git#5ce1a228e7cae453f366deb8962252b9b7356bbc
extends = arduino_base
board_build.core = earlephilhower
board_build.filesystem_size = 0.5m
diff --git a/platformio.ini b/platformio.ini
index 2ac06440b..bc46f3f23 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -65,6 +65,7 @@ lib_deps =
${env.lib_deps}
; Portduino is using meshtastic fork for now
jgromes/RadioLib@5.4.1
+ https://github.com/caveman99/SparkFun_ATECCX08a_Arduino_Library.git#008e7f9d40bad66b2f7a0074aaac05b7c424339d
build_flags = ${env.build_flags} -Os
-DRADIOLIB_SPI_PARANOID=0
diff --git a/src/configuration.h b/src/configuration.h
index 524dbec36..2aeb0f4a5 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -110,6 +110,13 @@ along with this program. If not, see .
#define INA_ADDR_ALTERNATE 0x41
#define QMC6310_ADDR 0x1C
#define QMI8658_ADDR 0x6B
+
+// -----------------------------------------------------------------------------
+// Security
+// -----------------------------------------------------------------------------
+
+#define ATECC608B_ADDR 0x35
+
// -----------------------------------------------------------------------------
// GPS
// -----------------------------------------------------------------------------
diff --git a/src/detect/i2cScan.h b/src/detect/i2cScan.h
index 3adb44277..1148495ba 100644
--- a/src/detect/i2cScan.h
+++ b/src/detect/i2cScan.h
@@ -9,6 +9,41 @@
#endif
#if HAS_WIRE
+
+void printATECCInfo()
+{
+#ifndef ARCH_PORTDUINO
+ atecc.readConfigZone(false);
+
+ DEBUG_MSG("ATECC608B Serial Number: ");
+ for (int i = 0 ; i < 9 ; i++) {
+ DEBUG_MSG("%02x",atecc.serialNumber[i]);
+ }
+
+ DEBUG_MSG(", Rev Number: ");
+ for (int i = 0 ; i < 4 ; i++) {
+ DEBUG_MSG("%02x",atecc.revisionNumber[i]);
+ }
+ DEBUG_MSG("\n");
+
+ DEBUG_MSG("ATECC608B Config %s",atecc.configLockStatus ? "Locked" : "Unlocked");
+ DEBUG_MSG(", Data %s",atecc.dataOTPLockStatus ? "Locked" : "Unlocked");
+ DEBUG_MSG(", Slot 0 %s\n",atecc.slot0LockStatus ? "Locked" : "Unlocked");
+
+ if (atecc.configLockStatus && atecc.dataOTPLockStatus && atecc.slot0LockStatus) {
+ if (atecc.generatePublicKey() == false) {
+ DEBUG_MSG("ATECC608B Error generating public key\n");
+ } else {
+ DEBUG_MSG("ATECC608B Public Key: ");
+ for (int i = 0 ; i < 64 ; i++) {
+ DEBUG_MSG("%02x",atecc.publicKey64Bytes[i]);
+ }
+ DEBUG_MSG("\n");
+ }
+ }
+#endif
+}
+
uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length) {
uint16_t value = 0x00;
Wire.beginTransmission(address);
@@ -79,6 +114,17 @@ void scanI2Cdevice(void)
DEBUG_MSG("unknown display found\n");
}
}
+#ifndef ARCH_PORTDUINO
+ if (addr == ATECC608B_ADDR){
+ keystore_found = addr;
+ if (atecc.begin(keystore_found) == true) {
+ DEBUG_MSG("ATECC608B initialized\n");
+ } else {
+ DEBUG_MSG("ATECC608B initialization failed\n");
+ }
+ printATECCInfo();
+ }
+#endif
#ifdef RV3028_RTC
if (addr == RV3028_RTC){
rtc_found = addr;
diff --git a/src/main.cpp b/src/main.cpp
index c3f892bce..8779a6ab0 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -80,6 +80,12 @@ uint8_t kb_model;
// The I2C address of the RTC Module (if found)
uint8_t rtc_found;
+// Keystore Chips
+uint8_t keystore_found;
+#ifndef ARCH_PORTDUINO
+ATECCX08A atecc;
+#endif
+
bool eink_found = true;
uint32_t serialSinceMsec;
diff --git a/src/main.h b/src/main.h
index f3f9c62c9..3744c8acd 100644
--- a/src/main.h
+++ b/src/main.h
@@ -6,18 +6,26 @@
#include "PowerStatus.h"
#include "graphics/Screen.h"
#include "mesh/generated/telemetry.pb.h"
+#ifndef ARCH_PORTDUINO
+#include
+#endif
extern uint8_t screen_found;
extern uint8_t screen_model;
extern uint8_t cardkb_found;
extern uint8_t kb_model;
extern uint8_t rtc_found;
+extern uint8_t keystore_found;
extern bool eink_found;
extern bool pmu_found;
extern bool isCharging;
extern bool isUSBPowered;
+#ifndef ARCH_PORTDUINO
+extern ATECCX08A atecc;
+#endif
+
extern uint8_t nodeTelemetrySensorsMap[TelemetrySensorType_QMI8658+1];
extern int TCPPort; // set by Portduino
diff --git a/variants/pico/platformio.ini b/variants/rpipico/platformio.ini
similarity index 90%
rename from variants/pico/platformio.ini
rename to variants/rpipico/platformio.ini
index 4f238fa14..122fbd42f 100644
--- a/variants/pico/platformio.ini
+++ b/variants/rpipico/platformio.ini
@@ -1,12 +1,12 @@
[env:pico]
extends = rp2040_base
-board = pico
+board = rpipico
upload_protocol = picotool
# add our variants files to the include and src paths
build_flags = ${rp2040_base.build_flags}
-DPRIVATE_HW
- -Ivariants/pico
+ -Ivariants/rpipico
-DARDUINO_AVR_NANO_EVERY
-DDEBUG_RP2040_WIRE
-DDEBUG_RP2040_SPI
diff --git a/variants/pico/variant.h b/variants/rpipico/variant.h
similarity index 100%
rename from variants/pico/variant.h
rename to variants/rpipico/variant.h
diff --git a/variants/rpipicow/platformio.ini b/variants/rpipicow/platformio.ini
new file mode 100644
index 000000000..697ec1caa
--- /dev/null
+++ b/variants/rpipicow/platformio.ini
@@ -0,0 +1,17 @@
+[env:picow]
+extends = rp2040_base
+board = rpipicow
+upload_protocol = picotool
+
+# add our variants files to the include and src paths
+build_flags = ${rp2040_base.build_flags}
+ -DPRIVATE_HW
+ -Ivariants/rpipicow
+ -DARDUINO_AVR_NANO_EVERY
+ -DDEBUG_RP2040_WIRE
+ -DDEBUG_RP2040_SPI
+ -DDEBUG_RP2040_CORE
+ -DDEBUG_RP2040_PORT=Serial
+ -DUSE_TINYUSB
+lib_deps =
+ ${rp2040_base.lib_deps}
\ No newline at end of file
diff --git a/variants/rpipicow/variant.h b/variants/rpipicow/variant.h
new file mode 100644
index 000000000..d620a356b
--- /dev/null
+++ b/variants/rpipicow/variant.h
@@ -0,0 +1,52 @@
+// #define RADIOLIB_CUSTOM_ARDUINO 1
+// #define RADIOLIB_TONE_UNSUPPORTED 1
+// #define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED 1
+
+#define ARDUINO_ARCH_AVR
+
+#define CBC 0
+#define CTR 1
+#define ECB 0
+
+#define NO_GPS 1
+#define USE_SH1106 1
+#undef GPS_SERIAL_NUM
+
+// #define I2C_SDA 6
+// #define I2C_SCL 7
+
+#define BUTTON_PIN 17
+#define EXT_NOTIFY_OUT 4
+
+#define BATTERY_PIN 26
+// ratio of voltage divider = 3.0 (R17=200k, R18=100k)
+#define ADC_MULTIPLIER 3.1 // 3.0 + a bit for being optimistic
+
+#define USE_RF95
+#define USE_SX1262
+
+#undef RF95_SCK
+#undef RF95_MISO
+#undef RF95_MOSI
+#undef RF95_NSS
+
+#define RF95_SCK 10
+#define RF95_MISO 12
+#define RF95_MOSI 11
+#define RF95_NSS 3
+
+#define LORA_DIO0 RADIOLIB_NC
+#define LORA_RESET 15
+#define LORA_DIO1 20
+#define LORA_DIO2 2
+#define LORA_DIO3 RADIOLIB_NC
+
+#ifdef USE_SX1262
+#define SX126X_CS RF95_NSS
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+#define SX126X_E22
+#endif
+
+#include
\ No newline at end of file