diff options
| -rw-r--r-- | cores/arduino/Arduino.h | 27 | ||||
| -rw-r--r-- | cores/arduino/Client.h | 19 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial.cpp | 436 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial.h | 95 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial0.cpp | 79 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial1.cpp | 79 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial2.cpp | 79 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial3.cpp | 79 | ||||
| -rw-r--r-- | cores/arduino/HardwareSerial_private.h | 118 | ||||
| -rw-r--r-- | cores/arduino/IPAddress.cpp | 18 | ||||
| -rw-r--r-- | cores/arduino/IPAddress.h | 40 | ||||
| -rw-r--r-- | cores/arduino/Server.h | 19 | ||||
| -rw-r--r-- | cores/arduino/USBAPI.h | 2 | ||||
| -rw-r--r-- | cores/arduino/binary.h | 19 | ||||
| -rw-r--r-- | cores/arduino/main.cpp | 19 | ||||
| -rw-r--r-- | platform.txt | 2 | ||||
| -rw-r--r-- | variants/ethernet/pins_arduino.h | 28 | ||||
| -rw-r--r-- | variants/leonardo/pins_arduino.h | 36 | ||||
| -rw-r--r-- | variants/mega/pins_arduino.h | 44 | ||||
| -rw-r--r-- | variants/robot_control/pins_arduino.h | 78 | ||||
| -rw-r--r-- | variants/robot_motor/pins_arduino.h | 72 | ||||
| -rw-r--r-- | variants/standard/pins_arduino.h | 28 | 
22 files changed, 868 insertions, 548 deletions
diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h index 7bf5119..e12ac82 100644 --- a/cores/arduino/Arduino.h +++ b/cores/arduino/Arduino.h @@ -1,3 +1,22 @@ +/* +  Arduino.h - Main include file for the Arduino SDK +  Copyright (c) 2005-2013 Arduino Team.  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 Arduino_h  #define Arduino_h @@ -88,6 +107,10 @@ void yield(void);  #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))  #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) +// avr-libc defines _NOP() since 1.6.2 +#ifndef _NOP +#define _NOP() do { __asm__ volatile ("nop"); } while (0) +#endif  typedef unsigned int word; @@ -196,6 +219,10 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];  #include "WCharacter.h"  #include "WString.h"  #include "HardwareSerial.h" +#include "USBAPI.h" +#if defined(HAVE_HWSERIAL0) && defined(HAVE_CDCSERIAL) +#error "Targets with both UART0 and CDC serial not supported" +#endif  uint16_t makeWord(uint16_t w);  uint16_t makeWord(byte h, byte l); diff --git a/cores/arduino/Client.h b/cores/arduino/Client.h index ea13483..b8e5d93 100644 --- a/cores/arduino/Client.h +++ b/cores/arduino/Client.h @@ -1,3 +1,22 @@ +/* +  Client.h - Base class that provides Client +  Copyright (c) 2011 Adrian McEwen.  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 client_h  #define client_h  #include "Print.h" diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp index 9a86fa0..81b406a 100644 --- a/cores/arduino/HardwareSerial.cpp +++ b/cores/arduino/HardwareSerial.cpp @@ -19,6 +19,7 @@    Modified 23 November 2006 by David A. Mellis    Modified 28 September 2010 by Mark Sproul    Modified 14 August 2012 by Alarus +  Modified 3 December 2013 by Matthijs Kooijman  */  #include <stdlib.h> @@ -26,348 +27,112 @@  #include <string.h>  #include <inttypes.h>  #include "Arduino.h" -#include "wiring_private.h" - -// this next line disables the entire HardwareSerial.cpp,  -// this is so I can support Attiny series and any other chip without a uart -#if defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)  #include "HardwareSerial.h" +#include "HardwareSerial_private.h" -/* - * on ATmega8, the uart and its bits are not numbered, so there is no "TXC0" - * definition. - */ -#if !defined(TXC0) -#if defined(TXC) -#define TXC0 TXC -#elif defined(TXC1) -// Some devices have uart1 but no uart0 -#define TXC0 TXC1 -#else -#error TXC0 not definable in HardwareSerial.h -#endif -#endif - -inline void store_char(unsigned char c, HardwareSerial *s) -{ -  int i = (unsigned int)(s->_rx_buffer_head + 1) % SERIAL_BUFFER_SIZE; - -  // if we should be storing the received character into the location -  // just before the tail (meaning that the head would advance to the -  // current location of the tail), we're about to overflow the buffer -  // and so we don't write the character or advance the head. -  if (i != s->_rx_buffer_tail) { -    s->_rx_buffer[s->_rx_buffer_head] = c; -    s->_rx_buffer_head = i; -  } -} - -#if !defined(USART0_RX_vect) && defined(USART1_RX_vect) -// do nothing - on the 32u4 the first USART is USART1 -#else -#if !defined(USART_RX_vect) && !defined(USART0_RX_vect) && \ -    !defined(USART_RXC_vect) -  #error "Don't know what the Data Received vector is called for the first UART" -#else +// this next line disables the entire HardwareSerial.cpp,  +// this is so I can support Attiny series and any other chip without a uart +#if defined(HAVE_HWSERIAL0) || defined(HAVE_HWSERIAL1) || defined(HAVE_HWSERIAL2) || defined(HAVE_HWSERIAL3) + +// SerialEvent functions are weak, so when the user doesn't define them, +// the linker just sets their address to 0 (which is checked below). +// The Serialx_available is just a wrapper around Serialx.available(), +// but we can refer to it weakly so we don't pull in the entire +// HardwareSerial instance if the user doesn't also refer to it. +#if defined(HAVE_HWSERIAL0)    void serialEvent() __attribute__((weak)); -  void serialEvent() {} -  #define serialEvent_implemented -#if defined(USART_RX_vect) -  ISR(USART_RX_vect) -#elif defined(USART0_RX_vect) -  ISR(USART0_RX_vect) -#elif defined(USART_RXC_vect) -  ISR(USART_RXC_vect) // ATmega8 -#endif -  { -  #if defined(UDR0) -    if (bit_is_clear(UCSR0A, UPE0)) { -      unsigned char c = UDR0; -      store_char(c, &Serial); -    } else { -      unsigned char c = UDR0; -    }; -  #elif defined(UDR) -    if (bit_is_clear(UCSRA, PE)) { -      unsigned char c = UDR; -      store_char(c, &Serial); -    } else { -      unsigned char c = UDR; -    }; -  #else -    #error UDR not defined -  #endif -  } -#endif +  bool Serial0_available() __attribute__((weak));  #endif -#if defined(USART1_RX_vect) +#if defined(HAVE_HWSERIAL1)    void serialEvent1() __attribute__((weak)); -  void serialEvent1() {} -  #define serialEvent1_implemented -  ISR(USART1_RX_vect) -  { -    if (bit_is_clear(UCSR1A, UPE1)) { -      unsigned char c = UDR1; -      store_char(c, &Serial1); -    } else { -      unsigned char c = UDR1; -    }; -  } +  bool Serial1_available() __attribute__((weak));  #endif -#if defined(USART2_RX_vect) && defined(UDR2) +#if defined(HAVE_HWSERIAL2)    void serialEvent2() __attribute__((weak)); -  void serialEvent2() {} -  #define serialEvent2_implemented -  ISR(USART2_RX_vect) -  { -    if (bit_is_clear(UCSR2A, UPE2)) { -      unsigned char c = UDR2; -      store_char(c, &Serial2); -    } else { -      unsigned char c = UDR2; -    }; -  } +  bool Serial2_available() __attribute__((weak));  #endif -#if defined(USART3_RX_vect) && defined(UDR3) +#if defined(HAVE_HWSERIAL3)    void serialEvent3() __attribute__((weak)); -  void serialEvent3() {} -  #define serialEvent3_implemented -  ISR(USART3_RX_vect) -  { -    if (bit_is_clear(UCSR3A, UPE3)) { -      unsigned char c = UDR3; -      store_char(c, &Serial3); -    } else { -      unsigned char c = UDR3; -    }; -  } +  bool Serial3_available() __attribute__((weak));  #endif  void serialEventRun(void)  { -#ifdef serialEvent_implemented -  if (Serial.available()) serialEvent(); +#if defined(HAVE_HWSERIAL0) +  if (Serial0_available && serialEvent && Serial0_available()) serialEvent();  #endif -#ifdef serialEvent1_implemented -  if (Serial1.available()) serialEvent1(); +#if defined(HAVE_HWSERIAL1) +  if (Serial1_available && serialEvent1 && Serial1_available()) serialEvent1();  #endif -#ifdef serialEvent2_implemented -  if (Serial2.available()) serialEvent2(); +#if defined(HAVE_HWSERIAL2) +  if (Serial2_available && serialEvent2 && Serial2_available()) serialEvent2();  #endif -#ifdef serialEvent3_implemented -  if (Serial3.available()) serialEvent3(); +#if defined(HAVE_HWSERIAL3) +  if (Serial3_available && serialEvent2 && Serial3_available()) serialEvent3();  #endif  } +// Actual interrupt handlers ////////////////////////////////////////////////////////////// -#if !defined(USART0_UDRE_vect) && defined(USART1_UDRE_vect) -// do nothing - on the 32u4 the first USART is USART1 -#else -#if !defined(UART0_UDRE_vect) && !defined(UART_UDRE_vect) && !defined(USART0_UDRE_vect) && !defined(USART_UDRE_vect) -  #error "Don't know what the Data Register Empty vector is called for the first UART" -#else -#if defined(UART0_UDRE_vect) -ISR(UART0_UDRE_vect) -#elif defined(UART_UDRE_vect) -ISR(UART_UDRE_vect) -#elif defined(USART0_UDRE_vect) -ISR(USART0_UDRE_vect) -#elif defined(USART_UDRE_vect) -ISR(USART_UDRE_vect) -#endif +void HardwareSerial::_tx_udr_empty_irq(void)  { -  if (Serial._tx_buffer_head == Serial._tx_buffer_tail) { -	// Buffer empty, so disable interrupts -#if defined(UCSR0B) -    cbi(UCSR0B, UDRIE0); -#else -    cbi(UCSRB, UDRIE); -#endif -  } -  else { -    // There is more data in the output buffer. Send the next byte -    unsigned char c = Serial._tx_buffer[Serial._tx_buffer_tail]; -    Serial._tx_buffer_tail = (Serial._tx_buffer_tail + 1) % SERIAL_BUFFER_SIZE; -	 -  #if defined(UDR0) -    UDR0 = c; -  #elif defined(UDR) -    UDR = c; -  #else -    #error UDR not defined -  #endif -  } -} -#endif -#endif +  // If interrupts are enabled, there must be more data in the output +  // buffer. Send the next byte +  unsigned char c = _tx_buffer[_tx_buffer_tail]; +  _tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_BUFFER_SIZE; -#ifdef USART1_UDRE_vect -ISR(USART1_UDRE_vect) -{ -  if (Serial1._tx_buffer_head == Serial1._tx_buffer_tail) { -	// Buffer empty, so disable interrupts -    cbi(UCSR1B, UDRIE1); -  } -  else { -    // There is more data in the output buffer. Send the next byte -    unsigned char c = Serial1._tx_buffer[Serial1._tx_buffer_tail]; -    Serial1._tx_buffer_tail = (Serial1._tx_buffer_tail + 1) % SERIAL_BUFFER_SIZE; -	 -    UDR1 = c; -  } -} -#endif +  *_udr = c; -#ifdef USART2_UDRE_vect -ISR(USART2_UDRE_vect) -{ -  if (Serial2._tx_buffer_head == Serial2._tx_buffer_tail) { -	// Buffer empty, so disable interrupts -    cbi(UCSR2B, UDRIE2); -  } -  else { -    // There is more data in the output buffer. Send the next byte -    unsigned char c = Serial2._tx_buffer[Serial2._tx_buffer_tail]; -    Serial2._tx_buffer_tail = (Serial2._tx_buffer_tail + 1) % SERIAL_BUFFER_SIZE; -	 -    UDR2 = c; -  } -} -#endif +  // clear the TXC bit -- "can be cleared by writing a one to its bit +  // location". This makes sure flush() won't return until the bytes +  // actually got written +  sbi(*_ucsra, TXC0); -#ifdef USART3_UDRE_vect -ISR(USART3_UDRE_vect) -{ -  if (Serial3._tx_buffer_head == Serial3._tx_buffer_tail) { -	// Buffer empty, so disable interrupts -    cbi(UCSR3B, UDRIE3); -  } -  else { -    // There is more data in the output buffer. Send the next byte -    unsigned char c = Serial3._tx_buffer[Serial3._tx_buffer_tail]; -    Serial3._tx_buffer_tail = (Serial3._tx_buffer_tail + 1) % SERIAL_BUFFER_SIZE; -	 -    UDR3 = c; +  if (_tx_buffer_head == _tx_buffer_tail) { +    // Buffer empty, so disable interrupts +    cbi(*_ucsrb, UDRIE0);    }  } -#endif - -// Constructors //////////////////////////////////////////////////////////////// - -HardwareSerial::HardwareSerial( -  volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, -  volatile uint8_t *ucsra, volatile uint8_t *ucsrb, -  volatile uint8_t *ucsrc, volatile uint8_t *udr, -  uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x) -{ -  _tx_buffer_head = _tx_buffer_tail = 0; -  _rx_buffer_head = _rx_buffer_tail = 0; -  _ubrrh = ubrrh; -  _ubrrl = ubrrl; -  _ucsra = ucsra; -  _ucsrb = ucsrb; -  _ucsrc = ucsrc; -  _udr = udr; -  _rxen = rxen; -  _txen = txen; -  _rxcie = rxcie; -  _udrie = udrie; -  _u2x = u2x; -}  // Public Methods ////////////////////////////////////////////////////////////// -void HardwareSerial::begin(unsigned long baud) -{ -  uint16_t baud_setting; -  bool use_u2x = true; - -#if F_CPU == 16000000UL -  // hardcoded exception for compatibility with the bootloader shipped -  // with the Duemilanove and previous boards and the firmware on the 8U2 -  // on the Uno and Mega 2560. -  if (baud == 57600) { -    use_u2x = false; -  } -#endif - -try_again: -   -  if (use_u2x) { -    *_ucsra = 1 << _u2x; -    baud_setting = (F_CPU / 4 / baud - 1) / 2; -  } else { -    *_ucsra = 0; -    baud_setting = (F_CPU / 8 / baud - 1) / 2; -  } -   -  if ((baud_setting > 4095) && use_u2x) -  { -    use_u2x = false; -    goto try_again; -  } - -  // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) -  *_ubrrh = baud_setting >> 8; -  *_ubrrl = baud_setting; - -  transmitting = false; - -  sbi(*_ucsrb, _rxen); -  sbi(*_ucsrb, _txen); -  sbi(*_ucsrb, _rxcie); -  cbi(*_ucsrb, _udrie); -} -  void HardwareSerial::begin(unsigned long baud, byte config)  { -  uint16_t baud_setting; -  uint8_t current_config; -  bool use_u2x = true; - -#if F_CPU == 16000000UL -  // hardcoded exception for compatibility with the bootloader shipped -  // with the Duemilanove and previous boards and the firmware on the 8U2 -  // on the Uno and Mega 2560. -  if (baud == 57600) { -    use_u2x = false; -  } -#endif - -try_again: -   -  if (use_u2x) { -    *_ucsra = 1 << _u2x; -    baud_setting = (F_CPU / 4 / baud - 1) / 2; -  } else { +  // Try u2x mode first +  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2; +  *_ucsra = 1 << U2X0; + +  // hardcoded exception for 57600 for compatibility with the bootloader +  // shipped with the Duemilanove and previous boards and the firmware +  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot +  // be > 4095, so switch back to non-u2x mode if the baud rate is too +  // low. +  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095)) +  {      *_ucsra = 0;      baud_setting = (F_CPU / 8 / baud - 1) / 2;    } -   -  if ((baud_setting > 4095) && use_u2x) -  { -    use_u2x = false; -    goto try_again; -  }    // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)    *_ubrrh = baud_setting >> 8;    *_ubrrl = baud_setting; +  _written = false; +    //set the data bits, parity, and stop bits  #if defined(__AVR_ATmega8__)    config |= 0x80; // select UCSRC register (shared with UBRRH)  #endif    *_ucsrc = config; -  sbi(*_ucsrb, _rxen); -  sbi(*_ucsrb, _txen); -  sbi(*_ucsrb, _rxcie); -  cbi(*_ucsrb, _udrie); +  sbi(*_ucsrb, RXEN0); +  sbi(*_ucsrb, TXEN0); +  sbi(*_ucsrb, RXCIE0); +  cbi(*_ucsrb, UDRIE0);  }  void HardwareSerial::end() @@ -376,10 +141,10 @@ void HardwareSerial::end()    while (_tx_buffer_head != _tx_buffer_tail)      ; -  cbi(*_ucsrb, _rxen); -  cbi(*_ucsrb, _txen); -  cbi(*_ucsrb, _rxcie);   -  cbi(*_ucsrb, _udrie); +  cbi(*_ucsrb, RXEN0); +  cbi(*_ucsrb, TXEN0); +  cbi(*_ucsrb, RXCIE0); +  cbi(*_ucsrb, UDRIE0);    // clear any received data    _rx_buffer_head = _rx_buffer_tail; @@ -413,57 +178,60 @@ int HardwareSerial::read(void)  void HardwareSerial::flush()  { -  // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT -  while (transmitting && ! (*_ucsra & _BV(TXC0))); -  transmitting = false; +  // If we have never written a byte, no need to flush. This special +  // case is needed since there is no way to force the TXC (transmit +  // complete) bit to 1 during initialization +  if (!_written) +    return; + +  while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) { +    if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0)) +	// Interrupts are globally disabled, but the DR empty +	// interrupt should be enabled, so poll the DR empty flag to +	// prevent deadlock +	if (bit_is_set(*_ucsra, UDRE0)) +	  _tx_udr_empty_irq(); +  } +  // If we get here, nothing is queued anymore (DRIE is disabled) and +  // the hardware finished tranmission (TXC is set).  }  size_t HardwareSerial::write(uint8_t c)  { +  // If the buffer and the data register is empty, just write the byte +  // to the data register and be done. This shortcut helps +  // significantly improve the effective datarate at high (> +  // 500kbit/s) bitrates, where interrupt overhead becomes a slowdown. +  if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) { +    *_udr = c; +    sbi(*_ucsra, TXC0); +    return 1; +  }    int i = (_tx_buffer_head + 1) % SERIAL_BUFFER_SIZE;    // If the output buffer is full, there's nothing for it other than to     // wait for the interrupt handler to empty it a bit -  // ???: return 0 here instead? -  while (i == _tx_buffer_tail) -    ; -	 +  while (i == _tx_buffer_tail) { +    if (bit_is_clear(SREG, SREG_I)) { +      // Interrupts are disabled, so we'll have to poll the data +      // register empty flag ourselves. If it is set, pretend an +      // interrupt has happened and call the handler to free up +      // space for us. +      if(bit_is_set(*_ucsra, UDRE0)) +	_tx_udr_empty_irq(); +    } else { +      // nop, the interrupt handler will free up space for us +    } +  } +    _tx_buffer[_tx_buffer_head] = c;    _tx_buffer_head = i; -  sbi(*_ucsrb, _udrie); -  // clear the TXC bit -- "can be cleared by writing a one to its bit location" -  transmitting = true; -  sbi(*_ucsra, TXC0); +  sbi(*_ucsrb, UDRIE0); +  _written = true;    return 1;  } -HardwareSerial::operator bool() { -	return true; -} - -// Preinstantiate Objects ////////////////////////////////////////////////////// - -#if defined(UBRRH) && defined(UBRRL) -  HardwareSerial Serial(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X); -#elif defined(UBRR0H) && defined(UBRR0L) -  HardwareSerial Serial(&UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UCSR0C, &UDR0, RXEN0, TXEN0, RXCIE0, UDRIE0, U2X0); -#elif defined(USBCON) -  // do nothing - Serial object and buffers are initialized in CDC code -#else -  #error no serial port defined  (port 0) -#endif - -#if defined(UBRR1H) -  HardwareSerial Serial1(&UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1, RXEN1, TXEN1, RXCIE1, UDRIE1, U2X1); -#endif -#if defined(UBRR2H) -  HardwareSerial Serial2(&UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UCSR2C, &UDR2, RXEN2, TXEN2, RXCIE2, UDRIE2, U2X2); -#endif -#if defined(UBRR3H) -  HardwareSerial Serial3(&UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); -#endif  #endif // whole file - diff --git a/cores/arduino/HardwareSerial.h b/cores/arduino/HardwareSerial.h index 0f62262..226bf57 100644 --- a/cores/arduino/HardwareSerial.h +++ b/cores/arduino/HardwareSerial.h @@ -18,6 +18,7 @@    Modified 28 September 2010 by Mark Sproul    Modified 14 August 2012 by Alarus +  Modified 3 December 2013 by Matthijs Kooijman  */  #ifndef HardwareSerial_h @@ -37,23 +38,44 @@    #define SERIAL_BUFFER_SIZE 64  #endif +// Define config for Serial.begin(baud, config); +#define SERIAL_5N1 0x00 +#define SERIAL_6N1 0x02 +#define SERIAL_7N1 0x04 +#define SERIAL_8N1 0x06 +#define SERIAL_5N2 0x08 +#define SERIAL_6N2 0x0A +#define SERIAL_7N2 0x0C +#define SERIAL_8N2 0x0E +#define SERIAL_5E1 0x20 +#define SERIAL_6E1 0x22 +#define SERIAL_7E1 0x24 +#define SERIAL_8E1 0x26 +#define SERIAL_5E2 0x28 +#define SERIAL_6E2 0x2A +#define SERIAL_7E2 0x2C +#define SERIAL_8E2 0x2E +#define SERIAL_5O1 0x30 +#define SERIAL_6O1 0x32 +#define SERIAL_7O1 0x34 +#define SERIAL_8O1 0x36 +#define SERIAL_5O2 0x38 +#define SERIAL_6O2 0x3A +#define SERIAL_7O2 0x3C +#define SERIAL_8O2 0x3E +  class HardwareSerial : public Stream  {    protected: -    volatile uint8_t *_ubrrh; -    volatile uint8_t *_ubrrl; -    volatile uint8_t *_ucsra; -    volatile uint8_t *_ucsrb; -    volatile uint8_t *_ucsrc; -    volatile uint8_t *_udr; -    uint8_t _rxen; -    uint8_t _txen; -    uint8_t _rxcie; -    uint8_t _udrie; -    uint8_t _u2x; -    bool transmitting; +    volatile uint8_t * const _ubrrh; +    volatile uint8_t * const _ubrrl; +    volatile uint8_t * const _ucsra; +    volatile uint8_t * const _ucsrb; +    volatile uint8_t * const _ucsrc; +    volatile uint8_t * const _udr; +    // Has any byte been written to the UART since begin() +    bool _written; -  public:      volatile uint8_t _rx_buffer_head;      volatile uint8_t _rx_buffer_tail;      volatile uint8_t _tx_buffer_head; @@ -65,12 +87,12 @@ class HardwareSerial : public Stream      unsigned char _rx_buffer[SERIAL_BUFFER_SIZE];      unsigned char _tx_buffer[SERIAL_BUFFER_SIZE]; -    HardwareSerial( +  public: +    inline HardwareSerial(        volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,        volatile uint8_t *ucsra, volatile uint8_t *ucsrb, -      volatile uint8_t *ucsrc, volatile uint8_t *udr, -      uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x); -    void begin(unsigned long); +      volatile uint8_t *ucsrc, volatile uint8_t *udr); +    void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }      void begin(unsigned long, uint8_t);      void end();      virtual int available(void); @@ -83,49 +105,28 @@ class HardwareSerial : public Stream      inline size_t write(unsigned int n) { return write((uint8_t)n); }      inline size_t write(int n) { return write((uint8_t)n); }      using Print::write; // pull in write(str) and write(buf, size) from Print -    operator bool(); -}; +    operator bool() { return true; } -// Define config for Serial.begin(baud, config); -#define SERIAL_5N1 0x00 -#define SERIAL_6N1 0x02 -#define SERIAL_7N1 0x04 -#define SERIAL_8N1 0x06 -#define SERIAL_5N2 0x08 -#define SERIAL_6N2 0x0A -#define SERIAL_7N2 0x0C -#define SERIAL_8N2 0x0E -#define SERIAL_5E1 0x20 -#define SERIAL_6E1 0x22 -#define SERIAL_7E1 0x24 -#define SERIAL_8E1 0x26 -#define SERIAL_5E2 0x28 -#define SERIAL_6E2 0x2A -#define SERIAL_7E2 0x2C -#define SERIAL_8E2 0x2E -#define SERIAL_5O1 0x30 -#define SERIAL_6O1 0x32 -#define SERIAL_7O1 0x34 -#define SERIAL_8O1 0x36 -#define SERIAL_5O2 0x38 -#define SERIAL_6O2 0x3A -#define SERIAL_7O2 0x3C -#define SERIAL_8O2 0x3E +    // Interrupt handlers - Not intended to be called externally +    inline void _rx_complete_irq(void); +    void _tx_udr_empty_irq(void); +};  #if defined(UBRRH) || defined(UBRR0H)    extern HardwareSerial Serial; -#elif defined(USBCON) -  #include "USBAPI.h" -//  extern HardwareSerial Serial_;   +  #define HAVE_HWSERIAL0  #endif  #if defined(UBRR1H)    extern HardwareSerial Serial1; +  #define HAVE_HWSERIAL1  #endif  #if defined(UBRR2H)    extern HardwareSerial Serial2; +  #define HAVE_HWSERIAL2  #endif  #if defined(UBRR3H)    extern HardwareSerial Serial3; +  #define HAVE_HWSERIAL3  #endif  extern void serialEventRun(void) __attribute__((weak)); diff --git a/cores/arduino/HardwareSerial0.cpp b/cores/arduino/HardwareSerial0.cpp new file mode 100644 index 0000000..67495ad --- /dev/null +++ b/cores/arduino/HardwareSerial0.cpp @@ -0,0 +1,79 @@ +/* +  HardwareSerial0.cpp - Hardware serial library for Wiring +  Copyright (c) 2006 Nicholas Zambetti.  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 +  Modified 28 September 2010 by Mark Sproul +  Modified 14 August 2012 by Alarus +  Modified 3 December 2013 by Matthijs Kooijman +*/ + +#include "Arduino.h" +#include "HardwareSerial.h" +#include "HardwareSerial_private.h" + +// Each HardwareSerial is defined in its own file, sine the linker pulls +// in the entire file when any element inside is used. --gc-sections can +// additionally cause unused symbols to be dropped, but ISRs have the +// "used" attribute so are never dropped and they keep the +// HardwareSerial instance in as well. Putting each instance in its own +// file prevents the linker from pulling in any unused instances in the +// first place. + +#if defined(HAVE_HWSERIAL0) + +#if defined(USART_RX_vect) +  ISR(USART_RX_vect) +#elif defined(USART0_RX_vect) +  ISR(USART0_RX_vect) +#elif defined(USART_RXC_vect) +  ISR(USART_RXC_vect) // ATmega8 +#else +  #error "Don't know what the Data Received vector is called for the first UART" +#endif +  { +    Serial._rx_complete_irq(); +  } + +#if defined(UART0_UDRE_vect) +ISR(UART0_UDRE_vect) +#elif defined(UART_UDRE_vect) +ISR(UART_UDRE_vect) +#elif defined(USART0_UDRE_vect) +ISR(USART0_UDRE_vect) +#elif defined(USART_UDRE_vect) +ISR(USART_UDRE_vect) +#else +  #error "Don't know what the Data Register Empty vector is called for the first UART" +#endif +{ +  Serial._tx_udr_empty_irq(); +} + +#if defined(UBRRH) && defined(UBRRL) +  HardwareSerial Serial(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); +#else +  HardwareSerial Serial(&UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UCSR0C, &UDR0); +#endif + +// Function that can be weakly referenced by serialEventRun to prevent +// pulling in this file if it's not otherwise used. +bool Serial0_available() { +  return Serial.available(); +} + +#endif // HAVE_HWSERIAL0 diff --git a/cores/arduino/HardwareSerial1.cpp b/cores/arduino/HardwareSerial1.cpp new file mode 100644 index 0000000..ec076e7 --- /dev/null +++ b/cores/arduino/HardwareSerial1.cpp @@ -0,0 +1,79 @@ +/* +  HardwareSerial1.cpp - Hardware serial library for Wiring +  Copyright (c) 2006 Nicholas Zambetti.  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 +  Modified 28 September 2010 by Mark Sproul +  Modified 14 August 2012 by Alarus +  Modified 3 December 2013 by Matthijs Kooijman +*/ + +#include "Arduino.h" +#include "HardwareSerial.h" +#include "HardwareSerial_private.h" + +// Each HardwareSerial is defined in its own file, sine the linker pulls +// in the entire file when any element inside is used. --gc-sections can +// additionally cause unused symbols to be dropped, but ISRs have the +// "used" attribute so are never dropped and they keep the +// HardwareSerial instance in as well. Putting each instance in its own +// file prevents the linker from pulling in any unused instances in the +// first place. + +#if defined(HAVE_HWSERIAL1) + +#if defined(USART_RX_vect) +  ISR(USART_RX_vect) +#elif defined(USART1_RX_vect) +  ISR(USART1_RX_vect) +#elif defined(USART_RXC_vect) +  ISR(USART_RXC_vect) // ATmega8 +#else +  #error "Don't know what the Data Received vector is called for the first UART" +#endif +  { +    Serial1._rx_complete_irq(); +  } + +#if defined(UART1_UDRE_vect) +ISR(UART1_UDRE_vect) +#elif defined(UART_UDRE_vect) +ISR(UART_UDRE_vect) +#elif defined(USART1_UDRE_vect) +ISR(USART1_UDRE_vect) +#elif defined(USART_UDRE_vect) +ISR(USART_UDRE_vect) +#else +  #error "Don't know what the Data Register Empty vector is called for the first UART" +#endif +{ +  Serial1._tx_udr_empty_irq(); +} + +#if defined(UBRRH) && defined(UBRRL) +  HardwareSerial Serial1(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); +#else +  HardwareSerial Serial1(&UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1); +#endif + +// Function that can be weakly referenced by serialEventRun to prevent +// pulling in this file if it's not otherwise used. +bool Serial1_available() { +  return Serial1.available(); +} + +#endif // HAVE_HWSERIAL1 diff --git a/cores/arduino/HardwareSerial2.cpp b/cores/arduino/HardwareSerial2.cpp new file mode 100644 index 0000000..e700770 --- /dev/null +++ b/cores/arduino/HardwareSerial2.cpp @@ -0,0 +1,79 @@ +/* +  HardwareSerial2.cpp - Hardware serial library for Wiring +  Copyright (c) 2006 Nicholas Zambetti.  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 +  Modified 28 September 2010 by Mark Sproul +  Modified 14 August 2012 by Alarus +  Modified 3 December 2013 by Matthijs Kooijman +*/ + +#include "Arduino.h" +#include "HardwareSerial.h" +#include "HardwareSerial_private.h" + +// Each HardwareSerial is defined in its own file, sine the linker pulls +// in the entire file when any element inside is used. --gc-sections can +// additionally cause unused symbols to be dropped, but ISRs have the +// "used" attribute so are never dropped and they keep the +// HardwareSerial instance in as well. Putting each instance in its own +// file prevents the linker from pulling in any unused instances in the +// first place. + +#if defined(HAVE_HWSERIAL2) + +#if defined(USART_RX_vect) +  ISR(USART_RX_vect) +#elif defined(USART2_RX_vect) +  ISR(USART2_RX_vect) +#elif defined(USART_RXC_vect) +  ISR(USART_RXC_vect) // ATmega8 +#else +  #error "Don't know what the Data Received vector is called for the first UART" +#endif +  { +    Serial2._rx_complete_irq(); +  } + +#if defined(UART2_UDRE_vect) +ISR(UART2_UDRE_vect) +#elif defined(UART_UDRE_vect) +ISR(UART_UDRE_vect) +#elif defined(USART2_UDRE_vect) +ISR(USART2_UDRE_vect) +#elif defined(USART_UDRE_vect) +ISR(USART_UDRE_vect) +#else +  #error "Don't know what the Data Register Empty vector is called for the first UART" +#endif +{ +  Serial2._tx_udr_empty_irq(); +} + +#if defined(UBRRH) && defined(UBRRL) +  HardwareSerial Serial2(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); +#else +  HardwareSerial Serial2(&UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UCSR2C, &UDR2); +#endif + +// Function that can be weakly referenced by serialEventRun to prevent +// pulling in this file if it's not otherwise used. +bool Serial2_available() { +  return Serial2.available(); +} + +#endif // HAVE_HWSERIAL2 diff --git a/cores/arduino/HardwareSerial3.cpp b/cores/arduino/HardwareSerial3.cpp new file mode 100644 index 0000000..300c4bd --- /dev/null +++ b/cores/arduino/HardwareSerial3.cpp @@ -0,0 +1,79 @@ +/* +  HardwareSerial3.cpp - Hardware serial library for Wiring +  Copyright (c) 2006 Nicholas Zambetti.  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 +  Modified 28 September 2010 by Mark Sproul +  Modified 14 August 2012 by Alarus +  Modified 3 December 2013 by Matthijs Kooijman +*/ + +#include "Arduino.h" +#include "HardwareSerial.h" +#include "HardwareSerial_private.h" + +// Each HardwareSerial is defined in its own file, sine the linker pulls +// in the entire file when any element inside is used. --gc-sections can +// additionally cause unused symbols to be dropped, but ISRs have the +// "used" attribute so are never dropped and they keep the +// HardwareSerial instance in as well. Putting each instance in its own +// file prevents the linker from pulling in any unused instances in the +// first place. + +#if defined(HAVE_HWSERIAL3) + +#if defined(USART_RX_vect) +  ISR(USART_RX_vect) +#elif defined(USART3_RX_vect) +  ISR(USART3_RX_vect) +#elif defined(USART_RXC_vect) +  ISR(USART_RXC_vect) // ATmega8 +#else +  #error "Don't know what the Data Received vector is called for the first UART" +#endif +  { +    Serial3._rx_complete_irq(); +  } + +#if defined(UART3_UDRE_vect) +ISR(UART3_UDRE_vect) +#elif defined(UART_UDRE_vect) +ISR(UART_UDRE_vect) +#elif defined(USART3_UDRE_vect) +ISR(USART3_UDRE_vect) +#elif defined(USART_UDRE_vect) +ISR(USART_UDRE_vect) +#else +  #error "Don't know what the Data Register Empty vector is called for the first UART" +#endif +{ +  Serial3._tx_udr_empty_irq(); +} + +#if defined(UBRRH) && defined(UBRRL) +  HardwareSerial Serial3(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR); +#else +  HardwareSerial Serial3(&UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3); +#endif + +// Function that can be weakly referenced by serialEventRun to prevent +// pulling in this file if it's not otherwise used. +bool Serial3_available() { +  return Serial3.available(); +} + +#endif // HAVE_HWSERIAL3 diff --git a/cores/arduino/HardwareSerial_private.h b/cores/arduino/HardwareSerial_private.h new file mode 100644 index 0000000..915d7a1 --- /dev/null +++ b/cores/arduino/HardwareSerial_private.h @@ -0,0 +1,118 @@ +/* +  HardwareSerial_private.h - Hardware serial library for Wiring +  Copyright (c) 2006 Nicholas Zambetti.  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 +  Modified 28 September 2010 by Mark Sproul +  Modified 14 August 2012 by Alarus +*/ + +#include "wiring_private.h" + +// this next line disables the entire HardwareSerial.cpp,  +// this is so I can support Attiny series and any other chip without a uart +#if defined(HAVE_HWSERIAL0) || defined(HAVE_HWSERIAL1) || defined(HAVE_HWSERIAL2) || defined(HAVE_HWSERIAL3) + +// Ensure that the various bit positions we use are available with a 0 +// postfix, so we can always use the values for UART0 for all UARTs. The +// alternative, passing the various values for each UART to the +// HardwareSerial constructor also works, but makes the code bigger and +// slower. +#if !defined(TXC0) +#if defined(TXC) +// On ATmega8, the uart and its bits are not numbered, so there is no TXC0 etc. +#define TXC0 TXC +#define RXEN0 RXEN +#define TXEN0 TXEN +#define RXCIE0 RXCIE +#define UDRIE0 UDRIE +#define U2X0 U2X +#define UPE0 UPE +#define UDRE0 UDRE +#elif defined(TXC1) +// Some devices have uart1 but no uart0 +#define TXC0 TXC1 +#define RXEN0 RXEN1 +#define TXEN0 TXEN1 +#define RXCIE0 RXCIE1 +#define UDRIE0 UDRIE1 +#define U2X0 U2X1 +#define UPE0 UPE1 +#define UDRE0 UDRE1 +#else +#error No UART found in HardwareSerial.cpp +#endif +#endif // !defined TXC0 + +// Check at compiletime that it is really ok to use the bit positions of +// UART0 for the other UARTs as well, in case these values ever get +// changed for future hardware. +#if defined(TXC1) && (TXC1 != TXC0 || RXEN1 != RXEN0 || RXCIE1 != RXCIE0 || \ +		      UDRIE1 != UDRIE0 || U2X1 != U2X0 || UPE1 != UPE0 || \ +		      UDRE1 != UDRE0) +#error "Not all bit positions for UART1 are the same as for UART0" +#endif +#if defined(TXC2) && (TXC2 != TXC0 || RXEN2 != RXEN0 || RXCIE2 != RXCIE0 || \ +		      UDRIE2 != UDRIE0 || U2X2 != U2X0 || UPE2 != UPE0 || \ +		      UDRE2 != UDRE0) +#error "Not all bit positions for UART2 are the same as for UART0" +#endif +#if defined(TXC3) && (TXC3 != TXC0 || RXEN3 != RXEN0 || RXCIE3 != RXCIE0 || \ +		      UDRIE3 != UDRIE0 || U3X3 != U3X0 || UPE3 != UPE0 || \ +		      UDRE3 != UDRE0) +#error "Not all bit positions for UART3 are the same as for UART0" +#endif + +// Constructors //////////////////////////////////////////////////////////////// + +HardwareSerial::HardwareSerial( +  volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, +  volatile uint8_t *ucsra, volatile uint8_t *ucsrb, +  volatile uint8_t *ucsrc, volatile uint8_t *udr) : +    _ubrrh(ubrrh), _ubrrl(ubrrl), +    _ucsra(ucsra), _ucsrb(ucsrb), _ucsrc(ucsrc), +    _udr(udr), +    _rx_buffer_head(0), _rx_buffer_tail(0), +    _tx_buffer_head(0), _tx_buffer_tail(0) +{ +} + +// Actual interrupt handlers ////////////////////////////////////////////////////////////// + +void HardwareSerial::_rx_complete_irq(void) +{ +  if (bit_is_clear(*_ucsra, UPE0)) { +    // No Parity error, read byte and store it in the buffer if there is +    // room +    unsigned char c = *_udr; +    int i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_BUFFER_SIZE; + +    // if we should be storing the received character into the location +    // just before the tail (meaning that the head would advance to the +    // current location of the tail), we're about to overflow the buffer +    // and so we don't write the character or advance the head. +    if (i != _rx_buffer_tail) { +      _rx_buffer[_rx_buffer_head] = c; +      _rx_buffer_head = i; +    } +  } else { +    // Parity error, read byte but discard it +    *_udr; +  }; +} + +#endif // whole file diff --git a/cores/arduino/IPAddress.cpp b/cores/arduino/IPAddress.cpp index f698f2a..22a0e42 100644 --- a/cores/arduino/IPAddress.cpp +++ b/cores/arduino/IPAddress.cpp @@ -1,3 +1,21 @@ +/* +  IPAddress.cpp - Base class that provides IPAddress +  Copyright (c) 2011 Adrian McEwen.  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 +*/  #include <Arduino.h>  #include <IPAddress.h> diff --git a/cores/arduino/IPAddress.h b/cores/arduino/IPAddress.h index ce396f1..6ea8127 100644 --- a/cores/arduino/IPAddress.h +++ b/cores/arduino/IPAddress.h @@ -1,27 +1,21 @@  /* - * - * MIT License: - * Copyright (c) 2011 Adrian McEwen - * 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: - *  - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - *  - * 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. - * - * adrianm@mcqn.com 1/1/2011 - */ +  IPAddress.h - Base class that provides IPAddress +  Copyright (c) 2011 Adrian McEwen.  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 IPAddress_h  #define IPAddress_h diff --git a/cores/arduino/Server.h b/cores/arduino/Server.h index 9674c76..77c415c 100644 --- a/cores/arduino/Server.h +++ b/cores/arduino/Server.h @@ -1,3 +1,22 @@ +/* +  Server.h - Base class that provides Server +  Copyright (c) 2011 Adrian McEwen.  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 server_h  #define server_h diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index da2e869..5a33002 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -55,6 +55,8 @@ public:  };  extern Serial_ Serial; +#define HAVE_CDCSERIAL +  //================================================================================  //================================================================================  //	Mouse diff --git a/cores/arduino/binary.h b/cores/arduino/binary.h index af14980..aec4c73 100644 --- a/cores/arduino/binary.h +++ b/cores/arduino/binary.h @@ -1,3 +1,22 @@ +/* +  binary.h - Definitions for binary constants +  Copyright (c) 2006 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 Binary_h  #define Binary_h diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index 3d4e079..0ad6962 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -1,3 +1,22 @@ +/* +  main.cpp - Main loop for Arduino sketches +  Copyright (c) 2005-2013 Arduino Team.  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 +*/ +  #include <Arduino.h>  int main(void) diff --git a/platform.txt b/platform.txt index 3066ce4..2adf29f 100644 --- a/platform.txt +++ b/platform.txt @@ -17,7 +17,7 @@ compiler.c.cmd=avr-gcc  compiler.c.flags=-c -g -Os -w -ffunction-sections -fdata-sections -MMD  compiler.c.elf.flags=-Os -Wl,--gc-sections  compiler.c.elf.cmd=avr-gcc -compiler.S.flags=-c -g -assembler-with-cpp +compiler.S.flags=-c -g -x assembler-with-cpp  compiler.cpp.cmd=avr-g++  compiler.cpp.flags=-c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD  compiler.ar.cmd=avr-ar diff --git a/variants/ethernet/pins_arduino.h b/variants/ethernet/pins_arduino.h index 1d54549..cdcb0ed 100644 --- a/variants/ethernet/pins_arduino.h +++ b/variants/ethernet/pins_arduino.h @@ -37,23 +37,23 @@  #define digitalPinHasPWM(p)         ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)  #endif -#define SS   10 -#define MOSI 11 -#define MISO 12 -#define SCK  13 +static const uint8_t SS   = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 12; +static const uint8_t SCK  = 13; -#define SDA 18 -#define SCL 19 +static const uint8_t SDA = 18; +static const uint8_t SCL = 19;  #define LED_BUILTIN 9 -#define A0 14 -#define A1 15 -#define A2 16 -#define A3 17 -#define A4 18 -#define A5 19 -#define A6 20 -#define A7 21 +static const uint8_t A0 = 14; +static const uint8_t A1 = 15; +static const uint8_t A2 = 16; +static const uint8_t A3 = 17; +static const uint8_t A4 = 18; +static const uint8_t A5 = 19; +static const uint8_t A6 = 20; +static const uint8_t A7 = 21;  #define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))  #define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) diff --git a/variants/leonardo/pins_arduino.h b/variants/leonardo/pins_arduino.h index be9d0f2..fd75373 100644 --- a/variants/leonardo/pins_arduino.h +++ b/variants/leonardo/pins_arduino.h @@ -99,30 +99,30 @@  #define RXLED0			PORTB |= (1<<0)  #define RXLED1			PORTB &= ~(1<<0) -#define SDA 2 -#define SCL 3 +static const uint8_t SDA = 2; +static const uint8_t SCL = 3;  #define LED_BUILTIN 13  // Map SPI port to 'new' pins D14..D17 -#define SS   17 -#define MOSI 16 -#define MISO 14 -#define SCK  15 +static const uint8_t SS   = 17; +static const uint8_t MOSI = 16; +static const uint8_t MISO = 14; +static const uint8_t SCK  = 15;  // Mapping of analog pins as digital I/O  // A6-A11 share with digital pins -#define A0 18 -#define A1 19 -#define A2 20 -#define A3 21 -#define A4 22 -#define A5 23 -#define A6 24	// D4 -#define A7 25	// D6 -#define A8 26	// D8 -#define A9 27	// D9 -#define A10 28	// D10 -#define A11 29	// D12 +static const uint8_t A0 = 18; +static const uint8_t A1 = 19; +static const uint8_t A2 = 20; +static const uint8_t A3 = 21; +static const uint8_t A4 = 22; +static const uint8_t A5 = 23; +static const uint8_t A6 = 24;	// D4 +static const uint8_t A7 = 25;	// D6 +static const uint8_t A8 = 26;	// D8 +static const uint8_t A9 = 27;	// D9 +static const uint8_t A10 = 28;	// D10 +static const uint8_t A11 = 29;	// D12  #define digitalPinToPCICR(p)    ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0))  #define digitalPinToPCICRbit(p) 0 diff --git a/variants/mega/pins_arduino.h b/variants/mega/pins_arduino.h index 9b43971..a80991b 100644 --- a/variants/mega/pins_arduino.h +++ b/variants/mega/pins_arduino.h @@ -32,31 +32,31 @@  #define analogInputToDigitalPin(p)  ((p < 16) ? (p) + 54 : -1)  #define digitalPinHasPWM(p)         (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46)) -#define SS   53 -#define MOSI 51 -#define MISO 50 -#define SCK  52 +static const uint8_t SS   = 53; +static const uint8_t MOSI = 51; +static const uint8_t MISO = 50; +static const uint8_t SCK  = 52; -#define SDA 20 -#define SCL 21 +static const uint8_t SDA = 20; +static const uint8_t SCL = 21;  #define LED_BUILTIN 13 -#define A0 54 -#define A1 55 -#define A2 56 -#define A3 57 -#define A4 58 -#define A5 59 -#define A6 60 -#define A7 61 -#define A8 62 -#define A9 63 -#define A10 64 -#define A11 65 -#define A12 66 -#define A13 67 -#define A14 68 -#define A15 69 +static const uint8_t A0 = 54; +static const uint8_t A1 = 55; +static const uint8_t A2 = 56; +static const uint8_t A3 = 57; +static const uint8_t A4 = 58; +static const uint8_t A5 = 59; +static const uint8_t A6 = 60; +static const uint8_t A7 = 61; +static const uint8_t A8 = 62; +static const uint8_t A9 = 63; +static const uint8_t A10 = 64; +static const uint8_t A11 = 65; +static const uint8_t A12 = 66; +static const uint8_t A13 = 67; +static const uint8_t A14 = 68; +static const uint8_t A15 = 69;  // A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins)  // Only pins available for RECEIVE (TRANSMIT can be on any pin): diff --git a/variants/robot_control/pins_arduino.h b/variants/robot_control/pins_arduino.h index 04a5dc5..b868064 100644 --- a/variants/robot_control/pins_arduino.h +++ b/variants/robot_control/pins_arduino.h @@ -43,52 +43,52 @@  #define D4 TKD4  #define D5 TKD5 -#define RX  0 -#define TX  1 -#define SDA 2 -#define SCL 3 +static const uint8_t RX  = 0; +static const uint8_t TX  = 1; +static const uint8_t SDA = 2; +static const uint8_t SCL = 3;  // Map SPI port to 'new' pins D14..D17 -#define SS   17 -#define MOSI 16 -#define MISO 14 -#define SCK  15 +static const uint8_t SS   = 17; +static const uint8_t MOSI = 16; +static const uint8_t MISO = 14; +static const uint8_t SCK  = 15;  // Mapping of analog pins as digital I/O  // A6-A11 share with digital pins -#define A0  18 -#define A1  19 -#define A2  20 -#define A3  21 -#define A4  22 -#define A5  23 -#define A6  24  // D4 -#define A7  25  // D6 -#define A8  26  // D8 -#define A9  27  // D9 -#define A10 28  // D10 -#define A11 29  // D12 +static const uint8_t A0 = 18; +static const uint8_t A1 = 19; +static const uint8_t A2 = 20; +static const uint8_t A3 = 21; +static const uint8_t A4 = 22; +static const uint8_t A5 = 23; +static const uint8_t A6 = 24;	// D4 +static const uint8_t A7 = 25;	// D6 +static const uint8_t A8 = 26;	// D8 +static const uint8_t A9 = 27;	// D9 +static const uint8_t A10 = 28;	// D10 +static const uint8_t A11 = 29;	// D12  // Specific Mapping for the Control Board -#define KEY     18  // AD0 -#define MUX_IN  24 	// ADC8 - A6 -#define MUXA    6  	// D5 - TKD4 -#define MUXB    11  // D11 -#define MUXC    12  // D12 - TKD5 -#define MUXD    13  // D13 -#define BUZZ    5   // D5 -#define POT     23  // AD5 -#define DC_LCD  10 	// D10 -#define LCD_CS  9  	// D9 -#define RST_LCD 7   // D6 -#define CARD_CS 8   // D8 -#define TKD0    19  // ADC6 - A1 -#define TKD1    20  // ADC5 - A2 -#define TKD2    21  // ADC4 - A3 -#define TKD3    22  // ADC1 - A4 -#define TKD4    6   // D5 - MUXA -#define TKD5    12  // D12 - MUXC -#define LED1    17  // D17 - RX_Led +static const uint8_t KEY 	= 18;  	// AD0 +static const uint8_t MUX_IN = 24; 	// ADC8 - A6 +static const uint8_t MUXA 	= 6;  	// D5 - TKD4 +static const uint8_t MUXB 	= 11;  	// D11 +static const uint8_t MUXC 	= 12;  	// D12 - TKD5 +static const uint8_t MUXD 	= 13;   // D13 +static const uint8_t BUZZ 	= 5;   	// D5 +static const uint8_t POT 	= 23;  	// AD5 +static const uint8_t DC_LCD = 10; 	// D10 +static const uint8_t LCD_CS = 9;  	// D9 +static const uint8_t RST_LCD = 7; 	// D6 +static const uint8_t CARD_CS = 8;   // D8 +static const uint8_t TKD0	 = 19;  // ADC6 - A1 +static const uint8_t TKD1	 = 20;  // ADC5 - A2 +static const uint8_t TKD2	 = 21;  // ADC4 - A3 +static const uint8_t TKD3	 = 22;  // ADC1 - A4 +static const uint8_t TKD4	 = 6;   // D5 - MUXA +static const uint8_t TKD5	 = 12;  // D12 - MUXC +static const uint8_t LED1	 = 17;  // D17 - RX_Led  //	__AVR_ATmega32U4__ has an unusual mapping of pins to channels  extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; diff --git a/variants/robot_motor/pins_arduino.h b/variants/robot_motor/pins_arduino.h index f159f1e..7dc4a79 100644 --- a/variants/robot_motor/pins_arduino.h +++ b/variants/robot_motor/pins_arduino.h @@ -41,49 +41,49 @@  #define D8 TK4  #define D7 TK3 -#define RX  0 -#define TX  1 -#define SDA 2 -#define SCL 3 +static const uint8_t RX  = 0; +static const uint8_t TX  = 1; +static const uint8_t SDA = 2; +static const uint8_t SCL = 3;  // Map SPI port to 'new' pins D14..D17 -#define SS   17 -#define MOSI 16 -#define MISO 14 -#define SCK  15 +static const uint8_t SS   = 17; +static const uint8_t MOSI = 16; +static const uint8_t MISO = 14; +static const uint8_t SCK  = 15;  // Mapping of analog pins as digital I/O  // A6-A11 share with digital pins -#define A0  18 -#define A1  19 -#define A2  20 -#define A3  21 -#define A4  22 -#define A5  23 -#define A6  24 // D4 -#define A7  25 // D6 -#define A8  26 // D8 -#define A9  27 // D9 -#define A10 28 // D10 -#define A11 29 // D12 +static const uint8_t A0 = 18; +static const uint8_t A1 = 19; +static const uint8_t A2 = 20; +static const uint8_t A3 = 21; +static const uint8_t A4 = 22; +static const uint8_t A5 = 23; +static const uint8_t A6 = 24;	// D4 +static const uint8_t A7 = 25;	// D6 +static const uint8_t A8 = 26;	// D8 +static const uint8_t A9 = 27;	// D9 +static const uint8_t A10 = 28;	// D10 +static const uint8_t A11 = 29;	// D12  // Specific Mapping for the Motor Board -#define MUX_IN  20 // A2 -#define MUXA    7  // D7 -#define MUXB    8  // D8 -#define MUXC    11 // D11 -#define MUXI    13 // D13 -#define TRIM    21 // A3 -#define SENSE_A 22 // A4 -#define SENSE_B 23 // A5 -#define IN_A1   6  // D6 - A7 -#define IN_A2   5  // D5 -#define IN_B1   10 // D10 -#define IN_B2   9  // D9 -#define TK1     18 // A0 -#define TK2     19 // A1 -#define TK3     4  // A6 -#define TK4     12 // A11 +static const uint8_t MUX_IN = 20;  	// A2 +static const uint8_t MUXA = 7;  	// D7 +static const uint8_t MUXB = 8;  	// D8 +static const uint8_t MUXC = 11;  	// D11 +static const uint8_t MUXI = 13;   	// D13 +static const uint8_t TRIM = 21;  	// A3 +static const uint8_t SENSE_A = 22; 	// A4 +static const uint8_t SENSE_B = 23; 	// A5 +static const uint8_t IN_A1 = 6;  	// D6 - A7 +static const uint8_t IN_A2 = 5;  	// D5 +static const uint8_t IN_B1 = 10;  	// D10 +static const uint8_t IN_B2 = 9;  	// D9 +static const uint8_t TK1 = 18;  	// A0 +static const uint8_t TK2 = 19;  	// A1 +static const uint8_t TK3 = 4;  		// A6 +static const uint8_t TK4 = 12;   	// A11  //	__AVR_ATmega32U4__ has an unusual mapping of pins to channels  extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; diff --git a/variants/standard/pins_arduino.h b/variants/standard/pins_arduino.h index d0eb464..3d4a9f6 100644 --- a/variants/standard/pins_arduino.h +++ b/variants/standard/pins_arduino.h @@ -37,23 +37,23 @@  #define digitalPinHasPWM(p)         ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)  #endif -#define SS   10 -#define MOSI 11 -#define MISO 12 -#define SCK  13 +static const uint8_t SS   = 10; +static const uint8_t MOSI = 11; +static const uint8_t MISO = 12; +static const uint8_t SCK  = 13; -#define SDA 18 -#define SCL 19 +static const uint8_t SDA = 18; +static const uint8_t SCL = 19;  #define LED_BUILTIN 13 -#define A0 14 -#define A1 15 -#define A2 16 -#define A3 17 -#define A4 18 -#define A5 19 -#define A6 20 -#define A7 21 +static const uint8_t A0 = 14; +static const uint8_t A1 = 15; +static const uint8_t A2 = 16; +static const uint8_t A3 = 17; +static const uint8_t A4 = 18; +static const uint8_t A5 = 19; +static const uint8_t A6 = 20; +static const uint8_t A7 = 21;  #define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))  #define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))  | 
