forked from MarlinFirmware/Marlin
-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support for Teensy 4 (MarlinFirmware#19311)
- Loading branch information
1 parent
a8904d2
commit ea39d3c
Showing
31 changed files
with
1,814 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
/** | ||
* 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/>. | ||
* | ||
*/ | ||
|
||
/** | ||
* Description: HAL for Teensy40 (IMXRT1062) | ||
*/ | ||
|
||
#ifdef __IMXRT1062__ | ||
|
||
#include "HAL.h" | ||
#include "../shared/Delay.h" | ||
#include "timers.h" | ||
|
||
#include <Wire.h> | ||
|
||
uint16_t HAL_adc_result, HAL_adc_select; | ||
|
||
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) ; | ||
} | ||
|
||
void HAL_clear_reset_source() { | ||
uint32_t reset_source = SRC_SRSR; | ||
SRC_SRSR = reset_source; | ||
} | ||
|
||
uint8_t HAL_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 16: return RST_WATCHDOG; break; | ||
case 64: return RST_JTAG; break; | ||
// case 128: return RST_OVERTEMP; break; | ||
} | ||
return 0; | ||
} | ||
|
||
#define __bss_end _ebss | ||
|
||
extern "C" { | ||
extern char __bss_end; | ||
extern char __heap_start; | ||
extern void* __brkval; | ||
|
||
// 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); | ||
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__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,180 @@ | ||
/** | ||
* Marlin 3D Printer Firmware | ||
* | ||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com | ||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com | ||
* | ||
* 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 | ||
|
||
/** | ||
* Description: HAL for Teensy 4.0 and Teensy 4.1 | ||
*/ | ||
|
||
#define CPU_32_BIT | ||
|
||
#include "../shared/Marduino.h" | ||
#include "../shared/math_32bit.h" | ||
#include "../shared/HAL_SPI.h" | ||
|
||
#include "fastio.h" | ||
#include "watchdog.h" | ||
|
||
#include <stdint.h> | ||
#include <util/atomic.h> | ||
|
||
//#define ST7920_DELAY_1 DELAY_NS(600) | ||
//#define ST7920_DELAY_2 DELAY_NS(750) | ||
//#define ST7920_DELAY_3 DELAY_NS(750) | ||
|
||
// ------------------------ | ||
// Defines | ||
// ------------------------ | ||
|
||
#ifdef __IMXRT1062__ | ||
#define IS_32BIT_TEENSY 1 | ||
#define IS_TEENSY41 1 | ||
#endif | ||
|
||
#if SERIAL_PORT == -1 | ||
#define MYSERIAL0 SerialUSB | ||
#elif SERIAL_PORT == 0 | ||
#define MYSERIAL0 Serial | ||
#elif SERIAL_PORT == 1 | ||
#define MYSERIAL0 Serial1 | ||
#elif SERIAL_PORT == 2 | ||
#define MYSERIAL0 Serial2 | ||
#elif SERIAL_PORT == 3 | ||
#define MYSERIAL0 Serial3 | ||
#elif SERIAL_PORT == 4 | ||
#define MYSERIAL0 Serial4 | ||
#elif SERIAL_PORT == 5 | ||
#define MYSERIAL0 Serial5 | ||
#elif SERIAL_PORT == 6 | ||
#define MYSERIAL0 Serial6 | ||
#elif SERIAL_PORT == 7 | ||
#define MYSERIAL0 Serial7 | ||
#elif SERIAL_PORT == 8 | ||
#define MYSERIAL0 Serial8 | ||
#else | ||
#error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." | ||
#endif | ||
|
||
#ifdef SERIAL_PORT_2 | ||
#if SERIAL_PORT_2 == SERIAL_PORT | ||
#error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration." | ||
#elif SERIAL_PORT_2 == -1 | ||
#define MYSERIAL1 usbSerial | ||
#elif SERIAL_PORT_2 == 0 | ||
#define MYSERIAL1 Serial | ||
#elif SERIAL_PORT_2 == 1 | ||
#define MYSERIAL1 Serial1 | ||
#elif SERIAL_PORT_2 == 2 | ||
#define MYSERIAL1 Serial2 | ||
#elif SERIAL_PORT_2 == 3 | ||
#define MYSERIAL1 Serial3 | ||
#elif SERIAL_PORT_2 == 4 | ||
#define MYSERIAL1 Serial4 | ||
#elif SERIAL_PORT_2 == 5 | ||
#define MYSERIAL1 Serial5 | ||
#elif SERIAL_PORT_2 == 6 | ||
#define MYSERIAL1 Serial6 | ||
#elif SERIAL_PORT_2 == 7 | ||
#define MYSERIAL1 Serial7 | ||
#elif SERIAL_PORT_2 == 8 | ||
#define MYSERIAL1 Serial8 | ||
#else | ||
#error "SERIAL_PORT_2 must be from -1 to 8. Please update your configuration." | ||
#endif | ||
#define NUM_SERIAL 2 | ||
#else | ||
#define NUM_SERIAL 1 | ||
#endif | ||
|
||
#define HAL_SERVO_LIB libServo | ||
|
||
typedef int8_t pin_t; | ||
|
||
#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() | ||
|
||
#undef sq | ||
#define sq(x) ((x)*(x)) | ||
|
||
#ifndef strncpy_P | ||
#define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) | ||
#endif | ||
|
||
// Don't place string constants in PROGMEM | ||
#undef PSTR | ||
#define PSTR(str) ({static const char *data = (str); &data[0];}) | ||
|
||
// Fix bug in pgm_read_ptr | ||
#undef pgm_read_ptr | ||
#define pgm_read_ptr(addr) (*((void**)(addr))) | ||
// Add type-checking to pgm_read_word | ||
#undef pgm_read_word | ||
#define pgm_read_word(addr) (*((uint16_t*)(addr))) | ||
|
||
// 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(); | ||
|
||
FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } | ||
|
||
#pragma GCC diagnostic push | ||
#pragma GCC diagnostic ignored "-Wunused-function" | ||
extern "C" { | ||
uint32_t freeMemory(); | ||
} | ||
#pragma GCC diagnostic pop | ||
|
||
// ADC | ||
|
||
void HAL_adc_init(); | ||
|
||
#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 | ||
|
||
#define HAL_ANALOG_SELECT(pin) | ||
|
||
void HAL_adc_start_conversion(const uint8_t adc_pin); | ||
uint16_t HAL_adc_get_result(); | ||
|
||
#define GET_PIN_MAP_PIN(index) index | ||
#define GET_PIN_MAP_INDEX(pin) pin | ||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) | ||
|
||
bool is_output(uint8_t pin); |
Oops, something went wrong.