14#define STRING(x) STRING2(x)
15#pragma message(STRING(BOARD_EXT_GPIOCHIPS))
17#if (BOARD_EXT_GPIOCHIPS > 0)
38 const char **gpio_names;
41static gpiochip
chips[BOARD_EXT_GPIOCHIPS];
48 bool hasInit()
const {
49 return m_chip !=
nullptr;
52 int start(
const char* msg, gpiochip* chip,
size_t pin,
float frequency,
float duty) {
63 efiPrintf(
"Faield to enable PWM mode for chip %s on pin %d \"%s\"", chip->name,
pin, msg);
71 criticalError(
"Attempted to set duty on null external PWM device");
75 m_chip->chip->setPadPWM(m_pin, m_frequency,
duty);
79 gpiochip* m_chip =
nullptr;
81 float m_frequency = 0;
98 for (
int i = 0; i < BOARD_EXT_GPIOCHIPS; i++) {
99 gpiochip *chip = &
chips[i];
101 if ((
pin >= chip->base) && (
pin < (chip->base + chip->size)))
111 for (
size_t i = 0; i < efi::size(
extPwms); i++) {
117 criticalError(
"Run out of gpiochip PWM devices!");
137 return pin - chip->base;
139 return EFI_ERROR_CODE;
169 if ((chip->gpio_names) && (chip->gpio_names[
offset]))
170 return chip->gpio_names[
offset];
192 if ((base +
size - 1 > BRAIN_PIN_LAST) || (base <= BRAIN_PIN_ONCHIP_LAST))
196 for (
int i = 0; i < BOARD_EXT_GPIOCHIPS; i++) {
198 #define in_range(a, b, c) (((a) > (b)) && ((a) < (c)))
206 gpiochip *chip =
nullptr;
209 for (
int i = 0; i < BOARD_EXT_GPIOCHIPS; i++) {
223 chip->chip = &gpioChip;
226 chip->gpio_names =
nullptr;
247 if (chip->base != base)
251 chip->name =
nullptr;
252 chip->chip =
nullptr;
255 chip->gpio_names =
nullptr;
273 chip->gpio_names = names;
287 for (
int i = 0; i < BOARD_EXT_GPIOCHIPS; i++) {
288 gpiochip *chip = &
chips[i];
293 int ret = chip->chip->init();
297 criticalError(
"Failed to init chip %d: %d", i, ret);
302 pins_added += chip->size;
324 return chip->chip->setPadMode(
pin - chip->base, mode);
348 criticalError(
"Failed migration? Time to reset settings? gpiochip not found for pin %d",
pin);
352 return chip->chip->writePad(
pin - chip->base, value);
370 return chip->chip->readPad(
pin - chip->base);
387 return chip->chip->getDiag(
pin - chip->base);
401 for (i = 0; i < BOARD_EXT_GPIOCHIPS; i++) {
402 gpiochip *chip = &
chips[i];
417 for (i = 0; i < BOARD_EXT_GPIOCHIPS; i++) {
418 gpiochip *chip = &
chips[i];
423 efiPrintf(
"%s (base %d, size %d):\n", chip->name, (
int)chip->base, chip->size);
480 (void)base; (void)name; (void)
size;
487 (void)
pin; (void)names;
int gpiochips_readPad(brain_pin_e pin)
Get value to gpio of gpiochip.
int gpiochip_unregister(brain_pin_e base)
Unregister gpiochip.
int gpiochips_setPadMode(brain_pin_e pin, iomode_t mode)
Set pin mode of gpiochip.
const char * gpiochips_getChipName(brain_pin_e pin)
Get external chip name.
static gpiochip * gpiochip_find(brain_pin_e pin)
static external_hardware_pwm extPwms[5]
int gpiochips_init(void)
Init all registered gpiochips.
int gpiochips_writePad(brain_pin_e pin, int value)
Set value to gpio of gpiochip.
static external_hardware_pwm * gpiochip_getNextPwmDevice()
int gpiochips_get_total_pins(void)
Get total pin count allocated for external gpio chips.
int gpiochip_register(brain_pin_e base, const char *name, GpioChip &gpioChip, size_t size)
Register gpiochip.
void gpiochips_debug(void)
hardware_pwm * gpiochip_tryInitPwm(const char *msg, brain_pin_e pin, float frequency, float duty)
Try to init PWM on given pin.
const char * gpiochips_getPinName(brain_pin_e pin)
Get external chip port name.
static gpiochip chips[BOARD_EXT_GPIOCHIPS]
int gpiochips_setPinNames(brain_pin_e base, const char **names)
Set pins names for registered gpiochip.
brain_pin_diag_e gpiochips_getDiag(brain_pin_e pin)
Get diagnostic for given gpio.
int gpiochips_getPinOffset(brain_pin_e pin)
bool isInHardFaultHandler
uint32_t iomode_t
Digital I/O modes.
virtual void setDuty(float duty)=0