[BACK]Return to pca9532.c CVS log [TXT][DIR] Up to [local] / sys / dev / i2c

Annotation of sys/dev/i2c/pca9532.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: pca9532.c,v 1.2 2006/06/17 23:00:47 drahn Exp $ */
                      2: /*
                      3:  * Copyright (c) 2006 Dale Rahn <drahn@openbsd.org>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
                      8:  *
                      9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     16:  */
                     17:
                     18: #include <sys/param.h>
                     19: #include <sys/systm.h>
                     20: #include <sys/device.h>
                     21: #include <sys/kernel.h>
                     22: #include <sys/fcntl.h>
                     23: #include <sys/uio.h>
                     24: #include <sys/conf.h>
                     25: #include <sys/gpio.h>
                     26:
                     27:
                     28: #include <dev/i2c/i2cvar.h>
                     29: #include <dev/gpio/gpiovar.h>
                     30:
                     31: #include "gpio.h"
                     32:
                     33: /* driver for PCA 9532 */
                     34:
                     35: #define PCALED_ADDR 0x60
                     36:
                     37: #define PCALED_GPIO_NPINS 16
                     38:
                     39: struct pcaled_softc {
                     40:        struct device sc_dev;
                     41:        i2c_tag_t sc_tag;
                     42:        int sc_addr;
                     43:        struct gpio_chipset_tag sc_gpio_gc;
                     44:        struct gpio_pin sc_gpio_pin[PCALED_GPIO_NPINS];
                     45:
                     46: };
                     47:
                     48: int pcaled_match(struct device *, void *, void *);
                     49: void pcaled_attach(struct device *, struct device *, void *);
                     50: int pcaled_gpio_pin_read(void *arg, int pin);
                     51: void pcaled_gpio_pin_write (void *arg, int pin, int value);
                     52: void pcaled_gpio_pin_ctl (void *arg, int pin, int flags);
                     53:
                     54: struct cfattach pcaled_ca = {
                     55:        sizeof(struct pcaled_softc), pcaled_match, pcaled_attach
                     56: };
                     57:
                     58: struct cfdriver pcaled_cd = {
                     59:        NULL, "pcaled", DV_DULL
                     60: };
                     61:
                     62: int
                     63: pcaled_match(struct device *parent, void *v, void *arg)
                     64: {
                     65:        struct i2c_attach_args *ia = arg;
                     66:        int ok = 0;
                     67:        uint8_t cmd, data;
                     68:
                     69:        if (ia->ia_addr != PCALED_ADDR)
                     70:                return (0);
                     71:        /* attempt to read input register 0 */
                     72:        iic_acquire_bus(ia->ia_tag, I2C_F_POLL);
                     73:        cmd = 0;
                     74:        if (iic_exec(ia->ia_tag, I2C_OP_READ_WITH_STOP, ia->ia_addr,
                     75:            &cmd, 1, &data, 1, I2C_F_POLL))
                     76:                goto fail;
                     77:        cmd = 9;
                     78:        if (iic_exec(ia->ia_tag, I2C_OP_READ_WITH_STOP, ia->ia_addr,
                     79:            &cmd, 1, &data, 1, I2C_F_POLL))
                     80:                goto fail;
                     81:        ok = 1;
                     82: fail:
                     83:        iic_release_bus(ia->ia_tag, I2C_F_POLL);
                     84:        return (ok);
                     85: }
                     86:
                     87: void
                     88: pcaled_attach(struct device *parent, struct device *self, void *arg)
                     89: {
                     90:        struct pcaled_softc *sc = (void *)self;
                     91:        struct i2c_attach_args *ia = arg;
                     92:        struct gpiobus_attach_args gba;
                     93:        int i;
                     94:        uint8_t cmd, data;
                     95:
                     96:        sc->sc_tag = ia->ia_tag;
                     97:        sc->sc_addr = ia->ia_addr;
                     98:
                     99:        iic_acquire_bus(sc->sc_tag, I2C_F_POLL);
                    100:
                    101:        for (i = 0; i < PCALED_GPIO_NPINS; i++) {
                    102:                sc->sc_gpio_pin[i].pin_num = i;
                    103:                sc->sc_gpio_pin[i].pin_caps = GPIO_PIN_INOUT;
                    104:                if (i < 8)
                    105:                        cmd = 0;
                    106:                else
                    107:                        cmd = 1;
                    108:                if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr,
                    109:                    &cmd, 1, &data, 1, I2C_F_POLL))
                    110:                        goto fail; /* XXX */
                    111:                sc->sc_gpio_pin[i].pin_state = (data >> (i & 3)) & 1;
                    112:        }
                    113:        sc->sc_gpio_gc.gp_cookie = sc;
                    114:        sc->sc_gpio_gc.gp_pin_read = pcaled_gpio_pin_read;
                    115:        sc->sc_gpio_gc.gp_pin_write = pcaled_gpio_pin_write;
                    116:        sc->sc_gpio_gc.gp_pin_ctl = pcaled_gpio_pin_ctl;
                    117:
                    118:        printf(": PCA9532 LED controller\n");
                    119:
                    120:        gba.gba_name = "gpio";
                    121:        gba.gba_gc = &sc->sc_gpio_gc;
                    122:        gba.gba_pins = sc->sc_gpio_pin;
                    123:        gba.gba_npins = PCALED_GPIO_NPINS;
                    124: #if NGPIO > 0
                    125:        config_found(&sc->sc_dev, &gba, gpiobus_print);
                    126: #endif
                    127:
                    128: fail:
                    129:        iic_release_bus(sc->sc_tag, I2C_F_POLL);
                    130: }
                    131:
                    132: int
                    133: pcaled_gpio_pin_read(void *arg, int pin)
                    134: {
                    135:        struct pcaled_softc *sc = arg;
                    136:        iic_acquire_bus(sc->sc_tag, I2C_F_POLL);
                    137:        uint8_t cmd, data;
                    138:
                    139:        if (pin < 8)
                    140:                cmd = 0;
                    141:        else
                    142:                cmd = 1;
                    143:        if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr,
                    144:            &cmd, 1, &data, 1, I2C_F_POLL))
                    145:                goto fail; /* XXX */
                    146:
                    147: fail:
                    148:        iic_release_bus(sc->sc_tag, I2C_F_POLL);
                    149:        return (data >> (pin & 3)) & 1;
                    150: }
                    151:
                    152: void
                    153: pcaled_gpio_pin_write (void *arg, int pin, int value)
                    154: {
                    155:        struct pcaled_softc *sc = arg;
                    156:        uint8_t cmd, data;
                    157:        if (pin < 4)
                    158:                cmd = 6;
                    159:        else if (pin < 8)
                    160:                cmd = 7;
                    161:        else if (pin < 12)
                    162:                cmd = 8;
                    163:        else
                    164:                cmd = 9;
                    165:        if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr,
                    166:            &cmd, 1, &data, 1, I2C_F_POLL))
                    167:                goto fail; /* XXX */
                    168:        data &= ~(0x3 << (2*(pin & 3)));
                    169:        data |= (value << (2*(pin & 3)));
                    170:
                    171:        if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP, sc->sc_addr,
                    172:            &cmd, 1, &data, 1, I2C_F_POLL))
                    173:                goto fail; /* XXX */
                    174:
                    175: fail:
                    176:        iic_release_bus(sc->sc_tag, I2C_F_POLL);
                    177: }
                    178:
                    179: void
                    180: pcaled_gpio_pin_ctl (void *arg, int pin, int flags)
                    181: {
                    182:        /* XXX all pins are inout */
                    183: }
                    184:

CVSweb