13using namespace rusefi::stringutil;
17static const struct port_io {
49 return (brainPin -
Gpio::A0) % PORT_SIZE;
53 size_t idx = (brainPin -
Gpio::A0) / PORT_SIZE;
54 if (idx < efi::size(
ports)) {
55 return ports[idx].port;
63 for (
size_t idx = 0; idx < efi::size(
ports); idx++) {
64 if (
ports[idx].port == port) {
65 return ports[idx].name;
72 for (
size_t idx = 0; idx < efi::size(
ports); idx++) {
73 if (
ports[idx].port == port) {
87 return portIndex * PORT_SIZE +
pin;
100 size_t idx = (brainPin -
Gpio::A0) / PORT_SIZE;
101 if (idx < efi::size(
ports)) {
102 return ports[idx].port;
105#ifndef EFI_BOOTLOADER
117 return EFI_ERROR_CODE;
124#ifndef EFI_BOOTLOADER
125 criticalError(
"%s: Invalid on-chip Gpio: %d", msg, (
int)brainPin);
127 return EFI_ERROR_CODE;
136 if (strEqual(str,
"none"))
139 if (str[0] !=
'p' && str[0] !=
'P') {
144 if (port >=
'a' && port <=
'z') {
145 basePin =
Gpio::A0 + PORT_SIZE * (port -
'a');
146 }
else if (port >=
'A' && port <=
'Z') {
147 basePin =
Gpio::A0 + PORT_SIZE * (port -
'A');
151 const char *pinStr = str + 2;
152 int pin = atoi(pinStr);
157 return BRAIN_PIN_ONCHIP_PINS;
160static const char *
od_names[2] = {
"Push-Pull",
"Open-Drain" };
161static const char *
speed_names[4] = {
"Low",
"Medium",
"High",
"Very High" };
162static const char *
pull_names[4] = {
"No pull",
"Pull-up",
"Pull-down",
"Reserved" };
168 if (port ==
nullptr) {
173 uint32_t mode = (port->MODER >> (
pin * 2)) & 0x03;
178 (port->IDR >>
pin) & 0x01);
179 }
else if (mode == 1) {
180 chsnprintf(
buffer,
size,
"GP out %s %s Speed %s OUT %d IN %d",
184 (port->ODR >>
pin) & 0x01,
185 (port->IDR >>
pin) & 0x01);
186 }
else if (mode == 2) {
187 uint32_t af = (
pin < 8) ? port->AFRL : port->AFRH;
188 af = (af >> (4 * (
pin & 0x07))) & 0x0f;
189 chsnprintf(
buffer,
size,
"Mode AF%d %s %s Speed %s IN %d OUT %d",
194 (port->IDR >>
pin) & 0x01,
195 (port->ODR >>
pin) & 0x01);
196 }
else if (mode == 3) {
void firmwareError(ObdCode code, const char *fmt,...)
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
GPIO_TypeDef * ioportid_t
Port Identifier.
@ CUSTOM_ERR_UNKNOWN_PORT
bool brain_pin_is_onchip(brain_pin_e brainPin)
bool isBrainPinValid(brain_pin_e brainPin)
int getBrainPinIndex(brain_pin_e brainPin)
static const struct port_io ports[]
static const char * pull_names[4]
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
brain_pin_e parseBrainPin(const char *str)
unsigned int getBrainPinOnchipNum(void)
static int getPortIndex(ioportid_t port)
const char * portname(ioportid_t port)
int getPortPinIndex(ioportid_t port, ioportmask_t pin)
static const char * od_names[2]
static const char * speed_names[4]
void debugBrainPin(char *buffer, size_t size, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
ioportid_t getBrainPinPort(brain_pin_e brainPin)
static BigBufferHandle buffer