added support for RP2040 (Raspberry Pi Pico) (#145)

This commit is contained in:
SirSydom 2021-07-08 19:45:33 +02:00 committed by GitHub
parent 6254fc9b67
commit 4f6c837b78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 135 additions and 4 deletions

View File

@ -5,7 +5,7 @@
#if defined(__linux__) #if defined(__linux__)
#include <arpa/inet.h> #include <arpa/inet.h>
#elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32) || defined (DeviceFamily_CC13X0) #elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_STM32) || defined (DeviceFamily_CC13X0)
#define getbyte(x,n) (*(((uint8_t*)&(x))+n)) #define getbyte(x,n) (*(((uint8_t*)&(x))+n))
#define htons(x) ( (getbyte(x,0)<<8) | getbyte(x,1) ) #define htons(x) ( (getbyte(x,0)<<8) | getbyte(x,1) )
#define htonl(x) ( (getbyte(x,0)<<24) | (getbyte(x,1)<<16) | (getbyte(x,2)<<8) | getbyte(x,3) ) #define htonl(x) ( (getbyte(x,0)<<24) | (getbyte(x,1)<<16) | (getbyte(x,2)<<8) | getbyte(x,3) )
@ -25,7 +25,7 @@
#define ABS(x) ((x > 0) ? (x) : (-x)) #define ABS(x) ((x > 0) ? (x) : (-x))
#endif #endif
#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_STM32) #if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_STM32)
#include <Arduino.h> #include <Arduino.h>
#elif defined(ARDUINO_ARCH_ESP8266) #elif defined(ARDUINO_ARCH_ESP8266)
#include <Arduino.h> #include <Arduino.h>

View File

@ -20,7 +20,7 @@ enum ComFlag
class GroupObject; class GroupObject;
#ifndef HAS_FUNCTIONAL #ifndef HAS_FUNCTIONAL
# if defined(__linux__) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_STM32) || defined (ARDUINO_ARCH_SAMD) # if defined(__linux__) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_STM32) || defined (ARDUINO_ARCH_SAMD) || defined (ARDUINO_ARCH_RP2040)
# define HAS_FUNCTIONAL 1 # define HAS_FUNCTIONAL 1
# else # else
# define HAS_FUNCTIONAL 0 # define HAS_FUNCTIONAL 0

View File

@ -7,7 +7,8 @@
#if (defined(ARDUINO_ARCH_STM32) || \ #if (defined(ARDUINO_ARCH_STM32) || \
defined(ARDUINO_ARCH_ESP32) || \ defined(ARDUINO_ARCH_ESP32) || \
defined(ARDUINO_ARCH_ESP8266) || \ defined(ARDUINO_ARCH_ESP8266) || \
defined(ARDUINO_ARCH_SAMD)) defined(ARDUINO_ARCH_SAMD) || \
defined(ARDUINO_ARCH_RP2040))
// Only ESP8266 and ESP32 have this define. For all other platforms this is just empty. // Only ESP8266 and ESP32 have this define. For all other platforms this is just empty.
#ifndef ICACHE_RAM_ATTR #ifndef ICACHE_RAM_ATTR
@ -35,6 +36,17 @@
#else #else
#error "Mask version not supported on ARDUINO_ARCH_SAMD" #error "Mask version not supported on ARDUINO_ARCH_SAMD"
#endif #endif
#elif defined(ARDUINO_ARCH_RP2040)
// predefined global instance for TP or RF or TP/RF coupler
#if MASK_VERSION == 0x07B0
KnxFacade<RP2040ArduinoPlatform, Bau07B0> knx(buttonUp);
#elif MASK_VERSION == 0x27B0
KnxFacade<RP2040ArduinoPlatform, Bau27B0> knx(buttonUp);
#elif MASK_VERSION == 0x2920
KnxFacade<RP2040ArduinoPlatform, Bau2920> knx(buttonUp);
#else
#error "Mask version not supported on ARDUINO_ARCH_RP2040"
#endif
#elif defined(ARDUINO_ARCH_ESP8266) #elif defined(ARDUINO_ARCH_ESP8266)
// predefined global instance for TP or IP or TP/IP coupler // predefined global instance for TP or IP or TP/IP coupler

View File

@ -17,6 +17,11 @@
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE #ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
void buttonUp(); void buttonUp();
#endif #endif
#elif defined(ARDUINO_ARCH_RP2040)
#include "rp2040_arduino_platform.h"
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
void buttonUp();
#endif
#elif defined(ARDUINO_ARCH_ESP8266) #elif defined(ARDUINO_ARCH_ESP8266)
#include "esp_platform.h" #include "esp_platform.h"
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE #ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
@ -387,6 +392,17 @@ template <class P, class B> class KnxFacade : private SaveRestore
#else #else
#error "Mask version not supported on ARDUINO_ARCH_SAMD" #error "Mask version not supported on ARDUINO_ARCH_SAMD"
#endif #endif
#elif defined(ARDUINO_ARCH_RP2040)
// predefined global instance for TP or RF or TP/RF coupler
#if MASK_VERSION == 0x07B0
extern KnxFacade<RP2040ArduinoPlatform, Bau07B0> knx;
#elif MASK_VERSION == 0x27B0
extern KnxFacade<RP2040ArduinoPlatform, Bau27B0> knx;
#elif MASK_VERSION == 0x2920
extern KnxFacade<RP2040ArduinoPlatform, Bau2920> knx;
#else
#error "Mask version not supported on ARDUINO_ARCH_RP2040"
#endif
#elif defined(ARDUINO_ARCH_ESP8266) #elif defined(ARDUINO_ARCH_ESP8266)
// predefined global instance for TP or IP or TP/IP coupler // predefined global instance for TP or IP or TP/IP coupler
#if MASK_VERSION == 0x07B0 #if MASK_VERSION == 0x07B0

View File

@ -0,0 +1,82 @@
/*-----------------------------------------------------
Plattform for Raspberry Pi Pico and other RP2040 boards
made to work with arduino-pico - "Raspberry Pi Pico Arduino core, for all RP2040 boards"
by Earl E. Philhower III https://github.com/earlephilhower/arduino-pico
tested with V1.9.1
by SirSydom <com@sirsydom.de> 2021
A maximum of 4kB emulated EEPROM is supported.
For more, use or own emulation (maybe with littlefs)
----------------------------------------------------*/
#include "rp2040_arduino_platform.h"
#ifdef ARDUINO_ARCH_RP2040
#include <knx/bits.h>
#include <Arduino.h>
//Pi Pico specific libs
#include <EEPROM.h> // EEPROM emulation in flash, part of Earl E Philhowers Pi Pico Arduino support
#include <pico/unique_id.h> // from Pico SDK
#include <hardware/watchdog.h> // from Pico SDK
RP2040ArduinoPlatform::RP2040ArduinoPlatform()
#ifndef KNX_NO_DEFAULT_UART
: ArduinoPlatform(&Serial1)
#endif
{
}
RP2040ArduinoPlatform::RP2040ArduinoPlatform( HardwareSerial* s) : ArduinoPlatform(s)
{
}
uint32_t RP2040ArduinoPlatform::uniqueSerialNumber()
{
pico_unique_board_id_t id; // 64Bit unique serial number from the QSPI flash
pico_get_unique_board_id(&id);
// use lower 4 byte and convert to unit32_t
uint32_t uid = ((uint32_t)(id.id[4]) << 24) | ((uint32_t)(id.id[5]) << 16) | ((uint32_t)(id.id[6]) << 8) | (uint32_t)(id.id[7]);
return uid;
}
void RP2040ArduinoPlatform::restart()
{
println("restart");
watchdog_reboot(0,0,0);
}
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint16_t size)
{
if(size > 4096)
{
println("KNX_FLASH_SIZE to big for EEPROM emulation (max. 4kB)");
fatalError();
}
uint8_t * eepromptr = EEPROM.getDataPtr();
if(eepromptr == nullptr)
{
EEPROM.begin(4096);
eepromptr = EEPROM.getDataPtr();
}
return eepromptr;
}
void RP2040ArduinoPlatform::commitToEeprom()
{
EEPROM.commit();
}
#endif

View File

@ -0,0 +1,21 @@
#include "arduino_platform.h"
#include "Arduino.h"
#ifdef ARDUINO_ARCH_RP2040
class RP2040ArduinoPlatform : public ArduinoPlatform
{
public:
RP2040ArduinoPlatform();
RP2040ArduinoPlatform( HardwareSerial* s);
// unique serial number
uint32_t uniqueSerialNumber() override;
void restart();
uint8_t* getEepromBuffer(uint16_t size);
void commitToEeprom();
};
#endif