예제 #1
0
파일: wii_gpio.c 프로젝트: Lxg1582/freebsd
static int
wiigpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
{
	struct wiigpio_softc *sc;
	uint32_t reg, pinbank, pinmask;

	if (pin >= WIIGPIO_NPINS)
		return (EINVAL);
	if ((flags & ~(GPIO_PIN_OUTPUT|GPIO_PIN_INPUT)) != 0)
		return (EINVAL);
	if ((flags & (GPIO_PIN_OUTPUT|GPIO_PIN_INPUT)) == 
	    (GPIO_PIN_OUTPUT|GPIO_PIN_INPUT))
		return (EINVAL);
	sc = device_get_softc(dev);
	pinbank = WIIGPIO_PINBANK(pin);
	pinmask = WIIGPIO_PINMASK(pin);
	WIIGPIO_LOCK(sc);
	reg = wiigpio_dir_read(sc, WIIGPIO_PINBANK(pin));
	if (flags & GPIO_PIN_OUTPUT)
		wiigpio_dir_write(sc, pinbank, reg | pinmask);
	else
		wiigpio_dir_write(sc, pinbank, reg & ~pinmask);
	sc->sc_pins[pin].gp_flags = flags;
	WIIGPIO_UNLOCK(sc);

	return (0);
}
예제 #2
0
static int
wiigpio_pin_getname(device_t dev, uint32_t pin, char *name)
{
	struct wiigpio_softc *sc;

	if (pin >= WIIGPIO_NPINS)
		return (EINVAL);
	sc = device_get_softc(dev);
	WIIGPIO_LOCK(sc);
	memcpy(name, sc->sc_pins[pin].gp_name, GPIOMAXNAME);
	WIIGPIO_UNLOCK(sc);

	return (0);
}
예제 #3
0
static int
wiigpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
{
	struct wiigpio_softc *sc;

	if (pin >= WIIGPIO_NPINS)
		return (EINVAL);
	sc = device_get_softc(dev);
	WIIGPIO_LOCK(sc);
	*flags = sc->sc_pins[pin].gp_flags;
	WIIGPIO_UNLOCK(sc);

	return (0);
}
예제 #4
0
static int
wiigpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
{
	struct wiigpio_softc *sc;
	uint32_t reg;

	if (pin >= WIIGPIO_NPINS)
		return (EINVAL);
	sc = device_get_softc(dev);
	WIIGPIO_LOCK(sc);
	reg = wiigpio_read(sc);
	*val = !!(reg & (1 << pin));
	WIIGPIO_UNLOCK(sc);

	return (0);
}
예제 #5
0
static int
wiigpio_pin_toggle(device_t dev, uint32_t pin)
{
	struct wiigpio_softc *sc;
	uint32_t val, pinmask = 1 << pin;

	sc = device_get_softc(dev);
	WIIGPIO_LOCK(sc);
	val = wiigpio_read(sc) & pinmask;
	if (val)
		wiigpio_write(sc, wiigpio_read(sc) & ~pinmask);
	else
		wiigpio_write(sc, wiigpio_read(sc) | pinmask);
	WIIGPIO_UNLOCK(sc);

	return (0);
}
예제 #6
0
static int
wiigpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
{
	struct wiigpio_softc *sc;
	uint32_t reg, pinmask = 1 << pin;

	if (pin >= WIIGPIO_NPINS)
		return (EINVAL);
	sc = device_get_softc(dev);
	WIIGPIO_LOCK(sc);
	reg = wiigpio_read(sc) & ~pinmask;
	if (value)
		reg |= pinmask;
	wiigpio_write(sc, reg);
	WIIGPIO_UNLOCK(sc);

	return (0);
}
예제 #7
0
파일: wii_gpio.c 프로젝트: Lxg1582/freebsd
static int
wiigpio_pin_toggle(device_t dev, uint32_t pin)
{
	struct wiigpio_softc *sc;
	uint32_t val, pinbank, pinmask;

	if (pin >= WIIGPIO_NPINS)
		return (EINVAL);
	sc = device_get_softc(dev);
	pinbank = WIIGPIO_PINBANK(pin);
	pinmask = WIIGPIO_PINMASK(pin);
	WIIGPIO_LOCK(sc);
	val = wiigpio_read(sc, pinbank);
	if (val & pinmask)
		wiigpio_write(sc, pinbank, val & ~pinmask);
	else
		wiigpio_write(sc, pinbank, val | pinmask);
	WIIGPIO_UNLOCK(sc);

	return (0);
}