예제 #1
0
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);
}
예제 #2
0
// 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;
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #6
0
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;
}
예제 #7
0
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);
	}
}