diff options
author | Michael Hope <michael.hope@linaro.org> | 2010-09-29 20:45:57 +1300 |
---|---|---|
committer | Michael Hope <michael.hope@linaro.org> | 2010-09-29 20:45:57 +1300 |
commit | 6fcd4cd306dbecf56f5b0b506a3c23762d1219fa (patch) | |
tree | 467125eca5a2e6706001cad8e09bc475e58a12d9 /wirish | |
parent | 368e4fc1662c2594b2a0908900713a2555a3ed8e (diff) | |
parent | adde11b099ff5dad176e410279d21feac39d2c7e (diff) | |
download | librambutan-6fcd4cd306dbecf56f5b0b506a3c23762d1219fa.tar.gz librambutan-6fcd4cd306dbecf56f5b0b506a3c23762d1219fa.zip |
Merge remote branch 'upstream/master'
Diffstat (limited to 'wirish')
-rw-r--r-- | wirish/HardwareTimer.cpp | 56 | ||||
-rw-r--r-- | wirish/HardwareTimer.h | 62 | ||||
-rw-r--r-- | wirish/Print.cpp | 307 | ||||
-rw-r--r-- | wirish/Print.h | 39 | ||||
-rw-r--r-- | wirish/WProgram.h | 4 | ||||
-rw-r--r-- | wirish/bits.h | 38 | ||||
-rw-r--r-- | wirish/boards.h | 337 | ||||
-rw-r--r-- | wirish/comm/HardwareSPI.cpp | 78 | ||||
-rw-r--r-- | wirish/comm/HardwareSPI.h | 40 | ||||
-rw-r--r-- | wirish/comm/HardwareSerial.cpp | 28 | ||||
-rw-r--r-- | wirish/comm/HardwareSerial.h | 54 | ||||
-rw-r--r-- | wirish/ext_interrupts.c | 43 | ||||
-rw-r--r-- | wirish/ext_interrupts.h | 15 | ||||
-rw-r--r-- | wirish/io.h | 12 | ||||
-rw-r--r-- | wirish/pwm.c | 9 | ||||
-rw-r--r-- | wirish/pwm.h | 6 | ||||
-rw-r--r-- | wirish/time.c | 20 | ||||
-rw-r--r-- | wirish/time.h | 32 | ||||
-rw-r--r-- | wirish/usb_serial.cpp | 41 | ||||
-rw-r--r-- | wirish/usb_serial.h | 36 | ||||
-rw-r--r-- | wirish/wirish.c | 69 | ||||
-rw-r--r-- | wirish/wirish.h | 22 | ||||
-rw-r--r-- | wirish/wirish_analog.c | 12 | ||||
-rw-r--r-- | wirish/wirish_digital.c | 19 | ||||
-rw-r--r-- | wirish/wirish_math.cpp | 72 | ||||
-rw-r--r-- | wirish/wirish_math.h | 16 | ||||
-rw-r--r-- | wirish/wirish_shift.c | 54 |
27 files changed, 809 insertions, 712 deletions
diff --git a/wirish/HardwareTimer.cpp b/wirish/HardwareTimer.cpp index 99863c1..6fbad8b 100644 --- a/wirish/HardwareTimer.cpp +++ b/wirish/HardwareTimer.cpp @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Bryan Newbold. @@ -20,7 +20,7 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @brief wirish timer class to manage the four 16-bit timer peripherals @@ -43,99 +43,127 @@ HardwareTimer::HardwareTimer(uint8 timerNum) { void HardwareTimer::resume(void) { timer_resume(this->timerNum); } + void HardwareTimer::pause(void) { timer_pause(this->timerNum); } + void HardwareTimer::setPrescaleFactor(uint16 factor) { // The prescaler register is zero-indexed timer_set_prescaler(this->timerNum, factor-1); } + void HardwareTimer::setOverflow(uint16 val) { this->overflow = val; timer_set_reload(this->timerNum, val); } -void HardwareTimer::setCount(uint16 val) { - if(val > this->overflow) + +void HardwareTimer::setCount(uint16 val) { + if(val > this->overflow) { val = this->overflow; + } timer_set_count(this->timerNum, val); } + uint16 HardwareTimer::getCount(void) { return timer_get_count(this->timerNum); } -// This function will set the prescaler and overflow to get -// a period of the given length with the most resolution; -// the return value is the overflow value and thus the largest -// value that can be set as a compare. +/* This function will set the prescaler and overflow to get a period + * of the given length with the most resolution; the return value is + * the overflow value and thus the largest value that can be set as a + * compare. */ uint16 HardwareTimer::setPeriod(uint32 microseconds) { // XXX: 72MHz shouldn't be hard coded in here... global define? - + // Not the best way to handle this edge case? if(!microseconds) { setPrescaleFactor(1); setOverflow(1); return this->overflow; } + // With a prescale factor of 1, there are 72counts/ms uint16 ps = ((microseconds*72)/65536) + 1; setPrescaleFactor(ps); + // Finally, this overflow will always be less than 65536 setOverflow(((microseconds*72)/ps) - 1); - return this->overflow; + return this->overflow; } + void HardwareTimer::setChannel1Mode(uint8 mode) { timer_set_mode(this->timerNum,1,mode); } + void HardwareTimer::setChannel2Mode(uint8 mode) { timer_set_mode(this->timerNum,2,mode); } + void HardwareTimer::setChannel3Mode(uint8 mode) { timer_set_mode(this->timerNum,3,mode); } + void HardwareTimer::setChannel4Mode(uint8 mode) { timer_set_mode(this->timerNum,4,mode); } + void HardwareTimer::setCompare1(uint16 val) { - if(val > this->overflow) + if(val > this->overflow) { val = this->overflow; + } timer_set_compare_value(this->timerNum,1,val); } + void HardwareTimer::setCompare2(uint16 val) { - if(val > this->overflow) + if(val > this->overflow) { val = this->overflow; + } timer_set_compare_value(this->timerNum,2,val); } + void HardwareTimer::setCompare3(uint16 val) { - if(val > this->overflow) + if(val > this->overflow) { val = this->overflow; + } timer_set_compare_value(this->timerNum,3,val); } + void HardwareTimer::setCompare4(uint16 val) { - if(val > this->overflow) + if(val > this->overflow) { val = this->overflow; + } timer_set_compare_value(this->timerNum,4,val); } + void HardwareTimer::attachCompare1Interrupt(voidFuncPtr handler) { timer_attach_interrupt(this->timerNum,1,handler); } + void HardwareTimer::attachCompare2Interrupt(voidFuncPtr handler) { timer_attach_interrupt(this->timerNum,2,handler); } + void HardwareTimer::attachCompare3Interrupt(voidFuncPtr handler) { timer_attach_interrupt(this->timerNum,3,handler); } + void HardwareTimer::attachCompare4Interrupt(voidFuncPtr handler) { timer_attach_interrupt(this->timerNum,4,handler); } + void HardwareTimer::detachCompare1Interrupt(void) { timer_detach_interrupt(this->timerNum,1); } + void HardwareTimer::detachCompare2Interrupt(void) { timer_detach_interrupt(this->timerNum,2); } + void HardwareTimer::detachCompare3Interrupt(void) { timer_detach_interrupt(this->timerNum,3); } + void HardwareTimer::detachCompare4Interrupt(void) { timer_detach_interrupt(this->timerNum,4); } diff --git a/wirish/HardwareTimer.h b/wirish/HardwareTimer.h index aa48718..c6e11c8 100644 --- a/wirish/HardwareTimer.h +++ b/wirish/HardwareTimer.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Bryan Newbold. @@ -20,7 +20,7 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @brief wirish timer class to manage the four 16-bit timer peripherals @@ -30,38 +30,38 @@ #define _TIMER_H_ class HardwareTimer { - private: - uint16 overflow; - uint8 timerNum; + private: + uint16 overflow; + uint8 timerNum; - public: - HardwareTimer(uint8 timer_num); + public: + HardwareTimer(uint8 timer_num); - void pause(void); - void resume(void); - void setPrescaleFactor(uint16 factor); - void setOverflow(uint16 val); // truncates to overflow - void setCount(uint16 val); // truncates to overflow - uint16 getCount(void); + void pause(void); + void resume(void); + void setPrescaleFactor(uint16 factor); + void setOverflow(uint16 val); // truncates to overflow + void setCount(uint16 val); // truncates to overflow + uint16 getCount(void); - // tries to set prescaler and overflow wisely; returns overflow - uint16 setPeriod(uint32 microseconds); - void setChannel1Mode(uint8 mode); - void setChannel2Mode(uint8 mode); - void setChannel3Mode(uint8 mode); - void setChannel4Mode(uint8 mode); - void setCompare1(uint16 val); // truncates to overflow - void setCompare2(uint16 val); // truncates to overflow - void setCompare3(uint16 val); // truncates to overflow - void setCompare4(uint16 val); // truncates to overflow - void attachCompare1Interrupt(voidFuncPtr handler); - void attachCompare2Interrupt(voidFuncPtr handler); - void attachCompare3Interrupt(voidFuncPtr handler); - void attachCompare4Interrupt(voidFuncPtr handler); - void detachCompare1Interrupt(void); - void detachCompare2Interrupt(void); - void detachCompare3Interrupt(void); - void detachCompare4Interrupt(void); + // tries to set prescaler and overflow wisely; returns overflow + uint16 setPeriod(uint32 microseconds); + void setChannel1Mode(uint8 mode); + void setChannel2Mode(uint8 mode); + void setChannel3Mode(uint8 mode); + void setChannel4Mode(uint8 mode); + void setCompare1(uint16 val); // truncates to overflow + void setCompare2(uint16 val); // truncates to overflow + void setCompare3(uint16 val); // truncates to overflow + void setCompare4(uint16 val); // truncates to overflow + void attachCompare1Interrupt(voidFuncPtr handler); + void attachCompare2Interrupt(voidFuncPtr handler); + void attachCompare3Interrupt(voidFuncPtr handler); + void attachCompare4Interrupt(voidFuncPtr handler); + void detachCompare1Interrupt(void); + void detachCompare2Interrupt(void); + void detachCompare3Interrupt(void); + void detachCompare4Interrupt(void); }; extern HardwareTimer Timer1; diff --git a/wirish/Print.cpp b/wirish/Print.cpp index 9baa757..c66ca61 100644 --- a/wirish/Print.cpp +++ b/wirish/Print.cpp @@ -1,213 +1,190 @@ /* - Print.cpp - Base class that provides print() and println() - Copyright (c) 2008 David A. Mellis. All right reserved. - - 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. - - 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. - - 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Modified 23 November 2006 by David A. Mellis + * Print.cpp - Base class that provides print() and println() + * Copyright (c) 2008 David A. Mellis. All right reserved. + * + * 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. + * + * 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. + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + * Modified 23 November 2006 by David A. Mellis */ #include "wirish.h" #include "Print.h" -// Public Methods ////////////////////////////////////////////////////////////// - -/* default implementation: may be overridden */ -void Print::write(const char *str) -{ - while (*str) - write(*str++); -} - -/* default implementation: may be overridden */ -void Print::write(void *buffer, uint32 size) -{ - uint8 *ch = (uint8*)buffer; - while (size--) { - write(*ch++); - } -} +//------------------------------ Public Methods ------------------------------- -void Print::print(uint8 b) -{ - this->write(b); +void Print::write(const char *str) { + while (*str) + write(*str++); } -void Print::print(char c) -{ - print((byte) c); +void Print::write(void *buffer, uint32 size) { + uint8 *ch = (uint8*)buffer; + while (size--) { + write(*ch++); + } } -void Print::print(const char str[]) -{ - write(str); +void Print::print(uint8 b) { + this->write(b); } -void Print::print(int n) -{ - print((long) n); +void Print::print(char c) { + print((byte) c); } -void Print::print(unsigned int n) -{ - print((unsigned long) n); +void Print::print(const char str[]) { + write(str); } -void Print::print(long n) -{ - if (n < 0) { - print('-'); - n = -n; - } - printNumber(n, 10); +void Print::print(int n) { + print((long) n); } -void Print::print(unsigned long n) -{ - printNumber(n, 10); +void Print::print(unsigned int n) { + print((unsigned long) n); } -void Print::print(long n, int base) -{ - if (base == 0) - print((char) n); - else if (base == 10) - print(n); - else - printNumber(n, base); +void Print::print(long n) { + if (n < 0) { + print('-'); + n = -n; + } + printNumber(n, 10); } -void Print::print(double n) -{ - printFloat(n, 2); +void Print::print(unsigned long n) { + printNumber(n, 10); } -void Print::println(void) -{ - print('\r'); - print('\n'); +void Print::print(long n, int base) { + if (base == 0) { + print((char) n); + } else if (base == 10) { + print(n); + } else { + printNumber(n, base); + } } -void Print::println(char c) -{ - print(c); - println(); +void Print::print(double n) { + printFloat(n, 2); } -void Print::println(const char c[]) -{ - print(c); - println(); +void Print::println(void) { + print('\r'); + print('\n'); } -void Print::println(uint8 b) -{ - print(b); - println(); +void Print::println(char c) { + print(c); + println(); } -void Print::println(int n) -{ - print(n); - println(); +void Print::println(const char c[]) { + print(c); + println(); } -void Print::println(unsigned int n) -{ - print(n); - println(); +void Print::println(uint8 b) { + print(b); + println(); } -void Print::println(long n) -{ - print(n); - println(); +void Print::println(int n) { + print(n); + println(); } -void Print::println(unsigned long n) -{ - print(n); - println(); +void Print::println(unsigned int n) { + print(n); + println(); } -void Print::println(long n, int base) -{ - print(n, base); - println(); +void Print::println(long n) { + print(n); + println(); } -void Print::println(double n) -{ - print(n); - println(); +void Print::println(unsigned long n) { + print(n); + println(); } -// Private Methods ///////////////////////////////////////////////////////////// - -void Print::printNumber(unsigned long n, uint8 base) -{ - unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. - unsigned long i = 0; - - if (n == 0) { - print('0'); - return; - } - - while (n > 0) { - buf[i++] = n % base; - n /= base; - } - - for (; i > 0; i--) - print((char) (buf[i - 1] < 10 ? - '0' + buf[i - 1] : - 'A' + buf[i - 1] - 10)); +void Print::println(long n, int base) { + print(n, base); + println(); } -void Print::printFloat(double number, uint8 digits) -{ - // Handle negative numbers - if (number < 0.0) - { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - for (uint8 i=0; i<digits; ++i) - rounding /= 10.0; - - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits > 0) - print("."); - - // Extract digits from the remainder one at a time - while (digits-- > 0) - { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } +void Print::println(double n) { + print(n); + println(); +} + +//------------------------------ Private Methods ------------------------------ + +void Print::printNumber(unsigned long n, uint8 base) { + unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. + unsigned long i = 0; + + if (n == 0) { + print('0'); + return; + } + + while (n > 0) { + buf[i++] = n % base; + n /= base; + } + + for (; i > 0; i--) + print((char) (buf[i - 1] < 10 ? + '0' + buf[i - 1] : + 'A' + buf[i - 1] - 10)); +} + +void Print::printFloat(double number, uint8 digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8 i=0; i<digits; ++i) { + rounding /= 10.0; + } + + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits > 0) { + print("."); + } + + // Extract digits from the remainder one at a time + while (digits-- > 0) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } } diff --git a/wirish/Print.h b/wirish/Print.h index 9c03978..dc21183 100644 --- a/wirish/Print.h +++ b/wirish/Print.h @@ -1,21 +1,22 @@ /* - Print.h - Base class that provides print() and println() - Copyright (c) 2008 David A. Mellis. All right reserved. - - 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. - - 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. - - 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * Print.h - Base class that provides print() and println() + * Copyright (c) 2008 David A. Mellis. All right reserved. + * + * 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. + * + * 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. + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA. + */ #ifndef Print_h #define Print_h @@ -31,10 +32,10 @@ class Print { - private: + private: void printNumber(unsigned long, uint8); void printFloat(double, uint8); - public: + public: virtual void write(uint8) = 0; virtual void write(const char *str); virtual void write(void *, uint32); diff --git a/wirish/WProgram.h b/wirish/WProgram.h index 9143991..36984ff 100644 --- a/wirish/WProgram.h +++ b/wirish/WProgram.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 LeafLabs LLC. @@ -20,7 +20,7 @@ * 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.h" diff --git a/wirish/bits.h b/wirish/bits.h index 7ebea80..7b51e5e 100644 --- a/wirish/bits.h +++ b/wirish/bits.h @@ -1,23 +1,23 @@ /*
- Part of Arduino - http://www.arduino.cc/
-
- Copyright (c) 2005-2006 David A. Mellis
-
- 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.
-
- 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.
-
- 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
-*/
+ * Part of Arduino - http://www.arduino.cc/
+ *
+ * Copyright (c) 2005-2006 David A. Mellis
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
// BIT DEFINITION
diff --git a/wirish/boards.h b/wirish/boards.h index 03d0b0e..eed3e26 100644 --- a/wirish/boards.h +++ b/wirish/boards.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Bryan Newbold. @@ -20,12 +20,13 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ -// This file contains BOARD-specific pin mapping tables. To add a new board -// type, copy the "BOARD_maple" section below and edit it as needed, then -// update your build toolchain with a new "BOARD" type. This must match the -// seperate MCU type (which determines the ../libmaple configuration). +/* This file contains board-specific pin mapping tables. To add a new board + * type, copy the "BOARD_maple" section below and edit it as needed, then + * update your build toolchain with a new "BOARD" type. This must match the + * separate MCU type (which determines the ../libmaple configuration). + */ #ifndef _BOARDS_H_ #define _BOARDS_H_ @@ -36,10 +37,10 @@ #include "exti.h" #ifdef __cplusplus -extern "C"{ +extern "C" { #endif -// Set of all possible digital pin names; not all boards have all these +/* Set of all possible digital pin names; not all boards have all these */ enum { D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31, @@ -50,7 +51,7 @@ enum { D92, D93, D94, D95, D96, D97, D98, D99, D100, D101, D102, D103, D104, D105, D106, D107, D108, D109, D110, D111, }; -// Set of all possible analog pin names; not all boards have all these +/* Set of all possible analog pin names; not all boards have all these */ enum { ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, ADC6, ADC7, ADC8, ADC9, ADC10, ADC11, ADC12, ADC13, ADC14, ADC15, ADC16, ADC17, ADC18, ADC19, ADC20, }; @@ -58,90 +59,111 @@ enum { #define ADC_INVALID 0xFFFFFFFF #define TIMER_INVALID (TimerCCR)0xFFFFFFFF -// Types used for the tables below +/* Types used for the tables below */ typedef struct PinMapping { GPIO_Port *port; uint32 pin; uint32 adc; TimerCCR timer_channel; + uint32 exti_port; } PinMapping; -typedef struct ExtiInfo { - uint8 channel; - uint8 port; -} ExtiInfo; - -// LeafLabs Maple rev3, rev4 +/* LeafLabs Maple rev3, rev4 */ #ifdef BOARD_maple #define CYCLES_PER_MICROSECOND 72 #define MAPLE_RELOAD_VAL 71999 /* takes a cycle to reload */ static __attribute__ ((unused)) PinMapping PIN_MAP[NR_GPIO_PINS] = { - {GPIOA_BASE, 3, ADC3, TIMER2_CH4_CCR}, // D0/PA3 - {GPIOA_BASE, 2, ADC2, TIMER2_CH3_CCR}, // D1/PA2 - {GPIOA_BASE, 0, ADC0, TIMER2_CH1_CCR}, // D2/PA0 - {GPIOA_BASE, 1, ADC1, TIMER2_CH2_CCR}, // D3/PA1 - {GPIOB_BASE, 5, ADC_INVALID, TIMER_INVALID}, // D4/PB5 - {GPIOB_BASE, 6, ADC_INVALID, TIMER4_CH1_CCR}, // D5/PB6 - {GPIOA_BASE, 8, ADC_INVALID, TIMER1_CH1_CCR}, // D6/PA8 - {GPIOA_BASE, 9, ADC_INVALID, TIMER1_CH2_CCR}, // D7/PA9 - {GPIOA_BASE, 10, ADC_INVALID, TIMER1_CH3_CCR}, // D8/PA10 - {GPIOB_BASE, 7, ADC_INVALID, TIMER4_CH2_CCR}, // D9/PB7 - {GPIOA_BASE, 4, ADC4, TIMER_INVALID}, // D10/PA4 - {GPIOA_BASE, 7, ADC7, TIMER3_CH2_CCR}, // D11/PA7 - {GPIOA_BASE, 6, ADC6, TIMER3_CH1_CCR}, // D12/PA6 - {GPIOA_BASE, 5, ADC5, TIMER_INVALID}, // D13/PA5 - {GPIOB_BASE, 8, ADC_INVALID, TIMER4_CH3_CCR}, // D14/PB8 - /* Little header */ - {GPIOC_BASE, 0, ADC10, TIMER_INVALID}, // D15/PC0 - {GPIOC_BASE, 1, ADC11, TIMER_INVALID}, // D16/PC1 - {GPIOC_BASE, 2, ADC12, TIMER_INVALID}, // D17/PC2 - {GPIOC_BASE, 3, ADC13, TIMER_INVALID}, // D18/PC3 - {GPIOC_BASE, 4, ADC14, TIMER_INVALID}, // D19/PC4 - {GPIOC_BASE, 5, ADC15, TIMER_INVALID}, // D20/PC5 - /* External header */ - {GPIOC_BASE, 13, ADC_INVALID, TIMER_INVALID}, // D21/PC13 - {GPIOC_BASE, 14, ADC_INVALID, TIMER_INVALID}, // D22/PC14 - {GPIOC_BASE, 15, ADC_INVALID, TIMER_INVALID}, // D23/PC15 - {GPIOB_BASE, 9, ADC_INVALID, TIMER4_CH4_CCR}, // D24/PB9 - {GPIOD_BASE, 2, ADC_INVALID, TIMER_INVALID}, // D25/PD2 - {GPIOC_BASE, 10, ADC_INVALID, TIMER_INVALID}, // D26/PC10 - {GPIOB_BASE, 0, ADC8, TIMER3_CH3_CCR}, // D27/PB0 - {GPIOB_BASE, 1, ADC9, TIMER3_CH4_CCR}, // D28/PB1 - {GPIOB_BASE, 10, ADC_INVALID, TIMER_INVALID}, // D29/PB10 - {GPIOB_BASE, 11, ADC_INVALID, TIMER_INVALID}, // D30/PB11 - {GPIOB_BASE, 12, ADC_INVALID, TIMER_INVALID}, // D31/PB12 - {GPIOB_BASE, 13, ADC_INVALID, TIMER_INVALID}, // D32/PB13 - {GPIOB_BASE, 14, ADC_INVALID, TIMER_INVALID}, // D33/PB14 - {GPIOB_BASE, 15, ADC_INVALID, TIMER_INVALID}, // D34/PB15 - {GPIOC_BASE, 6, ADC_INVALID, TIMER_INVALID}, // D35/PC6 - {GPIOC_BASE, 7, ADC_INVALID, TIMER_INVALID}, // D36/PC7 - {GPIOC_BASE, 8, ADC_INVALID, TIMER_INVALID}, // D37/PC8 - {GPIOC_BASE, 9, ADC_INVALID, TIMER_INVALID} // D38/PC9 (BUT) - }; + /* D0/PA3 */ + {GPIOA_BASE, 3, ADC3, TIMER2_CH4_CCR, EXTI_CONFIG_PORTA}, + /* D1/PA2 */ + {GPIOA_BASE, 2, ADC2, TIMER2_CH3_CCR, EXTI_CONFIG_PORTA}, + /* D2/PA0 */ + {GPIOA_BASE, 0, ADC0, TIMER2_CH1_CCR, EXTI_CONFIG_PORTA}, + /* D3/PA1 */ + {GPIOA_BASE, 1, ADC1, TIMER2_CH2_CCR, EXTI_CONFIG_PORTA}, + /* D4/PB5 */ + {GPIOB_BASE, 5, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTB}, + /* D5/PB6 */ + {GPIOB_BASE, 6, ADC_INVALID, TIMER4_CH1_CCR, EXTI_CONFIG_PORTB}, + /* D6/PA8 */ + {GPIOA_BASE, 8, ADC_INVALID, TIMER1_CH1_CCR, EXTI_CONFIG_PORTA}, + /* D7/PA9 */ + {GPIOA_BASE, 9, ADC_INVALID, TIMER1_CH2_CCR, EXTI_CONFIG_PORTA}, + /* D8/PA10 */ + {GPIOA_BASE, 10, ADC_INVALID, TIMER1_CH3_CCR, EXTI_CONFIG_PORTA}, + /* D9/PB7 */ + {GPIOB_BASE, 7, ADC_INVALID, TIMER4_CH2_CCR, EXTI_CONFIG_PORTB}, + /* D10/PA4 */ + {GPIOA_BASE, 4, ADC4, TIMER_INVALID, EXTI_CONFIG_PORTA}, + /* D11/PA7 */ + {GPIOA_BASE, 7, ADC7, TIMER3_CH2_CCR, EXTI_CONFIG_PORTA}, + /* D12/PA6 */ + {GPIOA_BASE, 6, ADC6, TIMER3_CH1_CCR, EXTI_CONFIG_PORTA}, + /* D13/PA5 */ + {GPIOA_BASE, 5, ADC5, TIMER_INVALID, EXTI_CONFIG_PORTA}, + /* D14/PB8 */ + {GPIOB_BASE, 8, ADC_INVALID, TIMER4_CH3_CCR, EXTI_CONFIG_PORTB}, - static __attribute__ ((unused)) ExtiInfo PIN_TO_EXTI_CHANNEL[NR_GPIO_PINS] = - { - {EXTI3, EXTI_CONFIG_PORTA}, // D0/PA3 - {EXTI2, EXTI_CONFIG_PORTA}, // D1/PA2 - {EXTI0, EXTI_CONFIG_PORTA}, // D2/PA0 - {EXTI1, EXTI_CONFIG_PORTA}, // D3/PA1 - {EXTI5, EXTI_CONFIG_PORTB}, // D4/PB5 - {EXTI6, EXTI_CONFIG_PORTB}, // D5/PB6 - {EXTI8, EXTI_CONFIG_PORTA}, // D6/PA8 - {EXTI9, EXTI_CONFIG_PORTA}, // D7/PA9 - {EXTI10, EXTI_CONFIG_PORTA}, // D8/PA10 - {EXTI7, EXTI_CONFIG_PORTB}, // D9/PB7 - {EXTI4, EXTI_CONFIG_PORTA}, // D10/PA4 - {EXTI7, EXTI_CONFIG_PORTA}, // D11/PA7 - {EXTI6, EXTI_CONFIG_PORTA}, // D12/PA6 - {EXTI5, EXTI_CONFIG_PORTA}, // D13/PA5 + /* Little header */ + + /* D15/PC0 */ + {GPIOC_BASE, 0, ADC10, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D16/PC1 */ + {GPIOC_BASE, 1, ADC11, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D17/PC2 */ + {GPIOC_BASE, 2, ADC12, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D18/PC3 */ + {GPIOC_BASE, 3, ADC13, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D19/PC4 */ + {GPIOC_BASE, 4, ADC14, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D20/PC5 */ + {GPIOC_BASE, 5, ADC15, TIMER_INVALID, EXTI_CONFIG_PORTC}, + + /* External header */ + + /* D21/PC13 */ + {GPIOC_BASE, 13, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D22/PC14 */ + {GPIOC_BASE, 14, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D23/PC15 */ + {GPIOC_BASE, 15, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D24/PB9 */ + {GPIOB_BASE, 9, ADC_INVALID, TIMER4_CH4_CCR, EXTI_CONFIG_PORTB}, + /* D25/PD2 */ + {GPIOD_BASE, 2, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTD}, + /* D26/PC10 */ + {GPIOC_BASE, 10, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D27/PB0 */ + {GPIOB_BASE, 0, ADC8, TIMER3_CH3_CCR, EXTI_CONFIG_PORTB}, + /* D28/PB1 */ + {GPIOB_BASE, 1, ADC9, TIMER3_CH4_CCR, EXTI_CONFIG_PORTB}, + /* D29/PB10 */ + {GPIOB_BASE, 10, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTB}, + /* D30/PB11 */ + {GPIOB_BASE, 11, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTB}, + /* D31/PB12 */ + {GPIOB_BASE, 12, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTB}, + /* D32/PB13 */ + {GPIOB_BASE, 13, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTB}, + /* D33/PB14 */ + {GPIOB_BASE, 14, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTB}, + /* D34/PB15 */ + {GPIOB_BASE, 15, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTB}, + /* D35/PC6 */ + {GPIOC_BASE, 6, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D36/PC7 */ + {GPIOC_BASE, 7, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* D37/PC8 */ + {GPIOC_BASE, 8, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC}, + /* PC9 (BUT) */ + {GPIOC_BASE, 9, ADC_INVALID, TIMER_INVALID, EXTI_CONFIG_PORTC} }; #endif -// LeafLabs Maple Native (prototype) +/* LeafLabs Maple Native (prototype) */ #ifdef BOARD_maple_native #define CYCLES_PER_MICROSECOND 72 @@ -149,65 +171,122 @@ typedef struct ExtiInfo { // TODO: static __attribute__ ((unused)) PinMapping PIN_MAP[NR_GPIO_PINS] = { - {GPIOA_BASE, 3, ADC3, TIMER2_CH4_CCR}, // D0/PA3 - {GPIOA_BASE, 2, ADC2, TIMER2_CH3_CCR}, // D1/PA2 - {GPIOA_BASE, 0, ADC0, TIMER2_CH1_CCR}, // D2/PA0 - {GPIOA_BASE, 1, ADC1, TIMER2_CH2_CCR}, // D3/PA1 - {GPIOB_BASE, 5, ADC_INVALID, TIMER_INVALID}, // D4/PB5 - {GPIOB_BASE, 6, ADC_INVALID, TIMER4_CH1_CCR}, // D5/PB6 - {GPIOA_BASE, 8, ADC_INVALID, TIMER1_CH1_CCR}, // D6/PA8 - {GPIOA_BASE, 9, ADC_INVALID, TIMER1_CH2_CCR}, // D7/PA9 - {GPIOA_BASE, 10, ADC_INVALID, TIMER1_CH3_CCR}, // D8/PA10 - {GPIOB_BASE, 7, ADC_INVALID, TIMER4_CH2_CCR}, // D9/PB7 - {GPIOA_BASE, 4, ADC4, TIMER_INVALID}, // D10/PA4 - {GPIOA_BASE, 7, ADC7, TIMER3_CH2_CCR}, // D11/PA7 - {GPIOA_BASE, 6, ADC6, TIMER3_CH1_CCR}, // D12/PA6 - {GPIOA_BASE, 5, ADC5, TIMER_INVALID}, // D13/PA5 - {GPIOB_BASE, 8, ADC_INVALID, TIMER4_CH3_CCR}, // D14/PB8 + /* D0/PA3 */ + {GPIOA_BASE, 3, ADC3, TIMER2_CH4_CCR}, + /* D1/PA2 */ + {GPIOA_BASE, 2, ADC2, TIMER2_CH3_CCR}, + /* D2/PA0 */ + {GPIOA_BASE, 0, ADC0, TIMER2_CH1_CCR}, + /* D3/PA1 */ + {GPIOA_BASE, 1, ADC1, TIMER2_CH2_CCR}, + /* D4/PB5 */ + {GPIOB_BASE, 5, ADC_INVALID, TIMER_INVALID}, + /* D5/PB6 */ + {GPIOB_BASE, 6, ADC_INVALID, TIMER4_CH1_CCR}, + /* D6/PA8 */ + {GPIOA_BASE, 8, ADC_INVALID, TIMER1_CH1_CCR}, + /* D7/PA9 */ + {GPIOA_BASE, 9, ADC_INVALID, TIMER1_CH2_CCR}, + /* D8/PA10 */ + {GPIOA_BASE, 10, ADC_INVALID, TIMER1_CH3_CCR}, + /* D9/PB7 */ + {GPIOB_BASE, 7, ADC_INVALID, TIMER4_CH2_CCR}, + /* D10/PA4 */ + {GPIOA_BASE, 4, ADC4, TIMER_INVALID}, + /* D11/PA7 */ + {GPIOA_BASE, 7, ADC7, TIMER3_CH2_CCR}, + /* D12/PA6 */ + {GPIOA_BASE, 6, ADC6, TIMER3_CH1_CCR}, + /* D13/PA5 */ + {GPIOA_BASE, 5, ADC5, TIMER_INVALID}, + /* D14/PB8 */ + {GPIOB_BASE, 8, ADC_INVALID, TIMER4_CH3_CCR}, + /* Little header */ - {GPIOC_BASE, 0, ADC10, TIMER_INVALID}, // D15/PC0 - {GPIOC_BASE, 1, ADC11, TIMER_INVALID}, // D16/PC1 - {GPIOC_BASE, 2, ADC12, TIMER_INVALID}, // D17/PC2 - {GPIOC_BASE, 3, ADC13, TIMER_INVALID}, // D18/PC3 - {GPIOC_BASE, 4, ADC14, TIMER_INVALID}, // D19/PC4 - {GPIOC_BASE, 5, ADC15, TIMER_INVALID}, // D20/PC5 + + /* D15/PC0 */ + {GPIOC_BASE, 0, ADC10, TIMER_INVALID}, + /* D16/PC1 */ + {GPIOC_BASE, 1, ADC11, TIMER_INVALID}, + /* D17/PC2 */ + {GPIOC_BASE, 2, ADC12, TIMER_INVALID}, + /* D18/PC3 */ + {GPIOC_BASE, 3, ADC13, TIMER_INVALID}, + /* D19/PC4 */ + {GPIOC_BASE, 4, ADC14, TIMER_INVALID}, + /* D20/PC5 */ + {GPIOC_BASE, 5, ADC15, TIMER_INVALID}, + /* External header */ - {GPIOC_BASE, 13, ADC_INVALID, TIMER_INVALID}, // D21/PC13 - {GPIOC_BASE, 14, ADC_INVALID, TIMER_INVALID}, // D22/PC14 - {GPIOC_BASE, 15, ADC_INVALID, TIMER_INVALID}, // D23/PC15 - {GPIOB_BASE, 9, ADC_INVALID, TIMER4_CH4_CCR}, // D24/PB9 - {GPIOD_BASE, 2, ADC_INVALID, TIMER_INVALID}, // D25/PD2 - {GPIOC_BASE, 10, ADC_INVALID, TIMER_INVALID}, // D26/PC10 - {GPIOB_BASE, 0, ADC8, TIMER3_CH3_CCR}, // D27/PB0 - {GPIOB_BASE, 1, ADC9, TIMER3_CH4_CCR}, // D28/PB1 - {GPIOB_BASE, 10, ADC_INVALID, TIMER_INVALID}, // D29/PB10 - {GPIOB_BASE, 11, ADC_INVALID, TIMER_INVALID}, // D30/PB11 - {GPIOB_BASE, 12, ADC_INVALID, TIMER_INVALID}, // D31/PB12 - {GPIOB_BASE, 13, ADC_INVALID, TIMER_INVALID}, // D32/PB13 - {GPIOB_BASE, 14, ADC_INVALID, TIMER_INVALID}, // D33/PB14 - {GPIOB_BASE, 15, ADC_INVALID, TIMER_INVALID}, // D34/PB15 - {GPIOC_BASE, 6, ADC_INVALID, TIMER_INVALID}, // D35/PC6 - {GPIOC_BASE, 7, ADC_INVALID, TIMER_INVALID}, // D36/PC7 - {GPIOC_BASE, 8, ADC_INVALID, TIMER_INVALID}, // D37/PC8 - {GPIOC_BASE, 9, ADC_INVALID, TIMER_INVALID} // D38/PC9 (BUT) + + /* D21/PC13 */ + {GPIOC_BASE, 13, ADC_INVALID, TIMER_INVALID}, + /* D22/PC14 */ + {GPIOC_BASE, 14, ADC_INVALID, TIMER_INVALID}, + /* D23/PC15 */ + {GPIOC_BASE, 15, ADC_INVALID, TIMER_INVALID}, + /* D24/PB9 */ + {GPIOB_BASE, 9, ADC_INVALID, TIMER4_CH4_CCR}, + /* D25/PD2 */ + {GPIOD_BASE, 2, ADC_INVALID, TIMER_INVALID}, + /* D26/PC10 */ + {GPIOC_BASE, 10, ADC_INVALID, TIMER_INVALID}, + /* D27/PB0 */ + {GPIOB_BASE, 0, ADC8, TIMER3_CH3_CCR}, + /* D28/PB1 */ + {GPIOB_BASE, 1, ADC9, TIMER3_CH4_CCR}, + /* D29/PB10 */ + {GPIOB_BASE, 10, ADC_INVALID, TIMER_INVALID}, + /* D30/PB11 */ + {GPIOB_BASE, 11, ADC_INVALID, TIMER_INVALID}, + /* D31/PB12 */ + {GPIOB_BASE, 12, ADC_INVALID, TIMER_INVALID}, + /* D32/PB13 */ + {GPIOB_BASE, 13, ADC_INVALID, TIMER_INVALID}, + /* D33/PB14 */ + {GPIOB_BASE, 14, ADC_INVALID, TIMER_INVALID}, + /* D34/PB15 */ + {GPIOB_BASE, 15, ADC_INVALID, TIMER_INVALID}, + /* D35/PC6 */ + {GPIOC_BASE, 6, ADC_INVALID, TIMER_INVALID}, + /* D36/PC7 */ + {GPIOC_BASE, 7, ADC_INVALID, TIMER_INVALID}, + /* D37/PC8 */ + {GPIOC_BASE, 8, ADC_INVALID, TIMER_INVALID}, + /* PC9 (BUT) */ + {GPIOC_BASE, 9, ADC_INVALID, TIMER_INVALID} }; - static __attribute__ ((unused)) ExtiInfo PIN_TO_EXTI_CHANNEL[NR_GPIO_PINS] = + static __attribute__((unused)) ExtiInfo PIN_TO_EXTI_CHANNEL[NR_GPIO_PINS] = { - {EXTI3, EXTI_CONFIG_PORTA}, // D0/PA3 - {EXTI2, EXTI_CONFIG_PORTA}, // D1/PA2 - {EXTI0, EXTI_CONFIG_PORTA}, // D2/PA0 - {EXTI1, EXTI_CONFIG_PORTA}, // D3/PA1 - {EXTI5, EXTI_CONFIG_PORTB}, // D4/PB5 - {EXTI6, EXTI_CONFIG_PORTB}, // D5/PB6 - {EXTI8, EXTI_CONFIG_PORTA}, // D6/PA8 - {EXTI9, EXTI_CONFIG_PORTA}, // D7/PA9 - {EXTI10, EXTI_CONFIG_PORTA}, // D8/PA10 - {EXTI7, EXTI_CONFIG_PORTB}, // D9/PB7 - {EXTI4, EXTI_CONFIG_PORTA}, // D10/PA4 - {EXTI7, EXTI_CONFIG_PORTA}, // D11/PA7 - {EXTI6, EXTI_CONFIG_PORTA}, // D12/PA6 - {EXTI5, EXTI_CONFIG_PORTA}, // D13/PA5 + /* D0/PA3 */ + {EXTI3, EXTI_CONFIG_PORTA}, + /* D1/PA2 */ + {EXTI2, EXTI_CONFIG_PORTA}, + /* D2/PA0 */ + {EXTI0, EXTI_CONFIG_PORTA}, + /* D3/PA1 */ + {EXTI1, EXTI_CONFIG_PORTA}, + /* D4/PB5 */ + {EXTI5, EXTI_CONFIG_PORTB}, + /* D5/PB6 */ + {EXTI6, EXTI_CONFIG_PORTB}, + /* D6/PA8 */ + {EXTI8, EXTI_CONFIG_PORTA}, + /* D7/PA9 */ + {EXTI9, EXTI_CONFIG_PORTA}, + /* D8/PA10 */ + {EXTI10, EXTI_CONFIG_PORTA}, + /* D9/PB7 */ + {EXTI7, EXTI_CONFIG_PORTB}, + /* D10/PA4 */ + {EXTI4, EXTI_CONFIG_PORTA}, + /* D11/PA7 */ + {EXTI7, EXTI_CONFIG_PORTA}, + /* D12/PA6 */ + {EXTI6, EXTI_CONFIG_PORTA}, + /* D13/PA5 */ + {EXTI5, EXTI_CONFIG_PORTA}, }; #endif diff --git a/wirish/comm/HardwareSPI.cpp b/wirish/comm/HardwareSPI.cpp index 5f42db7..20090f5 100644 --- a/wirish/comm/HardwareSPI.cpp +++ b/wirish/comm/HardwareSPI.cpp @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,7 +20,7 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @brief HardwareSPI "wiring-like" api for SPI @@ -52,14 +52,14 @@ #include "HardwareSPI.h" static const uint32 prescaleFactors[MAX_SPI_FREQS] = { - SPI_PRESCALE_2, // SPI_18MHZ - SPI_PRESCALE_4, // SPI_9MHZ - SPI_PRESCALE_8, // SPI_4_5MHZ - SPI_PRESCALE_16, // SPI_2_25MHZ - SPI_PRESCALE_32, // SPI_1_125MHZ - SPI_PRESCALE_64, // SPI_562_500KHZ - SPI_PRESCALE_128, // SPI_281_250KHZ - SPI_PRESCALE_256, // SPI_140_625KHZ + SPI_PRESCALE_2, // SPI_18MHZ + SPI_PRESCALE_4, // SPI_9MHZ + SPI_PRESCALE_8, // SPI_4_5MHZ + SPI_PRESCALE_16, // SPI_2_25MHZ + SPI_PRESCALE_32, // SPI_1_125MHZ + SPI_PRESCALE_64, // SPI_562_500KHZ + SPI_PRESCALE_128, // SPI_281_250KHZ + SPI_PRESCALE_256, // SPI_140_625KHZ }; /** @@ -78,37 +78,38 @@ static const uint32 prescaleFactors[MAX_SPI_FREQS] = { * @param mode SPI standard CPOL and CPHA levels */ void HardwareSPI::begin(SPIFrequency freq, uint32 endianness, uint32 mode) { - uint32 spi_num = this->spi_num; - uint32 prescale; - - if ((freq >= MAX_SPI_FREQS) || - !((endianness == LSBFIRST) || - (endianness == MSBFIRST)) || - (mode >= 4)) { - return; - } - - if (spi_num == 1) { - /* SPI1 is too fast for 140625 */ - if (freq == SPI_140_625KHZ) { - return; - } - - /* Turn off PWM on shared pins */ - timer_set_mode(TIMER3, 2, TIMER_DISABLED); - timer_set_mode(TIMER3, 1, TIMER_DISABLED); - } - - endianness = (endianness == LSBFIRST) ? SPI_LSBFIRST : SPI_MSBFIRST; - prescale = (spi_num == 1) ? prescaleFactors[freq + 1] : prescaleFactors[freq]; - - spi_init(spi_num, prescale, endianness, 0); + uint32 spi_num = this->spi_num; + uint32 prescale; + + if ((freq >= MAX_SPI_FREQS) || + !((endianness == LSBFIRST) || + (endianness == MSBFIRST)) || + (mode >= 4)) { + return; + } + + if (spi_num == 1) { + /* SPI1 is too fast for 140625 */ + if (freq == SPI_140_625KHZ) { + return; + } + + /* Turn off PWM on shared pins */ + timer_set_mode(TIMER3, 2, TIMER_DISABLED); + timer_set_mode(TIMER3, 1, TIMER_DISABLED); + } + + endianness = (endianness == LSBFIRST) ? SPI_LSBFIRST : SPI_MSBFIRST; + prescale = (spi_num == 1) ? + prescaleFactors[freq + 1] : + prescaleFactors[freq]; + + spi_init(spi_num, prescale, endianness, mode); } /** - * @brief Initialize a SPI peripheral with a default speed of 1.125 MHZ, MSBFIRST, - * mode 0 - * @param mode SPI standard CPOL and CPHA levels + * @brief Initialize a SPI peripheral with a default speed of 1.125 + * MHZ, MSBFIRST, mode 0 */ void HardwareSPI::begin(void) { begin(SPI_1_125MHZ, MSBFIRST, 0); @@ -126,7 +127,6 @@ uint8 HardwareSPI::send(uint8 *buf, uint32 len) { return spi_tx(this->spi_num, buf, len); } - /** * @brief read a byte from the spi peripheral * @return byte in the buffer diff --git a/wirish/comm/HardwareSPI.h b/wirish/comm/HardwareSPI.h index e606c0c..03d1ea1 100644 --- a/wirish/comm/HardwareSPI.h +++ b/wirish/comm/HardwareSPI.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,7 +20,7 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @brief HardwareSPI definitions @@ -30,28 +30,28 @@ #define _HARDWARESPI_H_ typedef enum SPIFrequency { - SPI_18MHZ = 0, - SPI_9MHZ = 1, - SPI_4_5MHZ = 2, - SPI_2_25MHZ = 3, - SPI_1_125MHZ = 4, - SPI_562_500KHZ = 5, - SPI_281_250KHZ = 6, - SPI_140_625KHZ = 7, - MAX_SPI_FREQS = 8, + SPI_18MHZ = 0, + SPI_9MHZ = 1, + SPI_4_5MHZ = 2, + SPI_2_25MHZ = 3, + SPI_1_125MHZ = 4, + SPI_562_500KHZ = 5, + SPI_281_250KHZ = 6, + SPI_140_625KHZ = 7, + MAX_SPI_FREQS = 8, } SPIFrequency; class HardwareSPI { - private: - uint32 spi_num; + private: + uint32 spi_num; - public: - HardwareSPI(uint32 spi_num); - void begin(void); - void begin(SPIFrequency freq, uint32 endianness, uint32 mode); - uint8 send(uint8 data); - uint8 send(uint8 *data, uint32 length); - uint8 recv(void); + public: + HardwareSPI(uint32 spi_num); + void begin(void); + void begin(SPIFrequency freq, uint32 endianness, uint32 mode); + uint8 send(uint8 data); + uint8 send(uint8 *data, uint32 length); + uint8 recv(void); }; #endif diff --git a/wirish/comm/HardwareSerial.cpp b/wirish/comm/HardwareSerial.cpp index 902b160..425c610 100644 --- a/wirish/comm/HardwareSerial.cpp +++ b/wirish/comm/HardwareSerial.cpp @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,12 +20,12 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @file HardwareSerial.cpp + * @file HardwareSerial.cpp * - * @brief Wiring-like serial api + * @brief Wiring-like serial api */ #include "wirish.h" @@ -68,18 +68,18 @@ void HardwareSerial::write(unsigned char ch) { } void HardwareSerial::begin(uint32 baud) { - if (baud > max_baud) { - return; - } + if (baud > max_baud) { + return; + } - gpio_set_mode(gpio_port, tx_pin, GPIO_MODE_AF_OUTPUT_PP); - gpio_set_mode(gpio_port, rx_pin, GPIO_MODE_INPUT_FLOATING); + gpio_set_mode(gpio_port, tx_pin, GPIO_MODE_AF_OUTPUT_PP); + gpio_set_mode(gpio_port, rx_pin, GPIO_MODE_INPUT_FLOATING); - if ((usart_num == USART1) || - (usart_num == USART2)) { - /* turn off any pwm if there's a conflict on this usart */ - timer_set_mode(timer_num, compare_num, TIMER_DISABLED); - } + if ((usart_num == USART1) || + (usart_num == USART2)) { + /* turn off any pwm if there's a conflict on this usart */ + timer_set_mode(timer_num, compare_num, TIMER_DISABLED); + } usart_init(usart_num, baud); } diff --git a/wirish/comm/HardwareSerial.h b/wirish/comm/HardwareSerial.h index df8d7bf..17be49f 100644 --- a/wirish/comm/HardwareSerial.h +++ b/wirish/comm/HardwareSerial.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,12 +20,12 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @file HardwareSerial.h + * @file HardwareSerial.h * - * @brief + * @brief Wirish interface to hardware serial communications. */ #ifndef _HARDWARESERIAL_H_ @@ -34,29 +34,29 @@ #include "Print.h" class HardwareSerial : public Print { - private: - uint8 usart_num; - uint32 max_baud; - GPIO_Port *gpio_port; - uint8 tx_pin; - uint8 rx_pin; - uint8 timer_num; - uint8 compare_num; - public: - HardwareSerial(uint8 usart_num, - uint32 max_baud, - GPIO_Port *gpio_port, - uint8 tx_pin, - uint8 rx_pin, - uint8 timer_num, - uint8 compare_num); - void begin(uint32); - void end(void); - uint32 available(void); - uint8 read(void); - void flush(void); - virtual void write(unsigned char); - using Print::write; + private: + uint8 usart_num; + uint32 max_baud; + GPIO_Port *gpio_port; + uint8 tx_pin; + uint8 rx_pin; + uint8 timer_num; + uint8 compare_num; + public: + HardwareSerial(uint8 usart_num, + uint32 max_baud, + GPIO_Port *gpio_port, + uint8 tx_pin, + uint8 rx_pin, + uint8 timer_num, + uint8 compare_num); + void begin(uint32); + void end(void); + uint32 available(void); + uint8 read(void); + void flush(void); + virtual void write(unsigned char); + using Print::write; }; extern HardwareSerial Serial1; extern HardwareSerial Serial2; diff --git a/wirish/ext_interrupts.c b/wirish/ext_interrupts.c index 6ba1d05..f02cdc5 100644 --- a/wirish/ext_interrupts.c +++ b/wirish/ext_interrupts.c @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,7 +20,7 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @file ext_interrupts.c @@ -36,22 +36,22 @@ * @brief Attach an interrupt handler to be triggered on a given * transition on the pin. Runs in interrupt context * - * @param[in] pin Maple pin number - * @param[in] handler Function to run upon external interrupt trigger. - * @param[in] mode Type of transition to trigger on, eg falling, rising, etc. + * @param pin Maple pin number + * @param handler Function to run upon external interrupt trigger. + * @param mode Type of transition to trigger on, eg falling, rising, etc. * * @sideeffect Registers a handler */ -int attachInterrupt(uint8 pin, voidFuncPtr handler, uint32 mode) { +void attachInterrupt(uint8 pin, voidFuncPtr handler, uint32 mode) { uint8 outMode; - /* Parameter checking */ + + /* Parameter checking */ if (pin >= NR_GPIO_PINS) { - return EXT_INTERRUPT_INVALID_PIN; + return; } if (!handler) { - ASSERT(0); - return EXT_INTERRUPT_INVALID_FUNCTION; + return; } switch (mode) { @@ -65,22 +65,27 @@ int attachInterrupt(uint8 pin, voidFuncPtr handler, uint32 mode) { outMode = EXTI_RISING_FALLING; break; default: - ASSERT(0); - return EXT_INTERRUPT_INVALID_MODE;; + return; } - exti_attach_interrupt(PIN_TO_EXTI_CHANNEL[pin].channel, - PIN_TO_EXTI_CHANNEL[pin].port, - handler, mode); + exti_attach_interrupt(PIN_MAP[pin].exti_port, + PIN_MAP[pin].pin, + handler, + mode); - return 0; + return; } -int detachInterrupt(uint8 pin) { +/** + * @brief Disable an external interrupt + * @param pin maple pin number + * @sideeffect unregisters external interrupt handler + */ +void detachInterrupt(uint8 pin) { if (!(pin < NR_GPIO_PINS)) { - return EXT_INTERRUPT_INVALID_PIN; + return; } - exti_detach_interrupt(PIN_TO_EXTI_CHANNEL[pin].channel); + exti_detach_interrupt(PIN_MAP[pin].pin); } diff --git a/wirish/ext_interrupts.h b/wirish/ext_interrupts.h index 7449685..fef8c8f 100644 --- a/wirish/ext_interrupts.h +++ b/wirish/ext_interrupts.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,7 +20,7 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @file ext_interrupts.h @@ -37,19 +37,12 @@ enum { CHANGE }; - -enum { - EXT_INTERRUPT_INVALID_PIN = (-1), - EXT_INTERRUPT_INVALID_FUNCTION = (-2), - EXT_INTERRUPT_INVALID_MODE = (-3), -}; - #ifdef __cplusplus extern "C"{ #endif -int attachInterrupt(uint8 pin, voidFuncPtr, uint32 mode); -int detachInterrupt(uint8 pin); +void attachInterrupt(uint8 pin, voidFuncPtr, uint32 mode); +void detachInterrupt(uint8 pin); #ifdef __cplusplus } diff --git a/wirish/io.h b/wirish/io.h index e779604..647e79c 100644 --- a/wirish/io.h +++ b/wirish/io.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,12 +20,12 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @file io.h * - * @brief + * @brief Arduino-compatible digital pin I/O interface. */ #ifndef _IO_H @@ -38,7 +38,6 @@ extern "C"{ #endif - typedef enum WiringPinMode { OUTPUT, OUTPUT_OPEN_DRAIN, @@ -47,7 +46,8 @@ typedef enum WiringPinMode { INPUT_PULLUP, INPUT_PULLDOWN, INPUT_FLOATING, - PWM + PWM, + PWM_OPEN_DRAIN, } WiringPinMode; @@ -84,7 +84,7 @@ uint32 digitalRead(uint8); * to INPUT_ANALOG * analogRead(pin) * pin -> {A0-A16} - * */ + */ uint32 analogRead(uint8); #ifdef __cplusplus diff --git a/wirish/pwm.c b/wirish/pwm.c index 995e2c7..2f555ab 100644 --- a/wirish/pwm.c +++ b/wirish/pwm.c @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,10 +20,10 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief + * @brief Arduino-compatible PWM implementation. */ #include "wirish.h" @@ -40,8 +40,9 @@ void pwmWrite(uint8 pin, uint16 duty_cycle) { ccr = PIN_MAP[pin].timer_channel; - if (ccr == TIMER_INVALID) + if (ccr == TIMER_INVALID) { return; + } timer_pwm_write_ccr(ccr, duty_cycle); } diff --git a/wirish/pwm.h b/wirish/pwm.h index 927b685..fe170cd 100644 --- a/wirish/pwm.h +++ b/wirish/pwm.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,12 +20,12 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** * @file pwm.h * - * @brief + * @brief Arduino-compatible PWM interface. */ #ifndef _PWM_H diff --git a/wirish/time.c b/wirish/time.c index eaa3c9e..3a48197 100644 --- a/wirish/time.c +++ b/wirish/time.c @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,30 +20,30 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief + * @brief Delay implementation. */ #include "libmaple.h" #include "systick.h" #include "time.h" -void delay(unsigned long ms) -{ - uint32 i; - for (i = 0; i < ms; i++) { - delayMicroseconds(1000); - } +void delay(unsigned long ms) { + uint32 i; + for (i = 0; i < ms; i++) { + delayMicroseconds(1000); + } } void delayMicroseconds(uint32 us) { - // So (2^32)/12 micros max, or less than 6 minutes + /* So (2^32)/12 micros max, or less than 6 minutes */ us *= 12; /* fudge for function call overhead */ us--; + int x = 4; asm volatile(" mov r0, %[us] \n\t" "1: subs r0, #1 \n\t" " bhi 1b \n\t" diff --git a/wirish/time.h b/wirish/time.h index f4612fa..742f28d 100644 --- a/wirish/time.h +++ b/wirish/time.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,10 +20,10 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief + * @brief Timing and delay functions. */ #ifndef _TIME_H @@ -44,28 +44,28 @@ extern volatile uint32 systick_timer_millis; /* time in milliseconds since boot */ static inline uint32 millis(void) { - return systick_timer_millis; + return systick_timer_millis; } /* Time in microseconds since boot */ static inline uint32 micros(void) { - uint32 ms; - uint32 cycle_cnt; - uint32 res; + uint32 ms; + uint32 cycle_cnt; + uint32 res; - nvic_globalirq_disable(); + nvic_globalirq_disable(); - cycle_cnt = systick_get_count(); - ms = millis(); + cycle_cnt = systick_get_count(); + ms = millis(); - nvic_globalirq_enable(); + nvic_globalirq_enable(); - /* MAPLE_RELOAD_VAL is 1 less than the number of cycles it actually - takes to complete a systick reload */ - res = (ms * US_PER_MS) + - (MAPLE_RELOAD_VAL + 1 - cycle_cnt)/CYCLES_PER_MICROSECOND; + /* MAPLE_RELOAD_VAL is 1 less than the number of cycles it actually + takes to complete a systick reload */ + res = (ms * US_PER_MS) + + (MAPLE_RELOAD_VAL + 1 - cycle_cnt)/CYCLES_PER_MICROSECOND; - return res; + return res; } void delay(unsigned long ms); diff --git a/wirish/usb_serial.cpp b/wirish/usb_serial.cpp index fafdf49..405220a 100644 --- a/wirish/usb_serial.cpp +++ b/wirish/usb_serial.cpp @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,10 +20,10 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief wirish usb class for easy goin communication, uses libmaple's + * @brief Wirish USB class for easy communication, uses libmaple's * virtual com port implementation */ @@ -49,8 +49,10 @@ void USBSerial::write(uint8 ch) { if(!(usbIsConnected() && usbIsConfigured())) { return; } + uint16 status = 0; uint32 start = millis(); + while(status == 0 && (millis() - start <= USB_TIMEOUT)) { status = usbSendBytes(&ch, 1); } @@ -60,13 +62,15 @@ void USBSerial::write(const char *str) { if(!(usbIsConnected() && usbIsConfigured())) { return; } + uint32 len = strlen(str); uint16 status = 0; uint16 oldstatus = 0; uint32 start = millis(); + while(status < len && (millis() - start < USB_TIMEOUT)) { status += usbSendBytes((uint8*)str+status, len-status); - if(oldstatus != status) + if(oldstatus != status) start = millis(); oldstatus = status; } @@ -76,52 +80,55 @@ void USBSerial::write(void *buf, uint32 size) { if(!(usbIsConnected() && usbIsConfigured())) { return; } + if (!buf) { return; } + uint16 status = 0; uint16 oldstatus = 0; uint32 start = millis(); + while(status < size && (millis() - start < USB_TIMEOUT)) { status += usbSendBytes((uint8*)buf+status, size-status); - if(oldstatus != status) + if(oldstatus != status) start = millis(); oldstatus = status; } } uint32 USBSerial::available(void) { - return usbBytesAvailable(); + return usbBytesAvailable(); } uint32 USBSerial::read(void *buf, uint32 len) { - if (!buf) { - return 0; - } + if (!buf) { + return 0; + } - return usbReceiveBytes((uint8*)buf, len); + return usbReceiveBytes((uint8*)buf, len); } uint8 USBSerial::read(void) { - uint8 ch; - usbReceiveBytes(&ch, 1); - return ch; + uint8 ch; + usbReceiveBytes(&ch, 1); + return ch; } uint8 USBSerial::pending(void) { - return usbGetPending(); + return usbGetPending(); } uint8 USBSerial::getDTR(void) { - return usbGetDTR(); + return usbGetDTR(); } uint8 USBSerial::getRTS(void) { - return usbGetRTS(); + return usbGetRTS(); } uint8 USBSerial::isConnected(void) { - return (usbIsConnected() && usbIsConfigured()); + return (usbIsConnected() && usbIsConfigured()); } USBSerial SerialUSB; diff --git a/wirish/usb_serial.h b/wirish/usb_serial.h index 7c87c04..c228837 100644 --- a/wirish/usb_serial.h +++ b/wirish/usb_serial.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,11 +20,11 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief wirish usb class for easy goin communication, uses libmaple's - * virtual com port implementation + * @brief wirish usb class for easy goin communication, uses libmaple's + * virtual com port implementation */ #ifndef _USB_SERIAL_H_ @@ -33,25 +33,25 @@ #include "Print.h" class USBSerial : public Print { - public: - USBSerial(void); +public: + USBSerial(void); - void begin(void); - void end(void); + void begin(void); + void end(void); - uint32 available(void); + uint32 available(void); - uint32 read(void *buf, uint32 len); - uint8 read(void); + uint32 read(void *buf, uint32 len); + uint8 read(void); - void write(uint8); - void write(const char *str); - void write(void *, uint32); + void write(uint8); + void write(const char *str); + void write(void *, uint32); - uint8 getRTS(); - uint8 getDTR(); - uint8 isConnected(); - uint8 pending(); + uint8 getRTS(); + uint8 getDTR(); + uint8 isConnected(); + uint8 pending(); }; extern USBSerial SerialUSB; diff --git a/wirish/wirish.c b/wirish/wirish.c index 5407131..0abec41 100644 --- a/wirish/wirish.c +++ b/wirish/wirish.c @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,17 +20,16 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief generic maple board bring up: + * @brief generic maple board bring up: * - * By default, we bring up all maple boards running on the stm32 to 72mhz, - * clocked off the PLL, driven by the 8MHz external crystal. - * - * AHB and APB2 are clocked at 72MHz - * APB1 is clocked at 36MHz + * By default, we bring up all maple boards running on the stm32 to 72mhz, + * clocked off the PLL, driven by the 8MHz external crystal. * + * AHB and APB2 are clocked at 72MHz + * APB1 is clocked at 36MHz */ #include "wirish.h" @@ -44,35 +43,35 @@ #include "flash.h" void init(void) { - /* make sure the flash is ready before spinning the high speed clock up */ - flash_enable_prefetch(); - flash_set_latency(FLASH_WAIT_STATE_2); + /* make sure the flash is ready before spinning the high speed clock up */ + flash_enable_prefetch(); + flash_set_latency(FLASH_WAIT_STATE_2); - #if NR_FSMC > 0 - fsmc_native_sram_init(); - #endif +#if NR_FSMC > 0 + fsmc_native_sram_init(); +#endif - #if NR_DAC_PINS > 0 - dac_init(); - #endif +#if NR_DAC_PINS > 0 + dac_init(); +#endif - /* initialize clocks */ - rcc_clk_init(RCC_CLKSRC_PLL, RCC_PLLSRC_HSE, RCC_PLLMUL_9); - rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); - rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); - rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); + /* initialize clocks */ + rcc_clk_init(RCC_CLKSRC_PLL, RCC_PLLSRC_HSE, RCC_PLLMUL_9); + rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); + rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); + rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); - nvic_init(); - systick_init(MAPLE_RELOAD_VAL); - gpio_init(); - adc_init(); - timer_init(TIMER1, 1); - timer_init(TIMER2, 1); - timer_init(TIMER3, 1); - timer_init(TIMER4, 1); - #if NR_TIMERS >= 8 - timer_init(TIMER5, 1); - timer_init(TIMER8, 1); - #endif - setupUSB(); + nvic_init(); + systick_init(MAPLE_RELOAD_VAL); + gpio_init(); + adc_init(); + timer_init(TIMER1, 1); + timer_init(TIMER2, 1); + timer_init(TIMER3, 1); + timer_init(TIMER4, 1); +#if NR_TIMERS >= 8 + timer_init(TIMER5, 1); + timer_init(TIMER8, 1); +#endif + setupUSB(); } diff --git a/wirish/wirish.h b/wirish/wirish.h index 7ede77c..c1c46cb 100644 --- a/wirish/wirish.h +++ b/wirish/wirish.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,14 +20,14 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ + /** * @brief Main include file for the Wirish core. * * Includes various Arduino wiring macros and bit defines */ - #ifndef _WIRISH_H_ #define _WIRISH_H_ @@ -62,14 +62,14 @@ extern "C"{ #define LSBFIRST 0 #define MSBFIRST 1 -#define lowByte(w) ((w) & 0xff) -#define highByte(w) ((w) >> 8) -#define bitRead(value, bit) (((value) >> (bit)) & 0x01) -#define bitSet(value, bit) ((value) |= (1UL << (bit))) -#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) -#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : \ - bitClear(value, bit)) -#define bit(b) (1UL << (b)) +#define lowByte(w) ((w) & 0xff) +#define highByte(w) ((w) >> 8) +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) +#define bitSet(value, bit) ((value) |= (1UL << (bit))) +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : \ + bitClear(value, bit)) +#define bit(b) (1UL << (b)) typedef uint8 boolean; typedef uint8 byte; diff --git a/wirish/wirish_analog.c b/wirish/wirish_analog.c index 1b911bc..3c63342 100644 --- a/wirish/wirish_analog.c +++ b/wirish/wirish_analog.c @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,22 +20,22 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief + * @brief Arduino-compatible ADC implementation. */ #include "libmaple.h" #include "wirish.h" #include "io.h" -/* Assumes that the ADC has been initialized and - * that the pin is set to ANALOG_INPUT */ +/* Assumes that the ADC has been initialized and that the pin is set + * to ANALOG_INPUT */ uint32 analogRead(uint8 pin) { if(PIN_MAP[pin].adc == ADC_INVALID) { return 0; - } + } return adc_read(PIN_MAP[pin].adc); } diff --git a/wirish/wirish_digital.c b/wirish/wirish_digital.c index c93c786..f4868da 100644 --- a/wirish/wirish_digital.c +++ b/wirish/wirish_digital.c @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,10 +20,10 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ /** - * @brief + * @brief Arduino-compatible digital I/O implementation. */ #include "wirish.h" @@ -32,8 +32,9 @@ void pinMode(uint8 pin, WiringPinMode mode) { uint8 outputMode; - if (pin >= NR_GPIO_PINS) + if (pin >= NR_GPIO_PINS) { return; + } switch(mode) { case OUTPUT: @@ -58,6 +59,9 @@ void pinMode(uint8 pin, WiringPinMode mode) { case PWM: outputMode = GPIO_MODE_AF_OUTPUT_PP; break; + case PWM_OPEN_DRAIN: + outputMode = GPIO_MODE_AF_OUTPUT_OD; + break; default: ASSERT(0); return; @@ -68,14 +72,17 @@ void pinMode(uint8 pin, WiringPinMode mode) { uint32 digitalRead(uint8 pin) { - if (pin >= NR_GPIO_PINS) + if (pin >= NR_GPIO_PINS) { return 0; + } + return gpio_read_bit(PIN_MAP[pin].port, PIN_MAP[pin].pin); } void digitalWrite(uint8 pin, uint8 val) { - if (pin >= NR_GPIO_PINS) + if (pin >= NR_GPIO_PINS) { return; + } gpio_write_bit(PIN_MAP[pin].port, PIN_MAP[pin].pin, val); } diff --git a/wirish/wirish_math.cpp b/wirish/wirish_math.cpp index 0d907c4..12a21c3 100644 --- a/wirish/wirish_math.cpp +++ b/wirish/wirish_math.cpp @@ -1,54 +1,54 @@ /* - Modified by LeafLabs, LLC. - - Part of the Wiring project - http://wiring.org.co - Copyright (c) 2004-06 Hernando Barragan - Modified 13 August 2006, David A. Mellis for Arduino - http://www.arduino.cc/ - - 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. - - 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. - - 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$ -*/ + * Modified by LeafLabs, LLC. + * + * Part of the Wiring project - http://wiring.org.co Copyright (c) + * 2004-06 Hernando Barragan Modified 13 August 2006, David A. Mellis + * for Arduino - http://www.arduino.cc/ + * + * 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. + * + * 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. + * + * 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 + */ #include <stdlib.h> #include "math.h" void randomSeed(unsigned int seed) { - if (seed != 0) { - srand(seed); - } + if (seed != 0) { + srand(seed); + } } long random(long howbig) { - if (howbig == 0) { - return 0; - } - return rand() % howbig; + if (howbig == 0) { + return 0; + } + + return rand() % howbig; } long random(long howsmall, long howbig) { - if (howsmall >= howbig) { - return howsmall; - } - long diff = howbig - howsmall; - return random(diff) + howsmall; + if (howsmall >= howbig) { + return howsmall; + } + + long diff = howbig - howsmall; + return random(diff) + howsmall; } long map(long x, long in_min, long in_max, long out_min, long out_max) { - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } diff --git a/wirish/wirish_math.h b/wirish/wirish_math.h index 8746d01..4543c1b 100644 --- a/wirish/wirish_math.h +++ b/wirish/wirish_math.h @@ -1,4 +1,4 @@ -/* ***************************************************************************** +/****************************************************************************** * The MIT License * * Copyright (c) 2010 Perry Hung. @@ -20,7 +20,7 @@ * 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. - * ****************************************************************************/ + *****************************************************************************/ #ifndef _WIRING_MATH_H_ #define _WIRING_MATH_H_ @@ -34,11 +34,11 @@ long random(long); long random(long, long); long map(long, long, long, long, long); -#define PI 3.1415926535897932384626433832795 -#define HALF_PI 1.5707963267948966192313216916398 -#define TWO_PI 6.283185307179586476925286766559 -#define DEG_TO_RAD 0.017453292519943295769236907684886 -#define RAD_TO_DEG 57.295779513082320876798154814105 +#define PI 3.1415926535897932384626433832795 +#define HALF_PI 1.5707963267948966192313216916398 +#define TWO_PI 6.283185307179586476925286766559 +#define DEG_TO_RAD 0.017453292519943295769236907684886 +#define RAD_TO_DEG 57.295779513082320876798154814105 #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) @@ -52,7 +52,7 @@ long map(long, long, long, long, long); #ifdef abs #undef abs #endif -#define abs(x) (((x) > 0) ? (x) : -(unsigned)(x)) +#define abs(x) (((x) > 0) ? (x) : -(unsigned)(x)) #endif diff --git a/wirish/wirish_shift.c b/wirish/wirish_shift.c index 884b560..f67364d 100644 --- a/wirish/wirish_shift.c +++ b/wirish/wirish_shift.c @@ -1,38 +1,38 @@ /* - wiring_shift.c - shiftOut() function - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2005-2006 David A. Mellis - - 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. - - 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. - - 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 $ -*/ + * wiring_shift.c - shiftOut() function + * Part of Arduino - http://www.arduino.cc/ + * + * Copyright (c) 2005-2006 David A. Mellis + * + * 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. + * + * 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. + * + * 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 $ + */ #include "wirish.h" -void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 val) -{ +void shiftOut(uint8 dataPin, uint8 clockPin, uint8 bitOrder, uint8 val) { int i; - for (i = 0; i < 8; i++) { - if (bitOrder == LSBFIRST) + for (i = 0; i < 8; i++) { + if (bitOrder == LSBFIRST) { digitalWrite(dataPin, !!(val & (1 << i))); - else + } else { digitalWrite(dataPin, !!(val & (1 << (7 - i)))); + } digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); |