2017-10-11 08:33:19 +02:00
|
|
|
/**
|
|
|
|
* Marlin 3D Printer Firmware
|
2019-06-28 06:57:50 +02:00
|
|
|
* Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
2017-10-11 08:33:19 +02:00
|
|
|
*
|
|
|
|
* Based on Sprinter and grbl.
|
2019-06-28 06:57:50 +02:00
|
|
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
2017-10-11 08:33:19 +02:00
|
|
|
*
|
|
|
|
* 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/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* InterruptVectors_Due.cpp - This module relocates the Interrupt vector table to SRAM,
|
|
|
|
* allowing to register new interrupt handlers at runtime. Specially valuable and needed
|
|
|
|
* because Arduino runtime allocates some interrupt handlers that we NEED to override to
|
|
|
|
* properly support extended functionality, as for example, USB host or USB device (MSD, MTP)
|
|
|
|
* and custom serial port handlers, and we don't actually want to modify and/or recompile the
|
|
|
|
* Arduino runtime. We just want to run as much as possible on Stock Arduino
|
|
|
|
*
|
|
|
|
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
|
|
|
*/
|
|
|
|
#ifdef ARDUINO_ARCH_SAM
|
|
|
|
|
2018-10-03 07:47:27 +02:00
|
|
|
#include "../../inc/MarlinConfig.h"
|
2018-04-13 03:25:08 +02:00
|
|
|
#include "HAL.h"
|
2019-09-03 02:49:58 +02:00
|
|
|
#include "InterruptVectors.h"
|
2017-10-11 08:33:19 +02:00
|
|
|
|
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
|
|
|
/* The relocated Exception/Interrupt Table - According to the ARM
|
|
|
|
reference manual, alignment to 128 bytes should suffice, but in
|
|
|
|
practice, we need alignment to 256 bytes to make this work in all
|
|
|
|
cases */
|
|
|
|
__attribute__ ((aligned(256)))
|
2019-05-09 18:45:55 +02:00
|
|
|
static DeviceVectors ram_tab = { nullptr };
|
2017-10-11 08:33:19 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This function checks if the exception/interrupt table is already in SRAM or not.
|
|
|
|
* If it is not, then it copies the ROM table to the SRAM and relocates the table
|
|
|
|
* by reprogramming the NVIC registers
|
|
|
|
*/
|
|
|
|
static pfnISR_Handler* get_relocated_table_addr(void) {
|
|
|
|
// Get the address of the interrupt/exception table
|
|
|
|
uint32_t isrtab = SCB->VTOR;
|
|
|
|
|
|
|
|
// If already relocated, we are done!
|
|
|
|
if (isrtab >= IRAM0_ADDR)
|
|
|
|
return (pfnISR_Handler*)isrtab;
|
|
|
|
|
|
|
|
// Get the address of the table stored in FLASH
|
|
|
|
const pfnISR_Handler* romtab = (const pfnISR_Handler*)isrtab;
|
|
|
|
|
|
|
|
// Copy it to SRAM
|
|
|
|
memcpy(&ram_tab, romtab, sizeof(ram_tab));
|
|
|
|
|
|
|
|
// Disable global interrupts
|
|
|
|
CRITICAL_SECTION_START;
|
|
|
|
|
|
|
|
// Set the vector table base address to the SRAM copy
|
|
|
|
SCB->VTOR = (uint32_t)(&ram_tab);
|
|
|
|
|
|
|
|
// Reenable interrupts
|
|
|
|
CRITICAL_SECTION_END;
|
|
|
|
|
|
|
|
// Return the address of the table
|
|
|
|
return (pfnISR_Handler*)(&ram_tab);
|
|
|
|
}
|
|
|
|
|
|
|
|
pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler) {
|
|
|
|
// Get the address of the relocated table
|
2017-10-31 15:00:06 +01:00
|
|
|
pfnISR_Handler *isrtab = get_relocated_table_addr();
|
2017-10-11 08:33:19 +02:00
|
|
|
|
|
|
|
// Disable global interrupts
|
|
|
|
CRITICAL_SECTION_START;
|
|
|
|
|
|
|
|
// Get the original handler
|
|
|
|
pfnISR_Handler oldHandler = isrtab[irq + 16];
|
|
|
|
|
|
|
|
// Install the new one
|
|
|
|
isrtab[irq + 16] = newHandler;
|
|
|
|
|
|
|
|
// Reenable interrupts
|
|
|
|
CRITICAL_SECTION_END;
|
|
|
|
|
|
|
|
// Return the original one
|
|
|
|
return oldHandler;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|