mirror of
https://github.com/grblHAL/core.git
synced 2026-08-17 16:41:45 +08:00
Moved inbuilt G65 macros to the core and added macro G65P5Q<n> for selecting probe. Added probe id to real time report: |P:<n> will be reported on probe select when more than one probe is available. Fix for WCO and Ov real time status report elements not beeing reported as they should in some circumstances.
815 lines
31 KiB
C
815 lines
31 KiB
C
/*
|
|
crossbar.h - signal crossbar definitions
|
|
|
|
Part of grblHAL
|
|
|
|
Copyright (c) 2021-2025 Terje Io
|
|
|
|
grblHAL 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.
|
|
|
|
grblHAL 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 grblHAL. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef _CROSSBAR_H_
|
|
#define _CROSSBAR_H_
|
|
|
|
#include "nuts_bolts.h"
|
|
|
|
typedef enum {
|
|
// NOTE: the sequence of the following enums MUST match the control_signals_t layout
|
|
Input_Reset = 0,
|
|
Input_FeedHold,
|
|
Input_CycleStart,
|
|
Input_SafetyDoor,
|
|
Input_BlockDelete,
|
|
Input_StopDisable,
|
|
Input_EStop,
|
|
Input_ProbeDisconnect,
|
|
Input_MotorFault,
|
|
Input_MotorWarning,
|
|
Input_LimitsOverride,
|
|
Input_SingleBlock,
|
|
Input_Unassigned,
|
|
Input_ProbeOvertravel,
|
|
Input_Probe,
|
|
// end control_signals_t sequence
|
|
Input_MotorFaultX,
|
|
Input_MotorFaultY,
|
|
Input_MotorFaultZ,
|
|
Input_MotorFaultA,
|
|
Input_MotorFaultB,
|
|
Input_MotorFaultC,
|
|
Input_MotorFaultU,
|
|
Input_MotorFaultV,
|
|
Input_MotorFaultX_2,
|
|
Input_MotorFaultY_2,
|
|
Input_MotorFaultZ_2,
|
|
Input_Probe2,
|
|
Input_Probe2Overtravel,
|
|
Input_Toolsetter,
|
|
Input_ToolsetterOvertravel,
|
|
Input_MPGSelect,
|
|
Input_ModeSelect = Input_MPGSelect, // Deprecated
|
|
Input_LimitX,
|
|
Input_LimitX2,
|
|
Input_LimitX_2 = Input_LimitX2, // Deprecated
|
|
Input_LimitX_Max,
|
|
Input_HomeX,
|
|
Input_HomeX_2,
|
|
Input_LimitY,
|
|
Input_LimitY2,
|
|
Input_LimitY_2 = Input_LimitY2, // Deprecated
|
|
Input_LimitY_Max,
|
|
Input_HomeY,
|
|
Input_HomeY_2,
|
|
Input_LimitZ,
|
|
Input_LimitZ2,
|
|
Input_LimitZ_2 = Input_LimitZ2, // Deprecated
|
|
Input_LimitZ_Max,
|
|
Input_HomeZ,
|
|
Input_HomeZ_2,
|
|
Input_LimitA,
|
|
Input_LimitA_Max,
|
|
Input_HomeA,
|
|
Input_LimitB,
|
|
Input_LimitB_Max,
|
|
Input_HomeB,
|
|
Input_LimitC,
|
|
Input_LimitC_Max,
|
|
Input_HomeC,
|
|
Input_LimitU,
|
|
Input_LimitU_Max,
|
|
Input_HomeU,
|
|
Input_LimitV,
|
|
Input_LimitV_Max,
|
|
Input_HomeV,
|
|
Input_SpindleIndex,
|
|
Input_SpindlePulse,
|
|
Input_Aux0,
|
|
Input_Aux1,
|
|
Input_Aux2,
|
|
Input_Aux3,
|
|
Input_Aux4,
|
|
Input_Aux5,
|
|
Input_Aux6,
|
|
Input_Aux7,
|
|
Input_Aux8,
|
|
Input_Aux9,
|
|
Input_Aux10,
|
|
Input_Aux11,
|
|
Input_Aux12,
|
|
Input_Aux13,
|
|
Input_Aux14,
|
|
Input_Aux15,
|
|
Input_Aux16,
|
|
Input_Aux17,
|
|
Input_Aux18,
|
|
Input_Aux19,
|
|
Input_Aux20,
|
|
Input_Aux21,
|
|
Input_Aux22,
|
|
Input_Aux23,
|
|
Input_AuxMax = Input_Aux23,
|
|
Input_Analog_Aux0,
|
|
Input_Analog_Aux1,
|
|
Input_Analog_Aux2,
|
|
Input_Analog_Aux3,
|
|
Input_Analog_Aux4,
|
|
Input_Analog_Aux5,
|
|
Input_Analog_Aux6,
|
|
Input_Analog_Aux7,
|
|
Input_Analog_AuxMax = Input_Analog_Aux7,
|
|
// Output pins
|
|
Output_StepX,
|
|
Outputs = Output_StepX,
|
|
Output_StepX2,
|
|
Output_StepX_2 = Output_StepX2, // deprecated
|
|
Output_StepY,
|
|
Output_StepY2,
|
|
Output_StepY_2 = Output_StepY2, // deprecated
|
|
Output_StepZ,
|
|
Output_StepZ2,
|
|
Output_StepZ_2 = Output_StepZ2, // deprecated
|
|
Output_StepA,
|
|
Output_StepB,
|
|
Output_StepC,
|
|
Output_StepU,
|
|
Output_StepV,
|
|
Output_DirX,
|
|
Output_DirX2,
|
|
Output_DirX_2 = Output_DirX2, // deprecated
|
|
Output_DirY,
|
|
Output_DirY2,
|
|
Output_DirY_2 = Output_DirY2, // deprecated
|
|
Output_DirZ,
|
|
Output_DirZ2,
|
|
Output_DirZ_2 = Output_DirZ2, // deprecated
|
|
Output_DirA,
|
|
Output_DirB,
|
|
Output_DirC,
|
|
Output_DirU,
|
|
Output_DirV,
|
|
Output_MotorChipSelect,
|
|
Output_MotorChipSelectX,
|
|
Output_MotorChipSelectY,
|
|
Output_MotorChipSelectZ,
|
|
Output_MotorChipSelectM3,
|
|
Output_MotorChipSelectM4,
|
|
Output_MotorChipSelectM5,
|
|
Output_MotorChipSelectM6,
|
|
Output_MotorChipSelectM7,
|
|
Output_StepperPower,
|
|
Output_StepperEnable,
|
|
Output_StepperEnableSTEPPERS = Output_StepperEnable,
|
|
Output_StepperEnableX,
|
|
Output_StepperEnableX2 = Output_StepperEnableX,
|
|
Output_StepperEnableY,
|
|
Output_StepperEnableY2 = Output_StepperEnableY,
|
|
Output_StepperEnableZ,
|
|
Output_StepperEnableZ2 = Output_StepperEnableZ,
|
|
Output_StepperEnableA,
|
|
Output_StepperEnableB,
|
|
Output_StepperEnableU,
|
|
Output_StepperEnableV,
|
|
Output_StepperEnableC,
|
|
Output_StepperEnableXY,
|
|
Output_StepperEnableAB,
|
|
Output_SpindleOn,
|
|
Output_SpindleDir,
|
|
Output_SpindlePWM,
|
|
Output_Spindle1On,
|
|
Output_Spindle1Dir,
|
|
Output_Spindle1PWM,
|
|
Output_CoolantMist,
|
|
Output_CoolantFlood,
|
|
Output_Aux0,
|
|
Output_Aux1,
|
|
Output_Aux2,
|
|
Output_Aux3,
|
|
Output_Aux4,
|
|
Output_Aux5,
|
|
Output_Aux6,
|
|
Output_Aux7,
|
|
Output_Aux8,
|
|
Output_Aux9,
|
|
Output_Aux10,
|
|
Output_Aux11,
|
|
Output_Aux12,
|
|
Output_Aux13,
|
|
Output_Aux14,
|
|
Output_Aux15,
|
|
Output_Aux16,
|
|
Output_Aux17,
|
|
Output_Aux18,
|
|
Output_Aux19,
|
|
Output_Aux20,
|
|
Output_Aux21,
|
|
Output_Aux22,
|
|
Output_Aux23,
|
|
Output_AuxMax = Output_Aux23,
|
|
Output_Analog_Aux0,
|
|
Output_Analog_Aux1,
|
|
Output_Analog_Aux2,
|
|
Output_Analog_Aux3,
|
|
Output_Analog_Aux4,
|
|
Output_Analog_Aux5,
|
|
Output_Analog_Aux6,
|
|
Output_Analog_Aux7,
|
|
Output_Analog_AuxMax = Output_Analog_Aux7,
|
|
Output_LED,
|
|
Output_LED_R,
|
|
Output_LED_G,
|
|
Output_LED_B,
|
|
Output_LED_W,
|
|
Output_LED_Adressable,
|
|
Output_LED0_Adressable = Output_LED_Adressable,
|
|
Output_LED1_Adressable,
|
|
Output_CoProc_Reset,
|
|
Output_CoProc_Boot0,
|
|
// Multipin peripherals
|
|
Input_MISO,
|
|
Multipin = Input_MISO,
|
|
Output_MOSI,
|
|
Output_SPICLK,
|
|
Output_SPICS,
|
|
Output_FlashCS,
|
|
Output_SdCardCS,
|
|
Input_SdCardDetect,
|
|
Output_SPIRST,
|
|
Input_SPIIRQ,
|
|
Output_SCK,
|
|
Output_I2CSCK = Output_SCK,
|
|
Bidirectional_SDA,
|
|
Bidirectional_I2CSDA = Bidirectional_SDA,
|
|
Input_KeypadStrobe, // To be deprecated? Use Input_I2CStrobe instead.
|
|
Input_I2CStrobe,
|
|
Input_RX,
|
|
Output_TX,
|
|
Output_RTS,
|
|
Input_QEI_A,
|
|
Input_QEI_B,
|
|
Input_QEI_Select,
|
|
Input_QEI_Index,
|
|
Virtual_Pin,
|
|
// Single pin bidirectional peripherals
|
|
Bidirectional_MotorUARTX,
|
|
Bidirectional = Bidirectional_MotorUARTX,
|
|
Bidirectional_MotorUARTY,
|
|
Bidirectional_MotorUARTZ,
|
|
Bidirectional_MotorUARTM3,
|
|
Bidirectional_MotorUARTM4,
|
|
Bidirectional_MotorUARTM5,
|
|
Bidirectional_MotorUARTM6,
|
|
Bidirectional_MotorUARTM7
|
|
} pin_function_t;
|
|
|
|
#define PIN_ISINPUT(pin) (pin < Outputs)
|
|
#define PIN_ISOUTPUT(pin) (pin >= Outputs && pin < Bidirectional)
|
|
#define PIN_ISBIDIRECTIONAL(pin) (pin >= Bidirectional)
|
|
|
|
typedef struct {
|
|
pin_function_t function;
|
|
const char *name;
|
|
} pin_name_t;
|
|
|
|
PROGMEM static const pin_name_t pin_names[] = {
|
|
{ .function = Input_Reset, .name = "Reset" },
|
|
{ .function = Input_FeedHold, .name = "Feed hold" },
|
|
{ .function = Input_CycleStart, .name = "Cycle start" },
|
|
{ .function = Input_SafetyDoor, .name = "Safety door" },
|
|
{ .function = Input_BlockDelete, .name = "Block delete" },
|
|
{ .function = Input_StopDisable, .name = "Stop disable" },
|
|
{ .function = Input_EStop, .name = "Emergency stop" },
|
|
{ .function = Input_ProbeDisconnect, .name = "Probe disconnect" },
|
|
{ .function = Input_MotorFault, .name = "Motor fault" },
|
|
{ .function = Input_MotorWarning, .name = "Motor warning" },
|
|
{ .function = Input_LimitsOverride, .name = "Limits override" },
|
|
{ .function = Input_SingleBlock, .name = "Single block" },
|
|
{ .function = Input_ProbeOvertravel, .name = "Probe overtravel" },
|
|
{ .function = Input_Probe, .name = "Probe" },
|
|
{ .function = Input_MotorFaultX, .name = "X motor fault" },
|
|
{ .function = Input_MotorFaultY, .name = "Y motor fault" },
|
|
{ .function = Input_MotorFaultZ, .name = "Z motor fault" },
|
|
{ .function = Input_MotorFaultX_2, .name = "X motor fault 2" },
|
|
{ .function = Input_MotorFaultY_2, .name = "Y motor fault 2" },
|
|
{ .function = Input_MotorFaultZ_2, .name = "Z motor fault 2" },
|
|
{ .function = Input_Probe2, .name = "Probe 2" },
|
|
{ .function = Input_Probe2Overtravel, .name = "Probe 2 overtravel" },
|
|
{ .function = Input_Toolsetter, .name = "Toolsetter" },
|
|
{ .function = Input_ToolsetterOvertravel, .name = "Toolsetter overtravel" },
|
|
{ .function = Input_MPGSelect, .name = "MPG mode select" },
|
|
{ .function = Input_LimitX, .name = "X limit min" },
|
|
{ .function = Input_LimitX_2, .name = "X limit min 2" },
|
|
{ .function = Input_LimitX_Max, .name = "X limit max" },
|
|
{ .function = Input_HomeX, .name = "X home" },
|
|
{ .function = Input_HomeX_2, .name = "X home 2" },
|
|
{ .function = Input_LimitY, .name = "Y limit min" },
|
|
{ .function = Input_LimitY_2, .name = "Y limit min 2" },
|
|
{ .function = Input_LimitY_Max, .name = "Y limit max" },
|
|
{ .function = Input_HomeY, .name = "Y home" },
|
|
{ .function = Input_HomeY_2, .name = "Y home 2" },
|
|
{ .function = Input_LimitZ, .name = "Z limit min" },
|
|
{ .function = Input_LimitZ_2, .name = "Z limit min 2" },
|
|
{ .function = Input_LimitZ_Max, .name = "Z limit max" },
|
|
{ .function = Input_HomeZ, .name = "Z home" },
|
|
{ .function = Input_HomeZ_2, .name = "Z home 2" },
|
|
#ifndef NO_SETTINGS_DESCRIPTIONS
|
|
{ .function = Input_SpindleIndex, .name = "Spindle index" },
|
|
{ .function = Input_SpindlePulse, .name = "Spindle pulse" },
|
|
{ .function = Input_Aux0, .name = "Aux in 0" },
|
|
{ .function = Input_Aux1, .name = "Aux in 1" },
|
|
{ .function = Input_Aux2, .name = "Aux in 2" },
|
|
{ .function = Input_Aux3, .name = "Aux in 3" },
|
|
{ .function = Input_Aux4, .name = "Aux in 4" },
|
|
{ .function = Input_Aux5, .name = "Aux in 5" },
|
|
{ .function = Input_Aux6, .name = "Aux in 6" },
|
|
{ .function = Input_Aux7, .name = "Aux in 7" },
|
|
{ .function = Input_Aux8, .name = "Aux in 8" },
|
|
{ .function = Input_Aux9, .name = "Aux in 9" },
|
|
{ .function = Input_Aux10, .name = "Aux in 10" },
|
|
{ .function = Input_Aux11, .name = "Aux in 11" },
|
|
{ .function = Input_Aux12, .name = "Aux in 12" },
|
|
{ .function = Input_Aux13, .name = "Aux in 13" },
|
|
{ .function = Input_Aux14, .name = "Aux in 14" },
|
|
{ .function = Input_Aux15, .name = "Aux in 15" },
|
|
{ .function = Input_Aux16, .name = "Aux in 16" },
|
|
{ .function = Input_Aux17, .name = "Aux in 17" },
|
|
{ .function = Input_Aux18, .name = "Aux in 18" },
|
|
{ .function = Input_Aux19, .name = "Aux in 19" },
|
|
{ .function = Input_Aux20, .name = "Aux in 20" },
|
|
{ .function = Input_Aux21, .name = "Aux in 21" },
|
|
{ .function = Input_Aux22, .name = "Aux in 22" },
|
|
{ .function = Input_Aux23, .name = "Aux in 23" },
|
|
{ .function = Input_Analog_Aux0, .name = "Aux analog in 0" },
|
|
{ .function = Input_Analog_Aux1, .name = "Aux analog in 1" },
|
|
{ .function = Input_Analog_Aux2, .name = "Aux analog in 2" },
|
|
{ .function = Input_Analog_Aux3, .name = "Aux analog in 3" },
|
|
{ .function = Input_Analog_Aux4, .name = "Aux analog in 4" },
|
|
{ .function = Input_Analog_Aux5, .name = "Aux analog in 5" },
|
|
{ .function = Input_Analog_Aux6, .name = "Aux analog in 6" },
|
|
{ .function = Input_Analog_Aux7, .name = "Aux analog in 7" },
|
|
#endif
|
|
{ .function = Output_StepX, .name = "X step" },
|
|
{ .function = Output_StepX2, .name = "X2 step" },
|
|
{ .function = Output_StepY, .name = "Y step" },
|
|
{ .function = Output_StepY2, .name = "Y2 step" },
|
|
{ .function = Output_StepZ, .name = "Z step" },
|
|
{ .function = Output_StepZ2, .name = "Z2 step" },
|
|
{ .function = Output_DirX, .name = "X dir" },
|
|
{ .function = Output_DirX2, .name = "X2 dir" },
|
|
{ .function = Output_DirY, .name = "Y dir" },
|
|
{ .function = Output_DirY2, .name = "Y2 dir" },
|
|
{ .function = Output_DirZ, .name = "Z dir" },
|
|
{ .function = Output_DirZ2, .name = "Z2 dir" },
|
|
{ .function = Output_StepperPower, .name = "Stepper power" },
|
|
{ .function = Output_StepperEnable, .name = "Steppers enable" },
|
|
{ .function = Output_StepperEnableX, .name = "X enable" },
|
|
{ .function = Output_StepperEnableY, .name = "Y enable" },
|
|
{ .function = Output_StepperEnableZ, .name = "Z enable" },
|
|
{ .function = Output_StepperEnableXY, .name = "XY enable" },
|
|
#ifdef A_AXIS
|
|
{ .function = Output_StepA, .name = "A step" },
|
|
{ .function = Output_DirA, .name = "A dir" },
|
|
{ .function = Output_StepperEnableA, .name = "A enable" },
|
|
{ .function = Input_LimitA, .name = "A limit min" },
|
|
{ .function = Input_LimitA_Max, .name = "A limit max" },
|
|
{ .function = Input_HomeA, .name = "A home" },
|
|
{ .function = Input_MotorFaultA, .name = "A motor fault" },
|
|
#endif
|
|
#ifdef B_AXIS
|
|
{ .function = Output_StepB, .name = "B step" },
|
|
{ .function = Output_DirB, .name = "B dir" },
|
|
{ .function = Output_StepperEnableB, .name = "B enable" },
|
|
{ .function = Output_StepperEnableAB, .name = "AB enable" },
|
|
{ .function = Input_LimitB, .name = "B limit min" },
|
|
{ .function = Input_LimitB_Max, .name = "B limit max" },
|
|
{ .function = Input_HomeB, .name = "B home" },
|
|
{ .function = Input_MotorFaultB, .name = "B motor fault" },
|
|
#endif
|
|
#ifdef C_AXIS
|
|
{ .function = Output_StepC, .name = "C step" },
|
|
{ .function = Output_DirC, .name = "C dir" },
|
|
{ .function = Output_StepperEnableC, .name = "C enable" },
|
|
{ .function = Input_LimitC, .name = "C limit min" },
|
|
{ .function = Input_LimitC_Max, .name = "C limit max" },
|
|
{ .function = Input_HomeC, .name = "C home" },
|
|
{ .function = Input_MotorFaultC, .name = "C motor fault" },
|
|
#endif
|
|
#ifdef U_AXIS
|
|
{ .function = Output_StepU, .name = "U step" },
|
|
{ .function = Output_DirU, .name = "U dir" },
|
|
{ .function = Output_StepperEnableU, .name = "U enable" },
|
|
{ .function = Input_LimitU, .name = "U limit min" },
|
|
{ .function = Input_LimitU_Max, .name = "U limit max" },
|
|
{ .function = Input_HomeU, .name = "U home" },
|
|
{ .function = Input_MotorFaultU, .name = "U motor fault" },
|
|
#endif
|
|
#ifdef V_AXIS
|
|
{ .function = Output_StepV, .name = "V step" },
|
|
{ .function = Output_DirV, .name = "V dir" },
|
|
{ .function = Output_StepperEnableV, .name = "V enable" },
|
|
{ .function = Input_LimitV, .name = "V limit min" },
|
|
{ .function = Input_LimitV_Max, .name = "V limit max" },
|
|
{ .function = Input_HomeV, .name = "V home" },
|
|
{ .function = Input_MotorFaultV, .name = "V motor fault" },
|
|
#endif
|
|
#ifndef NO_SETTINGS_DESCRIPTIONS
|
|
{ .function = Output_MotorChipSelect, .name = "Motor CS" },
|
|
{ .function = Output_MotorChipSelectX, .name = "Motor CSX" },
|
|
{ .function = Output_MotorChipSelectY, .name = "Motor CSY" },
|
|
{ .function = Output_MotorChipSelectZ, .name = "Motor CSZ" },
|
|
{ .function = Output_MotorChipSelectM3, .name = "Motor CSM3" },
|
|
{ .function = Output_MotorChipSelectM4, .name = "Motor CSM4" },
|
|
{ .function = Output_MotorChipSelectM5, .name = "Motor CSM5" },
|
|
{ .function = Output_MotorChipSelectM6, .name = "Motor CSM6" },
|
|
{ .function = Output_MotorChipSelectM7, .name = "Motor CSM7" },
|
|
{ .function = Output_SpindleOn, .name = "Spindle on" },
|
|
{ .function = Output_SpindleDir, .name = "Spindle direction" },
|
|
{ .function = Output_SpindlePWM, .name = "Spindle PWM" },
|
|
{ .function = Output_Spindle1On, .name = "Spindle 2 on" },
|
|
{ .function = Output_Spindle1Dir, .name = "Spindle 2 direction" },
|
|
{ .function = Output_Spindle1PWM, .name = "Spindle 2 PWM" },
|
|
{ .function = Output_CoolantMist, .name = "Mist" },
|
|
{ .function = Output_CoolantFlood, .name = "Flood" },
|
|
{ .function = Output_Aux0, .name = "Aux out 0" },
|
|
{ .function = Output_Aux1, .name = "Aux out 1" },
|
|
{ .function = Output_Aux2, .name = "Aux out 2" },
|
|
{ .function = Output_Aux3, .name = "Aux out 3" },
|
|
{ .function = Output_Aux4, .name = "Aux out 4" },
|
|
{ .function = Output_Aux5, .name = "Aux out 5" },
|
|
{ .function = Output_Aux6, .name = "Aux out 6" },
|
|
{ .function = Output_Aux7, .name = "Aux out 7" },
|
|
{ .function = Output_Aux8, .name = "Aux out 8" },
|
|
{ .function = Output_Aux9, .name = "Aux out 9" },
|
|
{ .function = Output_Aux10, .name = "Aux out 10" },
|
|
{ .function = Output_Aux11, .name = "Aux out 11" },
|
|
{ .function = Output_Aux12, .name = "Aux out 12" },
|
|
{ .function = Output_Aux13, .name = "Aux out 13" },
|
|
{ .function = Output_Aux14, .name = "Aux out 14" },
|
|
{ .function = Output_Aux15, .name = "Aux out 15" },
|
|
{ .function = Output_Aux15, .name = "Aux out 16" },
|
|
{ .function = Output_Aux16, .name = "Aux out 17" },
|
|
{ .function = Output_Aux17, .name = "Aux out 18" },
|
|
{ .function = Output_Aux18, .name = "Aux out 19" },
|
|
{ .function = Output_Aux19, .name = "Aux out 20" },
|
|
{ .function = Output_Aux20, .name = "Aux out 21" },
|
|
{ .function = Output_Aux21, .name = "Aux out 22" },
|
|
{ .function = Output_Aux22, .name = "Aux out 23" },
|
|
{ .function = Output_Analog_Aux0, .name = "Aux analog out 0" },
|
|
{ .function = Output_Analog_Aux1, .name = "Aux analog out 1" },
|
|
{ .function = Output_Analog_Aux2, .name = "Aux analog out 2" },
|
|
{ .function = Output_Analog_Aux3, .name = "Aux analog out 3" },
|
|
{ .function = Output_Analog_Aux4, .name = "Aux analog out 4" },
|
|
{ .function = Output_Analog_Aux5, .name = "Aux analog out 5" },
|
|
{ .function = Output_Analog_Aux6, .name = "Aux analog out 6" },
|
|
{ .function = Output_Analog_Aux7, .name = "Aux analog out 7" },
|
|
{ .function = Output_LED, .name = "LED" },
|
|
{ .function = Output_LED_R, .name = "LED R" },
|
|
{ .function = Output_LED_G, .name = "LED G" },
|
|
{ .function = Output_LED_B, .name = "LED B" },
|
|
{ .function = Output_LED_W, .name = "LED W" },
|
|
{ .function = Output_LED_Adressable, .name = "LED adressable" },
|
|
{ .function = Output_LED1_Adressable, .name = "LED adressable 1" },
|
|
{ .function = Output_CoProc_Reset, .name = "CoProc Reset" },
|
|
{ .function = Output_CoProc_Boot0, .name = "CoProc Boot0" },
|
|
{ .function = Input_MISO, .name = "MISO" },
|
|
{ .function = Output_MOSI, .name = "MOSI" },
|
|
{ .function = Output_SPICLK, .name = "SPI CLK" },
|
|
{ .function = Output_SPICS, .name = "SPI CS" },
|
|
{ .function = Output_FlashCS, .name = "Flash CS" },
|
|
{ .function = Output_SdCardCS, .name = "SD card CS" },
|
|
{ .function = Input_SdCardDetect, .name = "SD card detect" },
|
|
{ .function = Output_SPIRST, .name = "SPI reset" },
|
|
{ .function = Input_SPIIRQ, .name = "SPI IRQ" },
|
|
{ .function = Output_I2CSCK, .name = "I2C SCK" },
|
|
{ .function = Bidirectional_SDA, .name = "I2C SDA" },
|
|
{ .function = Input_KeypadStrobe, .name = "Keypad strobe" },
|
|
{ .function = Input_I2CStrobe, .name = "I2C strobe" },
|
|
{ .function = Input_RX, .name = "RX" },
|
|
{ .function = Output_TX, .name = "TX" },
|
|
{ .function = Output_RTS, .name = "RTS" },
|
|
{ .function = Input_QEI_A, .name = "QEI A" },
|
|
{ .function = Input_QEI_B, .name = "QEI B" },
|
|
{ .function = Input_QEI_Select, .name = "QEI select" },
|
|
{ .function = Input_QEI_Index, .name = "QEI index" },
|
|
{ .function = Virtual_Pin, .name = "Virtual" },
|
|
{ .function = Bidirectional_MotorUARTX, .name = "UART X" },
|
|
{ .function = Bidirectional_MotorUARTY, .name = "UART Y" },
|
|
{ .function = Bidirectional_MotorUARTZ, .name = "UART Z" },
|
|
{ .function = Bidirectional_MotorUARTM3, .name = "UART M3" },
|
|
{ .function = Bidirectional_MotorUARTM4, .name = "UART M4" },
|
|
{ .function = Bidirectional_MotorUARTM5, .name = "UART M5" },
|
|
{ .function = Bidirectional_MotorUARTM6, .name = "UART M6" },
|
|
{ .function = Bidirectional_MotorUARTM7, .name = "UART M7" }
|
|
#endif
|
|
};
|
|
|
|
typedef enum {
|
|
PinGroup_SpindleControl = 0,
|
|
PinGroup_SpindlePWM,
|
|
PinGroup_Coolant,
|
|
PinGroup_SpindlePulse,
|
|
PinGroup_SpindleIndex,
|
|
PinGroup_StepperPower,
|
|
PinGroup_StepperEnable,
|
|
PinGroup_StepperStep,
|
|
PinGroup_StepperDir,
|
|
PinGroup_AuxOutput,
|
|
PinGroup_AuxInputAnalog,
|
|
PinGroup_AuxOutputAnalog,
|
|
PinGroup_MotorChipSelect,
|
|
PinGroup_MotorUART,
|
|
PinGroup_I2C,
|
|
PinGroup_SPI,
|
|
PinGroup_UART1,
|
|
PinGroup_UART = PinGroup_UART1,
|
|
PinGroup_UART2,
|
|
PinGroup_UART3,
|
|
PinGroup_UART4,
|
|
PinGroup_USB,
|
|
PinGroup_CAN,
|
|
PinGroup_LED,
|
|
PinGroup_Home,
|
|
PinGroup_Virtual,
|
|
// Interrupt capable pins that may have debounce processing enabled
|
|
PinGroup_Control = (1<<8),
|
|
PinGroup_Limit = (1<<9),
|
|
PinGroup_LimitMax = (1<<10),
|
|
PinGroup_Probe = (1<<11),
|
|
PinGroup_Keypad = (1<<12),
|
|
PinGroup_MPG = (1<<13),
|
|
PinGroup_QEI = (1<<14),
|
|
PinGroup_QEI_Select = (1<<15),
|
|
PinGroup_QEI_Index = (1<<16),
|
|
PinGroup_Motor_Warning = (1<<17),
|
|
PinGroup_Motor_Fault = (1<<18),
|
|
PinGroup_SdCard = (1<<19),
|
|
PinGroup_AuxInput = (1<<20)
|
|
} pin_group_t;
|
|
|
|
//! Pin interrupt modes, may be or'ed when reporting pin capability.
|
|
typedef enum {
|
|
IRQ_Mode_None = 0b00000, //!< 0b00000 (0x00)
|
|
IRQ_Mode_Rising = 0b00001, //!< 0b00001 (0x01)
|
|
IRQ_Mode_Falling = 0b00010, //!< 0b00010 (0x02)
|
|
IRQ_Mode_RisingFalling = 0b00011, //!< 0b00011 (0x03) - only used to report port capability.
|
|
IRQ_Mode_Change = 0b00100, //!< 0b00100 (0x04)
|
|
IRQ_Mode_Edges = 0b00111, //!< 0b00111 (0x07) - only used to report port capability.
|
|
IRQ_Mode_High = 0b01000, //!< 0b01000 (0x08)
|
|
IRQ_Mode_Low = 0b10000, //!< 0b10000 (0x10)
|
|
IRQ_Mode_All = 0b11111 //!< 0b11111 (0x1F) - only used to report port capability.
|
|
} pin_irq_mode_t;
|
|
|
|
typedef enum {
|
|
IRQ_I2C_Strobe = 0,
|
|
IRQ_SPI
|
|
} irq_type_t;
|
|
|
|
typedef bool (*irq_callback_ptr)(uint_fast8_t id, bool level);
|
|
|
|
typedef struct driver_irq_handler {
|
|
irq_type_t type;
|
|
irq_callback_ptr callback;
|
|
struct driver_irq_handler *next;
|
|
} driver_irq_handler_t;
|
|
|
|
//! Pin pullup and pulldown modes, may be or'ed when reporting pin capability.
|
|
typedef enum {
|
|
PullMode_None = 0b00, //!< 0b00 (0x00)
|
|
PullMode_Up = 0b01, //!< 0b01 (0x01)
|
|
PullMode_Down = 0b10, //!< 0b10 (0x02)
|
|
PullMode_UpDown = 0b11 //!< 0b11 (0x03) - only used to report port capability.
|
|
} pull_mode_t;
|
|
|
|
//! ADC/DAC resolution or multi pin register width.
|
|
typedef enum {
|
|
Resolution_4bit = 0, //!< 0 - 4 bit
|
|
Resolution_8bit, //!< 1 - 8 bit
|
|
Resolution_10bit, //!< 2 - 10 bit
|
|
Resolution_12bit, //!< 3 - 12 bit
|
|
Resolution_14bit, //!< 4 - 14 bit
|
|
Resolution_16bit, //!< 5 - 16 bit
|
|
Resolution_18bit, //!< 6 - 18 bit
|
|
Resolution_20bit, //!< 7 - 20 bit
|
|
Resolution_24bit, //!< 8 - 24 bit
|
|
Resolution_32bit //!< 9 - 32 bit, NOTE: "wait for input" can only return 31 bits
|
|
} resolution_t;
|
|
|
|
#define PINMODE_NONE (0)
|
|
#define PINMODE_OUTPUT (1U<<1)
|
|
#ifndef __LPC17XX__
|
|
#define PINMODE_OD (1U<<2)
|
|
#endif
|
|
#define PINMODE_PULLUP (PullMode_Up<<3)
|
|
#define PINMODE_PULLDOWN (PullMode_Down<<3)
|
|
#define PINMODE_ANALOG (1U<<11)
|
|
#define PINMODE_PWM (1U<<12)
|
|
#define PINMODE_PWM_SERVO (1U<<13)
|
|
|
|
typedef union {
|
|
uint32_t mask;
|
|
struct {
|
|
uint32_t input :1,
|
|
output :1,
|
|
open_drain :1,
|
|
pull_mode :2, //!< pull_mode_t - pull up/down modes
|
|
irq_mode :5, //!< pin_irq_mode_t - IRQ modes
|
|
invert :1,
|
|
analog :1,
|
|
pwm :1,
|
|
servo_pwm :1,
|
|
claimable :1,
|
|
debounce :1,
|
|
external :1,
|
|
async :1,
|
|
resolution :4, //!< resolution_t - ADC/DAC resolution
|
|
unused :10;
|
|
};
|
|
} pin_cap_t;
|
|
|
|
typedef union {
|
|
uint16_t mask;
|
|
struct {
|
|
uint16_t input :1,
|
|
output :1,
|
|
open_drain :1,
|
|
pull_mode :2,
|
|
irq_mode :5,
|
|
inverted :1,
|
|
analog :1,
|
|
pwm :1,
|
|
servo_pwm :1,
|
|
claimed :1,
|
|
debounce :1;
|
|
};
|
|
} pin_mode_t;
|
|
|
|
#define XBAR_SET_CAP(cap, mode) { cap.mask = mode.mask; cap.claimable = !mode.claimed; }
|
|
#define XBAR_SET_DIN_INFO(pin, pin_id, src, cfg_fn, get_val_fn) { \
|
|
pin.id = pin_id; \
|
|
pin.mode = src.mode; \
|
|
pin.cap = src.cap; \
|
|
pin.cap.invert = On; \
|
|
pin.cap.claimable = !src.mode.claimed; \
|
|
pin.function = src.id; \
|
|
pin.group = src.group; \
|
|
pin.pin = src.pin; \
|
|
pin.port = (void *)src.port; \
|
|
pin.description = src.description; \
|
|
pin.config = cfg_fn; \
|
|
pin.get_value = get_val_fn; \
|
|
}
|
|
#define XBAR_SET_DOUT_INFO(pin, pin_id, src, cfg_fn, get_val_fn) { \
|
|
pin.id = pin_id; \
|
|
pin.mode = src.mode; \
|
|
pin.cap.mask = src.mode.mask; \
|
|
pin.cap.invert = On; \
|
|
pin.cap.claimable = !src.mode.claimed; \
|
|
pin.function = src.id; \
|
|
pin.group = src.group; \
|
|
pin.pin = src.pin; \
|
|
pin.port = (void *)src.port; \
|
|
pin.description = src.description; \
|
|
pin.config = cfg_fn; \
|
|
pin.get_value = get_val_fn; \
|
|
}
|
|
|
|
//! /a cfg_data argument to /a xbar_config_ptr for gpio input pins
|
|
typedef struct {
|
|
bool inverted;
|
|
bool debounce;
|
|
pull_mode_t pull_mode;
|
|
} gpio_in_config_t;
|
|
|
|
//! /a cfg_data argument to /a xbar_config_ptr for gpio output pins
|
|
typedef struct {
|
|
bool inverted;
|
|
bool open_drain;
|
|
bool pwm;
|
|
} gpio_out_config_t;
|
|
|
|
//! /a cfg_data argument to /a xbar_config_ptr for PWM pins
|
|
typedef struct {
|
|
float freq_hz; //
|
|
float min;
|
|
float max;
|
|
float off_value; // percent of period
|
|
float min_value; // percent of period
|
|
float max_value; // percent of period
|
|
bool invert;
|
|
bool servo_mode;
|
|
} pwm_config_t;
|
|
|
|
typedef union
|
|
{
|
|
pwm_config_t *pwm_config;
|
|
gpio_in_config_t *gpio_in_config;
|
|
gpio_out_config_t *gpio_out_config;
|
|
} xbar_cfg_ptr_t __attribute__ ((__transparent_union__));
|
|
|
|
struct xbar;
|
|
|
|
typedef float (*xbar_get_value_ptr)(struct xbar *pin);
|
|
typedef void (*xbar_set_value_ptr)(struct xbar *pin, float value);
|
|
typedef bool (*xbar_set_function_ptr)(struct xbar *pin, pin_function_t function);
|
|
typedef void (*xbar_event_ptr)(bool on);
|
|
typedef bool (*xbar_config_ptr)(struct xbar *pin, xbar_cfg_ptr_t cfg_data, bool persistent);
|
|
|
|
typedef struct {
|
|
pin_function_t function;
|
|
uint8_t aux_port;
|
|
pin_irq_mode_t irq_mode;
|
|
control_signals_t cap;
|
|
uint8_t pin;
|
|
void *port;
|
|
void *input;
|
|
} aux_ctrl_t;
|
|
|
|
typedef struct {
|
|
pin_function_t function;
|
|
uint8_t aux_port;
|
|
uint8_t pin;
|
|
void *port;
|
|
void *output;
|
|
} aux_ctrl_out_t;
|
|
|
|
typedef struct xbar {
|
|
void *ports_id;
|
|
uint8_t id; //!< Pin id.
|
|
pin_function_t function; //!< Pin function.
|
|
pin_group_t group; //!< Pin group.
|
|
void *port; //!< Optional pointer to the underlying peripheral or pin specific data.
|
|
const char *description; //!< Optional pointer to description string.
|
|
uint_fast8_t pin; //!< Pin number.
|
|
pin_cap_t cap; //!< Pin capabilities.
|
|
pin_mode_t mode; //!< Current pin configuration.
|
|
xbar_config_ptr config; //!< Optional pointer to function for configuring the port.
|
|
xbar_get_value_ptr get_value; //!< Optional pointer to function to get current port value.
|
|
xbar_set_value_ptr set_value; //!< Optional pointer to function to set port value.
|
|
xbar_set_function_ptr set_function; //!< Optional pointer to function to set port function.
|
|
// xbar_event_ptr on_event; //!< Not used - might be removed.
|
|
} xbar_t;
|
|
|
|
typedef struct {
|
|
pin_function_t function;
|
|
pin_group_t group;
|
|
void *port;
|
|
uint_fast8_t pin;
|
|
pin_mode_t mode;
|
|
const char *description;
|
|
} periph_pin_t;
|
|
|
|
typedef struct periph_signal {
|
|
periph_pin_t pin;
|
|
struct periph_signal *next;
|
|
} periph_signal_t;
|
|
|
|
typedef union {
|
|
uint8_t mask;
|
|
struct {
|
|
uint8_t limits :1,
|
|
aux_inputs :1,
|
|
safety_door :1,
|
|
qei_select :1,
|
|
unassigned :4;
|
|
};
|
|
} pin_debounce_t;
|
|
|
|
static inline uint8_t xbar_fault_pin_to_axis (pin_function_t fn)
|
|
{
|
|
return fn >= Input_MotorFaultX && fn <= Input_MotorFaultV ? fn - Input_MotorFaultX : (fn >= Input_MotorFaultX_2 && fn <= Input_MotorFaultZ_2 ? fn - Input_MotorFaultX_2 : 0);
|
|
}
|
|
|
|
static inline stepper_state_t xbar_stepper_state_set (stepper_state_t *state, uint8_t axis, bool b)
|
|
{
|
|
if(b)
|
|
state->details.b.bits |= bit(axis);
|
|
else
|
|
state->details.a.bits |= bit(axis);
|
|
|
|
return *state;
|
|
}
|
|
|
|
static inline bool xbar_stepper_state_get (stepper_state_t state, uint8_t axis, bool b)
|
|
{
|
|
return bit_istrue(b ? state.details.b.bits : state.details.a.bits, bit(axis));
|
|
}
|
|
|
|
void xbar_set_homing_source (void);
|
|
limit_signals_t xbar_get_homing_source (void);
|
|
limit_signals_t xbar_get_homing_source_from_cycle (axes_signals_t homing_cycle);
|
|
axes_signals_t xbar_fn_to_axismask (pin_function_t id);
|
|
const char *xbar_fn_to_pinname (pin_function_t id);
|
|
control_signals_t xbar_fn_to_signals_mask (pin_function_t id);
|
|
|
|
#endif
|