diff options
Diffstat (limited to 'test/ardmake/hardware/cores')
37 files changed, 5010 insertions, 0 deletions
| diff --git a/test/ardmake/hardware/cores/arduino/HardwareSerial.cpp b/test/ardmake/hardware/cores/arduino/HardwareSerial.cpp new file mode 100644 index 0000000..4397efb --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/HardwareSerial.cpp @@ -0,0 +1,303 @@ +/* +  HardwareSerial.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 +*/ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include "wiring.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" + +// Define constants and variables for buffering incoming serial data.  We're +// using a ring buffer (I think), in which rx_buffer_head is the index of the +// location to which to write the next incoming character and rx_buffer_tail +// is the index of the location from which to read. +#if (RAMEND < 1000) +  #define RX_BUFFER_SIZE 32 +#else +  #define RX_BUFFER_SIZE 128 +#endif + +struct ring_buffer +{ +  unsigned char buffer[RX_BUFFER_SIZE]; +  int head; +  int tail; +}; + +#if defined(UBRRH) || defined(UBRR0H) +  ring_buffer rx_buffer  =  { { 0 }, 0, 0 }; +#endif +#if defined(UBRR1H) +  ring_buffer rx_buffer1  =  { { 0 }, 0, 0 }; +#endif +#if defined(UBRR2H) +  ring_buffer rx_buffer2  =  { { 0 }, 0, 0 }; +#endif +#if defined(UBRR3H) +  ring_buffer rx_buffer3  =  { { 0 }, 0, 0 }; +#endif + +inline void store_char(unsigned char c, ring_buffer *rx_buffer) +{ +  int i = (unsigned int)(rx_buffer->head + 1) % 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 +  // 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->buffer[rx_buffer->head] = c; +    rx_buffer->head = i; +  } +} + +#if defined(USART_RX_vect) +  SIGNAL(USART_RX_vect) +  { +  #if defined(UDR0) +    unsigned char c  =  UDR0; +  #elif defined(UDR) +    unsigned char c  =  UDR;  //  atmega8535 +  #else +    #error UDR not defined +  #endif +    store_char(c, &rx_buffer); +  } +#elif defined(SIG_USART0_RECV) && defined(UDR0) +  SIGNAL(SIG_USART0_RECV) +  { +    unsigned char c  =  UDR0; +    store_char(c, &rx_buffer); +  } +#elif defined(SIG_UART0_RECV) && defined(UDR0) +  SIGNAL(SIG_UART0_RECV) +  { +    unsigned char c  =  UDR0; +    store_char(c, &rx_buffer); +  } +//#elif defined(SIG_USART_RECV) +#elif defined(USART0_RX_vect) +  // fixed by Mark Sproul this is on the 644/644p +  //SIGNAL(SIG_USART_RECV) +  SIGNAL(USART0_RX_vect) +  { +  #if defined(UDR0) +    unsigned char c  =  UDR0; +  #elif defined(UDR) +    unsigned char c  =  UDR;  //  atmega8, atmega32 +  #else +    #error UDR not defined +  #endif +    store_char(c, &rx_buffer); +  } +#elif defined(SIG_UART_RECV) +  // this is for atmega8 +  SIGNAL(SIG_UART_RECV) +  { +  #if defined(UDR0) +    unsigned char c  =  UDR0;  //  atmega645 +  #elif defined(UDR) +    unsigned char c  =  UDR;  //  atmega8 +  #endif +    store_char(c, &rx_buffer); +  } +#elif defined(USBCON) +  #warning No interrupt handler for usart 0 +  #warning Serial(0) is on USB interface +#else +  #error No interrupt handler for usart 0 +#endif + +//#if defined(SIG_USART1_RECV) +#if defined(USART1_RX_vect) +  //SIGNAL(SIG_USART1_RECV) +  SIGNAL(USART1_RX_vect) +  { +    unsigned char c = UDR1; +    store_char(c, &rx_buffer1); +  } +#elif defined(SIG_USART1_RECV) +  #error SIG_USART1_RECV +#endif + +#if defined(USART2_RX_vect) && defined(UDR2) +  SIGNAL(USART2_RX_vect) +  { +    unsigned char c = UDR2; +    store_char(c, &rx_buffer2); +  } +#elif defined(SIG_USART2_RECV) +  #error SIG_USART2_RECV +#endif + +#if defined(USART3_RX_vect) && defined(UDR3) +  SIGNAL(USART3_RX_vect) +  { +    unsigned char c = UDR3; +    store_char(c, &rx_buffer3); +  } +#elif defined(SIG_USART3_RECV) +  #error SIG_USART3_RECV +#endif + + + +// Constructors //////////////////////////////////////////////////////////////// + +HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, +  volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, +  volatile uint8_t *ucsra, volatile uint8_t *ucsrb, +  volatile uint8_t *udr, +  uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x) +{ +  _rx_buffer = rx_buffer; +  _ubrrh = ubrrh; +  _ubrrl = ubrrl; +  _ucsra = ucsra; +  _ucsrb = ucsrb; +  _udr = udr; +  _rxen = rxen; +  _txen = txen; +  _rxcie = rxcie; +  _udre = udre; +  _u2x = u2x; +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void HardwareSerial::begin(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 +   +  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; +  } + +  // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) +  *_ubrrh = baud_setting >> 8; +  *_ubrrl = baud_setting; + +  sbi(*_ucsrb, _rxen); +  sbi(*_ucsrb, _txen); +  sbi(*_ucsrb, _rxcie); +} + +void HardwareSerial::end() +{ +  cbi(*_ucsrb, _rxen); +  cbi(*_ucsrb, _txen); +  cbi(*_ucsrb, _rxcie);   +} + +int HardwareSerial::available(void) +{ +  return (unsigned int)(RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % RX_BUFFER_SIZE; +} + +int HardwareSerial::peek(void) +{ +  if (_rx_buffer->head == _rx_buffer->tail) { +    return -1; +  } else { +    return _rx_buffer->buffer[_rx_buffer->tail]; +  } +} + +int HardwareSerial::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->buffer[_rx_buffer->tail]; +    _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % RX_BUFFER_SIZE; +    return c; +  } +} + +void HardwareSerial::flush() +{ +  // don't reverse this or there may be problems if the RX interrupt +  // occurs after reading the value of rx_buffer_head but before writing +  // the value to rx_buffer_tail; the previous value of rx_buffer_head +  // may be written to rx_buffer_tail, making it appear as if the buffer +  // don't reverse this or there may be problems if the RX interrupt +  // occurs after reading the value of rx_buffer_head but before writing +  // the value to rx_buffer_tail; the previous value of rx_buffer_head +  // may be written to rx_buffer_tail, making it appear as if the buffer +  // were full, not empty. +  _rx_buffer->head = _rx_buffer->tail; +} + +void HardwareSerial::write(uint8_t c) +{ +  while (!((*_ucsra) & (1 << _udre))) +    ; + +  *_udr = c; +} + +// Preinstantiate Objects ////////////////////////////////////////////////////// + +#if defined(UBRRH) && defined(UBRRL) +  HardwareSerial Serial(&rx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRE, U2X); +#elif defined(UBRR0H) && defined(UBRR0L) +  HardwareSerial Serial(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0); +#elif defined(USBCON) +  #warning no serial port defined  (port 0) +#else +  #error no serial port defined  (port 0) +#endif + +#if defined(UBRR1H) +  HardwareSerial Serial1(&rx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRE1, U2X1); +#endif +#if defined(UBRR2H) +  HardwareSerial Serial2(&rx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRE2, U2X2); +#endif +#if defined(UBRR3H) +  HardwareSerial Serial3(&rx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRE3, U2X3); +#endif + +#endif // whole file + diff --git a/test/ardmake/hardware/cores/arduino/HardwareSerial.d b/test/ardmake/hardware/cores/arduino/HardwareSerial.d new file mode 100644 index 0000000..92f1cc9 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/HardwareSerial.d @@ -0,0 +1,28 @@ +ardmake/hardware/cores/arduino/HardwareSerial.o ardmake/hardware/cores/arduino/HardwareSerial.d: ardmake/hardware/cores/arduino/HardwareSerial.cpp \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/string.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  ardmake/hardware/cores/arduino/binary.h \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h \ +  ardmake/hardware/cores/arduino/HardwareSerial.h \ +  ardmake/hardware/cores/arduino/Stream.h \ +  ardmake/hardware/cores/arduino/Print.h \ +  ardmake/hardware/cores/arduino/WString.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/ctype.h diff --git a/test/ardmake/hardware/cores/arduino/HardwareSerial.h b/test/ardmake/hardware/cores/arduino/HardwareSerial.h new file mode 100644 index 0000000..3efa775 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/HardwareSerial.h @@ -0,0 +1,76 @@ +/* +  HardwareSerial.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 28 September 2010 by Mark Sproul +*/ + +#ifndef HardwareSerial_h +#define HardwareSerial_h + +#include <inttypes.h> + +#include "Stream.h" + +struct ring_buffer; + +class HardwareSerial : public Stream +{ +  private: +    ring_buffer *_rx_buffer; +    volatile uint8_t *_ubrrh; +    volatile uint8_t *_ubrrl; +    volatile uint8_t *_ucsra; +    volatile uint8_t *_ucsrb; +    volatile uint8_t *_udr; +    uint8_t _rxen; +    uint8_t _txen; +    uint8_t _rxcie; +    uint8_t _udre; +    uint8_t _u2x; +  public: +    HardwareSerial(ring_buffer *rx_buffer, +      volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, +      volatile uint8_t *ucsra, volatile uint8_t *ucsrb, +      volatile uint8_t *udr, +      uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x); +    void begin(long); +    void end(); +    virtual int available(void); +    virtual int peek(void); +    virtual int read(void); +    virtual void flush(void); +    virtual void write(uint8_t); +    using Print::write; // pull in write(str) and write(buf, size) from Print +}; + +#if defined(UBRRH) || defined(UBRR0H) +  extern HardwareSerial Serial; +#elif defined(USBCON) +  #include "usb_api.h" +#endif +#if defined(UBRR1H) +  extern HardwareSerial Serial1; +#endif +#if defined(UBRR2H) +  extern HardwareSerial Serial2; +#endif +#if defined(UBRR3H) +  extern HardwareSerial Serial3; +#endif + +#endif diff --git a/test/ardmake/hardware/cores/arduino/Makefile b/test/ardmake/hardware/cores/arduino/Makefile new file mode 100644 index 0000000..b606b39 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/Makefile @@ -0,0 +1,250 @@ +# Arduino Makefile +# Arduino adaptation by mellis, eighthave, oli.keller +# +# This makefile allows you to build sketches from the command line +# without the Arduino environment (or Java). +# +# Note, this Makefile has been edited by the Debian package maintainer, so +# there's a reasonable chance it'll simply work without the need to edit it +# but just in case, here are the instructions: +# +# Detailed instructions for using the makefile: +# +#  1. Copy this file into the folder with your sketch. There should be a +#     file with the same name as the folder and with the extension .pde +#     (e.g. foo.pde in the foo/ folder). +# +#  2. Modify the line containg "INSTALL_DIR" to point to the directory that +#     contains the Arduino installation (for example, under Mac OS X, this +#     might be /Applications/arduino-0012). +# +#  3. Modify the line containing "PORT" to refer to the filename +#     representing the USB or serial connection to your Arduino board +#     (e.g. PORT = /dev/tty.USB0).  If the exact name of this file +#     changes, you can use * as a wildcard (e.g. PORT = /dev/tty.usb*). +# +#  4. Set the line containing "MCU" to match your board's processor.  +#     Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth +#     or Diecimila have the atmega168.  If you're using a LilyPad Arduino, +#     change F_CPU to 8000000. +# +#  5. At the command line, change to the directory containing your +#     program's file and the makefile. +# +#  6. Type "make" and press enter to compile/verify your program. +# +#  7. Type "make upload", reset your Arduino board, and press enter to +#     upload your program to the Arduino board. +# +# $Id$ + +TARGET = $(notdir $(CURDIR)) +#INSTALL_DIR = ../../.. +PORT = /dev/ttyUSB* +UPLOAD_RATE = 57600 +AVRDUDE_PROGRAMMER = stk500v1 +MCU = atmega168 +F_CPU = 16000000 + +############################################################################ +# Below here nothing should be changed... + +ARDUINO = /usr/share/arduino/hardware/arduino/cores/arduino +AVR_TOOLS_PATH = /usr/bin +SRC = $(ARDUINO)/pins_arduino.c $(ARDUINO)/wiring.c \ +$(ARDUINO)/wiring_analog.c $(ARDUINO)/wiring_digital.c \ +$(ARDUINO)/wiring_pulse.c $(ARDUINO)/wiring_shift.c \ +$(ARDUINO)/WInterrupts.c +CXXSRC = $(ARDUINO)/HardwareSerial.cpp $(ARDUINO)/WMath.cpp \ +$(ARDUINO)/Print.cpp +FORMAT = ihex + + +# Name of this Makefile (used for "make depend"). +MAKEFILE = Makefile + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +DEBUG = stabs + +OPT = s + +# Place -D or -U options here +CDEFS = -DF_CPU=$(F_CPU) +CXXDEFS = -DF_CPU=$(F_CPU) + +# Place -I options here +CINCS = -I$(ARDUINO) +CXXINCS = -I$(ARDUINO) + +# Compiler flag to set the C Standard level. +# c89   - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99   - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 +CDEBUG = -g$(DEBUG) +CWARN = -Wall -Wstrict-prototypes +CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) + +CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA) +CXXFLAGS = $(CDEFS) $(CINCS) -O$(OPT) +#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs  +LDFLAGS = -lm + + +# Programming support using avrdude. Settings and variables. +AVRDUDE_PORT = $(PORT) +AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex +AVRDUDE_FLAGS = -V -F \ +-p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \ +-b $(UPLOAD_RATE) + +# Program settings +CC = $(AVR_TOOLS_PATH)/avr-gcc +CXX = $(AVR_TOOLS_PATH)/avr-g++ +OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy +OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump +AR  = $(AVR_TOOLS_PATH)/avr-ar +SIZE = $(AVR_TOOLS_PATH)/avr-size +NM = $(AVR_TOOLS_PATH)/avr-nm +AVRDUDE = $(AVR_TOOLS_PATH)/avrdude +REMOVE = rm -f +MV = mv -f + +# Define all object files. +OBJ = $(SRC:%.c=build/%.o) $(CXXSRC:%.cpp=build/%.o) $(ASRC:%.S=build/%.o) + +# Define all listing files. +LST = $(ASRC:%.S=build/%.lst) $(CXXSRC:%.cpp=build/%.lst) $(SRC:%.c=build/%.lst) + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) +ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + +# Default target. +all: applet_files build sizeafter + +build: elf hex  + +applet_files: $(TARGET).pde +	# Here is the "preprocessing". +	# It creates a .cpp file based with the same name as the .pde file. +	# On top of the new .cpp file comes the WProgram.h header. +	# At the end there is a generic main() function attached. +	# Then the .cpp file will be compiled. Errors during compile will +	# refer to this new, automatically generated, file.  +	# Not the original .pde file you actually edit... +	test -d applet || mkdir applet +	echo '#include "WProgram.h"' > applet/$(TARGET).cpp +	cat $(TARGET).pde >> applet/$(TARGET).cpp +	cat $(ARDUINO)/main.cxx >> applet/$(TARGET).cpp + +elf: applet/$(TARGET).elf +hex: applet/$(TARGET).hex +eep: applet/$(TARGET).eep +lss: applet/$(TARGET).lss  +sym: applet/$(TARGET).sym + +# Program the device.   +upload: applet/$(TARGET).hex +	stty -F $(AVRDUDE_PORT) hupcl ; sleep 0.1 ; stty -F $(AVRDUDE_PORT) -hupcl +	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) + + +	# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) applet/$(TARGET).hex +ELFSIZE = $(SIZE)  applet/$(TARGET).elf +sizebefore: +	@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi + +sizeafter: +	@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000  + + +coff: applet/$(TARGET).elf +	$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf $(TARGET).cof + + +extcoff: $(TARGET).elf +	$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf $(TARGET).cof + + +.SUFFIXES: .elf .hex .eep .lss .sym + +.elf.hex: +	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +.elf.eep: +	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ +	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +.elf.lss: +	$(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +.elf.sym: +	$(NM) -n $< > $@ + +	# Link: create ELF output file from library. +applet/$(TARGET).elf: $(TARGET).pde applet/core.a  +	$(CXX) $(ALL_CXXFLAGS) -o $@ applet/$(TARGET).cpp -L. applet/core.a $(LDFLAGS) + +applet/core.a: $(OBJ) +	@for i in $(OBJ); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done + + + +# Compile: create object files from C++ source files. +build/%.o: %.cpp +	mkdir -p $(dir $@) +	$(CXX) -c $(ALL_CXXFLAGS) $< -o $@  + +# Compile: create object files from C source files. +build/%.o: %.c +	mkdir -p $(dir $@) +	$(CC) -c $(ALL_CFLAGS) $< -o $@  + + +# Compile: create assembler files from C source files. +build/%.s: %.c +	$(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +.S.o: +	$(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Automatic dependencies +build/%.d: %.c +	$(CC) -M $(ALL_CFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@ + +build/%.d: %.cpp +	$(CXX) -M $(ALL_CXXFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@ + + +# Target: clean project. +clean: +	$(REMOVE) applet/$(TARGET).hex applet/$(TARGET).eep applet/$(TARGET).cof applet/$(TARGET).elf \ +	applet/$(TARGET).map applet/$(TARGET).sym applet/$(TARGET).lss applet/core.a \ +	$(OBJ) $(LST) $(SRC:%.c=build/%.s) $(SRC:%.c=build/%.d) $(CXXSRC:%.cpp=build/%.s) $(CXXSRC:%.cpp=build/%.d) + +.PHONY:	all build elf hex eep lss sym program coff extcoff clean applet_files sizebefore sizeafter + +-include $(SRC:%.c=build/%.d) +-include $(CXXSRC:%.cpp=build/%.d) diff --git a/test/ardmake/hardware/cores/arduino/Print.cpp b/test/ardmake/hardware/cores/arduino/Print.cpp new file mode 100644 index 0000000..4ee556d --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/Print.cpp @@ -0,0 +1,220 @@ +/* + Print.cpp - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis.  All right reserved. +  + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. +  + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + Lesser General Public License for more details. +  + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA +  + Modified 23 November 2006 by David A. Mellis + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> +#include "wiring.h" + +#include "Print.h" + +// Public Methods ////////////////////////////////////////////////////////////// + +/* default implementation: may be overridden */ +void Print::write(const char *str) +{ +  while (*str) +    write(*str++); +} + +/* default implementation: may be overridden */ +void Print::write(const uint8_t *buffer, size_t size) +{ +  while (size--) +    write(*buffer++); +} + +void Print::print(const String &s) +{ +  for (int i = 0; i < s.length(); i++) { +    write(s[i]); +  } +} + +void Print::print(const char str[]) +{ +  write(str); +} + +void Print::print(char c, int base) +{ +  print((long) c, base); +} + +void Print::print(unsigned char b, int base) +{ +  print((unsigned long) b, base); +} + +void Print::print(int n, int base) +{ +  print((long) n, base); +} + +void Print::print(unsigned int n, int base) +{ +  print((unsigned long) n, base); +} + +void Print::print(long n, int base) +{ +  if (base == 0) { +    write(n); +  } else if (base == 10) { +    if (n < 0) { +      print('-'); +      n = -n; +    } +    printNumber(n, 10); +  } else { +    printNumber(n, base); +  } +} + +void Print::print(unsigned long n, int base) +{ +  if (base == 0) write(n); +  else printNumber(n, base); +} + +void Print::print(double n, int digits) +{ +  printFloat(n, digits); +} + +void Print::println(void) +{ +  print('\r'); +  print('\n');   +} + +void Print::println(const String &s) +{ +  print(s); +  println(); +} + +void Print::println(const char c[]) +{ +  print(c); +  println(); +} + +void Print::println(char c, int base) +{ +  print(c, base); +  println(); +} + +void Print::println(unsigned char b, int base) +{ +  print(b, base); +  println(); +} + +void Print::println(int n, int base) +{ +  print(n, base); +  println(); +} + +void Print::println(unsigned int n, int base) +{ +  print(n, base); +  println(); +} + +void Print::println(long n, int base) +{ +  print(n, base); +  println(); +} + +void Print::println(unsigned long n, int base) +{ +  print(n, base); +  println(); +} + +void Print::println(double n, int digits) +{ +  print(n, digits); +  println(); +} + +// Private Methods ///////////////////////////////////////////////////////////// + +void Print::printNumber(unsigned long n, uint8_t base) +{ +  unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.  +  unsigned long i = 0; + +  if (n == 0) { +    print('0'); +    return; +  }  + +  while (n > 0) { +    buf[i++] = n % base; +    n /= base; +  } + +  for (; i > 0; i--) +    print((char) (buf[i - 1] < 10 ? +      '0' + buf[i - 1] : +      'A' + buf[i - 1] - 10)); +} + +void Print::printFloat(double number, uint8_t digits)  +{  +  // Handle negative numbers +  if (number < 0.0) +  { +     print('-'); +     number = -number; +  } + +  // Round correctly so that print(1.999, 2) prints as "2.00" +  double rounding = 0.5; +  for (uint8_t i=0; i<digits; ++i) +    rounding /= 10.0; +   +  number += rounding; + +  // Extract the integer part of the number and print it +  unsigned long int_part = (unsigned long)number; +  double remainder = number - (double)int_part; +  print(int_part); + +  // Print the decimal point, but only if there are digits beyond +  if (digits > 0) +    print(".");  + +  // Extract digits from the remainder one at a time +  while (digits-- > 0) +  { +    remainder *= 10.0; +    int toPrint = int(remainder); +    print(toPrint); +    remainder -= toPrint;  +  }  +} diff --git a/test/ardmake/hardware/cores/arduino/Print.d b/test/ardmake/hardware/cores/arduino/Print.d new file mode 100644 index 0000000..bf5b85f --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/Print.d @@ -0,0 +1,22 @@ +ardmake/hardware/cores/arduino/Print.o ardmake/hardware/cores/arduino/Print.d: ardmake/hardware/cores/arduino/Print.cpp \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/string.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/math.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  ardmake/hardware/cores/arduino/binary.h \ +  ardmake/hardware/cores/arduino/Print.h \ +  ardmake/hardware/cores/arduino/WString.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/ctype.h diff --git a/test/ardmake/hardware/cores/arduino/Print.h b/test/ardmake/hardware/cores/arduino/Print.h new file mode 100644 index 0000000..b092ae5 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/Print.h @@ -0,0 +1,66 @@ +/* +  Print.h - Base class that provides print() and println() +  Copyright (c) 2008 David A. Mellis.  All right reserved. + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General Public +  License along with this library; if not, write to the Free Software +  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA +*/ + +#ifndef Print_h +#define Print_h + +#include <inttypes.h> +#include <stdio.h> // for size_t + +#include "WString.h" + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 +#define BYTE 0 + +class Print +{ +  private: +    void printNumber(unsigned long, uint8_t); +    void printFloat(double, uint8_t); +  public: +    virtual void write(uint8_t) = 0; +    virtual void write(const char *str); +    virtual void write(const uint8_t *buffer, size_t size); +     +    void print(const String &); +    void print(const char[]); +    void print(char, int = BYTE); +    void print(unsigned char, int = BYTE); +    void print(int, int = DEC); +    void print(unsigned int, int = DEC); +    void print(long, int = DEC); +    void print(unsigned long, int = DEC); +    void print(double, int = 2); + +    void println(const String &s); +    void println(const char[]); +    void println(char, int = BYTE); +    void println(unsigned char, int = BYTE); +    void println(int, int = DEC); +    void println(unsigned int, int = DEC); +    void println(long, int = DEC); +    void println(unsigned long, int = DEC); +    void println(double, int = 2); +    void println(void); +}; + +#endif diff --git a/test/ardmake/hardware/cores/arduino/README.Makefile b/test/ardmake/hardware/cores/arduino/README.Makefile new file mode 100644 index 0000000..01f3c4a --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/README.Makefile @@ -0,0 +1,11 @@ +The Makefile here is based on the one that was in Arduino 0017 +but has since been dropped by the upstream developers. + +It is preserved in the Debian package to allow command-line usage without +introducing java dependancies, so if you want to report bugs against +it, please report them against whichever distribution you are using, +and NOT against the upstream source, as that would be pointless, and +will irritate the developers who dropped the file in order to eliminate +bug reports against the Makefile. + +The same goes for the main.cxx file. diff --git a/test/ardmake/hardware/cores/arduino/Stream.h b/test/ardmake/hardware/cores/arduino/Stream.h new file mode 100644 index 0000000..93d8275 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/Stream.h @@ -0,0 +1,35 @@ +/* +  Stream.h - base class for character-based streams. +  Copyright (c) 2010 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 Stream_h +#define Stream_h + +#include <inttypes.h> +#include "Print.h" + +class Stream : public Print +{ +  public: +    virtual int available() = 0; +    virtual int read() = 0; +    virtual int peek() = 0; +    virtual void flush() = 0; +}; + +#endif diff --git a/test/ardmake/hardware/cores/arduino/Tone.cpp b/test/ardmake/hardware/cores/arduino/Tone.cpp new file mode 100644 index 0000000..c3910e7 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/Tone.cpp @@ -0,0 +1,601 @@ +/* Tone.cpp + +  A Tone Generator Library + +  Written by Brett Hagman + +  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 + +Version Modified By Date     Comments +------- ----------- -------- -------- +0001    B Hagman    09/08/02 Initial coding +0002    B Hagman    09/08/18 Multiple pins +0003    B Hagman    09/08/18 Moved initialization from constructor to begin() +0004    B Hagman    09/09/26 Fixed problems with ATmega8 +0005    B Hagman    09/11/23 Scanned prescalars for best fit on 8 bit timers +                    09/11/25 Changed pin toggle method to XOR +                    09/11/25 Fixed timer0 from being excluded +0006    D Mellis    09/12/29 Replaced objects with functions +0007    M Sproul    10/08/29 Changed #ifdefs from cpu to register +*************************************************/ + +#include <avr/interrupt.h> +#include <avr/pgmspace.h> +#include "wiring.h" +#include "pins_arduino.h" + +#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) +#define TCCR2A TCCR2 +#define TCCR2B TCCR2 +#define COM2A1 COM21 +#define COM2A0 COM20 +#define OCR2A OCR2 +#define TIMSK2 TIMSK +#define OCIE2A OCIE2 +#define TIMER2_COMPA_vect TIMER2_COMP_vect +#define TIMSK1 TIMSK +#endif + +// timerx_toggle_count: +//  > 0 - duration specified +//  = 0 - stopped +//  < 0 - infinitely (until stop() method called, or new play() called) + +#if !defined(__AVR_ATmega8__) +volatile long timer0_toggle_count; +volatile uint8_t *timer0_pin_port; +volatile uint8_t timer0_pin_mask; +#endif + +volatile long timer1_toggle_count; +volatile uint8_t *timer1_pin_port; +volatile uint8_t timer1_pin_mask; +volatile long timer2_toggle_count; +volatile uint8_t *timer2_pin_port; +volatile uint8_t timer2_pin_mask; + +#if defined(TIMSK3) +volatile long timer3_toggle_count; +volatile uint8_t *timer3_pin_port; +volatile uint8_t timer3_pin_mask; +#endif + +#if defined(TIMSK4) +volatile long timer4_toggle_count; +volatile uint8_t *timer4_pin_port; +volatile uint8_t timer4_pin_mask; +#endif + +#if defined(TIMSK5) +volatile long timer5_toggle_count; +volatile uint8_t *timer5_pin_port; +volatile uint8_t timer5_pin_mask; +#endif + + +// MLS: This does not make sense, the 3 options are the same +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + +#define AVAILABLE_TONE_PINS 1 + +const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 3, 4, 5, 1, 0 */ }; +static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ }; + +#elif defined(__AVR_ATmega8__) + +#define AVAILABLE_TONE_PINS 1 + +const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ }; +static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ }; + +#else + +#define AVAILABLE_TONE_PINS 1 + +// Leave timer 0 to last. +const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ }; +static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ }; + +#endif + + + +static int8_t toneBegin(uint8_t _pin) +{ +  int8_t _timer = -1; + +  // if we're already using the pin, the timer should be configured.   +  for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { +    if (tone_pins[i] == _pin) { +      return pgm_read_byte(tone_pin_to_timer_PGM + i); +    } +  } +   +  // search for an unused timer. +  for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { +    if (tone_pins[i] == 255) { +      tone_pins[i] = _pin; +      _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); +      break; +    } +  } +   +  if (_timer != -1) +  { +    // Set timer specific stuff +    // All timers in CTC mode +    // 8 bit timers will require changing prescalar values, +    // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar +    switch (_timer) +    { +      #if defined(TCCR0A) && defined(TCCR0B) +      case 0: +        // 8 bit timer +        TCCR0A = 0; +        TCCR0B = 0; +        bitWrite(TCCR0A, WGM01, 1); +        bitWrite(TCCR0B, CS00, 1); +        timer0_pin_port = portOutputRegister(digitalPinToPort(_pin)); +        timer0_pin_mask = digitalPinToBitMask(_pin); +        break; +      #endif + +      #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12) +      case 1: +        // 16 bit timer +        TCCR1A = 0; +        TCCR1B = 0; +        bitWrite(TCCR1B, WGM12, 1); +        bitWrite(TCCR1B, CS10, 1); +        timer1_pin_port = portOutputRegister(digitalPinToPort(_pin)); +        timer1_pin_mask = digitalPinToBitMask(_pin); +        break; +      #endif + +      #if defined(TCCR2A) && defined(TCCR2B) +      case 2: +        // 8 bit timer +        TCCR2A = 0; +        TCCR2B = 0; +        bitWrite(TCCR2A, WGM21, 1); +        bitWrite(TCCR2B, CS20, 1); +        timer2_pin_port = portOutputRegister(digitalPinToPort(_pin)); +        timer2_pin_mask = digitalPinToBitMask(_pin); +        break; +      #endif + +      #if defined(TCCR3A) && defined(TCCR3B) &&  defined(TIMSK3) +      case 3: +        // 16 bit timer +        TCCR3A = 0; +        TCCR3B = 0; +        bitWrite(TCCR3B, WGM32, 1); +        bitWrite(TCCR3B, CS30, 1); +        timer3_pin_port = portOutputRegister(digitalPinToPort(_pin)); +        timer3_pin_mask = digitalPinToBitMask(_pin); +        break; +      #endif + +      #if defined(TCCR4A) && defined(TCCR4B) &&  defined(TIMSK4) +      case 4: +        // 16 bit timer +        TCCR4A = 0; +        TCCR4B = 0; +        #if defined(WGM42) +          bitWrite(TCCR4B, WGM42, 1); +        #elif defined(CS43) +          #warning this may not be correct +          // atmega32u4 +          bitWrite(TCCR4B, CS43, 1); +        #endif +        bitWrite(TCCR4B, CS40, 1); +        timer4_pin_port = portOutputRegister(digitalPinToPort(_pin)); +        timer4_pin_mask = digitalPinToBitMask(_pin); +        break; +      #endif + +      #if defined(TCCR5A) && defined(TCCR5B) &&  defined(TIMSK5) +      case 5: +        // 16 bit timer +        TCCR5A = 0; +        TCCR5B = 0; +        bitWrite(TCCR5B, WGM52, 1); +        bitWrite(TCCR5B, CS50, 1); +        timer5_pin_port = portOutputRegister(digitalPinToPort(_pin)); +        timer5_pin_mask = digitalPinToBitMask(_pin); +        break; +      #endif +    } +  } + +  return _timer; +} + + + +// frequency (in hertz) and duration (in milliseconds). + +void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) +{ +  uint8_t prescalarbits = 0b001; +  long toggle_count = 0; +  uint32_t ocr = 0; +  int8_t _timer; + +  _timer = toneBegin(_pin); + +  if (_timer >= 0) +  { +    // Set the pinMode as OUTPUT +    pinMode(_pin, OUTPUT); +     +    // if we are using an 8 bit timer, scan through prescalars to find the best fit +    if (_timer == 0 || _timer == 2) +    { +      ocr = F_CPU / frequency / 2 - 1; +      prescalarbits = 0b001;  // ck/1: same for both timers +      if (ocr > 255) +      { +        ocr = F_CPU / frequency / 2 / 8 - 1; +        prescalarbits = 0b010;  // ck/8: same for both timers + +        if (_timer == 2 && ocr > 255) +        { +          ocr = F_CPU / frequency / 2 / 32 - 1; +          prescalarbits = 0b011; +        } + +        if (ocr > 255) +        { +          ocr = F_CPU / frequency / 2 / 64 - 1; +          prescalarbits = _timer == 0 ? 0b011 : 0b100; + +          if (_timer == 2 && ocr > 255) +          { +            ocr = F_CPU / frequency / 2 / 128 - 1; +            prescalarbits = 0b101; +          } + +          if (ocr > 255) +          { +            ocr = F_CPU / frequency / 2 / 256 - 1; +            prescalarbits = _timer == 0 ? 0b100 : 0b110; +            if (ocr > 255) +            { +              // can't do any better than /1024 +              ocr = F_CPU / frequency / 2 / 1024 - 1; +              prescalarbits = _timer == 0 ? 0b101 : 0b111; +            } +          } +        } +      } + +#if defined(TCCR0B) +      if (_timer == 0) +      { +        TCCR0B = prescalarbits; +      } +      else +#endif +#if defined(TCCR2B) +      { +        TCCR2B = prescalarbits; +      } +#else +      { +        // dummy place holder to make the above ifdefs work +      } +#endif +    } +    else +    { +      // two choices for the 16 bit timers: ck/1 or ck/64 +      ocr = F_CPU / frequency / 2 - 1; + +      prescalarbits = 0b001; +      if (ocr > 0xffff) +      { +        ocr = F_CPU / frequency / 2 / 64 - 1; +        prescalarbits = 0b011; +      } + +      if (_timer == 1) +      { +#if defined(TCCR1B) +        TCCR1B = (TCCR1B & 0b11111000) | prescalarbits; +#endif +      } +#if defined(TCCR3B) +      else if (_timer == 3) +        TCCR3B = (TCCR3B & 0b11111000) | prescalarbits; +#endif +#if defined(TCCR4B) +      else if (_timer == 4) +        TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; +#endif +#if defined(TCCR5B) +      else if (_timer == 5) +        TCCR5B = (TCCR5B & 0b11111000) | prescalarbits; +#endif + +    } +     + +    // Calculate the toggle count +    if (duration > 0) +    { +      toggle_count = 2 * frequency * duration / 1000; +    } +    else +    { +      toggle_count = -1; +    } + +    // Set the OCR for the given timer, +    // set the toggle count, +    // then turn on the interrupts +    switch (_timer) +    { + +#if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A) +      case 0: +        OCR0A = ocr; +        timer0_toggle_count = toggle_count; +        bitWrite(TIMSK0, OCIE0A, 1); +        break; +#endif + +      case 1: +#if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A) +        OCR1A = ocr; +        timer1_toggle_count = toggle_count; +        bitWrite(TIMSK1, OCIE1A, 1); +#elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A) +        // this combination is for at least the ATmega32 +        OCR1A = ocr; +        timer1_toggle_count = toggle_count; +        bitWrite(TIMSK, OCIE1A, 1); +#endif +        break; + +#if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A) +      case 2: +        OCR2A = ocr; +        timer2_toggle_count = toggle_count; +        bitWrite(TIMSK2, OCIE2A, 1); +        break; +#endif + +#if defined(TIMSK3) +      case 3: +        OCR3A = ocr; +        timer3_toggle_count = toggle_count; +        bitWrite(TIMSK3, OCIE3A, 1); +        break; +#endif + +#if defined(TIMSK4) +      case 4: +        OCR4A = ocr; +        timer4_toggle_count = toggle_count; +        bitWrite(TIMSK4, OCIE4A, 1); +        break; +#endif + +#if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A) +      case 5: +        OCR5A = ocr; +        timer5_toggle_count = toggle_count; +        bitWrite(TIMSK5, OCIE5A, 1); +        break; +#endif + +    } +  } +} + + +// XXX: this function only works properly for timer 2 (the only one we use +// currently).  for the others, it should end the tone, but won't restore +// proper PWM functionality for the timer. +void disableTimer(uint8_t _timer) +{ +  switch (_timer) +  { +    case 0: +      #if defined(TIMSK0) +        TIMSK0 = 0; +      #elif defined(TIMSK) +        TIMSK = 0; // atmega32 +      #endif +      break; + +#if defined(TIMSK1) && defined(OCIE1A) +    case 1: +      bitWrite(TIMSK1, OCIE1A, 0); +      break; +#endif + +    case 2: +      #if defined(TIMSK2) && defined(OCIE2A) +        bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt +      #endif +      #if defined(TCCR2A) && defined(WGM20) +        TCCR2A = (1 << WGM20); +      #endif +      #if defined(TCCR2B) && defined(CS22) +        TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22); +      #endif +      #if defined(OCR2A) +        OCR2A = 0; +      #endif +      break; + +#if defined(TIMSK3) +    case 3: +      TIMSK3 = 0; +      break; +#endif + +#if defined(TIMSK4) +    case 4: +      TIMSK4 = 0; +      break; +#endif + +#if defined(TIMSK5) +    case 5: +      TIMSK5 = 0; +      break; +#endif +  } +} + + +void noTone(uint8_t _pin) +{ +  int8_t _timer = -1; +   +  for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { +    if (tone_pins[i] == _pin) { +      _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); +      tone_pins[i] = 255; +    } +  } +   +  disableTimer(_timer); + +  digitalWrite(_pin, 0); +} + +#if 0 +#if !defined(__AVR_ATmega8__) +ISR(TIMER0_COMPA_vect) +{ +  if (timer0_toggle_count != 0) +  { +    // toggle the pin +    *timer0_pin_port ^= timer0_pin_mask; + +    if (timer0_toggle_count > 0) +      timer0_toggle_count--; +  } +  else +  { +    disableTimer(0); +    *timer0_pin_port &= ~(timer0_pin_mask);  // keep pin low after stop +  } +} +#endif + + +ISR(TIMER1_COMPA_vect) +{ +  if (timer1_toggle_count != 0) +  { +    // toggle the pin +    *timer1_pin_port ^= timer1_pin_mask; + +    if (timer1_toggle_count > 0) +      timer1_toggle_count--; +  } +  else +  { +    disableTimer(1); +    *timer1_pin_port &= ~(timer1_pin_mask);  // keep pin low after stop +  } +} +#endif + + +ISR(TIMER2_COMPA_vect) +{ + +  if (timer2_toggle_count != 0) +  { +    // toggle the pin +    *timer2_pin_port ^= timer2_pin_mask; + +    if (timer2_toggle_count > 0) +      timer2_toggle_count--; +  } +  else +  { +    // need to call noTone() so that the tone_pins[] entry is reset, so the +    // timer gets initialized next time we call tone(). +    // XXX: this assumes timer 2 is always the first one used. +    noTone(tone_pins[0]); +//    disableTimer(2); +//    *timer2_pin_port &= ~(timer2_pin_mask);  // keep pin low after stop +  } +} + + + +//#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#if 0 + +ISR(TIMER3_COMPA_vect) +{ +  if (timer3_toggle_count != 0) +  { +    // toggle the pin +    *timer3_pin_port ^= timer3_pin_mask; + +    if (timer3_toggle_count > 0) +      timer3_toggle_count--; +  } +  else +  { +    disableTimer(3); +    *timer3_pin_port &= ~(timer3_pin_mask);  // keep pin low after stop +  } +} + +ISR(TIMER4_COMPA_vect) +{ +  if (timer4_toggle_count != 0) +  { +    // toggle the pin +    *timer4_pin_port ^= timer4_pin_mask; + +    if (timer4_toggle_count > 0) +      timer4_toggle_count--; +  } +  else +  { +    disableTimer(4); +    *timer4_pin_port &= ~(timer4_pin_mask);  // keep pin low after stop +  } +} + +ISR(TIMER5_COMPA_vect) +{ +  if (timer5_toggle_count != 0) +  { +    // toggle the pin +    *timer5_pin_port ^= timer5_pin_mask; + +    if (timer5_toggle_count > 0) +      timer5_toggle_count--; +  } +  else +  { +    disableTimer(5); +    *timer5_pin_port &= ~(timer5_pin_mask);  // keep pin low after stop +  } +} + +#endif diff --git a/test/ardmake/hardware/cores/arduino/WCharacter.h b/test/ardmake/hardware/cores/arduino/WCharacter.h new file mode 100644 index 0000000..79733b5 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WCharacter.h @@ -0,0 +1,168 @@ +/* + WCharacter.h - Character utility functions for Wiring & Arduino + Copyright (c) 2010 Hernando Barragan.  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 Character_h +#define Character_h + +#include <ctype.h> + +// WCharacter.h prototypes +inline boolean isAlphaNumeric(int c) __attribute__((always_inline)); +inline boolean isAlpha(int c) __attribute__((always_inline)); +inline boolean isAscii(int c) __attribute__((always_inline)); +inline boolean isWhitespace(int c) __attribute__((always_inline)); +inline boolean isControl(int c) __attribute__((always_inline)); +inline boolean isDigit(int c) __attribute__((always_inline)); +inline boolean isGraph(int c) __attribute__((always_inline)); +inline boolean isLowerCase(int c) __attribute__((always_inline)); +inline boolean isPrintable(int c) __attribute__((always_inline)); +inline boolean isPunct(int c) __attribute__((always_inline)); +inline boolean isSpace(int c) __attribute__((always_inline)); +inline boolean isUpperCase(int c) __attribute__((always_inline)); +inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); +inline int toAscii(int c) __attribute__((always_inline)); +inline int toLowerCase(int c) __attribute__((always_inline)); +inline int toUpperCase(int c)__attribute__((always_inline)); + + +// Checks for an alphanumeric character.  +// It is equivalent to (isalpha(c) || isdigit(c)). +inline boolean isAlphaNumeric(int c)  +{ +  return ( isalnum(c) == 0 ? false : true); +} + + +// Checks for an alphabetic character.  +// It is equivalent to (isupper(c) || islower(c)). +inline boolean isAlpha(int c) +{ +  return ( isalpha(c) == 0 ? false : true); +} + + +// Checks whether c is a 7-bit unsigned char value  +// that fits into the ASCII character set. +inline boolean isAscii(int c) +{ +  return ( isascii (c) == 0 ? false : true); +} + + +// Checks for a blank character, that is, a space or a tab. +inline boolean isWhitespace(int c) +{ +  return ( isblank (c) == 0 ? false : true); +} + + +// Checks for a control character. +inline boolean isControl(int c) +{ +  return ( iscntrl (c) == 0 ? false : true); +} + + +// Checks for a digit (0 through 9). +inline boolean isDigit(int c) +{ +  return ( isdigit (c) == 0 ? false : true); +} + + +// Checks for any printable character except space. +inline boolean isGraph(int c) +{ +  return ( isgraph (c) == 0 ? false : true); +} + + +// Checks for a lower-case character. +inline boolean isLowerCase(int c) +{ +  return (islower (c) == 0 ? false : true); +} + + +// Checks for any printable character including space. +inline boolean isPrintable(int c) +{ +  return ( isprint (c) == 0 ? false : true); +} + + +// Checks for any printable character which is not a space  +// or an alphanumeric character. +inline boolean isPunct(int c) +{ +  return ( ispunct (c) == 0 ? false : true); +} + + +// Checks for white-space characters. For the avr-libc library,  +// these are: space, formfeed ('\f'), newline ('\n'), carriage  +// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). +inline boolean isSpace(int c) +{ +  return ( isspace (c) == 0 ? false : true); +} + + +// Checks for an uppercase letter. +inline boolean isUpperCase(int c) +{ +  return ( isupper (c) == 0 ? false : true); +} + + +// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7  +// 8 9 a b c d e f A B C D E F. +inline boolean isHexadecimalDigit(int c) +{ +  return ( isxdigit (c) == 0 ? false : true); +} + + +// Converts c to a 7-bit unsigned char value that fits into the  +// ASCII character set, by clearing the high-order bits. +inline int toAscii(int c) +{ +  return toascii (c); +} + + +// Warning: +// Many people will be unhappy if you use this function.  +// This function will convert accented letters into random  +// characters. + +// Converts the letter c to lower case, if possible. +inline int toLowerCase(int c) +{ +  return tolower (c); +} + + +// Converts the letter c to upper case, if possible. +inline int toUpperCase(int c) +{ +  return toupper (c); +} + +#endif
\ No newline at end of file diff --git a/test/ardmake/hardware/cores/arduino/WConstants.h b/test/ardmake/hardware/cores/arduino/WConstants.h new file mode 100644 index 0000000..3e19ac4 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WConstants.h @@ -0,0 +1 @@ +#include "wiring.h" diff --git a/test/ardmake/hardware/cores/arduino/WInterrupts.c b/test/ardmake/hardware/cores/arduino/WInterrupts.c new file mode 100644 index 0000000..3b3e0c9 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WInterrupts.c @@ -0,0 +1,249 @@ +/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* +  Part of the Wiring project - http://wiring.uniandes.edu.co + +  Copyright (c) 2004-05 Hernando Barragan + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA +   +  Modified 24 November 2006 by David A. Mellis +  Modified 1 August 2010 by Mark Sproul +*/ + +#include <inttypes.h> +#include <avr/io.h> +#include <avr/interrupt.h> +#include <avr/pgmspace.h> +#include <stdio.h> + +#include "WConstants.h" +#include "wiring_private.h" + +volatile static voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS]; +// volatile static voidFuncPtr twiIntFunc; + +void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { +  if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { +    intFunc[interruptNum] = userFunc; +     +    // Configure the interrupt mode (trigger on low input, any change, rising +    // edge, or falling edge).  The mode constants were chosen to correspond +    // to the configuration bits in the hardware register, so we simply shift +    // the mode into place. +       +    // Enable the interrupt. +       +    switch (interruptNum) { +#if defined(EICRA) && defined(EICRB) && defined(EIMSK) +    case 2: +      EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); +      EIMSK |= (1 << INT0); +      break; +    case 3: +      EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); +      EIMSK |= (1 << INT1); +      break; +    case 4: +      EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); +      EIMSK |= (1 << INT2); +      break; +    case 5: +      EICRA = (EICRA & ~((1 << ISC30) | (1 << ISC31))) | (mode << ISC30); +      EIMSK |= (1 << INT3); +      break; +    case 0: +      EICRB = (EICRB & ~((1 << ISC40) | (1 << ISC41))) | (mode << ISC40); +      EIMSK |= (1 << INT4); +      break; +    case 1: +      EICRB = (EICRB & ~((1 << ISC50) | (1 << ISC51))) | (mode << ISC50); +      EIMSK |= (1 << INT5); +      break; +    case 6: +      EICRB = (EICRB & ~((1 << ISC60) | (1 << ISC61))) | (mode << ISC60); +      EIMSK |= (1 << INT6); +      break; +    case 7: +      EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70); +      EIMSK |= (1 << INT7); +      break; +#else +    case 0: +    #if defined(EICRA) && defined(ISC00) && defined(EIMSK) +      EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); +      EIMSK |= (1 << INT0); +    #elif defined(MCUCR) && defined(ISC00) && defined(GICR) +      MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); +      GICR |= (1 << INT0); +    #elif defined(MCUCR) && defined(ISC00) && defined(GIMSK) +      MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); +      GIMSK |= (1 << INT0); +    #else +      #error attachInterrupt not finished for this CPU (case 0) +    #endif +      break; + +    case 1: +    #if defined(EICRA) && defined(ISC10) && defined(ISC11) && defined(EIMSK) +      EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); +      EIMSK |= (1 << INT1); +    #elif defined(MCUCR) && defined(ISC10) && defined(ISC11) && defined(GICR) +      MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); +      GICR |= (1 << INT1); +    #elif defined(MCUCR) && defined(ISC10) && defined(GIMSK) && defined(GIMSK) +      MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); +      GIMSK |= (1 << INT1); +    #else +      #warning attachInterrupt may need some more work for this cpu (case 1) +    #endif +      break; +#endif +    } +  } +} + +void detachInterrupt(uint8_t interruptNum) { +  if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { +    // Disable the interrupt.  (We can't assume that interruptNum is equal +    // to the number of the EIMSK bit to clear, as this isn't true on the  +    // ATmega8.  There, INT0 is 6 and INT1 is 7.) +    switch (interruptNum) { +#if defined(EICRA) && defined(EICRB) && defined(EIMSK) +    case 2: +      EIMSK &= ~(1 << INT0); +      break; +    case 3: +      EIMSK &= ~(1 << INT1); +      break; +    case 4: +      EIMSK &= ~(1 << INT2); +      break; +    case 5: +      EIMSK &= ~(1 << INT3); +      break; +    case 0: +      EIMSK &= ~(1 << INT4); +      break; +    case 1: +      EIMSK &= ~(1 << INT5); +      break; +    case 6: +      EIMSK &= ~(1 << INT6); +      break; +    case 7: +      EIMSK &= ~(1 << INT7); +      break; +#else +    case 0: +    #if defined(EIMSK) && defined(INT0) +      EIMSK &= ~(1 << INT0); +    #elif defined(GICR) && defined(ISC00) +      GICR &= ~(1 << INT0); // atmega32 +    #elif defined(GIMSK) && defined(INT0) +      GIMSK &= ~(1 << INT0); +    #else +      #error detachInterrupt not finished for this cpu +    #endif +      break; + +    case 1: +    #if defined(EIMSK) && defined(INT1) +      EIMSK &= ~(1 << INT1); +    #elif defined(GICR) && defined(INT1) +      GICR &= ~(1 << INT1); // atmega32 +    #elif defined(GIMSK) && defined(INT1) +      GIMSK &= ~(1 << INT1); +    #else +      #warning detachInterrupt may need some more work for this cpu (case 1) +    #endif +      break; +#endif +    } +       +    intFunc[interruptNum] = 0; +  } +} + +/* +void attachInterruptTwi(void (*userFunc)(void) ) { +  twiIntFunc = userFunc; +} +*/ + +#if defined(EICRA) && defined(EICRB) + +SIGNAL(INT0_vect) { +  if(intFunc[EXTERNAL_INT_2]) +    intFunc[EXTERNAL_INT_2](); +} + +SIGNAL(INT1_vect) { +  if(intFunc[EXTERNAL_INT_3]) +    intFunc[EXTERNAL_INT_3](); +} + +SIGNAL(INT2_vect) { +  if(intFunc[EXTERNAL_INT_4]) +    intFunc[EXTERNAL_INT_4](); +} + +SIGNAL(INT3_vect) { +  if(intFunc[EXTERNAL_INT_5]) +    intFunc[EXTERNAL_INT_5](); +} + +SIGNAL(INT4_vect) { +  if(intFunc[EXTERNAL_INT_0]) +    intFunc[EXTERNAL_INT_0](); +} + +SIGNAL(INT5_vect) { +  if(intFunc[EXTERNAL_INT_1]) +    intFunc[EXTERNAL_INT_1](); +} + +SIGNAL(INT6_vect) { +  if(intFunc[EXTERNAL_INT_6]) +    intFunc[EXTERNAL_INT_6](); +} + +SIGNAL(INT7_vect) { +  if(intFunc[EXTERNAL_INT_7]) +    intFunc[EXTERNAL_INT_7](); +} + +#else + +SIGNAL(INT0_vect) { +  if(intFunc[EXTERNAL_INT_0]) +    intFunc[EXTERNAL_INT_0](); +} + +SIGNAL(INT1_vect) { +  if(intFunc[EXTERNAL_INT_1]) +    intFunc[EXTERNAL_INT_1](); +} + +#endif + +/* +SIGNAL(SIG_2WIRE_SERIAL) { +  if(twiIntFunc) +    twiIntFunc(); +} +*/ + diff --git a/test/ardmake/hardware/cores/arduino/WInterrupts.d b/test/ardmake/hardware/cores/arduino/WInterrupts.d new file mode 100644 index 0000000..73a0256 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WInterrupts.d @@ -0,0 +1,24 @@ +ardmake/hardware/cores/arduino/WInterrupts.o ardmake/hardware/cores/arduino/WInterrupts.d: ardmake/hardware/cores/arduino/WInterrupts.c \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/pgmspace.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  ardmake/hardware/cores/arduino/WConstants.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  ardmake/hardware/cores/arduino/binary.h \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h diff --git a/test/ardmake/hardware/cores/arduino/WMath.cpp b/test/ardmake/hardware/cores/arduino/WMath.cpp new file mode 100644 index 0000000..2120c4c --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WMath.cpp @@ -0,0 +1,60 @@ +/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* +  Part of the Wiring project - http://wiring.org.co +  Copyright (c) 2004-06 Hernando Barragan +  Modified 13 August 2006, David A. Mellis for Arduino - http://www.arduino.cc/ +   +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA +   +  $Id$ +*/ + +extern "C" { +  #include "stdlib.h" +} + +void randomSeed(unsigned int seed) +{ +  if (seed != 0) { +    srandom(seed); +  } +} + +long random(long howbig) +{ +  if (howbig == 0) { +    return 0; +  } +  return random() % howbig; +} + +long random(long howsmall, long howbig) +{ +  if (howsmall >= howbig) { +    return howsmall; +  } +  long diff = howbig - howsmall; +  return random(diff) + howsmall; +} + +long map(long x, long in_min, long in_max, long out_min, long out_max) +{ +  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +unsigned int makeWord(unsigned int w) { return w; } +unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; }
\ No newline at end of file diff --git a/test/ardmake/hardware/cores/arduino/WMath.d b/test/ardmake/hardware/cores/arduino/WMath.d new file mode 100644 index 0000000..dd4d873 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WMath.d @@ -0,0 +1,3 @@ +ardmake/hardware/cores/arduino/WMath.o ardmake/hardware/cores/arduino/WMath.d: ardmake/hardware/cores/arduino/WMath.cpp \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h diff --git a/test/ardmake/hardware/cores/arduino/WProgram.h b/test/ardmake/hardware/cores/arduino/WProgram.h new file mode 100644 index 0000000..f73e760 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WProgram.h @@ -0,0 +1,63 @@ +#ifndef WProgram_h +#define WProgram_h + +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include <avr/interrupt.h> + +#include "wiring.h" + +#ifdef __cplusplus +#include "WCharacter.h" +#include "WString.h" +#include "HardwareSerial.h" + +uint16_t makeWord(uint16_t w); +uint16_t makeWord(byte h, byte l); + +#define word(...) makeWord(__VA_ARGS__) + +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); + +void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); +void noTone(uint8_t _pin); + +// WMath prototypes +long random(long); +long random(long, long); +void randomSeed(unsigned int); +long map(long, long, long, long, long); + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +const static uint8_t A0 = 54; +const static uint8_t A1 = 55; +const static uint8_t A2 = 56; +const static uint8_t A3 = 57; +const static uint8_t A4 = 58; +const static uint8_t A5 = 59; +const static uint8_t A6 = 60; +const static uint8_t A7 = 61; +const static uint8_t A8 = 62; +const static uint8_t A9 = 63; +const static uint8_t A10 = 64; +const static uint8_t A11 = 65; +const static uint8_t A12 = 66; +const static uint8_t A13 = 67; +const static uint8_t A14 = 68; +const static uint8_t A15 = 69; +#else +const static uint8_t A0 = 14; +const static uint8_t A1 = 15; +const static uint8_t A2 = 16; +const static uint8_t A3 = 17; +const static uint8_t A4 = 18; +const static uint8_t A5 = 19; +const static uint8_t A6 = 20; +const static uint8_t A7 = 21; +#endif + +#endif + +#endif
\ No newline at end of file diff --git a/test/ardmake/hardware/cores/arduino/WString.cpp b/test/ardmake/hardware/cores/arduino/WString.cpp new file mode 100644 index 0000000..db5a441 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WString.cpp @@ -0,0 +1,443 @@ +/* +  WString.cpp - String library for Wiring & Arduino +  Copyright (c) 2009-10 Hernando Barragan.  All rights 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 <stdlib.h> +#include "WProgram.h" +#include "WString.h" + + +String::String( const char *value ) +{ +  if ( value == NULL ) +    value = ""; +  getBuffer( _length = strlen( value ) ); +  if ( _buffer != NULL ) +    strcpy( _buffer, value ); +} + +String::String( const String &value ) +{ +  getBuffer( _length = value._length ); +  if ( _buffer != NULL ) +    strcpy( _buffer, value._buffer ); +} + +String::String( const char value ) +{ +  _length = 1; +  getBuffer(1); +  if ( _buffer != NULL ) { +    _buffer[0] = value; +    _buffer[1] = 0; +  } +} + +String::String( const unsigned char value ) +{ +  _length = 1; +  getBuffer(1); +  if ( _buffer != NULL) { +    _buffer[0] = value; +    _buffer[1] = 0; +  } +} + +String::String( const int value, const int base ) +{ +  char buf[33];    +  itoa((signed long)value, buf, base); +  getBuffer( _length = strlen(buf) ); +  if ( _buffer != NULL ) +    strcpy( _buffer, buf ); +} + +String::String( const unsigned int value, const int base ) +{ +  char buf[33];    +  ultoa((unsigned long)value, buf, base); +  getBuffer( _length = strlen(buf) ); +  if ( _buffer != NULL ) +    strcpy( _buffer, buf ); +} + +String::String( const long value, const int base ) +{ +  char buf[33];    +  ltoa(value, buf, base); +  getBuffer( _length = strlen(buf) ); +  if ( _buffer != NULL ) +    strcpy( _buffer, buf ); +} + +String::String( const unsigned long value, const int base ) +{ +  char buf[33];    +  ultoa(value, buf, 10); +  getBuffer( _length = strlen(buf) ); +  if ( _buffer != NULL ) +    strcpy( _buffer, buf ); +} + +char String::charAt( unsigned int loc ) const +{ +  return operator[]( loc ); +} + +void String::setCharAt( unsigned int loc, const char aChar )  +{ +  if(_buffer == NULL) return; +  if(_length > loc) { +    _buffer[loc] = aChar; +  } +} + +int String::compareTo( const String &s2 ) const +{ +  return strcmp( _buffer, s2._buffer ); +} + +const String & String::concat( const String &s2 ) +{ +  return (*this) += s2; +} + +const String & String::operator=( const String &rhs ) +{ +  if ( this == &rhs ) +    return *this; + +  if ( rhs._length > _length ) +  { +    free(_buffer); +    getBuffer( rhs._length ); +  } +   +  if ( _buffer != NULL ) { +    _length = rhs._length; +    strcpy( _buffer, rhs._buffer ); +  } +  return *this; +} + +//const String & String::operator+=( const char aChar ) +//{ +//  if ( _length == _capacity ) +//    doubleBuffer(); +// +//  _buffer[ _length++ ] = aChar; +//  _buffer[ _length ] = '\0'; +//  return *this; +//} + +const String & String::operator+=( const String &other ) +{ +  _length += other._length; +  if ( _length > _capacity ) +  { +    char *temp = (char *)realloc(_buffer, _length + 1); +    if ( temp != NULL ) { +      _buffer = temp; +      _capacity = _length; +    } else { +      _length -= other._length; +      return *this; +    } +  } +  strcat( _buffer, other._buffer ); +  return *this; +} + + +int String::operator==( const String &rhs ) const +{ +  return ( _length == rhs._length && strcmp( _buffer, rhs._buffer ) == 0 ); +} + +int String::operator!=( const String &rhs ) const +{ +  return ( _length != rhs.length() || strcmp( _buffer, rhs._buffer ) != 0 ); +} + +int String::operator<( const String &rhs ) const +{ +  return strcmp( _buffer, rhs._buffer ) < 0; +} + +int String::operator>( const String &rhs ) const +{ +  return strcmp( _buffer, rhs._buffer ) > 0; +} + +int String::operator<=( const String &rhs ) const +{ +  return strcmp( _buffer, rhs._buffer ) <= 0; +} + +int String::operator>=( const String & rhs ) const +{ +  return strcmp( _buffer, rhs._buffer ) >= 0; +} + +char & String::operator[]( unsigned int index ) +{ +  static char dummy_writable_char; +  if (index >= _length || !_buffer) { +    dummy_writable_char = 0; +    return dummy_writable_char; +  } +  return _buffer[ index ]; +} + +char String::operator[]( unsigned int index ) const +{ +  // need to check for valid index, to do later +  return _buffer[ index ]; +} + +boolean String::endsWith( const String &s2 ) const +{ +  if ( _length < s2._length ) +    return 0; + +  return strcmp( &_buffer[ _length - s2._length], s2._buffer ) == 0; +} + +boolean String::equals( const String &s2 ) const +{ +  return ( _length == s2._length && strcmp( _buffer,s2._buffer ) == 0 ); +} + +boolean String::equalsIgnoreCase( const String &s2 ) const +{ +  if ( this == &s2 ) +    return true; //1; +  else if ( _length != s2._length ) +    return false; //0; + +  return strcmp(toLowerCase()._buffer, s2.toLowerCase()._buffer) == 0; +} + +String String::replace( char findChar, char replaceChar ) +{ +  if ( _buffer == NULL ) return *this; +  String theReturn = _buffer; +  char* temp = theReturn._buffer; +  while( (temp = strchr( temp, findChar )) != 0 ) +    *temp = replaceChar; + +  return theReturn; +} + +String String::replace( const String& match, const String& replace ) +{ +  if ( _buffer == NULL ) return *this; +  String temp = _buffer, newString; + +  int loc; +  while ( (loc = temp.indexOf( match )) != -1 ) +  { +    newString += temp.substring( 0, loc ); +    newString += replace; +    temp = temp.substring( loc + match._length ); +  } +  newString += temp;   +  return newString; +} + +int String::indexOf( char temp ) const +{ +  return indexOf( temp, 0 ); +} + +int String::indexOf( char ch, unsigned int fromIndex ) const +{ +  if ( fromIndex >= _length ) +    return -1; + +  const char* temp = strchr( &_buffer[fromIndex], ch ); +  if ( temp == NULL ) +    return -1; + +  return temp - _buffer; +} + +int String::indexOf( const String &s2 ) const +{ +  return indexOf( s2, 0 ); +} + +int String::indexOf( const String &s2, unsigned int fromIndex ) const +{ +  if ( fromIndex >= _length ) +    return -1; + +  const char *theFind = strstr( &_buffer[ fromIndex ], s2._buffer ); + +  if ( theFind == NULL ) +    return -1; + +  return theFind - _buffer; // pointer subtraction +} + +int String::lastIndexOf( char theChar ) const +{ +  return lastIndexOf( theChar, _length - 1 ); +} + +int String::lastIndexOf( char ch, unsigned int fromIndex ) const +{ +  if ( fromIndex >= _length ) +    return -1; + +  char tempchar = _buffer[fromIndex + 1]; +  _buffer[fromIndex + 1] = '\0'; +  char* temp = strrchr( _buffer, ch ); +  _buffer[fromIndex + 1] = tempchar; + +  if ( temp == NULL ) +    return -1; + +  return temp - _buffer; +} + +int String::lastIndexOf( const String &s2 ) const +{ +  return lastIndexOf( s2, _length - s2._length ); +} + +int String::lastIndexOf( const String &s2, unsigned int fromIndex ) const +{ +  // check for empty strings +  if ( s2._length == 0 || s2._length - 1 > fromIndex || fromIndex >= _length ) +    return -1; + +  // matching first character +  char temp = s2[ 0 ]; + +  for ( int i = fromIndex; i >= 0; i-- ) +  { +    if ( _buffer[ i ] == temp && (*this).substring( i, i + s2._length ).equals( s2 ) ) +    return i; +  } +  return -1; +} + +boolean String::startsWith( const String &s2 ) const +{ +  if ( _length < s2._length ) +    return 0; + +  return startsWith( s2, 0 ); +} + +boolean String::startsWith( const String &s2, unsigned int offset ) const +{ +  if ( offset > _length - s2._length ) +    return 0; + +  return strncmp( &_buffer[offset], s2._buffer, s2._length ) == 0; +} + +String String::substring( unsigned int left ) const +{ +  return substring( left, _length ); +} + +String String::substring( unsigned int left, unsigned int right ) const +{ +  if ( left > right ) +  { +    int temp = right; +    right = left; +    left = temp; +  } + +  if ( right > _length ) +  { +    right = _length; +  }  + +  char temp = _buffer[ right ];  // save the replaced character +  _buffer[ right ] = '\0';	 +  String outPut = ( _buffer + left );  // pointer arithmetic +  _buffer[ right ] = temp;  //restore character +  return outPut; +} + +String String::toLowerCase() const +{ +  String temp = _buffer; + +  for ( unsigned int i = 0; i < _length; i++ ) +    temp._buffer[ i ] = (char)tolower( temp._buffer[ i ] ); +  return temp; +} + +String String::toUpperCase() const +{ +  String temp = _buffer; + +  for ( unsigned int i = 0; i < _length; i++ ) +    temp._buffer[ i ] = (char)toupper( temp._buffer[ i ] ); +  return temp; +} + +String String::trim() const +{ +  if ( _buffer == NULL ) return *this; +  String temp = _buffer; +  unsigned int i,j; + +  for ( i = 0; i < _length; i++ ) +  { +    if ( !isspace(_buffer[i]) ) +      break; +  } + +  for ( j = temp._length - 1; j > i; j-- ) +  { +    if ( !isspace(_buffer[j]) ) +      break; +  } + +  return temp.substring( i, j + 1); +} + +void String::getBytes(unsigned char *buf, unsigned int bufsize) +{ +  if (!bufsize || !buf) return; +  unsigned int len = bufsize - 1; +  if (len > _length) len = _length; +  strncpy((char *)buf, _buffer, len); +  buf[len] = 0; +} + +void String::toCharArray(char *buf, unsigned int bufsize) +{ +  if (!bufsize || !buf) return; +  unsigned int len = bufsize - 1; +  if (len > _length) len = _length; +  strncpy(buf, _buffer, len); +  buf[len] = 0; +} + + +long String::toInt() { +  return atol(_buffer); +} diff --git a/test/ardmake/hardware/cores/arduino/WString.h b/test/ardmake/hardware/cores/arduino/WString.h new file mode 100644 index 0000000..cadddb9 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/WString.h @@ -0,0 +1,112 @@ +/* +  WString.h - String library for Wiring & Arduino +  Copyright (c) 2009-10 Hernando Barragan.  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 String_h +#define String_h + +//#include "WProgram.h" +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +class String +{ +  public: +    // constructors +    String( const char *value = "" ); +    String( const String &value ); +    String( const char ); +    String( const unsigned char ); +    String( const int, const int base=10); +    String( const unsigned int, const int base=10 ); +    String( const long, const int base=10 ); +    String( const unsigned long, const int base=10 ); +    ~String() { free(_buffer); _length = _capacity = 0;}     //added _length = _capacity = 0; + +    // operators +    const String & operator = ( const String &rhs ); +    const String & operator +=( const String &rhs ); +    //const String & operator +=( const char ); +    int operator ==( const String &rhs ) const; +    int	operator !=( const String &rhs ) const; +    int	operator < ( const String &rhs ) const; +    int	operator > ( const String &rhs ) const; +    int	operator <=( const String &rhs ) const; +    int	operator >=( const String &rhs ) const; +    char operator []( unsigned int index ) const; +    char& operator []( unsigned int index ); +    //operator const char *() const { return _buffer; } +     +    // general methods +    char charAt( unsigned int index ) const; +    int	compareTo( const String &anotherString ) const; +    unsigned char endsWith( const String &suffix ) const; +    unsigned char equals( const String &anObject ) const; +    unsigned char equalsIgnoreCase( const String &anotherString ) const; +    int	indexOf( char ch ) const; +    int	indexOf( char ch, unsigned int fromIndex ) const; +    int	indexOf( const String &str ) const; +    int	indexOf( const String &str, unsigned int fromIndex ) const; +    int	lastIndexOf( char ch ) const; +    int	lastIndexOf( char ch, unsigned int fromIndex ) const; +    int	lastIndexOf( const String &str ) const; +    int	lastIndexOf( const String &str, unsigned int fromIndex ) const; +    const unsigned int length( ) const { return _length; } +    void setCharAt(unsigned int index, const char ch); +    unsigned char startsWith( const String &prefix ) const; +    unsigned char startsWith( const String &prefix, unsigned int toffset ) const; +    String substring( unsigned int beginIndex ) const; +    String substring( unsigned int beginIndex, unsigned int endIndex ) const; +    String toLowerCase( ) const; +    String toUpperCase( ) const; +    String trim( ) const; +    void getBytes(unsigned char *buf, unsigned int bufsize); +    void toCharArray(char *buf, unsigned int bufsize); +    long toInt( ); +    const String& concat( const String &str ); +    String replace( char oldChar, char newChar ); +    String replace( const String& match, const String& replace ); +    friend String operator + ( String lhs, const String &rhs ); + +  protected: +    char *_buffer;	     // the actual char array +    unsigned int _capacity;  // the array length minus one (for the '\0') +    unsigned int _length;    // the String length (not counting the '\0') + +    void getBuffer(unsigned int maxStrLen); + +  private: + +}; + +// allocate buffer space +inline void String::getBuffer(unsigned int maxStrLen) +{ +  _capacity = maxStrLen; +  _buffer = (char *) malloc(_capacity + 1); +  if (_buffer == NULL) _length = _capacity = 0; +} + +inline String operator+( String lhs, const String &rhs ) +{ +  return lhs += rhs; +} + + +#endif diff --git a/test/ardmake/hardware/cores/arduino/binary.h b/test/ardmake/hardware/cores/arduino/binary.h new file mode 100644 index 0000000..af14980 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/binary.h @@ -0,0 +1,515 @@ +#ifndef Binary_h +#define Binary_h + +#define B0 0 +#define B00 0 +#define B000 0 +#define B0000 0 +#define B00000 0 +#define B000000 0 +#define B0000000 0 +#define B00000000 0 +#define B1 1 +#define B01 1 +#define B001 1 +#define B0001 1 +#define B00001 1 +#define B000001 1 +#define B0000001 1 +#define B00000001 1 +#define B10 2 +#define B010 2 +#define B0010 2 +#define B00010 2 +#define B000010 2 +#define B0000010 2 +#define B00000010 2 +#define B11 3 +#define B011 3 +#define B0011 3 +#define B00011 3 +#define B000011 3 +#define B0000011 3 +#define B00000011 3 +#define B100 4 +#define B0100 4 +#define B00100 4 +#define B000100 4 +#define B0000100 4 +#define B00000100 4 +#define B101 5 +#define B0101 5 +#define B00101 5 +#define B000101 5 +#define B0000101 5 +#define B00000101 5 +#define B110 6 +#define B0110 6 +#define B00110 6 +#define B000110 6 +#define B0000110 6 +#define B00000110 6 +#define B111 7 +#define B0111 7 +#define B00111 7 +#define B000111 7 +#define B0000111 7 +#define B00000111 7 +#define B1000 8 +#define B01000 8 +#define B001000 8 +#define B0001000 8 +#define B00001000 8 +#define B1001 9 +#define B01001 9 +#define B001001 9 +#define B0001001 9 +#define B00001001 9 +#define B1010 10 +#define B01010 10 +#define B001010 10 +#define B0001010 10 +#define B00001010 10 +#define B1011 11 +#define B01011 11 +#define B001011 11 +#define B0001011 11 +#define B00001011 11 +#define B1100 12 +#define B01100 12 +#define B001100 12 +#define B0001100 12 +#define B00001100 12 +#define B1101 13 +#define B01101 13 +#define B001101 13 +#define B0001101 13 +#define B00001101 13 +#define B1110 14 +#define B01110 14 +#define B001110 14 +#define B0001110 14 +#define B00001110 14 +#define B1111 15 +#define B01111 15 +#define B001111 15 +#define B0001111 15 +#define B00001111 15 +#define B10000 16 +#define B010000 16 +#define B0010000 16 +#define B00010000 16 +#define B10001 17 +#define B010001 17 +#define B0010001 17 +#define B00010001 17 +#define B10010 18 +#define B010010 18 +#define B0010010 18 +#define B00010010 18 +#define B10011 19 +#define B010011 19 +#define B0010011 19 +#define B00010011 19 +#define B10100 20 +#define B010100 20 +#define B0010100 20 +#define B00010100 20 +#define B10101 21 +#define B010101 21 +#define B0010101 21 +#define B00010101 21 +#define B10110 22 +#define B010110 22 +#define B0010110 22 +#define B00010110 22 +#define B10111 23 +#define B010111 23 +#define B0010111 23 +#define B00010111 23 +#define B11000 24 +#define B011000 24 +#define B0011000 24 +#define B00011000 24 +#define B11001 25 +#define B011001 25 +#define B0011001 25 +#define B00011001 25 +#define B11010 26 +#define B011010 26 +#define B0011010 26 +#define B00011010 26 +#define B11011 27 +#define B011011 27 +#define B0011011 27 +#define B00011011 27 +#define B11100 28 +#define B011100 28 +#define B0011100 28 +#define B00011100 28 +#define B11101 29 +#define B011101 29 +#define B0011101 29 +#define B00011101 29 +#define B11110 30 +#define B011110 30 +#define B0011110 30 +#define B00011110 30 +#define B11111 31 +#define B011111 31 +#define B0011111 31 +#define B00011111 31 +#define B100000 32 +#define B0100000 32 +#define B00100000 32 +#define B100001 33 +#define B0100001 33 +#define B00100001 33 +#define B100010 34 +#define B0100010 34 +#define B00100010 34 +#define B100011 35 +#define B0100011 35 +#define B00100011 35 +#define B100100 36 +#define B0100100 36 +#define B00100100 36 +#define B100101 37 +#define B0100101 37 +#define B00100101 37 +#define B100110 38 +#define B0100110 38 +#define B00100110 38 +#define B100111 39 +#define B0100111 39 +#define B00100111 39 +#define B101000 40 +#define B0101000 40 +#define B00101000 40 +#define B101001 41 +#define B0101001 41 +#define B00101001 41 +#define B101010 42 +#define B0101010 42 +#define B00101010 42 +#define B101011 43 +#define B0101011 43 +#define B00101011 43 +#define B101100 44 +#define B0101100 44 +#define B00101100 44 +#define B101101 45 +#define B0101101 45 +#define B00101101 45 +#define B101110 46 +#define B0101110 46 +#define B00101110 46 +#define B101111 47 +#define B0101111 47 +#define B00101111 47 +#define B110000 48 +#define B0110000 48 +#define B00110000 48 +#define B110001 49 +#define B0110001 49 +#define B00110001 49 +#define B110010 50 +#define B0110010 50 +#define B00110010 50 +#define B110011 51 +#define B0110011 51 +#define B00110011 51 +#define B110100 52 +#define B0110100 52 +#define B00110100 52 +#define B110101 53 +#define B0110101 53 +#define B00110101 53 +#define B110110 54 +#define B0110110 54 +#define B00110110 54 +#define B110111 55 +#define B0110111 55 +#define B00110111 55 +#define B111000 56 +#define B0111000 56 +#define B00111000 56 +#define B111001 57 +#define B0111001 57 +#define B00111001 57 +#define B111010 58 +#define B0111010 58 +#define B00111010 58 +#define B111011 59 +#define B0111011 59 +#define B00111011 59 +#define B111100 60 +#define B0111100 60 +#define B00111100 60 +#define B111101 61 +#define B0111101 61 +#define B00111101 61 +#define B111110 62 +#define B0111110 62 +#define B00111110 62 +#define B111111 63 +#define B0111111 63 +#define B00111111 63 +#define B1000000 64 +#define B01000000 64 +#define B1000001 65 +#define B01000001 65 +#define B1000010 66 +#define B01000010 66 +#define B1000011 67 +#define B01000011 67 +#define B1000100 68 +#define B01000100 68 +#define B1000101 69 +#define B01000101 69 +#define B1000110 70 +#define B01000110 70 +#define B1000111 71 +#define B01000111 71 +#define B1001000 72 +#define B01001000 72 +#define B1001001 73 +#define B01001001 73 +#define B1001010 74 +#define B01001010 74 +#define B1001011 75 +#define B01001011 75 +#define B1001100 76 +#define B01001100 76 +#define B1001101 77 +#define B01001101 77 +#define B1001110 78 +#define B01001110 78 +#define B1001111 79 +#define B01001111 79 +#define B1010000 80 +#define B01010000 80 +#define B1010001 81 +#define B01010001 81 +#define B1010010 82 +#define B01010010 82 +#define B1010011 83 +#define B01010011 83 +#define B1010100 84 +#define B01010100 84 +#define B1010101 85 +#define B01010101 85 +#define B1010110 86 +#define B01010110 86 +#define B1010111 87 +#define B01010111 87 +#define B1011000 88 +#define B01011000 88 +#define B1011001 89 +#define B01011001 89 +#define B1011010 90 +#define B01011010 90 +#define B1011011 91 +#define B01011011 91 +#define B1011100 92 +#define B01011100 92 +#define B1011101 93 +#define B01011101 93 +#define B1011110 94 +#define B01011110 94 +#define B1011111 95 +#define B01011111 95 +#define B1100000 96 +#define B01100000 96 +#define B1100001 97 +#define B01100001 97 +#define B1100010 98 +#define B01100010 98 +#define B1100011 99 +#define B01100011 99 +#define B1100100 100 +#define B01100100 100 +#define B1100101 101 +#define B01100101 101 +#define B1100110 102 +#define B01100110 102 +#define B1100111 103 +#define B01100111 103 +#define B1101000 104 +#define B01101000 104 +#define B1101001 105 +#define B01101001 105 +#define B1101010 106 +#define B01101010 106 +#define B1101011 107 +#define B01101011 107 +#define B1101100 108 +#define B01101100 108 +#define B1101101 109 +#define B01101101 109 +#define B1101110 110 +#define B01101110 110 +#define B1101111 111 +#define B01101111 111 +#define B1110000 112 +#define B01110000 112 +#define B1110001 113 +#define B01110001 113 +#define B1110010 114 +#define B01110010 114 +#define B1110011 115 +#define B01110011 115 +#define B1110100 116 +#define B01110100 116 +#define B1110101 117 +#define B01110101 117 +#define B1110110 118 +#define B01110110 118 +#define B1110111 119 +#define B01110111 119 +#define B1111000 120 +#define B01111000 120 +#define B1111001 121 +#define B01111001 121 +#define B1111010 122 +#define B01111010 122 +#define B1111011 123 +#define B01111011 123 +#define B1111100 124 +#define B01111100 124 +#define B1111101 125 +#define B01111101 125 +#define B1111110 126 +#define B01111110 126 +#define B1111111 127 +#define B01111111 127 +#define B10000000 128 +#define B10000001 129 +#define B10000010 130 +#define B10000011 131 +#define B10000100 132 +#define B10000101 133 +#define B10000110 134 +#define B10000111 135 +#define B10001000 136 +#define B10001001 137 +#define B10001010 138 +#define B10001011 139 +#define B10001100 140 +#define B10001101 141 +#define B10001110 142 +#define B10001111 143 +#define B10010000 144 +#define B10010001 145 +#define B10010010 146 +#define B10010011 147 +#define B10010100 148 +#define B10010101 149 +#define B10010110 150 +#define B10010111 151 +#define B10011000 152 +#define B10011001 153 +#define B10011010 154 +#define B10011011 155 +#define B10011100 156 +#define B10011101 157 +#define B10011110 158 +#define B10011111 159 +#define B10100000 160 +#define B10100001 161 +#define B10100010 162 +#define B10100011 163 +#define B10100100 164 +#define B10100101 165 +#define B10100110 166 +#define B10100111 167 +#define B10101000 168 +#define B10101001 169 +#define B10101010 170 +#define B10101011 171 +#define B10101100 172 +#define B10101101 173 +#define B10101110 174 +#define B10101111 175 +#define B10110000 176 +#define B10110001 177 +#define B10110010 178 +#define B10110011 179 +#define B10110100 180 +#define B10110101 181 +#define B10110110 182 +#define B10110111 183 +#define B10111000 184 +#define B10111001 185 +#define B10111010 186 +#define B10111011 187 +#define B10111100 188 +#define B10111101 189 +#define B10111110 190 +#define B10111111 191 +#define B11000000 192 +#define B11000001 193 +#define B11000010 194 +#define B11000011 195 +#define B11000100 196 +#define B11000101 197 +#define B11000110 198 +#define B11000111 199 +#define B11001000 200 +#define B11001001 201 +#define B11001010 202 +#define B11001011 203 +#define B11001100 204 +#define B11001101 205 +#define B11001110 206 +#define B11001111 207 +#define B11010000 208 +#define B11010001 209 +#define B11010010 210 +#define B11010011 211 +#define B11010100 212 +#define B11010101 213 +#define B11010110 214 +#define B11010111 215 +#define B11011000 216 +#define B11011001 217 +#define B11011010 218 +#define B11011011 219 +#define B11011100 220 +#define B11011101 221 +#define B11011110 222 +#define B11011111 223 +#define B11100000 224 +#define B11100001 225 +#define B11100010 226 +#define B11100011 227 +#define B11100100 228 +#define B11100101 229 +#define B11100110 230 +#define B11100111 231 +#define B11101000 232 +#define B11101001 233 +#define B11101010 234 +#define B11101011 235 +#define B11101100 236 +#define B11101101 237 +#define B11101110 238 +#define B11101111 239 +#define B11110000 240 +#define B11110001 241 +#define B11110010 242 +#define B11110011 243 +#define B11110100 244 +#define B11110101 245 +#define B11110110 246 +#define B11110111 247 +#define B11111000 248 +#define B11111001 249 +#define B11111010 250 +#define B11111011 251 +#define B11111100 252 +#define B11111101 253 +#define B11111110 254 +#define B11111111 255 + +#endif diff --git a/test/ardmake/hardware/cores/arduino/main.cpp b/test/ardmake/hardware/cores/arduino/main.cpp new file mode 100644 index 0000000..cc6e81d --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/main.cpp @@ -0,0 +1,14 @@ +#include <WProgram.h> + +int main(void) +{ +	init(); + +	setup(); +     +	for (;;) +		loop(); +         +	return 0; +} + diff --git a/test/ardmake/hardware/cores/arduino/main.cxx b/test/ardmake/hardware/cores/arduino/main.cxx new file mode 100644 index 0000000..52351e4 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/main.cxx @@ -0,0 +1,12 @@ +int main(void) +{ +	init(); + +	setup(); +     +	for (;;) +		loop(); +         +	return 0; +} + diff --git a/test/ardmake/hardware/cores/arduino/pins_arduino.c b/test/ardmake/hardware/cores/arduino/pins_arduino.c new file mode 100644 index 0000000..0c816e9 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/pins_arduino.c @@ -0,0 +1,465 @@ +/* +  pins_arduino.c - pin definitions for the Arduino board +  Part of Arduino / Wiring Lite + +  Copyright (c) 2005 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  $Id$ +*/ + +#include <avr/io.h> +#include "wiring_private.h" +#include "pins_arduino.h" + +// On the Arduino board, digital pins are also used +// for the analog output (software PWM).  Analog input +// pins are a separate set. + +// ATMEL ATMEGA8 & 168 / ARDUINO +// +//                  +-\/-+ +//            PC6  1|    |28  PC5 (AI 5) +//      (D 0) PD0  2|    |27  PC4 (AI 4) +//      (D 1) PD1  3|    |26  PC3 (AI 3) +//      (D 2) PD2  4|    |25  PC2 (AI 2) +// PWM+ (D 3) PD3  5|    |24  PC1 (AI 1) +//      (D 4) PD4  6|    |23  PC0 (AI 0) +//            VCC  7|    |22  GND +//            GND  8|    |21  AREF +//            PB6  9|    |20  AVCC +//            PB7 10|    |19  PB5 (D 13) +// PWM+ (D 5) PD5 11|    |18  PB4 (D 12) +// PWM+ (D 6) PD6 12|    |17  PB3 (D 11) PWM +//      (D 7) PD7 13|    |16  PB2 (D 10) PWM +//      (D 8) PB0 14|    |15  PB1 (D 9) PWM +//                  +----+ +// +// (PWM+ indicates the additional PWM pins on the ATmega168.) + +// ATMEL ATMEGA1280 / ARDUINO +// +// 0-7 PE0-PE7   works +// 8-13 PB0-PB5  works +// 14-21 PA0-PA7 works  +// 22-29 PH0-PH7 works +// 30-35 PG5-PG0 works +// 36-43 PC7-PC0 works +// 44-51 PJ7-PJ0 works +// 52-59 PL7-PL0 works +// 60-67 PD7-PD0 works +// A0-A7 PF0-PF7 +// A8-A15 PK0-PK7 + +#define PA 1 +#define PB 2 +#define PC 3 +#define PD 4 +#define PE 5 +#define PF 6 +#define PG 7 +#define PH 8 +#define PJ 10 +#define PK 11 +#define PL 12 + + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +const uint16_t PROGMEM port_to_mode_PGM[] = { +	NOT_A_PORT, +	&DDRA, +	&DDRB, +	&DDRC, +	&DDRD, +	&DDRE, +	&DDRF, +	&DDRG, +	&DDRH, +	NOT_A_PORT, +	&DDRJ, +	&DDRK, +	&DDRL, +}; + +const uint16_t PROGMEM port_to_output_PGM[] = { +	NOT_A_PORT, +	&PORTA, +	&PORTB, +	&PORTC, +	&PORTD, +	&PORTE, +	&PORTF, +	&PORTG, +	&PORTH, +	NOT_A_PORT, +	&PORTJ, +	&PORTK, +	&PORTL, +}; + +const uint16_t PROGMEM port_to_input_PGM[] = { +	NOT_A_PIN, +	&PINA, +	&PINB, +	&PINC, +	&PIND, +	&PINE, +	&PINF, +	&PING, +	&PINH, +	NOT_A_PIN, +	&PINJ, +	&PINK, +	&PINL, +}; + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { +	// PORTLIST		 +	// -------------------------------------------		 +	PE	, // PE 0 ** 0 ** USART0_RX	 +	PE	, // PE 1 ** 1 ** USART0_TX	 +	PE	, // PE 4 ** 2 ** PWM2	 +	PE	, // PE 5 ** 3 ** PWM3	 +	PG	, // PG 5 ** 4 ** PWM4	 +	PE	, // PE 3 ** 5 ** PWM5	 +	PH	, // PH 3 ** 6 ** PWM6	 +	PH	, // PH 4 ** 7 ** PWM7	 +	PH	, // PH 5 ** 8 ** PWM8	 +	PH	, // PH 6 ** 9 ** PWM9	 +	PB	, // PB 4 ** 10 ** PWM10	 +	PB	, // PB 5 ** 11 ** PWM11	 +	PB	, // PB 6 ** 12 ** PWM12	 +	PB	, // PB 7 ** 13 ** PWM13	 +	PJ	, // PJ 1 ** 14 ** USART3_TX	 +	PJ	, // PJ 0 ** 15 ** USART3_RX	 +	PH	, // PH 1 ** 16 ** USART2_TX	 +	PH	, // PH 0 ** 17 ** USART2_RX	 +	PD	, // PD 3 ** 18 ** USART1_TX	 +	PD	, // PD 2 ** 19 ** USART1_RX	 +	PD	, // PD 1 ** 20 ** I2C_SDA	 +	PD	, // PD 0 ** 21 ** I2C_SCL	 +	PA	, // PA 0 ** 22 ** D22	 +	PA	, // PA 1 ** 23 ** D23	 +	PA	, // PA 2 ** 24 ** D24	 +	PA	, // PA 3 ** 25 ** D25	 +	PA	, // PA 4 ** 26 ** D26	 +	PA	, // PA 5 ** 27 ** D27	 +	PA	, // PA 6 ** 28 ** D28	 +	PA	, // PA 7 ** 29 ** D29	 +	PC	, // PC 7 ** 30 ** D30	 +	PC	, // PC 6 ** 31 ** D31	 +	PC	, // PC 5 ** 32 ** D32	 +	PC	, // PC 4 ** 33 ** D33	 +	PC	, // PC 3 ** 34 ** D34	 +	PC	, // PC 2 ** 35 ** D35	 +	PC	, // PC 1 ** 36 ** D36	 +	PC	, // PC 0 ** 37 ** D37	 +	PD	, // PD 7 ** 38 ** D38	 +	PG	, // PG 2 ** 39 ** D39	 +	PG	, // PG 1 ** 40 ** D40	 +	PG	, // PG 0 ** 41 ** D41	 +	PL	, // PL 7 ** 42 ** D42	 +	PL	, // PL 6 ** 43 ** D43	 +	PL	, // PL 5 ** 44 ** D44	 +	PL	, // PL 4 ** 45 ** D45	 +	PL	, // PL 3 ** 46 ** D46	 +	PL	, // PL 2 ** 47 ** D47	 +	PL	, // PL 1 ** 48 ** D48	 +	PL	, // PL 0 ** 49 ** D49	 +	PB	, // PB 3 ** 50 ** SPI_MISO	 +	PB	, // PB 2 ** 51 ** SPI_MOSI	 +	PB	, // PB 1 ** 52 ** SPI_SCK	 +	PB	, // PB 0 ** 53 ** SPI_SS	 +	PF	, // PF 0 ** 54 ** A0	 +	PF	, // PF 1 ** 55 ** A1	 +	PF	, // PF 2 ** 56 ** A2	 +	PF	, // PF 3 ** 57 ** A3	 +	PF	, // PF 4 ** 58 ** A4	 +	PF	, // PF 5 ** 59 ** A5	 +	PF	, // PF 6 ** 60 ** A6	 +	PF	, // PF 7 ** 61 ** A7	 +	PK	, // PK 0 ** 62 ** A8	 +	PK	, // PK 1 ** 63 ** A9	 +	PK	, // PK 2 ** 64 ** A10	 +	PK	, // PK 3 ** 65 ** A11	 +	PK	, // PK 4 ** 66 ** A12	 +	PK	, // PK 5 ** 67 ** A13	 +	PK	, // PK 6 ** 68 ** A14	 +	PK	, // PK 7 ** 69 ** A15	 +}; + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { +	// PIN IN PORT		 +	// -------------------------------------------		 +	_BV( 0 )	, // PE 0 ** 0 ** USART0_RX	 +	_BV( 1 )	, // PE 1 ** 1 ** USART0_TX	 +	_BV( 4 )	, // PE 4 ** 2 ** PWM2	 +	_BV( 5 )	, // PE 5 ** 3 ** PWM3	 +	_BV( 5 )	, // PG 5 ** 4 ** PWM4	 +	_BV( 3 )	, // PE 3 ** 5 ** PWM5	 +	_BV( 3 )	, // PH 3 ** 6 ** PWM6	 +	_BV( 4 )	, // PH 4 ** 7 ** PWM7	 +	_BV( 5 )	, // PH 5 ** 8 ** PWM8	 +	_BV( 6 )	, // PH 6 ** 9 ** PWM9	 +	_BV( 4 )	, // PB 4 ** 10 ** PWM10	 +	_BV( 5 )	, // PB 5 ** 11 ** PWM11	 +	_BV( 6 )	, // PB 6 ** 12 ** PWM12	 +	_BV( 7 )	, // PB 7 ** 13 ** PWM13	 +	_BV( 1 )	, // PJ 1 ** 14 ** USART3_TX	 +	_BV( 0 )	, // PJ 0 ** 15 ** USART3_RX	 +	_BV( 1 )	, // PH 1 ** 16 ** USART2_TX	 +	_BV( 0 )	, // PH 0 ** 17 ** USART2_RX	 +	_BV( 3 )	, // PD 3 ** 18 ** USART1_TX	 +	_BV( 2 )	, // PD 2 ** 19 ** USART1_RX	 +	_BV( 1 )	, // PD 1 ** 20 ** I2C_SDA	 +	_BV( 0 )	, // PD 0 ** 21 ** I2C_SCL	 +	_BV( 0 )	, // PA 0 ** 22 ** D22	 +	_BV( 1 )	, // PA 1 ** 23 ** D23	 +	_BV( 2 )	, // PA 2 ** 24 ** D24	 +	_BV( 3 )	, // PA 3 ** 25 ** D25	 +	_BV( 4 )	, // PA 4 ** 26 ** D26	 +	_BV( 5 )	, // PA 5 ** 27 ** D27	 +	_BV( 6 )	, // PA 6 ** 28 ** D28	 +	_BV( 7 )	, // PA 7 ** 29 ** D29	 +	_BV( 7 )	, // PC 7 ** 30 ** D30	 +	_BV( 6 )	, // PC 6 ** 31 ** D31	 +	_BV( 5 )	, // PC 5 ** 32 ** D32	 +	_BV( 4 )	, // PC 4 ** 33 ** D33	 +	_BV( 3 )	, // PC 3 ** 34 ** D34	 +	_BV( 2 )	, // PC 2 ** 35 ** D35	 +	_BV( 1 )	, // PC 1 ** 36 ** D36	 +	_BV( 0 )	, // PC 0 ** 37 ** D37	 +	_BV( 7 )	, // PD 7 ** 38 ** D38	 +	_BV( 2 )	, // PG 2 ** 39 ** D39	 +	_BV( 1 )	, // PG 1 ** 40 ** D40	 +	_BV( 0 )	, // PG 0 ** 41 ** D41	 +	_BV( 7 )	, // PL 7 ** 42 ** D42	 +	_BV( 6 )	, // PL 6 ** 43 ** D43	 +	_BV( 5 )	, // PL 5 ** 44 ** D44	 +	_BV( 4 )	, // PL 4 ** 45 ** D45	 +	_BV( 3 )	, // PL 3 ** 46 ** D46	 +	_BV( 2 )	, // PL 2 ** 47 ** D47	 +	_BV( 1 )	, // PL 1 ** 48 ** D48	 +	_BV( 0 )	, // PL 0 ** 49 ** D49	 +	_BV( 3 )	, // PB 3 ** 50 ** SPI_MISO	 +	_BV( 2 )	, // PB 2 ** 51 ** SPI_MOSI	 +	_BV( 1 )	, // PB 1 ** 52 ** SPI_SCK	 +	_BV( 0 )	, // PB 0 ** 53 ** SPI_SS	 +	_BV( 0 )	, // PF 0 ** 54 ** A0	 +	_BV( 1 )	, // PF 1 ** 55 ** A1	 +	_BV( 2 )	, // PF 2 ** 56 ** A2	 +	_BV( 3 )	, // PF 3 ** 57 ** A3	 +	_BV( 4 )	, // PF 4 ** 58 ** A4	 +	_BV( 5 )	, // PF 5 ** 59 ** A5	 +	_BV( 6 )	, // PF 6 ** 60 ** A6	 +	_BV( 7 )	, // PF 7 ** 61 ** A7	 +	_BV( 0 )	, // PK 0 ** 62 ** A8	 +	_BV( 1 )	, // PK 1 ** 63 ** A9	 +	_BV( 2 )	, // PK 2 ** 64 ** A10	 +	_BV( 3 )	, // PK 3 ** 65 ** A11	 +	_BV( 4 )	, // PK 4 ** 66 ** A12	 +	_BV( 5 )	, // PK 5 ** 67 ** A13	 +	_BV( 6 )	, // PK 6 ** 68 ** A14	 +	_BV( 7 )	, // PK 7 ** 69 ** A15	 +}; + +const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { +	// TIMERS		 +	// -------------------------------------------		 +	NOT_ON_TIMER	, // PE 0 ** 0 ** USART0_RX	 +	NOT_ON_TIMER	, // PE 1 ** 1 ** USART0_TX	 +	TIMER3B	, // PE 4 ** 2 ** PWM2	 +	TIMER3C	, // PE 5 ** 3 ** PWM3	 +	TIMER0B	, // PG 5 ** 4 ** PWM4	 +	TIMER3A	, // PE 3 ** 5 ** PWM5	 +	TIMER4A	, // PH 3 ** 6 ** PWM6	 +	TIMER4B	, // PH 4 ** 7 ** PWM7	 +	TIMER4C	, // PH 5 ** 8 ** PWM8	 +	TIMER2B	, // PH 6 ** 9 ** PWM9	 +	TIMER2A	, // PB 4 ** 10 ** PWM10	 +	TIMER1A	, // PB 5 ** 11 ** PWM11	 +	TIMER1B	, // PB 6 ** 12 ** PWM12	 +	TIMER0A	, // PB 7 ** 13 ** PWM13	 +	NOT_ON_TIMER	, // PJ 1 ** 14 ** USART3_TX	 +	NOT_ON_TIMER	, // PJ 0 ** 15 ** USART3_RX	 +	NOT_ON_TIMER	, // PH 1 ** 16 ** USART2_TX	 +	NOT_ON_TIMER	, // PH 0 ** 17 ** USART2_RX	 +	NOT_ON_TIMER	, // PD 3 ** 18 ** USART1_TX	 +	NOT_ON_TIMER	, // PD 2 ** 19 ** USART1_RX	 +	NOT_ON_TIMER	, // PD 1 ** 20 ** I2C_SDA	 +	NOT_ON_TIMER	, // PD 0 ** 21 ** I2C_SCL	 +	NOT_ON_TIMER	, // PA 0 ** 22 ** D22	 +	NOT_ON_TIMER	, // PA 1 ** 23 ** D23	 +	NOT_ON_TIMER	, // PA 2 ** 24 ** D24	 +	NOT_ON_TIMER	, // PA 3 ** 25 ** D25	 +	NOT_ON_TIMER	, // PA 4 ** 26 ** D26	 +	NOT_ON_TIMER	, // PA 5 ** 27 ** D27	 +	NOT_ON_TIMER	, // PA 6 ** 28 ** D28	 +	NOT_ON_TIMER	, // PA 7 ** 29 ** D29	 +	NOT_ON_TIMER	, // PC 7 ** 30 ** D30	 +	NOT_ON_TIMER	, // PC 6 ** 31 ** D31	 +	NOT_ON_TIMER	, // PC 5 ** 32 ** D32	 +	NOT_ON_TIMER	, // PC 4 ** 33 ** D33	 +	NOT_ON_TIMER	, // PC 3 ** 34 ** D34	 +	NOT_ON_TIMER	, // PC 2 ** 35 ** D35	 +	NOT_ON_TIMER	, // PC 1 ** 36 ** D36	 +	NOT_ON_TIMER	, // PC 0 ** 37 ** D37	 +	NOT_ON_TIMER	, // PD 7 ** 38 ** D38	 +	NOT_ON_TIMER	, // PG 2 ** 39 ** D39	 +	NOT_ON_TIMER	, // PG 1 ** 40 ** D40	 +	NOT_ON_TIMER	, // PG 0 ** 41 ** D41	 +	NOT_ON_TIMER	, // PL 7 ** 42 ** D42	 +	NOT_ON_TIMER	, // PL 6 ** 43 ** D43	 +	TIMER5C	, // PL 5 ** 44 ** D44	 +	TIMER5B	, // PL 4 ** 45 ** D45	 +	TIMER5A	, // PL 3 ** 46 ** D46	 +	NOT_ON_TIMER	, // PL 2 ** 47 ** D47	 +	NOT_ON_TIMER	, // PL 1 ** 48 ** D48	 +	NOT_ON_TIMER	, // PL 0 ** 49 ** D49	 +	NOT_ON_TIMER	, // PB 3 ** 50 ** SPI_MISO	 +	NOT_ON_TIMER	, // PB 2 ** 51 ** SPI_MOSI	 +	NOT_ON_TIMER	, // PB 1 ** 52 ** SPI_SCK	 +	NOT_ON_TIMER	, // PB 0 ** 53 ** SPI_SS	 +	NOT_ON_TIMER	, // PF 0 ** 54 ** A0	 +	NOT_ON_TIMER	, // PF 1 ** 55 ** A1	 +	NOT_ON_TIMER	, // PF 2 ** 56 ** A2	 +	NOT_ON_TIMER	, // PF 3 ** 57 ** A3	 +	NOT_ON_TIMER	, // PF 4 ** 58 ** A4	 +	NOT_ON_TIMER	, // PF 5 ** 59 ** A5	 +	NOT_ON_TIMER	, // PF 6 ** 60 ** A6	 +	NOT_ON_TIMER	, // PF 7 ** 61 ** A7	 +	NOT_ON_TIMER	, // PK 0 ** 62 ** A8	 +	NOT_ON_TIMER	, // PK 1 ** 63 ** A9	 +	NOT_ON_TIMER	, // PK 2 ** 64 ** A10	 +	NOT_ON_TIMER	, // PK 3 ** 65 ** A11	 +	NOT_ON_TIMER	, // PK 4 ** 66 ** A12	 +	NOT_ON_TIMER	, // PK 5 ** 67 ** A13	 +	NOT_ON_TIMER	, // PK 6 ** 68 ** A14	 +	NOT_ON_TIMER	, // PK 7 ** 69 ** A15	 +}; +#else +// these arrays map port names (e.g. port B) to the +// appropriate addresses for various functions (e.g. reading +// and writing) +const uint16_t PROGMEM port_to_mode_PGM[] = { +	NOT_A_PORT, +	NOT_A_PORT, +	&DDRB, +	&DDRC, +	&DDRD, +}; + +const uint16_t PROGMEM port_to_output_PGM[] = { +	NOT_A_PORT, +	NOT_A_PORT, +	&PORTB, +	&PORTC, +	&PORTD, +}; + +const uint16_t PROGMEM port_to_input_PGM[] = { +	NOT_A_PORT, +	NOT_A_PORT, +	&PINB, +	&PINC, +	&PIND, +}; + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { +	PD, /* 0 */ +	PD, +	PD, +	PD, +	PD, +	PD, +	PD, +	PD, +	PB, /* 8 */ +	PB, +	PB, +	PB, +	PB, +	PB, +	PC, /* 14 */ +	PC, +	PC, +	PC, +	PC, +	PC, +}; + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { +	_BV(0), /* 0, port D */ +	_BV(1), +	_BV(2), +	_BV(3), +	_BV(4), +	_BV(5), +	_BV(6), +	_BV(7), +	_BV(0), /* 8, port B */ +	_BV(1), +	_BV(2), +	_BV(3), +	_BV(4), +	_BV(5), +	_BV(0), /* 14, port C */ +	_BV(1), +	_BV(2), +	_BV(3), +	_BV(4), +	_BV(5), +}; + +const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { +	NOT_ON_TIMER, /* 0 - port D */ +	NOT_ON_TIMER, +	NOT_ON_TIMER, +	// on the ATmega168, digital pin 3 has hardware pwm +#if defined(__AVR_ATmega8__) +	NOT_ON_TIMER, +#else +	TIMER2B, +#endif +	NOT_ON_TIMER, +	// on the ATmega168, digital pins 5 and 6 have hardware pwm +#if defined(__AVR_ATmega8__) +	NOT_ON_TIMER, +	NOT_ON_TIMER, +#else +	TIMER0B, +	TIMER0A, +#endif +	NOT_ON_TIMER, +	NOT_ON_TIMER, /* 8 - port B */ +	TIMER1A, +	TIMER1B, +#if defined(__AVR_ATmega8__) +	TIMER2, +#else +	TIMER2A, +#endif +	NOT_ON_TIMER, +	NOT_ON_TIMER, +	NOT_ON_TIMER, +	NOT_ON_TIMER, /* 14 - port C */ +	NOT_ON_TIMER, +	NOT_ON_TIMER, +	NOT_ON_TIMER, +	NOT_ON_TIMER, +}; +#endif diff --git a/test/ardmake/hardware/cores/arduino/pins_arduino.d b/test/ardmake/hardware/cores/arduino/pins_arduino.d new file mode 100644 index 0000000..aef7639 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/pins_arduino.d @@ -0,0 +1,24 @@ +ardmake/hardware/cores/arduino/pins_arduino.o ardmake/hardware/cores/arduino/pins_arduino.d: ardmake/hardware/cores/arduino/pins_arduino.c \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  ardmake/hardware/cores/arduino/binary.h \ +  ardmake/hardware/cores/arduino/pins_arduino.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/pgmspace.h diff --git a/test/ardmake/hardware/cores/arduino/pins_arduino.h b/test/ardmake/hardware/cores/arduino/pins_arduino.h new file mode 100644 index 0000000..bc931c5 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/pins_arduino.h @@ -0,0 +1,88 @@ +/* +  pins_arduino.h - Pin definition functions for Arduino +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2007 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include <avr/pgmspace.h> + +#define NOT_A_PIN 0 +#define NOT_A_PORT 0 + +#define NOT_ON_TIMER 0 +#define TIMER0A 1 +#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 TIMER5A 14 +#define TIMER5B 15 +#define TIMER5C 16 + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +const static uint8_t SS   = 53; +const static uint8_t MOSI = 51; +const static uint8_t MISO = 50; +const static uint8_t SCK  = 52; +#else +const static uint8_t SS   = 10; +const static uint8_t MOSI = 11; +const static uint8_t MISO = 12; +const static uint8_t SCK  = 13; +#endif + +// On the ATmega1280, the addresses of some of the port registers are +// greater than 255, so we can't store them in uint8_t's. +extern const uint16_t PROGMEM port_to_mode_PGM[]; +extern const uint16_t PROGMEM port_to_input_PGM[]; +extern const uint16_t PROGMEM port_to_output_PGM[]; + +extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; +// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; +extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; +extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; + +// Get the bit location within the hardware port of the given virtual pin. +// This comes from the pins_*.c file for the active board configuration. +//  +// These perform slightly better as macros compared to inline functions +// +#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) +#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) +#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) +#define analogInPinToBit(P) (P) +#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) +#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) +#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) ) + +#endif diff --git a/test/ardmake/hardware/cores/arduino/wiring.c b/test/ardmake/hardware/cores/arduino/wiring.c new file mode 100644 index 0000000..b90d07e --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring.c @@ -0,0 +1,289 @@ +/* +  wiring.c - Partial implementation of the Wiring API for the ATmega8. +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2005-2006 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  $Id$ +*/ + +#include "wiring_private.h" + +// the prescaler is set so that timer0 ticks every 64 clock cycles, and the +// the overflow handler is called every 256 ticks. +#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) + +// the whole number of milliseconds per timer0 overflow +#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) + +// the fractional number of milliseconds per timer0 overflow. we shift right +// by three to fit these numbers into a byte. (for the clock speeds we care +// about - 8 and 16 MHz - this doesn't lose precision.) +#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) +#define FRACT_MAX (1000 >> 3) + +volatile unsigned long timer0_overflow_count = 0; +volatile unsigned long timer0_millis = 0; +static unsigned char timer0_fract = 0; + +SIGNAL(TIMER0_OVF_vect) +{ +	// copy these to local variables so they can be stored in registers +	// (volatile variables must be read from memory on every access) +	unsigned long m = timer0_millis; +	unsigned char f = timer0_fract; + +	m += MILLIS_INC; +	f += FRACT_INC; +	if (f >= FRACT_MAX) { +		f -= FRACT_MAX; +		m += 1; +	} + +	timer0_fract = f; +	timer0_millis = m; +	timer0_overflow_count++; +} + +unsigned long millis() +{ +	unsigned long m; +	uint8_t oldSREG = SREG; + +	// disable interrupts while we read timer0_millis or we might get an +	// inconsistent value (e.g. in the middle of a write to timer0_millis) +	cli(); +	m = timer0_millis; +	SREG = oldSREG; + +	return m; +} + +unsigned long micros() { +	unsigned long m; +	uint8_t oldSREG = SREG, t; +	 +	cli(); +	m = timer0_overflow_count; +#if defined(TCNT0) +	t = TCNT0; +#elif defined(TCNT0L) +	t = TCNT0L; +#else +	#error TIMER 0 not defined +#endif + +   +#ifdef TIFR0 +	if ((TIFR0 & _BV(TOV0)) && (t < 255)) +		m++; +#else +	if ((TIFR & _BV(TOV0)) && (t < 255)) +		m++; +#endif + +	SREG = oldSREG; +	 +	return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); +} + +void delay(unsigned long ms) +{ +	uint16_t start = (uint16_t)micros(); + +	while (ms > 0) { +		if (((uint16_t)micros() - start) >= 1000) { +			ms--; +			start += 1000; +		} +	} +} + +/* Delay for the given number of microseconds.  Assumes a 8 or 16 MHz clock. */ +void delayMicroseconds(unsigned int us) +{ +	// calling avrlib's delay_us() function with low values (e.g. 1 or +	// 2 microseconds) gives delays longer than desired. +	//delay_us(us); + +#if F_CPU >= 16000000L +	// for the 16 MHz clock on most Arduino boards + +	// for a one-microsecond delay, simply return.  the overhead +	// of the function call yields a delay of approximately 1 1/8 us. +	if (--us == 0) +		return; + +	// the following loop takes a quarter of a microsecond (4 cycles) +	// per iteration, so execute it four times for each microsecond of +	// delay requested. +	us <<= 2; + +	// account for the time taken in the preceeding commands. +	us -= 2; +#else +	// for the 8 MHz internal clock on the ATmega168 + +	// for a one- or two-microsecond delay, simply return.  the overhead of +	// the function calls takes more than two microseconds.  can't just +	// subtract two, since us is unsigned; we'd overflow. +	if (--us == 0) +		return; +	if (--us == 0) +		return; + +	// the following loop takes half of a microsecond (4 cycles) +	// per iteration, so execute it twice for each microsecond of +	// delay requested. +	us <<= 1; +     +	// partially compensate for the time taken by the preceeding commands. +	// we can't subtract any more than this or we'd overflow w/ small delays. +	us--; +#endif + +	// busy wait +	__asm__ __volatile__ ( +		"1: sbiw %0,1" "\n\t" // 2 cycles +		"brne 1b" : "=w" (us) : "0" (us) // 2 cycles +	); +} + +void init() +{ +	// this needs to be called before setup() or some functions won't +	// work there +	sei(); +	 +	// on the ATmega168, timer 0 is also used for fast hardware pwm +	// (using phase-correct PWM would mean that timer 0 overflowed half as often +	// resulting in different millis() behavior on the ATmega8 and ATmega168) +#if defined(TCCR0A) && defined(WGM01) +	sbi(TCCR0A, WGM01); +	sbi(TCCR0A, WGM00); +#endif   + +	// set timer 0 prescale factor to 64 +#if defined(__AVR_ATmega128__) +	// CPU specific: different values for the ATmega128 +	sbi(TCCR0, CS02); +#elif defined(TCCR0) && defined(CS01) && defined(CS00) +	// this combination is for the standard atmega8 +	sbi(TCCR0, CS01); +	sbi(TCCR0, CS00); +#elif defined(TCCR0B) && defined(CS01) && defined(CS00) +	// this combination is for the standard 168/328/1280/2560 +	sbi(TCCR0B, CS01); +	sbi(TCCR0B, CS00); +#elif defined(TCCR0A) && defined(CS01) && defined(CS00) +	// this combination is for the __AVR_ATmega645__ series +	sbi(TCCR0A, CS01); +	sbi(TCCR0A, CS00); +#else +	#error Timer 0 prescale factor 64 not set correctly +#endif + +	// enable timer 0 overflow interrupt +#if defined(TIMSK) && defined(TOIE0) +	sbi(TIMSK, TOIE0); +#elif defined(TIMSK0) && defined(TOIE0) +	sbi(TIMSK0, TOIE0); +#else +	#error	Timer 0 overflow interrupt not set correctly +#endif + +	// timers 1 and 2 are used for phase-correct hardware pwm +	// this is better for motors as it ensures an even waveform +	// note, however, that fast pwm mode can achieve a frequency of up +	// 8 MHz (with a 16 MHz clock) at 50% duty cycle + +	TCCR1B = 0; + +	// set timer 1 prescale factor to 64 +#if defined(TCCR1B) && defined(CS11) && defined(CS10) +	sbi(TCCR1B, CS11); +	sbi(TCCR1B, CS10); +#elif defined(TCCR1) && defined(CS11) && defined(CS10) +	sbi(TCCR1, CS11); +	sbi(TCCR1, CS10); +#endif +	// put timer 1 in 8-bit phase correct pwm mode +#if defined(TCCR1A) && defined(WGM10) +	sbi(TCCR1A, WGM10); +#elif defined(TCCR1) +	#warning this needs to be finished +#endif + +	// set timer 2 prescale factor to 64 +#if defined(TCCR2) && defined(CS22) +	sbi(TCCR2, CS22); +#elif defined(TCCR2B) && defined(CS22) +	sbi(TCCR2B, CS22); +#else +	#warning Timer 2 not finished (may not be present on this CPU) +#endif + +	// configure timer 2 for phase correct pwm (8-bit) +#if defined(TCCR2) && defined(WGM20) +	sbi(TCCR2, WGM20); +#elif defined(TCCR2A) && defined(WGM20) +	sbi(TCCR2A, WGM20); +#else +	#warning Timer 2 not finished (may not be present on this CPU) +#endif + +#if defined(TCCR3B) && defined(CS31) && defined(WGM30) +	sbi(TCCR3B, CS31);		// set timer 3 prescale factor to 64 +	sbi(TCCR3B, CS30); +	sbi(TCCR3A, WGM30);		// put timer 3 in 8-bit phase correct pwm mode +#endif +	 +#if defined(TCCR4B) && defined(CS41) && defined(WGM40) +	sbi(TCCR4B, CS41);		// set timer 4 prescale factor to 64 +	sbi(TCCR4B, CS40); +	sbi(TCCR4A, WGM40);		// put timer 4 in 8-bit phase correct pwm mode +#endif + +#if defined(TCCR5B) && defined(CS51) && defined(WGM50) +	sbi(TCCR5B, CS51);		// set timer 5 prescale factor to 64 +	sbi(TCCR5B, CS50); +	sbi(TCCR5A, WGM50);		// put timer 5 in 8-bit phase correct pwm mode +#endif + +#if defined(ADCSRA) +	// set a2d prescale factor to 128 +	// 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. +	// XXX: this will not work properly for other clock speeds, and +	// this code should use F_CPU to determine the prescale factor. +	sbi(ADCSRA, ADPS2); +	sbi(ADCSRA, ADPS1); +	sbi(ADCSRA, ADPS0); + +	// enable a2d conversions +	sbi(ADCSRA, ADEN); +#endif + +	// the bootloader connects pins 0 and 1 to the USART; disconnect them +	// here so they can be used as normal digital i/o; they will be +	// reconnected in Serial.begin() +#if defined(UCSRB) +	UCSRB = 0; +#elif defined(UCSR0B) +	UCSR0B = 0; +#endif +} diff --git a/test/ardmake/hardware/cores/arduino/wiring.d b/test/ardmake/hardware/cores/arduino/wiring.d new file mode 100644 index 0000000..ea1b80f --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring.d @@ -0,0 +1,22 @@ +ardmake/hardware/cores/arduino/wiring.o ardmake/hardware/cores/arduino/wiring.d: ardmake/hardware/cores/arduino/wiring.c \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  ardmake/hardware/cores/arduino/binary.h diff --git a/test/ardmake/hardware/cores/arduino/wiring.h b/test/ardmake/hardware/cores/arduino/wiring.h new file mode 100644 index 0000000..e29959b --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring.h @@ -0,0 +1,135 @@ +/* +  wiring.h - Partial implementation of the Wiring API for the ATmega8. +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2005-2006 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  $Id$ +*/ + +#ifndef Wiring_h +#define Wiring_h + +#include <avr/io.h> +#include <stdlib.h> +#include "binary.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#define HIGH 0x1 +#define LOW  0x0 + +#define INPUT 0x0 +#define OUTPUT 0x1 + +#define true 0x1 +#define false 0x0 + +#define PI 3.1415926535897932384626433832795 +#define HALF_PI 1.5707963267948966192313216916398 +#define TWO_PI 6.283185307179586476925286766559 +#define DEG_TO_RAD 0.017453292519943295769236907684886 +#define RAD_TO_DEG 57.295779513082320876798154814105 + +#define SERIAL  0x0 +#define DISPLAY 0x1 + +#define LSBFIRST 0 +#define MSBFIRST 1 + +#define CHANGE 1 +#define FALLING 2 +#define RISING 3 + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define INTERNAL1V1 2 +#define INTERNAL2V56 3 +#else +#define INTERNAL 3 +#endif +#define DEFAULT 1 +#define EXTERNAL 0 + +// undefine stdlib's abs if encountered +#ifdef abs +#undef abs +#endif + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) +#define abs(x) ((x)>0?(x):-(x)) +#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) +#define round(x)     ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) +#define radians(deg) ((deg)*DEG_TO_RAD) +#define degrees(rad) ((rad)*RAD_TO_DEG) +#define sq(x) ((x)*(x)) + +#define interrupts() sei() +#define noInterrupts() cli() + +#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) +#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) ) +#define microsecondsToClockCycles(a) ( ((a) * (F_CPU / 1000L)) / 1000L ) + +#define lowByte(w) ((uint8_t) ((w) & 0xff)) +#define highByte(w) ((uint8_t) ((w) >> 8)) + +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) +#define bitSet(value, bit) ((value) |= (1UL << (bit))) +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + + +typedef unsigned int word; + +#define bit(b) (1UL << (b)) + +typedef uint8_t boolean; +typedef uint8_t byte; + +void init(void); + +void pinMode(uint8_t, uint8_t); +void digitalWrite(uint8_t, uint8_t); +int digitalRead(uint8_t); +int analogRead(uint8_t); +void analogReference(uint8_t mode); +void analogWrite(uint8_t, int); + +unsigned long millis(void); +unsigned long micros(void); +void delay(unsigned long); +void delayMicroseconds(unsigned int us); +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); + +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); + +void attachInterrupt(uint8_t, void (*)(void), int mode); +void detachInterrupt(uint8_t); + +void setup(void); +void loop(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/test/ardmake/hardware/cores/arduino/wiring_analog.c b/test/ardmake/hardware/cores/arduino/wiring_analog.c new file mode 100644 index 0000000..d248f4c --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_analog.c @@ -0,0 +1,259 @@ +/* +  wiring_analog.c - analog input and output +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2005-2006 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  Modified 28 September 2010 by Mark Sproul + +  $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + +uint8_t analog_reference = DEFAULT; + +void analogReference(uint8_t mode) +{ +	// can't actually set the register here because the default setting +	// will connect AVCC and the AREF pin, which would cause a short if +	// there's something connected to AREF. +	analog_reference = mode; +} + +int analogRead(uint8_t pin) +{ +	uint8_t low, high; + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +	if (pin >= 54) pin -= 54; // allow for channel or pin numbers +#else +	if (pin >= 14) pin -= 14; // allow for channel or pin numbers +#endif + +#if defined(ADCSRB) && defined(MUX5) +	// the MUX5 bit of ADCSRB selects whether we're reading from channels +	// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). +	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); +#endif +   +	// set the analog reference (high two bits of ADMUX) and select the +	// channel (low 4 bits).  this also sets ADLAR (left-adjust result) +	// to 0 (the default). +#if defined(ADMUX) +	ADMUX = (analog_reference << 6) | (pin & 0x07); +#endif + +	// without a delay, we seem to read from the wrong channel +	//delay(1); + +#if defined(ADCSRA) && defined(ADCL) +	// start the conversion +	sbi(ADCSRA, ADSC); + +	// ADSC is cleared when the conversion finishes +	while (bit_is_set(ADCSRA, ADSC)); + +	// we have to read ADCL first; doing so locks both ADCL +	// and ADCH until ADCH is read.  reading ADCL second would +	// cause the results of each conversion to be discarded, +	// as ADCL and ADCH would be locked when it completed. +	low  = ADCL; +	high = ADCH; +#else +	// we dont have an ADC, return 0 +	low  = 0; +	high = 0; +#endif + +	// combine the two bytes +	return (high << 8) | low; +} + +// Right now, PWM output only works on the pins with +// hardware support.  These are defined in the appropriate +// pins_*.c file.  For the rest of the pins, we default +// to digital output. +void analogWrite(uint8_t pin, int val) +{ +	// We need to make sure the PWM output is enabled for those pins +	// that support it, as we turn it off when digitally reading or +	// writing with them.  Also, make sure the pin is in output mode +	// for consistenty with Wiring, which doesn't require a pinMode +	// call for the analog output pins. +	pinMode(pin, OUTPUT); +	if (val == 0) +	{ +		digitalWrite(pin, LOW); +	} +	else if (val == 255) +	{ +		digitalWrite(pin, HIGH); +	} +	else +	{ +		switch(digitalPinToTimer(pin)) +		{ +			// XXX fix needed for atmega8 +			#if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__) +			case TIMER0A: +				// connect pwm to pin on timer 0 +				sbi(TCCR0, COM00); +				OCR0 = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR0A) && defined(COM0A1) +			case TIMER0A: +				// connect pwm to pin on timer 0, channel A +				sbi(TCCR0A, COM0A1); +				OCR0A = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR0A) && defined(COM0B1) +			case TIMER0B: +				// connect pwm to pin on timer 0, channel B +				sbi(TCCR0A, COM0B1); +				OCR0B = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR1A) && defined(COM1A1) +			case TIMER1A: +				// connect pwm to pin on timer 1, channel A +				sbi(TCCR1A, COM1A1); +				OCR1A = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR1A) && defined(COM1B1) +			case TIMER1B: +				// connect pwm to pin on timer 1, channel B +				sbi(TCCR1A, COM1B1); +				OCR1B = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR2) && defined(COM21) +			case TIMER2: +				// connect pwm to pin on timer 2 +				sbi(TCCR2, COM21); +				OCR2 = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR2A) && defined(COM2A1) +			case TIMER2A: +				// connect pwm to pin on timer 2, channel A +				sbi(TCCR2A, COM2A1); +				OCR2A = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR2A) && defined(COM2B1) +			case TIMER2B: +				// connect pwm to pin on timer 2, channel B +				sbi(TCCR2A, COM2B1); +				OCR2B = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR3A) && defined(COM3A1) +			case TIMER3A: +				// connect pwm to pin on timer 3, channel A +				sbi(TCCR3A, COM3A1); +				OCR3A = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR3A) && defined(COM3B1) +			case TIMER3B: +				// connect pwm to pin on timer 3, channel B +				sbi(TCCR3A, COM3B1); +				OCR3B = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR3A) && defined(COM3C1) +			case TIMER3C: +				// connect pwm to pin on timer 3, channel C +				sbi(TCCR3A, COM3C1); +				OCR3C = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR4A) && defined(COM4A1) +			case TIMER4A: +				// connect pwm to pin on timer 4, channel A +				sbi(TCCR4A, COM4A1); +				OCR4A = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR4A) && defined(COM4B1) +			case TIMER4B: +				// connect pwm to pin on timer 4, channel B +				sbi(TCCR4A, COM4B1); +				OCR4B = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR4A) && defined(COM4C1) +			case TIMER4C: +				// connect pwm to pin on timer 4, channel C +				sbi(TCCR4A, COM4C1); +				OCR4C = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR5A) && defined(COM5A1) +			case TIMER5A: +				// connect pwm to pin on timer 5, channel A +				sbi(TCCR5A, COM5A1); +				OCR5A = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR5A) && defined(COM5B1) +			case TIMER5B: +				// connect pwm to pin on timer 5, channel B +				sbi(TCCR5A, COM5B1); +				OCR5B = val; // set pwm duty +				break; +			#endif + +			#if defined(TCCR5A) && defined(COM5C1) +			case TIMER5C: +				// connect pwm to pin on timer 5, channel C +				sbi(TCCR5A, COM5C1); +				OCR5C = val; // set pwm duty +				break; +			#endif + +			case NOT_ON_TIMER: +			default: +				if (val < 128) { +					digitalWrite(pin, LOW); +				} else { +					digitalWrite(pin, HIGH); +				} +		} +	} +} diff --git a/test/ardmake/hardware/cores/arduino/wiring_analog.d b/test/ardmake/hardware/cores/arduino/wiring_analog.d new file mode 100644 index 0000000..43e0c9c --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_analog.d @@ -0,0 +1,24 @@ +ardmake/hardware/cores/arduino/wiring_analog.o ardmake/hardware/cores/arduino/wiring_analog.d: ardmake/hardware/cores/arduino/wiring_analog.c \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  ardmake/hardware/cores/arduino/binary.h \ +  ardmake/hardware/cores/arduino/pins_arduino.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/pgmspace.h diff --git a/test/ardmake/hardware/cores/arduino/wiring_digital.c b/test/ardmake/hardware/cores/arduino/wiring_digital.c new file mode 100644 index 0000000..0949da4 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_digital.c @@ -0,0 +1,166 @@ +/* +  wiring_digital.c - digital input and output functions +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2005-2006 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  Modified 28 September 2010 by Mark Sproul + +  $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + +void pinMode(uint8_t pin, uint8_t mode) +{ +	uint8_t bit = digitalPinToBitMask(pin); +	uint8_t port = digitalPinToPort(pin); +	volatile uint8_t *reg; + +	if (port == NOT_A_PIN) return; + +	// JWS: can I let the optimizer do this? +	reg = portModeRegister(port); + +	if (mode == INPUT) {  +		uint8_t oldSREG = SREG; +                cli(); +		*reg &= ~bit; +		SREG = oldSREG; +	} else { +		uint8_t oldSREG = SREG; +                cli(); +		*reg |= bit; +		SREG = oldSREG; +	} +} + +// Forcing this inline keeps the callers from having to push their own stuff +// on the stack. It is a good performance win and only takes 1 more byte per +// user than calling. (It will take more bytes on the 168.) +// +// But shouldn't this be moved into pinMode? Seems silly to check and do on +// each digitalread or write. +// +// Mark Sproul: +// - Removed inline. Save 170 bytes on atmega1280 +// - changed to a switch statment; added 32 bytes but much easier to read and maintain. +// - Added more #ifdefs, now compiles for atmega645 +// +//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); +//static inline void turnOffPWM(uint8_t timer) +static void turnOffPWM(uint8_t timer) +{ +	switch (timer) +	{ +		#if defined(TCCR1A) && defined(COM1A1) +		case TIMER1A:   cbi(TCCR1A, COM1A1);    break; +		#endif +		#if defined(TCCR1A) && defined(COM1B1) +		case TIMER1B:   cbi(TCCR1A, COM1B1);    break; +		#endif +		 +		#if defined(TCCR2) && defined(COM21) +		case  TIMER2:   cbi(TCCR2, COM21);      break; +		#endif +		 +		#if defined(TCCR0A) && defined(COM0A1) +		case  TIMER0A:  cbi(TCCR0A, COM0A1);    break; +		#endif +		 +		#if defined(TIMER0B) && defined(COM0B1) +		case  TIMER0B:  cbi(TCCR0A, COM0B1);    break; +		#endif +		#if defined(TCCR2A) && defined(COM2A1) +		case  TIMER2A:  cbi(TCCR2A, COM2A1);    break; +		#endif +		#if defined(TCCR2A) && defined(COM2B1) +		case  TIMER2B:  cbi(TCCR2A, COM2B1);    break; +		#endif +		 +		#if defined(TCCR3A) && defined(COM3A1) +		case  TIMER3A:  cbi(TCCR3A, COM3A1);    break; +		#endif +		#if defined(TCCR3A) && defined(COM3B1) +		case  TIMER3B:  cbi(TCCR3A, COM3B1);    break; +		#endif +		#if defined(TCCR3A) && defined(COM3C1) +		case  TIMER3C:  cbi(TCCR3A, COM3C1);    break; +		#endif + +		#if defined(TCCR4A) && defined(COM4A1) +		case  TIMER4A:  cbi(TCCR4A, COM4A1);    break; +		#endif +		#if defined(TCCR4A) && defined(COM4B1) +		case  TIMER4B:  cbi(TCCR4A, COM4B1);    break; +		#endif +		#if defined(TCCR4A) && defined(COM4C1) +		case  TIMER4C:  cbi(TCCR4A, COM4C1);    break; +		#endif +		#if defined(TCCR5A) +		case  TIMER5A:  cbi(TCCR5A, COM5A1);    break; +		case  TIMER5B:  cbi(TCCR5A, COM5B1);    break; +		case  TIMER5C:  cbi(TCCR5A, COM5C1);    break; +		#endif +	} +} + +void digitalWrite(uint8_t pin, uint8_t val) +{ +	uint8_t timer = digitalPinToTimer(pin); +	uint8_t bit = digitalPinToBitMask(pin); +	uint8_t port = digitalPinToPort(pin); +	volatile uint8_t *out; + +	if (port == NOT_A_PIN) return; + +	// If the pin that support PWM output, we need to turn it off +	// before doing a digital write. +	if (timer != NOT_ON_TIMER) turnOffPWM(timer); + +	out = portOutputRegister(port); + +	if (val == LOW) { +		uint8_t oldSREG = SREG; +                cli(); +		*out &= ~bit; +		SREG = oldSREG; +	} else { +		uint8_t oldSREG = SREG; +                cli(); +		*out |= bit; +		SREG = oldSREG; +	} +} + +int digitalRead(uint8_t pin) +{ +	uint8_t timer = digitalPinToTimer(pin); +	uint8_t bit = digitalPinToBitMask(pin); +	uint8_t port = digitalPinToPort(pin); + +	if (port == NOT_A_PIN) return LOW; + +	// If the pin that support PWM output, we need to turn it off +	// before getting a digital reading. +	if (timer != NOT_ON_TIMER) turnOffPWM(timer); + +	if (*portInputRegister(port) & bit) return HIGH; +	return LOW; +} diff --git a/test/ardmake/hardware/cores/arduino/wiring_digital.d b/test/ardmake/hardware/cores/arduino/wiring_digital.d new file mode 100644 index 0000000..269f2ff --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_digital.d @@ -0,0 +1,24 @@ +ardmake/hardware/cores/arduino/wiring_digital.o ardmake/hardware/cores/arduino/wiring_digital.d: ardmake/hardware/cores/arduino/wiring_digital.c \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  ardmake/hardware/cores/arduino/binary.h \ +  ardmake/hardware/cores/arduino/pins_arduino.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/pgmspace.h diff --git a/test/ardmake/hardware/cores/arduino/wiring_private.h b/test/ardmake/hardware/cores/arduino/wiring_private.h new file mode 100644 index 0000000..11f6f00 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_private.h @@ -0,0 +1,68 @@ +/* +  wiring_private.h - Internal header file. +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2005-2006 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  $Id: wiring.h 239 2007-01-12 17:58:39Z mellis $ +*/ + +#ifndef WiringPrivate_h +#define WiringPrivate_h + +#include <avr/io.h> +#include <avr/interrupt.h> +#include <avr/delay.h> +#include <stdio.h> +#include <stdarg.h> + +#include "wiring.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +#define EXTERNAL_INT_0 0 +#define EXTERNAL_INT_1 1 +#define EXTERNAL_INT_2 2 +#define EXTERNAL_INT_3 3 +#define EXTERNAL_INT_4 4 +#define EXTERNAL_INT_5 5 +#define EXTERNAL_INT_6 6 +#define EXTERNAL_INT_7 7 + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define EXTERNAL_NUM_INTERRUPTS 8 +#else +#define EXTERNAL_NUM_INTERRUPTS 2 +#endif + +typedef void (*voidFuncPtr)(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/test/ardmake/hardware/cores/arduino/wiring_pulse.c b/test/ardmake/hardware/cores/arduino/wiring_pulse.c new file mode 100644 index 0000000..0d96886 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_pulse.c @@ -0,0 +1,69 @@ +/* +  wiring_pulse.c - pulseIn() function +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2005-2006 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + +/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH + * or LOW, the type of pulse to measure.  Works on pulses from 2-3 microseconds + * to 3 minutes in length, but must be called at least a few dozen microseconds + * before the start of the pulse. */ +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) +{ +	// cache the port and bit of the pin in order to speed up the +	// pulse width measuring loop and achieve finer resolution.  calling +	// digitalRead() instead yields much coarser resolution. +	uint8_t bit = digitalPinToBitMask(pin); +	uint8_t port = digitalPinToPort(pin); +	uint8_t stateMask = (state ? bit : 0); +	unsigned long width = 0; // keep initialization out of time critical area +	 +	// convert the timeout from microseconds to a number of times through +	// the initial loop; it takes 16 clock cycles per iteration. +	unsigned long numloops = 0; +	unsigned long maxloops = microsecondsToClockCycles(timeout) / 16; +	 +	// wait for any previous pulse to end +	while ((*portInputRegister(port) & bit) == stateMask) +		if (numloops++ == maxloops) +			return 0; +	 +	// wait for the pulse to start +	while ((*portInputRegister(port) & bit) != stateMask) +		if (numloops++ == maxloops) +			return 0; +	 +	// wait for the pulse to stop +	while ((*portInputRegister(port) & bit) == stateMask) { +		if (numloops++ == maxloops) +			return 0; +		width++; +	} + +	// convert the reading to microseconds. The loop has been determined +	// to be 20 clock cycles long and have about 16 clocks between the edge +	// and the start of the loop. There will be some error introduced by +	// the interrupt handlers. +	return clockCyclesToMicroseconds(width * 21 + 16);  +} diff --git a/test/ardmake/hardware/cores/arduino/wiring_pulse.d b/test/ardmake/hardware/cores/arduino/wiring_pulse.d new file mode 100644 index 0000000..da7dd53 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_pulse.d @@ -0,0 +1,24 @@ +ardmake/hardware/cores/arduino/wiring_pulse.o ardmake/hardware/cores/arduino/wiring_pulse.d: ardmake/hardware/cores/arduino/wiring_pulse.c \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  ardmake/hardware/cores/arduino/binary.h \ +  ardmake/hardware/cores/arduino/pins_arduino.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/pgmspace.h diff --git a/test/ardmake/hardware/cores/arduino/wiring_shift.c b/test/ardmake/hardware/cores/arduino/wiring_shift.c new file mode 100644 index 0000000..cfe7867 --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_shift.c @@ -0,0 +1,55 @@ +/* +  wiring_shift.c - shiftOut() function +  Part of Arduino - http://www.arduino.cc/ + +  Copyright (c) 2005-2006 David A. Mellis + +  This library is free software; you can redistribute it and/or +  modify it under the terms of the GNU Lesser General Public +  License as published by the Free Software Foundation; either +  version 2.1 of the License, or (at your option) any later version. + +  This library is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  Lesser General Public License for more details. + +  You should have received a copy of the GNU Lesser General +  Public License along with this library; if not, write to the +  Free Software Foundation, Inc., 59 Temple Place, Suite 330, +  Boston, MA  02111-1307  USA + +  $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" + +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) { +	uint8_t value = 0; +	uint8_t i; + +	for (i = 0; i < 8; ++i) { +		digitalWrite(clockPin, HIGH); +		if (bitOrder == LSBFIRST) +			value |= digitalRead(dataPin) << i; +		else +			value |= digitalRead(dataPin) << (7 - i); +		digitalWrite(clockPin, LOW); +	} +	return value; +} + +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) +{ +	uint8_t i; + +	for (i = 0; i < 8; i++)  { +		if (bitOrder == LSBFIRST) +			digitalWrite(dataPin, !!(val & (1 << i))); +		else	 +			digitalWrite(dataPin, !!(val & (1 << (7 - i)))); +			 +		digitalWrite(clockPin, HIGH); +		digitalWrite(clockPin, LOW);		 +	} +} diff --git a/test/ardmake/hardware/cores/arduino/wiring_shift.d b/test/ardmake/hardware/cores/arduino/wiring_shift.d new file mode 100644 index 0000000..1186d5b --- /dev/null +++ b/test/ardmake/hardware/cores/arduino/wiring_shift.d @@ -0,0 +1,22 @@ +ardmake/hardware/cores/arduino/wiring_shift.o ardmake/hardware/cores/arduino/wiring_shift.d: ardmake/hardware/cores/arduino/wiring_shift.c \ +  ardmake/hardware/cores/arduino/wiring_private.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/io.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/sfr_defs.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/inttypes.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdint.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/iom328p.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/portpins.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/common.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/version.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/fuse.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/lock.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/interrupt.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/avr/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/util/delay_basic.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdio.h \ +  /usr/lib/gcc/avr/4.3.5/include/stdarg.h \ +  /usr/lib/gcc/avr/4.3.5/include/stddef.h \ +  ardmake/hardware/cores/arduino/wiring.h \ +  /usr/lib/gcc/avr/4.3.5/../../../avr/include/stdlib.h \ +  ardmake/hardware/cores/arduino/binary.h | 
