aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cores/arduino/CDC.cpp56
-rw-r--r--cores/arduino/HardwareSerial.cpp4
-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.h5
-rw-r--r--cores/arduino/Stream.cpp2
-rw-r--r--cores/arduino/USBAPI.h5
-rw-r--r--cores/arduino/USBCore.cpp7
-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--libraries/SoftwareSerial/SoftwareSerial.cpp2
-rw-r--r--platform.txt6
16 files changed, 61 insertions, 646 deletions
diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp
index aa1275d..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 */)
{
+ peek_buffer = -1;
}
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/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp
index e165136..ed29641 100644
--- a/cores/arduino/HardwareSerial.cpp
+++ b/cores/arduino/HardwareSerial.cpp
@@ -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_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_RX_BUFFER_SIZE;
+ return (int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail) % SERIAL_RX_BUFFER_SIZE;
}
int HardwareSerial::peek(void)
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 ea41028..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
diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp
index a12a72e..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
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 9eb7b33..39a9530 100644
--- a/cores/arduino/USBCore.cpp
+++ b/cores/arduino/USBCore.cpp
@@ -289,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--)
@@ -627,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/libraries/SoftwareSerial/SoftwareSerial.cpp b/libraries/SoftwareSerial/SoftwareSerial.cpp
index 64496fe..d1f6c92 100644
--- a/libraries/SoftwareSerial/SoftwareSerial.cpp
+++ b/libraries/SoftwareSerial/SoftwareSerial.cpp
@@ -355,7 +355,7 @@ SoftwareSerial::~SoftwareSerial()
void SoftwareSerial::setTX(uint8_t tx)
{
pinMode(tx, OUTPUT);
- digitalWrite(tx, HIGH);
+ digitalWrite(tx, _inverse_logic ? LOW : HIGH);
_transmitBitMask = digitalPinToBitMask(tx);
uint8_t port = digitalPinToPort(tx);
_transmitPortRegister = portOutputRegister(port);
diff --git a/platform.txt b/platform.txt
index 58af56b..66257ef 100644
--- a/platform.txt
+++ b/platform.txt
@@ -15,7 +15,9 @@ version=1.5.6
compiler.path={runtime.ide.path}/hardware/tools/avr/bin/
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
+# -w flag added to avoid printing a wrong warning http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59396
+# This is fixed in gcc 4.8.3 and will be removed as soon as we update the toolchain
+compiler.c.elf.flags=-w -Os -Wl,--gc-sections
compiler.c.elf.cmd=avr-gcc
compiler.S.flags=-c -g -x assembler-with-cpp
compiler.cpp.cmd=avr-g++
@@ -77,8 +79,6 @@ recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*
tools.avrdude.cmd.path={runtime.ide.path}/hardware/tools/avr/bin/avrdude
tools.avrdude.config.path={runtime.ide.path}/hardware/tools/avr/etc/avrdude.conf
-tools.avrdude.cmd.path.linux={runtime.ide.path}/hardware/tools/avrdude
-tools.avrdude.config.path.linux={runtime.ide.path}/hardware/tools/avrdude.conf
tools.avrdude.upload.params.verbose=-v -v -v -v
tools.avrdude.upload.params.quiet=-q -q