Firmware2/Marlin/src/HAL/HAL_DUE/HAL_Due.h

157 lines
4.3 KiB
C
Raw Normal View History

2017-07-19 01:29:06 +02:00
/**
* Marlin 3D Printer Firmware
*
* Copyright (C) 2016 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 <http://www.gnu.org/licenses/>.
*
*/
/**
* Description: HAL for Arduino Due and compatible (SAM3X8E)
*
* For ARDUINO_ARCH_SAM
*/
#ifndef _HAL_DUE_H
#define _HAL_DUE_H
#include <stdint.h>
2017-11-19 20:57:07 +01:00
#include <Arduino.h>
2017-07-19 01:29:06 +02:00
#include "fastio_Due.h"
#include "watchdog_Due.h"
#include "HAL_timers_Due.h"
//
2017-07-19 01:29:06 +02:00
// Defines
//
2017-07-19 01:29:06 +02:00
#if SERIAL_PORT == -1
#define MYSERIAL SerialUSB
Fixes for the Arduino DUE HAL (Serial Port, Graphics Display, EEPROM emulation) (#8651) * Fixing the DUE serial port assignments: Now -1 means the SAM3x USB Device emulating a serial port, and 0 means the USB to serial adapter included as a programming port * Improving the Fast IO port access implementation on Arduino DUE * Implemented EEPROM emulation on Due by storing data on the internal FLASH (with wear leveling) * Implemented a Software SPI for the ST7920 graphics display for the Arduino RAMPS for DUE, as the default one in u8glib is clocking data too fast on ARM, and the display does not understand it. * Fixing the case where the serial port selected is the USB device * Adding configuration for the Makerparts 3D printer (www.makerparts.net) * Tuned MakerParts acceleration on X and Y axis so it never loses steps. Also adjusted pulses per mm to match default hw configuration * Fine tuned Maximum acceleration for MakerParts printer * Style cleanup * Style cleanup (2) * Style fixes (3) * Fixing the DUE serial port assignments: Now -1 means the SAM3x USB Device emulating a serial port, and 0 means the USB to serial adapter included as a programming port * Improving the Fast IO port access implementation on Arduino DUE * Implemented EEPROM emulation on Due by storing data on the internal FLASH (with wear leveling) * Implemented a Software SPI for the ST7920 graphics display for the Arduino RAMPS for DUE, as the default one in u8glib is clocking data too fast on ARM, and the display does not understand it. * Fixing the case where the serial port selected is the USB device * Adding configuration for the Makerparts 3D printer (www.makerparts.net) * Tuned MakerParts acceleration on X and Y axis so it never loses steps. Also adjusted pulses per mm to match default hw configuration * Fine tuned Maximum acceleration for MakerParts printer * Style cleanup * Style changes to u8g_dev_st7920_128_64_sw_spi.cpp * Even more improvements to the FastIO HAL for DUE. Now WRITE() is 2 ASM instructions, if value is constant, and 5 cycles if value is not constant. Previously, it was 7..8 cycles * After some problems and debugging, seems we need to align the interrupt vector table to 256 bytes, otherwise, the program sometimes stops working * Moved comments out of macro, otherwise, token pasting does not properly work sometimes * Improved Software SPI implementation on DUE: Now it honors the selected speed passed to spiInit(). This allows much faster SDCARD access, improving SDCARD menus and reducing latency * Update u8g_dev_st7920_128_64_sw_spi.cpp * Disabling EEPROM over FLASH emulatiion if an I2C or SPI EEPROM is present
2017-12-13 00:51:36 +01:00
#elif SERIAL_PORT >= 0 && SERIAL_PORT <= 4
#define MYSERIAL customizedSerial
2017-07-19 01:29:06 +02:00
#endif
// We need the previous define before the include, or compilation bombs...
#include "MarlinSerial_Due.h"
2017-07-19 01:29:06 +02:00
#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();
// On AVR this is in math.h?
#define square(x) ((x)*(x))
#ifndef strncpy_P
#define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
#endif
2017-09-06 13:28:32 +02:00
#ifndef vsnprintf_P
#define vsnprintf_P vsnprintf
#endif
2017-07-19 01:29:06 +02:00
// Fix bug in pgm_read_ptr
#undef pgm_read_ptr
2017-09-06 13:28:32 +02:00
#define pgm_read_ptr(addr) (*((void**)(addr)))
#undef pgm_read_word
#define pgm_read_word(addr) (*((uint16_t*)(addr)))
2017-07-19 01:29:06 +02:00
#define RST_POWER_ON 1
#define RST_EXTERNAL 2
#define RST_BROWN_OUT 4
#define RST_WATCHDOG 8
#define RST_JTAG 16
#define RST_SOFTWARE 32
#define RST_BACKUP 64
// --------------------------------------------------------------------------
// Types
// --------------------------------------------------------------------------
typedef int8_t pin_t;
2017-07-19 01:29:06 +02:00
2017-11-15 09:06:48 +01:00
#define HAL_SERVO_LIB Servo
2017-07-19 01:29:06 +02:00
// --------------------------------------------------------------------------
// Public Variables
// --------------------------------------------------------------------------
extern uint16_t HAL_adc_result; // result of last ADC conversion
2017-07-19 01:29:06 +02:00
void cli(void); // Disable interrupts
void sei(void); // Enable interrupts
2017-07-19 01:29:06 +02:00
void HAL_clear_reset_source(void); // clear reset reason
uint8_t HAL_get_reset_source(void); // get reset reason
2017-07-19 01:29:06 +02:00
2017-09-27 11:57:33 +02:00
void _delay_ms(const int delay);
2017-07-19 01:29:06 +02:00
int freeMemory(void);
/**
* SPI: Extended functions taking a channel number (hardware SPI only)
*/
// Write single byte to specified SPI channel
2017-07-19 01:29:06 +02:00
void spiSend(uint32_t chan, byte b);
// Write buffer to specified SPI channel
2017-07-19 01:29:06 +02:00
void spiSend(uint32_t chan, const uint8_t* buf, size_t n);
// Read single byte from specified SPI channel
2017-07-19 01:29:06 +02:00
uint8_t spiRec(uint32_t chan);
/**
* EEPROM
*/
2017-07-19 01:29:06 +02:00
void eeprom_write_byte(unsigned char *pos, unsigned char value);
unsigned char eeprom_read_byte(unsigned char *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
/**
* ADC
*/
2017-07-19 01:29:06 +02:00
#define HAL_ANALOG_SELECT(pin)
inline void HAL_adc_init(void) {}//todo
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
#define HAL_READ_ADC HAL_adc_result
2017-09-27 10:52:29 +02:00
void HAL_adc_start_conversion(const uint8_t adc_pin);
2017-07-19 01:29:06 +02:00
uint16_t HAL_adc_get_result(void);
uint16_t HAL_getAdcReading(uint8_t chan);
void HAL_startAdcConversion(uint8_t chan);
uint8_t HAL_pinToAdcChannel(int pin);
uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false);
//uint16_t HAL_getAdcSuperSample(uint8_t chan);
void HAL_enable_AdcFreerun(void);
//void HAL_disable_AdcFreerun(uint8_t chan);
#define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
2017-07-19 01:29:06 +02:00
#endif // _HAL_DUE_H