rusEFI
The most advanced open source ECU
io_pins.cpp
Go to the documentation of this file.
1 /**
2  * @file io_pins.cpp
3  * @brief his file is about general input/output utility methods, not much EFI-specifics
4  *
5  *
6  * @date Jan 24, 2013
7  * @author Andrey Belomutskiy, (c) 2012-2020
8  */
9 
10 #include "pch.h"
11 
12 #if EFI_PROD_CODE
13 
14 #include "gpio/gpio_ext.h"
15 
16 #include "status_loop.h"
17 #include "console_io.h"
18 #endif /* EFI_PROD_CODE */
19 
20 void efiSetPadUnused(brain_pin_e brainPin) {
21 #if EFI_PROD_CODE
22  /* input with pull up, is it safe? */
23  iomode_t mode = PAL_STM32_MODE_INPUT | PAL_STM32_PUPDR_PULLUP;
24 
25  if (brain_pin_is_onchip(brainPin)) {
26  ioportid_t port = getHwPort("unused", brainPin);
27  ioportmask_t pin = getHwPin("unused", brainPin);
28 
29  /* input with pull up, is it safe?
30  * todo: shall we reuse 'default state' constants with board.h?
31  * */
32  palSetPadMode(port, pin, mode);
33  palWritePad(port, pin, 0);
34  }
35  #if (BOARD_EXT_GPIOCHIPS > 0)
36  else {
37  gpiochips_setPadMode(brainPin, mode);
38  }
39  #endif
40 #endif /* EFI_PROD_CODE */
41 
42  brain_pin_markUnused(brainPin);
43 }
44 
45 /**
46  * This method would set an error condition if pin is already used
47  */
48 void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode) {
49  if (!isBrainPinValid(brainPin)) {
50  // No pin configured, nothing to do here.
51  return;
52  }
53 
54  bool wasUsed = brain_pin_markUsed(brainPin, msg);
55 
56  if (!wasUsed) {
57  efiSetPadModeWithoutOwnershipAcquisition(msg, brainPin, mode);
58  }
59 }
60 
61 void efiSetPadModeWithoutOwnershipAcquisition(const char *msg, brain_pin_e brainPin, iomode_t mode) {
62 #if EFI_PROD_CODE
63  /*check if on-chip pin or external */
64  if (brain_pin_is_onchip(brainPin)) {
65  /* on-chip */
66  ioportid_t port = getHwPort(msg, brainPin);
67  ioportmask_t pin = getHwPin(msg, brainPin);
68  /* paranoid */
69  if (port == GPIO_NULL)
70  return;
71 
72  palSetPadMode(port, pin, mode);
73  }
74  #if (BOARD_EXT_GPIOCHIPS > 0)
75  else {
76  gpiochips_setPadMode(brainPin, mode);
77  }
78  #endif
79 
80 #endif /* EFI_PROD_CODE */
81 }
82 
83 #if EFI_PROD_CODE
84 
85 #if EFI_ENGINE_CONTROL
86 #include "main_trigger_callback.h"
87 #endif /* EFI_ENGINE_CONTROL */
88 
90  if (!isBrainPinValid(pin))
91  return false;
92  if (brain_pin_is_onchip(pin))
93  return palReadPad(getHwPort("readPin", pin), getHwPin("readPin", pin));
94  #if (BOARD_EXT_GPIOCHIPS > 0)
95  else if (brain_pin_is_ext(pin))
96  return (gpiochips_readPad(pin) > 0);
97  #endif
98 
99  /* incorrect pin */
100  return false;
101 }
102 
104  switch (mode) {
105  case PI_PULLUP:
106  return PAL_MODE_INPUT_PULLUP;
107  case PI_PULLDOWN:
108  return PAL_MODE_INPUT_PULLDOWN;
109  case PI_DEFAULT:
110  default:
111  return PAL_MODE_INPUT;
112  }
113 }
114 
115 void writePad(const char *msg, brain_pin_e pin, int bit) {
116  palWritePad(getHwPort(msg, pin), getHwPin(msg, pin), bit);
117 }
118 
119 #else /* EFI_PROD_CODE */
120 
121 // This has been made global so we don't need to worry about efiReadPin having access the object
122 // we store it in, every time we need to use efiReadPin.
123 bool mockPinStates[BRAIN_PIN_COUNT];
124 
125 bool efiReadPin(brain_pin_e pin) {
126  return mockPinStates[static_cast<int>(pin)];
127 }
128 
129 void setMockState(brain_pin_e pin, bool state) {
130  mockPinStates[static_cast<int>(pin)] = state;
131 }
132 
133 #endif /* EFI_PROD_CODE */
Gpio
int gpiochips_readPad(brain_pin_e pin)
Get value to gpio of gpiochip.
Definition: core.cpp:355
int gpiochips_setPadMode(brain_pin_e pin, iomode_t mode)
Set pin mode of gpiochip.
Definition: core.cpp:316
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
Definition: hal_pal_lld.h:78
GPIO_TypeDef * ioportid_t
Port Identifier.
Definition: hal_pal_lld.h:102
uint32_t iomode_t
Digital I/O modes.
Definition: hal_pal_lld.h:83
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
Definition: io_pins.cpp:48
iomode_t getInputMode(pin_input_mode_e mode)
Definition: io_pins.cpp:103
bool efiReadPin(brain_pin_e pin)
Definition: io_pins.cpp:89
bool mockPinStates[BRAIN_PIN_COUNT]
Definition: io_pins.cpp:123
void efiSetPadUnused(brain_pin_e brainPin)
Definition: io_pins.cpp:20
void setMockState(brain_pin_e pin, bool state)
Definition: io_pins.cpp:129
void efiSetPadModeWithoutOwnershipAcquisition(const char *msg, brain_pin_e brainPin, iomode_t mode)
Definition: io_pins.cpp:61
void writePad(const char *msg, brain_pin_e pin, int bit)
Definition: io_pins.cpp:115
Main logic header.
bool brain_pin_markUsed(Gpio brainPin, const char *msg)
bool brain_pin_is_onchip(brain_pin_e brainPin)
void brain_pin_markUnused(brain_pin_e brainPin)
bool isBrainPinValid(brain_pin_e brainPin)
bool brain_pin_is_ext(brain_pin_e brainPin)
pin_input_mode_e
Definition: rusefi_enums.h:240
static ScState state