aboutsummaryrefslogtreecommitdiff
path: root/cores/arduino
diff options
context:
space:
mode:
Diffstat (limited to 'cores/arduino')
-rw-r--r--cores/arduino/Arduino.h34
-rw-r--r--cores/arduino/CDC.cpp60
-rw-r--r--cores/arduino/HID.cpp10
-rw-r--r--cores/arduino/HardwareSerial.cpp12
-rw-r--r--cores/arduino/HardwareSerial.h30
-rw-r--r--cores/arduino/HardwareSerial0.cpp4
-rw-r--r--cores/arduino/HardwareSerial1.cpp28
-rw-r--r--cores/arduino/HardwareSerial2.cpp32
-rw-r--r--cores/arduino/HardwareSerial3.cpp32
-rw-r--r--cores/arduino/HardwareSerial_private.h7
-rw-r--r--cores/arduino/IPAddress.cpp24
-rw-r--r--cores/arduino/IPAddress.h16
-rw-r--r--cores/arduino/Stream.cpp4
-rw-r--r--cores/arduino/USBAPI.h5
-rw-r--r--cores/arduino/USBCore.cpp23
-rw-r--r--cores/arduino/avr-libc/malloc.c267
-rw-r--r--cores/arduino/avr-libc/realloc.c150
-rw-r--r--cores/arduino/avr-libc/sectionname.h49
-rw-r--r--cores/arduino/avr-libc/stdlib_private.h58
-rw-r--r--cores/arduino/main.cpp7
-rw-r--r--cores/arduino/wiring_analog.c8
-rw-r--r--cores/arduino/wiring_digital.c3
-rw-r--r--cores/arduino/wiring_private.h2
23 files changed, 161 insertions, 704 deletions
diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h
index e12ac82..630f0d6 100644
--- a/cores/arduino/Arduino.h
+++ b/cores/arduino/Arduino.h
@@ -21,6 +21,7 @@
#define Arduino_h
#include <stdlib.h>
+#include <stdbool.h>
#include <string.h>
#include <math.h>
@@ -43,9 +44,6 @@ void yield(void);
#define OUTPUT 0x1
#define INPUT_PULLUP 0x2
-#define true 0x1
-#define false 0x0
-
#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398
#define TWO_PI 6.283185307179586476925286766559
@@ -120,6 +118,7 @@ typedef uint8_t boolean;
typedef uint8_t byte;
void init(void);
+void initVariant(void);
void pinMode(uint8_t, uint8_t);
void digitalWrite(uint8_t, uint8_t);
@@ -196,20 +195,21 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
#define TIMER0B 2
#define TIMER1A 3
#define TIMER1B 4
-#define TIMER2 5
-#define TIMER2A 6
-#define TIMER2B 7
-
-#define TIMER3A 8
-#define TIMER3B 9
-#define TIMER3C 10
-#define TIMER4A 11
-#define TIMER4B 12
-#define TIMER4C 13
-#define TIMER4D 14
-#define TIMER5A 15
-#define TIMER5B 16
-#define TIMER5C 17
+#define TIMER1C 5
+#define TIMER2 6
+#define TIMER2A 7
+#define TIMER2B 8
+
+#define TIMER3A 9
+#define TIMER3B 10
+#define TIMER3C 11
+#define TIMER4A 12
+#define TIMER4B 13
+#define TIMER4C 14
+#define TIMER4D 15
+#define TIMER5A 16
+#define TIMER5B 17
+#define TIMER5C 18
#ifdef __cplusplus
} // extern "C"
diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp
index a691306..bf3d076 100644
--- a/cores/arduino/CDC.cpp
+++ b/cores/arduino/CDC.cpp
@@ -114,64 +114,43 @@ bool WEAK CDC_Setup(Setup& setup)
}
-int _serialPeek = -1;
-void Serial_::begin(unsigned long baud_count)
+void Serial_::begin(unsigned long /* baud_count */)
{
+ peek_buffer = -1;
}
-void Serial_::begin(unsigned long baud_count, byte config)
+void Serial_::begin(unsigned long /* baud_count */, byte /* config */)
{
+ peek_buffer = -1;
}
void Serial_::end(void)
{
}
-void Serial_::accept(void)
-{
- 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.
-
- // while we have room to store a byte
- while (i != _rx_buffer_tail) {
- int c = USB_Recv(CDC_RX);
- if (c == -1)
- break; // no more data
- _rx_buffer[_rx_buffer_head] = c;
- _rx_buffer_head = i;
-
- i = (unsigned int)(_rx_buffer_head+1) % SERIAL_BUFFER_SIZE;
- }
-}
-
int Serial_::available(void)
{
- return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_BUFFER_SIZE;
+ if (peek_buffer >= 0) {
+ return 1 + USB_Available(CDC_RX);
+ }
+ return USB_Available(CDC_RX);
}
int Serial_::peek(void)
{
- if (_rx_buffer_head == _rx_buffer_tail) {
- return -1;
- } else {
- return _rx_buffer[_rx_buffer_tail];
- }
+ if (peek_buffer < 0)
+ peek_buffer = USB_Recv(CDC_RX);
+ return peek_buffer;
}
int Serial_::read(void)
{
- // if the head isn't ahead of the tail, we don't have any characters
- if (_rx_buffer_head == _rx_buffer_tail) {
- return -1;
- } else {
- unsigned char c = _rx_buffer[_rx_buffer_tail];
- _rx_buffer_tail = (unsigned int)(_rx_buffer_tail + 1) % SERIAL_BUFFER_SIZE;
+ if (peek_buffer >= 0) {
+ int c = peek_buffer;
+ peek_buffer = -1;
return c;
- }
+ }
+ return USB_Recv(CDC_RX);
}
void Serial_::flush(void)
@@ -181,6 +160,11 @@ void Serial_::flush(void)
size_t Serial_::write(uint8_t c)
{
+ return write(&c, 1);
+}
+
+size_t Serial_::write(const uint8_t *buffer, size_t size)
+{
/* only try to send bytes if the high-level CDC connection itself
is open (not just the pipe) - the OS should set lineState when the port
is opened and clear lineState when the port is closed.
@@ -191,7 +175,7 @@ size_t Serial_::write(uint8_t c)
// open connection isn't broken cleanly (cable is yanked out, host dies
// or locks up, or host virtual serial port hangs)
if (_usbLineInfo.lineState > 0) {
- int r = USB_Send(CDC_TX,&c,1);
+ int r = USB_Send(CDC_TX,buffer,size);
if (r > 0) {
return r;
} else {
diff --git a/cores/arduino/HID.cpp b/cores/arduino/HID.cpp
index ac63608..a94538c 100644
--- a/cores/arduino/HID.cpp
+++ b/cores/arduino/HID.cpp
@@ -151,7 +151,7 @@ int WEAK HID_GetInterface(u8* interfaceNum)
return USB_SendControl(TRANSFER_PGM,&_hidInterface,sizeof(_hidInterface));
}
-int WEAK HID_GetDescriptor(int i)
+int WEAK HID_GetDescriptor(int /* i */)
{
return USB_SendControl(TRANSFER_PGM,_hidReportDescriptor,sizeof(_hidReportDescriptor));
}
@@ -510,11 +510,11 @@ void Keyboard_::releaseAll(void)
size_t Keyboard_::write(uint8_t c)
{
- uint8_t p = press(c); // Keydown
- uint8_t r = release(c); // Keyup
- return (p); // just return the result of press() since release() almost always returns 1
+ uint8_t p = press(c); // Keydown
+ release(c); // Keyup
+ return p; // just return the result of press() since release() almost always returns 1
}
#endif
-#endif /* if defined(USBCON) */ \ No newline at end of file
+#endif /* if defined(USBCON) */
diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp
index a270ace..ed29641 100644
--- a/cores/arduino/HardwareSerial.cpp
+++ b/cores/arduino/HardwareSerial.cpp
@@ -72,7 +72,7 @@ void serialEventRun(void)
if (Serial2_available && serialEvent2 && Serial2_available()) serialEvent2();
#endif
#if defined(HAVE_HWSERIAL3)
- if (Serial3_available && serialEvent2 && Serial3_available()) serialEvent3();
+ if (Serial3_available && serialEvent3 && Serial3_available()) serialEvent3();
#endif
}
@@ -83,7 +83,7 @@ void HardwareSerial::_tx_udr_empty_irq(void)
// 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;
+ _tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_TX_BUFFER_SIZE;
*_udr = c;
@@ -117,7 +117,7 @@ void HardwareSerial::begin(unsigned long baud, byte config)
baud_setting = (F_CPU / 8 / baud - 1) / 2;
}
- // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
+ // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
*_ubrrh = baud_setting >> 8;
*_ubrrl = baud_setting;
@@ -152,7 +152,7 @@ void HardwareSerial::end()
int HardwareSerial::available(void)
{
- return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_BUFFER_SIZE;
+ return (int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_RX_BUFFER_SIZE;
}
int HardwareSerial::peek(void)
@@ -171,7 +171,7 @@ int HardwareSerial::read(void)
return -1;
} else {
unsigned char c = _rx_buffer[_rx_buffer_tail];
- _rx_buffer_tail = (uint8_t)(_rx_buffer_tail + 1) % SERIAL_BUFFER_SIZE;
+ _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
return c;
}
}
@@ -207,7 +207,7 @@ size_t HardwareSerial::write(uint8_t c)
sbi(*_ucsra, TXC0);
return 1;
}
- uint8_t i = (_tx_buffer_head + 1) % SERIAL_BUFFER_SIZE;
+ tx_buffer_index_t i = (_tx_buffer_head + 1) % SERIAL_TX_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
diff --git a/cores/arduino/HardwareSerial.h b/cores/arduino/HardwareSerial.h
index 226bf57..b96e5d0 100644
--- a/cores/arduino/HardwareSerial.h
+++ b/cores/arduino/HardwareSerial.h
@@ -32,10 +32,24 @@
// using a ring buffer (I think), in which head is the index of the location
// to which to write the next incoming character and tail is the index of the
// location from which to read.
+#if !(defined(SERIAL_TX_BUFFER_SIZE) && defined(SERIAL_RX_BUFFER_SIZE))
#if (RAMEND < 1000)
- #define SERIAL_BUFFER_SIZE 16
+#define SERIAL_TX_BUFFER_SIZE 16
+#define SERIAL_RX_BUFFER_SIZE 16
#else
- #define SERIAL_BUFFER_SIZE 64
+#define SERIAL_TX_BUFFER_SIZE 64
+#define SERIAL_RX_BUFFER_SIZE 64
+#endif
+#endif
+#if (SERIAL_TX_BUFFER_SIZE>256)
+typedef uint16_t tx_buffer_index_t;
+#else
+typedef uint8_t tx_buffer_index_t;
+#endif
+#if (SERIAL_RX_BUFFER_SIZE>256)
+typedef uint16_t rx_buffer_index_t;
+#else
+typedef uint8_t rx_buffer_index_t;
#endif
// Define config for Serial.begin(baud, config);
@@ -76,16 +90,16 @@ class HardwareSerial : public Stream
// Has any byte been written to the UART since begin()
bool _written;
- volatile uint8_t _rx_buffer_head;
- volatile uint8_t _rx_buffer_tail;
- volatile uint8_t _tx_buffer_head;
- volatile uint8_t _tx_buffer_tail;
+ volatile rx_buffer_index_t _rx_buffer_head;
+ volatile rx_buffer_index_t _rx_buffer_tail;
+ volatile tx_buffer_index_t _tx_buffer_head;
+ volatile tx_buffer_index_t _tx_buffer_tail;
// Don't put any members after these buffers, since only the first
// 32 bytes of this struct can be accessed quickly using the ldd
// instruction.
- unsigned char _rx_buffer[SERIAL_BUFFER_SIZE];
- unsigned char _tx_buffer[SERIAL_BUFFER_SIZE];
+ unsigned char _rx_buffer[SERIAL_RX_BUFFER_SIZE];
+ unsigned char _tx_buffer[SERIAL_TX_BUFFER_SIZE];
public:
inline HardwareSerial(
diff --git a/cores/arduino/HardwareSerial0.cpp b/cores/arduino/HardwareSerial0.cpp
index 67495ad..1146eeb 100644
--- a/cores/arduino/HardwareSerial0.cpp
+++ b/cores/arduino/HardwareSerial0.cpp
@@ -43,7 +43,7 @@
#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"
+ #error "Don't know what the Data Received vector is called for Serial"
#endif
{
Serial._rx_complete_irq();
@@ -58,7 +58,7 @@ 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"
+ #error "Don't know what the Data Register Empty vector is called for Serial"
#endif
{
Serial._tx_udr_empty_irq();
diff --git a/cores/arduino/HardwareSerial1.cpp b/cores/arduino/HardwareSerial1.cpp
index ec076e7..19625e2 100644
--- a/cores/arduino/HardwareSerial1.cpp
+++ b/cores/arduino/HardwareSerial1.cpp
@@ -36,39 +36,29 @@
#if defined(HAVE_HWSERIAL1)
-#if defined(USART_RX_vect)
- ISR(USART_RX_vect)
+#if defined(UART1_RX_vect)
+ISR(UART1_RX_vect)
#elif defined(USART1_RX_vect)
- ISR(USART1_RX_vect)
-#elif defined(USART_RXC_vect)
- ISR(USART_RXC_vect) // ATmega8
+ISR(USART1_RX_vect)
#else
- #error "Don't know what the Data Received vector is called for the first UART"
+#error "Don't know what the Data Register Empty vector is called for Serial1"
#endif
- {
- Serial1._rx_complete_irq();
- }
+{
+ 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"
+#error "Don't know what the Data Register Empty vector is called for Serial1"
#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
+HardwareSerial Serial1(&UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1);
// Function that can be weakly referenced by serialEventRun to prevent
// pulling in this file if it's not otherwise used.
diff --git a/cores/arduino/HardwareSerial2.cpp b/cores/arduino/HardwareSerial2.cpp
index e700770..fd334ae 100644
--- a/cores/arduino/HardwareSerial2.cpp
+++ b/cores/arduino/HardwareSerial2.cpp
@@ -36,39 +36,17 @@
#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();
- }
+ISR(USART2_RX_vect)
+{
+ 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
+HardwareSerial Serial2(&UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UCSR2C, &UDR2);
// Function that can be weakly referenced by serialEventRun to prevent
// pulling in this file if it's not otherwise used.
diff --git a/cores/arduino/HardwareSerial3.cpp b/cores/arduino/HardwareSerial3.cpp
index 300c4bd..a68095b 100644
--- a/cores/arduino/HardwareSerial3.cpp
+++ b/cores/arduino/HardwareSerial3.cpp
@@ -36,39 +36,17 @@
#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();
- }
+ISR(USART3_RX_vect)
+{
+ 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
+HardwareSerial Serial3(&UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3);
// Function that can be weakly referenced by serialEventRun to prevent
// pulling in this file if it's not otherwise used.
diff --git a/cores/arduino/HardwareSerial_private.h b/cores/arduino/HardwareSerial_private.h
index fa20e55..761a5e5 100644
--- a/cores/arduino/HardwareSerial_private.h
+++ b/cores/arduino/HardwareSerial_private.h
@@ -34,6 +34,11 @@
// slower.
#if !defined(TXC0)
#if defined(TXC)
+// Some chips like ATmega8 don't have UPE, only PE. The other bits are
+// named as expected.
+#if !defined(UPE) && defined(PE)
+#define UPE PE
+#endif
// On ATmega8, the uart and its bits are not numbered, so there is no TXC0 etc.
#define TXC0 TXC
#define RXEN0 RXEN
@@ -99,7 +104,7 @@ void HardwareSerial::_rx_complete_irq(void)
// No Parity error, read byte and store it in the buffer if there is
// room
unsigned char c = *_udr;
- uint8_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_BUFFER_SIZE;
+ rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_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
diff --git a/cores/arduino/IPAddress.cpp b/cores/arduino/IPAddress.cpp
index 22a0e42..899cbd4 100644
--- a/cores/arduino/IPAddress.cpp
+++ b/cores/arduino/IPAddress.cpp
@@ -22,42 +22,42 @@
IPAddress::IPAddress()
{
- memset(_address, 0, sizeof(_address));
+ _address.dword = 0;
}
IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
{
- _address[0] = first_octet;
- _address[1] = second_octet;
- _address[2] = third_octet;
- _address[3] = fourth_octet;
+ _address.bytes[0] = first_octet;
+ _address.bytes[1] = second_octet;
+ _address.bytes[2] = third_octet;
+ _address.bytes[3] = fourth_octet;
}
IPAddress::IPAddress(uint32_t address)
{
- memcpy(_address, &address, sizeof(_address));
+ _address.dword = address;
}
IPAddress::IPAddress(const uint8_t *address)
{
- memcpy(_address, address, sizeof(_address));
+ memcpy(_address.bytes, address, sizeof(_address.bytes));
}
IPAddress& IPAddress::operator=(const uint8_t *address)
{
- memcpy(_address, address, sizeof(_address));
+ memcpy(_address.bytes, address, sizeof(_address.bytes));
return *this;
}
IPAddress& IPAddress::operator=(uint32_t address)
{
- memcpy(_address, (const uint8_t *)&address, sizeof(_address));
+ _address.dword = address;
return *this;
}
bool IPAddress::operator==(const uint8_t* addr) const
{
- return memcmp(addr, _address, sizeof(_address)) == 0;
+ return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0;
}
size_t IPAddress::printTo(Print& p) const
@@ -65,10 +65,10 @@ size_t IPAddress::printTo(Print& p) const
size_t n = 0;
for (int i =0; i < 3; i++)
{
- n += p.print(_address[i], DEC);
+ n += p.print(_address.bytes[i], DEC);
n += p.print('.');
}
- n += p.print(_address[3], DEC);
+ n += p.print(_address.bytes[3], DEC);
return n;
}
diff --git a/cores/arduino/IPAddress.h b/cores/arduino/IPAddress.h
index 6ea8127..94acdc4 100644
--- a/cores/arduino/IPAddress.h
+++ b/cores/arduino/IPAddress.h
@@ -27,12 +27,16 @@
class IPAddress : public Printable {
private:
- uint8_t _address[4]; // IPv4 address
+ union {
+ uint8_t bytes[4]; // IPv4 address
+ uint32_t dword;
+ } _address;
+
// Access the raw byte array containing the address. Because this returns a pointer
// to the internal structure rather than a copy of the address this function should only
// be used when you know that the usage of the returned uint8_t* will be transient and not
// stored.
- uint8_t* raw_address() { return _address; };
+ uint8_t* raw_address() { return _address.bytes; };
public:
// Constructors
@@ -43,13 +47,13 @@ public:
// Overloaded cast operator to allow IPAddress objects to be used where a pointer
// to a four-byte uint8_t array is expected
- operator uint32_t() const { return *((uint32_t*)_address); };
- bool operator==(const IPAddress& addr) const { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); };
+ operator uint32_t() const { return _address.dword; };
+ bool operator==(const IPAddress& addr) const { return _address.dword == addr._address.dword; };
bool operator==(const uint8_t* addr) const;
// Overloaded index operator to allow getting and setting individual octets of the address
- uint8_t operator[](int index) const { return _address[index]; };
- uint8_t& operator[](int index) { return _address[index]; };
+ uint8_t operator[](int index) const { return _address.bytes[index]; };
+ uint8_t& operator[](int index) { return _address.bytes[index]; };
// Overloaded copy operators to allow initialisation of IPAddress objects from other types
IPAddress& operator=(const uint8_t *address);
diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp
index aafb7fc..39873aa 100644
--- a/cores/arduino/Stream.cpp
+++ b/cores/arduino/Stream.cpp
@@ -75,7 +75,7 @@ void Stream::setTimeout(unsigned long timeout) // sets the maximum number of mi
// find returns true if the target string is found
bool Stream::find(char *target)
{
- return findUntil(target, NULL);
+ return findUntil(target, "");
}
// reads data from the stream until the target string of given length is found
@@ -176,7 +176,7 @@ float Stream::parseFloat(char skipChar){
boolean isNegative = false;
boolean isFraction = false;
long value = 0;
- char c;
+ int c;
float fraction = 1.0;
c = peekNextDigit();
diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h
index 5a33002..7d41ca0 100644
--- a/cores/arduino/USBAPI.h
+++ b/cores/arduino/USBAPI.h
@@ -35,17 +35,20 @@ struct ring_buffer;
class Serial_ : public Stream
{
+private:
+ int peek_buffer;
public:
+ Serial_() { peek_buffer = -1; };
void begin(unsigned long);
void begin(unsigned long, uint8_t);
void end(void);
virtual int available(void);
- virtual void accept(void);
virtual int peek(void);
virtual int read(void);
virtual void flush(void);
virtual size_t write(uint8_t);
+ virtual size_t write(const uint8_t*, size_t);
using Print::write; // pull in write(str) and write(buf, size) from Print
operator bool();
diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp
index c46c75f..39a9530 100644
--- a/cores/arduino/USBCore.cpp
+++ b/cores/arduino/USBCore.cpp
@@ -57,12 +57,18 @@ const u16 STRING_LANGUAGE[2] = {
const u8 STRING_PRODUCT[] PROGMEM = USB_PRODUCT;
#if USB_VID == 0x2341
-#define USB_MANUFACTURER "Arduino LLC"
+# if defined(USB_MANUFACTURER)
+# undef USB_MANUFACTURER
+# endif
+# define USB_MANUFACTURER "Arduino LLC"
#elif USB_VID == 0x1b4f
-#define USB_MANUFACTURER "SparkFun"
+# if defined(USB_MANUFACTURER)
+# undef USB_MANUFACTURER
+# endif
+# define USB_MANUFACTURER "SparkFun"
#elif !defined(USB_MANUFACTURER)
// Fall through to unknown if no manufacturer name was provided in a macro
-#define USB_MANUFACTURER "Unknown"
+# define USB_MANUFACTURER "Unknown"
#endif
const u8 STRING_MANUFACTURER[] PROGMEM = USB_MANUFACTURER;
@@ -88,7 +94,8 @@ volatile u8 _usbConfiguration = 0;
static inline void WaitIN(void)
{
- while (!(UEINTX & (1<<TXINI)));
+ while (!(UEINTX & (1<<TXINI)))
+ ;
}
static inline void ClearIN(void)
@@ -268,7 +275,6 @@ int USB_Send(u8 ep, const void* d, int len)
int r = len;
const u8* data = (const u8*)d;
- u8 zero = ep & TRANSFER_ZERO;
u8 timeout = 250; // 250ms timeout on send? TODO
while (len)
{
@@ -283,9 +289,12 @@ int USB_Send(u8 ep, const void* d, int len)
if (n > len)
n = len;
- len -= n;
{
LockEP lock(ep);
+ // Frame may have been released by the SOF interrupt handler
+ if (!ReadWriteAllowed())
+ continue;
+ len -= n;
if (ep & TRANSFER_ZERO)
{
while (n--)
@@ -621,8 +630,6 @@ ISR(USB_GEN_vect)
{
#ifdef CDC_ENABLED
USB_Flush(CDC_TX); // Send a tx frame if found
- if (USB_Available(CDC_RX)) // Handle received bytes (if any)
- Serial.accept();
#endif
// check whether the one-shot period has elapsed. if so, turn off the LED
diff --git a/cores/arduino/avr-libc/malloc.c b/cores/arduino/avr-libc/malloc.c
deleted file mode 100644
index 9dcfe21..0000000
--- a/cores/arduino/avr-libc/malloc.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* Copyright (c) 2002, 2004, 2010 Joerg Wunsch
- Copyright (c) 2010 Gerben van den Broeke
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- * Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-
-/* $Id: malloc.c 2149 2010-06-09 20:45:37Z joerg_wunsch $ */
-
-#include <stdlib.h>
-#include "sectionname.h"
-#include "stdlib_private.h"
-
-#include <avr/io.h>
-
-/*
- * Exported interface:
- *
- * When extending the data segment, the allocator will not try to go
- * beyond the current stack limit, decreased by __malloc_margin bytes.
- * Thus, all possible stack frames of interrupt routines that could
- * interrupt the current function, plus all further nested function
- * calls must not require more stack space, or they'll risk to collide
- * with the data segment.
- */
-
-/* May be changed by the user only before the first malloc() call. */
-
-size_t __malloc_margin = 128;
-char *__malloc_heap_start = &__heap_start;
-char *__malloc_heap_end = &__heap_end;
-
-char *__brkval;
-struct __freelist *__flp;
-
-ATTRIBUTE_CLIB_SECTION
-void *
-malloc(size_t len)
-{
- struct __freelist *fp1, *fp2, *sfp1, *sfp2;
- char *cp;
- size_t s, avail;
-
- /*
- * Our minimum chunk size is the size of a pointer (plus the
- * size of the "sz" field, but we don't need to account for
- * this), otherwise we could not possibly fit a freelist entry
- * into the chunk later.
- */
- if (len < sizeof(struct __freelist) - sizeof(size_t))
- len = sizeof(struct __freelist) - sizeof(size_t);
-
- /*
- * First, walk the free list and try finding a chunk that
- * would match exactly. If we found one, we are done. While
- * walking, note down the smallest chunk we found that would
- * still fit the request -- we need it for step 2.
- *
- */
- for (s = 0, fp1 = __flp, fp2 = 0;
- fp1;
- fp2 = fp1, fp1 = fp1->nx) {
- if (fp1->sz < len)
- continue;
- if (fp1->sz == len) {
- /*
- * Found it. Disconnect the chunk from the
- * freelist, and return it.
- */
- if (fp2)
- fp2->nx = fp1->nx;
- else
- __flp = fp1->nx;
- return &(fp1->nx);
- }
- else {
- if (s == 0 || fp1->sz < s) {
- /* this is the smallest chunk found so far */
- s = fp1->sz;
- sfp1 = fp1;
- sfp2 = fp2;
- }
- }
- }
- /*
- * Step 2: If we found a chunk on the freelist that would fit
- * (but was too large), look it up again and use it, since it
- * is our closest match now. Since the freelist entry needs
- * to be split into two entries then, watch out that the
- * difference between the requested size and the size of the
- * chunk found is large enough for another freelist entry; if
- * not, just enlarge the request size to what we have found,
- * and use the entire chunk.
- */
- if (s) {
- if (s - len < sizeof(struct __freelist)) {
- /* Disconnect it from freelist and return it. */
- if (sfp2)
- sfp2->nx = sfp1->nx;
- else
- __flp = sfp1->nx;
- return &(sfp1->nx);
- }
- /*
- * Split them up. Note that we leave the first part
- * as the new (smaller) freelist entry, and return the
- * upper portion to the caller. This saves us the
- * work to fix up the freelist chain; we just need to
- * fixup the size of the current entry, and note down
- * the size of the new chunk before returning it to
- * the caller.
- */
- cp = (char *)sfp1;
- s -= len;
- cp += s;
- sfp2 = (struct __freelist *)cp;
- sfp2->sz = len;
- sfp1->sz = s - sizeof(size_t);
- return &(sfp2->nx);
- }
- /*
- * Step 3: If the request could not be satisfied from a
- * freelist entry, just prepare a new chunk. This means we
- * need to obtain more memory first. The largest address just
- * not allocated so far is remembered in the brkval variable.
- * Under Unix, the "break value" was the end of the data
- * segment as dynamically requested from the operating system.
- * Since we don't have an operating system, just make sure
- * that we don't collide with the stack.
- */
- if (__brkval == 0)
- __brkval = __malloc_heap_start;
- cp = __malloc_heap_end;
- if (cp == 0)
- cp = STACK_POINTER() - __malloc_margin;
- if (cp <= __brkval)
- /*
- * Memory exhausted.
- */
- return 0;
- avail = cp - __brkval;
- /*
- * Both tests below are needed to catch the case len >= 0xfffe.
- */
- if (avail >= len && avail >= len + sizeof(size_t)) {
- fp1 = (struct __freelist *)__brkval;
- __brkval += len + sizeof(size_t);
- fp1->sz = len;
- return &(fp1->nx);
- }
- /*
- * Step 4: There's no help, just fail. :-/
- */
- return 0;
-}
-
-
-ATTRIBUTE_CLIB_SECTION
-void
-free(void *p)
-{
- struct __freelist *fp1, *fp2, *fpnew;
- char *cp1, *cp2, *cpnew;
-
- /* ISO C says free(NULL) must be a no-op */
- if (p == 0)
- return;
-
- cpnew = p;
- cpnew -= sizeof(size_t);
- fpnew = (struct __freelist *)cpnew;
- fpnew->nx = 0;
-
- /*
- * Trivial case first: if there's no freelist yet, our entry
- * will be the only one on it. If this is the last entry, we
- * can reduce __brkval instead.
- */
- if (__flp == 0) {
- if ((char *)p + fpnew->sz == __brkval)
- __brkval = cpnew;
- else
- __flp = fpnew;
- return;
- }
-
- /*
- * Now, find the position where our new entry belongs onto the
- * freelist. Try to aggregate the chunk with adjacent chunks
- * if possible.
- */
- for (fp1 = __flp, fp2 = 0;
- fp1;
- fp2 = fp1, fp1 = fp1->nx) {
- if (fp1 < fpnew)
- continue;
- cp1 = (char *)fp1;
- fpnew->nx = fp1;
- if ((char *)&(fpnew->nx) + fpnew->sz == cp1) {
- /* upper chunk adjacent, assimilate it */
- fpnew->sz += fp1->sz + sizeof(size_t);
- fpnew->nx = fp1->nx;
- }
- if (fp2 == 0) {
- /* new head of freelist */
- __flp = fpnew;
- return;
- }
- break;
- }
- /*
- * Note that we get here either if we hit the "break" above,
- * or if we fell off the end of the loop. The latter means
- * we've got a new topmost chunk. Either way, try aggregating
- * with the lower chunk if possible.
- */
- fp2->nx = fpnew;
- cp2 = (char *)&(fp2->nx);
- if (cp2 + fp2->sz == cpnew) {
- /* lower junk adjacent, merge */
- fp2->sz += fpnew->sz + sizeof(size_t);
- fp2->nx = fpnew->nx;
- }
- /*
- * If there's a new topmost chunk, lower __brkval instead.
- */
- for (fp1 = __flp, fp2 = 0;
- fp1->nx != 0;
- fp2 = fp1, fp1 = fp1->nx)
- /* advance to entry just before end of list */;
- cp2 = (char *)&(fp1->nx);
- if (cp2 + fp1->sz == __brkval) {
- if (fp2 == NULL)
- /* Freelist is empty now. */
- __flp = NULL;
- else
- fp2->nx = NULL;
- __brkval = cp2 - sizeof(size_t);
- }
-}
-
diff --git a/cores/arduino/avr-libc/realloc.c b/cores/arduino/avr-libc/realloc.c
deleted file mode 100644
index b76ce56..0000000
--- a/cores/arduino/avr-libc/realloc.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* Copyright (c) 2004, 2010 Joerg Wunsch
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- * Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-/* $Id: realloc.c 2127 2010-06-07 14:49:37Z joerg_wunsch $ */
-
-#include <stdlib.h>
-#include <string.h>
-#include "sectionname.h"
-#include "stdlib_private.h"
-
-#include <avr/io.h>
-
-ATTRIBUTE_CLIB_SECTION
-void *
-realloc(void *ptr, size_t len)
-{
- struct __freelist *fp1, *fp2, *fp3, *ofp3;
- char *cp, *cp1;
- void *memp;
- size_t s, incr;
-
- /* Trivial case, required by C standard. */
- if (ptr == 0)
- return malloc(len);
-
- cp1 = (char *)ptr;
- cp1 -= sizeof(size_t);
- fp1 = (struct __freelist *)cp1;
-
- cp = (char *)ptr + len; /* new next pointer */
- if (cp < cp1)
- /* Pointer wrapped across top of RAM, fail. */
- return 0;
-
- /*
- * See whether we are growing or shrinking. When shrinking,
- * we split off a chunk for the released portion, and call
- * free() on it. Therefore, we can only shrink if the new
- * size is at least sizeof(struct __freelist) smaller than the
- * previous size.
- */
- if (len <= fp1->sz) {
- /* The first test catches a possible unsigned int
- * rollover condition. */
- if (fp1->sz <= sizeof(struct __freelist) ||
- len > fp1->sz - sizeof(struct __freelist))
- return ptr;
- fp2 = (struct __freelist *)cp;
- fp2->sz = fp1->sz - len - sizeof(size_t);
- fp1->sz = len;
- free(&(fp2->nx));
- return ptr;
- }
-
- /*
- * If we get here, we are growing. First, see whether there
- * is space in the free list on top of our current chunk.
- */
- incr = len - fp1->sz;
- cp = (char *)ptr + fp1->sz;
- fp2 = (struct __freelist *)cp;
- for (s = 0, ofp3 = 0, fp3 = __flp;
- fp3;
- ofp3 = fp3, fp3 = fp3->nx) {
- if (fp3 == fp2 && fp3->sz + sizeof(size_t) >= incr) {
- /* found something that fits */
- if (fp3->sz + sizeof(size_t) - incr > sizeof(struct __freelist)) {
- /* split off a new freelist entry */
- cp = (char *)ptr + len;
- fp2 = (struct __freelist *)cp;
- fp2->nx = fp3->nx;
- fp2->sz = fp3->sz - incr;
- fp1->sz = len;
- } else {
- /* it just fits, so use it entirely */
- fp1->sz += fp3->sz + sizeof(size_t);
- fp2 = fp3->nx;
- }
- if (ofp3)
- ofp3->nx = fp2;
- else
- __flp = fp2;
- return ptr;
- }
- /*
- * Find the largest chunk on the freelist while
- * walking it.
- */
- if (fp3->sz > s)
- s = fp3->sz;
- }
- /*
- * If we are the topmost chunk in memory, and there was no
- * large enough chunk on the freelist that could be re-used
- * (by a call to malloc() below), quickly extend the
- * allocation area if possible, without need to copy the old
- * data.
- */
- if (__brkval == (char *)ptr + fp1->sz && len > s) {
- cp1 = __malloc_heap_end;
- cp = (char *)ptr + len;
- if (cp1 == 0)
- cp1 = STACK_POINTER() - __malloc_margin;
- if (cp < cp1) {
- __brkval = cp;
- fp1->sz = len;
- return ptr;
- }
- /* If that failed, we are out of luck. */
- return 0;
- }
-
- /*
- * Call malloc() for a new chunk, then copy over the data, and
- * release the old region.
- */
- if ((memp = malloc(len)) == 0)
- return 0;
- memcpy(memp, ptr, fp1->sz);
- free(ptr);
- return memp;
-}
-
diff --git a/cores/arduino/avr-libc/sectionname.h b/cores/arduino/avr-libc/sectionname.h
deleted file mode 100644
index 8e0f448..0000000
--- a/cores/arduino/avr-libc/sectionname.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (c) 2009 Atmel Corporation
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- * Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef __SECTIONNAME_H__
-#define __SECTIONNAME_H__
-
-/* Put all avr-libc functions in a common, unique sub-section name under .text. */
-
-#define CLIB_SECTION .text.avr-libc
-#define MLIB_SECTION .text.avr-libc.fplib
-
-#define STR(x) _STR(x)
-#define _STR(x) #x
-
-#define ATTRIBUTE_CLIB_SECTION __attribute__ ((section (STR(CLIB_SECTION))))
-#define ATTRIBUTE_MLIB_SECTION __attribute__ ((section (STR(MLIB_SECTION))))
-
-#define ASSEMBLY_CLIB_SECTION .section CLIB_SECTION, "ax", @progbits
-#define ASSEMBLY_MLIB_SECTION .section MLIB_SECTION, "ax", @progbits
-
-#endif
diff --git a/cores/arduino/avr-libc/stdlib_private.h b/cores/arduino/avr-libc/stdlib_private.h
deleted file mode 100644
index 65c3427..0000000
--- a/cores/arduino/avr-libc/stdlib_private.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (c) 2004, Joerg Wunsch
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of the copyright holders nor the names of
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/* $Id: stdlib_private.h 1657 2008-03-24 17:11:08Z arcanum $ */
-
-#include <inttypes.h>
-#include <stdlib.h>
-#include <avr/io.h>
-
-#if !defined(__DOXYGEN__)
-
-struct __freelist {
- size_t sz;
- struct __freelist *nx;
-};
-
-#endif
-
-extern char *__brkval; /* first location not yet allocated */
-extern struct __freelist *__flp; /* freelist pointer (head of freelist) */
-extern size_t __malloc_margin; /* user-changeable before the first malloc() */
-extern char *__malloc_heap_start;
-extern char *__malloc_heap_end;
-
-extern char __heap_start;
-extern char __heap_end;
-
-/* Needed for definition of AVR_STACK_POINTER_REG. */
-#include <avr/io.h>
-
-#define STACK_POINTER() ((char *)AVR_STACK_POINTER_REG)
-
diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp
index 0ad6962..091c365 100644
--- a/cores/arduino/main.cpp
+++ b/cores/arduino/main.cpp
@@ -19,10 +19,17 @@
#include <Arduino.h>
+// Weak empty variant initialization function.
+// May be redefined by variant files.
+void initVariant() __attribute__((weak));
+void initVariant() { }
+
int main(void)
{
init();
+ initVariant();
+
#if defined(USBCON)
USBDevice.attach();
#endif
diff --git a/cores/arduino/wiring_analog.c b/cores/arduino/wiring_analog.c
index 8feead9..48a9ef5 100644
--- a/cores/arduino/wiring_analog.c
+++ b/cores/arduino/wiring_analog.c
@@ -160,6 +160,14 @@ void analogWrite(uint8_t pin, int val)
break;
#endif
+ #if defined(TCCR1A) && defined(COM1C1)
+ case TIMER1C:
+ // connect pwm to pin on timer 1, channel B
+ sbi(TCCR1A, COM1C1);
+ OCR1C = val; // set pwm duty
+ break;
+ #endif
+
#if defined(TCCR2) && defined(COM21)
case TIMER2:
// connect pwm to pin on timer 2
diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c
index be323b1..df94cc1 100644
--- a/cores/arduino/wiring_digital.c
+++ b/cores/arduino/wiring_digital.c
@@ -84,6 +84,9 @@ static void turnOffPWM(uint8_t timer)
#if defined(TCCR1A) && defined(COM1B1)
case TIMER1B: cbi(TCCR1A, COM1B1); break;
#endif
+ #if defined(TCCR1A) && defined(COM1C1)
+ case TIMER1C: cbi(TCCR1A, COM1C1); break;
+ #endif
#if defined(TCCR2) && defined(COM21)
case TIMER2: cbi(TCCR2, COM21); break;
diff --git a/cores/arduino/wiring_private.h b/cores/arduino/wiring_private.h
index c366005..5dc7d4b 100644
--- a/cores/arduino/wiring_private.h
+++ b/cores/arduino/wiring_private.h
@@ -52,7 +52,7 @@ extern "C"{
#define EXTERNAL_INT_6 6
#define EXTERNAL_INT_7 7
-#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
+#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega128RFA1__) || defined(__AVR_ATmega256RFR2__)
#define EXTERNAL_NUM_INTERRUPTS 8
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)
#define EXTERNAL_NUM_INTERRUPTS 3