void turnOffPWM(uint8_t pin) { int handle = 0, ret = 0; PinDescription *p = NULL; // Scan mappings if ((p = pinDescriptionById(pin)) == NULL) { trace_error("%s: invalid pin %u\n", __func__, pin); return; } pin2alternate(&p); if(p->ulArduinoId == pin) { handle = pin2pwmhandle_enable(pin); if ((int)PIN_EINVAL == handle) { trace_error("%s: bad handle for pin%u", __func__, pin); return; } if (sysfsPwmDisable(handle)) { trace_error("%s: couldn't disable pwm " "on pin%u", __func__, pin); return; } /* Mark PWM disabled on pin */ g_APinState[pin].uCurrentPwm = 0; g_APinState[pin].uPwmEnabled = 0; return; } trace_error("%s: unknown pin%u", __func__, pin); }
// Just trust the input - this is a requirement for running select(); on gpiolib derived handles int pinHandleReopen(uint8_t index) { PinDescription *p = &g_APinDescription[index]; pin2alternate(&p); close(p->iHandle); p->iHandle = open(p->sPath, O_RDWR); return p->iHandle; }
static const int pin2gpio(uint8_t pin) { PinDescription *p = NULL; if (pin >= GPIO_TOTAL) return PIN_EINVAL; p = &g_APinDescription[ardPin2DescIdx[pin]]; pin2alternate(&p); return p->ulGPIOId; }
int pin2gpiohandle(uint8_t pin) { PinDescription *p = NULL; if (pin >= GPIO_TOTAL) return PIN_EINVAL; // Scan mappings p = &g_APinDescription[ardPin2DescIdx[pin]]; pin2alternate(&p); return p->iHandle; }
int gpio2gpiohandle(uint32_t gpio) { int i = 0; PinDescription *p = NULL; for (i = 0; i < sizeof_g_APinDescription; i ++) { p = &g_APinDescription[i]; pin2alternate(&p); if (p->ulGPIOId == gpio) { return p->iHandle; } } return PIN_EINVAL; }
char * pin2path(uint8_t pin) { PinDescription *p = NULL; if (pin >= GPIO_TOTAL) return NULL; // Scan mappings p = &g_APinDescription[ardPin2DescIdx[pin]]; pin2alternate(&p); return p->sPath; }
static void digitalWriteSetVal(register uint32_t idx, register uint8_t pin, register uint8_t val) { int ret = 0; PinDescription *p = &g_APinDescription[idx]; pin2alternate(&p); /* perform screaming fast direct register access */ if (likely(p->ulFastIOBit != NONE)){ fastGpioDigitalWrite(p->ulFastIOBit, val); return; } /* else go through sysfs like good citizens */ if (unlikely(p->iHandle == PIN_EINVAL)){ trace_error("%s: pin %d out of range (gpio%d)", __func__, pin, pin2gpio(pin)); return; } ret = sysfsGpioSet(p->iHandle, (unsigned int)val); if (unlikely(ret)) { trace_error( "%s: err=%d", __func__, ret); } }