diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | fastled.mk | 40 | ||||
-rw-r--r-- | include.mk | 54 | ||||
-rw-r--r-- | lib/Arduino.h | 196 | ||||
-rw-r--r-- | lib/arduino-stub.cpp | 26 | ||||
-rw-r--r-- | usb-fastled/Makefile | 50 | ||||
-rw-r--r-- | usb-fastled/usb-fastled.cpp | 70 |
7 files changed, 434 insertions, 4 deletions
@@ -7,4 +7,6 @@ tools/reset_arduino contrib/LUFA-* contrib/lufa-LUFA-* +contrib/.fastled.prepared +contrib/FastLED tuer-rfid/update-keys diff --git a/fastled.mk b/fastled.mk new file mode 100644 index 0000000..b568626 --- /dev/null +++ b/fastled.mk @@ -0,0 +1,40 @@ +## +## spreadspace avr utils +## +## +## Copyright (C) 2013-2015 Christian Pointner <equinox@spreadspace.org> +## +## This file is part of spreadspace avr utils. +## +## spreadspace avr utils is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## any later version. +## +## spreadspace avr utils 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 General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>. +## + +include $(SPREADAVR_PATH)/defines.mk + +SRC:=$(wildcard $(FASTLED_PATH)/*.cpp) + +CXXFLAGS += -I$(FASTLED_PATH) +CXXFLAGS += -DARDUINO +CXXFLAGS += $(FASTLED_OPTS) + +OBJ = $(SRC:%.cpp=%.o) + +libfastled.a: $(OBJ) + $(AR) $@ $(OBJ) + +%.o: %.cpp + $(CXX) -c $(CXXFLAGS) $< -o $@ + +clean: + rm -f $(SRC:%.cpp=%.o) @@ -34,8 +34,11 @@ CXX_DEP := $(CXX_SRC:%.cpp=%.d) OBJ_LIB := $(LIBS:%=lib-%.o) SRC_LIB := $(LIBS:%=$(LIB_DIR)/%.c) DEP_LIB := $(LIBS:%=lib-%.d) +CXX_OBJ_LIB := $(CXX_LIBS:%=lib-%.o) +CXX_SRC_LIB := $(CXX_LIBS:%=$(LIB_DIR)/%.cpp) +CXX_DEP_LIB := $(CXX_LIBS:%=lib-%.d) -.PHONY: prepare clean clean-external distclean clean-lufa program erase flash reset run +.PHONY: prepare clean clean-external distclean clean-lufa clean-fastled program erase flash reset run ELFFILE := $(NAME).elf HEXFILE := $(NAME).hex @@ -53,23 +56,55 @@ CFLAGS += -DBOARD=BOARD_$(LUFA_BOARD) CFLAGS += $(LUFA_OPTS) endif +ifdef FASTLED_PATH +CXXFLAGS += -I$(FASTLED_PATH) +CXXFLAGS += -DARDUINO +CXXFLAGS += $(FASTLED_OPTS) +endif + prepare: $(EXTERNAL_LIBS:%=build-%) clean-external: $(EXTERNAL_LIBS:%=clean-%) export + build-lufa: liblufa.a liblufa.a: Makefile - @echo "building external LUFA lib ($(LUFA_PATH))" + @echo "" + @echo "****************************************************" + @echo "* building external LUFA lib ($(LUFA_PATH))" + @echo "" make -f $(SPREADAVR_PATH)/lufa.mk liblufa.a make -f $(SPREADAVR_PATH)/lufa.mk clean clean-lufa: + @echo "" + @echo "****************************************************" @echo "cleaning external LUFA lib ($(LUFA_PATH))" + @echo "" make -f $(SPREADAVR_PATH)/lufa.mk clean rm -f liblufa.a +build-fastled: libfastled.a + +libfastled.a: Makefile + @echo "" + @echo "****************************************************" + @echo "building external FastLED lib ($(FASTLED_PATH))" + @echo "" + make -f $(SPREADAVR_PATH)/fastled.mk libfastled.a + make -f $(SPREADAVR_PATH)/fastled.mk clean + +clean-fastled: + @echo "" + @echo "****************************************************" + @echo "cleaning external FastLED lib ($(FASTLED_PATH))" + @echo "" + make -f $(SPREADAVR_PATH)/fastled.mk clean + rm -f libfastled.a + + ## project-specific objects %.d: %.c Makefile @set -e; rm -f $@; \ @@ -89,10 +124,18 @@ lib-%.d: $(LIB_DIR)/%.c Makefile sed 's,\($*\)\.o[ :]*,lib-\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$; echo '(re)building $@' +lib-%.d: $(LIB_DIR)/%.cpp Makefile + @set -e; rm -f $@; \ + $(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,lib-\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$; echo '(re)building $@' + + ifneq ($(MAKECMDGOALS),distclean) -include $(DEP) -include $(CXX_DEP) -include $(DEP_LIB) +-include $(CXX_DEP_LIB) endif %.o: %.c Makefile @@ -104,8 +147,11 @@ endif lib-%.o: $(LIB_DIR)/%.c Makefile $(CC) $(CFLAGS) -c $< -o $@ -$(ELFFILE): $(OBJ) $(CXX_OBJ) $(OBJ_LIB) $(EXTERNAL_LIBS:%=lib%.a) - $(CC) $(LDFLAGS) $(OBJ) $(CXX_OBJ) $(OBJ_LIB) $(EXTERNAL_LIBS:%=-l%) -o $@ +lib-%.o: $(LIB_DIR)/%.cpp Makefile + $(CXX) $(CFLAGS) -c $< -o $@ + +$(ELFFILE): $(OBJ) $(CXX_OBJ) $(OBJ_LIB) $(CXX_OBJ_LIB) $(EXTERNAL_LIBS:%=lib%.a) + $(CC) $(LDFLAGS) $(OBJ) $(CXX_OBJ) $(OBJ_LIB) $(CXX_OBJ_LIB) $(EXTERNAL_LIBS:%=-l%) -o $@ $(SIZE) $@ @echo "" diff --git a/lib/Arduino.h b/lib/Arduino.h new file mode 100644 index 0000000..298bb25 --- /dev/null +++ b/lib/Arduino.h @@ -0,0 +1,196 @@ +/* + * spreadspace avr utils + * + * + * Copyright (C) 2013-2015 Christian Pointner <equinox@spreadspace.org> + * 2013-2014 Othmar Gsenger <otti@wirdorange.org> + * + * This file is part of spreadspace avr utils. + * + * spreadspace avr utils is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * spreadspace avr utils 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>. + */ + +/* Arduino Header stub to build FastLED library */ + +#ifndef Arduino_h +#define Arduino_h + +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#include <avr/pgmspace.h> +#include <avr/io.h> +#include <avr/interrupt.h> + +#ifdef __cplusplus +extern "C"{ +#endif + +#define HIGH 0x1 +#define LOW 0x0 + +#define INPUT 0x0 +#define OUTPUT 0x1 +#define INPUT_PULLUP 0x2 + +#define true 0x1 +#define false 0x0 + +#define PI 3.1415926535897932384626433832795 +#define HALF_PI 1.5707963267948966192313216916398 +#define TWO_PI 6.283185307179586476925286766559 +#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_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) +#define DEFAULT 0 +#define EXTERNAL 1 +#define INTERNAL 2 +#else +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) +#define INTERNAL1V1 2 +#define INTERNAL2V56 3 +#else +#define INTERNAL 3 +#endif +#define DEFAULT 1 +#define EXTERNAL 0 +#endif + +// 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) / clockCyclesPerMicrosecond() ) +#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) + +#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 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); + +// 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. + +#define analogInPinToBit(P) (P) + +// 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))) ) + +#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 TIMER4D 14 +#define TIMER5A 15 +#define TIMER5B 16 +#define TIMER5C 17 + +#ifdef __cplusplus +} // extern "C" +#endif + +// #include "pins_arduino.h" + +#endif diff --git a/lib/arduino-stub.cpp b/lib/arduino-stub.cpp new file mode 100644 index 0000000..16253d0 --- /dev/null +++ b/lib/arduino-stub.cpp @@ -0,0 +1,26 @@ +/* + * spreadspace avr utils + * + * + * Copyright (C) 2013-2015 Christian Pointner <equinox@spreadspace.org> + * 2013-2014 Othmar Gsenger <otti@wirdorange.org> + * + * This file is part of spreadspace avr utils. + * + * spreadspace avr utils is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * spreadspace avr utils 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Arduino.h" + + diff --git a/usb-fastled/Makefile b/usb-fastled/Makefile new file mode 100644 index 0000000..5aed040 --- /dev/null +++ b/usb-fastled/Makefile @@ -0,0 +1,50 @@ +## +## spreadspace avr utils +## +## +## Copyright (C) 2013-2015 Christian Pointner <equinox@spreadspace.org> +## +## This file is part of spreadspace avr utils. +## +## spreadspace avr utils is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## any later version. +## +## spreadspace avr utils 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 General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>. +## + +NAME := usb-fastled +BOARD_TYPE := teensy2 +CXX_OBJ := $(NAME).o +LIBS := util led lufa-descriptor-usbserial usbio +CXX_LIBS := arduino-stub +EXTERNAL_LIBS := fastled lufa +SPREADAVR_PATH := .. +RESET_FUNC := $(SPREADAVR_PATH)/tools/reset_lufa_cdc +RESET_PARAM := 'r' + +FASTLED_PATH := $(SPREADAVR_PATH)/contrib/FastLED + +LUFA_PATH := $(SPREADAVR_PATH)/contrib/lufa-LUFA-140928 +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D ORDERED_EP_CONFIG +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_FLASH_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT + +LUFA_OPTS += -D USB_MANUFACTURER="L\"equinox\"" +LUFA_OPTS += -D USB_PRODUCT="L\"spreadspace usb-fastled example\"" + +LUFA_COMPONENTS := USB USBCLASS + +include $(SPREADAVR_PATH)/include.mk diff --git a/usb-fastled/usb-fastled.cpp b/usb-fastled/usb-fastled.cpp new file mode 100644 index 0000000..5746201 --- /dev/null +++ b/usb-fastled/usb-fastled.cpp @@ -0,0 +1,70 @@ +/* + * spreadspace avr utils + * + * + * Copyright (C) 2013-2015 Christian Pointner <equinox@spreadspace.org> + * + * This file is part of spreadspace avr utils. + * + * spreadspace avr utils is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * spreadspace avr utils 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <avr/io.h> +#include <avr/wdt.h> +#include <avr/interrupt.h> +#include <avr/power.h> +#include <stdio.h> + +#include "util.h" +#include "led.h" +#include "usbio.h" + +#include "FastLED.h" + + +void handle_cmd(uint8_t cmd) +{ + switch(cmd) { + case '0': led_off(); break; + case '1': led_on(); break; + case 't': led_toggle(); break; + case 'r': reset2bootloader(); break; + default: printf("error\r\n"); return; + } + printf("ok\r\n"); +} + +int main(void) +{ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + cpu_init(); + led_init(); + usbio_init(); + sei(); + + for(;;) { + int16_t BytesReceived = usbio_bytes_received(); + while(BytesReceived > 0) { + int ReceivedByte = fgetc(stdin); + if(ReceivedByte != EOF) { + handle_cmd(ReceivedByte); + } + BytesReceived--; + } + + usbio_task(); + } +} |