Files
beyon-motion/Clean_TMC2209/lib/tmc/hal/IOs.h
2026-03-31 13:10:37 +02:00

165 lines
4.9 KiB
C

/*******************************************************************************
* Copyright © 2019 TRINAMIC Motion Control GmbH & Co. KG
* (now owned by Analog Devices Inc.),
*
* Copyright © 2023 Analog Devices Inc. All Rights Reserved. This software is
* proprietary & confidential to Analog Devices, Inc. and its licensors.
*******************************************************************************/
#ifndef _IO_H_
#define _IO_H_
// #include "derivative.h"
typedef enum { // Give bits explicitly, because IDE relies on it.
IOS_LOW = 0b00,
IOS_HIGH = 0b01,
IOS_OPEN = 0b10,
IOS_NOCHANGE = 0b11
} IO_States;
#if defined(Landungsbruecke) || defined(LandungsbrueckeSmall)
// use ST like configuration structures also for Landungsbruecke
typedef enum
{
GPIO_Mode_AN = 0x00, /*!< GPIO Analog Mode, Pin disabled */
GPIO_Mode_AF1 = 0x01, /*!< GPIO Alternate function Mode GPIO*/
GPIO_Mode_AF2 = 0x02, /*!< GPIO Alternate function Mode*/
GPIO_Mode_AF3 = 0x03, /*!< GPIO Alternate function Mode*/
GPIO_Mode_AF4 = 0x04, /*!< GPIO Alternate function Mode*/
GPIO_Mode_AF5 = 0x05, /*!< GPIO Alternate function Mode*/
GPIO_Mode_AF6 = 0x06, /*!< GPIO Alternate function Mode*/
GPIO_Mode_AF7 = 0x07, /*!< GPIO Alternate function Mode*/
GPIO_Mode_IN = 0x08, /*!< GPIO Input Mode */
GPIO_Mode_OUT = 0x09 /*!< GPIO Output Mode */
} GPIOMode_TypeDef;
typedef enum
{
GPIO_OType_PP = 0x00,
GPIO_OType_OD = 0x01
} GPIOOType_TypeDef;
typedef enum
{
GPIO_PuPd_NOPULL = 0x00,
GPIO_PuPd_UP = 0x01,
GPIO_PuPd_DOWN = 0x02
} GPIOPuPd_TypeDef;
typedef enum
{
GPIO_Speed_2MHz = 0x00, /*!< Low speed */
GPIO_Speed_25MHz = 0x01, /*!< Medium speed */
GPIO_Speed_50MHz = 0x02, /*!< Fast speed */
GPIO_Speed_100MHz = 0x03 /*!< High speed on 30 pF (80 MHz Output max speed on 15 pF) */
} GPIOSpeed_TypeDef;
#include "hal/Landungsbruecke/freescale/PDD/GPIO_PDD.h"
#elif defined(LandungsbrueckeV3)
// typedef enum
// {
// GPIO_MODE_INPUT = 0x00, /*!< GPIO Input Mode */
// GPIO_MODE_OUTPUT = 0x01, /*!< GPIO Output Mode */
// GPIO_MODE_AF = 0x02, /*!< GPIO Alternate function Mode*/
// GPIO_MODE_ANALOG = 0x03, /*!< GPIO Analog Mode*/
// } GPIOMode_TypeDef;
//
// typedef enum
// {
// GPIO_OTYPE_PP = 0x00,
// GPIO_OTYPE_OD = 0x01
// } GPIOOType_TypeDef;
//
// typedef enum
// {
// GPIO_PUPD_NONE = 0x00,
// GPIO_PUPD_PULLUP = 0x01,
// GPIO_PUPD_PULLDOWN = 0x02
// } GPIOPuPd_TypeDef;
//
// typedef enum
// {
// GPIO_OSPEED_2MHZ = 0x00, /*!< Low speed */
// GPIO_OSPEED_25MHZ = 0x01, /*!< Medium speed */
// GPIO_OSPEED_50MHZ = 0x02, /*!< Fast speed */
// GPIO_OSPEED_MAX = 0x03 /*!< GPIO very high output speed, max speed more than 50MHz */
// } GPIOSpeed_TypeDef;
typedef uint32_t GPIOMode_TypeDef;
typedef uint32_t GPIOOType_TypeDef;
typedef uint32_t GPIOPuPd_TypeDef;
typedef uint32_t GPIOSpeed_TypeDef;
#endif
enum IOsHighLevelFunctions { IO_DEFAULT, IO_DI, IO_AI, IO_DO, IO_PWM, IO_SD, IO_CLK16, IO_SPI };
typedef struct
{
const uint8_t DEFAULT;
const uint8_t DI;
const uint8_t AI;
const uint8_t DO;
const uint8_t PWM;
const uint8_t SD;
const uint8_t CLK16;
const uint8_t SPI;
} IOsHighLevelFunctionTypeDef;
typedef struct
{
GPIOMode_TypeDef GPIO_Mode;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOOType_TypeDef GPIO_OType;
GPIOPuPd_TypeDef GPIO_PuPd;
} IOPinInitTypeDef;
typedef struct
{
#if defined(LandungsbrueckeV3)
uint32_t port;
volatile uint32_t *setBitRegister;
volatile uint32_t *resetBitRegister;
#elif defined(Landungsbruecke) || defined(LandungsbrueckeSmall)
PORT_MemMapPtr portBase;
GPIO_MemMapPtr GPIOBase;
volatile uint32_t *setBitRegister;
volatile uint32_t *resetBitRegister;
#endif
uint32_t bitWeight;
unsigned char bit;
IOPinInitTypeDef configuration;
IOPinInitTypeDef resetConfiguration;
enum IOsHighLevelFunctions highLevelFunction;
IO_States state;
} IOPinTypeDef;
typedef struct
{
void (*set)(IOPinTypeDef *pin);
void (*copy)(IOPinInitTypeDef *from, IOPinTypeDef*to);
void (*reset)(IOPinTypeDef *pin);
void (*toOutput)(IOPinTypeDef *pin);
void (*toInput)(IOPinTypeDef *pin);
void (*setHigh)(IOPinTypeDef *pin);
void (*setLow)(IOPinTypeDef *pin);
void (*setToState)(IOPinTypeDef *pin, IO_States state);
IO_States (*getState)(IOPinTypeDef *pin);
unsigned char (*isHigh)(IOPinTypeDef *pin);
void (*init)(void);
IOsHighLevelFunctionTypeDef HIGH_LEVEL_FUNCTIONS;
} IOsTypeDef;
extern IOsTypeDef IOs;
// A bit weight of 0 is used to indicate a nonexistent pin
#define DUMMY_BITWEIGHT 0
#define IS_DUMMY_PIN(pin) (pin->bitWeight == DUMMY_BITWEIGHT)
#endif /* _IO_H_ */