aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--protocol/usb_hid/README9
m---------protocol/usb_hid/USB_Host_Shield_2.00
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Arduino.h215
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/CDC.cpp233
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Client.h26
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/HID.cpp520
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.cpp428
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.h81
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.cpp56
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.h76
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Platform.h23
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.cpp263
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.h78
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Printable.h40
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Server.h9
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.cpp270
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.h96
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Tone.cpp601
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/USBAPI.h195
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.cpp672
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h303
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h63
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/Udp.h88
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/WCharacter.h168
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/WInterrupts.c298
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/WMath.cpp60
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.cpp645
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.h205
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/binary.h515
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/main.cpp20
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/new.cpp18
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/new.h22
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c326
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_analog.c282
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_digital.c178
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_private.h69
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_pulse.c69
-rw-r--r--protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_shift.c55
-rw-r--r--protocol/usb_hid/arduino-1.0.1/variants/eightanaloginputs/pins_arduino.h27
-rw-r--r--protocol/usb_hid/arduino-1.0.1/variants/leonardo/pins_arduino.h256
-rw-r--r--protocol/usb_hid/arduino-1.0.1/variants/mega/pins_arduino.h363
-rw-r--r--protocol/usb_hid/arduino-1.0.1/variants/standard/pins_arduino.h218
43 files changed, 8142 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..b136a3781
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
1[submodule "protocol/usb_hid/USB_Host_Shield_2.0"]
2 path = protocol/usb_hid/USB_Host_Shield_2.0
3 url = git://github.com/felis/USB_Host_Shield_2.0.git
diff --git a/protocol/usb_hid/README b/protocol/usb_hid/README
new file mode 100644
index 000000000..0acf677f8
--- /dev/null
+++ b/protocol/usb_hid/README
@@ -0,0 +1,9 @@
1Third party Libraries
2---------------------
3USB_Host_Shield_2.0
4 Circuits@Home repository is git-submoduled. Do git submodule init & update to get the content.
5 https://github.com/felis/USB_Host_Shield_2.0
6
7arduino-1.0.1
8 Arduino files copied from:
9 https://github.com/arduino/Arduino/hardware/arduino/{cores,variants}
diff --git a/protocol/usb_hid/USB_Host_Shield_2.0 b/protocol/usb_hid/USB_Host_Shield_2.0
new file mode 160000
Subproject d2ae0b4cd47d4ee88eb93177acb142299025e2e
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Arduino.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Arduino.h
new file mode 100644
index 000000000..830c9952f
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Arduino.h
@@ -0,0 +1,215 @@
1#ifndef Arduino_h
2#define Arduino_h
3
4#include <stdlib.h>
5#include <string.h>
6#include <math.h>
7
8#include <avr/pgmspace.h>
9#include <avr/io.h>
10#include <avr/interrupt.h>
11
12#include "binary.h"
13
14#ifdef __cplusplus
15extern "C"{
16#endif
17
18#define HIGH 0x1
19#define LOW 0x0
20
21#define INPUT 0x0
22#define OUTPUT 0x1
23#define INPUT_PULLUP 0x2
24
25#define true 0x1
26#define false 0x0
27
28#define PI 3.1415926535897932384626433832795
29#define HALF_PI 1.5707963267948966192313216916398
30#define TWO_PI 6.283185307179586476925286766559
31#define DEG_TO_RAD 0.017453292519943295769236907684886
32#define RAD_TO_DEG 57.295779513082320876798154814105
33
34#define SERIAL 0x0
35#define DISPLAY 0x1
36
37#define LSBFIRST 0
38#define MSBFIRST 1
39
40#define CHANGE 1
41#define FALLING 2
42#define RISING 3
43
44#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
45#define DEFAULT 0
46#define EXTERNAL 1
47#define INTERNAL 2
48#else
49#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284P__)
50#define INTERNAL1V1 2
51#define INTERNAL2V56 3
52#else
53#define INTERNAL 3
54#endif
55#define DEFAULT 1
56#define EXTERNAL 0
57#endif
58
59// undefine stdlib's abs if encountered
60#ifdef abs
61#undef abs
62#endif
63
64#define min(a,b) ((a)<(b)?(a):(b))
65#define max(a,b) ((a)>(b)?(a):(b))
66#define abs(x) ((x)>0?(x):-(x))
67#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
68#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
69#define radians(deg) ((deg)*DEG_TO_RAD)
70#define degrees(rad) ((rad)*RAD_TO_DEG)
71#define sq(x) ((x)*(x))
72
73#define interrupts() sei()
74#define noInterrupts() cli()
75
76#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
77#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
78#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )
79
80#define lowByte(w) ((uint8_t) ((w) & 0xff))
81#define highByte(w) ((uint8_t) ((w) >> 8))
82
83#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
84#define bitSet(value, bit) ((value) |= (1UL << (bit)))
85#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
86#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
87
88
89typedef unsigned int word;
90
91#define bit(b) (1UL << (b))
92
93typedef uint8_t boolean;
94typedef uint8_t byte;
95
96void init(void);
97
98void pinMode(uint8_t, uint8_t);
99void digitalWrite(uint8_t, uint8_t);
100int digitalRead(uint8_t);
101int analogRead(uint8_t);
102void analogReference(uint8_t mode);
103void analogWrite(uint8_t, int);
104
105unsigned long millis(void);
106unsigned long micros(void);
107void delay(unsigned long);
108void delayMicroseconds(unsigned int us);
109unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
110
111void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
112uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
113
114void attachInterrupt(uint8_t, void (*)(void), int mode);
115void detachInterrupt(uint8_t);
116
117void setup(void);
118void loop(void);
119
120// Get the bit location within the hardware port of the given virtual pin.
121// This comes from the pins_*.c file for the active board configuration.
122
123#define analogInPinToBit(P) (P)
124
125// On the ATmega1280, the addresses of some of the port registers are
126// greater than 255, so we can't store them in uint8_t's.
127extern const uint16_t PROGMEM port_to_mode_PGM[];
128extern const uint16_t PROGMEM port_to_input_PGM[];
129extern const uint16_t PROGMEM port_to_output_PGM[];
130
131extern const uint8_t PROGMEM digital_pin_to_port_PGM[];
132// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];
133extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[];
134extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
135
136// Get the bit location within the hardware port of the given virtual pin.
137// This comes from the pins_*.c file for the active board configuration.
138//
139// These perform slightly better as macros compared to inline functions
140//
141#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
142#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
143#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
144#define analogInPinToBit(P) (P)
145#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )
146#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) )
147#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) )
148
149#define NOT_A_PIN 0
150#define NOT_A_PORT 0
151
152#ifdef ARDUINO_MAIN
153#define PA 1
154#define PB 2
155#define PC 3
156#define PD 4
157#define PE 5
158#define PF 6
159#define PG 7
160#define PH 8
161#define PJ 10
162#define PK 11
163#define PL 12
164#endif
165
166#define NOT_ON_TIMER 0
167#define TIMER0A 1
168#define TIMER0B 2
169#define TIMER1A 3
170#define TIMER1B 4
171#define TIMER2 5
172#define TIMER2A 6
173#define TIMER2B 7
174
175#define TIMER3A 8
176#define TIMER3B 9
177#define TIMER3C 10
178#define TIMER4A 11
179#define TIMER4B 12
180#define TIMER4C 13
181#define TIMER4D 14
182#define TIMER5A 15
183#define TIMER5B 16
184#define TIMER5C 17
185
186#ifdef __cplusplus
187} // extern "C"
188#endif
189
190#ifdef __cplusplus
191#include "WCharacter.h"
192#include "WString.h"
193#include "HardwareSerial.h"
194
195uint16_t makeWord(uint16_t w);
196uint16_t makeWord(byte h, byte l);
197
198#define word(...) makeWord(__VA_ARGS__)
199
200unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
201
202void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
203void noTone(uint8_t _pin);
204
205// WMath prototypes
206long random(long);
207long random(long, long);
208void randomSeed(unsigned int);
209long map(long, long, long, long, long);
210
211#endif
212
213#include "pins_arduino.h"
214
215#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/CDC.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/CDC.cpp
new file mode 100644
index 000000000..1ee3a488a
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/CDC.cpp
@@ -0,0 +1,233 @@
1
2
3/* Copyright (c) 2011, Peter Barrett
4**
5** Permission to use, copy, modify, and/or distribute this software for
6** any purpose with or without fee is hereby granted, provided that the
7** above copyright notice and this permission notice appear in all copies.
8**
9** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
12** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
13** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
14** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
15** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
16** SOFTWARE.
17*/
18
19#include "Platform.h"
20#include "USBAPI.h"
21#include <avr/wdt.h>
22
23#if defined(USBCON)
24#ifdef CDC_ENABLED
25
26#if (RAMEND < 1000)
27#define SERIAL_BUFFER_SIZE 16
28#else
29#define SERIAL_BUFFER_SIZE 64
30#endif
31
32struct ring_buffer
33{
34 unsigned char buffer[SERIAL_BUFFER_SIZE];
35 volatile int head;
36 volatile int tail;
37};
38
39ring_buffer cdc_rx_buffer = { { 0 }, 0, 0};
40
41typedef struct
42{
43 u32 dwDTERate;
44 u8 bCharFormat;
45 u8 bParityType;
46 u8 bDataBits;
47 u8 lineState;
48} LineInfo;
49
50static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 };
51
52#define WEAK __attribute__ ((weak))
53
54extern const CDCDescriptor _cdcInterface PROGMEM;
55const CDCDescriptor _cdcInterface =
56{
57 D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1),
58
59 // CDC communication interface
60 D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0),
61 D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd)
62 D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not)
63 D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported
64 D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0
65 D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40),
66
67 // CDC data interface
68 D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0),
69 D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0),
70 D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0)
71};
72
73int WEAK CDC_GetInterface(u8* interfaceNum)
74{
75 interfaceNum[0] += 2; // uses 2
76 return USB_SendControl(TRANSFER_PGM,&_cdcInterface,sizeof(_cdcInterface));
77}
78
79bool WEAK CDC_Setup(Setup& setup)
80{
81 u8 r = setup.bRequest;
82 u8 requestType = setup.bmRequestType;
83
84 if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType)
85 {
86 if (CDC_GET_LINE_CODING == r)
87 {
88 USB_SendControl(0,(void*)&_usbLineInfo,7);
89 return true;
90 }
91 }
92
93 if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType)
94 {
95 if (CDC_SET_LINE_CODING == r)
96 {
97 USB_RecvControl((void*)&_usbLineInfo,7);
98 return true;
99 }
100
101 if (CDC_SET_CONTROL_LINE_STATE == r)
102 {
103 _usbLineInfo.lineState = setup.wValueL;
104
105 // auto-reset into the bootloader is triggered when the port, already
106 // open at 1200 bps, is closed. this is the signal to start the watchdog
107 // with a relatively long period so it can finish housekeeping tasks
108 // like servicing endpoints before the sketch ends
109 if (1200 == _usbLineInfo.dwDTERate) {
110 // We check DTR state to determine if host port is open (bit 0 of lineState).
111 if ((_usbLineInfo.lineState & 0x01) == 0) {
112 *(uint16_t *)0x0800 = 0x7777;
113 wdt_enable(WDTO_120MS);
114 } else {
115 // Most OSs do some intermediate steps when configuring ports and DTR can
116 // twiggle more than once before stabilizing.
117 // To avoid spurious resets we set the watchdog to 250ms and eventually
118 // cancel if DTR goes back high.
119
120 wdt_disable();
121 wdt_reset();
122 *(uint16_t *)0x0800 = 0x0;
123 }
124 }
125 return true;
126 }
127 }
128 return false;
129}
130
131
132int _serialPeek = -1;
133void Serial_::begin(uint16_t baud_count)
134{
135}
136
137void Serial_::end(void)
138{
139}
140
141void Serial_::accept(void)
142{
143 ring_buffer *buffer = &cdc_rx_buffer;
144 int c = USB_Recv(CDC_RX);
145 int i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE;
146
147 // if we should be storing the received character into the location
148 // just before the tail (meaning that the head would advance to the
149 // current location of the tail), we're about to overflow the buffer
150 // and so we don't write the character or advance the head.
151 if (i != buffer->tail) {
152 buffer->buffer[buffer->head] = c;
153 buffer->head = i;
154 }
155}
156
157int Serial_::available(void)
158{
159 ring_buffer *buffer = &cdc_rx_buffer;
160 return (unsigned int)(SERIAL_BUFFER_SIZE + buffer->head - buffer->tail) % SERIAL_BUFFER_SIZE;
161}
162
163int Serial_::peek(void)
164{
165 ring_buffer *buffer = &cdc_rx_buffer;
166 if (buffer->head == buffer->tail) {
167 return -1;
168 } else {
169 return buffer->buffer[buffer->tail];
170 }
171}
172
173int Serial_::read(void)
174{
175 ring_buffer *buffer = &cdc_rx_buffer;
176 // if the head isn't ahead of the tail, we don't have any characters
177 if (buffer->head == buffer->tail) {
178 return -1;
179 } else {
180 unsigned char c = buffer->buffer[buffer->tail];
181 buffer->tail = (unsigned int)(buffer->tail + 1) % SERIAL_BUFFER_SIZE;
182 return c;
183 }
184}
185
186void Serial_::flush(void)
187{
188 USB_Flush(CDC_TX);
189}
190
191size_t Serial_::write(uint8_t c)
192{
193 /* only try to send bytes if the high-level CDC connection itself
194 is open (not just the pipe) - the OS should set lineState when the port
195 is opened and clear lineState when the port is closed.
196 bytes sent before the user opens the connection or after
197 the connection is closed are lost - just like with a UART. */
198
199 // TODO - ZE - check behavior on different OSes and test what happens if an
200 // open connection isn't broken cleanly (cable is yanked out, host dies
201 // or locks up, or host virtual serial port hangs)
202 if (_usbLineInfo.lineState > 0) {
203 int r = USB_Send(CDC_TX,&c,1);
204 if (r > 0) {
205 return r;
206 } else {
207 setWriteError();
208 return 0;
209 }
210 }
211 setWriteError();
212 return 0;
213}
214
215// This operator is a convenient way for a sketch to check whether the
216// port has actually been configured and opened by the host (as opposed
217// to just being connected to the host). It can be used, for example, in
218// setup() before printing to ensure that an application on the host is
219// actually ready to receive and display the data.
220// We add a short delay before returning to fix a bug observed by Federico
221// where the port is configured (lineState != 0) but not quite opened.
222Serial_::operator bool() {
223 bool result = false;
224 if (_usbLineInfo.lineState > 0)
225 result = true;
226 delay(10);
227 return result;
228}
229
230Serial_ Serial;
231
232#endif
233#endif /* if defined(USBCON) */
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Client.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Client.h
new file mode 100644
index 000000000..ea134838a
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Client.h
@@ -0,0 +1,26 @@
1#ifndef client_h
2#define client_h
3#include "Print.h"
4#include "Stream.h"
5#include "IPAddress.h"
6
7class Client : public Stream {
8
9public:
10 virtual int connect(IPAddress ip, uint16_t port) =0;
11 virtual int connect(const char *host, uint16_t port) =0;
12 virtual size_t write(uint8_t) =0;
13 virtual size_t write(const uint8_t *buf, size_t size) =0;
14 virtual int available() = 0;
15 virtual int read() = 0;
16 virtual int read(uint8_t *buf, size_t size) = 0;
17 virtual int peek() = 0;
18 virtual void flush() = 0;
19 virtual void stop() = 0;
20 virtual uint8_t connected() = 0;
21 virtual operator bool() = 0;
22protected:
23 uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); };
24};
25
26#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/HID.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HID.cpp
new file mode 100644
index 000000000..ac6360844
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HID.cpp
@@ -0,0 +1,520 @@
1
2
3/* Copyright (c) 2011, Peter Barrett
4**
5** Permission to use, copy, modify, and/or distribute this software for
6** any purpose with or without fee is hereby granted, provided that the
7** above copyright notice and this permission notice appear in all copies.
8**
9** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
12** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
13** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
14** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
15** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
16** SOFTWARE.
17*/
18
19#include "Platform.h"
20#include "USBAPI.h"
21#include "USBDesc.h"
22
23#if defined(USBCON)
24#ifdef HID_ENABLED
25
26//#define RAWHID_ENABLED
27
28// Singletons for mouse and keyboard
29
30Mouse_ Mouse;
31Keyboard_ Keyboard;
32
33//================================================================================
34//================================================================================
35
36// HID report descriptor
37
38#define LSB(_x) ((_x) & 0xFF)
39#define MSB(_x) ((_x) >> 8)
40
41#define RAWHID_USAGE_PAGE 0xFFC0
42#define RAWHID_USAGE 0x0C00
43#define RAWHID_TX_SIZE 64
44#define RAWHID_RX_SIZE 64
45
46extern const u8 _hidReportDescriptor[] PROGMEM;
47const u8 _hidReportDescriptor[] = {
48
49 // Mouse
50 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 54
51 0x09, 0x02, // USAGE (Mouse)
52 0xa1, 0x01, // COLLECTION (Application)
53 0x09, 0x01, // USAGE (Pointer)
54 0xa1, 0x00, // COLLECTION (Physical)
55 0x85, 0x01, // REPORT_ID (1)
56 0x05, 0x09, // USAGE_PAGE (Button)
57 0x19, 0x01, // USAGE_MINIMUM (Button 1)
58 0x29, 0x03, // USAGE_MAXIMUM (Button 3)
59 0x15, 0x00, // LOGICAL_MINIMUM (0)
60 0x25, 0x01, // LOGICAL_MAXIMUM (1)
61 0x95, 0x03, // REPORT_COUNT (3)
62 0x75, 0x01, // REPORT_SIZE (1)
63 0x81, 0x02, // INPUT (Data,Var,Abs)
64 0x95, 0x01, // REPORT_COUNT (1)
65 0x75, 0x05, // REPORT_SIZE (5)
66 0x81, 0x03, // INPUT (Cnst,Var,Abs)
67 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
68 0x09, 0x30, // USAGE (X)
69 0x09, 0x31, // USAGE (Y)
70 0x09, 0x38, // USAGE (Wheel)
71 0x15, 0x81, // LOGICAL_MINIMUM (-127)
72 0x25, 0x7f, // LOGICAL_MAXIMUM (127)
73 0x75, 0x08, // REPORT_SIZE (8)
74 0x95, 0x03, // REPORT_COUNT (3)
75 0x81, 0x06, // INPUT (Data,Var,Rel)
76 0xc0, // END_COLLECTION
77 0xc0, // END_COLLECTION
78
79 // Keyboard
80 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 47
81 0x09, 0x06, // USAGE (Keyboard)
82 0xa1, 0x01, // COLLECTION (Application)
83 0x85, 0x02, // REPORT_ID (2)
84 0x05, 0x07, // USAGE_PAGE (Keyboard)
85
86 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
87 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
88 0x15, 0x00, // LOGICAL_MINIMUM (0)
89 0x25, 0x01, // LOGICAL_MAXIMUM (1)
90 0x75, 0x01, // REPORT_SIZE (1)
91
92 0x95, 0x08, // REPORT_COUNT (8)
93 0x81, 0x02, // INPUT (Data,Var,Abs)
94 0x95, 0x01, // REPORT_COUNT (1)
95 0x75, 0x08, // REPORT_SIZE (8)
96 0x81, 0x03, // INPUT (Cnst,Var,Abs)
97
98 0x95, 0x06, // REPORT_COUNT (6)
99 0x75, 0x08, // REPORT_SIZE (8)
100 0x15, 0x00, // LOGICAL_MINIMUM (0)
101 0x25, 0x65, // LOGICAL_MAXIMUM (101)
102 0x05, 0x07, // USAGE_PAGE (Keyboard)
103
104 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
105 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
106 0x81, 0x00, // INPUT (Data,Ary,Abs)
107 0xc0, // END_COLLECTION
108
109#if RAWHID_ENABLED
110 // RAW HID
111 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30
112 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE),
113
114 0xA1, 0x01, // Collection 0x01
115 0x85, 0x03, // REPORT_ID (3)
116 0x75, 0x08, // report size = 8 bits
117 0x15, 0x00, // logical minimum = 0
118 0x26, 0xFF, 0x00, // logical maximum = 255
119
120 0x95, 64, // report count TX
121 0x09, 0x01, // usage
122 0x81, 0x02, // Input (array)
123
124 0x95, 64, // report count RX
125 0x09, 0x02, // usage
126 0x91, 0x02, // Output (array)
127 0xC0 // end collection
128#endif
129};
130
131extern const HIDDescriptor _hidInterface PROGMEM;
132const HIDDescriptor _hidInterface =
133{
134 D_INTERFACE(HID_INTERFACE,1,3,0,0),
135 D_HIDREPORT(sizeof(_hidReportDescriptor)),
136 D_ENDPOINT(USB_ENDPOINT_IN (HID_ENDPOINT_INT),USB_ENDPOINT_TYPE_INTERRUPT,0x40,0x01)
137};
138
139//================================================================================
140//================================================================================
141// Driver
142
143u8 _hid_protocol = 1;
144u8 _hid_idle = 1;
145
146#define WEAK __attribute__ ((weak))
147
148int WEAK HID_GetInterface(u8* interfaceNum)
149{
150 interfaceNum[0] += 1; // uses 1
151 return USB_SendControl(TRANSFER_PGM,&_hidInterface,sizeof(_hidInterface));
152}
153
154int WEAK HID_GetDescriptor(int i)
155{
156 return USB_SendControl(TRANSFER_PGM,_hidReportDescriptor,sizeof(_hidReportDescriptor));
157}
158
159void WEAK HID_SendReport(u8 id, const void* data, int len)
160{
161 USB_Send(HID_TX, &id, 1);
162 USB_Send(HID_TX | TRANSFER_RELEASE,data,len);
163}
164
165bool WEAK HID_Setup(Setup& setup)
166{
167 u8 r = setup.bRequest;
168 u8 requestType = setup.bmRequestType;
169 if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType)
170 {
171 if (HID_GET_REPORT == r)
172 {
173 //HID_GetReport();
174 return true;
175 }
176 if (HID_GET_PROTOCOL == r)
177 {
178 //Send8(_hid_protocol); // TODO
179 return true;
180 }
181 }
182
183 if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType)
184 {
185 if (HID_SET_PROTOCOL == r)
186 {
187 _hid_protocol = setup.wValueL;
188 return true;
189 }
190
191 if (HID_SET_IDLE == r)
192 {
193 _hid_idle = setup.wValueL;
194 return true;
195 }
196 }
197 return false;
198}
199
200//================================================================================
201//================================================================================
202// Mouse
203
204Mouse_::Mouse_(void) : _buttons(0)
205{
206}
207
208void Mouse_::begin(void)
209{
210}
211
212void Mouse_::end(void)
213{
214}
215
216void Mouse_::click(uint8_t b)
217{
218 _buttons = b;
219 move(0,0,0);
220 _buttons = 0;
221 move(0,0,0);
222}
223
224void Mouse_::move(signed char x, signed char y, signed char wheel)
225{
226 u8 m[4];
227 m[0] = _buttons;
228 m[1] = x;
229 m[2] = y;
230 m[3] = wheel;
231 HID_SendReport(1,m,4);
232}
233
234void Mouse_::buttons(uint8_t b)
235{
236 if (b != _buttons)
237 {
238 _buttons = b;
239 move(0,0,0);
240 }
241}
242
243void Mouse_::press(uint8_t b)
244{
245 buttons(_buttons | b);
246}
247
248void Mouse_::release(uint8_t b)
249{
250 buttons(_buttons & ~b);
251}
252
253bool Mouse_::isPressed(uint8_t b)
254{
255 if ((b & _buttons) > 0)
256 return true;
257 return false;
258}
259
260//================================================================================
261//================================================================================
262// Keyboard
263
264Keyboard_::Keyboard_(void)
265{
266}
267
268void Keyboard_::begin(void)
269{
270}
271
272void Keyboard_::end(void)
273{
274}
275
276void Keyboard_::sendReport(KeyReport* keys)
277{
278 HID_SendReport(2,keys,sizeof(KeyReport));
279}
280
281extern
282const uint8_t _asciimap[128] PROGMEM;
283
284#define SHIFT 0x80
285const uint8_t _asciimap[128] =
286{
287 0x00, // NUL
288 0x00, // SOH
289 0x00, // STX
290 0x00, // ETX
291 0x00, // EOT
292 0x00, // ENQ
293 0x00, // ACK
294 0x00, // BEL
295 0x2a, // BS Backspace
296 0x2b, // TAB Tab
297 0x28, // LF Enter
298 0x00, // VT
299 0x00, // FF
300 0x00, // CR
301 0x00, // SO
302 0x00, // SI
303 0x00, // DEL
304 0x00, // DC1
305 0x00, // DC2
306 0x00, // DC3
307 0x00, // DC4
308 0x00, // NAK
309 0x00, // SYN
310 0x00, // ETB
311 0x00, // CAN
312 0x00, // EM
313 0x00, // SUB
314 0x00, // ESC
315 0x00, // FS
316 0x00, // GS
317 0x00, // RS
318 0x00, // US
319
320 0x2c, // ' '
321 0x1e|SHIFT, // !
322 0x34|SHIFT, // "
323 0x20|SHIFT, // #
324 0x21|SHIFT, // $
325 0x22|SHIFT, // %
326 0x24|SHIFT, // &
327 0x34, // '
328 0x26|SHIFT, // (
329 0x27|SHIFT, // )
330 0x25|SHIFT, // *
331 0x2e|SHIFT, // +
332 0x36, // ,
333 0x2d, // -
334 0x37, // .
335 0x38, // /
336 0x27, // 0
337 0x1e, // 1
338 0x1f, // 2
339 0x20, // 3
340 0x21, // 4
341 0x22, // 5
342 0x23, // 6
343 0x24, // 7
344 0x25, // 8
345 0x26, // 9
346 0x33|SHIFT, // :
347 0x33, // ;
348 0x36|SHIFT, // <
349 0x2e, // =
350 0x37|SHIFT, // >
351 0x38|SHIFT, // ?
352 0x1f|SHIFT, // @
353 0x04|SHIFT, // A
354 0x05|SHIFT, // B
355 0x06|SHIFT, // C
356 0x07|SHIFT, // D
357 0x08|SHIFT, // E
358 0x09|SHIFT, // F
359 0x0a|SHIFT, // G
360 0x0b|SHIFT, // H
361 0x0c|SHIFT, // I
362 0x0d|SHIFT, // J
363 0x0e|SHIFT, // K
364 0x0f|SHIFT, // L
365 0x10|SHIFT, // M
366 0x11|SHIFT, // N
367 0x12|SHIFT, // O
368 0x13|SHIFT, // P
369 0x14|SHIFT, // Q
370 0x15|SHIFT, // R
371 0x16|SHIFT, // S
372 0x17|SHIFT, // T
373 0x18|SHIFT, // U
374 0x19|SHIFT, // V
375 0x1a|SHIFT, // W
376 0x1b|SHIFT, // X
377 0x1c|SHIFT, // Y
378 0x1d|SHIFT, // Z
379 0x2f, // [
380 0x31, // bslash
381 0x30, // ]
382 0x23|SHIFT, // ^
383 0x2d|SHIFT, // _
384 0x35, // `
385 0x04, // a
386 0x05, // b
387 0x06, // c
388 0x07, // d
389 0x08, // e
390 0x09, // f
391 0x0a, // g
392 0x0b, // h
393 0x0c, // i
394 0x0d, // j
395 0x0e, // k
396 0x0f, // l
397 0x10, // m
398 0x11, // n
399 0x12, // o
400 0x13, // p
401 0x14, // q
402 0x15, // r
403 0x16, // s
404 0x17, // t
405 0x18, // u
406 0x19, // v
407 0x1a, // w
408 0x1b, // x
409 0x1c, // y
410 0x1d, // z
411 0x2f|SHIFT, //
412 0x31|SHIFT, // |
413 0x30|SHIFT, // }
414 0x35|SHIFT, // ~
415 0 // DEL
416};
417
418uint8_t USBPutChar(uint8_t c);
419
420// press() adds the specified key (printing, non-printing, or modifier)
421// to the persistent key report and sends the report. Because of the way
422// USB HID works, the host acts like the key remains pressed until we
423// call release(), releaseAll(), or otherwise clear the report and resend.
424size_t Keyboard_::press(uint8_t k)
425{
426 uint8_t i;
427 if (k >= 136) { // it's a non-printing key (not a modifier)
428 k = k - 136;
429 } else if (k >= 128) { // it's a modifier key
430 _keyReport.modifiers |= (1<<(k-128));
431 k = 0;
432 } else { // it's a printing key
433 k = pgm_read_byte(_asciimap + k);
434 if (!k) {
435 setWriteError();
436 return 0;
437 }
438 if (k & 0x80) { // it's a capital letter or other character reached with shift
439 _keyReport.modifiers |= 0x02; // the left shift modifier
440 k &= 0x7F;
441 }
442 }
443
444 // Add k to the key report only if it's not already present
445 // and if there is an empty slot.
446 if (_keyReport.keys[0] != k && _keyReport.keys[1] != k &&
447 _keyReport.keys[2] != k && _keyReport.keys[3] != k &&
448 _keyReport.keys[4] != k && _keyReport.keys[5] != k) {
449
450 for (i=0; i<6; i++) {
451 if (_keyReport.keys[i] == 0x00) {
452 _keyReport.keys[i] = k;
453 break;
454 }
455 }
456 if (i == 6) {
457 setWriteError();
458 return 0;
459 }
460 }
461 sendReport(&_keyReport);
462 return 1;
463}
464
465// release() takes the specified key out of the persistent key report and
466// sends the report. This tells the OS the key is no longer pressed and that
467// it shouldn't be repeated any more.
468size_t Keyboard_::release(uint8_t k)
469{
470 uint8_t i;
471 if (k >= 136) { // it's a non-printing key (not a modifier)
472 k = k - 136;
473 } else if (k >= 128) { // it's a modifier key
474 _keyReport.modifiers &= ~(1<<(k-128));
475 k = 0;
476 } else { // it's a printing key
477 k = pgm_read_byte(_asciimap + k);
478 if (!k) {
479 return 0;
480 }
481 if (k & 0x80) { // it's a capital letter or other character reached with shift
482 _keyReport.modifiers &= ~(0x02); // the left shift modifier
483 k &= 0x7F;
484 }
485 }
486
487 // Test the key report to see if k is present. Clear it if it exists.
488 // Check all positions in case the key is present more than once (which it shouldn't be)
489 for (i=0; i<6; i++) {
490 if (0 != k && _keyReport.keys[i] == k) {
491 _keyReport.keys[i] = 0x00;
492 }
493 }
494
495 sendReport(&_keyReport);
496 return 1;
497}
498
499void Keyboard_::releaseAll(void)
500{
501 _keyReport.keys[0] = 0;
502 _keyReport.keys[1] = 0;
503 _keyReport.keys[2] = 0;
504 _keyReport.keys[3] = 0;
505 _keyReport.keys[4] = 0;
506 _keyReport.keys[5] = 0;
507 _keyReport.modifiers = 0;
508 sendReport(&_keyReport);
509}
510
511size_t Keyboard_::write(uint8_t c)
512{
513 uint8_t p = press(c); // Keydown
514 uint8_t r = release(c); // Keyup
515 return (p); // just return the result of press() since release() almost always returns 1
516}
517
518#endif
519
520#endif /* if defined(USBCON) */ \ No newline at end of file
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.cpp
new file mode 100644
index 000000000..f40ddee06
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.cpp
@@ -0,0 +1,428 @@
1/*
2 HardwareSerial.cpp - Hardware serial library for Wiring
3 Copyright (c) 2006 Nicholas Zambetti. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Modified 23 November 2006 by David A. Mellis
20 Modified 28 September 2010 by Mark Sproul
21*/
22
23#include <stdlib.h>
24#include <stdio.h>
25#include <string.h>
26#include <inttypes.h>
27#include "Arduino.h"
28#include "wiring_private.h"
29
30// this next line disables the entire HardwareSerial.cpp,
31// this is so I can support Attiny series and any other chip without a uart
32#if defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)
33
34#include "HardwareSerial.h"
35
36// Define constants and variables for buffering incoming serial data. We're
37// using a ring buffer (I think), in which head is the index of the location
38// to which to write the next incoming character and tail is the index of the
39// location from which to read.
40#if (RAMEND < 1000)
41 #define SERIAL_BUFFER_SIZE 16
42#else
43 #define SERIAL_BUFFER_SIZE 64
44#endif
45
46struct ring_buffer
47{
48 unsigned char buffer[SERIAL_BUFFER_SIZE];
49 volatile unsigned int head;
50 volatile unsigned int tail;
51};
52
53#if defined(USBCON)
54 ring_buffer rx_buffer = { { 0 }, 0, 0};
55 ring_buffer tx_buffer = { { 0 }, 0, 0};
56#endif
57#if defined(UBRRH) || defined(UBRR0H)
58 ring_buffer rx_buffer = { { 0 }, 0, 0 };
59 ring_buffer tx_buffer = { { 0 }, 0, 0 };
60#endif
61#if defined(UBRR1H)
62 ring_buffer rx_buffer1 = { { 0 }, 0, 0 };
63 ring_buffer tx_buffer1 = { { 0 }, 0, 0 };
64#endif
65#if defined(UBRR2H)
66 ring_buffer rx_buffer2 = { { 0 }, 0, 0 };
67 ring_buffer tx_buffer2 = { { 0 }, 0, 0 };
68#endif
69#if defined(UBRR3H)
70 ring_buffer rx_buffer3 = { { 0 }, 0, 0 };
71 ring_buffer tx_buffer3 = { { 0 }, 0, 0 };
72#endif
73
74inline void store_char(unsigned char c, ring_buffer *buffer)
75{
76 int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE;
77
78 // if we should be storing the received character into the location
79 // just before the tail (meaning that the head would advance to the
80 // current location of the tail), we're about to overflow the buffer
81 // and so we don't write the character or advance the head.
82 if (i != buffer->tail) {
83 buffer->buffer[buffer->head] = c;
84 buffer->head = i;
85 }
86}
87
88#if !defined(USART0_RX_vect) && defined(USART1_RX_vect)
89// do nothing - on the 32u4 the first USART is USART1
90#else
91#if !defined(USART_RX_vect) && !defined(SIG_USART0_RECV) && \
92 !defined(SIG_UART0_RECV) && !defined(USART0_RX_vect) && \
93 !defined(SIG_UART_RECV)
94 #error "Don't know what the Data Received vector is called for the first UART"
95#else
96 void serialEvent() __attribute__((weak));
97 void serialEvent() {}
98 #define serialEvent_implemented
99#if defined(USART_RX_vect)
100 SIGNAL(USART_RX_vect)
101#elif defined(SIG_USART0_RECV)
102 SIGNAL(SIG_USART0_RECV)
103#elif defined(SIG_UART0_RECV)
104 SIGNAL(SIG_UART0_RECV)
105#elif defined(USART0_RX_vect)
106 SIGNAL(USART0_RX_vect)
107#elif defined(SIG_UART_RECV)
108 SIGNAL(SIG_UART_RECV)
109#endif
110 {
111 #if defined(UDR0)
112 unsigned char c = UDR0;
113 #elif defined(UDR)
114 unsigned char c = UDR;
115 #else
116 #error UDR not defined
117 #endif
118 store_char(c, &rx_buffer);
119 }
120#endif
121#endif
122
123#if defined(USART1_RX_vect)
124 void serialEvent1() __attribute__((weak));
125 void serialEvent1() {}
126 #define serialEvent1_implemented
127 SIGNAL(USART1_RX_vect)
128 {
129 unsigned char c = UDR1;
130 store_char(c, &rx_buffer1);
131 }
132#elif defined(SIG_USART1_RECV)
133 #error SIG_USART1_RECV
134#endif
135
136#if defined(USART2_RX_vect) && defined(UDR2)
137 void serialEvent2() __attribute__((weak));
138 void serialEvent2() {}
139 #define serialEvent2_implemented
140 SIGNAL(USART2_RX_vect)
141 {
142 unsigned char c = UDR2;
143 store_char(c, &rx_buffer2);
144 }
145#elif defined(SIG_USART2_RECV)
146 #error SIG_USART2_RECV
147#endif
148
149#if defined(USART3_RX_vect) && defined(UDR3)
150 void serialEvent3() __attribute__((weak));
151 void serialEvent3() {}
152 #define serialEvent3_implemented
153 SIGNAL(USART3_RX_vect)
154 {
155 unsigned char c = UDR3;
156 store_char(c, &rx_buffer3);
157 }
158#elif defined(SIG_USART3_RECV)
159 #error SIG_USART3_RECV
160#endif
161
162void serialEventRun(void)
163{
164#ifdef serialEvent_implemented
165 if (Serial.available()) serialEvent();
166#endif
167#ifdef serialEvent1_implemented
168 if (Serial1.available()) serialEvent1();
169#endif
170#ifdef serialEvent2_implemented
171 if (Serial2.available()) serialEvent2();
172#endif
173#ifdef serialEvent3_implemented
174 if (Serial3.available()) serialEvent3();
175#endif
176}
177
178
179#if !defined(USART0_UDRE_vect) && defined(USART1_UDRE_vect)
180// do nothing - on the 32u4 the first USART is USART1
181#else
182#if !defined(UART0_UDRE_vect) && !defined(UART_UDRE_vect) && !defined(USART0_UDRE_vect) && !defined(USART_UDRE_vect)
183 #error "Don't know what the Data Register Empty vector is called for the first UART"
184#else
185#if defined(UART0_UDRE_vect)
186ISR(UART0_UDRE_vect)
187#elif defined(UART_UDRE_vect)
188ISR(UART_UDRE_vect)
189#elif defined(USART0_UDRE_vect)
190ISR(USART0_UDRE_vect)
191#elif defined(USART_UDRE_vect)
192ISR(USART_UDRE_vect)
193#endif
194{
195 if (tx_buffer.head == tx_buffer.tail) {
196 // Buffer empty, so disable interrupts
197#if defined(UCSR0B)
198 cbi(UCSR0B, UDRIE0);
199#else
200 cbi(UCSRB, UDRIE);
201#endif
202 }
203 else {
204 // There is more data in the output buffer. Send the next byte
205 unsigned char c = tx_buffer.buffer[tx_buffer.tail];
206 tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE;
207
208 #if defined(UDR0)
209 UDR0 = c;
210 #elif defined(UDR)
211 UDR = c;
212 #else
213 #error UDR not defined
214 #endif
215 }
216}
217#endif
218#endif
219
220#ifdef USART1_UDRE_vect
221ISR(USART1_UDRE_vect)
222{
223 if (tx_buffer1.head == tx_buffer1.tail) {
224 // Buffer empty, so disable interrupts
225 cbi(UCSR1B, UDRIE1);
226 }
227 else {
228 // There is more data in the output buffer. Send the next byte
229 unsigned char c = tx_buffer1.buffer[tx_buffer1.tail];
230 tx_buffer1.tail = (tx_buffer1.tail + 1) % SERIAL_BUFFER_SIZE;
231
232 UDR1 = c;
233 }
234}
235#endif
236
237#ifdef USART2_UDRE_vect
238ISR(USART2_UDRE_vect)
239{
240 if (tx_buffer2.head == tx_buffer2.tail) {
241 // Buffer empty, so disable interrupts
242 cbi(UCSR2B, UDRIE2);
243 }
244 else {
245 // There is more data in the output buffer. Send the next byte
246 unsigned char c = tx_buffer2.buffer[tx_buffer2.tail];
247 tx_buffer2.tail = (tx_buffer2.tail + 1) % SERIAL_BUFFER_SIZE;
248
249 UDR2 = c;
250 }
251}
252#endif
253
254#ifdef USART3_UDRE_vect
255ISR(USART3_UDRE_vect)
256{
257 if (tx_buffer3.head == tx_buffer3.tail) {
258 // Buffer empty, so disable interrupts
259 cbi(UCSR3B, UDRIE3);
260 }
261 else {
262 // There is more data in the output buffer. Send the next byte
263 unsigned char c = tx_buffer3.buffer[tx_buffer3.tail];
264 tx_buffer3.tail = (tx_buffer3.tail + 1) % SERIAL_BUFFER_SIZE;
265
266 UDR3 = c;
267 }
268}
269#endif
270
271
272// Constructors ////////////////////////////////////////////////////////////////
273
274HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer,
275 volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
276 volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
277 volatile uint8_t *udr,
278 uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x)
279{
280 _rx_buffer = rx_buffer;
281 _tx_buffer = tx_buffer;
282 _ubrrh = ubrrh;
283 _ubrrl = ubrrl;
284 _ucsra = ucsra;
285 _ucsrb = ucsrb;
286 _udr = udr;
287 _rxen = rxen;
288 _txen = txen;
289 _rxcie = rxcie;
290 _udrie = udrie;
291 _u2x = u2x;
292}
293
294// Public Methods //////////////////////////////////////////////////////////////
295
296void HardwareSerial::begin(unsigned long baud)
297{
298 uint16_t baud_setting;
299 bool use_u2x = true;
300
301#if F_CPU == 16000000UL
302 // hardcoded exception for compatibility with the bootloader shipped
303 // with the Duemilanove and previous boards and the firmware on the 8U2
304 // on the Uno and Mega 2560.
305 if (baud == 57600) {
306 use_u2x = false;
307 }
308#endif
309
310try_again:
311
312 if (use_u2x) {
313 *_ucsra = 1 << _u2x;
314 baud_setting = (F_CPU / 4 / baud - 1) / 2;
315 } else {
316 *_ucsra = 0;
317 baud_setting = (F_CPU / 8 / baud - 1) / 2;
318 }
319
320 if ((baud_setting > 4095) && use_u2x)
321 {
322 use_u2x = false;
323 goto try_again;
324 }
325
326 // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
327 *_ubrrh = baud_setting >> 8;
328 *_ubrrl = baud_setting;
329
330 sbi(*_ucsrb, _rxen);
331 sbi(*_ucsrb, _txen);
332 sbi(*_ucsrb, _rxcie);
333 cbi(*_ucsrb, _udrie);
334}
335
336void HardwareSerial::end()
337{
338 // wait for transmission of outgoing data
339 while (_tx_buffer->head != _tx_buffer->tail)
340 ;
341
342 cbi(*_ucsrb, _rxen);
343 cbi(*_ucsrb, _txen);
344 cbi(*_ucsrb, _rxcie);
345 cbi(*_ucsrb, _udrie);
346
347 // clear any received data
348 _rx_buffer->head = _rx_buffer->tail;
349}
350
351int HardwareSerial::available(void)
352{
353 return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE;
354}
355
356int HardwareSerial::peek(void)
357{
358 if (_rx_buffer->head == _rx_buffer->tail) {
359 return -1;
360 } else {
361 return _rx_buffer->buffer[_rx_buffer->tail];
362 }
363}
364
365int HardwareSerial::read(void)
366{
367 // if the head isn't ahead of the tail, we don't have any characters
368 if (_rx_buffer->head == _rx_buffer->tail) {
369 return -1;
370 } else {
371 unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];
372 _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE;
373 return c;
374 }
375}
376
377void HardwareSerial::flush()
378{
379 while (_tx_buffer->head != _tx_buffer->tail)
380 ;
381}
382
383size_t HardwareSerial::write(uint8_t c)
384{
385 int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE;
386
387 // If the output buffer is full, there's nothing for it other than to
388 // wait for the interrupt handler to empty it a bit
389 // ???: return 0 here instead?
390 while (i == _tx_buffer->tail)
391 ;
392
393 _tx_buffer->buffer[_tx_buffer->head] = c;
394 _tx_buffer->head = i;
395
396 sbi(*_ucsrb, _udrie);
397
398 return 1;
399}
400
401HardwareSerial::operator bool() {
402 return true;
403}
404
405// Preinstantiate Objects //////////////////////////////////////////////////////
406
407#if defined(UBRRH) && defined(UBRRL)
408 HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X);
409#elif defined(UBRR0H) && defined(UBRR0L)
410 HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRIE0, U2X0);
411#elif defined(USBCON)
412 // do nothing - Serial object and buffers are initialized in CDC code
413#else
414 #error no serial port defined (port 0)
415#endif
416
417#if defined(UBRR1H)
418 HardwareSerial Serial1(&rx_buffer1, &tx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRIE1, U2X1);
419#endif
420#if defined(UBRR2H)
421 HardwareSerial Serial2(&rx_buffer2, &tx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRIE2, U2X2);
422#endif
423#if defined(UBRR3H)
424 HardwareSerial Serial3(&rx_buffer3, &tx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3);
425#endif
426
427#endif // whole file
428
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.h
new file mode 100644
index 000000000..bf4924c6d
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.h
@@ -0,0 +1,81 @@
1/*
2 HardwareSerial.h - Hardware serial library for Wiring
3 Copyright (c) 2006 Nicholas Zambetti. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Modified 28 September 2010 by Mark Sproul
20*/
21
22#ifndef HardwareSerial_h
23#define HardwareSerial_h
24
25#include <inttypes.h>
26
27#include "Stream.h"
28
29struct ring_buffer;
30
31class HardwareSerial : public Stream
32{
33 private:
34 ring_buffer *_rx_buffer;
35 ring_buffer *_tx_buffer;
36 volatile uint8_t *_ubrrh;
37 volatile uint8_t *_ubrrl;
38 volatile uint8_t *_ucsra;
39 volatile uint8_t *_ucsrb;
40 volatile uint8_t *_udr;
41 uint8_t _rxen;
42 uint8_t _txen;
43 uint8_t _rxcie;
44 uint8_t _udrie;
45 uint8_t _u2x;
46 public:
47 HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer,
48 volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
49 volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
50 volatile uint8_t *udr,
51 uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x);
52 void begin(unsigned long);
53 void end();
54 virtual int available(void);
55 virtual int peek(void);
56 virtual int read(void);
57 virtual void flush(void);
58 virtual size_t write(uint8_t);
59 using Print::write; // pull in write(str) and write(buf, size) from Print
60 operator bool();
61};
62
63#if defined(UBRRH) || defined(UBRR0H)
64 extern HardwareSerial Serial;
65#elif defined(USBCON)
66 #include "USBAPI.h"
67// extern HardwareSerial Serial_;
68#endif
69#if defined(UBRR1H)
70 extern HardwareSerial Serial1;
71#endif
72#if defined(UBRR2H)
73 extern HardwareSerial Serial2;
74#endif
75#if defined(UBRR3H)
76 extern HardwareSerial Serial3;
77#endif
78
79extern void serialEventRun(void) __attribute__((weak));
80
81#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.cpp
new file mode 100644
index 000000000..fe3deb77a
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.cpp
@@ -0,0 +1,56 @@
1
2#include <Arduino.h>
3#include <IPAddress.h>
4
5IPAddress::IPAddress()
6{
7 memset(_address, 0, sizeof(_address));
8}
9
10IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet)
11{
12 _address[0] = first_octet;
13 _address[1] = second_octet;
14 _address[2] = third_octet;
15 _address[3] = fourth_octet;
16}
17
18IPAddress::IPAddress(uint32_t address)
19{
20 memcpy(_address, &address, sizeof(_address));
21}
22
23IPAddress::IPAddress(const uint8_t *address)
24{
25 memcpy(_address, address, sizeof(_address));
26}
27
28IPAddress& IPAddress::operator=(const uint8_t *address)
29{
30 memcpy(_address, address, sizeof(_address));
31 return *this;
32}
33
34IPAddress& IPAddress::operator=(uint32_t address)
35{
36 memcpy(_address, (const uint8_t *)&address, sizeof(_address));
37 return *this;
38}
39
40bool IPAddress::operator==(const uint8_t* addr)
41{
42 return memcmp(addr, _address, sizeof(_address)) == 0;
43}
44
45size_t IPAddress::printTo(Print& p) const
46{
47 size_t n = 0;
48 for (int i =0; i < 3; i++)
49 {
50 n += p.print(_address[i], DEC);
51 n += p.print('.');
52 }
53 n += p.print(_address[3], DEC);
54 return n;
55}
56
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.h
new file mode 100644
index 000000000..2585aec0e
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.h
@@ -0,0 +1,76 @@
1/*
2 *
3 * MIT License:
4 * Copyright (c) 2011 Adrian McEwen
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 * THE SOFTWARE.
22 *
23 * adrianm@mcqn.com 1/1/2011
24 */
25
26#ifndef IPAddress_h
27#define IPAddress_h
28
29#include <Printable.h>
30
31// A class to make it easier to handle and pass around IP addresses
32
33class IPAddress : public Printable {
34private:
35 uint8_t _address[4]; // IPv4 address
36 // Access the raw byte array containing the address. Because this returns a pointer
37 // to the internal structure rather than a copy of the address this function should only
38 // be used when you know that the usage of the returned uint8_t* will be transient and not
39 // stored.
40 uint8_t* raw_address() { return _address; };
41
42public:
43 // Constructors
44 IPAddress();
45 IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet);
46 IPAddress(uint32_t address);
47 IPAddress(const uint8_t *address);
48
49 // Overloaded cast operator to allow IPAddress objects to be used where a pointer
50 // to a four-byte uint8_t array is expected
51 operator uint32_t() { return *((uint32_t*)_address); };
52 bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); };
53 bool operator==(const uint8_t* addr);
54
55 // Overloaded index operator to allow getting and setting individual octets of the address
56 uint8_t operator[](int index) const { return _address[index]; };
57 uint8_t& operator[](int index) { return _address[index]; };
58
59 // Overloaded copy operators to allow initialisation of IPAddress objects from other types
60 IPAddress& operator=(const uint8_t *address);
61 IPAddress& operator=(uint32_t address);
62
63 virtual size_t printTo(Print& p) const;
64
65 friend class EthernetClass;
66 friend class UDP;
67 friend class Client;
68 friend class Server;
69 friend class DhcpClass;
70 friend class DNSClient;
71};
72
73const IPAddress INADDR_NONE(0,0,0,0);
74
75
76#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Platform.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Platform.h
new file mode 100644
index 000000000..8b8f74277
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Platform.h
@@ -0,0 +1,23 @@
1
2#ifndef __PLATFORM_H__
3#define __PLATFORM_H__
4
5#include <inttypes.h>
6#include <avr/pgmspace.h>
7#include <avr/eeprom.h>
8#include <avr/interrupt.h>
9#include <util/delay.h>
10
11typedef unsigned char u8;
12typedef unsigned short u16;
13typedef unsigned long u32;
14
15#include "Arduino.h"
16
17#if defined(USBCON)
18 #include "USBDesc.h"
19 #include "USBCore.h"
20 #include "USBAPI.h"
21#endif /* if defined(USBCON) */
22
23#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.cpp
new file mode 100644
index 000000000..e541a6ce7
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.cpp
@@ -0,0 +1,263 @@
1/*
2 Print.cpp - Base class that provides print() and println()
3 Copyright (c) 2008 David A. Mellis. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Modified 23 November 2006 by David A. Mellis
20 */
21
22#include <stdlib.h>
23#include <stdio.h>
24#include <string.h>
25#include <math.h>
26#include "Arduino.h"
27
28#include "Print.h"
29
30// Public Methods //////////////////////////////////////////////////////////////
31
32/* default implementation: may be overridden */
33size_t Print::write(const uint8_t *buffer, size_t size)
34{
35 size_t n = 0;
36 while (size--) {
37 n += write(*buffer++);
38 }
39 return n;
40}
41
42size_t Print::print(const __FlashStringHelper *ifsh)
43{
44 const char PROGMEM *p = (const char PROGMEM *)ifsh;
45 size_t n = 0;
46 while (1) {
47 unsigned char c = pgm_read_byte(p++);
48 if (c == 0) break;
49 n += write(c);
50 }
51 return n;
52}
53
54size_t Print::print(const String &s)
55{
56 size_t n = 0;
57 for (uint16_t i = 0; i < s.length(); i++) {
58 n += write(s[i]);
59 }
60 return n;
61}
62
63size_t Print::print(const char str[])
64{
65 return write(str);
66}
67
68size_t Print::print(char c)
69{
70 return write(c);
71}
72
73size_t Print::print(unsigned char b, int base)
74{
75 return print((unsigned long) b, base);
76}
77
78size_t Print::print(int n, int base)
79{
80 return print((long) n, base);
81}
82
83size_t Print::print(unsigned int n, int base)
84{
85 return print((unsigned long) n, base);
86}
87
88size_t Print::print(long n, int base)
89{
90 if (base == 0) {
91 return write(n);
92 } else if (base == 10) {
93 if (n < 0) {
94 int t = print('-');
95 n = -n;
96 return printNumber(n, 10) + t;
97 }
98 return printNumber(n, 10);
99 } else {
100 return printNumber(n, base);
101 }
102}
103
104size_t Print::print(unsigned long n, int base)
105{
106 if (base == 0) return write(n);
107 else return printNumber(n, base);
108}
109
110size_t Print::print(double n, int digits)
111{
112 return printFloat(n, digits);
113}
114
115size_t Print::println(const __FlashStringHelper *ifsh)
116{
117 size_t n = print(ifsh);
118 n += println();
119 return n;
120}
121
122size_t Print::print(const Printable& x)
123{
124 return x.printTo(*this);
125}
126
127size_t Print::println(void)
128{
129 size_t n = print('\r');
130 n += print('\n');
131 return n;
132}
133
134size_t Print::println(const String &s)
135{
136 size_t n = print(s);
137 n += println();
138 return n;
139}
140
141size_t Print::println(const char c[])
142{
143 size_t n = print(c);
144 n += println();
145 return n;
146}
147
148size_t Print::println(char c)
149{
150 size_t n = print(c);
151 n += println();
152 return n;
153}
154
155size_t Print::println(unsigned char b, int base)
156{
157 size_t n = print(b, base);
158 n += println();
159 return n;
160}
161
162size_t Print::println(int num, int base)
163{
164 size_t n = print(num, base);
165 n += println();
166 return n;
167}
168
169size_t Print::println(unsigned int num, int base)
170{
171 size_t n = print(num, base);
172 n += println();
173 return n;
174}
175
176size_t Print::println(long num, int base)
177{
178 size_t n = print(num, base);
179 n += println();
180 return n;
181}
182
183size_t Print::println(unsigned long num, int base)
184{
185 size_t n = print(num, base);
186 n += println();
187 return n;
188}
189
190size_t Print::println(double num, int digits)
191{
192 size_t n = print(num, digits);
193 n += println();
194 return n;
195}
196
197size_t Print::println(const Printable& x)
198{
199 size_t n = print(x);
200 n += println();
201 return n;
202}
203
204// Private Methods /////////////////////////////////////////////////////////////
205
206size_t Print::printNumber(unsigned long n, uint8_t base) {
207 char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
208 char *str = &buf[sizeof(buf) - 1];
209
210 *str = '\0';
211
212 // prevent crash if called with base == 1
213 if (base < 2) base = 10;
214
215 do {
216 unsigned long m = n;
217 n /= base;
218 char c = m - base * n;
219 *--str = c < 10 ? c + '0' : c + 'A' - 10;
220 } while(n);
221
222 return write(str);
223}
224
225size_t Print::printFloat(double number, uint8_t digits)
226{
227 size_t n = 0;
228
229 // Handle negative numbers
230 if (number < 0.0)
231 {
232 n += print('-');
233 number = -number;
234 }
235
236 // Round correctly so that print(1.999, 2) prints as "2.00"
237 double rounding = 0.5;
238 for (uint8_t i=0; i<digits; ++i)
239 rounding /= 10.0;
240
241 number += rounding;
242
243 // Extract the integer part of the number and print it
244 unsigned long int_part = (unsigned long)number;
245 double remainder = number - (double)int_part;
246 n += print(int_part);
247
248 // Print the decimal point, but only if there are digits beyond
249 if (digits > 0) {
250 n += print(".");
251 }
252
253 // Extract digits from the remainder one at a time
254 while (digits-- > 0)
255 {
256 remainder *= 10.0;
257 int toPrint = int(remainder);
258 n += print(toPrint);
259 remainder -= toPrint;
260 }
261
262 return n;
263}
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.h
new file mode 100644
index 000000000..1af6b723f
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.h
@@ -0,0 +1,78 @@
1/*
2 Print.h - Base class that provides print() and println()
3 Copyright (c) 2008 David A. Mellis. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18*/
19
20#ifndef Print_h
21#define Print_h
22
23#include <inttypes.h>
24#include <stdio.h> // for size_t
25
26#include "WString.h"
27#include "Printable.h"
28
29#define DEC 10
30#define HEX 16
31#define OCT 8
32#define BIN 2
33
34class Print
35{
36 private:
37 int write_error;
38 size_t printNumber(unsigned long, uint8_t);
39 size_t printFloat(double, uint8_t);
40 protected:
41 void setWriteError(int err = 1) { write_error = err; }
42 public:
43 Print() : write_error(0) {}
44
45 int getWriteError() { return write_error; }
46 void clearWriteError() { setWriteError(0); }
47
48 virtual size_t write(uint8_t) = 0;
49 size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); }
50 virtual size_t write(const uint8_t *buffer, size_t size);
51
52 size_t print(const __FlashStringHelper *);
53 size_t print(const String &);
54 size_t print(const char[]);
55 size_t print(char);
56 size_t print(unsigned char, int = DEC);
57 size_t print(int, int = DEC);
58 size_t print(unsigned int, int = DEC);
59 size_t print(long, int = DEC);
60 size_t print(unsigned long, int = DEC);
61 size_t print(double, int = 2);
62 size_t print(const Printable&);
63
64 size_t println(const __FlashStringHelper *);
65 size_t println(const String &s);
66 size_t println(const char[]);
67 size_t println(char);
68 size_t println(unsigned char, int = DEC);
69 size_t println(int, int = DEC);
70 size_t println(unsigned int, int = DEC);
71 size_t println(long, int = DEC);
72 size_t println(unsigned long, int = DEC);
73 size_t println(double, int = 2);
74 size_t println(const Printable&);
75 size_t println(void);
76};
77
78#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Printable.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Printable.h
new file mode 100644
index 000000000..d03c9af62
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Printable.h
@@ -0,0 +1,40 @@
1/*
2 Printable.h - Interface class that allows printing of complex types
3 Copyright (c) 2011 Adrian McEwen. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18*/
19
20#ifndef Printable_h
21#define Printable_h
22
23#include <new.h>
24
25class Print;
26
27/** The Printable class provides a way for new classes to allow themselves to be printed.
28 By deriving from Printable and implementing the printTo method, it will then be possible
29 for users to print out instances of this class by passing them into the usual
30 Print::print and Print::println methods.
31*/
32
33class Printable
34{
35 public:
36 virtual size_t printTo(Print& p) const = 0;
37};
38
39#endif
40
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Server.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Server.h
new file mode 100644
index 000000000..9674c7626
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Server.h
@@ -0,0 +1,9 @@
1#ifndef server_h
2#define server_h
3
4class Server : public Print {
5public:
6 virtual void begin() =0;
7};
8
9#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.cpp
new file mode 100644
index 000000000..aafb7fcf9
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.cpp
@@ -0,0 +1,270 @@
1/*
2 Stream.cpp - adds parsing methods to Stream class
3 Copyright (c) 2008 David A. Mellis. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Created July 2011
20 parsing functions based on TextFinder library by Michael Margolis
21 */
22
23#include "Arduino.h"
24#include "Stream.h"
25
26#define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait
27#define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field
28
29// private method to read stream with timeout
30int Stream::timedRead()
31{
32 int c;
33 _startMillis = millis();
34 do {
35 c = read();
36 if (c >= 0) return c;
37 } while(millis() - _startMillis < _timeout);
38 return -1; // -1 indicates timeout
39}
40
41// private method to peek stream with timeout
42int Stream::timedPeek()
43{
44 int c;
45 _startMillis = millis();
46 do {
47 c = peek();
48 if (c >= 0) return c;
49 } while(millis() - _startMillis < _timeout);
50 return -1; // -1 indicates timeout
51}
52
53// returns peek of the next digit in the stream or -1 if timeout
54// discards non-numeric characters
55int Stream::peekNextDigit()
56{
57 int c;
58 while (1) {
59 c = timedPeek();
60 if (c < 0) return c; // timeout
61 if (c == '-') return c;
62 if (c >= '0' && c <= '9') return c;
63 read(); // discard non-numeric
64 }
65}
66
67// Public Methods
68//////////////////////////////////////////////////////////////
69
70void Stream::setTimeout(unsigned long timeout) // sets the maximum number of milliseconds to wait
71{
72 _timeout = timeout;
73}
74
75 // find returns true if the target string is found
76bool Stream::find(char *target)
77{
78 return findUntil(target, NULL);
79}
80
81// reads data from the stream until the target string of given length is found
82// returns true if target string is found, false if timed out
83bool Stream::find(char *target, size_t length)
84{
85 return findUntil(target, length, NULL, 0);
86}
87
88// as find but search ends if the terminator string is found
89bool Stream::findUntil(char *target, char *terminator)
90{
91 return findUntil(target, strlen(target), terminator, strlen(terminator));
92}
93
94// reads data from the stream until the target string of the given length is found
95// search terminated if the terminator string is found
96// returns true if target string is found, false if terminated or timed out
97bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen)
98{
99 size_t index = 0; // maximum target string length is 64k bytes!
100 size_t termIndex = 0;
101 int c;
102
103 if( *target == 0)
104 return true; // return true if target is a null string
105 while( (c = timedRead()) > 0){
106
107 if(c != target[index])
108 index = 0; // reset index if any char does not match
109
110 if( c == target[index]){
111 //////Serial.print("found "); Serial.write(c); Serial.print("index now"); Serial.println(index+1);
112 if(++index >= targetLen){ // return true if all chars in the target match
113 return true;
114 }
115 }
116
117 if(termLen > 0 && c == terminator[termIndex]){
118 if(++termIndex >= termLen)
119 return false; // return false if terminate string found before target string
120 }
121 else
122 termIndex = 0;
123 }
124 return false;
125}
126
127
128// returns the first valid (long) integer value from the current position.
129// initial characters that are not digits (or the minus sign) are skipped
130// function is terminated by the first character that is not a digit.
131long Stream::parseInt()
132{
133 return parseInt(NO_SKIP_CHAR); // terminate on first non-digit character (or timeout)
134}
135
136// as above but a given skipChar is ignored
137// this allows format characters (typically commas) in values to be ignored
138long Stream::parseInt(char skipChar)
139{
140 boolean isNegative = false;
141 long value = 0;
142 int c;
143
144 c = peekNextDigit();
145 // ignore non numeric leading characters
146 if(c < 0)
147 return 0; // zero returned if timeout
148
149 do{
150 if(c == skipChar)
151 ; // ignore this charactor
152 else if(c == '-')
153 isNegative = true;
154 else if(c >= '0' && c <= '9') // is c a digit?
155 value = value * 10 + c - '0';
156 read(); // consume the character we got with peek
157 c = timedPeek();
158 }
159 while( (c >= '0' && c <= '9') || c == skipChar );
160
161 if(isNegative)
162 value = -value;
163 return value;
164}
165
166
167// as parseInt but returns a floating point value
168float Stream::parseFloat()
169{
170 return parseFloat(NO_SKIP_CHAR);
171}
172
173// as above but the given skipChar is ignored
174// this allows format characters (typically commas) in values to be ignored
175float Stream::parseFloat(char skipChar){
176 boolean isNegative = false;
177 boolean isFraction = false;
178 long value = 0;
179 char c;
180 float fraction = 1.0;
181
182 c = peekNextDigit();
183 // ignore non numeric leading characters
184 if(c < 0)
185 return 0; // zero returned if timeout
186
187 do{
188 if(c == skipChar)
189 ; // ignore
190 else if(c == '-')
191 isNegative = true;
192 else if (c == '.')
193 isFraction = true;
194 else if(c >= '0' && c <= '9') { // is c a digit?
195 value = value * 10 + c - '0';
196 if(isFraction)
197 fraction *= 0.1;
198 }
199 read(); // consume the character we got with peek
200 c = timedPeek();
201 }
202 while( (c >= '0' && c <= '9') || c == '.' || c == skipChar );
203
204 if(isNegative)
205 value = -value;
206 if(isFraction)
207 return value * fraction;
208 else
209 return value;
210}
211
212// read characters from stream into buffer
213// terminates if length characters have been read, or timeout (see setTimeout)
214// returns the number of characters placed in the buffer
215// the buffer is NOT null terminated.
216//
217size_t Stream::readBytes(char *buffer, size_t length)
218{
219 size_t count = 0;
220 while (count < length) {
221 int c = timedRead();
222 if (c < 0) break;
223 *buffer++ = (char)c;
224 count++;
225 }
226 return count;
227}
228
229
230// as readBytes with terminator character
231// terminates if length characters have been read, timeout, or if the terminator character detected
232// returns the number of characters placed in the buffer (0 means no valid data found)
233
234size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length)
235{
236 if (length < 1) return 0;
237 size_t index = 0;
238 while (index < length) {
239 int c = timedRead();
240 if (c < 0 || c == terminator) break;
241 *buffer++ = (char)c;
242 index++;
243 }
244 return index; // return number of characters, not including null terminator
245}
246
247String Stream::readString()
248{
249 String ret;
250 int c = timedRead();
251 while (c >= 0)
252 {
253 ret += (char)c;
254 c = timedRead();
255 }
256 return ret;
257}
258
259String Stream::readStringUntil(char terminator)
260{
261 String ret;
262 int c = timedRead();
263 while (c >= 0 && c != terminator)
264 {
265 ret += (char)c;
266 c = timedRead();
267 }
268 return ret;
269}
270
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.h
new file mode 100644
index 000000000..58bbf752f
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.h
@@ -0,0 +1,96 @@
1/*
2 Stream.h - base class for character-based streams.
3 Copyright (c) 2010 David A. Mellis. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 parsing functions based on TextFinder library by Michael Margolis
20*/
21
22#ifndef Stream_h
23#define Stream_h
24
25#include <inttypes.h>
26#include "Print.h"
27
28// compatability macros for testing
29/*
30#define getInt() parseInt()
31#define getInt(skipChar) parseInt(skipchar)
32#define getFloat() parseFloat()
33#define getFloat(skipChar) parseFloat(skipChar)
34#define getString( pre_string, post_string, buffer, length)
35readBytesBetween( pre_string, terminator, buffer, length)
36*/
37
38class Stream : public Print
39{
40 private:
41 unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read
42 unsigned long _startMillis; // used for timeout measurement
43 int timedRead(); // private method to read stream with timeout
44 int timedPeek(); // private method to peek stream with timeout
45 int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout
46
47 public:
48 virtual int available() = 0;
49 virtual int read() = 0;
50 virtual int peek() = 0;
51 virtual void flush() = 0;
52
53 Stream() {_timeout=1000;}
54
55// parsing methods
56
57 void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second
58
59 bool find(char *target); // reads data from the stream until the target string is found
60 // returns true if target string is found, false if timed out (see setTimeout)
61
62 bool find(char *target, size_t length); // reads data from the stream until the target string of given length is found
63 // returns true if target string is found, false if timed out
64
65 bool findUntil(char *target, char *terminator); // as find but search ends if the terminator string is found
66
67 bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen); // as above but search ends if the terminate string is found
68
69
70 long parseInt(); // returns the first valid (long) integer value from the current position.
71 // initial characters that are not digits (or the minus sign) are skipped
72 // integer is terminated by the first character that is not a digit.
73
74 float parseFloat(); // float version of parseInt
75
76 size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer
77 // terminates if length characters have been read or timeout (see setTimeout)
78 // returns the number of characters placed in the buffer (0 means no valid data found)
79
80 size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character
81 // terminates if length characters have been read, timeout, or if the terminator character detected
82 // returns the number of characters placed in the buffer (0 means no valid data found)
83
84 // Arduino String functions to be added here
85 String readString();
86 String readStringUntil(char terminator);
87
88 protected:
89 long parseInt(char skipChar); // as above but the given skipChar is ignored
90 // as above but the given skipChar is ignored
91 // this allows format characters (typically commas) in values to be ignored
92
93 float parseFloat(char skipChar); // as above but the given skipChar is ignored
94};
95
96#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Tone.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Tone.cpp
new file mode 100644
index 000000000..20eed3f48
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Tone.cpp
@@ -0,0 +1,601 @@
1/* Tone.cpp
2
3 A Tone Generator Library
4
5 Written by Brett Hagman
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
21Version Modified By Date Comments
22------- ----------- -------- --------
230001 B Hagman 09/08/02 Initial coding
240002 B Hagman 09/08/18 Multiple pins
250003 B Hagman 09/08/18 Moved initialization from constructor to begin()
260004 B Hagman 09/09/26 Fixed problems with ATmega8
270005 B Hagman 09/11/23 Scanned prescalars for best fit on 8 bit timers
28 09/11/25 Changed pin toggle method to XOR
29 09/11/25 Fixed timer0 from being excluded
300006 D Mellis 09/12/29 Replaced objects with functions
310007 M Sproul 10/08/29 Changed #ifdefs from cpu to register
32*************************************************/
33
34#include <avr/interrupt.h>
35#include <avr/pgmspace.h>
36#include "Arduino.h"
37#include "pins_arduino.h"
38
39#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
40#define TCCR2A TCCR2
41#define TCCR2B TCCR2
42#define COM2A1 COM21
43#define COM2A0 COM20
44#define OCR2A OCR2
45#define TIMSK2 TIMSK
46#define OCIE2A OCIE2
47#define TIMER2_COMPA_vect TIMER2_COMP_vect
48#define TIMSK1 TIMSK
49#endif
50
51// timerx_toggle_count:
52// > 0 - duration specified
53// = 0 - stopped
54// < 0 - infinitely (until stop() method called, or new play() called)
55
56#if !defined(__AVR_ATmega8__)
57volatile long timer0_toggle_count;
58volatile uint8_t *timer0_pin_port;
59volatile uint8_t timer0_pin_mask;
60#endif
61
62volatile long timer1_toggle_count;
63volatile uint8_t *timer1_pin_port;
64volatile uint8_t timer1_pin_mask;
65volatile long timer2_toggle_count;
66volatile uint8_t *timer2_pin_port;
67volatile uint8_t timer2_pin_mask;
68
69#if defined(TIMSK3)
70volatile long timer3_toggle_count;
71volatile uint8_t *timer3_pin_port;
72volatile uint8_t timer3_pin_mask;
73#endif
74
75#if defined(TIMSK4)
76volatile long timer4_toggle_count;
77volatile uint8_t *timer4_pin_port;
78volatile uint8_t timer4_pin_mask;
79#endif
80
81#if defined(TIMSK5)
82volatile long timer5_toggle_count;
83volatile uint8_t *timer5_pin_port;
84volatile uint8_t timer5_pin_mask;
85#endif
86
87
88// MLS: This does not make sense, the 3 options are the same
89#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
90
91#define AVAILABLE_TONE_PINS 1
92
93const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 3, 4, 5, 1, 0 */ };
94static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ };
95
96#elif defined(__AVR_ATmega8__)
97
98#define AVAILABLE_TONE_PINS 1
99
100const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ };
101static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ };
102
103#else
104
105#define AVAILABLE_TONE_PINS 1
106
107// Leave timer 0 to last.
108const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ };
109static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ };
110
111#endif
112
113
114
115static int8_t toneBegin(uint8_t _pin)
116{
117 int8_t _timer = -1;
118
119 // if we're already using the pin, the timer should be configured.
120 for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
121 if (tone_pins[i] == _pin) {
122 return pgm_read_byte(tone_pin_to_timer_PGM + i);
123 }
124 }
125
126 // search for an unused timer.
127 for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
128 if (tone_pins[i] == 255) {
129 tone_pins[i] = _pin;
130 _timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
131 break;
132 }
133 }
134
135 if (_timer != -1)
136 {
137 // Set timer specific stuff
138 // All timers in CTC mode
139 // 8 bit timers will require changing prescalar values,
140 // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar
141 switch (_timer)
142 {
143 #if defined(TCCR0A) && defined(TCCR0B)
144 case 0:
145 // 8 bit timer
146 TCCR0A = 0;
147 TCCR0B = 0;
148 bitWrite(TCCR0A, WGM01, 1);
149 bitWrite(TCCR0B, CS00, 1);
150 timer0_pin_port = portOutputRegister(digitalPinToPort(_pin));
151 timer0_pin_mask = digitalPinToBitMask(_pin);
152 break;
153 #endif
154
155 #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12)
156 case 1:
157 // 16 bit timer
158 TCCR1A = 0;
159 TCCR1B = 0;
160 bitWrite(TCCR1B, WGM12, 1);
161 bitWrite(TCCR1B, CS10, 1);
162 timer1_pin_port = portOutputRegister(digitalPinToPort(_pin));
163 timer1_pin_mask = digitalPinToBitMask(_pin);
164 break;
165 #endif
166
167 #if defined(TCCR2A) && defined(TCCR2B)
168 case 2:
169 // 8 bit timer
170 TCCR2A = 0;
171 TCCR2B = 0;
172 bitWrite(TCCR2A, WGM21, 1);
173 bitWrite(TCCR2B, CS20, 1);
174 timer2_pin_port = portOutputRegister(digitalPinToPort(_pin));
175 timer2_pin_mask = digitalPinToBitMask(_pin);
176 break;
177 #endif
178
179 #if defined(TCCR3A) && defined(TCCR3B) && defined(TIMSK3)
180 case 3:
181 // 16 bit timer
182 TCCR3A = 0;
183 TCCR3B = 0;
184 bitWrite(TCCR3B, WGM32, 1);
185 bitWrite(TCCR3B, CS30, 1);
186 timer3_pin_port = portOutputRegister(digitalPinToPort(_pin));
187 timer3_pin_mask = digitalPinToBitMask(_pin);
188 break;
189 #endif
190
191 #if defined(TCCR4A) && defined(TCCR4B) && defined(TIMSK4)
192 case 4:
193 // 16 bit timer
194 TCCR4A = 0;
195 TCCR4B = 0;
196 #if defined(WGM42)
197 bitWrite(TCCR4B, WGM42, 1);
198 #elif defined(CS43)
199 #warning this may not be correct
200 // atmega32u4
201 bitWrite(TCCR4B, CS43, 1);
202 #endif
203 bitWrite(TCCR4B, CS40, 1);
204 timer4_pin_port = portOutputRegister(digitalPinToPort(_pin));
205 timer4_pin_mask = digitalPinToBitMask(_pin);
206 break;
207 #endif
208
209 #if defined(TCCR5A) && defined(TCCR5B) && defined(TIMSK5)
210 case 5:
211 // 16 bit timer
212 TCCR5A = 0;
213 TCCR5B = 0;
214 bitWrite(TCCR5B, WGM52, 1);
215 bitWrite(TCCR5B, CS50, 1);
216 timer5_pin_port = portOutputRegister(digitalPinToPort(_pin));
217 timer5_pin_mask = digitalPinToBitMask(_pin);
218 break;
219 #endif
220 }
221 }
222
223 return _timer;
224}
225
226
227
228// frequency (in hertz) and duration (in milliseconds).
229
230void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
231{
232 uint8_t prescalarbits = 0b001;
233 long toggle_count = 0;
234 uint32_t ocr = 0;
235 int8_t _timer;
236
237 _timer = toneBegin(_pin);
238
239 if (_timer >= 0)
240 {
241 // Set the pinMode as OUTPUT
242 pinMode(_pin, OUTPUT);
243
244 // if we are using an 8 bit timer, scan through prescalars to find the best fit
245 if (_timer == 0 || _timer == 2)
246 {
247 ocr = F_CPU / frequency / 2 - 1;
248 prescalarbits = 0b001; // ck/1: same for both timers
249 if (ocr > 255)
250 {
251 ocr = F_CPU / frequency / 2 / 8 - 1;
252 prescalarbits = 0b010; // ck/8: same for both timers
253
254 if (_timer == 2 && ocr > 255)
255 {
256 ocr = F_CPU / frequency / 2 / 32 - 1;
257 prescalarbits = 0b011;
258 }
259
260 if (ocr > 255)
261 {
262 ocr = F_CPU / frequency / 2 / 64 - 1;
263 prescalarbits = _timer == 0 ? 0b011 : 0b100;
264
265 if (_timer == 2 && ocr > 255)
266 {
267 ocr = F_CPU / frequency / 2 / 128 - 1;
268 prescalarbits = 0b101;
269 }
270
271 if (ocr > 255)
272 {
273 ocr = F_CPU / frequency / 2 / 256 - 1;
274 prescalarbits = _timer == 0 ? 0b100 : 0b110;
275 if (ocr > 255)
276 {
277 // can't do any better than /1024
278 ocr = F_CPU / frequency / 2 / 1024 - 1;
279 prescalarbits = _timer == 0 ? 0b101 : 0b111;
280 }
281 }
282 }
283 }
284
285#if defined(TCCR0B)
286 if (_timer == 0)
287 {
288 TCCR0B = prescalarbits;
289 }
290 else
291#endif
292#if defined(TCCR2B)
293 {
294 TCCR2B = prescalarbits;
295 }
296#else
297 {
298 // dummy place holder to make the above ifdefs work
299 }
300#endif
301 }
302 else
303 {
304 // two choices for the 16 bit timers: ck/1 or ck/64
305 ocr = F_CPU / frequency / 2 - 1;
306
307 prescalarbits = 0b001;
308 if (ocr > 0xffff)
309 {
310 ocr = F_CPU / frequency / 2 / 64 - 1;
311 prescalarbits = 0b011;
312 }
313
314 if (_timer == 1)
315 {
316#if defined(TCCR1B)
317 TCCR1B = (TCCR1B & 0b11111000) | prescalarbits;
318#endif
319 }
320#if defined(TCCR3B)
321 else if (_timer == 3)
322 TCCR3B = (TCCR3B & 0b11111000) | prescalarbits;
323#endif
324#if defined(TCCR4B)
325 else if (_timer == 4)
326 TCCR4B = (TCCR4B & 0b11111000) | prescalarbits;
327#endif
328#if defined(TCCR5B)
329 else if (_timer == 5)
330 TCCR5B = (TCCR5B & 0b11111000) | prescalarbits;
331#endif
332
333 }
334
335
336 // Calculate the toggle count
337 if (duration > 0)
338 {
339 toggle_count = 2 * frequency * duration / 1000;
340 }
341 else
342 {
343 toggle_count = -1;
344 }
345
346 // Set the OCR for the given timer,
347 // set the toggle count,
348 // then turn on the interrupts
349 switch (_timer)
350 {
351
352#if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A)
353 case 0:
354 OCR0A = ocr;
355 timer0_toggle_count = toggle_count;
356 bitWrite(TIMSK0, OCIE0A, 1);
357 break;
358#endif
359
360 case 1:
361#if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A)
362 OCR1A = ocr;
363 timer1_toggle_count = toggle_count;
364 bitWrite(TIMSK1, OCIE1A, 1);
365#elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A)
366 // this combination is for at least the ATmega32
367 OCR1A = ocr;
368 timer1_toggle_count = toggle_count;
369 bitWrite(TIMSK, OCIE1A, 1);
370#endif
371 break;
372
373#if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A)
374 case 2:
375 OCR2A = ocr;
376 timer2_toggle_count = toggle_count;
377 bitWrite(TIMSK2, OCIE2A, 1);
378 break;
379#endif
380
381#if defined(TIMSK3)
382 case 3:
383 OCR3A = ocr;
384 timer3_toggle_count = toggle_count;
385 bitWrite(TIMSK3, OCIE3A, 1);
386 break;
387#endif
388
389#if defined(TIMSK4)
390 case 4:
391 OCR4A = ocr;
392 timer4_toggle_count = toggle_count;
393 bitWrite(TIMSK4, OCIE4A, 1);
394 break;
395#endif
396
397#if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A)
398 case 5:
399 OCR5A = ocr;
400 timer5_toggle_count = toggle_count;
401 bitWrite(TIMSK5, OCIE5A, 1);
402 break;
403#endif
404
405 }
406 }
407}
408
409
410// XXX: this function only works properly for timer 2 (the only one we use
411// currently). for the others, it should end the tone, but won't restore
412// proper PWM functionality for the timer.
413void disableTimer(uint8_t _timer)
414{
415 switch (_timer)
416 {
417 case 0:
418 #if defined(TIMSK0)
419 TIMSK0 = 0;
420 #elif defined(TIMSK)
421 TIMSK = 0; // atmega32
422 #endif
423 break;
424
425#if defined(TIMSK1) && defined(OCIE1A)
426 case 1:
427 bitWrite(TIMSK1, OCIE1A, 0);
428 break;
429#endif
430
431 case 2:
432 #if defined(TIMSK2) && defined(OCIE2A)
433 bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt
434 #endif
435 #if defined(TCCR2A) && defined(WGM20)
436 TCCR2A = (1 << WGM20);
437 #endif
438 #if defined(TCCR2B) && defined(CS22)
439 TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22);
440 #endif
441 #if defined(OCR2A)
442 OCR2A = 0;
443 #endif
444 break;
445
446#if defined(TIMSK3)
447 case 3:
448 TIMSK3 = 0;
449 break;
450#endif
451
452#if defined(TIMSK4)
453 case 4:
454 TIMSK4 = 0;
455 break;
456#endif
457
458#if defined(TIMSK5)
459 case 5:
460 TIMSK5 = 0;
461 break;
462#endif
463 }
464}
465
466
467void noTone(uint8_t _pin)
468{
469 int8_t _timer = -1;
470
471 for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
472 if (tone_pins[i] == _pin) {
473 _timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
474 tone_pins[i] = 255;
475 }
476 }
477
478 disableTimer(_timer);
479
480 digitalWrite(_pin, 0);
481}
482
483#if 0
484#if !defined(__AVR_ATmega8__)
485ISR(TIMER0_COMPA_vect)
486{
487 if (timer0_toggle_count != 0)
488 {
489 // toggle the pin
490 *timer0_pin_port ^= timer0_pin_mask;
491
492 if (timer0_toggle_count > 0)
493 timer0_toggle_count--;
494 }
495 else
496 {
497 disableTimer(0);
498 *timer0_pin_port &= ~(timer0_pin_mask); // keep pin low after stop
499 }
500}
501#endif
502
503
504ISR(TIMER1_COMPA_vect)
505{
506 if (timer1_toggle_count != 0)
507 {
508 // toggle the pin
509 *timer1_pin_port ^= timer1_pin_mask;
510
511 if (timer1_toggle_count > 0)
512 timer1_toggle_count--;
513 }
514 else
515 {
516 disableTimer(1);
517 *timer1_pin_port &= ~(timer1_pin_mask); // keep pin low after stop
518 }
519}
520#endif
521
522
523ISR(TIMER2_COMPA_vect)
524{
525
526 if (timer2_toggle_count != 0)
527 {
528 // toggle the pin
529 *timer2_pin_port ^= timer2_pin_mask;
530
531 if (timer2_toggle_count > 0)
532 timer2_toggle_count--;
533 }
534 else
535 {
536 // need to call noTone() so that the tone_pins[] entry is reset, so the
537 // timer gets initialized next time we call tone().
538 // XXX: this assumes timer 2 is always the first one used.
539 noTone(tone_pins[0]);
540// disableTimer(2);
541// *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop
542 }
543}
544
545
546
547//#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
548#if 0
549
550ISR(TIMER3_COMPA_vect)
551{
552 if (timer3_toggle_count != 0)
553 {
554 // toggle the pin
555 *timer3_pin_port ^= timer3_pin_mask;
556
557 if (timer3_toggle_count > 0)
558 timer3_toggle_count--;
559 }
560 else
561 {
562 disableTimer(3);
563 *timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop
564 }
565}
566
567ISR(TIMER4_COMPA_vect)
568{
569 if (timer4_toggle_count != 0)
570 {
571 // toggle the pin
572 *timer4_pin_port ^= timer4_pin_mask;
573
574 if (timer4_toggle_count > 0)
575 timer4_toggle_count--;
576 }
577 else
578 {
579 disableTimer(4);
580 *timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop
581 }
582}
583
584ISR(TIMER5_COMPA_vect)
585{
586 if (timer5_toggle_count != 0)
587 {
588 // toggle the pin
589 *timer5_pin_port ^= timer5_pin_mask;
590
591 if (timer5_toggle_count > 0)
592 timer5_toggle_count--;
593 }
594 else
595 {
596 disableTimer(5);
597 *timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop
598 }
599}
600
601#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBAPI.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBAPI.h
new file mode 100644
index 000000000..d5abdb690
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBAPI.h
@@ -0,0 +1,195 @@
1
2
3#ifndef __USBAPI__
4#define __USBAPI__
5
6#if defined(USBCON)
7
8//================================================================================
9//================================================================================
10// USB
11
12class USBDevice_
13{
14public:
15 USBDevice_();
16 bool configured();
17
18 void attach();
19 void detach(); // Serial port goes down too...
20 void poll();
21};
22extern USBDevice_ USBDevice;
23
24//================================================================================
25//================================================================================
26// Serial over CDC (Serial1 is the physical port)
27
28class Serial_ : public Stream
29{
30private:
31 ring_buffer *_cdc_rx_buffer;
32public:
33 void begin(uint16_t baud_count);
34 void end(void);
35
36 virtual int available(void);
37 virtual void accept(void);
38 virtual int peek(void);
39 virtual int read(void);
40 virtual void flush(void);
41 virtual size_t write(uint8_t);
42 operator bool();
43};
44extern Serial_ Serial;
45
46//================================================================================
47//================================================================================
48// Mouse
49
50#define MOUSE_LEFT 1
51#define MOUSE_RIGHT 2
52#define MOUSE_MIDDLE 4
53#define MOUSE_ALL (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)
54
55class Mouse_
56{
57private:
58 uint8_t _buttons;
59 void buttons(uint8_t b);
60public:
61 Mouse_(void);
62 void begin(void);
63 void end(void);
64 void click(uint8_t b = MOUSE_LEFT);
65 void move(signed char x, signed char y, signed char wheel = 0);
66 void press(uint8_t b = MOUSE_LEFT); // press LEFT by default
67 void release(uint8_t b = MOUSE_LEFT); // release LEFT by default
68 bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default
69};
70extern Mouse_ Mouse;
71
72//================================================================================
73//================================================================================
74// Keyboard
75
76#define KEY_LEFT_CTRL 0x80
77#define KEY_LEFT_SHIFT 0x81
78#define KEY_LEFT_ALT 0x82
79#define KEY_LEFT_GUI 0x83
80#define KEY_RIGHT_CTRL 0x84
81#define KEY_RIGHT_SHIFT 0x85
82#define KEY_RIGHT_ALT 0x86
83#define KEY_RIGHT_GUI 0x87
84
85#define KEY_UP_ARROW 0xDA
86#define KEY_DOWN_ARROW 0xD9
87#define KEY_LEFT_ARROW 0xD8
88#define KEY_RIGHT_ARROW 0xD7
89#define KEY_BACKSPACE 0xB2
90#define KEY_TAB 0xB3
91#define KEY_RETURN 0xB0
92#define KEY_ESC 0xB1
93#define KEY_INSERT 0xD1
94#define KEY_DELETE 0xD4
95#define KEY_PAGE_UP 0xD3
96#define KEY_PAGE_DOWN 0xD6
97#define KEY_HOME 0xD2
98#define KEY_END 0xD5
99#define KEY_CAPS_LOCK 0xC1
100#define KEY_F1 0xC2
101#define KEY_F2 0xC3
102#define KEY_F3 0xC4
103#define KEY_F4 0xC5
104#define KEY_F5 0xC6
105#define KEY_F6 0xC7
106#define KEY_F7 0xC8
107#define KEY_F8 0xC9
108#define KEY_F9 0xCA
109#define KEY_F10 0xCB
110#define KEY_F11 0xCC
111#define KEY_F12 0xCD
112
113// Low level key report: up to 6 keys and shift, ctrl etc at once
114typedef struct
115{
116 uint8_t modifiers;
117 uint8_t reserved;
118 uint8_t keys[6];
119} KeyReport;
120
121class Keyboard_ : public Print
122{
123private:
124 KeyReport _keyReport;
125 void sendReport(KeyReport* keys);
126public:
127 Keyboard_(void);
128 void begin(void);
129 void end(void);
130 virtual size_t write(uint8_t k);
131 virtual size_t press(uint8_t k);
132 virtual size_t release(uint8_t k);
133 virtual void releaseAll(void);
134};
135extern Keyboard_ Keyboard;
136
137//================================================================================
138//================================================================================
139// Low level API
140
141typedef struct
142{
143 uint8_t bmRequestType;
144 uint8_t bRequest;
145 uint8_t wValueL;
146 uint8_t wValueH;
147 uint16_t wIndex;
148 uint16_t wLength;
149} Setup;
150
151//================================================================================
152//================================================================================
153// HID 'Driver'
154
155int HID_GetInterface(uint8_t* interfaceNum);
156int HID_GetDescriptor(int i);
157bool HID_Setup(Setup& setup);
158void HID_SendReport(uint8_t id, const void* data, int len);
159
160//================================================================================
161//================================================================================
162// MSC 'Driver'
163
164int MSC_GetInterface(uint8_t* interfaceNum);
165int MSC_GetDescriptor(int i);
166bool MSC_Setup(Setup& setup);
167bool MSC_Data(uint8_t rx,uint8_t tx);
168
169//================================================================================
170//================================================================================
171// CSC 'Driver'
172
173int CDC_GetInterface(uint8_t* interfaceNum);
174int CDC_GetDescriptor(int i);
175bool CDC_Setup(Setup& setup);
176
177//================================================================================
178//================================================================================
179
180#define TRANSFER_PGM 0x80
181#define TRANSFER_RELEASE 0x40
182#define TRANSFER_ZERO 0x20
183
184int USB_SendControl(uint8_t flags, const void* d, int len);
185int USB_RecvControl(void* d, int len);
186
187uint8_t USB_Available(uint8_t ep);
188int USB_Send(uint8_t ep, const void* data, int len); // blocking
189int USB_Recv(uint8_t ep, void* data, int len); // non-blocking
190int USB_Recv(uint8_t ep); // non-blocking
191void USB_Flush(uint8_t ep);
192
193#endif
194
195#endif /* if defined(USBCON) */ \ No newline at end of file
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.cpp
new file mode 100644
index 000000000..6766be61a
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.cpp
@@ -0,0 +1,672 @@
1
2
3/* Copyright (c) 2010, Peter Barrett
4**
5** Permission to use, copy, modify, and/or distribute this software for
6** any purpose with or without fee is hereby granted, provided that the
7** above copyright notice and this permission notice appear in all copies.
8**
9** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
12** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
13** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
14** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
15** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
16** SOFTWARE.
17*/
18
19#include "Platform.h"
20#include "USBAPI.h"
21#include "USBDesc.h"
22
23#if defined(USBCON)
24
25#define EP_TYPE_CONTROL 0x00
26#define EP_TYPE_BULK_IN 0x81
27#define EP_TYPE_BULK_OUT 0x80
28#define EP_TYPE_INTERRUPT_IN 0xC1
29#define EP_TYPE_INTERRUPT_OUT 0xC0
30#define EP_TYPE_ISOCHRONOUS_IN 0x41
31#define EP_TYPE_ISOCHRONOUS_OUT 0x40
32
33/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */
34#define TX_RX_LED_PULSE_MS 100
35volatile u8 TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */
36volatile u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */
37
38//==================================================================
39//==================================================================
40
41extern const u16 STRING_LANGUAGE[] PROGMEM;
42extern const u16 STRING_IPRODUCT[] PROGMEM;
43extern const u16 STRING_IMANUFACTURER[] PROGMEM;
44extern const DeviceDescriptor USB_DeviceDescriptor PROGMEM;
45extern const DeviceDescriptor USB_DeviceDescriptorA PROGMEM;
46
47const u16 STRING_LANGUAGE[2] = {
48 (3<<8) | (2+2),
49 0x0409 // English
50};
51
52const u16 STRING_IPRODUCT[17] = {
53 (3<<8) | (2+2*16),
54#if USB_PID == 0x8036
55 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o'
56#else
57 'U','S','B',' ','I','O',' ','B','o','a','r','d',' ',' ',' ',' '
58#endif
59};
60
61const u16 STRING_IMANUFACTURER[12] = {
62 (3<<8) | (2+2*11),
63#if USB_VID == 0x2341
64 'A','r','d','u','i','n','o',' ','L','L','C'
65#else
66 'U','n','k','n','o','w','n',' ',' ',' ',' '
67#endif
68};
69
70#ifdef CDC_ENABLED
71#define DEVICE_CLASS 0x02
72#else
73#define DEVICE_CLASS 0x00
74#endif
75
76// DEVICE DESCRIPTOR
77const DeviceDescriptor USB_DeviceDescriptor =
78 D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
79
80const DeviceDescriptor USB_DeviceDescriptorA =
81 D_DEVICE(DEVICE_CLASS,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
82
83//==================================================================
84//==================================================================
85
86volatile u8 _usbConfiguration = 0;
87
88static inline void WaitIN(void)
89{
90 while (!(UEINTX & (1<<TXINI)));
91}
92
93static inline void ClearIN(void)
94{
95 UEINTX = ~(1<<TXINI);
96}
97
98static inline void WaitOUT(void)
99{
100 while (!(UEINTX & (1<<RXOUTI)))
101 ;
102}
103
104static inline u8 WaitForINOrOUT()
105{
106 while (!(UEINTX & ((1<<TXINI)|(1<<RXOUTI))))
107 ;
108 return (UEINTX & (1<<RXOUTI)) == 0;
109}
110
111static inline void ClearOUT(void)
112{
113 UEINTX = ~(1<<RXOUTI);
114}
115
116void Recv(volatile u8* data, u8 count)
117{
118 while (count--)
119 *data++ = UEDATX;
120
121 RXLED1; // light the RX LED
122 RxLEDPulse = TX_RX_LED_PULSE_MS;
123}
124
125static inline u8 Recv8()
126{
127 RXLED1; // light the RX LED
128 RxLEDPulse = TX_RX_LED_PULSE_MS;
129
130 return UEDATX;
131}
132
133static inline void Send8(u8 d)
134{
135 UEDATX = d;
136}
137
138static inline void SetEP(u8 ep)
139{
140 UENUM = ep;
141}
142
143static inline u8 FifoByteCount()
144{
145 return UEBCLX;
146}
147
148static inline u8 ReceivedSetupInt()
149{
150 return UEINTX & (1<<RXSTPI);
151}
152
153static inline void ClearSetupInt()
154{
155 UEINTX = ~((1<<RXSTPI) | (1<<RXOUTI) | (1<<TXINI));
156}
157
158static inline void Stall()
159{
160 UECONX = (1<<STALLRQ) | (1<<EPEN);
161}
162
163static inline u8 ReadWriteAllowed()
164{
165 return UEINTX & (1<<RWAL);
166}
167
168static inline u8 Stalled()
169{
170 return UEINTX & (1<<STALLEDI);
171}
172
173static inline u8 FifoFree()
174{
175 return UEINTX & (1<<FIFOCON);
176}
177
178static inline void ReleaseRX()
179{
180 UEINTX = 0x6B; // FIFOCON=0 NAKINI=1 RWAL=1 NAKOUTI=0 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=1
181}
182
183static inline void ReleaseTX()
184{
185 UEINTX = 0x3A; // FIFOCON=0 NAKINI=0 RWAL=1 NAKOUTI=1 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=0
186}
187
188static inline u8 FrameNumber()
189{
190 return UDFNUML;
191}
192
193//==================================================================
194//==================================================================
195
196u8 USBGetConfiguration(void)
197{
198 return _usbConfiguration;
199}
200
201#define USB_RECV_TIMEOUT
202class LockEP
203{
204 u8 _sreg;
205public:
206 LockEP(u8 ep) : _sreg(SREG)
207 {
208 cli();
209 SetEP(ep & 7);
210 }
211 ~LockEP()
212 {
213 SREG = _sreg;
214 }
215};
216
217// Number of bytes, assumes a rx endpoint
218u8 USB_Available(u8 ep)
219{
220 LockEP lock(ep);
221 return FifoByteCount();
222}
223
224// Non Blocking receive
225// Return number of bytes read
226int USB_Recv(u8 ep, void* d, int len)
227{
228 if (!_usbConfiguration || len < 0)
229 return -1;
230
231 LockEP lock(ep);
232 u8 n = FifoByteCount();
233 len = min(n,len);
234 n = len;
235 u8* dst = (u8*)d;
236 while (n--)
237 *dst++ = Recv8();
238 if (len && !FifoByteCount()) // release empty buffer
239 ReleaseRX();
240
241 return len;
242}
243
244// Recv 1 byte if ready
245int USB_Recv(u8 ep)
246{
247 u8 c;
248 if (USB_Recv(ep,&c,1) != 1)
249 return -1;
250 return c;
251}
252
253// Space in send EP
254u8 USB_SendSpace(u8 ep)
255{
256 LockEP lock(ep);
257 if (!ReadWriteAllowed())
258 return 0;
259 return 64 - FifoByteCount();
260}
261
262// Blocking Send of data to an endpoint
263int USB_Send(u8 ep, const void* d, int len)
264{
265 if (!_usbConfiguration)
266 return -1;
267
268 int r = len;
269 const u8* data = (const u8*)d;
270 u8 zero = ep & TRANSFER_ZERO;
271 u8 timeout = 250; // 250ms timeout on send? TODO
272 while (len)
273 {
274 u8 n = USB_SendSpace(ep);
275 if (n == 0)
276 {
277 if (!(--timeout))
278 return -1;
279 delay(1);
280 continue;
281 }
282
283 if (n > len)
284 n = len;
285 len -= n;
286 {
287 LockEP lock(ep);
288 if (ep & TRANSFER_ZERO)
289 {
290 while (n--)
291 Send8(0);
292 }
293 else if (ep & TRANSFER_PGM)
294 {
295 while (n--)
296 Send8(pgm_read_byte(data++));
297 }
298 else
299 {
300 while (n--)
301 Send8(*data++);
302 }
303 if (!ReadWriteAllowed() || ((len == 0) && (ep & TRANSFER_RELEASE))) // Release full buffer
304 ReleaseTX();
305 }
306 }
307 TXLED1; // light the TX LED
308 TxLEDPulse = TX_RX_LED_PULSE_MS;
309 return r;
310}
311
312extern const u8 _initEndpoints[] PROGMEM;
313const u8 _initEndpoints[] =
314{
315 0,
316
317#ifdef CDC_ENABLED
318 EP_TYPE_INTERRUPT_IN, // CDC_ENDPOINT_ACM
319 EP_TYPE_BULK_OUT, // CDC_ENDPOINT_OUT
320 EP_TYPE_BULK_IN, // CDC_ENDPOINT_IN
321#endif
322
323#ifdef HID_ENABLED
324 EP_TYPE_INTERRUPT_IN // HID_ENDPOINT_INT
325#endif
326};
327
328#define EP_SINGLE_64 0x32 // EP0
329#define EP_DOUBLE_64 0x36 // Other endpoints
330
331static
332void InitEP(u8 index, u8 type, u8 size)
333{
334 UENUM = index;
335 UECONX = 1;
336 UECFG0X = type;
337 UECFG1X = size;
338}
339
340static
341void InitEndpoints()
342{
343 for (u8 i = 1; i < sizeof(_initEndpoints); i++)
344 {
345 UENUM = i;
346 UECONX = 1;
347 UECFG0X = pgm_read_byte(_initEndpoints+i);
348 UECFG1X = EP_DOUBLE_64;
349 }
350 UERST = 0x7E; // And reset them
351 UERST = 0;
352}
353
354// Handle CLASS_INTERFACE requests
355static
356bool ClassInterfaceRequest(Setup& setup)
357{
358 u8 i = setup.wIndex;
359
360#ifdef CDC_ENABLED
361 if (CDC_ACM_INTERFACE == i)
362 return CDC_Setup(setup);
363#endif
364
365#ifdef HID_ENABLED
366 if (HID_INTERFACE == i)
367 return HID_Setup(setup);
368#endif
369 return false;
370}
371
372int _cmark;
373int _cend;
374void InitControl(int end)
375{
376 SetEP(0);
377 _cmark = 0;
378 _cend = end;
379}
380
381static
382bool SendControl(u8 d)
383{
384 if (_cmark < _cend)
385 {
386 if (!WaitForINOrOUT())
387 return false;
388 Send8(d);
389 if (!((_cmark + 1) & 0x3F))
390 ClearIN(); // Fifo is full, release this packet
391 }
392 _cmark++;
393 return true;
394};
395
396// Clipped by _cmark/_cend
397int USB_SendControl(u8 flags, const void* d, int len)
398{
399 int sent = len;
400 const u8* data = (const u8*)d;
401 bool pgm = flags & TRANSFER_PGM;
402 while (len--)
403 {
404 u8 c = pgm ? pgm_read_byte(data++) : *data++;
405 if (!SendControl(c))
406 return -1;
407 }
408 return sent;
409}
410
411// Does not timeout or cross fifo boundaries
412// Will only work for transfers <= 64 bytes
413// TODO
414int USB_RecvControl(void* d, int len)
415{
416 WaitOUT();
417 Recv((u8*)d,len);
418 ClearOUT();
419 return len;
420}
421
422int SendInterfaces()
423{
424 int total = 0;
425 u8 interfaces = 0;
426
427#ifdef CDC_ENABLED
428 total = CDC_GetInterface(&interfaces);
429#endif
430
431#ifdef HID_ENABLED
432 total += HID_GetInterface(&interfaces);
433#endif
434
435 return interfaces;
436}
437
438// Construct a dynamic configuration descriptor
439// This really needs dynamic endpoint allocation etc
440// TODO
441static
442bool SendConfiguration(int maxlen)
443{
444 // Count and measure interfaces
445 InitControl(0);
446 int interfaces = SendInterfaces();
447 ConfigDescriptor config = D_CONFIG(_cmark + sizeof(ConfigDescriptor),interfaces);
448
449 // Now send them
450 InitControl(maxlen);
451 USB_SendControl(0,&config,sizeof(ConfigDescriptor));
452 SendInterfaces();
453 return true;
454}
455
456u8 _cdcComposite = 0;
457
458static
459bool SendDescriptor(Setup& setup)
460{
461 u8 t = setup.wValueH;
462 if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t)
463 return SendConfiguration(setup.wLength);
464
465 InitControl(setup.wLength);
466#ifdef HID_ENABLED
467 if (HID_REPORT_DESCRIPTOR_TYPE == t)
468 return HID_GetDescriptor(t);
469#endif
470
471 u8 desc_length = 0;
472 const u8* desc_addr = 0;
473 if (USB_DEVICE_DESCRIPTOR_TYPE == t)
474 {
475 if (setup.wLength == 8)
476 _cdcComposite = 1;
477 desc_addr = _cdcComposite ? (const u8*)&USB_DeviceDescriptorA : (const u8*)&USB_DeviceDescriptor;
478 }
479 else if (USB_STRING_DESCRIPTOR_TYPE == t)
480 {
481 if (setup.wValueL == 0)
482 desc_addr = (const u8*)&STRING_LANGUAGE;
483 else if (setup.wValueL == IPRODUCT)
484 desc_addr = (const u8*)&STRING_IPRODUCT;
485 else if (setup.wValueL == IMANUFACTURER)
486 desc_addr = (const u8*)&STRING_IMANUFACTURER;
487 else
488 return false;
489 }
490
491 if (desc_addr == 0)
492 return false;
493 if (desc_length == 0)
494 desc_length = pgm_read_byte(desc_addr);
495
496 USB_SendControl(TRANSFER_PGM,desc_addr,desc_length);
497 return true;
498}
499
500// Endpoint 0 interrupt
501ISR(USB_COM_vect)
502{
503 SetEP(0);
504 if (!ReceivedSetupInt())
505 return;
506
507 Setup setup;
508 Recv((u8*)&setup,8);
509 ClearSetupInt();
510
511 u8 requestType = setup.bmRequestType;
512 if (requestType & REQUEST_DEVICETOHOST)
513 WaitIN();
514 else
515 ClearIN();
516
517 bool ok = true;
518 if (REQUEST_STANDARD == (requestType & REQUEST_TYPE))
519 {
520 // Standard Requests
521 u8 r = setup.bRequest;
522 if (GET_STATUS == r)
523 {
524 Send8(0); // TODO
525 Send8(0);
526 }
527 else if (CLEAR_FEATURE == r)
528 {
529 }
530 else if (SET_FEATURE == r)
531 {
532 }
533 else if (SET_ADDRESS == r)
534 {
535 WaitIN();
536 UDADDR = setup.wValueL | (1<<ADDEN);
537 }
538 else if (GET_DESCRIPTOR == r)
539 {
540 ok = SendDescriptor(setup);
541 }
542 else if (SET_DESCRIPTOR == r)
543 {
544 ok = false;
545 }
546 else if (GET_CONFIGURATION == r)
547 {
548 Send8(1);
549 }
550 else if (SET_CONFIGURATION == r)
551 {
552 if (REQUEST_DEVICE == (requestType & REQUEST_RECIPIENT))
553 {
554 InitEndpoints();
555 _usbConfiguration = setup.wValueL;
556 } else
557 ok = false;
558 }
559 else if (GET_INTERFACE == r)
560 {
561 }
562 else if (SET_INTERFACE == r)
563 {
564 }
565 }
566 else
567 {
568 InitControl(setup.wLength); // Max length of transfer
569 ok = ClassInterfaceRequest(setup);
570 }
571
572 if (ok)
573 ClearIN();
574 else
575 {
576 Stall();
577 }
578}
579
580void USB_Flush(u8 ep)
581{
582 SetEP(ep);
583 if (FifoByteCount())
584 ReleaseTX();
585}
586
587// General interrupt
588ISR(USB_GEN_vect)
589{
590 u8 udint = UDINT;
591 UDINT = 0;
592
593 // End of Reset
594 if (udint & (1<<EORSTI))
595 {
596 InitEP(0,EP_TYPE_CONTROL,EP_SINGLE_64); // init ep0
597 _usbConfiguration = 0; // not configured yet
598 UEIENX = 1 << RXSTPE; // Enable interrupts for ep0
599 }
600
601 // Start of Frame - happens every millisecond so we use it for TX and RX LED one-shot timing, too
602 if (udint & (1<<SOFI))
603 {
604#ifdef CDC_ENABLED
605 USB_Flush(CDC_TX); // Send a tx frame if found
606 while (USB_Available(CDC_RX)) // Handle received bytes (if any)
607 Serial.accept();
608#endif
609
610 // check whether the one-shot period has elapsed. if so, turn off the LED
611 if (TxLEDPulse && !(--TxLEDPulse))
612 TXLED0;
613 if (RxLEDPulse && !(--RxLEDPulse))
614 RXLED0;
615 }
616}
617
618// VBUS or counting frames
619// Any frame counting?
620u8 USBConnected()
621{
622 u8 f = UDFNUML;
623 delay(3);
624 return f != UDFNUML;
625}
626
627//=======================================================================
628//=======================================================================
629
630USBDevice_ USBDevice;
631
632USBDevice_::USBDevice_()
633{
634}
635
636void USBDevice_::attach()
637{
638 _usbConfiguration = 0;
639 UHWCON = 0x01; // power internal reg
640 USBCON = (1<<USBE)|(1<<FRZCLK); // clock frozen, usb enabled
641 PLLCSR = 0x12; // Need 16 MHz xtal
642 while (!(PLLCSR & (1<<PLOCK))) // wait for lock pll
643 ;
644
645 // Some tests on specific versions of macosx (10.7.3), reported some
646 // strange behaviuors when the board is reset using the serial
647 // port touch at 1200 bps. This delay fixes this behaviour.
648 delay(1);
649
650 USBCON = ((1<<USBE)|(1<<OTGPADE)); // start USB clock
651 UDIEN = (1<<EORSTE)|(1<<SOFE); // Enable interrupts for EOR (End of Reset) and SOF (start of frame)
652 UDCON = 0; // enable attach resistor
653
654 TX_RX_LED_INIT;
655}
656
657void USBDevice_::detach()
658{
659}
660
661// Check for interrupts
662// TODO: VBUS detection
663bool USBDevice_::configured()
664{
665 return _usbConfiguration;
666}
667
668void USBDevice_::poll()
669{
670}
671
672#endif /* if defined(USBCON) */
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h
new file mode 100644
index 000000000..8d1380689
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h
@@ -0,0 +1,303 @@
1
2// Copyright (c) 2010, Peter Barrett
3/*
4** Permission to use, copy, modify, and/or distribute this software for
5** any purpose with or without fee is hereby granted, provided that the
6** above copyright notice and this permission notice appear in all copies.
7**
8** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
9** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
10** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
11** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
12** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
13** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
14** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
15** SOFTWARE.
16*/
17
18#ifndef __USBCORE_H__
19#define __USBCORE_H__
20
21// Standard requests
22#define GET_STATUS 0
23#define CLEAR_FEATURE 1
24#define SET_FEATURE 3
25#define SET_ADDRESS 5
26#define GET_DESCRIPTOR 6
27#define SET_DESCRIPTOR 7
28#define GET_CONFIGURATION 8
29#define SET_CONFIGURATION 9
30#define GET_INTERFACE 10
31#define SET_INTERFACE 11
32
33
34// bmRequestType
35#define REQUEST_HOSTTODEVICE 0x00
36#define REQUEST_DEVICETOHOST 0x80
37#define REQUEST_DIRECTION 0x80
38
39#define REQUEST_STANDARD 0x00
40#define REQUEST_CLASS 0x20
41#define REQUEST_VENDOR 0x40
42#define REQUEST_TYPE 0x60
43
44#define REQUEST_DEVICE 0x00
45#define REQUEST_INTERFACE 0x01
46#define REQUEST_ENDPOINT 0x02
47#define REQUEST_OTHER 0x03
48#define REQUEST_RECIPIENT 0x03
49
50#define REQUEST_DEVICETOHOST_CLASS_INTERFACE (REQUEST_DEVICETOHOST + REQUEST_CLASS + REQUEST_INTERFACE)
51#define REQUEST_HOSTTODEVICE_CLASS_INTERFACE (REQUEST_HOSTTODEVICE + REQUEST_CLASS + REQUEST_INTERFACE)
52
53// Class requests
54
55#define CDC_SET_LINE_CODING 0x20
56#define CDC_GET_LINE_CODING 0x21
57#define CDC_SET_CONTROL_LINE_STATE 0x22
58
59#define MSC_RESET 0xFF
60#define MSC_GET_MAX_LUN 0xFE
61
62#define HID_GET_REPORT 0x01
63#define HID_GET_IDLE 0x02
64#define HID_GET_PROTOCOL 0x03
65#define HID_SET_REPORT 0x09
66#define HID_SET_IDLE 0x0A
67#define HID_SET_PROTOCOL 0x0B
68
69// Descriptors
70
71#define USB_DEVICE_DESC_SIZE 18
72#define USB_CONFIGUARTION_DESC_SIZE 9
73#define USB_INTERFACE_DESC_SIZE 9
74#define USB_ENDPOINT_DESC_SIZE 7
75
76#define USB_DEVICE_DESCRIPTOR_TYPE 1
77#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
78#define USB_STRING_DESCRIPTOR_TYPE 3
79#define USB_INTERFACE_DESCRIPTOR_TYPE 4
80#define USB_ENDPOINT_DESCRIPTOR_TYPE 5
81
82#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
83#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03
84#define USB_DEVICE_CLASS_STORAGE 0x08
85#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
86
87#define USB_CONFIG_POWERED_MASK 0x40
88#define USB_CONFIG_BUS_POWERED 0x80
89#define USB_CONFIG_SELF_POWERED 0xC0
90#define USB_CONFIG_REMOTE_WAKEUP 0x20
91
92// bMaxPower in Configuration Descriptor
93#define USB_CONFIG_POWER_MA(mA) ((mA)/2)
94
95// bEndpointAddress in Endpoint Descriptor
96#define USB_ENDPOINT_DIRECTION_MASK 0x80
97#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
98#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
99
100#define USB_ENDPOINT_TYPE_MASK 0x03
101#define USB_ENDPOINT_TYPE_CONTROL 0x00
102#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
103#define USB_ENDPOINT_TYPE_BULK 0x02
104#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
105
106#define TOBYTES(x) ((x) & 0xFF),(((x) >> 8) & 0xFF)
107
108#define CDC_V1_10 0x0110
109#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02
110
111#define CDC_CALL_MANAGEMENT 0x01
112#define CDC_ABSTRACT_CONTROL_MODEL 0x02
113#define CDC_HEADER 0x00
114#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02
115#define CDC_UNION 0x06
116#define CDC_CS_INTERFACE 0x24
117#define CDC_CS_ENDPOINT 0x25
118#define CDC_DATA_INTERFACE_CLASS 0x0A
119
120#define MSC_SUBCLASS_SCSI 0x06
121#define MSC_PROTOCOL_BULK_ONLY 0x50
122
123#define HID_HID_DESCRIPTOR_TYPE 0x21
124#define HID_REPORT_DESCRIPTOR_TYPE 0x22
125#define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23
126
127
128// Device
129typedef struct {
130 u8 len; // 18
131 u8 dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE
132 u16 usbVersion; // 0x200
133 u8 deviceClass;
134 u8 deviceSubClass;
135 u8 deviceProtocol;
136 u8 packetSize0; // Packet 0
137 u16 idVendor;
138 u16 idProduct;
139 u16 deviceVersion; // 0x100
140 u8 iManufacturer;
141 u8 iProduct;
142 u8 iSerialNumber;
143 u8 bNumConfigurations;
144} DeviceDescriptor;
145
146// Config
147typedef struct {
148 u8 len; // 9
149 u8 dtype; // 2
150 u16 clen; // total length
151 u8 numInterfaces;
152 u8 config;
153 u8 iconfig;
154 u8 attributes;
155 u8 maxPower;
156} ConfigDescriptor;
157
158// String
159
160// Interface
161typedef struct
162{
163 u8 len; // 9
164 u8 dtype; // 4
165 u8 number;
166 u8 alternate;
167 u8 numEndpoints;
168 u8 interfaceClass;
169 u8 interfaceSubClass;
170 u8 protocol;
171 u8 iInterface;
172} InterfaceDescriptor;
173
174// Endpoint
175typedef struct
176{
177 u8 len; // 7
178 u8 dtype; // 5
179 u8 addr;
180 u8 attr;
181 u16 packetSize;
182 u8 interval;
183} EndpointDescriptor;
184
185// Interface Association Descriptor
186// Used to bind 2 interfaces together in CDC compostite device
187typedef struct
188{
189 u8 len; // 8
190 u8 dtype; // 11
191 u8 firstInterface;
192 u8 interfaceCount;
193 u8 functionClass;
194 u8 funtionSubClass;
195 u8 functionProtocol;
196 u8 iInterface;
197} IADDescriptor;
198
199// CDC CS interface descriptor
200typedef struct
201{
202 u8 len; // 5
203 u8 dtype; // 0x24
204 u8 subtype;
205 u8 d0;
206 u8 d1;
207} CDCCSInterfaceDescriptor;
208
209typedef struct
210{
211 u8 len; // 4
212 u8 dtype; // 0x24
213 u8 subtype;
214 u8 d0;
215} CDCCSInterfaceDescriptor4;
216
217typedef struct
218{
219 u8 len;
220 u8 dtype; // 0x24
221 u8 subtype; // 1
222 u8 bmCapabilities;
223 u8 bDataInterface;
224} CMFunctionalDescriptor;
225
226typedef struct
227{
228 u8 len;
229 u8 dtype; // 0x24
230 u8 subtype; // 1
231 u8 bmCapabilities;
232} ACMFunctionalDescriptor;
233
234typedef struct
235{
236 // IAD
237 IADDescriptor iad; // Only needed on compound device
238
239 // Control
240 InterfaceDescriptor cif; //
241 CDCCSInterfaceDescriptor header;
242 CMFunctionalDescriptor callManagement; // Call Management
243 ACMFunctionalDescriptor controlManagement; // ACM
244 CDCCSInterfaceDescriptor functionalDescriptor; // CDC_UNION
245 EndpointDescriptor cifin;
246
247 // Data
248 InterfaceDescriptor dif;
249 EndpointDescriptor in;
250 EndpointDescriptor out;
251} CDCDescriptor;
252
253typedef struct
254{
255 InterfaceDescriptor msc;
256 EndpointDescriptor in;
257 EndpointDescriptor out;
258} MSCDescriptor;
259
260typedef struct
261{
262 u8 len; // 9
263 u8 dtype; // 0x21
264 u8 addr;
265 u8 versionL; // 0x101
266 u8 versionH; // 0x101
267 u8 country;
268 u8 desctype; // 0x22 report
269 u8 descLenL;
270 u8 descLenH;
271} HIDDescDescriptor;
272
273typedef struct
274{
275 InterfaceDescriptor hid;
276 HIDDescDescriptor desc;
277 EndpointDescriptor in;
278} HIDDescriptor;
279
280
281#define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \
282 { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs }
283
284#define D_CONFIG(_totalLength,_interfaces) \
285 { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(500) }
286
287#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \
288 { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 }
289
290#define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \
291 { 7, 5, _addr,_attr,_packetSize, _interval }
292
293#define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \
294 { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 }
295
296#define D_HIDREPORT(_descriptorLength) \
297 { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 }
298
299#define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 }
300#define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 }
301
302
303#endif \ No newline at end of file
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h
new file mode 100644
index 000000000..229a638c5
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h
@@ -0,0 +1,63 @@
1
2
3/* Copyright (c) 2011, Peter Barrett
4**
5** Permission to use, copy, modify, and/or distribute this software for
6** any purpose with or without fee is hereby granted, provided that the
7** above copyright notice and this permission notice appear in all copies.
8**
9** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
12** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
13** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
14** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
15** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
16** SOFTWARE.
17*/
18
19//#define CDC_ENABLED
20//#define HID_ENABLED
21
22
23#ifdef CDC_ENABLED
24#define CDC_INTERFACE_COUNT 2
25#define CDC_ENPOINT_COUNT 3
26#else
27#define CDC_INTERFACE_COUNT 0
28#define CDC_ENPOINT_COUNT 0
29#endif
30
31#ifdef HID_ENABLED
32#define HID_INTERFACE_COUNT 1
33#define HID_ENPOINT_COUNT 1
34#else
35#define HID_INTERFACE_COUNT 0
36#define HID_ENPOINT_COUNT 0
37#endif
38
39#define CDC_ACM_INTERFACE 0 // CDC ACM
40#define CDC_DATA_INTERFACE 1 // CDC Data
41#define CDC_FIRST_ENDPOINT 1
42#define CDC_ENDPOINT_ACM (CDC_FIRST_ENDPOINT) // CDC First
43#define CDC_ENDPOINT_OUT (CDC_FIRST_ENDPOINT+1)
44#define CDC_ENDPOINT_IN (CDC_FIRST_ENDPOINT+2)
45
46#define HID_INTERFACE (CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT) // HID Interface
47#define HID_FIRST_ENDPOINT (CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT)
48#define HID_ENDPOINT_INT (HID_FIRST_ENDPOINT)
49
50#define INTERFACE_COUNT (MSC_INTERFACE + MSC_INTERFACE_COUNT)
51
52#ifdef CDC_ENABLED
53#define CDC_RX CDC_ENDPOINT_OUT
54#define CDC_TX CDC_ENDPOINT_IN
55#endif
56
57#ifdef HID_ENABLED
58#define HID_TX HID_ENDPOINT_INT
59#endif
60
61#define IMANUFACTURER 1
62#define IPRODUCT 2
63
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Udp.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Udp.h
new file mode 100644
index 000000000..dc5644b9d
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Udp.h
@@ -0,0 +1,88 @@
1/*
2 * Udp.cpp: Library to send/receive UDP packets.
3 *
4 * NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these)
5 * 1) UDP does not guarantee the order in which assembled UDP packets are received. This
6 * might not happen often in practice, but in larger network topologies, a UDP
7 * packet can be received out of sequence.
8 * 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being
9 * aware of it. Again, this may not be a concern in practice on small local networks.
10 * For more information, see http://www.cafeaulait.org/course/week12/35.html
11 *
12 * MIT License:
13 * Copyright (c) 2008 Bjoern Hartmann
14 * Permission is hereby granted, free of charge, to any person obtaining a copy
15 * of this software and associated documentation files (the "Software"), to deal
16 * in the Software without restriction, including without limitation the rights
17 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18 * copies of the Software, and to permit persons to whom the Software is
19 * furnished to do so, subject to the following conditions:
20 *
21 * The above copyright notice and this permission notice shall be included in
22 * all copies or substantial portions of the Software.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30 * THE SOFTWARE.
31 *
32 * bjoern@cs.stanford.edu 12/30/2008
33 */
34
35#ifndef udp_h
36#define udp_h
37
38#include <Stream.h>
39#include <IPAddress.h>
40
41class UDP : public Stream {
42
43public:
44 virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use
45 virtual void stop() =0; // Finish with the UDP socket
46
47 // Sending UDP packets
48
49 // Start building up a packet to send to the remote host specific in ip and port
50 // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port
51 virtual int beginPacket(IPAddress ip, uint16_t port) =0;
52 // Start building up a packet to send to the remote host specific in host and port
53 // Returns 1 if successful, 0 if there was a problem resolving the hostname or port
54 virtual int beginPacket(const char *host, uint16_t port) =0;
55 // Finish off this packet and send it
56 // Returns 1 if the packet was sent successfully, 0 if there was an error
57 virtual int endPacket() =0;
58 // Write a single byte into the packet
59 virtual size_t write(uint8_t) =0;
60 // Write size bytes from buffer into the packet
61 virtual size_t write(const uint8_t *buffer, size_t size) =0;
62
63 // Start processing the next available incoming packet
64 // Returns the size of the packet in bytes, or 0 if no packets are available
65 virtual int parsePacket() =0;
66 // Number of bytes remaining in the current packet
67 virtual int available() =0;
68 // Read a single byte from the current packet
69 virtual int read() =0;
70 // Read up to len bytes from the current packet and place them into buffer
71 // Returns the number of bytes read, or 0 if none are available
72 virtual int read(unsigned char* buffer, size_t len) =0;
73 // Read up to len characters from the current packet and place them into buffer
74 // Returns the number of characters read, or 0 if none are available
75 virtual int read(char* buffer, size_t len) =0;
76 // Return the next byte from the current packet without moving on to the next byte
77 virtual int peek() =0;
78 virtual void flush() =0; // Finish reading the current packet
79
80 // Return the IP address of the host who sent the current incoming packet
81 virtual IPAddress remoteIP() =0;
82 // Return the port of the host who sent the current incoming packet
83 virtual uint16_t remotePort() =0;
84protected:
85 uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); };
86};
87
88#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WCharacter.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WCharacter.h
new file mode 100644
index 000000000..79733b50a
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WCharacter.h
@@ -0,0 +1,168 @@
1/*
2 WCharacter.h - Character utility functions for Wiring & Arduino
3 Copyright (c) 2010 Hernando Barragan. All right reserved.
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20#ifndef Character_h
21#define Character_h
22
23#include <ctype.h>
24
25// WCharacter.h prototypes
26inline boolean isAlphaNumeric(int c) __attribute__((always_inline));
27inline boolean isAlpha(int c) __attribute__((always_inline));
28inline boolean isAscii(int c) __attribute__((always_inline));
29inline boolean isWhitespace(int c) __attribute__((always_inline));
30inline boolean isControl(int c) __attribute__((always_inline));
31inline boolean isDigit(int c) __attribute__((always_inline));
32inline boolean isGraph(int c) __attribute__((always_inline));
33inline boolean isLowerCase(int c) __attribute__((always_inline));
34inline boolean isPrintable(int c) __attribute__((always_inline));
35inline boolean isPunct(int c) __attribute__((always_inline));
36inline boolean isSpace(int c) __attribute__((always_inline));
37inline boolean isUpperCase(int c) __attribute__((always_inline));
38inline boolean isHexadecimalDigit(int c) __attribute__((always_inline));
39inline int toAscii(int c) __attribute__((always_inline));
40inline int toLowerCase(int c) __attribute__((always_inline));
41inline int toUpperCase(int c)__attribute__((always_inline));
42
43
44// Checks for an alphanumeric character.
45// It is equivalent to (isalpha(c) || isdigit(c)).
46inline boolean isAlphaNumeric(int c)
47{
48 return ( isalnum(c) == 0 ? false : true);
49}
50
51
52// Checks for an alphabetic character.
53// It is equivalent to (isupper(c) || islower(c)).
54inline boolean isAlpha(int c)
55{
56 return ( isalpha(c) == 0 ? false : true);
57}
58
59
60// Checks whether c is a 7-bit unsigned char value
61// that fits into the ASCII character set.
62inline boolean isAscii(int c)
63{
64 return ( isascii (c) == 0 ? false : true);
65}
66
67
68// Checks for a blank character, that is, a space or a tab.
69inline boolean isWhitespace(int c)
70{
71 return ( isblank (c) == 0 ? false : true);
72}
73
74
75// Checks for a control character.
76inline boolean isControl(int c)
77{
78 return ( iscntrl (c) == 0 ? false : true);
79}
80
81
82// Checks for a digit (0 through 9).
83inline boolean isDigit(int c)
84{
85 return ( isdigit (c) == 0 ? false : true);
86}
87
88
89// Checks for any printable character except space.
90inline boolean isGraph(int c)
91{
92 return ( isgraph (c) == 0 ? false : true);
93}
94
95
96// Checks for a lower-case character.
97inline boolean isLowerCase(int c)
98{
99 return (islower (c) == 0 ? false : true);
100}
101
102
103// Checks for any printable character including space.
104inline boolean isPrintable(int c)
105{
106 return ( isprint (c) == 0 ? false : true);
107}
108
109
110// Checks for any printable character which is not a space
111// or an alphanumeric character.
112inline boolean isPunct(int c)
113{
114 return ( ispunct (c) == 0 ? false : true);
115}
116
117
118// Checks for white-space characters. For the avr-libc library,
119// these are: space, formfeed ('\f'), newline ('\n'), carriage
120// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v').
121inline boolean isSpace(int c)
122{
123 return ( isspace (c) == 0 ? false : true);
124}
125
126
127// Checks for an uppercase letter.
128inline boolean isUpperCase(int c)
129{
130 return ( isupper (c) == 0 ? false : true);
131}
132
133
134// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7
135// 8 9 a b c d e f A B C D E F.
136inline boolean isHexadecimalDigit(int c)
137{
138 return ( isxdigit (c) == 0 ? false : true);
139}
140
141
142// Converts c to a 7-bit unsigned char value that fits into the
143// ASCII character set, by clearing the high-order bits.
144inline int toAscii(int c)
145{
146 return toascii (c);
147}
148
149
150// Warning:
151// Many people will be unhappy if you use this function.
152// This function will convert accented letters into random
153// characters.
154
155// Converts the letter c to lower case, if possible.
156inline int toLowerCase(int c)
157{
158 return tolower (c);
159}
160
161
162// Converts the letter c to upper case, if possible.
163inline int toUpperCase(int c)
164{
165 return toupper (c);
166}
167
168#endif \ No newline at end of file
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WInterrupts.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WInterrupts.c
new file mode 100644
index 000000000..8f3ec847f
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WInterrupts.c
@@ -0,0 +1,298 @@
1/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
3/*
4 Part of the Wiring project - http://wiring.uniandes.edu.co
5
6 Copyright (c) 2004-05 Hernando Barragan
7
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General
19 Public License along with this library; if not, write to the
20 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
21 Boston, MA 02111-1307 USA
22
23 Modified 24 November 2006 by David A. Mellis
24 Modified 1 August 2010 by Mark Sproul
25*/
26
27#include <inttypes.h>
28#include <avr/io.h>
29#include <avr/interrupt.h>
30#include <avr/pgmspace.h>
31#include <stdio.h>
32
33#include "wiring_private.h"
34
35static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS];
36// volatile static voidFuncPtr twiIntFunc;
37
38void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) {
39 if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
40 intFunc[interruptNum] = userFunc;
41
42 // Configure the interrupt mode (trigger on low input, any change, rising
43 // edge, or falling edge). The mode constants were chosen to correspond
44 // to the configuration bits in the hardware register, so we simply shift
45 // the mode into place.
46
47 // Enable the interrupt.
48
49 switch (interruptNum) {
50#if defined(__AVR_ATmega32U4__)
51 // I hate doing this, but the register assignment differs between the 1280/2560
52 // and the 32U4. Since avrlib defines registers PCMSK1 and PCMSK2 that aren't
53 // even present on the 32U4 this is the only way to distinguish between them.
54 case 0:
55 EICRA = (EICRA & ~((1<<ISC00) | (1<<ISC01))) | (mode << ISC00);
56 EIMSK |= (1<<INT0);
57 break;
58 case 1:
59 EICRA = (EICRA & ~((1<<ISC10) | (1<<ISC11))) | (mode << ISC10);
60 EIMSK |= (1<<INT1);
61 break;
62#elif defined(EICRA) && defined(EICRB) && defined(EIMSK)
63 case 2:
64 EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
65 EIMSK |= (1 << INT0);
66 break;
67 case 3:
68 EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
69 EIMSK |= (1 << INT1);
70 break;
71 case 4:
72 EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20);
73 EIMSK |= (1 << INT2);
74 break;
75 case 5:
76 EICRA = (EICRA & ~((1 << ISC30) | (1 << ISC31))) | (mode << ISC30);
77 EIMSK |= (1 << INT3);
78 break;
79 case 0:
80 EICRB = (EICRB & ~((1 << ISC40) | (1 << ISC41))) | (mode << ISC40);
81 EIMSK |= (1 << INT4);
82 break;
83 case 1:
84 EICRB = (EICRB & ~((1 << ISC50) | (1 << ISC51))) | (mode << ISC50);
85 EIMSK |= (1 << INT5);
86 break;
87 case 6:
88 EICRB = (EICRB & ~((1 << ISC60) | (1 << ISC61))) | (mode << ISC60);
89 EIMSK |= (1 << INT6);
90 break;
91 case 7:
92 EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70);
93 EIMSK |= (1 << INT7);
94 break;
95#else
96 case 0:
97 #if defined(EICRA) && defined(ISC00) && defined(EIMSK)
98 EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
99 EIMSK |= (1 << INT0);
100 #elif defined(MCUCR) && defined(ISC00) && defined(GICR)
101 MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
102 GICR |= (1 << INT0);
103 #elif defined(MCUCR) && defined(ISC00) && defined(GIMSK)
104 MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
105 GIMSK |= (1 << INT0);
106 #else
107 #error attachInterrupt not finished for this CPU (case 0)
108 #endif
109 break;
110
111 case 1:
112 #if defined(EICRA) && defined(ISC10) && defined(ISC11) && defined(EIMSK)
113 EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
114 EIMSK |= (1 << INT1);
115 #elif defined(MCUCR) && defined(ISC10) && defined(ISC11) && defined(GICR)
116 MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
117 GICR |= (1 << INT1);
118 #elif defined(MCUCR) && defined(ISC10) && defined(GIMSK) && defined(GIMSK)
119 MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
120 GIMSK |= (1 << INT1);
121 #else
122 #warning attachInterrupt may need some more work for this cpu (case 1)
123 #endif
124 break;
125
126 case 2:
127 #if defined(EICRA) && defined(ISC20) && defined(ISC21) && defined(EIMSK)
128 EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20);
129 EIMSK |= (1 << INT2);
130 #elif defined(MCUCR) && defined(ISC20) && defined(ISC21) && defined(GICR)
131 MCUCR = (MCUCR & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20);
132 GICR |= (1 << INT2);
133 #elif defined(MCUCR) && defined(ISC20) && defined(GIMSK) && defined(GIMSK)
134 MCUCR = (MCUCR & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20);
135 GIMSK |= (1 << INT2);
136 #endif
137 break;
138#endif
139 }
140 }
141}
142
143void detachInterrupt(uint8_t interruptNum) {
144 if(interruptNum < EXTERNAL_NUM_INTERRUPTS) {
145 // Disable the interrupt. (We can't assume that interruptNum is equal
146 // to the number of the EIMSK bit to clear, as this isn't true on the
147 // ATmega8. There, INT0 is 6 and INT1 is 7.)
148 switch (interruptNum) {
149#if defined(__AVR_ATmega32U4__)
150 case 0:
151 EIMSK &= ~(1<<INT0);
152 break;
153 case 1:
154 EIMSK &= ~(1<<INT1);
155 break;
156#elif defined(EICRA) && defined(EICRB) && defined(EIMSK)
157 case 2:
158 EIMSK &= ~(1 << INT0);
159 break;
160 case 3:
161 EIMSK &= ~(1 << INT1);
162 break;
163 case 4:
164 EIMSK &= ~(1 << INT2);
165 break;
166 case 5:
167 EIMSK &= ~(1 << INT3);
168 break;
169 case 0:
170 EIMSK &= ~(1 << INT4);
171 break;
172 case 1:
173 EIMSK &= ~(1 << INT5);
174 break;
175 case 6:
176 EIMSK &= ~(1 << INT6);
177 break;
178 case 7:
179 EIMSK &= ~(1 << INT7);
180 break;
181#else
182 case 0:
183 #if defined(EIMSK) && defined(INT0)
184 EIMSK &= ~(1 << INT0);
185 #elif defined(GICR) && defined(ISC00)
186 GICR &= ~(1 << INT0); // atmega32
187 #elif defined(GIMSK) && defined(INT0)
188 GIMSK &= ~(1 << INT0);
189 #else
190 #error detachInterrupt not finished for this cpu
191 #endif
192 break;
193
194 case 1:
195 #if defined(EIMSK) && defined(INT1)
196 EIMSK &= ~(1 << INT1);
197 #elif defined(GICR) && defined(INT1)
198 GICR &= ~(1 << INT1); // atmega32
199 #elif defined(GIMSK) && defined(INT1)
200 GIMSK &= ~(1 << INT1);
201 #else
202 #warning detachInterrupt may need some more work for this cpu (case 1)
203 #endif
204 break;
205#endif
206 }
207
208 intFunc[interruptNum] = 0;
209 }
210}
211
212/*
213void attachInterruptTwi(void (*userFunc)(void) ) {
214 twiIntFunc = userFunc;
215}
216*/
217
218#if defined(__AVR_ATmega32U4__)
219SIGNAL(INT0_vect) {
220 if(intFunc[EXTERNAL_INT_0])
221 intFunc[EXTERNAL_INT_0]();
222}
223
224SIGNAL(INT1_vect) {
225 if(intFunc[EXTERNAL_INT_1])
226 intFunc[EXTERNAL_INT_1]();
227}
228
229#elif defined(EICRA) && defined(EICRB)
230
231SIGNAL(INT0_vect) {
232 if(intFunc[EXTERNAL_INT_2])
233 intFunc[EXTERNAL_INT_2]();
234}
235
236SIGNAL(INT1_vect) {
237 if(intFunc[EXTERNAL_INT_3])
238 intFunc[EXTERNAL_INT_3]();
239}
240
241SIGNAL(INT2_vect) {
242 if(intFunc[EXTERNAL_INT_4])
243 intFunc[EXTERNAL_INT_4]();
244}
245
246SIGNAL(INT3_vect) {
247 if(intFunc[EXTERNAL_INT_5])
248 intFunc[EXTERNAL_INT_5]();
249}
250
251SIGNAL(INT4_vect) {
252 if(intFunc[EXTERNAL_INT_0])
253 intFunc[EXTERNAL_INT_0]();
254}
255
256SIGNAL(INT5_vect) {
257 if(intFunc[EXTERNAL_INT_1])
258 intFunc[EXTERNAL_INT_1]();
259}
260
261SIGNAL(INT6_vect) {
262 if(intFunc[EXTERNAL_INT_6])
263 intFunc[EXTERNAL_INT_6]();
264}
265
266SIGNAL(INT7_vect) {
267 if(intFunc[EXTERNAL_INT_7])
268 intFunc[EXTERNAL_INT_7]();
269}
270
271#else
272
273SIGNAL(INT0_vect) {
274 if(intFunc[EXTERNAL_INT_0])
275 intFunc[EXTERNAL_INT_0]();
276}
277
278SIGNAL(INT1_vect) {
279 if(intFunc[EXTERNAL_INT_1])
280 intFunc[EXTERNAL_INT_1]();
281}
282
283#if defined(EICRA) && defined(ISC20)
284SIGNAL(INT2_vect) {
285 if(intFunc[EXTERNAL_INT_2])
286 intFunc[EXTERNAL_INT_2]();
287}
288#endif
289
290#endif
291
292/*
293SIGNAL(SIG_2WIRE_SERIAL) {
294 if(twiIntFunc)
295 twiIntFunc();
296}
297*/
298
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WMath.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WMath.cpp
new file mode 100644
index 000000000..2120c4cc1
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WMath.cpp
@@ -0,0 +1,60 @@
1/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
3/*
4 Part of the Wiring project - http://wiring.org.co
5 Copyright (c) 2004-06 Hernando Barragan
6 Modified 13 August 2006, David A. Mellis for Arduino - http://www.arduino.cc/
7
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General
19 Public License along with this library; if not, write to the
20 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
21 Boston, MA 02111-1307 USA
22
23 $Id$
24*/
25
26extern "C" {
27 #include "stdlib.h"
28}
29
30void randomSeed(unsigned int seed)
31{
32 if (seed != 0) {
33 srandom(seed);
34 }
35}
36
37long random(long howbig)
38{
39 if (howbig == 0) {
40 return 0;
41 }
42 return random() % howbig;
43}
44
45long random(long howsmall, long howbig)
46{
47 if (howsmall >= howbig) {
48 return howsmall;
49 }
50 long diff = howbig - howsmall;
51 return random(diff) + howsmall;
52}
53
54long map(long x, long in_min, long in_max, long out_min, long out_max)
55{
56 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
57}
58
59unsigned int makeWord(unsigned int w) { return w; }
60unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; } \ No newline at end of file
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.cpp
new file mode 100644
index 000000000..c6839fc0d
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.cpp
@@ -0,0 +1,645 @@
1/*
2 WString.cpp - String library for Wiring & Arduino
3 ...mostly rewritten by Paul Stoffregen...
4 Copyright (c) 2009-10 Hernando Barragan. All rights reserved.
5 Copyright 2011, Paul Stoffregen, paul@pjrc.com
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20*/
21
22#include "WString.h"
23
24
25/*********************************************/
26/* Constructors */
27/*********************************************/
28
29String::String(const char *cstr)
30{
31 init();
32 if (cstr) copy(cstr, strlen(cstr));
33}
34
35String::String(const String &value)
36{
37 init();
38 *this = value;
39}
40
41#ifdef __GXX_EXPERIMENTAL_CXX0X__
42String::String(String &&rval)
43{
44 init();
45 move(rval);
46}
47String::String(StringSumHelper &&rval)
48{
49 init();
50 move(rval);
51}
52#endif
53
54String::String(char c)
55{
56 init();
57 char buf[2];
58 buf[0] = c;
59 buf[1] = 0;
60 *this = buf;
61}
62
63String::String(unsigned char value, unsigned char base)
64{
65 init();
66 char buf[9];
67 utoa(value, buf, base);
68 *this = buf;
69}
70
71String::String(int value, unsigned char base)
72{
73 init();
74 char buf[18];
75 itoa(value, buf, base);
76 *this = buf;
77}
78
79String::String(unsigned int value, unsigned char base)
80{
81 init();
82 char buf[17];
83 utoa(value, buf, base);
84 *this = buf;
85}
86
87String::String(long value, unsigned char base)
88{
89 init();
90 char buf[34];
91 ltoa(value, buf, base);
92 *this = buf;
93}
94
95String::String(unsigned long value, unsigned char base)
96{
97 init();
98 char buf[33];
99 ultoa(value, buf, base);
100 *this = buf;
101}
102
103String::~String()
104{
105 free(buffer);
106}
107
108/*********************************************/
109/* Memory Management */
110/*********************************************/
111
112inline void String::init(void)
113{
114 buffer = NULL;
115 capacity = 0;
116 len = 0;
117 flags = 0;
118}
119
120void String::invalidate(void)
121{
122 if (buffer) free(buffer);
123 buffer = NULL;
124 capacity = len = 0;
125}
126
127unsigned char String::reserve(unsigned int size)
128{
129 if (buffer && capacity >= size) return 1;
130 if (changeBuffer(size)) {
131 if (len == 0) buffer[0] = 0;
132 return 1;
133 }
134 return 0;
135}
136
137unsigned char String::changeBuffer(unsigned int maxStrLen)
138{
139 char *newbuffer = (char *)realloc(buffer, maxStrLen + 1);
140 if (newbuffer) {
141 buffer = newbuffer;
142 capacity = maxStrLen;
143 return 1;
144 }
145 return 0;
146}
147
148/*********************************************/
149/* Copy and Move */
150/*********************************************/
151
152String & String::copy(const char *cstr, unsigned int length)
153{
154 if (!reserve(length)) {
155 invalidate();
156 return *this;
157 }
158 len = length;
159 strcpy(buffer, cstr);
160 return *this;
161}
162
163#ifdef __GXX_EXPERIMENTAL_CXX0X__
164void String::move(String &rhs)
165{
166 if (buffer) {
167 if (capacity >= rhs.len) {
168 strcpy(buffer, rhs.buffer);
169 len = rhs.len;
170 rhs.len = 0;
171 return;
172 } else {
173 free(buffer);
174 }
175 }
176 buffer = rhs.buffer;
177 capacity = rhs.capacity;
178 len = rhs.len;
179 rhs.buffer = NULL;
180 rhs.capacity = 0;
181 rhs.len = 0;
182}
183#endif
184
185String & String::operator = (const String &rhs)
186{
187 if (this == &rhs) return *this;
188
189 if (rhs.buffer) copy(rhs.buffer, rhs.len);
190 else invalidate();
191
192 return *this;
193}
194
195#ifdef __GXX_EXPERIMENTAL_CXX0X__
196String & String::operator = (String &&rval)
197{
198 if (this != &rval) move(rval);
199 return *this;
200}
201
202String & String::operator = (StringSumHelper &&rval)
203{
204 if (this != &rval) move(rval);
205 return *this;
206}
207#endif
208
209String & String::operator = (const char *cstr)
210{
211 if (cstr) copy(cstr, strlen(cstr));
212 else invalidate();
213
214 return *this;
215}
216
217/*********************************************/
218/* concat */
219/*********************************************/
220
221unsigned char String::concat(const String &s)
222{
223 return concat(s.buffer, s.len);
224}
225
226unsigned char String::concat(const char *cstr, unsigned int length)
227{
228 unsigned int newlen = len + length;
229 if (!cstr) return 0;
230 if (length == 0) return 1;
231 if (!reserve(newlen)) return 0;
232 strcpy(buffer + len, cstr);
233 len = newlen;
234 return 1;
235}
236
237unsigned char String::concat(const char *cstr)
238{
239 if (!cstr) return 0;
240 return concat(cstr, strlen(cstr));
241}
242
243unsigned char String::concat(char c)
244{
245 char buf[2];
246 buf[0] = c;
247 buf[1] = 0;
248 return concat(buf, 1);
249}
250
251unsigned char String::concat(unsigned char num)
252{
253 char buf[4];
254 itoa(num, buf, 10);
255 return concat(buf, strlen(buf));
256}
257
258unsigned char String::concat(int num)
259{
260 char buf[7];
261 itoa(num, buf, 10);
262 return concat(buf, strlen(buf));
263}
264
265unsigned char String::concat(unsigned int num)
266{
267 char buf[6];
268 utoa(num, buf, 10);
269 return concat(buf, strlen(buf));
270}
271
272unsigned char String::concat(long num)
273{
274 char buf[12];
275 ltoa(num, buf, 10);
276 return concat(buf, strlen(buf));
277}
278
279unsigned char String::concat(unsigned long num)
280{
281 char buf[11];
282 ultoa(num, buf, 10);
283 return concat(buf, strlen(buf));
284}
285
286/*********************************************/
287/* Concatenate */
288/*********************************************/
289
290StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs)
291{
292 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
293 if (!a.concat(rhs.buffer, rhs.len)) a.invalidate();
294 return a;
295}
296
297StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr)
298{
299 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
300 if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate();
301 return a;
302}
303
304StringSumHelper & operator + (const StringSumHelper &lhs, char c)
305{
306 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
307 if (!a.concat(c)) a.invalidate();
308 return a;
309}
310
311StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num)
312{
313 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
314 if (!a.concat(num)) a.invalidate();
315 return a;
316}
317
318StringSumHelper & operator + (const StringSumHelper &lhs, int num)
319{
320 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
321 if (!a.concat(num)) a.invalidate();
322 return a;
323}
324
325StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num)
326{
327 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
328 if (!a.concat(num)) a.invalidate();
329 return a;
330}
331
332StringSumHelper & operator + (const StringSumHelper &lhs, long num)
333{
334 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
335 if (!a.concat(num)) a.invalidate();
336 return a;
337}
338
339StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
340{
341 StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
342 if (!a.concat(num)) a.invalidate();
343 return a;
344}
345
346/*********************************************/
347/* Comparison */
348/*********************************************/
349
350int String::compareTo(const String &s) const
351{
352 if (!buffer || !s.buffer) {
353 if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer;
354 if (buffer && len > 0) return *(unsigned char *)buffer;
355 return 0;
356 }
357 return strcmp(buffer, s.buffer);
358}
359
360unsigned char String::equals(const String &s2) const
361{
362 return (len == s2.len && compareTo(s2) == 0);
363}
364
365unsigned char String::equals(const char *cstr) const
366{
367 if (len == 0) return (cstr == NULL || *cstr == 0);
368 if (cstr == NULL) return buffer[0] == 0;
369 return strcmp(buffer, cstr) == 0;
370}
371
372unsigned char String::operator<(const String &rhs) const
373{
374 return compareTo(rhs) < 0;
375}
376
377unsigned char String::operator>(const String &rhs) const
378{
379 return compareTo(rhs) > 0;
380}
381
382unsigned char String::operator<=(const String &rhs) const
383{
384 return compareTo(rhs) <= 0;
385}
386
387unsigned char String::operator>=(const String &rhs) const
388{
389 return compareTo(rhs) >= 0;
390}
391
392unsigned char String::equalsIgnoreCase( const String &s2 ) const
393{
394 if (this == &s2) return 1;
395 if (len != s2.len) return 0;
396 if (len == 0) return 1;
397 const char *p1 = buffer;
398 const char *p2 = s2.buffer;
399 while (*p1) {
400 if (tolower(*p1++) != tolower(*p2++)) return 0;
401 }
402 return 1;
403}
404
405unsigned char String::startsWith( const String &s2 ) const
406{
407 if (len < s2.len) return 0;
408 return startsWith(s2, 0);
409}
410
411unsigned char String::startsWith( const String &s2, unsigned int offset ) const
412{
413 if (offset > len - s2.len || !buffer || !s2.buffer) return 0;
414 return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0;
415}
416
417unsigned char String::endsWith( const String &s2 ) const
418{
419 if ( len < s2.len || !buffer || !s2.buffer) return 0;
420 return strcmp(&buffer[len - s2.len], s2.buffer) == 0;
421}
422
423/*********************************************/
424/* Character Access */
425/*********************************************/
426
427char String::charAt(unsigned int loc) const
428{
429 return operator[](loc);
430}
431
432void String::setCharAt(unsigned int loc, char c)
433{
434 if (loc < len) buffer[loc] = c;
435}
436
437char & String::operator[](unsigned int index)
438{
439 static char dummy_writable_char;
440 if (index >= len || !buffer) {
441 dummy_writable_char = 0;
442 return dummy_writable_char;
443 }
444 return buffer[index];
445}
446
447char String::operator[]( unsigned int index ) const
448{
449 if (index >= len || !buffer) return 0;
450 return buffer[index];
451}
452
453void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const
454{
455 if (!bufsize || !buf) return;
456 if (index >= len) {
457 buf[0] = 0;
458 return;
459 }
460 unsigned int n = bufsize - 1;
461 if (n > len - index) n = len - index;
462 strncpy((char *)buf, buffer + index, n);
463 buf[n] = 0;
464}
465
466/*********************************************/
467/* Search */
468/*********************************************/
469
470int String::indexOf(char c) const
471{
472 return indexOf(c, 0);
473}
474
475int String::indexOf( char ch, unsigned int fromIndex ) const
476{
477 if (fromIndex >= len) return -1;
478 const char* temp = strchr(buffer + fromIndex, ch);
479 if (temp == NULL) return -1;
480 return temp - buffer;
481}
482
483int String::indexOf(const String &s2) const
484{
485 return indexOf(s2, 0);
486}
487
488int String::indexOf(const String &s2, unsigned int fromIndex) const
489{
490 if (fromIndex >= len) return -1;
491 const char *found = strstr(buffer + fromIndex, s2.buffer);
492 if (found == NULL) return -1;
493 return found - buffer;
494}
495
496int String::lastIndexOf( char theChar ) const
497{
498 return lastIndexOf(theChar, len - 1);
499}
500
501int String::lastIndexOf(char ch, unsigned int fromIndex) const
502{
503 if (fromIndex >= len) return -1;
504 char tempchar = buffer[fromIndex + 1];
505 buffer[fromIndex + 1] = '\0';
506 char* temp = strrchr( buffer, ch );
507 buffer[fromIndex + 1] = tempchar;
508 if (temp == NULL) return -1;
509 return temp - buffer;
510}
511
512int String::lastIndexOf(const String &s2) const
513{
514 return lastIndexOf(s2, len - s2.len);
515}
516
517int String::lastIndexOf(const String &s2, unsigned int fromIndex) const
518{
519 if (s2.len == 0 || len == 0 || s2.len > len) return -1;
520 if (fromIndex >= len) fromIndex = len - 1;
521 int found = -1;
522 for (char *p = buffer; p <= buffer + fromIndex; p++) {
523 p = strstr(p, s2.buffer);
524 if (!p) break;
525 if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer;
526 }
527 return found;
528}
529
530String String::substring( unsigned int left ) const
531{
532 return substring(left, len);
533}
534
535String String::substring(unsigned int left, unsigned int right) const
536{
537 if (left > right) {
538 unsigned int temp = right;
539 right = left;
540 left = temp;
541 }
542 String out;
543 if (left > len) return out;
544 if (right > len) right = len;
545 char temp = buffer[right]; // save the replaced character
546 buffer[right] = '\0';
547 out = buffer + left; // pointer arithmetic
548 buffer[right] = temp; //restore character
549 return out;
550}
551
552/*********************************************/
553/* Modification */
554/*********************************************/
555
556void String::replace(char find, char replace)
557{
558 if (!buffer) return;
559 for (char *p = buffer; *p; p++) {
560 if (*p == find) *p = replace;
561 }
562}
563
564void String::replace(const String& find, const String& replace)
565{
566 if (len == 0 || find.len == 0) return;
567 int diff = replace.len - find.len;
568 char *readFrom = buffer;
569 char *foundAt;
570 if (diff == 0) {
571 while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
572 memcpy(foundAt, replace.buffer, replace.len);
573 readFrom = foundAt + replace.len;
574 }
575 } else if (diff < 0) {
576 char *writeTo = buffer;
577 while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
578 unsigned int n = foundAt - readFrom;
579 memcpy(writeTo, readFrom, n);
580 writeTo += n;
581 memcpy(writeTo, replace.buffer, replace.len);
582 writeTo += replace.len;
583 readFrom = foundAt + find.len;
584 len += diff;
585 }
586 strcpy(writeTo, readFrom);
587 } else {
588 unsigned int size = len; // compute size needed for result
589 while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
590 readFrom = foundAt + find.len;
591 size += diff;
592 }
593 if (size == len) return;
594 if (size > capacity && !changeBuffer(size)) return; // XXX: tell user!
595 int index = len - 1;
596 while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
597 readFrom = buffer + index + find.len;
598 memmove(readFrom + diff, readFrom, len - (readFrom - buffer));
599 len += diff;
600 buffer[len] = 0;
601 memcpy(buffer + index, replace.buffer, replace.len);
602 index--;
603 }
604 }
605}
606
607void String::toLowerCase(void)
608{
609 if (!buffer) return;
610 for (char *p = buffer; *p; p++) {
611 *p = tolower(*p);
612 }
613}
614
615void String::toUpperCase(void)
616{
617 if (!buffer) return;
618 for (char *p = buffer; *p; p++) {
619 *p = toupper(*p);
620 }
621}
622
623void String::trim(void)
624{
625 if (!buffer || len == 0) return;
626 char *begin = buffer;
627 while (isspace(*begin)) begin++;
628 char *end = buffer + len - 1;
629 while (isspace(*end) && end >= begin) end--;
630 len = end + 1 - begin;
631 if (begin > buffer) memcpy(buffer, begin, len);
632 buffer[len] = 0;
633}
634
635/*********************************************/
636/* Parsing / Conversion */
637/*********************************************/
638
639long String::toInt(void) const
640{
641 if (buffer) return atol(buffer);
642 return 0;
643}
644
645
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.h
new file mode 100644
index 000000000..d76d2a33d
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.h
@@ -0,0 +1,205 @@
1/*
2 WString.h - String library for Wiring & Arduino
3 ...mostly rewritten by Paul Stoffregen...
4 Copyright (c) 2009-10 Hernando Barragan. All right reserved.
5 Copyright 2011, Paul Stoffregen, paul@pjrc.com
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20*/
21
22#ifndef String_class_h
23#define String_class_h
24#ifdef __cplusplus
25
26#include <stdlib.h>
27#include <string.h>
28#include <ctype.h>
29#include <avr/pgmspace.h>
30
31// When compiling programs with this class, the following gcc parameters
32// dramatically increase performance and memory (RAM) efficiency, typically
33// with little or no increase in code size.
34// -felide-constructors
35// -std=c++0x
36
37class __FlashStringHelper;
38#define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal)))
39
40// An inherited class for holding the result of a concatenation. These
41// result objects are assumed to be writable by subsequent concatenations.
42class StringSumHelper;
43
44// The string class
45class String
46{
47 // use a function pointer to allow for "if (s)" without the
48 // complications of an operator bool(). for more information, see:
49 // http://www.artima.com/cppsource/safebool.html
50 typedef void (String::*StringIfHelperType)() const;
51 void StringIfHelper() const {}
52
53public:
54 // constructors
55 // creates a copy of the initial value.
56 // if the initial value is null or invalid, or if memory allocation
57 // fails, the string will be marked as invalid (i.e. "if (s)" will
58 // be false).
59 String(const char *cstr = "");
60 String(const String &str);
61 #ifdef __GXX_EXPERIMENTAL_CXX0X__
62 String(String &&rval);
63 String(StringSumHelper &&rval);
64 #endif
65 explicit String(char c);
66 explicit String(unsigned char, unsigned char base=10);
67 explicit String(int, unsigned char base=10);
68 explicit String(unsigned int, unsigned char base=10);
69 explicit String(long, unsigned char base=10);
70 explicit String(unsigned long, unsigned char base=10);
71 ~String(void);
72
73 // memory management
74 // return true on success, false on failure (in which case, the string
75 // is left unchanged). reserve(0), if successful, will validate an
76 // invalid string (i.e., "if (s)" will be true afterwards)
77 unsigned char reserve(unsigned int size);
78 inline unsigned int length(void) const {return len;}
79
80 // creates a copy of the assigned value. if the value is null or
81 // invalid, or if the memory allocation fails, the string will be
82 // marked as invalid ("if (s)" will be false).
83 String & operator = (const String &rhs);
84 String & operator = (const char *cstr);
85 #ifdef __GXX_EXPERIMENTAL_CXX0X__
86 String & operator = (String &&rval);
87 String & operator = (StringSumHelper &&rval);
88 #endif
89
90 // concatenate (works w/ built-in types)
91
92 // returns true on success, false on failure (in which case, the string
93 // is left unchanged). if the argument is null or invalid, the
94 // concatenation is considered unsucessful.
95 unsigned char concat(const String &str);
96 unsigned char concat(const char *cstr);
97 unsigned char concat(char c);
98 unsigned char concat(unsigned char c);
99 unsigned char concat(int num);
100 unsigned char concat(unsigned int num);
101 unsigned char concat(long num);
102 unsigned char concat(unsigned long num);
103
104 // if there's not enough memory for the concatenated value, the string
105 // will be left unchanged (but this isn't signalled in any way)
106 String & operator += (const String &rhs) {concat(rhs); return (*this);}
107 String & operator += (const char *cstr) {concat(cstr); return (*this);}
108 String & operator += (char c) {concat(c); return (*this);}
109 String & operator += (unsigned char num) {concat(num); return (*this);}
110 String & operator += (int num) {concat(num); return (*this);}
111 String & operator += (unsigned int num) {concat(num); return (*this);}
112 String & operator += (long num) {concat(num); return (*this);}
113 String & operator += (unsigned long num) {concat(num); return (*this);}
114
115 friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs);
116 friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr);
117 friend StringSumHelper & operator + (const StringSumHelper &lhs, char c);
118 friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num);
119 friend StringSumHelper & operator + (const StringSumHelper &lhs, int num);
120 friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
121 friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
122 friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
123
124 // comparison (only works w/ Strings and "strings")
125 operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; }
126 int compareTo(const String &s) const;
127 unsigned char equals(const String &s) const;
128 unsigned char equals(const char *cstr) const;
129 unsigned char operator == (const String &rhs) const {return equals(rhs);}
130 unsigned char operator == (const char *cstr) const {return equals(cstr);}
131 unsigned char operator != (const String &rhs) const {return !equals(rhs);}
132 unsigned char operator != (const char *cstr) const {return !equals(cstr);}
133 unsigned char operator < (const String &rhs) const;
134 unsigned char operator > (const String &rhs) const;
135 unsigned char operator <= (const String &rhs) const;
136 unsigned char operator >= (const String &rhs) const;
137 unsigned char equalsIgnoreCase(const String &s) const;
138 unsigned char startsWith( const String &prefix) const;
139 unsigned char startsWith(const String &prefix, unsigned int offset) const;
140 unsigned char endsWith(const String &suffix) const;
141
142 // character acccess
143 char charAt(unsigned int index) const;
144 void setCharAt(unsigned int index, char c);
145 char operator [] (unsigned int index) const;
146 char& operator [] (unsigned int index);
147 void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const;
148 void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const
149 {getBytes((unsigned char *)buf, bufsize, index);}
150
151 // search
152 int indexOf( char ch ) const;
153 int indexOf( char ch, unsigned int fromIndex ) const;
154 int indexOf( const String &str ) const;
155 int indexOf( const String &str, unsigned int fromIndex ) const;
156 int lastIndexOf( char ch ) const;
157 int lastIndexOf( char ch, unsigned int fromIndex ) const;
158 int lastIndexOf( const String &str ) const;
159 int lastIndexOf( const String &str, unsigned int fromIndex ) const;
160 String substring( unsigned int beginIndex ) const;
161 String substring( unsigned int beginIndex, unsigned int endIndex ) const;
162
163 // modification
164 void replace(char find, char replace);
165 void replace(const String& find, const String& replace);
166 void toLowerCase(void);
167 void toUpperCase(void);
168 void trim(void);
169
170 // parsing/conversion
171 long toInt(void) const;
172
173protected:
174 char *buffer; // the actual char array
175 unsigned int capacity; // the array length minus one (for the '\0')
176 unsigned int len; // the String length (not counting the '\0')
177 unsigned char flags; // unused, for future features
178protected:
179 void init(void);
180 void invalidate(void);
181 unsigned char changeBuffer(unsigned int maxStrLen);
182 unsigned char concat(const char *cstr, unsigned int length);
183
184 // copy and move
185 String & copy(const char *cstr, unsigned int length);
186 #ifdef __GXX_EXPERIMENTAL_CXX0X__
187 void move(String &rhs);
188 #endif
189};
190
191class StringSumHelper : public String
192{
193public:
194 StringSumHelper(const String &s) : String(s) {}
195 StringSumHelper(const char *p) : String(p) {}
196 StringSumHelper(char c) : String(c) {}
197 StringSumHelper(unsigned char num) : String(num) {}
198 StringSumHelper(int num) : String(num) {}
199 StringSumHelper(unsigned int num) : String(num) {}
200 StringSumHelper(long num) : String(num) {}
201 StringSumHelper(unsigned long num) : String(num) {}
202};
203
204#endif // __cplusplus
205#endif // String_class_h
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/binary.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/binary.h
new file mode 100644
index 000000000..af1498033
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/binary.h
@@ -0,0 +1,515 @@
1#ifndef Binary_h
2#define Binary_h
3
4#define B0 0
5#define B00 0
6#define B000 0
7#define B0000 0
8#define B00000 0
9#define B000000 0
10#define B0000000 0
11#define B00000000 0
12#define B1 1
13#define B01 1
14#define B001 1
15#define B0001 1
16#define B00001 1
17#define B000001 1
18#define B0000001 1
19#define B00000001 1
20#define B10 2
21#define B010 2
22#define B0010 2
23#define B00010 2
24#define B000010 2
25#define B0000010 2
26#define B00000010 2
27#define B11 3
28#define B011 3
29#define B0011 3
30#define B00011 3
31#define B000011 3
32#define B0000011 3
33#define B00000011 3
34#define B100 4
35#define B0100 4
36#define B00100 4
37#define B000100 4
38#define B0000100 4
39#define B00000100 4
40#define B101 5
41#define B0101 5
42#define B00101 5
43#define B000101 5
44#define B0000101 5
45#define B00000101 5
46#define B110 6
47#define B0110 6
48#define B00110 6
49#define B000110 6
50#define B0000110 6
51#define B00000110 6
52#define B111 7
53#define B0111 7
54#define B00111 7
55#define B000111 7
56#define B0000111 7
57#define B00000111 7
58#define B1000 8
59#define B01000 8
60#define B001000 8
61#define B0001000 8
62#define B00001000 8
63#define B1001 9
64#define B01001 9
65#define B001001 9
66#define B0001001 9
67#define B00001001 9
68#define B1010 10
69#define B01010 10
70#define B001010 10
71#define B0001010 10
72#define B00001010 10
73#define B1011 11
74#define B01011 11
75#define B001011 11
76#define B0001011 11
77#define B00001011 11
78#define B1100 12
79#define B01100 12
80#define B001100 12
81#define B0001100 12
82#define B00001100 12
83#define B1101 13
84#define B01101 13
85#define B001101 13
86#define B0001101 13
87#define B00001101 13
88#define B1110 14
89#define B01110 14
90#define B001110 14
91#define B0001110 14
92#define B00001110 14
93#define B1111 15
94#define B01111 15
95#define B001111 15
96#define B0001111 15
97#define B00001111 15
98#define B10000 16
99#define B010000 16
100#define B0010000 16
101#define B00010000 16
102#define B10001 17
103#define B010001 17
104#define B0010001 17
105#define B00010001 17
106#define B10010 18
107#define B010010 18
108#define B0010010 18
109#define B00010010 18
110#define B10011 19
111#define B010011 19
112#define B0010011 19
113#define B00010011 19
114#define B10100 20
115#define B010100 20
116#define B0010100 20
117#define B00010100 20
118#define B10101 21
119#define B010101 21
120#define B0010101 21
121#define B00010101 21
122#define B10110 22
123#define B010110 22
124#define B0010110 22
125#define B00010110 22
126#define B10111 23
127#define B010111 23
128#define B0010111 23
129#define B00010111 23
130#define B11000 24
131#define B011000 24
132#define B0011000 24
133#define B00011000 24
134#define B11001 25
135#define B011001 25
136#define B0011001 25
137#define B00011001 25
138#define B11010 26
139#define B011010 26
140#define B0011010 26
141#define B00011010 26
142#define B11011 27
143#define B011011 27
144#define B0011011 27
145#define B00011011 27
146#define B11100 28
147#define B011100 28
148#define B0011100 28
149#define B00011100 28
150#define B11101 29
151#define B011101 29
152#define B0011101 29
153#define B00011101 29
154#define B11110 30
155#define B011110 30
156#define B0011110 30
157#define B00011110 30
158#define B11111 31
159#define B011111 31
160#define B0011111 31
161#define B00011111 31
162#define B100000 32
163#define B0100000 32
164#define B00100000 32
165#define B100001 33
166#define B0100001 33
167#define B00100001 33
168#define B100010 34
169#define B0100010 34
170#define B00100010 34
171#define B100011 35
172#define B0100011 35
173#define B00100011 35
174#define B100100 36
175#define B0100100 36
176#define B00100100 36
177#define B100101 37
178#define B0100101 37
179#define B00100101 37
180#define B100110 38
181#define B0100110 38
182#define B00100110 38
183#define B100111 39
184#define B0100111 39
185#define B00100111 39
186#define B101000 40
187#define B0101000 40
188#define B00101000 40
189#define B101001 41
190#define B0101001 41
191#define B00101001 41
192#define B101010 42
193#define B0101010 42
194#define B00101010 42
195#define B101011 43
196#define B0101011 43
197#define B00101011 43
198#define B101100 44
199#define B0101100 44
200#define B00101100 44
201#define B101101 45
202#define B0101101 45
203#define B00101101 45
204#define B101110 46
205#define B0101110 46
206#define B00101110 46
207#define B101111 47
208#define B0101111 47
209#define B00101111 47
210#define B110000 48
211#define B0110000 48
212#define B00110000 48
213#define B110001 49
214#define B0110001 49
215#define B00110001 49
216#define B110010 50
217#define B0110010 50
218#define B00110010 50
219#define B110011 51
220#define B0110011 51
221#define B00110011 51
222#define B110100 52
223#define B0110100 52
224#define B00110100 52
225#define B110101 53
226#define B0110101 53
227#define B00110101 53
228#define B110110 54
229#define B0110110 54
230#define B00110110 54
231#define B110111 55
232#define B0110111 55
233#define B00110111 55
234#define B111000 56
235#define B0111000 56
236#define B00111000 56
237#define B111001 57
238#define B0111001 57
239#define B00111001 57
240#define B111010 58
241#define B0111010 58
242#define B00111010 58
243#define B111011 59
244#define B0111011 59
245#define B00111011 59
246#define B111100 60
247#define B0111100 60
248#define B00111100 60
249#define B111101 61
250#define B0111101 61
251#define B00111101 61
252#define B111110 62
253#define B0111110 62
254#define B00111110 62
255#define B111111 63
256#define B0111111 63
257#define B00111111 63
258#define B1000000 64
259#define B01000000 64
260#define B1000001 65
261#define B01000001 65
262#define B1000010 66
263#define B01000010 66
264#define B1000011 67
265#define B01000011 67
266#define B1000100 68
267#define B01000100 68
268#define B1000101 69
269#define B01000101 69
270#define B1000110 70
271#define B01000110 70
272#define B1000111 71
273#define B01000111 71
274#define B1001000 72
275#define B01001000 72
276#define B1001001 73
277#define B01001001 73
278#define B1001010 74
279#define B01001010 74
280#define B1001011 75
281#define B01001011 75
282#define B1001100 76
283#define B01001100 76
284#define B1001101 77
285#define B01001101 77
286#define B1001110 78
287#define B01001110 78
288#define B1001111 79
289#define B01001111 79
290#define B1010000 80
291#define B01010000 80
292#define B1010001 81
293#define B01010001 81
294#define B1010010 82
295#define B01010010 82
296#define B1010011 83
297#define B01010011 83
298#define B1010100 84
299#define B01010100 84
300#define B1010101 85
301#define B01010101 85
302#define B1010110 86
303#define B01010110 86
304#define B1010111 87
305#define B01010111 87
306#define B1011000 88
307#define B01011000 88
308#define B1011001 89
309#define B01011001 89
310#define B1011010 90
311#define B01011010 90
312#define B1011011 91
313#define B01011011 91
314#define B1011100 92
315#define B01011100 92
316#define B1011101 93
317#define B01011101 93
318#define B1011110 94
319#define B01011110 94
320#define B1011111 95
321#define B01011111 95
322#define B1100000 96
323#define B01100000 96
324#define B1100001 97
325#define B01100001 97
326#define B1100010 98
327#define B01100010 98
328#define B1100011 99
329#define B01100011 99
330#define B1100100 100
331#define B01100100 100
332#define B1100101 101
333#define B01100101 101
334#define B1100110 102
335#define B01100110 102
336#define B1100111 103
337#define B01100111 103
338#define B1101000 104
339#define B01101000 104
340#define B1101001 105
341#define B01101001 105
342#define B1101010 106
343#define B01101010 106
344#define B1101011 107
345#define B01101011 107
346#define B1101100 108
347#define B01101100 108
348#define B1101101 109
349#define B01101101 109
350#define B1101110 110
351#define B01101110 110
352#define B1101111 111
353#define B01101111 111
354#define B1110000 112
355#define B01110000 112
356#define B1110001 113
357#define B01110001 113
358#define B1110010 114
359#define B01110010 114
360#define B1110011 115
361#define B01110011 115
362#define B1110100 116
363#define B01110100 116
364#define B1110101 117
365#define B01110101 117
366#define B1110110 118
367#define B01110110 118
368#define B1110111 119
369#define B01110111 119
370#define B1111000 120
371#define B01111000 120
372#define B1111001 121
373#define B01111001 121
374#define B1111010 122
375#define B01111010 122
376#define B1111011 123
377#define B01111011 123
378#define B1111100 124
379#define B01111100 124
380#define B1111101 125
381#define B01111101 125
382#define B1111110 126
383#define B01111110 126
384#define B1111111 127
385#define B01111111 127
386#define B10000000 128
387#define B10000001 129
388#define B10000010 130
389#define B10000011 131
390#define B10000100 132
391#define B10000101 133
392#define B10000110 134
393#define B10000111 135
394#define B10001000 136
395#define B10001001 137
396#define B10001010 138
397#define B10001011 139
398#define B10001100 140
399#define B10001101 141
400#define B10001110 142
401#define B10001111 143
402#define B10010000 144
403#define B10010001 145
404#define B10010010 146
405#define B10010011 147
406#define B10010100 148
407#define B10010101 149
408#define B10010110 150
409#define B10010111 151
410#define B10011000 152
411#define B10011001 153
412#define B10011010 154
413#define B10011011 155
414#define B10011100 156
415#define B10011101 157
416#define B10011110 158
417#define B10011111 159
418#define B10100000 160
419#define B10100001 161
420#define B10100010 162
421#define B10100011 163
422#define B10100100 164
423#define B10100101 165
424#define B10100110 166
425#define B10100111 167
426#define B10101000 168
427#define B10101001 169
428#define B10101010 170
429#define B10101011 171
430#define B10101100 172
431#define B10101101 173
432#define B10101110 174
433#define B10101111 175
434#define B10110000 176
435#define B10110001 177
436#define B10110010 178
437#define B10110011 179
438#define B10110100 180
439#define B10110101 181
440#define B10110110 182
441#define B10110111 183
442#define B10111000 184
443#define B10111001 185
444#define B10111010 186
445#define B10111011 187
446#define B10111100 188
447#define B10111101 189
448#define B10111110 190
449#define B10111111 191
450#define B11000000 192
451#define B11000001 193
452#define B11000010 194
453#define B11000011 195
454#define B11000100 196
455#define B11000101 197
456#define B11000110 198
457#define B11000111 199
458#define B11001000 200
459#define B11001001 201
460#define B11001010 202
461#define B11001011 203
462#define B11001100 204
463#define B11001101 205
464#define B11001110 206
465#define B11001111 207
466#define B11010000 208
467#define B11010001 209
468#define B11010010 210
469#define B11010011 211
470#define B11010100 212
471#define B11010101 213
472#define B11010110 214
473#define B11010111 215
474#define B11011000 216
475#define B11011001 217
476#define B11011010 218
477#define B11011011 219
478#define B11011100 220
479#define B11011101 221
480#define B11011110 222
481#define B11011111 223
482#define B11100000 224
483#define B11100001 225
484#define B11100010 226
485#define B11100011 227
486#define B11100100 228
487#define B11100101 229
488#define B11100110 230
489#define B11100111 231
490#define B11101000 232
491#define B11101001 233
492#define B11101010 234
493#define B11101011 235
494#define B11101100 236
495#define B11101101 237
496#define B11101110 238
497#define B11101111 239
498#define B11110000 240
499#define B11110001 241
500#define B11110010 242
501#define B11110011 243
502#define B11110100 244
503#define B11110101 245
504#define B11110110 246
505#define B11110111 247
506#define B11111000 248
507#define B11111001 249
508#define B11111010 250
509#define B11111011 251
510#define B11111100 252
511#define B11111101 253
512#define B11111110 254
513#define B11111111 255
514
515#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/main.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/main.cpp
new file mode 100644
index 000000000..3d4e079d2
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/main.cpp
@@ -0,0 +1,20 @@
1#include <Arduino.h>
2
3int main(void)
4{
5 init();
6
7#if defined(USBCON)
8 USBDevice.attach();
9#endif
10
11 setup();
12
13 for (;;) {
14 loop();
15 if (serialEventRun) serialEventRun();
16 }
17
18 return 0;
19}
20
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.cpp
new file mode 100644
index 000000000..0f6d4220e
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.cpp
@@ -0,0 +1,18 @@
1#include <new.h>
2
3void * operator new(size_t size)
4{
5 return malloc(size);
6}
7
8void operator delete(void * ptr)
9{
10 free(ptr);
11}
12
13int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);};
14void __cxa_guard_release (__guard *g) {*(char *)g = 1;};
15void __cxa_guard_abort (__guard *) {};
16
17void __cxa_pure_virtual(void) {};
18
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.h
new file mode 100644
index 000000000..cd940ce8b
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.h
@@ -0,0 +1,22 @@
1/* Header to define new/delete operators as they aren't provided by avr-gcc by default
2 Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453
3 */
4
5#ifndef NEW_H
6#define NEW_H
7
8#include <stdlib.h>
9
10void * operator new(size_t size);
11void operator delete(void * ptr);
12
13__extension__ typedef int __guard __attribute__((mode (__DI__)));
14
15extern "C" int __cxa_guard_acquire(__guard *);
16extern "C" void __cxa_guard_release (__guard *);
17extern "C" void __cxa_guard_abort (__guard *);
18
19extern "C" void __cxa_pure_virtual(void);
20
21#endif
22
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c
new file mode 100644
index 000000000..b1a4ce4b0
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c
@@ -0,0 +1,326 @@
1/*
2 wiring.c - Partial implementation of the Wiring API for the ATmega8.
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2005-2006 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id$
23*/
24
25#include "wiring_private.h"
26
27// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
28// the overflow handler is called every 256 ticks.
29#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))
30
31// the whole number of milliseconds per timer0 overflow
32#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)
33
34// the fractional number of milliseconds per timer0 overflow. we shift right
35// by three to fit these numbers into a byte. (for the clock speeds we care
36// about - 8 and 16 MHz - this doesn't lose precision.)
37#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
38#define FRACT_MAX (1000 >> 3)
39
40volatile unsigned long timer0_overflow_count = 0;
41volatile unsigned long timer0_millis = 0;
42static unsigned char timer0_fract = 0;
43
44#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
45SIGNAL(TIM0_OVF_vect)
46#else
47SIGNAL(TIMER0_OVF_vect)
48#endif
49{
50 // copy these to local variables so they can be stored in registers
51 // (volatile variables must be read from memory on every access)
52 unsigned long m = timer0_millis;
53 unsigned char f = timer0_fract;
54
55 m += MILLIS_INC;
56 f += FRACT_INC;
57 if (f >= FRACT_MAX) {
58 f -= FRACT_MAX;
59 m += 1;
60 }
61
62 timer0_fract = f;
63 timer0_millis = m;
64 timer0_overflow_count++;
65}
66
67unsigned long millis()
68{
69 unsigned long m;
70 uint8_t oldSREG = SREG;
71
72 // disable interrupts while we read timer0_millis or we might get an
73 // inconsistent value (e.g. in the middle of a write to timer0_millis)
74 cli();
75 m = timer0_millis;
76 SREG = oldSREG;
77
78 return m;
79}
80
81unsigned long micros() {
82 unsigned long m;
83 uint8_t oldSREG = SREG, t;
84
85 cli();
86 m = timer0_overflow_count;
87#if defined(TCNT0)
88 t = TCNT0;
89#elif defined(TCNT0L)
90 t = TCNT0L;
91#else
92 #error TIMER 0 not defined
93#endif
94
95
96#ifdef TIFR0
97 if ((TIFR0 & _BV(TOV0)) && (t < 255))
98 m++;
99#else
100 if ((TIFR & _BV(TOV0)) && (t < 255))
101 m++;
102#endif
103
104 SREG = oldSREG;
105
106 return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
107}
108
109void delay(unsigned long ms)
110{
111//PORTB &= ~(1<<0);
112 uint16_t start = (uint16_t)micros();
113
114 while (ms > 0) {
115 if (((uint16_t)micros() - start) >= 1000) {
116 ms--;
117 start += 1000;
118 }
119 }
120//PORTB |= (1<<0);
121}
122
123/* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock. */
124void delayMicroseconds(unsigned int us)
125{
126 // calling avrlib's delay_us() function with low values (e.g. 1 or
127 // 2 microseconds) gives delays longer than desired.
128 //delay_us(us);
129#if F_CPU >= 20000000L
130 // for the 20 MHz clock on rare Arduino boards
131
132 // for a one-microsecond delay, simply wait 2 cycle and return. The overhead
133 // of the function call yields a delay of exactly a one microsecond.
134 __asm__ __volatile__ (
135 "nop" "\n\t"
136 "nop"); //just waiting 2 cycle
137 if (--us == 0)
138 return;
139
140 // the following loop takes a 1/5 of a microsecond (4 cycles)
141 // per iteration, so execute it five times for each microsecond of
142 // delay requested.
143 us = (us<<2) + us; // x5 us
144
145 // account for the time taken in the preceeding commands.
146 us -= 2;
147
148#elif F_CPU >= 16000000L
149 // for the 16 MHz clock on most Arduino boards
150
151 // for a one-microsecond delay, simply return. the overhead
152 // of the function call yields a delay of approximately 1 1/8 us.
153 if (--us == 0)
154 return;
155
156 // the following loop takes a quarter of a microsecond (4 cycles)
157 // per iteration, so execute it four times for each microsecond of
158 // delay requested.
159 us <<= 2;
160
161 // account for the time taken in the preceeding commands.
162 us -= 2;
163#else
164 // for the 8 MHz internal clock on the ATmega168
165
166 // for a one- or two-microsecond delay, simply return. the overhead of
167 // the function calls takes more than two microseconds. can't just
168 // subtract two, since us is unsigned; we'd overflow.
169 if (--us == 0)
170 return;
171 if (--us == 0)
172 return;
173
174 // the following loop takes half of a microsecond (4 cycles)
175 // per iteration, so execute it twice for each microsecond of
176 // delay requested.
177 us <<= 1;
178
179 // partially compensate for the time taken by the preceeding commands.
180 // we can't subtract any more than this or we'd overflow w/ small delays.
181 us--;
182#endif
183
184 // busy wait
185 __asm__ __volatile__ (
186 "1: sbiw %0,1" "\n\t" // 2 cycles
187 "brne 1b" : "=w" (us) : "0" (us) // 2 cycles
188 );
189}
190
191void init()
192{
193 // this needs to be called before setup() or some functions won't
194 // work there
195 sei();
196
197 // on the ATmega168, timer 0 is also used for fast hardware pwm
198 // (using phase-correct PWM would mean that timer 0 overflowed half as often
199 // resulting in different millis() behavior on the ATmega8 and ATmega168)
200#if defined(TCCR0A) && defined(WGM01)
201 sbi(TCCR0A, WGM01);
202 sbi(TCCR0A, WGM00);
203#endif
204
205 // set timer 0 prescale factor to 64
206#if defined(__AVR_ATmega128__)
207 // CPU specific: different values for the ATmega128
208 sbi(TCCR0, CS02);
209#elif defined(TCCR0) && defined(CS01) && defined(CS00)
210 // this combination is for the standard atmega8
211 sbi(TCCR0, CS01);
212 sbi(TCCR0, CS00);
213#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
214 // this combination is for the standard 168/328/1280/2560
215 sbi(TCCR0B, CS01);
216 sbi(TCCR0B, CS00);
217#elif defined(TCCR0A) && defined(CS01) && defined(CS00)
218 // this combination is for the __AVR_ATmega645__ series
219 sbi(TCCR0A, CS01);
220 sbi(TCCR0A, CS00);
221#else
222 #error Timer 0 prescale factor 64 not set correctly
223#endif
224
225 // enable timer 0 overflow interrupt
226#if defined(TIMSK) && defined(TOIE0)
227 sbi(TIMSK, TOIE0);
228#elif defined(TIMSK0) && defined(TOIE0)
229 sbi(TIMSK0, TOIE0);
230#else
231 #error Timer 0 overflow interrupt not set correctly
232#endif
233
234 // timers 1 and 2 are used for phase-correct hardware pwm
235 // this is better for motors as it ensures an even waveform
236 // note, however, that fast pwm mode can achieve a frequency of up
237 // 8 MHz (with a 16 MHz clock) at 50% duty cycle
238
239#if defined(TCCR1B) && defined(CS11) && defined(CS10)
240 TCCR1B = 0;
241
242 // set timer 1 prescale factor to 64
243 sbi(TCCR1B, CS11);
244#if F_CPU >= 8000000L
245 sbi(TCCR1B, CS10);
246#endif
247#elif defined(TCCR1) && defined(CS11) && defined(CS10)
248 sbi(TCCR1, CS11);
249#if F_CPU >= 8000000L
250 sbi(TCCR1, CS10);
251#endif
252#endif
253 // put timer 1 in 8-bit phase correct pwm mode
254#if defined(TCCR1A) && defined(WGM10)
255 sbi(TCCR1A, WGM10);
256#elif defined(TCCR1)
257 #warning this needs to be finished
258#endif
259
260 // set timer 2 prescale factor to 64
261#if defined(TCCR2) && defined(CS22)
262 sbi(TCCR2, CS22);
263#elif defined(TCCR2B) && defined(CS22)
264 sbi(TCCR2B, CS22);
265#else
266 #warning Timer 2 not finished (may not be present on this CPU)
267#endif
268
269 // configure timer 2 for phase correct pwm (8-bit)
270#if defined(TCCR2) && defined(WGM20)
271 sbi(TCCR2, WGM20);
272#elif defined(TCCR2A) && defined(WGM20)
273 sbi(TCCR2A, WGM20);
274#else
275 #warning Timer 2 not finished (may not be present on this CPU)
276#endif
277
278#if defined(TCCR3B) && defined(CS31) && defined(WGM30)
279 sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64
280 sbi(TCCR3B, CS30);
281 sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode
282#endif
283
284#if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */
285 sbi(TCCR4B, CS42); // set timer4 prescale factor to 64
286 sbi(TCCR4B, CS41);
287 sbi(TCCR4B, CS40);
288 sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode
289 sbi(TCCR4A, PWM4A); // enable PWM mode for comparator OCR4A
290 sbi(TCCR4C, PWM4D); // enable PWM mode for comparator OCR4D
291#else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */
292#if defined(TCCR4B) && defined(CS41) && defined(WGM40)
293 sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64
294 sbi(TCCR4B, CS40);
295 sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode
296#endif
297#endif /* end timer4 block for ATMEGA1280/2560 and similar */
298
299#if defined(TCCR5B) && defined(CS51) && defined(WGM50)
300 sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64
301 sbi(TCCR5B, CS50);
302 sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode
303#endif
304
305#if defined(ADCSRA)
306 // set a2d prescale factor to 128
307 // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range.
308 // XXX: this will not work properly for other clock speeds, and
309 // this code should use F_CPU to determine the prescale factor.
310 sbi(ADCSRA, ADPS2);
311 sbi(ADCSRA, ADPS1);
312 sbi(ADCSRA, ADPS0);
313
314 // enable a2d conversions
315 sbi(ADCSRA, ADEN);
316#endif
317
318 // the bootloader connects pins 0 and 1 to the USART; disconnect them
319 // here so they can be used as normal digital i/o; they will be
320 // reconnected in Serial.begin()
321#if defined(UCSRB)
322 UCSRB = 0;
323#elif defined(UCSR0B)
324 UCSR0B = 0;
325#endif
326}
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_analog.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_analog.c
new file mode 100644
index 000000000..0e9881f6a
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_analog.c
@@ -0,0 +1,282 @@
1/*
2 wiring_analog.c - analog input and output
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2005-2006 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 Modified 28 September 2010 by Mark Sproul
23
24 $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
25*/
26
27#include "wiring_private.h"
28#include "pins_arduino.h"
29
30uint8_t analog_reference = DEFAULT;
31
32void analogReference(uint8_t mode)
33{
34 // can't actually set the register here because the default setting
35 // will connect AVCC and the AREF pin, which would cause a short if
36 // there's something connected to AREF.
37 analog_reference = mode;
38}
39
40int analogRead(uint8_t pin)
41{
42 uint8_t low, high;
43
44#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
45 if (pin >= 54) pin -= 54; // allow for channel or pin numbers
46#elif defined(__AVR_ATmega32U4__)
47 if (pin >= 18) pin -= 18; // allow for channel or pin numbers
48#elif defined(__AVR_ATmega1284__)
49 if (pin >= 24) pin -= 24; // allow for channel or pin numbers
50#else
51 if (pin >= 14) pin -= 14; // allow for channel or pin numbers
52#endif
53
54#if defined(__AVR_ATmega32U4__)
55 pin = analogPinToChannel(pin);
56 ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
57#elif defined(ADCSRB) && defined(MUX5)
58 // the MUX5 bit of ADCSRB selects whether we're reading from channels
59 // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
60 ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
61#endif
62
63 // set the analog reference (high two bits of ADMUX) and select the
64 // channel (low 4 bits). this also sets ADLAR (left-adjust result)
65 // to 0 (the default).
66#if defined(ADMUX)
67 ADMUX = (analog_reference << 6) | (pin & 0x07);
68#endif
69
70 // without a delay, we seem to read from the wrong channel
71 //delay(1);
72
73#if defined(ADCSRA) && defined(ADCL)
74 // start the conversion
75 sbi(ADCSRA, ADSC);
76
77 // ADSC is cleared when the conversion finishes
78 while (bit_is_set(ADCSRA, ADSC));
79
80 // we have to read ADCL first; doing so locks both ADCL
81 // and ADCH until ADCH is read. reading ADCL second would
82 // cause the results of each conversion to be discarded,
83 // as ADCL and ADCH would be locked when it completed.
84 low = ADCL;
85 high = ADCH;
86#else
87 // we dont have an ADC, return 0
88 low = 0;
89 high = 0;
90#endif
91
92 // combine the two bytes
93 return (high << 8) | low;
94}
95
96// Right now, PWM output only works on the pins with
97// hardware support. These are defined in the appropriate
98// pins_*.c file. For the rest of the pins, we default
99// to digital output.
100void analogWrite(uint8_t pin, int val)
101{
102 // We need to make sure the PWM output is enabled for those pins
103 // that support it, as we turn it off when digitally reading or
104 // writing with them. Also, make sure the pin is in output mode
105 // for consistenty with Wiring, which doesn't require a pinMode
106 // call for the analog output pins.
107 pinMode(pin, OUTPUT);
108 if (val == 0)
109 {
110 digitalWrite(pin, LOW);
111 }
112 else if (val == 255)
113 {
114 digitalWrite(pin, HIGH);
115 }
116 else
117 {
118 switch(digitalPinToTimer(pin))
119 {
120 // XXX fix needed for atmega8
121 #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__)
122 case TIMER0A:
123 // connect pwm to pin on timer 0
124 sbi(TCCR0, COM00);
125 OCR0 = val; // set pwm duty
126 break;
127 #endif
128
129 #if defined(TCCR0A) && defined(COM0A1)
130 case TIMER0A:
131 // connect pwm to pin on timer 0, channel A
132 sbi(TCCR0A, COM0A1);
133 OCR0A = val; // set pwm duty
134 break;
135 #endif
136
137 #if defined(TCCR0A) && defined(COM0B1)
138 case TIMER0B:
139 // connect pwm to pin on timer 0, channel B
140 sbi(TCCR0A, COM0B1);
141 OCR0B = val; // set pwm duty
142 break;
143 #endif
144
145 #if defined(TCCR1A) && defined(COM1A1)
146 case TIMER1A:
147 // connect pwm to pin on timer 1, channel A
148 sbi(TCCR1A, COM1A1);
149 OCR1A = val; // set pwm duty
150 break;
151 #endif
152
153 #if defined(TCCR1A) && defined(COM1B1)
154 case TIMER1B:
155 // connect pwm to pin on timer 1, channel B
156 sbi(TCCR1A, COM1B1);
157 OCR1B = val; // set pwm duty
158 break;
159 #endif
160
161 #if defined(TCCR2) && defined(COM21)
162 case TIMER2:
163 // connect pwm to pin on timer 2
164 sbi(TCCR2, COM21);
165 OCR2 = val; // set pwm duty
166 break;
167 #endif
168
169 #if defined(TCCR2A) && defined(COM2A1)
170 case TIMER2A:
171 // connect pwm to pin on timer 2, channel A
172 sbi(TCCR2A, COM2A1);
173 OCR2A = val; // set pwm duty
174 break;
175 #endif
176
177 #if defined(TCCR2A) && defined(COM2B1)
178 case TIMER2B:
179 // connect pwm to pin on timer 2, channel B
180 sbi(TCCR2A, COM2B1);
181 OCR2B = val; // set pwm duty
182 break;
183 #endif
184
185 #if defined(TCCR3A) && defined(COM3A1)
186 case TIMER3A:
187 // connect pwm to pin on timer 3, channel A
188 sbi(TCCR3A, COM3A1);
189 OCR3A = val; // set pwm duty
190 break;
191 #endif
192
193 #if defined(TCCR3A) && defined(COM3B1)
194 case TIMER3B:
195 // connect pwm to pin on timer 3, channel B
196 sbi(TCCR3A, COM3B1);
197 OCR3B = val; // set pwm duty
198 break;
199 #endif
200
201 #if defined(TCCR3A) && defined(COM3C1)
202 case TIMER3C:
203 // connect pwm to pin on timer 3, channel C
204 sbi(TCCR3A, COM3C1);
205 OCR3C = val; // set pwm duty
206 break;
207 #endif
208
209 #if defined(TCCR4A)
210 case TIMER4A:
211 //connect pwm to pin on timer 4, channel A
212 sbi(TCCR4A, COM4A1);
213 #if defined(COM4A0) // only used on 32U4
214 cbi(TCCR4A, COM4A0);
215 #endif
216 OCR4A = val; // set pwm duty
217 break;
218 #endif
219
220 #if defined(TCCR4A) && defined(COM4B1)
221 case TIMER4B:
222 // connect pwm to pin on timer 4, channel B
223 sbi(TCCR4A, COM4B1);
224 OCR4B = val; // set pwm duty
225 break;
226 #endif
227
228 #if defined(TCCR4A) && defined(COM4C1)
229 case TIMER4C:
230 // connect pwm to pin on timer 4, channel C
231 sbi(TCCR4A, COM4C1);
232 OCR4C = val; // set pwm duty
233 break;
234 #endif
235
236 #if defined(TCCR4C) && defined(COM4D1)
237 case TIMER4D:
238 // connect pwm to pin on timer 4, channel D
239 sbi(TCCR4C, COM4D1);
240 #if defined(COM4D0) // only used on 32U4
241 cbi(TCCR4C, COM4D0);
242 #endif
243 OCR4D = val; // set pwm duty
244 break;
245 #endif
246
247
248 #if defined(TCCR5A) && defined(COM5A1)
249 case TIMER5A:
250 // connect pwm to pin on timer 5, channel A
251 sbi(TCCR5A, COM5A1);
252 OCR5A = val; // set pwm duty
253 break;
254 #endif
255
256 #if defined(TCCR5A) && defined(COM5B1)
257 case TIMER5B:
258 // connect pwm to pin on timer 5, channel B
259 sbi(TCCR5A, COM5B1);
260 OCR5B = val; // set pwm duty
261 break;
262 #endif
263
264 #if defined(TCCR5A) && defined(COM5C1)
265 case TIMER5C:
266 // connect pwm to pin on timer 5, channel C
267 sbi(TCCR5A, COM5C1);
268 OCR5C = val; // set pwm duty
269 break;
270 #endif
271
272 case NOT_ON_TIMER:
273 default:
274 if (val < 128) {
275 digitalWrite(pin, LOW);
276 } else {
277 digitalWrite(pin, HIGH);
278 }
279 }
280 }
281}
282
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_digital.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_digital.c
new file mode 100644
index 000000000..be323b1df
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_digital.c
@@ -0,0 +1,178 @@
1/*
2 wiring_digital.c - digital input and output functions
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2005-2006 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 Modified 28 September 2010 by Mark Sproul
23
24 $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
25*/
26
27#define ARDUINO_MAIN
28#include "wiring_private.h"
29#include "pins_arduino.h"
30
31void pinMode(uint8_t pin, uint8_t mode)
32{
33 uint8_t bit = digitalPinToBitMask(pin);
34 uint8_t port = digitalPinToPort(pin);
35 volatile uint8_t *reg, *out;
36
37 if (port == NOT_A_PIN) return;
38
39 // JWS: can I let the optimizer do this?
40 reg = portModeRegister(port);
41 out = portOutputRegister(port);
42
43 if (mode == INPUT) {
44 uint8_t oldSREG = SREG;
45 cli();
46 *reg &= ~bit;
47 *out &= ~bit;
48 SREG = oldSREG;
49 } else if (mode == INPUT_PULLUP) {
50 uint8_t oldSREG = SREG;
51 cli();
52 *reg &= ~bit;
53 *out |= bit;
54 SREG = oldSREG;
55 } else {
56 uint8_t oldSREG = SREG;
57 cli();
58 *reg |= bit;
59 SREG = oldSREG;
60 }
61}
62
63// Forcing this inline keeps the callers from having to push their own stuff
64// on the stack. It is a good performance win and only takes 1 more byte per
65// user than calling. (It will take more bytes on the 168.)
66//
67// But shouldn't this be moved into pinMode? Seems silly to check and do on
68// each digitalread or write.
69//
70// Mark Sproul:
71// - Removed inline. Save 170 bytes on atmega1280
72// - changed to a switch statment; added 32 bytes but much easier to read and maintain.
73// - Added more #ifdefs, now compiles for atmega645
74//
75//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
76//static inline void turnOffPWM(uint8_t timer)
77static void turnOffPWM(uint8_t timer)
78{
79 switch (timer)
80 {
81 #if defined(TCCR1A) && defined(COM1A1)
82 case TIMER1A: cbi(TCCR1A, COM1A1); break;
83 #endif
84 #if defined(TCCR1A) && defined(COM1B1)
85 case TIMER1B: cbi(TCCR1A, COM1B1); break;
86 #endif
87
88 #if defined(TCCR2) && defined(COM21)
89 case TIMER2: cbi(TCCR2, COM21); break;
90 #endif
91
92 #if defined(TCCR0A) && defined(COM0A1)
93 case TIMER0A: cbi(TCCR0A, COM0A1); break;
94 #endif
95
96 #if defined(TIMER0B) && defined(COM0B1)
97 case TIMER0B: cbi(TCCR0A, COM0B1); break;
98 #endif
99 #if defined(TCCR2A) && defined(COM2A1)
100 case TIMER2A: cbi(TCCR2A, COM2A1); break;
101 #endif
102 #if defined(TCCR2A) && defined(COM2B1)
103 case TIMER2B: cbi(TCCR2A, COM2B1); break;
104 #endif
105
106 #if defined(TCCR3A) && defined(COM3A1)
107 case TIMER3A: cbi(TCCR3A, COM3A1); break;
108 #endif
109 #if defined(TCCR3A) && defined(COM3B1)
110 case TIMER3B: cbi(TCCR3A, COM3B1); break;
111 #endif
112 #if defined(TCCR3A) && defined(COM3C1)
113 case TIMER3C: cbi(TCCR3A, COM3C1); break;
114 #endif
115
116 #if defined(TCCR4A) && defined(COM4A1)
117 case TIMER4A: cbi(TCCR4A, COM4A1); break;
118 #endif
119 #if defined(TCCR4A) && defined(COM4B1)
120 case TIMER4B: cbi(TCCR4A, COM4B1); break;
121 #endif
122 #if defined(TCCR4A) && defined(COM4C1)
123 case TIMER4C: cbi(TCCR4A, COM4C1); break;
124 #endif
125 #if defined(TCCR4C) && defined(COM4D1)
126 case TIMER4D: cbi(TCCR4C, COM4D1); break;
127 #endif
128
129 #if defined(TCCR5A)
130 case TIMER5A: cbi(TCCR5A, COM5A1); break;
131 case TIMER5B: cbi(TCCR5A, COM5B1); break;
132 case TIMER5C: cbi(TCCR5A, COM5C1); break;
133 #endif
134 }
135}
136
137void digitalWrite(uint8_t pin, uint8_t val)
138{
139 uint8_t timer = digitalPinToTimer(pin);
140 uint8_t bit = digitalPinToBitMask(pin);
141 uint8_t port = digitalPinToPort(pin);
142 volatile uint8_t *out;
143
144 if (port == NOT_A_PIN) return;
145
146 // If the pin that support PWM output, we need to turn it off
147 // before doing a digital write.
148 if (timer != NOT_ON_TIMER) turnOffPWM(timer);
149
150 out = portOutputRegister(port);
151
152 uint8_t oldSREG = SREG;
153 cli();
154
155 if (val == LOW) {
156 *out &= ~bit;
157 } else {
158 *out |= bit;
159 }
160
161 SREG = oldSREG;
162}
163
164int digitalRead(uint8_t pin)
165{
166 uint8_t timer = digitalPinToTimer(pin);
167 uint8_t bit = digitalPinToBitMask(pin);
168 uint8_t port = digitalPinToPort(pin);
169
170 if (port == NOT_A_PIN) return LOW;
171
172 // If the pin that support PWM output, we need to turn it off
173 // before getting a digital reading.
174 if (timer != NOT_ON_TIMER) turnOffPWM(timer);
175
176 if (*portInputRegister(port) & bit) return HIGH;
177 return LOW;
178}
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_private.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_private.h
new file mode 100644
index 000000000..f0ceb0cc4
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_private.h
@@ -0,0 +1,69 @@
1/*
2 wiring_private.h - Internal header file.
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2005-2006 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id: wiring.h 239 2007-01-12 17:58:39Z mellis $
23*/
24
25#ifndef WiringPrivate_h
26#define WiringPrivate_h
27
28#include <avr/io.h>
29#include <avr/interrupt.h>
30#include <stdio.h>
31#include <stdarg.h>
32
33#include "Arduino.h"
34
35#ifdef __cplusplus
36extern "C"{
37#endif
38
39#ifndef cbi
40#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
41#endif
42#ifndef sbi
43#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
44#endif
45
46#define EXTERNAL_INT_0 0
47#define EXTERNAL_INT_1 1
48#define EXTERNAL_INT_2 2
49#define EXTERNAL_INT_3 3
50#define EXTERNAL_INT_4 4
51#define EXTERNAL_INT_5 5
52#define EXTERNAL_INT_6 6
53#define EXTERNAL_INT_7 7
54
55#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
56#define EXTERNAL_NUM_INTERRUPTS 8
57#elif defined(__AVR_ATmega1284P__)
58#define EXTERNAL_NUM_INTERRUPTS 3
59#else
60#define EXTERNAL_NUM_INTERRUPTS 2
61#endif
62
63typedef void (*voidFuncPtr)(void);
64
65#ifdef __cplusplus
66} // extern "C"
67#endif
68
69#endif
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_pulse.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_pulse.c
new file mode 100644
index 000000000..0d968865d
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_pulse.c
@@ -0,0 +1,69 @@
1/*
2 wiring_pulse.c - pulseIn() function
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2005-2006 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
23*/
24
25#include "wiring_private.h"
26#include "pins_arduino.h"
27
28/* Measures the length (in microseconds) of a pulse on the pin; state is HIGH
29 * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds
30 * to 3 minutes in length, but must be called at least a few dozen microseconds
31 * before the start of the pulse. */
32unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
33{
34 // cache the port and bit of the pin in order to speed up the
35 // pulse width measuring loop and achieve finer resolution. calling
36 // digitalRead() instead yields much coarser resolution.
37 uint8_t bit = digitalPinToBitMask(pin);
38 uint8_t port = digitalPinToPort(pin);
39 uint8_t stateMask = (state ? bit : 0);
40 unsigned long width = 0; // keep initialization out of time critical area
41
42 // convert the timeout from microseconds to a number of times through
43 // the initial loop; it takes 16 clock cycles per iteration.
44 unsigned long numloops = 0;
45 unsigned long maxloops = microsecondsToClockCycles(timeout) / 16;
46
47 // wait for any previous pulse to end
48 while ((*portInputRegister(port) & bit) == stateMask)
49 if (numloops++ == maxloops)
50 return 0;
51
52 // wait for the pulse to start
53 while ((*portInputRegister(port) & bit) != stateMask)
54 if (numloops++ == maxloops)
55 return 0;
56
57 // wait for the pulse to stop
58 while ((*portInputRegister(port) & bit) == stateMask) {
59 if (numloops++ == maxloops)
60 return 0;
61 width++;
62 }
63
64 // convert the reading to microseconds. The loop has been determined
65 // to be 20 clock cycles long and have about 16 clocks between the edge
66 // and the start of the loop. There will be some error introduced by
67 // the interrupt handlers.
68 return clockCyclesToMicroseconds(width * 21 + 16);
69}
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_shift.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_shift.c
new file mode 100644
index 000000000..cfe786758
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_shift.c
@@ -0,0 +1,55 @@
1/*
2 wiring_shift.c - shiftOut() function
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2005-2006 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
23*/
24
25#include "wiring_private.h"
26
27uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
28 uint8_t value = 0;
29 uint8_t i;
30
31 for (i = 0; i < 8; ++i) {
32 digitalWrite(clockPin, HIGH);
33 if (bitOrder == LSBFIRST)
34 value |= digitalRead(dataPin) << i;
35 else
36 value |= digitalRead(dataPin) << (7 - i);
37 digitalWrite(clockPin, LOW);
38 }
39 return value;
40}
41
42void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
43{
44 uint8_t i;
45
46 for (i = 0; i < 8; i++) {
47 if (bitOrder == LSBFIRST)
48 digitalWrite(dataPin, !!(val & (1 << i)));
49 else
50 digitalWrite(dataPin, !!(val & (1 << (7 - i))));
51
52 digitalWrite(clockPin, HIGH);
53 digitalWrite(clockPin, LOW);
54 }
55}
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/eightanaloginputs/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/eightanaloginputs/pins_arduino.h
new file mode 100644
index 000000000..52b37efc4
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/variants/eightanaloginputs/pins_arduino.h
@@ -0,0 +1,27 @@
1/*
2 pins_arduino.h - Pin definition functions for Arduino
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2007 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
23*/
24
25#include "../standard/pins_arduino.h"
26#undef NUM_ANALOG_INPUTS
27#define NUM_ANALOG_INPUTS 8
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/leonardo/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/leonardo/pins_arduino.h
new file mode 100644
index 000000000..9f770d6ce
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/variants/leonardo/pins_arduino.h
@@ -0,0 +1,256 @@
1/*
2 pins_arduino.h - Pin definition functions for Arduino
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2007 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
23*/
24
25#ifndef Pins_Arduino_h
26#define Pins_Arduino_h
27
28#include <avr/pgmspace.h>
29
30#define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0)
31#define TXLED0 PORTD |= (1<<5)
32#define TXLED1 PORTD &= ~(1<<5)
33#define RXLED0 PORTB |= (1<<0)
34#define RXLED1 PORTB &= ~(1<<0)
35
36static const uint8_t SDA = 2;
37static const uint8_t SCL = 3;
38
39// Map SPI port to 'new' pins D14..D17
40static const uint8_t SS = 17;
41static const uint8_t MOSI = 16;
42static const uint8_t MISO = 14;
43static const uint8_t SCK = 15;
44
45// Mapping of analog pins as digital I/O
46// A6-A11 share with digital pins
47static const uint8_t A0 = 18;
48static const uint8_t A1 = 19;
49static const uint8_t A2 = 20;
50static const uint8_t A3 = 21;
51static const uint8_t A4 = 22;
52static const uint8_t A5 = 23;
53static const uint8_t A6 = 24; // D4
54static const uint8_t A7 = 25; // D6
55static const uint8_t A8 = 26; // D8
56static const uint8_t A9 = 27; // D9
57static const uint8_t A10 = 28; // D10
58static const uint8_t A11 = 29; // D12
59
60#define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0))
61#define digitalPinToPCICRbit(p) 0
62#define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0))
63#define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4))))))
64
65// __AVR_ATmega32U4__ has an unusual mapping of pins to channels
66extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
67#define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) )
68
69#ifdef ARDUINO_MAIN
70
71// On the Arduino board, digital pins are also used
72// for the analog output (software PWM). Analog input
73// pins are a separate set.
74
75// ATMEL ATMEGA32U4 / ARDUINO LEONARDO
76//
77// D0 PD2 RXD1/INT2
78// D1 PD3 TXD1/INT3
79// D2 PD1 SDA SDA/INT1
80// D3# PD0 PWM8/SCL OC0B/SCL/INT0
81// D4 A6 PD4 ADC8
82// D5# PC6 ??? OC3A/#OC4A
83// D6# A7 PD7 FastPWM #OC4D/ADC10
84// D7 PE6 INT6/AIN0
85//
86// D8 A8 PB4 ADC11/PCINT4
87// D9# A9 PB5 PWM16 OC1A/#OC4B/ADC12/PCINT5
88// D10# A10 PB6 PWM16 OC1B/0c4B/ADC13/PCINT6
89// D11# PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7
90// D12 A11 PD6 T1/#OC4D/ADC9
91// D13# PC7 PWM10 CLK0/OC4A
92//
93// A0 D18 PF7 ADC7
94// A1 D19 PF6 ADC6
95// A2 D20 PF5 ADC5
96// A3 D21 PF4 ADC4
97// A4 D22 PF1 ADC1
98// A5 D23 PF0 ADC0
99//
100// New pins D14..D17 to map SPI port to digital pins
101//
102// MISO D14 PB3 MISO,PCINT3
103// SCK D15 PB1 SCK,PCINT1
104// MOSI D16 PB2 MOSI,PCINT2
105// SS D17 PB0 RXLED,SS/PCINT0
106//
107// TXLED PD5
108// RXLED PB0
109// HWB PE2 HWB
110
111// these arrays map port names (e.g. port B) to the
112// appropriate addresses for various functions (e.g. reading
113// and writing)
114const uint16_t PROGMEM port_to_mode_PGM[] = {
115 NOT_A_PORT,
116 NOT_A_PORT,
117 (uint16_t) &DDRB,
118 (uint16_t) &DDRC,
119 (uint16_t) &DDRD,
120 (uint16_t) &DDRE,
121 (uint16_t) &DDRF,
122};
123
124const uint16_t PROGMEM port_to_output_PGM[] = {
125 NOT_A_PORT,
126 NOT_A_PORT,
127 (uint16_t) &PORTB,
128 (uint16_t) &PORTC,
129 (uint16_t) &PORTD,
130 (uint16_t) &PORTE,
131 (uint16_t) &PORTF,
132};
133
134const uint16_t PROGMEM port_to_input_PGM[] = {
135 NOT_A_PORT,
136 NOT_A_PORT,
137 (uint16_t) &PINB,
138 (uint16_t) &PINC,
139 (uint16_t) &PIND,
140 (uint16_t) &PINE,
141 (uint16_t) &PINF,
142};
143
144const uint8_t PROGMEM digital_pin_to_port_PGM[30] = {
145 PD, // D0 - PD2
146 PD, // D1 - PD3
147 PD, // D2 - PD1
148 PD, // D3 - PD0
149 PD, // D4 - PD4
150 PC, // D5 - PC6
151 PD, // D6 - PD7
152 PE, // D7 - PE6
153
154 PB, // D8 - PB4
155 PB, // D9 - PB5
156 PB, // D10 - PB6
157 PB, // D11 - PB7
158 PD, // D12 - PD6
159 PC, // D13 - PC7
160
161 PB, // D14 - MISO - PB3
162 PB, // D15 - SCK - PB1
163 PB, // D16 - MOSI - PB2
164 PB, // D17 - SS - PB0
165
166 PF, // D18 - A0 - PF7
167 PF, // D19 - A1 - PF6
168 PF, // D20 - A2 - PF5
169 PF, // D21 - A3 - PF4
170 PF, // D22 - A4 - PF1
171 PF, // D23 - A5 - PF0
172
173 PD, // D24 / D4 - A6 - PD4
174 PD, // D25 / D6 - A7 - PD7
175 PB, // D26 / D8 - A8 - PB4
176 PB, // D27 / D9 - A9 - PB5
177 PB, // D28 / D10 - A10 - PB6
178 PD, // D29 / D12 - A11 - PD6
179};
180
181const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[30] = {
182 _BV(2), // D0 - PD2
183 _BV(3), // D1 - PD3
184 _BV(1), // D2 - PD1
185 _BV(0), // D3 - PD0
186 _BV(4), // D4 - PD4
187 _BV(6), // D5 - PC6
188 _BV(7), // D6 - PD7
189 _BV(6), // D7 - PE6
190
191 _BV(4), // D8 - PB4
192 _BV(5), // D9 - PB5
193 _BV(6), // D10 - PB6
194 _BV(7), // D11 - PB7
195 _BV(6), // D12 - PD6
196 _BV(7), // D13 - PC7
197
198 _BV(3), // D14 - MISO - PB3
199 _BV(1), // D15 - SCK - PB1
200 _BV(2), // D16 - MOSI - PB2
201 _BV(0), // D17 - SS - PB0
202
203 _BV(7), // D18 - A0 - PF7
204 _BV(6), // D19 - A1 - PF6
205 _BV(5), // D20 - A2 - PF5
206 _BV(4), // D21 - A3 - PF4
207 _BV(1), // D22 - A4 - PF1
208 _BV(0), // D23 - A5 - PF0
209
210 _BV(4), // D24 / D4 - A6 - PD4
211 _BV(7), // D25 / D6 - A7 - PD7
212 _BV(4), // D26 / D8 - A8 - PB4
213 _BV(5), // D27 / D9 - A9 - PB5
214 _BV(6), // D28 / D10 - A10 - PB6
215 _BV(6), // D29 / D12 - A11 - PD6
216};
217
218const uint8_t PROGMEM digital_pin_to_timer_PGM[16] = {
219 NOT_ON_TIMER,
220 NOT_ON_TIMER,
221 NOT_ON_TIMER,
222 TIMER0B, /* 3 */
223 NOT_ON_TIMER,
224 TIMER3A, /* 5 */
225 TIMER4D, /* 6 */
226 NOT_ON_TIMER,
227
228 NOT_ON_TIMER,
229 TIMER1A, /* 9 */
230 TIMER1B, /* 10 */
231 TIMER0A, /* 11 */
232
233 NOT_ON_TIMER,
234 TIMER4A, /* 13 */
235
236 NOT_ON_TIMER,
237 NOT_ON_TIMER,
238};
239
240const uint8_t PROGMEM analog_pin_to_channel_PGM[12] = {
241 7, // A0 PF7 ADC7
242 6, // A1 PF6 ADC6
243 5, // A2 PF5 ADC5
244 4, // A3 PF4 ADC4
245 1, // A4 PF1 ADC1
246 0, // A5 PF0 ADC0
247 8, // A6 D4 PD4 ADC8
248 10, // A7 D6 PD7 ADC10
249 11, // A8 D8 PB4 ADC11
250 12, // A9 D9 PB5 ADC12
251 13, // A10 D10 PB6 ADC13
252 9 // A11 D12 PD6 ADC9
253};
254
255#endif /* ARDUINO_MAIN */
256#endif /* Pins_Arduino_h */
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/mega/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/mega/pins_arduino.h
new file mode 100644
index 000000000..5a9b4cb09
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/variants/mega/pins_arduino.h
@@ -0,0 +1,363 @@
1/*
2 pins_arduino.h - Pin definition functions for Arduino
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2007 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
23*/
24
25#ifndef Pins_Arduino_h
26#define Pins_Arduino_h
27
28#include <avr/pgmspace.h>
29
30#define NUM_DIGITAL_PINS 70
31#define NUM_ANALOG_INPUTS 16
32#define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1)
33#define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46))
34
35static const uint8_t SS = 53;
36static const uint8_t MOSI = 51;
37static const uint8_t MISO = 50;
38static const uint8_t SCK = 52;
39
40static const uint8_t SDA = 20;
41static const uint8_t SCL = 21;
42static const uint8_t LED_BUILTIN = 13;
43
44static const uint8_t A0 = 54;
45static const uint8_t A1 = 55;
46static const uint8_t A2 = 56;
47static const uint8_t A3 = 57;
48static const uint8_t A4 = 58;
49static const uint8_t A5 = 59;
50static const uint8_t A6 = 60;
51static const uint8_t A7 = 61;
52static const uint8_t A8 = 62;
53static const uint8_t A9 = 63;
54static const uint8_t A10 = 64;
55static const uint8_t A11 = 65;
56static const uint8_t A12 = 66;
57static const uint8_t A13 = 67;
58static const uint8_t A14 = 68;
59static const uint8_t A15 = 69;
60
61// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins)
62// Only pins available for RECEIVE (TRANSMIT can be on any pin):
63// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me)
64// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
65
66#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \
67 (((p) >= 50) && ((p) <= 53)) || \
68 (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) )
69
70#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \
71 ( (((p) >= 62) && ((p) <= 69)) ? 2 : \
72 0 ) )
73
74#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \
75 ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \
76 ((uint8_t *)0) ) )
77
78#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \
79 ( ((p) == 50) ? 3 : \
80 ( ((p) == 51) ? 2 : \
81 ( ((p) == 52) ? 1 : \
82 ( ((p) == 53) ? 0 : \
83 ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \
84 0 ) ) ) ) ) )
85
86#ifdef ARDUINO_MAIN
87
88const uint16_t PROGMEM port_to_mode_PGM[] = {
89 NOT_A_PORT,
90 (uint16_t) &DDRA,
91 (uint16_t) &DDRB,
92 (uint16_t) &DDRC,
93 (uint16_t) &DDRD,
94 (uint16_t) &DDRE,
95 (uint16_t) &DDRF,
96 (uint16_t) &DDRG,
97 (uint16_t) &DDRH,
98 NOT_A_PORT,
99 (uint16_t) &DDRJ,
100 (uint16_t) &DDRK,
101 (uint16_t) &DDRL,
102};
103
104const uint16_t PROGMEM port_to_output_PGM[] = {
105 NOT_A_PORT,
106 (uint16_t) &PORTA,
107 (uint16_t) &PORTB,
108 (uint16_t) &PORTC,
109 (uint16_t) &PORTD,
110 (uint16_t) &PORTE,
111 (uint16_t) &PORTF,
112 (uint16_t) &PORTG,
113 (uint16_t) &PORTH,
114 NOT_A_PORT,
115 (uint16_t) &PORTJ,
116 (uint16_t) &PORTK,
117 (uint16_t) &PORTL,
118};
119
120const uint16_t PROGMEM port_to_input_PGM[] = {
121 NOT_A_PIN,
122 (uint16_t) &PINA,
123 (uint16_t) &PINB,
124 (uint16_t) &PINC,
125 (uint16_t) &PIND,
126 (uint16_t) &PINE,
127 (uint16_t) &PINF,
128 (uint16_t) &PING,
129 (uint16_t) &PINH,
130 NOT_A_PIN,
131 (uint16_t) &PINJ,
132 (uint16_t) &PINK,
133 (uint16_t) &PINL,
134};
135
136const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
137 // PORTLIST
138 // -------------------------------------------
139 PE , // PE 0 ** 0 ** USART0_RX
140 PE , // PE 1 ** 1 ** USART0_TX
141 PE , // PE 4 ** 2 ** PWM2
142 PE , // PE 5 ** 3 ** PWM3
143 PG , // PG 5 ** 4 ** PWM4
144 PE , // PE 3 ** 5 ** PWM5
145 PH , // PH 3 ** 6 ** PWM6
146 PH , // PH 4 ** 7 ** PWM7
147 PH , // PH 5 ** 8 ** PWM8
148 PH , // PH 6 ** 9 ** PWM9
149 PB , // PB 4 ** 10 ** PWM10
150 PB , // PB 5 ** 11 ** PWM11
151 PB , // PB 6 ** 12 ** PWM12
152 PB , // PB 7 ** 13 ** PWM13
153 PJ , // PJ 1 ** 14 ** USART3_TX
154 PJ , // PJ 0 ** 15 ** USART3_RX
155 PH , // PH 1 ** 16 ** USART2_TX
156 PH , // PH 0 ** 17 ** USART2_RX
157 PD , // PD 3 ** 18 ** USART1_TX
158 PD , // PD 2 ** 19 ** USART1_RX
159 PD , // PD 1 ** 20 ** I2C_SDA
160 PD , // PD 0 ** 21 ** I2C_SCL
161 PA , // PA 0 ** 22 ** D22
162 PA , // PA 1 ** 23 ** D23
163 PA , // PA 2 ** 24 ** D24
164 PA , // PA 3 ** 25 ** D25
165 PA , // PA 4 ** 26 ** D26
166 PA , // PA 5 ** 27 ** D27
167 PA , // PA 6 ** 28 ** D28
168 PA , // PA 7 ** 29 ** D29
169 PC , // PC 7 ** 30 ** D30
170 PC , // PC 6 ** 31 ** D31
171 PC , // PC 5 ** 32 ** D32
172 PC , // PC 4 ** 33 ** D33
173 PC , // PC 3 ** 34 ** D34
174 PC , // PC 2 ** 35 ** D35
175 PC , // PC 1 ** 36 ** D36
176 PC , // PC 0 ** 37 ** D37
177 PD , // PD 7 ** 38 ** D38
178 PG , // PG 2 ** 39 ** D39
179 PG , // PG 1 ** 40 ** D40
180 PG , // PG 0 ** 41 ** D41
181 PL , // PL 7 ** 42 ** D42
182 PL , // PL 6 ** 43 ** D43
183 PL , // PL 5 ** 44 ** D44
184 PL , // PL 4 ** 45 ** D45
185 PL , // PL 3 ** 46 ** D46
186 PL , // PL 2 ** 47 ** D47
187 PL , // PL 1 ** 48 ** D48
188 PL , // PL 0 ** 49 ** D49
189 PB , // PB 3 ** 50 ** SPI_MISO
190 PB , // PB 2 ** 51 ** SPI_MOSI
191 PB , // PB 1 ** 52 ** SPI_SCK
192 PB , // PB 0 ** 53 ** SPI_SS
193 PF , // PF 0 ** 54 ** A0
194 PF , // PF 1 ** 55 ** A1
195 PF , // PF 2 ** 56 ** A2
196 PF , // PF 3 ** 57 ** A3
197 PF , // PF 4 ** 58 ** A4
198 PF , // PF 5 ** 59 ** A5
199 PF , // PF 6 ** 60 ** A6
200 PF , // PF 7 ** 61 ** A7
201 PK , // PK 0 ** 62 ** A8
202 PK , // PK 1 ** 63 ** A9
203 PK , // PK 2 ** 64 ** A10
204 PK , // PK 3 ** 65 ** A11
205 PK , // PK 4 ** 66 ** A12
206 PK , // PK 5 ** 67 ** A13
207 PK , // PK 6 ** 68 ** A14
208 PK , // PK 7 ** 69 ** A15
209};
210
211const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
212 // PIN IN PORT
213 // -------------------------------------------
214 _BV( 0 ) , // PE 0 ** 0 ** USART0_RX
215 _BV( 1 ) , // PE 1 ** 1 ** USART0_TX
216 _BV( 4 ) , // PE 4 ** 2 ** PWM2
217 _BV( 5 ) , // PE 5 ** 3 ** PWM3
218 _BV( 5 ) , // PG 5 ** 4 ** PWM4
219 _BV( 3 ) , // PE 3 ** 5 ** PWM5
220 _BV( 3 ) , // PH 3 ** 6 ** PWM6
221 _BV( 4 ) , // PH 4 ** 7 ** PWM7
222 _BV( 5 ) , // PH 5 ** 8 ** PWM8
223 _BV( 6 ) , // PH 6 ** 9 ** PWM9
224 _BV( 4 ) , // PB 4 ** 10 ** PWM10
225 _BV( 5 ) , // PB 5 ** 11 ** PWM11
226 _BV( 6 ) , // PB 6 ** 12 ** PWM12
227 _BV( 7 ) , // PB 7 ** 13 ** PWM13
228 _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX
229 _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX
230 _BV( 1 ) , // PH 1 ** 16 ** USART2_TX
231 _BV( 0 ) , // PH 0 ** 17 ** USART2_RX
232 _BV( 3 ) , // PD 3 ** 18 ** USART1_TX
233 _BV( 2 ) , // PD 2 ** 19 ** USART1_RX
234 _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA
235 _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL
236 _BV( 0 ) , // PA 0 ** 22 ** D22
237 _BV( 1 ) , // PA 1 ** 23 ** D23
238 _BV( 2 ) , // PA 2 ** 24 ** D24
239 _BV( 3 ) , // PA 3 ** 25 ** D25
240 _BV( 4 ) , // PA 4 ** 26 ** D26
241 _BV( 5 ) , // PA 5 ** 27 ** D27
242 _BV( 6 ) , // PA 6 ** 28 ** D28
243 _BV( 7 ) , // PA 7 ** 29 ** D29
244 _BV( 7 ) , // PC 7 ** 30 ** D30
245 _BV( 6 ) , // PC 6 ** 31 ** D31
246 _BV( 5 ) , // PC 5 ** 32 ** D32
247 _BV( 4 ) , // PC 4 ** 33 ** D33
248 _BV( 3 ) , // PC 3 ** 34 ** D34
249 _BV( 2 ) , // PC 2 ** 35 ** D35
250 _BV( 1 ) , // PC 1 ** 36 ** D36
251 _BV( 0 ) , // PC 0 ** 37 ** D37
252 _BV( 7 ) , // PD 7 ** 38 ** D38
253 _BV( 2 ) , // PG 2 ** 39 ** D39
254 _BV( 1 ) , // PG 1 ** 40 ** D40
255 _BV( 0 ) , // PG 0 ** 41 ** D41
256 _BV( 7 ) , // PL 7 ** 42 ** D42
257 _BV( 6 ) , // PL 6 ** 43 ** D43
258 _BV( 5 ) , // PL 5 ** 44 ** D44
259 _BV( 4 ) , // PL 4 ** 45 ** D45
260 _BV( 3 ) , // PL 3 ** 46 ** D46
261 _BV( 2 ) , // PL 2 ** 47 ** D47
262 _BV( 1 ) , // PL 1 ** 48 ** D48
263 _BV( 0 ) , // PL 0 ** 49 ** D49
264 _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO
265 _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI
266 _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK
267 _BV( 0 ) , // PB 0 ** 53 ** SPI_SS
268 _BV( 0 ) , // PF 0 ** 54 ** A0
269 _BV( 1 ) , // PF 1 ** 55 ** A1
270 _BV( 2 ) , // PF 2 ** 56 ** A2
271 _BV( 3 ) , // PF 3 ** 57 ** A3
272 _BV( 4 ) , // PF 4 ** 58 ** A4
273 _BV( 5 ) , // PF 5 ** 59 ** A5
274 _BV( 6 ) , // PF 6 ** 60 ** A6
275 _BV( 7 ) , // PF 7 ** 61 ** A7
276 _BV( 0 ) , // PK 0 ** 62 ** A8
277 _BV( 1 ) , // PK 1 ** 63 ** A9
278 _BV( 2 ) , // PK 2 ** 64 ** A10
279 _BV( 3 ) , // PK 3 ** 65 ** A11
280 _BV( 4 ) , // PK 4 ** 66 ** A12
281 _BV( 5 ) , // PK 5 ** 67 ** A13
282 _BV( 6 ) , // PK 6 ** 68 ** A14
283 _BV( 7 ) , // PK 7 ** 69 ** A15
284};
285
286const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
287 // TIMERS
288 // -------------------------------------------
289 NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX
290 NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX
291 TIMER3B , // PE 4 ** 2 ** PWM2
292 TIMER3C , // PE 5 ** 3 ** PWM3
293 TIMER0B , // PG 5 ** 4 ** PWM4
294 TIMER3A , // PE 3 ** 5 ** PWM5
295 TIMER4A , // PH 3 ** 6 ** PWM6
296 TIMER4B , // PH 4 ** 7 ** PWM7
297 TIMER4C , // PH 5 ** 8 ** PWM8
298 TIMER2B , // PH 6 ** 9 ** PWM9
299 TIMER2A , // PB 4 ** 10 ** PWM10
300 TIMER1A , // PB 5 ** 11 ** PWM11
301 TIMER1B , // PB 6 ** 12 ** PWM12
302 TIMER0A , // PB 7 ** 13 ** PWM13
303 NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX
304 NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX
305 NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX
306 NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX
307 NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX
308 NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX
309 NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA
310 NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL
311 NOT_ON_TIMER , // PA 0 ** 22 ** D22
312 NOT_ON_TIMER , // PA 1 ** 23 ** D23
313 NOT_ON_TIMER , // PA 2 ** 24 ** D24
314 NOT_ON_TIMER , // PA 3 ** 25 ** D25
315 NOT_ON_TIMER , // PA 4 ** 26 ** D26
316 NOT_ON_TIMER , // PA 5 ** 27 ** D27
317 NOT_ON_TIMER , // PA 6 ** 28 ** D28
318 NOT_ON_TIMER , // PA 7 ** 29 ** D29
319 NOT_ON_TIMER , // PC 7 ** 30 ** D30
320 NOT_ON_TIMER , // PC 6 ** 31 ** D31
321 NOT_ON_TIMER , // PC 5 ** 32 ** D32
322 NOT_ON_TIMER , // PC 4 ** 33 ** D33
323 NOT_ON_TIMER , // PC 3 ** 34 ** D34
324 NOT_ON_TIMER , // PC 2 ** 35 ** D35
325 NOT_ON_TIMER , // PC 1 ** 36 ** D36
326 NOT_ON_TIMER , // PC 0 ** 37 ** D37
327 NOT_ON_TIMER , // PD 7 ** 38 ** D38
328 NOT_ON_TIMER , // PG 2 ** 39 ** D39
329 NOT_ON_TIMER , // PG 1 ** 40 ** D40
330 NOT_ON_TIMER , // PG 0 ** 41 ** D41
331 NOT_ON_TIMER , // PL 7 ** 42 ** D42
332 NOT_ON_TIMER , // PL 6 ** 43 ** D43
333 TIMER5C , // PL 5 ** 44 ** D44
334 TIMER5B , // PL 4 ** 45 ** D45
335 TIMER5A , // PL 3 ** 46 ** D46
336 NOT_ON_TIMER , // PL 2 ** 47 ** D47
337 NOT_ON_TIMER , // PL 1 ** 48 ** D48
338 NOT_ON_TIMER , // PL 0 ** 49 ** D49
339 NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO
340 NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI
341 NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK
342 NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS
343 NOT_ON_TIMER , // PF 0 ** 54 ** A0
344 NOT_ON_TIMER , // PF 1 ** 55 ** A1
345 NOT_ON_TIMER , // PF 2 ** 56 ** A2
346 NOT_ON_TIMER , // PF 3 ** 57 ** A3
347 NOT_ON_TIMER , // PF 4 ** 58 ** A4
348 NOT_ON_TIMER , // PF 5 ** 59 ** A5
349 NOT_ON_TIMER , // PF 6 ** 60 ** A6
350 NOT_ON_TIMER , // PF 7 ** 61 ** A7
351 NOT_ON_TIMER , // PK 0 ** 62 ** A8
352 NOT_ON_TIMER , // PK 1 ** 63 ** A9
353 NOT_ON_TIMER , // PK 2 ** 64 ** A10
354 NOT_ON_TIMER , // PK 3 ** 65 ** A11
355 NOT_ON_TIMER , // PK 4 ** 66 ** A12
356 NOT_ON_TIMER , // PK 5 ** 67 ** A13
357 NOT_ON_TIMER , // PK 6 ** 68 ** A14
358 NOT_ON_TIMER , // PK 7 ** 69 ** A15
359};
360
361#endif
362
363#endif \ No newline at end of file
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/standard/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/standard/pins_arduino.h
new file mode 100644
index 000000000..30b426630
--- /dev/null
+++ b/protocol/usb_hid/arduino-1.0.1/variants/standard/pins_arduino.h
@@ -0,0 +1,218 @@
1/*
2 pins_arduino.h - Pin definition functions for Arduino
3 Part of Arduino - http://www.arduino.cc/
4
5 Copyright (c) 2007 David A. Mellis
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
16
17 You should have received a copy of the GNU Lesser General
18 Public License along with this library; if not, write to the
19 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21
22 $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
23*/
24
25#ifndef Pins_Arduino_h
26#define Pins_Arduino_h
27
28#include <avr/pgmspace.h>
29
30#define NUM_DIGITAL_PINS 20
31#define NUM_ANALOG_INPUTS 6
32#define analogInputToDigitalPin(p) ((p < 6) ? (p) + 14 : -1)
33
34#if defined(__AVR_ATmega8__)
35#define digitalPinHasPWM(p) ((p) == 9 || (p) == 10 || (p) == 11)
36#else
37#define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)
38#endif
39
40static const uint8_t SS = 10;
41static const uint8_t MOSI = 11;
42static const uint8_t MISO = 12;
43static const uint8_t SCK = 13;
44
45static const uint8_t SDA = 18;
46static const uint8_t SCL = 19;
47static const uint8_t LED_BUILTIN = 13;
48
49static const uint8_t A0 = 14;
50static const uint8_t A1 = 15;
51static const uint8_t A2 = 16;
52static const uint8_t A3 = 17;
53static const uint8_t A4 = 18;
54static const uint8_t A5 = 19;
55static const uint8_t A6 = 20;
56static const uint8_t A7 = 21;
57
58#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
59#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
60#define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0))))
61#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14)))
62
63#ifdef ARDUINO_MAIN
64
65// On the Arduino board, digital pins are also used
66// for the analog output (software PWM). Analog input
67// pins are a separate set.
68
69// ATMEL ATMEGA8 & 168 / ARDUINO
70//
71// +-\/-+
72// PC6 1| |28 PC5 (AI 5)
73// (D 0) PD0 2| |27 PC4 (AI 4)
74// (D 1) PD1 3| |26 PC3 (AI 3)
75// (D 2) PD2 4| |25 PC2 (AI 2)
76// PWM+ (D 3) PD3 5| |24 PC1 (AI 1)
77// (D 4) PD4 6| |23 PC0 (AI 0)
78// VCC 7| |22 GND
79// GND 8| |21 AREF
80// PB6 9| |20 AVCC
81// PB7 10| |19 PB5 (D 13)
82// PWM+ (D 5) PD5 11| |18 PB4 (D 12)
83// PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
84// (D 7) PD7 13| |16 PB2 (D 10) PWM
85// (D 8) PB0 14| |15 PB1 (D 9) PWM
86// +----+
87//
88// (PWM+ indicates the additional PWM pins on the ATmega168.)
89
90// ATMEL ATMEGA1280 / ARDUINO
91//
92// 0-7 PE0-PE7 works
93// 8-13 PB0-PB5 works
94// 14-21 PA0-PA7 works
95// 22-29 PH0-PH7 works
96// 30-35 PG5-PG0 works
97// 36-43 PC7-PC0 works
98// 44-51 PJ7-PJ0 works
99// 52-59 PL7-PL0 works
100// 60-67 PD7-PD0 works
101// A0-A7 PF0-PF7
102// A8-A15 PK0-PK7
103
104
105// these arrays map port names (e.g. port B) to the
106// appropriate addresses for various functions (e.g. reading
107// and writing)
108const uint16_t PROGMEM port_to_mode_PGM[] = {
109 NOT_A_PORT,
110 NOT_A_PORT,
111 (uint16_t) &DDRB,
112 (uint16_t) &DDRC,
113 (uint16_t) &DDRD,
114};
115
116const uint16_t PROGMEM port_to_output_PGM[] = {
117 NOT_A_PORT,
118 NOT_A_PORT,
119 (uint16_t) &PORTB,
120 (uint16_t) &PORTC,
121 (uint16_t) &PORTD,
122};
123
124const uint16_t PROGMEM port_to_input_PGM[] = {
125 NOT_A_PORT,
126 NOT_A_PORT,
127 (uint16_t) &PINB,
128 (uint16_t) &PINC,
129 (uint16_t) &PIND,
130};
131
132const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
133 PD, /* 0 */
134 PD,
135 PD,
136 PD,
137 PD,
138 PD,
139 PD,
140 PD,
141 PB, /* 8 */
142 PB,
143 PB,
144 PB,
145 PB,
146 PB,
147 PC, /* 14 */
148 PC,
149 PC,
150 PC,
151 PC,
152 PC,
153};
154
155const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
156 _BV(0), /* 0, port D */
157 _BV(1),
158 _BV(2),
159 _BV(3),
160 _BV(4),
161 _BV(5),
162 _BV(6),
163 _BV(7),
164 _BV(0), /* 8, port B */
165 _BV(1),
166 _BV(2),
167 _BV(3),
168 _BV(4),
169 _BV(5),
170 _BV(0), /* 14, port C */
171 _BV(1),
172 _BV(2),
173 _BV(3),
174 _BV(4),
175 _BV(5),
176};
177
178const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
179 NOT_ON_TIMER, /* 0 - port D */
180 NOT_ON_TIMER,
181 NOT_ON_TIMER,
182 // on the ATmega168, digital pin 3 has hardware pwm
183#if defined(__AVR_ATmega8__)
184 NOT_ON_TIMER,
185#else
186 TIMER2B,
187#endif
188 NOT_ON_TIMER,
189 // on the ATmega168, digital pins 5 and 6 have hardware pwm
190#if defined(__AVR_ATmega8__)
191 NOT_ON_TIMER,
192 NOT_ON_TIMER,
193#else
194 TIMER0B,
195 TIMER0A,
196#endif
197 NOT_ON_TIMER,
198 NOT_ON_TIMER, /* 8 - port B */
199 TIMER1A,
200 TIMER1B,
201#if defined(__AVR_ATmega8__)
202 TIMER2,
203#else
204 TIMER2A,
205#endif
206 NOT_ON_TIMER,
207 NOT_ON_TIMER,
208 NOT_ON_TIMER,
209 NOT_ON_TIMER, /* 14 - port C */
210 NOT_ON_TIMER,
211 NOT_ON_TIMER,
212 NOT_ON_TIMER,
213 NOT_ON_TIMER,
214};
215
216#endif
217
218#endif