Skip to content

Add watchdog routines for Due #3111

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 8, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions hardware/arduino/sam/cores/arduino/Arduino.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ extern const PinDescription g_APinDescription[] ;
#include "wiring_shift.h"
#include "WInterrupts.h"

#include "watchdog.h"

// USB Device
#define USB_VID 0x2341 // arduino LLC vid
#define USB_PID_LEONARDO 0x0034
Expand Down
3 changes: 3 additions & 0 deletions hardware/arduino/sam/cores/arduino/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ void initVariant() { }
*/
int main( void )
{
// Initialize watchdog
watchdogSetup();

init();

initVariant();
Expand Down
55 changes: 55 additions & 0 deletions hardware/arduino/sam/cores/arduino/watchdog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
Copyright (c) 2014 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 <chip.h>

#include "watchdog.h"


void watchdogEnable (uint32_t timeout)
{
/* this assumes the slow clock is running at 32.768 kHz
watchdog frequency is therefore 32768 / 128 = 256 Hz */
timeout = timeout * 256 / 1000;
if (timeout == 0)
timeout = 1;
else if (timeout > 0xFFF)
timeout = 0xFFF;
timeout = WDT_MR_WDRSTEN | WDT_MR_WDV(timeout) | WDT_MR_WDD(timeout);
WDT_Enable (WDT, timeout);
}

void watchdogDisable(void)
{
WDT_Disable (WDT);
}

void watchdogReset(void)
{
WDT_Restart (WDT);
}


extern "C"
void _watchdogDefaultSetup (void)
{
WDT_Disable (WDT);
}
void watchdogSetup (void) __attribute__ ((weak, alias("_watchdogDefaultSetup")));


52 changes: 52 additions & 0 deletions hardware/arduino/sam/cores/arduino/watchdog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
Copyright (c) 2014 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 _WATCHDOG_
#define _WATCHDOG_

#include <stdint.h>

// Watchdog functions

/*
* \brief Enable the watchdog with the specified timeout. Should only be called once.
*
* \param timeount in milliseconds.
*/
void watchdogEnable (uint32_t timeout);

/*
* \brief Disable the watchdog timer. Should only be called once.
*
*/
void watchdogDisable (void);

/*
* \brief Reset the watchdog counter.
*
*/
void watchdogReset (void);

/*
* \brief Watchdog initialize hook. This function is called from init(). If the user does not provide
* this function, then the default action is to disable watchdog.
*/
void watchdogSetup (void);

#endif /* _WATCHDOG_ */

3 changes: 0 additions & 3 deletions hardware/arduino/sam/variants/arduino_due_x/variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -377,9 +377,6 @@ void init( void )
while (true);
}

// Disable watchdog
WDT_Disable(WDT);

// Initialize C library
__libc_init_array();

Expand Down