aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarti Bolivar <mbolivar@leaflabs.com>2012-05-31 18:47:39 -0400
committerMarti Bolivar <mbolivar@leaflabs.com>2012-05-31 18:47:39 -0400
commit77abda29002216bd8186b430f484c98666a52339 (patch)
tree8e27da7d11e34836c4a0d5f3247597843ae5bf67
parent322a324963d8210dbbe529357b41e7c9ff8f8db6 (diff)
downloadlibrambutan-77abda29002216bd8186b430f484c98666a52339.tar.gz
librambutan-77abda29002216bd8186b430f484c98666a52339.zip
Replace shiftOut(), also fixing a possible bug.
The current shiftOut() is borrowed from Arduino, and is in an LGPL file. Replace that file with a new MIT-licensed version containing a new implementation. The new version brings the clock line LOW before starting, to make sure that the first pulse is detected if the clock line was previously HIGH. Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
-rw-r--r--wirish/rules.mk2
-rw-r--r--wirish/wirish_shift.cpp59
2 files changed, 29 insertions, 32 deletions
diff --git a/wirish/rules.mk b/wirish/rules.mk
index 5e00a5f..0b0b82c 100644
--- a/wirish/rules.mk
+++ b/wirish/rules.mk
@@ -24,6 +24,7 @@ cppSRCS_$(d) := boards.cpp
cppSRCS_$(d) += cxxabi-compat.cpp
cppSRCS_$(d) += wirish_digital.cpp
cppSRCS_$(d) += wirish_time.cpp
+cppSRCS_$(d) += wirish_shift.cpp
cppSRCS_$(d) += $(MCU_SERIES)/boards_setup.cpp
cppSRCS_$(d) += $(MCU_SERIES)/wirish_digital.cpp
cppSRCS_$(d) += $(WIRISH_BOARD_PATH)/board.cpp
@@ -34,7 +35,6 @@ cppSRCS_$(d) += $(WIRISH_BOARD_PATH)/board.cpp
# HardwareSPI.cpp \
# HardwareTimer.cpp \
# usb_serial.cpp \
-# wirish_shift.cpp \
# wirish_analog.cpp \
# pwm.cpp \
# ext_interrupts.cpp
diff --git a/wirish/wirish_shift.cpp b/wirish/wirish_shift.cpp
index 0f24f59..a032d50 100644
--- a/wirish/wirish_shift.cpp
+++ b/wirish/wirish_shift.cpp
@@ -1,40 +1,37 @@
-/*
- * wiring_shift.c - shiftOut() function
- * Part of Arduino - http://www.arduino.cc/
+/******************************************************************************
+ * The MIT License
*
- * Copyright (c) 2005-2006 David A. Mellis
+ * Copyright (c) 2012 LeafLabs, LLC.
*
- * This library 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 2.1 of
- * the License, or (at your option) any later version.
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
*
- * This library 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.
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
- *
- * $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
- */
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *****************************************************************************/
#include <wirish/wirish.h>
-void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 val) {
- int i;
-
- for (i = 0; i < 8; i++) {
- if (bitOrder == LSBFIRST) {
- digitalWrite(dataPin, !!(val & (1 << i)));
- } else {
- digitalWrite(dataPin, !!(val & (1 << (7 - i))));
- }
-
- digitalWrite(clockPin, HIGH);
- digitalWrite(clockPin, LOW);
+void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 value) {
+ digitalWrite(clockPin, LOW);
+ for (int i = 0; i < 8; i++) {
+ int bit = bitOrder == LSBFIRST ? i : (7 - i);
+ digitalWrite(dataPin, (value >> bit) & 0x1);
+ togglePin(clockPin);
+ togglePin(clockPin);
}
}