rt-thread-official/components/external/espruino/src/jspin.h

229 lines
5.2 KiB
C

/*
* This file is part of Espruino, a JavaScript interpreter for Microcontrollers
*
* Copyright (C) 2013 Gordon Williams <gw@pur3.co.uk>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* ----------------------------------------------------------------------------
* Utilities and definitions for handling Pins
* ----------------------------------------------------------------------------
*/
#ifndef JSPIN_H
#define JSPIN_H
#include "jsutils.h"
#include "jsvar.h"
typedef unsigned char Pin; ///< for specifying pins for hardware
#define PIN_UNDEFINED ((Pin)0xFF)
typedef enum {
JSH_PORT_NONE,
JSH_PORTA=1,
JSH_PORTB,
JSH_PORTC,
JSH_PORTD,
JSH_PORTE,
JSH_PORTF,
JSH_PORTG,
JSH_PORTH,
} PACKED_FLAGS JsvPinInfoPort;
typedef enum {
JSH_PIN0 = 0,
JSH_PIN1,
JSH_PIN2,
JSH_PIN3,
JSH_PIN4,
JSH_PIN5,
JSH_PIN6,
JSH_PIN7,
JSH_PIN8,
JSH_PIN9,
JSH_PIN10,
JSH_PIN11,
JSH_PIN12,
JSH_PIN13,
JSH_PIN14,
JSH_PIN15,
#ifndef ARM
JSH_PIN16,
JSH_PIN17,
JSH_PIN18,
JSH_PIN19,
JSH_PIN20,
JSH_PIN21,
JSH_PIN22,
JSH_PIN23,
JSH_PIN24,
JSH_PIN25,
JSH_PIN26,
JSH_PIN27,
JSH_PIN28,
JSH_PIN29,
JSH_PIN30,
JSH_PIN31,
#endif
} PACKED_FLAGS JsvPinInfoPin;
typedef enum {
JSH_ANALOG_NONE = 0,
JSH_ANALOG1 = 32,
JSH_ANALOG2 = 64,
JSH_ANALOG3 = 128,
JSH_ANALOG4 = 256,
JSH_ANALOG12 = JSH_ANALOG1|JSH_ANALOG2,
JSH_ANALOG123 = JSH_ANALOG1|JSH_ANALOG2|JSH_ANALOG3,
JSH_ANALOG34 = JSH_ANALOG3|JSH_ANALOG4,
JSH_ANALOG_CH0 = 0,
JSH_ANALOG_CH1,
JSH_ANALOG_CH2,
JSH_ANALOG_CH3,
JSH_ANALOG_CH4,
JSH_ANALOG_CH5,
JSH_ANALOG_CH6,
JSH_ANALOG_CH7,
JSH_ANALOG_CH8,
JSH_ANALOG_CH9,
JSH_ANALOG_CH10,
JSH_ANALOG_CH11,
JSH_ANALOG_CH12,
JSH_ANALOG_CH13,
JSH_ANALOG_CH14,
JSH_ANALOG_CH15,
JSH_ANALOG_CH16,
JSH_MASK_ANALOG_CH = 31,
JSH_MASK_ANALOG_ADC = JSH_ANALOG1|JSH_ANALOG2|JSH_ANALOG3|JSH_ANALOG4,
} PACKED_FLAGS JsvPinInfoAnalog;
typedef enum {
// ---------------------------- JSH_MASK_AF
JSH_AF0 = 0,
JSH_AF1,
JSH_AF2,
JSH_AF3,
JSH_AF4,
JSH_AF5,
JSH_AF6,
JSH_AF7,
JSH_AF8,
JSH_AF9,
JSH_AF10,
JSH_AF11,
JSH_AF12,
JSH_AF13,
JSH_AF14,
JSH_AF15,
// ---------------------------- JSH_MASK_TYPE
JSH_TIMER1 = 0x0010,
JSH_TIMER2 = 0x0020,
JSH_TIMER3 = 0x0030,
JSH_TIMER4 = 0x0040,
JSH_TIMER5 = 0x0050,
JSH_TIMER6 = 0x0060,
JSH_TIMER7 = 0x0070,
JSH_TIMER8 = 0x0080,
JSH_TIMER9 = 0x0090,
JSH_TIMER10 = 0x00A0,
JSH_TIMER11 = 0x00B0,
JSH_TIMER12 = 0x00C0,
JSH_TIMER13 = 0x00D0,
JSH_TIMER14 = 0x00E0,
JSH_TIMER15 = 0x00F0,
JSH_TIMER16 = 0x0100,
JSH_TIMER17 = 0x0110,
JSH_TIMER18 = 0x0120,
JSH_TIMERMAX = JSH_TIMER18,
JSH_DAC = 0x0180,
JSH_SPI1 = 0x0200,
JSH_SPI2 = 0x0210,
JSH_SPI3 = 0x0220,
JSH_SPIMAX = JSH_SPI3,
JSH_I2C1 = 0x0280,
JSH_I2C2 = 0x0290,
JSH_I2C3 = 0x02A0,
JSH_I2CMAX = JSH_I2C3,
JSH_USART1 = 0x0300,
JSH_USART2 = 0x0310,
JSH_USART3 = 0x0320,
JSH_USART4 = 0x0330,
JSH_USART5 = 0x0340,
JSH_USART6 = 0x0350,
JSH_USARTMAX = JSH_USART6,
// ---------------------------- JSH_MASK_INFO
JSH_TIMER_CH1 = 0x0000,
JSH_TIMER_CH2 = 0x1000,
JSH_TIMER_CH3 = 0x2000,
JSH_TIMER_CH4 = 0x3000,
JSH_MASK_TIMER_CH = 0x7000,
JSH_TIMER_NEGATED = 0x8000,
JSH_USART_RX = 0x0000,
JSH_USART_TX = 0x1000,
JSH_SPI_MISO = 0x0000,
JSH_SPI_MOSI = 0x1000,
JSH_SPI_SCK = 0x2000,
JSH_I2C_SCL = 0x0000,
JSH_I2C_SDA = 0x1000,
JSH_DAC_CH1 = 0x0000,
JSH_DAC_CH2 = 0x1000,
// ---------------------------- Masks
JSH_MASK_AF = 0x000F,
JSH_MASK_TYPE = 0x0FF0,
JSH_MASK_INFO = 0xF000,
} PACKED_FLAGS JshPinFunction;
#define JSH_PINFUNCTION_IS_TIMER(F) ( \
(((F)&JSH_MASK_TYPE)>=JSH_TIMER1) && \
(((F)&JSH_MASK_TYPE)<=JSH_TIMER18))
#define JSH_PINFUNCTION_IS_DAC(F) ( \
(((F)&JSH_MASK_TYPE)==JSH_DAC) || \
0 )
#define JSH_PINFUNCTION_IS_USART(F) ( \
(((F)&JSH_MASK_TYPE)>=JSH_USART1) && \
(((F)&JSH_MASK_TYPE)<=JSH_USART6))
#define JSH_PINFUNCTION_IS_I2C(F) ( \
(((F)&JSH_MASK_TYPE)>=JSH_I2C1) && \
(((F)&JSH_MASK_TYPE)<=JSH_I2CMAX))
#define JSH_PINFUNCTION_IS_SPI(F) ( \
(((F)&JSH_MASK_TYPE)>=JSH_SPI1) && \
(((F)&JSH_MASK_TYPE)<=JSH_SPIMAX))
bool jshIsPinValid(Pin pin); ///< is the specific pin actually valid?
/// Given a string, convert it to a pin ID (or -1 if it doesn't exist)
Pin jshGetPinFromString(const char *s);
/** Write the pin name to a string. String must have at least 8 characters (to be safe) */
void jshGetPinString(char *result, Pin pin);
/// Given a var, convert it to a pin ID (or -1 if it doesn't exist). safe for undefined!
static inline Pin jshGetPinFromVar(JsVar *pinv) {
if (jsvIsString(pinv) && pinv->varData.str[5]==0/*should never be more than 4 chars!*/) {
return jshGetPinFromString(&pinv->varData.str[0]);
} else if (jsvIsInt(pinv) /* This also tests for the Pin datatype */) {
return (Pin)jsvGetInteger(pinv);
} else return PIN_UNDEFINED;
}
static inline Pin jshGetPinFromVarAndUnLock(JsVar *pinv) {
Pin pin = jshGetPinFromVar(pinv);
jsvUnLock(pinv);
return pin;
}
#endif //JSPIN_H