NAME

    Device::Chip::MCP23x17 - chip driver for the MCP23x17 family

SYNOPSIS

       use Device::Chip::MCP23S17;
       use Future::AsyncAwait;
    
       use constant { HIGH => 0xFFFF, LOW => 0 };
    
       my $chip = Device::Chip::MCP23S17->new;
       await $chip->mount( Device::Chip::Adapter::...->new );
    
       foreach my $bit ( 0 .. 15 ) {
          await $chip->write_gpio( HIGH, 1 << $bit );
          sleep 1;
          await $chip->write_gpio( LOW, 1 << $bit );
       }

DESCRIPTION

    This Device::Chip subclass provides specific communication to the
    Microchip MCP23x17 family of chips.

    This module itself is an abstract base; to talk to a specific chip see
    one of the following subclasses:

      MCP23S17 over SPI - see Device::Chip::MCP23S17

    Aside from the method of communication with the actual chip hardware,
    these modules all provide the same higher-level API to the containing
    application.

    This module currently only supports a chip running in the IOCON.BANK=0
    configuration.

MOUNT PARAMETERS

 reset

    The name of the GPIO line on the adapter that is connected to the
    RESET# pin of the chip, if there is one. This will be used by the
    "reset" method.

METHODS

    The following methods documented in an await expression return Future
    instances.

    Each method that takes a $mask parameter uses it to select which IO
    pins are affected. The mask is a 16-bit integer; selecting only those
    pins for which bits are set. The lower 8 bits relate to the GPA pins,
    the higher 8 to the GPB pins. Pins that are not selected by the mask
    remain unaffected.

 reset

       await $chip->reset;

    Resets the cached register values back to their power-up defaults.

    Additionally, if the reset mount parameter is defined, pulses the
    RESET# pin of the chip.

 write_gpio

       await $chip->write_gpio( $val, $mask );

    Sets the pins named in the $mask to be outputs, and sets their values
    from the bits in $val. Both values are 16-bit integers.

 read_gpio

       $val = await $chip->read_gpio( $mask );

    Sets the pins named in the $mask to be inputs, and reads the current
    pin values of them. The mask and the return value are 16-bit integers.

 tris_gpio

       await $chip->tris_gpio( $mask );

    Sets the pins named in the $mask to be inputs ("tristate"). The mask is
    a 16-bit integer.

 set_input_polarity

       await $chip->set_input_polarity( $pol, $mask );

    Sets the input polarity of the pins given by $mask to be the values
    given in $pol. Pins associated with bits set in $pol will read with an
    inverted sense. Both values are 16-bit integers.

 set_input_pullup

       await $chip->set_input_pullup( $pullup, $mask );

    Enables or disables the input pullup resistors on the pins given by
    $mask as per the values given by $pullup. Both values are 16-bit
    integers.

 as_adapter

       $adapter = $chip->as_adapter;

    Returns an instance implementing the Device::Chip::Adapter interface,
    allowing access to the GPIO pins via the standard adapter API. See also
    Device::Chip::MCP23x17::Adapter.

TODO

      * Wrap the interrupt-related registers - GPINTEN, DEFVAL, INTCON,
      INTF, INTCAP. Support the interrupt-related bits in IOCON - MIRROR,
      ODR, INTPOL.

      * Support the general configuration bits in the IOCON register -
      DISSLW, HAEN.

      * Consider how easy/hard or indeed how useful it might be to support
      IOCON.BANK=1 configuration.

AUTHOR

    Paul Evans <leonerd@leonerd.org.uk>