3 * Extend wiringPi with the MCP 23016 I2C GPIO expander chip
4 * Copyright (c) 2013 Gordon Henderson
5 ***********************************************************************
6 * This file is part of wiringPi:
7 * https://projects.drogon.net/raspberry-pi/wiringpi/
9 * wiringPi is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as
11 * published by the Free Software Foundation, either version 3 of the
12 * License, or (at your option) any later version.
14 * wiringPi is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with wiringPi.
21 * If not, see <http://www.gnu.org/licenses/>.
22 ***********************************************************************
29 #include "wiringPiI2C.h"
32 #include "mcp23016reg.h"
37 *********************************************************************************
40 static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
44 pin -= node->pinBase ;
46 if (pin < 8) // Bank A
47 reg = MCP23016_IODIR0 ;
50 reg = MCP23016_IODIR1 ;
55 old = wiringPiI2CReadReg8 (node->fd, reg) ;
62 wiringPiI2CWriteReg8 (node->fd, reg, old) ;
68 *********************************************************************************
71 static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
75 pin -= node->pinBase ; // Pin now 0-15
77 bit = 1 << (pin & 7) ;
79 if (pin < 8) // Bank A
88 wiringPiI2CWriteReg8 (node->fd, MCP23016_GP0, old) ;
100 wiringPiI2CWriteReg8 (node->fd, MCP23016_GP1, old) ;
108 *********************************************************************************
111 static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
113 int mask, value, gpio ;
115 pin -= node->pinBase ;
117 if (pin < 8) // Bank A
118 gpio = MCP23016_GP0 ;
121 gpio = MCP23016_GP1 ;
126 value = wiringPiI2CReadReg8 (node->fd, gpio) ;
128 if ((value & mask) == 0)
137 * Create a new instance of an MCP23016 I2C GPIO interface. We know it
138 * has 16 pins, so all we need to know here is the I2C address and the
139 * user-defined pin base.
140 *********************************************************************************
143 int mcp23016Setup (const int pinBase, const int i2cAddress)
146 struct wiringPiNodeStruct *node ;
148 if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
151 wiringPiI2CWriteReg8 (fd, MCP23016_IOCON0, IOCON_INIT) ;
152 wiringPiI2CWriteReg8 (fd, MCP23016_IOCON1, IOCON_INIT) ;
154 node = wiringPiNewNode (pinBase, 16) ;
157 node->pinMode = myPinMode ;
158 node->digitalRead = myDigitalRead ;
159 node->digitalWrite = myDigitalWrite ;
160 node->data2 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT0) ;
161 node->data3 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT1) ;