chiark / gitweb /
Added in the SN3218 LED controller IC - as used in the PiGlow
[wiringPi.git] / wiringPi / sn3218.c
1 /*
2  * sn3218.c:
3  *      Extend wiringPi with the SN3218 I2C LEd Driver
4  *      Copyright (c) 2012-2013 Gordon Henderson
5  ***********************************************************************
6  * This file is part of wiringPi:
7  *      https://projects.drogon.net/raspberry-pi/wiringpi/
8  *
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.
13  *
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.
18  *
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  ***********************************************************************
23  */
24
25 #include <wiringPi.h>
26 #include <wiringPiI2C.h>
27
28 #include "sn3218.h"
29
30 /*
31  * myAnalogWrite:
32  *      Write analog value on the given pin
33  *********************************************************************************
34  */
35
36 static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value)
37 {
38   int fd   = node->fd ;
39   int chan = 0x01 + (pin - node->pinBase) ;
40   
41   wiringPiI2CWriteReg8 (fd, chan, value & 0xFF) ;       // Value
42   wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ;               // Update
43 }
44
45 /*
46  * sn3218Setup:
47  *      Create a new wiringPi device node for an sn3218 on the Pi's
48  *      SPI interface.
49  *********************************************************************************
50  */
51
52 int sn3218Setup (const int pinBase)
53 {
54   int fd ;
55   struct wiringPiNodeStruct *node ;
56
57   if ((fd = wiringPiI2CSetup (0x54)) < 0)
58     return fd ;
59
60 // Setup the chip - initialise all 18 LEDs to off
61
62 //wiringPiI2CWriteReg8 (fd, 0x17, 0) ;          // Reset
63   wiringPiI2CWriteReg8 (fd, 0x00, 1) ;          // Not Shutdown
64   wiringPiI2CWriteReg8 (fd, 0x13, 0x3F) ;       // Enable LEDs  0- 5
65   wiringPiI2CWriteReg8 (fd, 0x14, 0x3F) ;       // Enable LEDs  6-11
66   wiringPiI2CWriteReg8 (fd, 0x15, 0x3F) ;       // Enable LEDs 12-17
67   wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ;       // Update
68   
69   node = wiringPiNewNode (pinBase, 18) ;
70
71   node->fd          = fd ;
72   node->analogWrite = myAnalogWrite ;
73
74   return 0 ;
75 }