Over the air updates

The Dropbox link is dead (I think they eliminated public folders recently). Is there any other place to download this? Thanks.
 
That would be great. Would be really nice to get the Teensy 3.5 and 3.6 modifications into it too.
 
i found some info on the Teensy 3.5 and 3.6 and the selector looks like this now
Code:
#define RESERVE_FLASH (2 * FLASH_SECTOR_SIZE)
#elif defined(__MK20DX256__)//T_3.1 and T_3.2
#define FLASH_SIZE              0x40000
#define FLASH_SECTOR_SIZE       0x800
#define FLASH_ID                "fw_teensy3.1"
#define RESERVE_FLASH (1 * FLASH_SECTOR_SIZE)
#elif defined(__MK64FX512__)//T_3.5
#define FLASH_SIZE              0x80000
#define FLASH_SECTOR_SIZE       0x1000
#define FLASH_ID                "fw_teensy3.5"
#define RESERVE_FLASH (1 * FLASH_SECTOR_SIZE)
#elif defined(__MK66FX1M0__)//T_3.6
#define FLASH_SIZE              0x100000
#define FLASH_SECTOR_SIZE       0x1000
#define FLASH_ID                "fw_teensy3.6"
#define RESERVE_FLASH (1 * FLASH_SECTOR_SIZE)
#else
#error NOT SUPPORTED
#endif

from the datasheets
k20.PNGk64.PNGk66.PNG
the only thing i don't know is what size the RESERVE_FLASH should be?
 
i also found that the .5 and .6 dons't have at flash command (0x06) for writhing a 4 byte word. instead they have a command (0x07) for writing 8 bytes. so i added this:
Code:
 // program long word!
  #if defined(__MK20DX128__) || defined(__MK20DX256__)
  FTFL_FCCOB0 = 0x06;    // PGM
  #elif defined(__MK64FX512__) || defined(__MK66FX1M0__)
  FTFL_FCCOB0 = 0x07;   // PGM
  #endif

to the flash_word function hoping it would work, but i dose not. Maybe a separate 8 byte flash function is needed.
 
Alex: sorry, it's not clear to me. You tested your code on the 3.5 and 3.6 and it works now? Line 2 of the code suggests otherwise.
 
i currently don't have the time to continue, but i'm planing to in the future.
i only tested with the 3.5 and it seemed to work fine, but i haven't tested it fully. therefor the line "This code is not ready for use" because it should only be used for testing
 
Is there someone who has a working version of the serial flasher (for teensy 3.5)?
It would be worth something to me!
 
I would really dive into this more, we have a project using older atmega2560's with custom bootloader to flash directly over uart (No reset toggle). I am hoping to get us switched over to the same chip as the Teensy 3.1-3.6, and we would need a bootloader to allow flashing over Uart and not native usb, since we incorporate controls and security using the ft232. Does any one have a write up on such a task, a bootloader with ability to flash over uart, possibly some sort of examples? Im on the hunt to gather all required info to move in this direction, I have downloaded and installed all of the lib's linked in this thread, and uploaded the test01 to my teensy 3.2, just not sure what to do from here.
 
With the goal of increasing teensy use in IOT applications, I've created a new version of the program for Teensy 4.0. I'm looking for a private alpha tester who will do lots of testing and improve the code. Send me a private message.
 
A couple of alpha testers verified that the teensy 4 firmware loader works. But some minor issues remain (like how does one get a teensy 4 to do a full reset from software?).
 
Tie a gpio to reset pin ?

Unfortunately, the Teensy 4.0 does not have a reset pin. If the OTA uses the USB programming, then you could tie a pin to the program pin (or you could have whatever microprocessor is doing the USB connection assert the reset pin directly).
 
Round about way to Reset : issue-to-reporogram-T4-0

That code works to SLEEP the T4 with a timer to wake. When it wakes it enters setup() after fresh load from flash in ResetHandler(). Not seen another easy way to reset?

Using that code with a 2 sec sleep will have it restart. The RTC only works in units of seconds there - and asking for 0 is a fail and asking for 1 sec can fail if the sec is the same by the time is gets to sleep it seems. So asking for 2 assures a full 1 sec sleep then restart.

I tested minimally to see it work - did not try to purge unneeded code in that sample - and if the cycle works not sure the 'rtc_stopAlarm();' noted in last post is needed. Also did not test on non battery backup T4 - with USB power it should work the same?
 
Opened the sample for that RTC_Sleep code, here is where I left it in loop() there is a normal 20 second cycle and sleep 10 secs. If during the 20 secs push over Serial 'Enter' it does a RESET and is back online in 2 seconds. This does work under USB power without RTC battery.

As noted the code is from @WMXZ - just did some playing with it as it was refined to explain observed issues. Lots of extra code. Should all be safe - worst case is unplug USB to clear and battery if present.


Code:
// WMXZ :: SLEEP RTC
// https://forum.pjrc.com/threads/58484-issue-to-reporogram-T4-0?p=222073&viewfull=1#post222073
#include "core_pins.h"
#include "TimeLib.h"

/******************* Seting Alarm ***************/
#define SNVS_LPSR_PGD_MASK              (0x8U)
#define SNVS_LPCR_LPTA_EN_MASK          (0x2U)

void rtc_init()
{
  CCM_CCGR2 |= CCM_CCGR2_IOMUXC_SNVS(CCM_CCGR_ON);
  SNVS_LPGPR = SNVS_DEFAULT_PGD_VALUE;
  SNVS_LPSR = SNVS_LPSR_PGD_MASK;
  // ? calibration
  // ? tamper pins

  SNVS_LPCR &= ~SNVS_LPCR_LPTA_EN_MASK; // clear alarm
  while (SNVS_LPCR & SNVS_LPCR_LPTA_EN_MASK);
  SNVS_LPTAR = 0;

  SNVS_LPCR |= 1;             // start RTC
  while (!(SNVS_LPCR & 1));
}

void rtc_set_time(uint32_t secs)
{ //uint32_t secs = 1547051415;
  SNVS_LPCR &= ~1;   // stop RTC
  while (SNVS_LPCR & 1);
  SNVS_LPSRTCMR = (uint32_t)(secs >> 17U);
  SNVS_LPSRTCLR = (uint32_t)(secs << 15U);
  SNVS_LPCR |= 1;             // start RTC
  while (!(SNVS_LPCR & 1));
}

uint32_t rtc_secs() {
  uint32_t seconds = 0;
  uint32_t tmp = 0;

  /* Do consecutive reads until value is correct */
  do
  { seconds = tmp;
    tmp = (SNVS_LPSRTCMR << 17U) | (SNVS_LPSRTCLR >> 15U);
  } while (tmp != seconds);

  return seconds;
}

//PROGMEM
void rtc_resetAlarm()
{
  SNVS_LPCR &= ~SNVS_LPCR_LPTA_EN_MASK;
  while (SNVS_LPCR & SNVS_LPCR_LPTA_EN_MASK);
}

//PROGMEM
void rtc_stopAlarm()
{
  SNVS_LPSR |= 1;
  rtc_resetAlarm();
}

//PROGMEM
void rtc_isr(void)
{
  //rtc_stopAlarm();
  SNVS_LPSR |= 1;
  //  Serial.println("Alarm");
  asm volatile ("DSB");
}

void rtc_initAlarm(uint32_t prio = 13)
{
  SNVS_LPSR |= 1;
  attachInterruptVector(IRQ_SNVS_IRQ, rtc_isr);
  NVIC_SET_PRIORITY(IRQ_SNVS_IRQ, prio * 16); // 8 is normal priority
  NVIC_DISABLE_IRQ(IRQ_SNVS_IRQ);
}

void rtc_setAlarm(uint32_t alarmSeconds)
{ uint32_t tmp = SNVS_LPCR; //save control register

  /* disable SRTC alarm interrupt */
  rtc_stopAlarm();

  SNVS_LPTAR = alarmSeconds;
  while (SNVS_LPTAR != alarmSeconds);

  NVIC_ENABLE_IRQ(IRQ_SNVS_IRQ);

  SNVS_LPCR = tmp | SNVS_LPCR_LPTA_EN_MASK; // restore control register and set alarm
  while (!(SNVS_LPCR & SNVS_LPCR_LPTA_EN_MASK));
}

uint32_t rtc_getAlarm()
{
  return SNVS_LPTAR;
}

void doShutdown(void)
{
  //  SNVS_LPCR |=(1<<3) ; // enable wake-up
  SNVS_LPCR |= (1 << 6) ; // turn off power
  while (1) continue;
}

void setWakeupCallandSleep(uint32_t nsec)
{
  uint32_t to = now();
  if (!(SNVS_LPCR & 1))
  { rtc_init();
    rtc_set_time(to);   //LPSRTC will start at 0 otherwise
  }
  rtc_initAlarm(4);
  rtc_setAlarm(to + nsec);
  doShutdown();
}

uint32_t blink(void)
{ static uint32_t tx0;
  if (millis() > tx0 + 1000)
  { digitalWriteFast(13, !digitalReadFast(13));
    tx0 = millis();
    Serial.print("blink @ms=");
    Serial.print(millis());
    Serial.print(" :: ");
    showTime();
    return 1;
  }
  return 0;
}

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("\n" __FILE__ " " __DATE__ " " __TIME__);
#if defined(__IMXRT1062__)
  Serial.printf("\t F_CPU=%u", F_CPU_ACTUAL );
  Serial.printf( "\tdeg  C=%u\n" , (uint32_t)tempmonGetTemp() );
#endif

  // set the Time library to use Teensy 3.0's RTC to keep time
  setSyncProvider(Teensy3Clock.get);
  delay(100);
  Serial.print("Start :: ");
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else {
    Serial.print("RTC has set the system time :: ");
    showTime( );
  }
  rtc_stopAlarm();  [B][COLOR="#FF0000"]// This clears RTC low power wake settings[/COLOR][/B]
  pinMode(13, OUTPUT);

}

void loop() {
  static uint32_t ic = 0;
  ic += blink();
  if (ic >= 20 || Serial.available())
  {
[COLOR="#FF0000"]    if ( Serial.available() ) {
      while ( Serial.available() ) Serial.read();
      Serial.println("... RESET ..."); Serial.flush();
      setWakeupCallandSleep(2);
    }[/COLOR]
    Serial.printf( "\tdeg  C=%u\n" , (uint32_t)tempmonGetTemp() );
    Serial.println("End"); Serial.flush();
    delay(1000);
    setWakeupCallandSleep(10);
  }
}

time_t RTCTime;
void showTime() {
  Serial.print("[c] ");
  Serial.print(hour());
  Serial.print(":");
  Serial.print(minute());
  Serial.print(":");
  Serial.print(second());
  Serial.print(" ");
  Serial.print(month());
  Serial.print("/");
  Serial.print(day());
  Serial.print("/");
  Serial.print(year());
  Serial.println();
}

Here is what it looks like sending two ENTER keys over USB after it starts:
Code:
T:\tCode\T4\Sleep_RTC_WMXZ\Sleep_RTC_WMXZ.ino Dec  3 2019 12:36:36
	 F_CPU=600000000	deg  C=47
Start :: RTC has set the system time :: [c] 14:12:42 12/3/2019
blink @ms=1001 :: [c] 14:12:42 12/3/2019
... RESET ...

T:\tCode\T4\Sleep_RTC_WMXZ\Sleep_RTC_WMXZ.ino Dec  3 2019 12:36:36
	 F_CPU=600000000	deg  C=47
Start :: RTC has set the system time :: [c] 14:12:44 12/3/2019
... RESET ...

T:\tCode\T4\Sleep_RTC_WMXZ\Sleep_RTC_WMXZ.ino Dec  3 2019 12:36:36
	 F_CPU=600000000	deg  C=46
Start :: RTC has set the system time :: [c] 14:12:46 12/3/2019
blink @ms=1001 :: [c] 14:12:46 12/3/2019
 
For me the code is not working at all.

1. Can not compile the code (error)
2. if the code is running (modified a bit), then the reset is not done.



/Applications/Entwicklung/Flasher/flasher4/flasher4.ino:143:35: warning: invalid conversion from 'long unsigned int (*)()' to 'getExternalTime {aka long int (*)()}' [-fpermissive]
setSyncProvider(Teensy3Clock.get);
^
In file included from /Applications/Entwicklung/Flasher/flasher4/flasher4.ino:4:0:
/Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Time/TimeLib.h:134:9: note: initializing argument 1 of 'void setSyncProvider(getExternalTime)'
void setSyncProvider( getExternalTime getTimeFunction); // identify the external time provider



But for me it's ok that this is not working, because i can place a message for the User : "Please Power Off and On your Computer".

In my opinion it would be better to call a reset register of the CPU (like Teensy 3.2) instead of using all these RTC tricks (complicated)
 
For me the code is not working at all.

1. Can not compile the code (error)
2. if the code is running (modified a bit), then the reset is not done.



/Applications/Entwicklung/Flasher/flasher4/flasher4.ino:143:35: warning: invalid conversion from 'long unsigned int (*)()' to 'getExternalTime {aka long int (*)()}' [-fpermissive]
setSyncProvider(Teensy3Clock.get);
^
In file included from /Applications/Entwicklung/Flasher/flasher4/flasher4.ino:4:0:
/Applications/Arduino.app/Contents/Java/hardware/teensy/avr/libraries/Time/TimeLib.h:134:9: note: initializing argument 1 of 'void setSyncProvider(getExternalTime)'
void setSyncProvider( getExternalTime getTimeFunction); // identify the external time provider



But for me it's ok that this is not working, because i can place a message for the User : "Please Power Off and On your Computer".

In my opinion it would be better to call a reset register of the CPU (like Teensy 3.2) instead of using all these RTC tricks (complicated)

Is that in ref to post #48 code? Came working from IDE 1.8.10 install with TD 1.49b1. Yes there is 'THAT' warning about a type I didn't clean up - but it runs to T4 - that is a warning and the right thing ends up happening.

Didn't say it was a good solution - it would need minimization - the RTC time print is DEBUG extraneous and was added just to see continuity in function and clock ticks across the process.

To date all notes on issuing reset RESET to T4 seemed to indicate it just triggers the bootloader. If there is one that works "to call a reset register of the CPU (like Teensy 3.2) " - please post ...
 
Back
Top