Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/DuetM
diff options
context:
space:
mode:
authorManuel Coenen <manuel@duet3d.com>2021-01-26 14:33:52 +0300
committerManuel Coenen <manuel@duet3d.com>2021-01-26 14:33:52 +0300
commit93fa897014e5e78df6667211e4dab87625f7b800 (patch)
treea814aadad2b430925a8cba70a1c1227503edd06f /src/DuetM
parent806d32c60b784d29b908e07d9c97d3d81714ff79 (diff)
Convert Maestro build to CoreN2G
Diffstat (limited to 'src/DuetM')
-rw-r--r--src/DuetM/Pins_DuetM.cpp16
-rw-r--r--src/DuetM/Pins_DuetM.h362
2 files changed, 155 insertions, 223 deletions
diff --git a/src/DuetM/Pins_DuetM.cpp b/src/DuetM/Pins_DuetM.cpp
index 07461c6e..8fcbda72 100644
--- a/src/DuetM/Pins_DuetM.cpp
+++ b/src/DuetM/Pins_DuetM.cpp
@@ -9,9 +9,15 @@
// Hardware-dependent pins functions
-// Function to look up a pin name pass back the corresponding index into the pin table
+// Return a pointer to the pin description entry. Declared in and called from CoreN2G.
+const PinDescriptionBase *AppGetPinDescription(Pin p) noexcept
+{
+ return (p < ARRAY_SIZE(PinTable)) ? &PinTable[p] : nullptr;
+}
+
+// Function to look up a pin name and pass back the corresponding index into the pin table
// On this platform, the mapping from pin names to pins is fixed, so this is a simple lookup
-bool LookupPinName(const char*pn, LogicalPin& lpin, bool& hardwareInverted) noexcept
+bool LookupPinName(const char *pn, LogicalPin &lpin, bool &hardwareInverted) noexcept
{
if (StringEqualsIgnoreCase(pn, NoPinName))
{
@@ -22,7 +28,11 @@ bool LookupPinName(const char*pn, LogicalPin& lpin, bool& hardwareInverted) noex
for (size_t lp = 0; lp < ARRAY_SIZE(PinTable); ++lp)
{
- const char *q = PinTable[lp].names;
+ const char *q = PinTable[lp].pinNames;
+ if (q == nullptr)
+ {
+ continue;
+ }
while (*q != 0)
{
// Try the next alias in the list of names for this pin
diff --git a/src/DuetM/Pins_DuetM.h b/src/DuetM/Pins_DuetM.h
index 6a4ea490..b554a14f 100644
--- a/src/DuetM/Pins_DuetM.h
+++ b/src/DuetM/Pins_DuetM.h
@@ -8,6 +8,8 @@
#ifndef SRC_DUETM_PINS_DUETM_H_
#define SRC_DUETM_PINS_DUETM_H_
+#include <PinDescription.h>
+
#define BOARD_NAME "Duet 2 Maestro"
#define BOARD_SHORT_NAME "2Maestro"
#define FIRMWARE_NAME "RepRapFirmware for Duet 2 Maestro"
@@ -104,11 +106,24 @@ constexpr Pin ENABLE_PINS[NumDirectDrivers] = { NoPin, NoPin, NoPin, NoPin, NoPi
constexpr Pin STEP_PINS[NumDirectDrivers] = { PortCPin(20), PortCPin(2), PortCPin(28), PortCPin(4), PortCPin(5), PortCPin(31), PortCPin(21) };
constexpr Pin DIRECTION_PINS[NumDirectDrivers] = { PortCPin(18), PortAPin(8), PortBPin(4), PortBPin(7), PortCPin(6), PortAPin(18), PortCPin(24) };
+// Serial
+// UART0 used by TMC drivers
+constexpr Pin APIN_UART0_RXD = PortAPin(9);
+constexpr Pin APIN_UART0_TXD = PortAPin(10);
+constexpr GpioPinFunction USART0PeriphMode = GpioPinFunction::A;
+
+// Serial0 uses UART1
+constexpr Pin APIN_Serial0_RXD = PortAPin(2);
+constexpr Pin APIN_Serial0_TXD = PortAPin(3);
+constexpr GpioPinFunction Serial0PeriphMode = GpioPinFunction::A;
+
// UART interface to stepper drivers
Uart * const UART_TMC22xx = UART0;
constexpr IRQn TMC22xx_UART_IRQn = UART0_IRQn;
constexpr uint32_t ID_TMC22xx_UART = ID_UART0;
-constexpr uint8_t TMC22xx_UART_PINS = APINS_UART0;
+constexpr Pin TMC22xxUartRxPin = APIN_UART0_RXD;
+constexpr Pin TMC22xxUartTxPin = APIN_UART0_TXD;
+constexpr GpioPinFunction TMC22xxUartPeriphMode = USART0PeriphMode;
#define TMC22xx_UART_Handler UART0_Handler
@@ -194,243 +209,150 @@ constexpr Pin EncoderPinSw = PortAPin(7);
#define USART_SSPI USART0
#define ID_SSPI ID_USART0
-// Enum to represent allowed types of pin access
-// We don't have a separate bit for servo, because Duet PWM-capable ports can be used for servos if they are on the Duet main board
-enum class PinCapability: uint8_t
-{
- // Individual capabilities
- read = 1,
- ain = 2,
- write = 4,
- pwm = 8,
-
- // Combinations
- ainr = 1|2,
- rw = 1|4,
- wpwm = 4|8,
- rwpwm = 1|4|8,
- ainrw = 1|2|4,
- ainrwpwm = 1|2|4|8
-};
-
-constexpr inline PinCapability operator|(PinCapability a, PinCapability b) noexcept
-{
- return (PinCapability)((uint8_t)a | (uint8_t)b);
-}
-
-// Struct to represent a pin that can be assigned to various functions
-// This can be varied to suit the hardware. It is a struct not a class so that it can be direct initialised in read-only memory.
-struct PinEntry
-{
- Pin GetPin() const noexcept { return pin; }
- PinCapability GetCapability() const noexcept { return cap; }
- const char* GetNames() const noexcept { return names; }
-
- Pin pin;
- PinCapability cap;
- const char *names;
-};
-
-// List of assignable pins and their mapping from names to MPU ports. This is indexed by logical pin number.
-// The names must match user input that has been concerted to lowercase and had _ and - characters stripped out.
-// Aliases are separate by the , character.
-// If a pin name is prefixed by ! then this means the pin is hardware inverted. The same pin may have names for both the inverted and non-inverted cases,
-// for example the inverted heater pins on the expansion connector are available as non-inverted servo pins on a DueX.
-constexpr PinEntry PinTable[] =
-{
- // Heater outputs
- { PortCPin(0), PinCapability::wpwm, "!bedheat" },
- { PortCPin(1), PinCapability::wpwm, "!e0heat" },
- { PortAPin(16), PinCapability::wpwm, "!e1heat" },
-
- // Fan outputs
- { PortCPin(23), PinCapability::wpwm, "fan0" },
- { PortCPin(22), PinCapability::wpwm, "fan1" },
- { PortCPin(29), PinCapability::wpwm, "fan2" },
-
- // Endstop inputs
- { PortAPin(24), PinCapability::read, "xstop" },
- { PortBPin(6), PinCapability::read, "ystop" },
- { PortCPin(10), PinCapability::read, "zstop" },
- { PortAPin(25), PinCapability::read, "e0stop" },
- { PortCPin(7), PinCapability::read, "e1stop" },
-
- // Thermistor inputs
- { PortAPin(20), PinCapability::ainr, "bedtemp" },
- { PortBPin(0), PinCapability::ainr, "e0temp" },
- { PortCPin(30), PinCapability::ainr, "e1temp" },
- { PortBPin(1), PinCapability::ainr, "ctemp" },
-
- // SPI CS signals on the daughter board connector
- { PortBPin(14), PinCapability::rw, "spi.cs1" },
- { PortCPin(19), PinCapability::rw, "spi.cs2" },
-
- // Misc
- { Z_PROBE_PIN, PinCapability::ainr, "zprobe.in" },
- { Z_PROBE_MOD_PIN, PinCapability::write, "zprobe.mod,servo" },
- { ATX_POWER_PIN, PinCapability::write, "pson" },
- { PortBPin(2), PinCapability::rw, "urxd" },
- { PortBPin(3), PinCapability::rw, "utxd" },
- { PortAPin(21), PinCapability::ainrw, "exp.pa21" }, // also used by ST7567 LCD controllers
- { PortAPin(22), PinCapability::ainrw, "exp.pa22" },
- { PortAPin(3), PinCapability::rw, "exp.pa3,twd0" },
- { PortAPin(4), PinCapability::rw, "exp.pa4,twck0" },
-};
-
-#if 0
constexpr PinDescription PinTable[] =
{ // TC PWM ADC Capability PinNames
// Port A
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA00
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA01
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA02
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA03
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA04
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA05
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA06
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA07
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA08
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA09
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA10
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA11
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA12
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA13
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA14
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA15
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA16
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA17
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA18
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA19
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA20
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA21
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA22
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA23
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA24
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA25
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA26
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA27
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA28
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA29
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA30
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA31
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::write, "pson" }, // PA00 PS_ON
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA01 ENN to all stepper drivers
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA02 SCK0 (daughter boards, external SD card)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::rw, "exp.pa3,twd0" }, // PA03 TWD0 (expansion)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::rw, "exp.pa4,twck0" }, // PA04 TWCK0 (expansion)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA05 RXD0 (daughter boards, external SD card)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA06 TXD0 (daughter boards, external SD card)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA07 LCD ENC_SW
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA08 Y dir
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA09 Stepper drivers UART
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA10 Stepper drivers UART
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA11 NPCS0 (W5500)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA12 MISO (W5500)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA13 MOSI (W5500)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA14 SPCK (W5500)
+ { TcOutput::tioa1, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA15 LCD beep
+ { TcOutput::none, PwmOutput::pwm0l2_c,AdcInput::none, PinCapability::wpwm, "!e1heat" }, // PA16 Heater 2
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_0, PinCapability::none, nullptr }, // PA17 VREF_MON
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_1, PinCapability::none, nullptr }, // PA18 E2 dir
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_2, PinCapability::none, nullptr }, // PA19 VSSA_MON
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_3, PinCapability::ainr, "bedtemp" }, // PA20 Thermistor 0
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_8, PinCapability::ainrw, "exp.pa21" }, // PA21 Analogue, digital or UART expansion
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_9, PinCapability::ainrw, "exp.pa22" }, // PA22 Analogue, digital or UART expansion
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA23 W5500 interrupt
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::read, "xstop" }, // PA24 X stop
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::read, "e0stop" }, // PA25 E0 stop
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA26 HSMCI MCDA2
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA27 HSMCI MCDA3
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA28 HSMCI MCCDA
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA29 HSMCI MCCK
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA30 HSMCI MCDA0
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PA31 HSMCI MCDA1
// Port B
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB00
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB01
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB02
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB03
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB04
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB05
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB06
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB07
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_4, PinCapability::ainr, "e0temp" }, // PB00 Thermistor 1
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_5, PinCapability::ainr, "ctemp" }, // PB01 Thermistor 3
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::rw, "urxd" }, // PB02 URXD0 PanelDue Dout
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::rw, "utxd" }, // PB03 UTXD0 PanelDue Din
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB04 Z dir
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB05 LCD ENC_A
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::read, "ystop" }, // PB06 Y stop
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB07 E0 dir
{ TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB08
{ TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB09
{ TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB10
{ TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB11
{ TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB12
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB13
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB14
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB15
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB16
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB17
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB18
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB19
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB20
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB21
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB22
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB23
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB24
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB25
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB26
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB27
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB28
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB29
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB30
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB31
+ { TcOutput::none, PwmOutput::none, AdcInput::dac0, PinCapability::none, nullptr }, // PB13 SPI0_CS0 (external SD card)
+ { TcOutput::none, PwmOutput::none, AdcInput::dac1, PinCapability::rw, "spi.cs1" }, // PB14 SPI0_CS1 (daughter boards)
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB15 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB16 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB17 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB18 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB19 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB20 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB21 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB22 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB23 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB24 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB25 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB26 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB27 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB28 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB29 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB30 not on chip
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PB31 not on chip
// Port C
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC00
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC01
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC02
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC03
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC04
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC05
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC06
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC07
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC08
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC09
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC10
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC11
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC12
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC13
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC14
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC15
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC16
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC17
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC18
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC19
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC20
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC21
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC22
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC23
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC24
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC25
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC26
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC27
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC28
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC29
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC30
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC31
-
- // PORT D
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD00
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD01
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD02
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD03
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD04
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD05
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD06
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD07
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD08
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD09
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD10
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD11
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD12
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD13
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD14
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD15
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD16
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD17
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD18
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD19
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD20
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD21
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD22
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD23
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD24
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD25
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD26
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD27
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD28
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD29
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD30
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PD31
-
- // Port E
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PE00
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PE01
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PE02
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PE03
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PE04
- { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PE05
+ { TcOutput::none, PwmOutput::pwm0l0_b,AdcInput::none, PinCapability::wpwm, "!bedheat" }, // PC00 Heater 0
+ { TcOutput::none, PwmOutput::pwm0l1_b,AdcInput::none, PinCapability::wpwm, "!e0heat" }, // PC01 Heater 1
+ { TcOutput::none, PwmOutput::pwm0l2_b,AdcInput::none, PinCapability::none, nullptr }, // PC02 Y step
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC03 ENC_B
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC04 E0 step
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC05 E1 step
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC06 E1 dir
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::read, "e1stop" }, // PC07 E1 stop
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC08 SD card detect
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC09 LCD CS
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::read, "zstop" }, // PC10 Z stop
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC11 USB Vbus monitor
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_12, PinCapability::none, nullptr }, // PC12 VIN voltage monitor
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC13 W5500 reset
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC14 MUX0
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_11, PinCapability::ainr, "zprobe.in" }, // PC15 Z probe input
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC16 MUX1
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC17 MUX2
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC18 X dir
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::rw, "spi.cs2" }, // PC19 SPI0_CS2
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC20 X step
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC21 E3 step
+ { TcOutput::none, PwmOutput::pwm0l3_b,AdcInput::none, PinCapability::wpwm, "fan1" }, // PC22 Fan 1
+ { TcOutput::tioa3, PwmOutput::none, AdcInput::none, PinCapability::wpwm, "fan0" }, // PC23 Fan 0
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC24 E3 dir
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC25 E3 en
+ { TcOutput::tioa4, PwmOutput::none, AdcInput::none, PinCapability::write, "zprobe.mod,servo" }, // PC26 Z probe mod/servo/diag LED
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC27 E2 en
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC28 Z step
+ { TcOutput::tioa5, PwmOutput::none, AdcInput::none, PinCapability::wpwm, "fan2" }, // PC29 Fan 2
+ { TcOutput::none, PwmOutput::none, AdcInput::adc0_14, PinCapability::ainr, "e1temp" }, // PC30 Thermistor 2
+ { TcOutput::none, PwmOutput::none, AdcInput::none, PinCapability::none, nullptr }, // PC31 E2 step
};
-#endif
constexpr unsigned int NumNamedPins = ARRAY_SIZE(PinTable);
+static_assert(NumNamedPins == 3*32);
// Function to look up a pin name and pass back the corresponding index into the pin table
bool LookupPinName(const char *pn, LogicalPin& lpin, bool& hardwareInverted) noexcept;
+
+// Wire Interfaces
+#define WIRE_INTERFACES_COUNT (1) // SAM4S supports two I2C interfaces but we only have the first one available
+
+#define WIRE_INTERFACE TWI0
+#define WIRE_INTERFACE_ID ID_TWI0
+#define WIRE_ISR_HANDLER TWI0_Handler
+#define WIRE_ISR_ID TWI0_IRQn
+
+constexpr Pin TWI_Data = PortAPin(3);
+constexpr Pin TWI_CK = PortAPin(4);
+constexpr GpioPinFunction TWIPeriphMode = GpioPinFunction::A;
+
+// SD Card
+constexpr Pin HsmciClockPin = PortAPin(29);
+constexpr Pin HsmciOtherPins[] = { PortAPin(28), PortAPin(30), PortAPin(31), PortAPin(26), PortAPin(27) };
+constexpr auto HsmciPinsFunction = GpioPinFunction::C;
+
+// Main SPI interface
+constexpr Pin APIN_SPI_MOSI = PortAPin(13);
+constexpr Pin APIN_SPI_MISO = PortAPin(12);
+constexpr Pin APIN_SPI_SCK = PortAPin(14);
+constexpr Pin APIN_SPI_SS0 = PortAPin(11);
+constexpr GpioPinFunction SPIPeriphMode = GpioPinFunction::A;
+
+// USARTs used for SPI
+constexpr Pin APIN_USART_SSPI_MOSI = PortAPin(6);
+constexpr GpioPinFunction USARTSPIMosiPeriphMode = GpioPinFunction::A;
+constexpr Pin APIN_USART_SSPI_MISO = PortAPin(5);
+constexpr GpioPinFunction USARTSPIMisoPeriphMode = GpioPinFunction::A;
+constexpr Pin APIN_USART_SSPI_SCK = PortAPin(2);
+constexpr GpioPinFunction USARTSPISckPeriphMode = GpioPinFunction::B;
+
// Duet pin numbers to control the W5500 interface
#define W5500_SPI SPI
#define W5500_SPI_INTERFACE_ID ID_SPI
@@ -469,7 +391,7 @@ namespace StepPins
static inline uint32_t CalcDriverBitmap(size_t driver) noexcept
{
return (driver < NumDirectDrivers)
- ? g_APinDescription[STEP_PINS[driver]].ulPin
+ ? 1u << (STEP_PINS[driver] & 0x1Fu)
: 0;
}