From 974ae3ffccc44d1d3dd2613c5ff74008b193e8e4 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 24 Mar 2023 07:16:16 +0100 Subject: [PATCH 01/12] Uploading example provided by @facchinm. --- examples/C33-Low-Power/C33-Low-Power.ino | 237 +++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 examples/C33-Low-Power/C33-Low-Power.ino diff --git a/examples/C33-Low-Power/C33-Low-Power.ino b/examples/C33-Low-Power/C33-Low-Power.ino new file mode 100644 index 0000000..affd6a0 --- /dev/null +++ b/examples/C33-Low-Power/C33-Low-Power.ino @@ -0,0 +1,237 @@ +#include "RTC.h" +#include "r_lpm.h" +#include "PF1550.h" +#include "Wire.h" + +class PF1550_Io_C33 : public interface::PF1550_Io +{ + public: + + PF1550_Io_C33(uint8_t const i2c_addr = interface::PF1550_I2C_DEFAULT_ADDR) : _i2c_addr(i2c_addr) {} + virtual ~PF1550_Io_C33() { } + + void turnOffMCURail() { + clrBit(Register::PMIC_SW1_CTRL, 0); + //clrBit(Register::PMIC_SW3_CTRL, 0); + } + + virtual int begin() { + Wire3.begin(); + Wire3.setClock(100000); + uint8_t data[2] = { 0x9C, (1 << 7) }; + writeRegister(PF1550_I2C_ADDR, data, 2, false); + data[0] = 0x9E; + data[1] = (1 << 5); + writeRegister(PF1550_I2C_ADDR, data, 2, false); + + return 1; + } + + virtual void debug(Stream& stream) { + _debug = &stream; + } + + virtual void readRegister(Register const reg_addr, uint8_t *data) { + uint8_t i2c_data[2]; + + i2c_data[0] = (uint8_t)reg_addr; + + writeRegister(PF1550_I2C_ADDR, i2c_data, 1, 1); + + uint8_t retVal = Wire3.requestFrom(PF1550_I2C_ADDR, 1, true); + + if (_debug) { + _debug->print("requestFrom: "); + _debug->println(retVal); + } + + int i = 0; + while (Wire3.available() && i < 1) { + data[0] = Wire3.read(); + i++; + } + + if (_debug) { + _debug->println("Read:"); + for (i = 0; i < 1; i++) { + _debug->println(data[i], HEX); + } + } + } + + virtual void writeRegister(uint8_t slave_addr, uint8_t *data, uint8_t data_len, uint8_t restart) { + if (_debug) { + _debug->print("Restart: "); + _debug->println(restart); + if (!restart) { + _debug->print("PF1550_Io_EnvieH747::writeRegister at address="); + _debug->print(data[0], HEX); + _debug->print(" data="); + _debug->println(data[1], HEX); + _debug->print("i2c slave address: "); + _debug->println(slave_addr); + } else { + _debug->print("PF1550_Io_EnvieH747::Read from register at address="); + _debug->println(data[0], HEX); + } + } + + Wire3.beginTransmission(slave_addr); + Wire3.write(data, data_len); + uint8_t retVal = Wire3.endTransmission(restart == 0 ? true : false); + + if (_debug) { + _debug->print("End transmission: "); + _debug->println(retVal); + } + /* + if (_debug) { + _debug->println("Write:"); + for (int i = 0; i < data_len; i++) { + _debug->println(data[i], HEX); + } + } + */ + } + virtual void setSTANDBY() {} + virtual void clrSTANDBY() {} + + private: + + uint8_t const _i2c_addr; + Stream* _debug; +}; + +static PF1550_Io_C33 io; +PF1550 myPMIC(io); + +const int LED_ON_INTERRUPT = LED_BUILTIN; + +void periodic_cbk() { + static bool clb_st = false; + if (clb_st) { + //digitalWrite(LED_ON_INTERRUPT, HIGH); + } + else { + //digitalWrite(LED_ON_INTERRUPT, LOW); + } + clb_st = !clb_st; + + Serial.println("PERIODIC INTERRUPT"); +} + +void alarm_cbk() { + Serial.println("ALARM INTERRUPT"); + digitalWrite(LED_ON_INTERRUPT, LOW); + delay(500); + digitalWrite(LED_ON_INTERRUPT, HIGH); +} + +lpm_instance_ctrl_t p_api_ctrl; +lpm_cfg_t p_cfg; + +void setup() { + Serial.begin(9600); + + myPMIC.debug(Serial); + myPMIC.begin(); + myPMIC.configLDO1(Ldo1Voltage::V_3_30, false, false, false); + myPMIC.configLDO2(Ldo2Voltage::V_3_30, false, false, false); + myPMIC.configLDO3(Ldo3Voltage::V_1_20, false, false, false); + myPMIC.configSw2(Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2CurrentLimit::I_1_5_A, false, false, false); + + //io.turnOffMCURail(); + + p_cfg.low_power_mode = LPM_MODE_DEEP; // LPM_MODE_SLEEP LPM_MODE_STANDBY LPM_MODE_STANDBY_SNOOZE LPM_MODE_DEEP + p_cfg.standby_wake_sources = LPM_STANDBY_WAKE_SOURCE_IRQ0 | LPM_STANDBY_WAKE_SOURCE_RTCALM; + p_cfg.dtc_state_in_snooze = LPM_SNOOZE_DTC_DISABLE; // LPM_SNOOZE_DTC_ENABLE LPM_SNOOZE_DTC_DISABLE + p_cfg.power_supply_state = LPM_POWER_SUPPLY_DEEPCUT0; // LPM_POWER_SUPPLY_DEEPCUT0, LPM_POWER_SUPPLY_DEEPCUT1, LPM_POWER_SUPPLY_DEEPCUT3 + p_cfg.output_port_enable = LPM_OUTPUT_PORT_ENABLE_RETAIN; // LPM_OUTPUT_PORT_ENABLE_RETAIN LPM_OUTPUT_PORT_ENABLE_HIGH_IMPEDANCE + p_cfg.io_port_state = LPM_IO_PORT_NO_CHANGE; // LPM_IO_PORT_NO_CHANGE LPM_IO_PORT_RESET + p_cfg.deep_standby_cancel_source = LPM_DEEP_STANDBY_CANCEL_SOURCE_RTC_ALARM; + + R_LPM_Open(&p_api_ctrl, &p_cfg); + + //pinMode(LED_BUILTIN, OUTPUT); + pinMode(LED_ON_INTERRUPT, OUTPUT); + digitalWrite(LED_ON_INTERRUPT, HIGH); + + pinMode(LEDR, OUTPUT); + digitalWrite(LEDR, LOW); + delay(200); + digitalWrite(LEDR, HIGH); + + RTC.begin(); + RTCTime mytime(1, Month::JANUARY, 2000, 12, 10, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE); + + if (!RTC.isRunning()) { + RTC.setTime(mytime); + } + + RTCTime alarmtime; + alarmtime.setSecond(35); + + AlarmMatch am; + am.addMatchSecond(); + + if (!RTC.setPeriodicCallback(periodic_cbk, Period::ONCE_EVERY_2_SEC)) { + Serial.println("ERROR: periodic callback not set"); + } + + if (!RTC.setAlarmCallback(alarm_cbk, alarmtime, am)) { + Serial.println("ERROR: alarm callback not set"); + } + +} + +void loop() { + static bool status = false; + + R_LPM_LowPowerModeEnter(&p_api_ctrl); + + RTCTime currenttime; + if (status) { + + if (RTC.isRunning()) { + Serial.println("RTC is running"); + } + else { + Serial.println("RTC is not running"); + } + + /* GET CURRENT TIME FROM RTC */ + RTC.getTime(currenttime); + + /* PRINT CURRENT TIME on Serial */ + Serial.print("Current time: "); + /* DATE */ + Serial.print(currenttime.getDayOfMonth()); + Serial.print("/"); + Serial.print(Month2int(currenttime.getMonth())); + Serial.print("/"); + Serial.print(currenttime.getYear()); + Serial.print(" - "); + Serial.print(currenttime.getUnixTime()); + Serial.print(" - "); + + struct timeval tv; + gettimeofday(&tv, NULL); + Serial.print(tv.tv_sec); + Serial.print(" - "); + + /* ORE:MINUTI:SECONDI */ + Serial.print(currenttime.getHour()); + Serial.print(":"); + Serial.print(currenttime.getMinutes()); + Serial.print(":"); + Serial.println(currenttime.getSeconds()); + + //digitalWrite(LED_BUILTIN, HIGH); + } + else { + //digitalWrite(LED_BUILTIN, LOW); + } + + status = !status; + delay(1000); +} From 9337eef2d868afd5649c0c1c2cb21bda78695dc8 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 24 Mar 2023 07:17:11 +0100 Subject: [PATCH 02/12] Add renesas to list of supported architectures. --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 2d8d843..39de148 100644 --- a/library.properties +++ b/library.properties @@ -6,4 +6,4 @@ sentence=Arduino library for the PF1550 Power Management IC paragraph=This library allows the control and configuration of the PF1550 used on various Arduino boards. category=Device Control url=https://github.com/arduino-libraries/Arduino_PF1550 -architectures=mbed,mbed_nicla,mbed_portenta +architectures=mbed,mbed_nicla,mbed_portenta,renesas From 4a83c881ba7a762ef1042ed66f5d705e4178fca3 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 24 Mar 2023 08:59:33 +0100 Subject: [PATCH 03/12] Extract C33 IO class into library (out of sketch). --- examples/C33-Low-Power/C33-Low-Power.ino | 121 +++------------------ src/PF1550.cpp | 5 + src/PF1550/PF1550_Io_C33.cpp | 131 +++++++++++++++++++++++ src/PF1550/PF1550_Io_C33.h | 53 +++++++++ 4 files changed, 204 insertions(+), 106 deletions(-) create mode 100644 src/PF1550/PF1550_Io_C33.cpp create mode 100644 src/PF1550/PF1550_Io_C33.h diff --git a/examples/C33-Low-Power/C33-Low-Power.ino b/examples/C33-Low-Power/C33-Low-Power.ino index affd6a0..6bba8d5 100644 --- a/examples/C33-Low-Power/C33-Low-Power.ino +++ b/examples/C33-Low-Power/C33-Low-Power.ino @@ -3,107 +3,15 @@ #include "PF1550.h" #include "Wire.h" -class PF1550_Io_C33 : public interface::PF1550_Io +/* +class PF1550_Io_C33 : public PF1550_Io_C33 { - public: - - PF1550_Io_C33(uint8_t const i2c_addr = interface::PF1550_I2C_DEFAULT_ADDR) : _i2c_addr(i2c_addr) {} - virtual ~PF1550_Io_C33() { } - - void turnOffMCURail() { - clrBit(Register::PMIC_SW1_CTRL, 0); - //clrBit(Register::PMIC_SW3_CTRL, 0); - } - - virtual int begin() { - Wire3.begin(); - Wire3.setClock(100000); - uint8_t data[2] = { 0x9C, (1 << 7) }; - writeRegister(PF1550_I2C_ADDR, data, 2, false); - data[0] = 0x9E; - data[1] = (1 << 5); - writeRegister(PF1550_I2C_ADDR, data, 2, false); - - return 1; - } - - virtual void debug(Stream& stream) { - _debug = &stream; - } - - virtual void readRegister(Register const reg_addr, uint8_t *data) { - uint8_t i2c_data[2]; - - i2c_data[0] = (uint8_t)reg_addr; - - writeRegister(PF1550_I2C_ADDR, i2c_data, 1, 1); - - uint8_t retVal = Wire3.requestFrom(PF1550_I2C_ADDR, 1, true); - - if (_debug) { - _debug->print("requestFrom: "); - _debug->println(retVal); - } - - int i = 0; - while (Wire3.available() && i < 1) { - data[0] = Wire3.read(); - i++; - } - - if (_debug) { - _debug->println("Read:"); - for (i = 0; i < 1; i++) { - _debug->println(data[i], HEX); - } - } - } - - virtual void writeRegister(uint8_t slave_addr, uint8_t *data, uint8_t data_len, uint8_t restart) { - if (_debug) { - _debug->print("Restart: "); - _debug->println(restart); - if (!restart) { - _debug->print("PF1550_Io_EnvieH747::writeRegister at address="); - _debug->print(data[0], HEX); - _debug->print(" data="); - _debug->println(data[1], HEX); - _debug->print("i2c slave address: "); - _debug->println(slave_addr); - } else { - _debug->print("PF1550_Io_EnvieH747::Read from register at address="); - _debug->println(data[0], HEX); - } - } - - Wire3.beginTransmission(slave_addr); - Wire3.write(data, data_len); - uint8_t retVal = Wire3.endTransmission(restart == 0 ? true : false); - - if (_debug) { - _debug->print("End transmission: "); - _debug->println(retVal); - } - /* - if (_debug) { - _debug->println("Write:"); - for (int i = 0; i < data_len; i++) { - _debug->println(data[i], HEX); - } - } - */ - } - virtual void setSTANDBY() {} - virtual void clrSTANDBY() {} - - private: - - uint8_t const _i2c_addr; - Stream* _debug; + void turnOffMCURail() { + clrBit(Register::PMIC_SW1_CTRL, 0); + //clrBit(Register::PMIC_SW3_CTRL, 0); + } }; - -static PF1550_Io_C33 io; -PF1550 myPMIC(io); +*/ const int LED_ON_INTERRUPT = LED_BUILTIN; @@ -132,13 +40,14 @@ lpm_cfg_t p_cfg; void setup() { Serial.begin(9600); - - myPMIC.debug(Serial); - myPMIC.begin(); - myPMIC.configLDO1(Ldo1Voltage::V_3_30, false, false, false); - myPMIC.configLDO2(Ldo2Voltage::V_3_30, false, false, false); - myPMIC.configLDO3(Ldo3Voltage::V_1_20, false, false, false); - myPMIC.configSw2(Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2CurrentLimit::I_1_5_A, false, false, false); + while (!Serial) { } + + PMIC.debug(Serial); + PMIC.begin(); + PMIC.configLDO1(Ldo1Voltage::V_3_30, false, false, false); + PMIC.configLDO2(Ldo2Voltage::V_3_30, false, false, false); + PMIC.configLDO3(Ldo3Voltage::V_1_20, false, false, false); + PMIC.configSw2(Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2CurrentLimit::I_1_5_A, false, false, false); //io.turnOffMCURail(); diff --git a/src/PF1550.cpp b/src/PF1550.cpp index 72a46f0..f22e3f3 100644 --- a/src/PF1550.cpp +++ b/src/PF1550.cpp @@ -22,6 +22,7 @@ #include "PF1550.h" +#include "PF1550/PF1550_Io_C33.h" #include "PF1550/PF1550_Io_EnvieH747.h" /****************************************************************************** @@ -157,6 +158,10 @@ void PF1550::configCharger(IFastCharge const i_fast_charge, EXTERN DEFINITION ******************************************************************************/ +#ifdef ARDUINO_PORTENTA_H33 +static PF1550_Io_C33 io; +#else static PF1550_Io_EnvieH747 io; +#endif PF1550 PMIC(io); diff --git a/src/PF1550/PF1550_Io_C33.cpp b/src/PF1550/PF1550_Io_C33.cpp new file mode 100644 index 0000000..6f9768a --- /dev/null +++ b/src/PF1550/PF1550_Io_C33.cpp @@ -0,0 +1,131 @@ +/* + Copyright (c) 2019 Arduino. All right reserved. + + 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 + ******************************************************************************/ + +#include "PF1550_Io_C33.h" + +#ifdef ARDUINO_PORTENTA_H33 + +#include "Wire.h" +#include "Arduino.h" + +/****************************************************************************** + CTOR/DTOR + ******************************************************************************/ + +PF1550_Io_C33::PF1550_Io_C33(uint8_t const i2c_addr) +: _i2c_addr(i2c_addr) +{ + +} + +/****************************************************************************** + PUBLIC MEMBER FUNCTIONS + ******************************************************************************/ + +int PF1550_Io_C33::begin() +{ + Wire3.begin(); + Wire3.setClock(100000); + uint8_t data[2] = { 0x9C, (1 << 7) }; + writeRegister(_i2c_addr, data, 2, false); + data[0] = 0x9E; + data[1] = (1 << 5); + writeRegister(_i2c_addr, data, 2, false); + + return 1; +} + +void PF1550_Io_C33::debug(Stream& stream) +{ + _debug = &stream; +} + +void PF1550_Io_C33::readRegister(Register const reg_addr, uint8_t * data) +{ + uint8_t i2c_data[2]; + + i2c_data[0] = (uint8_t)reg_addr; + + writeRegister(_i2c_addr, i2c_data, 1, 1); + + uint8_t retVal = Wire3.requestFrom(_i2c_addr, 1, true); + + if (_debug) { + _debug->print("requestFrom: "); + _debug->println(retVal); + } + + int i = 0; + while (Wire3.available() && i < 1) { + data[0] = Wire3.read(); + i++; + } + + if (_debug) { + _debug->println("Read:"); + for (i = 0; i < 1; i++) { + _debug->println(data[i], HEX); + } + } +} + +void PF1550_Io_C33::writeRegister(uint8_t slave_addr, uint8_t *data, uint8_t data_len, uint8_t restart) +{ + if (_debug) + { + _debug->print("Restart: "); + _debug->println(restart); + if (!restart) + { + _debug->print("PF1550_Io_EnvieH747::writeRegister at address="); + _debug->print(data[0], HEX); + _debug->print(" data="); + _debug->println(data[1], HEX); + _debug->print("i2c slave address: "); + _debug->println(slave_addr); + } + else + { + _debug->print("PF1550_Io_EnvieH747::Read from register at address="); + _debug->println(data[0], HEX); + } + } + + Wire3.beginTransmission(slave_addr); + Wire3.write(data, data_len); + uint8_t retVal = Wire3.endTransmission(restart == 0 ? true : false); + + if (_debug) { + _debug->print("End transmission: "); + _debug->println(retVal); + } + /* + if (_debug) { + _debug->println("Write:"); + for (int i = 0; i < data_len; i++) { + _debug->println(data[i], HEX); + } + } + */ +} + +#endif /* ARDUINO_PORTENTA_H33 */ diff --git a/src/PF1550/PF1550_Io_C33.h b/src/PF1550/PF1550_Io_C33.h new file mode 100644 index 0000000..f0d1464 --- /dev/null +++ b/src/PF1550/PF1550_Io_C33.h @@ -0,0 +1,53 @@ +/* + Copyright (c) 2019 Arduino. All right reserved. + + 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 PF1550_IO_C33_H_ +#define PF1550_IO_C33_H_ + +/****************************************************************************** + INCLUDE + ******************************************************************************/ + +#include "Arduino.h" +#include "interface/PF1550_Io.h" + +/****************************************************************************** + CLASS DECLARATION + ******************************************************************************/ + +class PF1550_Io_C33 : public interface::PF1550_Io +{ +public: + PF1550_Io_C33(uint8_t const i2c_addr = interface::PF1550_I2C_DEFAULT_ADDR); + virtual ~PF1550_Io_C33() { } + + virtual int begin () override; + virtual void debug (Stream& stream) override; + virtual void readRegister (Register const reg_addr, uint8_t * data) override; + virtual void writeRegister(uint8_t slave_addr, uint8_t * data, uint8_t data_len, uint8_t restart) override; + virtual void setSTANDBY () override { } + virtual void clrSTANDBY () override { } + + +private: + + uint8_t const _i2c_addr; + Stream * _debug; +}; + +#endif /* PF1550_IO_C33_H_ */ From 9e49c68c4f3137e97325f3540f5fddddcfa7e417 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 24 Mar 2023 09:01:18 +0100 Subject: [PATCH 04/12] Eliminate redundent definition of PF1550 I2C address. --- src/PF1550.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PF1550.h b/src/PF1550.h index 0a66888..d06149e 100644 --- a/src/PF1550.h +++ b/src/PF1550.h @@ -19,7 +19,7 @@ #ifndef ARDUINO_PF1550_H_ #define ARDUINO_PF1550_H_ -#define PF1550_I2C_ADDR 0x08 +#define PF1550_I2C_ADDR (interface::PF1550_I2C_DEFAULT_ADDR) /****************************************************************************** INCLUDE From 6fe94730188ff809e1856e7700059c19be213d78 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 24 Mar 2023 09:04:04 +0100 Subject: [PATCH 05/12] Eliminate cumber-some default parameters and make the used I2C address more expressive. --- src/PF1550.cpp | 4 ++-- src/PF1550/PF1550_Io_C33.h | 2 +- src/PF1550/PF1550_Io_EnvieH747.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PF1550.cpp b/src/PF1550.cpp index f22e3f3..a723346 100644 --- a/src/PF1550.cpp +++ b/src/PF1550.cpp @@ -159,9 +159,9 @@ void PF1550::configCharger(IFastCharge const i_fast_charge, ******************************************************************************/ #ifdef ARDUINO_PORTENTA_H33 -static PF1550_Io_C33 io; +static PF1550_Io_C33 io(interface::PF1550_I2C_DEFAULT_ADDR); #else -static PF1550_Io_EnvieH747 io; +static PF1550_Io_EnvieH747 io(interface::PF1550_I2C_DEFAULT_ADDR); #endif PF1550 PMIC(io); diff --git a/src/PF1550/PF1550_Io_C33.h b/src/PF1550/PF1550_Io_C33.h index f0d1464..a8fec55 100644 --- a/src/PF1550/PF1550_Io_C33.h +++ b/src/PF1550/PF1550_Io_C33.h @@ -33,7 +33,7 @@ class PF1550_Io_C33 : public interface::PF1550_Io { public: - PF1550_Io_C33(uint8_t const i2c_addr = interface::PF1550_I2C_DEFAULT_ADDR); + PF1550_Io_C33(uint8_t const i2c_addr); virtual ~PF1550_Io_C33() { } virtual int begin () override; diff --git a/src/PF1550/PF1550_Io_EnvieH747.h b/src/PF1550/PF1550_Io_EnvieH747.h index bc546a6..eb7c768 100644 --- a/src/PF1550/PF1550_Io_EnvieH747.h +++ b/src/PF1550/PF1550_Io_EnvieH747.h @@ -35,7 +35,7 @@ class PF1550_Io_EnvieH747 : public interface::PF1550_Io public: - PF1550_Io_EnvieH747(uint8_t const i2c_addr = interface::PF1550_I2C_DEFAULT_ADDR); + PF1550_Io_EnvieH747(uint8_t const i2c_addr); virtual ~PF1550_Io_EnvieH747() { } virtual int begin () override; From ae17ef32c9e709c074a051be0050cec08f8cc276 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 24 Mar 2023 09:11:45 +0100 Subject: [PATCH 06/12] Extract method "debug" in base class. --- src/PF1550/PF1550_Io_C33.cpp | 5 ----- src/PF1550/PF1550_Io_C33.h | 1 - src/PF1550/PF1550_Io_EnvieH747.cpp | 5 ----- src/PF1550/PF1550_Io_EnvieH747.h | 1 - src/PF1550/interface/PF1550_Io.h | 8 +++++++- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/PF1550/PF1550_Io_C33.cpp b/src/PF1550/PF1550_Io_C33.cpp index 6f9768a..2d79a88 100644 --- a/src/PF1550/PF1550_Io_C33.cpp +++ b/src/PF1550/PF1550_Io_C33.cpp @@ -54,11 +54,6 @@ int PF1550_Io_C33::begin() return 1; } -void PF1550_Io_C33::debug(Stream& stream) -{ - _debug = &stream; -} - void PF1550_Io_C33::readRegister(Register const reg_addr, uint8_t * data) { uint8_t i2c_data[2]; diff --git a/src/PF1550/PF1550_Io_C33.h b/src/PF1550/PF1550_Io_C33.h index a8fec55..f342c54 100644 --- a/src/PF1550/PF1550_Io_C33.h +++ b/src/PF1550/PF1550_Io_C33.h @@ -37,7 +37,6 @@ class PF1550_Io_C33 : public interface::PF1550_Io virtual ~PF1550_Io_C33() { } virtual int begin () override; - virtual void debug (Stream& stream) override; virtual void readRegister (Register const reg_addr, uint8_t * data) override; virtual void writeRegister(uint8_t slave_addr, uint8_t * data, uint8_t data_len, uint8_t restart) override; virtual void setSTANDBY () override { } diff --git a/src/PF1550/PF1550_Io_EnvieH747.cpp b/src/PF1550/PF1550_Io_EnvieH747.cpp index 9039fde..793ebf2 100644 --- a/src/PF1550/PF1550_Io_EnvieH747.cpp +++ b/src/PF1550/PF1550_Io_EnvieH747.cpp @@ -46,11 +46,6 @@ int PF1550_Io_EnvieH747::begin() return 1; } -void PF1550_Io_EnvieH747::debug(Stream& stream) -{ - _debug = &stream; -} - void PF1550_Io_EnvieH747::readRegister(Register const reg_addr, uint8_t *data) { uint8_t i2c_data[2]; diff --git a/src/PF1550/PF1550_Io_EnvieH747.h b/src/PF1550/PF1550_Io_EnvieH747.h index eb7c768..718482d 100644 --- a/src/PF1550/PF1550_Io_EnvieH747.h +++ b/src/PF1550/PF1550_Io_EnvieH747.h @@ -39,7 +39,6 @@ class PF1550_Io_EnvieH747 : public interface::PF1550_Io virtual ~PF1550_Io_EnvieH747() { } virtual int begin () override; - virtual void debug (Stream& stream) override; virtual void readRegister (Register const reg_addr, uint8_t *data) override; virtual void writeRegister(uint8_t slave_addr, uint8_t *data, uint8_t data_len, uint8_t restart) override; virtual void setSTANDBY () override; diff --git a/src/PF1550/interface/PF1550_Io.h b/src/PF1550/interface/PF1550_Io.h index 2498c96..b89a9db 100644 --- a/src/PF1550/interface/PF1550_Io.h +++ b/src/PF1550/interface/PF1550_Io.h @@ -50,8 +50,11 @@ class PF1550_Io virtual ~PF1550_Io() { } + + void debug (Stream& stream) { _debug = &stream; } + + virtual int begin () = 0; - virtual void debug (Stream& stream) = 0; virtual void readRegister (Register const reg_addr, uint8_t *data) = 0; virtual void writeRegister(uint8_t slave_addr, uint8_t *data, uint8_t data_len, uint8_t restart) = 0; virtual void setSTANDBY () = 0; @@ -60,6 +63,9 @@ class PF1550_Io void setBit (Register const reg, uint8_t const bit_pos); void clrBit (Register const reg, uint8_t const bit_pos); + +protected: + Stream * _debug; }; /****************************************************************************** From 6ad9840115dbfb77ed175d1ed8bb41d70e7ed06b Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 24 Mar 2023 09:14:02 +0100 Subject: [PATCH 07/12] Fix: envie_m4 is no longer a valid target. --- .github/workflows/compile-examples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index cc19b1f..6829b21 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -40,7 +40,7 @@ jobs: # See: https://github.com/arduino/compile-sketches#platforms platforms: | - name: arduino:mbed_nicla - - fqbn: arduino:mbed_portenta:envie_m4 + - fqbn: arduino:mbed_portenta:envie_m7:target_core=cm4 platforms: | - name: arduino:mbed_portenta - fqbn: arduino:mbed_portenta:envie_m7 From aa42c99727ac7d03e54f09400c9b66171541d432 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Mon, 27 Mar 2023 14:52:51 +0200 Subject: [PATCH 08/12] Cleanup example. --- examples/C33-Low-Power/C33-Low-Power.ino | 120 ++++++++--------------- 1 file changed, 43 insertions(+), 77 deletions(-) diff --git a/examples/C33-Low-Power/C33-Low-Power.ino b/examples/C33-Low-Power/C33-Low-Power.ino index 6bba8d5..298c5ee 100644 --- a/examples/C33-Low-Power/C33-Low-Power.ino +++ b/examples/C33-Low-Power/C33-Low-Power.ino @@ -1,56 +1,37 @@ +#include + +#include + #include "RTC.h" #include "r_lpm.h" -#include "PF1550.h" -#include "Wire.h" -/* -class PF1550_Io_C33 : public PF1550_Io_C33 +void periodic_cbk() { - void turnOffMCURail() { - clrBit(Register::PMIC_SW1_CTRL, 0); - //clrBit(Register::PMIC_SW3_CTRL, 0); - } -}; -*/ - -const int LED_ON_INTERRUPT = LED_BUILTIN; - -void periodic_cbk() { - static bool clb_st = false; - if (clb_st) { - //digitalWrite(LED_ON_INTERRUPT, HIGH); - } - else { - //digitalWrite(LED_ON_INTERRUPT, LOW); - } - clb_st = !clb_st; - - Serial.println("PERIODIC INTERRUPT"); + digitalWrite(LEDR, !digitalRead(LEDR)); } -void alarm_cbk() { - Serial.println("ALARM INTERRUPT"); - digitalWrite(LED_ON_INTERRUPT, LOW); +void alarm_cbk() +{ + digitalWrite(LED_BUILTIN, LOW); delay(500); - digitalWrite(LED_ON_INTERRUPT, HIGH); + digitalWrite(LED_BUILTIN, HIGH); } lpm_instance_ctrl_t p_api_ctrl; lpm_cfg_t p_cfg; -void setup() { +void setup() +{ Serial.begin(9600); while (!Serial) { } - PMIC.debug(Serial); + //PMIC.debug(Serial); PMIC.begin(); PMIC.configLDO1(Ldo1Voltage::V_3_30, false, false, false); PMIC.configLDO2(Ldo2Voltage::V_3_30, false, false, false); PMIC.configLDO3(Ldo3Voltage::V_1_20, false, false, false); PMIC.configSw2(Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2Voltage::V_3_30, Sw2CurrentLimit::I_1_5_A, false, false, false); - //io.turnOffMCURail(); - p_cfg.low_power_mode = LPM_MODE_DEEP; // LPM_MODE_SLEEP LPM_MODE_STANDBY LPM_MODE_STANDBY_SNOOZE LPM_MODE_DEEP p_cfg.standby_wake_sources = LPM_STANDBY_WAKE_SOURCE_IRQ0 | LPM_STANDBY_WAKE_SOURCE_RTCALM; p_cfg.dtc_state_in_snooze = LPM_SNOOZE_DTC_DISABLE; // LPM_SNOOZE_DTC_ENABLE LPM_SNOOZE_DTC_DISABLE @@ -61,66 +42,57 @@ void setup() { R_LPM_Open(&p_api_ctrl, &p_cfg); - //pinMode(LED_BUILTIN, OUTPUT); - pinMode(LED_ON_INTERRUPT, OUTPUT); - digitalWrite(LED_ON_INTERRUPT, HIGH); + /* Configure LED_BUILTIN. */ + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, HIGH); + /* Configure the red RGB LED. */ pinMode(LEDR, OUTPUT); digitalWrite(LEDR, LOW); delay(200); digitalWrite(LEDR, HIGH); + /* Initialize the RTC. */ RTC.begin(); - RTCTime mytime(1, Month::JANUARY, 2000, 12, 10, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE); + RTCTime initial_time(1, Month::JANUARY, 2000, 12, 10, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE); - if (!RTC.isRunning()) { - RTC.setTime(mytime); - } + if (!RTC.isRunning()) + RTC.setTime(initial_time); - RTCTime alarmtime; - alarmtime.setSecond(35); + RTCTime alarm_time; + alarm_time.setSecond(35); - AlarmMatch am; - am.addMatchSecond(); + AlarmMatch alarm_match; + alarm_match.addMatchSecond(); - if (!RTC.setPeriodicCallback(periodic_cbk, Period::ONCE_EVERY_2_SEC)) { + if (!RTC.setPeriodicCallback(periodic_cbk, Period::ONCE_EVERY_2_SEC)) Serial.println("ERROR: periodic callback not set"); - } - if (!RTC.setAlarmCallback(alarm_cbk, alarmtime, am)) { + if (!RTC.setAlarmCallback(alarm_cbk, alarm_time, alarm_match)) Serial.println("ERROR: alarm callback not set"); - } - } -void loop() { - static bool status = false; - +void loop() +{ + /* Enter low power mode. Note: The JLink looses connection here. */ R_LPM_LowPowerModeEnter(&p_api_ctrl); - RTCTime currenttime; - if (status) { - - if (RTC.isRunning()) { - Serial.println("RTC is running"); - } - else { - Serial.println("RTC is not running"); - } - + if (RTC.isRunning()) + { /* GET CURRENT TIME FROM RTC */ - RTC.getTime(currenttime); + RTCTime current_time; + RTC.getTime(current_time); /* PRINT CURRENT TIME on Serial */ Serial.print("Current time: "); /* DATE */ - Serial.print(currenttime.getDayOfMonth()); + Serial.print(current_time.getDayOfMonth()); Serial.print("/"); - Serial.print(Month2int(currenttime.getMonth())); + Serial.print(Month2int(current_time.getMonth())); Serial.print("/"); - Serial.print(currenttime.getYear()); + Serial.print(current_time.getYear()); Serial.print(" - "); - Serial.print(currenttime.getUnixTime()); + Serial.print(current_time.getUnixTime()); Serial.print(" - "); struct timeval tv; @@ -128,19 +100,13 @@ void loop() { Serial.print(tv.tv_sec); Serial.print(" - "); - /* ORE:MINUTI:SECONDI */ - Serial.print(currenttime.getHour()); + /* HOUR:MINUTES:SECONDS */ + Serial.print(current_time.getHour()); Serial.print(":"); - Serial.print(currenttime.getMinutes()); + Serial.print(current_time.getMinutes()); Serial.print(":"); - Serial.println(currenttime.getSeconds()); + Serial.println(current_time.getSeconds()); - //digitalWrite(LED_BUILTIN, HIGH); + delay(1000); } - else { - //digitalWrite(LED_BUILTIN, LOW); - } - - status = !status; - delay(1000); } From a6085f485b21a2c5e93792f33a4a4705cb37f7cd Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 28 Mar 2023 07:07:52 +0200 Subject: [PATCH 09/12] Fix erroneous comment, left-over from copy paste. --- src/PF1550/PF1550_Io_C33.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PF1550/PF1550_Io_C33.cpp b/src/PF1550/PF1550_Io_C33.cpp index 2d79a88..9034741 100644 --- a/src/PF1550/PF1550_Io_C33.cpp +++ b/src/PF1550/PF1550_Io_C33.cpp @@ -91,7 +91,7 @@ void PF1550_Io_C33::writeRegister(uint8_t slave_addr, uint8_t *data, uint8_t dat _debug->println(restart); if (!restart) { - _debug->print("PF1550_Io_EnvieH747::writeRegister at address="); + _debug->print("PF1550_Io_C33::writeRegister at address="); _debug->print(data[0], HEX); _debug->print(" data="); _debug->println(data[1], HEX); @@ -100,7 +100,7 @@ void PF1550_Io_C33::writeRegister(uint8_t slave_addr, uint8_t *data, uint8_t dat } else { - _debug->print("PF1550_Io_EnvieH747::Read from register at address="); + _debug->print("PF1550_Io_C33::Read from register at address="); _debug->println(data[0], HEX); } } From fb831055329adf57462a5587f7508bec5704b9da Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 28 Mar 2023 07:25:55 +0200 Subject: [PATCH 10/12] Replace hard coded magic values with proper constants. --- src/PF1550/PF1550_Defines.h | 6 ++++++ src/PF1550/PF1550_Io_C33.cpp | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/PF1550/PF1550_Defines.h b/src/PF1550/PF1550_Defines.h index 0b2b333..67a536b 100644 --- a/src/PF1550/PF1550_Defines.h +++ b/src/PF1550/PF1550_Defines.h @@ -68,4 +68,10 @@ /* VBUS_INLIM_CNFG ************************************************************/ #define REG_VBUS_INLIM_CNFG_VBUS_LIN_INLIM_mask (0xF8) +/* LED_PWM ********************************************************************/ +#define REG_LED_PWM_LED_EN_bp (7) + +/* LED_CNFG *******************************************************************/ +#define REG_LED_CNFG_LEDOVRD_bp (5) + #endif /* PF1550_DEFINES_H_ */ diff --git a/src/PF1550/PF1550_Io_C33.cpp b/src/PF1550/PF1550_Io_C33.cpp index 9034741..6e5aedc 100644 --- a/src/PF1550/PF1550_Io_C33.cpp +++ b/src/PF1550/PF1550_Io_C33.cpp @@ -27,6 +27,8 @@ #include "Wire.h" #include "Arduino.h" +#include "PF1550_Defines.h" + /****************************************************************************** CTOR/DTOR ******************************************************************************/ @@ -45,11 +47,11 @@ int PF1550_Io_C33::begin() { Wire3.begin(); Wire3.setClock(100000); - uint8_t data[2] = { 0x9C, (1 << 7) }; - writeRegister(_i2c_addr, data, 2, false); - data[0] = 0x9E; - data[1] = (1 << 5); - writeRegister(_i2c_addr, data, 2, false); + + /* Enable LED. */ + setBit(Register::CHARGER_LED_PWM, REG_LED_PWM_LED_EN_bp); + /* Allow LED control by software. */ + setBit(Register::CHARGER_LED_CNFG, REG_LED_CNFG_LEDOVRD_bp); return 1; } From 9cdcf017f6f6c132e8b6a08d9708b8c39cf347ed Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 28 Mar 2023 07:35:54 +0200 Subject: [PATCH 11/12] Build C33 low power sketch only for C33. --- .github/workflows/compile-examples.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 6829b21..7ec4b0e 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -29,6 +29,8 @@ jobs: runs-on: ubuntu-latest env: + UNIVERSAL_SKETCH_PATHS: | + - examples/BasicUsage SKETCHES_REPORTS_PATH: sketches-reports strategy: @@ -40,12 +42,15 @@ jobs: # See: https://github.com/arduino/compile-sketches#platforms platforms: | - name: arduino:mbed_nicla + sketch-paths: - fqbn: arduino:mbed_portenta:envie_m7:target_core=cm4 platforms: | - name: arduino:mbed_portenta + sketch-paths: - fqbn: arduino:mbed_portenta:envie_m7 platforms: | - name: arduino:mbed_portenta + sketch-paths: steps: - name: Checkout repository @@ -63,7 +68,8 @@ jobs: # Additional library dependencies can be listed here. # See: https://github.com/arduino/compile-sketches#libraries sketch-paths: | - - examples + ${{ env.UNIVERSAL_SKETCH_PATHS }} + ${{ matrix.sketch-paths }} enable-deltas-report: true sketches-report-path: ${{ env.SKETCHES_REPORTS_PATH }} From c9406854e49eddfde78657541bbaffe5375f2070 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 28 Mar 2023 15:42:42 +0200 Subject: [PATCH 12/12] Add Portenta C33 to CI build. --- .github/workflows/compile-examples.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 7ec4b0e..88aba7e 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -51,6 +51,12 @@ jobs: platforms: | - name: arduino:mbed_portenta sketch-paths: + - fqbn: arduino:renesas:portenta_h33 + platforms: | + - name: arduino:renesas + source-url: https://downloads.arduino.cc/packages/package_renesas_index.json + sketch-paths: | + - examples/C33-Low-Power steps: - name: Checkout repository