mirror of
https://github.com/thelsing/knx.git
synced 2025-04-19 01:15:27 +02:00
H8I8O (#209)
* Add defines for LED, button and serial port To make supporting different board layouts easier, this introduces some new defines: For all platforms: - `KNX_LED` - the programming LED, defaults to `LED_BUILTIN` - `KNX_BUTTON` - the programming button, defaults to `0` For Arduino platforms: - `KNX_DEBUG_SERIAL` - the serial port that is used for debugging, defaults to `Serial` - `KNX_SERIAL` - the serial port used for communication with the TPUART, default depends on platform * GD32 flash workaround Addressing #181 At least some GD32 devices seem to require unlocking the flash twice. As the unlock function exits with `HAL_OK` if the flash is already unlocked, STM32 devices can run the same code without issues. * Add H8I8O and H8C09 configurations to knx-demo Addressing #181 These configurations both serve as examples for the use of these boards and other custom boards that don't use the standard pinout. * Add STM32 unlock target This copies the brute force unlock approach by @pavkriz into a custom target. With this commit, it is possible to automatically unlock e.g. a H8I8O board without leaving the PlatformIO IDE. See #181
This commit is contained in:
parent
bd907c242d
commit
8b9ff4fce1
@ -100,3 +100,50 @@ lib_deps =
|
|||||||
build_flags =
|
build_flags =
|
||||||
-DMASK_VERSION=0x07B0
|
-DMASK_VERSION=0x07B0
|
||||||
-Wno-unknown-pragmas
|
-Wno-unknown-pragmas
|
||||||
|
|
||||||
|
;--- STM32/GD32 ---
|
||||||
|
[env:h8i8o]
|
||||||
|
platform = ststm32
|
||||||
|
board = genericSTM32F103CB
|
||||||
|
framework = arduino
|
||||||
|
; We consider that the this projects is opened within its project directory
|
||||||
|
; while working with VS Code.
|
||||||
|
lib_extra_dirs = ../../../
|
||||||
|
|
||||||
|
lib_deps =
|
||||||
|
knx
|
||||||
|
|
||||||
|
build_flags =
|
||||||
|
-DENABLE_HWSERIAL1
|
||||||
|
-DPIN_SERIAL1_TX=PA9
|
||||||
|
-DPIN_SERIAL1_RX=PA10
|
||||||
|
-DKNX_SERIAL=Serial1
|
||||||
|
-DKNX_BUTTON=PA11
|
||||||
|
-DKNX_LED=PA12
|
||||||
|
-DMASK_VERSION=0x07B0
|
||||||
|
-Wno-unknown-pragmas
|
||||||
|
|
||||||
|
extra_scripts = ../scripts/stm32rdu.py
|
||||||
|
|
||||||
|
[env:h8c09]
|
||||||
|
platform = ststm32
|
||||||
|
board = genericSTM32F103CB
|
||||||
|
framework = arduino
|
||||||
|
; We consider that the this projects is opened within its project directory
|
||||||
|
; while working with VS Code.
|
||||||
|
lib_extra_dirs = ../../../
|
||||||
|
|
||||||
|
lib_deps =
|
||||||
|
knx
|
||||||
|
|
||||||
|
build_flags =
|
||||||
|
-DENABLE_HWSERIAL1
|
||||||
|
-DPIN_SERIAL1_TX=PA9
|
||||||
|
-DPIN_SERIAL1_RX=PA10
|
||||||
|
-DKNX_SERIAL=Serial1
|
||||||
|
-DKNX_BUTTON=PB0
|
||||||
|
-DKNX_LED=PB5
|
||||||
|
-DMASK_VERSION=0x07B0
|
||||||
|
-Wno-unknown-pragmas
|
||||||
|
|
||||||
|
extra_scripts = ../scripts/stm32rdu.py
|
||||||
|
34
examples/scripts/stm32rdu.py
Executable file
34
examples/scripts/stm32rdu.py
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from subprocess import run
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from os.path import expanduser
|
||||||
|
|
||||||
|
ocddir = expanduser("~/.platformio/packages/tool-openocd/")
|
||||||
|
chip = "stm32f1x"
|
||||||
|
|
||||||
|
def unlock(*args, **kwargs):
|
||||||
|
print("Please connect the board within the next two minutes.")
|
||||||
|
endtime = datetime.now() + timedelta(minutes = 1)
|
||||||
|
ret = 1
|
||||||
|
while ret != 0 and datetime.now() < endtime:
|
||||||
|
ret = run(["bin/openocd", "-f", "interface/stlink.cfg", "-f", "target/" + chip + ".cfg", "-c", "init", "-c", "reset halt", "-c", chip + " unlock 0", "-c", "reset halt", "-c", "exit"], cwd = ocddir).returncode
|
||||||
|
if ret != 0:
|
||||||
|
print("Timeout")
|
||||||
|
return ret
|
||||||
|
|
||||||
|
try:
|
||||||
|
Import("env")
|
||||||
|
except NameError:
|
||||||
|
import sys
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
chip = sys.argv[1]
|
||||||
|
if len(sys.argv) > 2:
|
||||||
|
ocddir = sys.argv[2]
|
||||||
|
unlock(None, None)
|
||||||
|
else:
|
||||||
|
ocddir = env.PioPlatform().get_package_dir("tool-openocd")
|
||||||
|
options = env.GetProjectOptions()
|
||||||
|
for option in options:
|
||||||
|
if "unlock_chip" == option[0]:
|
||||||
|
chip = option[1]
|
||||||
|
env.AddCustomTarget("unlock", None, unlock)
|
@ -7,7 +7,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef KNX_NO_PRINT
|
#ifndef KNX_NO_PRINT
|
||||||
Stream* ArduinoPlatform::SerialDebug = &Serial;
|
Stream* ArduinoPlatform::SerialDebug = &KNX_DEBUG_SERIAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ArduinoPlatform::ArduinoPlatform() : _knxSerial(nullptr)
|
ArduinoPlatform::ArduinoPlatform() : _knxSerial(nullptr)
|
||||||
@ -22,13 +22,13 @@ void ArduinoPlatform::fatalError()
|
|||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
#ifdef LED_BUILTIN
|
#ifdef KNX_LED
|
||||||
static const long LED_BLINK_PERIOD = 200;
|
static const long LED_BLINK_PERIOD = 200;
|
||||||
|
|
||||||
if ((millis() % LED_BLINK_PERIOD) > (LED_BLINK_PERIOD / 2))
|
if ((millis() % LED_BLINK_PERIOD) > (LED_BLINK_PERIOD / 2))
|
||||||
digitalWrite(LED_BUILTIN, HIGH);
|
digitalWrite(KNX_LED, HIGH);
|
||||||
else
|
else
|
||||||
digitalWrite(LED_BUILTIN, LOW);
|
digitalWrite(KNX_LED, LOW);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
|
|
||||||
|
#ifndef KNX_DEBUG_SERIAL
|
||||||
|
#define KNX_DEBUG_SERIAL Serial
|
||||||
|
#endif
|
||||||
|
|
||||||
class ArduinoPlatform : public Platform
|
class ArduinoPlatform : public Platform
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -6,9 +6,13 @@
|
|||||||
|
|
||||||
#include "knx/bits.h"
|
#include "knx/bits.h"
|
||||||
|
|
||||||
|
#ifndef KNX_SERIAL
|
||||||
|
#define KNX_SERIAL Serial1
|
||||||
|
#endif
|
||||||
|
|
||||||
Esp32Platform::Esp32Platform()
|
Esp32Platform::Esp32Platform()
|
||||||
#ifndef KNX_NO_DEFAULT_UART
|
#ifndef KNX_NO_DEFAULT_UART
|
||||||
: ArduinoPlatform(&Serial1)
|
: ArduinoPlatform(&KNX_SERIAL)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -55,10 +59,10 @@ void Esp32Platform::setupMultiCast(uint32_t addr, uint16_t port)
|
|||||||
{
|
{
|
||||||
IPAddress mcastaddr(htonl(addr));
|
IPAddress mcastaddr(htonl(addr));
|
||||||
|
|
||||||
Serial.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port,
|
KNX_DEBUG_SERIAL.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port,
|
||||||
WiFi.localIP().toString().c_str());
|
WiFi.localIP().toString().c_str());
|
||||||
uint8_t result = _udp.beginMulticast(mcastaddr, port);
|
uint8_t result = _udp.beginMulticast(mcastaddr, port);
|
||||||
Serial.printf("result %d\n", result);
|
KNX_DEBUG_SERIAL.printf("result %d\n", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Esp32Platform::closeMultiCast()
|
void Esp32Platform::closeMultiCast()
|
||||||
@ -83,7 +87,7 @@ int Esp32Platform::readBytesMultiCast(uint8_t * buffer, uint16_t maxLen)
|
|||||||
|
|
||||||
if (len > maxLen)
|
if (len > maxLen)
|
||||||
{
|
{
|
||||||
Serial.printf("udp buffer to small. was %d, needed %d\n", maxLen, len);
|
KNX_DEBUG_SERIAL.printf("udp buffer to small. was %d, needed %d\n", maxLen, len);
|
||||||
fatalError();
|
fatalError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,9 +7,13 @@
|
|||||||
|
|
||||||
#include "knx/bits.h"
|
#include "knx/bits.h"
|
||||||
|
|
||||||
|
#ifndef KNX_SERIAL
|
||||||
|
#define KNX_SERIAL Serial
|
||||||
|
#endif
|
||||||
|
|
||||||
EspPlatform::EspPlatform()
|
EspPlatform::EspPlatform()
|
||||||
#ifndef KNX_NO_DEFAULT_UART
|
#ifndef KNX_NO_DEFAULT_UART
|
||||||
: ArduinoPlatform(&Serial)
|
: ArduinoPlatform(&KNX_SERIAL)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -55,10 +59,10 @@ void EspPlatform::setupMultiCast(uint32_t addr, uint16_t port)
|
|||||||
_multicastPort = port;
|
_multicastPort = port;
|
||||||
IPAddress mcastaddr(_multicastAddr);
|
IPAddress mcastaddr(_multicastAddr);
|
||||||
|
|
||||||
Serial.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port,
|
KNX_DEBUG_SERIAL.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port,
|
||||||
WiFi.localIP().toString().c_str());
|
WiFi.localIP().toString().c_str());
|
||||||
uint8 result = _udp.beginMulticast(WiFi.localIP(), mcastaddr, port);
|
uint8 result = _udp.beginMulticast(WiFi.localIP(), mcastaddr, port);
|
||||||
Serial.printf("result %d\n", result);
|
KNX_DEBUG_SERIAL.printf("result %d\n", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EspPlatform::closeMultiCast()
|
void EspPlatform::closeMultiCast()
|
||||||
@ -83,7 +87,7 @@ int EspPlatform::readBytesMultiCast(uint8_t * buffer, uint16_t maxLen)
|
|||||||
|
|
||||||
if (len > maxLen)
|
if (len > maxLen)
|
||||||
{
|
{
|
||||||
Serial.printf("udp buffer to small. was %d, needed %d\n", maxLen, len);
|
KNX_DEBUG_SERIAL.printf("udp buffer to small. was %d, needed %d\n", maxLen, len);
|
||||||
fatalError();
|
fatalError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,13 +48,20 @@
|
|||||||
#else
|
#else
|
||||||
#if !defined(LED_BUILTIN)
|
#if !defined(LED_BUILTIN)
|
||||||
#define LED_BUILTIN 5 // see GPIO_PinConfig gpioPinConfigs[]
|
#define LED_BUILTIN 5 // see GPIO_PinConfig gpioPinConfigs[]
|
||||||
#endif
|
#endif
|
||||||
#include "cc1310_platform.h"
|
#include "cc1310_platform.h"
|
||||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||||
extern void buttonUp();
|
extern void buttonUp();
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef KNX_LED
|
||||||
|
#define KNX_LED LED_BUILTIN
|
||||||
|
#endif
|
||||||
|
#ifndef KNX_BUTTON
|
||||||
|
#define KNX_BUTTON 0
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef const uint8_t* (*RestoreCallback)(const uint8_t* buffer);
|
typedef const uint8_t* (*RestoreCallback)(const uint8_t* buffer);
|
||||||
typedef uint8_t* (*SaveCallback)(uint8_t* buffer);
|
typedef uint8_t* (*SaveCallback)(uint8_t* buffer);
|
||||||
typedef void (*IsrFunctionPtr)();
|
typedef void (*IsrFunctionPtr)();
|
||||||
@ -405,8 +412,8 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
|||||||
ProgLedOnCallback _progLedOnCallback = 0;
|
ProgLedOnCallback _progLedOnCallback = 0;
|
||||||
ProgLedOffCallback _progLedOffCallback = 0;
|
ProgLedOffCallback _progLedOffCallback = 0;
|
||||||
uint32_t _ledPinActiveOn = LOW;
|
uint32_t _ledPinActiveOn = LOW;
|
||||||
uint32_t _ledPin = LED_BUILTIN;
|
uint32_t _ledPin = KNX_LED;
|
||||||
uint32_t _buttonPin = 0;
|
uint32_t _buttonPin = KNX_BUTTON;
|
||||||
SaveCallback _saveCallback = 0;
|
SaveCallback _saveCallback = 0;
|
||||||
RestoreCallback _restoreCallback = 0;
|
RestoreCallback _restoreCallback = 0;
|
||||||
volatile bool _toggleProgMode = false;
|
volatile bool _toggleProgMode = false;
|
||||||
|
@ -43,10 +43,13 @@ A RAM-buffered Flash can be use by defining USE_RP2040_LARGE_EEPROM_EMULATION
|
|||||||
#error "KNX_FLASH_OFFSET must be multiple of 4096"
|
#error "KNX_FLASH_OFFSET must be multiple of 4096"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef KNX_SERIAL
|
||||||
|
#define KNX_SERIAL Serial1
|
||||||
|
#endif
|
||||||
|
|
||||||
RP2040ArduinoPlatform::RP2040ArduinoPlatform()
|
RP2040ArduinoPlatform::RP2040ArduinoPlatform()
|
||||||
#ifndef KNX_NO_DEFAULT_UART
|
#ifndef KNX_NO_DEFAULT_UART
|
||||||
: ArduinoPlatform(&Serial1)
|
: ArduinoPlatform(&KNX_SERIAL)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifndef USE_RP2040_EEPROM_EMULATION
|
#ifndef USE_RP2040_EEPROM_EMULATION
|
||||||
|
@ -12,9 +12,13 @@
|
|||||||
#error "KNX_FLASH_SIZE must be multiple of 1024"
|
#error "KNX_FLASH_SIZE must be multiple of 1024"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef KNX_SERIAL
|
||||||
|
#define KNX_SERIAL Serial1
|
||||||
|
#endif
|
||||||
|
|
||||||
SamdPlatform::SamdPlatform()
|
SamdPlatform::SamdPlatform()
|
||||||
#ifndef KNX_NO_DEFAULT_UART
|
#ifndef KNX_NO_DEFAULT_UART
|
||||||
: ArduinoPlatform(&Serial1)
|
: ArduinoPlatform(&KNX_SERIAL)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifndef USE_SAMD_EEPROM_EMULATION
|
#ifndef USE_SAMD_EEPROM_EMULATION
|
||||||
|
@ -4,9 +4,13 @@
|
|||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
#include "knx/bits.h"
|
#include "knx/bits.h"
|
||||||
|
|
||||||
|
#ifndef KNX_SERIAL
|
||||||
|
#define KNX_SERIAL Serial2
|
||||||
|
#endif
|
||||||
|
|
||||||
Stm32Platform::Stm32Platform()
|
Stm32Platform::Stm32Platform()
|
||||||
#ifndef KNX_NO_DEFAULT_UART
|
#ifndef KNX_NO_DEFAULT_UART
|
||||||
: ArduinoPlatform(&Serial2)
|
: ArduinoPlatform(&KNX_SERIAL)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -56,6 +60,11 @@ void Stm32Platform::commitToEeprom()
|
|||||||
return;
|
return;
|
||||||
for (uint16_t i = 0; i < _eepromSize; ++i)
|
for (uint16_t i = 0; i < _eepromSize; ++i)
|
||||||
eeprom_buffered_write_byte(i, _eepromPtr[i]);
|
eeprom_buffered_write_byte(i, _eepromPtr[i]);
|
||||||
|
// For some GD32 chips, the flash needs to be unlocked twice
|
||||||
|
// and the first call will fail. If the first call is
|
||||||
|
// successful, the second one (inside eeprom_buffer_flush)
|
||||||
|
// does nothing.
|
||||||
|
HAL_FLASH_Unlock();
|
||||||
eeprom_buffer_flush();
|
eeprom_buffer_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user