From d24cf0630bb2653e95b93b89a12412c9bcf9a27b Mon Sep 17 00:00:00 2001 From: Gordon Henderson Date: Tue, 23 Jul 2013 17:52:27 +0100 Subject: [PATCH] Added in the SN3218 LED controller IC - as used in the PiGlow so write a little test program with it too. Updated gpio to use the sn3218 too. --- examples/Makefile | 6 ++++- examples/piglow.c | 51 +++++++++++++++++++++++++++++++++++++ gpio/extensions.c | 16 ++++++++++++ wiringPi/Makefile | 4 +++ wiringPi/sn3218.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ wiringPi/sn3218.h | 33 ++++++++++++++++++++++++ 6 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 examples/piglow.c create mode 100644 wiringPi/sn3218.c create mode 100644 wiringPi/sn3218.h diff --git a/examples/Makefile b/examples/Makefile index 8cc256f..8848b33 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -42,7 +42,7 @@ SRC = blink.c blink8.c blink12.c \ nes.c \ softPwm.c softTone.c \ delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ - rht03.c + rht03.c piglow.c OBJ = $(SRC:.c=.o) @@ -139,6 +139,10 @@ ds1302: ds1302.o @echo [link] @$(CC) -o $@ ds1302.o $(LDFLAGS) $(LDLIBS) +piglow: piglow.o + @echo [link] + @$(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS) + .c.o: @echo [CC] $< diff --git a/examples/piglow.c b/examples/piglow.c new file mode 100644 index 0000000..d3fe4b9 --- /dev/null +++ b/examples/piglow.c @@ -0,0 +1,51 @@ +/* + * piglow.c: + * Very simple demonstration of the PiGlow board. + * This uses the SN3218 directly - soon there will be a new PiGlow + * devLib device which will handle the PiGlow board on a more easy + * to use manner... + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see . + *********************************************************************** + */ + +#include +#include + +#define LED_BASE 533 + +int main (void) +{ + int i, j ; + + wiringPiSetupSys () ; + + sn3218Setup (LED_BASE) ; + + for (;;) + { + for (i = 0 ; i < 256 ; ++i) + for (j = 0 ; j < 18 ; ++j) + analogWrite (LED_BASE + j, i) ; + + for (i = 255 ; i >= 0 ; --i) + for (j = 0 ; j < 18 ; ++j) + analogWrite (LED_BASE + j, i) ; + } +} diff --git a/gpio/extensions.c b/gpio/extensions.c index 8be0ec0..c7e5308 100644 --- a/gpio/extensions.c +++ b/gpio/extensions.c @@ -49,6 +49,7 @@ #include #include #include +#include #include "extensions.h" @@ -467,6 +468,20 @@ static int doExtensionMcp4802 (char *progName, int pinBase, char *params) /* + * doExtensionSn3218: + * Analog Output (LED Driver) + * sn3218:base + ********************************************************************************* + */ + +static int doExtensionSn3218 (char *progName, int pinBase, char *params) +{ + sn3218Setup (pinBase) ; + return TRUE ; +} + + +/* * doExtensionMcp3422: * Analog IO * mcp3422:base:i2cAddr @@ -531,6 +546,7 @@ struct extensionFunctionStruct extensionFunctions [] = { "mcp3422", &doExtensionMcp3422 }, { "max31855", &doExtensionMax31855 }, { "max5322", &doExtensionMax5322 }, + { "sn3218", &doExtensionSn3218 }, { NULL, NULL }, } ; diff --git a/wiringPi/Makefile b/wiringPi/Makefile index 05dedec..ed4f6be 100644 --- a/wiringPi/Makefile +++ b/wiringPi/Makefile @@ -54,6 +54,7 @@ SRC = wiringPi.c \ pcf8574.c pcf8591.c \ mcp3002.c mcp3004.c mcp4802.c mcp3422.c \ max31855.c max5322.c \ + sn3218.c \ drc.c OBJ = $(SRC:.c=.o) @@ -112,6 +113,7 @@ install-headers: @install -m 0644 sr595.h $(DESTDIR)$(PREFIX)/include @install -m 0644 pcf8574.h $(DESTDIR)$(PREFIX)/include @install -m 0644 pcf8591.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 sn3218.h $(DESTDIR)$(PREFIX)/include .PHONEY: install install: $(DYNAMIC) install-headers @@ -151,6 +153,7 @@ uninstall: @rm -f $(DESTDIR)$(PREFIX)/include/sr595.h @rm -f $(DESTDIR)$(PREFIX)/include/pcf8574.h @rm -f $(DESTDIR)$(PREFIX)/include/pcf8591.h + @rm -f $(DESTDIR)$(PREFIX)/include/sn3218.h @rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPi.* @ldconfig @@ -184,4 +187,5 @@ mcp4802.o: wiringPi.h wiringPiSPI.h mcp4802.h mcp3422.o: wiringPi.h wiringPiI2C.h mcp3422.h max31855.o: wiringPi.h wiringPiSPI.h max31855.h max5322.o: wiringPi.h wiringPiSPI.h max5322.h +sn3218.o: wiringPi.h wiringPiI2C.h sn3218.h drc.o: wiringPi.h wiringSerial.h drc.h diff --git a/wiringPi/sn3218.c b/wiringPi/sn3218.c new file mode 100644 index 0000000..7ceb156 --- /dev/null +++ b/wiringPi/sn3218.c @@ -0,0 +1,75 @@ +/* + * sn3218.c: + * Extend wiringPi with the SN3218 I2C LEd Driver + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see . + *********************************************************************** + */ + +#include +#include + +#include "sn3218.h" + +/* + * myAnalogWrite: + * Write analog value on the given pin + ********************************************************************************* + */ + +static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int fd = node->fd ; + int chan = 0x01 + (pin - node->pinBase) ; + + wiringPiI2CWriteReg8 (fd, chan, value & 0xFF) ; // Value + wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update +} + +/* + * sn3218Setup: + * Create a new wiringPi device node for an sn3218 on the Pi's + * SPI interface. + ********************************************************************************* + */ + +int sn3218Setup (const int pinBase) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (0x54)) < 0) + return fd ; + +// Setup the chip - initialise all 18 LEDs to off + +//wiringPiI2CWriteReg8 (fd, 0x17, 0) ; // Reset + wiringPiI2CWriteReg8 (fd, 0x00, 1) ; // Not Shutdown + wiringPiI2CWriteReg8 (fd, 0x13, 0x3F) ; // Enable LEDs 0- 5 + wiringPiI2CWriteReg8 (fd, 0x14, 0x3F) ; // Enable LEDs 6-11 + wiringPiI2CWriteReg8 (fd, 0x15, 0x3F) ; // Enable LEDs 12-17 + wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update + + node = wiringPiNewNode (pinBase, 18) ; + + node->fd = fd ; + node->analogWrite = myAnalogWrite ; + + return 0 ; +} diff --git a/wiringPi/sn3218.h b/wiringPi/sn3218.h new file mode 100644 index 0000000..580d5f9 --- /dev/null +++ b/wiringPi/sn3218.h @@ -0,0 +1,33 @@ +/* + * sn3218.c: + * Extend wiringPi with the SN3218 I2C LED driver board. + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see . + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int sn3218Setup (int pinBase) ; + +#ifdef __cplusplus +} +#endif