mirror of
https://github.com/meshtastic/firmware.git
synced 2025-04-25 09:42:35 +00:00
Merge pull request #4117 from beegee-tokyo/master
Add RAKwireless WisMesh Hub (RAK2560/RAK9154)
This commit is contained in:
commit
02050a4775
2
.trunk/configs/.bandit
Normal file
2
.trunk/configs/.bandit
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[bandit]
|
||||||
|
skips = B101
|
@ -29,6 +29,7 @@ default_envs = tbeam
|
|||||||
;default_envs = meshtastic-dr-dev
|
;default_envs = meshtastic-dr-dev
|
||||||
;default_envs = m5stack-coreink
|
;default_envs = m5stack-coreink
|
||||||
;default_envs = rak4631
|
;default_envs = rak4631
|
||||||
|
;default_envs = rak2560
|
||||||
;default_envs = rak10701
|
;default_envs = rak10701
|
||||||
;default_envs = wio-e5
|
;default_envs = wio-e5
|
||||||
;default_envs = radiomaster_900_bandit_nano
|
;default_envs = radiomaster_900_bandit_nano
|
||||||
|
@ -75,6 +75,10 @@ INA219Sensor ina219Sensor;
|
|||||||
INA3221Sensor ina3221Sensor;
|
INA3221Sensor ina3221Sensor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_RAKPROT && !defined(ARCH_PORTDUINO)
|
||||||
|
RAK9154Sensor rak9154Sensor;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_PMU
|
#ifdef HAS_PMU
|
||||||
#include "XPowersAXP192.tpp"
|
#include "XPowersAXP192.tpp"
|
||||||
#include "XPowersAXP2101.tpp"
|
#include "XPowersAXP2101.tpp"
|
||||||
@ -145,6 +149,12 @@ class AnalogBatteryLevel : public HasBatteryLevel
|
|||||||
*/
|
*/
|
||||||
virtual int getBatteryPercent() override
|
virtual int getBatteryPercent() override
|
||||||
{
|
{
|
||||||
|
#if defined(HAS_RAKPROT) && !defined(ARCH_PORTDUINO) && !defined(HAS_PMU)
|
||||||
|
if (hasRAK()) {
|
||||||
|
return rak9154Sensor.getBusBatteryPercent();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
float v = getBattVoltage();
|
float v = getBattVoltage();
|
||||||
|
|
||||||
if (v < noBatVolt)
|
if (v < noBatVolt)
|
||||||
@ -184,6 +194,12 @@ class AnalogBatteryLevel : public HasBatteryLevel
|
|||||||
virtual uint16_t getBattVoltage() override
|
virtual uint16_t getBattVoltage() override
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#if defined(HAS_RAKPROT) && !defined(ARCH_PORTDUINO) && !defined(HAS_PMU)
|
||||||
|
if (hasRAK()) {
|
||||||
|
return getRAKVoltage();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAS_TELEMETRY && !defined(ARCH_PORTDUINO) && !defined(HAS_PMU) && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
#if HAS_TELEMETRY && !defined(ARCH_PORTDUINO) && !defined(HAS_PMU) && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
||||||
if (hasINA()) {
|
if (hasINA()) {
|
||||||
LOG_DEBUG("Using INA on I2C addr 0x%x for device battery voltage\n", config.power.device_battery_ina_address);
|
LOG_DEBUG("Using INA on I2C addr 0x%x for device battery voltage\n", config.power.device_battery_ina_address);
|
||||||
@ -335,19 +351,19 @@ class AnalogBatteryLevel : public HasBatteryLevel
|
|||||||
virtual bool isVbusIn() override
|
virtual bool isVbusIn() override
|
||||||
{
|
{
|
||||||
#ifdef EXT_PWR_DETECT
|
#ifdef EXT_PWR_DETECT
|
||||||
#ifdef HELTEC_CAPSULE_SENSOR_V3
|
#ifdef HELTEC_CAPSULE_SENSOR_V3
|
||||||
// if external powered that pin will be pulled down
|
// if external powered that pin will be pulled down
|
||||||
if (digitalRead(EXT_PWR_DETECT) == LOW) {
|
if (digitalRead(EXT_PWR_DETECT) == LOW) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// if it's not LOW - check the battery
|
// if it's not LOW - check the battery
|
||||||
#else
|
#else
|
||||||
// if external powered that pin will be pulled up
|
// if external powered that pin will be pulled up
|
||||||
if (digitalRead(EXT_PWR_DETECT) == HIGH) {
|
if (digitalRead(EXT_PWR_DETECT) == HIGH) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// if it's not HIGH - check the battery
|
// if it's not HIGH - check the battery
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return getBattVoltage() > chargingVolt;
|
return getBattVoltage() > chargingVolt;
|
||||||
}
|
}
|
||||||
@ -356,6 +372,11 @@ class AnalogBatteryLevel : public HasBatteryLevel
|
|||||||
/// we can't be smart enough to say 'full'?
|
/// we can't be smart enough to say 'full'?
|
||||||
virtual bool isCharging() override
|
virtual bool isCharging() override
|
||||||
{
|
{
|
||||||
|
#if defined(HAS_RAKPROT) && !defined(ARCH_PORTDUINO) && !defined(HAS_PMU)
|
||||||
|
if (hasRAK()) {
|
||||||
|
return (rak9154Sensor.isCharging()) ? OptTrue : OptFalse;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef EXT_CHRG_DETECT
|
#ifdef EXT_CHRG_DETECT
|
||||||
return digitalRead(EXT_CHRG_DETECT) == ext_chrg_detect_value;
|
return digitalRead(EXT_CHRG_DETECT) == ext_chrg_detect_value;
|
||||||
#else
|
#else
|
||||||
@ -379,6 +400,18 @@ class AnalogBatteryLevel : public HasBatteryLevel
|
|||||||
float last_read_value = (OCV[NUM_OCV_POINTS - 1] * NUM_CELLS);
|
float last_read_value = (OCV[NUM_OCV_POINTS - 1] * NUM_CELLS);
|
||||||
uint32_t last_read_time_ms = 0;
|
uint32_t last_read_time_ms = 0;
|
||||||
|
|
||||||
|
#if defined(HAS_RAKPROT)
|
||||||
|
|
||||||
|
uint16_t getRAKVoltage() { return rak9154Sensor.getBusVoltageMv(); }
|
||||||
|
|
||||||
|
bool hasRAK()
|
||||||
|
{
|
||||||
|
if (!rak9154Sensor.isInitialized())
|
||||||
|
return rak9154Sensor.runOnce() > 0;
|
||||||
|
return rak9154Sensor.isRunning();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
|
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
|
||||||
uint16_t getINAVoltage()
|
uint16_t getINAVoltage()
|
||||||
{
|
{
|
||||||
@ -428,11 +461,11 @@ Power::Power() : OSThread("Power")
|
|||||||
bool Power::analogInit()
|
bool Power::analogInit()
|
||||||
{
|
{
|
||||||
#ifdef EXT_PWR_DETECT
|
#ifdef EXT_PWR_DETECT
|
||||||
#ifdef HELTEC_CAPSULE_SENSOR_V3
|
#ifdef HELTEC_CAPSULE_SENSOR_V3
|
||||||
pinMode(EXT_PWR_DETECT, INPUT_PULLUP);
|
pinMode(EXT_PWR_DETECT, INPUT_PULLUP);
|
||||||
#else
|
#else
|
||||||
pinMode(EXT_PWR_DETECT, INPUT);
|
pinMode(EXT_PWR_DETECT, INPUT);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef EXT_CHRG_DETECT
|
#ifdef EXT_CHRG_DETECT
|
||||||
pinMode(EXT_CHRG_DETECT, ext_chrg_detect_mode);
|
pinMode(EXT_CHRG_DETECT, ext_chrg_detect_mode);
|
||||||
|
@ -42,6 +42,8 @@
|
|||||||
#define HW_VENDOR meshtastic_HardwareModel_NRF52840DK
|
#define HW_VENDOR meshtastic_HardwareModel_NRF52840DK
|
||||||
#elif defined(ARDUINO_NRF52840_PPR)
|
#elif defined(ARDUINO_NRF52840_PPR)
|
||||||
#define HW_VENDOR meshtastic_HardwareModel_PPR
|
#define HW_VENDOR meshtastic_HardwareModel_PPR
|
||||||
|
#elif defined(RAK2560)
|
||||||
|
#define HW_VENDOR meshtastic_HardwareModel_RAK2560
|
||||||
#elif defined(RAK4630)
|
#elif defined(RAK4630)
|
||||||
#define HW_VENDOR meshtastic_HardwareModel_RAK4631
|
#define HW_VENDOR meshtastic_HardwareModel_RAK4631
|
||||||
#elif defined(TTGO_T_ECHO)
|
#elif defined(TTGO_T_ECHO)
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "../variants/rak2560/RAK9154Sensor.h"
|
||||||
#include "PowerStatus.h"
|
#include "PowerStatus.h"
|
||||||
#include "concurrency/OSThread.h"
|
#include "concurrency/OSThread.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
|
||||||
#ifdef ARCH_ESP32
|
#ifdef ARCH_ESP32
|
||||||
#include <esp_adc_cal.h>
|
#include <esp_adc_cal.h>
|
||||||
#include <soc/adc_channel.h>
|
#include <soc/adc_channel.h>
|
||||||
@ -46,6 +48,11 @@ extern INA219Sensor ina219Sensor;
|
|||||||
extern INA3221Sensor ina3221Sensor;
|
extern INA3221Sensor ina3221Sensor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_RAKPROT && !defined(ARCH_PORTDUINO)
|
||||||
|
#include "../variants/rak2560/RAK9154Sensor.h"
|
||||||
|
extern RAK9154Sensor rak9154Sensor;
|
||||||
|
#endif
|
||||||
|
|
||||||
class Power : private concurrency::OSThread
|
class Power : private concurrency::OSThread
|
||||||
{
|
{
|
||||||
|
|
||||||
|
183
variants/rak2560/RAK9154Sensor.cpp
Normal file
183
variants/rak2560/RAK9154Sensor.cpp
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
#ifdef HAS_RAKPROT
|
||||||
|
#include "../variants/rak2560/RAK9154Sensor.h"
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "../modules/Telemetry/Sensor/TelemetrySensor.h"
|
||||||
|
#include "configuration.h"
|
||||||
|
|
||||||
|
#include "concurrency/Periodic.h"
|
||||||
|
#include <RAK-OneWireSerial.h>
|
||||||
|
|
||||||
|
using namespace concurrency;
|
||||||
|
|
||||||
|
#define BOOT_DATA_REQ
|
||||||
|
|
||||||
|
RAK9154Sensor::RAK9154Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_SENSOR_UNSET, "RAK1954") {}
|
||||||
|
|
||||||
|
static Periodic *onewirePeriodic;
|
||||||
|
|
||||||
|
static SoftwareHalfSerial mySerial(HALF_UART_PIN); // Wire pin P0.15
|
||||||
|
|
||||||
|
static uint8_t buff[0x100];
|
||||||
|
static uint16_t bufflen = 0;
|
||||||
|
|
||||||
|
static int16_t dc_cur = 0;
|
||||||
|
static uint16_t dc_vol = 0;
|
||||||
|
static uint8_t dc_prec = 0;
|
||||||
|
static uint8_t provision = 0;
|
||||||
|
|
||||||
|
static void onewire_evt(const uint8_t pid, const uint8_t sid, const SNHUBAPI_EVT_E eid, uint8_t *msg, uint16_t len)
|
||||||
|
{
|
||||||
|
switch (eid) {
|
||||||
|
case SNHUBAPI_EVT_RECV_REQ:
|
||||||
|
case SNHUBAPI_EVT_RECV_RSP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_QSEND:
|
||||||
|
mySerial.write(msg, len);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_ADD_SID:
|
||||||
|
// LOG_INFO("+ADD:SID:[%02x]\r\n", msg[0]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_ADD_PID:
|
||||||
|
// LOG_INFO("+ADD:PID:[%02x]\r\n", msg[0]);
|
||||||
|
#ifdef BOOT_DATA_REQ
|
||||||
|
provision = msg[0];
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_GET_INTV:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_GET_ENABLE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_SDATA_REQ:
|
||||||
|
|
||||||
|
// LOG_INFO("+EVT:PID[%02x],IPSO[%02x]\r\n",pid,msg[0]);
|
||||||
|
// for( uint16_t i=1; i<len; i++)
|
||||||
|
// {
|
||||||
|
// LOG_INFO("%02x,", msg[i]);
|
||||||
|
// }
|
||||||
|
// LOG_INFO("\r\n");
|
||||||
|
switch (msg[0]) {
|
||||||
|
case RAK_IPSO_CAPACITY:
|
||||||
|
dc_prec = msg[1];
|
||||||
|
if (dc_prec > 100) {
|
||||||
|
dc_prec = 100;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RAK_IPSO_DC_CURRENT:
|
||||||
|
dc_cur = (msg[2] << 8) + msg[1];
|
||||||
|
break;
|
||||||
|
case RAK_IPSO_DC_VOLTAGE:
|
||||||
|
dc_vol = (msg[2] << 8) + msg[1];
|
||||||
|
dc_vol *= 10;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SNHUBAPI_EVT_REPORT:
|
||||||
|
|
||||||
|
// LOG_INFO("+EVT:PID[%02x],IPSO[%02x]\r\n",pid,msg[0]);
|
||||||
|
// for( uint16_t i=1; i<len; i++)
|
||||||
|
// {
|
||||||
|
// LOG_INFO("%02x,", msg[i]);
|
||||||
|
// }
|
||||||
|
// LOG_INFO("\r\n");
|
||||||
|
|
||||||
|
switch (msg[0]) {
|
||||||
|
case RAK_IPSO_CAPACITY:
|
||||||
|
dc_prec = msg[1];
|
||||||
|
if (dc_prec > 100) {
|
||||||
|
dc_prec = 100;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RAK_IPSO_DC_CURRENT:
|
||||||
|
dc_cur = (msg[1] << 8) + msg[2];
|
||||||
|
break;
|
||||||
|
case RAK_IPSO_DC_VOLTAGE:
|
||||||
|
dc_vol = (msg[1] << 8) + msg[2];
|
||||||
|
dc_vol *= 10;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_CHKSUM_ERR:
|
||||||
|
LOG_INFO("+ERR:CHKSUM\r\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SNHUBAPI_EVT_SEQ_ERR:
|
||||||
|
LOG_INFO("+ERR:SEQUCE\r\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t onewireHandle()
|
||||||
|
{
|
||||||
|
if (provision != 0) {
|
||||||
|
RakSNHub_Protocl_API.get.data(provision);
|
||||||
|
provision = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (mySerial.available()) {
|
||||||
|
char a = mySerial.read();
|
||||||
|
buff[bufflen++] = a;
|
||||||
|
delay(2); // continue data, timeout=2ms
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bufflen != 0) {
|
||||||
|
RakSNHub_Protocl_API.process((uint8_t *)buff, bufflen);
|
||||||
|
bufflen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t RAK9154Sensor::runOnce()
|
||||||
|
{
|
||||||
|
onewirePeriodic = new Periodic("onewireHandle", onewireHandle);
|
||||||
|
|
||||||
|
mySerial.begin(9600);
|
||||||
|
|
||||||
|
RakSNHub_Protocl_API.init(onewire_evt);
|
||||||
|
|
||||||
|
status = true;
|
||||||
|
initialized = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RAK9154Sensor::setup()
|
||||||
|
{
|
||||||
|
// Set up oversampling and filter initialization
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RAK9154Sensor::getMetrics(meshtastic_Telemetry *measurement)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t RAK9154Sensor::getBusVoltageMv()
|
||||||
|
{
|
||||||
|
return dc_vol;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RAK9154Sensor::getBusBatteryPercent()
|
||||||
|
{
|
||||||
|
return (int)dc_prec;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RAK9154Sensor::isCharging()
|
||||||
|
{
|
||||||
|
return (dc_cur > 0) ? true : false;
|
||||||
|
}
|
||||||
|
#endif // HAS_RAKPROT
|
23
variants/rak2560/RAK9154Sensor.h
Normal file
23
variants/rak2560/RAK9154Sensor.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifdef HAS_RAKPROT
|
||||||
|
#ifndef _RAK9154SENSOR_H
|
||||||
|
#define _RAK9154SENSOR_H 1
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "../modules/Telemetry/Sensor/TelemetrySensor.h"
|
||||||
|
#include "../modules/Telemetry/Sensor/VoltageSensor.h"
|
||||||
|
|
||||||
|
class RAK9154Sensor : public TelemetrySensor, VoltageSensor
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
protected:
|
||||||
|
virtual void setup() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RAK9154Sensor();
|
||||||
|
virtual int32_t runOnce() override;
|
||||||
|
virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
|
||||||
|
virtual uint16_t getBusVoltageMv() override;
|
||||||
|
int getBusBatteryPercent();
|
||||||
|
bool isCharging();
|
||||||
|
};
|
||||||
|
#endif // _RAK9154SENSOR_H
|
||||||
|
#endif // HAS_RAKPROT
|
113
variants/rak2560/create_uf2.py
Normal file
113
variants/rak2560/create_uf2.py
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
import struct
|
||||||
|
|
||||||
|
Import("env") # noqa: F821
|
||||||
|
|
||||||
|
|
||||||
|
# Parse input and create UF2 file
|
||||||
|
def create_uf2(source, target, env):
|
||||||
|
# source_hex = target[0].get_abspath()
|
||||||
|
source_hex = target[0].get_string(False)
|
||||||
|
source_hex = ".\\" + source_hex
|
||||||
|
print("#########################################################")
|
||||||
|
print("Create UF2 from " + source_hex)
|
||||||
|
print("#########################################################")
|
||||||
|
# print("Source: " + source_hex)
|
||||||
|
target = source_hex.replace(".hex", "")
|
||||||
|
target = target + ".uf2"
|
||||||
|
# print("Target: " + target)
|
||||||
|
|
||||||
|
with open(source_hex, mode="rb") as f:
|
||||||
|
inpbuf = f.read()
|
||||||
|
|
||||||
|
outbuf = convert_from_hex_to_uf2(inpbuf.decode("utf-8"))
|
||||||
|
|
||||||
|
write_file(target, outbuf)
|
||||||
|
print("#########################################################")
|
||||||
|
print(target + " is ready to flash to target device")
|
||||||
|
print("#########################################################")
|
||||||
|
|
||||||
|
|
||||||
|
# Add callback after .hex file was created
|
||||||
|
env.AddPostAction("$BUILD_DIR/${PROGNAME}.hex", create_uf2) # noqa: F821
|
||||||
|
|
||||||
|
# UF2 creation taken from uf2conv.py
|
||||||
|
UF2_MAGIC_START0 = 0x0A324655 # "UF2\n"
|
||||||
|
UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected
|
||||||
|
UF2_MAGIC_END = 0x0AB16F30 # Ditto
|
||||||
|
|
||||||
|
familyid = 0xADA52840
|
||||||
|
|
||||||
|
|
||||||
|
class Block:
|
||||||
|
def __init__(self, addr):
|
||||||
|
self.addr = addr
|
||||||
|
self.bytes = bytearray(256)
|
||||||
|
|
||||||
|
def encode(self, blockno, numblocks):
|
||||||
|
global familyid
|
||||||
|
flags = 0x0
|
||||||
|
if familyid:
|
||||||
|
flags |= 0x2000
|
||||||
|
hd = struct.pack(
|
||||||
|
"<IIIIIIII",
|
||||||
|
UF2_MAGIC_START0,
|
||||||
|
UF2_MAGIC_START1,
|
||||||
|
flags,
|
||||||
|
self.addr,
|
||||||
|
256,
|
||||||
|
blockno,
|
||||||
|
numblocks,
|
||||||
|
familyid,
|
||||||
|
)
|
||||||
|
hd += self.bytes[0:256]
|
||||||
|
while len(hd) < 512 - 4:
|
||||||
|
hd += b"\x00"
|
||||||
|
hd += struct.pack("<I", UF2_MAGIC_END)
|
||||||
|
return hd
|
||||||
|
|
||||||
|
|
||||||
|
def write_file(name, buf):
|
||||||
|
with open(name, "wb") as f:
|
||||||
|
f.write(buf)
|
||||||
|
# print("Wrote %d bytes to %s." % (len(buf), name))
|
||||||
|
|
||||||
|
|
||||||
|
def convert_from_hex_to_uf2(buf):
|
||||||
|
global appstartaddr
|
||||||
|
appstartaddr = None
|
||||||
|
upper = 0
|
||||||
|
currblock = None
|
||||||
|
blocks = []
|
||||||
|
for line in buf.split("\n"):
|
||||||
|
if line[0] != ":":
|
||||||
|
continue
|
||||||
|
i = 1
|
||||||
|
rec = []
|
||||||
|
while i < len(line) - 1:
|
||||||
|
rec.append(int(line[i : i + 2], 16))
|
||||||
|
i += 2
|
||||||
|
tp = rec[3]
|
||||||
|
if tp == 4:
|
||||||
|
upper = ((rec[4] << 8) | rec[5]) << 16
|
||||||
|
elif tp == 2:
|
||||||
|
upper = ((rec[4] << 8) | rec[5]) << 4
|
||||||
|
assert (upper & 0xFFFF) == 0
|
||||||
|
elif tp == 1:
|
||||||
|
break
|
||||||
|
elif tp == 0:
|
||||||
|
addr = upper | (rec[1] << 8) | rec[2]
|
||||||
|
if appstartaddr is None:
|
||||||
|
appstartaddr = addr
|
||||||
|
i = 4
|
||||||
|
while i < len(rec) - 1:
|
||||||
|
if not currblock or currblock.addr & ~0xFF != addr & ~0xFF:
|
||||||
|
currblock = Block(addr & ~0xFF)
|
||||||
|
blocks.append(currblock)
|
||||||
|
currblock.bytes[addr & 0xFF] = rec[i]
|
||||||
|
addr += 1
|
||||||
|
i += 1
|
||||||
|
numblocks = len(blocks)
|
||||||
|
resfile = b""
|
||||||
|
for i in range(0, numblocks):
|
||||||
|
resfile += blocks[i].encode(i, numblocks)
|
||||||
|
return resfile
|
24
variants/rak2560/platformio.ini
Normal file
24
variants/rak2560/platformio.ini
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
||||||
|
[env:rak2560]
|
||||||
|
extends = nrf52840_base
|
||||||
|
board = wiscore_rak4631
|
||||||
|
board_check = true
|
||||||
|
build_flags = ${nrf52840_base.build_flags} -Ivariants/rak2560 -D RAK_4631
|
||||||
|
-L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
|
||||||
|
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
|
||||||
|
-DHAS_RAKPROT=1 ; Define if RAk OneWireSerial is used (disables GPS)
|
||||||
|
build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak2560> +<mesh/eth/> +<mesh/api/> +<mqtt/>
|
||||||
|
lib_deps =
|
||||||
|
${nrf52840_base.lib_deps}
|
||||||
|
${networking_base.lib_deps}
|
||||||
|
melopero/Melopero RV3028@^1.1.0
|
||||||
|
https://github.com/RAKWireless/RAK13800-W5100S.git#1.0.2
|
||||||
|
rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2
|
||||||
|
beegee-tokyo/RAKwireless RAK12034@^1.0.0
|
||||||
|
https://github.com/beegee-tokyo/RAK-OneWireSerial.git
|
||||||
|
debug_tool = jlink
|
||||||
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
|
;upload_protocol = jlink
|
||||||
|
extra_scripts =
|
||||||
|
${env.extra_scripts}
|
||||||
|
./variants/rak2560/create_uf2.py
|
45
variants/rak2560/variant.cpp
Normal file
45
variants/rak2560/variant.cpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
||||||
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
||||||
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "variant.h"
|
||||||
|
#include "nrf.h"
|
||||||
|
#include "wiring_constants.h"
|
||||||
|
#include "wiring_digital.h"
|
||||||
|
|
||||||
|
const uint32_t g_ADigitalPinMap[] = {
|
||||||
|
// P0
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
||||||
|
|
||||||
|
// P1
|
||||||
|
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
|
||||||
|
|
||||||
|
void initVariant()
|
||||||
|
{
|
||||||
|
// LED1 & LED2
|
||||||
|
pinMode(PIN_LED1, OUTPUT);
|
||||||
|
ledOff(PIN_LED1);
|
||||||
|
|
||||||
|
pinMode(PIN_LED2, OUTPUT);
|
||||||
|
ledOff(PIN_LED2);
|
||||||
|
|
||||||
|
// 3V3 Power Rail
|
||||||
|
pinMode(PIN_3V3_EN, OUTPUT);
|
||||||
|
digitalWrite(PIN_3V3_EN, HIGH);
|
||||||
|
}
|
281
variants/rak2560/variant.h
Normal file
281
variants/rak2560/variant.h
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
||||||
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
||||||
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
This library 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 Lesser General Public License for more details.
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _VARIANT_RAK2560_
|
||||||
|
#define _VARIANT_RAK2560_
|
||||||
|
|
||||||
|
#define RAK4630
|
||||||
|
#define RAK2560
|
||||||
|
|
||||||
|
/** Master clock frequency */
|
||||||
|
#define VARIANT_MCK (64000000ul)
|
||||||
|
|
||||||
|
#define USE_LFXO // Board uses 32khz crystal for LF
|
||||||
|
// define USE_LFRC // Board uses RC for LF
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Headers
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "WVariant.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
// Number of pins defined in PinDescription array
|
||||||
|
#define PINS_COUNT (48)
|
||||||
|
#define NUM_DIGITAL_PINS (48)
|
||||||
|
#define NUM_ANALOG_INPUTS (6)
|
||||||
|
#define NUM_ANALOG_OUTPUTS (0)
|
||||||
|
|
||||||
|
// LEDs
|
||||||
|
#define PIN_LED1 (35)
|
||||||
|
#define PIN_LED2 (36)
|
||||||
|
|
||||||
|
#define LED_BUILTIN PIN_LED1
|
||||||
|
#define LED_CONN PIN_LED2
|
||||||
|
|
||||||
|
#define LED_GREEN PIN_LED1
|
||||||
|
#define LED_BLUE PIN_LED2
|
||||||
|
|
||||||
|
#define LED_STATE_ON 1 // State when LED is litted
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Buttons
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIN_BUTTON1 9 // Pin for button on E-ink button module or IO expansion
|
||||||
|
#define BUTTON_NEED_PULLUP
|
||||||
|
#define PIN_BUTTON2 12
|
||||||
|
#define PIN_BUTTON3 24
|
||||||
|
#define PIN_BUTTON4 25
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Analog pins
|
||||||
|
*/
|
||||||
|
#define PIN_A0 (5)
|
||||||
|
#define PIN_A1 (31)
|
||||||
|
#define PIN_A2 (28)
|
||||||
|
#define PIN_A3 (29)
|
||||||
|
#define PIN_A4 (30)
|
||||||
|
#define PIN_A5 (31)
|
||||||
|
#define PIN_A6 (0xff)
|
||||||
|
#define PIN_A7 (0xff)
|
||||||
|
|
||||||
|
static const uint8_t A0 = PIN_A0;
|
||||||
|
static const uint8_t A1 = PIN_A1;
|
||||||
|
static const uint8_t A2 = PIN_A2;
|
||||||
|
static const uint8_t A3 = PIN_A3;
|
||||||
|
static const uint8_t A4 = PIN_A4;
|
||||||
|
static const uint8_t A5 = PIN_A5;
|
||||||
|
static const uint8_t A6 = PIN_A6;
|
||||||
|
static const uint8_t A7 = PIN_A7;
|
||||||
|
#define ADC_RESOLUTION 14
|
||||||
|
|
||||||
|
// Other pins
|
||||||
|
#define PIN_AREF (2)
|
||||||
|
#define PIN_NFC1 (9)
|
||||||
|
#define PIN_NFC2 (10)
|
||||||
|
|
||||||
|
static const uint8_t AREF = PIN_AREF;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial interfaces
|
||||||
|
*/
|
||||||
|
#define PIN_SERIAL1_RX (15)
|
||||||
|
#define PIN_SERIAL1_TX (16)
|
||||||
|
|
||||||
|
// Connected to Serial 2
|
||||||
|
#define PIN_SERIAL2_RX (19)
|
||||||
|
#define PIN_SERIAL2_TX (20)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SPI Interfaces
|
||||||
|
*/
|
||||||
|
#define SPI_INTERFACES_COUNT 2
|
||||||
|
|
||||||
|
#define PIN_SPI_MISO (45)
|
||||||
|
#define PIN_SPI_MOSI (44)
|
||||||
|
#define PIN_SPI_SCK (43)
|
||||||
|
|
||||||
|
#define PIN_SPI1_MISO (29) // (0 + 29)
|
||||||
|
#define PIN_SPI1_MOSI (30) // (0 + 30)
|
||||||
|
#define PIN_SPI1_SCK (3) // (0 + 3)
|
||||||
|
|
||||||
|
static const uint8_t SS = 42;
|
||||||
|
static const uint8_t MOSI = PIN_SPI_MOSI;
|
||||||
|
static const uint8_t MISO = PIN_SPI_MISO;
|
||||||
|
static const uint8_t SCK = PIN_SPI_SCK;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* eink display pins
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIN_EINK_CS (0 + 26)
|
||||||
|
#define PIN_EINK_BUSY (0 + 4)
|
||||||
|
#define PIN_EINK_DC (0 + 17)
|
||||||
|
#define PIN_EINK_RES (-1)
|
||||||
|
#define PIN_EINK_SCLK (0 + 3)
|
||||||
|
#define PIN_EINK_MOSI (0 + 30) // also called SDI
|
||||||
|
|
||||||
|
// #define USE_EINK
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wire Interfaces
|
||||||
|
*/
|
||||||
|
#define WIRE_INTERFACES_COUNT 1
|
||||||
|
|
||||||
|
#define PIN_WIRE_SDA (13)
|
||||||
|
#define PIN_WIRE_SCL (14)
|
||||||
|
|
||||||
|
// QSPI Pins
|
||||||
|
#define PIN_QSPI_SCK 3
|
||||||
|
#define PIN_QSPI_CS 26
|
||||||
|
#define PIN_QSPI_IO0 30
|
||||||
|
#define PIN_QSPI_IO1 29
|
||||||
|
#define PIN_QSPI_IO2 28
|
||||||
|
#define PIN_QSPI_IO3 2
|
||||||
|
|
||||||
|
/* @note RAK5005-O GPIO mapping to RAK4631 GPIO ports
|
||||||
|
RAK5005-O <-> nRF52840
|
||||||
|
IO1 <-> P0.17 (Arduino GPIO number 17)
|
||||||
|
IO2 <-> P1.02 (Arduino GPIO number 34)
|
||||||
|
IO3 <-> P0.21 (Arduino GPIO number 21)
|
||||||
|
IO4 <-> P0.04 (Arduino GPIO number 4)
|
||||||
|
IO5 <-> P0.09 (Arduino GPIO number 9)
|
||||||
|
IO6 <-> P0.10 (Arduino GPIO number 10)
|
||||||
|
IO7 <-> P0.28 (Arduino GPIO number 28)
|
||||||
|
SW1 <-> P0.01 (Arduino GPIO number 1)
|
||||||
|
A0 <-> P0.04/AIN2 (Arduino Analog A2
|
||||||
|
A1 <-> P0.31/AIN7 (Arduino Analog A7
|
||||||
|
SPI_CS <-> P0.26 (Arduino GPIO number 26)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// RAK4630 LoRa module
|
||||||
|
|
||||||
|
/* Setup of the SX1262 LoRa module ( https://docs.rakwireless.com/Product-Categories/WisBlock/RAK4631/Datasheet/ )
|
||||||
|
|
||||||
|
P1.10 NSS SPI NSS (Arduino GPIO number 42)
|
||||||
|
P1.11 SCK SPI CLK (Arduino GPIO number 43)
|
||||||
|
P1.12 MOSI SPI MOSI (Arduino GPIO number 44)
|
||||||
|
P1.13 MISO SPI MISO (Arduino GPIO number 45)
|
||||||
|
P1.14 BUSY BUSY signal (Arduino GPIO number 46)
|
||||||
|
P1.15 DIO1 DIO1 event interrupt (Arduino GPIO number 47)
|
||||||
|
P1.06 NRESET NRESET manual reset of the SX1262 (Arduino GPIO number 38)
|
||||||
|
|
||||||
|
Important for successful SX1262 initialization:
|
||||||
|
|
||||||
|
* Setup DIO2 to control the antenna switch
|
||||||
|
* Setup DIO3 to control the TCXO power supply
|
||||||
|
* Setup the SX1262 to use it's DCDC regulator and not the LDO
|
||||||
|
* RAK4630 schematics show GPIO P1.07 connected to the antenna switch, but it should not be initialized, as DIO2 will do the
|
||||||
|
control of the antenna switch
|
||||||
|
|
||||||
|
SO GPIO 39/TXEN MAY NOT BE DEFINED FOR SUCCESSFUL OPERATION OF THE SX1262 - TG
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DETECTION_SENSOR_EN 4
|
||||||
|
|
||||||
|
#define USE_SX1262
|
||||||
|
#define SX126X_CS (42)
|
||||||
|
#define SX126X_DIO1 (47)
|
||||||
|
#define SX126X_BUSY (46)
|
||||||
|
#define SX126X_RESET (38)
|
||||||
|
// #define SX126X_TXEN (39)
|
||||||
|
// #define SX126X_RXEN (37)
|
||||||
|
#define SX126X_POWER_EN (37)
|
||||||
|
// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3
|
||||||
|
#define SX126X_DIO2_AS_RF_SWITCH
|
||||||
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
||||||
|
|
||||||
|
// Testing USB detection
|
||||||
|
#define NRF_APM
|
||||||
|
|
||||||
|
// enables 3.3V periphery like GPS or IO Module
|
||||||
|
// Do not toggle this for GPS power savings
|
||||||
|
#define PIN_3V3_EN (34)
|
||||||
|
|
||||||
|
// RAK1910 GPS module
|
||||||
|
// If using the wisblock GPS module and pluged into Port A on WisBlock base
|
||||||
|
// IO1 is hooked to PPS (pin 12 on header) = gpio 17
|
||||||
|
// IO2 is hooked to GPS RESET = gpio 34, but it can not be used to this because IO2 is ALSO used to control 3V3_S power (1 is on).
|
||||||
|
// Therefore must be 1 to keep peripherals powered
|
||||||
|
// Power is on the controllable 3V3_S rail
|
||||||
|
// #define PIN_GPS_RESET (34)
|
||||||
|
// #define PIN_GPS_EN PIN_3V3_EN
|
||||||
|
#define PIN_GPS_PPS (17) // Pulse per second input from the GPS
|
||||||
|
|
||||||
|
// On RAK2560 the GPS is be on a different UART
|
||||||
|
// #define GPS_RX_PIN PIN_SERIAL2_RX
|
||||||
|
// #define GPS_TX_PIN PIN_SERIAL2_TX
|
||||||
|
// #define PIN_GPS_EN PIN_3V3_EN
|
||||||
|
// Disable GPS
|
||||||
|
#define MESHTASTIC_EXCLUDE_GPS 1
|
||||||
|
// Define pin to enable GPS toggle (set GPIO to LOW) via user button triple press
|
||||||
|
|
||||||
|
// RAK12002 RTC Module
|
||||||
|
#define RV3028_RTC (uint8_t)0b1010010
|
||||||
|
|
||||||
|
// RAK18001 Buzzer in Slot C
|
||||||
|
// #define PIN_BUZZER 21 // IO3 is PWM2
|
||||||
|
// NEW: set this via protobuf instead!
|
||||||
|
|
||||||
|
// Battery
|
||||||
|
// The battery sense is hooked to pin A0 (5)
|
||||||
|
#define BATTERY_PIN PIN_A0
|
||||||
|
// and has 12 bit resolution
|
||||||
|
#define BATTERY_SENSE_RESOLUTION_BITS 12
|
||||||
|
#define BATTERY_SENSE_RESOLUTION 4096.0
|
||||||
|
#undef AREF_VOLTAGE
|
||||||
|
#define AREF_VOLTAGE 3.0
|
||||||
|
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
||||||
|
#define ADC_MULTIPLIER 1.73
|
||||||
|
|
||||||
|
#define HAS_RTC 1
|
||||||
|
|
||||||
|
#define HAS_ETHERNET 1
|
||||||
|
|
||||||
|
#define RAK_4631 1
|
||||||
|
|
||||||
|
#define HALF_UART_PIN PIN_SERIAL1_RX
|
||||||
|
|
||||||
|
#if defined(GPS_RX_PIN) && (GPS_RX_PIN == HALF_UART_PIN)
|
||||||
|
#error pin 15 collision
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GPS_TX_PIN) && (GPS_RX_PIN == HALF_UART_PIN)
|
||||||
|
#error pin 15 collision
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PIN_ETHERNET_RESET 21
|
||||||
|
#define PIN_ETHERNET_SS PIN_EINK_CS
|
||||||
|
#define ETH_SPI_PORT SPI1
|
||||||
|
#define AQ_SET_PIN 10
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Arduino objects - C++ only
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user