GCC Code Coverage Report


Directory: ./
File: firmware/hw_layer/io_pins.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 50.0% 11 0 22
Functions: 57.1% 4 0 7
Branches: 50.0% 5 0 10
Decisions: 20.0% 1 - 5

Line Branch Decision Exec Source
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)
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
89 bool efiReadPin(brain_pin_e pin) {
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
103 iomode_t getInputMode(pin_input_mode_e mode) {
104 switch (mode) {
105 case PI_PULLUP:
106 case PI_INVERTED_PULLUP:
107 return PAL_MODE_INPUT_PULLUP;
108 case PI_PULLDOWN:
109 case PI_INVERTED_PULLDOWN:
110 return PAL_MODE_INPUT_PULLDOWN;
111 case PI_DEFAULT:
112 case PI_INVERTED_DEFAULT:
113 default:
114 return PAL_MODE_INPUT;
115 }
116 }
117
118 void writePad(const char *msg, brain_pin_e pin, int bit) {
119 palWritePad(getHwPort(msg, pin), getHwPin(msg, pin), bit);
120 }
121
122 #else /* EFI_PROD_CODE */
123
124 // This has been made global so we don't need to worry about efiReadPin having access the object
125 // we store it in, every time we need to use efiReadPin.
126 bool mockPinStates[BRAIN_PIN_COUNT];
127
128
1/1
✓ Decision 'true' taken 631 times.
631 bool efiReadPin(brain_pin_e pin) {
129 631 return mockPinStates[static_cast<int>(pin)];
130 }
131
132 773 void setMockState(brain_pin_e pin, bool state) {
133 773 mockPinStates[static_cast<int>(pin)] = state;
134 773 }
135
136 #endif /* EFI_PROD_CODE */
137
138 508 bool efiIsInputPinInverted(pin_input_mode_e mode) {
139
1/2
✓ Branch 0 taken 493 times.
✗ Branch 1 not taken.
493 return ((mode == PI_INVERTED_DEFAULT) ||
140
4/4
✓ Branch 0 taken 493 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 489 times.
1001 (mode == PI_INVERTED_PULLUP) ||
141 508 (mode == PI_INVERTED_PULLDOWN));
142 }
143
144 508 bool efiReadPin(brain_pin_e pin, pin_input_mode_e mode) {
145 508 return efiReadPin(pin) ^ efiIsInputPinInverted(mode);
146 }
147