Merge upstream changes from Marlin 2.1.1
This commit is contained in:
@@ -33,6 +33,10 @@
|
||||
#include "timers.h"
|
||||
#include <Wire.h>
|
||||
|
||||
// ------------------------
|
||||
// Serial ports
|
||||
// ------------------------
|
||||
|
||||
#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X)
|
||||
#define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X)
|
||||
#if WITHIN(SERIAL_PORT, 0, 3)
|
||||
@@ -40,88 +44,153 @@
|
||||
#endif
|
||||
USBSerialType USBSerial(false, SerialUSB);
|
||||
|
||||
uint16_t HAL_adc_result, HAL_adc_select;
|
||||
// ------------------------
|
||||
// FastIO
|
||||
// ------------------------
|
||||
|
||||
static const uint8_t pin2sc1a[] = {
|
||||
0x07, // 0/A0 AD_B1_02
|
||||
0x08, // 1/A1 AD_B1_03
|
||||
0x0C, // 2/A2 AD_B1_07
|
||||
0x0B, // 3/A3 AD_B1_06
|
||||
0x06, // 4/A4 AD_B1_01
|
||||
0x05, // 5/A5 AD_B1_00
|
||||
0x0F, // 6/A6 AD_B1_10
|
||||
0x00, // 7/A7 AD_B1_11
|
||||
0x0D, // 8/A8 AD_B1_08
|
||||
0x0E, // 9/A9 AD_B1_09
|
||||
0x01, // 24/A10 AD_B0_12
|
||||
0x02, // 25/A11 AD_B0_13
|
||||
0x83, // 26/A12 AD_B1_14 - only on ADC2, 3
|
||||
0x84, // 27/A13 AD_B1_15 - only on ADC2, 4
|
||||
0x07, // 14/A0 AD_B1_02
|
||||
0x08, // 15/A1 AD_B1_03
|
||||
0x0C, // 16/A2 AD_B1_07
|
||||
0x0B, // 17/A3 AD_B1_06
|
||||
0x06, // 18/A4 AD_B1_01
|
||||
0x05, // 19/A5 AD_B1_00
|
||||
0x0F, // 20/A6 AD_B1_10
|
||||
0x00, // 21/A7 AD_B1_11
|
||||
0x0D, // 22/A8 AD_B1_08
|
||||
0x0E, // 23/A9 AD_B1_09
|
||||
0x01, // 24/A10 AD_B0_12
|
||||
0x02, // 25/A11 AD_B0_13
|
||||
0x83, // 26/A12 AD_B1_14 - only on ADC2, 3
|
||||
0x84, // 27/A13 AD_B1_15 - only on ADC2, 4
|
||||
#ifdef ARDUINO_TEENSY41
|
||||
0xFF, // 28
|
||||
0xFF, // 29
|
||||
0xFF, // 30
|
||||
0xFF, // 31
|
||||
0xFF, // 32
|
||||
0xFF, // 33
|
||||
0xFF, // 34
|
||||
0xFF, // 35
|
||||
0xFF, // 36
|
||||
0xFF, // 37
|
||||
0x81, // 38/A14 AD_B1_12 - only on ADC2, 1
|
||||
0x82, // 39/A15 AD_B1_13 - only on ADC2, 2
|
||||
0x09, // 40/A16 AD_B1_04
|
||||
0x0A, // 41/A17 AD_B1_05
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
// disable interrupts
|
||||
void cli() { noInterrupts(); }
|
||||
|
||||
// enable interrupts
|
||||
void sei() { interrupts(); }
|
||||
*/
|
||||
|
||||
void HAL_adc_init() {
|
||||
analog_init();
|
||||
while (ADC1_GC & ADC_GC_CAL) ;
|
||||
while (ADC2_GC & ADC_GC_CAL) ;
|
||||
bool is_output(pin_t pin) {
|
||||
const struct digital_pin_bitband_and_config_table_struct *p;
|
||||
p = digital_pin_to_info_PGM + pin;
|
||||
return (*(p->reg + 1) & p->mask);
|
||||
}
|
||||
|
||||
void HAL_clear_reset_source() {
|
||||
uint32_t reset_source = SRC_SRSR;
|
||||
SRC_SRSR = reset_source;
|
||||
}
|
||||
// ------------------------
|
||||
// MarlinHAL Class
|
||||
// ------------------------
|
||||
|
||||
uint8_t HAL_get_reset_source() {
|
||||
void MarlinHAL::reboot() { _reboot_Teensyduino_(); }
|
||||
|
||||
uint8_t MarlinHAL::get_reset_source() {
|
||||
switch (SRC_SRSR & 0xFF) {
|
||||
case 1: return RST_POWER_ON; break;
|
||||
case 2: return RST_SOFTWARE; break;
|
||||
case 4: return RST_EXTERNAL; break;
|
||||
// case 8: return RST_BROWN_OUT; break;
|
||||
//case 8: return RST_BROWN_OUT; break;
|
||||
case 16: return RST_WATCHDOG; break;
|
||||
case 64: return RST_JTAG; break;
|
||||
// case 128: return RST_OVERTEMP; break;
|
||||
case 64: return RST_JTAG; break;
|
||||
//case 128: return RST_OVERTEMP; break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void HAL_reboot() { _reboot_Teensyduino_(); }
|
||||
void MarlinHAL::clear_reset_source() {
|
||||
uint32_t reset_source = SRC_SRSR;
|
||||
SRC_SRSR = reset_source;
|
||||
}
|
||||
|
||||
// ------------------------
|
||||
// Watchdog Timer
|
||||
// ------------------------
|
||||
|
||||
#if ENABLED(USE_WATCHDOG)
|
||||
|
||||
#define WDT_TIMEOUT TERN(WATCHDOG_DURATION_8S, 8, 4) // 4 or 8 second timeout
|
||||
|
||||
constexpr uint8_t timeoutval = (WDT_TIMEOUT - 0.5f) / 0.5f;
|
||||
|
||||
void MarlinHAL::watchdog_init() {
|
||||
CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks
|
||||
WDOG1_WMCR = 0; // disable power down PDE
|
||||
WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval);
|
||||
WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE;
|
||||
}
|
||||
|
||||
void MarlinHAL::watchdog_refresh() {
|
||||
// Watchdog refresh sequence
|
||||
WDOG1_WSR = 0x5555;
|
||||
WDOG1_WSR = 0xAAAA;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// ------------------------
|
||||
// ADC
|
||||
// ------------------------
|
||||
|
||||
int8_t MarlinHAL::adc_select;
|
||||
|
||||
void MarlinHAL::adc_init() {
|
||||
analog_init();
|
||||
while (ADC1_GC & ADC_GC_CAL) { /* wait */ }
|
||||
while (ADC2_GC & ADC_GC_CAL) { /* wait */ }
|
||||
}
|
||||
|
||||
void MarlinHAL::adc_start(const pin_t adc_pin) {
|
||||
static const uint8_t pin2sc1a[] = {
|
||||
0x07, // 0/A0 AD_B1_02
|
||||
0x08, // 1/A1 AD_B1_03
|
||||
0x0C, // 2/A2 AD_B1_07
|
||||
0x0B, // 3/A3 AD_B1_06
|
||||
0x06, // 4/A4 AD_B1_01
|
||||
0x05, // 5/A5 AD_B1_00
|
||||
0x0F, // 6/A6 AD_B1_10
|
||||
0x00, // 7/A7 AD_B1_11
|
||||
0x0D, // 8/A8 AD_B1_08
|
||||
0x0E, // 9/A9 AD_B1_09
|
||||
0x01, // 24/A10 AD_B0_12
|
||||
0x02, // 25/A11 AD_B0_13
|
||||
0x83, // 26/A12 AD_B1_14 - only on ADC2, 3
|
||||
0x84, // 27/A13 AD_B1_15 - only on ADC2, 4
|
||||
0x07, // 14/A0 AD_B1_02
|
||||
0x08, // 15/A1 AD_B1_03
|
||||
0x0C, // 16/A2 AD_B1_07
|
||||
0x0B, // 17/A3 AD_B1_06
|
||||
0x06, // 18/A4 AD_B1_01
|
||||
0x05, // 19/A5 AD_B1_00
|
||||
0x0F, // 20/A6 AD_B1_10
|
||||
0x00, // 21/A7 AD_B1_11
|
||||
0x0D, // 22/A8 AD_B1_08
|
||||
0x0E, // 23/A9 AD_B1_09
|
||||
0x01, // 24/A10 AD_B0_12
|
||||
0x02, // 25/A11 AD_B0_13
|
||||
0x83, // 26/A12 AD_B1_14 - only on ADC2, 3
|
||||
0x84, // 27/A13 AD_B1_15 - only on ADC2, 4
|
||||
#ifdef ARDUINO_TEENSY41
|
||||
0xFF, // 28
|
||||
0xFF, // 29
|
||||
0xFF, // 30
|
||||
0xFF, // 31
|
||||
0xFF, // 32
|
||||
0xFF, // 33
|
||||
0xFF, // 34
|
||||
0xFF, // 35
|
||||
0xFF, // 36
|
||||
0xFF, // 37
|
||||
0x81, // 38/A14 AD_B1_12 - only on ADC2, 1
|
||||
0x82, // 39/A15 AD_B1_13 - only on ADC2, 2
|
||||
0x09, // 40/A16 AD_B1_04
|
||||
0x0A, // 41/A17 AD_B1_05
|
||||
#endif
|
||||
};
|
||||
const uint16_t pin = pin2sc1a[adc_pin];
|
||||
if (pin == 0xFF) {
|
||||
adc_select = -1; // Digital only
|
||||
}
|
||||
else if (pin & 0x80) {
|
||||
adc_select = 1;
|
||||
ADC2_HC0 = pin & 0x7F;
|
||||
}
|
||||
else {
|
||||
adc_select = 0;
|
||||
ADC1_HC0 = pin;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t MarlinHAL::adc_value() {
|
||||
switch (adc_select) {
|
||||
case 0:
|
||||
while (!(ADC1_HS & ADC_HS_COCO0)) { /* wait */ }
|
||||
return ADC1_R0;
|
||||
case 1:
|
||||
while (!(ADC2_HS & ADC_HS_COCO0)) { /* wait */ }
|
||||
return ADC2_R0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ------------------------
|
||||
// Free Memory Accessor
|
||||
// ------------------------
|
||||
|
||||
#define __bss_end _ebss
|
||||
|
||||
@@ -133,45 +202,9 @@ extern "C" {
|
||||
// Doesn't work on Teensy 4.x
|
||||
uint32_t freeMemory() {
|
||||
uint32_t free_memory;
|
||||
if ((uint32_t)__brkval == 0)
|
||||
free_memory = ((uint32_t)&free_memory) - ((uint32_t)&__bss_end);
|
||||
else
|
||||
free_memory = ((uint32_t)&free_memory) - ((uint32_t)__brkval);
|
||||
free_memory = ((uint32_t)&free_memory) - (((uint32_t)__brkval) ?: ((uint32_t)&__bss_end));
|
||||
return free_memory;
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_adc_start_conversion(const uint8_t adc_pin) {
|
||||
const uint16_t pin = pin2sc1a[adc_pin];
|
||||
if (pin == 0xFF) {
|
||||
HAL_adc_select = -1; // Digital only
|
||||
}
|
||||
else if (pin & 0x80) {
|
||||
HAL_adc_select = 1;
|
||||
ADC2_HC0 = pin & 0x7F;
|
||||
}
|
||||
else {
|
||||
HAL_adc_select = 0;
|
||||
ADC1_HC0 = pin;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t HAL_adc_get_result() {
|
||||
switch (HAL_adc_select) {
|
||||
case 0:
|
||||
while (!(ADC1_HS & ADC_HS_COCO0)) ; // wait
|
||||
return ADC1_R0;
|
||||
case 1:
|
||||
while (!(ADC2_HS & ADC_HS_COCO0)) ; // wait
|
||||
return ADC2_R0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool is_output(uint8_t pin) {
|
||||
const struct digital_pin_bitband_and_config_table_struct *p;
|
||||
p = digital_pin_to_info_PGM + pin;
|
||||
return (*(p->reg + 1) & p->mask);
|
||||
}
|
||||
|
||||
#endif // __IMXRT1062__
|
||||
|
@@ -32,7 +32,6 @@
|
||||
#include "../shared/HAL_SPI.h"
|
||||
|
||||
#include "fastio.h"
|
||||
#include "watchdog.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <util/atomic.h>
|
||||
@@ -41,10 +40,6 @@
|
||||
#include "../../feature/ethernet.h"
|
||||
#endif
|
||||
|
||||
#define CPU_ST7920_DELAY_1 600
|
||||
#define CPU_ST7920_DELAY_2 750
|
||||
#define CPU_ST7920_DELAY_3 750
|
||||
|
||||
// ------------------------
|
||||
// Defines
|
||||
// ------------------------
|
||||
@@ -55,7 +50,23 @@
|
||||
#define IS_TEENSY41 1
|
||||
#endif
|
||||
|
||||
#define CPU_ST7920_DELAY_1 600
|
||||
#define CPU_ST7920_DELAY_2 750
|
||||
#define CPU_ST7920_DELAY_3 750
|
||||
|
||||
#undef sq
|
||||
#define sq(x) ((x)*(x))
|
||||
|
||||
// Don't place string constants in PROGMEM
|
||||
#undef PSTR
|
||||
#define PSTR(str) ({static const char *data = (str); &data[0];})
|
||||
|
||||
// ------------------------
|
||||
// Serial ports
|
||||
// ------------------------
|
||||
|
||||
#include "../../core/serial_hook.h"
|
||||
|
||||
#define Serial0 Serial
|
||||
#define _DECLARE_SERIAL(X) \
|
||||
typedef ForwardSerial1Class<decltype(Serial##X)> DefaultSerial##X; \
|
||||
@@ -89,71 +100,120 @@ extern USBSerialType USBSerial;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define HAL_SERVO_LIB libServo
|
||||
// ------------------------
|
||||
// Types
|
||||
// ------------------------
|
||||
|
||||
class libServo;
|
||||
typedef libServo hal_servo_t;
|
||||
|
||||
typedef int8_t pin_t;
|
||||
|
||||
// ------------------------
|
||||
// Interrupts
|
||||
// ------------------------
|
||||
|
||||
#define CRITICAL_SECTION_START() const bool irqon = !__get_primask(); __disable_irq()
|
||||
#define CRITICAL_SECTION_END() if (irqon) __enable_irq()
|
||||
|
||||
// ------------------------
|
||||
// ADC
|
||||
// ------------------------
|
||||
|
||||
#ifndef analogInputToDigitalPin
|
||||
#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1)
|
||||
#endif
|
||||
|
||||
#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq()
|
||||
#define CRITICAL_SECTION_END() if (!primask) __enable_irq()
|
||||
#define ISRS_ENABLED() (!__get_primask())
|
||||
#define ENABLE_ISRS() __enable_irq()
|
||||
#define DISABLE_ISRS() __disable_irq()
|
||||
#define HAL_ADC_VREF 3.3
|
||||
#define HAL_ADC_RESOLUTION 10
|
||||
#define HAL_ADC_FILTERED // turn off ADC oversampling
|
||||
|
||||
#undef sq
|
||||
#define sq(x) ((x)*(x))
|
||||
//
|
||||
// Pin Mapping for M42, M43, M226
|
||||
//
|
||||
#define GET_PIN_MAP_PIN(index) index
|
||||
#define GET_PIN_MAP_INDEX(pin) pin
|
||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||
|
||||
// Don't place string constants in PROGMEM
|
||||
#undef PSTR
|
||||
#define PSTR(str) ({static const char *data = (str); &data[0];})
|
||||
// FastIO
|
||||
bool is_output(pin_t pin);
|
||||
|
||||
// Enable hooks into idle and setup for HAL
|
||||
#define HAL_IDLETASK 1
|
||||
FORCE_INLINE void HAL_idletask() {}
|
||||
FORCE_INLINE void HAL_init() {}
|
||||
|
||||
// Clear reset reason
|
||||
void HAL_clear_reset_source();
|
||||
|
||||
// Reset reason
|
||||
uint8_t HAL_get_reset_source();
|
||||
|
||||
void HAL_reboot();
|
||||
|
||||
FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); }
|
||||
// ------------------------
|
||||
// Free Memory Accessor
|
||||
// ------------------------
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#if GCC_VERSION <= 50000
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||
#endif
|
||||
|
||||
extern "C" uint32_t freeMemory();
|
||||
|
||||
#if GCC_VERSION <= 50000
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
// ADC
|
||||
// ------------------------
|
||||
// MarlinHAL Class
|
||||
// ------------------------
|
||||
|
||||
void HAL_adc_init();
|
||||
class MarlinHAL {
|
||||
public:
|
||||
|
||||
#define HAL_ADC_VREF 3.3
|
||||
#define HAL_ADC_RESOLUTION 10
|
||||
#define HAL_ADC_FILTERED // turn off ADC oversampling
|
||||
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
|
||||
#define HAL_READ_ADC() HAL_adc_get_result()
|
||||
#define HAL_ADC_READY() true
|
||||
// Earliest possible init, before setup()
|
||||
MarlinHAL() {}
|
||||
|
||||
#define HAL_ANALOG_SELECT(pin)
|
||||
// Watchdog
|
||||
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
||||
|
||||
void HAL_adc_start_conversion(const uint8_t adc_pin);
|
||||
uint16_t HAL_adc_get_result();
|
||||
static void init() {} // Called early in setup()
|
||||
static void init_board() {} // Called less early in setup()
|
||||
static void reboot(); // Restart the firmware from 0x0
|
||||
|
||||
#define GET_PIN_MAP_PIN(index) index
|
||||
#define GET_PIN_MAP_INDEX(pin) pin
|
||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||
// Interrupts
|
||||
static bool isr_state() { return !__get_primask(); }
|
||||
static void isr_on() { __enable_irq(); }
|
||||
static void isr_off() { __disable_irq(); }
|
||||
|
||||
bool is_output(uint8_t pin);
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
static void idletask() {}
|
||||
|
||||
// Reset
|
||||
static uint8_t get_reset_source();
|
||||
static void clear_reset_source();
|
||||
|
||||
// Free SRAM
|
||||
static int freeMemory() { return ::freeMemory(); }
|
||||
|
||||
//
|
||||
// ADC Methods
|
||||
//
|
||||
|
||||
static int8_t adc_select;
|
||||
|
||||
// Called by Temperature::init once at startup
|
||||
static void adc_init();
|
||||
|
||||
// Called by Temperature::init for each sensor at startup
|
||||
static void adc_enable(const pin_t pin) {}
|
||||
|
||||
// Begin ADC sampling on the given pin. Called from Temperature::isr!
|
||||
static void adc_start(const pin_t pin);
|
||||
|
||||
// Is the ADC ready for reading?
|
||||
static bool adc_ready() { return true; }
|
||||
|
||||
// The current value of the ADC register
|
||||
static uint16_t adc_value();
|
||||
|
||||
/**
|
||||
* Set the PWM duty cycle for the pin to the given value.
|
||||
* No option to invert the duty cycle [default = false]
|
||||
* No option to change the scale of the provided value to enable finer PWM duty control [default = 255]
|
||||
*/
|
||||
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) {
|
||||
analogWrite(pin, v);
|
||||
}
|
||||
|
||||
};
|
||||
|
@@ -51,12 +51,9 @@ static SPISettings spiConfig;
|
||||
// ------------------------
|
||||
|
||||
void spiBegin() {
|
||||
#ifndef SD_SS_PIN
|
||||
#error "SD_SS_PIN is not defined!"
|
||||
#if PIN_EXISTS(SD_SS)
|
||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||
#endif
|
||||
|
||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||
|
||||
//SET_OUTPUT(SD_SCK_PIN);
|
||||
//SET_INPUT(SD_MISO_PIN);
|
||||
//SET_OUTPUT(SD_MOSI_PIN);
|
||||
|
@@ -30,7 +30,7 @@
|
||||
|
||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
switch (timer_num) {
|
||||
case 0:
|
||||
case MF_TIMER_STEP:
|
||||
CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode
|
||||
CCM_CCGR1 |= CCM_CCGR1_GPT1_BUS(CCM_CCGR_ON);
|
||||
|
||||
@@ -48,7 +48,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
attachInterruptVector(IRQ_GPT1, &stepTC_Handler);
|
||||
NVIC_SET_PRIORITY(IRQ_GPT1, 16);
|
||||
break;
|
||||
case 1:
|
||||
case MF_TIMER_TEMP:
|
||||
CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode
|
||||
CCM_CCGR0 |= CCM_CCGR0_GPT2_BUS(CCM_CCGR_ON);
|
||||
|
||||
@@ -71,19 +71,15 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
|
||||
void HAL_timer_enable_interrupt(const uint8_t timer_num) {
|
||||
switch (timer_num) {
|
||||
case 0:
|
||||
NVIC_ENABLE_IRQ(IRQ_GPT1);
|
||||
break;
|
||||
case 1:
|
||||
NVIC_ENABLE_IRQ(IRQ_GPT2);
|
||||
break;
|
||||
case MF_TIMER_STEP: NVIC_ENABLE_IRQ(IRQ_GPT1); break;
|
||||
case MF_TIMER_TEMP: NVIC_ENABLE_IRQ(IRQ_GPT2); break;
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
||||
switch (timer_num) {
|
||||
case 0: NVIC_DISABLE_IRQ(IRQ_GPT1); break;
|
||||
case 1: NVIC_DISABLE_IRQ(IRQ_GPT2); break;
|
||||
case MF_TIMER_STEP: NVIC_DISABLE_IRQ(IRQ_GPT1); break;
|
||||
case MF_TIMER_TEMP: NVIC_DISABLE_IRQ(IRQ_GPT2); break;
|
||||
}
|
||||
|
||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||
@@ -93,20 +89,16 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
||||
|
||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
||||
switch (timer_num) {
|
||||
case 0: return (NVIC_IS_ENABLED(IRQ_GPT1));
|
||||
case 1: return (NVIC_IS_ENABLED(IRQ_GPT2));
|
||||
case MF_TIMER_STEP: return (NVIC_IS_ENABLED(IRQ_GPT1));
|
||||
case MF_TIMER_TEMP: return (NVIC_IS_ENABLED(IRQ_GPT2));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
||||
switch (timer_num) {
|
||||
case 0:
|
||||
GPT1_SR = GPT_IR_OF1IE; // clear OF3 bit
|
||||
break;
|
||||
case 1:
|
||||
GPT2_SR = GPT_IR_OF1IE; // clear OF3 bit
|
||||
break;
|
||||
case MF_TIMER_STEP: GPT1_SR = GPT_IR_OF1IE; break; // clear OF3 bit
|
||||
case MF_TIMER_TEMP: GPT2_SR = GPT_IR_OF1IE; break; // clear OF3 bit
|
||||
}
|
||||
asm volatile("dsb");
|
||||
}
|
||||
|
@@ -43,14 +43,14 @@ typedef uint32_t hal_timer_t;
|
||||
#define GPT1_TIMER_RATE (GPT_TIMER_RATE / GPT1_TIMER_PRESCALE) // 75MHz
|
||||
#define GPT2_TIMER_RATE (GPT_TIMER_RATE / GPT2_TIMER_PRESCALE) // 15MHz
|
||||
|
||||
#ifndef STEP_TIMER_NUM
|
||||
#define STEP_TIMER_NUM 0 // Timer Index for Stepper
|
||||
#ifndef MF_TIMER_STEP
|
||||
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
||||
#endif
|
||||
#ifndef PULSE_TIMER_NUM
|
||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||
#ifndef MF_TIMER_PULSE
|
||||
#define MF_TIMER_PULSE MF_TIMER_STEP
|
||||
#endif
|
||||
#ifndef TEMP_TIMER_NUM
|
||||
#define TEMP_TIMER_NUM 1 // Timer Index for Temperature
|
||||
#ifndef MF_TIMER_TEMP
|
||||
#define MF_TIMER_TEMP 1 // Timer Index for Temperature
|
||||
#endif
|
||||
|
||||
#define TEMP_TIMER_RATE 1000000
|
||||
@@ -64,12 +64,12 @@ typedef uint32_t hal_timer_t;
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||
|
||||
#ifndef HAL_STEP_TIMER_ISR
|
||||
#define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() // GPT1_Handler()
|
||||
@@ -87,27 +87,23 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
|
||||
|
||||
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
|
||||
switch (timer_num) {
|
||||
case 0:
|
||||
GPT1_OCR1 = compare - 1;
|
||||
break;
|
||||
case 1:
|
||||
GPT2_OCR1 = compare - 1;
|
||||
break;
|
||||
case MF_TIMER_STEP: GPT1_OCR1 = compare - 1; break;
|
||||
case MF_TIMER_TEMP: GPT2_OCR1 = compare - 1; break;
|
||||
}
|
||||
}
|
||||
|
||||
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
|
||||
switch (timer_num) {
|
||||
case 0: return GPT1_OCR1;
|
||||
case 1: return GPT2_OCR1;
|
||||
case MF_TIMER_STEP: return GPT1_OCR1;
|
||||
case MF_TIMER_TEMP: return GPT2_OCR1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
|
||||
switch (timer_num) {
|
||||
case 0: return GPT1_CNT;
|
||||
case 1: return GPT2_CNT;
|
||||
case MF_TIMER_STEP: return GPT1_CNT;
|
||||
case MF_TIMER_TEMP: return GPT2_CNT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -118,4 +114,4 @@ bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
|
||||
|
||||
void HAL_timer_isr_prologue(const uint8_t timer_num);
|
||||
//void HAL_timer_isr_epilogue(const uint8_t timer_num) {}
|
||||
#define HAL_timer_isr_epilogue(TIMER_NUM)
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
|
@@ -1,52 +0,0 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifdef __IMXRT1062__
|
||||
|
||||
/**
|
||||
* HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
|
||||
*/
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(USE_WATCHDOG)
|
||||
|
||||
#include "watchdog.h"
|
||||
|
||||
#define WDT_TIMEOUT TERN(WATCHDOG_DURATION_8S, 8, 4) // 4 or 8 second timeout
|
||||
|
||||
constexpr uint8_t timeoutval = (WDT_TIMEOUT - 0.5f) / 0.5f;
|
||||
|
||||
void watchdog_init() {
|
||||
CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks
|
||||
WDOG1_WMCR = 0; // disable power down PDE
|
||||
WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval);
|
||||
WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE;
|
||||
}
|
||||
|
||||
void HAL_watchdog_refresh() {
|
||||
// Watchdog refresh sequence
|
||||
WDOG1_WSR = 0x5555;
|
||||
WDOG1_WSR = 0xAAAA;
|
||||
}
|
||||
|
||||
#endif // USE_WATCHDOG
|
||||
#endif // __IMXRT1062__
|
@@ -1,30 +0,0 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
* HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
|
||||
*/
|
||||
|
||||
void watchdog_init();
|
||||
|
||||
void HAL_watchdog_refresh();
|
Reference in New Issue
Block a user