From a9ad0e80a0ea2a152fcc46461b2eff41d98ed0df Mon Sep 17 00:00:00 2001 From: Eve Entropia Date: Wed, 23 Feb 2011 21:47:18 +0100 Subject: [PATCH] arduino-0022 --- .../Analog/AnalogInSerial/AnalogInSerial.pde | 29 - .../examples/Digital/Blink/Blink.pde | 40 - .../AnalogReadSerial/AnalogReadSerial.pde | 12 - .../Stubs/AnalogReadWrite/AnalogReadWrite.pde | 13 - .../Stubs/BareMinumum/BareMinumum.pde | 9 - .../DigitalReadWrite/DigitalReadWrite.pde | 12 - .../examples/Stubs/HelloWorld/HelloWorld.pde | 9 - .../hardware/arduino/cores/arduino/WProgram.h | 32 - .../arduino/cores/arduino/wiring_analog.c | 179 - arduino-0018-linux-x64/hardware/tools/avrdude | Bin 704076 -> 0 bytes .../hardware/tools/avrdude.conf | 11914 ---------------- arduino-0018-linux-x64/lib/antlr.jar | Bin 443876 -> 0 bytes arduino-0018-linux-x64/lib/core.jar | Bin 230539 -> 0 bytes arduino-0018-linux-x64/lib/librxtxSerial.so | Bin 174170 -> 0 bytes arduino-0018-linux-x64/lib/oro.jar | Bin 26707 -> 0 bytes arduino-0018-linux-x64/lib/pde.jar | Bin 538428 -> 0 bytes .../examples/ChatServer/ChatServer.pde | 34 - .../Ethernet/examples/WebClient/WebClient.pde | 41 - .../Ethernet/examples/WebServer/WebServer.pde | 61 - .../libraries/Ethernet/utility/socket.c | 558 - .../libraries/Ethernet/utility/socket.h | 23 - .../libraries/Ethernet/utility/spi.h | 58 - .../libraries/Ethernet/utility/types.h | 165 - .../libraries/Ethernet/utility/w5100.c | 1302 -- .../libraries/Ethernet/utility/w5100.h | 299 - .../StandardFirmata/StandardFirmata.pde | 302 - arduino-0018-linux-x64/reference/Abs.html | 89 - .../reference/AnalogRead.html | 107 - .../reference/AnalogReference.html | 99 - .../reference/AnalogWrite.html | 115 - .../reference/Arithmetic.html | 100 - .../reference/Assignment.html | 86 - .../reference/AttachInterrupt.html | 115 - arduino-0018-linux-x64/reference/Bit.html | 85 - .../reference/BitClear.html | 87 - arduino-0018-linux-x64/reference/BitRead.html | 87 - arduino-0018-linux-x64/reference/BitSet.html | 87 - .../reference/BitWrite.html | 89 - .../reference/BitwiseXorNot.html | 84 - arduino-0018-linux-x64/reference/Boolean.html | 111 - .../reference/BooleanVariables.html | 102 - arduino-0018-linux-x64/reference/Braces.html | 119 - arduino-0018-linux-x64/reference/Break.html | 85 - arduino-0018-linux-x64/reference/Byte.html | 78 - .../reference/ByteCast.html | 82 - arduino-0018-linux-x64/reference/Changes.html | 89 - arduino-0018-linux-x64/reference/Char.html | 85 - .../reference/CharCast.html | 82 - .../reference/ClientAvailable.html | 126 - .../reference/ClientConnect.html | 127 - .../reference/ClientConnected.html | 127 - .../reference/ClientConstructor.html | 126 - .../reference/ClientFlush.html | 81 - .../reference/ClientPrint.html | 85 - .../reference/ClientPrintln.html | 85 - .../reference/ClientRead.html | 81 - .../reference/ClientStop.html | 82 - .../reference/ClientWrite.html | 80 - .../reference/Comments.html | 88 - .../reference/Comparison.html | 94 - arduino-0018-linux-x64/reference/Const.html | 90 - .../reference/Constrain.html | 92 - .../reference/Continue.html | 84 - arduino-0018-linux-x64/reference/Cos.html | 84 - arduino-0018-linux-x64/reference/Define.html | 99 - arduino-0018-linux-x64/reference/Delay.html | 108 - .../reference/DelayMicroseconds.html | 110 - .../reference/DetachInterrupt.html | 76 - .../reference/DigitalRead.html | 110 - .../reference/DigitalWrite.html | 113 - arduino-0018-linux-x64/reference/DoWhile.html | 87 - arduino-0018-linux-x64/reference/Double.html | 78 - arduino-0018-linux-x64/reference/EEPROM.html | 73 - .../reference/EEPROMRead.html | 109 - .../reference/EEPROMWrite.html | 102 - arduino-0018-linux-x64/reference/Else.html | 103 - .../reference/Ethernet.html | 96 - .../reference/EthernetBegin.html | 102 - arduino-0018-linux-x64/reference/FAQ.html | 125 - arduino-0018-linux-x64/reference/Float.html | 98 - .../reference/FloatCast.html | 82 - arduino-0018-linux-x64/reference/For.html | 105 - .../reference/Fpconstants.html | 86 - arduino-0018-linux-x64/reference/Goto.html | 93 - .../reference/Guide_ArduinoBT.html | 80 - .../Guide_ArduinoEthernetShield.html | 73 - .../reference/Guide_ArduinoLilyPad.html | 81 - .../reference/Guide_ArduinoNano.html | 73 - .../reference/Guide_MacOSX.html | 125 - .../reference/Guide_Windows.html | 137 - .../reference/Guide_index.html | 86 - .../reference/HighByte.html | 83 - arduino-0018-linux-x64/reference/If.html | 110 - arduino-0018-linux-x64/reference/Include.html | 84 - .../reference/Increment.html | 93 - .../reference/IncrementCompound.html | 92 - arduino-0018-linux-x64/reference/Int.html | 101 - arduino-0018-linux-x64/reference/IntCast.html | 82 - .../reference/Interrupts.html | 94 - .../reference/LiquidCrystal.html | 101 - .../reference/LiquidCrystalAutoscroll.html | 81 - .../reference/LiquidCrystalBegin.html | 83 - .../reference/LiquidCrystalBlink.html | 84 - .../reference/LiquidCrystalClear.html | 79 - .../reference/LiquidCrystalConstructor.html | 99 - .../reference/LiquidCrystalCreateChar.html | 110 - .../reference/LiquidCrystalCursor.html | 83 - .../reference/LiquidCrystalDisplay.html | 83 - .../reference/LiquidCrystalHome.html | 79 - .../reference/LiquidCrystalLeftToRight.html | 81 - .../reference/LiquidCrystalNoAutoscroll.html | 81 - .../reference/LiquidCrystalNoBlink.html | 83 - .../reference/LiquidCrystalNoCursor.html | 83 - .../reference/LiquidCrystalNoDisplay.html | 83 - .../reference/LiquidCrystalPrint.html | 97 - .../reference/LiquidCrystalRightToLeft.html | 81 - .../LiquidCrystalScrollDisplayLeft.html | 83 - .../LiquidCrystalScrollDisplayRight.html | 83 - .../reference/LiquidCrystalSetCursor.html | 83 - .../reference/LiquidCrystalWrite.html | 100 - arduino-0018-linux-x64/reference/Long.html | 87 - .../reference/LongCast.html | 82 - arduino-0018-linux-x64/reference/Loop.html | 94 - arduino-0018-linux-x64/reference/LowByte.html | 83 - arduino-0018-linux-x64/reference/Map.html | 125 - arduino-0018-linux-x64/reference/Max.html | 98 - arduino-0018-linux-x64/reference/Micros.html | 100 - arduino-0018-linux-x64/reference/Millis.html | 102 - arduino-0018-linux-x64/reference/Min.html | 98 - arduino-0018-linux-x64/reference/Modulo.html | 110 - .../reference/NoInterrupts.html | 92 - arduino-0018-linux-x64/reference/NoTone.html | 82 - arduino-0018-linux-x64/reference/PinMode.html | 109 - arduino-0018-linux-x64/reference/Pointer.html | 71 - arduino-0018-linux-x64/reference/Pow.html | 86 - arduino-0018-linux-x64/reference/PulseIn.html | 103 - arduino-0018-linux-x64/reference/Random.html | 116 - .../reference/RandomSeed.html | 100 - arduino-0018-linux-x64/reference/Return.html | 103 - arduino-0018-linux-x64/reference/Scope.html | 96 - .../reference/SemiColon.html | 77 - arduino-0018-linux-x64/reference/Serial.html | 90 - .../reference/Serial_Available.html | 121 - .../reference/Serial_Begin.html | 108 - .../reference/Serial_Flush.html | 73 - .../reference/Serial_Print.html | 200 - .../reference/Serial_Println.html | 137 - .../reference/Serial_Read.html | 98 - .../reference/Serial_Write.html | 79 - .../reference/ServerAvailable.html | 113 - .../reference/ServerBegin.html | 113 - .../reference/ServerConstructor.html | 113 - .../reference/ServerPrint.html | 85 - .../reference/ServerPrintln.html | 85 - .../reference/ServerWrite.html | 113 - arduino-0018-linux-x64/reference/Servo.html | 86 - .../reference/ServoAttach.html | 102 - .../reference/ServoAttached.html | 85 - .../reference/ServoDetach.html | 82 - .../reference/ServoRead.html | 84 - .../reference/ServoWrite.html | 99 - .../reference/ServoWriteMicroseconds.html | 103 - arduino-0018-linux-x64/reference/Setup.html | 86 - .../reference/ShiftOut.html | 146 - arduino-0018-linux-x64/reference/Sin.html | 85 - arduino-0018-linux-x64/reference/Sizeof.html | 107 - .../reference/SoftwareSerial.html | 91 - .../reference/SoftwareSerialBegin.html | 105 - .../reference/SoftwareSerialConstructor.html | 88 - .../reference/SoftwareSerialExample.html | 124 - .../reference/SoftwareSerialPrint.html | 118 - .../reference/SoftwareSerialPrintln.html | 118 - .../reference/SoftwareSerialRead.html | 95 - arduino-0018-linux-x64/reference/Sqrt.html | 80 - arduino-0018-linux-x64/reference/Static.html | 123 - arduino-0018-linux-x64/reference/Stepper.html | 80 - .../reference/StepperBipolarCircuit.html | 72 - .../reference/StepperConstructor.html | 88 - .../reference/StepperSetSpeed.html | 81 - .../reference/StepperStep.html | 81 - .../reference/StepperUnipolarCircuit.html | 73 - .../reference/SwitchCase.html | 109 - arduino-0018-linux-x64/reference/Tan.html | 85 - arduino-0018-linux-x64/reference/Tone.html | 90 - .../reference/UnsignedChar.html | 83 - .../reference/UnsignedInt.html | 97 - .../reference/UnsignedLong.html | 101 - arduino-0018-linux-x64/reference/Void.html | 89 - .../reference/Volatile.html | 102 - arduino-0018-linux-x64/reference/While.html | 88 - arduino-0018-linux-x64/reference/Wire.html | 84 - .../reference/WireAvailable.html | 79 - .../reference/WireBegin.html | 78 - .../reference/WireBeginTransmission.html | 80 - .../reference/WireEndTransmission.html | 80 - .../reference/WireOnReceive.html | 79 - .../reference/WireOnRequest.html | 79 - .../reference/WireReceive.html | 79 - .../reference/WireRequestFrom.html | 82 - .../reference/WireSend.html | 88 - arduino-0018-linux-x64/reference/Word.html | 77 - .../reference/WordCast.html | 86 - arduino-0018-linux-x64/reference/arduino.css | 140 - .../reference/environment.html | 3 - arduino-0018-linux-x64/reference/index.html | 195 - .../arduino | 6 +- .../AnalogReadSerial/AnalogReadSerial.pde | 15 + .../1.Basics/BareMinimum/BareMinimum.pde | 9 + .../examples/1.Basics/Blink/Blink.pde | 19 + .../DigitalReadSerial/DigitalReadSerial.pde | 6 + .../examples/1.Basics/Fade/Fade.pde | 31 + .../BlinkWithoutDelay/BlinkWithoutDelay.pde | 27 +- .../examples/2.Digital}/Button/Button.pde | 8 +- .../examples/2.Digital}/Debounce/Debounce.pde | 1 + .../StateChangeDetection.pde | 12 +- .../2.Digital}/toneKeyboard/pitches.h | 0 .../2.Digital}/toneKeyboard/toneKeyboard.pde | 10 +- .../examples/2.Digital}/toneMelody/pitches.h | 0 .../2.Digital}/toneMelody/toneMelody.pde | 9 +- .../examples/2.Digital/toneMultiple/pitches.h | 95 + .../2.Digital/toneMultiple/toneMultiple.pde | 42 + .../tonePitchFollower/tonePitchFollower.pde | 5 +- .../AnalogInOutSerial/AnalogInOutSerial.pde | 5 +- .../3.Analog}/AnalogInput/AnalogInput.pde | 6 +- .../AnalogWriteMega/AnalogWriteMega.pde | 3 + .../3.Analog}/Calibration/Calibration.pde | 18 +- .../examples/3.Analog}/Fading/Fading.pde | 2 + .../3.Analog}/Smoothing/Smoothing.pde | 4 +- .../ASCIITable/ASCIITable.pde | 3 + .../4.Communication}/Dimmer/Dimmer.pde | 4 + .../examples/4.Communication}/Graph/Graph.pde | 9 +- .../examples/4.Communication}/MIDI/Midi.pde | 2 + .../MultiSerialMega/MultiSerialMega.pde | 2 + .../PhysicalPixel/PhysicalPixel.pde | 4 + .../SerialCallResponse/SerialCallResponse.pde | 14 +- .../SerialCallResponseASCII.pde | 11 +- .../VirtualColorMixer/VirtualColorMixer.pde | 10 +- .../examples/5.Control}/Arrays/Arrays.pde | 2 + .../ForLoopIteration/ForLoopIteration.pde | 2 + .../IfStatementConditional.pde | 7 +- .../WhileStatementConditional.pde | 12 +- .../5.Control}/switchCase/switchCase.pde | 5 +- .../5.Control}/switchCase2/switchCase2.pde | 2 + .../examples/6.Sensors}/ADXL3xx/ADXL3xx.pde | 10 +- .../examples/6.Sensors}/Knock/Knock.pde | 6 +- .../6.Sensors}/Memsic2125/Memsic2125.pde | 2 + .../examples/6.Sensors}/Ping/Ping.pde | 2 + .../RowColumnScanning/RowColumnScanning.pde | 8 +- .../examples/7.Display}/barGraph/barGraph.pde | 6 +- .../CharacterAnalysis/CharacterAnalysis.pde | 85 + .../StringAdditionOperator.pde | 61 + .../StringAppendOperator.pde | 64 + .../StringCaseChanges/StringCaseChanges.pde | 35 + .../StringCharacters/StringCharacters.pde | 37 + .../StringComparisonOperators.pde | 124 + .../StringConstructors/StringConstructors.pde | 64 + .../8.Strings/StringIndexOf/StringIndexOf.pde | 58 + .../8.Strings/StringLength/StringLength.pde | 43 + .../StringLengthTrim/StringLengthTrim.pde | 34 + .../8.Strings/StringReplace/StringReplace.pde | 35 + .../StringStartsWithEndsWith.pde | 49 + .../StringSubstring/StringSubstring.pde | 35 + .../8.Strings/StringToInt/StringToInt.pde | 47 + .../StringToIntRGB/StringToIntRGB.pde | 230 + .../examples/ArduinoISP/ArduinoISP.pde | 6 +- .../hardware/arduino/boards.txt | 122 +- .../bootloaders/atmega/ATmegaBOOT_168.c | 0 .../atmega/ATmegaBOOT_168_atmega1280.hex | 0 .../atmega/ATmegaBOOT_168_atmega328.hex | 0 .../ATmegaBOOT_168_atmega328_pro_8MHz.hex | 0 .../atmega/ATmegaBOOT_168_diecimila.hex | 0 .../bootloaders/atmega/ATmegaBOOT_168_ng.hex | 0 .../atmega/ATmegaBOOT_168_pro_8MHz.hex | 0 .../arduino/bootloaders/atmega/Makefile | 0 .../arduino/bootloaders/atmega8/ATmegaBOOT.c | 0 .../bootloaders/atmega8/ATmegaBOOT.hex | 0 .../arduino/bootloaders/atmega8/Makefile | 0 .../arduino/bootloaders/bt/ATmegaBOOT_168.c | 22 +- .../arduino/bootloaders/bt/ATmegaBOOT_168.hex | 0 .../bt/ATmegaBOOT_168_atmega328_bt.hex | 162 + .../hardware/arduino/bootloaders/bt/Makefile | 109 + .../bootloaders/lilypad/LilyPadBOOT_168.hex | 0 .../bootloaders/lilypad/src/ATmegaBOOT.c | 0 .../arduino/bootloaders/lilypad/src/Makefile | 0 .../arduino/bootloaders/optiboot/Makefile | 239 + .../arduino/bootloaders/optiboot/makeall | 13 + .../arduino/bootloaders/optiboot/optiboot.c | 536 + .../optiboot/optiboot_atmega328.hex | 33 + .../optiboot/optiboot_atmega328.lst | 520 + .../optiboot/optiboot_atmega328_pro_8MHz.hex | 33 + .../optiboot/optiboot_atmega328_pro_8MHz.lst | 520 + .../optiboot/optiboot_diecimila.hex | 33 + .../optiboot/optiboot_diecimila.lst | 520 + .../bootloaders/optiboot/optiboot_lilypad.hex | 34 + .../bootloaders/optiboot/optiboot_lilypad.lst | 533 + .../optiboot/optiboot_lilypad_resonator.hex | 34 + .../optiboot/optiboot_lilypad_resonator.lst | 533 + .../bootloaders/optiboot/optiboot_luminet.hex | 42 + .../bootloaders/optiboot/optiboot_luminet.lst | 604 + .../optiboot/optiboot_pro_16MHz.hex | 33 + .../optiboot/optiboot_pro_16MHz.lst | 520 + .../optiboot/optiboot_pro_20mhz.hex | 33 + .../optiboot/optiboot_pro_20mhz.lst | 520 + .../optiboot/optiboot_pro_8MHz.hex | 34 + .../optiboot/optiboot_pro_8MHz.lst | 533 + .../arduino/bootloaders/stk500v2/License.txt | 280 + .../arduino/bootloaders/stk500v2/Makefile | 588 + .../bootloaders/stk500v2/STK500V2.pnproj | 1 + .../bootloaders/stk500v2/STK500V2.pnps | 1 + .../bootloaders/stk500v2/avrinterruptnames.h | 742 + .../arduino/bootloaders/stk500v2/command.h | 114 + .../arduino/bootloaders/stk500v2/stk500boot.c | 1996 +++ .../bootloaders/stk500v2/stk500boot.ppg | 1 + .../stk500v2/stk500boot_v2_mega2560.hex | 513 + .../arduino/cores/arduino/HardwareSerial.cpp | 219 +- .../arduino/cores/arduino/HardwareSerial.h | 32 +- .../hardware/arduino/cores/arduino/Print.cpp | 14 + .../hardware/arduino/cores/arduino/Print.h | 6 +- .../hardware/arduino/cores/arduino/Stream.h | 35 + .../hardware/arduino/cores/arduino/Tone.cpp | 180 +- .../arduino/cores/arduino/WCharacter.h | 168 + .../arduino/cores/arduino/WConstants.h | 0 .../arduino/cores/arduino/WInterrupts.c | 50 +- .../hardware/arduino/cores/arduino/WMath.cpp | 0 .../hardware/arduino/cores/arduino/WProgram.h | 63 + .../arduino/cores/arduino/WString.cpp | 443 + .../hardware/arduino/cores/arduino/WString.h | 112 + .../hardware/arduino/cores/arduino/binary.h | 0 .../hardware/arduino/cores/arduino/main.cpp | 0 .../arduino/cores/arduino/pins_arduino.c | 8 +- .../arduino/cores/arduino/pins_arduino.h | 12 + .../hardware/arduino/cores/arduino/wiring.c | 103 +- .../hardware/arduino/cores/arduino/wiring.h | 22 +- .../arduino/cores/arduino/wiring_analog.c | 259 + .../arduino/cores/arduino/wiring_digital.c | 113 +- .../arduino/cores/arduino/wiring_private.h | 2 +- .../arduino/cores/arduino/wiring_pulse.c | 9 +- .../arduino/cores/arduino/wiring_shift.c | 19 +- .../MEGA-dfu_and_usbserial_combined.hex | 234 + .../hardware/arduino/firmwares/README.txt | 33 + .../UNO-dfu_and_usbserial_combined.hex | 234 + .../firmwares/arduino-usbdfu/Arduino-usbdfu.c | 728 + .../firmwares/arduino-usbdfu/Arduino-usbdfu.h | 220 + .../firmwares/arduino-usbdfu/Board/LEDs.h | 110 + .../firmwares/arduino-usbdfu/Descriptors.c | 189 + .../firmwares/arduino-usbdfu/Descriptors.h | 177 + .../arduino/firmwares/arduino-usbdfu/makefile | 710 + .../firmwares/arduino-usbdfu/readme.txt | 7 + .../Arduino-usbserial-mega.hex | 256 + .../Arduino-usbserial-uno.hex | 256 + .../arduino-usbserial/Arduino-usbserial.c | 242 + .../arduino-usbserial/Arduino-usbserial.h | 79 + .../firmwares/arduino-usbserial/Board/LEDs.h | 110 + .../firmwares/arduino-usbserial/Descriptors.c | 277 + .../firmwares/arduino-usbserial/Descriptors.h | 88 + .../Lib/LightweightRingBuff.h | 197 + .../firmwares/arduino-usbserial/makefile | 776 + .../firmwares/arduino-usbserial/readme.txt | 13 + .../hardware/arduino/programmers.txt | 0 arduino-0022-linux-x64/hardware/tools/avrdude | Bin 0 -> 754889 bytes .../hardware/tools/avrdude.conf | 0 .../lib/RXTXcomm.jar | Bin 59464 -> 59467 bytes .../lib/about.jpg | Bin arduino-0022-linux-x64/lib/core.jar | Bin 0 -> 173277 bytes .../lib/ecj.jar | Bin .../lib/jna.jar | Bin .../lib/keywords.txt | 9 +- arduino-0022-linux-x64/lib/librxtxSerial.so | Bin 0 -> 182189 bytes arduino-0022-linux-x64/lib/pde.jar | Bin 0 -> 371347 bytes .../lib/preferences.txt | 34 +- .../lib/theme/buttons.gif | Bin .../lib/theme/resize.gif | Bin .../lib/theme/tab-sel-left.gif | Bin .../lib/theme/tab-sel-menu.gif | Bin .../lib/theme/tab-sel-mid.gif | Bin .../lib/theme/tab-sel-right.gif | Bin .../lib/theme/tab-unsel-left.gif | Bin .../lib/theme/tab-unsel-menu.gif | Bin .../lib/theme/tab-unsel-mid.gif | Bin .../lib/theme/tab-unsel-right.gif | Bin .../lib/theme/theme.txt | 0 arduino-0022-linux-x64/lib/version.txt | 1 + .../ArduinoTestSuite/ArduinoTestSuite.cpp | 715 + .../ArduinoTestSuite/ArduinoTestSuite.h | 74 + .../libraries/ArduinoTestSuite/avr_cpunames.h | 186 + .../examples/ATS_Constants/ATS_Constants.pde | 76 + .../examples/ATS_Delay/ATS_Delay.pde | 1 + .../examples/ATS_General/ATS_General.pde | 94 + .../examples/ATS_SD_File/ATS_SD_File.pde | 106 + .../examples/ATS_SD_Files/ATS_SD_Files.pde | 78 + .../examples/ATS_SD_Seek/ATS_SD_Seek.pde | 109 + .../examples/ATS_Skeleton/ATS_Skeleton.pde | 52 + .../ATS_StringIndexOfMemory.pde | 102 + .../ATS_StringTest/ATS_StringTest.pde | 184 + .../examples/ATS_ToneTest/ATS_ToneTest.pde | 250 + .../libraries/EEPROM/EEPROM.cpp | 0 .../libraries/EEPROM/EEPROM.h | 0 .../examples/eeprom_clear/eeprom_clear.pde | 2 + .../examples/eeprom_read/eeprom_read.pde | 1 + .../examples/eeprom_write/eeprom_write.pde | 0 .../libraries/EEPROM/keywords.txt | 0 .../libraries/Ethernet/Client.cpp | 107 +- .../libraries/Ethernet/Client.h | 30 +- .../libraries/Ethernet/Ethernet.cpp | 26 +- .../libraries/Ethernet/Ethernet.h | 7 +- .../libraries/Ethernet/Server.cpp | 37 +- .../libraries/Ethernet/Server.h | 11 +- .../libraries/Ethernet/Udp.cpp | 136 + .../libraries/Ethernet/Udp.h | 63 + .../BarometricPressureWebServer.pde | 225 + .../examples/ChatServer/ChatServer.pde | 63 + .../examples/PachubeClient/PachubeClient.pde | 139 + .../PachubeClientString.pde | 124 + .../examples/TelnetClient/TelnetClient.pde | 89 + .../UDPSendReceiveString.pde | 107 + .../examples/UdpNtpClient/UdpNtpClient.pde | 121 + .../Ethernet/examples/WebClient/WebClient.pde | 71 + .../Ethernet/examples/WebServer/WebServer.pde | 82 + .../libraries/Ethernet/keywords.txt | 0 .../libraries/Ethernet/utility/socket.cpp | 327 + .../libraries/Ethernet/utility/socket.h | 20 + .../libraries/Ethernet/utility/w5100.cpp | 182 + .../libraries/Ethernet/utility/w5100.h | 381 + .../libraries/Firmata/Boards.h | 335 + .../libraries/Firmata/Firmata.cpp | 0 .../libraries/Firmata/Firmata.h | 92 +- .../libraries/Firmata/LICENSE.txt | 0 .../libraries/Firmata/TODO.txt | 0 .../AllInputsFirmata/AllInputsFirmata.pde | 34 +- .../examples/AnalogFirmata/AnalogFirmata.pde | 8 +- .../Firmata/examples/AnalogFirmata/Makefile | 0 .../examples/EchoString/EchoString.pde | 0 .../Firmata/examples/EchoString/Makefile | 0 .../examples/I2CFirmata/I2CFirmata.pde | 8 +- .../examples/OldStandardFirmata/LICENSE.txt | 0 .../OldStandardFirmata/OldStandardFirmata.pde | 16 +- .../Firmata/examples/ServoFirmata/Makefile | 0 .../examples/ServoFirmata/ServoFirmata.pde | 25 +- .../examples/SimpleAnalogFirmata/Makefile | 0 .../SimpleAnalogFirmata.pde | 17 +- .../examples/SimpleDigitalFirmata/Makefile | 0 .../SimpleDigitalFirmata.pde | 22 +- .../examples/StandardFirmata/LICENSE.txt | 0 .../Firmata/examples/StandardFirmata/Makefile | 0 .../StandardFirmata/StandardFirmata.pde | 398 + .../StandardFirmata_2_2_forUNO_0_3.pde | 436 + .../libraries/Firmata/keywords.txt | 0 .../libraries/LiquidCrystal/LiquidCrystal.cpp | 2 +- .../libraries/LiquidCrystal/LiquidCrystal.h | 0 .../examples/Autoscroll/Autoscroll.pde | 7 +- .../LiquidCrystal/examples/Blink/Blink.pde | 9 +- .../LiquidCrystal/examples/Cursor/Cursor.pde | 10 +- .../examples/Display/Display.pde | 10 +- .../examples/HelloWorld/HelloWorld.pde | 10 +- .../LiquidCrystal/examples/Scroll/Scroll.pde | 10 +- .../examples/SerialDisplay/SerialDisplay.pde | 9 +- .../examples/TextDirection/TextDirection.pde | 9 +- .../examples/setCursor/setCursor.pde | 11 +- .../libraries/LiquidCrystal/keywords.txt | 0 .../libraries/Matrix/Matrix.cpp | 0 .../libraries/Matrix/Matrix.h | 0 .../examples/hello_matrix/hello_matrix.pde | 0 .../sprite_animation/sprite_animation.pde | 0 .../libraries/Matrix/keywords.txt | 0 arduino-0022-linux-x64/libraries/SD/File.cpp | 65 + .../libraries/SD/README.txt | 11 + arduino-0022-linux-x64/libraries/SD/SD.cpp | 439 + arduino-0022-linux-x64/libraries/SD/SD.h | 88 + .../SD/examples/Datalogger/Datalogger.pde | 86 + .../SD/examples/DumpFile/DumpFile.pde | 64 + .../libraries/SD/examples/Files/Files.pde | 78 + .../SD/examples/ReadWrite/ReadWrite.pde | 79 + .../libraries/SD/keywords.txt | 30 + .../libraries/SD/utility/FatStructs.h | 418 + .../libraries/SD/utility/Sd2Card.cpp | 644 + .../libraries/SD/utility/Sd2Card.h | 233 + .../libraries/SD/utility/Sd2PinMap.h | 353 + .../libraries/SD/utility/SdFat.h | 547 + .../libraries/SD/utility/SdFatUtil.h | 70 + .../libraries/SD/utility/SdFatmainpage.h | 202 + .../libraries/SD/utility/SdFile.cpp | 1252 ++ .../libraries/SD/utility/SdInfo.h | 232 + .../libraries/SD/utility/SdVolume.cpp | 295 + arduino-0022-linux-x64/libraries/SPI/SPI.cpp | 61 + arduino-0022-linux-x64/libraries/SPI/SPI.h | 70 + .../BarometricPressureSensor.pde | 143 + .../BarometricPressureSensor.pde | 143 + .../DigitalPotControl/DigitalPotControl.pde | 71 + .../libraries/SPI/keywords.txt | 36 + .../libraries/Servo/Servo.cpp | 0 .../libraries/Servo/Servo.h | 2 +- .../libraries/Servo/examples/Knob/Knob.pde | 0 .../libraries/Servo/examples/Sweep/Sweep.pde | 2 + .../libraries/Servo/keywords.txt | 0 .../SoftwareSerial/SoftwareSerial.cpp | 0 .../libraries/SoftwareSerial/SoftwareSerial.h | 0 .../libraries/SoftwareSerial/keywords.txt | 0 .../libraries/Sprite/Sprite.cpp | 0 .../libraries/Sprite/Sprite.h | 0 .../libraries/Sprite/binary.h | 0 .../libraries/Sprite/keywords.txt | 0 .../libraries/Stepper/Stepper.cpp | 0 .../libraries/Stepper/Stepper.h | 0 .../Stepper/examples/MotorKnob/MotorKnob.pde | 1 + .../stepper_oneRevolution.pde | 44 + .../stepper_oneStepAtATime.pde | 44 + .../stepper_speedControl.pde | 49 + .../libraries/Stepper/keywords.txt | 0 .../libraries/Wire/Wire.cpp | 8 +- .../libraries/Wire/Wire.h | 4 +- .../SFRRanger_reader/SFRRanger_reader.pde | 3 + .../digital_potentiometer.pde | 5 + .../examples/master_reader/master_reader.pde | 3 + .../examples/master_writer/master_writer.pde | 3 + .../slave_receiver/slave_receiver.pde | 3 + .../examples/slave_sender/slave_sender.pde | 3 + .../libraries/Wire/keywords.txt | 0 .../libraries/Wire/utility/twi.c | 21 +- .../libraries/Wire/utility/twi.h | 0 .../reference/ASCIIchart.html | 0 arduino-0022-linux-x64/reference/Abs.html | 172 + .../reference/AnalogRead.html | 189 + .../reference/AnalogReference.html | 176 + .../reference/AnalogWrite.html | 195 + .../reference/Arithmetic.html | 183 + .../reference/Array.html | 121 +- .../reference/Assignment.html | 169 + .../reference/AttachInterrupt.html | 198 + .../reference/BeginSerial.html | 0 arduino-0022-linux-x64/reference/Bit.html | 168 + .../reference/BitClear.html | 170 + arduino-0022-linux-x64/reference/BitRead.html | 170 + arduino-0022-linux-x64/reference/BitSet.html | 170 + .../reference/BitWrite.html | 172 + .../reference/Bitshift.html | 121 +- .../reference/BitwiseAnd.html | 121 +- .../reference/BitwiseCompound.html | 47 +- .../reference/BitwiseCompoundAnd.html | 209 + .../reference/BitwiseCompoundOr.html | 207 + .../reference/BitwiseXorNot.html | 167 + .../reference/Board.html | 0 arduino-0022-linux-x64/reference/Boolean.html | 194 + .../reference/BooleanVariables.html | 185 + arduino-0022-linux-x64/reference/Braces.html | 202 + arduino-0022-linux-x64/reference/Break.html | 168 + arduino-0022-linux-x64/reference/Byte.html | 161 + .../reference/ByteCast.html | 165 + .../reference/Cast.html | 0 arduino-0022-linux-x64/reference/Changes.html | 183 + arduino-0022-linux-x64/reference/Char.html | 168 + .../reference/CharCast.html | 165 + .../reference/ClientAvailable.html | 209 + .../reference/ClientConnect.html | 210 + .../reference/ClientConnected.html | 210 + .../reference/ClientConstructor.html | 209 + .../reference/ClientFlush.html | 164 + .../reference/ClientPrint.html | 168 + .../reference/ClientPrintln.html | 168 + .../reference/ClientRead.html | 164 + .../reference/ClientStop.html | 165 + .../reference/ClientWrite.html | 163 + .../reference/Comments.html | 171 + .../reference/Comparison.html | 177 + arduino-0022-linux-x64/reference/Const.html | 173 + .../reference/Constants.html | 121 +- .../reference/Constrain.html | 175 + .../reference/Continue.html | 167 + arduino-0022-linux-x64/reference/Cos.html | 164 + arduino-0022-linux-x64/reference/Define.html | 182 + arduino-0022-linux-x64/reference/Delay.html | 191 + .../reference/DelayMicroseconds.html | 194 + .../reference/DetachInterrupt.html | 159 + .../reference/DigitalRead.html | 193 + .../reference/DigitalWrite.html | 198 + arduino-0022-linux-x64/reference/DoWhile.html | 170 + arduino-0022-linux-x64/reference/Double.html | 161 + arduino-0022-linux-x64/reference/EEPROM.html | 158 + .../reference/EEPROMRead.html | 197 + .../reference/EEPROMWrite.html | 190 + arduino-0022-linux-x64/reference/Else.html | 186 + .../reference/Ethernet.html | 179 + .../reference/EthernetBegin.html | 187 + .../reference/Extended.html | 0 arduino-0022-linux-x64/reference/FAQ.html | 195 + .../reference/FileAvailable.html | 167 + .../reference/FileClose.html | 166 + .../reference/FileFlush.html | 166 + .../reference/FilePeek.html | 168 + .../reference/FilePosition.html | 166 + .../reference/FilePrint.html | 173 + .../reference/FilePrintln.html | 173 + .../reference/FileRead.html | 168 + .../reference/FileSeek.html | 168 + .../reference/FileSize.html | 164 + .../reference/FileWrite.html | 173 + arduino-0022-linux-x64/reference/Float.html | 183 + .../reference/FloatCast.html | 168 + arduino-0022-linux-x64/reference/For.html | 207 + .../reference/Fpconstants.html | 169 + .../reference/FunctionDeclaration.html | 0 arduino-0022-linux-x64/reference/Goto.html | 176 + .../reference/Guide_ArduinoBT.html | 164 + .../Guide_ArduinoEthernetShield.html | 159 + .../reference/Guide_ArduinoLilyPad.html | 164 + .../reference/Guide_ArduinoMini.html | 119 +- .../reference/Guide_ArduinoNano.html | 156 + .../reference/Guide_ArduinoPro.html | 119 +- .../reference/Guide_ArduinoProMini.html | 121 +- .../reference/Guide_ArduinoXbeeShield.html | 124 +- .../reference/Guide_Board.html | 0 .../reference/Guide_Environment.html | 146 +- .../reference/Guide_Guide.html | 0 .../reference/Guide_HomePage.html | 0 .../reference/Guide_Introduction.html | 119 +- .../reference/Guide_MacOSX.html | 211 + .../reference/Guide_RecentChanges.html | 0 .../reference/Guide_References.html | 0 .../reference/Guide_Troubleshooting.html | 138 +- .../reference/Guide_Windows.html | 220 + .../reference/Guide_index.html | 170 + .../reference/HighByte.html | 166 + .../reference/HomePage.html | 0 arduino-0022-linux-x64/reference/If.html | 193 + arduino-0022-linux-x64/reference/Include.html | 167 + .../reference/Increment.html | 176 + .../reference/IncrementCompound.html | 175 + arduino-0022-linux-x64/reference/Int.html | 184 + arduino-0022-linux-x64/reference/IntCast.html | 165 + .../reference/IntegerConstants.html | 121 +- .../reference/Interrupts.html | 177 + .../reference/Keywords.html | 0 .../reference/Libraries.html | 129 +- .../reference/LiquidCrystal.html | 184 + .../reference/LiquidCrystalAutoscroll.html | 164 + .../reference/LiquidCrystalBegin.html | 166 + .../reference/LiquidCrystalBlink.html | 167 + .../reference/LiquidCrystalClear.html | 162 + .../reference/LiquidCrystalConstructor.html | 182 + .../reference/LiquidCrystalCreateChar.html | 193 + .../reference/LiquidCrystalCursor.html | 166 + .../reference/LiquidCrystalDisplay.html | 166 + .../reference/LiquidCrystalHome.html | 162 + .../reference/LiquidCrystalLeftToRight.html | 164 + .../reference/LiquidCrystalNoAutoscroll.html | 164 + .../reference/LiquidCrystalNoBlink.html | 166 + .../reference/LiquidCrystalNoCursor.html | 166 + .../reference/LiquidCrystalNoDisplay.html | 166 + .../reference/LiquidCrystalPrint.html | 180 + .../reference/LiquidCrystalRightToLeft.html | 164 + .../LiquidCrystalScrollDisplayLeft.html | 166 + .../LiquidCrystalScrollDisplayRight.html | 166 + .../reference/LiquidCrystalSetCursor.html | 166 + .../reference/LiquidCrystalWrite.html | 183 + arduino-0022-linux-x64/reference/Long.html | 170 + .../reference/LongCast.html | 165 + arduino-0022-linux-x64/reference/Loop.html | 177 + arduino-0022-linux-x64/reference/LowByte.html | 166 + arduino-0022-linux-x64/reference/Map.html | 208 + arduino-0022-linux-x64/reference/Max.html | 181 + arduino-0022-linux-x64/reference/Micros.html | 183 + arduino-0022-linux-x64/reference/Millis.html | 185 + arduino-0022-linux-x64/reference/Min.html | 181 + arduino-0022-linux-x64/reference/Modulo.html | 193 + .../reference/NoInterrupts.html | 175 + arduino-0022-linux-x64/reference/NoTone.html | 167 + .../reference/PROGMEM.html | 0 arduino-0022-linux-x64/reference/PinMode.html | 192 + arduino-0022-linux-x64/reference/Pointer.html | 154 + .../reference/PortManipulation.html | 0 arduino-0022-linux-x64/reference/Pow.html | 169 + .../reference/PrintBinary.html | 0 .../reference/PrintByte.html | 0 .../reference/PrintHex.html | 0 .../reference/PrintInteger.html | 0 .../reference/PrintMode.html | 0 .../reference/PrintNewline.html | 0 .../reference/PrintOctal.html | 0 .../reference/PrintString.html | 0 arduino-0022-linux-x64/reference/PulseIn.html | 186 + arduino-0022-linux-x64/reference/Random.html | 199 + .../reference/RandomSeed.html | 183 + .../reference/RecentChanges.html | 0 arduino-0022-linux-x64/reference/Return.html | 186 + arduino-0022-linux-x64/reference/SD.html | 182 + arduino-0022-linux-x64/reference/SDbegin.html | 165 + .../reference/SDexists.html | 165 + arduino-0022-linux-x64/reference/SDmkdir.html | 167 + arduino-0022-linux-x64/reference/SDopen.html | 173 + .../reference/SDremove.html | 167 + arduino-0022-linux-x64/reference/SDrmdir.html | 167 + arduino-0022-linux-x64/reference/SPI.html | 201 + .../reference/SPIBegin.html | 167 + arduino-0022-linux-x64/reference/SPIEnd.html | 167 + .../reference/SPISetBitOrder.html | 167 + .../reference/SPISetClockDivider.html | 172 + .../reference/SPISetDataMode.html | 168 + .../reference/SPITransfer.html | 166 + arduino-0022-linux-x64/reference/Scope.html | 179 + .../reference/SemiColon.html | 160 + arduino-0022-linux-x64/reference/Serial.html | 179 + .../reference/SerialAvailable.html | 0 .../reference/SerialRead.html | 0 .../reference/SerialWrite.html | 0 .../reference/Serial_Available.html | 209 + .../reference/Serial_Begin.html | 195 + .../reference/Serial_End.html | 162 + .../reference/Serial_Flush.html | 163 + .../reference/Serial_Peek.html | 164 + .../reference/Serial_Print.html | 233 + .../reference/Serial_Println.html | 196 + .../reference/Serial_Read.html | 187 + .../reference/Serial_Write.html | 166 + .../reference/ServerAvailable.html | 203 + .../reference/ServerBegin.html | 202 + .../reference/ServerConstructor.html | 204 + .../reference/ServerPrint.html | 168 + .../reference/ServerPrintln.html | 168 + .../reference/ServerWrite.html | 204 + arduino-0022-linux-x64/reference/Servo.html | 171 + .../reference/ServoAttach.html | 185 + .../reference/ServoAttached.html | 168 + .../reference/ServoDetach.html | 165 + .../reference/ServoRead.html | 167 + .../reference/ServoWrite.html | 182 + .../reference/ServoWriteMicroseconds.html | 186 + arduino-0022-linux-x64/reference/Setup.html | 169 + .../reference/ShiftOut.html | 232 + arduino-0022-linux-x64/reference/Sin.html | 165 + arduino-0022-linux-x64/reference/Sizeof.html | 190 + .../reference/SoftwareSerial.html | 174 + .../reference/SoftwareSerialBegin.html | 188 + .../reference/SoftwareSerialConstructor.html | 171 + .../reference/SoftwareSerialExample.html | 207 + .../reference/SoftwareSerialPrint.html | 201 + .../reference/SoftwareSerialPrintln.html | 201 + .../reference/SoftwareSerialRead.html | 178 + .../reference/Sq.html | 0 arduino-0022-linux-x64/reference/Sqrt.html | 163 + arduino-0022-linux-x64/reference/Static.html | 206 + arduino-0022-linux-x64/reference/Stepper.html | 163 + .../reference/StepperBipolarCircuit.html | 155 + .../reference/StepperConstructor.html | 171 + .../reference/StepperExample.html | 0 .../reference/StepperSetSpeed.html | 164 + .../reference/StepperStep.html | 164 + .../reference/StepperUnipolarCircuit.html | 156 + .../reference/String.html | 123 +- .../reference/StringBrackets.html | 30 + .../reference/StringCharAt.html | 48 + .../reference/StringClass.html | 152 + .../reference/StringCompareTo.html | 50 + .../reference/StringComparison.html | 30 + .../reference/StringConcat.html | 30 + .../reference/StringConstructor.html | 84 + .../reference/StringEndsWith.html | 51 + .../reference/StringEquals.html | 50 + .../reference/StringEqualsIgnoreCase.html | 50 + .../reference/StringGetBytes.html | 46 + .../reference/StringIndexOf.html | 51 + .../reference/StringLastIndexOf.html | 51 + .../reference/StringLength.html | 47 + .../reference/StringObject.html | 195 + .../reference/StringPlus.html | 30 + .../reference/StringReplace.html | 30 + .../reference/StringSetCharAt.html | 46 + .../reference/StringStartsWith.html | 51 + .../reference/StringSubstring.html | 47 + .../reference/StringToCharArray.html | 46 + .../reference/StringToLowerCase.html | 49 + .../reference/StringToUpperCase.html | 49 + .../reference/StringTrim.html | 47 + .../reference/StyleGuide.html | 0 .../reference/SwitchCase.html | 192 + arduino-0022-linux-x64/reference/Tan.html | 165 + arduino-0022-linux-x64/reference/Tone.html | 181 + .../reference/UnsignedChar.html | 166 + .../reference/UnsignedInt.html | 180 + .../reference/UnsignedLong.html | 184 + .../reference/VariableDeclaration.html | 0 arduino-0022-linux-x64/reference/Void.html | 172 + .../reference/Volatile.html | 185 + arduino-0022-linux-x64/reference/While.html | 171 + arduino-0022-linux-x64/reference/Wire.html | 167 + .../reference/WireAvailable.html | 162 + .../reference/WireBegin.html | 161 + .../reference/WireBeginTransmission.html | 163 + .../reference/WireEndTransmission.html | 167 + .../reference/WireOnReceive.html | 162 + .../reference/WireOnRequest.html | 162 + .../reference/WireReceive.html | 162 + .../reference/WireRequestFrom.html | 165 + .../reference/WireSend.html | 171 + arduino-0022-linux-x64/reference/Word.html | 160 + .../reference/WordCast.html | 169 + arduino-0022-linux-x64/reference/arduino.css | 1 + .../reference/arduinoUno.css | 1 + .../reference/environment.html | 228 + arduino-0022-linux-x64/reference/img/logo.png | Bin 0 -> 9181 bytes arduino-0022-linux-x64/reference/index.html | 309 + .../revisions.txt | 204 +- .../tools/Mangler/make.sh | 0 .../tools/Mangler/src/Mangler.java | 0 .../tools/howto.txt | 0 803 files changed, 69772 insertions(+), 33011 deletions(-) delete mode 100644 arduino-0018-linux-x64/examples/Analog/AnalogInSerial/AnalogInSerial.pde delete mode 100644 arduino-0018-linux-x64/examples/Digital/Blink/Blink.pde delete mode 100644 arduino-0018-linux-x64/examples/Stubs/AnalogReadSerial/AnalogReadSerial.pde delete mode 100644 arduino-0018-linux-x64/examples/Stubs/AnalogReadWrite/AnalogReadWrite.pde delete mode 100644 arduino-0018-linux-x64/examples/Stubs/BareMinumum/BareMinumum.pde delete mode 100644 arduino-0018-linux-x64/examples/Stubs/DigitalReadWrite/DigitalReadWrite.pde delete mode 100644 arduino-0018-linux-x64/examples/Stubs/HelloWorld/HelloWorld.pde delete mode 100755 arduino-0018-linux-x64/hardware/arduino/cores/arduino/WProgram.h delete mode 100755 arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c delete mode 100755 arduino-0018-linux-x64/hardware/tools/avrdude delete mode 100644 arduino-0018-linux-x64/hardware/tools/avrdude.conf delete mode 100644 arduino-0018-linux-x64/lib/antlr.jar delete mode 100644 arduino-0018-linux-x64/lib/core.jar delete mode 100755 arduino-0018-linux-x64/lib/librxtxSerial.so delete mode 100644 arduino-0018-linux-x64/lib/oro.jar delete mode 100644 arduino-0018-linux-x64/lib/pde.jar delete mode 100644 arduino-0018-linux-x64/libraries/Ethernet/examples/ChatServer/ChatServer.pde delete mode 100644 arduino-0018-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde delete mode 100644 arduino-0018-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde delete mode 100755 arduino-0018-linux-x64/libraries/Ethernet/utility/socket.c delete mode 100755 arduino-0018-linux-x64/libraries/Ethernet/utility/socket.h delete mode 100755 arduino-0018-linux-x64/libraries/Ethernet/utility/spi.h delete mode 100755 arduino-0018-linux-x64/libraries/Ethernet/utility/types.h delete mode 100755 arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.c delete mode 100755 arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.h delete mode 100644 arduino-0018-linux-x64/libraries/Firmata/examples/StandardFirmata/StandardFirmata.pde delete mode 100644 arduino-0018-linux-x64/reference/Abs.html delete mode 100644 arduino-0018-linux-x64/reference/AnalogRead.html delete mode 100644 arduino-0018-linux-x64/reference/AnalogReference.html delete mode 100644 arduino-0018-linux-x64/reference/AnalogWrite.html delete mode 100644 arduino-0018-linux-x64/reference/Arithmetic.html delete mode 100644 arduino-0018-linux-x64/reference/Assignment.html delete mode 100644 arduino-0018-linux-x64/reference/AttachInterrupt.html delete mode 100644 arduino-0018-linux-x64/reference/Bit.html delete mode 100644 arduino-0018-linux-x64/reference/BitClear.html delete mode 100644 arduino-0018-linux-x64/reference/BitRead.html delete mode 100644 arduino-0018-linux-x64/reference/BitSet.html delete mode 100644 arduino-0018-linux-x64/reference/BitWrite.html delete mode 100644 arduino-0018-linux-x64/reference/BitwiseXorNot.html delete mode 100644 arduino-0018-linux-x64/reference/Boolean.html delete mode 100644 arduino-0018-linux-x64/reference/BooleanVariables.html delete mode 100644 arduino-0018-linux-x64/reference/Braces.html delete mode 100644 arduino-0018-linux-x64/reference/Break.html delete mode 100644 arduino-0018-linux-x64/reference/Byte.html delete mode 100644 arduino-0018-linux-x64/reference/ByteCast.html delete mode 100644 arduino-0018-linux-x64/reference/Changes.html delete mode 100644 arduino-0018-linux-x64/reference/Char.html delete mode 100644 arduino-0018-linux-x64/reference/CharCast.html delete mode 100644 arduino-0018-linux-x64/reference/ClientAvailable.html delete mode 100644 arduino-0018-linux-x64/reference/ClientConnect.html delete mode 100644 arduino-0018-linux-x64/reference/ClientConnected.html delete mode 100644 arduino-0018-linux-x64/reference/ClientConstructor.html delete mode 100644 arduino-0018-linux-x64/reference/ClientFlush.html delete mode 100644 arduino-0018-linux-x64/reference/ClientPrint.html delete mode 100644 arduino-0018-linux-x64/reference/ClientPrintln.html delete mode 100644 arduino-0018-linux-x64/reference/ClientRead.html delete mode 100644 arduino-0018-linux-x64/reference/ClientStop.html delete mode 100644 arduino-0018-linux-x64/reference/ClientWrite.html delete mode 100644 arduino-0018-linux-x64/reference/Comments.html delete mode 100644 arduino-0018-linux-x64/reference/Comparison.html delete mode 100644 arduino-0018-linux-x64/reference/Const.html delete mode 100644 arduino-0018-linux-x64/reference/Constrain.html delete mode 100644 arduino-0018-linux-x64/reference/Continue.html delete mode 100644 arduino-0018-linux-x64/reference/Cos.html delete mode 100644 arduino-0018-linux-x64/reference/Define.html delete mode 100644 arduino-0018-linux-x64/reference/Delay.html delete mode 100644 arduino-0018-linux-x64/reference/DelayMicroseconds.html delete mode 100644 arduino-0018-linux-x64/reference/DetachInterrupt.html delete mode 100644 arduino-0018-linux-x64/reference/DigitalRead.html delete mode 100644 arduino-0018-linux-x64/reference/DigitalWrite.html delete mode 100644 arduino-0018-linux-x64/reference/DoWhile.html delete mode 100644 arduino-0018-linux-x64/reference/Double.html delete mode 100644 arduino-0018-linux-x64/reference/EEPROM.html delete mode 100644 arduino-0018-linux-x64/reference/EEPROMRead.html delete mode 100644 arduino-0018-linux-x64/reference/EEPROMWrite.html delete mode 100644 arduino-0018-linux-x64/reference/Else.html delete mode 100644 arduino-0018-linux-x64/reference/Ethernet.html delete mode 100644 arduino-0018-linux-x64/reference/EthernetBegin.html delete mode 100644 arduino-0018-linux-x64/reference/FAQ.html delete mode 100644 arduino-0018-linux-x64/reference/Float.html delete mode 100644 arduino-0018-linux-x64/reference/FloatCast.html delete mode 100644 arduino-0018-linux-x64/reference/For.html delete mode 100644 arduino-0018-linux-x64/reference/Fpconstants.html delete mode 100644 arduino-0018-linux-x64/reference/Goto.html delete mode 100644 arduino-0018-linux-x64/reference/Guide_ArduinoBT.html delete mode 100644 arduino-0018-linux-x64/reference/Guide_ArduinoEthernetShield.html delete mode 100644 arduino-0018-linux-x64/reference/Guide_ArduinoLilyPad.html delete mode 100644 arduino-0018-linux-x64/reference/Guide_ArduinoNano.html delete mode 100644 arduino-0018-linux-x64/reference/Guide_MacOSX.html delete mode 100644 arduino-0018-linux-x64/reference/Guide_Windows.html delete mode 100644 arduino-0018-linux-x64/reference/Guide_index.html delete mode 100644 arduino-0018-linux-x64/reference/HighByte.html delete mode 100644 arduino-0018-linux-x64/reference/If.html delete mode 100644 arduino-0018-linux-x64/reference/Include.html delete mode 100644 arduino-0018-linux-x64/reference/Increment.html delete mode 100644 arduino-0018-linux-x64/reference/IncrementCompound.html delete mode 100644 arduino-0018-linux-x64/reference/Int.html delete mode 100644 arduino-0018-linux-x64/reference/IntCast.html delete mode 100644 arduino-0018-linux-x64/reference/Interrupts.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystal.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalAutoscroll.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalBegin.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalBlink.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalClear.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalConstructor.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalCreateChar.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalCursor.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalDisplay.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalHome.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalLeftToRight.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalNoAutoscroll.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalNoBlink.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalNoCursor.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalNoDisplay.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalPrint.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalRightToLeft.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayLeft.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayRight.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalSetCursor.html delete mode 100644 arduino-0018-linux-x64/reference/LiquidCrystalWrite.html delete mode 100644 arduino-0018-linux-x64/reference/Long.html delete mode 100644 arduino-0018-linux-x64/reference/LongCast.html delete mode 100644 arduino-0018-linux-x64/reference/Loop.html delete mode 100644 arduino-0018-linux-x64/reference/LowByte.html delete mode 100644 arduino-0018-linux-x64/reference/Map.html delete mode 100644 arduino-0018-linux-x64/reference/Max.html delete mode 100644 arduino-0018-linux-x64/reference/Micros.html delete mode 100644 arduino-0018-linux-x64/reference/Millis.html delete mode 100644 arduino-0018-linux-x64/reference/Min.html delete mode 100644 arduino-0018-linux-x64/reference/Modulo.html delete mode 100644 arduino-0018-linux-x64/reference/NoInterrupts.html delete mode 100644 arduino-0018-linux-x64/reference/NoTone.html delete mode 100644 arduino-0018-linux-x64/reference/PinMode.html delete mode 100644 arduino-0018-linux-x64/reference/Pointer.html delete mode 100644 arduino-0018-linux-x64/reference/Pow.html delete mode 100644 arduino-0018-linux-x64/reference/PulseIn.html delete mode 100644 arduino-0018-linux-x64/reference/Random.html delete mode 100644 arduino-0018-linux-x64/reference/RandomSeed.html delete mode 100644 arduino-0018-linux-x64/reference/Return.html delete mode 100644 arduino-0018-linux-x64/reference/Scope.html delete mode 100644 arduino-0018-linux-x64/reference/SemiColon.html delete mode 100644 arduino-0018-linux-x64/reference/Serial.html delete mode 100644 arduino-0018-linux-x64/reference/Serial_Available.html delete mode 100644 arduino-0018-linux-x64/reference/Serial_Begin.html delete mode 100644 arduino-0018-linux-x64/reference/Serial_Flush.html delete mode 100644 arduino-0018-linux-x64/reference/Serial_Print.html delete mode 100644 arduino-0018-linux-x64/reference/Serial_Println.html delete mode 100644 arduino-0018-linux-x64/reference/Serial_Read.html delete mode 100644 arduino-0018-linux-x64/reference/Serial_Write.html delete mode 100644 arduino-0018-linux-x64/reference/ServerAvailable.html delete mode 100644 arduino-0018-linux-x64/reference/ServerBegin.html delete mode 100644 arduino-0018-linux-x64/reference/ServerConstructor.html delete mode 100644 arduino-0018-linux-x64/reference/ServerPrint.html delete mode 100644 arduino-0018-linux-x64/reference/ServerPrintln.html delete mode 100644 arduino-0018-linux-x64/reference/ServerWrite.html delete mode 100644 arduino-0018-linux-x64/reference/Servo.html delete mode 100644 arduino-0018-linux-x64/reference/ServoAttach.html delete mode 100644 arduino-0018-linux-x64/reference/ServoAttached.html delete mode 100644 arduino-0018-linux-x64/reference/ServoDetach.html delete mode 100644 arduino-0018-linux-x64/reference/ServoRead.html delete mode 100644 arduino-0018-linux-x64/reference/ServoWrite.html delete mode 100644 arduino-0018-linux-x64/reference/ServoWriteMicroseconds.html delete mode 100644 arduino-0018-linux-x64/reference/Setup.html delete mode 100644 arduino-0018-linux-x64/reference/ShiftOut.html delete mode 100644 arduino-0018-linux-x64/reference/Sin.html delete mode 100644 arduino-0018-linux-x64/reference/Sizeof.html delete mode 100644 arduino-0018-linux-x64/reference/SoftwareSerial.html delete mode 100644 arduino-0018-linux-x64/reference/SoftwareSerialBegin.html delete mode 100644 arduino-0018-linux-x64/reference/SoftwareSerialConstructor.html delete mode 100644 arduino-0018-linux-x64/reference/SoftwareSerialExample.html delete mode 100644 arduino-0018-linux-x64/reference/SoftwareSerialPrint.html delete mode 100644 arduino-0018-linux-x64/reference/SoftwareSerialPrintln.html delete mode 100644 arduino-0018-linux-x64/reference/SoftwareSerialRead.html delete mode 100644 arduino-0018-linux-x64/reference/Sqrt.html delete mode 100644 arduino-0018-linux-x64/reference/Static.html delete mode 100644 arduino-0018-linux-x64/reference/Stepper.html delete mode 100644 arduino-0018-linux-x64/reference/StepperBipolarCircuit.html delete mode 100644 arduino-0018-linux-x64/reference/StepperConstructor.html delete mode 100644 arduino-0018-linux-x64/reference/StepperSetSpeed.html delete mode 100644 arduino-0018-linux-x64/reference/StepperStep.html delete mode 100644 arduino-0018-linux-x64/reference/StepperUnipolarCircuit.html delete mode 100644 arduino-0018-linux-x64/reference/SwitchCase.html delete mode 100644 arduino-0018-linux-x64/reference/Tan.html delete mode 100644 arduino-0018-linux-x64/reference/Tone.html delete mode 100644 arduino-0018-linux-x64/reference/UnsignedChar.html delete mode 100644 arduino-0018-linux-x64/reference/UnsignedInt.html delete mode 100644 arduino-0018-linux-x64/reference/UnsignedLong.html delete mode 100644 arduino-0018-linux-x64/reference/Void.html delete mode 100644 arduino-0018-linux-x64/reference/Volatile.html delete mode 100644 arduino-0018-linux-x64/reference/While.html delete mode 100644 arduino-0018-linux-x64/reference/Wire.html delete mode 100644 arduino-0018-linux-x64/reference/WireAvailable.html delete mode 100644 arduino-0018-linux-x64/reference/WireBegin.html delete mode 100644 arduino-0018-linux-x64/reference/WireBeginTransmission.html delete mode 100644 arduino-0018-linux-x64/reference/WireEndTransmission.html delete mode 100644 arduino-0018-linux-x64/reference/WireOnReceive.html delete mode 100644 arduino-0018-linux-x64/reference/WireOnRequest.html delete mode 100644 arduino-0018-linux-x64/reference/WireReceive.html delete mode 100644 arduino-0018-linux-x64/reference/WireRequestFrom.html delete mode 100644 arduino-0018-linux-x64/reference/WireSend.html delete mode 100644 arduino-0018-linux-x64/reference/Word.html delete mode 100644 arduino-0018-linux-x64/reference/WordCast.html delete mode 100644 arduino-0018-linux-x64/reference/arduino.css delete mode 100644 arduino-0018-linux-x64/reference/environment.html delete mode 100644 arduino-0018-linux-x64/reference/index.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/arduino (65%) create mode 100644 arduino-0022-linux-x64/examples/1.Basics/AnalogReadSerial/AnalogReadSerial.pde create mode 100644 arduino-0022-linux-x64/examples/1.Basics/BareMinimum/BareMinimum.pde create mode 100644 arduino-0022-linux-x64/examples/1.Basics/Blink/Blink.pde rename {arduino-0018-linux-x64/examples/Stubs => arduino-0022-linux-x64/examples/1.Basics}/DigitalReadSerial/DigitalReadSerial.pde (51%) create mode 100644 arduino-0022-linux-x64/examples/1.Basics/Fade/Fade.pde rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/BlinkWithoutDelay/BlinkWithoutDelay.pde (76%) rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/Button/Button.pde (87%) rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/Debounce/Debounce.pde (98%) rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/StateChangeDetection/StateChangeDetection.pde (92%) rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/toneKeyboard/pitches.h (100%) rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/toneKeyboard/toneKeyboard.pde (93%) rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/toneMelody/pitches.h (100%) rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/toneMelody/toneMelody.pde (90%) create mode 100644 arduino-0022-linux-x64/examples/2.Digital/toneMultiple/pitches.h create mode 100644 arduino-0022-linux-x64/examples/2.Digital/toneMultiple/toneMultiple.pde rename {arduino-0018-linux-x64/examples/Digital => arduino-0022-linux-x64/examples/2.Digital}/tonePitchFollower/tonePitchFollower.pde (88%) rename {arduino-0018-linux-x64/examples/Analog => arduino-0022-linux-x64/examples/3.Analog}/AnalogInOutSerial/AnalogInOutSerial.pde (90%) rename {arduino-0018-linux-x64/examples/Analog => arduino-0022-linux-x64/examples/3.Analog}/AnalogInput/AnalogInput.pde (90%) rename {arduino-0018-linux-x64/examples/Analog => arduino-0022-linux-x64/examples/3.Analog}/AnalogWriteMega/AnalogWriteMega.pde (95%) rename {arduino-0018-linux-x64/examples/Analog => arduino-0022-linux-x64/examples/3.Analog}/Calibration/Calibration.pde (79%) rename {arduino-0018-linux-x64/examples/Analog => arduino-0022-linux-x64/examples/3.Analog}/Fading/Fading.pde (95%) rename {arduino-0018-linux-x64/examples/Analog => arduino-0022-linux-x64/examples/3.Analog}/Smoothing/Smoothing.pde (96%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/ASCIITable/ASCIITable.pde (97%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/Dimmer/Dimmer.pde (98%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/Graph/Graph.pde (99%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/MIDI/Midi.pde (96%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/MultiSerialMega/MultiSerialMega.pde (92%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/PhysicalPixel/PhysicalPixel.pde (99%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/SerialCallResponse/SerialCallResponse.pde (99%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/SerialCallResponseASCII/SerialCallResponseASCII.pde (99%) rename {arduino-0018-linux-x64/examples/Communication => arduino-0022-linux-x64/examples/4.Communication}/VirtualColorMixer/VirtualColorMixer.pde (98%) rename {arduino-0018-linux-x64/examples/Control => arduino-0022-linux-x64/examples/5.Control}/Arrays/Arrays.pde (97%) rename {arduino-0018-linux-x64/examples/Control => arduino-0022-linux-x64/examples/5.Control}/ForLoopIteration/ForLoopIteration.pde (95%) rename {arduino-0018-linux-x64/examples/Control => arduino-0022-linux-x64/examples/5.Control}/IfStatementConditional/IfStatementConditional.pde (88%) rename {arduino-0018-linux-x64/examples/Control => arduino-0022-linux-x64/examples/5.Control}/WhileStatementConditional/WhileStatementConditional.pde (85%) rename {arduino-0018-linux-x64/examples/Control => arduino-0022-linux-x64/examples/5.Control}/switchCase/switchCase.pde (93%) rename {arduino-0018-linux-x64/examples/Control => arduino-0022-linux-x64/examples/5.Control}/switchCase2/switchCase2.pde (97%) rename {arduino-0018-linux-x64/examples/Sensors => arduino-0022-linux-x64/examples/6.Sensors}/ADXL3xx/ADXL3xx.pde (86%) rename {arduino-0018-linux-x64/examples/Sensors => arduino-0022-linux-x64/examples/6.Sensors}/Knock/Knock.pde (92%) rename {arduino-0018-linux-x64/examples/Sensors => arduino-0022-linux-x64/examples/6.Sensors}/Memsic2125/Memsic2125.pde (96%) rename {arduino-0018-linux-x64/examples/Sensors => arduino-0022-linux-x64/examples/6.Sensors}/Ping/Ping.pde (98%) rename {arduino-0018-linux-x64/examples/Display => arduino-0022-linux-x64/examples/7.Display}/RowColumnScanning/RowColumnScanning.pde (94%) rename {arduino-0018-linux-x64/examples/Display => arduino-0022-linux-x64/examples/7.Display}/barGraph/barGraph.pde (91%) create mode 100644 arduino-0022-linux-x64/examples/8.Strings/CharacterAnalysis/CharacterAnalysis.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringAdditionOperator/StringAdditionOperator.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringAppendOperator/StringAppendOperator.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringCaseChanges/StringCaseChanges.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringCharacters/StringCharacters.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringComparisonOperators/StringComparisonOperators.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringConstructors/StringConstructors.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringIndexOf/StringIndexOf.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringLength/StringLength.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringLengthTrim/StringLengthTrim.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringReplace/StringReplace.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringStartsWithEndsWith/StringStartsWithEndsWith.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringSubstring/StringSubstring.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringToInt/StringToInt.pde create mode 100644 arduino-0022-linux-x64/examples/8.Strings/StringToIntRGB/StringToIntRGB.pde rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/examples/ArduinoISP/ArduinoISP.pde (99%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/boards.txt (64%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_ng.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega/Makefile (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.c (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/atmega8/Makefile (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c (97%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.hex (100%) create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/bt/ATmegaBOOT_168_atmega328_bt.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/bt/Makefile rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/lilypad/LilyPadBOOT_168.hex (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/lilypad/src/ATmegaBOOT.c (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/bootloaders/lilypad/src/Makefile (100%) create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/Makefile create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/makeall create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot.c create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.lst create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/License.txt create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/Makefile create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnps create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/command.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.c create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.ppg create mode 100644 arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/HardwareSerial.cpp (50%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/HardwareSerial.h (76%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/Print.cpp (95%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/Print.h (95%) mode change 100755 => 100644 create mode 100644 arduino-0022-linux-x64/hardware/arduino/cores/arduino/Stream.h rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/Tone.cpp (78%) mode change 100755 => 100644 create mode 100644 arduino-0022-linux-x64/hardware/arduino/cores/arduino/WCharacter.h rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/WConstants.h (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/WInterrupts.c (74%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/WMath.cpp (100%) create mode 100644 arduino-0022-linux-x64/hardware/arduino/cores/arduino/WProgram.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.cpp create mode 100644 arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.h rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/binary.h (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/main.cpp (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/pins_arduino.c (97%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/pins_arduino.h (88%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/wiring.c (73%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/wiring.h (89%) mode change 100755 => 100644 create mode 100644 arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/wiring_digital.c (50%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/wiring_private.h (96%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/wiring_pulse.c (91%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/cores/arduino/wiring_shift.c (77%) mode change 100755 => 100644 create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/MEGA-dfu_and_usbserial_combined.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/README.txt create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/UNO-dfu_and_usbserial_combined.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.c create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Board/LEDs.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.c create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/makefile create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/readme.txt create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-mega.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-uno.hex create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.c create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Board/LEDs.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.c create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Lib/LightweightRingBuff.h create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/makefile create mode 100644 arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/readme.txt rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/hardware/arduino/programmers.txt (100%) create mode 100755 arduino-0022-linux-x64/hardware/tools/avrdude rename arduino-0018-linux-x64/hardware/tools/avrdude.conf~ => arduino-0022-linux-x64/hardware/tools/avrdude.conf (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/RXTXcomm.jar (89%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/about.jpg (100%) mode change 100755 => 100644 create mode 100644 arduino-0022-linux-x64/lib/core.jar rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/ecj.jar (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/jna.jar (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/keywords.txt (94%) create mode 100644 arduino-0022-linux-x64/lib/librxtxSerial.so create mode 100644 arduino-0022-linux-x64/lib/pde.jar rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/preferences.txt (83%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/buttons.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/resize.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-sel-left.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-sel-menu.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-sel-mid.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-sel-right.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-unsel-left.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-unsel-menu.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-unsel-mid.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/tab-unsel-right.gif (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/lib/theme/theme.txt (100%) create mode 100644 arduino-0022-linux-x64/lib/version.txt create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.cpp create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.h create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/avr_cpunames.h create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Constants/ATS_Constants.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Delay/ATS_Delay.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_General/ATS_General.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_File/ATS_SD_File.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Skeleton/ATS_Skeleton.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_StringIndexOfMemory/ATS_StringIndexOfMemory.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_StringTest/ATS_StringTest.pde create mode 100644 arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_ToneTest/ATS_ToneTest.pde rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/EEPROM/EEPROM.cpp (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/EEPROM/EEPROM.h (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/EEPROM/examples/eeprom_clear/eeprom_clear.pde (86%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/EEPROM/examples/eeprom_read/eeprom_read.pde (93%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/EEPROM/examples/eeprom_write/eeprom_write.pde (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/EEPROM/keywords.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Ethernet/Client.cpp (53%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Ethernet/Client.h (70%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Ethernet/Ethernet.cpp (59%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Ethernet/Ethernet.h (83%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Ethernet/Server.cpp (74%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Ethernet/Server.h (72%) create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/Udp.cpp create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/Udp.h create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/BarometricPressureWebServer/BarometricPressureWebServer.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/ChatServer/ChatServer.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClient/PachubeClient.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClientString/PachubeClientString.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/TelnetClient/TelnetClient.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/UDPSendReceiveString/UDPSendReceiveString.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/UdpNtpClient/UdpNtpClient.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Ethernet/keywords.txt (100%) create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/utility/socket.cpp create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/utility/socket.h create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.cpp create mode 100644 arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.h create mode 100644 arduino-0022-linux-x64/libraries/Firmata/Boards.h rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/Firmata.cpp (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/Firmata.h (57%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/LICENSE.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/TODO.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde (67%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde (93%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/AnalogFirmata/Makefile (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/EchoString/EchoString.pde (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/EchoString/Makefile (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/I2CFirmata/I2CFirmata.pde (96%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/OldStandardFirmata/LICENSE.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde (93%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/ServoFirmata/Makefile (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde (61%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde (51%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde (70%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/StandardFirmata/LICENSE.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/examples/StandardFirmata/Makefile (100%) create mode 100644 arduino-0022-linux-x64/libraries/Firmata/examples/StandardFirmata/StandardFirmata.pde create mode 100644 arduino-0022-linux-x64/libraries/Firmata/examples/StandardFirmata_2_2_forUNO_0_3/StandardFirmata_2_2_forUNO_0_3.pde rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Firmata/keywords.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/LiquidCrystal.cpp (99%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/LiquidCrystal.h (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/Autoscroll/Autoscroll.pde (94%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/Blink/Blink.pde (89%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/Cursor/Cursor.pde (89%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/Display/Display.pde (89%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/HelloWorld/HelloWorld.pde (89%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/Scroll/Scroll.pde (93%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/SerialDisplay/SerialDisplay.pde (90%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/TextDirection/TextDirection.pde (91%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/examples/setCursor/setCursor.pde (89%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/LiquidCrystal/keywords.txt (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Matrix/Matrix.cpp (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Matrix/Matrix.h (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Matrix/examples/hello_matrix/hello_matrix.pde (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Matrix/examples/sprite_animation/sprite_animation.pde (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Matrix/keywords.txt (100%) create mode 100644 arduino-0022-linux-x64/libraries/SD/File.cpp create mode 100644 arduino-0022-linux-x64/libraries/SD/README.txt create mode 100644 arduino-0022-linux-x64/libraries/SD/SD.cpp create mode 100644 arduino-0022-linux-x64/libraries/SD/SD.h create mode 100644 arduino-0022-linux-x64/libraries/SD/examples/Datalogger/Datalogger.pde create mode 100644 arduino-0022-linux-x64/libraries/SD/examples/DumpFile/DumpFile.pde create mode 100644 arduino-0022-linux-x64/libraries/SD/examples/Files/Files.pde create mode 100644 arduino-0022-linux-x64/libraries/SD/examples/ReadWrite/ReadWrite.pde create mode 100644 arduino-0022-linux-x64/libraries/SD/keywords.txt create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/FatStructs.h create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.cpp create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.h create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/Sd2PinMap.h create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/SdFat.h create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/SdFatUtil.h create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/SdFatmainpage.h create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/SdFile.cpp create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/SdInfo.h create mode 100644 arduino-0022-linux-x64/libraries/SD/utility/SdVolume.cpp create mode 100644 arduino-0022-linux-x64/libraries/SPI/SPI.cpp create mode 100644 arduino-0022-linux-x64/libraries/SPI/SPI.h create mode 100644 arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.pde create mode 100644 arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor/BarometricPressureSensor.pde create mode 100644 arduino-0022-linux-x64/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.pde create mode 100644 arduino-0022-linux-x64/libraries/SPI/keywords.txt rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Servo/Servo.cpp (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Servo/Servo.h (98%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Servo/examples/Knob/Knob.pde (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Servo/examples/Sweep/Sweep.pde (95%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Servo/keywords.txt (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/SoftwareSerial/SoftwareSerial.cpp (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/SoftwareSerial/SoftwareSerial.h (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/SoftwareSerial/keywords.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Sprite/Sprite.cpp (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Sprite/Sprite.h (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Sprite/binary.h (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Sprite/keywords.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Stepper/Stepper.cpp (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Stepper/Stepper.h (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Stepper/examples/MotorKnob/MotorKnob.pde (94%) create mode 100644 arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.pde create mode 100644 arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.pde create mode 100644 arduino-0022-linux-x64/libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.pde rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Stepper/keywords.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/Wire.cpp (96%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/Wire.h (96%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde (98%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde (90%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/examples/master_reader/master_reader.pde (93%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/examples/master_writer/master_writer.pde (92%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/examples/slave_receiver/slave_receiver.pde (95%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/examples/slave_sender/slave_sender.pde (93%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/keywords.txt (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/utility/twi.c (96%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/libraries/Wire/utility/twi.h (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/ASCIIchart.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Abs.html create mode 100644 arduino-0022-linux-x64/reference/AnalogRead.html create mode 100644 arduino-0022-linux-x64/reference/AnalogReference.html create mode 100644 arduino-0022-linux-x64/reference/AnalogWrite.html create mode 100644 arduino-0022-linux-x64/reference/Arithmetic.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Array.html (51%) create mode 100644 arduino-0022-linux-x64/reference/Assignment.html create mode 100644 arduino-0022-linux-x64/reference/AttachInterrupt.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/BeginSerial.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Bit.html create mode 100644 arduino-0022-linux-x64/reference/BitClear.html create mode 100644 arduino-0022-linux-x64/reference/BitRead.html create mode 100644 arduino-0022-linux-x64/reference/BitSet.html create mode 100644 arduino-0022-linux-x64/reference/BitWrite.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Bitshift.html (50%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/BitwiseAnd.html (62%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/BitwiseCompound.html (70%) create mode 100644 arduino-0022-linux-x64/reference/BitwiseCompoundAnd.html create mode 100644 arduino-0022-linux-x64/reference/BitwiseCompoundOr.html create mode 100644 arduino-0022-linux-x64/reference/BitwiseXorNot.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Board.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Boolean.html create mode 100644 arduino-0022-linux-x64/reference/BooleanVariables.html create mode 100644 arduino-0022-linux-x64/reference/Braces.html create mode 100644 arduino-0022-linux-x64/reference/Break.html create mode 100644 arduino-0022-linux-x64/reference/Byte.html create mode 100644 arduino-0022-linux-x64/reference/ByteCast.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Cast.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Changes.html create mode 100644 arduino-0022-linux-x64/reference/Char.html create mode 100644 arduino-0022-linux-x64/reference/CharCast.html create mode 100644 arduino-0022-linux-x64/reference/ClientAvailable.html create mode 100644 arduino-0022-linux-x64/reference/ClientConnect.html create mode 100644 arduino-0022-linux-x64/reference/ClientConnected.html create mode 100644 arduino-0022-linux-x64/reference/ClientConstructor.html create mode 100644 arduino-0022-linux-x64/reference/ClientFlush.html create mode 100644 arduino-0022-linux-x64/reference/ClientPrint.html create mode 100644 arduino-0022-linux-x64/reference/ClientPrintln.html create mode 100644 arduino-0022-linux-x64/reference/ClientRead.html create mode 100644 arduino-0022-linux-x64/reference/ClientStop.html create mode 100644 arduino-0022-linux-x64/reference/ClientWrite.html create mode 100644 arduino-0022-linux-x64/reference/Comments.html create mode 100644 arduino-0022-linux-x64/reference/Comparison.html create mode 100644 arduino-0022-linux-x64/reference/Const.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Constants.html (56%) create mode 100644 arduino-0022-linux-x64/reference/Constrain.html create mode 100644 arduino-0022-linux-x64/reference/Continue.html create mode 100644 arduino-0022-linux-x64/reference/Cos.html create mode 100644 arduino-0022-linux-x64/reference/Define.html create mode 100644 arduino-0022-linux-x64/reference/Delay.html create mode 100644 arduino-0022-linux-x64/reference/DelayMicroseconds.html create mode 100644 arduino-0022-linux-x64/reference/DetachInterrupt.html create mode 100644 arduino-0022-linux-x64/reference/DigitalRead.html create mode 100644 arduino-0022-linux-x64/reference/DigitalWrite.html create mode 100644 arduino-0022-linux-x64/reference/DoWhile.html create mode 100644 arduino-0022-linux-x64/reference/Double.html create mode 100644 arduino-0022-linux-x64/reference/EEPROM.html create mode 100644 arduino-0022-linux-x64/reference/EEPROMRead.html create mode 100644 arduino-0022-linux-x64/reference/EEPROMWrite.html create mode 100644 arduino-0022-linux-x64/reference/Else.html create mode 100644 arduino-0022-linux-x64/reference/Ethernet.html create mode 100644 arduino-0022-linux-x64/reference/EthernetBegin.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Extended.html (100%) create mode 100644 arduino-0022-linux-x64/reference/FAQ.html create mode 100644 arduino-0022-linux-x64/reference/FileAvailable.html create mode 100644 arduino-0022-linux-x64/reference/FileClose.html create mode 100644 arduino-0022-linux-x64/reference/FileFlush.html create mode 100644 arduino-0022-linux-x64/reference/FilePeek.html create mode 100644 arduino-0022-linux-x64/reference/FilePosition.html create mode 100644 arduino-0022-linux-x64/reference/FilePrint.html create mode 100644 arduino-0022-linux-x64/reference/FilePrintln.html create mode 100644 arduino-0022-linux-x64/reference/FileRead.html create mode 100644 arduino-0022-linux-x64/reference/FileSeek.html create mode 100644 arduino-0022-linux-x64/reference/FileSize.html create mode 100644 arduino-0022-linux-x64/reference/FileWrite.html create mode 100644 arduino-0022-linux-x64/reference/Float.html create mode 100644 arduino-0022-linux-x64/reference/FloatCast.html create mode 100644 arduino-0022-linux-x64/reference/For.html create mode 100644 arduino-0022-linux-x64/reference/Fpconstants.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/FunctionDeclaration.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Goto.html create mode 100644 arduino-0022-linux-x64/reference/Guide_ArduinoBT.html create mode 100644 arduino-0022-linux-x64/reference/Guide_ArduinoEthernetShield.html create mode 100644 arduino-0022-linux-x64/reference/Guide_ArduinoLilyPad.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_ArduinoMini.html (58%) create mode 100644 arduino-0022-linux-x64/reference/Guide_ArduinoNano.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_ArduinoPro.html (57%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_ArduinoProMini.html (50%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_ArduinoXbeeShield.html (66%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_Board.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_Environment.html (65%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_Guide.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_HomePage.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_Introduction.html (50%) create mode 100644 arduino-0022-linux-x64/reference/Guide_MacOSX.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_RecentChanges.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_References.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Guide_Troubleshooting.html (80%) create mode 100644 arduino-0022-linux-x64/reference/Guide_Windows.html create mode 100644 arduino-0022-linux-x64/reference/Guide_index.html create mode 100644 arduino-0022-linux-x64/reference/HighByte.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/HomePage.html (100%) create mode 100644 arduino-0022-linux-x64/reference/If.html create mode 100644 arduino-0022-linux-x64/reference/Include.html create mode 100644 arduino-0022-linux-x64/reference/Increment.html create mode 100644 arduino-0022-linux-x64/reference/IncrementCompound.html create mode 100644 arduino-0022-linux-x64/reference/Int.html create mode 100644 arduino-0022-linux-x64/reference/IntCast.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/IntegerConstants.html (52%) create mode 100644 arduino-0022-linux-x64/reference/Interrupts.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Keywords.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Libraries.html (58%) create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystal.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalAutoscroll.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalBegin.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalBlink.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalClear.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalConstructor.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalCreateChar.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalCursor.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalDisplay.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalHome.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalLeftToRight.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalNoAutoscroll.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalNoBlink.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalNoCursor.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalNoDisplay.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalPrint.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalRightToLeft.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalScrollDisplayLeft.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalScrollDisplayRight.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalSetCursor.html create mode 100644 arduino-0022-linux-x64/reference/LiquidCrystalWrite.html create mode 100644 arduino-0022-linux-x64/reference/Long.html create mode 100644 arduino-0022-linux-x64/reference/LongCast.html create mode 100644 arduino-0022-linux-x64/reference/Loop.html create mode 100644 arduino-0022-linux-x64/reference/LowByte.html create mode 100644 arduino-0022-linux-x64/reference/Map.html create mode 100644 arduino-0022-linux-x64/reference/Max.html create mode 100644 arduino-0022-linux-x64/reference/Micros.html create mode 100644 arduino-0022-linux-x64/reference/Millis.html create mode 100644 arduino-0022-linux-x64/reference/Min.html create mode 100644 arduino-0022-linux-x64/reference/Modulo.html create mode 100644 arduino-0022-linux-x64/reference/NoInterrupts.html create mode 100644 arduino-0022-linux-x64/reference/NoTone.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PROGMEM.html (100%) create mode 100644 arduino-0022-linux-x64/reference/PinMode.html create mode 100644 arduino-0022-linux-x64/reference/Pointer.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PortManipulation.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Pow.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintBinary.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintByte.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintHex.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintInteger.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintMode.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintNewline.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintOctal.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/PrintString.html (100%) create mode 100644 arduino-0022-linux-x64/reference/PulseIn.html create mode 100644 arduino-0022-linux-x64/reference/Random.html create mode 100644 arduino-0022-linux-x64/reference/RandomSeed.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/RecentChanges.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Return.html create mode 100644 arduino-0022-linux-x64/reference/SD.html create mode 100644 arduino-0022-linux-x64/reference/SDbegin.html create mode 100644 arduino-0022-linux-x64/reference/SDexists.html create mode 100644 arduino-0022-linux-x64/reference/SDmkdir.html create mode 100644 arduino-0022-linux-x64/reference/SDopen.html create mode 100644 arduino-0022-linux-x64/reference/SDremove.html create mode 100644 arduino-0022-linux-x64/reference/SDrmdir.html create mode 100644 arduino-0022-linux-x64/reference/SPI.html create mode 100644 arduino-0022-linux-x64/reference/SPIBegin.html create mode 100644 arduino-0022-linux-x64/reference/SPIEnd.html create mode 100644 arduino-0022-linux-x64/reference/SPISetBitOrder.html create mode 100644 arduino-0022-linux-x64/reference/SPISetClockDivider.html create mode 100644 arduino-0022-linux-x64/reference/SPISetDataMode.html create mode 100644 arduino-0022-linux-x64/reference/SPITransfer.html create mode 100644 arduino-0022-linux-x64/reference/Scope.html create mode 100644 arduino-0022-linux-x64/reference/SemiColon.html create mode 100644 arduino-0022-linux-x64/reference/Serial.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/SerialAvailable.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/SerialRead.html (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/SerialWrite.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Serial_Available.html create mode 100644 arduino-0022-linux-x64/reference/Serial_Begin.html create mode 100644 arduino-0022-linux-x64/reference/Serial_End.html create mode 100644 arduino-0022-linux-x64/reference/Serial_Flush.html create mode 100644 arduino-0022-linux-x64/reference/Serial_Peek.html create mode 100644 arduino-0022-linux-x64/reference/Serial_Print.html create mode 100644 arduino-0022-linux-x64/reference/Serial_Println.html create mode 100644 arduino-0022-linux-x64/reference/Serial_Read.html create mode 100644 arduino-0022-linux-x64/reference/Serial_Write.html create mode 100644 arduino-0022-linux-x64/reference/ServerAvailable.html create mode 100644 arduino-0022-linux-x64/reference/ServerBegin.html create mode 100644 arduino-0022-linux-x64/reference/ServerConstructor.html create mode 100644 arduino-0022-linux-x64/reference/ServerPrint.html create mode 100644 arduino-0022-linux-x64/reference/ServerPrintln.html create mode 100644 arduino-0022-linux-x64/reference/ServerWrite.html create mode 100644 arduino-0022-linux-x64/reference/Servo.html create mode 100644 arduino-0022-linux-x64/reference/ServoAttach.html create mode 100644 arduino-0022-linux-x64/reference/ServoAttached.html create mode 100644 arduino-0022-linux-x64/reference/ServoDetach.html create mode 100644 arduino-0022-linux-x64/reference/ServoRead.html create mode 100644 arduino-0022-linux-x64/reference/ServoWrite.html create mode 100644 arduino-0022-linux-x64/reference/ServoWriteMicroseconds.html create mode 100644 arduino-0022-linux-x64/reference/Setup.html create mode 100644 arduino-0022-linux-x64/reference/ShiftOut.html create mode 100644 arduino-0022-linux-x64/reference/Sin.html create mode 100644 arduino-0022-linux-x64/reference/Sizeof.html create mode 100644 arduino-0022-linux-x64/reference/SoftwareSerial.html create mode 100644 arduino-0022-linux-x64/reference/SoftwareSerialBegin.html create mode 100644 arduino-0022-linux-x64/reference/SoftwareSerialConstructor.html create mode 100644 arduino-0022-linux-x64/reference/SoftwareSerialExample.html create mode 100644 arduino-0022-linux-x64/reference/SoftwareSerialPrint.html create mode 100644 arduino-0022-linux-x64/reference/SoftwareSerialPrintln.html create mode 100644 arduino-0022-linux-x64/reference/SoftwareSerialRead.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/Sq.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Sqrt.html create mode 100644 arduino-0022-linux-x64/reference/Static.html create mode 100644 arduino-0022-linux-x64/reference/Stepper.html create mode 100644 arduino-0022-linux-x64/reference/StepperBipolarCircuit.html create mode 100644 arduino-0022-linux-x64/reference/StepperConstructor.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/StepperExample.html (100%) create mode 100644 arduino-0022-linux-x64/reference/StepperSetSpeed.html create mode 100644 arduino-0022-linux-x64/reference/StepperStep.html create mode 100644 arduino-0022-linux-x64/reference/StepperUnipolarCircuit.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/String.html (51%) create mode 100644 arduino-0022-linux-x64/reference/StringBrackets.html create mode 100644 arduino-0022-linux-x64/reference/StringCharAt.html create mode 100644 arduino-0022-linux-x64/reference/StringClass.html create mode 100644 arduino-0022-linux-x64/reference/StringCompareTo.html create mode 100644 arduino-0022-linux-x64/reference/StringComparison.html create mode 100644 arduino-0022-linux-x64/reference/StringConcat.html create mode 100644 arduino-0022-linux-x64/reference/StringConstructor.html create mode 100644 arduino-0022-linux-x64/reference/StringEndsWith.html create mode 100644 arduino-0022-linux-x64/reference/StringEquals.html create mode 100644 arduino-0022-linux-x64/reference/StringEqualsIgnoreCase.html create mode 100644 arduino-0022-linux-x64/reference/StringGetBytes.html create mode 100644 arduino-0022-linux-x64/reference/StringIndexOf.html create mode 100644 arduino-0022-linux-x64/reference/StringLastIndexOf.html create mode 100644 arduino-0022-linux-x64/reference/StringLength.html create mode 100644 arduino-0022-linux-x64/reference/StringObject.html create mode 100644 arduino-0022-linux-x64/reference/StringPlus.html create mode 100644 arduino-0022-linux-x64/reference/StringReplace.html create mode 100644 arduino-0022-linux-x64/reference/StringSetCharAt.html create mode 100644 arduino-0022-linux-x64/reference/StringStartsWith.html create mode 100644 arduino-0022-linux-x64/reference/StringSubstring.html create mode 100644 arduino-0022-linux-x64/reference/StringToCharArray.html create mode 100644 arduino-0022-linux-x64/reference/StringToLowerCase.html create mode 100644 arduino-0022-linux-x64/reference/StringToUpperCase.html create mode 100644 arduino-0022-linux-x64/reference/StringTrim.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/StyleGuide.html (100%) create mode 100644 arduino-0022-linux-x64/reference/SwitchCase.html create mode 100644 arduino-0022-linux-x64/reference/Tan.html create mode 100644 arduino-0022-linux-x64/reference/Tone.html create mode 100644 arduino-0022-linux-x64/reference/UnsignedChar.html create mode 100644 arduino-0022-linux-x64/reference/UnsignedInt.html create mode 100644 arduino-0022-linux-x64/reference/UnsignedLong.html rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/reference/VariableDeclaration.html (100%) create mode 100644 arduino-0022-linux-x64/reference/Void.html create mode 100644 arduino-0022-linux-x64/reference/Volatile.html create mode 100644 arduino-0022-linux-x64/reference/While.html create mode 100644 arduino-0022-linux-x64/reference/Wire.html create mode 100644 arduino-0022-linux-x64/reference/WireAvailable.html create mode 100644 arduino-0022-linux-x64/reference/WireBegin.html create mode 100644 arduino-0022-linux-x64/reference/WireBeginTransmission.html create mode 100644 arduino-0022-linux-x64/reference/WireEndTransmission.html create mode 100644 arduino-0022-linux-x64/reference/WireOnReceive.html create mode 100644 arduino-0022-linux-x64/reference/WireOnRequest.html create mode 100644 arduino-0022-linux-x64/reference/WireReceive.html create mode 100644 arduino-0022-linux-x64/reference/WireRequestFrom.html create mode 100644 arduino-0022-linux-x64/reference/WireSend.html create mode 100644 arduino-0022-linux-x64/reference/Word.html create mode 100644 arduino-0022-linux-x64/reference/WordCast.html create mode 100644 arduino-0022-linux-x64/reference/arduino.css create mode 100644 arduino-0022-linux-x64/reference/arduinoUno.css create mode 100644 arduino-0022-linux-x64/reference/environment.html create mode 100644 arduino-0022-linux-x64/reference/img/logo.png create mode 100644 arduino-0022-linux-x64/reference/index.html rename arduino-0018-linux-x64/readme.txt => arduino-0022-linux-x64/revisions.txt (73%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/tools/Mangler/make.sh (100%) mode change 100755 => 100644 rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/tools/Mangler/src/Mangler.java (100%) rename {arduino-0018-linux-x64 => arduino-0022-linux-x64}/tools/howto.txt (100%) diff --git a/arduino-0018-linux-x64/examples/Analog/AnalogInSerial/AnalogInSerial.pde b/arduino-0018-linux-x64/examples/Analog/AnalogInSerial/AnalogInSerial.pde deleted file mode 100644 index c8fa158..0000000 --- a/arduino-0018-linux-x64/examples/Analog/AnalogInSerial/AnalogInSerial.pde +++ /dev/null @@ -1,29 +0,0 @@ -/* - Analog input, serial output - - Reads an analog input pin, prints the results to the serial monitor. - - The circuit: - - * potentiometer connected to analog pin 0. - Center pin of the potentiometer goes to the analog pin. - side pins of the potentiometer go to +5V and ground - - created over and over again - by Tom Igoe and everyone who's ever used Arduino - - */ - - void setup() { - Serial.begin(9600); - } - - void loop() { - // read the analog input into a variable: - int analogValue = analogRead(0); - // print the result: - Serial.println(analogValue); - // wait 10 milliseconds for the analog-to-digital converter - // to settle after the last reading: - delay(10); - } diff --git a/arduino-0018-linux-x64/examples/Digital/Blink/Blink.pde b/arduino-0018-linux-x64/examples/Digital/Blink/Blink.pde deleted file mode 100644 index 5d27483..0000000 --- a/arduino-0018-linux-x64/examples/Digital/Blink/Blink.pde +++ /dev/null @@ -1,40 +0,0 @@ -/* - Blink - - Turns on an LED on for one second, then off for one second, repeatedly. - - The circuit: - * LED connected from digital pin 13 to ground. - - * Note: On most Arduino boards, there is already an LED on the board - connected to pin 13, so you don't need any extra components for this example. - - - Created 1 June 2005 - By David Cuartielles - - http://arduino.cc/en/Tutorial/Blink - - based on an orginal by H. Barragan for the Wiring i/o board - - */ - -int ledPin = 13; // LED connected to digital pin 13 - -// The setup() method runs once, when the sketch starts - -void setup() { - // initialize the digital pin as an output: - pinMode(ledPin, OUTPUT); -} - -// the loop() method runs over and over again, -// as long as the Arduino has power - -void loop() -{ - digitalWrite(ledPin, HIGH); // set the LED on - delay(1000); // wait for a second - digitalWrite(ledPin, LOW); // set the LED off - delay(1000); // wait for a second -} diff --git a/arduino-0018-linux-x64/examples/Stubs/AnalogReadSerial/AnalogReadSerial.pde b/arduino-0018-linux-x64/examples/Stubs/AnalogReadSerial/AnalogReadSerial.pde deleted file mode 100644 index f0ce8f4..0000000 --- a/arduino-0018-linux-x64/examples/Stubs/AnalogReadSerial/AnalogReadSerial.pde +++ /dev/null @@ -1,12 +0,0 @@ - -void setup() { - Serial.begin(9600); -} - -void loop() { - int sensorValue = analogRead(0); - Serial.println(sensorValue, DEC); -} - - - diff --git a/arduino-0018-linux-x64/examples/Stubs/AnalogReadWrite/AnalogReadWrite.pde b/arduino-0018-linux-x64/examples/Stubs/AnalogReadWrite/AnalogReadWrite.pde deleted file mode 100644 index 3dc8052..0000000 --- a/arduino-0018-linux-x64/examples/Stubs/AnalogReadWrite/AnalogReadWrite.pde +++ /dev/null @@ -1,13 +0,0 @@ - -void setup() { - pinMode(6, OUTPUT); -} - -void loop() { - int sensorValue = analogRead(2); - int ledFadeValue = map(sensorValue, 0, 1023, 0, 255); - analogWrite(6, ledFadeValue); -} - - - diff --git a/arduino-0018-linux-x64/examples/Stubs/BareMinumum/BareMinumum.pde b/arduino-0018-linux-x64/examples/Stubs/BareMinumum/BareMinumum.pde deleted file mode 100644 index b1a29e5..0000000 --- a/arduino-0018-linux-x64/examples/Stubs/BareMinumum/BareMinumum.pde +++ /dev/null @@ -1,9 +0,0 @@ -void setup() { - -} - -void loop() { - -} - - diff --git a/arduino-0018-linux-x64/examples/Stubs/DigitalReadWrite/DigitalReadWrite.pde b/arduino-0018-linux-x64/examples/Stubs/DigitalReadWrite/DigitalReadWrite.pde deleted file mode 100644 index f4ca3c5..0000000 --- a/arduino-0018-linux-x64/examples/Stubs/DigitalReadWrite/DigitalReadWrite.pde +++ /dev/null @@ -1,12 +0,0 @@ - -void setup() { - pinMode(13, OUTPUT); -} - -void loop() { - int switchValue = digitalRead(2); - digitalWrite(13, switchValue); -} - - - diff --git a/arduino-0018-linux-x64/examples/Stubs/HelloWorld/HelloWorld.pde b/arduino-0018-linux-x64/examples/Stubs/HelloWorld/HelloWorld.pde deleted file mode 100644 index 628a9f3..0000000 --- a/arduino-0018-linux-x64/examples/Stubs/HelloWorld/HelloWorld.pde +++ /dev/null @@ -1,9 +0,0 @@ -void setup() { - Serial.begin(9600); -} - -void loop() { - Serial.println("Hello World!"); -} - - diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/WProgram.h b/arduino-0018-linux-x64/hardware/arduino/cores/arduino/WProgram.h deleted file mode 100755 index f5d3e29..0000000 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/WProgram.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef WProgram_h -#define WProgram_h - -#include -#include -#include - -#include - -#include "wiring.h" - -#ifdef __cplusplus -#include "HardwareSerial.h" - -uint16_t makeWord(uint16_t w); -uint16_t makeWord(byte h, byte l); - -#define word(...) makeWord(__VA_ARGS__) - -unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); - -void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); -void noTone(uint8_t _pin); - -// WMath prototypes -long random(long); -long random(long, long); -void randomSeed(unsigned int); -long map(long, long, long, long, long); -#endif - -#endif \ No newline at end of file diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c b/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c deleted file mode 100755 index 529ad52..0000000 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - wiring_analog.c - analog input and output - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2005-2006 David A. Mellis - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ -*/ - -#include "wiring_private.h" -#include "pins_arduino.h" - -uint8_t analog_reference = DEFAULT; - -void analogReference(uint8_t mode) -{ - // can't actually set the register here because the default setting - // will connect AVCC and the AREF pin, which would cause a short if - // there's something connected to AREF. - analog_reference = mode; -} - -int analogRead(uint8_t pin) -{ - uint8_t low, high; - - // set the analog reference (high two bits of ADMUX) and select the - // channel (low 4 bits). this also sets ADLAR (left-adjust result) - // to 0 (the default). - ADMUX = (analog_reference << 6) | (pin & 0x07); - -#if defined(__AVR_ATmega1280__) - // the MUX5 bit of ADCSRB selects whether we're reading from channels - // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). - ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); -#endif - - // without a delay, we seem to read from the wrong channel - //delay(1); - - // start the conversion - sbi(ADCSRA, ADSC); - - // ADSC is cleared when the conversion finishes - while (bit_is_set(ADCSRA, ADSC)); - - // we have to read ADCL first; doing so locks both ADCL - // and ADCH until ADCH is read. reading ADCL second would - // cause the results of each conversion to be discarded, - // as ADCL and ADCH would be locked when it completed. - low = ADCL; - high = ADCH; - - // combine the two bytes - return (high << 8) | low; -} - -// Right now, PWM output only works on the pins with -// hardware support. These are defined in the appropriate -// pins_*.c file. For the rest of the pins, we default -// to digital output. -void analogWrite(uint8_t pin, int val) -{ - // We need to make sure the PWM output is enabled for those pins - // that support it, as we turn it off when digitally reading or - // writing with them. Also, make sure the pin is in output mode - // for consistenty with Wiring, which doesn't require a pinMode - // call for the analog output pins. - pinMode(pin, OUTPUT); - - if (digitalPinToTimer(pin) == TIMER1A) { - // connect pwm to pin on timer 1, channel A - sbi(TCCR1A, COM1A1); - // set pwm duty - OCR1A = val; - } else if (digitalPinToTimer(pin) == TIMER1B) { - // connect pwm to pin on timer 1, channel B - sbi(TCCR1A, COM1B1); - // set pwm duty - OCR1B = val; -#if defined(__AVR_ATmega8__) - } else if (digitalPinToTimer(pin) == TIMER2) { - // connect pwm to pin on timer 2, channel B - sbi(TCCR2, COM21); - // set pwm duty - OCR2 = val; -#else - } else if (digitalPinToTimer(pin) == TIMER0A) { - if (val == 0) { - digitalWrite(pin, LOW); - } else { - // connect pwm to pin on timer 0, channel A - sbi(TCCR0A, COM0A1); - // set pwm duty - OCR0A = val; - } - } else if (digitalPinToTimer(pin) == TIMER0B) { - if (val == 0) { - digitalWrite(pin, LOW); - } else { - // connect pwm to pin on timer 0, channel B - sbi(TCCR0A, COM0B1); - // set pwm duty - OCR0B = val; - } - } else if (digitalPinToTimer(pin) == TIMER2A) { - // connect pwm to pin on timer 2, channel A - sbi(TCCR2A, COM2A1); - // set pwm duty - OCR2A = val; - } else if (digitalPinToTimer(pin) == TIMER2B) { - // connect pwm to pin on timer 2, channel B - sbi(TCCR2A, COM2B1); - // set pwm duty - OCR2B = val; -#endif -#if defined(__AVR_ATmega1280__) - // XXX: need to handle other timers here - } else if (digitalPinToTimer(pin) == TIMER3A) { - // connect pwm to pin on timer 3, channel A - sbi(TCCR3A, COM3A1); - // set pwm duty - OCR3A = val; - } else if (digitalPinToTimer(pin) == TIMER3B) { - // connect pwm to pin on timer 3, channel B - sbi(TCCR3A, COM3B1); - // set pwm duty - OCR3B = val; - } else if (digitalPinToTimer(pin) == TIMER3C) { - // connect pwm to pin on timer 3, channel C - sbi(TCCR3A, COM3C1); - // set pwm duty - OCR3C = val; - } else if (digitalPinToTimer(pin) == TIMER4A) { - // connect pwm to pin on timer 4, channel A - sbi(TCCR4A, COM4A1); - // set pwm duty - OCR4A = val; - } else if (digitalPinToTimer(pin) == TIMER4B) { - // connect pwm to pin on timer 4, channel B - sbi(TCCR4A, COM4B1); - // set pwm duty - OCR4B = val; - } else if (digitalPinToTimer(pin) == TIMER4C) { - // connect pwm to pin on timer 4, channel C - sbi(TCCR4A, COM4C1); - // set pwm duty - OCR4C = val; - } else if (digitalPinToTimer(pin) == TIMER5A) { - // connect pwm to pin on timer 5, channel A - sbi(TCCR5A, COM5A1); - // set pwm duty - OCR5A = val; - } else if (digitalPinToTimer(pin) == TIMER5B) { - // connect pwm to pin on timer 5, channel B - sbi(TCCR5A, COM5B1); - // set pwm duty - OCR5B = val; -#endif - } else if (val < 128) - digitalWrite(pin, LOW); - else - digitalWrite(pin, HIGH); -} diff --git a/arduino-0018-linux-x64/hardware/tools/avrdude b/arduino-0018-linux-x64/hardware/tools/avrdude deleted file mode 100755 index 8892ba528a1f8b151c6b13953df9e1802123144c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704076 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

@32dV4B|wON<~`P(zZ&qV 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

6tEy?3fjmFQaJAyv=>fNhY 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 diff --git a/arduino-0018-linux-x64/lib/core.jar b/arduino-0018-linux-x64/lib/core.jar deleted file mode 100644 index db101533dc17a4fae5af1410f8baf83489990cfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230539 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%0DRwuP8#v~5Mf`<*MNVE?X3doWp+MK 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�u(~4=4!KDdxLLFCC*uLmF6{2xrj^8%uJl1hW(p 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 diff --git a/arduino-0018-linux-x64/lib/librxtxSerial.so b/arduino-0018-linux-x64/lib/librxtxSerial.so deleted file mode 100755 index 470dbfacda43eeb75fc0858fd113f42481aec0d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174170 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

-3Bht?grF0wrF-9w^1FBqLt{{nPD7b27)#n|!u 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 - -// network configuration. gateway and subnet are optional. -byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; -byte ip[] = { 10, 0, 0, 177 }; -byte gateway[] = { 10, 0, 0, 1 }; -byte subnet[] = { 255, 255, 0, 0 }; - -// telnet defaults to port 23 -Server server(23); - -void setup() -{ - // initialize the ethernet device - Ethernet.begin(mac, ip, gateway, subnet); - - // start listening for clients - server.begin(); -} - -void loop() -{ - Client client = server.available(); - if (client) { - server.write(client.read()); - } -} diff --git a/arduino-0018-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde b/arduino-0018-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde deleted file mode 100644 index 74a6094..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde +++ /dev/null @@ -1,41 +0,0 @@ -#include - -byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; -byte ip[] = { 10, 0, 0, 177 }; -byte server[] = { 64, 233, 187, 99 }; // Google - -Client client(server, 80); - -void setup() -{ - Ethernet.begin(mac, ip); - Serial.begin(9600); - - delay(1000); - - Serial.println("connecting..."); - - if (client.connect()) { - Serial.println("connected"); - client.println("GET /search?q=arduino HTTP/1.0"); - client.println(); - } else { - Serial.println("connection failed"); - } -} - -void loop() -{ - if (client.available()) { - char c = client.read(); - Serial.print(c); - } - - if (!client.connected()) { - Serial.println(); - Serial.println("disconnecting."); - client.stop(); - for(;;) - ; - } -} diff --git a/arduino-0018-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde b/arduino-0018-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde deleted file mode 100644 index b337a8e..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Web Server - * - * A simple web server that shows the value of the analog input pins. - */ - -#include - -byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; -byte ip[] = { 10, 0, 0, 177 }; - -Server server(80); - -void setup() -{ - Ethernet.begin(mac, ip); - server.begin(); -} - -void loop() -{ - Client client = server.available(); - if (client) { - // an http request ends with a blank line - boolean current_line_is_blank = true; - while (client.connected()) { - if (client.available()) { - char c = client.read(); - // if we've gotten to the end of the line (received a newline - // character) and the line is blank, the http request has ended, - // so we can send a reply - if (c == '\n' && current_line_is_blank) { - // send a standard http response header - client.println("HTTP/1.1 200 OK"); - client.println("Content-Type: text/html"); - client.println(); - - // output the value of each analog input pin - for (int i = 0; i < 6; i++) { - client.print("analog input "); - client.print(i); - client.print(" is "); - client.print(analogRead(i)); - client.println("
"); - } - break; - } - if (c == '\n') { - // we're starting a new line - current_line_is_blank = true; - } else if (c != '\r') { - // we've gotten a character on the current line - current_line_is_blank = false; - } - } - } - // give the web browser time to receive the data - delay(1); - client.stop(); - } -} diff --git a/arduino-0018-linux-x64/libraries/Ethernet/utility/socket.c b/arduino-0018-linux-x64/libraries/Ethernet/utility/socket.c deleted file mode 100755 index 88c81a8..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/utility/socket.c +++ /dev/null @@ -1,558 +0,0 @@ -/* -* -@file socket.c -@brief setting chip register for socket - last update : 2008. Jan -* -*/ - -#include "types.h" -#include "w5100.h" -#include "socket.h" - -static uint16 local_port; - - -/** -@brief This Socket function initialize the channel in perticular mode, and set the port and wait for W5100 done it. -@return 1 for sucess else 0. -*/ -uint8 socket( - SOCKET s, /**< for socket number */ - uint8 protocol, /**< for socket protocol */ - uint16 port, /**< the source port for the socket */ - uint8 flag /**< the option for the socket */ - ) -{ - uint8 ret; -#ifdef __DEF_IINCHIP_DBG__ - printf("socket()\r\n"); -#endif - if ((protocol == Sn_MR_TCP) || (protocol == Sn_MR_UDP) || (protocol == Sn_MR_IPRAW) || (protocol == Sn_MR_MACRAW) || (protocol == Sn_MR_PPPOE)) - { - close(s); - IINCHIP_WRITE(Sn_MR(s),protocol | flag); - if (port != 0) { - IINCHIP_WRITE(Sn_PORT0(s),(uint8)((port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(port & 0x00ff)); - } else { - local_port++; // if don't set the source port, set local_port number. - IINCHIP_WRITE(Sn_PORT0(s),(uint8)((local_port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(local_port & 0x00ff)); - } - IINCHIP_WRITE(Sn_CR(s),Sn_CR_OPEN); // run sockinit Sn_CR - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - ret = 1; - } - else - { - ret = 0; - } -#ifdef __DEF_IINCHIP_DBG__ - printf("Sn_SR = %.2x , Protocol = %.2x\r\n", IINCHIP_READ(Sn_SR(s)), IINCHIP_READ(Sn_MR(s))); -#endif - return ret; -} - - -/** -@brief This function close the socket and parameter is "s" which represent the socket number -*/ -void close(SOCKET s) -{ -#ifdef __DEF_IINCHIP_DBG__ - printf("close()\r\n"); -#endif - - IINCHIP_WRITE(Sn_CR(s),Sn_CR_CLOSE); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - - /* +2008.01 [hwkim]: clear interrupt */ - #ifdef __DEF_IINCHIP_INT__ - /* m2008.01 [bj] : all clear */ - putISR(s, 0x00); - #else - /* m2008.01 [bj] : all clear */ - IINCHIP_WRITE(Sn_IR(s), 0xFF); - #endif -} - - -/** -@brief This function established the connection for the channel in passive (server) mode. This function waits for the request from the peer. -@return 1 for success else 0. -*/ -uint8 listen( - SOCKET s /**< the socket number */ - ) -{ - uint8 ret; -#ifdef __DEF_IINCHIP_DBG__ - printf("listen()\r\n"); -#endif - if (IINCHIP_READ(Sn_SR(s)) == SOCK_INIT) - { - IINCHIP_WRITE(Sn_CR(s),Sn_CR_LISTEN); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - ret = 1; - } - else - { - ret = 0; -#ifdef __DEF_IINCHIP_DBG__ - printf("Fail[invalid ip,port]\r\n"); -#endif - } - return ret; -} - - -/** -@brief This function established the connection for the channel in Active (client) mode. - This function waits for the untill the connection is established. - -@return 1 for success else 0. -*/ -uint8 connect(SOCKET s, uint8 * addr, uint16 port) -{ - uint8 ret; -#ifdef __DEF_IINCHIP_DBG__ - printf("connect()\r\n"); -#endif - if - ( - ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) || - ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || - (port == 0x00) - ) - { - ret = 0; -#ifdef __DEF_IINCHIP_DBG__ - printf("Fail[invalid ip,port]\r\n"); -#endif - } - else - { - ret = 1; - // set destination IP - IINCHIP_WRITE(Sn_DIPR0(s),addr[0]); - IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); - IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); - IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); - IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff)); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_CONNECT); - /* m2008.01 [bj] : wait for completion */ - while ( IINCHIP_READ(Sn_CR(s)) ) ; - - } - - return ret; -} - - - -/** -@brief This function used for disconnect the socket and parameter is "s" which represent the socket number -@return 1 for success else 0. -*/ -void disconnect(SOCKET s) -{ -#ifdef __DEF_IINCHIP_DBG__ - printf("disconnect()\r\n"); -#endif - IINCHIP_WRITE(Sn_CR(s),Sn_CR_DISCON); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ -} - - -/** -@brief This function used to send the data in TCP mode -@return 1 for success else 0. -*/ -uint16 send( - SOCKET s, /**< the socket index */ - const uint8 * buf, /**< a pointer to data */ - uint16 len /**< the data size to be send */ - ) -{ - uint8 status=0; - uint16 ret=0; - uint16 freesize=0; -#ifdef __DEF_IINCHIP_DBG__ - printf("send()\r\n"); -#endif - - if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. - else ret = len; - - // if freebuf is available, start. - do - { - freesize = getSn_TX_FSR(s); - status = IINCHIP_READ(Sn_SR(s)); - if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT)) - { - ret = 0; - break; - } -#ifdef __DEF_IINCHIP_DBG__ - printf("socket %d freesize(%d) empty or error\r\n", s, freesize); -#endif - } while (freesize < ret); - - // copy data - send_data_processing(s, (uint8 *)buf, ret); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#else - while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#endif - { - /* m2008.01 [bj] : reduce code */ - if ( IINCHIP_READ(Sn_SR(s)) == SOCK_CLOSED ) - { -#ifdef __DEF_IINCHIP_DBG__ - printf("SOCK_CLOSED.\r\n"); -#endif - close(s); - return 0; - } - } -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); -#else - IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); -#endif - return ret; -} - - -/** -@brief This function is an application I/F function which is used to receive the data in TCP mode. - It continues to wait for data as much as the application wants to receive. - -@return received data size for success else -1. -*/ -uint16 recv( - SOCKET s, /**< socket index */ - uint8 * buf, /**< a pointer to copy the data to be received */ - uint16 len /**< the data size to be read */ - ) -{ - uint16 ret=0; -#ifdef __DEF_IINCHIP_DBG__ - printf("recv()\r\n"); -#endif - - - if ( len > 0 ) - { - recv_data_processing(s, buf, len); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_RECV); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - ret = len; - } - return ret; -} - - -/** -@brief This function is an application I/F function which is used to send the data for other then TCP mode. - Unlike TCP transmission, The peer's destination address and the port is needed. - -@return This function return send data size for success else -1. -*/ -uint16 sendto( - SOCKET s, /**< socket index */ - const uint8 * buf, /**< a pointer to the data */ - uint16 len, /**< the data size to send */ - uint8 * addr, /**< the peer's Destination IP address */ - uint16 port /**< the peer's destination port number */ - ) -{ -// uint8 status=0; -// uint8 isr=0; - uint16 ret=0; - -#ifdef __DEF_IINCHIP_DBG__ - printf("sendto()\r\n"); -#endif - if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. - else ret = len; - - if - ( - ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || - ((port == 0x00)) ||(ret == 0) - ) - { - /* +2008.01 [bj] : added return value */ - ret = 0; -#ifdef __DEF_IINCHIP_DBG__ - printf("%d Fail[%.2x.%.2x.%.2x.%.2x, %.d, %d]\r\n",s, addr[0], addr[1], addr[2], addr[3] , port, len); - printf("Fail[invalid ip,port]\r\n"); -#endif - } - else - { - IINCHIP_WRITE(Sn_DIPR0(s),addr[0]); - IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); - IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); - IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); - IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff)); - - // copy data - send_data_processing(s, (uint8 *)buf, ret); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#else - while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#endif - { -#ifdef __DEF_IINCHIP_INT__ - if (getISR(s) & Sn_IR_TIMEOUT) -#else - if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT) -#endif - { -#ifdef __DEF_IINCHIP_DBG__ - printf("send fail.\r\n"); -#endif -/* +2008.01 [bj]: clear interrupt */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & ~(Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ -#else - IINCHIP_WRITE(Sn_IR(s), (Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ -#endif - return 0; - } - } - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); -#else - IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); -#endif - - } - return ret; -} - - -/** -@brief This function is an application I/F function which is used to receive the data in other then - TCP mode. This function is used to receive UDP, IP_RAW and MAC_RAW mode, and handle the header as well. - -@return This function return received data size for success else -1. -*/ -uint16 recvfrom( - SOCKET s, /**< the socket number */ - uint8 * buf, /**< a pointer to copy the data to be received */ - uint16 len, /**< the data size to read */ - uint8 * addr, /**< a pointer to store the peer's IP address */ - uint16 *port /**< a pointer to store the peer's port number. */ - ) -{ - uint8 head[8]; - uint16 data_len=0; - uint16 ptr=0; -#ifdef __DEF_IINCHIP_DBG__ - printf("recvfrom()\r\n"); -#endif - - if ( len > 0 ) - { - ptr = IINCHIP_READ(Sn_RX_RD0(s)); - ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_RX_RD0(s) + 1); -#ifdef __DEF_IINCHIP_DBG__ - printf("ISR_RX: rd_ptr : %.4x\r\n", ptr); -#endif - switch (IINCHIP_READ(Sn_MR(s)) & 0x07) - { - case Sn_MR_UDP : - read_data(s, (uint8 *)ptr, head, 0x08); - ptr += 8; - // read peer's IP address, port number. - addr[0] = head[0]; - addr[1] = head[1]; - addr[2] = head[2]; - addr[3] = head[3]; - *port = head[4]; - *port = (*port << 8) + head[5]; - data_len = head[6]; - data_len = (data_len << 8) + head[7]; - -#ifdef __DEF_IINCHIP_DBG__ - printf("UDP msg arrived\r\n"); - printf("source Port : %d\r\n", *port); - printf("source IP : %d.%d.%d.%d\r\n", addr[0], addr[1], addr[2], addr[3]); -#endif - - read_data(s, (uint8 *)ptr, buf, data_len); // data copy. - ptr += data_len; - - IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); - break; - - case Sn_MR_IPRAW : - read_data(s, (uint8 *)ptr, head, 0x06); - ptr += 6; - - addr[0] = head[0]; - addr[1] = head[1]; - addr[2] = head[2]; - addr[3] = head[3]; - data_len = head[4]; - data_len = (data_len << 8) + head[5]; - -#ifdef __DEF_IINCHIP_DBG__ - printf("IP RAW msg arrived\r\n"); - printf("source IP : %d.%d.%d.%d\r\n", addr[0], addr[1], addr[2], addr[3]); -#endif - read_data(s, (uint8 *)ptr, buf, data_len); // data copy. - ptr += data_len; - - IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); - break; - case Sn_MR_MACRAW : - read_data(s,(uint8*)ptr,head,2); - ptr+=2; - data_len = head[0]; - data_len = (data_len<<8) + head[1] - 2; - - read_data(s,(uint8*) ptr,buf,data_len); - ptr += data_len; - IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); - -#ifdef __DEF_IINCHIP_DGB__ - printf("MAC RAW msg arrived\r\n"); - printf("dest mac=%.2X.%.2X.%.2X.%.2X.%.2X.%.2X\r\n",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]); - printf("src mac=%.2X.%.2X.%.2X.%.2X.%.2X.%.2X\r\n",buf[6],buf[7],buf[8],buf[9],buf[10],buf[11]); - printf("type =%.2X%.2X\r\n",buf[12],buf[13]); -#endif - break; - - default : - break; - } - IINCHIP_WRITE(Sn_CR(s),Sn_CR_RECV); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; - /* ------- */ - } -#ifdef __DEF_IINCHIP_DBG__ - printf("recvfrom() end ..\r\n"); -#endif - return data_len; -} - - -uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len) -{ - uint8 status=0; -// uint8 isr=0; - uint16 ret=0; - -#ifdef __DEF_IINCHIP_DBG__ - printf("igmpsend()\r\n"); -#endif - if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. - else ret = len; - - if (ret == 0) - { - ; -#ifdef __DEF_IINCHIP_DBG__ - printf("%d Fail[%d]\r\n",len); -#endif - } - else - { - // copy data - send_data_processing(s, (uint8 *)buf, ret); - IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND); -/* +2008.01 bj */ - while( IINCHIP_READ(Sn_CR(s)) ) - ; -/* ------- */ - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#else - while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) -#endif - { - status = IINCHIP_READ(Sn_SR(s)); -#ifdef __DEF_IINCHIP_INT__ - if (getISR(s) & Sn_IR_TIMEOUT) -#else - if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT) -#endif - { -#ifdef __DEF_IINCHIP_DBG__ - printf("igmpsend fail.\r\n"); -#endif - /* in case of igmp, if send fails, then socket closed */ - /* if you want change, remove this code. */ - close(s); - /* ----- */ - - return 0; - } - } - -/* +2008.01 bj */ -#ifdef __DEF_IINCHIP_INT__ - putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); -#else - IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK); -#endif - } - return ret; -} - diff --git a/arduino-0018-linux-x64/libraries/Ethernet/utility/socket.h b/arduino-0018-linux-x64/libraries/Ethernet/utility/socket.h deleted file mode 100755 index a5cce42..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/utility/socket.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -* -@file socket.h -@brief define function of socket API -* -*/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -extern uint8 socket(SOCKET s, uint8 protocol, uint16 port, uint8 flag); // Opens a socket(TCP or UDP or IP_RAW mode) -extern void close(SOCKET s); // Close socket -extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) -extern void disconnect(SOCKET s); // disconnect the connection -extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) -extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) -extern uint16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) -extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) -extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) - -extern uint16 igmpsend(SOCKET s, const uint8 * buf, uint16 len); -#endif -/* _SOCKET_H_ */ diff --git a/arduino-0018-linux-x64/libraries/Ethernet/utility/spi.h b/arduino-0018-linux-x64/libraries/Ethernet/utility/spi.h deleted file mode 100755 index 000705d..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/utility/spi.h +++ /dev/null @@ -1,58 +0,0 @@ -//----------------------------------------------------------------------------- -//AVR Mega168 SPI HAL -#define BIT0 0x01 -#define BIT1 0x02 -#define BIT2 0x04 -#define BIT3 0x08 -#define BIT4 0x10 -#define BIT5 0x20 -#define BIT6 0x40 -#define BIT7 0x80 - -#define SPI0_SS_BIT BIT2 -#define SPI0_SS_DDR DDRB -#define SPI0_SS_PORT PORTB - -#define SPI0_SCLK_BIT BIT5 -#define SPI0_SCLK_DDR DDRB -#define SPI0_SCLK_PORT PORTB - -#define SPI0_MOSI_BIT BIT3 -#define SPI0_MOSI_DDR DDRB -#define SPI0_MOSI_PORT PORTB - -#define SPI0_MISO_BIT BIT4 -#define SPI0_MISO_DDR DDRB -#define SPI0_MISO_PORT PORTB - - -#define SPI0_WaitForReceive() -#define SPI0_RxData() (SPDR) - -#define SPI0_TxData(Data) (SPDR = Data) -#define SPI0_WaitForSend() while( (SPSR & 0x80)==0x00 ) - -#define SPI0_SendByte(Data) SPI0_TxData(Data);SPI0_WaitForSend() -#define SPI0_RecvBute() SPI0_RxData() - -// PB4(MISO), PB3(MOSI), PB5(SCK), PB2(/SS) // CS=1, waiting for SPI start // SPI mode 0, 4MHz -#define SPI0_Init() DDRB |= SPI0_SS_BIT|SPI0_SCLK_BIT|SPI0_MOSI_BIT;\ - PORTB |= SPI0_SS_BIT; PORTB &= ~(SPI0_SCLK_BIT|SPI0_MOSI_BIT);\ - SPCR = 0x50 -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -//IInChip SPI HAL -#define IINCHIP_SpiInit SPI0_Init -#define IINCHIP_SpiSendData SPI0_SendByte -#define IINCHIP_SpiRecvData SPI0_RxData - - -#define IINCHIP_CS_BIT BIT2 -#define IINCHIP_CS_DDR DDRB -#define IINCHIP_CS_PORT PORTB - -#define IINCHIP_CSInit() (IINCHIP_CS_DDR |= IINCHIP_CS_BIT) -#define IINCHIP_CSon() (IINCHIP_CS_PORT |= IINCHIP_CS_BIT) -#define IINCHIP_CSoff() (IINCHIP_CS_PORT &= ~IINCHIP_CS_BIT) -//----------------------------------------------------------------------------- diff --git a/arduino-0018-linux-x64/libraries/Ethernet/utility/types.h b/arduino-0018-linux-x64/libraries/Ethernet/utility/types.h deleted file mode 100755 index 6c350da..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/utility/types.h +++ /dev/null @@ -1,165 +0,0 @@ -/* -* -@file type.h -* -*/ - -#ifndef _TYPE_H_ -#define _TYPE_H_ - - -/*************************************************** - * attribute for mcu ( types, ... ) - ***************************************************/ -//#include "mcu_define.h" -#define __MCU_AVR__ 1 -#define __MCU_TYPE__ __MCU_AVR__ - -//---- Refer "Rom File Maker Manual Vx.x.pdf" -#include - -#define _ENDIAN_LITTLE_ 0 /**< This must be defined if system is little-endian alignment */ -#define _ENDIAN_BIG_ 1 -#define SYSTEM_ENDIAN _ENDIAN_LITTLE_ - -#define MAX_SOCK_NUM 4 /**< Maxmium number of socket */ -#define CLK_CPU F_CPU /**< 8Mhz(for serial) */ - -/* ## __DEF_IINCHIP_xxx__ : define option for iinchip driver *****************/ -//#define __DEF_IINCHIP_DBG__ /* involve debug code in driver (socket.c) */ -//#define __DEF_IINCHIP_INT__ /**< involve interrupt service routine (socket.c) */ -//#define __DEF_IINCHIP_PPP__ /* involve pppoe routine (socket.c) */ - /* If it is defined, the source files(md5.h,md5.c) must be included in your project. - Otherwize, the source files must be removed in your project. */ - -#define __DEF_IINCHIP_DIRECT_MODE__ 1 -#define __DEF_IINCHIP_INDIRECT_MODE__ 2 -#define __DEF_IINCHIP_SPI_MODE__ 3 - -//#define __DEF_IINCHIP_BUS__ __DEF_IINCHIP_DIRECT_MODE__ -//#define __DEF_IINCHIP_BUS__ __DEF_IINCHIP_INDIRECT_MODE__ -#define __DEF_IINCHIP_BUS__ __DEF_IINCHIP_SPI_MODE__ /*Enable SPI_mode*/ - - -/** -@brief __DEF_IINCHIP_MAP_xxx__ : define memory map for iinchip -*/ -#define __DEF_IINCHIP_MAP_BASE__ 0x8000 -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_DIRECT_MODE__) - #define COMMON_BASE __DEF_IINCHIP_MAP_BASE__ -#else - #define COMMON_BASE 0x0000 -#endif -#define __DEF_IINCHIP_MAP_TXBUF__ (COMMON_BASE + 0x4000) /* Internal Tx buffer address of the iinchip */ -#define __DEF_IINCHIP_MAP_RXBUF__ (COMMON_BASE + 0x6000) /* Internal Rx buffer address of the iinchip */ - - -#if (__MCU_TYPE__ == __MCU_AVR__) - #ifdef __DEF_IINCHIP_INT__ - // iinchip use external interrupt 4 - #define IINCHIP_ISR_DISABLE() (EIMSK &= ~(0x10)) - #define IINCHIP_ISR_ENABLE() (EIMSK |= 0x10) - #define IINCHIP_ISR_GET(X) (X = EIMSK) - #define IINCHIP_ISR_SET(X) (EIMSK = X) - #else - #define IINCHIP_ISR_DISABLE() - #define IINCHIP_ISR_ENABLE() - #define IINCHIP_ISR_GET(X) - #define IINCHIP_ISR_SET(X) - #endif -#else -#error "unknown MCU type" -#endif - -#ifndef NULL -#define NULL ((void *) 0) -#endif - -//typedef enum { false, true } bool; - -#ifndef _SIZE_T -#define _SIZE_T -typedef unsigned int size_t; -#endif - -/** - * The 8-bit signed data type. - */ -typedef char int8; -/** - * The volatile 8-bit signed data type. - */ -typedef volatile char vint8; -/** - * The 8-bit unsigned data type. - */ -typedef unsigned char uint8; -/** - * The volatile 8-bit unsigned data type. - */ -typedef volatile unsigned char vuint8; - -/** - * The 16-bit signed data type. - */ -typedef int int16; -/** - * The volatile 16-bit signed data type. - */ -typedef volatile int vint16; -/** - * The 16-bit unsigned data type. - */ -typedef unsigned int uint16; -/** - * The volatile 16-bit unsigned data type. - */ -typedef volatile unsigned int vuint16; -/** - * The 32-bit signed data type. - */ -typedef long int32; -/** - * The volatile 32-bit signed data type. - */ -typedef volatile long vint32; -/** - * The 32-bit unsigned data type. - */ -typedef unsigned long uint32; -/** - * The volatile 32-bit unsigned data type. - */ -typedef volatile unsigned long vuint32; - -/* bsd */ -typedef uint8 u_char; /**< 8-bit value */ -typedef uint8 SOCKET; -typedef uint16 u_short; /**< 16-bit value */ -typedef uint16 u_int; /**< 16-bit value */ -typedef uint32 u_long; /**< 32-bit value */ - -typedef union _un_l2cval { - u_long lVal; - u_char cVal[4]; -}un_l2cval; - -typedef union _un_i2cval { - u_int iVal; - u_char cVal[2]; -}un_i2cval; - - -/** global define */ -#define FW_VERSION 0x01010000 /* System F/W Version : 1.1.0.0 */ -#define HW_VERSION 0x01000000 - - -#define TX_RX_MAX_BUF_SIZE 2048 -#define TX_BUF 0x1100 -#define RX_BUF (TX_BUF+TX_RX_MAX_BUF_SIZE) - -#define UART_DEVICE_CNT 1 /**< UART device number */ -/* #define SUPPORT_UART_ONE */ - -#endif /* _TYPE_H_ */ diff --git a/arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.c b/arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.c deleted file mode 100755 index 7d0f55a..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.c +++ /dev/null @@ -1,1302 +0,0 @@ -/* - * (c)COPYRIGHT - * ALL RIGHT RESERVED - * - * FileName : w5100.c - * Revision History : - * ---------- ------- ------------------------------------------------ - * Date version Description - * ---------- ------- ------------------------------------------------ - * 01/25/2007 1.1 Bug is Fixed in the Indirect Mode - * : Memory mapping error - * ---------- ------- ------------------------------------------------ - * 01/08/2008 1.2 Modification of Socket Command Part - * : Check if the appropriately performed after writing Sn_CR - * - * Modification of SPI Part - * : SPI code changed by adding 'spi.h'. - * : Change control type for SPI port from byte to bit. - * ---------- ------- ------------------------------------------------ - * 01/15/2008 1.3 Bug is Fixed in the pppinit() fuction. - * : do not clear interrupt value, so fixed. - * - * Modification of ISR - * : Do not exit ISR, if there is interrupt. - * ---------- ------- ------------------------------------------------ - * 03/21/2008 1.4 Modification of SetMR() function - * : Use IINCHIP_WRITE() function in Direct or SPI mode. - * ---------- ------- ------------------------------------------------ - */ -#include -#include - -#include -// #include - -#include "types.h" -#include "socket.h" -#include "w5100.h" - - - -#ifdef __DEF_IINCHIP_PPP__ - #include "md5.h" -#endif - - -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_SPI_MODE__) -#include "spi.h" //+2007113[jhpark] -#endif - -static uint8 I_STATUS[MAX_SOCK_NUM]; -static uint16 SMASK[MAX_SOCK_NUM]; /**< Variable for Tx buffer MASK in each channel */ -static uint16 RMASK[MAX_SOCK_NUM]; /**< Variable for Rx buffer MASK in each channel */ -static uint16 SSIZE[MAX_SOCK_NUM]; /**< Max Tx buffer size by each channel */ -static uint16 RSIZE[MAX_SOCK_NUM]; /**< Max Rx buffer size by each channel */ -static uint16 SBUFBASEADDRESS[MAX_SOCK_NUM]; /**< Tx buffer base address by each channel */ -static uint16 RBUFBASEADDRESS[MAX_SOCK_NUM]; /**< Rx buffer base address by each channel */ - -uint8 getISR(uint8 s) -{ - return I_STATUS[s]; -} - -void putISR(uint8 s, uint8 val) -{ - I_STATUS[s] = val; -} - -uint16 getIINCHIP_RxMAX(uint8 s) -{ - return RSIZE[s]; -} -uint16 getIINCHIP_TxMAX(uint8 s) -{ - return SSIZE[s]; -} -uint16 getIINCHIP_RxMASK(uint8 s) -{ - return RMASK[s]; -} -uint16 getIINCHIP_TxMASK(uint8 s) -{ - return SMASK[s]; -} -uint16 getIINCHIP_RxBASE(uint8 s) -{ - return RBUFBASEADDRESS[s]; -} -uint16 getIINCHIP_TxBASE(uint8 s) -{ - return SBUFBASEADDRESS[s]; -} - - /** -@brief This function writes the data into W5100 registers. -*/ -uint8 IINCHIP_WRITE(uint16 addr,uint8 data) -{ -// DIRECT MODE I/F -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_DIRECT_MODE__) - IINCHIP_ISR_DISABLE(); - *((vuint8*)(addr)) = data; - IINCHIP_ISR_ENABLE(); -#elif(__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_INDIRECT_MODE__) /* INDIRECT MODE I/F */ - IINCHIP_ISR_DISABLE(); - *((vuint8*)IDM_AR0) = (uint8)((addr & 0xFF00) >> 8); - *((vuint8*)IDM_AR1) = (uint8)(addr & 0x00FF); - *((vuint8*)IDM_DR) = data; - IINCHIP_ISR_ENABLE(); -#elif (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_SPI_MODE__) - IINCHIP_ISR_DISABLE(); - IINCHIP_SpiInit(); - - //SPI MODE I/F - IINCHIP_CSoff(); // CS=0, SPI start - - IINCHIP_SpiSendData(0xF0); - IINCHIP_SpiSendData((addr & 0xFF00) >> 8); - IINCHIP_SpiSendData(addr & 0x00FF); - IINCHIP_SpiSendData(data); - - IINCHIP_CSon(); - - IINCHIP_ISR_ENABLE(); -#else - #error "unknown bus type" -#endif - return 1; -} - - -/** -@brief This function reads the value from W5100 registers. -*/ -uint8 IINCHIP_READ(uint16 addr) -{ - uint8 data; - -// DIRECT MODE I/F - -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_DIRECT_MODE__) - IINCHIP_ISR_DISABLE(); - data = *((vuint8*)(addr)); - IINCHIP_ISR_ENABLE(); -#elif(__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_INDIRECT_MODE__) - IINCHIP_ISR_DISABLE(); - *((vuint8*)IDM_AR0) = (uint8)((addr & 0xFF00) >> 8); - *((vuint8*)IDM_AR1) = (uint8)(addr & 0x00FF); - data = *((vuint8*)IDM_DR); - IINCHIP_ISR_ENABLE(); - -#elif (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_SPI_MODE__) - IINCHIP_ISR_DISABLE(); - IINCHIP_SpiInit(); - IINCHIP_CSoff(); // CS=0, SPI start - - IINCHIP_SpiSendData(0x0F); - IINCHIP_SpiSendData((addr & 0xFF00) >> 8); - IINCHIP_SpiSendData(addr & 0x00FF); - - - IINCHIP_SpiSendData(0); - data = IINCHIP_SpiRecvData(); - - IINCHIP_CSon(); // SPI end - IINCHIP_ISR_ENABLE(); -#else - #error "unknown bus type" -#endif - return data; -} - - -/** -@brief This function writes into W5100 memory(Buffer) -*/ -uint16 wiz_write_buf(uint16 addr,uint8* buf,uint16 len) -{ -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_DIRECT_MODE__) - IINCHIP_ISR_DISABLE(); - memcpy((uint8 *)addr, buf, len); - IINCHIP_ISR_ENABLE(); -#elif (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_INDIRECT_MODE__) - uint16 idx = 0; - IINCHIP_ISR_DISABLE(); - *((vuint8*)IDM_AR0) = (uint8)((addr & 0xFF00) >> 8); - *((vuint8*)IDM_AR1) = (uint8)(addr & 0x00FF); - for (idx = 0; idx < len ; idx++) *((vuint8*)IDM_DR) = buf[idx]; - IINCHIP_ISR_ENABLE(); -#elif (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_SPI_MODE__) - uint16 idx = 0; - - IINCHIP_ISR_DISABLE(); - IINCHIP_SpiInit(); - - //SPI MODE I/F - for(idx=0;idx> 8); - IINCHIP_SpiSendData((addr+idx) & 0x00FF); - IINCHIP_SpiSendData(buf[idx]); - - IINCHIP_CSon(); // CS=0, SPI end - } - - IINCHIP_ISR_ENABLE(); -#else - #error "unknown bus type" -#endif - return len; -} - - -/** -@brief This function reads into W5100 memory(Buffer) -*/ -uint16 wiz_read_buf(uint16 addr, uint8* buf,uint16 len) -{ -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_DIRECT_MODE__) - IINCHIP_ISR_DISABLE(); - memcpy(buf, (uint8 *)addr, len); - IINCHIP_ISR_ENABLE(); -#elif(__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_INDIRECT_MODE__) - uint16 idx = 0; - IINCHIP_ISR_DISABLE(); - *((vuint8*)IDM_AR0) = (uint8)((addr & 0xFF00) >> 8); - *((vuint8*)IDM_AR1) = (uint8)(addr & 0x00FF); - for (idx = 0; idx < len ; idx++) buf[idx] = *((vuint8*)IDM_DR); - IINCHIP_ISR_ENABLE(); -#elif (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_SPI_MODE__) - uint16 idx = 0; - IINCHIP_ISR_DISABLE(); - - IINCHIP_SpiInit(); - - for (idx=0; idx> 8); - IINCHIP_SpiSendData((addr+idx) & 0x00FF); - - - IINCHIP_SpiSendData(0); - buf[idx] = IINCHIP_SpiRecvData(); - - IINCHIP_CSon(); // CS=0, SPI end - } - - IINCHIP_ISR_ENABLE(); -#else - #error "unknown bus type" -#endif - return len; -} - - -/** -@brief Socket interrupt routine -*/ -#ifdef __DEF_IINCHIP_INT__ -ISR(INT4_vect) -{ - uint8 int_val; - IINCHIP_ISR_DISABLE(); - int_val = IINCHIP_READ(IR); - - /* +200801[bj] process all of interupt */ - do { - /*---*/ - - if (int_val & IR_CONFLICT) - { - printf("IP conflict : %.2x\r\n", int_val); - } - if (int_val & IR_UNREACH) - { - printf("INT Port Unreachable : %.2x\r\n", int_val); - printf("UIPR0 : %d.%d.%d.%d\r\n", IINCHIP_READ(UIPR0), IINCHIP_READ(UIPR0+1), IINCHIP_READ(UIPR0+2), IINCHIP_READ(UIPR0+3)); - printf("UPORT0 : %.2x %.2x\r\n", IINCHIP_READ(UPORT0), IINCHIP_READ(UPORT0+1)); - } - - /* +200801[bj] interrupt clear */ - IINCHIP_WRITE(IR, 0xf0); - /*---*/ - - if (int_val & IR_SOCK(0)) - { - /* +-200801[bj] save interrupt value*/ - I_STATUS[0] |= IINCHIP_READ(Sn_IR(0)); // can be come to over two times. - IINCHIP_WRITE(Sn_IR(0), I_STATUS[0]); - /*---*/ - } - if (int_val & IR_SOCK(1)) - { - /* +-200801[bj] save interrupt value*/ - I_STATUS[1] |= IINCHIP_READ(Sn_IR(1)); - IINCHIP_WRITE(Sn_IR(1), I_STATUS[1]); - /*---*/ - } - if (int_val & IR_SOCK(2)) - { - /* +-200801[bj] save interrupt value*/ - I_STATUS[2] |= IINCHIP_READ(Sn_IR(2)); - IINCHIP_WRITE(Sn_IR(2), I_STATUS[2]); - /*---*/ - } - if (int_val & IR_SOCK(3)) - { - /* +-200801[bj] save interrupt value*/ - I_STATUS[3] |= IINCHIP_READ(Sn_IR(3)); - IINCHIP_WRITE(Sn_IR(3), I_STATUS[3]); - /*---*/ - } - - /* +-200801[bj] re-read interrupt value*/ - int_val = IINCHIP_READ(IR); - - /* +200801[bj] if exist, contiue to process */ - } while (int_val != 0x00); - /*---*/ - - IINCHIP_ISR_ENABLE(); -} -#endif - -/** -@brief This function is for resetting of the iinchip. Initializes the iinchip to work in whether DIRECT or INDIRECT mode -*/ -void iinchip_init(void) -{ - setMR( MR_RST ); -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_INDIRECT_MODE__) - setMR( MR_IND | MR_AI ); -#ifdef __DEF_IINCHIP_DBG__ - printf("MR value is %d \r\n",IINCHIP_READ(MR)); -#endif -#endif -} - - -/** -@brief This function set the transmit & receive buffer size as per the channels is used - -Note for TMSR and RMSR bits are as follows\n -bit 1-0 : memory size of channel #0 \n -bit 3-2 : memory size of channel #1 \n -bit 5-4 : memory size of channel #2 \n -bit 7-6 : memory size of channel #3 \n\n -Maximum memory size for Tx, Rx in the W5100 is 8K Bytes,\n -In the range of 8KBytes, the memory size could be allocated dynamically by each channel.\n -Be attentive to sum of memory size shouldn't exceed 8Kbytes\n -and to data transmission and receiption from non-allocated channel may cause some problems.\n -If the 8KBytes memory is already assigned to centain channel, \n -other 3 channels couldn't be used, for there's no available memory.\n -If two 4KBytes memory are assigned to two each channels, \n -other 2 channels couldn't be used, for there's no available memory.\n -*/ -void sysinit( - uint8 tx_size, /**< tx_size Tx memory size (00 - 1KByte, 01- 2KBtye, 10 - 4KByte, 11 - 8KByte) */ - uint8 rx_size /**< rx_size Rx memory size (00 - 1KByte, 01- 2KBtye, 10 - 4KByte, 11 - 8KByte) */ - ) -{ - int16 i; - int16 ssum,rsum; - -#ifdef __DEF_IINCHIP_DBG__ - printf("sysinit()\r\n"); -#endif - - ssum = 0; - rsum = 0; - - IINCHIP_WRITE(TMSR,tx_size); /* Set Tx memory size for each channel */ - IINCHIP_WRITE(RMSR,rx_size); /* Set Rx memory size for each channel */ - - SBUFBASEADDRESS[0] = (uint16)(__DEF_IINCHIP_MAP_TXBUF__); /* Set base address of Tx memory for channel #0 */ - RBUFBASEADDRESS[0] = (uint16)(__DEF_IINCHIP_MAP_RXBUF__); /* Set base address of Rx memory for channel #0 */ - -#ifdef __DEF_IINCHIP_DBG__ - printf("Channel : SEND MEM SIZE : RECV MEM SIZE\r\n"); -#endif - - for (i = 0 ; i < MAX_SOCK_NUM; i++) // Set the size, masking and base address of Tx & Rx memory by each channel - { - SSIZE[i] = (int16)(0); - RSIZE[i] = (int16)(0); - if (ssum < 8192) - { - switch((tx_size >> i*2) & 0x03) // Set Tx memory size - { - case 0: - SSIZE[i] = (int16)(1024); - SMASK[i] = (uint16)(0x03FF); - break; - case 1: - SSIZE[i] = (int16)(2048); - SMASK[i] = (uint16)(0x07FF); - break; - case 2: - SSIZE[i] = (int16)(4096); - SMASK[i] = (uint16)(0x0FFF); - break; - case 3: - SSIZE[i] = (int16)(8192); - SMASK[i] = (uint16)(0x1FFF); - break; - } - } - if (rsum < 8192) - { - switch((rx_size >> i*2) & 0x03) // Set Rx memory size - { - case 0: - RSIZE[i] = (int16)(1024); - RMASK[i] = (uint16)(0x03FF); - break; - case 1: - RSIZE[i] = (int16)(2048); - RMASK[i] = (uint16)(0x07FF); - break; - case 2: - RSIZE[i] = (int16)(4096); - RMASK[i] = (uint16)(0x0FFF); - break; - case 3: - RSIZE[i] = (int16)(8192); - RMASK[i] = (uint16)(0x1FFF); - break; - } - } - ssum += SSIZE[i]; - rsum += RSIZE[i]; - - if (i != 0) // Sets base address of Tx and Rx memory for channel #1,#2,#3 - { - SBUFBASEADDRESS[i] = SBUFBASEADDRESS[i-1] + SSIZE[i-1]; - RBUFBASEADDRESS[i] = RBUFBASEADDRESS[i-1] + RSIZE[i-1]; - } -#ifdef __DEF_IINCHIP_DBG__ - printf("%d : %.4x : %.4x : %.4x : %.4x\r\n", i, (uint16)SBUFBASEADDRESS[i], (uint16)RBUFBASEADDRESS[i], SSIZE[i], RSIZE[i]); -#endif - } -} - - -void setMR(uint8 val) -{ - -#if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_INDIRECT_MODE__) - *((volatile uint8*)(MR)) = val; -#else - /* DIRECT ACCESS */ - IINCHIP_WRITE(MR,val); -#endif -} - - -/** -@brief This function sets up gateway IP address. -*/ -void setGAR( - uint8 * addr /**< a pointer to a 4 -byte array responsible to set the Gateway IP address. */ - ) -{ - IINCHIP_WRITE((GAR0 + 0),addr[0]); - IINCHIP_WRITE((GAR0 + 1),addr[1]); - IINCHIP_WRITE((GAR0 + 2),addr[2]); - IINCHIP_WRITE((GAR0 + 3),addr[3]); -} -void getGWIP(uint8 * addr) -{ - addr[0] = IINCHIP_READ((GAR0 + 0)); - addr[1] = IINCHIP_READ((GAR0 + 1)); - addr[2] = IINCHIP_READ((GAR0 + 2)); - addr[3] = IINCHIP_READ((GAR0 + 3)); -} - - -/** -@brief It sets up SubnetMask address -*/ -void setSUBR( - uint8 * addr /**< a pointer to a 4 -byte array responsible to set the SubnetMask address */ - ) -{ - IINCHIP_WRITE((SUBR0 + 0),addr[0]); - IINCHIP_WRITE((SUBR0 + 1),addr[1]); - IINCHIP_WRITE((SUBR0 + 2),addr[2]); - IINCHIP_WRITE((SUBR0 + 3),addr[3]); -} - - -/** -@brief This function sets up MAC address. -*/ -void setSHAR( - uint8 * addr /**< a pointer to a 6 -byte array responsible to set the MAC address. */ - ) -{ - IINCHIP_WRITE((SHAR0 + 0),addr[0]); - IINCHIP_WRITE((SHAR0 + 1),addr[1]); - IINCHIP_WRITE((SHAR0 + 2),addr[2]); - IINCHIP_WRITE((SHAR0 + 3),addr[3]); - IINCHIP_WRITE((SHAR0 + 4),addr[4]); - IINCHIP_WRITE((SHAR0 + 5),addr[5]); -} - - -/** -@brief This function sets up Source IP address. -*/ -void setSIPR( - uint8 * addr /**< a pointer to a 4 -byte array responsible to set the Source IP address. */ - ) -{ - IINCHIP_WRITE((SIPR0 + 0),addr[0]); - IINCHIP_WRITE((SIPR0 + 1),addr[1]); - IINCHIP_WRITE((SIPR0 + 2),addr[2]); - IINCHIP_WRITE((SIPR0 + 3),addr[3]); -} - - -/** -@brief This function gets Interrupt register in common register. - */ -uint8 getIR( void ) -{ - return IINCHIP_READ(IR); -} - - - -/** -@brief This function sets up Retransmission time. - -If there is no response from the peer or delay in response then retransmission -will be there as per RTR (Retry Time-value Register)setting -*/ -void setRTR(uint16 timeout) -{ - IINCHIP_WRITE(RTR0,(uint8)((timeout & 0xff00) >> 8)); - IINCHIP_WRITE((RTR0 + 1),(uint8)(timeout & 0x00ff)); -} - - -/** -@brief This function set the number of Retransmission. - -If there is no response from the peer or delay in response then recorded time -as per RTR & RCR register seeting then time out will occur. -*/ -void setRCR(uint8 retry) -{ - IINCHIP_WRITE(RCR,retry); -} - - -/** -@brief This function set the interrupt mask Enable/Disable appropriate Interrupt. ('1' : interrupt enable) - -If any bit in IMR is set as '0' then there is not interrupt signal though the bit is -set in IR register. -*/ -void setIMR(uint8 mask) -{ - IINCHIP_WRITE(IMR,mask); // must be setted 0x10. -} - - -/** -@brief These below functions are used to get the Gateway, SubnetMask - and Source Hardware Address (MAC Address) and Source IP address -*/ -void getGAR(uint8 * addr) -{ - addr[0] = IINCHIP_READ(GAR0); - addr[1] = IINCHIP_READ(GAR0+1); - addr[2] = IINCHIP_READ(GAR0+2); - addr[3] = IINCHIP_READ(GAR0+3); -} -void getSUBR(uint8 * addr) -{ - addr[0] = IINCHIP_READ(SUBR0); - addr[1] = IINCHIP_READ(SUBR0+1); - addr[2] = IINCHIP_READ(SUBR0+2); - addr[3] = IINCHIP_READ(SUBR0+3); -} -void getSHAR(uint8 * addr) -{ - addr[0] = IINCHIP_READ(SHAR0); - addr[1] = IINCHIP_READ(SHAR0+1); - addr[2] = IINCHIP_READ(SHAR0+2); - addr[3] = IINCHIP_READ(SHAR0+3); - addr[4] = IINCHIP_READ(SHAR0+4); - addr[5] = IINCHIP_READ(SHAR0+5); -} -void getSIPR(uint8 * addr) -{ - addr[0] = IINCHIP_READ(SIPR0); - addr[1] = IINCHIP_READ(SIPR0+1); - addr[2] = IINCHIP_READ(SIPR0+2); - addr[3] = IINCHIP_READ(SIPR0+3); -} - - -/** -@brief These below functions are used to get the Destination Hardware Address (MAC Address), Destination IP address and Destination Port. -*/ -void getSn_DHAR(SOCKET s, uint8 * addr) -{ - addr[0] = IINCHIP_READ(Sn_DHAR0(s)); - addr[1] = IINCHIP_READ(Sn_DHAR0(s)+1); - addr[2] = IINCHIP_READ(Sn_DHAR0(s)+2); - addr[3] = IINCHIP_READ(Sn_DHAR0(s)+3); - addr[4] = IINCHIP_READ(Sn_DHAR0(s)+4); - addr[5] = IINCHIP_READ(Sn_DHAR0(s)+5); -} -void setSn_DHAR(SOCKET s, uint8 * addr) -{ - IINCHIP_WRITE((Sn_DHAR0(s) + 0),addr[0]); - IINCHIP_WRITE((Sn_DHAR0(s) + 1),addr[1]); - IINCHIP_WRITE((Sn_DHAR0(s) + 2),addr[2]); - IINCHIP_WRITE((Sn_DHAR0(s) + 3),addr[3]); - IINCHIP_WRITE((Sn_DHAR0(s) + 4),addr[4]); - IINCHIP_WRITE((Sn_DHAR0(s) + 5),addr[5]); -} -void getSn_DIPR(SOCKET s, uint8 * addr) -{ - addr[0] = IINCHIP_READ(Sn_DIPR0(s)); - addr[1] = IINCHIP_READ(Sn_DIPR0(s)+1); - addr[2] = IINCHIP_READ(Sn_DIPR0(s)+2); - addr[3] = IINCHIP_READ(Sn_DIPR0(s)+3); -} -void setSn_DIPR(SOCKET s, uint8 * addr) -{ - IINCHIP_WRITE((Sn_DIPR0(s) + 0),addr[0]); - IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); - IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); - IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); -} -void getSn_DPORT(SOCKET s, uint8 * addr) -{ - addr[0] = IINCHIP_READ(Sn_DPORT0(s)); - addr[1] = IINCHIP_READ(Sn_DPORT0(s)+1); -} -void setSn_DPORT(SOCKET s, uint8 * addr) -{ - IINCHIP_WRITE((Sn_DPORT0(s) + 0),addr[0]); - IINCHIP_WRITE((Sn_DPORT0(s) + 1),addr[1]); -} - - -/** -@brief This sets the maximum segment size of TCP in Active Mode), while in Passive Mode this is set by peer -*/ -void setSn_MSS(SOCKET s, uint16 Sn_MSSR0) -{ - IINCHIP_WRITE(Sn_MSSR0(s),(uint8)((Sn_MSSR0 & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_MSSR0(s) + 1),(uint8)(Sn_MSSR0 & 0x00ff)); -} - -void setSn_TTL(SOCKET s, uint8 ttl) -{ - IINCHIP_WRITE(Sn_TTL(s), ttl); -} - - -/** -@brief These below function is used to setup the Protocol Field of IP Header when - executing the IP Layer RAW mode. -*/ -void setSn_PROTO(SOCKET s, uint8 proto) -{ - IINCHIP_WRITE(Sn_PROTO(s),proto); -} - - -/** -@brief get socket interrupt status - -These below functions are used to read the Interrupt & Soket Status register -*/ -uint8 getSn_IR(SOCKET s) -{ - return IINCHIP_READ(Sn_IR(s)); -} - - -/** -@brief get socket status -*/ -uint8 getSn_SR(SOCKET s) -{ - return IINCHIP_READ(Sn_SR(s)); -} - - -/** -@brief get socket TX free buf size - -This gives free buffer size of transmit buffer. This is the data size that user can transmit. -User shuold check this value first and control the size of transmitting data -*/ -uint16 getSn_TX_FSR(SOCKET s) -{ - uint16 val=0,val1=0; - do - { - val1 = IINCHIP_READ(Sn_TX_FSR0(s)); - val1 = (val1 << 8) + IINCHIP_READ(Sn_TX_FSR0(s) + 1); - if (val1 != 0) - { - val = IINCHIP_READ(Sn_TX_FSR0(s)); - val = (val << 8) + IINCHIP_READ(Sn_TX_FSR0(s) + 1); - } - } while (val != val1); - return val; -} - - -/** -@brief get socket RX recv buf size - -This gives size of received data in receive buffer. -*/ -uint16 getSn_RX_RSR(SOCKET s) -{ - uint16 val=0,val1=0; - do - { - val1 = IINCHIP_READ(Sn_RX_RSR0(s)); - val1 = (val1 << 8) + IINCHIP_READ(Sn_RX_RSR0(s) + 1); - if(val1 != 0) - { - val = IINCHIP_READ(Sn_RX_RSR0(s)); - val = (val << 8) + IINCHIP_READ(Sn_RX_RSR0(s) + 1); - } - } while (val != val1); - return val; -} - - -/** -@brief This function is being called by send() and sendto() function also. - -This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer -register. User should read upper byte first and lower byte later to get proper value. -*/ -void send_data_processing(SOCKET s, uint8 *data, uint16 len) -{ - uint16 ptr; - ptr = IINCHIP_READ(Sn_TX_WR0(s)); - ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_TX_WR0(s) + 1); - write_data(s, data, (uint8 *)(ptr), len); - ptr += len; - IINCHIP_WRITE(Sn_TX_WR0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_TX_WR0(s) + 1),(uint8)(ptr & 0x00ff)); -} - - -/** -@brief This function is being called by recv() also. - -This function read the Rx read pointer register -and after copy the data from receive buffer update the Rx write pointer register. -User should read upper byte first and lower byte later to get proper value. -*/ -void recv_data_processing(SOCKET s, uint8 *data, uint16 len) -{ - uint16 ptr; - ptr = IINCHIP_READ(Sn_RX_RD0(s)); - ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_RX_RD0(s) + 1); -#ifdef __DEF_IINCHIP_DBG__ - printf("ISR_RX: rd_ptr : %.4x\r\n", ptr); -#endif - read_data(s, (uint8 *)ptr, data, len); // read data - ptr += len; - IINCHIP_WRITE(Sn_RX_RD0(s),(uint8)((ptr & 0xff00) >> 8)); - IINCHIP_WRITE((Sn_RX_RD0(s) + 1),(uint8)(ptr & 0x00ff)); -} - - -/** -@brief for copy the data form application buffer to Transmite buffer of the chip. - -This function is being used for copy the data form application buffer to Transmite -buffer of the chip. It calculate the actual physical address where one has to write -the data in transmite buffer. Here also take care of the condition while it exceed -the Tx memory uper-bound of socket. -*/ -void write_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len) -{ - uint16 size; - uint16 dst_mask; - uint8 * dst_ptr; - - dst_mask = (uint16)dst & getIINCHIP_TxMASK(s); - dst_ptr = (uint8 *)(getIINCHIP_TxBASE(s) + dst_mask); - - if (dst_mask + len > getIINCHIP_TxMAX(s)) - { - size = getIINCHIP_TxMAX(s) - dst_mask; - wiz_write_buf((uint16)dst_ptr, (uint8*)src, size); - src += size; - size = len - size; - dst_ptr = (uint8 *)(getIINCHIP_TxBASE(s)); - wiz_write_buf((uint16)dst_ptr, (uint8*)src, size); - } - else - { - wiz_write_buf((uint16)dst_ptr, (uint8*)src, len); - } -} - - -/** -@brief This function is being used for copy the data form Receive buffer of the chip to application buffer. - -It calculate the actual physical address where one has to read -the data from Receive buffer. Here also take care of the condition while it exceed -the Rx memory uper-bound of socket. -*/ -void read_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len) -{ - uint16 size; - uint16 src_mask; - uint8 * src_ptr; - - src_mask = (uint16)src & getIINCHIP_RxMASK(s); - src_ptr = (uint8 *)(getIINCHIP_RxBASE(s) + src_mask); - - if( (src_mask + len) > getIINCHIP_RxMAX(s) ) - { - size = getIINCHIP_RxMAX(s) - src_mask; - wiz_read_buf((uint16)src_ptr, (uint8*)dst,size); - dst += size; - size = len - size; - src_ptr = (uint8 *)(getIINCHIP_RxBASE(s)); - wiz_read_buf((uint16)src_ptr, (uint8*) dst,size); - } - else - { - wiz_read_buf((uint16)src_ptr, (uint8*) dst,len); - } -} - - -#ifdef __DEF_IINCHIP_PPP__ -#define PPP_OPTION_BUF_LEN 64 - -uint8 pppinit_in(uint8 * id, uint8 idlen, uint8 * passwd, uint8 passwdlen); - - -/** -@brief make PPPoE connection -@return 1 => success to connect, 2 => Auth fail, 3 => timeout, 4 => Auth type not support - -*/ -uint8 pppinit(uint8 * id, uint8 idlen, uint8 * passwd, uint8 passwdlen) -{ - uint8 ret; - uint8 isr; - - // PHASE0. W5100 PPPoE(ADSL) setup - // enable pppoe mode - printf("-- PHASE 0. W5100 PPPoE(ADSL) setup process --\r\n"); - printf("\r\n"); - IINCHIP_WRITE(MR,IINCHIP_READ(MR) | MR_PPPOE); - - // open socket in pppoe mode - isr = IINCHIP_READ(Sn_IR(0));// first clear isr(0), W5100 at present time - IINCHIP_WRITE(Sn_IR(0),isr); - - IINCHIP_WRITE(PTIMER,200); // 5sec timeout - IINCHIP_WRITE(PMAGIC,0x01); // magic number - IINCHIP_WRITE(Sn_MR(0),Sn_MR_PPPOE); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_OPEN); - - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - - ret = pppinit_in(id, idlen, passwd, passwdlen); - - // close ppp connection socket - /* +200801 (hwkim) */ - close(0); - /* ------- */ - - return ret; -} - - -uint8 pppinit_in(uint8 * id, uint8 idlen, uint8 * passwd, uint8 passwdlen) -{ - uint8 loop_idx = 0; - uint8 isr = 0; - uint8 buf[PPP_OPTION_BUF_LEN]; - uint16 len; - uint8 str[PPP_OPTION_BUF_LEN]; - uint8 str_idx,dst_idx; - - // PHASE1. PPPoE Discovery - // start to connect pppoe connection - printf("-- PHASE 1. PPPoE Discovery process --"); - printf(" ok\r\n"); - printf("\r\n"); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCON); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - - wait_10ms(100); - - loop_idx = 0; - //check whether PPPoE discovery end or not - while (!(IINCHIP_READ(Sn_IR(0)) & Sn_IR_PNEXT)) - { - printf("."); - if (loop_idx++ == 10) // timeout - { - printf("timeout before LCP\r\n"); - return 3; - } - wait_10ms(100); - } - - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), 0xff); - /*---*/ - - // PHASE2. LCP process - printf("-- PHASE 2. LCP process --"); - - // send LCP Request - { - // Magic number option - // option format (type value + length value + data) - // write magic number value - buf[0] = 0x05; // type value - buf[1] = 0x06; // length value - buf[2] = 0x01; buf[3] = 0x01; buf[4] = 0x01; buf[5]= 0x01; // data - // for MRU option, 1492 0x05d4 - // buf[6] = 0x01; buf[7] = 0x04; buf[8] = 0x05; buf[9] = 0xD4; - } - send_data_processing(0, buf, 0x06); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCR); // send request - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - - wait_10ms(100); - - while (!((isr = IINCHIP_READ(Sn_IR(0))) & Sn_IR_PNEXT)) - { - if (isr & Sn_IR_PRECV) // Not support option - { - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), Sn_IR_PRECV); - /*---*/ - len = getSn_RX_RSR(0); - if ( len > 0 ) - { - recv_data_processing(0, str, len); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_RECV); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - - // for debug - //printf("LCP proc\r\n"); for (i = 0; i < len; i++) printf ("%02x ", str[i]); printf("\r\n"); - // get option length - len = str[4]; len = ((len & 0x00ff) << 8) + str[5]; - len += 2; - str_idx = 6; dst_idx = 0; // ppp header is 6 byte, so starts at 6. - do - { - if ((str[str_idx] == 0x01) || (str[str_idx] == 0x02) || (str[str_idx] == 0x03) || (str[str_idx] == 0x05)) - { - // skip as length of support option. str_idx+1 is option's length. - str_idx += str[str_idx+1]; - } - else - { - // not support option , REJECT - memcpy((uint8 *)(buf+dst_idx), (uint8 *)(str+str_idx), str[str_idx+1]); - dst_idx += str[str_idx+1]; str_idx += str[str_idx+1]; - } - } while (str_idx != len); - // for debug - // printf("LCP dst proc\r\n"); for (i = 0; i < dst_idx; i++) printf ("%02x ", dst[i]); printf("\r\n"); - - // send LCP REJECT packet - send_data_processing(0, buf, dst_idx); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCJ); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - } - } - printf("."); - if (loop_idx++ == 10) // timeout - { - printf("timeout after LCP\r\n"); - return 3; - } - wait_10ms(100); - } - printf(" ok\r\n"); - printf("\r\n"); - - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), 0xff); - /*---*/ - - printf("-- PHASE 3. PPPoE(ADSL) Authentication mode --\r\n"); - printf("Authentication protocol : %.2x %.2x, ", IINCHIP_READ(PATR0), IINCHIP_READ(PATR0+1)); - - loop_idx = 0; - if (IINCHIP_READ(PATR0) == 0xc0 && IINCHIP_READ(PATR0+1) == 0x23) - { - printf("PAP\r\n"); // in case of adsl normally supports PAP. - // send authentication data - // copy (idlen + id + passwdlen + passwd) - buf[loop_idx] = idlen; loop_idx++; - memcpy((uint8 *)(buf+loop_idx), (uint8 *)(id), idlen); loop_idx += idlen; - buf[loop_idx] = passwdlen; loop_idx++; - memcpy((uint8 *)(buf+loop_idx), (uint8 *)(passwd), passwdlen); loop_idx += passwdlen; - send_data_processing(0, buf, loop_idx); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCR); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - wait_10ms(100); - } - else if (IINCHIP_READ(PATR0) == 0xc2 && IINCHIP_READ(PATR0+1) == 0x23) - { - uint8 chal_len; - md5_ctx context; - uint8 digest[16]; - - len = getSn_RX_RSR(0); - if ( len > 0 ) - { - recv_data_processing(0, str, len); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_RECV); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ -#ifdef __DEF_IINCHIP_DBG__ - printf("recv CHAP\r\n"); - { - int16 i; - - for (i = 0; i < 32; i++) - printf ("%02x ", str[i]); - } - printf("\r\n"); -#endif -// str is C2 23 xx CHAL_ID xx xx CHAP_LEN CHAP_DATA -// index 0 1 2 3 4 5 6 7 ... - - memset(buf,0x00,64); - buf[loop_idx] = str[3]; loop_idx++; // chal_id - memcpy((uint8 *)(buf+loop_idx), (uint8 *)(passwd), passwdlen); loop_idx += passwdlen; //passwd - chal_len = str[6]; // chal_id - memcpy((uint8 *)(buf+loop_idx), (uint8 *)(str+7), chal_len); loop_idx += chal_len; //challenge - buf[loop_idx] = 0x80; -#ifdef __DEF_IINCHIP_DBG__ - printf("CHAP proc d1\r\n"); - { - int16 i; - for (i = 0; i < 64; i++) - printf ("%02x ", buf[i]); - } - printf("\r\n"); -#endif - - md5_init(&context); - md5_update(&context, buf, loop_idx); - md5_final(digest, &context); - -#ifdef __DEF_IINCHIP_DBG__ - printf("CHAP proc d1\r\n"); - { - int16 i; - for (i = 0; i < 16; i++) - printf ("%02x", digest[i]); - } - printf("\r\n"); -#endif - loop_idx = 0; - buf[loop_idx] = 16; loop_idx++; // hash_len - memcpy((uint8 *)(buf+loop_idx), (uint8 *)(digest), 16); loop_idx += 16; // hashed value - memcpy((uint8 *)(buf+loop_idx), (uint8 *)(id), idlen); loop_idx += idlen; // id - send_data_processing(0, buf, loop_idx); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCR); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - wait_10ms(100); - } - } - else - { - printf("Not support\r\n"); -#ifdef __DEF_IINCHIP_DBG__ - printf("Not support PPP Auth type: %.2x%.2x\r\n",IINCHIP_READ(PATR0), IINCHIP_READ(PATR0+1)); -#endif - return 4; - } - printf("\r\n"); - - printf("-- Waiting for PPPoE server's admission --"); - loop_idx = 0; - while (!((isr = IINCHIP_READ(Sn_IR(0))) & Sn_IR_PNEXT)) - { - if (isr & Sn_IR_PFAIL) - { - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), 0xff); - /*---*/ - printf("failed\r\nReinput id, password..\r\n"); - return 2; - } - printf("."); - if (loop_idx++ == 10) // timeout - { - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), 0xff); - /*---*/ - printf("timeout after PAP\r\n"); - return 3; - } - wait_10ms(100); - } - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), 0xff); - /*---*/ - printf("ok\r\n"); - printf("\r\n"); - printf("-- PHASE 4. IPCP process --"); - // IP Address - buf[0] = 0x03; buf[1] = 0x06; buf[2] = 0x00; buf[3] = 0x00; buf[4] = 0x00; buf[5] = 0x00; - send_data_processing(0, buf, 6); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCR); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - wait_10ms(100); - - loop_idx = 0; - while (1) - { - if (IINCHIP_READ(Sn_IR(0)) & Sn_IR_PRECV) - { - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), 0xff); - /*---*/ - len = getSn_RX_RSR(0); - if ( len > 0 ) - { - recv_data_processing(0, str, len); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_RECV); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - //for debug - //printf("IPCP proc\r\n"); for (i = 0; i < len; i++) printf ("%02x ", str[i]); printf("\r\n"); - str_idx = 6; dst_idx = 0; - if (str[2] == 0x03) // in case of NAK - { - do - { - if (str[str_idx] == 0x03) // request only ip information - { - memcpy((uint8 *)(buf+dst_idx), (uint8 *)(str+str_idx), str[str_idx+1]); - dst_idx += str[str_idx+1]; str_idx += str[str_idx+1]; - } - else - { - // skip byte - str_idx += str[str_idx+1]; - } - // for debug - //printf("s: %d, d: %d, l: %d", str_idx, dst_idx, len); - } while (str_idx != len); - send_data_processing(0, buf, dst_idx); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCR); // send ipcp request - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - wait_10ms(100); - break; - } - } - } - printf("."); - if (loop_idx++ == 10) // timeout - { - printf("timeout after IPCP\r\n"); - return 3; - } - wait_10ms(100); - send_data_processing(0, buf, 6); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCR); //ipcp re-request - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - } - - loop_idx = 0; - while (!(IINCHIP_READ(Sn_IR(0)) & Sn_IR_PNEXT)) - { - printf("."); - if (loop_idx++ == 10) // timeout - { - printf("timeout after IPCP NAK\r\n"); - return 3; - } - wait_10ms(100); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PCR); // send ipcp request - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - } - /* +200801[bj] clear interrupt value*/ - IINCHIP_WRITE(Sn_IR(0), 0xff); - /*---*/ - printf("ok\r\n"); - printf("\r\n"); - return 1; - // after this function, User must save the pppoe server's mac address and pppoe session id in current connection -} - - -/** -@brief terminate PPPoE connection -*/ -uint8 pppterm(uint8 * mac, uint8 * sessionid) -{ - uint16 i; - uint8 isr; -#ifdef __DEF_IINCHIP_DBG__ - printf("pppterm()\r\n"); -#endif - /* Set PPPoE bit in MR(Common Mode Register) : enable socket0 pppoe */ - IINCHIP_WRITE(MR,IINCHIP_READ(MR) | MR_PPPOE); - - // write pppoe server's mac address and session id - // must be setted these value. - for (i = 0; i < 6; i++) IINCHIP_WRITE((Sn_DHAR0(0)+i),mac[i]); - for (i = 0; i < 2; i++) IINCHIP_WRITE((Sn_DPORT0(0)+i),sessionid[i]); - isr = IINCHIP_READ(Sn_IR(0)); - IINCHIP_WRITE(Sn_IR(0),isr); - - //open socket in pppoe mode - IINCHIP_WRITE(Sn_MR(0),Sn_MR_PPPOE); - IINCHIP_WRITE(Sn_CR(0),Sn_CR_OPEN); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - wait_1us(1); - // close pppoe connection - IINCHIP_WRITE(Sn_CR(0),Sn_CR_PDISCON); - /* +20071122[chungs]:wait to process the command... */ - while( IINCHIP_READ(Sn_CR(0)) ) - ; - /* ------- */ - wait_10ms(100); - // close socket - /* +200801 (hwkim) */ - close(0); - /* ------- */ - - -#ifdef __DEF_IINCHIP_DBG__ - printf("pppterm() end ..\r\n"); -#endif - - return 1; -} -#endif diff --git a/arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.h b/arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.h deleted file mode 100755 index 6eddf91..0000000 --- a/arduino-0018-linux-x64/libraries/Ethernet/utility/w5100.h +++ /dev/null @@ -1,299 +0,0 @@ -/* -@file w5100.h -*/ - -#ifndef _W5100_H_ -#define _W5100_H_ - - -#define MR __DEF_IINCHIP_MAP_BASE__ -#define IDM_OR ((__DEF_IINCHIP_MAP_BASE__ + 0x00)) -#define IDM_AR0 ((__DEF_IINCHIP_MAP_BASE__ + 0x01)) -#define IDM_AR1 ((__DEF_IINCHIP_MAP_BASE__ + 0x02)) -#define IDM_DR ((__DEF_IINCHIP_MAP_BASE__ + 0x03)) - - -/** - @brief Gateway IP Register address - */ -#define GAR0 (COMMON_BASE + 0x0001) -/** - @brief Subnet mask Register address - */ -#define SUBR0 (COMMON_BASE + 0x0005) -/** - @brief Source MAC Register address - */ -#define SHAR0 (COMMON_BASE + 0x0009) -/** - @brief Source IP Register address - */ -#define SIPR0 (COMMON_BASE + 0x000F) -/** - @brief Interrupt Register - */ -#define IR (COMMON_BASE + 0x0015) -/** - @brief Interrupt mask register - */ -#define IMR (COMMON_BASE + 0x0016) -/** - @brief Timeout register address( 1 is 100us ) - */ -#define RTR0 (COMMON_BASE + 0x0017) -/** - @brief Retry count reigster - */ -#define RCR (COMMON_BASE + 0x0019) -/** - @brief Receive memory size reigster - */ -#define RMSR (COMMON_BASE + 0x001A) -/** - @brief Transmit memory size reigster - */ -#define TMSR (COMMON_BASE + 0x001B) -/** - @brief Authentication type register address in PPPoE mode - */ -#define PATR0 (COMMON_BASE + 0x001C) -//#define PPPALGO (COMMON_BASE + 0x001D) -#define PTIMER (COMMON_BASE + 0x0028) -#define PMAGIC (COMMON_BASE + 0x0029) - -/** - @brief Unreachable IP register address in UDP mode - */ -#define UIPR0 (COMMON_BASE + 0x002A) -/** - @brief Unreachable Port register address in UDP mode - */ -#define UPORT0 (COMMON_BASE + 0x002E) - -/** - @brief socket register -*/ -#define CH_BASE (COMMON_BASE + 0x0400) -/** - @brief size of each channel register map - */ -#define CH_SIZE 0x0100 -/** - @brief socket Mode register - */ -#define Sn_MR(ch) (CH_BASE + ch * CH_SIZE + 0x0000) -/** - @brief channel Sn_CR register - */ -#define Sn_CR(ch) (CH_BASE + ch * CH_SIZE + 0x0001) -/** - @brief channel interrupt register - */ -#define Sn_IR(ch) (CH_BASE + ch * CH_SIZE + 0x0002) -/** - @brief channel status register - */ -#define Sn_SR(ch) (CH_BASE + ch * CH_SIZE + 0x0003) -/** - @brief source port register - */ -#define Sn_PORT0(ch) (CH_BASE + ch * CH_SIZE + 0x0004) -/** - @brief Peer MAC register address - */ -#define Sn_DHAR0(ch) (CH_BASE + ch * CH_SIZE + 0x0006) -/** - @brief Peer IP register address - */ -#define Sn_DIPR0(ch) (CH_BASE + ch * CH_SIZE + 0x000C) -/** - @brief Peer port register address - */ -#define Sn_DPORT0(ch) (CH_BASE + ch * CH_SIZE + 0x0010) -/** - @brief Maximum Segment Size(Sn_MSSR0) register address - */ -#define Sn_MSSR0(ch) (CH_BASE + ch * CH_SIZE + 0x0012) -/** - @brief Protocol of IP Header field register in IP raw mode - */ -#define Sn_PROTO(ch) (CH_BASE + ch * CH_SIZE + 0x0014) - -/** - @brief IP Type of Service(TOS) Register - */ -#define Sn_TOS(ch) (CH_BASE + ch * CH_SIZE + 0x0015) -/** - @brief IP Time to live(TTL) Register - */ -#define Sn_TTL(ch) (CH_BASE + ch * CH_SIZE + 0x0016) - -/** - @brief Transmit free memory size register - */ -#define Sn_TX_FSR0(ch) (CH_BASE + ch * CH_SIZE + 0x0020) -/** - @brief Transmit memory read pointer register address - */ -#define Sn_TX_RD0(ch) (CH_BASE + ch * CH_SIZE + 0x0022) -/** - @brief Transmit memory write pointer register address - */ -#define Sn_TX_WR0(ch) (CH_BASE + ch * CH_SIZE + 0x0024) -/** - @brief Received data size register - */ -#define Sn_RX_RSR0(ch) (CH_BASE + ch * CH_SIZE + 0x0026) -/** - @brief Read point of Receive memory - */ -#define Sn_RX_RD0(ch) (CH_BASE + ch * CH_SIZE + 0x0028) -/** - @brief Write point of Receive memory - */ -#define Sn_RX_WR0(ch) (CH_BASE + ch * CH_SIZE + 0x002A) - - - -/* MODE register values */ -#define MR_RST 0x80 /**< reset */ -#define MR_PB 0x10 /**< ping block */ -#define MR_PPPOE 0x08 /**< enable pppoe */ -#define MR_LB 0x04 /**< little or big endian selector in indirect mode */ -#define MR_AI 0x02 /**< auto-increment in indirect mode */ -#define MR_IND 0x01 /**< enable indirect mode */ - -/* IR register values */ -#define IR_CONFLICT 0x80 /**< check ip confict */ -#define IR_UNREACH 0x40 /**< get the destination unreachable message in UDP sending */ -#define IR_PPPoE 0x20 /**< get the PPPoE close message */ -#define IR_SOCK(ch) (0x01 << ch) /**< check socket interrupt */ - -/* Sn_MR values */ -#define Sn_MR_CLOSE 0x00 /**< unused socket */ -#define Sn_MR_TCP 0x01 /**< TCP */ -#define Sn_MR_UDP 0x02 /**< UDP */ -#define Sn_MR_IPRAW 0x03 /**< IP LAYER RAW SOCK */ -#define Sn_MR_MACRAW 0x04 /**< MAC LAYER RAW SOCK */ -#define Sn_MR_PPPOE 0x05 /**< PPPoE */ -#define Sn_MR_ND 0x20 /**< No Delayed Ack(TCP) flag */ -#define Sn_MR_MULTI 0x80 /**< support multicating */ - - -/* Sn_CR values */ -#define Sn_CR_OPEN 0x01 /**< initialize or open socket */ -#define Sn_CR_LISTEN 0x02 /**< wait connection request in tcp mode(Server mode) */ -#define Sn_CR_CONNECT 0x04 /**< send connection request in tcp mode(Client mode) */ -#define Sn_CR_DISCON 0x08 /**< send closing reqeuset in tcp mode */ -#define Sn_CR_CLOSE 0x10 /**< close socket */ -#define Sn_CR_SEND 0x20 /**< updata txbuf pointer, send data */ -#define Sn_CR_SEND_MAC 0x21 /**< send data with MAC address, so without ARP process */ -#define Sn_CR_SEND_KEEP 0x22 /**< send keep alive message */ -#define Sn_CR_RECV 0x40 /**< update rxbuf pointer, recv data */ - -#ifdef __DEF_IINCHIP_PPP__ - #define Sn_CR_PCON 0x23 - #define Sn_CR_PDISCON 0x24 - #define Sn_CR_PCR 0x25 - #define Sn_CR_PCN 0x26 - #define Sn_CR_PCJ 0x27 -#endif - -/* Sn_IR values */ -#ifdef __DEF_IINCHIP_PPP__ - #define Sn_IR_PRECV 0x80 - #define Sn_IR_PFAIL 0x40 - #define Sn_IR_PNEXT 0x20 -#endif -#define Sn_IR_SEND_OK 0x10 /**< complete sending */ -#define Sn_IR_TIMEOUT 0x08 /**< assert timeout */ -#define Sn_IR_RECV 0x04 /**< receiving data */ -#define Sn_IR_DISCON 0x02 /**< closed socket */ -#define Sn_IR_CON 0x01 /**< established connection */ - -/* Sn_SR values */ -#define SOCK_CLOSED 0x00 /**< closed */ -#define SOCK_INIT 0x13 /**< init state */ -#define SOCK_LISTEN 0x14 /**< listen state */ -#define SOCK_SYNSENT 0x15 /**< connection state */ -#define SOCK_SYNRECV 0x16 /**< connection state */ -#define SOCK_ESTABLISHED 0x17 /**< success to connect */ -#define SOCK_FIN_WAIT 0x18 /**< closing state */ -#define SOCK_CLOSING 0x1A /**< closing state */ -#define SOCK_TIME_WAIT 0x1B /**< closing state */ -#define SOCK_CLOSE_WAIT 0x1C /**< closing state */ -#define SOCK_LAST_ACK 0x1D /**< closing state */ -#define SOCK_UDP 0x22 /**< udp socket */ -#define SOCK_IPRAW 0x32 /**< ip raw mode socket */ -#define SOCK_MACRAW 0x42 /**< mac raw mode socket */ -#define SOCK_PPPOE 0x5F /**< pppoe socket */ - -/* IP PROTOCOL */ -#define IPPROTO_IP 0 /**< Dummy for IP */ -#define IPPROTO_ICMP 1 /**< Control message protocol */ -#define IPPROTO_IGMP 2 /**< Internet group management protocol */ -#define IPPROTO_GGP 3 /**< Gateway^2 (deprecated) */ -#define IPPROTO_TCP 6 /**< TCP */ -#define IPPROTO_PUP 12 /**< PUP */ -#define IPPROTO_UDP 17 /**< UDP */ -#define IPPROTO_IDP 22 /**< XNS idp */ -#define IPPROTO_ND 77 /**< UNOFFICIAL net disk protocol */ -#define IPPROTO_RAW 255 /**< Raw IP packet */ - - -/********************************************************* -* iinchip access function -*********************************************************/ -extern uint8 IINCHIP_READ(uint16 addr); -extern uint8 IINCHIP_WRITE(uint16 addr,uint8 data); -extern uint16 wiz_read_buf(uint16 addr, uint8* buf,uint16 len); -extern uint16 wiz_write_buf(uint16 addr,uint8* buf,uint16 len); - -extern void iinchip_init(void); // reset iinchip -extern void sysinit(uint8 tx_size, uint8 rx_size); // setting tx/rx buf size -extern uint8 getISR(uint8 s); -extern void putISR(uint8 s, uint8 val); -extern uint16 getIINCHIP_RxMAX(uint8 s); -extern uint16 getIINCHIP_TxMAX(uint8 s); -extern uint16 getIINCHIP_RxMASK(uint8 s); -extern uint16 getIINCHIP_TxMASK(uint8 s); -extern uint16 getIINCHIP_RxBASE(uint8 s); -extern uint16 getIINCHIP_TxBASE(uint8 s); -extern void setGAR(uint8 * addr); // set gateway address -extern void setSUBR(uint8 * addr); // set subnet mask address -extern void setSHAR(uint8 * addr); // set local MAC address -extern void setSIPR(uint8 * addr); // set local IP address -extern void setRTR(uint16 timeout); // set retry duration for data transmission, connection, closing ... -extern void setRCR(uint8 retry); // set retry count (above the value, assert timeout interrupt) -extern void setIMR(uint8 mask); // set interrupt mask. -extern void getGAR(uint8 * addr); -extern void getSUBR(uint8 * addr); -extern void getSHAR(uint8 * addr); -extern void getSIPR(uint8 * addr); -extern uint8 getIR( void ); -extern void setSn_MSS(SOCKET s, uint16 Sn_MSSR0); // set maximum segment size -extern void setSn_PROTO(SOCKET s, uint8 proto); // set IP Protocol value using IP-Raw mode -extern uint8 getSn_IR(SOCKET s); // get socket interrupt status -extern uint8 getSn_SR(SOCKET s); // get socket status -extern uint16 getSn_TX_FSR(SOCKET s); // get socket TX free buf size -extern uint16 getSn_RX_RSR(SOCKET s); // get socket RX recv buf size -extern void setSn_DHAR(SOCKET s, uint8 * addr); -extern void setSn_DIPR(SOCKET s, uint8 * addr); -extern void setSn_DPORT(SOCKET s, uint8 * addr); -extern void getSn_DHAR(SOCKET s, uint8 * addr); -extern void getSn_DIPR(SOCKET s, uint8 * addr); -extern void getSn_DPORT(SOCKET s, uint8 * addr); -extern void setSn_TTL(SOCKET s, uint8 ttl); -extern void setMR(uint8 val); - -#ifdef __DEF_IINCHIP_PPP__ -extern uint8 pppinit(uint8 *id, uint8 idlen, uint8 *passwd, uint8 passwdlen); -extern uint8 pppterm(uint8 *mac,uint8 *sessionid); -#endif - -extern void send_data_processing(SOCKET s, uint8 *data, uint16 len); -extern void recv_data_processing(SOCKET s, uint8 *data, uint16 len); -extern void read_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len); -extern void write_data(SOCKET s, vuint8 * src, vuint8 * dst, uint16 len); - -#endif diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/StandardFirmata/StandardFirmata.pde b/arduino-0018-linux-x64/libraries/Firmata/examples/StandardFirmata/StandardFirmata.pde deleted file mode 100644 index 9e16b8a..0000000 --- a/arduino-0018-linux-x64/libraries/Firmata/examples/StandardFirmata/StandardFirmata.pde +++ /dev/null @@ -1,302 +0,0 @@ -/* - Copyright (C) 2006-2008 Hans-Christoph Steiner. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - See file LICENSE.txt for further informations on licensing terms. - - formatted using the GNU C formatting and indenting -*/ - -/* - * TODO: use Program Control to load stored profiles from EEPROM - */ - -#include -#include - -/*============================================================================== - * GLOBAL VARIABLES - *============================================================================*/ - -/* analog inputs */ -int analogInputsToReport = 0; // bitwise array to store pin reporting -int analogPin = 0; // counter for reading analog pins - -/* digital pins */ -byte reportPINs[TOTAL_PORTS]; // PIN == input port -byte previousPINs[TOTAL_PORTS]; // PIN == input port -byte pinStatus[TOTAL_DIGITAL_PINS]; // store pin status, default OUTPUT -byte portStatus[TOTAL_PORTS]; - -/* timer variables */ -unsigned long currentMillis; // store the current value from millis() -unsigned long nextExecuteMillis; // for comparison with currentMillis -int samplingInterval = 19; // how often to run the main loop (in ms) - -Servo servos[MAX_SERVOS]; - -/*============================================================================== - * FUNCTIONS - *============================================================================*/ - -void outputPort(byte portNumber, byte portValue) -{ - portValue = portValue &~ portStatus[portNumber]; - if(previousPINs[portNumber] != portValue) { - Firmata.sendDigitalPort(portNumber, portValue); - previousPINs[portNumber] = portValue; - } -} - -/* ----------------------------------------------------------------------------- - * check all the active digital inputs for change of state, then add any events - * to the Serial output queue using Serial.print() */ -void checkDigitalInputs(void) -{ - byte i, tmp; - for(i=0; i < TOTAL_PORTS; i++) { - if(reportPINs[i]) { - switch(i) { - case 0: - outputPort(0, PIND &~ B00000011); // ignore Rx/Tx 0/1 - break; - case 1: - outputPort(1, PINB); - break; - case ANALOG_PORT: - outputPort(ANALOG_PORT, PINC); - break; - } - } - } -} - -// ----------------------------------------------------------------------------- -/* sets the pin mode to the correct state and sets the relevant bits in the - * two bit-arrays that track Digital I/O and PWM status - */ -void setPinModeCallback(byte pin, int mode) { - byte port = 0; - byte offset = 0; - - // TODO: abstract for different boards - if (pin < 8) { - port = 0; - offset = 0; - } else if (pin < 14) { - port = 1; - offset = 8; - } else if (pin < 22) { - port = 2; - offset = 14; - } - - if(pin > 1) { // ignore RxTx (pins 0 and 1) - if (isServoSupportedPin(pin) && mode != SERVO) - if (servos[pin - FIRST_SERVO_PIN].attached()) - servos[pin - FIRST_SERVO_PIN].detach(); - if(pin > 13) - reportAnalogCallback(pin - 14, mode == ANALOG ? 1 : 0); // turn on/off reporting - switch(mode) { - case ANALOG: - digitalWrite(pin, LOW); // disable internal pull-ups and fall thru to 'case INPUT:' - case INPUT: - pinStatus[pin] = mode; - pinMode(pin, INPUT); - portStatus[port] = portStatus[port] &~ (1 << (pin - offset)); - break; - case OUTPUT: - digitalWrite(pin, LOW); // disable PWM and fall thru to 'case PWM:' - case PWM: - pinStatus[pin] = mode; - pinMode(pin, OUTPUT); - portStatus[port] = portStatus[port] | (1 << (pin - offset)); - break; - case SERVO: - // TODO: Support Arduino Mega - if (isServoSupportedPin(pin)) { - pinStatus[pin] = mode; - if (!servos[pin - FIRST_SERVO_PIN].attached()) - servos[pin - FIRST_SERVO_PIN].attach(pin); - } else - Firmata.sendString("Servo only on pins from 2 to 13"); - break; - case I2C: - pinStatus[pin] = mode; - Firmata.sendString("I2C mode not yet supported"); - break; - default: - Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM - } - // TODO: save status to EEPROM here, if changed - } -} - -void analogWriteCallback(byte pin, int value) -{ - switch(pinStatus[pin]) { - case SERVO: - if (isServoSupportedPin(pin)) - servos[pin - FIRST_SERVO_PIN].write(value); - break; - case PWM: - analogWrite(pin, value); - break; - } -} - -void digitalWriteCallback(byte port, int value) -{ - switch(port) { - case 0: // pins 2-7 (don't change Rx/Tx, pins 0 and 1) - // 0xFF03 == B1111111100000011 0x03 == B00000011 - PORTD = (value &~ 0xFF03) | (PORTD & 0x03); - break; - case 1: // pins 8-13 (14,15 are disabled for the crystal) - PORTB = (byte)value; - break; - case 2: // analog pins used as digital - byte pin; - byte pinModeMask; - for(pin=0; pin<8; pin++) - if(pinStatus[pin] == OUTPUT) - pinModeMask += 1 << pin; - PORTC = (byte)value & pinModeMask; - break; - } -} - -// ----------------------------------------------------------------------------- -/* sets bits in a bit array (int) to toggle the reporting of the analogIns - */ -//void FirmataClass::setAnalogPinReporting(byte pin, byte state) { -//} -void reportAnalogCallback(byte pin, int value) -{ - if(value == 0) { - analogInputsToReport = analogInputsToReport &~ (1 << pin); - } - else { // everything but 0 enables reporting of that pin - analogInputsToReport = analogInputsToReport | (1 << pin); - } - // TODO: save status to EEPROM here, if changed -} - -void reportDigitalCallback(byte port, int value) -{ - reportPINs[port] = (byte)value; - if(port == ANALOG_PORT) // turn off analog reporting when used as digital - analogInputsToReport = 0; -} - -/*============================================================================== - * SYSEX-BASED commands - *============================================================================*/ - -void sysexCallback(byte command, byte argc, byte *argv) -{ - switch(command) { - case SERVO_CONFIG: - if(argc > 4) { - // these vars are here for clarity, they'll optimized away by the compiler - byte pin = argv[0]; - int minPulse = argv[1] + (argv[2] << 7); - int maxPulse = argv[3] + (argv[4] << 7); - - if (isServoSupportedPin(pin)) { - // servos are pins from 2 to 13, so offset for array - if (servos[pin - FIRST_SERVO_PIN].attached()) - servos[pin - FIRST_SERVO_PIN].detach(); - servos[pin - FIRST_SERVO_PIN].attach(pin, minPulse, maxPulse); - setPinModeCallback(pin, SERVO); - } - } - break; - case SAMPLING_INTERVAL: - if (argc > 1) - samplingInterval = argv[0] + (argv[1] << 7); - else - Firmata.sendString("Not enough data"); - break; - } -} - -boolean isServoSupportedPin(byte pin) -{ - return ((FIRST_SERVO_PIN <= pin) && (pin <= (FIRST_SERVO_PIN + MAX_SERVOS))); -} - -/*============================================================================== - * SETUP() - *============================================================================*/ -void setup() -{ - byte i; - - Firmata.setFirmwareVersion(2, 1); - - Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); - Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); - Firmata.attach(REPORT_ANALOG, reportAnalogCallback); - Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); - Firmata.attach(SET_PIN_MODE, setPinModeCallback); - Firmata.attach(START_SYSEX, sysexCallback); - - portStatus[0] = B00000011; // ignore Tx/RX pins - portStatus[1] = B11000000; // ignore 14/15 pins - portStatus[2] = B00000000; - - for(i=0; i < FIRST_ANALOG_PIN; ++i) { - setPinModeCallback(i,OUTPUT); - } - // set all outputs to 0 to make sure internal pull-up resistors are off - PORTB = 0; // pins 8-15 - PORTC = 0; // analog port - PORTD = 0; // pins 0-7 - - // TODO rethink the init, perhaps it should report analog on default - for(i=0; i nextExecuteMillis) { - nextExecuteMillis = currentMillis + samplingInterval; - /* SERIALREAD - Serial.read() uses a 128 byte circular buffer, so handle - * all serialReads at once, i.e. empty the buffer */ - while(Firmata.available()) - Firmata.processInput(); - /* SEND FTDI WRITE BUFFER - make sure that the FTDI buffer doesn't go over - * 60 bytes. Ideally this could send an "event character" every 4 ms to - * trigger the buffer to dump. */ - - /* ANALOGREAD - do all of the analogReads() once per poll cycle */ - for(analogPin=0;analogPin - - - Arduino - Abs - - - - -

- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

abs(x)

-

Description

-

Computes the absolute value of a number. -

-

Parameters

-

x: the number -

-

Returns

-

x: if x is greater than or equal to 0. -

-

-x: if x is less than 0. -

-

Warning

-

Because of the way the abs() function is implemented, avoid using other functions inside the brackets, it may lead to incorrect results. -

-

-abs(a++);   // avoid this - yields incorrect results
-
-a++;          // use this instead -
-abs(a);       // keep other math outside the function
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/AnalogRead.html b/arduino-0018-linux-x64/reference/AnalogRead.html deleted file mode 100644 index b62e970..0000000 --- a/arduino-0018-linux-x64/reference/AnalogRead.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - Arduino - AnalogRead - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

analogRead()

-

Description

-

Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, .0049 volts (4.9 mV) per unit. -

-

It takes about 100 us (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second. -

-

Syntax

-

analogRead(pin) -

-

Parameters

-

pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano) -

-

Returns

-

int (0 to 1023) -

-

Note

-

If the analog input pin is not connected to anything, the value returned by analogRead() will fluctuate based on a number of factors (e.g. the values of the other analog inputs, how close your hand is to the board, etc.). -

-

Example

-
 
-int analogPin = 3;     // potentiometer wiper (middle terminal) connected to analog pin 3
-                       // outside leads to ground and +5V
-int val = 0;           // variable to store the value read
-
-void setup()
-{
-  Serial.begin(9600);          //  setup serial
-}
-
-void loop()
-{
-  val = analogRead(analogPin);    // read the input pin
-  Serial.println(val);             // debug value
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/AnalogReference.html b/arduino-0018-linux-x64/reference/AnalogReference.html deleted file mode 100644 index 43f8cf7..0000000 --- a/arduino-0018-linux-x64/reference/AnalogReference.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - Arduino - AnalogReference - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

analogReference(type)

-

Description

-

Configures the reference voltage used for analog input. The analogRead() function will return 1023 for an input equal to the reference voltage. The options are: -

-

  • DEFAULT: the default analog reference of 5 volts. -
  • INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 and 2.56 volts on the ATmega8. -
  • EXTERNAL: the voltage applied to the AREF pin is used as the reference. -

Parameters

-

type: which type of reference to use (DEFAULT, INTERNAL, or EXTERNAL). -

-

Returns

-

None. -

-

Warning

-

It is a good idea to connect external voltages to the AREF pin through a 5K resistor. This will prevent possible internal damage to the Atmega chip if analogReference() software settings are incompatible with the current hardware setup. Note that the resistor will alter the voltage that gets used as the reference because there is an internal 32K resistor on the AREF pin. The two act as a voltage divider, so, for example, 2.5V applied through the resistor will yield ~2.2V at the AREF pin. -

-

Connecting external voltages through a resistor makes it possible to switch the AREF voltage on the fly, say from the 5 volt DEFAULT setting, to a 3.3 volt EXTERNAL setting (and applied voltage), without the hardware setup affecting either ADC configuration. -

-

Use of the AREF pin

-

The voltage applied to the AREF pin directly governs the ADC and sets the voltage at which the ADC will report its highest reading, 1023. Lower voltages applied to ADC (analog) pins will be scaled proportionally, so at the DEFAULT setting (5 volt internal connection), 2.5 volts on an analog pin will report approximately 512. -

-

The default configuration on all Arduino implementations is to have nothing connected externally to the AREF pin (Atmega pin 21). In this case the DEFAULT analogReference software setting connects the AVCC voltage, internally, to the AREF pin. This appears to be a low impedance connection (high current) and voltages, other than AVCC, applied (erroneously) to the AREF pin in the DEFAULT setting could damage the ATMEGA chip. -

-

The AREF pin may also be connected internally to an (internal) 1.1 volt source (or 2.56 on the ATmega8) with analogReference(INTERNAL). With this setting voltages applied to the ADC (analog) pins that are at or above the reference will report 1023 when read with analogRead. Lower voltages will report proportional values, so 0.55 volts will report about 512. -

-

The connection between the 1.1 volt source and the AREF pin is a very high impedance (low current) connection, so that reading the 1.1 (internally supplied) voltage at the AREF pin may only be done with a more expensive, high-impedance multimeter. An external voltage applied (erroneously) to AREF pin while using the INTERNAL setting will not damage the chip, but will totally override the 1.1 volt source, and ADC readings will be governed by the external voltage. It is still desirable to connect any external voltage to the AREF pin however, through a 5K resistor to avoid the problem cited above. -

-

The correct software setting for using the AREF pin with an external voltage is analogReference(EXTERNAL). This disconnects both of the internal references and the voltage applied externally to the AREF pin sets the reference voltage for the ADC. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/AnalogWrite.html b/arduino-0018-linux-x64/reference/AnalogWrite.html deleted file mode 100644 index 8f0d708..0000000 --- a/arduino-0018-linux-x64/reference/AnalogWrite.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - Arduino - AnalogWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

analogWrite()

-

Description

-

Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite() (or a call to digitalRead() or digitalWrite() on the same pin). The frequency of the PWM signal is approximately 490 Hz. -

-

On newer Arduino boards (including the Mini and BT) with the ATmega168 chip, this function works on pins 3, 5, 6, 9, 10, and 11. Older USB and serial Arduino boards with an ATmega8 only support analogWrite() on pins 9, 10, and 11. -

-

Syntax

-

analogWrite(pin, value) -

-

Parameters

-

pin: the pin to write to. -

-

value: the duty cycle: between 0 (always off) and 255 (always on). -

-

Returns

-

nothing -

-

Notes and Known Issues

-

analogWrite has nothing whatsoever to do with the analog pins or analogRead. -

-

You do not need to call pinMode() to set the pin as an output before calling analogWrite(). -

-

The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. This is because of interactions with the millis() and delay() functions, which share the same internal timer used to generate those PWM outputs. This will be noticed mostly on low duty-cycle settings (e.g 0 - 10) and may result in analogWrite(x, 0) not fully turning off the output on pins 5 & 6, as one would expect. -

-

Example

-

Sets the output to the LED proportional to the value read from the potentiometer. -

-

 
-int ledPin = 9;      // LED connected to digital pin 9
-int analogPin = 3;   // potentiometer connected to analog pin 3
-int val = 0;         // variable to store the read value
-
-void setup()
-{
-  pinMode(ledPin, OUTPUT);   // sets the pin as output
-}
-
-void loop()
-{
-  val = analogRead(analogPin);   // read the input pin
-  analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Arithmetic.html b/arduino-0018-linux-x64/reference/Arithmetic.html deleted file mode 100644 index 5fe17bc..0000000 --- a/arduino-0018-linux-x64/reference/Arithmetic.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - Arduino - Arithmetic - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Addition, Subtraction, Multiplication, & Division

-

Description

-

These operators return the sum, difference, product, or quotient (respectively) of the two operands. The operation is conducted using the data type of the operands, so, for example, 9 / 4 gives 2 since 9 and 4 are ints. This also means that the operation can overflow if the result is larger than that which can be stored in the data type (e.g. adding 1 to an int with the value 32,767 gives -32,768). If the operands are of different types, the "larger" type is used for the calculation. -

-

If one of the numbers (operands) are of the type float or of type double, floating point math will be used for the calculation. -

-

Examples

-
-y = y + 3;
-x = x - 7;
-i = j * 6;
-r = r / 5;
-
-
-

Syntax

-
-result = value1 + value2;
-result = value1 - value2;
-result = value1 * value2;
-result = value1 / value2;
-
-
-

Parameters:

-

value1: any variable or constant -

-

value2: any variable or constant -

-

Programming Tips:

-
  • Know that integer constants default to int, so some constant calculations may overflow (e.g. 60 * 1000 will yield a negative result). -

  • Choose variable sizes that are large enough to hold the largest results from your calculations -

  • Know at what point your variable will "roll over" and also what happens in the other direction e.g. (0 - 1) OR (0 - - 32768) -

  • For math that requires fractions, use float variables, but be aware of their drawbacks: large size, slow computation speeds -

  • Use the cast operator e.g. (int)myFloat to convert one variable type to another on the fly. -

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Assignment.html b/arduino-0018-linux-x64/reference/Assignment.html deleted file mode 100644 index a514842..0000000 --- a/arduino-0018-linux-x64/reference/Assignment.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Arduino - Assignment - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

= assignment operator (single equal sign)

-

Stores the value to the right of the equal sign in the variable to the left of the equal sign. -

-

The single equal sign in the C programming language is called the assignment operator. It has a different meaning than in algebra class where it indicated an equation or equality. The assignment operator tells the microcontroller to evaluate whatever value or expression is on the right side of the equal sign, and store it in the variable to the left of the equal sign. -

-

Example

-
 int sensVal;                 // declare an integer variable named sensVal
- senVal = analogRead(0);       // store the (digitized) input voltage at analog pin 0 in SensVal
-
-

Programming Tips

-

The variable on the left side of the assignment operator ( = sign ) needs to be able to hold the value stored in it. If it is not large enough to hold a value, the value stored in the variable will be incorrect. -

-

Don't confuse the assignment operator [ = ] (single equal sign) with the comparison operator [ == ] (double equal signs), which evaluates whether two expressions are equal. -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/AttachInterrupt.html b/arduino-0018-linux-x64/reference/AttachInterrupt.html deleted file mode 100644 index df4b626..0000000 --- a/arduino-0018-linux-x64/reference/AttachInterrupt.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - Arduino - AttachInterrupt - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

attachInterrupt(interrupt, function, mode)

-

Description

-

Specifies a function to call when an external interrupt occurs. Replaces any previous function that was attached to the interrupt. Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3). The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18). -

-

Parameters

-

interrupt: the number of the interrupt (int) -

-

function: the function to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine. -

-

mode defines when the interrupt should be triggered. Four contstants are predefined as valid values: -

  • LOW to trigger the interrupt whenever the pin is low, -
  • CHANGE to trigger the interrupt whenever the pin changes value -
  • RISING to trigger when the pin goes from low to high, -
  • FALLING for when the pin goes from high to low. -

Returns

-

none -

-

Note

-

Inside the attached function, delay() won't work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function. -

-

Using Interrupts

-

Interrupts are useful for making things happen automatically in microcontroller programs, and can help solve timing problems. A good task for using an interrupt might be reading a rotary encoder, monitoring user input. -

-

If you wanted to insure that a program always caught the pulses from a rotary encoder, never missing a pulse, it would make it very tricky to write a program to do anything else, because the program would need to constantly poll the sensor lines for the encoder, in order to catch pulses when they occurred. Other sensors have a similar interface dynamic too, such as trying to read a sound sensor that is trying to catch a click, or an infrared slot sensor (photo-interrupter) trying to catch a coin drop. In all of these situations, using an interrupt can free the microcontroller to get some other work done while not missing the doorbell. -

-

Example

-
int pin = 13;
-volatile int state = LOW;
-
-void setup()
-{
-  pinMode(pin, OUTPUT);
-  attachInterrupt(0, blink, CHANGE);
-}
-
-void loop()
-{
-  digitalWrite(pin, state);
-}
-
-void blink()
-{
-  state = !state;
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Bit.html b/arduino-0018-linux-x64/reference/Bit.html deleted file mode 100644 index 0baa8c1..0000000 --- a/arduino-0018-linux-x64/reference/Bit.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - Bit - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

bit()

-

Description

-

Computes the value of the specified bit (bit 0 is 1, bit 1 is 2, bit 2 is 4, etc.). -

-

Syntax

-

bit(n) -

-

Parameters

-

n: the bit whose value to compute -

-

Returns

-

the value of the bit -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/BitClear.html b/arduino-0018-linux-x64/reference/BitClear.html deleted file mode 100644 index d392c2c..0000000 --- a/arduino-0018-linux-x64/reference/BitClear.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - Arduino - BitClear - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

bitClear()

-

Description

-

Clears (writes a 0 to) a bit of a numeric variable. -

-

Syntax

-

bitClear(x, n) -

-

Parameters

-

x: the numeric variable whose bit to clear -

-

n: which bit to clear, starting at 0 for the least-significant (rightmost) bit -

-

Returns

-

none -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/BitRead.html b/arduino-0018-linux-x64/reference/BitRead.html deleted file mode 100644 index dd45e33..0000000 --- a/arduino-0018-linux-x64/reference/BitRead.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - Arduino - BitRead - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

bitRead()

-

Description

-

Reads a bit of a number. -

-

Syntax

-

bitRead(x, n) -

-

Parameters

-

x: the number from which to read -

-

n: which bit to read, starting at 0 for the least-significant (rightmost) bit -

-

Returns

-

the value of the bit (0 or 1). -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/BitSet.html b/arduino-0018-linux-x64/reference/BitSet.html deleted file mode 100644 index 8e27a94..0000000 --- a/arduino-0018-linux-x64/reference/BitSet.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - Arduino - BitSet - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

bitSet()

-

Description

-

Sets (writes a 1 to) a bit of a numeric variable. -

-

Syntax

-

bitSet(x, n) -

-

Parameters

-

x: the numeric variable whose bit to set -

-

n: which bit to set, starting at 0 for the least-significant (rightmost) bit -

-

Returns

-

none -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/BitWrite.html b/arduino-0018-linux-x64/reference/BitWrite.html deleted file mode 100644 index 468ba00..0000000 --- a/arduino-0018-linux-x64/reference/BitWrite.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - Arduino - BitWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

bitWrite()

-

Description

-

Writes a bit of a numeric variable. -

-

Syntax

-

bitWrite(x, n, b) -

-

Parameters

-

x: the numeric variable to which to write -

-

n: which bit of the number to write, starting at 0 for the least-significant (rightmost) bit -

-

b: the value to write to the bit (0 or 1) -

-

Returns

-

none -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/BitwiseXorNot.html b/arduino-0018-linux-x64/reference/BitwiseXorNot.html deleted file mode 100644 index 016b5f5..0000000 --- a/arduino-0018-linux-x64/reference/BitwiseXorNot.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Arduino - BitwiseXorNot - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Bitwise NOT (~)

-

The bitwise NOT operator in C++ is the tilde character ~. Unlike & and |, the bitwise NOT operator is applied to a single operand to its right. Bitwise NOT changes each bit to its opposite: 0 becomes 1, and 1 becomes 0. For example: -

-

    0  1    operand1
-
-

   ----------
-    1  0   ~ operand1
-
-

    int a = 103;    // binary:  0000000001100111
-    int b = ~a;     // binary:  1111111110011000 = -104
-
-

You might be surprised to see a negative number like -104 as the result of this operation. This is because the highest bit in an int variable is the so-called sign bit. If the highest bit is 1, the number is interpreted as negative. This encoding of positive and negative numbers is referred to as two's complement. For more information, see the Wikipedia article on two's complement. -

-

As an aside, it is interesting to note that for any integer x, ~x is the same as -x-1. -

-

At times, the sign bit in a signed integer expression can cause some unwanted surprises. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Boolean.html b/arduino-0018-linux-x64/reference/Boolean.html deleted file mode 100644 index df98a02..0000000 --- a/arduino-0018-linux-x64/reference/Boolean.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - Arduino - Boolean - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Boolean Operators

-

These can be used inside the condition of an if statement. -

-

&& (logical and)

-

True only if both operands are true, e.g. -

-if (digitalRead(2) == HIGH  && digitalRead(3) == HIGH) { // read two switches 
-  // ...
-} 
-

is true only if both inputs are high. -

-

|| (logical or)

-

True if either operand is true, e.g. -

-if (x > 0 || y > 0) {
-  // ...
-} 
-

is true if either x or y is greater than 0. -

-

! (not)

-

True if the operand is false, e.g. -

-if (!x) { 
-  // ...
-} 
-

is true if x is false (i.e. if x equals 0). -

-

Warning

-

Make sure you don't mistake the boolean AND operator, && (double ampersand) for the bitwise AND operator & (single ampersand). They are entirely different beasts. -

-

Similarly, do not confuse the boolean || (double pipe) operator with the bitwise OR operator | (single pipe). -

-

The bitwise not ~ (tilde) looks much different than the boolean not ! (exclamation point or "bang" as the programmers say) but you still have to be sure which one you want where. -

-

Examples

-
-if (a >= 10 && a <= 20){}   // true if a is between 10 and 20
-
-
-

See also

-
  • & (bitwise AND) -
  • | (bitwise OR) -
  • ~ (bitwise NOT -
  • if -

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/BooleanVariables.html b/arduino-0018-linux-x64/reference/BooleanVariables.html deleted file mode 100644 index 671b0b3..0000000 --- a/arduino-0018-linux-x64/reference/BooleanVariables.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - Arduino - BooleanVariables - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

boolean

-

A boolean holds one of two values, true or false. (Each boolean variable occupies one byte of memory.) -

-

Example

-
-int LEDpin = 5;       // LED on pin 5
-int switchPin = 13;   // momentary switch on 13, other side connected to ground
-
-boolean running = false;
-
-void setup()
-{
-  pinMode(LEDpin, OUTPUT);
-  pinMode(switchPin, INPUT);
-  digitalWrite(switchPin, HIGH);      // turn on pullup resistor
-}
-
-void loop()
-{
-  if (digitalRead(switchPin) == LOW)
-  {  // switch is pressed - pullup keeps pin high normally
-    delay(100);                        // delay to debounce switch
-    running = !running;                // toggle running variable
-    digitalWrite(LEDpin, running)      // indicate via LED
-  }
-}
-
-
-
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Braces.html b/arduino-0018-linux-x64/reference/Braces.html deleted file mode 100644 index 5e41ad2..0000000 --- a/arduino-0018-linux-x64/reference/Braces.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - Arduino - Braces - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

{} Curly Braces

-

Curly braces (also referred to as just "braces" or as "curly brackets") are a major part of the C programming language. They are used in several different constructs, outlined below, and this can sometimes be confusing for beginners. -

-

An opening curly brace "{" must always be followed by a closing curly brace "}". This is a condition that is often referred to as the braces being balanced. The Arduino IDE (integrated development environment) includes a convenient feature to check the balance of curly braces. Just select a brace, or even click the insertion point immediately following a brace, and its logical companion will be highlighted. -

-

At present this feature is slightly buggy as the IDE will often find (incorrectly) a brace in text that has been "commented out." -

-

Beginning programmers, and programmers coming to C from the BASIC language often find using braces confusing or daunting. After all, the same curly braces replace the RETURN statement in a subroutine (function), the ENDIF statement in a conditional and the NEXT statement in a FOR loop. -

-

Because the use of the curly brace is so varied, it is good programming practice to type the closing brace immediately after typing the opening brace when inserting a construct which requires curly braces. Then insert some carriage returns between your braces and begin inserting statements. Your braces, and your attitude, will never become unbalanced. -

-

Unbalanced braces can often lead to cryptic, impenetrable compiler errors that can sometimes be hard to track down in a large program. Because of their varied usages, braces are also incredibly important to the syntax of a program and moving a brace one or two lines will often dramatically affect the meaning of a program. -

-

The main uses of curly braces

-

Functions

-
  void myfunction(datatype argument){
-    statements(s)
-  }
-
-

Loops

-
  while (boolean expression)
-  {
-     statement(s)
-  }
-
-  do
-  {
-     statement(s)
-  } while (boolean expression);
-
-  for (initialisation; termination condition; incrementing expr)
-  {
-     statement(s)
-  } 
-
-

Conditional statements

-

  if (boolean expression)
-  {
-     statement(s)
-  }
-
-  else if (boolean expression)
-  {
-     statement(s)
-  } 
-  else
-  {
-     statement(s)
-  }
-
-

Reference Home -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Break.html b/arduino-0018-linux-x64/reference/Break.html deleted file mode 100644 index beb2b5f..0000000 --- a/arduino-0018-linux-x64/reference/Break.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - Break - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

break

-

break is used to exit from a do, for, or while loop, bypassing the normal loop condition. It is also used to exit from a switch statement. -

-

Example

-
-for (x = 0; x < 255; x ++)
-{
-    digitalWrite(PWMpin, x);
-    sens = analogRead(sensorPin);  
-    if (sens > threshold){      // bail out on sensor detect
-       x = 0;
-       break;
-    }  
-    delay(50);
-}
-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Byte.html b/arduino-0018-linux-x64/reference/Byte.html deleted file mode 100644 index 0ce2492..0000000 --- a/arduino-0018-linux-x64/reference/Byte.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - Arduino - Byte - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

byte

-

Description

-

A byte stores an 8-bit unsigned number, from 0 to 255. -

-

Example

-
    byte b = B10010;  // "B" is the binary formatter (B10010 = 18 decimal) 
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ByteCast.html b/arduino-0018-linux-x64/reference/ByteCast.html deleted file mode 100644 index d700b11..0000000 --- a/arduino-0018-linux-x64/reference/ByteCast.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - ByteCast - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

byte()

-

Description

-

Converts a value to the byte data type. -

-

Syntax

-

byte(x) -

-

Parameters

-

x: a value of any type -

-

Returns

-

byte -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Changes.html b/arduino-0018-linux-x64/reference/Changes.html deleted file mode 100644 index c5e7c29..0000000 --- a/arduino-0018-linux-x64/reference/Changes.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - Arduino - Changes - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Changes

-

This page lists major changes to the Arduino core, libraries, and environment. For details, see the release notes. -

-

Changes in Arduino 0017

-
  • Environment: The code base for the Arduino development environment was largely re-written to bring it back into sync with Processing (1.0.3). The main differences include support for multiple sketch windows open simultaneously and a dedicated window for the serial monitor. -

  • Icons: The icons and about images were updated. -

  • Arduino.app: The Mac OS X version of Arduino is now a .app file packaged in a .dmg. -

  • Libraries: Support was added for third-party libraries in the SKETCHBOOK/libraries directory. This allows user-installed libraries to persist across upgrades of the Arduino software. -

  • Servo: The servo library was rewritten to allow support for up to 12 servos (on any pins) and up to 48 on the Mega. -

  • LiquidCrystal: The begin(), cursor(), noCursor(), blink(), noBlink(), display(), noDisplay(), scrollDisplayLeft(), scrollDisplayRight(), autoscroll(), noAutoscroll(), leftToRight(), rightToLeft(), and createChar() functions were added. -

Changes in Arduino 0016

-
  • New functions for writing a string, write(str), or buffer, write(buf, len), were added to the Print, Serial, and Ethernet library Client and Server classes. -

Changes in Arduino 0015

-
  • Support for the Arduino Mega. -

Changes in Arduino 0013

-
  • Support for printing floats was added to the Print, Serial, and Ethernet library Client and Server classes. -

  • The word type and word(), bitRead(), bitWrite(), bitSet(), bitClear(), bit(), lowByte(), and highByte() functions were added. -

Changes in Arduino 0012

-
  • Added the Firmata library, which provides a standard protocol for serial communication. -

  • Added Ethernet library. -

  • Added Servo library. -

  • Added LiquidCrystal library. -

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Char.html b/arduino-0018-linux-x64/reference/Char.html deleted file mode 100644 index f539cbd..0000000 --- a/arduino-0018-linux-x64/reference/Char.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - Char - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

char

-

Description

-

A data type that takes up 1 byte of memory that stores a character value. Character literals are written in single quotes, like this: 'A' (for multiple characters - strings - use double quotes: "ABC"). -

-

Characters are stored as numbers however. You can see the specific encoding in the ASCII chart. This means that it is possible to do arithmetic on characters, in which the ASCII value of the character is used (e.g. 'A' + 1 has the value 66, since the ASCII value of the capital letter A is 65). See Serial.println reference for more on how characters are translated to numbers. -

-

The char datatype is a signed type, meaning that it encodes numbers from -128 to 127. For an unsigned, one-byte (8 bit) data type, use the byte data type. -

-

Example

-
  char myChar = 'A';
-  char myChar = 65;      // both are equivalent
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/CharCast.html b/arduino-0018-linux-x64/reference/CharCast.html deleted file mode 100644 index 0690347..0000000 --- a/arduino-0018-linux-x64/reference/CharCast.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - CharCast - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

char()

-

Description

-

Converts a value to the char data type. -

-

Syntax

-

char(x) -

-

Parameters

-

x: a value of any type -

-

Returns

-

char -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientAvailable.html b/arduino-0018-linux-x64/reference/ClientAvailable.html deleted file mode 100644 index 7bbd5d8..0000000 --- a/arduino-0018-linux-x64/reference/ClientAvailable.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - Arduino - ClientAvailable - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

available()

-

Description

-

Returns the number of bytes available for reading (that is, the amount of data that has been written to the client by the server it is connected to). -

-

Syntax

-

client.available() -

-

Parameters

-

none -

-

Returns

-

The number of bytes available. -

-

-#include <Ethernet.h>
-
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte server[] = { 64, 233, 187, 99 }; // Google
-
-Client client(server, 80);
-
-void setup()
-{
-  Ethernet.begin(mac, ip);
-  Serial.begin(9600);
-
-  delay(1000);
-
-  Serial.println("connecting...");
-
-  if (client.connect()) {
-    Serial.println("connected");
-    client.println("GET /search?q=arduino HTTP/1.0");
-    client.println();
-  } else {
-    Serial.println("connection failed");
-  }
-}
-
-void loop()
-{
-  if (client.available()) {
-    char c = client.read();
-    Serial.print(c);
-  }
-
-  if (!client.connected()) {
-    Serial.println();
-    Serial.println("disconnecting.");
-    client.stop();
-    for(;;)
-      ;
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientConnect.html b/arduino-0018-linux-x64/reference/ClientConnect.html deleted file mode 100644 index d45d793..0000000 --- a/arduino-0018-linux-x64/reference/ClientConnect.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - Arduino - ClientConnect - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

connect()

-

Description

-

Connect to the IP address and port specified in the constructor. The return value indicates success or failure. -

-

Syntax

-

client.connect() -

-

Parameters

-

none -

-

Returns

-

Returns true if the connection succeeds, false if not. -

-

Example

-
-#include <Ethernet.h>
-
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte server[] = { 64, 233, 187, 99 }; // Google
-
-Client client(server, 80);
-
-void setup()
-{
-  Ethernet.begin(mac, ip);
-  Serial.begin(9600);
-
-  delay(1000);
-
-  Serial.println("connecting...");
-
-  if (client.connect()) {
-    Serial.println("connected");
-    client.println("GET /search?q=arduino HTTP/1.0");
-    client.println();
-  } else {
-    Serial.println("connection failed");
-  }
-}
-
-void loop()
-{
-  if (client.available()) {
-    char c = client.read();
-    Serial.print(c);
-  }
-
-  if (!client.connected()) {
-    Serial.println();
-    Serial.println("disconnecting.");
-    client.stop();
-    for(;;)
-      ;
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientConnected.html b/arduino-0018-linux-x64/reference/ClientConnected.html deleted file mode 100644 index b419713..0000000 --- a/arduino-0018-linux-x64/reference/ClientConnected.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - Arduino - ClientConnected - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

connected()

-

Description

-

Whether or not the client is connected. Note that a client is considered connected if the connection has been closed but there is still unread data. -

-

Syntax

-

client.connected() -

-

Parameters

-

none -

-

Returns

-

Returns true if the client is connected, false if not. -

-

Example

-
-#include <Ethernet.h>
-
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte server[] = { 64, 233, 187, 99 }; // Google
-
-Client client(server, 80);
-
-void setup()
-{
-  Ethernet.begin(mac, ip);
-  Serial.begin(9600);
-
-  delay(1000);
-
-  Serial.println("connecting...");
-
-  if (client.connect()) {
-    Serial.println("connected");
-    client.println("GET /search?q=arduino HTTP/1.0");
-    client.println();
-  } else {
-    Serial.println("connection failed");
-  }
-}
-
-void loop()
-{
-  if (client.available()) {
-    char c = client.read();
-    Serial.print(c);
-  }
-
-  if (!client.connected()) {
-    Serial.println();
-    Serial.println("disconnecting.");
-    client.stop();
-    for(;;)
-      ;
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientConstructor.html b/arduino-0018-linux-x64/reference/ClientConstructor.html deleted file mode 100644 index 2ea0256..0000000 --- a/arduino-0018-linux-x64/reference/ClientConstructor.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - Arduino - ClientConstructor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

Client()

-

Description

-

Creates a client which can connect to the specified internet IP address and port. -

-

Syntax

-

Client(ip, port) -

-

Parameters

-

ip: the IP address that the client will connect to (array of 4 bytes) -

-

port: the port that the client will connect to (int) -

-

Example

-
-#include <Ethernet.h>
-
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte server[] = { 64, 233, 187, 99 }; // Google
-
-Client client(server, 80);
-
-void setup()
-{
-  Ethernet.begin(mac, ip);
-  Serial.begin(9600);
-
-  delay(1000);
-
-  Serial.println("connecting...");
-
-  if (client.connect()) {
-    Serial.println("connected");
-    client.println("GET /search?q=arduino HTTP/1.0");
-    client.println();
-  } else {
-    Serial.println("connection failed");
-  }
-}
-
-void loop()
-{
-  if (client.available()) {
-    char c = client.read();
-    Serial.print(c);
-  }
-
-  if (!client.connected()) {
-    Serial.println();
-    Serial.println("disconnecting.");
-    client.stop();
-    for(;;)
-      ;
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientFlush.html b/arduino-0018-linux-x64/reference/ClientFlush.html deleted file mode 100644 index 0b42c67..0000000 --- a/arduino-0018-linux-x64/reference/ClientFlush.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - ClientFlush - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

flush()

-

Discard any bytes that have been written to the client but not yet read. -

-

Syntax

-

client.flush() -

-

Parameters

-

none -

-

Returns

-

none -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientPrint.html b/arduino-0018-linux-x64/reference/ClientPrint.html deleted file mode 100644 index 1f9bb8b..0000000 --- a/arduino-0018-linux-x64/reference/ClientPrint.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - ClientPrint - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

print()

-

Description

-

Print data to the server that a client is connected to. Prints numbers as a sequence of digits, each an ASCII character (e.g. the number 123 is sent as the three characters '1', '2', '3'). -

-

Syntax

-

client.print(data)
client.print(data, BASE) -

-

Parameters

-

data: the data to print (char, byte, int, long, or string) -

-

BASE (optional): the base in which to print numbers: BIN for binary (base 2), DEC for decimal (base 10), OCT for octal (base 8), HEX for hexadecimal (base 16). -

-

Example

-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientPrintln.html b/arduino-0018-linux-x64/reference/ClientPrintln.html deleted file mode 100644 index 492cd3b..0000000 --- a/arduino-0018-linux-x64/reference/ClientPrintln.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - ClientPrintln - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

println()

-

Description

-

Print data, followed by a newline, to the server a client is connected to. Prints numbers as a sequence of digits, each an ASCII character (e.g. the number 123 is sent as the three characters '1', '2', '3'). -

-

Syntax

-

client.println()
client.println(data)
client.print(data, BASE) -

-

Parameters

-

data (optional): the data to print (char, byte, int, long, or string) -

-

BASE (optional): the base in which to print numbers: BIN for binary (base 2), DEC for decimal (base 10), OCT for octal (base 8), HEX for hexadecimal (base 16). -

-

Example

-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientRead.html b/arduino-0018-linux-x64/reference/ClientRead.html deleted file mode 100644 index 4a36640..0000000 --- a/arduino-0018-linux-x64/reference/ClientRead.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - ClientRead - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

read()

-

Read the next byte received from the server the client is connected to (after the last call to read()). -

-

Syntax

-

client.read() -

-

Parameters

-

none -

-

Returns

-

The next byte (or character), or -1 if none is available. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientStop.html b/arduino-0018-linux-x64/reference/ClientStop.html deleted file mode 100644 index 2596eb0..0000000 --- a/arduino-0018-linux-x64/reference/ClientStop.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - ClientStop - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

stop()

-

Description

-

Disconnect from the server. -

-

Syntax

-

client.stop() -

-

Parameters

-

none -

-

Returns

-

none -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ClientWrite.html b/arduino-0018-linux-x64/reference/ClientWrite.html deleted file mode 100644 index 0508d2b..0000000 --- a/arduino-0018-linux-x64/reference/ClientWrite.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - Arduino - ClientWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Client class -

-

write()

-

Description

-

Write data to the server the client is connected to. -

-

Syntax

-

client.write(data) -

-

Parameters

-

data: the byte or char to write -

-

Example

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Comments.html b/arduino-0018-linux-x64/reference/Comments.html deleted file mode 100644 index f9fa2d9..0000000 --- a/arduino-0018-linux-x64/reference/Comments.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - Arduino - Comments - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Comments

-

Comments are lines in the program that are used to inform yourself or others about the way the program works. They are ignored by the compiler, and not exported to the processor, so they don't take up any space on the Atmega chip. -

-

Comments only purpose are to help you understand (or remember) how your program works or to inform others how your program works. -There are two different ways of marking a line as a comment: -

-

Example

-
 x = 5;  // This is a single line comment. Anything after the slashes is a comment 
-         // to the end of the line
-
-/* this is multiline comment - use it to comment out whole blocks of code
-
-if (gwb == 0){   // single line comment is OK inside a multiline comment
-x = 3;           /* but not another multiline comment - this is invalid */
-}
-// don't forget the "closing" comment - they have to be balanced!
-*/
-
-
-

Tip
When experimenting with code, "commenting out" parts of your program is a convenient way to remove lines that may be buggy. This leaves the lines in the code, but turns them into comments, so the compiler just ignores them. This can be especially useful when trying to locate a problem, or when a program refuses to compile and the compiler error is cryptic or unhelpful. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Comparison.html b/arduino-0018-linux-x64/reference/Comparison.html deleted file mode 100644 index e8ab3c1..0000000 --- a/arduino-0018-linux-x64/reference/Comparison.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - Arduino - Comparison - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Arduino/Processing Language Comparison

-

The Arduino language (based on Wiring) is implemented in C/C++, and therefore has some differences from the Processing language, which is based on Java. -

-

Arrays

-
Arduino - Processing -
int bar[8];
bar[0] = 1; -
int[] bar = new int[8];
bar[0] = 1; -
int foo[] = { 0, 1, 2 }; - int foo[] = { 0, 1, 2 };
or
int[] foo = { 0, 1, 2 }; -
-

Loops

-
Arduino - Processing -
int i;
for (i = 0; i < 5; i++) { ... } -
for (int i = 0; i < 5; i++) { ... } -
-

Printing

-
Arduino - Processing -
Serial.println("hello world"); - println("hello world"); -
int i = 5;
Serial.println(i); -
int i = 5;
println(i); -
int i = 5;
Serial.print("i = ");
Serial.print(i);
Serial.println(); -
int i = 5;
println("i = " + i); -
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Const.html b/arduino-0018-linux-x64/reference/Const.html deleted file mode 100644 index 1042b50..0000000 --- a/arduino-0018-linux-x64/reference/Const.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - Arduino - Const - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

const keyword

-

The const keyword stands for constant. It is a variable qualifier that modifies the behavior of the variable, making a variable "read-only". This means that the variable can be used just as any other variable of its type, but its value cannot be changed. You will get a compiler error if you try to assign a value to a const variable. -

-

Constants defined with the const keyword obey the rules of variable scoping that govern other variables. This, and the pitfalls of using#define, makes the const keyword a superior method for defining constants and is preferred over using #define. -

-

Example

-
-const float pi = 3.14;
-float x;
-
-// ....
-
-x = pi * 2;    // it's fine to use const's in math
-
-pi = 7;        // illegal - you can't write to (modify) a constant
-
-
-

#define or const

-

You can use either const or #define for creating numeric or string constants. For arrays, you will need to use const. In general const is preferred over #define for defining constants. -

-

See also: -

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Constrain.html b/arduino-0018-linux-x64/reference/Constrain.html deleted file mode 100644 index d56b429..0000000 --- a/arduino-0018-linux-x64/reference/Constrain.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - Arduino - Constrain - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

constrain(x, a, b)

-

Description

-

Constrains a number to be within a range. -

-

Parameters

-

x: the number to constrain, all data types -

-

a: the lower end of the range, all data types -

-

b: the upper end of the range, all data types -

-

Returns

-

x: if x is between a and b -

-

a: if x is less than a -

-

b: if x is greater than b -

-

Example

-
sensVal = constrain(sensVal, 10, 150);
-// limits range of sensor values to between 10 and 150 
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Continue.html b/arduino-0018-linux-x64/reference/Continue.html deleted file mode 100644 index 5ea4968..0000000 --- a/arduino-0018-linux-x64/reference/Continue.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Arduino - Continue - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

continue

-

The continue statement skips the rest of the current iteration of a loop (do, for, or while). It continues by checking the conditional expression of the loop, and proceeding with any subsequent iterations. -

-

Example

-
-
-for (x = 0; x < 255; x ++)
-{
-    if (x > 40 && x < 120){      // create jump in values
-        continue;
-    }
-
-    digitalWrite(PWMpin, x);
-    delay(50);
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Cos.html b/arduino-0018-linux-x64/reference/Cos.html deleted file mode 100644 index 130c650..0000000 --- a/arduino-0018-linux-x64/reference/Cos.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Arduino - Cos - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

cos(rad)

-

Description

-

Calculates the cos of an angle (in radians). The result will be between -1 and 1.
-

Parameters

-

rad: the angle in radians (float) -

-

Returns

-

The cos of the angle ("double") -

-

Note

-

Serial.print() and Serial.println() do not currently support printing floats. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Define.html b/arduino-0018-linux-x64/reference/Define.html deleted file mode 100644 index 2aec281..0000000 --- a/arduino-0018-linux-x64/reference/Define.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - Arduino - Define - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Define

-

#define is a useful C component that allows the programmer to give a name to a constant value before the program is compiled. Defined constants in arduino don't take up any program memory space on the chip. The compiler will replace references to these constants with the defined value at compile time. -

-

This can have some unwanted side effects though, if for example, a constant name that had been #defined is included in some other constant or variable name. In that case the text would be replaced by the #defined number (or text). -

-

In general, the const keyword is preferred for defining constants and should be used instead of #define. -

-

Arduino defines have the same syntax as C defines: -

-

Syntax

-

#define constantName value -

-

Note that the # is necessary. -

-

Example

-
#define ledPin 3
-// The compiler will replace any mention of ledPin with the value 3 at compile time.
-
-

Tip

-

There is no semicolon after the #define statement. If you include one, the compiler will throw cryptic errors further down the page. -

-

#define ledPin 3;    // this is an error 
-
-
-

Similarly, including an equal sign after the #define statement will also generate a cryptic compiler error further down the page. -

-

#define ledPin  = 3  // this is also an error 
-
-
-

See

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Delay.html b/arduino-0018-linux-x64/reference/Delay.html deleted file mode 100644 index 6f4a923..0000000 --- a/arduino-0018-linux-x64/reference/Delay.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - Arduino - Delay - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

delay()

-

Description

-

Pauses the program for the amount of time (in miliseconds) specified as parameter. (There are 1000 milliseconds in a second.) -

-

Syntax

-

delay(ms) -

-

Parameters

-

ms: the number of milliseconds to pause (unsigned long) -

-

Returns

-

nothing -

-

Example

-
-int ledPin = 13;                 // LED connected to digital pin 13
-
-void setup()
-{
-  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
-}
-
-void loop()
-{
-  digitalWrite(ledPin, HIGH);   // sets the LED on
-  delay(1000);                  // waits for a second
-  digitalWrite(ledPin, LOW);    // sets the LED off
-  delay(1000);                  // waits for a second
-}
-
-
-

Caveat

-

While it is easy to create a blinking LED with the delay() function, and many sketches use short delays for such tasks as switch debouncing, the use of delay() in a sketch has significant drawbacks. No other reading of sensors, mathematical calculations, or pin manipulation can go on during the delay function, so in effect, it brings most other activity to a halt. For alternative approaches to controlling timing see the millis() function and the sketch sited below. More knowledgeable programmers usually avoid the use of delay() for timing of events longer than 10's of milliseconds unless the Arduino sketch is very simple. -

-

Certain things do go on while the delay() function is controlling the Atmega chip however, because the delay function does not disable interrupts. Serial communication that appears at the RX pin is recorded, PWM (analogWrite) values and pin states are maintained, and interrupts will work as they should. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/DelayMicroseconds.html b/arduino-0018-linux-x64/reference/DelayMicroseconds.html deleted file mode 100644 index 66ee0ef..0000000 --- a/arduino-0018-linux-x64/reference/DelayMicroseconds.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - Arduino - DelayMicroseconds - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

delayMicroseconds()

-

Description

-

Pauses the program for the amount of time (in microseconds) specified as parameter. There are a thousand microseconds in a millisecond, and a million microseconds in a second. -

-

Currently, the largest value that will produce an accurate delay is 16383. This could change in future Arduino releases. For delays longer than a few thousand microseconds, you should use delay() instead. -

-

Parameters

-

us: the number of microseconds to pause (unsigned int) -

-

Returns

-

None -

-

Example

-
 
-int outPin = 8;                 // digital pin 8
-
-void setup()
-{
-  pinMode(outPin, OUTPUT);      // sets the digital pin as output
-}
-
-void loop()
-{
-  digitalWrite(outPin, HIGH);   // sets the pin on
-  delayMicroseconds(50);        // pauses for 50 microseconds      
-  digitalWrite(outPin, LOW);    // sets the pin off
-  delayMicroseconds(50);        // pauses for 50 microseconds      
-}
-
-
-

configures pin number 8 to work as an output pin. It sends a train of pulses with 100 microseconds period. -

-

Caveats and Known Issues

-

This function works very accurately in the range 3 microseconds and up. We cannot assure that delayMicroseconds will perform precisely for smaller delay-times. -

-

To ensure more accurate delays, this functions disables interrupts during its operation, meaning that some things (like receiving serial data, or incrementing the value returned by millis()) will not happen during the delay. Thus, you should only use this function for short delays, and use delay() for longer ones. -

-

delayMicroseconds(0) will generate a much longer delay than expected (~1020 us) as will using negative numbers as a parameter. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/DetachInterrupt.html b/arduino-0018-linux-x64/reference/DetachInterrupt.html deleted file mode 100644 index 3576883..0000000 --- a/arduino-0018-linux-x64/reference/DetachInterrupt.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - Arduino - DetachInterrupt - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

detachInterrupt(interrupt)

-

Description

-

Turns off the given interrupt. -

-

Parameters

-

interrupt: the number of interrupt to disable (0 or 1). -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/DigitalRead.html b/arduino-0018-linux-x64/reference/DigitalRead.html deleted file mode 100644 index a7dbbc2..0000000 --- a/arduino-0018-linux-x64/reference/DigitalRead.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - Arduino - DigitalRead - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

digitalRead()

-

Description

-

Reads the value from a specified digital pin, either HIGH or LOW. -

-

Syntax

-

digitalRead(pin) -

-

Parameters

-

pin: the number of the digital pin you want to read (int) -

-

Returns

-

HIGH or LOW -

-

Example

-
 
-int ledPin = 13; // LED connected to digital pin 13
-int inPin = 7;   // pushbutton connected to digital pin 7
-int val = 0;     // variable to store the read value
-
-void setup()
-{
-  pinMode(ledPin, OUTPUT);      // sets the digital pin 13 as output
-  pinMode(inPin, INPUT);      // sets the digital pin 7 as input
-}
-
-void loop()
-{
-  val = digitalRead(inPin);   // read the input pin
-  digitalWrite(ledPin, val);    // sets the LED to the button's value
-}
-
-
-

Sets pin 13 to the same value as the pin 7, which is an input. -

-

Note

-

If the pin isn't connected to anything, digitalRead() can return either HIGH or LOW (and this can change randomly). -

-

The analog input pins can be used as digital pins w/ numbers 14 (analog input 0) to 19 (analog input 5). -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/DigitalWrite.html b/arduino-0018-linux-x64/reference/DigitalWrite.html deleted file mode 100644 index eba6f0b..0000000 --- a/arduino-0018-linux-x64/reference/DigitalWrite.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - Arduino - DigitalWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

digitalWrite()

-

Description

-

Write a HIGH or a LOW value to a digital pin. -

-

If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW. -

-

If the pin is configured as an INPUT, writing a HIGH value with digitalWrite() will enable an internal 20K pullup resistor (see the tutorial on digital pins). Writing LOW will disable the pullup. The pullup resistor is enough to light an LED dimly, so if LEDs appear to work, but very dimly, this is a likely cause. The remedy is to set the pin to an output with the pinMode() function. -

-

Syntax

-

digitalWrite(pin, value) -

-

Parameters

-

pin: the pin number -

-

value: HIGH or LOW -

-

Returns

-

none -

-

Example

-
 
-int ledPin = 13;                 // LED connected to digital pin 13
-
-void setup()
-{
-  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
-}
-
-void loop()
-{
-  digitalWrite(ledPin, HIGH);   // sets the LED on
-  delay(1000);                  // waits for a second
-  digitalWrite(ledPin, LOW);    // sets the LED off
-  delay(1000);                  // waits for a second
-}
-
-
-

Sets pin 13 to HIGH, makes a one-second-long delay, and sets the pin back to LOW. -

-

Note

-

The analog input pins can also be used as digital pins, referred to as numbers 14 (analog input 0) to 19 (analog input 5). -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/DoWhile.html b/arduino-0018-linux-x64/reference/DoWhile.html deleted file mode 100644 index fc452fd..0000000 --- a/arduino-0018-linux-x64/reference/DoWhile.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - Arduino - DoWhile - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

do - while

-

The do loop works in the same manner as the while loop, with the exception that the condition is tested at the end of the loop, so the do loop will always run at least once. -

-

-do
-{
-    // statement block
-} while (test condition);
-
-
-

Example

-
-do
-{
-  delay(50);          // wait for sensors to stabilize
-  x = readSensors();  // check the sensors
-
-} while (x < 100);
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Double.html b/arduino-0018-linux-x64/reference/Double.html deleted file mode 100644 index 4b9c1a5..0000000 --- a/arduino-0018-linux-x64/reference/Double.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - Arduino - Double - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

double

-

Desciption

-

Double precision floating point number. Occupies 4 bytes. -

-

The double implementation on the Arduino is currently exactly the same as the float, with no gain in precision. -

-

Tip

-

Users who borrow code from other sources that includes double variables may wish to examine the code to see if the implied precision is different from that actually achieved on the Arduino. -

-

See:

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/EEPROM.html b/arduino-0018-linux-x64/reference/EEPROM.html deleted file mode 100644 index fbeda8b..0000000 --- a/arduino-0018-linux-x64/reference/EEPROM.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - Arduino - EEPROM - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

EEPROM Library

-

The microcontroller on the Arduino board has 512 bytes of EEPROM: memory whose values are kept when the board is turned off (like a tiny hard drive). This library enables you to read and write those bytes. -

-

Functions

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/EEPROMRead.html b/arduino-0018-linux-x64/reference/EEPROMRead.html deleted file mode 100644 index dc05d93..0000000 --- a/arduino-0018-linux-x64/reference/EEPROMRead.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - Arduino - EEPROMRead - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

byte EEPROM.read(address)

-

Description

-

Reads a byte from the EEPROM. Locations that have never been written to have the value of 255. -

-

Parameters

-

address: the location to read from, from 0 to 511 (int) -

-

Returns

-

the value stored in that location (byte) -

-

Example

-
-#include <EEPROM.h>
-
-int a = 0;
-int value;
-
-void setup()
-{
-  Serial.begin(9600);
-}
-
-void loop()
-{
-  value = EEPROM.read(a);
-
-  Serial.print(a);
-  Serial.print("\t");
-  Serial.print(value);
-  Serial.println();
-
-  a = a + 1;
-
-  if (a == 512)
-    a = 0;
-
-  delay(500);
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/EEPROMWrite.html b/arduino-0018-linux-x64/reference/EEPROMWrite.html deleted file mode 100644 index fffacc8..0000000 --- a/arduino-0018-linux-x64/reference/EEPROMWrite.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - Arduino - EEPROMWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

EEPROM.write(address, value)

-

Description

-

Write a byte to the EEPROM. -

-

Parameters

-

address: the location to write to, from 0 to 511 (int) -

-

value: the value to write, from 0 to 255 (byte) -

-

Returns

-

none -

-

The Atmega 168 datasheet says that EEPROM memory has a specified life of 100000 write/erase cycles, so there is a limit to how many times you can write information to that memory space. Keep this in mind for long-lived projects or fast-moving data. -

-

The datasheet also specifies that a write cycle takes 3.3 ms to complete. Other EEPROM write and read requests will fail if executed in this time period. This delay appears to be built into the EEPROM library as a casual test shows each cycle taking 3.33 ms to execute. -

-

Hence, you do not specifically need to add a delay to an EEPROM write, just be aware of the built-in time delay. -

-

Example

-
-#include <EEPROM.h>
-
-void setup()
-{
-  for (int i = 0; i < 512; i++)
-    EEPROM.write(i, i);
-}
-
-void loop()
-{
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Else.html b/arduino-0018-linux-x64/reference/Else.html deleted file mode 100644 index ece51e9..0000000 --- a/arduino-0018-linux-x64/reference/Else.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - Arduino - Else - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

if / else

-

if/else allows greater control over the flow of code than the basic if statement, by allowing multiple tests to be grouped together. For example, an analog input could be tested and one action taken if the input was less than 500, and another action taken if the input was 500 or greater. The code would look like this: -

-

if (pinFiveInput < 500)
-{
-  // action A
-}
-else
-{
-  // action B
-}
-
-

else can proceed another if test, so that multiple, mutually exclusive tests can be run at the same time. -

-

Each test will proceed to the next one until a true test is encountered. When a true test is found, its associated block of code is run, and the program then skips to the line following the entire if/else construction. If no test proves to be true, the default else block is executed, if one is present, and sets the default behavior. -

-

Note that an else if block may be used with or without a terminating else block and vice versa. An unlimited number of such else if branches is allowed. -

-

if (pinFiveInput < 500)
-{
-  // do Thing A
-}
-else if (pinFiveInput >= 1000)
-{
-  // do Thing B
-}
-else
-{
-  // do Thing C
-}
-
-

Another way to express branching, mutually exclusive tests, is with the switch case statement. -

-

See also:

-

switch case -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Ethernet.html b/arduino-0018-linux-x64/reference/Ethernet.html deleted file mode 100644 index 95361e9..0000000 --- a/arduino-0018-linux-x64/reference/Ethernet.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - Arduino - Ethernet - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet library

-

With the Arduino Ethernet Shield, this library allows an Arduino board to connect to the internet. It can serve as either a server accepting incoming connections or a client making outgoing ones. The library supports up to four concurrent connection (incoming or outgoing or a combination). -

-

Ethernet class

-

The Ethernet class initializes the ethernet library and network settings. -

-

Server class

-

The Server class creates servers which can send data to and receive data from connected clients (programs running on other computers or devices). -

-

Client class

-

The client class creates clients that can connect to servers and send and receive data. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/EthernetBegin.html b/arduino-0018-linux-x64/reference/EthernetBegin.html deleted file mode 100644 index ffd56d9..0000000 --- a/arduino-0018-linux-x64/reference/EthernetBegin.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - Arduino - EthernetBegin - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet -

-

Ethernet.begin()

-

Description

-

Initializes the ethernet library and network settings. -

-

Syntax

-

Ethernet.begin(mac, ip);
Ethernet.begin(mac, ip, gateway);
Ethernet.begin(mac, ip, gateway, subnet);
-

Parameters

-

mac: the MAC address for the device (array of 6 bytes) -

-

ip: the IP address of the device (array of 4 bytes) -

-

gateway: the IP address of the network gateway (array of 4 bytes). optional: defaults to the device IP address with the last octet set to 1 -

-

subnet: the subnet mask of the network (array of 4 bytes). optional: defaults to 255.255.255.0 -

-

Returns

-

None -

-

Example

-
-#include <Ethernet.h>
-
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-
-void setup()
-{
-  Ethernet.begin(mac, ip);
-}
-
-void loop () {}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/FAQ.html b/arduino-0018-linux-x64/reference/FAQ.html deleted file mode 100644 index 981931c..0000000 --- a/arduino-0018-linux-x64/reference/FAQ.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - Arduino - FAQ - - - - -
- - - - - - -
- -
-

Frequently Asked Questions

-

What is an Arduino? -

-

Glad you asked, we have a great introduction page on Arduino, click here to read it. -

-

What do you mean by open-source hardware? -

-

Open-source hardware shares much of the principles and approach of free and open-source software. In particular, we believe that people should be able to study our hardware to understand how it works, make changes to it, and share those changes. To facilitate this, we release all of the original design files (Eagle CAD) for the Arduino hardware. These files are licensed under a Creative Commons Attribution Share-Alike license, which allows for both personal and commercial derivative works, as long as they credit Arduino and release their designs under the same license. -

-

The Arduino software is also open-source. The source code for the Java environment is released under the GPL and the C/C++ microcontroller libraries are under the LGPL. -

-

How can I get an Arduino board? -

-

You can buy an Arduino board from one of the distributors listed on the buy page. If you'd prefer to build your own, see the Arduino Single-Sided Serial board, which can be easily etched and assembled. -

-

Who makes Arduino boards? -

-

Most of the official Arduino boards are manufactured by SmartProjects in Italy. The Arduino Pro, Pro Mini, and LilyPad are manufactured by SparkFun Electronics (a US company). The Arduino Nano is manufactured by Gravitech (also a US company). -

-

Which are the official Arduino boards? -

-

The official Arduino boards are the ones listed on the hardware page: the Duemilanove, Nano, Mega, Bluetooth (BT), LilyPad, Mini, Pro, Pro Mini, and a few older models, along with the Ethernet, XBee, motor, and prototyping shields. These are boards whose manufacturers work with the Arduino team to ensure a good user experience, compatibility with the Arduino software, and a quality product. In return for their status as official boards, the manufacturers pay a licensing fee to the Arduino team to support the further development of the project. -

-

In general, we try to restrict use of the name “Arduino†to the official boards. If you find a product under a different name but described as “Arduino compatibleâ€, it’s probably not an official board and doesn’t fund continued work on the project. -

-

I want to design my own board; what should I do? -

-

The reference designs for the Arduino boards are available from the hardware page. They're licensed under a Creative Commons Attribution Share-Alike license, so you are free to use and adapt them for your own needs without asking permission or paying a fee. If you're looking to make something of interest to the community, we'd encourage you to discuss your ideas on the hardware development forum so that potential users can offer suggestions. -

-

What should I call my boards? -

-

If you're making your own board, come up with your own name! This will allow people identify you with your products and help you to build a brand. Be creative: try to suggest what people might use the board for, or emphasize the form factor, or just pick a random word that sounds cool. "Arduino" is a trademark of Arduino team and should not be used for unofficial variants. If you're interested in having your design included in the official Arduino product line, please see the So you want to make an Arduino document and contact the Arduino team. Note that while we don't attempt to restrict uses of the "duino" suffix, its use causes the Italians on the team to cringe (apparently it sounds terrible); you might want to avoid it. -

-

Can I build a commercial product based on Arduino? -

-

Yes, with the following conditions: -

-

  • Physically embedding an Arduino board inside a commercial product does not require you to disclose or open-source any information about its design. -

  • Deriving the design of a commercial product from the Eagle files for an Arduino board requires you to release the modified files under the same Creative Commons Attribution Share-Alike license. You may manufacture and sell the resulting product. -

  • Using the Arduino core and libraries for the firmware of a commercial product does not require you to release the source code for the firmware. The LGPL does, however, require you to make available object files that allow for the relinking of the firmware against updated versions of the Arduino core and libraries. Any modifications to the core and libraries must be released under the LGPL. -

  • The source code for the Arduino environment is covered by the GPL, which requires any modifications to be open-sourced under the same license. It does not prevent the sale of derivative software or its inclusion in commercial products. -

In all cases, the exact requirements are determined by the applicable license. Additionally, see the previous question for information about the use of the name “Arduinoâ€. -

-

-How can I run the Arduino IDE under Linux? -

-

See instructions for Ubuntu Linux, for Debian Linux, for Gentoo Linux, for Linux, or for Linux on PPC. This this forum thread has more information. Or, you can use Arduino from the command line, and not have to install Java. -

-

Can I program the Arduino board in C? -

-

In fact, you already are; the Arduino language is merely a set of C/C++ functions that can be called from your code. Your sketch undergoes minor changes (e.g. automatic generation of function prototypes) and then is passed directly to a C/C++ compiler (avr-g++). All standard C and C++ constructs supported by avr-g++ should work in Arduino. For more details, see the page on the Arduino build process. -

-

Can I use a different IDE to program the Arduino board? -

-

It is possible to compile programs for the Arduino using a Makefile and the command line. If you can get your IDE to run make, you should be all set. -

-

Can I use an Arduino board without the Arduino software? -

-

Sure. It's just an AVR development board, you can use straight AVR C or C++ (with avr-gcc and avrdude or AVR Studio) to program it. -

-

Can I use the Arduino software with other AVR boards? -

-

Yes, although it may require some modifications to the Arduino core libraries. See the porting page in the Arduino Google Code project for details. -

-

Troubleshooting

-

These questions have moved to the troubleshooting section of the Arduino guide. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Float.html b/arduino-0018-linux-x64/reference/Float.html deleted file mode 100644 index ce02ead..0000000 --- a/arduino-0018-linux-x64/reference/Float.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - Arduino - Float - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

float

-

Description

-

Datatype for floating-point numbers, a number that has a decimal point. Floating-point numbers are often used to approximate analog and continuous values because they have greater resolution than integers. Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38. They are stored as 32 bits (4 bytes) of information. -

-

Floating point numbers are not exact, and may yield strange results when compared. For example 6.0 / 3.0 may not equal 2.0. You should instead check that the absolute value of the difference between the numbers is less than some small number. -

-

Floating point math is also much slower than integer math in performing calculations, so should be avoided if, for example, a loop has to run at top speed for a critical timing function. Programmers often go to some lengths to convert floating point calculations to integer math to increase speed. -

-

Examples

-
    float myfloat;
-    float sensorCalbrate = 1.117;
-
-

Syntax

-
    float var = val;
-
-

  • var - your float variable name -
  • val - the value you assign to that variable -

Example Code

-
-   int x;
-   int y;
-   float z;
-
-   x = 1;
-   y = x / 2;            // y now contains 0, ints can't hold fractions
-   z = (float)x / 2.0;   // z now contains .5 (you have to use 2.0, not 2)
-
-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/FloatCast.html b/arduino-0018-linux-x64/reference/FloatCast.html deleted file mode 100644 index e45d843..0000000 --- a/arduino-0018-linux-x64/reference/FloatCast.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - FloatCast - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

float()

-

Description

-

Converts a value to the float data type. -

-

Syntax

-

float(x) -

-

Parameters

-

x: a value of any type -

-

Returns

-

float -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/For.html b/arduino-0018-linux-x64/reference/For.html deleted file mode 100644 index 3d5efb1..0000000 --- a/arduino-0018-linux-x64/reference/For.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - Arduino - For - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

for statements

-

Desciption

-

The for statement is used to repeat a block of statements enclosed in curly braces. An increment counter is usually used to increment and terminate the loop. The for statement is useful for any repetitive operation, and is often used in combination with arrays to operate on collections of data/pins. -

-

There are three parts to the for loop header: -

-

for (initialization; condition; increment) { -

-

//statement(s); -

-

} -

-

The initialization happens first and exactly once. Each time through the loop, the condition is tested; if it's true, the statement block, and the increment is executed, then the condition is tested again. When the condition becomes false, the loop ends. -

-

Example

-
-// Dim an LED using a PWM pin
-int PWMpin = 10; // LED in series with 1k resistor on pin 10
-
-void setup()
-{
-  // no setup needed
-}
-
-void loop()
-{
-   for (int i=0; i <= 255; i++){
-      analogWrite(PWMpin, i);
-      delay(10);
-   } 
-}
-
-
-

Coding Tip

-

The C for loop is much more flexible than for loops found in some other computer languages, including BASIC. Any or all of the three header elements may be omitted, although the semicolons are required. Also the statements for initialization, condition, and increment can be any valid C statements with unrelated variables. These types of unusual for statements may provide solutions to some rare programming problems. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Fpconstants.html b/arduino-0018-linux-x64/reference/Fpconstants.html deleted file mode 100644 index c8f6394..0000000 --- a/arduino-0018-linux-x64/reference/Fpconstants.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Arduino - Fpconstants - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

floating point constants

-

Similar to integer constants, floating point constants are used to make code more readable. Floating point constants are swapped at compile time for the value to which the expression evaluates. -

-

Examples: -

-

n = .005; -

-

Floating point constants can also be expressed in a variety of scientific notation. 'E' and 'e' are both accepted as valid exponent indicators. -

-

-
-floating-point   evaluates to:      also evaluates to:
-  constant 
-
-   10.0	             10
-  2.34E5          2.34 * 10^5             234000
-  67e-12        67.0 * 10^-12         .000000000067
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Goto.html b/arduino-0018-linux-x64/reference/Goto.html deleted file mode 100644 index 1e45932..0000000 --- a/arduino-0018-linux-x64/reference/Goto.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - Arduino - Goto - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

goto

-

Transfers program flow to a labeled point in the program -

-

Syntax

-

label: -

-

goto label; // sends program flow to the label -

-

Tip

-

The use of goto is discouraged in C programming, and some authors of C programming books claim that the goto statement is never necessary, but used judiciously, it can simplify certain programs. The reason that many programmers frown upon the use of goto is that with the unrestrained use of goto statements, it is easy to create a program with undefined program flow, which can never be debugged. -

-

With that said, there are instances where a goto statement can come in handy, and simplify coding. One of these situations is to break out of deeply nested for loops, or if logic blocks, on a certain condition. -

-

Example

-
-for(byte r = 0; r < 255; r++){
-    for(byte g = 255; g > -1; g--){
-        for(byte b = 0; b < 255; b++){
-            if (analogRead(0) > 250){ goto bailout;}
-            // more statements ... 
-        }
-    }
-}
-bailout:
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Guide_ArduinoBT.html b/arduino-0018-linux-x64/reference/Guide_ArduinoBT.html deleted file mode 100644 index 6c155d2..0000000 --- a/arduino-0018-linux-x64/reference/Guide_ArduinoBT.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - Arduino - ArduinoBT - - - - -
- - - - - - -
- -
-

ArduinoBT

-

The Arduino BT is an Arduino board with built-in bluetooth module, allowing for wireless communication. To get started with the Arduino BT, follow the directions for the Arduino NG on your operating system (Windows, Mac OS X, Linux), with the following modifications: -

-

  • First, pair the Arduino BT with your computer and create a virtual serial port for it. Look for a bluetooth device called ARDUINOBT and the pass code is 12345. -

  • Select Arduino BT from the Tools | Board menu of the Arduino environment. -

Information about the Arduino BT

-

In most respects, the Arduino BT is similar to the Arduino Diecimila. Here are the main differences of BT board (besides the fact that it communicates over bluetooth instead of USB): -

-

  • The Arduino BT is more fragile and easy to break than a regular Arduino board. -

  • Don't power the board with more than 5.5 volts to the or reverse the polarity (power and ground pins) of your power supply, or you might kill the ATmega168 on the Arduino BT. The Arduino BT can, however, run with a minimum of 1.2 volts, making it easier to power with batteries. -

  • The microcontroller (an ATmega168) on the Arduino BT is a physically smaller version of the chip on the USB Arduino boards. You can't remove it, so if you kill it, you need a new Arduino BT. -

  • There are two extra analog inputs on the Arduino BT (8 total). Two of these, however, are not connected to the pin headers on the board; you'll need to solder something to the pads next to the numbers "6" and "7". -

  • Pin 7 is connected to the reset pin of the bluetooth module; don't use it for anything (except resetting the module). -

For more details, see the Arduino BT hardware page. -

-

Using the Arduino BT

-

The on-board serial communication between the bluetooth module and the Arduino sketch (running on the ATmega168) needs to be at 115200 baud (i.e. call Serial.begin(115200) in your setup() function). Communication between the bluetooth module and the computer can be at any baud rate. -

-

Communication between the BT module and the computer can be temperamental. You might want to open the serial monitor a couple of seconds after resetting the board. -The text of the Arduino getting started guide is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Guide_ArduinoEthernetShield.html b/arduino-0018-linux-x64/reference/Guide_ArduinoEthernetShield.html deleted file mode 100644 index dc30f26..0000000 --- a/arduino-0018-linux-x64/reference/Guide_ArduinoEthernetShield.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - Arduino - ArduinoEthernetShield - - - - -
- - - - - - -
- -
-

Arduino Ethernet Shield

-

The Arduino Ethernet shield allows an Arduino board to connect to the internet using the Ethernet library. -

-

Connecting the Shield

-
-

To use the shield, mount it on top of an Arduino board (e.g. the Diecimila). To upload sketches to the board, connect it to your computer with a USB cable as you normally would. Once the sketch has been uploaded, you can disconnect the board from your computer and power it with an external power supply. -

-

Connect the shield to your computer or a network hub or router using a standard ethernet cable (CAT5 or CAT6 with RJ45 connectors). Connecting to a computer may require the use of a cross-over cable (although many computers, including all recent Macs can do the cross-over internally). -

-

Network Settings

-

The shield must be assigned a MAC address and a fixed IP address using the Ethernet.begin() function. A MAC address is a globally unique identifier for a particular device; inventing a random one should work, but don't use the same one for multiple boards. Valid IP addresses depend on the configuration of your network. (It is possible to use DHCP to dynamically assign an IP to the shield, but this is not yet implemented.) Optionally, you can also specify a network gateway and subnet. -

-

The text of the Arduino getting started guide is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Guide_ArduinoLilyPad.html b/arduino-0018-linux-x64/reference/Guide_ArduinoLilyPad.html deleted file mode 100644 index 46244d9..0000000 --- a/arduino-0018-linux-x64/reference/Guide_ArduinoLilyPad.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - ArduinoLilyPad - - - - -
- - - - - - -
- -
-

Guide to the LilyPad Arduino

-

To get started with the LilyPad Arduino, follow the directions for the Arduino NG on your operating system (Windows, Mac OS X, Linux. Connecting the LilyPad Arduino is a bit more complicated than a regular Arduino board (see below for instructions and photos). -

-

The LilyPad Arduino is more fragile and easy to break than a regular Arduino board. Don't connect more than 5.5 volts to the + tab or reverse the power and ground pins of your power supply, or you will very likely kill the ATmega on the LilyPad Arduino. You can't remove the ATmega, so if you kill it, you need a new LilyPad. -

-

Note: More information about getting started with the LilyPad Arduino can be found here. -

-

-

Connecting the LilyPad Arduino

-

To program the LilyPad Arduino, you need to connect it to your computer. The SparkFun FTDI Basic Breakout plugs into the 6-pin male header on the newest version of the LilyPad. Use a USB MiniB cable to connect the FTDI basic breakout to your computer. You can also use an FTDI USB-TTL Serial cable. -

-

-

To connect earlier versions of the board or for information on other connection options see the LilyPad Arduino tutorial on Leah's website -

-

Sewing the LilyPad Arduino

-

The hole on each tab of the LilyPad is large enough for a sewing needle to pass through. You can make both electrical and physical connections with stitching in conductive thread. Sew through the holes several times to insure good contact. Here's a picture showing a sewn LilyPad: -

-

-

See the LilyPad Arduino tutorial on Leah's website for more information about building a working wearable. See SparkFun for more stitchable modules that you can use with your LilyPad Arduino. -

-

The text of the Arduino getting started guide is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Guide_ArduinoNano.html b/arduino-0018-linux-x64/reference/Guide_ArduinoNano.html deleted file mode 100644 index 8fb6f0f..0000000 --- a/arduino-0018-linux-x64/reference/Guide_ArduinoNano.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - Arduino - ArduinoNano - - - - -
- - - - - - -
- -
-

Guide to the Arduino Nano

-
-

Connecting the Arduino Nano 2.2 to a computer with a Mini-B USB cable. Note the blue power LED underneath the board. -

-


-

-

To connect the Arduino Nano to your computer, you'll need a Mini-B USB cable. This also provides power to the board, as indicated by the blue LED (which is on the bottom of the Arduino Nano 2.x and the top of the Arduino Nano 3.0). -

-

If you have an Arduino Nano 3.0, you'll need to select Arduino Duemilanove or Nano w/ ATmega32 from the Tools > Board menu. If you have an Arduino Nano 2.x, select Arduino Diecimila, Duemilanove, or Nano w/ ATmega168. Select the correct serial port selected from the Tools > Serial Port menu. Then simply press the upload button in the Arduino environment. The board will automatically reset and the sketch will be uploaded. If you have any problems, see the troubleshooting guide. -

-

For more details on the Arduino Nano, see the hardware page. -

-

The text of the Arduino getting started guide is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Guide_MacOSX.html b/arduino-0018-linux-x64/reference/Guide_MacOSX.html deleted file mode 100644 index 7e8a9cf..0000000 --- a/arduino-0018-linux-x64/reference/Guide_MacOSX.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - Arduino - MacOSX - - - - -
- - - - - - -
- -
-

How To Get Arduino Running on Mac OS X (10.3.9 or later)

-

This document explains how to connect your Arduino board to the computer and upload your first sketch. -

-

These are the steps that we'll go through: -

-

  1. Get an Arduino board and cable -
  2. Download the Arduino environment -
  3. Install the USB drivers -
  4. Connect the board -
  5. Run the Arduino environment -
  6. Upload a program -
  7. Look for the blinking LED -
  8. Learn to use Arduino -

1 | Get an Arduino board and cable

-

In this tutorial, we assume you're using an Arduino Duemilanove or Diecimila. If you have another board, read the corresponding page in this getting started guide. -

-

The Arduino is a simple board that contains everything you need to start working with electronics and microcontroller programming. This diagram illustrates the major components of an Arduino Diecimila. (The Arduino Duemilanove is almost identical.) -

-

-

You also need a standard USB cable (A plug to B plug): the kind you would connect to a USB printer, for example. -

-

2 | Download the Arduino environment

-

To program the Arduino board you need the Arduino environment. -

-

Download: the latest version from the download page. -

-

When the download finishes, unzip the downloaded file. Make sure to preserve the folder structure. Double-click the folder to open it. There should be a few files and sub-folders inside. -

-

3 | Install the USB drivers

-

If you are using a USB Arduino, you will need to install the drivers for the FTDI chip on the board. These can be found in the drivers directory of the Arduino distribution. -

-

You'll need to select the correct drivers for your computer. Use: -

  • FTDIUSBSerialDriver_v2_1_9.dmg for older (PPC) Macs like the Powerbook, iBook, G4 or G5 -
  • FTDIUSBSerialDriver_v2_2_9_Intel.dmg for newer (Intel) Macs like the MacBook, MacBook Pro, or Mac Pro -

(The latest version of the drivers can be found on the FTDI website.) -

-

4 | Connect the board

-

On the Diecimila, the power source is selected by the jumper between the USB and power plugs. To power the board from the USB port (good for controlling low power devices like LEDs), place the jumper on the two pins closest to the USB plug. To power the board from an external power supply (6-12V), place the jumper on the two pins closest to the power plug. On the Duemilanove, the power source is selected automatically (there is no power selection jumper). In any case, connect the board to a USB port on your computer. -

-

The green power LED (labelled PWR) should go on. -

-

5 | Run the Arduino environment

-

(Mac OSX): Copy the Arduino application to your Applications directory. Double-click the Arduino application. -

-

(Windows): Open the Arduino folder and double-click the Arduino application. -

-

6 | Upload a program

-

Open the LED blink example sketch: File > Sketchbook > Examples > Digital > Blink. -

-

Select the serial device of the Arduino board from the Tools > Serial Port menu. On the Mac, this should be something with /dev/tty.usbserial in it. -

-

You'll need to select the entry in the Tools > Board menu that corresponds to your Arduino. For newer Arduino boards with an ATmega328 (check the text on the chip on the board), select Arduino Duemilanove w/ ATmega328. Previously, Arduino boards came with an ATmega168; for those, select Arduino Diecimila or Duemilanove w/ ATmega168. -

-

Now, simply click the "Upload" button in the environment. Wait a few seconds - you should see the RX and TX leds on the board flashing. If the upload is successful, the message "Done uploading." will appear in the status bar. (Note: If you have an Arduino Mini, NG, or other board, you'll need to physically present the reset button on the board immediately before pressing the upload button.) -

-

-

7 | Look for the blinking LED

-

A few seconds after the upload finishes, you should see the pin 13 (L) LED on the board start to blink (in orange). If it does, congratulations! You've gotten Arduino up-and-running. -

-

If you have problems, please see the troubleshooting suggestions. -

-

8 | Learn to use Arduino

-
  • Examples: try these example programs. -
  • Reference: read the reference for the Arduino language. -

The text of the Arduino getting started guide is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Guide_Windows.html b/arduino-0018-linux-x64/reference/Guide_Windows.html deleted file mode 100644 index 5783d2b..0000000 --- a/arduino-0018-linux-x64/reference/Guide_Windows.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - Arduino - Windows - - - - -
- - - - - - -
- -
-

How To Get Arduino Running on Windows

-

This document explains how to connect your Arduino board to the computer and upload your first sketch. -

-

These are the steps that we'll go through: -

-

  1. Get an Arduino board and cable -
  2. Download the Arduino environment -
  3. Install the USB drivers -
  4. Connect the board -
  5. Run the Arduino environment -
  6. Upload a program -
  7. Look for the blinking LED -
  8. Learn to use Arduino -

1 | Get an Arduino board and cable

-

In this tutorial, we assume you're using an Arduino Duemilanove or Diecimila. If you have another board, read the corresponding page in this getting started guide. -

-

The Arduino is a simple board that contains everything you need to start working with electronics and microcontroller programming. This diagram illustrates the major components of an Arduino Diecimila. (The Arduino Duemilanove is almost identical.) -

-

-

You also need a standard USB cable (A plug to B plug): the kind you would connect to a USB printer, for example. -

-

2 | Download the Arduino environment

-

To program the Arduino board you need the Arduino environment. -

-

Download: the latest version from the download page. -

-

When the download finishes, unzip the downloaded file. Make sure to preserve the folder structure. Double-click the folder to open it. There should be a few files and sub-folders inside. -

-

3 | Locate the USB drivers

-

If you are using a USB Arduino, you will need to install the drivers for the FTDI chip on the board. These can be found in the drivers/FTDI USB Drivers directory of the Arduino distribution. In the next step ("Connect the board"), you will point Window's Add New Hardware wizard to these drivers. -

-

The latest version of the drivers can be found on the FTDI website. -

-

4 | Connect the board

-

On the Diecimila, the power source is selected by the jumper between the USB and power plugs. To power the board from the USB port (good for controlling low power devices like LEDs), place the jumper on the two pins closest to the USB plug. To power the board from an external power supply (6-12V), place the jumper on the two pins closest to the power plug. On the Duemilanove, the power source is selected automatically (there is no power selection jumper). In any case, connect the board to a USB port on your computer. -

-

The green power LED (labelled PWR) should go on. -

-

The Add New Hardware wizard will open. Tell it not to connect to Windows update and click next. -

-

-

Then select "Install from a list or specified location (Advanced)" and click next. -

-

-

Make sure that "Search for the best driver in these locations is checked"; uncheck "Search removable media"; check "Include this location in the search" and browse to the location you unzipped the USB drivers to in the previous step. Click next. -

-

-

The wizard will search for the driver and then tell you that a "USB Serial Converter" was found. Click finish. -

-

-

The new hardware wizard will appear again. Go through the same steps. This time, a "USB Serial Port" will be found. -

-

5 | Run the Arduino environment

-

(Mac OSX): Copy the Arduino application to your Applications directory. Double-click the Arduino application. -

-

(Windows): Open the Arduino folder and double-click the Arduino application. -

-

6 | Upload a program

-

Open the LED blink example sketch: File > Sketchbook > Examples > Digital > Blink. -

-

Select the serial device of the Arduino board from the Tools | Serial Port menu. On Windows, this should be COM1 or COM2 for a serial Arduino board, or COM3, COM4, or COM5 for a USB board. To find out, open the Windows Device Mananger (in the Hardware tab of System control panel). Look for a "USB Serial Port" in the Ports section; that's the Arduino board. -

-

-

You'll need to select the entry in the Tools > Board menu that corresponds to your Arduino. For newer Arduino boards with an ATmega328 (check the text on the chip on the board), select Arduino Duemilanove w/ ATmega328. Previously, Arduino boards came with an ATmega168; for those, select Arduino Diecimila or Duemilanove w/ ATmega168. -

-

Now, simply click the "Upload" button in the environment. Wait a few seconds - you should see the RX and TX leds on the board flashing. If the upload is successful, the message "Done uploading." will appear in the status bar. (Note: If you have an Arduino Mini, NG, or other board, you'll need to physically present the reset button on the board immediately before pressing the upload button.) -

-

-

7 | Look for the blinking LED

-

A few seconds after the upload finishes, you should see the pin 13 (L) LED on the board start to blink (in orange). If it does, congratulations! You've gotten Arduino up-and-running. -

-

If you have problems, please see the troubleshooting suggestions. -

-

8 | Learn to use Arduino

-
  • Examples: try these example programs. -
  • Reference: read the reference for the Arduino language. -

The text of the Arduino getting started guide is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Guide_index.html b/arduino-0018-linux-x64/reference/Guide_index.html deleted file mode 100644 index a6b9a5c..0000000 --- a/arduino-0018-linux-x64/reference/Guide_index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Arduino - Getting Started - - - - -
- - - - - - -
- -
-

Getting Started with Arduino

-

-

Introduction: What Arduino is and why you'd want to use it. -

-

Installation: Step-by-step instructions for setting up the Arduino software and connecting it to an Arduino Duemilanove. -

-

Environment: Description of the Arduino development environment. -

-

Troubleshooting: Advice on what to do if things don't work. -

-

-

Instructions for other boards: -

-

-

The text of the Arduino getting started guide is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/HighByte.html b/arduino-0018-linux-x64/reference/HighByte.html deleted file mode 100644 index 6be009e..0000000 --- a/arduino-0018-linux-x64/reference/HighByte.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - HighByte - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

highByte()

-

Description

-

Extracts the high-order (leftmost) byte of a word (or the second lowest byte of a larger data type). -

-

Syntax

-

highByte(x) -

-

Parameters

-

x: a value of any type -

-

Returns

-

byte -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/If.html b/arduino-0018-linux-x64/reference/If.html deleted file mode 100644 index 1401427..0000000 --- a/arduino-0018-linux-x64/reference/If.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - Arduino - If - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

if (conditional) and ==, !=, <, > (comparison operators)

-

if, which is used in conjunction with a comparison operator, tests whether a certain condition has been reached, such as an input being above a certain number. The format for an if test is: -

-

if (someVariable > 50)
-{
-  // do something here
-}
-
-

The program tests to see if someVariable is greater than 50. If it is, the program takes a particular action. Put another way, if the statement in parentheses is true, the statements inside the brackets are run. If not, the program skips over the code. -

-

The brackets may be omitted after an if statement. If this is done, the next line (defined by the semicolon) becomes the only conditional statement. -

-
-if (x > 120) digitalWrite(LEDpin, HIGH); 
-
-if (x > 120)
-digitalWrite(LEDpin, HIGH); 
-
-if (x > 120){ digitalWrite(LEDpin, HIGH); } 
-
-if (x > 120){ 
-  digitalWrite(LEDpin1, HIGH);
-  digitalWrite(LEDpin2, HIGH); 
-}                                 // all are correct
-
-
-

The statements being evaluated inside the parentheses require the use of one or more operators: -

-

Comparison Operators:

-
 x == y (x is equal to y)
- x != y (x is not equal to y)
- x <  y (x is less than y)  
- x >  y (x is greater than y) 
- x <= y (x is less than or equal to y) 
- x >= y (x is greater than or equal to y)
-
-

Warning:

-

Beware of accidentally using the single equal sign (e.g. if (x = 10) ). The single equal sign is the assignment operator, and sets x to 10 (puts the value 10 into the variable x). Instead use the double equal sign (e.g. if (x == 10) ), which is the comparison operator, and tests whether x is equal to 10 or not. The latter statement is only true if x equals 10, but the former statement will always be true. -

-

This is because C evaluates the statement if (x=10) as follows: 10 is assigned to x (remember that the single equal sign is the assignment operator), so x now contains 10. Then the 'if' conditional evaluates 10, which always evaluates to TRUE, since any non-zero number evaluates to TRUE. Consequently, if (x = 10) will always evaluate to TRUE, which is not the desired result when using an 'if' statement. Additionally, the variable x will be set to 10, which is also not a desired action. -

-

if can also be part of a branching control structure using the if...else] construction. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Include.html b/arduino-0018-linux-x64/reference/Include.html deleted file mode 100644 index 7a60fa8..0000000 --- a/arduino-0018-linux-x64/reference/Include.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Arduino - Include - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

#include

-

#include is used to include outside libraries in your sketch. This gives the programmer access to a large group of standard C libraries (groups of pre-made functions), and also libraries written especially for Arduino. -

-

The main reference page for AVR C libraries (AVR is a reference to the Atmel chips on which the Arduino is based) is here. -

-

Note that #include, similar to #define, has no semicolon terminator, and the compiler will yield cryptic error messages if you add one. -

-

Example

-

This example includes a library that is used to put data into the program space flash instead of ram. This saves the ram space for dynamic memory needs and makes large lookup tables more practical. -

-

-#include <avr/pgmspace.h>
-
-prog_uint16_t myConstants[] PROGMEM = {0, 21140, 702  , 9128,  0, 25764, 8456,
-0,0,0,0,0,0,0,0,29810,8968,29762,29762,4500};
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Increment.html b/arduino-0018-linux-x64/reference/Increment.html deleted file mode 100644 index e3cefd2..0000000 --- a/arduino-0018-linux-x64/reference/Increment.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - Arduino - Increment - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

++ (increment) / -- (decrement)

-

Description

-

Increment or decrement a variable -

-

Syntax

-
-x++;  // increment x by one and returns the old value of x
-++x;  // increment x by one and returns the new value of x
-
-x-- ;   // decrement x by one and returns the old value of x 
---x ;   // decrement x by one and returns the new value of x  
-
-

Parameters

-

x: an integer or long (possibly unsigned) -

-

Returns

-

The original or newly incremented / decremented value of the variable. -

-

Examples

-
x = 2;
-y = ++x;      // x now contains 3, y contains 3
-y = x--;      // x contains 2 again, y still contains 3 
-
-

See also

-

+=
-= -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/IncrementCompound.html b/arduino-0018-linux-x64/reference/IncrementCompound.html deleted file mode 100644 index d99177a..0000000 --- a/arduino-0018-linux-x64/reference/IncrementCompound.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - Arduino - IncrementCompound - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

+= , -= , *= , /=

-

Description

-

Perform a mathematical operation on a variable with another constant or variable. The += (et al) operators are just a convenient shorthand for the expanded syntax, listed below. -

-

Syntax

-
-x += y;   // equivalent to the expression x = x + y;
-x -= y;   // equivalent to the expression x = x - y; 
-x *= y;   // equivalent to the expression x = x * y; 
-x /= y;   // equivalent to the expression x = x / y; 
-
-
-

Parameters

-

x: any variable type -

-

y: any variable type or constant -

-

Examples

-
x = 2;
-x += 4;      // x now contains 6
-x -= 3;      // x now contains 3
-x *= 10;     // x now contains 30
-x /= 2;      // x now contains 15
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Int.html b/arduino-0018-linux-x64/reference/Int.html deleted file mode 100644 index be3a5f8..0000000 --- a/arduino-0018-linux-x64/reference/Int.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - Arduino - Int - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

int

-

Description

-

Integers are your primary datatype for number storage, and store a 2 byte value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1). -

-

Int's store negative numbers with a technique called 2's complement math. The highest bit, sometimes refered to as the "sign" bit, flags the number as a negative number. The rest of the bits are inverted and 1 is added. -

-

The Arduino takes care of dealing with negative numbers for you, so that arithmetic operations work transparently in the expected manner. There can be an unexpected complication in dealing with the bitshift right operator (>>) however. -

-

Example

-
    int ledPin = 13;
-
-

Syntax

-
    int var = val;
-
-

  • var - your int variable name -
  • val - the value you assign to that variable -

Coding Tip

-

When variables are made to exceed their maximum capacity they "roll over" back to their minimum capacitiy, note that this happens in both directions. -

-

   int x
-   x = -32,768;
-   x = x - 1;       // x now contains 32,767 - rolls over in neg. direction
-
-   x = 32,767;
-   x = x + 1;       // x now contains -32,768 - rolls over
-
-
-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/IntCast.html b/arduino-0018-linux-x64/reference/IntCast.html deleted file mode 100644 index 2f062cb..0000000 --- a/arduino-0018-linux-x64/reference/IntCast.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - IntCast - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

int()

-

Description

-

Converts a value to the int data type. -

-

Syntax

-

int(x) -

-

Parameters

-

x: a value of any type -

-

Returns

-

int -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Interrupts.html b/arduino-0018-linux-x64/reference/Interrupts.html deleted file mode 100644 index e331d98..0000000 --- a/arduino-0018-linux-x64/reference/Interrupts.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - Arduino - Interrupts - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

interrupts()

-

Description

-

Re-enables interrupts (after they've been disabled by noInterrupts()). Interrupts allow certain important tasks to happen in the background and are enabled by default. Some functions will not work while interrupts are disabled, and incoming communication may be ignored. Interrupts can slightly disrupt the timing of code, however, and may be disabled for particularly critical sections of code. -

-

Parameters

-

None -

-

Returns

-

None -

-

Example

-
-void setup() {}
-
-void loop()
-{
-  noInterrupts();
-  // critical, time-sensitive code here
-  interrupts();
-  // other code here
-}
-
-
-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystal.html b/arduino-0018-linux-x64/reference/LiquidCrystal.html deleted file mode 100644 index 6589f59..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystal.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - Arduino - LiquidCrystal - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal Library

-

This library allows an Arduino board to control LiquidCrystal displays (LCDs) based on the Hitachi HD44780 (or a compatible) chipset, which is found on most text-based LCDs. The library works with in either 4- or 8-bit mode (i.e. using 4 or 8 data lines in addition to the rs, enable, and, optionally, the rw control lines). -

-

Function

-

Examples -

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalAutoscroll.html b/arduino-0018-linux-x64/reference/LiquidCrystalAutoscroll.html deleted file mode 100644 index e85adad..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalAutoscroll.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - LiquidCrystalAutoscroll - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

autoscroll()

-

Description

-

Turns on automatic scrolling of the LCD. This causes each character output to the display to push previous characters over by one space. If the current text direction is left-to-right (the default), the display scrolls to the left; if the current direction is right-to-left, the display scrolls to the right. This has the effect of outputting each new character to the same location on the LCD. -

-

Syntax

-

lcd.autoscroll() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalBegin.html b/arduino-0018-linux-x64/reference/LiquidCrystalBegin.html deleted file mode 100644 index 0f79234..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalBegin.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalBegin - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

begin()

-

Description

-

Specifies the dimensions (width and height) of the display. -

-

Syntax

-

lcd.begin(cols, rows) -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

cols: the number of columns that the display has -

-

rows: the number of rows that the display has -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalBlink.html b/arduino-0018-linux-x64/reference/LiquidCrystalBlink.html deleted file mode 100644 index 067dd29..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalBlink.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Arduino - LiquidCrystalBlink - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

blink()

-

Description

-

Display the blinking LCD cursor. If used in combination with the cursor() function, the result will depend on the particular display. -

-

Syntax

-

lcd.blink() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalClear.html b/arduino-0018-linux-x64/reference/LiquidCrystalClear.html deleted file mode 100644 index 8091c68..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalClear.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Arduino - LiquidCrystalClear - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

clear()

-

Description

-

Clears the LCD screen and positions the cursor in the upper-left corner. -

-

Syntax

-

lcd.clear() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalConstructor.html b/arduino-0018-linux-x64/reference/LiquidCrystalConstructor.html deleted file mode 100644 index 3dfb225..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalConstructor.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - Arduino - LiquidCrystalConstructor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

LiquidCrystal()

-

Description

-

Creates a variable of type LiquidCrystal. The display can be controlled using 4 or 8 data lines. If the former, omit the pin numbers for d0 to d3 and leave those lines unconnected. The RW pin can be tied to ground instead of connected to a pin on the Arduino; if so, omit it from this function's parameters. -

-

Syntax

-

LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) -

-

Parameters

-

rs: the number of the Arduino pin that is connected to the RS pin on the LCD -

-

rw: the number of the Arduino pin that is connected to the RW pin on the LCD (optional) -

-

enable: the number of the Arduino pin that is connected to the enable pin on the LCD -

-

d0, d1, d2, d3, d4, d5, d6, d7: the numbers of the Arduino pins that are connected to the corresponding data pins on the LCD. d0, d1, d2, and d3 are optional; if omitted, the LCD will be controlled using only the four data lines (d4, d5, d6, d7). -

-

Example

-
-#include <LiquidCrystal.h>
-
-LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
-
-void setup()
-{
-  lcd.print("hello, world!");
-}
-
-void loop() {}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalCreateChar.html b/arduino-0018-linux-x64/reference/LiquidCrystalCreateChar.html deleted file mode 100644 index 5172a75..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalCreateChar.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - Arduino - LiquidCrystalCreateChar - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

createChar()

-

Description

-

Create a custom character (gylph) for use on the LCD. Up to eight characters of 5x8 pixels are supported (numbered 0 to 7). The appearance of each custom character is specified by an array of eight bytes, one for each row. The five least significant bits of each byte determine the pixels in that row. To display a custom character on the screen, write() its number. -

-

Syntax

-

lcd.createChar(num, data) -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

num: which character to create (0 to 7) -

-

data: the character's pixel data -

-

Example

-
-
-#include <LiquidCrystal.h>
-
-LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
-
-byte smiley[8] = {
-  B00000,
-  B10001,
-  B00000,
-  B00000,
-  B10001,
-  B01110,
-  B00000,
-};
-
-void setup() {
-  lcd.createChar(0, smiley);
-  lcd.begin(16, 2);  
-  lcd.write(0);
-}
-
-void loop() {}
-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalCursor.html b/arduino-0018-linux-x64/reference/LiquidCrystalCursor.html deleted file mode 100644 index 992922b..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalCursor.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalCursor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

cursor()

-

Description

-

Display the LCD cursor: an underscore (line) at the position to which the next character will be written. -

-

Syntax

-

lcd.cursor() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalDisplay.html b/arduino-0018-linux-x64/reference/LiquidCrystalDisplay.html deleted file mode 100644 index 80ad657..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalDisplay.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalDisplay - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

display()

-

Description

-

Turns on the LCD display, after it's been turned off with noDisplay(). This will restore the text (and cursor) that was on the display. -

-

Syntax

-

lcd.display() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalHome.html b/arduino-0018-linux-x64/reference/LiquidCrystalHome.html deleted file mode 100644 index 0108a6e..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalHome.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Arduino - LiquidCrystalHome - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

home()

-

Description

-

Positions the cursor in the upper-left of the LCD. That is, use that location in outputting subsequent text to the display. To also clear the display, use the clear() function instead. -

-

Syntax

-

lcd.home() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalLeftToRight.html b/arduino-0018-linux-x64/reference/LiquidCrystalLeftToRight.html deleted file mode 100644 index a89161f..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalLeftToRight.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - LiquidCrystalLeftToRight - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

leftToRight()

-

Description

-

Set the direction for text written to the LCD to left-to-right, the default. This means that subsequent characters written to the display will go from left to right, but does not affect previously-output text. -

-

Syntax

-

lcd.leftTorRight() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalNoAutoscroll.html b/arduino-0018-linux-x64/reference/LiquidCrystalNoAutoscroll.html deleted file mode 100644 index 55678d1..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalNoAutoscroll.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - LiquidCrystalNoAutoscroll - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

noAutoscroll()

-

Description

-

Turns off automatic scrolling of the LCD. -

-

Syntax

-

lcd.noAutoscroll() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalNoBlink.html b/arduino-0018-linux-x64/reference/LiquidCrystalNoBlink.html deleted file mode 100644 index 11488b5..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalNoBlink.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalNoBlink - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

noBlink()

-

Description

-

Turns off the blinking LCD cursor. -

-

Syntax

-

lcd.noBlink() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalNoCursor.html b/arduino-0018-linux-x64/reference/LiquidCrystalNoCursor.html deleted file mode 100644 index f3ca96b..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalNoCursor.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalNoCursor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

noCursor()

-

Description

-

Hides the LCD cursor. -

-

Syntax

-

lcd.noCursor() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalNoDisplay.html b/arduino-0018-linux-x64/reference/LiquidCrystalNoDisplay.html deleted file mode 100644 index 31779fd..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalNoDisplay.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalNoDisplay - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

noDisplay()

-

Description

-

Turns off the LCD display, without losing the text currently shown on it. -

-

Syntax

-

lcd.noDisplay() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalPrint.html b/arduino-0018-linux-x64/reference/LiquidCrystalPrint.html deleted file mode 100644 index d8c5b01..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalPrint.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - Arduino - LiquidCrystalPrint - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

print()

-

Description

-

Prints text to the LCD. -

-

Syntax

-

lcd.print(data)
lcd.print(data, BASE) -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

data: the data to print (char, byte, int, long, or string) -

-

BASE (optional): the base in which to print numbers: BIN for binary (base 2), DEC for decimal (base 10), OCT for octal (base 8), HEX for hexadecimal (base 16). -

-

Example

-
-#include <LiquidCrystal.h>
-
-LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
-
-void setup()
-{
-  lcd.print("hello, world!");
-}
-
-void loop() {}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalRightToLeft.html b/arduino-0018-linux-x64/reference/LiquidCrystalRightToLeft.html deleted file mode 100644 index 21bfea9..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalRightToLeft.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - LiquidCrystalRightToLeft - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

rightToLeft()

-

Description

-

Set the direction for text written to the LCD to right-to-left (the default is left-to-right). This means that subsequent characters written to the display will go from right to left, but does not affect previously-output text. -

-

Syntax

-

lcd.rightToLeft() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayLeft.html b/arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayLeft.html deleted file mode 100644 index 58dc3a3..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayLeft.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalScrollDisplayLeft - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

scrollDisplayLeft()

-

Description

-

Scrolls the contents of the display (text and cursor) one space to the left. -

-

Syntax

-

lcd.scrollDisplayLeft() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayRight.html b/arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayRight.html deleted file mode 100644 index d908eb2..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalScrollDisplayRight.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalScrollDisplayRight - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

scrollDisplayRight()

-

Description

-

Scrolls the contents of the display (text and cursor) one space to the right. -

-

Syntax

-

lcd.scrollDisplayRight() -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

Example

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalSetCursor.html b/arduino-0018-linux-x64/reference/LiquidCrystalSetCursor.html deleted file mode 100644 index 41da461..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalSetCursor.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LiquidCrystalSetCursor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

setCursor()

-

Description

-

Position the LCD cursor; that is, set the location at which subsequent text written to the LCD will be displayed. -

-

Syntax

-

lcd.setCursor(col, row) -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

col: the column at which to position the cursor (with 0 being the first column) -

-

row: the row at which to position the cursor (with 0 being the first row) -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LiquidCrystalWrite.html b/arduino-0018-linux-x64/reference/LiquidCrystalWrite.html deleted file mode 100644 index 9dc32f2..0000000 --- a/arduino-0018-linux-x64/reference/LiquidCrystalWrite.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - Arduino - LiquidCrystalWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

LiquidCrystal -

-

write()

-

Description

-

Write a character to the LCD. -

-

Syntax

-

lcd.write(data) -

-

Parameters

-

lcd: a variable of type LiquidCrystal -

-

data: the character to write to the display -

-

Example

-
-#include <LiquidCrystal.h>
-
-LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
-
-void setup()
-{
-  Serial.begin(9600);
-}
-
-void loop()
-{
-  if (Serial.available()) {
-    lcd.write(Serial.read());
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Long.html b/arduino-0018-linux-x64/reference/Long.html deleted file mode 100644 index 4ea9d85..0000000 --- a/arduino-0018-linux-x64/reference/Long.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - Arduino - Long - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

long

-

Description

-

Long variables are extended size variables for number storage, and store 32 bits (4 bytes), from -2,147,483,648 to 2,147,483,647. -

-

Example

-

    long speedOfLight = 186000L;   // see Integer Constants for explanation of the 'L'
-
-
-

Syntax

-
    long var = val;
-
-

  • var - the long variable name -
  • val - the value assigned to the variable -

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LongCast.html b/arduino-0018-linux-x64/reference/LongCast.html deleted file mode 100644 index 7cb4131..0000000 --- a/arduino-0018-linux-x64/reference/LongCast.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - LongCast - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

long()

-

Description

-

Converts a value to the long data type. -

-

Syntax

-

long(x) -

-

Parameters

-

x: a value of any type -

-

Returns

-

long -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Loop.html b/arduino-0018-linux-x64/reference/Loop.html deleted file mode 100644 index b78358d..0000000 --- a/arduino-0018-linux-x64/reference/Loop.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - Arduino - Loop - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

loop()

-

After creating a setup() function, which initializes and sets the initial values, the loop() function does precisely what its name suggests, and loops consecutively, allowing your program to change and respond. Use it to actively control the Arduino board. -

-

Example

-
 
-int buttonPin = 3;
-
-// setup initializes serial and the button pin
-void setup()
-{
-  beginSerial(9600);
-  pinMode(buttonPin, INPUT);
-}
-
-// loop checks the button pin each time,
-// and will send serial if it is pressed
-void loop()
-{
-  if (digitalRead(buttonPin) == HIGH)
-    serialWrite('H');
-  else
-    serialWrite('L');
-
-  delay(1000);
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/LowByte.html b/arduino-0018-linux-x64/reference/LowByte.html deleted file mode 100644 index 3c81042..0000000 --- a/arduino-0018-linux-x64/reference/LowByte.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - LowByte - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

lowByte()

-

Description

-

Extracts the low-order (rightmost) byte of a variable (e.g. a word). -

-

Syntax

-

lowByte(x) -

-

Parameters

-

x: a value of any type -

-

Returns

-

byte -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Map.html b/arduino-0018-linux-x64/reference/Map.html deleted file mode 100644 index 02d7d25..0000000 --- a/arduino-0018-linux-x64/reference/Map.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - Arduino - Map - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

map(value, fromLow, fromHigh, toLow, toHigh)

-

Description

-

Re-maps a number from one range to another. That is, a value of fromLow would get mapped to toLow, a value of fromHigh to toHigh, values in-between to values in-between, etc. -

-

Does not constrain values to within the range, because out-of-range values are sometimes intended and useful. The constrain() function may be used either before or after this function, if limits to the ranges are desired. -

-

Note that the "lower bounds" of either range may be larger or smaller than the "upper bounds" so the map() function may be used to reverse a range of numbers, for example -

-

y = map(x, 1, 50, 50, 1); -

-

The function also handles negative numbers well, so -that this example -

-

y = map(x, 1, 50, 50, -100); -

-

is also valid and works well. -

-

The map() function uses integer math so will not generate fractions, when the math might indicate that it should do so. Fractional remainders are truncated, and are not rounded or averaged. -

-

Parameters

-

value: the number to map -

-

fromLow: the lower bound of the value's current range -

-

fromHigh: the upper bound of the value's current range -

-

toLow: the lower bound of the value's target range -

-

toHigh: the upper bound of the value's target range -

-

Returns

-

The mapped value. -

-

Example

-
-/* Map an analog value to 8 bits (0 to 255) */
-void setup() {}
-
-void loop()
-{
-  int val = analogRead(0);
-  val = map(val, 0, 1023, 0, 255);
-  analogWrite(9, val);
-}
-
-
-

Appendix

-

For the mathematically inclined, here's the whole function -

-

-long map(long x, long in_min, long in_max, long out_min, long out_max)
-{
-  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
-}
-
-
-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Max.html b/arduino-0018-linux-x64/reference/Max.html deleted file mode 100644 index 3f39d5a..0000000 --- a/arduino-0018-linux-x64/reference/Max.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - Arduino - Max - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

max(x, y)

-

Description

-

Calculates the maximum of two numbers. -

-

Parameters

-

x: the first number, any data type -

-

y: the second number, any data type -

-

Returns

-

The larger of the two parameter values. -

-

Example

-
sensVal = max(senVal, 20); // assigns sensVal to the larger of sensVal or 20
-                           // (effectively ensuring that it is at least 20)
-

Note

-

Perhaps counter-intuitively, max() is often used to constrain the lower end of a variable's range, while min() is used to constrain the upper end of the range. -

-

Warning

-

Because of the way the max() function is implemented, avoid using other functions inside the brackets, it may lead to incorrect results -

-

-max(a--, 0);   // avoid this - yields incorrect results
-
-a--;           // use this instead -
-max(a, 0);     // keep other math outside the function
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Micros.html b/arduino-0018-linux-x64/reference/Micros.html deleted file mode 100644 index 20da518..0000000 --- a/arduino-0018-linux-x64/reference/Micros.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - Arduino - Micros - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

micros()

-

Description

-

Returns the number of microseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 70 minutes. On 16 MHz Arduino boards (e.g. Duemilanove and Nano), this function has a resolution of four microseconds (i.e. the value returned is always a multiple of four). On 8 MHz Arduino boards (e.g. the LilyPad), this function has a resolution of eight microseconds. -

-

Note: there are 1,000 microseconds in a millisecond and 1,000,000 microseconds in a second. -

-

Parameters

-

None -

-

Returns

-

Number of microseconds since the program started (unsigned long) -

-

Example

-
-unsigned long time;
-
-void setup(){
-  Serial.begin(9600);
-}
-void loop(){
-  Serial.print("Time: ");
-  time = micros();
-  //prints time since program started
-  Serial.println(time);
-  // wait a second so as not to send massive amounts of data
-  delay(1000);
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Millis.html b/arduino-0018-linux-x64/reference/Millis.html deleted file mode 100644 index 11706b2..0000000 --- a/arduino-0018-linux-x64/reference/Millis.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - Arduino - Millis - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

millis()

-

Description

-

Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days. -

-

Parameters

-

None -

-

Returns

-

Number of milliseconds since the program started (unsigned long) -

-

Example

-
-unsigned long time;
-
-void setup(){
-  Serial.begin(9600);
-}
-void loop(){
-  Serial.print("Time: ");
-  time = millis();
-  //prints time since program started
-  Serial.println(time);
-  // wait a second so as not to send massive amounts of data
-  delay(1000);
-}
-
-
-

Tip:

-

Note that the parameter for millis is an unsigned long, errors may be generated if a programmer tries to do math with other datatypes such as ints. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Min.html b/arduino-0018-linux-x64/reference/Min.html deleted file mode 100644 index e926162..0000000 --- a/arduino-0018-linux-x64/reference/Min.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - Arduino - Min - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

min(x, y)

-

Description

-

Calculates the minimum of two numbers. -

-

Parameters

-

x: the first number, any data type -

-

y: the second number, any data type -

-

Returns

-

The smaller of the two numbers. -

-

Examples

-
sensVal = min(sensVal, 100); // assigns sensVal to the smaller of sensVal or 100
-                             // ensuring that it never gets above 100.
-

Note

-

Perhaps counter-intuitively, max() is often used to constrain the lower end of a variable's range, while min() is used to constrain the upper end of the range. -

-

Warning

-

Because of the way the min() function is implemented, avoid using other functions inside the brackets, it may lead to incorrect results -

-

-min(a++, 100);   // avoid this - yields incorrect results
-
-a++;
-min(a, 100);    // use this instead - keep other math outside the function
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Modulo.html b/arduino-0018-linux-x64/reference/Modulo.html deleted file mode 100644 index 83fd47e..0000000 --- a/arduino-0018-linux-x64/reference/Modulo.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - Arduino - Modulo - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

% (modulo)

-

Description

-

Calculates the remainder when one integer is divided by another. It is useful for keeping a variable within a particular range (e.g. the size of an array). -

-

Syntax

-

result = dividend % divisor -

-

Parameters

-

dividend: the number to be divided -

-

divisor: the number to divide by -

-

Returns

-

the remainder -

-

Examples

-
x = 7 % 5;   // x now contains 2
-x = 9 % 5;   // x now contains 4
-x = 5 % 5;   // x now contains 0
-x = 4 % 5;   // x now contains 4
-
-
-

Example Code

-
-/* update one value in an array each time through a loop */
-
-int values[10];
-int i = 0;
-
-void setup() {}
-
-void loop()
-{
-  values[i] = analogRead(0);
-  i = (i + 1) % 10;   // modulo operator rolls over variable  
-}
-
-
-

Tip

-

The modulo operator does not work on floats. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/NoInterrupts.html b/arduino-0018-linux-x64/reference/NoInterrupts.html deleted file mode 100644 index 94b2e02..0000000 --- a/arduino-0018-linux-x64/reference/NoInterrupts.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - Arduino - NoInterrupts - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

noInterrupts()

-

Description

-

Disables interrupts (you can re-enable them with interrupts()). Interrupts allow certain important tasks to happen in the background and are enabled by default. Some functions will not work while interrupts are disabled, and incoming communication may be ignored. Interrupts can slightly disrupt the timing of code, however, and may be disabled for particularly critical sections of code. -

-

Parameters

-

None. -

-

Returns

-

None. -

-

Example

-
-void setup() {}
-
-void loop()
-{
-  noInterrupts();
-  // critical, time-sensitive code here
-  interrupts();
-  // other code here
-}
-
-
-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/NoTone.html b/arduino-0018-linux-x64/reference/NoTone.html deleted file mode 100644 index 48b4864..0000000 --- a/arduino-0018-linux-x64/reference/NoTone.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - NoTone - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

noTone()

-

Description

-

Stops the generation of a square wave triggered by tone(). Has no effect if no tone is being generated. -

-

Syntax

-

noTone(pin) -

-

Parameters

-

pin: the pin on which to stop generating the tone -

-

Returns

-

nothing -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/PinMode.html b/arduino-0018-linux-x64/reference/PinMode.html deleted file mode 100644 index 986bb3f..0000000 --- a/arduino-0018-linux-x64/reference/PinMode.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - Arduino - PinMode - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

pinMode()

-

Description

-

Configures the specified pin to behave either as an input or an output. See the description of digital pins for details. -

-

Syntax

-

pinMode(pin, mode) -

-

Parameters

-

pin: the number of the pin whose mode you wish to set -

-

mode: either INPUT or OUTPUT -

-

Returns

-

None -

-

Example

-
-
-int ledPin = 13;                 // LED connected to digital pin 13
-
-void setup()
-{
-  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
-}
-
-void loop()
-{
-  digitalWrite(ledPin, HIGH);   // sets the LED on
-  delay(1000);                  // waits for a second
-  digitalWrite(ledPin, LOW);    // sets the LED off
-  delay(1000);                  // waits for a second
-}
-
-
-

Note

-

The analog input pins can be used as digital pins, referred to as numbers 14 (analog input 0) to 19 (analog input 5). -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Pointer.html b/arduino-0018-linux-x64/reference/Pointer.html deleted file mode 100644 index 9f9008d..0000000 --- a/arduino-0018-linux-x64/reference/Pointer.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - Arduino - Pointer - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

The pointer operators

-

& (reference) and * (dereference)

-

Pointers are one of the more complicated subjects for beginners in learning C, and it is possible to write the vast majority of Arduino sketches without ever encountering pointers. However for manipulating certain data structures, the use of pointers can simplify the code, and and knowledge of manipulating pointers is handy to have in one's toolkit. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Pow.html b/arduino-0018-linux-x64/reference/Pow.html deleted file mode 100644 index 011c422..0000000 --- a/arduino-0018-linux-x64/reference/Pow.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Arduino - Pow - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

pow(base, exponent)

-

Description

-

Calculates the value of a number raised to a power. Pow() can be used to raise a number to a fractional power. This is useful for generating exponential mapping of values or curves. -

-

Parameters

-

base: the number (float) -

-

exponent: the power to which the base is raised (float) -

-

Returns

-

The result of the exponentiation (double) -

-

Example

-

See the fscale function in the code library. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/PulseIn.html b/arduino-0018-linux-x64/reference/PulseIn.html deleted file mode 100644 index 69e140b..0000000 --- a/arduino-0018-linux-x64/reference/PulseIn.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - Arduino - PulseIn - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

pulseIn()

-

Description

-

Reads a pulse (either HIGH or LOW) on a pin. For example, if value is HIGH, pulseIn() waits for the pin to go HIGH, starts timing, then waits for the pin to go LOW and stops timing. Returns the length of the pulse in microseconds. Gives up and returns 0 if no pulse starts within a specified time out. -

-

The timing of this function has been determined empirically and will probably show errors in longer pulses. Works on pulses from 10 microseconds to 3 minutes in length. -

-

Syntax

-

pulseIn(pin, value)
pulseIn(pin, value, timeout) -

-

Parameters

-

pin: the number of the pin on which you want to read the pulse. (int) -

-

value: type of pulse to read: either HIGH or LOW. (int) -

-

timeout (optional): the number of microseconds to wait for the pulse to start; default is one second (unsigned long) -

-

Returns

-

the length of the pulse (in microseconds) or 0 if no pulse started before the timeout (unsigned long) -

-

Example

-
 
-
-int pin = 7;
-unsigned long duration;
-
-void setup()
-{
-  pinMode(pin, INPUT);
-}
-
-void loop()
-{
-  duration = pulseIn(pin, HIGH);
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Random.html b/arduino-0018-linux-x64/reference/Random.html deleted file mode 100644 index 7635f21..0000000 --- a/arduino-0018-linux-x64/reference/Random.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - Arduino - Random - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

random()

-

Description

-

The random function generates pseudo-random numbers. -

-

Syntax

-

random(max)
random(min, max) -

-

Parameters

-

min - lower bound of the random value, inclusive (optional) -

-

max - upper bound of the random value, exclusive -

-

Returns

-

a random number between min and max-1 (long) -

-

Note:

-

If it is important for a sequence of values generated by random() to differ, on subsequent executions of a sketch, use randomSeed() to initialize the random number generator with a fairly random input, such as analogRead() on an unconnected pin. -

-

Conversely, it can occasionally be useful to use pseudo-random sequences that repeat exactly. This can be accomplished by calling randomSeed() with a fixed number, before starting the random sequence. -

-

Example

-
-long randNumber;
-
-void setup(){
-  Serial.begin(9600);
-
-  // if analog input pin 0 is unconnected, random analog
-  // noise will cause the call to randomSeed() to generate
-  // different seed numbers each time the sketch runs.
-  // randomSeed() will then shuffle the random function.
-  randomSeed(analogRead(0));
-}
-
-void loop() {
-  // print a random number from 0 to 299
-  randNumber = random(300);
-  Serial.println(randNumber);  
-
-  // print a random number from 10 to 19
-  randNumber = random(10, 20);
-  Serial.println(randNumber);
-
-  delay(50);
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/RandomSeed.html b/arduino-0018-linux-x64/reference/RandomSeed.html deleted file mode 100644 index dfe6700..0000000 --- a/arduino-0018-linux-x64/reference/RandomSeed.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - Arduino - RandomSeed - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

randomSeed(seed)

-

Description

-

randomSeed() initializes the pseudo-random number generator, causing it to start at an arbitrary point in its random sequence. This sequence, while very long, and random, is always the same. -

-

If it is important for a sequence of values generated by random() to differ, on subsequent executions of a sketch, use randomSeed() to initialize the random number generator with a fairly random input, such as analogRead() on an unconnected pin. -

-

Conversely, it can occasionally be useful to use pseudo-random sequences that repeat exactly. This can be accomplished by calling randomSeed() with a fixed number, before starting the random sequence. -

-

Parameters

-

long, int - pass a number to generate the seed. -

-

Returns

-

no returns -

-

Example

-
-long randNumber;
-
-void setup(){
-  Serial.begin(9600);
-  randomSeed(analogRead(0));
-}
-
-void loop(){
-  randNumber = random(300);
-  Serial.println(randNumber);
-
-  delay(50);
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Return.html b/arduino-0018-linux-x64/reference/Return.html deleted file mode 100644 index 6d870a3..0000000 --- a/arduino-0018-linux-x64/reference/Return.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - Arduino - Return - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

return

-

Terminate a function and return a value from a function to the calling function, if desired. -

-

Syntax:

-

return; -

-

return value; // both forms are valid -

-

Parameters

-

value: any variable or constant type -

-

Examples:

-

A function to compare a sensor input to a threshold -

 int checkSensor(){       
-    if (analogRead(0) > 400) {
-        return 1;
-    else{
-        return 0;
-    }
-}
-
-

The return keyword is handy to test a section of code without having to "comment out" large sections of possibly buggy code. -

-

void loop(){
-
-// brilliant code idea to test here
-
-return;
-
-// the rest of a dysfunctional sketch here
-// this code will never be executed
-}
-
-

See also

-

comments -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Scope.html b/arduino-0018-linux-x64/reference/Scope.html deleted file mode 100644 index 49422d7..0000000 --- a/arduino-0018-linux-x64/reference/Scope.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - Arduino - Scope - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Variable Scope

-

Variables in the C programming language, which Arduino uses, have a property called scope. This is in contrast to languages such as BASIC where every variable is a global variable. -

-

A global variable is one that can be seen by every function in a program. Local variables are only visible to the function in which they are declared. In the Arduino environment, any variable declared outside of a function (e.g. setup(), loop(), etc. ), is a global variable. -

-

When programs start to get larger and more complex, local variables are a useful way to insure that only one function has access to its own variables. This prevents programming errors when one function inadvertently modifies variables used by another function. -

-

It is also sometimes handy to declare and initialize a variable inside a for loop. This creates a variable that can only be accessed from inside the for-loop brackets. -

-

Example:

-
int gPWMval;  // any function will see this variable
-
-void setup()
-{
-  // ...
-}
-
-void loop()
-{
-  int i;    // "i" is only "visible" inside of "loop"
-  float f;  // "f" is only "visible" inside of "loop"
-  // ...
-
-  for (int j = 0; j <100; j++){
-  // variable j can only be accessed inside the for-loop brackets
-  }
-
-}
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SemiColon.html b/arduino-0018-linux-x64/reference/SemiColon.html deleted file mode 100644 index 62cc0c8..0000000 --- a/arduino-0018-linux-x64/reference/SemiColon.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - Arduino - SemiColon - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

; semicolon

-

Used to end a statement. -

-

Example

-
-int a = 13;
-
-

Tip

-

Forgetting to end a line in a semicolon will result in a compiler error. The error text may be obvious, and refer to a missing semicolon, or it may not. If an impenetrable or seemingly illogical compiler error comes up, one of the first things to check is a missing semicolon, in the immediate vicinity, preceding the line at which the compiler complained. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial.html b/arduino-0018-linux-x64/reference/Serial.html deleted file mode 100644 index 47e0d78..0000000 --- a/arduino-0018-linux-x64/reference/Serial.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - Arduino - Serial - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Serial

-

Used for communication between the Arduino board and a computer or other devices. All Arduino boards have at least one serial port (also known as a UART or USART): Serial. It communicates on digital pins 0 (RX) and 1 (TX) as well as with the computer via USB. Thus, if you use these functions, you cannot also use pins 0 and 1 for digital input or output. -

-

You can use the Arduino environment's built-in serial monitor to communicate with an Arduino board. Click the serial monitor button in the toolbar and select the same baud rate used in the call to begin(). -

-

The Arduino Mega has three additional serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX). To use these pins to communicate with your personal computer, you will need an additional USB-to-serial adaptor, as they are not connected to the Mega's USB-to-serial adaptor. To use them to communicate with an external TTL serial device, connect the TX pin to your device's RX pin, the RX to your device's TX pin, and the ground of your Mega to your device's ground. (Don't connect these pins directly to an RS232 serial port; they operate at +/- 12V and can damage your Arduino board.) -

-

Functions

-

Examples

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial_Available.html b/arduino-0018-linux-x64/reference/Serial_Available.html deleted file mode 100644 index 452818e..0000000 --- a/arduino-0018-linux-x64/reference/Serial_Available.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - Arduino - Available - - - - -
- - - - - - -
- -
-

int Serial.available()

-

Description

-

Get the number of bytes (characters) available for reading over the serial port. -

-

Parameters

-

None -

-

Returns

-

The number of bytes are available to read in the serial buffer, or 0 if none are available. If any data has come in, Serial.available() will be greater than 0. The serial buffer can hold up to 128 bytes. -

-

Example

-
-int incomingByte = 0;	// for incoming serial data
-
-void setup() {
-	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
-}
-
-void loop() {
-
-	// send data only when you receive data:
-	if (Serial.available() > 0) {
-		// read the incoming byte:
-		incomingByte = Serial.read();
-
-		// say what you got:
-		Serial.print("I received: ");
-		Serial.println(incomingByte, DEC);
-	}
-}
-
-
-

Arduino Mega example: -

-

-void setup() {
-  Serial.begin(9600);
-  Serial1.begin(9600);
-
-}
-
-void loop() {
-  // read from port 0, send to port 1:
-  if (Serial.available()) {
-    int inByte = Serial.read();
-    Serial1.print(inByte, BYTE); 
-
-  }
-  // read from port 1, send to port 0:
-  if (Serial1.available()) {
-    int inByte = Serial1.read();
-    Serial.print(inByte, BYTE); 
-  }
-}
-
-
-

See also

-

Reference Home -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial_Begin.html b/arduino-0018-linux-x64/reference/Serial_Begin.html deleted file mode 100644 index 8058f02..0000000 --- a/arduino-0018-linux-x64/reference/Serial_Begin.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - Arduino - Begin - - - - -
- - - - - - -
- -
-

Serial.begin(int speed)

-

Description

-

Sets the data rate in bits per second (baud) for serial data transmission. For communicating with the computer, use one of these rates: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200. You can, however, specify other rates - for example, to communicate over pins 0 and 1 with a component that requires a particular baud rate. -

-

Parameters

-

long datarate, in bits per second (baud) -

-

Returns

-

nothing -

-

Example:

-
-void setup() {
-	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
-}
-
-void loop() {}
-
-
-

Arduino Mega example: -

-

-// Arduino Mega using all four of its Serial ports 
-// (Serial, Serial1, Serial2, Serial3), 
-// with different baud rates:
-
-void setup(){
-  Serial.begin(9600);
-  Serial1.begin(38400);
-  Serial2.begin(19200);
-  Serial3.begin(4800);
-
-  Serial.println("Hello Computer");
-  Serial1.println("Hello Serial 1");
-  Serial2.println("Hello Serial 2");
-  Serial3.println("Hello Serial 3");
-}
-
-void loop() {}
-
-
-

Thanks to Jeff Gray for the mega example -

-

See also

-

Reference Home -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial_Flush.html b/arduino-0018-linux-x64/reference/Serial_Flush.html deleted file mode 100644 index 081b15f..0000000 --- a/arduino-0018-linux-x64/reference/Serial_Flush.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - Arduino - Flush - - - - -
- - - - - - -
- -
-

Serial.flush()

-

Description

-

Flushes the buffer of incoming serial data. That is, any call to Serial.read() or Serial.available() will return only data received after all the most recent call to Serial.flush(). -

-

Parameters

-

none -

-

Returns

-

none -

-

See also

-

Reference Home -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial_Print.html b/arduino-0018-linux-x64/reference/Serial_Print.html deleted file mode 100644 index 780e174..0000000 --- a/arduino-0018-linux-x64/reference/Serial_Print.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - Arduino - Print - - - - -
- - - - - - -
- -
-

Serial.print(data)

-

Description

-

Prints data to the serial port. -

-

Parameter

-

data: integer types, including char, floats
Printing of floats is supported with a precision of two places to the right of the decimal point.
This may change soon. -

-

Syntax

-

This command can take many forms: -

-

Serial.print(b) -with no format specified, prints b as a decimal number in an ASCII string. For example, -

-

-int b = 79;
-Serial.print(b);
-

prints the ASCII string "79". -

-

Serial.print(b, DEC) -prints b as a decimal number in an ASCII string. For example, -

-

-int b = 79;
-Serial.print(b, DEC);
-

prints the string "79". -

-

Serial.print(b, HEX) -prints b as a hexadecimal number in an ASCII string. For example, -

-

-int b = 79;
-Serial.print(b, HEX);
-

prints the string "4F". -

-

Serial.print(b, OCT) -prints b as an octal number in an ASCII string. For example, -

-

-int b = 79;
-Serial.print(b, OCT);
-

prints the string "117". -

-

Serial.print(b, BIN) -prints b as a binary number in an ASCII string. For example, -

-

-int b = 79;
-Serial.print(b, BIN);
-

prints the string "1001111". -

-

Serial.print(b, BYTE) -prints b as a single byte. For example, -

-

-int b = 79;
-Serial.print(b, BYTE);
-

returns the string "O", which is the ASCII character represented by the value 79. For more information see the ASCII table. -

-

Serial.print(str) -if str is a string or an array of chars, prints str as an ASCII string. For example, -

-

-Serial.print("Hello World!");
-

prints the string "Hello World!". -

-

Parameters

-

b: the byte to print, or -

-

str: the string to print -

-

Returns

-

None -

-

Example:

-
/*
-Uses a FOR loop for data and prints a number in various formats.
-*/
-int x = 0;    // variable
-
-void setup() {
-  Serial.begin(9600);      // open the serial port at 9600 bps:    
-}
-
-void loop() {  
-  // print labels 
-  Serial.print("NO FORMAT");       // prints a label
-  Serial.print("\t");              // prints a tab
-
-  Serial.print("DEC");  
-  Serial.print("\t");      
-
-  Serial.print("HEX"); 
-  Serial.print("\t");   
-
-  Serial.print("OCT");
-  Serial.print("\t");
-
-  Serial.print("BIN");
-  Serial.print("\t"); 
-
-  Serial.println("BYTE");
-
-  for(x=0; x< 64; x++){    // only part of the ASCII chart, change to suit
-
-    // print it out in many formats:
-    Serial.print(x);       // print as an ASCII-encoded decimal - same as "DEC"
-    Serial.print("\t");    // prints a tab
-
-    Serial.print(x, DEC);  // print as an ASCII-encoded decimal
-    Serial.print("\t");    // prints a tab
-
-    Serial.print(x, HEX);  // print as an ASCII-encoded hexadecimal
-    Serial.print("\t");    // prints a tab
-
-    Serial.print(x, OCT);  // print as an ASCII-encoded octal
-    Serial.print("\t");    // prints a tab
-
-    Serial.print(x, BIN);  // print as an ASCII-encoded binary
-    Serial.print("\t");    // prints a tab
-
-    Serial.println(x, BYTE);    // prints as a raw byte value, 
-    //                             then adds the carriage return with "println"
-    delay(200);            // delay 200 milliseconds
-  }
-  Serial.println("");      // prints another carriage return
-}
-
-

Programming Tips / Known Issues

-

Serial.print() doesn't work on floats, so you'll need to cast them to an integral type, losing any fractional values. It is sometimes useful to multiply your float by a power of ten, to preserve some of this fractional resolution. -

-

Be careful about doing math inside the brackets e.g.
Serial.print(x-2, DEC);
The unsigned char data type, and byte data type will yield incorrect results and act as though they are signed types i.e. type char. -

-

The Serial.print function puts data into a buffer. It will wait for one character to send, before going on to the next character. However the function returns before sending the last character. -

-

See also

-

Reference Home -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial_Println.html b/arduino-0018-linux-x64/reference/Serial_Println.html deleted file mode 100644 index 6b04b4f..0000000 --- a/arduino-0018-linux-x64/reference/Serial_Println.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - Arduino - Println - - - - -
- - - - - - -
- -
-

Serial.println(data)

-

Description

-

Prints a data to the serial port, followed by a carriage return character(ASCII 13, or '\r') and a newline character (ASCII 10, or '\n'). This command takes the same forms as Serial.print(): -

-

Serial.println(b) -prints b as a decimal number in an ASCII string followed by a carriage return and a linefeed. -

-

Serial.println(b, DEC) -prints b as a decimal number in an ASCII string followed by a carriage return and a linefeed. -

-

Serial.println(b, HEX) -prints b as a hexadecimal number in an ASCII string followed by a carriage return and a linefeed. -

-

Serial.println(b, OCT) -prints b as an octal number in an ASCII string followed by a carriage return and a linefeed. -

-

Serial.println(b, BIN) -prints b as a binary number in an ASCII string followed by a carriage return and a linefeed. -

-

Serial.print(b, BYTE) -prints b as a single byte followed by a carriage return and a linefeed. -

-

Serial.println(str) -if str is a string or an array of chars, prints str an ASCII string. -

-

Serial.println() -just prints a carriage return and a linefeed. -

-

Parameter

-

data types: integer types, including char, strings (char arrays) & floats
Printing of floats is supported with a precision of two places to the right of the decimal point.
This may change soon. -

-

Returns

-

None -

-

Example:

-
-/*
-  Analog input
-
- reads an analog input on analog in 0, prints the value out.
-
- created 24 March 2006
- by Tom Igoe
- */
-
-int analogValue = 0;    // variable to hold the analog value
-
-void setup() {
-  // open the serial port at 9600 bps:
-  Serial.begin(9600);
-}
-
-void loop() {
-  // read the analog input on pin 0:
-  analogValue = analogRead(0);
-
-  // print it out in many formats:
-  Serial.println(analogValue);       // print as an ASCII-encoded decimal
-  Serial.println(analogValue, DEC);  // print as an ASCII-encoded decimal
-  Serial.println(analogValue, HEX);  // print as an ASCII-encoded hexadecimal
-  Serial.println(analogValue, OCT);  // print as an ASCII-encoded octal
-  Serial.println(analogValue, BIN);  // print as an ASCII-encoded binary
-  Serial.println(analogValue, BYTE); // print as a raw byte value
-
-  // delay 10 milliseconds before the next reading:
-  delay(10);
-}
-
-

Programming Tip / Known Issues

-

see Serial.print -

-

See also

-

Reference Home -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial_Read.html b/arduino-0018-linux-x64/reference/Serial_Read.html deleted file mode 100644 index 40efbc3..0000000 --- a/arduino-0018-linux-x64/reference/Serial_Read.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - Arduino - Read - - - - -
- - - - - - -
- -
-

int Serial.read()

-

Description

-

Reads incoming serial data. -

-

Parameters

-

None -

-

Returns

-

the first byte of incoming serial data available (or -1 if no data is available) int -

-

Example

-
-int incomingByte = 0;	// for incoming serial data
-
-void setup() {
-	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
-}
-
-void loop() {
-
-	// send data only when you receive data:
-	if (Serial.available() > 0) {
-		// read the incoming byte:
-		incomingByte = Serial.read();
-
-		// say what you got:
-		Serial.print("I received: ");
-		Serial.println(incomingByte, DEC);
-	}
-}
-
-
-
-

See also

-

Reference Home -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Serial_Write.html b/arduino-0018-linux-x64/reference/Serial_Write.html deleted file mode 100644 index d16f156..0000000 --- a/arduino-0018-linux-x64/reference/Serial_Write.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Arduino - Write - - - - -
- - - - - - -
- -
-

Serial.write()

-

Description

-

Writes binary data to the serial port. This data is sent as a byte or series of bytes; to send the characters representing the digits of a number use the print() function instead. -

-

Syntax

-

serial.write(val)
serial.write(str)
serial.write(buf, len) -

-

Parameters

-

val: a value to send as a single byte -

-

str: a string to send as a series of bytes -

-

buf: an array to send as a series of bytes -

-

len: the length of the buffer -

-

See also

- -
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServerAvailable.html b/arduino-0018-linux-x64/reference/ServerAvailable.html deleted file mode 100644 index bb99d76..0000000 --- a/arduino-0018-linux-x64/reference/ServerAvailable.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - Arduino - ServerAvailable - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Server class -

-

available()

-

Description

-

Gets a client that is connected to the server and has data available for reading. The connection persists when the returned client object goes out of scope; you can close it by calling client.stop(). -

-

Syntax

-

server.available() -

-

Parameters

-

None -

-

Returns

-

None -

-

Example

-
-#include <Ethernet.h>
-
-// network configuration.  gateway and subnet are optional.
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte gateway[] = { 10, 0, 0, 1 };
-byte subnet[] = { 255, 255, 0, 0 };
-
-// telnet defaults to port 23
-Server server = Server(23);
-
-void setup()
-{
-  // initialize the ethernet device
-  Ethernet.begin(mac, ip, gateway, subnet);
-
-  // start listening for clients
-  server.begin();
-}
-
-void loop()
-{
-  Client client = server.available();
-  if (client) {
-    server.write(client.read());
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServerBegin.html b/arduino-0018-linux-x64/reference/ServerBegin.html deleted file mode 100644 index 10410d6..0000000 --- a/arduino-0018-linux-x64/reference/ServerBegin.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - Arduino - ServerBegin - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Server class -

-

begin()

-

Description

-

Tells the server to begin listening for incoming connections. -

-

Syntax

-

server.begin() -

-

Parameters

-

None -

-

Returns

-

None -

-

Example

-
-#include <Ethernet.h>
-
-// network configuration.  gateway and subnet are optional.
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte gateway[] = { 10, 0, 0, 1 };
-byte subnet[] = { 255, 255, 0, 0 };
-
-// telnet defaults to port 23
-Server server = Server(23);
-
-void setup()
-{
-  // initialize the ethernet device
-  Ethernet.begin(mac, ip, gateway, subnet);
-
-  // start listening for clients
-  server.begin();
-}
-
-void loop()
-{
-  Client client = server.available();
-  if (client) {
-    server.write(client.read());
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServerConstructor.html b/arduino-0018-linux-x64/reference/ServerConstructor.html deleted file mode 100644 index 4164daa..0000000 --- a/arduino-0018-linux-x64/reference/ServerConstructor.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - Arduino - ServerConstructor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Server class -

-

Server()

-

Description

-

Create a server that listens for incoming connections on the specified port. -

-

Syntax

-

Server(port); -

-

Parameters

-

port: the port to listen on (int) -

-

Returns

-

None -

-

Example

-
-#include <Ethernet.h>
-
-// network configuration.  gateway and subnet are optional.
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte gateway[] = { 10, 0, 0, 1 };
-byte subnet[] = { 255, 255, 0, 0 };
-
-// telnet defaults to port 23
-Server server = Server(23);
-
-void setup()
-{
-  // initialize the ethernet device
-  Ethernet.begin(mac, ip, gateway, subnet);
-
-  // start listening for clients
-  server.begin();
-}
-
-void loop()
-{
-  Client client = server.available();
-  if (client) {
-    server.write(client.read());
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServerPrint.html b/arduino-0018-linux-x64/reference/ServerPrint.html deleted file mode 100644 index 747524e..0000000 --- a/arduino-0018-linux-x64/reference/ServerPrint.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - ServerPrint - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Server class -

-

print()

-

Description

-

Print data to all the clients connected to a server. Prints numbers as a sequence of digits, each an ASCII character (e.g. the number 123 is sent as the three characters '1', '2', '3'). -

-

Syntax

-

server.print(data)
server.print(data, BASE) -

-

Parameters

-

data: the data to print (char, byte, int, long, or string) -

-

BASE (optional): the base in which to print numbers: BIN for binary (base 2), DEC for decimal (base 10), OCT for octal (base 8), HEX for hexadecimal (base 16). -

-

Example

-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServerPrintln.html b/arduino-0018-linux-x64/reference/ServerPrintln.html deleted file mode 100644 index 0bf8a46..0000000 --- a/arduino-0018-linux-x64/reference/ServerPrintln.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - ServerPrintln - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Server class -

-

println()

-

Description

-

Print data, followed by a newline, to all the clients connected to a server. Prints numbers as a sequence of digits, each an ASCII character (e.g. the number 123 is sent as the three characters '1', '2', '3'). -

-

Syntax

-

server.println()
server.println(data)
server.println(data, BASE) -

-

Parameters

-

data (optional): the data to print (char, byte, int, long, or string) -

-

BASE (optional): the base in which to print numbers: BIN for binary (base 2), DEC for decimal (base 10), OCT for octal (base 8), HEX for hexadecimal (base 16). -

-

Example

-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServerWrite.html b/arduino-0018-linux-x64/reference/ServerWrite.html deleted file mode 100644 index fc42015..0000000 --- a/arduino-0018-linux-x64/reference/ServerWrite.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - Arduino - ServerWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Ethernet : Server class -

-

write()

-

Description

-

Write data to all the clients connected to a server. -

-

Syntax

-

server.write(data) -

-

Parameters

-

data: the value to write (byte or char) -

-

Returns

-

None -

-

Example

-
-#include <Ethernet.h>
-
-// network configuration.  gateway and subnet are optional.
-byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
-byte ip[] = { 10, 0, 0, 177 };
-byte gateway[] = { 10, 0, 0, 1 };
-byte subnet[] = { 255, 255, 0, 0 };
-
-// telnet defaults to port 23
-Server server = Server(23);
-
-void setup()
-{
-  // initialize the ethernet device
-  Ethernet.begin(mac, ip, gateway, subnet);
-
-  // start listening for clients
-  server.begin();
-}
-
-void loop()
-{
-  Client client = server.available();
-  if (client) {
-    server.write(client.read());
-  }
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Servo.html b/arduino-0018-linux-x64/reference/Servo.html deleted file mode 100644 index 2376fb3..0000000 --- a/arduino-0018-linux-x64/reference/Servo.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Arduino - Servo - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Servo library

-

This library allows an Arduino board to control RC (hobby) servo motors. Servos have integrated gears and a shaft that can precisely controlled. Standard servos allow the shaft to be positioned at various angles, usually between 0 and 180 degrees. Continuous rotation servos allow the rotation of the shaft to be set to various speeds. -

-

As of Arduino 0017, the Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12. -

-

In Arduino 0016 and earlier, the Servo library uses functionality built in to the hardware, and works only on pins 9 and 10 (and does not work on the Arduino Mega). In this case, if only one servo is used, the other pin cannot be used for normal PWM output with analogWrite(). For example, in Arduino 0016 and earlier, you can't have a servo on pin 9 and PWM output on pin 10. -

-

Circuit

-

Servo motors have three wires: power, ground, and signal. The power wire is typically red, and should be connected to the 5V pin on the Arduino board. The ground wire is typically black or brown and should be connected to a ground pin on the Arduino board. The signal pin is typically yellow, orange or white and should be connected to a digital pin on the Arduino board. Note servos draw considerable power, so if you need to drive more than one or two, you'll probably need to power them from a separate supply (i.e. not the +5V pin on your Arduino). Be sure to connect the grounds of the Arduino and external power supply together. -

-

Functions

-

Examples

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServoAttach.html b/arduino-0018-linux-x64/reference/ServoAttach.html deleted file mode 100644 index 679e0b5..0000000 --- a/arduino-0018-linux-x64/reference/ServoAttach.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - Arduino - ServoAttach - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Servo -

-

attach()

-

Description

-

Attach the Servo variable to a pin. Note that in Arduino 0016 and earlier, the Servo library supports only servos on only two pins: 9 and 10. -

-

Syntax

-

servo.attach(pin)
servo.attach(pin, min, max) -

-

Parameters

-

servo: a variable of type Servo -

-

pin: the number of the pin that the servo is attached to -

-

min (optional): the pulse width, in microseconds, corresponding to the minimum (0-degree) angle on the servo (defaults to 544) -

-

max (optional): the pulse width, in microseconds, corresponding to the maximum (180-degree) angle on the servo (defaults to 2400) -

-

Example

-
-#include <Servo.h> 
-
-Servo myservo;
-
-void setup() 
-{ 
-  myservo.attach(9);
-} 
-
-void loop() {} 
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServoAttached.html b/arduino-0018-linux-x64/reference/ServoAttached.html deleted file mode 100644 index e7157e9..0000000 --- a/arduino-0018-linux-x64/reference/ServoAttached.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - ServoAttached - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Servo -

-

attached()

-

Description

-

Check whether the Servo variable is attached to a pin. -

-

Syntax

-

servo.attached() -

-

Parameters

-

servo: a variable of type Servo -

-

Returns

-

true if the servo is attached to pin; false otherwise. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServoDetach.html b/arduino-0018-linux-x64/reference/ServoDetach.html deleted file mode 100644 index 08038fc..0000000 --- a/arduino-0018-linux-x64/reference/ServoDetach.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - ServoDetach - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Servo -

-

detach()

-

Description

-

Detach the Servo variable from its pin. If all Servo variables are detached, then pins 9 and 10 can be used for PWM output with analogWrite(). -

-

Syntax

-

servo.detach() -

-

Parameters

-

servo: a variable of type Servo -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServoRead.html b/arduino-0018-linux-x64/reference/ServoRead.html deleted file mode 100644 index 0d1d2e9..0000000 --- a/arduino-0018-linux-x64/reference/ServoRead.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Arduino - ServoRead - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Servo -

-

read()

-

Description

-

Read the current angle of the servo (the value passed to the last call to write()). -

-

Syntax

-

servo.read() -

-

Parameters

-

servo: a variable of type Servo -

-

Returns

-

The angle of the servo, from 0 to 180 degrees. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServoWrite.html b/arduino-0018-linux-x64/reference/ServoWrite.html deleted file mode 100644 index 16412d2..0000000 --- a/arduino-0018-linux-x64/reference/ServoWrite.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - Arduino - ServoWrite - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Servo -

-

write()

-

Description

-

Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with 0 being full-speed in one direction, 180 being full speed in the other, and a value near 90 being no movement). -

-

Syntax

-

servo.write(angle) -

-

Parameters

-

servo: a variable of type Servo -

-

angle: the value to write to the servo, from 0 to 180 -

-

Example

-
-#include <Servo.h> 
-
-Servo myservo;
-
-void setup() 
-{ 
-  myservo.attach(9);
-  myservo.write(90);  // set servo to mid-point
-} 
-
-void loop() {} 
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ServoWriteMicroseconds.html b/arduino-0018-linux-x64/reference/ServoWriteMicroseconds.html deleted file mode 100644 index 9fee605..0000000 --- a/arduino-0018-linux-x64/reference/ServoWriteMicroseconds.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - Arduino - ServoWriteMicroseconds - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Servo -

-

writeMicroseconds()

-

Description

-

Writes a value in microseconds (uS) to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft. On standard servos a parameter value of 1000 is fully counter-clockwise, 2000 is fully clockwise, and 1500 is in the middle. -

-

Note that some manufactures do not follow this standard very closely so that servos often respond to values between 700 and 2300. Feel free to increase these endpoints until the servo no longer continues to increase its range. Note however that attempting to drive a servo past its endpoints (often indicated by a growling sound) is a high-current state, and should be avoided. -

-

Continuous-rotation servos will respond to the writeMicrosecond function in an analogous manner to the write function. -

-

Syntax

-

servo.writeMicroseconds(uS) -

-

Parameters

-

servo: a variable of type Servo -

-

uS: the value of the parameter in microseconds (int) -

-

Example

-
-#include <Servo.h> 
-
-Servo myservo;
-
-void setup() 
-{ 
-  myservo.attach(9);
-  myservo.writeMicroseconds(1500);  // set servo to mid-point
-} 
-
-void loop() {} 
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Setup.html b/arduino-0018-linux-x64/reference/Setup.html deleted file mode 100644 index 3099ede..0000000 --- a/arduino-0018-linux-x64/reference/Setup.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Arduino - Setup - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

setup()

-

The setup() function is called when a sketch starts. Use it to initialize variables, pin modes, start using libraries, etc. The setup function will only run once, after each powerup or reset of the Arduino board. -

-

Example

-
 
-int buttonPin = 3;
-
-void setup()
-{
-  Serial.begin(9600);
-  pinMode(buttonPin, INPUT);
-}
-
-void loop()
-{
-  // ...
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/ShiftOut.html b/arduino-0018-linux-x64/reference/ShiftOut.html deleted file mode 100644 index 12925c7..0000000 --- a/arduino-0018-linux-x64/reference/ShiftOut.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - Arduino - ShiftOut - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

shiftOut()

-

Description

-

Shifts out a byte of data one bit at a time. Starts from either the most (i.e. the leftmost) or least (rightmost) significant bit. Each bit is written in turn to a data pin, after which a clock pin is toggled to indicate that the bit is available. -

-

This is known as synchronous serial protocol and is a common way that microcontrollers communicate with sensors, and with other microcontrollers. The two devices stay synchronized, and communicate at close to maximum speeds, since they both share the same clock line. This is often referred to in chip hardware documentation as Serial Peripheral Interface (SPI). -

-

Syntax

-

shiftOut(dataPin, clockPin, bitOrder, value) -

-

Parameters

-

dataPin: the pin on which to output each bit (int) -

-

clockPin: the pin to toggle once the dataPin has been set to the correct value (int) -

-

bitOrder: which order to shift out the bits; either MSBFIRST or LSBFIRST.
(Most Significant Bit First, or, Least Significant Bit First) -

-

value: the data to shift out. (byte) -

-

Returns

-

None -

-

Note

-

The dataPin and clockPin must already be configured as outputs by a call to pinMode(). -

-

shiftOut is currently written to output 1 byte (8 bits) so it requires a two step operation to output values larger than 255. -

-// Do this for MSBFIRST serial
-int data = 500;
-// shift out highbyte
-shiftOut(dataPin, clock, MSBFIRST, (data >> 8));  
-// shift out lowbyte
-shiftOut(data, clock, MSBFIRST, data);
-
-// Or do this for LSBFIRST serial
-data = 500;
-// shift out lowbyte
-shiftOut(dataPin, clock, LSBFIRST, data);  
-// shift out highbyte 
-shiftOut(dataPin, clock, LSBFIRST, (data >> 8)); 
-
-

Example

-

For accompanying circuit, see the tutorial on controlling a 74HC595 shift register. -

-

//**************************************************************//
-//  Name    : shiftOutCode, Hello World                         //
-//  Author  : Carlyn Maw,Tom Igoe                               //
-//  Date    : 25 Oct, 2006                                      //
-//  Version : 1.0                                               //
-//  Notes   : Code for using a 74HC595 Shift Register           //
-//          : to count from 0 to 255                            //
-//****************************************************************
-
-//Pin connected to ST_CP of 74HC595
-int latchPin = 8;
-//Pin connected to SH_CP of 74HC595
-int clockPin = 12;
-////Pin connected to DS of 74HC595
-int dataPin = 11;
-
-void setup() {
-  //set pins to output because they are addressed in the main loop
-  pinMode(latchPin, OUTPUT);
-  pinMode(clockPin, OUTPUT);
-  pinMode(dataPin, OUTPUT);
-}
-
-void loop() {
-  //count up routine
-  for (int j = 0; j < 256; j++) {
-    //ground latchPin and hold low for as long as you are transmitting
-    digitalWrite(latchPin, LOW);
-    shiftOut(dataPin, clockPin, LSBFIRST, j);   
-    //return the latch pin high to signal chip that it 
-    //no longer needs to listen for information
-    digitalWrite(latchPin, HIGH);
-    delay(1000);
-  }
-} 
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Sin.html b/arduino-0018-linux-x64/reference/Sin.html deleted file mode 100644 index 3d07f48..0000000 --- a/arduino-0018-linux-x64/reference/Sin.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - Sin - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

sin(rad)

-

Description

-

Calculates the sine of an angle (in radians). The result will be between -1 and 1. -

-

Parameters

-

rad: the angle in radians (float) -

-

Returns

-

the sine of the angle (double) -

-

Note

-

Serial.print() and Serial.println() do not currently support printing floats. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Sizeof.html b/arduino-0018-linux-x64/reference/Sizeof.html deleted file mode 100644 index e526ad2..0000000 --- a/arduino-0018-linux-x64/reference/Sizeof.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - Arduino - Sizeof - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

sizeof

-

Description

-

The sizeof operator returns the number of bytes in a variable type, or the number of bytes occupied by an array. -

-

Syntax

-

sizeof(variable) -

-

Parameters

-

variable: any variable type or array (e.g. int, float, byte) -

-

Example code

-

The sizeof operator is useful for dealing with arrays (such as strings) where it is convenient to be able to change the size of the array without breaking other parts of the program. -

-

This program prints out a text string one character at a time. Try changing the text phrase. -

-

-char myStr[] = "this is a test";
-int i;
-
-void setup(){
-  Serial.begin(9600);
-}
-
-void loop() { 
-  for (i = 0; i < sizeof(myStr) - 1; i++){
-    Serial.print(i, DEC);
-    Serial.print(" = ");
-    Serial.println(myStr[i], BYTE);
-  }
-}
-
-
-

Note that sizeof returns the total number of bytes. So for larger variable types such as ints, the for loop would look something like this. -

-

-for (i = 0; i < (sizeof(myInts)/sizeof(int)) - 1; i++) {
-  // do something with myInts[i]
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SoftwareSerial.html b/arduino-0018-linux-x64/reference/SoftwareSerial.html deleted file mode 100644 index 5f4ad92..0000000 --- a/arduino-0018-linux-x64/reference/SoftwareSerial.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - Arduino - SoftwareSerial - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

SoftwareSerial Library

-

The Arduino hardware has built-in support for serial communication on pins 0 and 1 (which also goes to the computer via the USB connection). The native serial support happens via a piece of hardware (built into the chip) called a UART. This hardware allows the Atmega chip to receive serial communication even while working on other tasks, as long as there room in the 64 byte serial buffer. -

-

The SoftwareSerial library has been developed to allow serial communication on other digital pins of the Arduino, using software to replicate the functionality (hence the name "SoftwareSerial"). -

-

Limitations

-

Because it's not supported by hardware, the library has a few limitations: -

-

  • Only speeds up to 9600 baud work -
  • Serial.available() doesn't work -
  • Serial.read() will wait until data arrives -
  • Only data received while Serial.read() is being called will be received. Data received at other times will be lost, since the chip is not "listening". -

SoftwareSerial appears to have some timing issues and/or software issues. Check this forum thread for discussion. -Software Serial Discussion. In particular, if you are having problems using SoftwareSerial with an Atmega168 chip delete SoftwareSerial.o in your Arduino directory. -

-

Example

-
 SoftwareSerialExample
-
-

Functions

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SoftwareSerialBegin.html b/arduino-0018-linux-x64/reference/SoftwareSerialBegin.html deleted file mode 100644 index 8cb8f3b..0000000 --- a/arduino-0018-linux-x64/reference/SoftwareSerialBegin.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - Arduino - SoftwareSerialBegin - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

SoftwareSerial: begin(speed)

-

Description

-

Sets the speed (baud rate) for the serial communication. Using speeds higher than 9600 baud will result in faulty communication. -

-

Parameters

-

speed: the baud rate (long) -

-

Returns

-

none -

-

Example

-
// include the SoftwareSerial library so you can use its functions:
-#include <SoftwareSerial.h>
-
-#define rxPin 2
-#define txPin 3
-
-// set up a new serial port
-SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
-
-void setup()  {
-  // define pin modes for tx, rx:
-  pinMode(rxPin, INPUT);
-  pinMode(txPin, OUTPUT);
-  // set the data rate for the SoftwareSerial port
-  mySerial.begin(9600);
-}
-
-void loop() {
-  // ...
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SoftwareSerialConstructor.html b/arduino-0018-linux-x64/reference/SoftwareSerialConstructor.html deleted file mode 100644 index 051ea59..0000000 --- a/arduino-0018-linux-x64/reference/SoftwareSerialConstructor.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - Arduino - SoftwareSerialConstructor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

SoftwareSerial(rxPin, txPin)

-

Description

-

A call to SoftwareSerial(rxPin, txPin) creates a new SoftwareSerial object, whose name you need to provide as in the example below. You still need to call SoftwareSerial.begin(). -

-

Parameters

-

rxPin: the pin on which to receive serial data -

-

txPin: the pin on which to transmit serial data -

-

Example

-
#define rxPin 2
-#define txPin 3
-
-// set up a new serial port
-SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SoftwareSerialExample.html b/arduino-0018-linux-x64/reference/SoftwareSerialExample.html deleted file mode 100644 index da69d58..0000000 --- a/arduino-0018-linux-x64/reference/SoftwareSerialExample.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - Arduino - SoftwareSerialExample - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

This is a very basic example of SoftwareSerial. It reads in a byte at a time and mirrors it back to you: -

-

-/*
-  SoftwareSerial example
-
-  Sample of the SoftwareSerial library.  Listens for serial in on pin 2
-  and sends it out again on pin 3.
-
-  by Tom Igoe
-  based on examples by David Mellis and Heather Dewey-Hagborg
-  written: 6 Jan 2007
-
-
-*/
-
-// include the SoftwareSerial library so you can use its functions:
-#include <SoftwareSerial.h>
-
-#define rxPin 2
-#define txPin 3
-#define ledPin 13
-
-// set up a new serial port
-SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
-byte pinState = 0;
-
-void setup()  {
-  // define pin modes for tx, rx, led pins:
-  pinMode(rxPin, INPUT);
-  pinMode(txPin, OUTPUT);
-  pinMode(ledPin, OUTPUT);
-  // set the data rate for the SoftwareSerial port
-  mySerial.begin(9600);
-}
-
-void loop() {
-  // listen for new serial coming in:
-  char someChar = mySerial.read();
-  // print out the character:
-  mySerial.print(someChar);
-  // toggle an LED just so you see the thing's alive.  
-  // this LED will go on with every OTHER character received:
-  toggle(13);
-
-}
-
-
-void toggle(int pinNum) {
-  // set the LED pin using the pinState variable:
-  digitalWrite(pinNum, pinState); 
-  // if pinState = 0, set it to 1, and vice versa:
-  pinState = !pinState;
-}
-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SoftwareSerialPrint.html b/arduino-0018-linux-x64/reference/SoftwareSerialPrint.html deleted file mode 100644 index 00ffe99..0000000 --- a/arduino-0018-linux-x64/reference/SoftwareSerialPrint.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - Arduino - SoftwareSerialPrint - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

SoftwareSerial: print(data)

-

Description

-

Prints data to the transmit pin of the software serial port. Works the same as the Serial.print() function. -

-

Parameters

-

vary, see Serial.print() for details -

-

Returns

-

none -

-

Example

-
SoftwareSerial serial(6, 7);
-int analogValue;
-
-void setup()
-{
-  serial.begin(9600);
-}
-
-void loop()
-{
-  // read the analog input on pin 0:
-  analogValue = analogRead(0);
-
-  // print it out in many formats:
-  serial.print(analogValue);         // print as an ASCII-encoded decimal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, DEC);    // print as an ASCII-encoded decimal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, HEX);    // print as an ASCII-encoded hexadecimal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, OCT);    // print as an ASCII-encoded octal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, BIN);    // print as an ASCII-encoded binary
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue/4, BYTE); // print as a raw byte value (divide the
-                                     // value by 4 because analogRead() returns numbers
-                                     // from 0 to 1023, but a byte can only hold values
-                                     // up to 255)
-  serial.print("\t");                // print a tab character    
-  serial.println();                  // print a linefeed character
-
-  // delay 10 milliseconds before the next reading:
-  delay(10);
-} 
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SoftwareSerialPrintln.html b/arduino-0018-linux-x64/reference/SoftwareSerialPrintln.html deleted file mode 100644 index 25a97c2..0000000 --- a/arduino-0018-linux-x64/reference/SoftwareSerialPrintln.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - Arduino - SoftwareSerialPrintln - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

SoftwareSerial: println(data)

-

Description

-

Prints data to the transmit pin of the software serial port, followed by a carriage return and line feed. Works the same as the Serial.println() function. -

-

Parameters

-

vary, see Serial.println() for details -

-

Returns

-

none -

-

Example

-
SoftwareSerial serial(6, 7);
-int analogValue;
-
-void setup()
-{
-  serial.begin(9600);
-}
-
-void loop()
-{
-  // read the analog input on pin 0:
-  analogValue = analogRead(0);
-
-  // print it out in many formats:
-  serial.print(analogValue);         // print as an ASCII-encoded decimal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, DEC);    // print as an ASCII-encoded decimal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, HEX);    // print as an ASCII-encoded hexadecimal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, OCT);    // print as an ASCII-encoded octal
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue, BIN);    // print as an ASCII-encoded binary
-  serial.print("\t");                // print a tab character
-  serial.print(analogValue/4, BYTE); // print as a raw byte value (divide the
-                                     // value by 4 because analogRead() returns numbers
-                                     // from 0 to 1023, but a byte can only hold values
-                                     // up to 255)
-  serial.print("\t");                // print a tab character    
-  serial.println();                  // print a linefeed character
-
-  // delay 10 milliseconds before the next reading:
-  delay(10);
-} 
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SoftwareSerialRead.html b/arduino-0018-linux-x64/reference/SoftwareSerialRead.html deleted file mode 100644 index 4d7c0b9..0000000 --- a/arduino-0018-linux-x64/reference/SoftwareSerialRead.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - Arduino - SoftwareSerialRead - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

SoftwareSerial: int read()

-

Description

-

Reads a character from the receive pin of the software serial port. This function waits for a character to arrive, reads it, and returns the character read. Data that arrives at other times is lost. -

-

Parameters

-

none -

-

Returns

-

the character read -

-

Example

-
SoftwareSerial serial(6, 7);
-
-void setup()
-{
-  serial.begin(9600);
-}
-
-void loop()
-{
-  char c = serial.read();
-} 
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Sqrt.html b/arduino-0018-linux-x64/reference/Sqrt.html deleted file mode 100644 index 6096bb1..0000000 --- a/arduino-0018-linux-x64/reference/Sqrt.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - Arduino - Sqrt - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

sqrt(x)

-

Description

-

Calculates the square root of a number. -

-

Parameters

-

x: the number, any data type -

-

Returns

-

double, the number's square root. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Static.html b/arduino-0018-linux-x64/reference/Static.html deleted file mode 100644 index b135661..0000000 --- a/arduino-0018-linux-x64/reference/Static.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - Arduino - Static - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Static

-

The static keyword is used to create variables that are visible to only one function. However unlike local variables that get created and destroyed every time a function is called, static variables persist beyond the function call, preserving their data between function calls. -

-

Variables declared as static will only be created and initialized the first time a function is called. -

-

Example

-
-
-
-/* RandomWalk
-* Paul Badger 2007
-* RandomWalk wanders up and down randomly between two
-* endpoints. The maximum move in one loop is governed by
-* the parameter "stepsize".
-* A static variable is moved up and down a random amount.
-* This technique is also known as "pink noise" and "drunken walk".
-*/
-
-#define randomWalkLowRange -20
-#define randomWalkHighRange 20
-int stepsize;
-
-int thisTime;
-int total;
-
-void setup()
-{
-  Serial.begin(9600);
-}
-
-void loop()
-{        //  tetst randomWalk function
-  stepsize = 5;
-  thisTime = randomWalk(stepsize);
-  Serial.println(thisTime);
-   delay(10);
-}
-
-int randomWalk(int moveSize){
-  static int  place;     // variable to store value in random walk - declared static so that it stores
-                         // values in between function calls, but no other functions can change its value
-
-  place = place + (random(-moveSize, moveSize + 1));
-
-  if (place < randomWalkLowRange){                    // check lower and upper limits
-    place = place + (randomWalkLowRange - place);     // reflect number back in positive direction
-  }
-  else if(place > randomWalkHighRange){
-    place = place - (place - randomWalkHighRange);     // reflect number back in negative direction
-  }
-
-  return place;
-}
-
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Stepper.html b/arduino-0018-linux-x64/reference/Stepper.html deleted file mode 100644 index e07956d..0000000 --- a/arduino-0018-linux-x64/reference/Stepper.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - Arduino - Stepper - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Stepper Library

-

This library allows you to control unipolar or bipolar stepper motors. To use it you will need a stepper motor, and the appropriate hardware to control it. For more on that, see Tom Igoe's notes on steppers. -

-

Circuits

-

Functions

-

Example

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/StepperBipolarCircuit.html b/arduino-0018-linux-x64/reference/StepperBipolarCircuit.html deleted file mode 100644 index 883bde7..0000000 --- a/arduino-0018-linux-x64/reference/StepperBipolarCircuit.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - Arduino - StepperBipolarCircuit - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Circuit for Bipolar Stepper Motor

-

Two Pins

-
-

Four Pins

-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/StepperConstructor.html b/arduino-0018-linux-x64/reference/StepperConstructor.html deleted file mode 100644 index bbecb2e..0000000 --- a/arduino-0018-linux-x64/reference/StepperConstructor.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - Arduino - StepperConstructor - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Stepper(steps, pin1, pin2)

-

Stepper(steps, pin1, pin2, pin3, pin4)

-

Description

-

This function creates a new instance of the Stepper class that represents a particular stepper motor attached to your Arduino board. Use it at the top of your sketch, above setup() and loop(). The number of parameters depends on how you've wired your motor - either using two or four pins of the Arduino board. -

-

Parameters

-

steps: the number of steps in one revolution of your motor. If your motor gives the number of degrees per step, divide that number into 360 to get the number of steps (e.g. 360 / 3.6 gives 100 steps). (int) -

-

pin1, pin2: two pins that are attached to the motor (int) -

-

pin3, pin4: optional the last two pins attached to the motor, if it's connected to four pins (int) -

-

Returns

-

A new instance of the Stepper motor class. -

-

Example

-

Stepper myStepper = Stepper(100, 5, 6); -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/StepperSetSpeed.html b/arduino-0018-linux-x64/reference/StepperSetSpeed.html deleted file mode 100644 index 3ba8b06..0000000 --- a/arduino-0018-linux-x64/reference/StepperSetSpeed.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - StepperSetSpeed - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Stepper: setSpeed(rpms)

-

Description

-

Sets the motor speed in rotations per minute (RPMs). This function doesn't make the motor turn, just sets the speed at which it will when you call step(). -

-

Parameters

-

rpms: the speed at which the motor should turn in rotations per minute - a positive number (long) -

-

Returns

-

None -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/StepperStep.html b/arduino-0018-linux-x64/reference/StepperStep.html deleted file mode 100644 index 847ba44..0000000 --- a/arduino-0018-linux-x64/reference/StepperStep.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - Arduino - StepperStep - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Stepper: step(steps)

-

Description

-

Turns the motor a specific number of steps, at a speed determined by the most recent call to setSpeed(). This function is blocking; that is, it will wait until the motor has finished moving to pass control to the next line in your sketch. For example, if you set the speed to, say, 1 RPM and called step(100) on a 100-step motor, this function would take a full minute to run. For better control, keep the speed high and only go a few steps with each call to step(). -

-

Parameters

-

steps: the number of steps to turn the motor - positive to turn one direction, negative to turn the other (int) -

-

Returns

-

None -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/StepperUnipolarCircuit.html b/arduino-0018-linux-x64/reference/StepperUnipolarCircuit.html deleted file mode 100644 index 921574f..0000000 --- a/arduino-0018-linux-x64/reference/StepperUnipolarCircuit.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - Arduino - StepperUnipolarCircuit - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Circuits for Unipolar Stepper Motors

-

Two Pins

-
  
-
-

Four Pins

-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/SwitchCase.html b/arduino-0018-linux-x64/reference/SwitchCase.html deleted file mode 100644 index 009e66c..0000000 --- a/arduino-0018-linux-x64/reference/SwitchCase.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - Arduino - SwitchCase - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

switch / case statements

-

Like if statements, switch...case controls the flow of programs by allowing programmers to specify different code that should be executed in various conditions. In particular, a switch statement compares the value of a variable to the values specified in case statements. When a case statement is found whose value matches that of the variable, the code in that case statement is run. -

-

The break keyword exits the switch statement, and is typically used at the end of each case. Without a break statement, the switch statement will continue executing the following expressions ("falling-through") until a break, or the end of the switch statement is reached. -

-

Example

-
-  switch (var) {
-    case 1:
-      //do something when var equals 1
-      break;
-    case 2:
-      //do something when var equals 2
-      break;
-    default: 
-      // if nothing else matches, do the default
-      // default is optional
-  }
-
-
-

Syntax

-
-switch (var) {
-  case label:
-    // statements
-    break;
-  case label:
-    // statements
-    break;
-  default: 
-    // statements
-}
-
-
-

Parameters

-

var: the variable whose value to compare to the various cases -

-

label: a value to compare the variable to -

-

See also:

-

if...else -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Tan.html b/arduino-0018-linux-x64/reference/Tan.html deleted file mode 100644 index c08220f..0000000 --- a/arduino-0018-linux-x64/reference/Tan.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Arduino - Tan - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

tan(rad)

-

Description

-

Calculates the tangent of an angle (in radians). The result will be between negative infinity and infinity. -

-

Parameters

-

rad: the angle in radians (float) -

-

Returns

-

The tangent of the angle (double) -

-

Note

-

Serial.print() and Serial.println() do not currently support printing floats. -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Tone.html b/arduino-0018-linux-x64/reference/Tone.html deleted file mode 100644 index a5afc5e..0000000 --- a/arduino-0018-linux-x64/reference/Tone.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - Arduino - Tone - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

tone()

-

Description

-

Generates a square wave of the specified frequency (and 50% duty cycle) on a pin. A duration can be specified, otherwise the wave continues until a call to noTone(). The pin can be connected to a piezo buzzer or other speaker to play tones. -

-

Only one tone can be generated at a time. If a tone is already playing on a different pin, the call to tone() will have no effect. If the tone is playing on the same pin, the call will set its frequency. -

-

Syntax

-

tone(pin, frequency)
tone(pin, frequency, duration) -

-

Parameters

-

pin: the pin on which to generate the tone -

-

frequency: the frequency of the tone in hertz -

-

duration: the duration of the tone in milliseconds (optional) -

-

Returns

-

nothing -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/UnsignedChar.html b/arduino-0018-linux-x64/reference/UnsignedChar.html deleted file mode 100644 index 7862231..0000000 --- a/arduino-0018-linux-x64/reference/UnsignedChar.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - Arduino - UnsignedChar - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

unsigned char

-

Description

-

An unsigned data type that occupies 1 byte of memory. Same as the byte datatype. -

-

The unsigned char datatype encodes numbers from 0 to 255. -

-

For consistency of Arduino programming style, the byte data type is to be preferred. -

-

Example

-
    unsigned char myChar = 240;
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/UnsignedInt.html b/arduino-0018-linux-x64/reference/UnsignedInt.html deleted file mode 100644 index be42ed5..0000000 --- a/arduino-0018-linux-x64/reference/UnsignedInt.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - Arduino - UnsignedInt - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

unsigned int

-

Description

-

Unsigned ints (unsigned integers) are the same as ints in -that they store a 2 byte value. Instead of storing negative numbers however they only store positive values, yielding a useful range of 0 to 65,535 (2^16) - 1). -

-

The difference between unsigned ints and (signed) ints, lies in the way the highest bit, sometimes refered to as the "sign" bit, is interpreted. In the Arduino int type (which is signed), if the high bit is a "1", the number is interpreted as a negative number, and the other 15 bits are interpreted with 2's complement math. -

-

Example

-
    unsigned int ledPin = 13;
-
-

Syntax

-
     unsigned int var = val;
-
-

  • var - your unsigned int variable name -
  • val - the value you assign to that variable -

Coding Tip

-

When variables are made to exceed their maximum capacity they "roll over" back to their minimum capacitiy, note that this happens in both directions -

-

   unsigned int x
-   x = 0;
-   x = x - 1;       // x now contains 65535 - rolls over in neg direction
-   x = x + 1;       // x now contains 0 - rolls over
-
-
-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/UnsignedLong.html b/arduino-0018-linux-x64/reference/UnsignedLong.html deleted file mode 100644 index 0031049..0000000 --- a/arduino-0018-linux-x64/reference/UnsignedLong.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - Arduino - UnsignedLong - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

unsigned long

-

Description

-

Unsigned long variables are extended size variables for number storage, and store 32 bits (4 bytes). Unlike standard longs unsigned longs won't store negative numbers, making their range from 0 to 4,294,967,295 (2^32 - 1). -

-

Example

-
-unsigned long time;
-
-void setup()
-{
-  Serial.begin(9600);
-}
-
-void loop()
-{
-  Serial.print("Time: ");
-  time = millis();
-  //prints time since program started
-  Serial.println(time);
-  // wait a second so as not to send massive amounts of data
-  delay(1000);
-}
-
-

Syntax

-
    unsigned long var = val;
-
-

  • var - your long variable name -
  • val - the value you assign to that variable -

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Void.html b/arduino-0018-linux-x64/reference/Void.html deleted file mode 100644 index cd847e9..0000000 --- a/arduino-0018-linux-x64/reference/Void.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - Arduino - Void - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

void

-

The void keyword is used only in function declarations. It indicates that the function is expected to return no information to the function from which it was called. -

-

Example:

-
-// actions are performed in the functions "setup" and "loop"
-// but  no information is reported to the larger program
-
-void setup()
-{
-  // ...
-}
-
-void loop()
-{
-  // ...
-}
- 
-
-

See also

-

function declaration -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Volatile.html b/arduino-0018-linux-x64/reference/Volatile.html deleted file mode 100644 index c35264d..0000000 --- a/arduino-0018-linux-x64/reference/Volatile.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - Arduino - Volatile - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

volatile keyword

-

volatile is a keyword known as a variable qualifier, it is usually used before the datatype of a variable, to modify the way in which the compiler and subsequent program treats the variable. -

-

Declaring a variable volatile is a directive to the compiler. The compiler is software which translates your C/C++ code into the machine code, which are the real instructions for the Atmega chip in the Arduino. -

-

Specifically, it directs the compiler to load the variable from RAM and not from a storage register, which is a temporary memory location where program variables are stored and manipulated. Under certain conditions, the value for a variable stored in registers can be inaccurate. -

-

A variable should be declared volatile whenever its value can be changed by something beyond the control of the code section in which it appears, such as a concurrently executing thread. In the Arduino, the only place that this is likely to occur is in sections of code associated with interrupts, called an interrupt service routine. -

-

Example

-
-// toggles LED when interrupt pin changes state
-
-int pin = 13;
-volatile int state = LOW;
-
-void setup()
-{
-  pinMode(pin, OUTPUT);
-  attachInterrupt(0, blink, CHANGE);
-}
-
-void loop()
-{
-  digitalWrite(pin, state);
-}
-
-void blink()
-{
-  state = !state;
-}
-
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/While.html b/arduino-0018-linux-x64/reference/While.html deleted file mode 100644 index 8fe183e..0000000 --- a/arduino-0018-linux-x64/reference/While.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - Arduino - While - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

while loops

-

Description

-

while loops will loop continuously, and infinitely, until the expression inside the parenthesis, () becomes false. Something must change the tested variable, or the while loop will never exit. This could be in your code, such as an incremented variable, or an external condition, such as testing a sensor. -

-

Syntax

-
while(expression){
-  // statement(s)
-}
-
-

Parameters

-

expression - a (boolean) C statement that evaluates to true or false -

-

Example

-
-var = 0;
-while(var < 200){
-  // do something repetitive 200 times
-  var++;
-}
-
-
-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Wire.html b/arduino-0018-linux-x64/reference/Wire.html deleted file mode 100644 index f3fd4af..0000000 --- a/arduino-0018-linux-x64/reference/Wire.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Arduino - Wire - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire Library

-

This library allows you to communicate with I2C / TWI devices. On most Arduino boards, SDA (data line) is on analog input pin 4, and SCL (clock line) is on analog input pin 5. On the Arduino Mega, SDA is digital pin 20 and SCL is 21. -

-

Functions

-

Note

-

There are both 7- and 8-bit versions of I2C addresses. 7 bits identify the device, and the eighth bit determines if it's being written to or read from. The Wire library uses 7 bit addresses throughout. If you have a datasheet or sample code that uses 8 bit address, you'll want to drop the low bit (i.e. shift the value one bit to the right), yielding an address between 0 and 127. -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireAvailable.html b/arduino-0018-linux-x64/reference/WireAvailable.html deleted file mode 100644 index 9ba2bb8..0000000 --- a/arduino-0018-linux-x64/reference/WireAvailable.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Arduino - WireAvailable - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.available()

-

Description

-

Returns the number of bytes available for retrieval with receive(). This should be called on a master device after a call to requestFrom() or on a slave inside the onReceive() handler. -

-

Parameters

-

None -

-

Returns

-

The number of bytes available for reading. -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireBegin.html b/arduino-0018-linux-x64/reference/WireBegin.html deleted file mode 100644 index c47a2ea..0000000 --- a/arduino-0018-linux-x64/reference/WireBegin.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - Arduino - WireBegin - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.begin()

-

Wire.begin(address)

-

Description

-

Initiate the Wire library and join the I2C bus as a master or slave. -

-

Parameters

-

address: the 7-bit slave address (optional); if not specified, join the bus as a master. -

-

Returns

-

None -

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireBeginTransmission.html b/arduino-0018-linux-x64/reference/WireBeginTransmission.html deleted file mode 100644 index 5058661..0000000 --- a/arduino-0018-linux-x64/reference/WireBeginTransmission.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - Arduino - WireBeginTransmission - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.beginTransmission(address)

-

Description

-

Begin a transmission to the I2C slave device with the given address. Subsequently, queue bytes for transmission with the send() function and transmit them by calling endTransmission(). -

-

Parameters

-

address: the 7-bit address of the device to transmit to -

-

Returns

-

None -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireEndTransmission.html b/arduino-0018-linux-x64/reference/WireEndTransmission.html deleted file mode 100644 index 21d9371..0000000 --- a/arduino-0018-linux-x64/reference/WireEndTransmission.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - Arduino - WireEndTransmission - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.endTransmission()

-

Description

-

Ends a transmission to a slave device that was begun by beginTransmission() and actually transmits the bytes that were queued by send(). -

-

Parameters

-

None -

-

Returns

-

None -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireOnReceive.html b/arduino-0018-linux-x64/reference/WireOnReceive.html deleted file mode 100644 index 84f9f94..0000000 --- a/arduino-0018-linux-x64/reference/WireOnReceive.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Arduino - WireOnReceive - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.onReceive(handler)

-

Description

-

Registers a function to be called when a slave device receives a transmission from a master. -

-

Parameters

-

handler: the function to be called when the slave receives data; this should take a single int parameter (the number of bytes received from the master) and return nothing, e.g.: void myHandler(int numBytes) -

-

Returns

-

None -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireOnRequest.html b/arduino-0018-linux-x64/reference/WireOnRequest.html deleted file mode 100644 index a5845ca..0000000 --- a/arduino-0018-linux-x64/reference/WireOnRequest.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Arduino - WireOnRequest - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.onRequest(handler)

-

Description

-

Register a function to be called when a master requests data from this slave device. -

-

Parameters

-

handler: the function to be called, takes no parameters and returns nothing, e.g.: void myHandler() -

-

Returns

-

None -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireReceive.html b/arduino-0018-linux-x64/reference/WireReceive.html deleted file mode 100644 index b92d4bf..0000000 --- a/arduino-0018-linux-x64/reference/WireReceive.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - Arduino - WireReceive - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

byte Wire.receive()

-

Description

-

Retrieve a byte that was transmitted from a slave device to a master after a call to requestFrom or was transmitted from a master to a slave. -

-

Parameters

-

None -

-

Returns

-

The next byte received. -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireRequestFrom.html b/arduino-0018-linux-x64/reference/WireRequestFrom.html deleted file mode 100644 index ddf944d..0000000 --- a/arduino-0018-linux-x64/reference/WireRequestFrom.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Arduino - WireRequestFrom - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.requestFrom(address, quantity)

-

Description

-

Request bytes from another device. The bytes may then be retrieved with the available() and receive() functions. -

-

Parameters

-

address: the 7-bit address of the device to request bytes from -

-

quantity: the number of bytes to request -

-

Returns

-

None -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WireSend.html b/arduino-0018-linux-x64/reference/WireSend.html deleted file mode 100644 index e01a5fd..0000000 --- a/arduino-0018-linux-x64/reference/WireSend.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - Arduino - WireSend - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Wire.send(value)

-

Wire.send(string)

-

Wire.send(data, quantity)

-

Description

-

Sends data from a slave device in response to a request from a master, or queues bytes for transmission from a master to slave device (in-between calls to beginTransmission() and endTransmission()). -

-

Parameters

-

value: a byte to send (byte) -

-

string: a string to send (char *) -

-

data: an array of data to send (byte *) -

-

quantity: the number of bytes of data to transmit (byte) -

-

Returns

-

None -

-

See Also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/Word.html b/arduino-0018-linux-x64/reference/Word.html deleted file mode 100644 index 7c07959..0000000 --- a/arduino-0018-linux-x64/reference/Word.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - Arduino - Word - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

word

-

Description

-

A word stores a 16-bit unsigned number, from 0 to 65536. Same as an unsigned int. -

-

Example

-
    word w = 10000; 
-
-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/WordCast.html b/arduino-0018-linux-x64/reference/WordCast.html deleted file mode 100644 index add7654..0000000 --- a/arduino-0018-linux-x64/reference/WordCast.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - Arduino - WordCast - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

word()

-

Description

-

Convert a value to the word data type or create a word from two bytes. -

-

Syntax

-

word(x)
word(h, l) -

-

Parameters

-

x: a value of any type -

-

h: the high-order (leftmost) byte of the word -

-

l: the low-order (rightmost) byte of the word -

-

Returns

-

word -

-

See also

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/reference/arduino.css b/arduino-0018-linux-x64/reference/arduino.css deleted file mode 100644 index dc20f30..0000000 --- a/arduino-0018-linux-x64/reference/arduino.css +++ /dev/null @@ -1,140 +0,0 @@ -body { - margin: 0px 20px 20px 20px; - padding: 0px 0px 0px 0px; - background-color: #aaa; - font-family: Verdana, Geneva, Arial, sans-serif; - font-size: 10px; - line-height: 15px; - xxxbackground: url(bg.gif) -} - -h1 { - font-family: Georgia, Times, serif; - color: #555; -} - -h2 { - font-family: Georgia, Times, serif; - color: #555; -} - -h3 { - font-family: Georgia, Times, serif; - color: #555; -} - -p ul li { - color: #555; -} - -a { - color: #111; -} - -hr { - border-top: 1px dotted #555; -} - -a:link { - text-decoration: none; - padding-bottom: 0px; - border-bottom: 1px solid #bbb; -} -a:visited { - text-decoration: none; - padding-bottom: 0px; - border-bottom: 1px solid #bbb; -} -a:active { - text-decoration: none; - padding-bottom: 0px; - border-bottom: 1px solid #bbb; -} -a:hover { - text-decoration: none; - padding-bottom: 0px; - background-color: #ddd; - border-bottom: none; -} - -a.selflink { - font-weight: bold; - text-decoration: none; - border-bottom: 0px solid white; -} - -#page { - width: 700px; -} - - -#pageheader { - height: 60px; - text-align: right; - padding-top: 40px; -} - -#pageheader .title { - float: left; - text-align: left; - margin-left: 20px; - font-family: Georgia, Times, serif; - padding-top: -19px; - font-size: 38px; - letter-spacing: 0px; - color: #fff; - font-weight: bold; - text-shadow: #aaa 0px 0px 5px; -} - -#pageheader .title a { - color: #fff; - border: none; -} - -#pageheader .title a:hover { - color: #fff; - border: none; - background-color: transparent; -} - -#pageheader .search { -} - -#pagenav { - background-color: #fff; - padding: 10px 20px; - border:1px solid #BBBBBB; -} - -#pagenav p { - display: inline; -} - -#pagetext { - padding-left: 20px; - padding-right: 20px; - padding-bottom: 10px; - padding-top: 10px; - color: #555; - background-color: #fff; - border: 1px solid #bbb; -} - -#pagefooter { - clear: both; - height: 30px; - padding-top: 15px; - padding-left: 20px; -} - -#pagefooter a { - color: #666; - border: none; - padding: 2px; -} - -#pagefooter a:hover { - color: #111; - background-color: #eee; -} diff --git a/arduino-0018-linux-x64/reference/environment.html b/arduino-0018-linux-x64/reference/environment.html deleted file mode 100644 index 6f52489..0000000 --- a/arduino-0018-linux-x64/reference/environment.html +++ /dev/null @@ -1,3 +0,0 @@ - - - Redirect \ No newline at end of file diff --git a/arduino-0018-linux-x64/reference/index.html b/arduino-0018-linux-x64/reference/index.html deleted file mode 100644 index f02c6cc..0000000 --- a/arduino-0018-linux-x64/reference/index.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - Arduino - Reference - - - - -
- - - - - - -
- -
-

Reference   Language (extended) | Libraries | Comparison | Changes -

-

Language Reference

-

See the extended reference for more advanced features of the Arduino languages and the libraries page for interfacing with particular types of hardware. -

-

Arduino programs can be divided in three main parts: structure, values (variables and constants), and functions. The Arduino language is based on C/C++. -

-

-
-

Structure

-

Control Structures

-

Further Syntax

-
  • ; (semicolon) -
  • {} (curly braces) -
  • // (single line comment) -
  • /* */ (multi-line comment) -

Arithmetic Operators

-

Comparison Operators

-
  • == (equal to) -
  • != (not equal to) -
  • < (less than) -
  • > (greater than) -
  • <= (less than or equal to) -
  • >= (greater than or equal to) -

Boolean Operators

-
  • && (and) -
  • || (or) -
  • ! (not) -

Compound Operators

-
  • ++ (increment) -
  • -- (decrement) -
  • += (compound addition) -
  • -= (compound subtraction) -
  • *= (compound multiplication) -
  • /= (compound division) -

Variables

-

Variables are expressions that you can use in programs to store values, such as a sensor reading from an analog pin. -

-

Constants

-

Constants are particular values with specific meanings. -

-

Data Types

-

Variables can have various types, which are described below. -

-

Conversion

-

Reference

-

-

Functions

-

Digital I/O -

Analog I/O -

Advanced I/O -

Time -

Math -

Trigonometry -

Random Numbers -

-

Communication -

-


-

-

Didn't find something? Check the extended reference or the libraries. Or see the list of community-contributed code. -

-

-

Reference Home -

-

Corrections, suggestions, and new documentation should be posted to the Forum. -

-

The text of the Arduino reference is licensed under a -Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. -

-
- -
- - - -
- - diff --git a/arduino-0018-linux-x64/arduino b/arduino-0022-linux-x64/arduino similarity index 65% rename from arduino-0018-linux-x64/arduino rename to arduino-0022-linux-x64/arduino index 7128bac..d371e76 100755 --- a/arduino-0018-linux-x64/arduino +++ b/arduino-0022-linux-x64/arduino @@ -1,6 +1,6 @@ #!/bin/sh -APPDIR="$(dirname -- "${0}")" +APPDIR="$(dirname -- $(readlink -f -- "${0}") )" cd $APPDIR @@ -10,11 +10,11 @@ for LIB in \ lib/*.jar \ ; do - CLASSPATH="${CLASSPATH}:${APPDIR}/${LIB}" + CLASSPATH="${CLASSPATH}:${LIB}" done export CLASSPATH -LD_LIBRARY_PATH=`pwd`/lib:${LD_LIBRARY_PATH} +LD_LIBRARY_PATH=`pwd`/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} export LD_LIBRARY_PATH export PATH="${APPDIR}/java/bin:${PATH}" diff --git a/arduino-0022-linux-x64/examples/1.Basics/AnalogReadSerial/AnalogReadSerial.pde b/arduino-0022-linux-x64/examples/1.Basics/AnalogReadSerial/AnalogReadSerial.pde new file mode 100644 index 0000000..97243f3 --- /dev/null +++ b/arduino-0022-linux-x64/examples/1.Basics/AnalogReadSerial/AnalogReadSerial.pde @@ -0,0 +1,15 @@ +/* + AnalogReadSerial + Reads an analog input on pin 0, prints the result to the serial monitor + + This example code is in the public domain. + */ + +void setup() { + Serial.begin(9600); +} + +void loop() { + int sensorValue = analogRead(A0); + Serial.println(sensorValue, DEC); +} diff --git a/arduino-0022-linux-x64/examples/1.Basics/BareMinimum/BareMinimum.pde b/arduino-0022-linux-x64/examples/1.Basics/BareMinimum/BareMinimum.pde new file mode 100644 index 0000000..c9c84ce --- /dev/null +++ b/arduino-0022-linux-x64/examples/1.Basics/BareMinimum/BareMinimum.pde @@ -0,0 +1,9 @@ +void setup() { + // put your setup code here, to run once: + +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/arduino-0022-linux-x64/examples/1.Basics/Blink/Blink.pde b/arduino-0022-linux-x64/examples/1.Basics/Blink/Blink.pde new file mode 100644 index 0000000..1953c39 --- /dev/null +++ b/arduino-0022-linux-x64/examples/1.Basics/Blink/Blink.pde @@ -0,0 +1,19 @@ +/* + Blink + Turns on an LED on for one second, then off for one second, repeatedly. + + This example code is in the public domain. + */ + +void setup() { + // initialize the digital pin as an output. + // Pin 13 has an LED connected on most Arduino boards: + pinMode(13, OUTPUT); +} + +void loop() { + digitalWrite(13, HIGH); // set the LED on + delay(1000); // wait for a second + digitalWrite(13, LOW); // set the LED off + delay(1000); // wait for a second +} diff --git a/arduino-0018-linux-x64/examples/Stubs/DigitalReadSerial/DigitalReadSerial.pde b/arduino-0022-linux-x64/examples/1.Basics/DigitalReadSerial/DigitalReadSerial.pde similarity index 51% rename from arduino-0018-linux-x64/examples/Stubs/DigitalReadSerial/DigitalReadSerial.pde rename to arduino-0022-linux-x64/examples/1.Basics/DigitalReadSerial/DigitalReadSerial.pde index 369b9a4..7651a8f 100644 --- a/arduino-0018-linux-x64/examples/Stubs/DigitalReadSerial/DigitalReadSerial.pde +++ b/arduino-0022-linux-x64/examples/1.Basics/DigitalReadSerial/DigitalReadSerial.pde @@ -1,3 +1,9 @@ +/* + DigitalReadSerial + Reads a digital input on pin 2, prints the result to the serial monitor + + This example code is in the public domain. + */ void setup() { Serial.begin(9600); diff --git a/arduino-0022-linux-x64/examples/1.Basics/Fade/Fade.pde b/arduino-0022-linux-x64/examples/1.Basics/Fade/Fade.pde new file mode 100644 index 0000000..b47bf43 --- /dev/null +++ b/arduino-0022-linux-x64/examples/1.Basics/Fade/Fade.pde @@ -0,0 +1,31 @@ +/* + Fade + + This example shows how to fade an LED on pin 9 + using the analogWrite() function. + + This example code is in the public domain. + + */ +int brightness = 0; // how bright the LED is +int fadeAmount = 5; // how many points to fade the LED by + +void setup() { + // declare pin 9 to be an output: + pinMode(9, OUTPUT); +} + +void loop() { + // set the brightness of pin 9: + analogWrite(9, brightness); + + // change the brightness for next time through the loop: + brightness = brightness + fadeAmount; + + // reverse the direction of the fading at the ends of the fade: + if (brightness == 0 || brightness == 255) { + fadeAmount = -fadeAmount ; + } + // wait for 30 milliseconds to see the dimming effect + delay(30); +} diff --git a/arduino-0018-linux-x64/examples/Digital/BlinkWithoutDelay/BlinkWithoutDelay.pde b/arduino-0022-linux-x64/examples/2.Digital/BlinkWithoutDelay/BlinkWithoutDelay.pde similarity index 76% rename from arduino-0018-linux-x64/examples/Digital/BlinkWithoutDelay/BlinkWithoutDelay.pde rename to arduino-0022-linux-x64/examples/2.Digital/BlinkWithoutDelay/BlinkWithoutDelay.pde index f1d6984..0143571 100644 --- a/arduino-0018-linux-x64/examples/Digital/BlinkWithoutDelay/BlinkWithoutDelay.pde +++ b/arduino-0022-linux-x64/examples/2.Digital/BlinkWithoutDelay/BlinkWithoutDelay.pde @@ -4,7 +4,7 @@ pin, without using the delay() function. This means that other code can run at the same time without being interrupted by the LED code. - The circuit: + The circuit: * LED attached from pin 13 to ground. * Note: on most Arduinos, there is already an LED on the board that's attached to pin 13, so no hardware is needed for this example. @@ -12,8 +12,11 @@ created 2005 by David A. Mellis - modified 17 Jun 2009 - by Tom Igoe + modified 8 Feb 2010 + by Paul Stoffregen + + This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay */ @@ -39,20 +42,24 @@ void loop() { // here is where you'd put code that needs to be running all the time. - // check to see if it's time to blink the LED; that is, is the difference - // between the current time and last time we blinked the LED bigger than - // the interval at which we want to blink the LED. - if (millis() - previousMillis > interval) { + // check to see if it's time to blink the LED; that is, if the + // difference between the current time and last time you blinked + // the LED is bigger than the interval at which you want to + // blink the LED. + unsigned long currentMillis = millis(); + + if(currentMillis - previousMillis > interval) { // save the last time you blinked the LED - previousMillis = millis(); + previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) ledState = HIGH; else ledState = LOW; - + // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } -} \ No newline at end of file +} + diff --git a/arduino-0018-linux-x64/examples/Digital/Button/Button.pde b/arduino-0022-linux-x64/examples/2.Digital/Button/Button.pde similarity index 87% rename from arduino-0018-linux-x64/examples/Digital/Button/Button.pde rename to arduino-0022-linux-x64/examples/2.Digital/Button/Button.pde index 8df98ec..a56ea14 100644 --- a/arduino-0018-linux-x64/examples/Digital/Button/Button.pde +++ b/arduino-0022-linux-x64/examples/2.Digital/Button/Button.pde @@ -2,7 +2,7 @@ Button Turns on and off a light emitting diode(LED) connected to digital - pin 13, when pressing a pushbutton attached to pin 7. + pin 13, when pressing a pushbutton attached to pin 2. The circuit: @@ -16,10 +16,12 @@ created 2005 by DojoDave - modified 17 Jun 2009 + modified 28 Oct 2010 by Tom Igoe - http://www.arduino.cc/en/Tutorial/Button + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/Button */ // constants won't change. They're used here to diff --git a/arduino-0018-linux-x64/examples/Digital/Debounce/Debounce.pde b/arduino-0022-linux-x64/examples/2.Digital/Debounce/Debounce.pde similarity index 98% rename from arduino-0018-linux-x64/examples/Digital/Debounce/Debounce.pde rename to arduino-0022-linux-x64/examples/2.Digital/Debounce/Debounce.pde index 568100f..6f184ec 100644 --- a/arduino-0018-linux-x64/examples/Digital/Debounce/Debounce.pde +++ b/arduino-0022-linux-x64/examples/2.Digital/Debounce/Debounce.pde @@ -20,6 +20,7 @@ modified 3 Jul 2009 by Limor Fried +This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Debounce */ diff --git a/arduino-0018-linux-x64/examples/Digital/StateChangeDetection/StateChangeDetection.pde b/arduino-0022-linux-x64/examples/2.Digital/StateChangeDetection/StateChangeDetection.pde similarity index 92% rename from arduino-0018-linux-x64/examples/Digital/StateChangeDetection/StateChangeDetection.pde rename to arduino-0022-linux-x64/examples/2.Digital/StateChangeDetection/StateChangeDetection.pde index 607dfc9..33f997c 100644 --- a/arduino-0018-linux-x64/examples/Digital/StateChangeDetection/StateChangeDetection.pde +++ b/arduino-0022-linux-x64/examples/2.Digital/StateChangeDetection/StateChangeDetection.pde @@ -16,8 +16,10 @@ most Arduino boards) created 27 Sep 2005 - modified 30 Dec 2009 + modified 14 Oct 2010 by Tom Igoe + +This example code is in the public domain. http://arduino.cc/en/Tutorial/ButtonStateChange @@ -62,11 +64,11 @@ void loop() { // wend from on to off: Serial.println("off"); } - - // save the current state as the last state, - //for next time through the loop - lastButtonState = buttonState; } + // save the current state as the last state, + //for next time through the loop + lastButtonState = buttonState; + // turns on the LED every four button pushes by // checking the modulo of the button push counter. diff --git a/arduino-0018-linux-x64/examples/Digital/toneKeyboard/pitches.h b/arduino-0022-linux-x64/examples/2.Digital/toneKeyboard/pitches.h similarity index 100% rename from arduino-0018-linux-x64/examples/Digital/toneKeyboard/pitches.h rename to arduino-0022-linux-x64/examples/2.Digital/toneKeyboard/pitches.h diff --git a/arduino-0018-linux-x64/examples/Digital/toneKeyboard/toneKeyboard.pde b/arduino-0022-linux-x64/examples/2.Digital/toneKeyboard/toneKeyboard.pde similarity index 93% rename from arduino-0018-linux-x64/examples/Digital/toneKeyboard/toneKeyboard.pde rename to arduino-0022-linux-x64/examples/2.Digital/toneKeyboard/toneKeyboard.pde index 57279ef..b1a5364 100644 --- a/arduino-0018-linux-x64/examples/Digital/toneKeyboard/toneKeyboard.pde +++ b/arduino-0022-linux-x64/examples/2.Digital/toneKeyboard/toneKeyboard.pde @@ -9,7 +9,10 @@ * 8-ohm speaker on digital pin 8 created 21 Jan 2010 + Modified 4 Sep 2010 by Tom Igoe + +This example code is in the public domain. http://arduino.cc/en/Tutorial/Tone3 @@ -40,10 +43,3 @@ void loop() { } Serial.println(); } - - - - - - - diff --git a/arduino-0018-linux-x64/examples/Digital/toneMelody/pitches.h b/arduino-0022-linux-x64/examples/2.Digital/toneMelody/pitches.h similarity index 100% rename from arduino-0018-linux-x64/examples/Digital/toneMelody/pitches.h rename to arduino-0022-linux-x64/examples/2.Digital/toneMelody/pitches.h diff --git a/arduino-0018-linux-x64/examples/Digital/toneMelody/toneMelody.pde b/arduino-0022-linux-x64/examples/2.Digital/toneMelody/toneMelody.pde similarity index 90% rename from arduino-0018-linux-x64/examples/Digital/toneMelody/toneMelody.pde rename to arduino-0022-linux-x64/examples/2.Digital/toneMelody/toneMelody.pde index b6e88d0..debcebd 100644 --- a/arduino-0018-linux-x64/examples/Digital/toneMelody/toneMelody.pde +++ b/arduino-0022-linux-x64/examples/2.Digital/toneMelody/toneMelody.pde @@ -7,7 +7,10 @@ * 8-ohm speaker on digital pin 8 created 21 Jan 2010 + modified 14 Oct 2010 by Tom Igoe + +This example code is in the public domain. http://arduino.cc/en/Tutorial/Tone @@ -36,13 +39,11 @@ void setup() { // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); + // stop the tone playing: + noTone(8); } } void loop() { // no need to repeat the melody. } - - - - diff --git a/arduino-0022-linux-x64/examples/2.Digital/toneMultiple/pitches.h b/arduino-0022-linux-x64/examples/2.Digital/toneMultiple/pitches.h new file mode 100644 index 0000000..55c7d54 --- /dev/null +++ b/arduino-0022-linux-x64/examples/2.Digital/toneMultiple/pitches.h @@ -0,0 +1,95 @@ +/************************************************* + * Public Constants + *************************************************/ + +#define NOTE_B0 31 +#define NOTE_C1 33 +#define NOTE_CS1 35 +#define NOTE_D1 37 +#define NOTE_DS1 39 +#define NOTE_E1 41 +#define NOTE_F1 44 +#define NOTE_FS1 46 +#define NOTE_G1 49 +#define NOTE_GS1 52 +#define NOTE_A1 55 +#define NOTE_AS1 58 +#define NOTE_B1 62 +#define NOTE_C2 65 +#define NOTE_CS2 69 +#define NOTE_D2 73 +#define NOTE_DS2 78 +#define NOTE_E2 82 +#define NOTE_F2 87 +#define NOTE_FS2 93 +#define NOTE_G2 98 +#define NOTE_GS2 104 +#define NOTE_A2 110 +#define NOTE_AS2 117 +#define NOTE_B2 123 +#define NOTE_C3 131 +#define NOTE_CS3 139 +#define NOTE_D3 147 +#define NOTE_DS3 156 +#define NOTE_E3 165 +#define NOTE_F3 175 +#define NOTE_FS3 185 +#define NOTE_G3 196 +#define NOTE_GS3 208 +#define NOTE_A3 220 +#define NOTE_AS3 233 +#define NOTE_B3 247 +#define NOTE_C4 262 +#define NOTE_CS4 277 +#define NOTE_D4 294 +#define NOTE_DS4 311 +#define NOTE_E4 330 +#define NOTE_F4 349 +#define NOTE_FS4 370 +#define NOTE_G4 392 +#define NOTE_GS4 415 +#define NOTE_A4 440 +#define NOTE_AS4 466 +#define NOTE_B4 494 +#define NOTE_C5 523 +#define NOTE_CS5 554 +#define NOTE_D5 587 +#define NOTE_DS5 622 +#define NOTE_E5 659 +#define NOTE_F5 698 +#define NOTE_FS5 740 +#define NOTE_G5 784 +#define NOTE_GS5 831 +#define NOTE_A5 880 +#define NOTE_AS5 932 +#define NOTE_B5 988 +#define NOTE_C6 1047 +#define NOTE_CS6 1109 +#define NOTE_D6 1175 +#define NOTE_DS6 1245 +#define NOTE_E6 1319 +#define NOTE_F6 1397 +#define NOTE_FS6 1480 +#define NOTE_G6 1568 +#define NOTE_GS6 1661 +#define NOTE_A6 1760 +#define NOTE_AS6 1865 +#define NOTE_B6 1976 +#define NOTE_C7 2093 +#define NOTE_CS7 2217 +#define NOTE_D7 2349 +#define NOTE_DS7 2489 +#define NOTE_E7 2637 +#define NOTE_F7 2794 +#define NOTE_FS7 2960 +#define NOTE_G7 3136 +#define NOTE_GS7 3322 +#define NOTE_A7 3520 +#define NOTE_AS7 3729 +#define NOTE_B7 3951 +#define NOTE_C8 4186 +#define NOTE_CS8 4435 +#define NOTE_D8 4699 +#define NOTE_DS8 4978 + + diff --git a/arduino-0022-linux-x64/examples/2.Digital/toneMultiple/toneMultiple.pde b/arduino-0022-linux-x64/examples/2.Digital/toneMultiple/toneMultiple.pde new file mode 100644 index 0000000..52a06df --- /dev/null +++ b/arduino-0022-linux-x64/examples/2.Digital/toneMultiple/toneMultiple.pde @@ -0,0 +1,42 @@ +/* + Multiple tone player + + Plays multiple tones on multiple pins in sequence + + circuit: + * 3 8-ohm speaker on digital pins 6, 7, and 11 + + created 8 March 2010 + by Tom Igoe + based on a snippet from Greg Borenstein + +This example code is in the public domain. + + http://arduino.cc/en/Tutorial/Tone4 + + */ + +void setup() { + +} + +void loop() { + // turn off tone function for pin 11: + noTone(11); + // play a note on pin 6 for 200 ms: + tone(6, 440, 200); + delay(200); + + // turn off tone function for pin 6: + noTone(6); + // play a note on pin 7 for 500 ms: + tone(7, 494, 500); + delay(500); + + // turn off tone function for pin 7: + noTone(7); + // play a note on pin 11 for 500 ms: + tone(11, 523, 300); + delay(300); + +} diff --git a/arduino-0018-linux-x64/examples/Digital/tonePitchFollower/tonePitchFollower.pde b/arduino-0022-linux-x64/examples/2.Digital/tonePitchFollower/tonePitchFollower.pde similarity index 88% rename from arduino-0018-linux-x64/examples/Digital/tonePitchFollower/tonePitchFollower.pde rename to arduino-0022-linux-x64/examples/2.Digital/tonePitchFollower/tonePitchFollower.pde index 403b2c1..3b9d738 100644 --- a/arduino-0018-linux-x64/examples/Digital/tonePitchFollower/tonePitchFollower.pde +++ b/arduino-0022-linux-x64/examples/2.Digital/tonePitchFollower/tonePitchFollower.pde @@ -9,7 +9,10 @@ * 4.7K resistor on analog 0 to ground created 21 Jan 2010 + Modified 4 Sep 2010 by Tom Igoe + +This example code is in the public domain. http://arduino.cc/en/Tutorial/Tone2 @@ -23,7 +26,7 @@ void setup() { void loop() { // read the sensor: - int sensorReading = analogRead(0); + int sensorReading = analogRead(A0); // print the sensor reading so you know its range Serial.println(sensorReading); // map the pitch to the range of the analog input. diff --git a/arduino-0018-linux-x64/examples/Analog/AnalogInOutSerial/AnalogInOutSerial.pde b/arduino-0022-linux-x64/examples/3.Analog/AnalogInOutSerial/AnalogInOutSerial.pde similarity index 90% rename from arduino-0018-linux-x64/examples/Analog/AnalogInOutSerial/AnalogInOutSerial.pde rename to arduino-0022-linux-x64/examples/3.Analog/AnalogInOutSerial/AnalogInOutSerial.pde index 81c8e81..57c1421 100644 --- a/arduino-0018-linux-x64/examples/Analog/AnalogInOutSerial/AnalogInOutSerial.pde +++ b/arduino-0022-linux-x64/examples/3.Analog/AnalogInOutSerial/AnalogInOutSerial.pde @@ -12,13 +12,16 @@ * LED connected from digital pin 9 to ground created 29 Dec. 2008 + Modified 4 Sep 2010 by Tom Igoe + This example code is in the public domain. + */ // These constants won't change. They're used to give names // to the pins used: -const int analogInPin = 0; // Analog input pin that the potentiometer is attached to +const int analogInPin = A0; // Analog input pin that the potentiometer is attached to const int analogOutPin = 9; // Analog output pin that the LED is attached to int sensorValue = 0; // value read from the pot diff --git a/arduino-0018-linux-x64/examples/Analog/AnalogInput/AnalogInput.pde b/arduino-0022-linux-x64/examples/3.Analog/AnalogInput/AnalogInput.pde similarity index 90% rename from arduino-0018-linux-x64/examples/Analog/AnalogInput/AnalogInput.pde rename to arduino-0022-linux-x64/examples/3.Analog/AnalogInput/AnalogInput.pde index 1ee8ee3..18a0055 100644 --- a/arduino-0018-linux-x64/examples/Analog/AnalogInput/AnalogInput.pde +++ b/arduino-0022-linux-x64/examples/3.Analog/AnalogInput/AnalogInput.pde @@ -18,14 +18,16 @@ Created by David Cuartielles - Modified 16 Jun 2009 + Modified 4 Sep 2010 By Tom Igoe + This example code is in the public domain. + http://arduino.cc/en/Tutorial/AnalogInput */ -int sensorPin = 0; // select the input pin for the potentiometer +int sensorPin = A0; // select the input pin for the potentiometer int ledPin = 13; // select the pin for the LED int sensorValue = 0; // variable to store the value coming from the sensor diff --git a/arduino-0018-linux-x64/examples/Analog/AnalogWriteMega/AnalogWriteMega.pde b/arduino-0022-linux-x64/examples/3.Analog/AnalogWriteMega/AnalogWriteMega.pde similarity index 95% rename from arduino-0018-linux-x64/examples/Analog/AnalogWriteMega/AnalogWriteMega.pde rename to arduino-0022-linux-x64/examples/3.Analog/AnalogWriteMega/AnalogWriteMega.pde index 3166952..04e50c8 100644 --- a/arduino-0018-linux-x64/examples/Analog/AnalogWriteMega/AnalogWriteMega.pde +++ b/arduino-0022-linux-x64/examples/3.Analog/AnalogWriteMega/AnalogWriteMega.pde @@ -9,6 +9,9 @@ created 8 Feb 2009 by Tom Igoe + + This example code is in the public domain. + */ // These constants won't change. They're used to give names // to the pins used: diff --git a/arduino-0018-linux-x64/examples/Analog/Calibration/Calibration.pde b/arduino-0022-linux-x64/examples/3.Analog/Calibration/Calibration.pde similarity index 79% rename from arduino-0018-linux-x64/examples/Analog/Calibration/Calibration.pde rename to arduino-0022-linux-x64/examples/3.Analog/Calibration/Calibration.pde index 52c8d8d..c5734df 100644 --- a/arduino-0018-linux-x64/examples/Analog/Calibration/Calibration.pde +++ b/arduino-0022-linux-x64/examples/3.Analog/Calibration/Calibration.pde @@ -1,14 +1,14 @@ /* Calibration - Demonstrates one techinque for calibrating sensor input. The + Demonstrates one technique for calibrating sensor input. The sensor readings during the first five seconds of the sketch execution define the minimum and maximum of expected values attached to the sensor pin. - The sensor minumum and maximum initial values may seem backwards. + The sensor minimum and maximum initial values may seem backwards. Initially, you set the minimum high and listen for anything - lower, saving it as the new minumum. Likewise, you set the + lower, saving it as the new minimum. Likewise, you set the maximum low and listen for anything higher as the new maximum. The circuit: @@ -17,21 +17,23 @@ created 29 Oct 2008 By David A Mellis - Modified 17 Jun 2009 + Modified 4 Sep 2010 By Tom Igoe http://arduino.cc/en/Tutorial/Calibration + This example code is in the public domain. + */ // These constants won't change: -const int sensorPin = 2; // pin that the sensor is attached to +const int sensorPin = A0; // pin that the sensor is attached to const int ledPin = 9; // pin that the LED is attached to // variables: int sensorValue = 0; // the sensor value -int sensorMin = 1023; // minimum sensor value -int sensorMax = 0; // maximum sensor value +int sensorMin = 1023; // minimum sensor value +int sensorMax = 0; // maximum sensor value void setup() { @@ -70,4 +72,4 @@ void loop() { // fade the LED using the calibrated value: analogWrite(ledPin, sensorValue); -} \ No newline at end of file +} diff --git a/arduino-0018-linux-x64/examples/Analog/Fading/Fading.pde b/arduino-0022-linux-x64/examples/3.Analog/Fading/Fading.pde similarity index 95% rename from arduino-0018-linux-x64/examples/Analog/Fading/Fading.pde rename to arduino-0022-linux-x64/examples/3.Analog/Fading/Fading.pde index 1205078..46959ad 100644 --- a/arduino-0018-linux-x64/examples/Analog/Fading/Fading.pde +++ b/arduino-0022-linux-x64/examples/3.Analog/Fading/Fading.pde @@ -13,6 +13,8 @@ http://arduino.cc/en/Tutorial/Fading + This example code is in the public domain. + */ diff --git a/arduino-0018-linux-x64/examples/Analog/Smoothing/Smoothing.pde b/arduino-0022-linux-x64/examples/3.Analog/Smoothing/Smoothing.pde similarity index 96% rename from arduino-0018-linux-x64/examples/Analog/Smoothing/Smoothing.pde rename to arduino-0022-linux-x64/examples/3.Analog/Smoothing/Smoothing.pde index 881bb13..5de30e8 100644 --- a/arduino-0018-linux-x64/examples/Analog/Smoothing/Smoothing.pde +++ b/arduino-0022-linux-x64/examples/3.Analog/Smoothing/Smoothing.pde @@ -13,6 +13,8 @@ By David A. Mellis http://www.arduino.cc/en/Tutorial/Smoothing + + This example code is in the public domain. */ @@ -29,7 +31,7 @@ int index = 0; // the index of the current reading int total = 0; // the running total int average = 0; // the average -int inputPin = 0; +int inputPin = A0; void setup() { diff --git a/arduino-0018-linux-x64/examples/Communication/ASCIITable/ASCIITable.pde b/arduino-0022-linux-x64/examples/4.Communication/ASCIITable/ASCIITable.pde similarity index 97% rename from arduino-0018-linux-x64/examples/Communication/ASCIITable/ASCIITable.pde rename to arduino-0022-linux-x64/examples/4.Communication/ASCIITable/ASCIITable.pde index 3a20603..3678836 100644 --- a/arduino-0018-linux-x64/examples/Communication/ASCIITable/ASCIITable.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/ASCIITable/ASCIITable.pde @@ -14,7 +14,10 @@ modified 18 Jan 2009 by Tom Igoe + This example code is in the public domain. + + */ void setup() { diff --git a/arduino-0018-linux-x64/examples/Communication/Dimmer/Dimmer.pde b/arduino-0022-linux-x64/examples/4.Communication/Dimmer/Dimmer.pde similarity index 98% rename from arduino-0018-linux-x64/examples/Communication/Dimmer/Dimmer.pde rename to arduino-0022-linux-x64/examples/4.Communication/Dimmer/Dimmer.pde index 0990fe5..3eb92b0 100644 --- a/arduino-0018-linux-x64/examples/Communication/Dimmer/Dimmer.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/Dimmer/Dimmer.pde @@ -15,7 +15,10 @@ modified 14 Apr 2009 by Tom Igoe and Scott Fitzgerald + This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/Dimmer + */ const int ledPin = 9; // the pin that the LED is attached to @@ -43,6 +46,7 @@ void loop() { /* Processing code for this example // Dimmer - sends bytes over a serial port // by David A. Mellis + //This example code is in the public domain. import processing.serial.*; Serial port; diff --git a/arduino-0018-linux-x64/examples/Communication/Graph/Graph.pde b/arduino-0022-linux-x64/examples/4.Communication/Graph/Graph.pde similarity index 99% rename from arduino-0018-linux-x64/examples/Communication/Graph/Graph.pde rename to arduino-0022-linux-x64/examples/4.Communication/Graph/Graph.pde index 1f2fadd..c1e39ac 100644 --- a/arduino-0018-linux-x64/examples/Communication/Graph/Graph.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/Graph/Graph.pde @@ -15,14 +15,14 @@ The circuit: Any analog input sensor is attached to analog in pin 0. - - http://www.arduino.cc/en/Tutorial/Graph - + created 2006 by David A. Mellis modified 14 Apr 2009 by Tom Igoe and Scott Fitzgerald + This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/Graph */ @@ -33,7 +33,7 @@ void setup() { void loop() { // send the value of analog input 0: - Serial.println(analogRead(0)); + Serial.println(analogRead(A0)); // wait a bit for the analog-to-digital converter // to stabilize after the last reading: delay(10); @@ -51,6 +51,7 @@ void loop() { // Created 20 Apr 2005 // Updated 18 Jan 2008 // by Tom Igoe + // This example code is in the public domain. import processing.serial.*; diff --git a/arduino-0018-linux-x64/examples/Communication/MIDI/Midi.pde b/arduino-0022-linux-x64/examples/4.Communication/MIDI/Midi.pde similarity index 96% rename from arduino-0018-linux-x64/examples/Communication/MIDI/Midi.pde rename to arduino-0022-linux-x64/examples/4.Communication/MIDI/Midi.pde index feb3e82..7a25c85 100644 --- a/arduino-0018-linux-x64/examples/Communication/MIDI/Midi.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/MIDI/Midi.pde @@ -15,6 +15,8 @@ created 13 Jun 2006 modified 2 Jul 2009 by Tom Igoe + + This example code is in the public domain. http://www.arduino.cc/en/Tutorial/MIDI diff --git a/arduino-0018-linux-x64/examples/Communication/MultiSerialMega/MultiSerialMega.pde b/arduino-0022-linux-x64/examples/4.Communication/MultiSerialMega/MultiSerialMega.pde similarity index 92% rename from arduino-0018-linux-x64/examples/Communication/MultiSerialMega/MultiSerialMega.pde rename to arduino-0022-linux-x64/examples/4.Communication/MultiSerialMega/MultiSerialMega.pde index f587c63..788bc90 100644 --- a/arduino-0018-linux-x64/examples/Communication/MultiSerialMega/MultiSerialMega.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/MultiSerialMega/MultiSerialMega.pde @@ -13,6 +13,8 @@ created 30 Dec. 2008 by Tom Igoe + This example code is in the public domain. + */ diff --git a/arduino-0018-linux-x64/examples/Communication/PhysicalPixel/PhysicalPixel.pde b/arduino-0022-linux-x64/examples/4.Communication/PhysicalPixel/PhysicalPixel.pde similarity index 99% rename from arduino-0018-linux-x64/examples/Communication/PhysicalPixel/PhysicalPixel.pde rename to arduino-0022-linux-x64/examples/4.Communication/PhysicalPixel/PhysicalPixel.pde index b5006ec..f7371c9 100644 --- a/arduino-0018-linux-x64/examples/Communication/PhysicalPixel/PhysicalPixel.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/PhysicalPixel/PhysicalPixel.pde @@ -18,6 +18,8 @@ modified 14 Apr 2009 by Tom Igoe and Scott Fitzgerald + This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/PhysicalPixel */ @@ -59,6 +61,8 @@ void loop() { // based on examples by Casey Reas and Hernando Barragan // modified 18 Jan 2009 // by Tom Igoe + // This example code is in the public domain. + import processing.serial.*; diff --git a/arduino-0018-linux-x64/examples/Communication/SerialCallResponse/SerialCallResponse.pde b/arduino-0022-linux-x64/examples/4.Communication/SerialCallResponse/SerialCallResponse.pde similarity index 99% rename from arduino-0018-linux-x64/examples/Communication/SerialCallResponse/SerialCallResponse.pde rename to arduino-0022-linux-x64/examples/4.Communication/SerialCallResponse/SerialCallResponse.pde index 809bbf8..6f56d98 100644 --- a/arduino-0018-linux-x64/examples/Communication/SerialCallResponse/SerialCallResponse.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/SerialCallResponse/SerialCallResponse.pde @@ -13,13 +13,15 @@ * potentiometers attached to analog inputs 0 and 1 * pushbutton attached to digital I/O 2 - - http://www.arduino.cc/en/Tutorial/SerialCallResponse - Created 26 Sept. 2005 by Tom Igoe - Modified 14 April 2009 + Modified 4 Sep 2010 by Tom Igoe and Scott Fitzgerald + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/SerialCallResponse + */ int firstSensor = 0; // first analog sensor @@ -42,7 +44,7 @@ void loop() // get incoming byte: inByte = Serial.read(); // read first analog input, divide by 4 to make the range 0-255: - firstSensor = analogRead(0)/4; + firstSensor = analogRead(A0)/4; // delay 10ms to let the ADC recover: delay(10); // read second analog input, divide by 4 to make the range 0-255: @@ -66,6 +68,8 @@ void establishContact() { /* Processing sketch to run with this example: +// This example code is in the public domain. + import processing.serial.*; int bgcolor; // Background color diff --git a/arduino-0018-linux-x64/examples/Communication/SerialCallResponseASCII/SerialCallResponseASCII.pde b/arduino-0022-linux-x64/examples/4.Communication/SerialCallResponseASCII/SerialCallResponseASCII.pde similarity index 99% rename from arduino-0018-linux-x64/examples/Communication/SerialCallResponseASCII/SerialCallResponseASCII.pde rename to arduino-0022-linux-x64/examples/4.Communication/SerialCallResponseASCII/SerialCallResponseASCII.pde index 7c2528d..3caf3f7 100644 --- a/arduino-0018-linux-x64/examples/Communication/SerialCallResponseASCII/SerialCallResponseASCII.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/SerialCallResponseASCII/SerialCallResponseASCII.pde @@ -16,12 +16,16 @@ * pushbutton attached to digital I/O 2 - http://www.arduino.cc/en/Tutorial/SerialCallResponseASCII Created 26 Sept. 2005 by Tom Igoe - Modified 14 April 2009 + Modified 4 Sep 2010 by Tom Igoe and Scott Fitzgerald + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/SerialCallResponseASCII + */ int firstSensor = 0; // first analog sensor @@ -44,7 +48,7 @@ void loop() // get incoming byte: inByte = Serial.read(); // read first analog input, divide by 4 to make the range 0-255: - firstSensor = analogRead(0)/4; + firstSensor = analogRead(A0)/4; // delay 10ms to let the ADC recover: delay(10); // read second analog input, divide by 4 to make the range 0-255: @@ -71,6 +75,7 @@ void establishContact() { /* Processing code to run with this example: +// This example code is in the public domain. import processing.serial.*; // import the Processing serial library Serial myPort; // The serial port diff --git a/arduino-0018-linux-x64/examples/Communication/VirtualColorMixer/VirtualColorMixer.pde b/arduino-0022-linux-x64/examples/4.Communication/VirtualColorMixer/VirtualColorMixer.pde similarity index 98% rename from arduino-0018-linux-x64/examples/Communication/VirtualColorMixer/VirtualColorMixer.pde rename to arduino-0022-linux-x64/examples/4.Communication/VirtualColorMixer/VirtualColorMixer.pde index f23f147..5e8c401 100644 --- a/arduino-0018-linux-x64/examples/Communication/VirtualColorMixer/VirtualColorMixer.pde +++ b/arduino-0022-linux-x64/examples/4.Communication/VirtualColorMixer/VirtualColorMixer.pde @@ -10,14 +10,15 @@ created 2 Dec 2006 by David A. Mellis - modified 14 Apr 2009 + modified 4 Sep 2010 by Tom Igoe and Scott Fitzgerald + This example code is in the public domain. */ -const int redPin = 0; // sensor to control red color -const int greenPin = 1; // sensor to control green color -const int bluePin = 2; // sensor to control blue color +const int redPin = A0; // sensor to control red color +const int greenPin = A1; // sensor to control green color +const int bluePin = A2; // sensor to control blue color void setup() { @@ -35,6 +36,7 @@ void loop() /* Processing code for this example +// This example code is in the public domain. import processing.serial.*; diff --git a/arduino-0018-linux-x64/examples/Control/Arrays/Arrays.pde b/arduino-0022-linux-x64/examples/5.Control/Arrays/Arrays.pde similarity index 97% rename from arduino-0018-linux-x64/examples/Control/Arrays/Arrays.pde rename to arduino-0022-linux-x64/examples/5.Control/Arrays/Arrays.pde index d9d9837..cf83ccf 100644 --- a/arduino-0018-linux-x64/examples/Control/Arrays/Arrays.pde +++ b/arduino-0022-linux-x64/examples/5.Control/Arrays/Arrays.pde @@ -15,6 +15,8 @@ by David A. Mellis modified 5 Jul 2009 by Tom Igoe + +This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Array */ diff --git a/arduino-0018-linux-x64/examples/Control/ForLoopIteration/ForLoopIteration.pde b/arduino-0022-linux-x64/examples/5.Control/ForLoopIteration/ForLoopIteration.pde similarity index 95% rename from arduino-0018-linux-x64/examples/Control/ForLoopIteration/ForLoopIteration.pde rename to arduino-0022-linux-x64/examples/5.Control/ForLoopIteration/ForLoopIteration.pde index 4fd745d..ec60ec9 100644 --- a/arduino-0018-linux-x64/examples/Control/ForLoopIteration/ForLoopIteration.pde +++ b/arduino-0022-linux-x64/examples/5.Control/ForLoopIteration/ForLoopIteration.pde @@ -11,6 +11,8 @@ by David A. Mellis modified 5 Jul 2009 by Tom Igoe + +This example code is in the public domain. http://www.arduino.cc/en/Tutorial/ForLoop */ diff --git a/arduino-0018-linux-x64/examples/Control/IfStatementConditional/IfStatementConditional.pde b/arduino-0022-linux-x64/examples/5.Control/IfStatementConditional/IfStatementConditional.pde similarity index 88% rename from arduino-0018-linux-x64/examples/Control/IfStatementConditional/IfStatementConditional.pde rename to arduino-0022-linux-x64/examples/5.Control/IfStatementConditional/IfStatementConditional.pde index a763ae5..5bc0dff 100644 --- a/arduino-0018-linux-x64/examples/Control/IfStatementConditional/IfStatementConditional.pde +++ b/arduino-0022-linux-x64/examples/5.Control/IfStatementConditional/IfStatementConditional.pde @@ -16,14 +16,17 @@ connected to pin 13, so you don't need any extra components for this example. created 17 Jan 2009 + modified 4 Sep 2010 by Tom Igoe + +This example code is in the public domain. - http://arduino.cc/en/Tutorial/ +http://arduino.cc/en/Tutorial/IfStatement */ // These constants won't change: -const int analogPin = 0; // pin that the sensor is attached to +const int analogPin = A0; // pin that the sensor is attached to const int ledPin = 13; // pin that the LED is attached to const int threshold = 400; // an arbitrary threshold level that's in the range of the analog input diff --git a/arduino-0018-linux-x64/examples/Control/WhileStatementConditional/WhileStatementConditional.pde b/arduino-0022-linux-x64/examples/5.Control/WhileStatementConditional/WhileStatementConditional.pde similarity index 85% rename from arduino-0018-linux-x64/examples/Control/WhileStatementConditional/WhileStatementConditional.pde rename to arduino-0022-linux-x64/examples/5.Control/WhileStatementConditional/WhileStatementConditional.pde index 0500479..69c6fc8 100644 --- a/arduino-0018-linux-x64/examples/Control/WhileStatementConditional/WhileStatementConditional.pde +++ b/arduino-0022-linux-x64/examples/5.Control/WhileStatementConditional/WhileStatementConditional.pde @@ -17,19 +17,21 @@ * 10K resistor attached from pin 2 to ground created 17 Jan 2009 - modified 25 Jun 2009 + modified 4 Sep 2010 by Tom Igoe + This example code is in the public domain. + http://arduino.cc/en/Tutorial/WhileLoop */ // These constants won't change: -const int sensorPin = 2; // pin that the sensor is attached to -const int ledPin = 9; // pin that the LED is attached to -const int indicatorLedPin = 13; // pin that the built-in LED is attached to -const int buttonPin = 2; // pin that the button is attached to +const int sensorPin = A2; // pin that the sensor is attached to +const int ledPin = 9; // pin that the LED is attached to +const int indicatorLedPin = 13; // pin that the built-in LED is attached to +const int buttonPin = 2; // pin that the button is attached to // These variables will change: diff --git a/arduino-0018-linux-x64/examples/Control/switchCase/switchCase.pde b/arduino-0022-linux-x64/examples/5.Control/switchCase/switchCase.pde similarity index 93% rename from arduino-0018-linux-x64/examples/Control/switchCase/switchCase.pde rename to arduino-0022-linux-x64/examples/5.Control/switchCase/switchCase.pde index 10a2be1..1b76e5f 100644 --- a/arduino-0018-linux-x64/examples/Control/switchCase/switchCase.pde +++ b/arduino-0022-linux-x64/examples/5.Control/switchCase/switchCase.pde @@ -14,8 +14,11 @@ * 10K resistor from analog in 0 to ground created 1 Jul 2009 + modified 4 Sep 2010 by Tom Igoe + This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/SwitchCase */ @@ -30,7 +33,7 @@ void setup() { void loop() { // read the sensor: - int sensorReading = analogRead(0); + int sensorReading = analogRead(A0); // map the sensor range to a range of four options: int range = map(sensorReading, sensorMin, sensorMax, 0, 3); diff --git a/arduino-0018-linux-x64/examples/Control/switchCase2/switchCase2.pde b/arduino-0022-linux-x64/examples/5.Control/switchCase2/switchCase2.pde similarity index 97% rename from arduino-0018-linux-x64/examples/Control/switchCase2/switchCase2.pde rename to arduino-0022-linux-x64/examples/5.Control/switchCase2/switchCase2.pde index 94a1b6c..b6d7886 100644 --- a/arduino-0018-linux-x64/examples/Control/switchCase2/switchCase2.pde +++ b/arduino-0022-linux-x64/examples/5.Control/switchCase2/switchCase2.pde @@ -15,6 +15,8 @@ created 1 Jul 2009 by Tom Igoe +This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/SwitchCase2 */ diff --git a/arduino-0018-linux-x64/examples/Sensors/ADXL3xx/ADXL3xx.pde b/arduino-0022-linux-x64/examples/6.Sensors/ADXL3xx/ADXL3xx.pde similarity index 86% rename from arduino-0018-linux-x64/examples/Sensors/ADXL3xx/ADXL3xx.pde rename to arduino-0022-linux-x64/examples/6.Sensors/ADXL3xx/ADXL3xx.pde index 5609c42..58ea129 100644 --- a/arduino-0018-linux-x64/examples/Sensors/ADXL3xx/ADXL3xx.pde +++ b/arduino-0022-linux-x64/examples/6.Sensors/ADXL3xx/ADXL3xx.pde @@ -19,17 +19,19 @@ created 2 Jul 2008 by David A. Mellis - modified 26 Jun 2009 + modified 4 Sep 2010 by Tom Igoe + + This example code is in the public domain. */ // these constants describe the pins. They won't change: const int groundpin = 18; // analog input pin 4 -- ground const int powerpin = 19; // analog input pin 5 -- voltage -const int xpin = 3; // x-axis of the accelerometer -const int ypin = 2; // y-axis -const int zpin = 1; // z-axis (only on 3-axis models) +const int xpin = A3; // x-axis of the accelerometer +const int ypin = A2; // y-axis +const int zpin = A1; // z-axis (only on 3-axis models) void setup() { diff --git a/arduino-0018-linux-x64/examples/Sensors/Knock/Knock.pde b/arduino-0022-linux-x64/examples/6.Sensors/Knock/Knock.pde similarity index 92% rename from arduino-0018-linux-x64/examples/Sensors/Knock/Knock.pde rename to arduino-0022-linux-x64/examples/6.Sensors/Knock/Knock.pde index 05e4632..985f032 100644 --- a/arduino-0018-linux-x64/examples/Sensors/Knock/Knock.pde +++ b/arduino-0022-linux-x64/examples/6.Sensors/Knock/Knock.pde @@ -14,15 +14,17 @@ created 25 Mar 2007 by David Cuartielles - modified 30 Jun 2009 + modified 4 Sep 2010 by Tom Igoe + + This example code is in the public domain. */ // these constants won't change: const int ledPin = 13; // led connected to digital pin 13 -const int knockSensor = 0; // the piezo is connected to analog pin 0 +const int knockSensor = A0; // the piezo is connected to analog pin 0 const int threshold = 100; // threshold value to decide when the detected sound is a knock or not diff --git a/arduino-0018-linux-x64/examples/Sensors/Memsic2125/Memsic2125.pde b/arduino-0022-linux-x64/examples/6.Sensors/Memsic2125/Memsic2125.pde similarity index 96% rename from arduino-0018-linux-x64/examples/Sensors/Memsic2125/Memsic2125.pde rename to arduino-0022-linux-x64/examples/6.Sensors/Memsic2125/Memsic2125.pde index a69e31d..cf5e81c 100644 --- a/arduino-0018-linux-x64/examples/Sensors/Memsic2125/Memsic2125.pde +++ b/arduino-0022-linux-x64/examples/6.Sensors/Memsic2125/Memsic2125.pde @@ -18,6 +18,8 @@ by David A. Mellis modified 30 Jun 2009 by Tom Igoe + + This example code is in the public domain. */ diff --git a/arduino-0018-linux-x64/examples/Sensors/Ping/Ping.pde b/arduino-0022-linux-x64/examples/6.Sensors/Ping/Ping.pde similarity index 98% rename from arduino-0018-linux-x64/examples/Sensors/Ping/Ping.pde rename to arduino-0022-linux-x64/examples/6.Sensors/Ping/Ping.pde index 3e89744..70bab93 100644 --- a/arduino-0018-linux-x64/examples/Sensors/Ping/Ping.pde +++ b/arduino-0022-linux-x64/examples/6.Sensors/Ping/Ping.pde @@ -17,6 +17,8 @@ by David A. Mellis modified 30 Jun 2009 by Tom Igoe + + This example code is in the public domain. */ diff --git a/arduino-0018-linux-x64/examples/Display/RowColumnScanning/RowColumnScanning.pde b/arduino-0022-linux-x64/examples/7.Display/RowColumnScanning/RowColumnScanning.pde similarity index 94% rename from arduino-0018-linux-x64/examples/Display/RowColumnScanning/RowColumnScanning.pde rename to arduino-0022-linux-x64/examples/7.Display/RowColumnScanning/RowColumnScanning.pde index 49f6ab7..bcda4c7 100644 --- a/arduino-0018-linux-x64/examples/Display/RowColumnScanning/RowColumnScanning.pde +++ b/arduino-0022-linux-x64/examples/7.Display/RowColumnScanning/RowColumnScanning.pde @@ -4,7 +4,7 @@ This example controls an 8x8 LED matrix using two analog inputs created 27 May 2009 - modified 29 Jun 2009 + modified 4 Sep 2010 by Tom Igoe This example works for the Lumex LDM-24488NI Matrix. See @@ -26,6 +26,8 @@ * center pins are attached to analog pins 0 and 1, respectively * side pins attached to +5V and ground, respectively. + This example code is in the public domain. + http://www.arduino.cc/en/Tutorial/RowColumnScanning see also http://www.tigoe.net/pcomp/code/category/arduinowiring/514 for more @@ -81,8 +83,8 @@ void readSensors() { // turn off the last position: pixels[x][y] = HIGH; // read the sensors for X and Y values: - x = 7 - map(analogRead(0), 0, 1023, 0, 7); - y = map(analogRead(1), 0, 1023, 0, 7); + x = 7 - map(analogRead(A0), 0, 1023, 0, 7); + y = map(analogRead(A1), 0, 1023, 0, 7); // set the new pixel position low so that the LED will turn on // in the next screen refresh: pixels[x][y] = LOW; diff --git a/arduino-0018-linux-x64/examples/Display/barGraph/barGraph.pde b/arduino-0022-linux-x64/examples/7.Display/barGraph/barGraph.pde similarity index 91% rename from arduino-0018-linux-x64/examples/Display/barGraph/barGraph.pde rename to arduino-0022-linux-x64/examples/7.Display/barGraph/barGraph.pde index 3e6664a..646cd47 100644 --- a/arduino-0018-linux-x64/examples/Display/barGraph/barGraph.pde +++ b/arduino-0022-linux-x64/examples/7.Display/barGraph/barGraph.pde @@ -12,15 +12,17 @@ The circuit: * LEDs from pins 2 through 11 to ground - created 26 Jun 2009 + created 4 Sep 2010 by Tom Igoe + + This example code is in the public domain. http://www.arduino.cc/en/Tutorial/BarGraph */ // these constants won't change: -const int analogPin = 0; // the pin that the potentiometer is attached to +const int analogPin = A0; // the pin that the potentiometer is attached to const int ledCount = 10; // the number of LEDs in the bar graph int ledPins[] = { diff --git a/arduino-0022-linux-x64/examples/8.Strings/CharacterAnalysis/CharacterAnalysis.pde b/arduino-0022-linux-x64/examples/8.Strings/CharacterAnalysis/CharacterAnalysis.pde new file mode 100644 index 0000000..12baca9 --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/CharacterAnalysis/CharacterAnalysis.pde @@ -0,0 +1,85 @@ +/* + Character analysis operators + + Examples using the character analysis operators. + Send any byte and the sketch will tell you about it. + + created 29 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + */ + +void setup() { + // Open serial communications: + Serial.begin(9600); + + // send an intro: + Serial.println("send any byte and I'll tell you everything I can about it"); + Serial.println(); +} + +void loop() { + // get any incoming bytes: + if (Serial.available() > 0) { + int thisChar = Serial.read(); + + // say what was sent: + Serial.print("You sent me: \'"); + Serial.write(thisChar); + Serial.print("\' ASCII Value: "); + Serial.println(thisChar); + + // analyze what was sent: + if(isAlphaNumeric(thisChar)) { + Serial.println("it's alphanumeric"); + } + if(isAlpha(thisChar)) { + Serial.println("it's alphabetic"); + } + if(isAscii(thisChar)) { + Serial.println("it's ASCII"); + } + if(isWhitespace(thisChar)) { + Serial.println("it's whitespace"); + } + if(isControl(thisChar)) { + Serial.println("it's a control character"); + } + if(isDigit(thisChar)) { + Serial.println("it's a numeric digit"); + } + if(isGraph(thisChar)) { + Serial.println("it's a printable character that's not whitespace"); + } + if(isLowerCase(thisChar)) { + Serial.println("it's lower case"); + } + if(isPrintable(thisChar)) { + Serial.println("it's printable"); + } + if(isPunct(thisChar)) { + Serial.println("it's punctuation"); + } + if(isSpace(thisChar)) { + Serial.println("it's a space character"); + } + if(isUpperCase(thisChar)) { + Serial.println("it's upper case"); + } + if (isHexadecimalDigit(thisChar)) { + Serial.println("it's a valid hexadecimaldigit (i.e. 0 - 9, a - F, or A - F)"); + } + + // add some space and ask for another byte: + Serial.println(); + Serial.println("Give me another byte:"); + Serial.println(); + } +} + + + + + + diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringAdditionOperator/StringAdditionOperator.pde b/arduino-0022-linux-x64/examples/8.Strings/StringAdditionOperator/StringAdditionOperator.pde new file mode 100644 index 0000000..fe631b9 --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringAdditionOperator/StringAdditionOperator.pde @@ -0,0 +1,61 @@ +/* + Adding Strings together + + Examples of how to add strings together + You can also add several different data types to string, as shown here: + + created 27 July 2010 + modified 4 Sep 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringAdditionOperator + + This example code is in the public domain. + */ + +// declare three strings: +String stringOne, stringTwo, stringThree; + +void setup() { + Serial.begin(9600); + stringOne = String("stringThree = "); + stringTwo = String("this string"); + stringThree = String (); + Serial.println("\n\nAdding strings together (concatenation):"); +} + +void loop() { + // adding a constant integer to a string: + stringThree = stringOne + 123; + Serial.println(stringThree); // prints "stringThree = 123" + + // adding a constant long interger to a string: + stringThree = stringOne + 123456789; + Serial.println(stringThree); // prints " You added 123456789" + + // adding a constant character to a string: + stringThree = stringOne + 'A'; + Serial.println(stringThree); // prints "You added A" + + // adding a constant string to a string: + stringThree = stringOne + "abc"; + Serial.println(stringThree); // prints "You added abc" + + stringThree = stringOne + stringTwo; + Serial.println(stringThree); // prints "You added this string" + + // adding a variable integer to a string: + int sensorValue = analogRead(A0); + stringOne = "Sensor value: "; + stringThree = stringOne + sensorValue; + Serial.println(stringThree); // prints "Sensor Value: 401" or whatever value analogRead(A0) has + + // adding a variable long integer to a string: + long currentTime = millis(); + stringOne="millis() value: "; + stringThree = stringOne + millis(); + Serial.println(stringThree); // prints "The millis: 345345" or whatever value currentTime has + + // do nothing while true: + while(true); +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringAppendOperator/StringAppendOperator.pde b/arduino-0022-linux-x64/examples/8.Strings/StringAppendOperator/StringAppendOperator.pde new file mode 100644 index 0000000..6807381 --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringAppendOperator/StringAppendOperator.pde @@ -0,0 +1,64 @@ +/* + Appending to Strings using the += operator and concat() + + Examples of how to append different data types to strings + + created 27 July 2010 + modified 4 Sep 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringAppendOperator + + This example code is in the public domain. + */ +String stringOne, stringTwo; + +void setup() { + Serial.begin(9600); + stringOne = String("Sensor "); + stringTwo = String("value"); + Serial.println("\n\nAppending to a string:"); +} + +void loop() { + Serial.println(stringOne); // prints "Sensor " + + // adding a string to a string: + stringOne += stringTwo; + Serial.println(stringOne); // prints "Sensor value" + + // adding a constant string to a string: + stringOne += " for input "; + Serial.println(stringOne); // prints "Sensor value for input" + + // adding a constant character to a string: + stringOne += 'A'; + Serial.println(stringOne); // prints "Sensor value for input A" + + // adding a constant integer to a string: + stringOne += 0; + Serial.println(stringOne); // prints "Sensor value for input A0" + + // adding a constant string to a string: + stringOne += ": "; + Serial.println(stringOne); // prints "Sensor value for input" + + // adding a variable integer to a string: + stringOne += analogRead(A0); + Serial.println(stringOne); // prints "Sensor value for input A0: 456" or whatever analogRead(A0) is + + Serial.println("\n\nchanging the Strings' values"); + stringOne = "A long integer: "; + stringTwo = "The millis(): "; + + // adding a constant long integer to a string: + stringOne += 123456789; + Serial.println(stringOne); // prints "A long integer: 123456789" + + // using concat() to add a long variable to a string: + stringTwo.concat(millis()); + Serial.println(stringTwo); // prints "The millis(): 43534" or whatever the value of the millis() is + + // do nothing while true: + while(true); +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringCaseChanges/StringCaseChanges.pde b/arduino-0022-linux-x64/examples/8.Strings/StringCaseChanges/StringCaseChanges.pde new file mode 100644 index 0000000..c180014 --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringCaseChanges/StringCaseChanges.pde @@ -0,0 +1,35 @@ +/* + String Case changes + + Examples of how to change the case of a string + + created 27 July 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringCaseChanges + + This example code is in the public domain. + */ + +void setup() { + Serial.begin(9600); + Serial.println("\n\nString case changes:"); +} + +void loop() { + // toUpperCase() changes all letters to upper case: + String stringOne = ""; + Serial.println(stringOne); + stringOne = (stringOne.toUpperCase()); + Serial.println(stringOne); + + // toLowerCase() changes all letters to lower case: + String stringTwo = ""; + Serial.println(stringTwo); + stringTwo = stringTwo.toLowerCase(); + Serial.println(stringTwo); + + + // do nothing while true: + while(true); +} diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringCharacters/StringCharacters.pde b/arduino-0022-linux-x64/examples/8.Strings/StringCharacters/StringCharacters.pde new file mode 100644 index 0000000..8b8d9bb --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringCharacters/StringCharacters.pde @@ -0,0 +1,37 @@ +/* + String charAt() and setCharAt() + + Examples of how to get and set characters of a String + + created 27 July 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringCharacters + + This example code is in the public domain. + */ + +void setup() { + Serial.begin(9600); + Serial.println("\n\nString charAt() and setCharAt():"); +} + +void loop() { + // make a string to report a sensor reading: + String reportString = "SensorReading: 456"; + Serial.println(reportString); + + // the reading's most significant digit is at position 15 in the reportString: + String mostSignificantDigit = reportString.charAt(15); + Serial.println("Most significant digit of the sensor reading is: " + mostSignificantDigit); + +// add blank space: + Serial.println(); + + // you can alo set the character of a string. Change the : to a = character + reportString.setCharAt(13, '='); + Serial.println(reportString); + + // do nothing while true: + while(true); +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringComparisonOperators/StringComparisonOperators.pde b/arduino-0022-linux-x64/examples/8.Strings/StringComparisonOperators/StringComparisonOperators.pde new file mode 100644 index 0000000..3122b0b --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringComparisonOperators/StringComparisonOperators.pde @@ -0,0 +1,124 @@ +/* + Comparing Strings + + Examples of how to compare strings using the comparison operators + + created 27 July 2010 + modified 4 Sep 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringComparisonOperators + + This example code is in the public domain. + */ + +String stringOne, stringTwo; + +void setup() { + Serial.begin(9600); + stringOne = String("this"); + stringTwo = String("that"); + Serial.println("\n\nComparing Strings:"); + +} + +void loop() { + // two strings equal: + if (stringOne == "this") { + Serial.println("StringOne == \"this\""); + } + // two strings not equal: + if (stringOne != stringTwo) { + Serial.println(stringOne + " =! " + stringTwo); + } + + // two strings not equal (case sensitivity matters): + stringOne = "This"; + stringTwo = "this"; + if (stringOne != stringTwo) { + Serial.println(stringOne + " =! " + stringTwo); + } + // you can also use equals() to see if two strings are the same: + if (stringOne.equals(stringTwo)) { + Serial.println(stringOne + " equals " + stringTwo); + } + else { + Serial.println(stringOne + " does not equal " + stringTwo); + } + + // or perhaps you want to ignore case: + if (stringOne.equalsIgnoreCase(stringTwo)) { + Serial.println(stringOne + " equals (ignoring case) " + stringTwo); + } + else { + Serial.println(stringOne + " does not equal (ignoring case) " + stringTwo); + } + + // a numeric string compared to the number it represents: + stringOne = "1"; + int numberOne = 1; + if (stringOne == numberOne) { + Serial.println(stringOne + " = " + numberOne); + } + + + + // two numeric strings compared: + stringOne = "2"; + stringTwo = "1"; + if (stringOne >= stringTwo) { + Serial.println(stringOne + " >= " + stringTwo); + } + + // comparison operators can be used to compare strings for alphabetic sorting too: + stringOne = String("Brown"); + if (stringOne < "Charles") { + Serial.println(stringOne + " < Charles"); + } + + if (stringOne > "Adams") { + Serial.println(stringOne + " > Adams"); + } + + if (stringOne <= "Browne") { + Serial.println(stringOne + " <= Browne"); + } + + + if (stringOne >= "Brow") { + Serial.println(stringOne + " >= Brow"); + } + + // the compareTo() operator also allows you to compare strings + // it evaluates on the first character that's different. + // if the first character of the string you're comparing to + // comes first in alphanumeric order, then compareTo() is greater than 0: + stringOne = "Cucumber"; + stringTwo = "Cucuracha"; + if (stringOne.compareTo(stringTwo) < 0 ) { + Serial.println(stringOne + " comes before " + stringTwo); + } + else { + Serial.println(stringOne + " comes after " + stringTwo); + } + + delay(10000); // because the next part is a loop: + + // compareTo() is handy when you've got strings with numbers in them too: + + while (true) { + stringOne = "Sensor: "; + stringTwo= "Sensor: "; + + stringOne += analogRead(A0); + stringTwo += analogRead(A5); + + if (stringOne.compareTo(stringTwo) < 0 ) { + Serial.println(stringOne + " comes before " + stringTwo); + } + else { + Serial.println(stringOne + " comes after " + stringTwo); + + } + } +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringConstructors/StringConstructors.pde b/arduino-0022-linux-x64/examples/8.Strings/StringConstructors/StringConstructors.pde new file mode 100644 index 0000000..94ae2dc --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringConstructors/StringConstructors.pde @@ -0,0 +1,64 @@ +/* + String constructors + + Examples of how to create strings from other data types + + created 27 July 2010 + modified 4 Sep 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringConstructors + + This example code is in the public domain. + */ + +void setup() { + Serial.begin(9600); +} + +void loop() { + // using a constant String: + String stringOne = "Hello String"; + Serial.println(stringOne); // prints "Hello String" + + // converting a constant char into a String: + stringOne = String('a'); + Serial.println(stringOne); // prints "a" + + // converting a constant string into a String object: + String stringTwo = String("This is a string"); + Serial.println(stringTwo); // prints "This is a string" + + // concatenating two strings: + stringOne = String(stringTwo + " with more"); + // prints "This is a string with more": + Serial.println(stringOne); + + // using a constant integer: + stringOne = String(13); + Serial.println(stringOne); // prints "13" + + // using an int and a base: + stringOne = String(analogRead(A0), DEC); + // prints "453" or whatever the value of analogRead(A0) is + Serial.println(stringOne); + + // using an int and a base (hexadecimal): + stringOne = String(45, HEX); + // prints "2d", which is the hexadecimal version of decimal 45: + Serial.println(stringOne); + + // using an int and a base (binary) + stringOne = String(255, BIN); + // prints "11111111" which is the binary value of 255 + Serial.println(stringOne); + + // using a long and a base: + stringOne = String(millis(), DEC); + // prints "123456" or whatever the value of millis() is: + Serial.println(stringOne); + + // do nothing while true: + while(true); + +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringIndexOf/StringIndexOf.pde b/arduino-0022-linux-x64/examples/8.Strings/StringIndexOf/StringIndexOf.pde new file mode 100644 index 0000000..a60d127 --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringIndexOf/StringIndexOf.pde @@ -0,0 +1,58 @@ +/* + String indexOf() and lastIndexOf() functions + + Examples of how to evaluate, look for, and replace characters in a String + + created 27 July 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringIndexOf + + This example code is in the public domain. + */ + +void setup() { + Serial.begin(9600); + Serial.println("\n\nString indexOf() and lastIndexOf() functions:"); + +} + +void loop() { + // indexOf() returns the position (i.e. index) of a particular character + // in a string. For example, if you were parsing HTML tags, you could use it: + String stringOne = ""; + int firstClosingBracket = stringOne.indexOf('>'); + Serial.println("The index of > in the string " + stringOne + " is " + firstClosingBracket); + + stringOne = ""; + int secondOpeningBracket = firstClosingBracket + 1; + int secondClosingBracket = stringOne.indexOf('>', secondOpeningBracket ); + Serial.println("The index of the second > in the string " + stringOne + " is " + secondClosingBracket); + + // you can also use indexOf() to search for Strings: + stringOne = ""; + int bodyTag = stringOne.indexOf(""); + Serial.println("The index of the body tag in the string " + stringOne + " is " + bodyTag); + + stringOne = "
  • item
  • item
  • item
"; + int firstListItem = stringOne.indexOf("
  • "); + int secondListItem = stringOne.indexOf("item", firstListItem + 1 ); + Serial.println("The index of the second list item in the string " + stringOne + " is " + secondClosingBracket); + + // lastIndexOf() gives you the last occurrence of a character or string: + int lastOpeningBracket = stringOne.lastIndexOf('<'); + Serial.println("The index of the last < in the string " + stringOne + " is " + lastOpeningBracket); + + int lastListItem = stringOne.lastIndexOf("
  • "); + Serial.println("The index of the last list item in the string " + stringOne + " is " + lastListItem); + + +// lastIndexOf() can also search for a string: + stringOne = "

    Lorem ipsum dolor sit amet

    Ipsem

    Quod

    "; + int lastParagraph = stringOne.lastIndexOf(" 0) { + char inChar = Serial.read(); + txtMsg += inChar; + } + + // print the message and a notice if it's changed: + if (txtMsg.length() != lastStringLength) { + Serial.println(txtMsg); + Serial.println(txtMsg.length()); + // if the String's longer than 140 characters, complain: + if (txtMsg.length() < 140) { + Serial.println("That's a perfectly acceptable text message"); + } + else { + Serial.println("That's too long for a text message."); + } + // note the length for next time through the loop: + lastStringLength = txtMsg.length(); + } +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringLengthTrim/StringLengthTrim.pde b/arduino-0022-linux-x64/examples/8.Strings/StringLengthTrim/StringLengthTrim.pde new file mode 100644 index 0000000..1737b0d --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringLengthTrim/StringLengthTrim.pde @@ -0,0 +1,34 @@ +/* + String length() and trim() + + Examples of how to use length() and trim() in a String + + created 27 July 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringLengthTrim + + This example code is in the public domain. + */ + +void setup() { + Serial.begin(9600); + Serial.println("\n\nString length() and trim():"); +} + +void loop() { + // here's a String with empty spaces at the end (called white space): + String stringOne = "Hello! "; + Serial.print(stringOne); + Serial.print("<--- end of string. Length: "); + Serial.println(stringOne.length()); + + // trim the white space off the string: + stringOne = stringOne.trim(); + Serial.print(stringOne); + Serial.print("<--- end of trimmed string. Length: "); + Serial.println(stringOne.length()); + + // do nothing while true: + while(true); +} diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringReplace/StringReplace.pde b/arduino-0022-linux-x64/examples/8.Strings/StringReplace/StringReplace.pde new file mode 100644 index 0000000..c906167 --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringReplace/StringReplace.pde @@ -0,0 +1,35 @@ +/* + String replace() + + Examples of how to replace characters or substrings of a string + + created 27 July 2010 + by Tom Igoe + + http://arduino.cc/en/Tutorial/StringReplace + + This example code is in the public domain. + */ + +void setup() { + Serial.begin(9600); + Serial.println("\n\nString replace:"); +} + +void loop() { + String stringOne = ""; + Serial.println(stringOne); + // replace() changes all instances of one substring with another: + String stringTwo = stringOne.replace("<", " 0) { + int inChar = Serial.read(); + if (isDigit(inChar)) { + // convert the incoming byte to a char + // and add it to the string: + inString += (char)inChar; + } + // if you get a newline, print the string, + // then the string's value: + if (inChar == '\n') { + Serial.print("Value:"); + Serial.println(inString.toInt()); + Serial.print("String: "); + Serial.println(inString); + // clear the string for new input: + inString = ""; + } + } +} + + + + diff --git a/arduino-0022-linux-x64/examples/8.Strings/StringToIntRGB/StringToIntRGB.pde b/arduino-0022-linux-x64/examples/8.Strings/StringToIntRGB/StringToIntRGB.pde new file mode 100644 index 0000000..342739d --- /dev/null +++ b/arduino-0022-linux-x64/examples/8.Strings/StringToIntRGB/StringToIntRGB.pde @@ -0,0 +1,230 @@ +/* + Serial RGB controller + + Reads a serial input string looking for three comma-separated + integers with a newline at the end. Values should be between + 0 and 255. The sketch uses those values to set the color + of an RGB LED attached to pins 9 - 11. + + The circuit: + * Common-anode RGB LED cathodes attached to pins 9 - 11 + * LED anode connected to pin 13 + + To turn on any given channel, set the pin LOW. + To turn off, set the pin HIGH. The higher the analogWrite level, + the lower the brightness. + + created 29 Nov 2010 + by Tom Igoe + + This example code is in the public domain. + */ + +String inString = ""; // string to hold input +int currentColor = 0; +int red, green, blue = 0; + +void setup() { + // Initialize serial communications: + Serial.begin(9600); + // set LED cathode pins as outputs: + pinMode(9, OUTPUT); + pinMode(10, OUTPUT); + pinMode(11, OUTPUT); + // turn on pin 13 to power the LEDs: + pinMode(13, OUTPUT); + digitalWrite(13, HIGH); +} + +void loop() { + int inChar; + + // Read serial input: + if (Serial.available() > 0) { + inChar = Serial.read(); + } + + if (isDigit(inChar)) { + // convert the incoming byte to a char + // and add it to the string: + inString += (char)inChar; + } + + // if you get a comma, convert to a number, + // set the appropriate color, and increment + // the color counter: + if (inChar == ',') { + // do something different for each value of currentColor: + switch (currentColor) { + case 0: // 0 = red + red = inString.toInt(); + // clear the string for new input: + inString = ""; + break; + case 1: // 1 = green: + green = inString.toInt(); + // clear the string for new input: + inString = ""; + break; + } + currentColor++; + } + // if you get a newline, you know you've got + // the last color, i.e. blue: + if (inChar == '\n') { + blue = inString.toInt(); + + // set the levels of the LED. + // subtract value from 255 because a higher + // analogWrite level means a dimmer LED, since + // you're raising the level on the anode: + analogWrite(11, 255 - red); + analogWrite(9, 255 - green); + analogWrite(10, 255 - blue); + + // print the colors: + Serial.print("Red: "); + Serial.print(red); + Serial.print(", Green: "); + Serial.print(green); + Serial.print(", Blue: "); + Serial.println(blue); + + // clear the string for new input: + inString = ""; + // reset the color counter: + currentColor = 0; + + } + +} + + +/* +Here's a Processing sketch that will draw a color wheel and send a serial +string with the color you click on: + +// Subtractive Color Wheel with Serial +// Based on a Processing example by Ira Greenberg. +// Serial output added by Tom Igoe +// +// The primaries are red, yellow, and blue. The secondaries are green, +// purple, and orange. The tertiaries are yellow-orange, red-orange, +// red-purple, blue-purple, blue-green, and yellow-green. +// +// Create a shade or tint of the subtractive color wheel using +// SHADE or TINT parameters. + +// Updated 29 November 2010. + + + +import processing.serial.*; + +int segs = 12; +int steps = 6; +float rotAdjust = TWO_PI / segs / 2; +float radius; +float segWidth; +float interval = TWO_PI / segs; + +Serial myPort; + +void setup() { + size(200, 200); + background(127); + smooth(); + ellipseMode(RADIUS); + noStroke(); + // make the diameter 90% of the sketch area + radius = min(width, height) * 0.45; + segWidth = radius / steps; + + // swap which line is commented out to draw the other version + // drawTintWheel(); + drawShadeWheel(); + // open the first serial port in your computer's list + myPort = new Serial(this, Serial.list()[0], 9600); +} + + +void drawShadeWheel() { + for (int j = 0; j < steps; j++) { + color[] cols = { + color(255-(255/steps)*j, 255-(255/steps)*j, 0), + color(255-(255/steps)*j, (255/1.5)-((255/1.5)/steps)*j, 0), + color(255-(255/steps)*j, (255/2)-((255/2)/steps)*j, 0), + color(255-(255/steps)*j, (255/2.5)-((255/2.5)/steps)*j, 0), + color(255-(255/steps)*j, 0, 0), + color(255-(255/steps)*j, 0, (255/2)-((255/2)/steps)*j), + color(255-(255/steps)*j, 0, 255-(255/steps)*j), + color((255/2)-((255/2)/steps)*j, 0, 255-(255/steps)*j), + color(0, 0, 255-(255/steps)*j), + color(0, 255-(255/steps)*j, (255/2.5)-((255/2.5)/steps)*j), + color(0, 255-(255/steps)*j, 0), + color((255/2)-((255/2)/steps)*j, 255-(255/steps)*j, 0) + }; + for (int i = 0; i < segs; i++) { + fill(cols[i]); + arc(width/2, height/2, radius, radius, + interval*i+rotAdjust, interval*(i+1)+rotAdjust); + } + radius -= segWidth; + } +} + + +void drawTintWheel() { + for (int j = 0; j < steps; j++) { + color[] cols = { + color((255/steps)*j, (255/steps)*j, 0), + color((255/steps)*j, ((255/1.5)/steps)*j, 0), + color((255/steps)*j, ((255/2)/steps)*j, 0), + color((255/steps)*j, ((255/2.5)/steps)*j, 0), + color((255/steps)*j, 0, 0), + color((255/steps)*j, 0, ((255/2)/steps)*j), + color((255/steps)*j, 0, (255/steps)*j), + color(((255/2)/steps)*j, 0, (255/steps)*j), + color(0, 0, (255/steps)*j), + color(0, (255/steps)*j, ((255/2.5)/steps)*j), + color(0, (255/steps)*j, 0), + color(((255/2)/steps)*j, (255/steps)*j, 0) + }; + for (int i = 0; i < segs; i++) { + fill(cols[i]); + arc(width/2, height/2, radius, radius, + interval*i+rotAdjust, interval*(i+1)+rotAdjust); + } + radius -= segWidth; + } +} + +void draw() { + // nothing happens here +} + +void mouseReleased() { + // get the color of the mouse position's pixel: + color targetColor = get(mouseX, mouseY); + // get the component values: + int r = int(red(targetColor)); + int g = int(green(targetColor)); + int b = int(blue(targetColor)); + // make a comma-separated string: + String colorString = r + "," + g + "," + b + "\n"; + // send it out the serial port: + myPort.write(colorString ); +} + + +*/ + + + + + + + + + + diff --git a/arduino-0018-linux-x64/examples/ArduinoISP/ArduinoISP.pde b/arduino-0022-linux-x64/examples/ArduinoISP/ArduinoISP.pde similarity index 99% rename from arduino-0018-linux-x64/examples/ArduinoISP/ArduinoISP.pde rename to arduino-0022-linux-x64/examples/ArduinoISP/ArduinoISP.pde index 0012c69..5111c35 100644 --- a/arduino-0018-linux-x64/examples/ArduinoISP/ArduinoISP.pde +++ b/arduino-0022-linux-x64/examples/ArduinoISP/ArduinoISP.pde @@ -24,10 +24,8 @@ // - The SPI functions herein were developed for the AVR910_ARD programmer // - More information at http://code.google.com/p/mega-isp -#define SCK 13 -#define MISO 12 -#define MOSI 11 -#define RESET 10 +#include "pins_arduino.h" // defines SS,MOSI,MISO,SCK +#define RESET SS #define LED_HB 9 #define LED_ERR 8 diff --git a/arduino-0018-linux-x64/hardware/arduino/boards.txt b/arduino-0022-linux-x64/hardware/arduino/boards.txt similarity index 64% rename from arduino-0018-linux-x64/hardware/arduino/boards.txt rename to arduino-0022-linux-x64/hardware/arduino/boards.txt index 4ae4ac9..0ae40d3 100644 --- a/arduino-0018-linux-x64/hardware/arduino/boards.txt +++ b/arduino-0022-linux-x64/hardware/arduino/boards.txt @@ -1,5 +1,22 @@ ############################################################## +uno.name=Arduino Uno +uno.upload.protocol=stk500 +uno.upload.maximum_size=32256 +uno.upload.speed=115200 +uno.bootloader.low_fuses=0xff +uno.bootloader.high_fuses=0xde +uno.bootloader.extended_fuses=0x05 +uno.bootloader.path=optiboot +uno.bootloader.file=optiboot_atmega328.hex +uno.bootloader.unlock_bits=0x3F +uno.bootloader.lock_bits=0x0F +uno.build.mcu=atmega328p +uno.build.f_cpu=16000000L +uno.build.core=arduino + +############################################################## + atmega328.name=Arduino Duemilanove or Nano w/ ATmega328 atmega328.upload.protocol=stk500 @@ -40,7 +57,27 @@ diecimila.build.core=arduino ############################################################## -mega.name=Arduino Mega +mega2560.name=Arduino Mega 2560 + +mega2560.upload.protocol=stk500v2 +mega2560.upload.maximum_size=258048 +mega2560.upload.speed=115200 + +mega2560.bootloader.low_fuses=0xFF +mega2560.bootloader.high_fuses=0xD8 +mega2560.bootloader.extended_fuses=0xFD +mega2560.bootloader.path=stk500v2 +mega2560.bootloader.file=stk500boot_v2_mega2560.hex +mega2560.bootloader.unlock_bits=0x3F +mega2560.bootloader.lock_bits=0x0F + +mega2560.build.mcu=atmega2560 +mega2560.build.f_cpu=16000000L +mega2560.build.core=arduino + +############################################################## + +mega.name=Arduino Mega (ATmega1280) mega.upload.protocol=stk500 mega.upload.maximum_size=126976 @@ -80,7 +117,48 @@ mini.build.core=arduino ############################################################## -bt.name=Arduino BT +fio.name=Arduino Fio + +fio.upload.protocol=stk500 +fio.upload.maximum_size=30720 +fio.upload.speed=57600 + +fio.bootloader.low_fuses=0xFF +fio.bootloader.high_fuses=0xDA +fio.bootloader.extended_fuses=0x05 +fio.bootloader.path=arduino:atmega +fio.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex +fio.bootloader.unlock_bits=0x3F +fio.bootloader.lock_bits=0x0F + +fio.build.mcu=atmega328p +fio.build.f_cpu=8000000L +fio.build.core=arduino:arduino + +############################################################## + +bt328.name=Arduino BT w/ ATmega328 + +bt328.upload.protocol=stk500 +bt328.upload.maximum_size=28672 +bt328.upload.speed=19200 +bt328.upload.disable_flushing=true + +bt328.bootloader.low_fuses=0xff +bt328.bootloader.high_fuses=0xd8 +bt328.bootloader.extended_fuses=0x05 +bt328.bootloader.path=bt +bt328.bootloader.file=ATmegaBOOT_168_atmega328_bt.hex +bt328.bootloader.unlock_bits=0x3F +bt328.bootloader.lock_bits=0x0F + +bt328.build.mcu=atmega328p +bt328.build.f_cpu=16000000L +bt328.build.core=arduino + +############################################################## + +bt.name=Arduino BT w/ ATmega168 bt.upload.protocol=stk500 bt.upload.maximum_size=14336 @@ -141,6 +219,46 @@ lilypad.build.core=arduino ############################################################## +pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 + +pro5v328.upload.protocol=stk500 +pro5v328.upload.maximum_size=30720 +pro5v328.upload.speed=57600 + +pro5v328.bootloader.low_fuses=0xFF +pro5v328.bootloader.high_fuses=0xDA +pro5v328.bootloader.extended_fuses=0x05 +pro5v328.bootloader.path=atmega +pro5v328.bootloader.file=ATmegaBOOT_168_atmega328.hex +pro5v328.bootloader.unlock_bits=0x3F +pro5v328.bootloader.lock_bits=0x0F + +pro5v328.build.mcu=atmega328p +pro5v328.build.f_cpu=16000000L +pro5v328.build.core=arduino + +############################################################## + +pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 + +pro5v.upload.protocol=stk500 +pro5v.upload.maximum_size=14336 +pro5v.upload.speed=19200 + +pro5v.bootloader.low_fuses=0xff +pro5v.bootloader.high_fuses=0xdd +pro5v.bootloader.extended_fuses=0x00 +pro5v.bootloader.path=atmega +pro5v.bootloader.file=ATmegaBOOT_168_diecimila.hex +pro5v.bootloader.unlock_bits=0x3F +pro5v.bootloader.lock_bits=0x0F + +pro5v.build.mcu=atmega168 +pro5v.build.f_cpu=16000000L +pro5v.build.core=arduino + +############################################################## + pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 pro328.upload.protocol=stk500 diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega1280.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_diecimila.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_ng.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_ng.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_ng.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_ng.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/Makefile b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/Makefile old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega/Makefile rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega/Makefile diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.c b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.c old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.c rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.c diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega8/ATmegaBOOT.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega8/Makefile b/arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega8/Makefile similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/atmega8/Makefile rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/atmega8/Makefile diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c b/arduino-0022-linux-x64/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c similarity index 97% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c index a85dc9a..c73eefa 100644 --- a/arduino-0018-linux-x64/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c @@ -79,7 +79,7 @@ /* the current avr-libc eeprom functions do not support the ATmega168 */ /* own eeprom write/read functions are used instead */ -#ifndef __AVR_ATmega168__ +#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) #include #endif @@ -189,6 +189,11 @@ #define SIG3 0x06 #define PAGE_SIZE 0x40U //64 words +#elif defined __AVR_ATmega328P__ +#define SIG2 0x95 +#define SIG3 0x0F +#define PAGE_SIZE 0x40U //64 words + #elif defined __AVR_ATmega162__ #define SIG2 0x94 #define SIG3 0x04 @@ -330,7 +335,8 @@ int main(void) UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSRA = 0x00; UCSRB = _BV(TXEN)|_BV(RXEN); -#elif defined __AVR_ATmega168__ +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) + UBRR0H = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1) >> 8; UBRR0L = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1); @@ -551,7 +557,7 @@ putch(0x0D); if (getch() == ' ') { if (flags.eeprom) { //Write to EEPROM one byte at a time for(w=0;w $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.srec: %.elf + $(OBJCOPY) -j .text -j .data -O srec $< $@ + +%.bin: %.elf + $(OBJCOPY) -j .text -j .data -O binary $< $@ + diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/lilypad/LilyPadBOOT_168.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/lilypad/LilyPadBOOT_168.hex similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/lilypad/LilyPadBOOT_168.hex rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/lilypad/LilyPadBOOT_168.hex diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/lilypad/src/ATmegaBOOT.c b/arduino-0022-linux-x64/hardware/arduino/bootloaders/lilypad/src/ATmegaBOOT.c similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/lilypad/src/ATmegaBOOT.c rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/lilypad/src/ATmegaBOOT.c diff --git a/arduino-0018-linux-x64/hardware/arduino/bootloaders/lilypad/src/Makefile b/arduino-0022-linux-x64/hardware/arduino/bootloaders/lilypad/src/Makefile similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/bootloaders/lilypad/src/Makefile rename to arduino-0022-linux-x64/hardware/arduino/bootloaders/lilypad/src/Makefile diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/Makefile b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/Makefile new file mode 100644 index 0000000..0fd6005 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/Makefile @@ -0,0 +1,239 @@ +# Makefile for ATmegaBOOT +# E.Lins, 18.7.2005 +# $Id$ +# +# Instructions +# +# To make bootloader .hex file: +# make diecimila +# make lilypad +# make ng +# etc... +# +# To burn bootloader .hex file: +# make diecimila_isp +# make lilypad_isp +# make ng_isp +# etc... + +# program name should not be changed... +PROGRAM = optiboot + +# enter the parameters for the avrdude isp tool +ISPTOOL = stk500v2 +ISPPORT = usb +ISPSPEED = -b 115200 + +MCU_TARGET = atmega168 +LDSECTION = --section-start=.text=0x3e00 + +# the efuse should really be 0xf8; since, however, only the lower +# three bits of that byte are used on the atmega168, avrdude gets +# confused if you specify 1's for the higher bits, see: +# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/ +# +# similarly, the lock bits should be 0xff instead of 0x3f (to +# unlock the bootloader section) and 0xcf instead of 0x0f (to +# lock it), but since the high two bits of the lock byte are +# unused, avrdude would get confused. + +ISPFUSES = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ +-e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m +ISPFLASH = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \ +-U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m + +STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe" +STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \ +-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt +STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt + +OBJ = $(PROGRAM).o +OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls + +DEFS = +LIBS = + +CC = avr-gcc + +# Override is only needed by avr-lib build system. + +override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS) +override LDFLAGS = -Wl,$(LDSECTION) -Wl,--relax -nostartfiles + +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump + +# 20MHz clocked platforms +# +# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue) +# + +pro20: TARGET = pro_20mhz +pro20: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' +pro20: AVR_FREQ = 20000000L +pro20: $(PROGRAM)_pro_20mhz.hex +pro20: $(PROGRAM)_pro_20mhz.lst + +pro20_isp: pro20 +pro20_isp: TARGET = pro_20mhz +pro20_isp: HFUSE = DD # 2.7V brownout +pro20_isp: LFUSE = C6 # Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro20_isp: EFUSE = 02 # 512 byte boot +pro20_isp: isp + +# 16MHz clocked platforms +# +# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue) +# + +pro16: TARGET = pro_16MHz +pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' +pro16: AVR_FREQ = 16000000L +pro16: $(PROGRAM)_pro_16MHz.hex +pro16: $(PROGRAM)_pro_16MHz.lst + +pro16_isp: pro16 +pro16_isp: TARGET = pro_16MHz +pro16_isp: HFUSE = DD # 2.7V brownout +pro16_isp: LFUSE = C6 # Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro16_isp: EFUSE = 02 # 512 byte boot +pro16_isp: isp + +# Diecimila and NG use identical bootloaders +# +diecimila: TARGET = diecimila +diecimila: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' +diecimila: AVR_FREQ = 16000000L +diecimila: $(PROGRAM)_diecimila.hex +diecimila: $(PROGRAM)_diecimila.lst + +diecimila_isp: diecimila +diecimila_isp: TARGET = diecimila +diecimila_isp: HFUSE = DD # 2.7V brownout +diecimila_isp: LFUSE = FF # Low power xtal (16MHz) 16KCK/14CK+65ms +diecimila_isp: EFUSE = 02 # 512 byte boot +diecimila_isp: isp + +atmega328: TARGET = atmega328 +atmega328: MCU_TARGET = atmega328p +atmega328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' +atmega328: AVR_FREQ = 16000000L +atmega328: LDSECTION = --section-start=.text=0x7e00 +atmega328: $(PROGRAM)_atmega328.hex +atmega328: $(PROGRAM)_atmega328.lst + +atmega328_isp: atmega328 +atmega328_isp: TARGET = atmega328 +atmega328_isp: MCU_TARGET = atmega328p +atmega328_isp: HFUSE = DE # 512 byte boot +atmega328_isp: LFUSE = FF # Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_isp: EFUSE = 05 # 2.7V brownout +atmega328_isp: isp + +# 8MHz clocked platforms +# +# These are capable of 115200 baud +# + +lilypad: TARGET = lilypad +lilypad: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=115200' +lilypad: AVR_FREQ = 8000000L +lilypad: $(PROGRAM)_lilypad.hex +lilypad: $(PROGRAM)_lilypad.lst + +lilypad_isp: lilypad +lilypad_isp: TARGET = lilypad +lilypad_isp: HFUSE = DD # 2.7V brownout +lilypad_isp: LFUSE = E2 # Internal 8MHz osc (8MHz) Slow rising power +lilypad_isp: EFUSE = 02 # 512 byte boot +lilypad_isp: isp + +lilypad_resonator: TARGET = lilypad_resonator +lilypad_resonator: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=115200' +lilypad_resonator: AVR_FREQ = 8000000L +lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex +lilypad_resonator: $(PROGRAM)_lilypad_resonator.lst + +lilypad_resonator_isp: lilypad_resonator +lilypad_resonator_isp: TARGET = lilypad_resonator +lilypad_resonator_isp: HFUSE = DD # 2.7V brownout +lilypad_resonator_isp: LFUSE = C6 # Full swing xtal (20MHz) 258CK/14CK+4.1ms +lilypad_resonator_isp: EFUSE = 02 # 512 byte boot +lilypad_resonator_isp: isp + +pro8: TARGET = pro_8MHz +pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=115200' +pro8: AVR_FREQ = 8000000L +pro8: $(PROGRAM)_pro_8MHz.hex +pro8: $(PROGRAM)_pro_8MHz.lst + +pro8_isp: pro8 +pro8_isp: TARGET = pro_8MHz +pro8_isp: HFUSE = DD # 2.7V brownout +pro8_isp: LFUSE = C6 # Full swing xtal (20MHz) 258CK/14CK+4.1ms +pro8_isp: EFUSE = 02 # 512 byte boot +pro8_isp: isp + +atmega328_pro8: TARGET = atmega328_pro_8MHz +atmega328_pro8: MCU_TARGET = atmega328p +atmega328_pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' +atmega328_pro8: AVR_FREQ = 8000000L +atmega328_pro8: LDSECTION = --section-start=.text=0x7e00 +atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex +atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.lst + +atmega328_pro8_isp: atmega328_pro8 +atmega328_pro8_isp: TARGET = atmega328_pro_8MHz +atmega328_pro8_isp: MCU_TARGET = atmega328p +atmega328_pro8_isp: HFUSE = DE # 512 byte boot +atmega328_pro8_isp: LFUSE = FF # Low power xtal (16MHz) 16KCK/14CK+65ms +atmega328_pro8_isp: EFUSE = 05 # 2.7V brownout +atmega328_pro8_isp: isp + +# 1MHz clocked platforms +# +# These are capable of 9600 baud +# + +luminet: TARGET = luminet +luminet: MCU_TARGET = attiny84 +luminet: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=9600' +luminet: CFLAGS += '-DVIRTUAL_BOOT_PARTITION' +luminet: AVR_FREQ = 1000000L +luminet: LDSECTION = --section-start=.text=0x1d00 +luminet: $(PROGRAM)_luminet.hex +luminet: $(PROGRAM)_luminet.lst + +luminet_isp: luminet +luminet_isp: TARGET = luminet +luminet_isp: MCU_TARGET = attiny84 +luminet_isp: HFUSE = DF # Brownout disabled +luminet_isp: LFUSE = 62 # 1MHz internal oscillator, slowly rising power +luminet_isp: EFUSE = FE # Self-programming enable +luminet_isp: isp + +isp: $(TARGET) + $(ISPFUSES) + $(ISPFLASH) + +isp-stk500: $(PROGRAM)_$(TARGET).hex + $(STK500-1) + $(STK500-2) + +%.elf: $(OBJ) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) + +clean: + rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex + +%.lst: %.elf + $(OBJDUMP) -h -S $< > $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.srec: %.elf + $(OBJCOPY) -j .text -j .data -O srec $< $@ + +%.bin: %.elf + $(OBJCOPY) -j .text -j .data -O binary $< $@ diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/makeall b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/makeall new file mode 100644 index 0000000..7a0b82d --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/makeall @@ -0,0 +1,13 @@ +#!/bin/bash +make clean +make lilypad +make lilypad_resonator +make pro8 +make pro16 +make pro20 +make diecimila +make ng +make atmega328 +make atmega328_pro8 +make luminet + diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot.c b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot.c new file mode 100644 index 0000000..af92995 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot.c @@ -0,0 +1,536 @@ +/**********************************************************/ +/* Optiboot bootloader for Arduino */ +/* */ +/* Heavily optimised bootloader that is faster and */ +/* smaller than the Arduino standard bootloader */ +/* */ +/* Enhancements: */ +/* Fits in 512 bytes, saving 1.5K of code space */ +/* Background page erasing speeds up programming */ +/* Higher baud rate speeds up programming */ +/* Written almost entirely in C */ +/* Customisable timeout with accurate timeconstant */ +/* */ +/* What you lose: */ +/* Implements a skeleton STK500 protocol which is */ +/* missing several features including EEPROM */ +/* programming and non-page-aligned writes */ +/* High baud rate breaks compatibility with standard */ +/* Arduino flash settings */ +/* */ +/* Currently supports: */ +/* ATmega168 based devices (Diecimila etc) */ +/* ATmega328P based devices (Duemilanove etc) */ +/* */ +/* Does not support: */ +/* ATmega1280 based devices (eg. Mega) */ +/* */ +/* Assumptions: */ +/* The code makes several assumptions that reduce the */ +/* code size. They are all true after a hardware reset, */ +/* but may not be true if the bootloader is called by */ +/* other means or on other hardware. */ +/* No interrupts can occur */ +/* UART and Timer 1 are set to their reset state */ +/* SP points to RAMEND */ +/* */ +/* Code builds on code, libraries and optimisations from: */ +/* stk500boot.c by Jason P. Kyle */ +/* Arduino bootloader http://arduino.cc */ +/* Spiff's 1K bootloader http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml */ +/* avr-libc project http://nongnu.org/avr-libc */ +/* Adaboot http://www.ladyada.net/library/arduino/bootloader.html */ +/* AVR305 Atmel Application Note */ +/* */ +/* This program is free software; you can redistribute it */ +/* and/or modify it under the terms of the GNU General */ +/* Public License as published by the Free Software */ +/* Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will */ +/* be useful, but WITHOUT ANY WARRANTY; without even the */ +/* implied warranty of MERCHANTABILITY or FITNESS FOR A */ +/* PARTICULAR PURPOSE. See the GNU General Public */ +/* License for more details. */ +/* */ +/* You should have received a copy of the GNU General */ +/* Public License along with this program; if not, write */ +/* to the Free Software Foundation, Inc., */ +/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* */ +/* Licence can be viewed at */ +/* http://www.fsf.org/licenses/gpl.txt */ +/* */ +/**********************************************************/ + +#include +#include +#include +#include + +//#define LED_DATA_FLASH + +#ifndef LED_START_FLASHES +#define LED_START_FLASHES 0 +#endif + +/* Build-time variables */ +/* BAUD_RATE Programming baud rate */ +/* LED_NO_FLASHES Number of LED flashes on boot */ +/* FLASH_TIME_MS Duration of each LED flash */ +/* BOOT_TIMEOUT_MS Serial port wait time before exiting bootloader */ + +/* set the UART baud rate */ +#ifndef BAUD_RATE +#define BAUD_RATE 19200 +#endif + +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */ +#define LED_DDR DDRB +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED PINB5 + +/* Ports for soft UART */ +#ifdef SOFT_UART +#define UART_PORT PORTD +#define UART_PIN PIND +#define UART_DDR DDRD +#define UART_TX_BIT 1 +#define UART_RX_BIT 0 +#endif +#endif + +#if defined(__AVR_ATtiny84__) +/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */ +#define LED_DDR DDRA +#define LED_PORT PORTA +#define LED_PIN PINA +#define LED PINA4 + +/* Ports for soft UART - left port only for now*/ +#ifdef SOFT_UART +#define UART_PORT PORTA +#define UART_PIN PINA +#define UART_DDR DDRA +#define UART_TX_BIT 2 +#define UART_RX_BIT 3 +#endif +#endif + +/* STK500 constants list, from AVRDUDE */ +#define STK_OK 0x10 +#define STK_FAILED 0x11 // Not used +#define STK_UNKNOWN 0x12 // Not used +#define STK_NODEVICE 0x13 // Not used +#define STK_INSYNC 0x14 // ' ' +#define STK_NOSYNC 0x15 // Not used +#define ADC_CHANNEL_ERROR 0x16 // Not used +#define ADC_MEASURE_OK 0x17 // Not used +#define PWM_CHANNEL_ERROR 0x18 // Not used +#define PWM_ADJUST_OK 0x19 // Not used +#define CRC_EOP 0x20 // 'SPACE' +#define STK_GET_SYNC 0x30 // '0' +#define STK_GET_SIGN_ON 0x31 // '1' +#define STK_SET_PARAMETER 0x40 // '@' +#define STK_GET_PARAMETER 0x41 // 'A' +#define STK_SET_DEVICE 0x42 // 'B' +#define STK_SET_DEVICE_EXT 0x45 // 'E' +#define STK_ENTER_PROGMODE 0x50 // 'P' +#define STK_LEAVE_PROGMODE 0x51 // 'Q' +#define STK_CHIP_ERASE 0x52 // 'R' +#define STK_CHECK_AUTOINC 0x53 // 'S' +#define STK_LOAD_ADDRESS 0x55 // 'U' +#define STK_UNIVERSAL 0x56 // 'V' +#define STK_PROG_FLASH 0x60 // '`' +#define STK_PROG_DATA 0x61 // 'a' +#define STK_PROG_FUSE 0x62 // 'b' +#define STK_PROG_LOCK 0x63 // 'c' +#define STK_PROG_PAGE 0x64 // 'd' +#define STK_PROG_FUSE_EXT 0x65 // 'e' +#define STK_READ_FLASH 0x70 // 'p' +#define STK_READ_DATA 0x71 // 'q' +#define STK_READ_FUSE 0x72 // 'r' +#define STK_READ_LOCK 0x73 // 's' +#define STK_READ_PAGE 0x74 // 't' +#define STK_READ_SIGN 0x75 // 'u' +#define STK_READ_OSCCAL 0x76 // 'v' +#define STK_READ_FUSE_EXT 0x77 // 'w' +#define STK_READ_OSCCAL_EXT 0x78 // 'x' + +/* Watchdog settings */ +#define WATCHDOG_OFF (0) +#define WATCHDOG_16MS (_BV(WDE)) +#define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE)) +#define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE)) +#define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE)) +#define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE)) +#define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE)) +#define WATCHDOG_4S (_BV(WDE3) | _BV(WDE)) +#define WATCHDOG_8S (_BV(WDE3) | _BV(WDE0) | _BV(WDE)) + +/* Function Prototypes */ +/* The main function is in init9, which removes the interrupt vector table */ +/* we don't need. It is also 'naked', which means the compiler does not */ +/* generate any entry or exit code itself. */ +int main(void) __attribute__ ((naked)) __attribute__ ((section (".init9"))); +void putch(char); +uint8_t getch(void); +static inline void getNch(uint8_t); /* "static inline" is a compiler hint to reduce code size */ +void verifySpace(); +static inline void flash_led(uint8_t); +uint8_t getLen(); +static inline void watchdogReset(); +void watchdogConfig(uint8_t x); +#ifdef SOFT_UART +void uartDelay() __attribute__ ((naked)); +#endif +void appStart() __attribute__ ((naked)); + +/* C zero initialises all global variables. However, that requires */ +/* These definitions are NOT zero initialised, but that doesn't matter */ +/* This allows us to drop the zero init code, saving us memory */ +#define buff ((uint8_t*)(0x100)) +#define address (*(uint16_t*)(0x200)) +#define length (*(uint8_t*)(0x202)) +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + // After the zero init loop, this is the first code to run. + // + // This code makes the following assumptions: + // No interrupts will execute + // SP points to RAMEND + // r1 contains zero + // + // If not, uncomment the following instructions: + // cli(); + // SP=RAMEND; // This is done by hardware reset + // asm volatile ("clr __zero_reg__"); + + uint8_t ch; + +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif +#ifndef SOFT_UART + UCSR0A = _BV(U2X0); //Double speed mode USART0 + UCSR0B = _BV(RXEN0) | _BV(TXEN0); + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#endif + + // Adaboot no-wait mod + ch = MCUSR; + MCUSR = 0; + if (!(ch & _BV(EXTRF))) appStart(); + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); +#endif + +#if LED_START_FLASHES > 0 + /* Flash onboard LED to signal entering of bootloader */ + flash_led(LED_START_FLASHES * 2); +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + putch(0x03); + } + else if(ch == STK_SET_DEVICE) { + // SET DEVICE is ignored + getNch(20); + } + else if(ch == STK_SET_DEVICE_EXT) { + // SET DEVICE EXT is ignored + getNch(5); + } + else if(ch == STK_LOAD_ADDRESS) { + // LOAD ADDRESS + address = getch(); + address = (address & 0xff) | (getch() << 8); + address += address; // Convert from word address to byte address + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + // UNIVERSAL command is ignored + getNch(4); + putch(0x00); + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + while (--length); + + // Read command terminator, start reply + verifySpace(); + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + +#ifdef VIRTUAL_BOOT_PARTITION + if ((uint16_t)(void*)address == 0) { + // This is the reset vector page. We need to live-patch the code so the + // bootloader runs. + // + // Move RESET vector to WDT vector + uint16_t vect = buff[0] | (buff[1]<<8); + rstVect = vect; + wdtVect = buff[10] | (buff[11]<<8); + vect -= 4; // Instruction is a relative jump (rjmp), so recalculate. + buff[10] = vect & 0xff; + buff[11] = vect >> 8; + + // Add jump to bootloader at RESET vector + buff[0] = 0x7f; + buff[1] = 0xce; // rjmp 0x1d00 instruction + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + // READ PAGE - we only read flash + getLen(); + verifySpace(); +#ifdef VIRTUAL_BOOT_PARTITION + do { + // Undo vector patch in bottom page so verify passes + if (address == 0) ch=rstVect & 0xff; + else if (address == 1) ch=rstVect >> 8; + else if (address == 10) ch=wdtVect & 0xff; + else if (address == 11) ch=wdtVect >> 8; + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + while (--length); +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + putch(SIGNATURE_0); + putch(SIGNATURE_1); + putch(SIGNATURE_2); + } + else if (ch == 'Q') { + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + } + putch(STK_OK); + } +} + +void putch(char ch) { +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + UDR0 = ch; +#else + __asm__ __volatile__ ( + " com %[ch]\n" // ones complement, carry set + " sec\n" + "1: brcc 2f\n" + " cbi %[uartPort],%[uartBit]\n" + " rjmp 3f\n" + "2: sbi %[uartPort],%[uartBit]\n" + " nop\n" + "3: rcall uartDelay\n" + " rcall uartDelay\n" + " lsr %[ch]\n" + " dec %[bitcnt]\n" + " brne 1b\n" + : + : + [bitcnt] "d" (10), + [ch] "r" (ch), + [uartPort] "I" (_SFR_IO_ADDR(UART_PORT)), + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + +uint8_t getch(void) { + uint8_t ch; + + watchdogReset(); + +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + +#ifdef SOFT_UART + __asm__ __volatile__ ( + "1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge + " rjmp 1b\n" + " rcall uartDelay\n" // Get to middle of start bit + "2: rcall uartDelay\n" // Wait 1 bit period + " rcall uartDelay\n" // Wait 1 bit period + " clc\n" + " sbic %[uartPin],%[uartBit]\n" + " sec\n" + " dec %[bitCnt]\n" + " breq 3f\n" + " ror %[ch]\n" + " rjmp 2b\n" + "3:\n" + : + [ch] "=r" (ch) + : + [bitCnt] "d" (9), + [uartPin] "I" (_SFR_IO_ADDR(UART_PIN)), + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))); + ch = UDR0; +#endif + +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + +#ifdef SOFT_UART +//#define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6) +#define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6) +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + "ldi r25,%[count]\n" + "1:dec r25\n" + "brne 1b\n" + "ret\n" + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + putch(STK_INSYNC); +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + length = getch(); + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + WDTCSR = x; +} + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + __asm__ __volatile__ ( +#ifdef VIRTUAL_BOOT_PARTITION + // Jump to WDT vector + "ldi r30,5\n" + "clr r31\n" +#else + // Jump to RST vector + "clr r30\n" + "clr r31\n" +#endif + "ijmp\n" + ); +} diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.hex new file mode 100644 index 0000000..b1c8567 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.hex @@ -0,0 +1,33 @@ +:107E000085E08093810082E08093C00088E18093C8 +:107E1000C10086E08093C20080E18093C40084B7F3 +:107E200014BE81FFD0D08DE0C8D0259A86E020E333 +:107E30003CEF91E0309385002093840096BBB09B8B +:107E4000FECF1D9AA8958150A9F7DD24D394A5E013 +:107E5000EA2EF1E1FF2EA4D0813421F481E0BED0DE +:107E600083E024C0823411F484E103C0853419F422 +:107E700085E0B4D08AC08535A1F492D0082F10E0F7 +:107E800010930102009300028BD090E0982F882776 +:107E9000802B912B880F991F9093010280930002F1 +:107EA00073C0863529F484E099D080E071D06DC02C +:107EB000843609F043C07CD0E0910002F0910102C9 +:107EC00083E080935700E895C0E0D1E069D08993C2 +:107ED000809102028150809302028823B9F778D002 +:107EE00007B600FCFDCF4091000250910102A0E0D6 +:107EF000B1E02C9130E011968C91119790E0982F81 +:107F00008827822B932B1296FA010C01D0925700EE +:107F1000E89511244E5F5F4FF1E0A038BF0749F7A5 +:107F2000E0910002F0910102E0925700E89507B657 +:107F300000FCFDCFF0925700E89527C08437B9F4D4 +:107F400037D046D0E0910002F09101023196F093D3 +:107F50000102E09300023197E4918E2F19D08091B5 +:107F60000202815080930202882361F70EC0853798 +:107F700039F42ED08EE10CD085E90AD08FE096CF6F +:107F8000813511F488E019D023D080E101D063CF8E +:107F9000982F8091C00085FFFCCF9093C600089574 +:107FA000A8958091C00087FFFCCF8091C6000895FE +:107FB000F7DFF6DF80930202F3CFE0E6F0E098E12E +:107FC00090838083089580E0F8DFEE27FF270994EF +:107FD000E7DF803209F0F7DF84E1DACF1F93182F53 +:0C7FE000DFDF1150E9F7F4DF1F91089576 +:0400000300007E007B +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.lst new file mode 100644 index 0000000..888871d --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328.lst @@ -0,0 +1,520 @@ + +optiboot_atmega328.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001ec 00007e00 00007e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000240 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 0000006a 00000000 00000000 00000268 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000269 00000000 00000000 000002d2 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000196 00000000 00000000 0000053b 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003d3 00000000 00000000 000006d1 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 00000090 00000000 00000000 00000aa4 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 00000135 00000000 00000000 00000b34 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001d1 00000000 00000000 00000c69 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000068 00000000 00000000 00000e3a 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00007e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 7e00: 85 e0 ldi r24, 0x05 ; 5 + 7e02: 80 93 81 00 sts 0x0081, r24 +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif +#ifndef SOFT_UART + UCSR0A = _BV(U2X0); //Double speed mode USART0 + 7e06: 82 e0 ldi r24, 0x02 ; 2 + 7e08: 80 93 c0 00 sts 0x00C0, r24 + UCSR0B = _BV(RXEN0) | _BV(TXEN0); + 7e0c: 88 e1 ldi r24, 0x18 ; 24 + 7e0e: 80 93 c1 00 sts 0x00C1, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + 7e12: 86 e0 ldi r24, 0x06 ; 6 + 7e14: 80 93 c2 00 sts 0x00C2, r24 + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 7e18: 80 e1 ldi r24, 0x10 ; 16 + 7e1a: 80 93 c4 00 sts 0x00C4, r24 +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 7e1e: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 7e20: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 7e22: 81 ff sbrs r24, 1 + 7e24: d0 d0 rcall .+416 ; 0x7fc6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 7e26: 8d e0 ldi r24, 0x0D ; 13 + 7e28: c8 d0 rcall .+400 ; 0x7fba + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 7e2a: 25 9a sbi 0x04, 5 ; 4 + 7e2c: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 7e2e: 20 e3 ldi r18, 0x30 ; 48 + 7e30: 3c ef ldi r19, 0xFC ; 252 + TIFR1 = _BV(TOV1); + 7e32: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 7e34: 30 93 85 00 sts 0x0085, r19 + 7e38: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 7e3c: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 7e3e: b0 9b sbis 0x16, 0 ; 22 + 7e40: fe cf rjmp .-4 ; 0x7e3e + LED_PIN |= _BV(LED); + 7e42: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 7e44: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 7e46: 81 50 subi r24, 0x01 ; 1 + 7e48: a9 f7 brne .-22 ; 0x7e34 + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 7e4a: dd 24 eor r13, r13 + 7e4c: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 7e4e: a5 e0 ldi r26, 0x05 ; 5 + 7e50: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 7e52: f1 e1 ldi r31, 0x11 ; 17 + 7e54: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 7e56: a4 d0 rcall .+328 ; 0x7fa0 + + if(ch == STK_GET_PARAMETER) { + 7e58: 81 34 cpi r24, 0x41 ; 65 + 7e5a: 21 f4 brne .+8 ; 0x7e64 + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 7e5c: 81 e0 ldi r24, 0x01 ; 1 + 7e5e: be d0 rcall .+380 ; 0x7fdc + putch(0x03); + 7e60: 83 e0 ldi r24, 0x03 ; 3 + 7e62: 24 c0 rjmp .+72 ; 0x7eac + } + else if(ch == STK_SET_DEVICE) { + 7e64: 82 34 cpi r24, 0x42 ; 66 + 7e66: 11 f4 brne .+4 ; 0x7e6c + // SET DEVICE is ignored + getNch(20); + 7e68: 84 e1 ldi r24, 0x14 ; 20 + 7e6a: 03 c0 rjmp .+6 ; 0x7e72 + } + else if(ch == STK_SET_DEVICE_EXT) { + 7e6c: 85 34 cpi r24, 0x45 ; 69 + 7e6e: 19 f4 brne .+6 ; 0x7e76 + // SET DEVICE EXT is ignored + getNch(5); + 7e70: 85 e0 ldi r24, 0x05 ; 5 + 7e72: b4 d0 rcall .+360 ; 0x7fdc + 7e74: 8a c0 rjmp .+276 ; 0x7f8a + } + else if(ch == STK_LOAD_ADDRESS) { + 7e76: 85 35 cpi r24, 0x55 ; 85 + 7e78: a1 f4 brne .+40 ; 0x7ea2 + // LOAD ADDRESS + address = getch(); + 7e7a: 92 d0 rcall .+292 ; 0x7fa0 + 7e7c: 08 2f mov r16, r24 + 7e7e: 10 e0 ldi r17, 0x00 ; 0 + 7e80: 10 93 01 02 sts 0x0201, r17 + 7e84: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 7e88: 8b d0 rcall .+278 ; 0x7fa0 + 7e8a: 90 e0 ldi r25, 0x00 ; 0 + 7e8c: 98 2f mov r25, r24 + 7e8e: 88 27 eor r24, r24 + 7e90: 80 2b or r24, r16 + 7e92: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 7e94: 88 0f add r24, r24 + 7e96: 99 1f adc r25, r25 + 7e98: 90 93 01 02 sts 0x0201, r25 + 7e9c: 80 93 00 02 sts 0x0200, r24 + 7ea0: 73 c0 rjmp .+230 ; 0x7f88 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 7ea2: 86 35 cpi r24, 0x56 ; 86 + 7ea4: 29 f4 brne .+10 ; 0x7eb0 + // UNIVERSAL command is ignored + getNch(4); + 7ea6: 84 e0 ldi r24, 0x04 ; 4 + 7ea8: 99 d0 rcall .+306 ; 0x7fdc + putch(0x00); + 7eaa: 80 e0 ldi r24, 0x00 ; 0 + 7eac: 71 d0 rcall .+226 ; 0x7f90 + 7eae: 6d c0 rjmp .+218 ; 0x7f8a + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 7eb0: 84 36 cpi r24, 0x64 ; 100 + 7eb2: 09 f0 breq .+2 ; 0x7eb6 + 7eb4: 43 c0 rjmp .+134 ; 0x7f3c + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 7eb6: 7c d0 rcall .+248 ; 0x7fb0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 7eb8: e0 91 00 02 lds r30, 0x0200 + 7ebc: f0 91 01 02 lds r31, 0x0201 + 7ec0: 83 e0 ldi r24, 0x03 ; 3 + 7ec2: 80 93 57 00 sts 0x0057, r24 + 7ec6: e8 95 spm + 7ec8: c0 e0 ldi r28, 0x00 ; 0 + 7eca: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 7ecc: 69 d0 rcall .+210 ; 0x7fa0 + 7ece: 89 93 st Y+, r24 + while (--length); + 7ed0: 80 91 02 02 lds r24, 0x0202 + 7ed4: 81 50 subi r24, 0x01 ; 1 + 7ed6: 80 93 02 02 sts 0x0202, r24 + 7eda: 88 23 and r24, r24 + 7edc: b9 f7 brne .-18 ; 0x7ecc + + // Read command terminator, start reply + verifySpace(); + 7ede: 78 d0 rcall .+240 ; 0x7fd0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 7ee0: 07 b6 in r0, 0x37 ; 55 + 7ee2: 00 fc sbrc r0, 0 + 7ee4: fd cf rjmp .-6 ; 0x7ee0 + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 7ee6: 40 91 00 02 lds r20, 0x0200 + 7eea: 50 91 01 02 lds r21, 0x0201 + 7eee: a0 e0 ldi r26, 0x00 ; 0 + 7ef0: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 7ef2: 2c 91 ld r18, X + 7ef4: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 7ef6: 11 96 adiw r26, 0x01 ; 1 + 7ef8: 8c 91 ld r24, X + 7efa: 11 97 sbiw r26, 0x01 ; 1 + 7efc: 90 e0 ldi r25, 0x00 ; 0 + 7efe: 98 2f mov r25, r24 + 7f00: 88 27 eor r24, r24 + 7f02: 82 2b or r24, r18 + 7f04: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 7f06: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 7f08: fa 01 movw r30, r20 + 7f0a: 0c 01 movw r0, r24 + 7f0c: d0 92 57 00 sts 0x0057, r13 + 7f10: e8 95 spm + 7f12: 11 24 eor r1, r1 + addrPtr += 2; + 7f14: 4e 5f subi r20, 0xFE ; 254 + 7f16: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 7f18: f1 e0 ldi r31, 0x01 ; 1 + 7f1a: a0 38 cpi r26, 0x80 ; 128 + 7f1c: bf 07 cpc r27, r31 + 7f1e: 49 f7 brne .-46 ; 0x7ef2 + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 7f20: e0 91 00 02 lds r30, 0x0200 + 7f24: f0 91 01 02 lds r31, 0x0201 + 7f28: e0 92 57 00 sts 0x0057, r14 + 7f2c: e8 95 spm + boot_spm_busy_wait(); + 7f2e: 07 b6 in r0, 0x37 ; 55 + 7f30: 00 fc sbrc r0, 0 + 7f32: fd cf rjmp .-6 ; 0x7f2e + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 7f34: f0 92 57 00 sts 0x0057, r15 + 7f38: e8 95 spm + 7f3a: 27 c0 rjmp .+78 ; 0x7f8a +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 7f3c: 84 37 cpi r24, 0x74 ; 116 + 7f3e: b9 f4 brne .+46 ; 0x7f6e + // READ PAGE - we only read flash + getLen(); + 7f40: 37 d0 rcall .+110 ; 0x7fb0 + verifySpace(); + 7f42: 46 d0 rcall .+140 ; 0x7fd0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 7f44: e0 91 00 02 lds r30, 0x0200 + 7f48: f0 91 01 02 lds r31, 0x0201 + 7f4c: 31 96 adiw r30, 0x01 ; 1 + 7f4e: f0 93 01 02 sts 0x0201, r31 + 7f52: e0 93 00 02 sts 0x0200, r30 + 7f56: 31 97 sbiw r30, 0x01 ; 1 + 7f58: e4 91 lpm r30, Z+ + 7f5a: 8e 2f mov r24, r30 + 7f5c: 19 d0 rcall .+50 ; 0x7f90 + while (--length); + 7f5e: 80 91 02 02 lds r24, 0x0202 + 7f62: 81 50 subi r24, 0x01 ; 1 + 7f64: 80 93 02 02 sts 0x0202, r24 + 7f68: 88 23 and r24, r24 + 7f6a: 61 f7 brne .-40 ; 0x7f44 + 7f6c: 0e c0 rjmp .+28 ; 0x7f8a +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 7f6e: 85 37 cpi r24, 0x75 ; 117 + 7f70: 39 f4 brne .+14 ; 0x7f80 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 7f72: 2e d0 rcall .+92 ; 0x7fd0 + putch(SIGNATURE_0); + 7f74: 8e e1 ldi r24, 0x1E ; 30 + 7f76: 0c d0 rcall .+24 ; 0x7f90 + putch(SIGNATURE_1); + 7f78: 85 e9 ldi r24, 0x95 ; 149 + 7f7a: 0a d0 rcall .+20 ; 0x7f90 + putch(SIGNATURE_2); + 7f7c: 8f e0 ldi r24, 0x0F ; 15 + 7f7e: 96 cf rjmp .-212 ; 0x7eac + } + else if (ch == 'Q') { + 7f80: 81 35 cpi r24, 0x51 ; 81 + 7f82: 11 f4 brne .+4 ; 0x7f88 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 7f84: 88 e0 ldi r24, 0x08 ; 8 + 7f86: 19 d0 rcall .+50 ; 0x7fba + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 7f88: 23 d0 rcall .+70 ; 0x7fd0 + } + putch(STK_OK); + 7f8a: 80 e1 ldi r24, 0x10 ; 16 + 7f8c: 01 d0 rcall .+2 ; 0x7f90 + 7f8e: 63 cf rjmp .-314 ; 0x7e56 + +00007f90 : + } +} + +void putch(char ch) { + 7f90: 98 2f mov r25, r24 +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + 7f92: 80 91 c0 00 lds r24, 0x00C0 + 7f96: 85 ff sbrs r24, 5 + 7f98: fc cf rjmp .-8 ; 0x7f92 + UDR0 = ch; + 7f9a: 90 93 c6 00 sts 0x00C6, r25 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 7f9e: 08 95 ret + +00007fa0 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 7fa0: a8 95 wdr + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))); + 7fa2: 80 91 c0 00 lds r24, 0x00C0 + 7fa6: 87 ff sbrs r24, 7 + 7fa8: fc cf rjmp .-8 ; 0x7fa2 + ch = UDR0; + 7faa: 80 91 c6 00 lds r24, 0x00C6 +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 7fae: 08 95 ret + +00007fb0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 7fb0: f7 df rcall .-18 ; 0x7fa0 + length = getch(); + 7fb2: f6 df rcall .-20 ; 0x7fa0 + 7fb4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 7fb8: f3 cf rjmp .-26 ; 0x7fa0 + +00007fba : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 7fba: e0 e6 ldi r30, 0x60 ; 96 + 7fbc: f0 e0 ldi r31, 0x00 ; 0 + 7fbe: 98 e1 ldi r25, 0x18 ; 24 + 7fc0: 90 83 st Z, r25 + WDTCSR = x; + 7fc2: 80 83 st Z, r24 +} + 7fc4: 08 95 ret + +00007fc6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 7fc6: 80 e0 ldi r24, 0x00 ; 0 + 7fc8: f8 df rcall .-16 ; 0x7fba + __asm__ __volatile__ ( + 7fca: ee 27 eor r30, r30 + 7fcc: ff 27 eor r31, r31 + 7fce: 09 94 ijmp + +00007fd0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 7fd0: e7 df rcall .-50 ; 0x7fa0 + 7fd2: 80 32 cpi r24, 0x20 ; 32 + 7fd4: 09 f0 breq .+2 ; 0x7fd8 + 7fd6: f7 df rcall .-18 ; 0x7fc6 + putch(STK_INSYNC); + 7fd8: 84 e1 ldi r24, 0x14 ; 20 +} + 7fda: da cf rjmp .-76 ; 0x7f90 + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 7fdc: 1f 93 push r17 + 7fde: 18 2f mov r17, r24 + +00007fe0 : + do getch(); while (--count); + 7fe0: df df rcall .-66 ; 0x7fa0 + 7fe2: 11 50 subi r17, 0x01 ; 1 + 7fe4: e9 f7 brne .-6 ; 0x7fe0 + verifySpace(); + 7fe6: f4 df rcall .-24 ; 0x7fd0 +} + 7fe8: 1f 91 pop r17 + 7fea: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex new file mode 100644 index 0000000..d6ac145 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.hex @@ -0,0 +1,33 @@ +:107E000085E08093810082E08093C00088E18093C8 +:107E1000C10086E08093C20088E08093C40084B7EC +:107E200014BE81FFD0D08DE0C8D0259A86E028E12D +:107E30003EEF91E0309385002093840096BBB09B89 +:107E4000FECF1D9AA8958150A9F7DD24D394A5E013 +:107E5000EA2EF1E1FF2EA4D0813421F481E0BED0DE +:107E600083E024C0823411F484E103C0853419F422 +:107E700085E0B4D08AC08535A1F492D0082F10E0F7 +:107E800010930102009300028BD090E0982F882776 +:107E9000802B912B880F991F9093010280930002F1 +:107EA00073C0863529F484E099D080E071D06DC02C +:107EB000843609F043C07CD0E0910002F0910102C9 +:107EC00083E080935700E895C0E0D1E069D08993C2 +:107ED000809102028150809302028823B9F778D002 +:107EE00007B600FCFDCF4091000250910102A0E0D6 +:107EF000B1E02C9130E011968C91119790E0982F81 +:107F00008827822B932B1296FA010C01D0925700EE +:107F1000E89511244E5F5F4FF1E0A038BF0749F7A5 +:107F2000E0910002F0910102E0925700E89507B657 +:107F300000FCFDCFF0925700E89527C08437B9F4D4 +:107F400037D046D0E0910002F09101023196F093D3 +:107F50000102E09300023197E4918E2F19D08091B5 +:107F60000202815080930202882361F70EC0853798 +:107F700039F42ED08EE10CD085E90AD08FE096CF6F +:107F8000813511F488E019D023D080E101D063CF8E +:107F9000982F8091C00085FFFCCF9093C600089574 +:107FA000A8958091C00087FFFCCF8091C6000895FE +:107FB000F7DFF6DF80930202F3CFE0E6F0E098E12E +:107FC00090838083089580E0F8DFEE27FF270994EF +:107FD000E7DF803209F0F7DF84E1DACF1F93182F53 +:0C7FE000DFDF1150E9F7F4DF1F91089576 +:0400000300007E007B +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst new file mode 100644 index 0000000..46eda68 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_atmega328_pro_8MHz.lst @@ -0,0 +1,520 @@ + +optiboot_atmega328_pro_8MHz.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001ec 00007e00 00007e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000240 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 0000006a 00000000 00000000 00000268 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000269 00000000 00000000 000002d2 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000196 00000000 00000000 0000053b 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003d3 00000000 00000000 000006d1 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 00000090 00000000 00000000 00000aa4 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 00000135 00000000 00000000 00000b34 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001d1 00000000 00000000 00000c69 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000068 00000000 00000000 00000e3a 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00007e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 7e00: 85 e0 ldi r24, 0x05 ; 5 + 7e02: 80 93 81 00 sts 0x0081, r24 +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif +#ifndef SOFT_UART + UCSR0A = _BV(U2X0); //Double speed mode USART0 + 7e06: 82 e0 ldi r24, 0x02 ; 2 + 7e08: 80 93 c0 00 sts 0x00C0, r24 + UCSR0B = _BV(RXEN0) | _BV(TXEN0); + 7e0c: 88 e1 ldi r24, 0x18 ; 24 + 7e0e: 80 93 c1 00 sts 0x00C1, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + 7e12: 86 e0 ldi r24, 0x06 ; 6 + 7e14: 80 93 c2 00 sts 0x00C2, r24 + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 7e18: 88 e0 ldi r24, 0x08 ; 8 + 7e1a: 80 93 c4 00 sts 0x00C4, r24 +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 7e1e: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 7e20: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 7e22: 81 ff sbrs r24, 1 + 7e24: d0 d0 rcall .+416 ; 0x7fc6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 7e26: 8d e0 ldi r24, 0x0D ; 13 + 7e28: c8 d0 rcall .+400 ; 0x7fba + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 7e2a: 25 9a sbi 0x04, 5 ; 4 + 7e2c: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 7e2e: 28 e1 ldi r18, 0x18 ; 24 + 7e30: 3e ef ldi r19, 0xFE ; 254 + TIFR1 = _BV(TOV1); + 7e32: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 7e34: 30 93 85 00 sts 0x0085, r19 + 7e38: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 7e3c: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 7e3e: b0 9b sbis 0x16, 0 ; 22 + 7e40: fe cf rjmp .-4 ; 0x7e3e + LED_PIN |= _BV(LED); + 7e42: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 7e44: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 7e46: 81 50 subi r24, 0x01 ; 1 + 7e48: a9 f7 brne .-22 ; 0x7e34 + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 7e4a: dd 24 eor r13, r13 + 7e4c: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 7e4e: a5 e0 ldi r26, 0x05 ; 5 + 7e50: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 7e52: f1 e1 ldi r31, 0x11 ; 17 + 7e54: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 7e56: a4 d0 rcall .+328 ; 0x7fa0 + + if(ch == STK_GET_PARAMETER) { + 7e58: 81 34 cpi r24, 0x41 ; 65 + 7e5a: 21 f4 brne .+8 ; 0x7e64 + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 7e5c: 81 e0 ldi r24, 0x01 ; 1 + 7e5e: be d0 rcall .+380 ; 0x7fdc + putch(0x03); + 7e60: 83 e0 ldi r24, 0x03 ; 3 + 7e62: 24 c0 rjmp .+72 ; 0x7eac + } + else if(ch == STK_SET_DEVICE) { + 7e64: 82 34 cpi r24, 0x42 ; 66 + 7e66: 11 f4 brne .+4 ; 0x7e6c + // SET DEVICE is ignored + getNch(20); + 7e68: 84 e1 ldi r24, 0x14 ; 20 + 7e6a: 03 c0 rjmp .+6 ; 0x7e72 + } + else if(ch == STK_SET_DEVICE_EXT) { + 7e6c: 85 34 cpi r24, 0x45 ; 69 + 7e6e: 19 f4 brne .+6 ; 0x7e76 + // SET DEVICE EXT is ignored + getNch(5); + 7e70: 85 e0 ldi r24, 0x05 ; 5 + 7e72: b4 d0 rcall .+360 ; 0x7fdc + 7e74: 8a c0 rjmp .+276 ; 0x7f8a + } + else if(ch == STK_LOAD_ADDRESS) { + 7e76: 85 35 cpi r24, 0x55 ; 85 + 7e78: a1 f4 brne .+40 ; 0x7ea2 + // LOAD ADDRESS + address = getch(); + 7e7a: 92 d0 rcall .+292 ; 0x7fa0 + 7e7c: 08 2f mov r16, r24 + 7e7e: 10 e0 ldi r17, 0x00 ; 0 + 7e80: 10 93 01 02 sts 0x0201, r17 + 7e84: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 7e88: 8b d0 rcall .+278 ; 0x7fa0 + 7e8a: 90 e0 ldi r25, 0x00 ; 0 + 7e8c: 98 2f mov r25, r24 + 7e8e: 88 27 eor r24, r24 + 7e90: 80 2b or r24, r16 + 7e92: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 7e94: 88 0f add r24, r24 + 7e96: 99 1f adc r25, r25 + 7e98: 90 93 01 02 sts 0x0201, r25 + 7e9c: 80 93 00 02 sts 0x0200, r24 + 7ea0: 73 c0 rjmp .+230 ; 0x7f88 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 7ea2: 86 35 cpi r24, 0x56 ; 86 + 7ea4: 29 f4 brne .+10 ; 0x7eb0 + // UNIVERSAL command is ignored + getNch(4); + 7ea6: 84 e0 ldi r24, 0x04 ; 4 + 7ea8: 99 d0 rcall .+306 ; 0x7fdc + putch(0x00); + 7eaa: 80 e0 ldi r24, 0x00 ; 0 + 7eac: 71 d0 rcall .+226 ; 0x7f90 + 7eae: 6d c0 rjmp .+218 ; 0x7f8a + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 7eb0: 84 36 cpi r24, 0x64 ; 100 + 7eb2: 09 f0 breq .+2 ; 0x7eb6 + 7eb4: 43 c0 rjmp .+134 ; 0x7f3c + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 7eb6: 7c d0 rcall .+248 ; 0x7fb0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 7eb8: e0 91 00 02 lds r30, 0x0200 + 7ebc: f0 91 01 02 lds r31, 0x0201 + 7ec0: 83 e0 ldi r24, 0x03 ; 3 + 7ec2: 80 93 57 00 sts 0x0057, r24 + 7ec6: e8 95 spm + 7ec8: c0 e0 ldi r28, 0x00 ; 0 + 7eca: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 7ecc: 69 d0 rcall .+210 ; 0x7fa0 + 7ece: 89 93 st Y+, r24 + while (--length); + 7ed0: 80 91 02 02 lds r24, 0x0202 + 7ed4: 81 50 subi r24, 0x01 ; 1 + 7ed6: 80 93 02 02 sts 0x0202, r24 + 7eda: 88 23 and r24, r24 + 7edc: b9 f7 brne .-18 ; 0x7ecc + + // Read command terminator, start reply + verifySpace(); + 7ede: 78 d0 rcall .+240 ; 0x7fd0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 7ee0: 07 b6 in r0, 0x37 ; 55 + 7ee2: 00 fc sbrc r0, 0 + 7ee4: fd cf rjmp .-6 ; 0x7ee0 + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 7ee6: 40 91 00 02 lds r20, 0x0200 + 7eea: 50 91 01 02 lds r21, 0x0201 + 7eee: a0 e0 ldi r26, 0x00 ; 0 + 7ef0: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 7ef2: 2c 91 ld r18, X + 7ef4: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 7ef6: 11 96 adiw r26, 0x01 ; 1 + 7ef8: 8c 91 ld r24, X + 7efa: 11 97 sbiw r26, 0x01 ; 1 + 7efc: 90 e0 ldi r25, 0x00 ; 0 + 7efe: 98 2f mov r25, r24 + 7f00: 88 27 eor r24, r24 + 7f02: 82 2b or r24, r18 + 7f04: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 7f06: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 7f08: fa 01 movw r30, r20 + 7f0a: 0c 01 movw r0, r24 + 7f0c: d0 92 57 00 sts 0x0057, r13 + 7f10: e8 95 spm + 7f12: 11 24 eor r1, r1 + addrPtr += 2; + 7f14: 4e 5f subi r20, 0xFE ; 254 + 7f16: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 7f18: f1 e0 ldi r31, 0x01 ; 1 + 7f1a: a0 38 cpi r26, 0x80 ; 128 + 7f1c: bf 07 cpc r27, r31 + 7f1e: 49 f7 brne .-46 ; 0x7ef2 + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 7f20: e0 91 00 02 lds r30, 0x0200 + 7f24: f0 91 01 02 lds r31, 0x0201 + 7f28: e0 92 57 00 sts 0x0057, r14 + 7f2c: e8 95 spm + boot_spm_busy_wait(); + 7f2e: 07 b6 in r0, 0x37 ; 55 + 7f30: 00 fc sbrc r0, 0 + 7f32: fd cf rjmp .-6 ; 0x7f2e + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 7f34: f0 92 57 00 sts 0x0057, r15 + 7f38: e8 95 spm + 7f3a: 27 c0 rjmp .+78 ; 0x7f8a +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 7f3c: 84 37 cpi r24, 0x74 ; 116 + 7f3e: b9 f4 brne .+46 ; 0x7f6e + // READ PAGE - we only read flash + getLen(); + 7f40: 37 d0 rcall .+110 ; 0x7fb0 + verifySpace(); + 7f42: 46 d0 rcall .+140 ; 0x7fd0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 7f44: e0 91 00 02 lds r30, 0x0200 + 7f48: f0 91 01 02 lds r31, 0x0201 + 7f4c: 31 96 adiw r30, 0x01 ; 1 + 7f4e: f0 93 01 02 sts 0x0201, r31 + 7f52: e0 93 00 02 sts 0x0200, r30 + 7f56: 31 97 sbiw r30, 0x01 ; 1 + 7f58: e4 91 lpm r30, Z+ + 7f5a: 8e 2f mov r24, r30 + 7f5c: 19 d0 rcall .+50 ; 0x7f90 + while (--length); + 7f5e: 80 91 02 02 lds r24, 0x0202 + 7f62: 81 50 subi r24, 0x01 ; 1 + 7f64: 80 93 02 02 sts 0x0202, r24 + 7f68: 88 23 and r24, r24 + 7f6a: 61 f7 brne .-40 ; 0x7f44 + 7f6c: 0e c0 rjmp .+28 ; 0x7f8a +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 7f6e: 85 37 cpi r24, 0x75 ; 117 + 7f70: 39 f4 brne .+14 ; 0x7f80 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 7f72: 2e d0 rcall .+92 ; 0x7fd0 + putch(SIGNATURE_0); + 7f74: 8e e1 ldi r24, 0x1E ; 30 + 7f76: 0c d0 rcall .+24 ; 0x7f90 + putch(SIGNATURE_1); + 7f78: 85 e9 ldi r24, 0x95 ; 149 + 7f7a: 0a d0 rcall .+20 ; 0x7f90 + putch(SIGNATURE_2); + 7f7c: 8f e0 ldi r24, 0x0F ; 15 + 7f7e: 96 cf rjmp .-212 ; 0x7eac + } + else if (ch == 'Q') { + 7f80: 81 35 cpi r24, 0x51 ; 81 + 7f82: 11 f4 brne .+4 ; 0x7f88 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 7f84: 88 e0 ldi r24, 0x08 ; 8 + 7f86: 19 d0 rcall .+50 ; 0x7fba + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 7f88: 23 d0 rcall .+70 ; 0x7fd0 + } + putch(STK_OK); + 7f8a: 80 e1 ldi r24, 0x10 ; 16 + 7f8c: 01 d0 rcall .+2 ; 0x7f90 + 7f8e: 63 cf rjmp .-314 ; 0x7e56 + +00007f90 : + } +} + +void putch(char ch) { + 7f90: 98 2f mov r25, r24 +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + 7f92: 80 91 c0 00 lds r24, 0x00C0 + 7f96: 85 ff sbrs r24, 5 + 7f98: fc cf rjmp .-8 ; 0x7f92 + UDR0 = ch; + 7f9a: 90 93 c6 00 sts 0x00C6, r25 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 7f9e: 08 95 ret + +00007fa0 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 7fa0: a8 95 wdr + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))); + 7fa2: 80 91 c0 00 lds r24, 0x00C0 + 7fa6: 87 ff sbrs r24, 7 + 7fa8: fc cf rjmp .-8 ; 0x7fa2 + ch = UDR0; + 7faa: 80 91 c6 00 lds r24, 0x00C6 +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 7fae: 08 95 ret + +00007fb0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 7fb0: f7 df rcall .-18 ; 0x7fa0 + length = getch(); + 7fb2: f6 df rcall .-20 ; 0x7fa0 + 7fb4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 7fb8: f3 cf rjmp .-26 ; 0x7fa0 + +00007fba : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 7fba: e0 e6 ldi r30, 0x60 ; 96 + 7fbc: f0 e0 ldi r31, 0x00 ; 0 + 7fbe: 98 e1 ldi r25, 0x18 ; 24 + 7fc0: 90 83 st Z, r25 + WDTCSR = x; + 7fc2: 80 83 st Z, r24 +} + 7fc4: 08 95 ret + +00007fc6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 7fc6: 80 e0 ldi r24, 0x00 ; 0 + 7fc8: f8 df rcall .-16 ; 0x7fba + __asm__ __volatile__ ( + 7fca: ee 27 eor r30, r30 + 7fcc: ff 27 eor r31, r31 + 7fce: 09 94 ijmp + +00007fd0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 7fd0: e7 df rcall .-50 ; 0x7fa0 + 7fd2: 80 32 cpi r24, 0x20 ; 32 + 7fd4: 09 f0 breq .+2 ; 0x7fd8 + 7fd6: f7 df rcall .-18 ; 0x7fc6 + putch(STK_INSYNC); + 7fd8: 84 e1 ldi r24, 0x14 ; 20 +} + 7fda: da cf rjmp .-76 ; 0x7f90 + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 7fdc: 1f 93 push r17 + 7fde: 18 2f mov r17, r24 + +00007fe0 : + do getch(); while (--count); + 7fe0: df df rcall .-66 ; 0x7fa0 + 7fe2: 11 50 subi r17, 0x01 ; 1 + 7fe4: e9 f7 brne .-6 ; 0x7fe0 + verifySpace(); + 7fe6: f4 df rcall .-24 ; 0x7fd0 +} + 7fe8: 1f 91 pop r17 + 7fea: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.hex new file mode 100644 index 0000000..1e93414 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.hex @@ -0,0 +1,33 @@ +:103E000085E08093810082E08093C00088E1809308 +:103E1000C10086E08093C20080E18093C40084B733 +:103E200014BE81FFD0D08DE0C8D0259A86E020E373 +:103E30003CEF91E0309385002093840096BBB09BCB +:103E4000FECF1D9AA8958150A9F7DD24D394A5E053 +:103E5000EA2EF1E1FF2EA4D0813421F481E0BED01E +:103E600083E024C0823411F484E103C0853419F462 +:103E700085E0B4D08AC08535A1F492D0082F10E037 +:103E800010930102009300028BD090E0982F8827B6 +:103E9000802B912B880F991F909301028093000231 +:103EA00073C0863529F484E099D080E071D06DC06C +:103EB000843609F043C07CD0E0910002F091010209 +:103EC00083E080935700E895C0E0D1E069D0899302 +:103ED000809102028150809302028823B9F778D042 +:103EE00007B600FCFDCF4091000250910102A0E016 +:103EF000B1E02C9130E011968C91119790E0982FC1 +:103F00008827822B932B1296FA010C01D09257002E +:103F1000E89511244E5F5F4FF1E0A038BF0749F7E5 +:103F2000E0910002F0910102E0925700E89507B697 +:103F300000FCFDCFF0925700E89527C08437B9F414 +:103F400037D046D0E0910002F09101023196F09313 +:103F50000102E09300023197E4918E2F19D08091F5 +:103F60000202815080930202882361F70EC08537D8 +:103F700039F42ED08EE10CD084E90AD086E096CFB9 +:103F8000813511F488E019D023D080E101D063CFCE +:103F9000982F8091C00085FFFCCF9093C6000895B4 +:103FA000A8958091C00087FFFCCF8091C60008953E +:103FB000F7DFF6DF80930202F3CFE0E6F0E098E16E +:103FC00090838083089580E0F8DFEE27FF2709942F +:103FD000E7DF803209F0F7DF84E1DACF1F93182F93 +:0C3FE000DFDF1150E9F7F4DF1F910895B6 +:0400000300003E00BB +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.lst new file mode 100644 index 0000000..1121893 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_diecimila.lst @@ -0,0 +1,520 @@ + +optiboot_diecimila.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001ec 00003e00 00003e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000240 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 0000006a 00000000 00000000 00000268 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000269 00000000 00000000 000002d2 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000196 00000000 00000000 0000053b 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003d3 00000000 00000000 000006d1 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 00000090 00000000 00000000 00000aa4 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 00000135 00000000 00000000 00000b34 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001d1 00000000 00000000 00000c69 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000068 00000000 00000000 00000e3a 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3e00: 85 e0 ldi r24, 0x05 ; 5 + 3e02: 80 93 81 00 sts 0x0081, r24 +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif +#ifndef SOFT_UART + UCSR0A = _BV(U2X0); //Double speed mode USART0 + 3e06: 82 e0 ldi r24, 0x02 ; 2 + 3e08: 80 93 c0 00 sts 0x00C0, r24 + UCSR0B = _BV(RXEN0) | _BV(TXEN0); + 3e0c: 88 e1 ldi r24, 0x18 ; 24 + 3e0e: 80 93 c1 00 sts 0x00C1, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + 3e12: 86 e0 ldi r24, 0x06 ; 6 + 3e14: 80 93 c2 00 sts 0x00C2, r24 + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 3e18: 80 e1 ldi r24, 0x10 ; 16 + 3e1a: 80 93 c4 00 sts 0x00C4, r24 +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 3e1e: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 3e20: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 3e22: 81 ff sbrs r24, 1 + 3e24: d0 d0 rcall .+416 ; 0x3fc6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 3e26: 8d e0 ldi r24, 0x0D ; 13 + 3e28: c8 d0 rcall .+400 ; 0x3fba + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e2a: 25 9a sbi 0x04, 5 ; 4 + 3e2c: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e2e: 20 e3 ldi r18, 0x30 ; 48 + 3e30: 3c ef ldi r19, 0xFC ; 252 + TIFR1 = _BV(TOV1); + 3e32: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e34: 30 93 85 00 sts 0x0085, r19 + 3e38: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 3e3c: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e3e: b0 9b sbis 0x16, 0 ; 22 + 3e40: fe cf rjmp .-4 ; 0x3e3e + LED_PIN |= _BV(LED); + 3e42: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e44: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 3e46: 81 50 subi r24, 0x01 ; 1 + 3e48: a9 f7 brne .-22 ; 0x3e34 + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e4a: dd 24 eor r13, r13 + 3e4c: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3e4e: a5 e0 ldi r26, 0x05 ; 5 + 3e50: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3e52: f1 e1 ldi r31, 0x11 ; 17 + 3e54: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e56: a4 d0 rcall .+328 ; 0x3fa0 + + if(ch == STK_GET_PARAMETER) { + 3e58: 81 34 cpi r24, 0x41 ; 65 + 3e5a: 21 f4 brne .+8 ; 0x3e64 + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e5c: 81 e0 ldi r24, 0x01 ; 1 + 3e5e: be d0 rcall .+380 ; 0x3fdc + putch(0x03); + 3e60: 83 e0 ldi r24, 0x03 ; 3 + 3e62: 24 c0 rjmp .+72 ; 0x3eac + } + else if(ch == STK_SET_DEVICE) { + 3e64: 82 34 cpi r24, 0x42 ; 66 + 3e66: 11 f4 brne .+4 ; 0x3e6c + // SET DEVICE is ignored + getNch(20); + 3e68: 84 e1 ldi r24, 0x14 ; 20 + 3e6a: 03 c0 rjmp .+6 ; 0x3e72 + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e6c: 85 34 cpi r24, 0x45 ; 69 + 3e6e: 19 f4 brne .+6 ; 0x3e76 + // SET DEVICE EXT is ignored + getNch(5); + 3e70: 85 e0 ldi r24, 0x05 ; 5 + 3e72: b4 d0 rcall .+360 ; 0x3fdc + 3e74: 8a c0 rjmp .+276 ; 0x3f8a + } + else if(ch == STK_LOAD_ADDRESS) { + 3e76: 85 35 cpi r24, 0x55 ; 85 + 3e78: a1 f4 brne .+40 ; 0x3ea2 + // LOAD ADDRESS + address = getch(); + 3e7a: 92 d0 rcall .+292 ; 0x3fa0 + 3e7c: 08 2f mov r16, r24 + 3e7e: 10 e0 ldi r17, 0x00 ; 0 + 3e80: 10 93 01 02 sts 0x0201, r17 + 3e84: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 3e88: 8b d0 rcall .+278 ; 0x3fa0 + 3e8a: 90 e0 ldi r25, 0x00 ; 0 + 3e8c: 98 2f mov r25, r24 + 3e8e: 88 27 eor r24, r24 + 3e90: 80 2b or r24, r16 + 3e92: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 3e94: 88 0f add r24, r24 + 3e96: 99 1f adc r25, r25 + 3e98: 90 93 01 02 sts 0x0201, r25 + 3e9c: 80 93 00 02 sts 0x0200, r24 + 3ea0: 73 c0 rjmp .+230 ; 0x3f88 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3ea2: 86 35 cpi r24, 0x56 ; 86 + 3ea4: 29 f4 brne .+10 ; 0x3eb0 + // UNIVERSAL command is ignored + getNch(4); + 3ea6: 84 e0 ldi r24, 0x04 ; 4 + 3ea8: 99 d0 rcall .+306 ; 0x3fdc + putch(0x00); + 3eaa: 80 e0 ldi r24, 0x00 ; 0 + 3eac: 71 d0 rcall .+226 ; 0x3f90 + 3eae: 6d c0 rjmp .+218 ; 0x3f8a + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3eb0: 84 36 cpi r24, 0x64 ; 100 + 3eb2: 09 f0 breq .+2 ; 0x3eb6 + 3eb4: 43 c0 rjmp .+134 ; 0x3f3c + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 3eb6: 7c d0 rcall .+248 ; 0x3fb0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 3eb8: e0 91 00 02 lds r30, 0x0200 + 3ebc: f0 91 01 02 lds r31, 0x0201 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 80 93 57 00 sts 0x0057, r24 + 3ec6: e8 95 spm + 3ec8: c0 e0 ldi r28, 0x00 ; 0 + 3eca: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 3ecc: 69 d0 rcall .+210 ; 0x3fa0 + 3ece: 89 93 st Y+, r24 + while (--length); + 3ed0: 80 91 02 02 lds r24, 0x0202 + 3ed4: 81 50 subi r24, 0x01 ; 1 + 3ed6: 80 93 02 02 sts 0x0202, r24 + 3eda: 88 23 and r24, r24 + 3edc: b9 f7 brne .-18 ; 0x3ecc + + // Read command terminator, start reply + verifySpace(); + 3ede: 78 d0 rcall .+240 ; 0x3fd0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 3ee0: 07 b6 in r0, 0x37 ; 55 + 3ee2: 00 fc sbrc r0, 0 + 3ee4: fd cf rjmp .-6 ; 0x3ee0 + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 3ee6: 40 91 00 02 lds r20, 0x0200 + 3eea: 50 91 01 02 lds r21, 0x0201 + 3eee: a0 e0 ldi r26, 0x00 ; 0 + 3ef0: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 3ef2: 2c 91 ld r18, X + 3ef4: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 3ef6: 11 96 adiw r26, 0x01 ; 1 + 3ef8: 8c 91 ld r24, X + 3efa: 11 97 sbiw r26, 0x01 ; 1 + 3efc: 90 e0 ldi r25, 0x00 ; 0 + 3efe: 98 2f mov r25, r24 + 3f00: 88 27 eor r24, r24 + 3f02: 82 2b or r24, r18 + 3f04: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3f06: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 3f08: fa 01 movw r30, r20 + 3f0a: 0c 01 movw r0, r24 + 3f0c: d0 92 57 00 sts 0x0057, r13 + 3f10: e8 95 spm + 3f12: 11 24 eor r1, r1 + addrPtr += 2; + 3f14: 4e 5f subi r20, 0xFE ; 254 + 3f16: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 3f18: f1 e0 ldi r31, 0x01 ; 1 + 3f1a: a0 38 cpi r26, 0x80 ; 128 + 3f1c: bf 07 cpc r27, r31 + 3f1e: 49 f7 brne .-46 ; 0x3ef2 + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3f20: e0 91 00 02 lds r30, 0x0200 + 3f24: f0 91 01 02 lds r31, 0x0201 + 3f28: e0 92 57 00 sts 0x0057, r14 + 3f2c: e8 95 spm + boot_spm_busy_wait(); + 3f2e: 07 b6 in r0, 0x37 ; 55 + 3f30: 00 fc sbrc r0, 0 + 3f32: fd cf rjmp .-6 ; 0x3f2e + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3f34: f0 92 57 00 sts 0x0057, r15 + 3f38: e8 95 spm + 3f3a: 27 c0 rjmp .+78 ; 0x3f8a +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f3c: 84 37 cpi r24, 0x74 ; 116 + 3f3e: b9 f4 brne .+46 ; 0x3f6e + // READ PAGE - we only read flash + getLen(); + 3f40: 37 d0 rcall .+110 ; 0x3fb0 + verifySpace(); + 3f42: 46 d0 rcall .+140 ; 0x3fd0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 3f44: e0 91 00 02 lds r30, 0x0200 + 3f48: f0 91 01 02 lds r31, 0x0201 + 3f4c: 31 96 adiw r30, 0x01 ; 1 + 3f4e: f0 93 01 02 sts 0x0201, r31 + 3f52: e0 93 00 02 sts 0x0200, r30 + 3f56: 31 97 sbiw r30, 0x01 ; 1 + 3f58: e4 91 lpm r30, Z+ + 3f5a: 8e 2f mov r24, r30 + 3f5c: 19 d0 rcall .+50 ; 0x3f90 + while (--length); + 3f5e: 80 91 02 02 lds r24, 0x0202 + 3f62: 81 50 subi r24, 0x01 ; 1 + 3f64: 80 93 02 02 sts 0x0202, r24 + 3f68: 88 23 and r24, r24 + 3f6a: 61 f7 brne .-40 ; 0x3f44 + 3f6c: 0e c0 rjmp .+28 ; 0x3f8a +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f6e: 85 37 cpi r24, 0x75 ; 117 + 3f70: 39 f4 brne .+14 ; 0x3f80 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f72: 2e d0 rcall .+92 ; 0x3fd0 + putch(SIGNATURE_0); + 3f74: 8e e1 ldi r24, 0x1E ; 30 + 3f76: 0c d0 rcall .+24 ; 0x3f90 + putch(SIGNATURE_1); + 3f78: 84 e9 ldi r24, 0x94 ; 148 + 3f7a: 0a d0 rcall .+20 ; 0x3f90 + putch(SIGNATURE_2); + 3f7c: 86 e0 ldi r24, 0x06 ; 6 + 3f7e: 96 cf rjmp .-212 ; 0x3eac + } + else if (ch == 'Q') { + 3f80: 81 35 cpi r24, 0x51 ; 81 + 3f82: 11 f4 brne .+4 ; 0x3f88 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f84: 88 e0 ldi r24, 0x08 ; 8 + 3f86: 19 d0 rcall .+50 ; 0x3fba + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f88: 23 d0 rcall .+70 ; 0x3fd0 + } + putch(STK_OK); + 3f8a: 80 e1 ldi r24, 0x10 ; 16 + 3f8c: 01 d0 rcall .+2 ; 0x3f90 + 3f8e: 63 cf rjmp .-314 ; 0x3e56 + +00003f90 : + } +} + +void putch(char ch) { + 3f90: 98 2f mov r25, r24 +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + 3f92: 80 91 c0 00 lds r24, 0x00C0 + 3f96: 85 ff sbrs r24, 5 + 3f98: fc cf rjmp .-8 ; 0x3f92 + UDR0 = ch; + 3f9a: 90 93 c6 00 sts 0x00C6, r25 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 3f9e: 08 95 ret + +00003fa0 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3fa0: a8 95 wdr + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))); + 3fa2: 80 91 c0 00 lds r24, 0x00C0 + 3fa6: 87 ff sbrs r24, 7 + 3fa8: fc cf rjmp .-8 ; 0x3fa2 + ch = UDR0; + 3faa: 80 91 c6 00 lds r24, 0x00C6 +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 3fae: 08 95 ret + +00003fb0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 3fb0: f7 df rcall .-18 ; 0x3fa0 + length = getch(); + 3fb2: f6 df rcall .-20 ; 0x3fa0 + 3fb4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 3fb8: f3 cf rjmp .-26 ; 0x3fa0 + +00003fba : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3fba: e0 e6 ldi r30, 0x60 ; 96 + 3fbc: f0 e0 ldi r31, 0x00 ; 0 + 3fbe: 98 e1 ldi r25, 0x18 ; 24 + 3fc0: 90 83 st Z, r25 + WDTCSR = x; + 3fc2: 80 83 st Z, r24 +} + 3fc4: 08 95 ret + +00003fc6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 3fc6: 80 e0 ldi r24, 0x00 ; 0 + 3fc8: f8 df rcall .-16 ; 0x3fba + __asm__ __volatile__ ( + 3fca: ee 27 eor r30, r30 + 3fcc: ff 27 eor r31, r31 + 3fce: 09 94 ijmp + +00003fd0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 3fd0: e7 df rcall .-50 ; 0x3fa0 + 3fd2: 80 32 cpi r24, 0x20 ; 32 + 3fd4: 09 f0 breq .+2 ; 0x3fd8 + 3fd6: f7 df rcall .-18 ; 0x3fc6 + putch(STK_INSYNC); + 3fd8: 84 e1 ldi r24, 0x14 ; 20 +} + 3fda: da cf rjmp .-76 ; 0x3f90 + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fdc: 1f 93 push r17 + 3fde: 18 2f mov r17, r24 + +00003fe0 : + do getch(); while (--count); + 3fe0: df df rcall .-66 ; 0x3fa0 + 3fe2: 11 50 subi r17, 0x01 ; 1 + 3fe4: e9 f7 brne .-6 ; 0x3fe0 + verifySpace(); + 3fe6: f4 df rcall .-24 ; 0x3fd0 +} + 3fe8: 1f 91 pop r17 + 3fea: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.hex new file mode 100644 index 0000000..9d31a7a --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.hex @@ -0,0 +1,34 @@ +:103E000085E08093810084B714BE81FFE4D08DE00B +:103E1000DCD0259A519A86E028E13EEF91E030937C +:103E200085002093840096BBB09BFECF1D9AA89579 +:103E30008150A9F7DD24D394A5E0EA2EF1E1FF2E0D +:103E4000ABD0813421F481E0D1D083E024C082342E +:103E500011F484E103C0853419F485E0C7D08AC029 +:103E60008535A1F499D0082F10E01093010200933A +:103E7000000292D090E0982F8827802B912B880FFA +:103E8000991F909301028093000273C0863529F434 +:103E900084E0ACD080E071D06DC0843609F043C0BE +:103EA0008FD0E0910002F091010283E080935700EF +:103EB000E895C0E0D1E070D08993809102028150F2 +:103EC000809302028823B9F78BD007B600FCFDCFA0 +:103ED0004091000250910102A0E0B1E02C9130E04D +:103EE00011968C91119790E0982F8827822B932B15 +:103EF0001296FA010C01D0925700E89511244E5FFA +:103F00005F4FF1E0A038BF0749F7E0910002F09160 +:103F10000102E0925700E89507B600FCFDCFF09251 +:103F20005700E89527C08437B9F44AD059D0E091BA +:103F30000002F09101023196F0930102E093000239 +:103F40003197E4918E2F19D0809102028150809395 +:103F50000202882361F70EC0853739F441D08EE123 +:103F60000CD084E90AD086E096CF813511F488E040 +:103F70002CD036D080E101D063CF2AE030E08095AC +:103F8000089410F4599802C0599A000015D014D022 +:103F900086952A95B1F70895A89529E030E04899CB +:103FA000FECF0AD009D008D08894489908942A9561 +:103FB00011F08795F7CF089598E09A95F1F7089555 +:103FC000EBDFEADF80930202E7CFE0E6F0E098E182 +:103FD00090838083089580E0F8DFEE27FF2709941F +:103FE000DBDF803209F0F7DF84E1C7CF1F93182FA2 +:0C3FF000D3DF1150E9F7F4DF1F910895B2 +:0400000300003E00BB +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.lst new file mode 100644 index 0000000..0e46bd1 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad.lst @@ -0,0 +1,533 @@ + +optiboot_lilypad.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001fc 00003e00 00003e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000250 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 00000078 00000000 00000000 00000278 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000277 00000000 00000000 000002f0 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000194 00000000 00000000 00000567 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003bb 00000000 00000000 000006fb 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 000000a0 00000000 00000000 00000ab8 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 0000013f 00000000 00000000 00000b58 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001a0 00000000 00000000 00000c97 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000070 00000000 00000000 00000e37 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3e00: 85 e0 ldi r24, 0x05 ; 5 + 3e02: 80 93 81 00 sts 0x0081, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 3e06: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 3e08: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 3e0a: 81 ff sbrs r24, 1 + 3e0c: e4 d0 rcall .+456 ; 0x3fd6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 3e0e: 8d e0 ldi r24, 0x0D ; 13 + 3e10: dc d0 rcall .+440 ; 0x3fca + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e12: 25 9a sbi 0x04, 5 ; 4 + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); + 3e14: 51 9a sbi 0x0a, 1 ; 10 + 3e16: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e18: 28 e1 ldi r18, 0x18 ; 24 + 3e1a: 3e ef ldi r19, 0xFE ; 254 + TIFR1 = _BV(TOV1); + 3e1c: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e1e: 30 93 85 00 sts 0x0085, r19 + 3e22: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 3e26: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e28: b0 9b sbis 0x16, 0 ; 22 + 3e2a: fe cf rjmp .-4 ; 0x3e28 + LED_PIN |= _BV(LED); + 3e2c: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e2e: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 3e30: 81 50 subi r24, 0x01 ; 1 + 3e32: a9 f7 brne .-22 ; 0x3e1e + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e34: dd 24 eor r13, r13 + 3e36: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3e38: a5 e0 ldi r26, 0x05 ; 5 + 3e3a: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3e3c: f1 e1 ldi r31, 0x11 ; 17 + 3e3e: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e40: ab d0 rcall .+342 ; 0x3f98 + + if(ch == STK_GET_PARAMETER) { + 3e42: 81 34 cpi r24, 0x41 ; 65 + 3e44: 21 f4 brne .+8 ; 0x3e4e + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e46: 81 e0 ldi r24, 0x01 ; 1 + 3e48: d1 d0 rcall .+418 ; 0x3fec + putch(0x03); + 3e4a: 83 e0 ldi r24, 0x03 ; 3 + 3e4c: 24 c0 rjmp .+72 ; 0x3e96 + } + else if(ch == STK_SET_DEVICE) { + 3e4e: 82 34 cpi r24, 0x42 ; 66 + 3e50: 11 f4 brne .+4 ; 0x3e56 + // SET DEVICE is ignored + getNch(20); + 3e52: 84 e1 ldi r24, 0x14 ; 20 + 3e54: 03 c0 rjmp .+6 ; 0x3e5c + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e56: 85 34 cpi r24, 0x45 ; 69 + 3e58: 19 f4 brne .+6 ; 0x3e60 + // SET DEVICE EXT is ignored + getNch(5); + 3e5a: 85 e0 ldi r24, 0x05 ; 5 + 3e5c: c7 d0 rcall .+398 ; 0x3fec + 3e5e: 8a c0 rjmp .+276 ; 0x3f74 + } + else if(ch == STK_LOAD_ADDRESS) { + 3e60: 85 35 cpi r24, 0x55 ; 85 + 3e62: a1 f4 brne .+40 ; 0x3e8c + // LOAD ADDRESS + address = getch(); + 3e64: 99 d0 rcall .+306 ; 0x3f98 + 3e66: 08 2f mov r16, r24 + 3e68: 10 e0 ldi r17, 0x00 ; 0 + 3e6a: 10 93 01 02 sts 0x0201, r17 + 3e6e: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 3e72: 92 d0 rcall .+292 ; 0x3f98 + 3e74: 90 e0 ldi r25, 0x00 ; 0 + 3e76: 98 2f mov r25, r24 + 3e78: 88 27 eor r24, r24 + 3e7a: 80 2b or r24, r16 + 3e7c: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 3e7e: 88 0f add r24, r24 + 3e80: 99 1f adc r25, r25 + 3e82: 90 93 01 02 sts 0x0201, r25 + 3e86: 80 93 00 02 sts 0x0200, r24 + 3e8a: 73 c0 rjmp .+230 ; 0x3f72 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3e8c: 86 35 cpi r24, 0x56 ; 86 + 3e8e: 29 f4 brne .+10 ; 0x3e9a + // UNIVERSAL command is ignored + getNch(4); + 3e90: 84 e0 ldi r24, 0x04 ; 4 + 3e92: ac d0 rcall .+344 ; 0x3fec + putch(0x00); + 3e94: 80 e0 ldi r24, 0x00 ; 0 + 3e96: 71 d0 rcall .+226 ; 0x3f7a + 3e98: 6d c0 rjmp .+218 ; 0x3f74 + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3e9a: 84 36 cpi r24, 0x64 ; 100 + 3e9c: 09 f0 breq .+2 ; 0x3ea0 + 3e9e: 43 c0 rjmp .+134 ; 0x3f26 + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 3ea0: 8f d0 rcall .+286 ; 0x3fc0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 3ea2: e0 91 00 02 lds r30, 0x0200 + 3ea6: f0 91 01 02 lds r31, 0x0201 + 3eaa: 83 e0 ldi r24, 0x03 ; 3 + 3eac: 80 93 57 00 sts 0x0057, r24 + 3eb0: e8 95 spm + 3eb2: c0 e0 ldi r28, 0x00 ; 0 + 3eb4: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 3eb6: 70 d0 rcall .+224 ; 0x3f98 + 3eb8: 89 93 st Y+, r24 + while (--length); + 3eba: 80 91 02 02 lds r24, 0x0202 + 3ebe: 81 50 subi r24, 0x01 ; 1 + 3ec0: 80 93 02 02 sts 0x0202, r24 + 3ec4: 88 23 and r24, r24 + 3ec6: b9 f7 brne .-18 ; 0x3eb6 + + // Read command terminator, start reply + verifySpace(); + 3ec8: 8b d0 rcall .+278 ; 0x3fe0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 3eca: 07 b6 in r0, 0x37 ; 55 + 3ecc: 00 fc sbrc r0, 0 + 3ece: fd cf rjmp .-6 ; 0x3eca + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 3ed0: 40 91 00 02 lds r20, 0x0200 + 3ed4: 50 91 01 02 lds r21, 0x0201 + 3ed8: a0 e0 ldi r26, 0x00 ; 0 + 3eda: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 3edc: 2c 91 ld r18, X + 3ede: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 3ee0: 11 96 adiw r26, 0x01 ; 1 + 3ee2: 8c 91 ld r24, X + 3ee4: 11 97 sbiw r26, 0x01 ; 1 + 3ee6: 90 e0 ldi r25, 0x00 ; 0 + 3ee8: 98 2f mov r25, r24 + 3eea: 88 27 eor r24, r24 + 3eec: 82 2b or r24, r18 + 3eee: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3ef0: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 3ef2: fa 01 movw r30, r20 + 3ef4: 0c 01 movw r0, r24 + 3ef6: d0 92 57 00 sts 0x0057, r13 + 3efa: e8 95 spm + 3efc: 11 24 eor r1, r1 + addrPtr += 2; + 3efe: 4e 5f subi r20, 0xFE ; 254 + 3f00: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 3f02: f1 e0 ldi r31, 0x01 ; 1 + 3f04: a0 38 cpi r26, 0x80 ; 128 + 3f06: bf 07 cpc r27, r31 + 3f08: 49 f7 brne .-46 ; 0x3edc + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3f0a: e0 91 00 02 lds r30, 0x0200 + 3f0e: f0 91 01 02 lds r31, 0x0201 + 3f12: e0 92 57 00 sts 0x0057, r14 + 3f16: e8 95 spm + boot_spm_busy_wait(); + 3f18: 07 b6 in r0, 0x37 ; 55 + 3f1a: 00 fc sbrc r0, 0 + 3f1c: fd cf rjmp .-6 ; 0x3f18 + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3f1e: f0 92 57 00 sts 0x0057, r15 + 3f22: e8 95 spm + 3f24: 27 c0 rjmp .+78 ; 0x3f74 +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f26: 84 37 cpi r24, 0x74 ; 116 + 3f28: b9 f4 brne .+46 ; 0x3f58 + // READ PAGE - we only read flash + getLen(); + 3f2a: 4a d0 rcall .+148 ; 0x3fc0 + verifySpace(); + 3f2c: 59 d0 rcall .+178 ; 0x3fe0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 3f2e: e0 91 00 02 lds r30, 0x0200 + 3f32: f0 91 01 02 lds r31, 0x0201 + 3f36: 31 96 adiw r30, 0x01 ; 1 + 3f38: f0 93 01 02 sts 0x0201, r31 + 3f3c: e0 93 00 02 sts 0x0200, r30 + 3f40: 31 97 sbiw r30, 0x01 ; 1 + 3f42: e4 91 lpm r30, Z+ + 3f44: 8e 2f mov r24, r30 + 3f46: 19 d0 rcall .+50 ; 0x3f7a + while (--length); + 3f48: 80 91 02 02 lds r24, 0x0202 + 3f4c: 81 50 subi r24, 0x01 ; 1 + 3f4e: 80 93 02 02 sts 0x0202, r24 + 3f52: 88 23 and r24, r24 + 3f54: 61 f7 brne .-40 ; 0x3f2e + 3f56: 0e c0 rjmp .+28 ; 0x3f74 +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f58: 85 37 cpi r24, 0x75 ; 117 + 3f5a: 39 f4 brne .+14 ; 0x3f6a + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f5c: 41 d0 rcall .+130 ; 0x3fe0 + putch(SIGNATURE_0); + 3f5e: 8e e1 ldi r24, 0x1E ; 30 + 3f60: 0c d0 rcall .+24 ; 0x3f7a + putch(SIGNATURE_1); + 3f62: 84 e9 ldi r24, 0x94 ; 148 + 3f64: 0a d0 rcall .+20 ; 0x3f7a + putch(SIGNATURE_2); + 3f66: 86 e0 ldi r24, 0x06 ; 6 + 3f68: 96 cf rjmp .-212 ; 0x3e96 + } + else if (ch == 'Q') { + 3f6a: 81 35 cpi r24, 0x51 ; 81 + 3f6c: 11 f4 brne .+4 ; 0x3f72 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f6e: 88 e0 ldi r24, 0x08 ; 8 + 3f70: 2c d0 rcall .+88 ; 0x3fca + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f72: 36 d0 rcall .+108 ; 0x3fe0 + } + putch(STK_OK); + 3f74: 80 e1 ldi r24, 0x10 ; 16 + 3f76: 01 d0 rcall .+2 ; 0x3f7a + 3f78: 63 cf rjmp .-314 ; 0x3e40 + +00003f7a : +void putch(char ch) { +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + UDR0 = ch; +#else + __asm__ __volatile__ ( + 3f7a: 2a e0 ldi r18, 0x0A ; 10 + 3f7c: 30 e0 ldi r19, 0x00 ; 0 + 3f7e: 80 95 com r24 + 3f80: 08 94 sec + 3f82: 10 f4 brcc .+4 ; 0x3f88 + 3f84: 59 98 cbi 0x0b, 1 ; 11 + 3f86: 02 c0 rjmp .+4 ; 0x3f8c + 3f88: 59 9a sbi 0x0b, 1 ; 11 + 3f8a: 00 00 nop + 3f8c: 15 d0 rcall .+42 ; 0x3fb8 + 3f8e: 14 d0 rcall .+40 ; 0x3fb8 + 3f90: 86 95 lsr r24 + 3f92: 2a 95 dec r18 + 3f94: b1 f7 brne .-20 ; 0x3f82 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 3f96: 08 95 ret + +00003f98 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3f98: a8 95 wdr +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 3f9a: 29 e0 ldi r18, 0x09 ; 9 + 3f9c: 30 e0 ldi r19, 0x00 ; 0 + 3f9e: 48 99 sbic 0x09, 0 ; 9 + 3fa0: fe cf rjmp .-4 ; 0x3f9e + 3fa2: 0a d0 rcall .+20 ; 0x3fb8 + 3fa4: 09 d0 rcall .+18 ; 0x3fb8 + 3fa6: 08 d0 rcall .+16 ; 0x3fb8 + 3fa8: 88 94 clc + 3faa: 48 99 sbic 0x09, 0 ; 9 + 3fac: 08 94 sec + 3fae: 2a 95 dec r18 + 3fb0: 11 f0 breq .+4 ; 0x3fb6 + 3fb2: 87 95 ror r24 + 3fb4: f7 cf rjmp .-18 ; 0x3fa4 + 3fb6: 08 95 ret + +00003fb8 : +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + 3fb8: 98 e0 ldi r25, 0x08 ; 8 + 3fba: 9a 95 dec r25 + 3fbc: f1 f7 brne .-4 ; 0x3fba + 3fbe: 08 95 ret + +00003fc0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 3fc0: eb df rcall .-42 ; 0x3f98 + length = getch(); + 3fc2: ea df rcall .-44 ; 0x3f98 + 3fc4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 3fc8: e7 cf rjmp .-50 ; 0x3f98 + +00003fca : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3fca: e0 e6 ldi r30, 0x60 ; 96 + 3fcc: f0 e0 ldi r31, 0x00 ; 0 + 3fce: 98 e1 ldi r25, 0x18 ; 24 + 3fd0: 90 83 st Z, r25 + WDTCSR = x; + 3fd2: 80 83 st Z, r24 +} + 3fd4: 08 95 ret + +00003fd6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 3fd6: 80 e0 ldi r24, 0x00 ; 0 + 3fd8: f8 df rcall .-16 ; 0x3fca + __asm__ __volatile__ ( + 3fda: ee 27 eor r30, r30 + 3fdc: ff 27 eor r31, r31 + 3fde: 09 94 ijmp + +00003fe0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 3fe0: db df rcall .-74 ; 0x3f98 + 3fe2: 80 32 cpi r24, 0x20 ; 32 + 3fe4: 09 f0 breq .+2 ; 0x3fe8 + 3fe6: f7 df rcall .-18 ; 0x3fd6 + putch(STK_INSYNC); + 3fe8: 84 e1 ldi r24, 0x14 ; 20 +} + 3fea: c7 cf rjmp .-114 ; 0x3f7a + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fec: 1f 93 push r17 + 3fee: 18 2f mov r17, r24 + +00003ff0 : + do getch(); while (--count); + 3ff0: d3 df rcall .-90 ; 0x3f98 + 3ff2: 11 50 subi r17, 0x01 ; 1 + 3ff4: e9 f7 brne .-6 ; 0x3ff0 + verifySpace(); + 3ff6: f4 df rcall .-24 ; 0x3fe0 +} + 3ff8: 1f 91 pop r17 + 3ffa: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.hex new file mode 100644 index 0000000..9d31a7a --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.hex @@ -0,0 +1,34 @@ +:103E000085E08093810084B714BE81FFE4D08DE00B +:103E1000DCD0259A519A86E028E13EEF91E030937C +:103E200085002093840096BBB09BFECF1D9AA89579 +:103E30008150A9F7DD24D394A5E0EA2EF1E1FF2E0D +:103E4000ABD0813421F481E0D1D083E024C082342E +:103E500011F484E103C0853419F485E0C7D08AC029 +:103E60008535A1F499D0082F10E01093010200933A +:103E7000000292D090E0982F8827802B912B880FFA +:103E8000991F909301028093000273C0863529F434 +:103E900084E0ACD080E071D06DC0843609F043C0BE +:103EA0008FD0E0910002F091010283E080935700EF +:103EB000E895C0E0D1E070D08993809102028150F2 +:103EC000809302028823B9F78BD007B600FCFDCFA0 +:103ED0004091000250910102A0E0B1E02C9130E04D +:103EE00011968C91119790E0982F8827822B932B15 +:103EF0001296FA010C01D0925700E89511244E5FFA +:103F00005F4FF1E0A038BF0749F7E0910002F09160 +:103F10000102E0925700E89507B600FCFDCFF09251 +:103F20005700E89527C08437B9F44AD059D0E091BA +:103F30000002F09101023196F0930102E093000239 +:103F40003197E4918E2F19D0809102028150809395 +:103F50000202882361F70EC0853739F441D08EE123 +:103F60000CD084E90AD086E096CF813511F488E040 +:103F70002CD036D080E101D063CF2AE030E08095AC +:103F8000089410F4599802C0599A000015D014D022 +:103F900086952A95B1F70895A89529E030E04899CB +:103FA000FECF0AD009D008D08894489908942A9561 +:103FB00011F08795F7CF089598E09A95F1F7089555 +:103FC000EBDFEADF80930202E7CFE0E6F0E098E182 +:103FD00090838083089580E0F8DFEE27FF2709941F +:103FE000DBDF803209F0F7DF84E1C7CF1F93182FA2 +:0C3FF000D3DF1150E9F7F4DF1F910895B2 +:0400000300003E00BB +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.lst new file mode 100644 index 0000000..80ecb83 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_lilypad_resonator.lst @@ -0,0 +1,533 @@ + +optiboot_lilypad_resonator.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001fc 00003e00 00003e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000250 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 00000078 00000000 00000000 00000278 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000277 00000000 00000000 000002f0 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000194 00000000 00000000 00000567 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003bb 00000000 00000000 000006fb 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 000000a0 00000000 00000000 00000ab8 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 0000013f 00000000 00000000 00000b58 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001a0 00000000 00000000 00000c97 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000070 00000000 00000000 00000e37 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3e00: 85 e0 ldi r24, 0x05 ; 5 + 3e02: 80 93 81 00 sts 0x0081, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 3e06: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 3e08: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 3e0a: 81 ff sbrs r24, 1 + 3e0c: e4 d0 rcall .+456 ; 0x3fd6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 3e0e: 8d e0 ldi r24, 0x0D ; 13 + 3e10: dc d0 rcall .+440 ; 0x3fca + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e12: 25 9a sbi 0x04, 5 ; 4 + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); + 3e14: 51 9a sbi 0x0a, 1 ; 10 + 3e16: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e18: 28 e1 ldi r18, 0x18 ; 24 + 3e1a: 3e ef ldi r19, 0xFE ; 254 + TIFR1 = _BV(TOV1); + 3e1c: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e1e: 30 93 85 00 sts 0x0085, r19 + 3e22: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 3e26: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e28: b0 9b sbis 0x16, 0 ; 22 + 3e2a: fe cf rjmp .-4 ; 0x3e28 + LED_PIN |= _BV(LED); + 3e2c: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e2e: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 3e30: 81 50 subi r24, 0x01 ; 1 + 3e32: a9 f7 brne .-22 ; 0x3e1e + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e34: dd 24 eor r13, r13 + 3e36: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3e38: a5 e0 ldi r26, 0x05 ; 5 + 3e3a: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3e3c: f1 e1 ldi r31, 0x11 ; 17 + 3e3e: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e40: ab d0 rcall .+342 ; 0x3f98 + + if(ch == STK_GET_PARAMETER) { + 3e42: 81 34 cpi r24, 0x41 ; 65 + 3e44: 21 f4 brne .+8 ; 0x3e4e + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e46: 81 e0 ldi r24, 0x01 ; 1 + 3e48: d1 d0 rcall .+418 ; 0x3fec + putch(0x03); + 3e4a: 83 e0 ldi r24, 0x03 ; 3 + 3e4c: 24 c0 rjmp .+72 ; 0x3e96 + } + else if(ch == STK_SET_DEVICE) { + 3e4e: 82 34 cpi r24, 0x42 ; 66 + 3e50: 11 f4 brne .+4 ; 0x3e56 + // SET DEVICE is ignored + getNch(20); + 3e52: 84 e1 ldi r24, 0x14 ; 20 + 3e54: 03 c0 rjmp .+6 ; 0x3e5c + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e56: 85 34 cpi r24, 0x45 ; 69 + 3e58: 19 f4 brne .+6 ; 0x3e60 + // SET DEVICE EXT is ignored + getNch(5); + 3e5a: 85 e0 ldi r24, 0x05 ; 5 + 3e5c: c7 d0 rcall .+398 ; 0x3fec + 3e5e: 8a c0 rjmp .+276 ; 0x3f74 + } + else if(ch == STK_LOAD_ADDRESS) { + 3e60: 85 35 cpi r24, 0x55 ; 85 + 3e62: a1 f4 brne .+40 ; 0x3e8c + // LOAD ADDRESS + address = getch(); + 3e64: 99 d0 rcall .+306 ; 0x3f98 + 3e66: 08 2f mov r16, r24 + 3e68: 10 e0 ldi r17, 0x00 ; 0 + 3e6a: 10 93 01 02 sts 0x0201, r17 + 3e6e: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 3e72: 92 d0 rcall .+292 ; 0x3f98 + 3e74: 90 e0 ldi r25, 0x00 ; 0 + 3e76: 98 2f mov r25, r24 + 3e78: 88 27 eor r24, r24 + 3e7a: 80 2b or r24, r16 + 3e7c: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 3e7e: 88 0f add r24, r24 + 3e80: 99 1f adc r25, r25 + 3e82: 90 93 01 02 sts 0x0201, r25 + 3e86: 80 93 00 02 sts 0x0200, r24 + 3e8a: 73 c0 rjmp .+230 ; 0x3f72 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3e8c: 86 35 cpi r24, 0x56 ; 86 + 3e8e: 29 f4 brne .+10 ; 0x3e9a + // UNIVERSAL command is ignored + getNch(4); + 3e90: 84 e0 ldi r24, 0x04 ; 4 + 3e92: ac d0 rcall .+344 ; 0x3fec + putch(0x00); + 3e94: 80 e0 ldi r24, 0x00 ; 0 + 3e96: 71 d0 rcall .+226 ; 0x3f7a + 3e98: 6d c0 rjmp .+218 ; 0x3f74 + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3e9a: 84 36 cpi r24, 0x64 ; 100 + 3e9c: 09 f0 breq .+2 ; 0x3ea0 + 3e9e: 43 c0 rjmp .+134 ; 0x3f26 + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 3ea0: 8f d0 rcall .+286 ; 0x3fc0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 3ea2: e0 91 00 02 lds r30, 0x0200 + 3ea6: f0 91 01 02 lds r31, 0x0201 + 3eaa: 83 e0 ldi r24, 0x03 ; 3 + 3eac: 80 93 57 00 sts 0x0057, r24 + 3eb0: e8 95 spm + 3eb2: c0 e0 ldi r28, 0x00 ; 0 + 3eb4: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 3eb6: 70 d0 rcall .+224 ; 0x3f98 + 3eb8: 89 93 st Y+, r24 + while (--length); + 3eba: 80 91 02 02 lds r24, 0x0202 + 3ebe: 81 50 subi r24, 0x01 ; 1 + 3ec0: 80 93 02 02 sts 0x0202, r24 + 3ec4: 88 23 and r24, r24 + 3ec6: b9 f7 brne .-18 ; 0x3eb6 + + // Read command terminator, start reply + verifySpace(); + 3ec8: 8b d0 rcall .+278 ; 0x3fe0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 3eca: 07 b6 in r0, 0x37 ; 55 + 3ecc: 00 fc sbrc r0, 0 + 3ece: fd cf rjmp .-6 ; 0x3eca + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 3ed0: 40 91 00 02 lds r20, 0x0200 + 3ed4: 50 91 01 02 lds r21, 0x0201 + 3ed8: a0 e0 ldi r26, 0x00 ; 0 + 3eda: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 3edc: 2c 91 ld r18, X + 3ede: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 3ee0: 11 96 adiw r26, 0x01 ; 1 + 3ee2: 8c 91 ld r24, X + 3ee4: 11 97 sbiw r26, 0x01 ; 1 + 3ee6: 90 e0 ldi r25, 0x00 ; 0 + 3ee8: 98 2f mov r25, r24 + 3eea: 88 27 eor r24, r24 + 3eec: 82 2b or r24, r18 + 3eee: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3ef0: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 3ef2: fa 01 movw r30, r20 + 3ef4: 0c 01 movw r0, r24 + 3ef6: d0 92 57 00 sts 0x0057, r13 + 3efa: e8 95 spm + 3efc: 11 24 eor r1, r1 + addrPtr += 2; + 3efe: 4e 5f subi r20, 0xFE ; 254 + 3f00: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 3f02: f1 e0 ldi r31, 0x01 ; 1 + 3f04: a0 38 cpi r26, 0x80 ; 128 + 3f06: bf 07 cpc r27, r31 + 3f08: 49 f7 brne .-46 ; 0x3edc + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3f0a: e0 91 00 02 lds r30, 0x0200 + 3f0e: f0 91 01 02 lds r31, 0x0201 + 3f12: e0 92 57 00 sts 0x0057, r14 + 3f16: e8 95 spm + boot_spm_busy_wait(); + 3f18: 07 b6 in r0, 0x37 ; 55 + 3f1a: 00 fc sbrc r0, 0 + 3f1c: fd cf rjmp .-6 ; 0x3f18 + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3f1e: f0 92 57 00 sts 0x0057, r15 + 3f22: e8 95 spm + 3f24: 27 c0 rjmp .+78 ; 0x3f74 +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f26: 84 37 cpi r24, 0x74 ; 116 + 3f28: b9 f4 brne .+46 ; 0x3f58 + // READ PAGE - we only read flash + getLen(); + 3f2a: 4a d0 rcall .+148 ; 0x3fc0 + verifySpace(); + 3f2c: 59 d0 rcall .+178 ; 0x3fe0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 3f2e: e0 91 00 02 lds r30, 0x0200 + 3f32: f0 91 01 02 lds r31, 0x0201 + 3f36: 31 96 adiw r30, 0x01 ; 1 + 3f38: f0 93 01 02 sts 0x0201, r31 + 3f3c: e0 93 00 02 sts 0x0200, r30 + 3f40: 31 97 sbiw r30, 0x01 ; 1 + 3f42: e4 91 lpm r30, Z+ + 3f44: 8e 2f mov r24, r30 + 3f46: 19 d0 rcall .+50 ; 0x3f7a + while (--length); + 3f48: 80 91 02 02 lds r24, 0x0202 + 3f4c: 81 50 subi r24, 0x01 ; 1 + 3f4e: 80 93 02 02 sts 0x0202, r24 + 3f52: 88 23 and r24, r24 + 3f54: 61 f7 brne .-40 ; 0x3f2e + 3f56: 0e c0 rjmp .+28 ; 0x3f74 +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f58: 85 37 cpi r24, 0x75 ; 117 + 3f5a: 39 f4 brne .+14 ; 0x3f6a + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f5c: 41 d0 rcall .+130 ; 0x3fe0 + putch(SIGNATURE_0); + 3f5e: 8e e1 ldi r24, 0x1E ; 30 + 3f60: 0c d0 rcall .+24 ; 0x3f7a + putch(SIGNATURE_1); + 3f62: 84 e9 ldi r24, 0x94 ; 148 + 3f64: 0a d0 rcall .+20 ; 0x3f7a + putch(SIGNATURE_2); + 3f66: 86 e0 ldi r24, 0x06 ; 6 + 3f68: 96 cf rjmp .-212 ; 0x3e96 + } + else if (ch == 'Q') { + 3f6a: 81 35 cpi r24, 0x51 ; 81 + 3f6c: 11 f4 brne .+4 ; 0x3f72 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f6e: 88 e0 ldi r24, 0x08 ; 8 + 3f70: 2c d0 rcall .+88 ; 0x3fca + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f72: 36 d0 rcall .+108 ; 0x3fe0 + } + putch(STK_OK); + 3f74: 80 e1 ldi r24, 0x10 ; 16 + 3f76: 01 d0 rcall .+2 ; 0x3f7a + 3f78: 63 cf rjmp .-314 ; 0x3e40 + +00003f7a : +void putch(char ch) { +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + UDR0 = ch; +#else + __asm__ __volatile__ ( + 3f7a: 2a e0 ldi r18, 0x0A ; 10 + 3f7c: 30 e0 ldi r19, 0x00 ; 0 + 3f7e: 80 95 com r24 + 3f80: 08 94 sec + 3f82: 10 f4 brcc .+4 ; 0x3f88 + 3f84: 59 98 cbi 0x0b, 1 ; 11 + 3f86: 02 c0 rjmp .+4 ; 0x3f8c + 3f88: 59 9a sbi 0x0b, 1 ; 11 + 3f8a: 00 00 nop + 3f8c: 15 d0 rcall .+42 ; 0x3fb8 + 3f8e: 14 d0 rcall .+40 ; 0x3fb8 + 3f90: 86 95 lsr r24 + 3f92: 2a 95 dec r18 + 3f94: b1 f7 brne .-20 ; 0x3f82 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 3f96: 08 95 ret + +00003f98 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3f98: a8 95 wdr +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 3f9a: 29 e0 ldi r18, 0x09 ; 9 + 3f9c: 30 e0 ldi r19, 0x00 ; 0 + 3f9e: 48 99 sbic 0x09, 0 ; 9 + 3fa0: fe cf rjmp .-4 ; 0x3f9e + 3fa2: 0a d0 rcall .+20 ; 0x3fb8 + 3fa4: 09 d0 rcall .+18 ; 0x3fb8 + 3fa6: 08 d0 rcall .+16 ; 0x3fb8 + 3fa8: 88 94 clc + 3faa: 48 99 sbic 0x09, 0 ; 9 + 3fac: 08 94 sec + 3fae: 2a 95 dec r18 + 3fb0: 11 f0 breq .+4 ; 0x3fb6 + 3fb2: 87 95 ror r24 + 3fb4: f7 cf rjmp .-18 ; 0x3fa4 + 3fb6: 08 95 ret + +00003fb8 : +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + 3fb8: 98 e0 ldi r25, 0x08 ; 8 + 3fba: 9a 95 dec r25 + 3fbc: f1 f7 brne .-4 ; 0x3fba + 3fbe: 08 95 ret + +00003fc0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 3fc0: eb df rcall .-42 ; 0x3f98 + length = getch(); + 3fc2: ea df rcall .-44 ; 0x3f98 + 3fc4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 3fc8: e7 cf rjmp .-50 ; 0x3f98 + +00003fca : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3fca: e0 e6 ldi r30, 0x60 ; 96 + 3fcc: f0 e0 ldi r31, 0x00 ; 0 + 3fce: 98 e1 ldi r25, 0x18 ; 24 + 3fd0: 90 83 st Z, r25 + WDTCSR = x; + 3fd2: 80 83 st Z, r24 +} + 3fd4: 08 95 ret + +00003fd6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 3fd6: 80 e0 ldi r24, 0x00 ; 0 + 3fd8: f8 df rcall .-16 ; 0x3fca + __asm__ __volatile__ ( + 3fda: ee 27 eor r30, r30 + 3fdc: ff 27 eor r31, r31 + 3fde: 09 94 ijmp + +00003fe0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 3fe0: db df rcall .-74 ; 0x3f98 + 3fe2: 80 32 cpi r24, 0x20 ; 32 + 3fe4: 09 f0 breq .+2 ; 0x3fe8 + 3fe6: f7 df rcall .-18 ; 0x3fd6 + putch(STK_INSYNC); + 3fe8: 84 e1 ldi r24, 0x14 ; 20 +} + 3fea: c7 cf rjmp .-114 ; 0x3f7a + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fec: 1f 93 push r17 + 3fee: 18 2f mov r17, r24 + +00003ff0 : + do getch(); while (--count); + 3ff0: d3 df rcall .-90 ; 0x3f98 + 3ff2: 11 50 subi r17, 0x01 ; 1 + 3ff4: e9 f7 brne .-6 ; 0x3ff0 + verifySpace(); + 3ff6: f4 df rcall .-24 ; 0x3fe0 +} + 3ff8: 1f 91 pop r17 + 3ffa: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.hex new file mode 100644 index 0000000..0e51124 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.hex @@ -0,0 +1,42 @@ +:101D000085E08EBD84B714BE81FF27D18DE021D13F +:101D1000D49AD29A86E023EC3FEF91E03DBD2CBDF2 +:101D20009BB9589BFECFCC9AA8958150B9F7CC248B +:101D3000C39485E0E82E0FE7D02E1EECF12EF0D0F4 +:101D4000813421F481E014D183E024C0823411F481 +:101D500084E103C0853419F485E00AD1CFC085350C +:101D6000A1F4DED0082F10E01093010200930002CE +:101D7000D7D090E0982F8827802B912B880F991F20 +:101D80009093010280930002B8C0863529F484E064 +:101D9000EFD080E0B6D0B2C0843609F06EC0D4D0A7 +:101DA000E0910002F091010283E080935700E895F2 +:101DB000C0E0D1E0B5D08993809102028150809338 +:101DC00002028823B9F7CED007B600FCFDCF809180 +:101DD000000290910102892B41F580910001209130 +:101DE000010130E0322F222790E0282B392B30934D +:101DF00005022093040240910A0180910B0190E0BA +:101E0000982F882750E0842B952B9093070280937E +:101E100006022450304020930A01232F33272093B9 +:101E20000B01D0920001F09201014091000250910B +:101E30000102A0E0B1E02C9130E011968C91119755 +:101E400090E0982F8827822B932B1296FA010C0191 +:101E5000C0925700E89511244E5F5F4FF1E0A03427 +:101E6000BF0749F7E0910002F0910102E0925700AC +:101E7000E89507B600FCFDCF41C0843789F564D0F2 +:101E800071D0E0910002F0910102309719F4209195 +:101E9000040213C0E130F10519F4209105020DC0D0 +:101EA000EA30F10519F42091060207C0EB30F10584 +:101EB00019F42091070201C02491809100029091B1 +:101EC000010201969093010280930002822F19D0A3 +:101ED00080910202815080930202882391F60EC005 +:101EE000853739F43FD08EE10CD083E90AD08CE0FD +:101EF00051CF813511F488E02CD034D080E101D06D +:101F00001ECF2AE030E08095089410F4DA9802C0E1 +:101F1000DA9A000015D014D086952A95B1F7089565 +:101F2000A89529E030E0CB99FECF0AD009D008D09F +:101F30008894CB9908942A9511F08795F7CF089546 +:101F40009EE09A95F1F70895EBDFEADF80930202B5 +:101F5000E7CF98E191BD81BD089580E0FADFE5E02B +:101F6000FF270994DDDF803209F0F7DF84E1C9CF74 +:101F70001F93182FD5DF1150E9F7F4DF1F91089553 +:0400000300001D00DC +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.lst new file mode 100644 index 0000000..59468cb --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_luminet.lst @@ -0,0 +1,604 @@ + +optiboot_luminet.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 00000280 00001d00 00001d00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 000002d4 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 00000078 00000000 00000000 000002fc 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000289 00000000 00000000 00000374 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 000001a1 00000000 00000000 000005fd 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 00000435 00000000 00000000 0000079e 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 000000a0 00000000 00000000 00000bd4 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 00000144 00000000 00000000 00000c74 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 00000194 00000000 00000000 00000db8 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000088 00000000 00000000 00000f4c 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00001d00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 1d00: 85 e0 ldi r24, 0x05 ; 5 + 1d02: 8e bd out 0x2e, r24 ; 46 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 1d04: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 1d06: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 1d08: 81 ff sbrs r24, 1 + 1d0a: 27 d1 rcall .+590 ; 0x1f5a + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 1d0c: 8d e0 ldi r24, 0x0D ; 13 + 1d0e: 21 d1 rcall .+578 ; 0x1f52 + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 1d10: d4 9a sbi 0x1a, 4 ; 26 + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); + 1d12: d2 9a sbi 0x1a, 2 ; 26 + 1d14: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 1d16: 23 ec ldi r18, 0xC3 ; 195 + 1d18: 3f ef ldi r19, 0xFF ; 255 + TIFR1 = _BV(TOV1); + 1d1a: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 1d1c: 3d bd out 0x2d, r19 ; 45 + 1d1e: 2c bd out 0x2c, r18 ; 44 + TIFR1 = _BV(TOV1); + 1d20: 9b b9 out 0x0b, r25 ; 11 + while(!(TIFR1 & _BV(TOV1))); + 1d22: 58 9b sbis 0x0b, 0 ; 11 + 1d24: fe cf rjmp .-4 ; 0x1d22 + LED_PIN |= _BV(LED); + 1d26: cc 9a sbi 0x19, 4 ; 25 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 1d28: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 1d2a: 81 50 subi r24, 0x01 ; 1 + 1d2c: b9 f7 brne .-18 ; 0x1d1c + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 1d2e: cc 24 eor r12, r12 + 1d30: c3 94 inc r12 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 1d32: 85 e0 ldi r24, 0x05 ; 5 + 1d34: e8 2e mov r14, r24 + vect -= 4; // Instruction is a relative jump (rjmp), so recalculate. + buff[10] = vect & 0xff; + buff[11] = vect >> 8; + + // Add jump to bootloader at RESET vector + buff[0] = 0x7f; + 1d36: 0f e7 ldi r16, 0x7F ; 127 + 1d38: d0 2e mov r13, r16 + buff[1] = 0xce; // rjmp 0x1d00 instruction + 1d3a: 1e ec ldi r17, 0xCE ; 206 + 1d3c: f1 2e mov r15, r17 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 1d3e: f0 d0 rcall .+480 ; 0x1f20 + + if(ch == STK_GET_PARAMETER) { + 1d40: 81 34 cpi r24, 0x41 ; 65 + 1d42: 21 f4 brne .+8 ; 0x1d4c + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 1d44: 81 e0 ldi r24, 0x01 ; 1 + 1d46: 14 d1 rcall .+552 ; 0x1f70 + putch(0x03); + 1d48: 83 e0 ldi r24, 0x03 ; 3 + 1d4a: 24 c0 rjmp .+72 ; 0x1d94 + } + else if(ch == STK_SET_DEVICE) { + 1d4c: 82 34 cpi r24, 0x42 ; 66 + 1d4e: 11 f4 brne .+4 ; 0x1d54 + // SET DEVICE is ignored + getNch(20); + 1d50: 84 e1 ldi r24, 0x14 ; 20 + 1d52: 03 c0 rjmp .+6 ; 0x1d5a + } + else if(ch == STK_SET_DEVICE_EXT) { + 1d54: 85 34 cpi r24, 0x45 ; 69 + 1d56: 19 f4 brne .+6 ; 0x1d5e + // SET DEVICE EXT is ignored + getNch(5); + 1d58: 85 e0 ldi r24, 0x05 ; 5 + 1d5a: 0a d1 rcall .+532 ; 0x1f70 + 1d5c: cf c0 rjmp .+414 ; 0x1efc + } + else if(ch == STK_LOAD_ADDRESS) { + 1d5e: 85 35 cpi r24, 0x55 ; 85 + 1d60: a1 f4 brne .+40 ; 0x1d8a + // LOAD ADDRESS + address = getch(); + 1d62: de d0 rcall .+444 ; 0x1f20 + 1d64: 08 2f mov r16, r24 + 1d66: 10 e0 ldi r17, 0x00 ; 0 + 1d68: 10 93 01 02 sts 0x0201, r17 + 1d6c: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 1d70: d7 d0 rcall .+430 ; 0x1f20 + 1d72: 90 e0 ldi r25, 0x00 ; 0 + 1d74: 98 2f mov r25, r24 + 1d76: 88 27 eor r24, r24 + 1d78: 80 2b or r24, r16 + 1d7a: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 1d7c: 88 0f add r24, r24 + 1d7e: 99 1f adc r25, r25 + 1d80: 90 93 01 02 sts 0x0201, r25 + 1d84: 80 93 00 02 sts 0x0200, r24 + 1d88: b8 c0 rjmp .+368 ; 0x1efa + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 1d8a: 86 35 cpi r24, 0x56 ; 86 + 1d8c: 29 f4 brne .+10 ; 0x1d98 + // UNIVERSAL command is ignored + getNch(4); + 1d8e: 84 e0 ldi r24, 0x04 ; 4 + 1d90: ef d0 rcall .+478 ; 0x1f70 + putch(0x00); + 1d92: 80 e0 ldi r24, 0x00 ; 0 + 1d94: b6 d0 rcall .+364 ; 0x1f02 + 1d96: b2 c0 rjmp .+356 ; 0x1efc + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 1d98: 84 36 cpi r24, 0x64 ; 100 + 1d9a: 09 f0 breq .+2 ; 0x1d9e + 1d9c: 6e c0 rjmp .+220 ; 0x1e7a + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 1d9e: d4 d0 rcall .+424 ; 0x1f48 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 1da0: e0 91 00 02 lds r30, 0x0200 + 1da4: f0 91 01 02 lds r31, 0x0201 + 1da8: 83 e0 ldi r24, 0x03 ; 3 + 1daa: 80 93 57 00 sts 0x0057, r24 + 1dae: e8 95 spm + 1db0: c0 e0 ldi r28, 0x00 ; 0 + 1db2: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 1db4: b5 d0 rcall .+362 ; 0x1f20 + 1db6: 89 93 st Y+, r24 + while (--length); + 1db8: 80 91 02 02 lds r24, 0x0202 + 1dbc: 81 50 subi r24, 0x01 ; 1 + 1dbe: 80 93 02 02 sts 0x0202, r24 + 1dc2: 88 23 and r24, r24 + 1dc4: b9 f7 brne .-18 ; 0x1db4 + + // Read command terminator, start reply + verifySpace(); + 1dc6: ce d0 rcall .+412 ; 0x1f64 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 1dc8: 07 b6 in r0, 0x37 ; 55 + 1dca: 00 fc sbrc r0, 0 + 1dcc: fd cf rjmp .-6 ; 0x1dc8 + +#ifdef VIRTUAL_BOOT_PARTITION + if ((uint16_t)(void*)address == 0) { + 1dce: 80 91 00 02 lds r24, 0x0200 + 1dd2: 90 91 01 02 lds r25, 0x0201 + 1dd6: 89 2b or r24, r25 + 1dd8: 41 f5 brne .+80 ; 0x1e2a + // This is the reset vector page. We need to live-patch the code so the + // bootloader runs. + // + // Move RESET vector to WDT vector + uint16_t vect = buff[0] | (buff[1]<<8); + 1dda: 80 91 00 01 lds r24, 0x0100 + 1dde: 20 91 01 01 lds r18, 0x0101 + 1de2: 30 e0 ldi r19, 0x00 ; 0 + 1de4: 32 2f mov r19, r18 + 1de6: 22 27 eor r18, r18 + 1de8: 90 e0 ldi r25, 0x00 ; 0 + 1dea: 28 2b or r18, r24 + 1dec: 39 2b or r19, r25 + rstVect = vect; + 1dee: 30 93 05 02 sts 0x0205, r19 + 1df2: 20 93 04 02 sts 0x0204, r18 + wdtVect = buff[10] | (buff[11]<<8); + 1df6: 40 91 0a 01 lds r20, 0x010A + 1dfa: 80 91 0b 01 lds r24, 0x010B + 1dfe: 90 e0 ldi r25, 0x00 ; 0 + 1e00: 98 2f mov r25, r24 + 1e02: 88 27 eor r24, r24 + 1e04: 50 e0 ldi r21, 0x00 ; 0 + 1e06: 84 2b or r24, r20 + 1e08: 95 2b or r25, r21 + 1e0a: 90 93 07 02 sts 0x0207, r25 + 1e0e: 80 93 06 02 sts 0x0206, r24 + vect -= 4; // Instruction is a relative jump (rjmp), so recalculate. + 1e12: 24 50 subi r18, 0x04 ; 4 + 1e14: 30 40 sbci r19, 0x00 ; 0 + buff[10] = vect & 0xff; + 1e16: 20 93 0a 01 sts 0x010A, r18 + buff[11] = vect >> 8; + 1e1a: 23 2f mov r18, r19 + 1e1c: 33 27 eor r19, r19 + 1e1e: 20 93 0b 01 sts 0x010B, r18 + + // Add jump to bootloader at RESET vector + buff[0] = 0x7f; + 1e22: d0 92 00 01 sts 0x0100, r13 + buff[1] = 0xce; // rjmp 0x1d00 instruction + 1e26: f0 92 01 01 sts 0x0101, r15 + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 1e2a: 40 91 00 02 lds r20, 0x0200 + 1e2e: 50 91 01 02 lds r21, 0x0201 + 1e32: a0 e0 ldi r26, 0x00 ; 0 + 1e34: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 1e36: 2c 91 ld r18, X + 1e38: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 1e3a: 11 96 adiw r26, 0x01 ; 1 + 1e3c: 8c 91 ld r24, X + 1e3e: 11 97 sbiw r26, 0x01 ; 1 + 1e40: 90 e0 ldi r25, 0x00 ; 0 + 1e42: 98 2f mov r25, r24 + 1e44: 88 27 eor r24, r24 + 1e46: 82 2b or r24, r18 + 1e48: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 1e4a: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 1e4c: fa 01 movw r30, r20 + 1e4e: 0c 01 movw r0, r24 + 1e50: c0 92 57 00 sts 0x0057, r12 + 1e54: e8 95 spm + 1e56: 11 24 eor r1, r1 + addrPtr += 2; + 1e58: 4e 5f subi r20, 0xFE ; 254 + 1e5a: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 1e5c: f1 e0 ldi r31, 0x01 ; 1 + 1e5e: a0 34 cpi r26, 0x40 ; 64 + 1e60: bf 07 cpc r27, r31 + 1e62: 49 f7 brne .-46 ; 0x1e36 + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 1e64: e0 91 00 02 lds r30, 0x0200 + 1e68: f0 91 01 02 lds r31, 0x0201 + 1e6c: e0 92 57 00 sts 0x0057, r14 + 1e70: e8 95 spm + boot_spm_busy_wait(); + 1e72: 07 b6 in r0, 0x37 ; 55 + 1e74: 00 fc sbrc r0, 0 + 1e76: fd cf rjmp .-6 ; 0x1e72 + 1e78: 41 c0 rjmp .+130 ; 0x1efc + boot_rww_enable(); +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 1e7a: 84 37 cpi r24, 0x74 ; 116 + 1e7c: 89 f5 brne .+98 ; 0x1ee0 + // READ PAGE - we only read flash + getLen(); + 1e7e: 64 d0 rcall .+200 ; 0x1f48 + verifySpace(); + 1e80: 71 d0 rcall .+226 ; 0x1f64 +#ifdef VIRTUAL_BOOT_PARTITION + do { + // Undo vector patch in bottom page so verify passes + if (address == 0) ch=rstVect & 0xff; + 1e82: e0 91 00 02 lds r30, 0x0200 + 1e86: f0 91 01 02 lds r31, 0x0201 + 1e8a: 30 97 sbiw r30, 0x00 ; 0 + 1e8c: 19 f4 brne .+6 ; 0x1e94 + 1e8e: 20 91 04 02 lds r18, 0x0204 + 1e92: 13 c0 rjmp .+38 ; 0x1eba + else if (address == 1) ch=rstVect >> 8; + 1e94: e1 30 cpi r30, 0x01 ; 1 + 1e96: f1 05 cpc r31, r1 + 1e98: 19 f4 brne .+6 ; 0x1ea0 + 1e9a: 20 91 05 02 lds r18, 0x0205 + 1e9e: 0d c0 rjmp .+26 ; 0x1eba + else if (address == 10) ch=wdtVect & 0xff; + 1ea0: ea 30 cpi r30, 0x0A ; 10 + 1ea2: f1 05 cpc r31, r1 + 1ea4: 19 f4 brne .+6 ; 0x1eac + 1ea6: 20 91 06 02 lds r18, 0x0206 + 1eaa: 07 c0 rjmp .+14 ; 0x1eba + else if (address == 11) ch=wdtVect >> 8; + 1eac: eb 30 cpi r30, 0x0B ; 11 + 1eae: f1 05 cpc r31, r1 + 1eb0: 19 f4 brne .+6 ; 0x1eb8 + 1eb2: 20 91 07 02 lds r18, 0x0207 + 1eb6: 01 c0 rjmp .+2 ; 0x1eba + else ch = pgm_read_byte_near(address); + 1eb8: 24 91 lpm r18, Z+ + address++; + 1eba: 80 91 00 02 lds r24, 0x0200 + 1ebe: 90 91 01 02 lds r25, 0x0201 + 1ec2: 01 96 adiw r24, 0x01 ; 1 + 1ec4: 90 93 01 02 sts 0x0201, r25 + 1ec8: 80 93 00 02 sts 0x0200, r24 + putch(ch); + 1ecc: 82 2f mov r24, r18 + 1ece: 19 d0 rcall .+50 ; 0x1f02 + } while (--length); + 1ed0: 80 91 02 02 lds r24, 0x0202 + 1ed4: 81 50 subi r24, 0x01 ; 1 + 1ed6: 80 93 02 02 sts 0x0202, r24 + 1eda: 88 23 and r24, r24 + 1edc: 91 f6 brne .-92 ; 0x1e82 + 1ede: 0e c0 rjmp .+28 ; 0x1efc + while (--length); +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 1ee0: 85 37 cpi r24, 0x75 ; 117 + 1ee2: 39 f4 brne .+14 ; 0x1ef2 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 1ee4: 3f d0 rcall .+126 ; 0x1f64 + putch(SIGNATURE_0); + 1ee6: 8e e1 ldi r24, 0x1E ; 30 + 1ee8: 0c d0 rcall .+24 ; 0x1f02 + putch(SIGNATURE_1); + 1eea: 83 e9 ldi r24, 0x93 ; 147 + 1eec: 0a d0 rcall .+20 ; 0x1f02 + putch(SIGNATURE_2); + 1eee: 8c e0 ldi r24, 0x0C ; 12 + 1ef0: 51 cf rjmp .-350 ; 0x1d94 + } + else if (ch == 'Q') { + 1ef2: 81 35 cpi r24, 0x51 ; 81 + 1ef4: 11 f4 brne .+4 ; 0x1efa + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 1ef6: 88 e0 ldi r24, 0x08 ; 8 + 1ef8: 2c d0 rcall .+88 ; 0x1f52 + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 1efa: 34 d0 rcall .+104 ; 0x1f64 + } + putch(STK_OK); + 1efc: 80 e1 ldi r24, 0x10 ; 16 + 1efe: 01 d0 rcall .+2 ; 0x1f02 + 1f00: 1e cf rjmp .-452 ; 0x1d3e + +00001f02 : +void putch(char ch) { +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + UDR0 = ch; +#else + __asm__ __volatile__ ( + 1f02: 2a e0 ldi r18, 0x0A ; 10 + 1f04: 30 e0 ldi r19, 0x00 ; 0 + 1f06: 80 95 com r24 + 1f08: 08 94 sec + 1f0a: 10 f4 brcc .+4 ; 0x1f10 + 1f0c: da 98 cbi 0x1b, 2 ; 27 + 1f0e: 02 c0 rjmp .+4 ; 0x1f14 + 1f10: da 9a sbi 0x1b, 2 ; 27 + 1f12: 00 00 nop + 1f14: 15 d0 rcall .+42 ; 0x1f40 + 1f16: 14 d0 rcall .+40 ; 0x1f40 + 1f18: 86 95 lsr r24 + 1f1a: 2a 95 dec r18 + 1f1c: b1 f7 brne .-20 ; 0x1f0a + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 1f1e: 08 95 ret + +00001f20 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 1f20: a8 95 wdr +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 1f22: 29 e0 ldi r18, 0x09 ; 9 + 1f24: 30 e0 ldi r19, 0x00 ; 0 + 1f26: cb 99 sbic 0x19, 3 ; 25 + 1f28: fe cf rjmp .-4 ; 0x1f26 + 1f2a: 0a d0 rcall .+20 ; 0x1f40 + 1f2c: 09 d0 rcall .+18 ; 0x1f40 + 1f2e: 08 d0 rcall .+16 ; 0x1f40 + 1f30: 88 94 clc + 1f32: cb 99 sbic 0x19, 3 ; 25 + 1f34: 08 94 sec + 1f36: 2a 95 dec r18 + 1f38: 11 f0 breq .+4 ; 0x1f3e + 1f3a: 87 95 ror r24 + 1f3c: f7 cf rjmp .-18 ; 0x1f2c + 1f3e: 08 95 ret + +00001f40 : +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + 1f40: 9e e0 ldi r25, 0x0E ; 14 + 1f42: 9a 95 dec r25 + 1f44: f1 f7 brne .-4 ; 0x1f42 + 1f46: 08 95 ret + +00001f48 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 1f48: eb df rcall .-42 ; 0x1f20 + length = getch(); + 1f4a: ea df rcall .-44 ; 0x1f20 + 1f4c: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 1f50: e7 cf rjmp .-50 ; 0x1f20 + +00001f52 : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 1f52: 98 e1 ldi r25, 0x18 ; 24 + 1f54: 91 bd out 0x21, r25 ; 33 + WDTCSR = x; + 1f56: 81 bd out 0x21, r24 ; 33 +} + 1f58: 08 95 ret + +00001f5a : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 1f5a: 80 e0 ldi r24, 0x00 ; 0 + 1f5c: fa df rcall .-12 ; 0x1f52 + __asm__ __volatile__ ( + 1f5e: e5 e0 ldi r30, 0x05 ; 5 + 1f60: ff 27 eor r31, r31 + 1f62: 09 94 ijmp + +00001f64 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 1f64: dd df rcall .-70 ; 0x1f20 + 1f66: 80 32 cpi r24, 0x20 ; 32 + 1f68: 09 f0 breq .+2 ; 0x1f6c + 1f6a: f7 df rcall .-18 ; 0x1f5a + putch(STK_INSYNC); + 1f6c: 84 e1 ldi r24, 0x14 ; 20 +} + 1f6e: c9 cf rjmp .-110 ; 0x1f02 + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 1f70: 1f 93 push r17 + 1f72: 18 2f mov r17, r24 + +00001f74 : + do getch(); while (--count); + 1f74: d5 df rcall .-86 ; 0x1f20 + 1f76: 11 50 subi r17, 0x01 ; 1 + 1f78: e9 f7 brne .-6 ; 0x1f74 + verifySpace(); + 1f7a: f4 df rcall .-24 ; 0x1f64 +} + 1f7c: 1f 91 pop r17 + 1f7e: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.hex new file mode 100644 index 0000000..1e93414 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.hex @@ -0,0 +1,33 @@ +:103E000085E08093810082E08093C00088E1809308 +:103E1000C10086E08093C20080E18093C40084B733 +:103E200014BE81FFD0D08DE0C8D0259A86E020E373 +:103E30003CEF91E0309385002093840096BBB09BCB +:103E4000FECF1D9AA8958150A9F7DD24D394A5E053 +:103E5000EA2EF1E1FF2EA4D0813421F481E0BED01E +:103E600083E024C0823411F484E103C0853419F462 +:103E700085E0B4D08AC08535A1F492D0082F10E037 +:103E800010930102009300028BD090E0982F8827B6 +:103E9000802B912B880F991F909301028093000231 +:103EA00073C0863529F484E099D080E071D06DC06C +:103EB000843609F043C07CD0E0910002F091010209 +:103EC00083E080935700E895C0E0D1E069D0899302 +:103ED000809102028150809302028823B9F778D042 +:103EE00007B600FCFDCF4091000250910102A0E016 +:103EF000B1E02C9130E011968C91119790E0982FC1 +:103F00008827822B932B1296FA010C01D09257002E +:103F1000E89511244E5F5F4FF1E0A038BF0749F7E5 +:103F2000E0910002F0910102E0925700E89507B697 +:103F300000FCFDCFF0925700E89527C08437B9F414 +:103F400037D046D0E0910002F09101023196F09313 +:103F50000102E09300023197E4918E2F19D08091F5 +:103F60000202815080930202882361F70EC08537D8 +:103F700039F42ED08EE10CD084E90AD086E096CFB9 +:103F8000813511F488E019D023D080E101D063CFCE +:103F9000982F8091C00085FFFCCF9093C6000895B4 +:103FA000A8958091C00087FFFCCF8091C60008953E +:103FB000F7DFF6DF80930202F3CFE0E6F0E098E16E +:103FC00090838083089580E0F8DFEE27FF2709942F +:103FD000E7DF803209F0F7DF84E1DACF1F93182F93 +:0C3FE000DFDF1150E9F7F4DF1F910895B6 +:0400000300003E00BB +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.lst new file mode 100644 index 0000000..9920a76 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_16MHz.lst @@ -0,0 +1,520 @@ + +optiboot_pro_16MHz.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001ec 00003e00 00003e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000240 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 0000006a 00000000 00000000 00000268 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000269 00000000 00000000 000002d2 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000196 00000000 00000000 0000053b 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003d3 00000000 00000000 000006d1 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 00000090 00000000 00000000 00000aa4 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 00000135 00000000 00000000 00000b34 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001d1 00000000 00000000 00000c69 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000068 00000000 00000000 00000e3a 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3e00: 85 e0 ldi r24, 0x05 ; 5 + 3e02: 80 93 81 00 sts 0x0081, r24 +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif +#ifndef SOFT_UART + UCSR0A = _BV(U2X0); //Double speed mode USART0 + 3e06: 82 e0 ldi r24, 0x02 ; 2 + 3e08: 80 93 c0 00 sts 0x00C0, r24 + UCSR0B = _BV(RXEN0) | _BV(TXEN0); + 3e0c: 88 e1 ldi r24, 0x18 ; 24 + 3e0e: 80 93 c1 00 sts 0x00C1, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + 3e12: 86 e0 ldi r24, 0x06 ; 6 + 3e14: 80 93 c2 00 sts 0x00C2, r24 + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 3e18: 80 e1 ldi r24, 0x10 ; 16 + 3e1a: 80 93 c4 00 sts 0x00C4, r24 +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 3e1e: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 3e20: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 3e22: 81 ff sbrs r24, 1 + 3e24: d0 d0 rcall .+416 ; 0x3fc6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 3e26: 8d e0 ldi r24, 0x0D ; 13 + 3e28: c8 d0 rcall .+400 ; 0x3fba + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e2a: 25 9a sbi 0x04, 5 ; 4 + 3e2c: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e2e: 20 e3 ldi r18, 0x30 ; 48 + 3e30: 3c ef ldi r19, 0xFC ; 252 + TIFR1 = _BV(TOV1); + 3e32: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e34: 30 93 85 00 sts 0x0085, r19 + 3e38: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 3e3c: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e3e: b0 9b sbis 0x16, 0 ; 22 + 3e40: fe cf rjmp .-4 ; 0x3e3e + LED_PIN |= _BV(LED); + 3e42: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e44: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 3e46: 81 50 subi r24, 0x01 ; 1 + 3e48: a9 f7 brne .-22 ; 0x3e34 + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e4a: dd 24 eor r13, r13 + 3e4c: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3e4e: a5 e0 ldi r26, 0x05 ; 5 + 3e50: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3e52: f1 e1 ldi r31, 0x11 ; 17 + 3e54: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e56: a4 d0 rcall .+328 ; 0x3fa0 + + if(ch == STK_GET_PARAMETER) { + 3e58: 81 34 cpi r24, 0x41 ; 65 + 3e5a: 21 f4 brne .+8 ; 0x3e64 + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e5c: 81 e0 ldi r24, 0x01 ; 1 + 3e5e: be d0 rcall .+380 ; 0x3fdc + putch(0x03); + 3e60: 83 e0 ldi r24, 0x03 ; 3 + 3e62: 24 c0 rjmp .+72 ; 0x3eac + } + else if(ch == STK_SET_DEVICE) { + 3e64: 82 34 cpi r24, 0x42 ; 66 + 3e66: 11 f4 brne .+4 ; 0x3e6c + // SET DEVICE is ignored + getNch(20); + 3e68: 84 e1 ldi r24, 0x14 ; 20 + 3e6a: 03 c0 rjmp .+6 ; 0x3e72 + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e6c: 85 34 cpi r24, 0x45 ; 69 + 3e6e: 19 f4 brne .+6 ; 0x3e76 + // SET DEVICE EXT is ignored + getNch(5); + 3e70: 85 e0 ldi r24, 0x05 ; 5 + 3e72: b4 d0 rcall .+360 ; 0x3fdc + 3e74: 8a c0 rjmp .+276 ; 0x3f8a + } + else if(ch == STK_LOAD_ADDRESS) { + 3e76: 85 35 cpi r24, 0x55 ; 85 + 3e78: a1 f4 brne .+40 ; 0x3ea2 + // LOAD ADDRESS + address = getch(); + 3e7a: 92 d0 rcall .+292 ; 0x3fa0 + 3e7c: 08 2f mov r16, r24 + 3e7e: 10 e0 ldi r17, 0x00 ; 0 + 3e80: 10 93 01 02 sts 0x0201, r17 + 3e84: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 3e88: 8b d0 rcall .+278 ; 0x3fa0 + 3e8a: 90 e0 ldi r25, 0x00 ; 0 + 3e8c: 98 2f mov r25, r24 + 3e8e: 88 27 eor r24, r24 + 3e90: 80 2b or r24, r16 + 3e92: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 3e94: 88 0f add r24, r24 + 3e96: 99 1f adc r25, r25 + 3e98: 90 93 01 02 sts 0x0201, r25 + 3e9c: 80 93 00 02 sts 0x0200, r24 + 3ea0: 73 c0 rjmp .+230 ; 0x3f88 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3ea2: 86 35 cpi r24, 0x56 ; 86 + 3ea4: 29 f4 brne .+10 ; 0x3eb0 + // UNIVERSAL command is ignored + getNch(4); + 3ea6: 84 e0 ldi r24, 0x04 ; 4 + 3ea8: 99 d0 rcall .+306 ; 0x3fdc + putch(0x00); + 3eaa: 80 e0 ldi r24, 0x00 ; 0 + 3eac: 71 d0 rcall .+226 ; 0x3f90 + 3eae: 6d c0 rjmp .+218 ; 0x3f8a + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3eb0: 84 36 cpi r24, 0x64 ; 100 + 3eb2: 09 f0 breq .+2 ; 0x3eb6 + 3eb4: 43 c0 rjmp .+134 ; 0x3f3c + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 3eb6: 7c d0 rcall .+248 ; 0x3fb0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 3eb8: e0 91 00 02 lds r30, 0x0200 + 3ebc: f0 91 01 02 lds r31, 0x0201 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 80 93 57 00 sts 0x0057, r24 + 3ec6: e8 95 spm + 3ec8: c0 e0 ldi r28, 0x00 ; 0 + 3eca: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 3ecc: 69 d0 rcall .+210 ; 0x3fa0 + 3ece: 89 93 st Y+, r24 + while (--length); + 3ed0: 80 91 02 02 lds r24, 0x0202 + 3ed4: 81 50 subi r24, 0x01 ; 1 + 3ed6: 80 93 02 02 sts 0x0202, r24 + 3eda: 88 23 and r24, r24 + 3edc: b9 f7 brne .-18 ; 0x3ecc + + // Read command terminator, start reply + verifySpace(); + 3ede: 78 d0 rcall .+240 ; 0x3fd0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 3ee0: 07 b6 in r0, 0x37 ; 55 + 3ee2: 00 fc sbrc r0, 0 + 3ee4: fd cf rjmp .-6 ; 0x3ee0 + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 3ee6: 40 91 00 02 lds r20, 0x0200 + 3eea: 50 91 01 02 lds r21, 0x0201 + 3eee: a0 e0 ldi r26, 0x00 ; 0 + 3ef0: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 3ef2: 2c 91 ld r18, X + 3ef4: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 3ef6: 11 96 adiw r26, 0x01 ; 1 + 3ef8: 8c 91 ld r24, X + 3efa: 11 97 sbiw r26, 0x01 ; 1 + 3efc: 90 e0 ldi r25, 0x00 ; 0 + 3efe: 98 2f mov r25, r24 + 3f00: 88 27 eor r24, r24 + 3f02: 82 2b or r24, r18 + 3f04: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3f06: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 3f08: fa 01 movw r30, r20 + 3f0a: 0c 01 movw r0, r24 + 3f0c: d0 92 57 00 sts 0x0057, r13 + 3f10: e8 95 spm + 3f12: 11 24 eor r1, r1 + addrPtr += 2; + 3f14: 4e 5f subi r20, 0xFE ; 254 + 3f16: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 3f18: f1 e0 ldi r31, 0x01 ; 1 + 3f1a: a0 38 cpi r26, 0x80 ; 128 + 3f1c: bf 07 cpc r27, r31 + 3f1e: 49 f7 brne .-46 ; 0x3ef2 + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3f20: e0 91 00 02 lds r30, 0x0200 + 3f24: f0 91 01 02 lds r31, 0x0201 + 3f28: e0 92 57 00 sts 0x0057, r14 + 3f2c: e8 95 spm + boot_spm_busy_wait(); + 3f2e: 07 b6 in r0, 0x37 ; 55 + 3f30: 00 fc sbrc r0, 0 + 3f32: fd cf rjmp .-6 ; 0x3f2e + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3f34: f0 92 57 00 sts 0x0057, r15 + 3f38: e8 95 spm + 3f3a: 27 c0 rjmp .+78 ; 0x3f8a +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f3c: 84 37 cpi r24, 0x74 ; 116 + 3f3e: b9 f4 brne .+46 ; 0x3f6e + // READ PAGE - we only read flash + getLen(); + 3f40: 37 d0 rcall .+110 ; 0x3fb0 + verifySpace(); + 3f42: 46 d0 rcall .+140 ; 0x3fd0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 3f44: e0 91 00 02 lds r30, 0x0200 + 3f48: f0 91 01 02 lds r31, 0x0201 + 3f4c: 31 96 adiw r30, 0x01 ; 1 + 3f4e: f0 93 01 02 sts 0x0201, r31 + 3f52: e0 93 00 02 sts 0x0200, r30 + 3f56: 31 97 sbiw r30, 0x01 ; 1 + 3f58: e4 91 lpm r30, Z+ + 3f5a: 8e 2f mov r24, r30 + 3f5c: 19 d0 rcall .+50 ; 0x3f90 + while (--length); + 3f5e: 80 91 02 02 lds r24, 0x0202 + 3f62: 81 50 subi r24, 0x01 ; 1 + 3f64: 80 93 02 02 sts 0x0202, r24 + 3f68: 88 23 and r24, r24 + 3f6a: 61 f7 brne .-40 ; 0x3f44 + 3f6c: 0e c0 rjmp .+28 ; 0x3f8a +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f6e: 85 37 cpi r24, 0x75 ; 117 + 3f70: 39 f4 brne .+14 ; 0x3f80 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f72: 2e d0 rcall .+92 ; 0x3fd0 + putch(SIGNATURE_0); + 3f74: 8e e1 ldi r24, 0x1E ; 30 + 3f76: 0c d0 rcall .+24 ; 0x3f90 + putch(SIGNATURE_1); + 3f78: 84 e9 ldi r24, 0x94 ; 148 + 3f7a: 0a d0 rcall .+20 ; 0x3f90 + putch(SIGNATURE_2); + 3f7c: 86 e0 ldi r24, 0x06 ; 6 + 3f7e: 96 cf rjmp .-212 ; 0x3eac + } + else if (ch == 'Q') { + 3f80: 81 35 cpi r24, 0x51 ; 81 + 3f82: 11 f4 brne .+4 ; 0x3f88 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f84: 88 e0 ldi r24, 0x08 ; 8 + 3f86: 19 d0 rcall .+50 ; 0x3fba + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f88: 23 d0 rcall .+70 ; 0x3fd0 + } + putch(STK_OK); + 3f8a: 80 e1 ldi r24, 0x10 ; 16 + 3f8c: 01 d0 rcall .+2 ; 0x3f90 + 3f8e: 63 cf rjmp .-314 ; 0x3e56 + +00003f90 : + } +} + +void putch(char ch) { + 3f90: 98 2f mov r25, r24 +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + 3f92: 80 91 c0 00 lds r24, 0x00C0 + 3f96: 85 ff sbrs r24, 5 + 3f98: fc cf rjmp .-8 ; 0x3f92 + UDR0 = ch; + 3f9a: 90 93 c6 00 sts 0x00C6, r25 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 3f9e: 08 95 ret + +00003fa0 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3fa0: a8 95 wdr + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))); + 3fa2: 80 91 c0 00 lds r24, 0x00C0 + 3fa6: 87 ff sbrs r24, 7 + 3fa8: fc cf rjmp .-8 ; 0x3fa2 + ch = UDR0; + 3faa: 80 91 c6 00 lds r24, 0x00C6 +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 3fae: 08 95 ret + +00003fb0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 3fb0: f7 df rcall .-18 ; 0x3fa0 + length = getch(); + 3fb2: f6 df rcall .-20 ; 0x3fa0 + 3fb4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 3fb8: f3 cf rjmp .-26 ; 0x3fa0 + +00003fba : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3fba: e0 e6 ldi r30, 0x60 ; 96 + 3fbc: f0 e0 ldi r31, 0x00 ; 0 + 3fbe: 98 e1 ldi r25, 0x18 ; 24 + 3fc0: 90 83 st Z, r25 + WDTCSR = x; + 3fc2: 80 83 st Z, r24 +} + 3fc4: 08 95 ret + +00003fc6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 3fc6: 80 e0 ldi r24, 0x00 ; 0 + 3fc8: f8 df rcall .-16 ; 0x3fba + __asm__ __volatile__ ( + 3fca: ee 27 eor r30, r30 + 3fcc: ff 27 eor r31, r31 + 3fce: 09 94 ijmp + +00003fd0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 3fd0: e7 df rcall .-50 ; 0x3fa0 + 3fd2: 80 32 cpi r24, 0x20 ; 32 + 3fd4: 09 f0 breq .+2 ; 0x3fd8 + 3fd6: f7 df rcall .-18 ; 0x3fc6 + putch(STK_INSYNC); + 3fd8: 84 e1 ldi r24, 0x14 ; 20 +} + 3fda: da cf rjmp .-76 ; 0x3f90 + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fdc: 1f 93 push r17 + 3fde: 18 2f mov r17, r24 + +00003fe0 : + do getch(); while (--count); + 3fe0: df df rcall .-66 ; 0x3fa0 + 3fe2: 11 50 subi r17, 0x01 ; 1 + 3fe4: e9 f7 brne .-6 ; 0x3fe0 + verifySpace(); + 3fe6: f4 df rcall .-24 ; 0x3fd0 +} + 3fe8: 1f 91 pop r17 + 3fea: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.hex new file mode 100644 index 0000000..19c9ae4 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.hex @@ -0,0 +1,33 @@ +:103E000085E08093810082E08093C00088E1809308 +:103E1000C10086E08093C20085E18093C40084B72E +:103E200014BE81FFD0D08DE0C8D0259A86E02CE367 +:103E30003BEF91E0309385002093840096BBB09BCC +:103E4000FECF1D9AA8958150A9F7DD24D394A5E053 +:103E5000EA2EF1E1FF2EA4D0813421F481E0BED01E +:103E600083E024C0823411F484E103C0853419F462 +:103E700085E0B4D08AC08535A1F492D0082F10E037 +:103E800010930102009300028BD090E0982F8827B6 +:103E9000802B912B880F991F909301028093000231 +:103EA00073C0863529F484E099D080E071D06DC06C +:103EB000843609F043C07CD0E0910002F091010209 +:103EC00083E080935700E895C0E0D1E069D0899302 +:103ED000809102028150809302028823B9F778D042 +:103EE00007B600FCFDCF4091000250910102A0E016 +:103EF000B1E02C9130E011968C91119790E0982FC1 +:103F00008827822B932B1296FA010C01D09257002E +:103F1000E89511244E5F5F4FF1E0A038BF0749F7E5 +:103F2000E0910002F0910102E0925700E89507B697 +:103F300000FCFDCFF0925700E89527C08437B9F414 +:103F400037D046D0E0910002F09101023196F09313 +:103F50000102E09300023197E4918E2F19D08091F5 +:103F60000202815080930202882361F70EC08537D8 +:103F700039F42ED08EE10CD084E90AD086E096CFB9 +:103F8000813511F488E019D023D080E101D063CFCE +:103F9000982F8091C00085FFFCCF9093C6000895B4 +:103FA000A8958091C00087FFFCCF8091C60008953E +:103FB000F7DFF6DF80930202F3CFE0E6F0E098E16E +:103FC00090838083089580E0F8DFEE27FF2709942F +:103FD000E7DF803209F0F7DF84E1DACF1F93182F93 +:0C3FE000DFDF1150E9F7F4DF1F910895B6 +:0400000300003E00BB +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.lst new file mode 100644 index 0000000..62178d3 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_20mhz.lst @@ -0,0 +1,520 @@ + +optiboot_pro_20mhz.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001ec 00003e00 00003e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000240 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 0000006a 00000000 00000000 00000268 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000269 00000000 00000000 000002d2 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000196 00000000 00000000 0000053b 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003d3 00000000 00000000 000006d1 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 00000090 00000000 00000000 00000aa4 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 00000135 00000000 00000000 00000b34 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001d1 00000000 00000000 00000c69 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000068 00000000 00000000 00000e3a 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3e00: 85 e0 ldi r24, 0x05 ; 5 + 3e02: 80 93 81 00 sts 0x0081, r24 +#if LED_START_FLASHES > 0 + // Set up Timer 1 for timeout counter + TCCR1B = _BV(CS12) | _BV(CS10); // div 1024 +#endif +#ifndef SOFT_UART + UCSR0A = _BV(U2X0); //Double speed mode USART0 + 3e06: 82 e0 ldi r24, 0x02 ; 2 + 3e08: 80 93 c0 00 sts 0x00C0, r24 + UCSR0B = _BV(RXEN0) | _BV(TXEN0); + 3e0c: 88 e1 ldi r24, 0x18 ; 24 + 3e0e: 80 93 c1 00 sts 0x00C1, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + 3e12: 86 e0 ldi r24, 0x06 ; 6 + 3e14: 80 93 c2 00 sts 0x00C2, r24 + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); + 3e18: 85 e1 ldi r24, 0x15 ; 21 + 3e1a: 80 93 c4 00 sts 0x00C4, r24 +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 3e1e: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 3e20: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 3e22: 81 ff sbrs r24, 1 + 3e24: d0 d0 rcall .+416 ; 0x3fc6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 3e26: 8d e0 ldi r24, 0x0D ; 13 + 3e28: c8 d0 rcall .+400 ; 0x3fba + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e2a: 25 9a sbi 0x04, 5 ; 4 + 3e2c: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e2e: 2c e3 ldi r18, 0x3C ; 60 + 3e30: 3b ef ldi r19, 0xFB ; 251 + TIFR1 = _BV(TOV1); + 3e32: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e34: 30 93 85 00 sts 0x0085, r19 + 3e38: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 3e3c: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e3e: b0 9b sbis 0x16, 0 ; 22 + 3e40: fe cf rjmp .-4 ; 0x3e3e + LED_PIN |= _BV(LED); + 3e42: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e44: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 3e46: 81 50 subi r24, 0x01 ; 1 + 3e48: a9 f7 brne .-22 ; 0x3e34 + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e4a: dd 24 eor r13, r13 + 3e4c: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3e4e: a5 e0 ldi r26, 0x05 ; 5 + 3e50: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3e52: f1 e1 ldi r31, 0x11 ; 17 + 3e54: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e56: a4 d0 rcall .+328 ; 0x3fa0 + + if(ch == STK_GET_PARAMETER) { + 3e58: 81 34 cpi r24, 0x41 ; 65 + 3e5a: 21 f4 brne .+8 ; 0x3e64 + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e5c: 81 e0 ldi r24, 0x01 ; 1 + 3e5e: be d0 rcall .+380 ; 0x3fdc + putch(0x03); + 3e60: 83 e0 ldi r24, 0x03 ; 3 + 3e62: 24 c0 rjmp .+72 ; 0x3eac + } + else if(ch == STK_SET_DEVICE) { + 3e64: 82 34 cpi r24, 0x42 ; 66 + 3e66: 11 f4 brne .+4 ; 0x3e6c + // SET DEVICE is ignored + getNch(20); + 3e68: 84 e1 ldi r24, 0x14 ; 20 + 3e6a: 03 c0 rjmp .+6 ; 0x3e72 + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e6c: 85 34 cpi r24, 0x45 ; 69 + 3e6e: 19 f4 brne .+6 ; 0x3e76 + // SET DEVICE EXT is ignored + getNch(5); + 3e70: 85 e0 ldi r24, 0x05 ; 5 + 3e72: b4 d0 rcall .+360 ; 0x3fdc + 3e74: 8a c0 rjmp .+276 ; 0x3f8a + } + else if(ch == STK_LOAD_ADDRESS) { + 3e76: 85 35 cpi r24, 0x55 ; 85 + 3e78: a1 f4 brne .+40 ; 0x3ea2 + // LOAD ADDRESS + address = getch(); + 3e7a: 92 d0 rcall .+292 ; 0x3fa0 + 3e7c: 08 2f mov r16, r24 + 3e7e: 10 e0 ldi r17, 0x00 ; 0 + 3e80: 10 93 01 02 sts 0x0201, r17 + 3e84: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 3e88: 8b d0 rcall .+278 ; 0x3fa0 + 3e8a: 90 e0 ldi r25, 0x00 ; 0 + 3e8c: 98 2f mov r25, r24 + 3e8e: 88 27 eor r24, r24 + 3e90: 80 2b or r24, r16 + 3e92: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 3e94: 88 0f add r24, r24 + 3e96: 99 1f adc r25, r25 + 3e98: 90 93 01 02 sts 0x0201, r25 + 3e9c: 80 93 00 02 sts 0x0200, r24 + 3ea0: 73 c0 rjmp .+230 ; 0x3f88 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3ea2: 86 35 cpi r24, 0x56 ; 86 + 3ea4: 29 f4 brne .+10 ; 0x3eb0 + // UNIVERSAL command is ignored + getNch(4); + 3ea6: 84 e0 ldi r24, 0x04 ; 4 + 3ea8: 99 d0 rcall .+306 ; 0x3fdc + putch(0x00); + 3eaa: 80 e0 ldi r24, 0x00 ; 0 + 3eac: 71 d0 rcall .+226 ; 0x3f90 + 3eae: 6d c0 rjmp .+218 ; 0x3f8a + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3eb0: 84 36 cpi r24, 0x64 ; 100 + 3eb2: 09 f0 breq .+2 ; 0x3eb6 + 3eb4: 43 c0 rjmp .+134 ; 0x3f3c + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 3eb6: 7c d0 rcall .+248 ; 0x3fb0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 3eb8: e0 91 00 02 lds r30, 0x0200 + 3ebc: f0 91 01 02 lds r31, 0x0201 + 3ec0: 83 e0 ldi r24, 0x03 ; 3 + 3ec2: 80 93 57 00 sts 0x0057, r24 + 3ec6: e8 95 spm + 3ec8: c0 e0 ldi r28, 0x00 ; 0 + 3eca: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 3ecc: 69 d0 rcall .+210 ; 0x3fa0 + 3ece: 89 93 st Y+, r24 + while (--length); + 3ed0: 80 91 02 02 lds r24, 0x0202 + 3ed4: 81 50 subi r24, 0x01 ; 1 + 3ed6: 80 93 02 02 sts 0x0202, r24 + 3eda: 88 23 and r24, r24 + 3edc: b9 f7 brne .-18 ; 0x3ecc + + // Read command terminator, start reply + verifySpace(); + 3ede: 78 d0 rcall .+240 ; 0x3fd0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 3ee0: 07 b6 in r0, 0x37 ; 55 + 3ee2: 00 fc sbrc r0, 0 + 3ee4: fd cf rjmp .-6 ; 0x3ee0 + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 3ee6: 40 91 00 02 lds r20, 0x0200 + 3eea: 50 91 01 02 lds r21, 0x0201 + 3eee: a0 e0 ldi r26, 0x00 ; 0 + 3ef0: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 3ef2: 2c 91 ld r18, X + 3ef4: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 3ef6: 11 96 adiw r26, 0x01 ; 1 + 3ef8: 8c 91 ld r24, X + 3efa: 11 97 sbiw r26, 0x01 ; 1 + 3efc: 90 e0 ldi r25, 0x00 ; 0 + 3efe: 98 2f mov r25, r24 + 3f00: 88 27 eor r24, r24 + 3f02: 82 2b or r24, r18 + 3f04: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3f06: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 3f08: fa 01 movw r30, r20 + 3f0a: 0c 01 movw r0, r24 + 3f0c: d0 92 57 00 sts 0x0057, r13 + 3f10: e8 95 spm + 3f12: 11 24 eor r1, r1 + addrPtr += 2; + 3f14: 4e 5f subi r20, 0xFE ; 254 + 3f16: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 3f18: f1 e0 ldi r31, 0x01 ; 1 + 3f1a: a0 38 cpi r26, 0x80 ; 128 + 3f1c: bf 07 cpc r27, r31 + 3f1e: 49 f7 brne .-46 ; 0x3ef2 + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3f20: e0 91 00 02 lds r30, 0x0200 + 3f24: f0 91 01 02 lds r31, 0x0201 + 3f28: e0 92 57 00 sts 0x0057, r14 + 3f2c: e8 95 spm + boot_spm_busy_wait(); + 3f2e: 07 b6 in r0, 0x37 ; 55 + 3f30: 00 fc sbrc r0, 0 + 3f32: fd cf rjmp .-6 ; 0x3f2e + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3f34: f0 92 57 00 sts 0x0057, r15 + 3f38: e8 95 spm + 3f3a: 27 c0 rjmp .+78 ; 0x3f8a +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f3c: 84 37 cpi r24, 0x74 ; 116 + 3f3e: b9 f4 brne .+46 ; 0x3f6e + // READ PAGE - we only read flash + getLen(); + 3f40: 37 d0 rcall .+110 ; 0x3fb0 + verifySpace(); + 3f42: 46 d0 rcall .+140 ; 0x3fd0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 3f44: e0 91 00 02 lds r30, 0x0200 + 3f48: f0 91 01 02 lds r31, 0x0201 + 3f4c: 31 96 adiw r30, 0x01 ; 1 + 3f4e: f0 93 01 02 sts 0x0201, r31 + 3f52: e0 93 00 02 sts 0x0200, r30 + 3f56: 31 97 sbiw r30, 0x01 ; 1 + 3f58: e4 91 lpm r30, Z+ + 3f5a: 8e 2f mov r24, r30 + 3f5c: 19 d0 rcall .+50 ; 0x3f90 + while (--length); + 3f5e: 80 91 02 02 lds r24, 0x0202 + 3f62: 81 50 subi r24, 0x01 ; 1 + 3f64: 80 93 02 02 sts 0x0202, r24 + 3f68: 88 23 and r24, r24 + 3f6a: 61 f7 brne .-40 ; 0x3f44 + 3f6c: 0e c0 rjmp .+28 ; 0x3f8a +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f6e: 85 37 cpi r24, 0x75 ; 117 + 3f70: 39 f4 brne .+14 ; 0x3f80 + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f72: 2e d0 rcall .+92 ; 0x3fd0 + putch(SIGNATURE_0); + 3f74: 8e e1 ldi r24, 0x1E ; 30 + 3f76: 0c d0 rcall .+24 ; 0x3f90 + putch(SIGNATURE_1); + 3f78: 84 e9 ldi r24, 0x94 ; 148 + 3f7a: 0a d0 rcall .+20 ; 0x3f90 + putch(SIGNATURE_2); + 3f7c: 86 e0 ldi r24, 0x06 ; 6 + 3f7e: 96 cf rjmp .-212 ; 0x3eac + } + else if (ch == 'Q') { + 3f80: 81 35 cpi r24, 0x51 ; 81 + 3f82: 11 f4 brne .+4 ; 0x3f88 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f84: 88 e0 ldi r24, 0x08 ; 8 + 3f86: 19 d0 rcall .+50 ; 0x3fba + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f88: 23 d0 rcall .+70 ; 0x3fd0 + } + putch(STK_OK); + 3f8a: 80 e1 ldi r24, 0x10 ; 16 + 3f8c: 01 d0 rcall .+2 ; 0x3f90 + 3f8e: 63 cf rjmp .-314 ; 0x3e56 + +00003f90 : + } +} + +void putch(char ch) { + 3f90: 98 2f mov r25, r24 +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + 3f92: 80 91 c0 00 lds r24, 0x00C0 + 3f96: 85 ff sbrs r24, 5 + 3f98: fc cf rjmp .-8 ; 0x3f92 + UDR0 = ch; + 3f9a: 90 93 c6 00 sts 0x00C6, r25 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 3f9e: 08 95 ret + +00003fa0 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3fa0: a8 95 wdr + [uartBit] "I" (UART_RX_BIT) + : + "r25" +); +#else + while(!(UCSR0A & _BV(RXC0))); + 3fa2: 80 91 c0 00 lds r24, 0x00C0 + 3fa6: 87 ff sbrs r24, 7 + 3fa8: fc cf rjmp .-8 ; 0x3fa2 + ch = UDR0; + 3faa: 80 91 c6 00 lds r24, 0x00C6 +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 3fae: 08 95 ret + +00003fb0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 3fb0: f7 df rcall .-18 ; 0x3fa0 + length = getch(); + 3fb2: f6 df rcall .-20 ; 0x3fa0 + 3fb4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 3fb8: f3 cf rjmp .-26 ; 0x3fa0 + +00003fba : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3fba: e0 e6 ldi r30, 0x60 ; 96 + 3fbc: f0 e0 ldi r31, 0x00 ; 0 + 3fbe: 98 e1 ldi r25, 0x18 ; 24 + 3fc0: 90 83 st Z, r25 + WDTCSR = x; + 3fc2: 80 83 st Z, r24 +} + 3fc4: 08 95 ret + +00003fc6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 3fc6: 80 e0 ldi r24, 0x00 ; 0 + 3fc8: f8 df rcall .-16 ; 0x3fba + __asm__ __volatile__ ( + 3fca: ee 27 eor r30, r30 + 3fcc: ff 27 eor r31, r31 + 3fce: 09 94 ijmp + +00003fd0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 3fd0: e7 df rcall .-50 ; 0x3fa0 + 3fd2: 80 32 cpi r24, 0x20 ; 32 + 3fd4: 09 f0 breq .+2 ; 0x3fd8 + 3fd6: f7 df rcall .-18 ; 0x3fc6 + putch(STK_INSYNC); + 3fd8: 84 e1 ldi r24, 0x14 ; 20 +} + 3fda: da cf rjmp .-76 ; 0x3f90 + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fdc: 1f 93 push r17 + 3fde: 18 2f mov r17, r24 + +00003fe0 : + do getch(); while (--count); + 3fe0: df df rcall .-66 ; 0x3fa0 + 3fe2: 11 50 subi r17, 0x01 ; 1 + 3fe4: e9 f7 brne .-6 ; 0x3fe0 + verifySpace(); + 3fe6: f4 df rcall .-24 ; 0x3fd0 +} + 3fe8: 1f 91 pop r17 + 3fea: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.hex new file mode 100644 index 0000000..9d31a7a --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.hex @@ -0,0 +1,34 @@ +:103E000085E08093810084B714BE81FFE4D08DE00B +:103E1000DCD0259A519A86E028E13EEF91E030937C +:103E200085002093840096BBB09BFECF1D9AA89579 +:103E30008150A9F7DD24D394A5E0EA2EF1E1FF2E0D +:103E4000ABD0813421F481E0D1D083E024C082342E +:103E500011F484E103C0853419F485E0C7D08AC029 +:103E60008535A1F499D0082F10E01093010200933A +:103E7000000292D090E0982F8827802B912B880FFA +:103E8000991F909301028093000273C0863529F434 +:103E900084E0ACD080E071D06DC0843609F043C0BE +:103EA0008FD0E0910002F091010283E080935700EF +:103EB000E895C0E0D1E070D08993809102028150F2 +:103EC000809302028823B9F78BD007B600FCFDCFA0 +:103ED0004091000250910102A0E0B1E02C9130E04D +:103EE00011968C91119790E0982F8827822B932B15 +:103EF0001296FA010C01D0925700E89511244E5FFA +:103F00005F4FF1E0A038BF0749F7E0910002F09160 +:103F10000102E0925700E89507B600FCFDCFF09251 +:103F20005700E89527C08437B9F44AD059D0E091BA +:103F30000002F09101023196F0930102E093000239 +:103F40003197E4918E2F19D0809102028150809395 +:103F50000202882361F70EC0853739F441D08EE123 +:103F60000CD084E90AD086E096CF813511F488E040 +:103F70002CD036D080E101D063CF2AE030E08095AC +:103F8000089410F4599802C0599A000015D014D022 +:103F900086952A95B1F70895A89529E030E04899CB +:103FA000FECF0AD009D008D08894489908942A9561 +:103FB00011F08795F7CF089598E09A95F1F7089555 +:103FC000EBDFEADF80930202E7CFE0E6F0E098E182 +:103FD00090838083089580E0F8DFEE27FF2709941F +:103FE000DBDF803209F0F7DF84E1C7CF1F93182FA2 +:0C3FF000D3DF1150E9F7F4DF1F910895B2 +:0400000300003E00BB +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.lst b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.lst new file mode 100644 index 0000000..94603e2 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/optiboot/optiboot_pro_8MHz.lst @@ -0,0 +1,533 @@ + +optiboot_pro_8MHz.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 000001fc 00003e00 00003e00 00000054 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .debug_aranges 00000028 00000000 00000000 00000250 2**0 + CONTENTS, READONLY, DEBUGGING + 2 .debug_pubnames 00000078 00000000 00000000 00000278 2**0 + CONTENTS, READONLY, DEBUGGING + 3 .debug_info 00000277 00000000 00000000 000002f0 2**0 + CONTENTS, READONLY, DEBUGGING + 4 .debug_abbrev 00000194 00000000 00000000 00000567 2**0 + CONTENTS, READONLY, DEBUGGING + 5 .debug_line 000003bb 00000000 00000000 000006fb 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_frame 000000a0 00000000 00000000 00000ab8 2**2 + CONTENTS, READONLY, DEBUGGING + 7 .debug_str 0000013f 00000000 00000000 00000b58 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_loc 000001a0 00000000 00000000 00000c97 2**0 + CONTENTS, READONLY, DEBUGGING + 9 .debug_ranges 00000070 00000000 00000000 00000e37 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00003e00
    : +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3e00: 85 e0 ldi r24, 0x05 ; 5 + 3e02: 80 93 81 00 sts 0x0081, r24 + UCSR0C = _BV(UCSZ00) | _BV(UCSZ01); + UBRR0L = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 ); +#endif + + // Adaboot no-wait mod + ch = MCUSR; + 3e06: 84 b7 in r24, 0x34 ; 52 + MCUSR = 0; + 3e08: 14 be out 0x34, r1 ; 52 + if (!(ch & _BV(EXTRF))) appStart(); + 3e0a: 81 ff sbrs r24, 1 + 3e0c: e4 d0 rcall .+456 ; 0x3fd6 + + // Set up watchdog to trigger after 500ms + watchdogConfig(WATCHDOG_500MS); + 3e0e: 8d e0 ldi r24, 0x0D ; 13 + 3e10: dc d0 rcall .+440 ; 0x3fca + + /* Set LED pin as output */ + LED_DDR |= _BV(LED); + 3e12: 25 9a sbi 0x04, 5 ; 4 + +#ifdef SOFT_UART + /* Set TX pin as output */ + UART_DDR |= _BV(UART_TX_BIT); + 3e14: 51 9a sbi 0x0a, 1 ; 10 + 3e16: 86 e0 ldi r24, 0x06 ; 6 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e18: 28 e1 ldi r18, 0x18 ; 24 + 3e1a: 3e ef ldi r19, 0xFE ; 254 + TIFR1 = _BV(TOV1); + 3e1c: 91 e0 ldi r25, 0x01 ; 1 +} + +#if LED_START_FLASHES > 0 +void flash_led(uint8_t count) { + do { + TCNT1 = -(F_CPU/(1024*16)); + 3e1e: 30 93 85 00 sts 0x0085, r19 + 3e22: 20 93 84 00 sts 0x0084, r18 + TIFR1 = _BV(TOV1); + 3e26: 96 bb out 0x16, r25 ; 22 + while(!(TIFR1 & _BV(TOV1))); + 3e28: b0 9b sbis 0x16, 0 ; 22 + 3e2a: fe cf rjmp .-4 ; 0x3e28 + LED_PIN |= _BV(LED); + 3e2c: 1d 9a sbi 0x03, 5 ; 3 + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3e2e: a8 95 wdr + TCNT1 = -(F_CPU/(1024*16)); + TIFR1 = _BV(TOV1); + while(!(TIFR1 & _BV(TOV1))); + LED_PIN |= _BV(LED); + watchdogReset(); + } while (--count); + 3e30: 81 50 subi r24, 0x01 ; 1 + 3e32: a9 f7 brne .-22 ; 0x3e1e + /* get character from UART */ + ch = getch(); + + if(ch == STK_GET_PARAMETER) { + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e34: dd 24 eor r13, r13 + 3e36: d3 94 inc r13 + boot_page_fill((uint16_t)(void*)addrPtr,a); + addrPtr += 2; + } while (--ch); + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3e38: a5 e0 ldi r26, 0x05 ; 5 + 3e3a: ea 2e mov r14, r26 + boot_spm_busy_wait(); + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3e3c: f1 e1 ldi r31, 0x11 ; 17 + 3e3e: ff 2e mov r15, r31 +#endif + + /* Forever loop */ + for (;;) { + /* get character from UART */ + ch = getch(); + 3e40: ab d0 rcall .+342 ; 0x3f98 + + if(ch == STK_GET_PARAMETER) { + 3e42: 81 34 cpi r24, 0x41 ; 65 + 3e44: 21 f4 brne .+8 ; 0x3e4e + // GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy + getNch(1); + 3e46: 81 e0 ldi r24, 0x01 ; 1 + 3e48: d1 d0 rcall .+418 ; 0x3fec + putch(0x03); + 3e4a: 83 e0 ldi r24, 0x03 ; 3 + 3e4c: 24 c0 rjmp .+72 ; 0x3e96 + } + else if(ch == STK_SET_DEVICE) { + 3e4e: 82 34 cpi r24, 0x42 ; 66 + 3e50: 11 f4 brne .+4 ; 0x3e56 + // SET DEVICE is ignored + getNch(20); + 3e52: 84 e1 ldi r24, 0x14 ; 20 + 3e54: 03 c0 rjmp .+6 ; 0x3e5c + } + else if(ch == STK_SET_DEVICE_EXT) { + 3e56: 85 34 cpi r24, 0x45 ; 69 + 3e58: 19 f4 brne .+6 ; 0x3e60 + // SET DEVICE EXT is ignored + getNch(5); + 3e5a: 85 e0 ldi r24, 0x05 ; 5 + 3e5c: c7 d0 rcall .+398 ; 0x3fec + 3e5e: 8a c0 rjmp .+276 ; 0x3f74 + } + else if(ch == STK_LOAD_ADDRESS) { + 3e60: 85 35 cpi r24, 0x55 ; 85 + 3e62: a1 f4 brne .+40 ; 0x3e8c + // LOAD ADDRESS + address = getch(); + 3e64: 99 d0 rcall .+306 ; 0x3f98 + 3e66: 08 2f mov r16, r24 + 3e68: 10 e0 ldi r17, 0x00 ; 0 + 3e6a: 10 93 01 02 sts 0x0201, r17 + 3e6e: 00 93 00 02 sts 0x0200, r16 + address = (address & 0xff) | (getch() << 8); + 3e72: 92 d0 rcall .+292 ; 0x3f98 + 3e74: 90 e0 ldi r25, 0x00 ; 0 + 3e76: 98 2f mov r25, r24 + 3e78: 88 27 eor r24, r24 + 3e7a: 80 2b or r24, r16 + 3e7c: 91 2b or r25, r17 + address += address; // Convert from word address to byte address + 3e7e: 88 0f add r24, r24 + 3e80: 99 1f adc r25, r25 + 3e82: 90 93 01 02 sts 0x0201, r25 + 3e86: 80 93 00 02 sts 0x0200, r24 + 3e8a: 73 c0 rjmp .+230 ; 0x3f72 + verifySpace(); + } + else if(ch == STK_UNIVERSAL) { + 3e8c: 86 35 cpi r24, 0x56 ; 86 + 3e8e: 29 f4 brne .+10 ; 0x3e9a + // UNIVERSAL command is ignored + getNch(4); + 3e90: 84 e0 ldi r24, 0x04 ; 4 + 3e92: ac d0 rcall .+344 ; 0x3fec + putch(0x00); + 3e94: 80 e0 ldi r24, 0x00 ; 0 + 3e96: 71 d0 rcall .+226 ; 0x3f7a + 3e98: 6d c0 rjmp .+218 ; 0x3f74 + } + /* Write memory, length is big endian and is in bytes */ + else if(ch == STK_PROG_PAGE) { + 3e9a: 84 36 cpi r24, 0x64 ; 100 + 3e9c: 09 f0 breq .+2 ; 0x3ea0 + 3e9e: 43 c0 rjmp .+134 ; 0x3f26 + // PROGRAM PAGE - we support flash programming only, not EEPROM + uint8_t *bufPtr; + uint16_t addrPtr; + + getLen(); + 3ea0: 8f d0 rcall .+286 ; 0x3fc0 + + // Immediately start page erase - this will 4.5ms + boot_page_erase((uint16_t)(void*)address); + 3ea2: e0 91 00 02 lds r30, 0x0200 + 3ea6: f0 91 01 02 lds r31, 0x0201 + 3eaa: 83 e0 ldi r24, 0x03 ; 3 + 3eac: 80 93 57 00 sts 0x0057, r24 + 3eb0: e8 95 spm + 3eb2: c0 e0 ldi r28, 0x00 ; 0 + 3eb4: d1 e0 ldi r29, 0x01 ; 1 + + // While that is going on, read in page contents + bufPtr = buff; + do *bufPtr++ = getch(); + 3eb6: 70 d0 rcall .+224 ; 0x3f98 + 3eb8: 89 93 st Y+, r24 + while (--length); + 3eba: 80 91 02 02 lds r24, 0x0202 + 3ebe: 81 50 subi r24, 0x01 ; 1 + 3ec0: 80 93 02 02 sts 0x0202, r24 + 3ec4: 88 23 and r24, r24 + 3ec6: b9 f7 brne .-18 ; 0x3eb6 + + // Read command terminator, start reply + verifySpace(); + 3ec8: 8b d0 rcall .+278 ; 0x3fe0 + + // If only a partial page is to be programmed, the erase might not be complete. + // So check that here + boot_spm_busy_wait(); + 3eca: 07 b6 in r0, 0x37 ; 55 + 3ecc: 00 fc sbrc r0, 0 + 3ece: fd cf rjmp .-6 ; 0x3eca + } +#endif + + // Copy buffer into programming buffer + bufPtr = buff; + addrPtr = (uint16_t)(void*)address; + 3ed0: 40 91 00 02 lds r20, 0x0200 + 3ed4: 50 91 01 02 lds r21, 0x0201 + 3ed8: a0 e0 ldi r26, 0x00 ; 0 + 3eda: b1 e0 ldi r27, 0x01 ; 1 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + 3edc: 2c 91 ld r18, X + 3ede: 30 e0 ldi r19, 0x00 ; 0 + a |= (*bufPtr++) << 8; + 3ee0: 11 96 adiw r26, 0x01 ; 1 + 3ee2: 8c 91 ld r24, X + 3ee4: 11 97 sbiw r26, 0x01 ; 1 + 3ee6: 90 e0 ldi r25, 0x00 ; 0 + 3ee8: 98 2f mov r25, r24 + 3eea: 88 27 eor r24, r24 + 3eec: 82 2b or r24, r18 + 3eee: 93 2b or r25, r19 +#ifdef VIRTUAL_BOOT_PARTITION +#define rstVect (*(uint16_t*)(0x204)) +#define wdtVect (*(uint16_t*)(0x206)) +#endif +/* main program starts here */ +int main(void) { + 3ef0: 12 96 adiw r26, 0x02 ; 2 + ch = SPM_PAGESIZE / 2; + do { + uint16_t a; + a = *bufPtr++; + a |= (*bufPtr++) << 8; + boot_page_fill((uint16_t)(void*)addrPtr,a); + 3ef2: fa 01 movw r30, r20 + 3ef4: 0c 01 movw r0, r24 + 3ef6: d0 92 57 00 sts 0x0057, r13 + 3efa: e8 95 spm + 3efc: 11 24 eor r1, r1 + addrPtr += 2; + 3efe: 4e 5f subi r20, 0xFE ; 254 + 3f00: 5f 4f sbci r21, 0xFF ; 255 + } while (--ch); + 3f02: f1 e0 ldi r31, 0x01 ; 1 + 3f04: a0 38 cpi r26, 0x80 ; 128 + 3f06: bf 07 cpc r27, r31 + 3f08: 49 f7 brne .-46 ; 0x3edc + + // Write from programming buffer + boot_page_write((uint16_t)(void*)address); + 3f0a: e0 91 00 02 lds r30, 0x0200 + 3f0e: f0 91 01 02 lds r31, 0x0201 + 3f12: e0 92 57 00 sts 0x0057, r14 + 3f16: e8 95 spm + boot_spm_busy_wait(); + 3f18: 07 b6 in r0, 0x37 ; 55 + 3f1a: 00 fc sbrc r0, 0 + 3f1c: fd cf rjmp .-6 ; 0x3f18 + +#if defined(RWWSRE) + // Reenable read access to flash + boot_rww_enable(); + 3f1e: f0 92 57 00 sts 0x0057, r15 + 3f22: e8 95 spm + 3f24: 27 c0 rjmp .+78 ; 0x3f74 +#endif + + } + /* Read memory block mode, length is big endian. */ + else if(ch == STK_READ_PAGE) { + 3f26: 84 37 cpi r24, 0x74 ; 116 + 3f28: b9 f4 brne .+46 ; 0x3f58 + // READ PAGE - we only read flash + getLen(); + 3f2a: 4a d0 rcall .+148 ; 0x3fc0 + verifySpace(); + 3f2c: 59 d0 rcall .+178 ; 0x3fe0 + else ch = pgm_read_byte_near(address); + address++; + putch(ch); + } while (--length); +#else + do putch(pgm_read_byte_near(address++)); + 3f2e: e0 91 00 02 lds r30, 0x0200 + 3f32: f0 91 01 02 lds r31, 0x0201 + 3f36: 31 96 adiw r30, 0x01 ; 1 + 3f38: f0 93 01 02 sts 0x0201, r31 + 3f3c: e0 93 00 02 sts 0x0200, r30 + 3f40: 31 97 sbiw r30, 0x01 ; 1 + 3f42: e4 91 lpm r30, Z+ + 3f44: 8e 2f mov r24, r30 + 3f46: 19 d0 rcall .+50 ; 0x3f7a + while (--length); + 3f48: 80 91 02 02 lds r24, 0x0202 + 3f4c: 81 50 subi r24, 0x01 ; 1 + 3f4e: 80 93 02 02 sts 0x0202, r24 + 3f52: 88 23 and r24, r24 + 3f54: 61 f7 brne .-40 ; 0x3f2e + 3f56: 0e c0 rjmp .+28 ; 0x3f74 +#endif + } + + /* Get device signature bytes */ + else if(ch == STK_READ_SIGN) { + 3f58: 85 37 cpi r24, 0x75 ; 117 + 3f5a: 39 f4 brne .+14 ; 0x3f6a + // READ SIGN - return what Avrdude wants to hear + verifySpace(); + 3f5c: 41 d0 rcall .+130 ; 0x3fe0 + putch(SIGNATURE_0); + 3f5e: 8e e1 ldi r24, 0x1E ; 30 + 3f60: 0c d0 rcall .+24 ; 0x3f7a + putch(SIGNATURE_1); + 3f62: 84 e9 ldi r24, 0x94 ; 148 + 3f64: 0a d0 rcall .+20 ; 0x3f7a + putch(SIGNATURE_2); + 3f66: 86 e0 ldi r24, 0x06 ; 6 + 3f68: 96 cf rjmp .-212 ; 0x3e96 + } + else if (ch == 'Q') { + 3f6a: 81 35 cpi r24, 0x51 ; 81 + 3f6c: 11 f4 brne .+4 ; 0x3f72 + // Adaboot no-wait mod + watchdogConfig(WATCHDOG_16MS); + 3f6e: 88 e0 ldi r24, 0x08 ; 8 + 3f70: 2c d0 rcall .+88 ; 0x3fca + verifySpace(); + } + else { + // This covers the response to commands like STK_ENTER_PROGMODE + verifySpace(); + 3f72: 36 d0 rcall .+108 ; 0x3fe0 + } + putch(STK_OK); + 3f74: 80 e1 ldi r24, 0x10 ; 16 + 3f76: 01 d0 rcall .+2 ; 0x3f7a + 3f78: 63 cf rjmp .-314 ; 0x3e40 + +00003f7a : +void putch(char ch) { +#ifndef SOFT_UART + while (!(UCSR0A & _BV(UDRE0))); + UDR0 = ch; +#else + __asm__ __volatile__ ( + 3f7a: 2a e0 ldi r18, 0x0A ; 10 + 3f7c: 30 e0 ldi r19, 0x00 ; 0 + 3f7e: 80 95 com r24 + 3f80: 08 94 sec + 3f82: 10 f4 brcc .+4 ; 0x3f88 + 3f84: 59 98 cbi 0x0b, 1 ; 11 + 3f86: 02 c0 rjmp .+4 ; 0x3f8c + 3f88: 59 9a sbi 0x0b, 1 ; 11 + 3f8a: 00 00 nop + 3f8c: 15 d0 rcall .+42 ; 0x3fb8 + 3f8e: 14 d0 rcall .+40 ; 0x3fb8 + 3f90: 86 95 lsr r24 + 3f92: 2a 95 dec r18 + 3f94: b1 f7 brne .-20 ; 0x3f82 + [uartBit] "I" (UART_TX_BIT) + : + "r25" + ); +#endif +} + 3f96: 08 95 ret + +00003f98 : + return getch(); +} + +// Watchdog functions. These are only safe with interrupts turned off. +void watchdogReset() { + __asm__ __volatile__ ( + 3f98: a8 95 wdr +#ifdef LED_DATA_FLASH + LED_PIN |= _BV(LED); +#endif + + return ch; +} + 3f9a: 29 e0 ldi r18, 0x09 ; 9 + 3f9c: 30 e0 ldi r19, 0x00 ; 0 + 3f9e: 48 99 sbic 0x09, 0 ; 9 + 3fa0: fe cf rjmp .-4 ; 0x3f9e + 3fa2: 0a d0 rcall .+20 ; 0x3fb8 + 3fa4: 09 d0 rcall .+18 ; 0x3fb8 + 3fa6: 08 d0 rcall .+16 ; 0x3fb8 + 3fa8: 88 94 clc + 3faa: 48 99 sbic 0x09, 0 ; 9 + 3fac: 08 94 sec + 3fae: 2a 95 dec r18 + 3fb0: 11 f0 breq .+4 ; 0x3fb6 + 3fb2: 87 95 ror r24 + 3fb4: f7 cf rjmp .-18 ; 0x3fa4 + 3fb6: 08 95 ret + +00003fb8 : +#if UART_B_VALUE > 255 +#error Baud rate too slow for soft UART +#endif + +void uartDelay() { + __asm__ __volatile__ ( + 3fb8: 98 e0 ldi r25, 0x08 ; 8 + 3fba: 9a 95 dec r25 + 3fbc: f1 f7 brne .-4 ; 0x3fba + 3fbe: 08 95 ret + +00003fc0 : + } while (--count); +} +#endif + +uint8_t getLen() { + getch(); + 3fc0: eb df rcall .-42 ; 0x3f98 + length = getch(); + 3fc2: ea df rcall .-44 ; 0x3f98 + 3fc4: 80 93 02 02 sts 0x0202, r24 + return getch(); +} + 3fc8: e7 cf rjmp .-50 ; 0x3f98 + +00003fca : + "wdr\n" + ); +} + +void watchdogConfig(uint8_t x) { + WDTCSR = _BV(WDCE) | _BV(WDE); + 3fca: e0 e6 ldi r30, 0x60 ; 96 + 3fcc: f0 e0 ldi r31, 0x00 ; 0 + 3fce: 98 e1 ldi r25, 0x18 ; 24 + 3fd0: 90 83 st Z, r25 + WDTCSR = x; + 3fd2: 80 83 st Z, r24 +} + 3fd4: 08 95 ret + +00003fd6 : + +void appStart() { + watchdogConfig(WATCHDOG_OFF); + 3fd6: 80 e0 ldi r24, 0x00 ; 0 + 3fd8: f8 df rcall .-16 ; 0x3fca + __asm__ __volatile__ ( + 3fda: ee 27 eor r30, r30 + 3fdc: ff 27 eor r31, r31 + 3fde: 09 94 ijmp + +00003fe0 : + do getch(); while (--count); + verifySpace(); +} + +void verifySpace() { + if (getch() != CRC_EOP) appStart(); + 3fe0: db df rcall .-74 ; 0x3f98 + 3fe2: 80 32 cpi r24, 0x20 ; 32 + 3fe4: 09 f0 breq .+2 ; 0x3fe8 + 3fe6: f7 df rcall .-18 ; 0x3fd6 + putch(STK_INSYNC); + 3fe8: 84 e1 ldi r24, 0x14 ; 20 +} + 3fea: c7 cf rjmp .-114 ; 0x3f7a + ::[count] "M" (UART_B_VALUE) + ); +} +#endif + +void getNch(uint8_t count) { + 3fec: 1f 93 push r17 + 3fee: 18 2f mov r17, r24 + +00003ff0 : + do getch(); while (--count); + 3ff0: d3 df rcall .-90 ; 0x3f98 + 3ff2: 11 50 subi r17, 0x01 ; 1 + 3ff4: e9 f7 brne .-6 ; 0x3ff0 + verifySpace(); + 3ff6: f4 df rcall .-24 ; 0x3fe0 +} + 3ff8: 1f 91 pop r17 + 3ffa: 08 95 ret diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/License.txt b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/License.txt new file mode 100644 index 0000000..e7dcdd8 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/License.txt @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/Makefile b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/Makefile new file mode 100644 index 0000000..54c5f85 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/Makefile @@ -0,0 +1,588 @@ +# ---------------------------------------------------------------------------- +# Makefile to compile and link stk500boot bootloader +# Author: Peter Fleury +# File: $Id: Makefile,v 1.3 2006/03/04 19:26:17 peter Exp $ +# based on WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. +# +# Adjust F_CPU below to the clock frequency in Mhz of your AVR target +# Adjust BOOTLOADER_ADDRESS to your AVR target +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- +# = Mark Sproul msproul-at-skychariot.com + + +# MCU name +#MCU = atmega128 + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +#F_CPU = 16000000 + + +# Bootloader +# Please adjust if using a different AVR +# 0x0e00*2=0x1C00 for ATmega8 512 words Boot Size +# 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size +# 0xF800*2=0x1F000 for ATmega1280 +# 0xF000*2=0x1E000 for ATmega1280 +#BOOTLOADER_ADDRESS = 1E000 + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = stk500boot + + +# List C source files here. (C dependencies are automatically generated.) +SRC = stk500boot.c + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=gnu99 + + +# Place -D or -U options here +CDEFS = -DF_CPU=$(F_CPU)UL + + +# Place -I options here +CINCS = + + + +#---------------- Compiler Options ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mno-tablejump +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + +#--------------- bootloader linker Options ------- +# BOOTLOADER_ADDRESS (=Start of Boot Loader section +# in bytes - not words) is defined above. +#LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles -nodefaultlibs +#LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) -nostartfiles +LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS) + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = stk500v2 + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = com1 # programmer connected to serial device + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(SRC:.c=.lst) $(ASRC:.S=.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + +############################################################ +# May 25, 2010 Adding 1280 support +mega1280: MCU = atmega1280 +mega1280: F_CPU = 16000000 +mega1280: BOOTLOADER_ADDRESS = 1E000 +mega1280: CFLAGS += -D_MEGA_BOARD_ +mega1280: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_mega1280.hex + + +############################################################ +# Jul 6, 2010 Adding 2560 support +mega2560: MCU = atmega2560 +mega2560: F_CPU = 16000000 +mega2560: BOOTLOADER_ADDRESS = 3E000 +mega2560: CFLAGS += -D_MEGA_BOARD_ +mega2560: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_mega2560.hex + + +############################################################ +#Initial config on Amber128 board +# avrdude: Device signature = 0x1e9702 +# avrdude: safemode: lfuse reads as 8F +# avrdude: safemode: hfuse reads as CB +# avrdude: safemode: efuse reads as FF +# Jul 17, 2010 Adding 128 support +############################################################ +amber128: MCU = atmega128 +#amber128: F_CPU = 16000000 +amber128: F_CPU = 14745600 +amber128: BOOTLOADER_ADDRESS = 1E000 +amber128: CFLAGS += -D_BOARD_AMBER128_ +amber128: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_amber128.hex + +############################################################ +# Aug 23, 2010 Adding atmega2561 support +m2561: MCU = atmega2561 +m2561: F_CPU = 8000000 +m2561: BOOTLOADER_ADDRESS = 3E000 +m2561: CFLAGS += -D_ANDROID_2561_ -DBAUDRATE=57600 +m2561: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_android2561.hex + + +############################################################ +# avrdude: Device signature = 0x1e9801 +# avrdude: safemode: lfuse reads as EC +# avrdude: safemode: hfuse reads as 18 +# avrdude: safemode: efuse reads as FD +# Aug 23, 2010 Adding cerebot 2560 @ 8mhz +#avrdude -P usb -c usbtiny -p m2560 -v -U flash:w:/Arduino/WiringBootV2_upd1/stk500boot_v2_cerebotplus.hex +############################################################ +cerebot: MCU = atmega2560 +cerebot: F_CPU = 8000000 +cerebot: BOOTLOADER_ADDRESS = 3E000 +cerebot: CFLAGS += -D_CEREBOTPLUS_BOARD_ -DBAUDRATE=38400 -DUART_BAUDRATE_DOUBLE_SPEED=1 +cerebot: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_cerebotplus.hex + + +############################################################ +# Aug 23, 2010 Adding atmega2561 support +penguino: MCU = atmega32 +penguino: F_CPU = 16000000 +penguino: BOOTLOADER_ADDRESS = 7800 +penguino: CFLAGS += -D_PENGUINO_ -DBAUDRATE=57600 +penguino: begin gccversion sizebefore build sizeafter end + mv $(TARGET).hex stk500boot_v2_penguino.hex + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +build: elf hex eep lss sym +#build: hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) *.hex + $(REMOVE) *.eep + $(REMOVE) *.cof + $(REMOVE) *.elf + $(REMOVE) *.map + $(REMOVE) *.sym + $(REMOVE) *.lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program debug gdb-config + diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj new file mode 100644 index 0000000..d935019 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnps b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnps new file mode 100644 index 0000000..f85cde5 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/STK500V2.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h new file mode 100644 index 0000000..0ae80f9 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h @@ -0,0 +1,742 @@ +//************************************************************************************************** +//* +//* interrupt vector names +//* +//* It is important to note that the vector numbers listed here +//* are the ATMEL documentation numbers. The Arduino numbers are 1 less +//* This is because the Atmel docs start numbering the interrupts at 1 +//* when it is actually vector #0 in the table. +//************************************************************************************************** +//* Jun 1, 2010 Added support for ATmega1281 +//* Jun 30, 2010 Putting in more ifdefs to conserve space +//* Jul 3, 2010 More #ifdefs to conserve space and testing on most of my boards +//* Jul 4, 2010 Started using vector defs for #ifdefs as defined in +//* Jul 13, 2010 Added support for __AVR_ATmega128__ +//* Aug 26, 2010 Added support for __AVR_ATmega2561__ +//************************************************************************************************** + +//#include "avrinterruptnames.h" + +//************************************************************************************************** +//* this defines the interrupt vectors and allows us to compile ONLY those strings that are actually +//* in the target CPU. This way we do not have to keep making changes based on cpu, it will be +//* automatic even if we add a new CPU +#ifndef _AVR_IO_H_ + #include +#endif +//************************************************************************************************** + +#ifdef __MWERKS__ + #define prog_char char + #define PGM_P char * +#endif + + prog_char gAvrInt_RESET[] PROGMEM = "RESET"; +#ifdef INT0_vect + prog_char gAvrInt_INT0[] PROGMEM = "INT0"; +#endif +#ifdef INT1_vect + prog_char gAvrInt_INT1[] PROGMEM = "INT1"; +#endif +#ifdef INT2_vect + prog_char gAvrInt_INT2[] PROGMEM = "INT2"; +#endif +#ifdef INT3_vect + prog_char gAvrInt_INT3[] PROGMEM = "INT3"; +#endif +#ifdef INT4_vect + prog_char gAvrInt_INT4[] PROGMEM = "INT4"; +#endif +#ifdef INT5_vect + prog_char gAvrInt_INT5[] PROGMEM = "INT5"; +#endif +#ifdef INT6_vect + prog_char gAvrInt_INT6[] PROGMEM = "INT6"; +#endif +#ifdef INT7_vect + prog_char gAvrInt_INT7[] PROGMEM = "INT7"; +#endif +#ifdef PCINT0_vect + prog_char gAvrInt_PCINT0[] PROGMEM = "PCINT0"; +#endif +#ifdef PCINT1_vect + prog_char gAvrInt_PCINT1[] PROGMEM = "PCINT1"; +#endif +#ifdef PCINT2_vect + prog_char gAvrInt_PCINT2[] PROGMEM = "PCINT2"; +#endif +#ifdef PCINT3_vect + prog_char gAvrInt_PCINT3[] PROGMEM = "PCINT3"; +#endif +#ifdef WDT_vect + prog_char gAvrInt_WDT[] PROGMEM = "WDT"; +#endif +#ifdef TIMER0_COMP_vect + prog_char gAvrInt_TIMER0_COMP[] PROGMEM = "TIMER0 COMP"; +#endif +#ifdef TIMER0_COMPA_vect + prog_char gAvrInt_TIMER0_COMPA[] PROGMEM = "TIMER0 COMPA"; +#endif +#ifdef TIMER0_COMPB_vect + prog_char gAvrInt_TIMER0_COMPB[] PROGMEM = "TIMER0 COMPB"; +#endif +#ifdef TIMER0_OVF_vect + prog_char gAvrInt_TIMER0_OVF[] PROGMEM = "TIMER0 OVF"; +#endif +#ifdef TIMER1_CAPT_vect + prog_char gAvrInt_TIMER1_CAPT[] PROGMEM = "TIMER1 CAPT"; +#endif +#ifdef TIMER1_COMPA_vect + prog_char gAvrInt_TIMER1_COMPA[] PROGMEM = "TIMER1 COMPA"; +#endif +#ifdef TIMER1_COMPB_vect + prog_char gAvrInt_TIMER1_COMPB[] PROGMEM = "TIMER1 COMPB"; +#endif +#ifdef TIMER1_COMPC_vect + prog_char gAvrInt_TIMER1_COMPC[] PROGMEM = "TIMER1 COMPC"; +#endif +#ifdef TIMER1_OVF_vect + prog_char gAvrInt_TIMER1_OVF[] PROGMEM = "TIMER1 OVF"; +#endif +#ifdef TIMER2_COMP_vect + prog_char gAvrInt_TIMER2_COMP[] PROGMEM = "TIMER2 COMP"; +#endif +#ifdef TIMER2_COMPA_vect + prog_char gAvrInt_TIMER2_COMPA[] PROGMEM = "TIMER2 COMPA"; +#endif +#ifdef TIMER2_COMPB_vect + prog_char gAvrInt_TIMER2_COMPB[] PROGMEM = "TIMER2 COMPB"; +#endif +#ifdef TIMER2_OVF_vect + prog_char gAvrInt_TIMER2_OVF[] PROGMEM = "TIMER2 OVF"; +#endif +#ifdef TIMER3_CAPT_vect + prog_char gAvrInt_TIMER3_CAPT[] PROGMEM = "TIMER3 CAPT"; +#endif +#ifdef TIMER3_COMPA_vect + prog_char gAvrInt_TIMER3_COMPA[] PROGMEM = "TIMER3 COMPA"; +#endif +#ifdef TIMER3_COMPB_vect + prog_char gAvrInt_TIMER3_COMPB[] PROGMEM = "TIMER3 COMPB"; +#endif +#ifdef TIMER3_COMPC_vect + prog_char gAvrInt_TIMER3_COMPC[] PROGMEM = "TIMER3 COMPC"; +#endif +#ifdef TIMER3_OVF_vect + prog_char gAvrInt_TIMER3_OVF[] PROGMEM = "TIMER3 OVF"; +#endif +#ifdef TIMER4_CAPT_vect + prog_char gAvrInt_TIMER4_CAPT[] PROGMEM = "TIMER4 CAPT"; +#endif +#ifdef TIMER4_COMPA_vect + prog_char gAvrInt_TIMER4_COMPA[] PROGMEM = "TIMER4 COMPA"; +#endif +#ifdef TIMER4_COMPB_vect + prog_char gAvrInt_TIMER4_COMPB[] PROGMEM = "TIMER4 COMPB"; +#endif +#ifdef TIMER4_COMPC_vect + prog_char gAvrInt_TIMER4_COMPC[] PROGMEM = "TIMER4 COMPC"; +#endif +#ifdef TIMER4_COMPD_vect + prog_char gAvrInt_TIMER4_COMPD[] PROGMEM = "TIMER4 COMPD"; +#endif +#ifdef TIMER4_OVF_vect + prog_char gAvrInt_TIMER4_OVF[] PROGMEM = "TIMER4 OVF"; +#endif +#ifdef TIMER4_FPF_vect + prog_char gAvrInt_TIMER4_FPF[] PROGMEM = "TIMER4 Fault Protection"; +#endif +#ifdef TIMER5_CAPT_vect + prog_char gAvrInt_TIMER5_CAPT[] PROGMEM = "TIMER5 CAPT"; +#endif +#ifdef TIMER5_COMPA_vect + prog_char gAvrInt_TIMER5_COMPA[] PROGMEM = "TIMER5 COMPA"; +#endif +#ifdef TIMER5_COMPB_vect + prog_char gAvrInt_TIMER5_COMPB[] PROGMEM = "TIMER5 COMPB"; +#endif +#ifdef TIMER5_COMPC_vect + prog_char gAvrInt_TIMER5_COMPC[] PROGMEM = "TIMER5 COMPC"; +#endif +#ifdef TIMER5_OVF_vect + prog_char gAvrInt_TIMER5_OVF[] PROGMEM = "TIMER5 OVF"; +#endif + +//* when there is only 1 usart +#if defined(USART_RX_vect) || defined(USART_RXC_vect) + prog_char gAvrInt_USART_RX[] PROGMEM = "USART RX"; +#endif +#if defined(USART_UDRE_vect) + prog_char gAvrInt_USART_UDRE[] PROGMEM = "USART UDRE"; +#endif +#if defined(USART_TX_vect) || defined(USART_TXC_vect) + prog_char gAvrInt_USART_TX[] PROGMEM = "USART TX"; +#endif + + +//* usart 0 +#if defined(USART0_RX_vect) + prog_char gAvrInt_USART0_RX[] PROGMEM = "USART0 RX"; +#endif +#if defined(USART0_UDRE_vect) + prog_char gAvrInt_USART0_UDRE[] PROGMEM = "USART0 UDRE"; +#endif +#if defined(USART0_TX_vect) + prog_char gAvrInt_USART0_TX[] PROGMEM = "USART0 TX"; +#endif + + +//* usart 1 +#ifdef USART1_RX_vect + prog_char gAvrInt_USART1_RX[] PROGMEM = "USART1 RX"; +#endif +#ifdef USART1_UDRE_vect + prog_char gAvrInt_USART1_UDRE[] PROGMEM = "USART1 UDRE"; +#endif +#ifdef USART1_TX_vect + prog_char gAvrInt_USART1_TX[] PROGMEM = "USART1 TX"; +#endif + +//* usart 2 +#ifdef USART2_RX_vect + prog_char gAvrInt_USART2_RX[] PROGMEM = "USART2 RX"; +#endif +#ifdef USART2_UDRE_vect + prog_char gAvrInt_USART2_UDRE[] PROGMEM = "USART2 UDRE"; +#endif +#ifdef USART2_TX_vect + prog_char gAvrInt_USART2_TX[] PROGMEM = "USART2 TX"; +#endif + +//* usart 3 +#ifdef USART3_RX_vect + prog_char gAvrInt_USART3_RX[] PROGMEM = "USART3 RX"; +#endif +#ifdef USART3_UDRE_vect + prog_char gAvrInt_USART3_UDRE[] PROGMEM = "USART3 UDRE"; +#endif +#ifdef USART3_TX_vect + prog_char gAvrInt_USART3_TX[] PROGMEM = "USART3 TX"; +#endif +#ifdef SPI_STC_vect + prog_char gAvrInt_SPI_STC[] PROGMEM = "SPI STC"; +#endif +#ifdef ADC_vect + prog_char gAvrInt_ADC[] PROGMEM = "ADC"; +#endif +#if defined(ANALOG_COMP_vect) || defined(ANA_COMP_vect) + prog_char gAvrInt_ANALOG_COMP[] PROGMEM = "ANALOG COMP"; +#endif +#if defined(EE_READY_vect) || defined(EE_RDY_vect) + prog_char gAvrInt_EE_READY[] PROGMEM = "EE READY"; +#endif +#ifdef TWI_vect + prog_char gAvrInt_TWI[] PROGMEM = "TWI"; +#endif +#if defined(SPM_READY_vect) || defined(SPM_RDY_vect) + prog_char gAvrInt_SPM_READY[] PROGMEM = "SPM READY"; +#endif +#ifdef USI_START_vect + prog_char gAvrInt_USI_START[] PROGMEM = "USI START"; +#endif +#ifdef USI_OVERFLOW_vect + prog_char gAvrInt_USI_OVERFLOW[] PROGMEM = "USI OVERFLOW"; +#endif +#ifdef USB_GEN_vect + prog_char gAvrInt_USB_General[] PROGMEM = "USB General"; +#endif +#ifdef USB_COM_vect + prog_char gAvrInt_USB_Endpoint[] PROGMEM = "USB Endpoint"; +#endif + +#ifdef LCD_vect + prog_char gAvrInt_LCD_StartFrame[] PROGMEM = "LCD Start of Frame"; +#endif + + +//************************************************************************************************** +//* these do not have vector defs and have to be done by CPU type +#if defined(__AVR_ATmega645__ ) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + prog_char gAvrInt_NOT_USED[] PROGMEM = "NOT_USED"; +#endif +#if defined(__AVR_ATmega32U4__) + prog_char gAvrInt_RESERVED[] PROGMEM = "Reserved"; +#endif + + prog_char gAvrInt_END[] PROGMEM = "*"; + + + + + +//************************************************************************************************** +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#pragma mark __AVR_ATmega168__ / __AVR_ATmega328P__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_PCINT0, // 4 + gAvrInt_PCINT1, // 5 + gAvrInt_PCINT2, // 6 + gAvrInt_WDT, // 7 + gAvrInt_TIMER2_COMPA, // 8 + gAvrInt_TIMER2_COMPB, // 9 + gAvrInt_TIMER2_OVF, // 10 + gAvrInt_TIMER1_CAPT, // 11 + gAvrInt_TIMER1_COMPA, // 12 + gAvrInt_TIMER1_COMPB, // 13 + gAvrInt_TIMER1_OVF, // 14 + gAvrInt_TIMER0_COMPA, // 15 + gAvrInt_TIMER0_COMPB, // 16 + gAvrInt_TIMER0_OVF, // 17 + gAvrInt_SPI_STC, // 18 + gAvrInt_USART_RX, // 19 + gAvrInt_USART_UDRE, // 20 + gAvrInt_USART_TX, // 21 + gAvrInt_ADC, // 22 + gAvrInt_EE_READY, // 23 + gAvrInt_ANALOG_COMP, // 24 + gAvrInt_TWI, // 25 + gAvrInt_SPM_READY, // 26 +}; + +#endif + +//************************************************************************************************** +#pragma mark __AVR_ATmega169__ +#if defined(__AVR_ATmega169__) + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_PCINT0, // 3 + gAvrInt_PCINT1, // 4 + gAvrInt_TIMER2_COMP, // 5 + gAvrInt_TIMER2_OVF, // 6 + gAvrInt_TIMER1_CAPT, // 7 + gAvrInt_TIMER1_COMPA, // 8 + gAvrInt_TIMER1_COMPB, // 9 + gAvrInt_TIMER1_OVF, // 10 + gAvrInt_TIMER0_COMP, // 11 + gAvrInt_TIMER0_OVF, // 12 + gAvrInt_SPI_STC, // 13 + gAvrInt_USART0_RX, // 14 + gAvrInt_USART0_UDRE, // 15 + gAvrInt_USART0_TX, // 16 + gAvrInt_USI_START, // 17 + gAvrInt_USI_OVERFLOW, // 18 + gAvrInt_ANALOG_COMP, // 19 + gAvrInt_ADC, // 20 + gAvrInt_EE_READY, // 21 + gAvrInt_SPM_READY, // 22 + gAvrInt_LCD_StartFrame, // 23 + +}; + +#endif + + +//************************************************************************************************** +#if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) +#pragma mark __AVR_ATmega640__ __AVR_ATmega1280__ __AVR_ATmega1281__ __AVR_ATmega2560__ __AVR_ATmega2561__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_INT3, // 5 + gAvrInt_INT4, // 6 + gAvrInt_INT5, // 7 + gAvrInt_INT6, // 8 + gAvrInt_INT7, // 9 + gAvrInt_PCINT0, // 10 + gAvrInt_PCINT1, // 11 +#if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + gAvrInt_PCINT2, // 12 +#else + gAvrInt_NOT_USED, // 12 +#endif + gAvrInt_WDT, // 13 + gAvrInt_TIMER2_COMPA, // 14 + gAvrInt_TIMER2_COMPB, // 15 + gAvrInt_TIMER2_OVF, // 16 + gAvrInt_TIMER1_CAPT, // 17 + gAvrInt_TIMER1_COMPA, // 18 + gAvrInt_TIMER1_COMPB, // 19 + gAvrInt_TIMER1_COMPC, // 20 + gAvrInt_TIMER1_OVF, // 21 + gAvrInt_TIMER0_COMPA, // 22 + gAvrInt_TIMER0_COMPB, // 23 + gAvrInt_TIMER0_OVF, // 24 + gAvrInt_SPI_STC, // 25 + + gAvrInt_USART0_RX, // 26 + gAvrInt_USART0_UDRE, // 27 + gAvrInt_USART0_TX, // 28 + gAvrInt_ANALOG_COMP, // 29 + gAvrInt_ADC, // 30 + gAvrInt_EE_READY, // 31 + + gAvrInt_TIMER3_CAPT, // 32 + gAvrInt_TIMER3_COMPA, // 33 + gAvrInt_TIMER3_COMPB, // 34 + gAvrInt_TIMER3_COMPC, // 35 + gAvrInt_TIMER3_OVF, // 36 + + gAvrInt_USART1_RX, // 37 + gAvrInt_USART1_UDRE, // 38 + gAvrInt_USART1_TX, // 39 + gAvrInt_TWI, // 40 + gAvrInt_SPM_READY, // 41 +#if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + gAvrInt_TIMER4_CAPT, // 42 +#else + gAvrInt_NOT_USED, // 42 +#endif + gAvrInt_TIMER4_COMPA, // 43 + gAvrInt_TIMER4_COMPB, // 44 + gAvrInt_TIMER4_COMPC, // 45 + gAvrInt_TIMER4_OVF, // 46 +#if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + gAvrInt_TIMER5_CAPT, // 47 +#else + gAvrInt_NOT_USED, // 47 +#endif + gAvrInt_TIMER5_COMPA, // 48 + gAvrInt_TIMER5_COMPB, // 49 + gAvrInt_TIMER5_COMPC, // 50 + gAvrInt_TIMER5_OVF, // 51 + +#if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + gAvrInt_USART2_RX, // 52 + gAvrInt_USART2_UDRE, // 53 + gAvrInt_USART2_TX, // 54 + + gAvrInt_USART3_RX, // 55 + gAvrInt_USART3_UDRE, // 56 + gAvrInt_USART3_TX, // 57 +#endif + +}; + +#endif + + + +//************************************************************************************************** +#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) +#pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ __AVR_ATmega1284P__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_PCINT0, // 5 + gAvrInt_PCINT1, // 6 + gAvrInt_PCINT2, // 7 + gAvrInt_PCINT3, // 8 + gAvrInt_WDT, // 9 + gAvrInt_TIMER2_COMPA, // 10 + gAvrInt_TIMER2_COMPB, // 11 + gAvrInt_TIMER2_OVF, // 12 + gAvrInt_TIMER1_CAPT, // 13 + gAvrInt_TIMER1_COMPA, // 14 + gAvrInt_TIMER1_COMPB, // 15 + gAvrInt_TIMER1_OVF, // 16 + gAvrInt_TIMER0_COMPA, // 17 + gAvrInt_TIMER0_COMPB, // 18 + gAvrInt_TIMER0_OVF, // 19 + gAvrInt_SPI_STC, // 20 + gAvrInt_USART0_RX, // 21 + gAvrInt_USART0_UDRE, // 22 + gAvrInt_USART0_TX, // 23 + gAvrInt_ANALOG_COMP, // 24 + gAvrInt_ADC, // 25 + gAvrInt_EE_READY, // 26 + gAvrInt_TWI, // 27 + gAvrInt_SPM_READY, // 28 + +#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644P__) + gAvrInt_USART1_RX, // 29 + gAvrInt_USART1_UDRE, // 30 + gAvrInt_USART1_TX, // 31 +#endif + +}; + + +#endif + +//************************************************************************************************** +#if defined(__AVR_ATmega645__ ) +#pragma mark __AVR_ATmega645__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_PCINT0, // 3 + gAvrInt_PCINT1, // 4 + gAvrInt_TIMER2_COMP, // 5 + gAvrInt_TIMER2_OVF, // 6 + gAvrInt_TIMER1_CAPT, // 7 + gAvrInt_TIMER1_COMPA, // 8 + gAvrInt_TIMER1_COMPB, // 9 + gAvrInt_TIMER1_OVF, // 10 + gAvrInt_TIMER0_COMP, // 11 + gAvrInt_TIMER0_OVF, // 12 + gAvrInt_SPI_STC, // 13 + gAvrInt_USART0_RX, // 14 + gAvrInt_USART0_UDRE, // 15 + gAvrInt_USART0_TX, // 16 + gAvrInt_USI_START, // 17 + gAvrInt_USI_OVERFLOW, // 18 + gAvrInt_ANALOG_COMP, // 19 + gAvrInt_ADC, // 20 + gAvrInt_EE_READY, // 21 + gAvrInt_SPM_READY, // 22 + gAvrInt_NOT_USED, // 23 + +#if defined(__AVR_ATmega3250__) || defined(__AVR_ATmega6450__) + gAvrInt_PCINT2, // 24 + gAvrInt_PCINT3, // 25 +#endif +}; + + +#endif + + +//************************************************************************************************** +#if defined(__AVR_ATmega32__ ) +#pragma mark __AVR_ATmega32__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_TIMER2_COMP, // 5 + gAvrInt_TIMER2_OVF, // 6 + gAvrInt_TIMER1_CAPT, // 7 + gAvrInt_TIMER1_COMPA, // 8 + gAvrInt_TIMER1_COMPB, // 9 + gAvrInt_TIMER1_OVF, // 10 + gAvrInt_TIMER0_COMP, // 11 + gAvrInt_TIMER0_OVF, // 12 + gAvrInt_SPI_STC, // 13 + gAvrInt_USART_RX, // 14 + gAvrInt_USART_UDRE, // 15 + gAvrInt_USART_TX, // 16 + gAvrInt_ADC, // 17 + gAvrInt_EE_READY, // 18 + gAvrInt_ANALOG_COMP, // 19 + gAvrInt_TWI, // 20 + gAvrInt_SPM_READY, // 21 + +}; + + +#endif + +//************************************************************************************************** +#if defined(__AVR_ATmega32U4__) +#pragma mark __AVR_ATmega32U4__ +//* teensy 2.0 +//* http://www.pjrc.com/teensy/pinout.html +#define _INTERRUPT_NAMES_DEFINED_ + + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_INT3, // 5 + gAvrInt_RESERVED, // 6 + gAvrInt_RESERVED, // 7 + gAvrInt_INT6, // 8 + gAvrInt_RESERVED, // 9 + gAvrInt_PCINT0, // 10 + gAvrInt_USB_General, // 11 + gAvrInt_USB_Endpoint, // 12 + gAvrInt_WDT, // 13 + gAvrInt_RESERVED, // 14 + gAvrInt_RESERVED, // 15 + gAvrInt_RESERVED, // 16 + gAvrInt_TIMER1_CAPT, // 17 + gAvrInt_TIMER1_COMPA, // 18 + gAvrInt_TIMER1_COMPB, // 19 + gAvrInt_TIMER1_COMPC, // 20 + gAvrInt_TIMER1_OVF, // 21 + gAvrInt_TIMER0_COMPA, // 22 + gAvrInt_TIMER0_COMPB, // 23 + gAvrInt_TIMER0_OVF, // 24 + gAvrInt_SPI_STC, // 25 + + gAvrInt_USART1_RX, // 26 + gAvrInt_USART1_UDRE, // 27 + gAvrInt_USART1_TX, // 28 + gAvrInt_ANALOG_COMP, // 29 + + gAvrInt_ADC, // 30 + gAvrInt_EE_READY, // 31 + + gAvrInt_TIMER3_CAPT, // 32 + gAvrInt_TIMER3_COMPA, // 33 + gAvrInt_TIMER3_COMPB, // 34 + gAvrInt_TIMER3_COMPC, // 35 + gAvrInt_TIMER3_OVF, // 36 + gAvrInt_TWI, // 37 + gAvrInt_SPM_READY, // 38 + + gAvrInt_TIMER4_COMPA, // 39 + gAvrInt_TIMER4_COMPB, // 40 + gAvrInt_TIMER4_COMPD, // 41 + gAvrInt_TIMER4_OVF, // 42 + gAvrInt_TIMER4_FPF, // 43 +}; + +#endif + +//************************************************************************************************** +#if defined(__AVR_AT90USB1286__) +#pragma mark __AVR_AT90USB1286__ +//* teensy++ 2.0 +//* http://www.pjrc.com/teensy/pinout.html +#define _INTERRUPT_NAMES_DEFINED_ + + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_INT3, // 5 + gAvrInt_INT4, // 6 + gAvrInt_INT5, // 7 + gAvrInt_INT6, // 8 + gAvrInt_INT7, // 9 + gAvrInt_PCINT0, // 10 + gAvrInt_USB_General, // 11 + gAvrInt_USB_Endpoint, // 12 + gAvrInt_WDT, // 13 + gAvrInt_TIMER2_COMPA, // 14 + gAvrInt_TIMER2_COMPB, // 15 + gAvrInt_TIMER2_OVF, // 16 + gAvrInt_TIMER1_CAPT, // 17 + gAvrInt_TIMER1_COMPA, // 18 + gAvrInt_TIMER1_COMPB, // 19 + gAvrInt_TIMER1_COMPC, // 20 + gAvrInt_TIMER1_OVF, // 21 + gAvrInt_TIMER0_COMPA, // 22 + gAvrInt_TIMER0_COMPB, // 23 + gAvrInt_TIMER0_OVF, // 24 + gAvrInt_SPI_STC, // 25 + + gAvrInt_USART1_RX, // 26 + gAvrInt_USART1_UDRE, // 27 + gAvrInt_USART1_TX, // 28 + gAvrInt_ANALOG_COMP, // 29 + + gAvrInt_ADC, // 30 + gAvrInt_EE_READY, // 31 + + gAvrInt_TIMER3_CAPT, // 32 + gAvrInt_TIMER3_COMPA, // 33 + gAvrInt_TIMER3_COMPB, // 34 + gAvrInt_TIMER3_COMPC, // 35 + gAvrInt_TIMER3_OVF, // 36 + gAvrInt_TWI, // 37 + gAvrInt_SPM_READY, // 38 + +}; + +#endif + + + + +//************************************************************************************************** +#if defined(__AVR_ATmega128__) +#pragma mark __AVR_ATmega128__ +#define _INTERRUPT_NAMES_DEFINED_ + + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_INT3, // 5 + gAvrInt_INT4, // 6 + gAvrInt_INT5, // 7 + gAvrInt_INT6, // 8 + gAvrInt_INT7, // 9 + gAvrInt_TIMER2_COMP, // 10 + gAvrInt_TIMER2_OVF, // 11 + gAvrInt_TIMER1_CAPT, // 12 + gAvrInt_TIMER1_COMPA, // 13 + gAvrInt_TIMER1_COMPB, // 14 + gAvrInt_TIMER1_OVF, // 15 + gAvrInt_TIMER0_COMP, // 16 + gAvrInt_TIMER0_OVF, // 17 + gAvrInt_SPI_STC, // 18 + gAvrInt_USART0_RX, // 19 + gAvrInt_USART0_UDRE, // 20 + gAvrInt_USART0_TX, // 21 + gAvrInt_ADC, // 22 + gAvrInt_EE_READY, // 23 + gAvrInt_ANALOG_COMP, // 24 + gAvrInt_TIMER1_COMPC, // 25 + gAvrInt_TIMER3_CAPT, // 26 + gAvrInt_TIMER3_COMPA, // 27 + gAvrInt_TIMER3_COMPB, // 28 + gAvrInt_TIMER3_COMPC, // 29 + gAvrInt_TIMER3_OVF, // 30 + gAvrInt_USART1_RX, // 31 + gAvrInt_USART1_UDRE, // 32 + gAvrInt_USART1_TX, // 33 + gAvrInt_TWI, // 34 + gAvrInt_SPM_READY, // 35 + +}; + +#endif + +#if !defined(_INTERRUPT_NAMES_DEFINED_) + #warning No interrupt string defs for this cpu +#endif \ No newline at end of file diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/command.h b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/command.h new file mode 100644 index 0000000..03b1b38 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/command.h @@ -0,0 +1,114 @@ +//**** ATMEL AVR - A P P L I C A T I O N N O T E ************************ +//* +//* Title: AVR068 - STK500 Communication Protocol +//* Filename: command.h +//* Version: 1.0 +//* Last updated: 31.01.2005 +//* +//* Support E-mail: avr@atmel.com +//* +//************************************************************************** + +// *****************[ STK message constants ]*************************** + +#define MESSAGE_START 0x1B //= ESC = 27 decimal +#define TOKEN 0x0E + +// *****************[ STK general command constants ]************************** + +#define CMD_SIGN_ON 0x01 +#define CMD_SET_PARAMETER 0x02 +#define CMD_GET_PARAMETER 0x03 +#define CMD_SET_DEVICE_PARAMETERS 0x04 +#define CMD_OSCCAL 0x05 +#define CMD_LOAD_ADDRESS 0x06 +#define CMD_FIRMWARE_UPGRADE 0x07 + + +// *****************[ STK ISP command constants ]****************************** + +#define CMD_ENTER_PROGMODE_ISP 0x10 +#define CMD_LEAVE_PROGMODE_ISP 0x11 +#define CMD_CHIP_ERASE_ISP 0x12 +#define CMD_PROGRAM_FLASH_ISP 0x13 +#define CMD_READ_FLASH_ISP 0x14 +#define CMD_PROGRAM_EEPROM_ISP 0x15 +#define CMD_READ_EEPROM_ISP 0x16 +#define CMD_PROGRAM_FUSE_ISP 0x17 +#define CMD_READ_FUSE_ISP 0x18 +#define CMD_PROGRAM_LOCK_ISP 0x19 +#define CMD_READ_LOCK_ISP 0x1A +#define CMD_READ_SIGNATURE_ISP 0x1B +#define CMD_READ_OSCCAL_ISP 0x1C +#define CMD_SPI_MULTI 0x1D + +// *****************[ STK PP command constants ]******************************* + +#define CMD_ENTER_PROGMODE_PP 0x20 +#define CMD_LEAVE_PROGMODE_PP 0x21 +#define CMD_CHIP_ERASE_PP 0x22 +#define CMD_PROGRAM_FLASH_PP 0x23 +#define CMD_READ_FLASH_PP 0x24 +#define CMD_PROGRAM_EEPROM_PP 0x25 +#define CMD_READ_EEPROM_PP 0x26 +#define CMD_PROGRAM_FUSE_PP 0x27 +#define CMD_READ_FUSE_PP 0x28 +#define CMD_PROGRAM_LOCK_PP 0x29 +#define CMD_READ_LOCK_PP 0x2A +#define CMD_READ_SIGNATURE_PP 0x2B +#define CMD_READ_OSCCAL_PP 0x2C + +#define CMD_SET_CONTROL_STACK 0x2D + +// *****************[ STK HVSP command constants ]***************************** + +#define CMD_ENTER_PROGMODE_HVSP 0x30 +#define CMD_LEAVE_PROGMODE_HVSP 0x31 +#define CMD_CHIP_ERASE_HVSP 0x32 +#define CMD_PROGRAM_FLASH_HVSP ` 0x33 +#define CMD_READ_FLASH_HVSP 0x34 +#define CMD_PROGRAM_EEPROM_HVSP 0x35 +#define CMD_READ_EEPROM_HVSP 0x36 +#define CMD_PROGRAM_FUSE_HVSP 0x37 +#define CMD_READ_FUSE_HVSP 0x38 +#define CMD_PROGRAM_LOCK_HVSP 0x39 +#define CMD_READ_LOCK_HVSP 0x3A +#define CMD_READ_SIGNATURE_HVSP 0x3B +#define CMD_READ_OSCCAL_HVSP 0x3C + +// *****************[ STK status constants ]*************************** + +// Success +#define STATUS_CMD_OK 0x00 + +// Warnings +#define STATUS_CMD_TOUT 0x80 +#define STATUS_RDY_BSY_TOUT 0x81 +#define STATUS_SET_PARAM_MISSING 0x82 + +// Errors +#define STATUS_CMD_FAILED 0xC0 +#define STATUS_CKSUM_ERROR 0xC1 +#define STATUS_CMD_UNKNOWN 0xC9 + +// *****************[ STK parameter constants ]*************************** +#define PARAM_BUILD_NUMBER_LOW 0x80 +#define PARAM_BUILD_NUMBER_HIGH 0x81 +#define PARAM_HW_VER 0x90 +#define PARAM_SW_MAJOR 0x91 +#define PARAM_SW_MINOR 0x92 +#define PARAM_VTARGET 0x94 +#define PARAM_VADJUST 0x95 +#define PARAM_OSC_PSCALE 0x96 +#define PARAM_OSC_CMATCH 0x97 +#define PARAM_SCK_DURATION 0x98 +#define PARAM_TOPCARD_DETECT 0x9A +#define PARAM_STATUS 0x9C +#define PARAM_DATA 0x9D +#define PARAM_RESET_POLARITY 0x9E +#define PARAM_CONTROLLER_INIT 0x9F + +// *****************[ STK answer constants ]*************************** + +#define ANSWER_CKSUM_ERROR 0xB0 + diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.c b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.c new file mode 100644 index 0000000..13dec89 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.c @@ -0,0 +1,1996 @@ +/***************************************************************************** +Title: STK500v2 compatible bootloader + Modified for Wiring board ATMega128-16MHz +Author: Peter Fleury http://jump.to/fleury +File: $Id: stk500boot.c,v 1.11 2006/06/25 12:39:17 peter Exp $ +Compiler: avr-gcc 3.4.5 or 4.1 / avr-libc 1.4.3 +Hardware: All AVRs with bootloader support, tested with ATmega8 +License: GNU General Public License + +Modified: Worapoht Kornkaewwattanakul http://www.avride.com +Date: 17 October 2007 +Update: 1st, 29 Dec 2007 : Enable CMD_SPI_MULTI but ignore unused command by return 0x00 byte response.. +Compiler: WINAVR20060421 +Description: add timeout feature like previous Wiring bootloader + +DESCRIPTION: + This program allows an AVR with bootloader capabilities to + read/write its own Flash/EEprom. To enter Programming mode + an input pin is checked. If this pin is pulled low, programming mode + is entered. If not, normal execution is done from $0000 + "reset" vector in Application area. + Size fits into a 1024 word bootloader section + when compiled with avr-gcc 4.1 + (direct replace on Wiring Board without fuse setting changed) + +USAGE: + - Set AVR MCU type and clock-frequency (F_CPU) in the Makefile. + - Set baud rate below (AVRISP only works with 115200 bps) + - compile/link the bootloader with the supplied Makefile + - program the "Boot Flash section size" (BOOTSZ fuses), + for boot-size 1024 words: program BOOTSZ01 + - enable the BOOT Reset Vector (program BOOTRST) + - Upload the hex file to the AVR using any ISP programmer + - Program Boot Lock Mode 3 (program BootLock 11 and BootLock 12 lock bits) // (leave them) + - Reset your AVR while keeping PROG_PIN pulled low // (for enter bootloader by switch) + - Start AVRISP Programmer (AVRStudio/Tools/Program AVR) + - AVRISP will detect the bootloader + - Program your application FLASH file and optional EEPROM file using AVRISP + +Note: + Erasing the device without flashing, through AVRISP GUI button "Erase Device" + is not implemented, due to AVRStudio limitations. + Flash is always erased before programming. + + AVRdude: + Please uncomment #define REMOVE_CMD_SPI_MULTI when using AVRdude. + Comment #define REMOVE_PROGRAM_LOCK_BIT_SUPPORT to reduce code size + Read Fuse Bits and Read/Write Lock Bits is not supported + +NOTES: + Based on Atmel Application Note AVR109 - Self-programming + Based on Atmel Application Note AVR068 - STK500v2 Protocol + +LICENSE: + Copyright (C) 2006 Peter Fleury + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +*****************************************************************************/ + +//************************************************************************ +//* Edit History +//************************************************************************ +//* Jul 7, 2010 = Mark Sproul msproul@skycharoit.com +//* Jul 7, 2010 Working on mega2560. No Auto-restart +//* Jul 7, 2010 Switched to 8K bytes (4K words) so that we have room for the monitor +//* Jul 8, 2010 Found older version of source that had auto restart, put that code back in +//* Jul 8, 2010 Adding monitor code +//* Jul 11, 2010 Added blinking LED while waiting for download to start +//* Jul 11, 2010 Added EEPROM test +//* Jul 29, 2010 Added recchar_timeout for timing out on bootloading +//* Aug 23, 2010 Added support for atmega2561 +//* Aug 26, 2010 Removed support for BOOT_BY_SWITCH +//************************************************************************ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "command.h" + + +#if defined(_MEGA_BOARD_) || defined(_BOARD_AMBER128_) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) + #define ENABLE_MONITOR + static void RunMonitor(void); +#endif + +//#define _DEBUG_SERIAL_ +//#define _DEBUG_WITH_LEDS_ + + +/* + * Uncomment the following lines to save code space + */ +//#define REMOVE_PROGRAM_LOCK_BIT_SUPPORT // disable program lock bits +//#define REMOVE_BOOTLOADER_LED // no LED to show active bootloader +//#define REMOVE_CMD_SPI_MULTI // disable processing of SPI_MULTI commands, Remark this line for AVRDUDE +// + + + +//************************************************************************ +//* LED on pin "PROGLED_PIN" on port "PROGLED_PORT" +//* indicates that bootloader is active +//* PG2 -> LED on Wiring board +//************************************************************************ +#define BLINK_LED_WHILE_WAITING + +#ifdef _MEGA_BOARD_ + #define PROGLED_PORT PORTB + #define PROGLED_DDR DDRB + #define PROGLED_PIN PINB7 +#elif defined( _BOARD_AMBER128_ ) + //* this is for the amber 128 http://www.soc-robotics.com/ + //* onbarod led is PORTE4 + #define PROGLED_PORT PORTD + #define PROGLED_DDR DDRD + #define PROGLED_PIN PINE7 +#elif defined( _CEREBOTPLUS_BOARD_ ) + //* this is for the Cerebot 2560 board + //* onbarod leds are on PORTE4-7 + #define PROGLED_PORT PORTE + #define PROGLED_DDR DDRE + #define PROGLED_PIN PINE7 +#elif defined( _PENGUINO_ ) + //* this is for the Penguino + //* onbarod led is PORTE4 + #define PROGLED_PORT PORTC + #define PROGLED_DDR DDRC + #define PROGLED_PIN PINC6 +#elif defined( _ANDROID_2561_ ) || defined( __AVR_ATmega2561__ ) + //* this is for the Boston Android 2561 + //* onbarod led is PORTE4 + #define PROGLED_PORT PORTA + #define PROGLED_DDR DDRA + #define PROGLED_PIN PINA3 +#else + #define PROGLED_PORT PORTG + #define PROGLED_DDR DDRG + #define PROGLED_PIN PING2 +#endif + + + +/* + * define CPU frequency in Mhz here if not defined in Makefile + */ +#ifndef F_CPU + #define F_CPU 16000000UL +#endif + +/* + * UART Baudrate, AVRStudio AVRISP only accepts 115200 bps + */ + +#ifndef BAUDRATE + #define BAUDRATE 115200 +#endif + +/* + * Enable (1) or disable (0) USART double speed operation + */ +#ifndef UART_BAUDRATE_DOUBLE_SPEED + #if defined (__AVR_ATmega32__) + #define UART_BAUDRATE_DOUBLE_SPEED 0 + #else + #define UART_BAUDRATE_DOUBLE_SPEED 1 + #endif +#endif + +/* + * HW and SW version, reported to AVRISP, must match version of AVRStudio + */ +#define CONFIG_PARAM_BUILD_NUMBER_LOW 0 +#define CONFIG_PARAM_BUILD_NUMBER_HIGH 0 +#define CONFIG_PARAM_HW_VER 0x0F +#define CONFIG_PARAM_SW_MAJOR 2 +#define CONFIG_PARAM_SW_MINOR 0x0A + +/* + * Calculate the address where the bootloader starts from FLASHEND and BOOTSIZE + * (adjust BOOTSIZE below and BOOTLOADER_ADDRESS in Makefile if you want to change the size of the bootloader) + */ +//#define BOOTSIZE 1024 +#if FLASHEND > 0x0F000 + #define BOOTSIZE 8192 +#else + #define BOOTSIZE 2048 +#endif + +#define APP_END (FLASHEND -(2*BOOTSIZE) + 1) + +/* + * Signature bytes are not available in avr-gcc io_xxx.h + */ +#if defined (__AVR_ATmega8__) + #define SIGNATURE_BYTES 0x1E9307 +#elif defined (__AVR_ATmega16__) + #define SIGNATURE_BYTES 0x1E9403 +#elif defined (__AVR_ATmega32__) + #define SIGNATURE_BYTES 0x1E9502 +#elif defined (__AVR_ATmega8515__) + #define SIGNATURE_BYTES 0x1E9306 +#elif defined (__AVR_ATmega8535__) + #define SIGNATURE_BYTES 0x1E9308 +#elif defined (__AVR_ATmega162__) + #define SIGNATURE_BYTES 0x1E9404 +#elif defined (__AVR_ATmega128__) + #define SIGNATURE_BYTES 0x1E9702 +#elif defined (__AVR_ATmega1280__) + #define SIGNATURE_BYTES 0x1E9703 +#elif defined (__AVR_ATmega2560__) + #define SIGNATURE_BYTES 0x1E9801 +#elif defined (__AVR_ATmega2561__) + #define SIGNATURE_BYTES 0x1e9802 +#else + #error "no signature definition for MCU available" +#endif + + +#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ + || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) + /* ATMega8 with one USART */ + #define UART_BAUD_RATE_LOW UBRRL + #define UART_STATUS_REG UCSRA + #define UART_CONTROL_REG UCSRB + #define UART_ENABLE_TRANSMITTER TXEN + #define UART_ENABLE_RECEIVER RXEN + #define UART_TRANSMIT_COMPLETE TXC + #define UART_RECEIVE_COMPLETE RXC + #define UART_DATA_REG UDR + #define UART_DOUBLE_SPEED U2X + +#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega162__) \ + || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) + /* ATMega with two USART, use UART0 */ + #define UART_BAUD_RATE_LOW UBRR0L + #define UART_STATUS_REG UCSR0A + #define UART_CONTROL_REG UCSR0B + #define UART_ENABLE_TRANSMITTER TXEN0 + #define UART_ENABLE_RECEIVER RXEN0 + #define UART_TRANSMIT_COMPLETE TXC0 + #define UART_RECEIVE_COMPLETE RXC0 + #define UART_DATA_REG UDR0 + #define UART_DOUBLE_SPEED U2X0 +#else + #error "no UART definition for MCU available" +#endif + + + +/* + * Macro to calculate UBBR from XTAL and baudrate + */ +#if defined(__AVR_ATmega32__) && UART_BAUDRATE_DOUBLE_SPEED + #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu / 4 / baudRate - 1) / 2) +#elif defined(__AVR_ATmega32__) + #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu / 8 / baudRate - 1) / 2) +#elif UART_BAUDRATE_DOUBLE_SPEED + #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5) +#else + #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*16.0)-1.0+0.5) +#endif + + +/* + * States used in the receive state machine + */ +#define ST_START 0 +#define ST_GET_SEQ_NUM 1 +#define ST_MSG_SIZE_1 2 +#define ST_MSG_SIZE_2 3 +#define ST_GET_TOKEN 4 +#define ST_GET_DATA 5 +#define ST_GET_CHECK 6 +#define ST_PROCESS 7 + +/* + * use 16bit address variable for ATmegas with <= 64K flash + */ +#if defined(RAMPZ) + typedef uint32_t address_t; +#else + typedef uint16_t address_t; +#endif + +/* + * function prototypes + */ +static void sendchar(char c); +static unsigned char recchar(void); + +/* + * since this bootloader is not linked against the avr-gcc crt1 functions, + * to reduce the code size, we need to provide our own initialization + */ +void __jumpMain (void) __attribute__ ((naked)) __attribute__ ((section (".init9"))); +#include + +//#define SPH_REG 0x3E +//#define SPL_REG 0x3D + +//***************************************************************************** +void __jumpMain(void) +{ +//* July 17, 2010 Added stack pointer initialzation +//* the first line did not do the job on the ATmega128 + + asm volatile ( ".set __stack, %0" :: "i" (RAMEND) ); + +// ldi r16,high(RAMEND) +// out SPH,r16 ; Set stack pointer to top of RAM + +// asm volatile ( "ldi 16, 0x10"); + asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); +// asm volatile ( "out 0x3E,16"); +// asm volatile ( "out %0,16" :: "i" (SPH_REG) ); + asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); + +// asm volatile ( "ldi 16, 0x00"); + asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); +// asm volatile ( "out 0x3d,16"); +// asm volatile ( "out %0,16" :: "i" (SPL_REG) ); + asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); + + + + asm volatile ( "clr __zero_reg__" ); // GCC depends on register r1 set to 0 + asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) ); // set SREG to 0 +// asm volatile ( "rjmp main"); // jump to main() + asm volatile ( "jmp main"); // jump to main() +} + + +//***************************************************************************** +void delay_ms(unsigned int timedelay) +{ + unsigned int i; + for (i=0;i> 1) +//***************************************************************************** +static unsigned char recchar_timeout(void) +{ +uint32_t count = 0; + + while (!(UART_STATUS_REG & (1 << UART_RECEIVE_COMPLETE))) + { + // wait for data + count++; + if (count > MAX_TIME_COUNT) + { + unsigned int data; + #if (FLASHEND > 0x0FFFF) + data = pgm_read_word_far(0); //* get the first word of the user program + #else + data = pgm_read_word_near(0); //* get the first word of the user program + #endif + if (data != 0xffff) //* make sure its valid before jumping to it. + { + asm volatile( + "clr r30 \n\t" + "clr r31 \n\t" + "ijmp \n\t" + ); + } + count = 0; + } + } + return UART_DATA_REG; +} + + + +//***************************************************************************** +int main(void) +{ + address_t address = 0; + address_t eraseAddress = 0; + unsigned char msgParseState; + unsigned int ii = 0; + unsigned char checksum = 0; + unsigned char seqNum = 0; + unsigned int msgLength = 0; + unsigned char msgBuffer[285]; + unsigned char c, *p; + unsigned char isLeave = 0; + + unsigned long boot_timeout; + unsigned long boot_timer; + unsigned int boot_state; +#ifdef ENABLE_MONITOR + unsigned int exPointCntr = 0; +#endif + + + boot_timer = 0; + boot_state = 0; + +#ifdef BLINK_LED_WHILE_WAITING + boot_timeout = 20000; //* should be about 1 second +// boot_timeout = 170000; +#else + boot_timeout = 3500000; // 7 seconds , approx 2us per step when optimize "s" +#endif + /* + * Branch to bootloader or application code ? + */ + +#ifndef REMOVE_BOOTLOADER_LED + /* PROG_PIN pulled low, indicate with LED that bootloader is active */ + PROGLED_DDR |= (1< boot_timeout) + { + boot_state = 1; // (after ++ -> boot_state=2 bootloader timeout, jump to main 0x00000 ) + } + #ifdef BLINK_LED_WHILE_WAITING + if ((boot_timer % 7000) == 0) + { + //* toggle the LED + PROGLED_PORT ^= (1<>16) & 0x000000FF; + else if ( signatureIndex == 1 ) + answerByte = (SIGNATURE_BYTES >> 8) & 0x000000FF; + else + answerByte = SIGNATURE_BYTES & 0x000000FF; + } + else if ( msgBuffer[4] & 0x50 ) + { + answerByte = 0; //read fuse/lock bits not implemented, return dummy value + } + else + { + answerByte = 0; // for all others command are not implemented, return dummy value for AVRDUDE happy + // flag = 1; // Remark this line for AVRDUDE + } + if ( !flag ) + { + msgLength = 7; + msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[2] = 0; + msgBuffer[3] = msgBuffer[4]; + msgBuffer[4] = 0; + msgBuffer[5] = answerByte; + msgBuffer[6] = STATUS_CMD_OK; + } + } + break; + #endif + case CMD_SIGN_ON: + msgLength = 11; + msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[2] = 8; + msgBuffer[3] = 'A'; + msgBuffer[4] = 'V'; + msgBuffer[5] = 'R'; + msgBuffer[6] = 'I'; + msgBuffer[7] = 'S'; + msgBuffer[8] = 'P'; + msgBuffer[9] = '_'; + msgBuffer[10] = '2'; + break; + + case CMD_GET_PARAMETER: + { + unsigned char value; + + switch(msgBuffer[1]) + { + case PARAM_BUILD_NUMBER_LOW: + value = CONFIG_PARAM_BUILD_NUMBER_LOW; + break; + case PARAM_BUILD_NUMBER_HIGH: + value = CONFIG_PARAM_BUILD_NUMBER_HIGH; + break; + case PARAM_HW_VER: + value = CONFIG_PARAM_HW_VER; + break; + case PARAM_SW_MAJOR: + value = CONFIG_PARAM_SW_MAJOR; + break; + case PARAM_SW_MINOR: + value = CONFIG_PARAM_SW_MINOR; + break; + default: + value = 0; + break; + } + msgLength = 3; + msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[2] = value; + } + break; + + case CMD_LEAVE_PROGMODE_ISP: + isLeave = 1; + //* fall thru + + case CMD_SET_PARAMETER: + case CMD_ENTER_PROGMODE_ISP: + msgLength = 2; + msgBuffer[1] = STATUS_CMD_OK; + break; + + case CMD_READ_SIGNATURE_ISP: + { + unsigned char signatureIndex = msgBuffer[4]; + unsigned char signature; + + if ( signatureIndex == 0 ) + signature = (SIGNATURE_BYTES >>16) & 0x000000FF; + else if ( signatureIndex == 1 ) + signature = (SIGNATURE_BYTES >> 8) & 0x000000FF; + else + signature = SIGNATURE_BYTES & 0x000000FF; + + msgLength = 4; + msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[2] = signature; + msgBuffer[3] = STATUS_CMD_OK; + } + break; + + case CMD_READ_LOCK_ISP: + msgLength = 4; + msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[2] = boot_lock_fuse_bits_get( GET_LOCK_BITS ); + msgBuffer[3] = STATUS_CMD_OK; + break; + + case CMD_READ_FUSE_ISP: + { + unsigned char fuseBits; + + if ( msgBuffer[2] == 0x50 ) + { + if ( msgBuffer[3] == 0x08 ) + fuseBits = boot_lock_fuse_bits_get( GET_EXTENDED_FUSE_BITS ); + else + fuseBits = boot_lock_fuse_bits_get( GET_LOW_FUSE_BITS ); + } + else + { + fuseBits = boot_lock_fuse_bits_get( GET_HIGH_FUSE_BITS ); + } + msgLength = 4; + msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[2] = fuseBits; + msgBuffer[3] = STATUS_CMD_OK; + } + break; + + #ifndef REMOVE_PROGRAM_LOCK_BIT_SUPPORT + case CMD_PROGRAM_LOCK_ISP: + { + unsigned char lockBits = msgBuffer[4]; + + lockBits = (~lockBits) & 0x3C; // mask BLBxx bits + boot_lock_bits_set(lockBits); // and program it + boot_spm_busy_wait(); + + msgLength = 3; + msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[2] = STATUS_CMD_OK; + } + break; + #endif + case CMD_CHIP_ERASE_ISP: + eraseAddress = 0; + msgLength = 2; + msgBuffer[1] = STATUS_CMD_OK; + break; + + case CMD_LOAD_ADDRESS: + #if defined(RAMPZ) + address = ( ((address_t)(msgBuffer[1])<<24)|((address_t)(msgBuffer[2])<<16)|((address_t)(msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; + #else + address = ( ((msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; //convert word to byte address + #endif + msgLength = 2; + msgBuffer[1] = STATUS_CMD_OK; + break; + + case CMD_PROGRAM_FLASH_ISP: + case CMD_PROGRAM_EEPROM_ISP: + { + unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; + unsigned char *p = msgBuffer+10; + unsigned int data; + unsigned char highByte, lowByte; + address_t tempaddress = address; + + + if ( msgBuffer[0] == CMD_PROGRAM_FLASH_ISP ) + { + // erase only main section (bootloader protection) + if (eraseAddress < APP_END ) + { + boot_page_erase(eraseAddress); // Perform page erase + boot_spm_busy_wait(); // Wait until the memory is erased. + eraseAddress += SPM_PAGESIZE; // point to next page to be erase + } + + /* Write FLASH */ + do { + lowByte = *p++; + highByte = *p++; + + data = (highByte << 8) | lowByte; + boot_page_fill(address,data); + + address = address + 2; // Select next word in memory + size -= 2; // Reduce number of bytes to write by two + } while (size); // Loop until all bytes written + + boot_page_write(tempaddress); + boot_spm_busy_wait(); + boot_rww_enable(); // Re-enable the RWW section + } + else + { + #if (!defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega2561__)) + /* write EEPROM */ + do { + EEARL = address; // Setup EEPROM address + EEARH = (address >> 8); + address++; // Select next EEPROM byte + + EEDR = *p++; // get byte from buffer + EECR |= (1<> 8); //MSB + address += 2; // Select next word in memory + size -= 2; + }while (size); + } + else + { + /* Read EEPROM */ + do { + EEARL = address; // Setup EEPROM address + EEARH = ((address >> 8)); + address++; // Select next EEPROM byte + EECR |= (1<>8)&0xFF); + sendchar(c); + checksum ^= c; + + c = msgLength&0x00FF; + sendchar(c); + checksum ^= c; + + sendchar(TOKEN); + checksum ^= TOKEN; + + p = msgBuffer; + while ( msgLength ) + { + c = *p++; + sendchar(c); + checksum ^=c; + msgLength--; + } + sendchar(checksum); + seqNum++; + + #ifndef REMOVE_BOOTLOADER_LED + //* toggle the LED + PROGLED_PORT ^= (1< + + +base address = f000 +avrdude: Device signature = 0x1e9703 +avrdude: safemode: lfuse reads as FF +avrdude: safemode: hfuse reads as D8 +avrdude: safemode: efuse reads as F5 +avrdude> +*/ + +//************************************************************************ +#ifdef ENABLE_MONITOR +#include + +unsigned long gRamIndex; +unsigned long gFlashIndex; +unsigned long gEepromIndex; + + +#define true 1 +#define false 0 + +#if defined(__AVR_ATmega128__) + #define kCPU_NAME "ATmega128" +#elif defined(__AVR_ATmega1280__) + #define kCPU_NAME "ATmega1280" +#elif defined(__AVR_ATmega1281__) + #define kCPU_NAME "ATmega1281" +#elif defined(__AVR_ATmega2560__) + #define kCPU_NAME "ATmega2560" +#elif defined(__AVR_ATmega2561__) + #define kCPU_NAME "ATmega2561" +#endif + +#ifdef _VECTORS_SIZE + #define kInterruptVectorCount (_VECTORS_SIZE / 4) +#else + #define kInterruptVectorCount 23 +#endif + + +void PrintDecInt(int theNumber, int digitCnt); + +#ifdef kCPU_NAME + prog_char gTextMsg_CPU_Name[] PROGMEM = kCPU_NAME; +#else + prog_char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN"; +#endif + + prog_char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS"; + prog_char gTextMsg_Prompt[] PROGMEM = "Bootloader>"; + prog_char gTextMsg_HUH[] PROGMEM = "Huh?"; + prog_char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = "; + prog_char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = "; + prog_char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__ = "; + prog_char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver = "; + prog_char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = "; + prog_char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU signature= "; + prog_char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = "; + prog_char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = "; + prog_char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = "; + prog_char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = "; + prog_char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__; + prog_char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__; + prog_char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__; + prog_char gTextMsg_VECTOR_HEADER[] PROGMEM = "V# ADDR op code instruction addr Interrupt"; + prog_char gTextMsg_noVector[] PROGMEM = "no vector"; + prog_char gTextMsg_rjmp[] PROGMEM = "rjmp "; + prog_char gTextMsg_jmp[] PROGMEM = "jmp "; + prog_char gTextMsg_WHAT_PORT[] PROGMEM = "What port:"; + prog_char gTextMsg_PortNotSupported[] PROGMEM = "Port not supported"; + prog_char gTextMsg_MustBeLetter[] PROGMEM = "Must be a letter"; + prog_char gTextMsg_SPACE[] PROGMEM = " "; + prog_char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE"; + prog_char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE"; + prog_char gTextMsg_EEPROMerrorCnt[] PROGMEM = "eeprom error count="; + prog_char gTextMsg_PORT[] PROGMEM = "PORT"; + + +//************************************************************************ +//* Help messages + prog_char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero address ctrs"; + prog_char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats"; + prog_char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test"; + prog_char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED"; + prog_char gTextMsg_HELP_MSG_E[] PROGMEM = "E=Dump EEPROM"; + prog_char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH"; + prog_char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help"; + prog_char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports"; + prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm"; + prog_char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM"; + prog_char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors"; + prog_char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink"; + + prog_char gTextMsg_END[] PROGMEM = "*"; + + +//************************************************************************ +void PrintFromPROGMEM(void *dataPtr, unsigned char offset) +{ +uint8_t ii; +char theChar; + + ii = offset; + theChar = 1; + + while (theChar != 0) + { + theChar = pgm_read_byte_far((uint32_t)dataPtr + ii); + if (theChar != 0) + { + sendchar(theChar); + } + ii++; + } +} + +//************************************************************************ +void PrintNewLine(void) +{ + sendchar(0x0d); + sendchar(0x0a); +} + + +//************************************************************************ +void PrintFromPROGMEMln(void *dataPtr, unsigned char offset) +{ + PrintFromPROGMEM(dataPtr, offset); + + PrintNewLine(); +} + + +//************************************************************************ +void PrintString(char *textString) +{ +char theChar; +int ii; + + theChar = 1; + ii = 0; + while (theChar != 0) + { + theChar = textString[ii]; + if (theChar != 0) + { + sendchar(theChar); + } + ii++; + } +} + +//************************************************************************ +void PrintHexByte(unsigned char theByte) +{ +char theChar; + + theChar = 0x30 + ((theByte >> 4) & 0x0f); + if (theChar > 0x39) + { + theChar += 7; + } + sendchar(theChar ); + + theChar = 0x30 + (theByte & 0x0f); + if (theChar > 0x39) + { + theChar += 7; + } + sendchar(theChar ); +} + +//************************************************************************ +void PrintDecInt(int theNumber, int digitCnt) +{ +int theChar; +int myNumber; + + myNumber = theNumber; + + if ((myNumber > 100) || (digitCnt >= 3)) + { + theChar = 0x30 + myNumber / 100; + sendchar(theChar ); + } + + if ((myNumber > 10) || (digitCnt >= 2)) + { + theChar = 0x30 + ((myNumber % 100) / 10 ); + sendchar(theChar ); + } + theChar = 0x30 + (myNumber % 10); + sendchar(theChar ); +} + + + + +//************************************************************************ +static void PrintCPUstats(void) +{ +unsigned char fuseByte; + + PrintFromPROGMEMln(gTextMsg_Explorer, 0); + + PrintFromPROGMEM(gTextMsg_COMPILED_ON, 0); + PrintFromPROGMEMln(gTextMsg_GCC_DATE_STR, 0); + + PrintFromPROGMEM(gTextMsg_CPU_Type, 0); + PrintFromPROGMEMln(gTextMsg_CPU_Name, 0); + + PrintFromPROGMEM(gTextMsg_AVR_ARCH, 0); + PrintDecInt(__AVR_ARCH__, 1); + PrintNewLine(); + + PrintFromPROGMEM(gTextMsg_GCC_VERSION, 0); + PrintFromPROGMEMln(gTextMsg_GCC_VERSION_STR, 0); + + //* these can be found in avr/version.h + PrintFromPROGMEM(gTextMsg_AVR_LIBC, 0); + PrintFromPROGMEMln(gTextMsg_AVR_LIBC_VER_STR, 0); + +#if defined(SIGNATURE_0) + PrintFromPROGMEM(gTextMsg_CPU_SIGNATURE, 0); + //* these can be found in avr/iomxxx.h + PrintHexByte(SIGNATURE_0); + PrintHexByte(SIGNATURE_1); + PrintHexByte(SIGNATURE_2); + PrintNewLine(); +#endif + + +#if defined(GET_LOW_FUSE_BITS) + //* fuse settings + PrintFromPROGMEM(gTextMsg_FUSE_BYTE_LOW, 0); + fuseByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); + PrintHexByte(fuseByte); + PrintNewLine(); + + PrintFromPROGMEM(gTextMsg_FUSE_BYTE_HIGH, 0); + fuseByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); + PrintHexByte(fuseByte); + PrintNewLine(); + + PrintFromPROGMEM(gTextMsg_FUSE_BYTE_EXT, 0); + fuseByte = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS); + PrintHexByte(fuseByte); + PrintNewLine(); + + PrintFromPROGMEM(gTextMsg_FUSE_BYTE_LOCK, 0); + fuseByte = boot_lock_fuse_bits_get(GET_LOCK_BITS); + PrintHexByte(fuseByte); + PrintNewLine(); + +#endif + +} + +#ifndef sbi + #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +//************************************************************************ +int analogRead(uint8_t pin) +{ +uint8_t low, high; + + // set the analog reference (high two bits of ADMUX) and select the + // channel (low 4 bits). this also sets ADLAR (left-adjust result) + // to 0 (the default). +// ADMUX = (analog_reference << 6) | (pin & 0x07); + ADMUX = (1 << 6) | (pin & 0x07); + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + // the MUX5 bit of ADCSRB selects whether we're reading from channels + // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). + ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); +#endif + + // without a delay, we seem to read from the wrong channel + //delay(1); + + // start the conversion + sbi(ADCSRA, ADSC); + + // ADSC is cleared when the conversion finishes + while (bit_is_set(ADCSRA, ADSC)); + + // we have to read ADCL first; doing so locks both ADCL + // and ADCH until ADCH is read. reading ADCL second would + // cause the results of each conversion to be discarded, + // as ADCL and ADCH would be locked when it completed. + low = ADCL; + high = ADCH; + + // combine the two bytes + return (high << 8) | low; +} + +//************************************************************************ +static void BlinkLED(void) +{ + PROGLED_DDR |= (1< 0) + { + if (myAddressPointer > 0x10000) + { + PrintHexByte((myAddressPointer >> 16) & 0x00ff); + } + PrintHexByte((myAddressPointer >> 8) & 0x00ff); + PrintHexByte(myAddressPointer & 0x00ff); + sendchar(0x20); + sendchar('-'); + sendchar(0x20); + + asciiDump[0] = 0; + for (ii=0; ii<16; ii++) + { + switch(dumpWhat) + { + case kDUMP_FLASH: + theValue = pgm_read_byte_far(myAddressPointer); + break; + + case kDUMP_EEPROM: + theValue = eeprom_read_byte((void *)myAddressPointer); + break; + + case kDUMP_RAM: + theValue = ramPtr[myAddressPointer]; + break; + + } + PrintHexByte(theValue); + sendchar(0x20); + if ((theValue >= 0x20) && (theValue < 0x7f)) + { + asciiDump[ii % 16] = theValue; + } + else + { + asciiDump[ii % 16] = '.'; + } + + myAddressPointer++; + } + asciiDump[16] = 0; + PrintString(asciiDump); + PrintNewLine(); + + numRows--; + } +} + + + +//************************************************************************ +//* returns amount of extended memory +static void EEPROMtest(void) +{ +int ii; +char theChar; +char theEEPROMchar; +int errorCount; + + PrintFromPROGMEMln(gTextMsg_WriteToEEprom, 0); + PrintNewLine(); + ii = 0; + while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) + { + eeprom_write_byte((uint8_t *)ii, theChar); + if (theChar == 0) + { + PrintFromPROGMEM(gTextMsg_SPACE, 0); + } + else + { + sendchar(theChar); + } + ii++; + } + + //* no go back through and test + PrintNewLine(); + PrintNewLine(); + PrintFromPROGMEMln(gTextMsg_ReadingEEprom, 0); + PrintNewLine(); + errorCount = 0; + ii = 0; + while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) + { + theEEPROMchar = eeprom_read_byte((uint8_t *)ii); + if (theEEPROMchar == 0) + { + PrintFromPROGMEM(gTextMsg_SPACE, 0); + } + else + { + sendchar(theEEPROMchar); + } + if (theEEPROMchar != theChar) + { + errorCount++; + } + ii++; + } + PrintNewLine(); + PrintNewLine(); + PrintFromPROGMEM(gTextMsg_EEPROMerrorCnt, 0); + PrintDecInt(errorCount, 1); + PrintNewLine(); + PrintNewLine(); + + gEepromIndex = 0; //* set index back to zero for next eeprom dump + +} + + + +#if (FLASHEND > 0x08000) + #include "avrinterruptnames.h" + #ifndef _INTERRUPT_NAMES_DEFINED_ + #warning Interrupt vectors not defined + #endif +#endif + +//************************************************************************ +static void VectorDisplay(void) +{ +unsigned long byte1; +unsigned long byte2; +unsigned long byte3; +unsigned long byte4; +unsigned long word1; +unsigned long word2; +int vectorIndex; +unsigned long myMemoryPtr; +unsigned long wordMemoryAddress; +unsigned long realitiveAddr; +unsigned long myFullAddress; +unsigned long absoluteAddr; +#if defined(_INTERRUPT_NAMES_DEFINED_) + long stringPointer; +#endif + + myMemoryPtr = 0; + vectorIndex = 0; + PrintFromPROGMEMln(gTextMsg_CPU_Name, 0); + PrintFromPROGMEMln(gTextMsg_VECTOR_HEADER, 0); + // V# ADDR op code + // 1 - 0000 = C3 BB 00 00 rjmp 03BB >000776 RESET + while (vectorIndex < kInterruptVectorCount) + { + wordMemoryAddress = myMemoryPtr / 2; + // 01 - 0000 = 12 34 + PrintDecInt(vectorIndex + 1, 2); + sendchar(0x20); + sendchar('-'); + sendchar(0x20); + PrintHexByte((wordMemoryAddress >> 8) & 0x00ff); + PrintHexByte((wordMemoryAddress) & 0x00ff); + sendchar(0x20); + sendchar('='); + sendchar(0x20); + + + //* the AVR is LITTLE ENDIAN, swap the byte order + byte1 = pgm_read_byte_far(myMemoryPtr++); + byte2 = pgm_read_byte_far(myMemoryPtr++); + word1 = (byte2 << 8) + byte1; + + byte3 = pgm_read_byte_far(myMemoryPtr++); + byte4 = pgm_read_byte_far(myMemoryPtr++); + word2 = (byte4 << 8) + byte3; + + + PrintHexByte(byte2); + sendchar(0x20); + PrintHexByte(byte1); + sendchar(0x20); + PrintHexByte(byte4); + sendchar(0x20); + PrintHexByte(byte3); + sendchar(0x20); + + if (word1 == 0xffff) + { + PrintFromPROGMEM(gTextMsg_noVector, 0); + } + else if ((word1 & 0xc000) == 0xc000) + { + //* rjmp instruction + realitiveAddr = word1 & 0x3FFF; + absoluteAddr = wordMemoryAddress + realitiveAddr; //* add the offset to the current address + absoluteAddr = absoluteAddr << 1; //* multiply by 2 for byte address + + PrintFromPROGMEM(gTextMsg_rjmp, 0); + PrintHexByte((realitiveAddr >> 8) & 0x00ff); + PrintHexByte((realitiveAddr) & 0x00ff); + sendchar(0x20); + sendchar('>'); + PrintHexByte((absoluteAddr >> 16) & 0x00ff); + PrintHexByte((absoluteAddr >> 8) & 0x00ff); + PrintHexByte((absoluteAddr) & 0x00ff); + + } + else if ((word1 & 0xfE0E) == 0x940c) + { + //* jmp instruction, this is REALLY complicated, refer to the instruction manual (JMP) + myFullAddress = ((byte1 & 0x01) << 16) + + ((byte1 & 0xf0) << 17) + + ((byte2 & 0x01) << 21) + + word2; + + absoluteAddr = myFullAddress << 1; + + PrintFromPROGMEM(gTextMsg_jmp, 0); + PrintHexByte((myFullAddress >> 16) & 0x00ff); + PrintHexByte((myFullAddress >> 8) & 0x00ff); + PrintHexByte((myFullAddress) & 0x00ff); + sendchar(0x20); + sendchar('>'); + PrintHexByte((absoluteAddr >> 16) & 0x00ff); + PrintHexByte((absoluteAddr >> 8) & 0x00ff); + PrintHexByte((absoluteAddr) & 0x00ff); + } + + #if defined(_INTERRUPT_NAMES_DEFINED_) + sendchar(0x20); + stringPointer = pgm_read_word_far(&(gInterruptNameTable[vectorIndex])); + PrintFromPROGMEM((char *)stringPointer, 0); + #endif + PrintNewLine(); + + vectorIndex++; + } +} + +//************************************************************************ +static void PrintAvailablePort(char thePortLetter) +{ + PrintFromPROGMEM(gTextMsg_PORT, 0); + sendchar(thePortLetter); + PrintNewLine(); +} + +//************************************************************************ +static void ListAvailablePorts(void) +{ + +#ifdef DDRA + PrintAvailablePort('A'); +#endif + +#ifdef DDRB + PrintAvailablePort('B'); +#endif + +#ifdef DDRC + PrintAvailablePort('C'); +#endif + +#ifdef DDRD + PrintAvailablePort('D'); +#endif + +#ifdef DDRE + PrintAvailablePort('E'); +#endif + +#ifdef DDRF + PrintAvailablePort('F'); +#endif + +#ifdef DDRG + PrintAvailablePort('G'); +#endif + +#ifdef DDRH + PrintAvailablePort('H'); +#endif + +#ifdef DDRI + PrintAvailablePort('I'); +#endif + +#ifdef DDRJ + PrintAvailablePort('J'); +#endif + +#ifdef DDRK + PrintAvailablePort('K'); +#endif + +#ifdef DDRL + PrintAvailablePort('L'); +#endif + +} + +//************************************************************************ +static void AVR_PortOutput(void) +{ +char portLetter; +char getCharFlag; + + PrintFromPROGMEM(gTextMsg_WHAT_PORT, 0); + + portLetter = recchar(); + portLetter = portLetter & 0x5f; + sendchar(portLetter); + PrintNewLine(); + + if ((portLetter >= 'A') && (portLetter <= 'Z')) + { + getCharFlag = true; + switch(portLetter) + { + #ifdef DDRA + case 'A': + DDRA = 0xff; + while (!Serial_Available()) + { + PORTA ^= 0xff; + delay_ms(200); + } + PORTA = 0; + break; + #endif + + #ifdef DDRB + case 'B': + DDRB = 0xff; + while (!Serial_Available()) + { + PORTB ^= 0xff; + delay_ms(200); + } + PORTB = 0; + break; + #endif + + #ifdef DDRC + case 'C': + DDRC = 0xff; + while (!Serial_Available()) + { + PORTC ^= 0xff; + delay_ms(200); + } + PORTC = 0; + break; + #endif + + #ifdef DDRD + case 'D': + DDRD = 0xff; + while (!Serial_Available()) + { + PORTD ^= 0xff; + delay_ms(200); + } + PORTD = 0; + break; + #endif + + #ifdef DDRE + case 'E': + DDRE = 0xff; + while (!Serial_Available()) + { + PORTE ^= 0xff; + delay_ms(200); + } + PORTE = 0; + break; + #endif + + #ifdef DDRF + case 'F': + DDRF = 0xff; + while (!Serial_Available()) + { + PORTF ^= 0xff; + delay_ms(200); + } + PORTF = 0; + break; + #endif + + #ifdef DDRG + case 'G': + DDRG = 0xff; + while (!Serial_Available()) + { + PORTG ^= 0xff; + delay_ms(200); + } + PORTG = 0; + break; + #endif + + #ifdef DDRH + case 'H': + DDRH = 0xff; + while (!Serial_Available()) + { + PORTH ^= 0xff; + delay_ms(200); + } + PORTH = 0; + break; + #endif + + #ifdef DDRI + case 'I': + DDRI = 0xff; + while (!Serial_Available()) + { + PORTI ^= 0xff; + delay_ms(200); + } + PORTI = 0; + break; + #endif + + #ifdef DDRJ + case 'J': + DDRJ = 0xff; + while (!Serial_Available()) + { + PORTJ ^= 0xff; + delay_ms(200); + } + PORTJ = 0; + break; + #endif + + #ifdef DDRK + case 'K': + DDRK = 0xff; + while (!Serial_Available()) + { + PORTK ^= 0xff; + delay_ms(200); + } + PORTK = 0; + break; + #endif + + #ifdef DDRL + case 'L': + DDRL = 0xff; + while (!Serial_Available()) + { + PORTL ^= 0xff; + delay_ms(200); + } + PORTL = 0; + break; + #endif + + default: + PrintFromPROGMEMln(gTextMsg_PortNotSupported, 0); + getCharFlag = false; + break; + } + if (getCharFlag) + { + recchar(); + } + } + else + { + PrintFromPROGMEMln(gTextMsg_MustBeLetter, 0); + } +} + + +//******************************************************************* +static void PrintHelp(void) +{ + PrintFromPROGMEMln(gTextMsg_HELP_MSG_0, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_QM, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_AT, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_B, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_E, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_F, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_H, 0); + + PrintFromPROGMEMln(gTextMsg_HELP_MSG_L, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_Q, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_R, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_V, 0); + PrintFromPROGMEMln(gTextMsg_HELP_MSG_Y, 0); +} + +//************************************************************************ +static void RunMonitor(void) +{ +char keepGoing; +unsigned char theChar; +int ii, jj; + + for (ii=0; ii<5; ii++) + { + for (jj=0; jj<25; jj++) + { + sendchar('!'); + } + PrintNewLine(); + } + + gRamIndex = 0; + gFlashIndex = 0; + gEepromIndex = 0; + + PrintFromPROGMEMln(gTextMsg_Explorer, 0); + + keepGoing = 1; + while (keepGoing) + { + PrintFromPROGMEM(gTextMsg_Prompt, 0); + theChar = recchar(); + if (theChar >= 0x60) + { + theChar = theChar & 0x5F; + } + #if defined( _CEREBOTPLUS_BOARD_ ) + if (theChar == 0x5F) + { + + } + else + #endif + if (theChar >= 0x20) + { + sendchar(theChar); + sendchar(0x20); + } + + switch(theChar) + { + case '0': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_0, 2); + gFlashIndex = 0; + gRamIndex = 0; + gEepromIndex = 0; + break; + + case '?': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_QM, 2); + PrintCPUstats(); + break; + + case '@': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_AT, 2); + EEPROMtest(); + break; + + case 'B': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_B, 2); + BlinkLED(); + break; + + case 'E': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_E, 2); + DumpHex(kDUMP_EEPROM, gEepromIndex, 16); + gEepromIndex += 256; + if (gEepromIndex > E2END) + { + gEepromIndex = 0; + } + break; + + case 'F': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_F, 2); + DumpHex(kDUMP_FLASH, gFlashIndex, 16); + gFlashIndex += 256; + break; + + case 'H': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_H, 2); + PrintHelp(); + break; + + case 'L': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_L, 2); + ListAvailablePorts(); + break; + + case 'Q': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_Q, 2); + keepGoing = false; + break; + + case 'R': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_R, 2); + DumpHex(kDUMP_RAM, gRamIndex, 16); + gRamIndex += 256; + break; + + case 'V': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_V, 2); + VectorDisplay(); + break; + + case 'Y': + PrintFromPROGMEMln(gTextMsg_HELP_MSG_Y, 2); + AVR_PortOutput(); + break; + + #if defined( _CEREBOTPLUS_BOARD_ ) + case 0x5F: + //* do nothing + break; + #endif + + default: + PrintFromPROGMEMln(gTextMsg_HUH, 0); + break; + } + } +} + +#endif + diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.ppg b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.ppg new file mode 100644 index 0000000..a8929d7 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot.ppg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex new file mode 100644 index 0000000..4f36699 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex @@ -0,0 +1,513 @@ +:020000023000CC +:10E000000D94F6F20D941FF30D941FF30D941FF36E +:10E010000D941FF30D941FF30D941FF30D941FF334 +:10E020000D941FF30D941FF30D941FF30D941FF324 +:10E030000D941FF30D941FF30D941FF30D941FF314 +:10E040000D941FF30D941FF30D941FF30D941FF304 +:10E050000D941FF30D941FF30D941FF30D941FF3F4 +:10E060000D941FF30D941FF30D941FF30D941FF3E4 +:10E070000D941FF30D941FF30D941FF30D941FF3D4 +:10E080000D941FF30D941FF30D941FF30D941FF3C4 +:10E090000D941FF30D941FF30D941FF30D941FF3B4 +:10E0A0000D941FF30D941FF30D941FF30D941FF3A4 +:10E0B0000D941FF30D941FF30D941FF30D941FF394 +:10E0C0000D941FF30D941FF30D941FF30D941FF384 +:10E0D0000D941FF30D941FF30D941FF30D941FF374 +:10E0E0000D941FF341546D65676132353630004140 +:10E0F000726475696E6F206578706C6F72657220DE +:10E1000073746B3530305632206279204D4C530099 +:10E11000426F6F746C6F616465723E004875683F52 +:10E1200000436F6D70696C6564206F6E20203D2028 +:10E1300000435055205479706520202020203D2038 +:10E14000005F5F4156525F415243485F5F203D2070 +:10E1500000415652204C69624320566572203D2092 +:10E16000004743432056657273696F6E20203D203F +:10E1700000435055207369676E61747572653D2068 +:10E18000004C6F77206675736520202020203D208D +:10E1900000486967682066757365202020203D204F +:10E1A00000457874206675736520202020203D206E +:10E1B000004C6F636B2066757365202020203D2026 +:10E1C00000536570202039203230313000312E3636 +:10E1D0002E3700342E332E33005623202020414486 +:10E1E00044522020206F7020636F6465202020201F +:10E1F00020696E737472756374696F6E20616464F4 +:10E2000072202020496E74657272757074006E6F92 +:10E2100020766563746F7200726A6D702020006AE8 +:10E220006D7020005768617420706F72743A0050EE +:10E230006F7274206E6F7420737570706F72746576 +:10E2400064004D7573742062652061206C65747480 +:10E2500065720020005772697474696E67204545C5 +:10E260000052656164696E6720454500656570729E +:10E270006F6D206572726F7220636F756E743D00F2 +:10E28000504F525400303D5A65726F206164647281 +:10E290006573732063747273003F3D435055207360 +:10E2A0007461747300403D454550524F4D20746574 +:10E2B000737400423D426C696E6B204C45440045CE +:10E2C0003D44756D7020454550524F4D00463D44CC +:10E2D000756D7020464C41534800483D48656C7050 +:10E2E000004C3D4C69737420492F4F20506F72745D +:10E2F0007300513D517569742026206A756D702038 +:10E30000746F20757365722070676D00523D44759F +:10E310006D702052414D00563D73686F7720696ED5 +:10E320007465727275707420566563746F727300D1 +:10E33000593D506F727420626C696E6B002A0052F6 +:10E340004553455400494E543000494E543100491C +:10E350004E543200494E543300494E543400494E15 +:10E36000543500494E543600494E54370050434905 +:10E370004E5430005043494E5431005043494E549E +:10E3800032005744540054494D45523020434F4DBC +:10E3900050410054494D45523020434F4D504200AA +:10E3A00054494D455230204F56460054494D455230 +:10E3B0003120434150540054494D45523120434F80 +:10E3C0004D50410054494D45523120434F4D50422C +:10E3D0000054494D45523120434F4D50430054495C +:10E3E0004D455231204F56460054494D455232203A +:10E3F000434F4D50410054494D45523220434F4DFB +:10E4000050420054494D455232204F56460054491F +:10E410004D45523320434150540054494D455233E9 +:10E4200020434F4D50410054494D45523320434FF6 +:10E430004D50420054494D45523320434F4D5043B7 +:10E440000054494D455233204F56460054494D45DE +:10E45000523420434150540054494D4552342043D6 +:10E460004F4D50410054494D45523420434F4D507B +:10E47000420054494D45523420434F4D50430054BF +:10E48000494D455234204F56460054494D4552356A +:10E4900020434150540054494D45523520434F4D7F +:10E4A00050410054494D45523520434F4D50420094 +:10E4B00054494D45523520434F4D50430054494D2A +:10E4C000455235204F564600555341525430205244 +:10E4D000580055534152543020554452450055532D +:10E4E0004152543020545800555341525431205217 +:10E4F000580055534152543120554452450055530C +:10E5000041525431205458005553415254322052F4 +:10E5100058005553415254322055445245005553EA +:10E5200041525432205458005553415254332052D2 +:10E5300058005553415254332055445245005553C9 +:10E5400041525433205458005350492053544300EF +:10E5500041444300414E414C4F4720434F4D5000F2 +:10E560004545205245414459005457490053504DA8 +:10E57000205245414459002A003FE345E34AE34F16 +:10E58000E354E359E35EE363E368E36DE374E37B41 +:10E59000E382E3E9E3F6E303E4ABE3B7E3C4E3D107 +:10E5A000E3DEE386E393E3A0E348E5C8E4D2E4DEF8 +:10E5B000E454E550E560E50EE41AE427E434E44170 +:10E5C000E4E8E4F2E4FEE469E56DE54CE458E46572 +:10E5D000E472E47FE48AE496E4A3E4B0E4BDE408F2 +:10E5E000E512E51EE528E532E53EE50011241FBEF3 +:10E5F000CFEFD1E2DEBFCDBF01E00CBF12E0A0E063 +:10E60000B2E0EAEDFFEF03E00BBF02C007900D920E +:10E61000A030B107D9F712E0A0E0B2E001C01D922E +:10E62000AC30B107E1F70F94FBF40D94EBFF01E27E +:10E630000EBF0FEF0DBF11241FBE0D94FBF40D9400 +:10E6400000F020E030E040ED57E005C0FA013197DE +:10E65000F1F72F5F3F4F28173907C0F308959C014A +:10E66000442737FD4095542FDA01C901860F911DCB +:10E67000A11DB11DABBFFC018791882369F0809378 +:10E68000C6008091C00086FFFCCF8091C0008064EE +:10E690008093C0006F5FE8CF08958DE08093C6003F +:10E6A0008091C00086FFFCCF8091C0008064809381 +:10E6B000C0008AE08093C6008091C00086FFFCCF36 +:10E6C0008091C00080648093C00008950F942FF360 +:10E6D0000F944DF30895FC019081992359F0909384 +:10E6E000C6008091C00086FFFCCF8091C00080648E +:10E6F0008093C0003196992379F70895282F982F99 +:10E7000092959F70892F805D8A3308F0895F80938E +:10E71000C6008091C00086FFFCCF8091C00080645D +:10E720008093C000822F8F70982F905D9A3308F0ED +:10E73000995F9093C6008091C00086FFFCCF8091C6 +:10E74000C00080648093C00008959C01FB01853661 +:10E7500091051CF46330710594F0C90164E670E022 +:10E760000F948CFF605D7F4F6093C6008091C00066 +:10E7700086FFFCCF8091C00080648093C0002B3066 +:10E78000310514F43297B4F0C90164E670E00F94D7 +:10E790008CFF6AE070E00F948CFF605D7F4F6093A8 +:10E7A000C6008091C00086FFFCCF8091C0008064CD +:10E7B0008093C000C9016AE070E00F948CFFC0969E +:10E7C0008093C6008091C00086FFFCCF8091C0007E +:10E7D00080648093C0000895282F277020642093C0 +:10E7E0007C0020917B0086958695869590E08170CF +:10E7F000907033E0880F991F3A95E1F7277F282B17 +:10E8000020937B0080917A00806480937A008091CD +:10E810007A0086FDFCCF2091780040917900942FFA +:10E8200080E030E0282B392BC90108951F93182F61 +:10E8300080E892EE60E00F942FF31093C600809171 +:10E84000C00086FFFCCF8091C00080648093C00030 +:10E850000F944DF31F9108952F923F924F925F9224 +:10E860006F927F928F929F92AF92BF92CF92DF92E0 +:10E87000EF92FF920F931F93DF93CF93CDB7DEB745 +:10E8800062970FB6F894DEBF0FBECDBF382E622E52 +:10E89000CA01DB015C016D01772460E2262E2E01A6 +:10E8A0000894411C511C8BC081E0A81680E0B8067A +:10E8B00081E0C80680E0D80628F0C601AA27BB2759 +:10E8C0000F947EF3BB27AD2D9C2D8B2D0F947EF3E3 +:10E8D0008A2D0F947EF32092C6008091C00086FF9F +:10E8E000FCCF8091C00080648093C0009DE2909333 +:10E8F000C6008091C00086FFFCCF8091C00080647C +:10E900008093C0002092C6008091C00086FFFCCF9B +:10E910008091C00080648093C000198286017501D7 +:10E9200088249924A1E03A1651F03A1620F0B2E07A +:10E930003B1661F409C00BBFF701779007C0C70110 +:10E940000F94D5FF782E02C0F7017080872D0F94A9 +:10E950007EF32092C6008091C00086FFFCCF80919C +:10E96000C00080648093C000872D8052F401EF7056 +:10E97000F0708F3520F4E40DF51D708204C0E40DB5 +:10E98000F51D8EE280830894E11CF11C011D111D10 +:10E990000894811C911C90E18916910409F0C2CF62 +:10E9A00080E190E0A0E0B0E0A80EB91ECA1EDB1E18 +:10E9B000198AC2010F946BF30F944DF36A94662089 +:10E9C00009F072CF62960FB6F894DEBF0FBECDBFCE +:10E9D000CF91DF911F910F91FF90EF90DF90CF903B +:10E9E000BF90AF909F908F907F906F905F904F906F +:10E9F0003F902F9008952F923F924F925F926F9287 +:10EA00007F928F929F92AF92BF92CF92DF92EF92BE +:10EA1000FF920F931F93DF93CF93CDB7DEB7CD5304 +:10EA2000D1400FB6F894DEBF0FBECDBF279A2F9A04 +:10EA30008091C00082608093C00080E18093C40018 +:10EA400088E18093C1000000EE24FF248701B4E038 +:10EA5000AB2EB12CCC24DD2424C0C5010197F1F7E5 +:10EA60000894E11CF11C011D111D21E2E2162EE4A7 +:10EA7000F20620E0020720E0120718F0A1E0CA2EFB +:10EA8000D12CC801B70128E53BE140E050E00F94EC +:10EA90009FFF611571058105910519F485B18058B5 +:10EAA00085B98091C00087FD03C0C114D104A9F2CB +:10EAB000A6014F5F5F4FC25EDE4F59834883CE5140 +:10EAC000D140C25EDE4F68817981CE51D140613044 +:10EAD000710511F00D946EFFC05DDE4F1982188232 +:10EAE000C053D14060E0C15DDE4F1882CF52D140AB +:10EAF000AA24BB24C05EDE4F188219821A821B82B0 +:10EB0000C052D140CE5CDE4F188219821A821B821D +:10EB1000C253D14080E090E0A0E0B0E0ABBFFC0188 +:10EB2000A791B691C45CDE4FB983A883CC53D14082 +:10EB30000D9469FFC25EDE4FE881F981CE51D1406C +:10EB4000319709F52091C600C25EDE4F1982188206 +:10EB5000CE51D14022C02F5F3F4F4F4F5F4F2130EA +:10EB6000F2E13F07FAE74F07F0E05F0780F0C45C8F +:10EB7000DE4F08811981CC53D1400F5F1F4F19F030 +:10EB8000EE27FF27099420E030E040E050E080913C +:10EB9000C00087FFE0CF2091C600213209F094C663 +:10EBA0000894A11CB11C33E0A316B10409F08EC671 +:10EBB00000E010E018C041E24093C6008091C00020 +:10EBC00086FFFCCF8091C00080648093C0002F5FDF +:10EBD0003F4F2931310579F70F944DF30F5F1F4FE8 +:10EBE0000530110519F020E030E0E5CF1092080261 +:10EBF0001092090210920A0210920B021092040263 +:10EC00001092050210920602109207021092000262 +:10EC10001092010210920202109203028FEE90EE07 +:10EC200060E00F9466F380E191EE60E00F942FF3C3 +:10EC30008091C00087FFFCCF9091C600903608F00D +:10EC40009F759032B8F09093C6008091C00086FF07 +:10EC5000FCCF8091C00080648093C00080E28093EC +:10EC6000C6008091C00086FFFCCF8091C000806408 +:10EC70008093C000983409F4DBC19934B8F492341D +:10EC800009F45DC1933458F4903319F1903308F4CA +:10EC900018C69F33A1F1903409F013C6BDC0953456 +:10ECA00009F474C1963409F00CC69CC1923509F47C +:10ECB0002FC2933538F49C3409F4F9C1913509F029 +:10ECC00000C61CC2963509F449C2993509F0F9C548 +:10ECD0009CC485E892EE62E00F9466F31092040201 +:10ECE000109205021092060210920702109208027A +:10ECF0001092090210920A0210920B0217C189E9C0 +:10ED000092EE62E00F9466F38FEE90EE60E00F9467 +:10ED100066F381E291EE60E00F942FF381EC91EEC7 +:10ED200060E00F9466F381E391EE60E00F942FF3BF +:10ED300084EE90EE60E00F9466F381E491EE60E083 +:10ED40000F942FF386E090E061E070E00F94A5F35C +:10ED50000F944DF381E691EE60E00F942FF383ED75 +:10ED600091EE60E00F9466F381E591EE60E00F9420 +:10ED70002FF38DEC91EE60E00F9466F381E791EE56 +:10ED800060E00F942FF38EE10F947EF388E90F94E7 +:10ED90007EF381E00F947EF30F944DF381E891EEC2 +:10EDA00060E00F942FF319E0E0E0F0E010935700DB +:10EDB000E4918E2F0F947EF30F944DF381E991EE41 +:10EDC00060E00F942FF3E3E0F0E010935700E4913C +:10EDD0008E2F0F947EF30F944DF381EA91EE60E055 +:10EDE0000F942FF3E2E0F0E010935700E4918E2FA0 +:10EDF0000F947EF30F944DF381EB91EE60E00F944E +:10EE00002FF3E1E0F0E0109357001491812F0F945D +:10EE10007EF30F944DF307CF85EA92EE62E00F94F4 +:10EE200066F385E592EE60E00F9466F30F944DF380 +:10EE300000E010E019C0C8016F2D0F94DDFFFF2026 +:10EE400031F483E592EE60E00F942FF30BC0F09263 +:10EE5000C6008091C00086FFFCCF8091C000806416 +:10EE60008093C0000F5F1F4FC80181519F41AA27A7 +:10EE700097FDA095BA2FABBFFC01F7905AE2F516AB +:10EE800021F062E000301607B1F60F944DF30F94B5 +:10EE90004DF381E692EE60E00F9466F30F944DF32C +:10EEA000CC24DD2400E010E01EC0C8010F94D5FF83 +:10EEB000F82E882331F483E592EE60E00F942FF36F +:10EEC0000BC08093C6008091C00086FFFCCF80916C +:10EED000C00080648093C000FE1419F00894C11C27 +:10EEE000D11C0F5F1F4FC80181519F41AA2797FD79 +:10EEF000A095BA2FABBFFC01E7907AE2E71621F0AC +:10EF000082E00030180789F60F944DF30F944DF30B +:10EF10008CE692EE60E00F942FF3C60161E070E0A2 +:10EF20000F94A5F30F944DF30F944DF3109200023C +:10EF300010920102109202021092030274CE83EB2F +:10EF400092EE62E00F9466F3279A2F9A16C02F98DC +:10EF500080E090E0E0EDF7E03197F1F7019684363C +:10EF60009105C1F72F9A80E090E0E0EDF7E031974E +:10EF7000F1F7019684369105C1F78091C00087FFB3 +:10EF8000E6CF8091C00087FFFCCF95C48FEB92EE57 +:10EF900062E00F9466F3409100025091010260918B +:10EFA00002027091030281E020E10F942CF4809121 +:10EFB000000290910102A0910202B09103028050E0 +:10EFC0009F4FAF4FBF4F8093000290930102A093D9 +:10EFD0000202B093030280509041A040B04008F478 +:10EFE00022CEA4CF8DEC92EE62E00F9466F34091B6 +:10EFF000040250910502609106027091070280E0C0 +:10F0000020E10F942CF48091040290910502A091CC +:10F010000602B091070280509F4FAF4FBF4F8093C1 +:10F02000040290930502A0930602B0930702FBCD61 +:10F030008AED92EE62E00F9466F385E892EE60E06E +:10F040000F9466F389E992EE60E00F9466F385EA27 +:10F0500092EE60E00F9466F383EB92EE60E00F9423 +:10F0600066F38FEB92EE60E00F9466F38DEC92EE18 +:10F0700060E00F9466F38AED92EE60E00F9466F321 +:10F0800081EE92EE60E00F9466F382EF92EE60E024 +:10F090000F9466F38CE093EE60E00F9466F387E1E3 +:10F0A00093EE60E00F9466F380E393EEB9CD81EECA +:10F0B00092EE62E00F9466F381E40F9416F482E41A +:10F0C0000F9416F483E40F9416F484E40F9416F46A +:10F0D00085E40F9416F486E40F9416F487E40F94F5 +:10F0E00016F488E40F9416F48AE40F9416F48BE473 +:10F0F0000F9416F48CE40F9416F495CD82EF92EEF3 +:10F1000062E00F9466F399249394AA24BB2445C427 +:10F110008CE093EE62E00F9466F340910802509108 +:10F12000090260910A0270910B0282E020E10F94C3 +:10F130002CF48091080290910902A0910A02B091EA +:10F140000B0280509F4FAF4FBF4F809308029093A8 +:10F150000902A0930A02B0930B0265CD87E193EEFA +:10F1600062E00F9466F384EE90EE60E00F9466F335 +:10F1700089ED91EE60E00F9466F309E715EECC5D42 +:10F18000DE4F19830883C452D1406624772443019B +:10F19000CA5DDE4F19821882C652D140A401930184 +:10F1A0005695479537952795C85DDE4F2883398357 +:10F1B0004A835B83C852D140CA5DDE4F4881598182 +:10F1C000C652D1404F5F5F4FCA5DDE4F59834883BF +:10F1D000C652D140CA0162E070E00F94A5F350E23C +:10F1E0005093C6008091C00086FFFCCF8091C00084 +:10F1F00080648093C0006DE26093C6008091C0007F +:10F2000086FFFCCF8091C00080648093C00070E2D4 +:10F210007093C6008091C00086FFFCCF8091C00033 +:10F2200080648093C000C85DDE4FE880F9800A8169 +:10F230001B81C852D140BB27A12F902F8F2D0F9437 +:10F240007EF3C85DDE4F8881C852D1400F947EF3B3 +:10F2500070E2F72EF092C6008091C00086FFFCCFCE +:10F260008091C00080648093C0000DE30093C600CD +:10F270008091C00086FFFCCF8091C00080648093A5 +:10F28000C00010E21093C6008091C00086FFFCCF42 +:10F290008091C00080648093C0008BBEF3012791F1 +:10F2A000C45DDE4F2883CC52D140A22EBB24CC2497 +:10F2B000DD240894611C711C811C911C8BBEF30120 +:10F2C0008791282E332444245524142D032DF22C09 +:10F2D000EE24EA0CFB1C0C1D1D1D0894611C711C06 +:10F2E000811C911C8BBEF3013791C35DDE4F3883C7 +:10F2F000CD52D1400894611C711C811C911C8BBEA5 +:10F30000F3014791C25DDE4F4883CE52D1402DEFCD +:10F310003FEF4FEF5FEF620E731E841E951E0F943A +:10F320007EF330E23093C6008091C00086FFFCCFB0 +:10F330008091C00080648093C000C45DDE4F8881EE +:10F34000CC52D1400F947EF340E24093C6008091AE +:10F35000C00086FFFCCF8091C00080648093C00015 +:10F36000C25DDE4F8881CE52D1400F947EF350E2D1 +:10F370005093C6008091C00086FFFCCF8091C000F2 +:10F3800080648093C000C35DDE4F8881CD52D14040 +:10F390000F947EF360E26093C6008091C00086FF08 +:10F3A000FCCF8091C00080648093C0007FEFE7169F +:10F3B0007FEFF70670E0070770E0170731F48EE083 +:10F3C00092EE60E00F942FF3DFC0D801C701807088 +:10F3D000907CA070B0708050904CA040B040D1F5AF +:10F3E0002FEF3FE340E050E0E222F3220423152315 +:10F3F000C85DDE4FA880B980CA80DB80C852D1408A +:10F40000AE0CBF1CC01ED11EAA0CBB1CCC1CDD1C2C +:10F4100088E192EE60E00F942FF3BB27A12F902F8D +:10F420008F2D0F947EF38E2D0F947EF330E2309368 +:10F43000C6008091C00086FFFCCF8091C000806430 +:10F440008093C0004EE34093C6008091C00086FFC9 +:10F45000FCCF87C06EE07EEF80E090E0E622F722EE +:10F46000082319237CE0E71674E9F70670E0070724 +:10F4700070E0170709F088C0C25DDE4F8881CE5268 +:10F48000D140E82EFF2400E010E0102F0F2DFE2CBD +:10F49000EE24C35DDE4F9881CD52D140E90EF11CC0 +:10F4A000011D111DD601C50181709070A070B07052 +:10F4B000DC0199278827E80EF91E0A1F1B1F20EF81 +:10F4C00030E040E050E0A222B322C422D522F1E194 +:10F4D000AA0CBB1CCC1CDD1CFA95D1F7EA0CFB1C5A +:10F4E0000C1D1D1D41E050E060E070E0242235223B +:10F4F00046225722E5E1220C331C441C551CEA9598 +:10F50000D1F7E20CF31C041D151D57016801AA0C6C +:10F51000BB1CCC1CDD1C8FE192EE60E00F942FF33E +:10F52000C801AA27BB270F947EF3BB27A12F902FDA +:10F530008F2D0F947EF38E2D0F947EF350E2509317 +:10F54000C6008091C00086FFFCCF8091C00080641F +:10F550008093C0006EE36093C6008091C00086FF78 +:10F56000FCCF8091C00080648093C000C601AA27B0 +:10F57000BB270F947EF3BB27AD2D9C2D8B2D0F94B5 +:10F580007EF38A2D0F947EF370E27093C600809113 +:10F59000C00086FFFCCF8091C00080648093C000D3 +:10F5A000CC5DDE4FE881F981C452D140CF01AA275A +:10F5B00097FDA095BA2FABBFFC018791969160E0B3 +:10F5C0000F942FF30F944DF3CC5DDE4F088119811A +:10F5D000C452D1400E5F1F4FCC5DDE4F19830883AC +:10F5E000C452D140CA5DDE4F28813981C652D14014 +:10F5F0002933310509F417CB44E050E060E070E0B6 +:10F60000640E751E861E971EC9CD80E393EE62E0E0 +:10F610000F9466F384E292EE60E00F942FF38091F2 +:10F62000C00087FFFCCF1091C6001F751093C60065 +:10F630008091C00086FFFCCF8091C00080648093E1 +:10F64000C0000F944DF3812F81548A3108F036C1E8 +:10F65000163409F495C0173490F4133409F44EC0ED +:10F66000143430F41134F1F0123409F01DC130C0FB +:10F67000143409F459C0153409F016C16BC01A349A +:10F6800009F4C4C01B3438F4173409F48FC018349B +:10F6900009F00AC1A1C01B3409F4D2C01C3409F01E +:10F6A00003C1E8C08FEF81B90DC082B1809582B9E6 +:10F6B00080E090E0E0EDF7E03197F1F70196883CCB +:10F6C0009105C1F78091C00087FFEFCF12B8EFC05E +:10F6D0008FEF84B90DC085B1809585B980E090E049 +:10F6E000E0EDF7E03197F1F70196883C9105C1F71D +:10F6F0008091C00087FFEFCF15B8D9C08FEF87B9D1 +:10F700000DC088B1809588B980E090E0E0EDF7E029 +:10F710003197F1F70196883C9105C1F78091C000BF +:10F7200087FFEFCF18B8C3C08FEF8AB90DC08BB178 +:10F7300080958BB980E090E0E0EDF7E03197F1F74C +:10F740000196883C9105C1F78091C00087FFEFCFFB +:10F750001BB8ADC08FEF8DB90DC08EB180958EB93D +:10F7600080E090E0E0EDF7E03197F1F70196883C1A +:10F770009105C1F78091C00087FFEFCF1EB897C0F9 +:10F780008FEF80BB0DC081B3809581BB80E090E09E +:10F79000E0EDF7E03197F1F70196883C9105C1F76C +:10F7A0008091C00087FFEFCF11BA81C08FEF83BB7C +:10F7B0000DC084B3809584BB80E090E0E0EDF7E07D +:10F7C0003197F1F70196883C9105C1F78091C0000F +:10F7D00087FFEFCF14BA6BC08FEF809301010FC08A +:10F7E0008091020180958093020180E090E0E0ED3D +:10F7F000F7E03197F1F70196883C9105C1F78091C8 +:10F80000C00087FFEDCF1092020151C08FEF8093AF +:10F8100004010FC08091050180958093050180E06F +:10F8200090E0E0EDF7E03197F1F70196883C910523 +:10F83000C1F78091C00087FFEDCF1092050137C05E +:10F840008FEF809307010FC080910801809580930E +:10F85000080180E090E0E0EDF7E03197F1F70196E4 +:10F86000883C9105C1F78091C00087FFEDCF1092D1 +:10F8700008011DC08FEF80930A010FC080910B011A +:10F88000809580930B0180E090E0E0EDF7E0319708 +:10F89000F1F70196883C9105C1F78091C00087FF80 +:10F8A000EDCF10920B0103C08FE292EEB9C98091A7 +:10F8B000C00087FFFCCF8091C600B5C982E492EEFC +:10F8C000AFC98CE191EEACC9AA24BB24933061F19D +:10F8D000943028F4913089F0923008F508C09530C2 +:10F8E000B1F1953040F1963009F053C04EC02B3144 +:10F8F00009F020C991E06BE11DC9213041F0C15DE3 +:10F90000DE4F5881CF52D140251709F002C362273C +:10F91000C15DDE4F2883CF52D14092E00BC9B22F98 +:10F92000A0E0622793E006C9822F90E0A82BB92BB4 +:10F93000622794E0FFC82E3009F0EBC2622795E001 +:10F94000C05DDE4F19821882C053D140F3C8E1E098 +:10F95000F0E0EC0FFD1FC05DDE4FE880F980C05382 +:10F96000D140EE0DFF1D208387010F5F1F4FC05D4B +:10F97000DE4F19830883C053D14062270A171B0743 +:10F9800009F0D8C8D80196E0D5C8261709F0C1C239 +:10F9900003C0973009F0CEC899248981833109F4D6 +:10F9A000FCC08431C8F4863009F4C2C0873050F4FA +:10F9B000823009F4F0C0833009F458C0813009F076 +:10F9C0000AC23EC0813109F462C0823108F0A6C08B +:10F9D000803109F000C2DFC0883109F472C089317A +:10F9E00050F4853109F4D9C0853108F477C18631E6 +:10F9F00009F0F1C173C18A3109F457C08A3108F4A2 +:10FA00007CC08B3109F446C08D3109F0E4C18D8191 +:10FA1000803311F090E00AC08F81882311F49EE1B9 +:10FA200005C0813011F091E001C098E91A821B8273 +:10FA30008D818C831D829E831F8227E030E0CFC1A1 +:10FA40001A8288E08B8381E48C8386E58D8382E54E +:10FA50008E8389E48F8383E5888780E589878FE5B6 +:10FA60008A8782E38B872BE030E0B9C18A818139B4 +:10FA700041F0823941F0803911F48FE005C080E017 +:10FA800003C082E001C08AE01A828B8344C09924BB +:10FA9000939481C08D81882311F48EE12CC0813034 +:10FAA00011F081E028C088E926C01A82E1E0F0E088 +:10FAB00089E08093570084918B831C8224E030E09E +:10FAC0008EC18B81803589F48C81883039F4E2E0F5 +:10FAD000F0E089E08093570084910DC0E0E0F0E011 +:10FAE00089E080935700849106C0E3E0F0E089E06C +:10FAF0008093570084911A82DFCF8D81836C99E0C7 +:10FB0000E1E0F0E0082E90935700E89507B600FC7E +:10FB1000FDCF1A821B8223E030E061C11A82CE5CE5 +:10FB2000DE4F188219821A821B82C253D14055C1FE +:10FB30008A8190E0A0E0B0E0582F442733272227A5 +:10FB40008B8190E0A0E0B0E0DC0199278827282B8A +:10FB5000392B4A2B5B2B8D8190E0A0E0B0E0282B65 +:10FB6000392B4A2B5B2B8C8190E0A0E0B0E0BA2FC0 +:10FB7000A92F982F8827282B392B4A2B5B2B220F54 +:10FB8000331F441F551FC05EDE4F288339834A83CD +:10FB90005B83C052D1401A8220C19A812B8183316C +:10FBA00049F0C05EDE4F488159816A817B81C05235 +:10FBB000D1408AC0CE5CDE4F488159816A817B8109 +:10FBC000C253D140403080EC580783E0680780E0A2 +:10FBD0007807F0F483E0FA0160935B0080935700AC +:10FBE000E89507B600FCFDCFCE5CDE4F4881598119 +:10FBF0006A817B81C253D14040505F4F6F4F7F4F2E +:10FC0000CE5CDE4F488359836A837B83C253D140E5 +:10FC1000C95CDE4F9883C753D140CA5CDE4F18825F +:10FC2000C653D140022F10E0CA5CDE4F6881798153 +:10FC3000C653D140062B172BC05EDE4F4881598139 +:10FC40006A817B81C052D140DE011B9631E08C91EC +:10FC500011962C9111971296C75CDE4F2883C953D9 +:10FC6000D140C85CDE4F1882C853D14090E0C85CD8 +:10FC7000DE4FE881F981C853D1408E2B9F2B0C01B8 +:10FC8000FA0160935B0030935700E89511244E5FB2 +:10FC90005F4F6F4F7F4F02501040C9F685E0C05E46 +:10FCA000DE4FE880F9800A811B81C052D140F70104 +:10FCB00000935B0080935700E89507B600FCFDCFEA +:10FCC00081E180935700E8951A82C05EDE4F488339 +:10FCD00059836A837B83C052D1407FC0FA80C55C60 +:10FCE000DE4FF882CB53D140C65CDE4F1882CA5338 +:10FCF000D1408B81C82EDD24C65CDE4F088119817E +:10FD0000CA53D140C02AD12A1A828981BE016D5FAF +:10FD10007F4F843121F59601C05EDE4FE880F98087 +:10FD20000A811B81C052D1400BBFF7018791969188 +:10FD3000DB018C9311969C936E5F7F4FD801C701B6 +:10FD40000296A11DB11DC05EDE4F88839983AA83F0 +:10FD5000BB83C052D14022503040F1F636C0C05E65 +:10FD6000DE4F288139814A815B81C052D14008949D +:10FD7000C108D108760100E010E00894C11CD11C34 +:10FD80000894E11CF11C011D111DE20EF31E041F5D +:10FD9000151F21BDBB27A52F942F832F82BD2F5F59 +:10FDA0003F4F4F4F5F4FF89A80B5DB018D93BD01F8 +:10FDB0002E153F054007510761F7C05EDE4F2883CF +:10FDC00039834A835B83C052D14096012D5F3F4FF8 +:10FDD000FB01108204C080EC8A8322E030E08BE1DA +:10FDE0008093C6008091C00086FFFCCF8091C00048 +:10FDF00080648093C000C15DDE4FF881CF52D14056 +:10FE0000F093C6008091C00086FFFCCF8091C000B7 +:10FE100080648093C000432F3093C6008091C0005F +:10FE200086FFFCCF8091C00080648093C000922F39 +:10FE30002093C6008091C00086FFFCCF8091C00057 +:10FE400080648093C0008EE08093C6008091C000E3 +:10FE500086FFFCCF8091C00080648093C00065E184 +:10FE6000C15DDE4FE880CF52D1406E2569276427FF +:10FE7000FE01319610C090819093C6008091C00021 +:10FE800086FFFCCF31968091C00080648093C000D3 +:10FE90006927215030402115310569F76093C6006C +:10FEA0008091C00086FFFCCF8091C0008064809369 +:10FEB000C00085B1805885B9992081F4C15DDE4FBD +:10FEC0000881CF52D1400F5FC15DDE4F0883CF5212 +:10FED000D14090E0A0E0B0E00D949AF527982F98DB +:10FEE00080E090E020ED37E0F9013197F1F70196DD +:10FEF00084369105C9F700008091C0008D7F809302 +:10FF0000C00081E180935700E895EE27FF27099410 +:10FF1000FFCF90E00D949AF597FB092E07260AD0A3 +:10FF200077FD04D02ED006D000201AF4709561958C +:10FF30007F4F0895F6F7909581959F4F0895A1E220 +:10FF40001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F53 +:10FF5000FF1FA217B307E407F50720F0A21BB30B9E +:10FF6000E40BF50B661F771F881F991F1A9469F71A +:10FF700060957095809590959B01AC01BD01CF0176 +:10FF80000895AA1BBB1B51E107C0AA1FBB1FA617E0 +:10FF9000B70710F0A61BB70B881F991F5A95A9F732 +:10FFA00080959095BC01CD010895F999FECF92BD41 +:10FFB00081BDF89A992780B50895262FF999FECF2B +:10FFC0001FBA92BD81BD20BD0FB6F894FA9AF99A76 +:0AFFD0000FBE01960895F894FFCFCC +:040000033000E000E9 +:00000001FF diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.cpp b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.cpp old mode 100755 new mode 100644 similarity index 50% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.cpp rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.cpp index 712a4c7..4397efb --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.cpp +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.cpp @@ -17,39 +17,55 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 23 November 2006 by David A. Mellis + Modified 28 September 2010 by Mark Sproul */ +#include #include #include #include #include "wiring.h" #include "wiring_private.h" +// this next line disables the entire HardwareSerial.cpp, +// this is so I can support Attiny series and any other chip without a uart +#if defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H) + #include "HardwareSerial.h" // Define constants and variables for buffering incoming serial data. We're // using a ring buffer (I think), in which rx_buffer_head is the index of the // location to which to write the next incoming character and rx_buffer_tail // is the index of the location from which to read. -#define RX_BUFFER_SIZE 128 +#if (RAMEND < 1000) + #define RX_BUFFER_SIZE 32 +#else + #define RX_BUFFER_SIZE 128 +#endif -struct ring_buffer { +struct ring_buffer +{ unsigned char buffer[RX_BUFFER_SIZE]; int head; int tail; }; -ring_buffer rx_buffer = { { 0 }, 0, 0 }; - -#if defined(__AVR_ATmega1280__) -ring_buffer rx_buffer1 = { { 0 }, 0, 0 }; -ring_buffer rx_buffer2 = { { 0 }, 0, 0 }; -ring_buffer rx_buffer3 = { { 0 }, 0, 0 }; +#if defined(UBRRH) || defined(UBRR0H) + ring_buffer rx_buffer = { { 0 }, 0, 0 }; +#endif +#if defined(UBRR1H) + ring_buffer rx_buffer1 = { { 0 }, 0, 0 }; +#endif +#if defined(UBRR2H) + ring_buffer rx_buffer2 = { { 0 }, 0, 0 }; +#endif +#if defined(UBRR3H) + ring_buffer rx_buffer3 = { { 0 }, 0, 0 }; #endif inline void store_char(unsigned char c, ring_buffer *rx_buffer) { - int i = (rx_buffer->head + 1) % RX_BUFFER_SIZE; + int i = (unsigned int)(rx_buffer->head + 1) % RX_BUFFER_SIZE; // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the @@ -61,50 +77,97 @@ inline void store_char(unsigned char c, ring_buffer *rx_buffer) } } -#if defined(__AVR_ATmega1280__) - -SIGNAL(SIG_USART0_RECV) -{ - unsigned char c = UDR0; - store_char(c, &rx_buffer); -} - -SIGNAL(SIG_USART1_RECV) -{ - unsigned char c = UDR1; - store_char(c, &rx_buffer1); -} - -SIGNAL(SIG_USART2_RECV) -{ - unsigned char c = UDR2; - store_char(c, &rx_buffer2); -} - -SIGNAL(SIG_USART3_RECV) -{ - unsigned char c = UDR3; - store_char(c, &rx_buffer3); -} - +#if defined(USART_RX_vect) + SIGNAL(USART_RX_vect) + { + #if defined(UDR0) + unsigned char c = UDR0; + #elif defined(UDR) + unsigned char c = UDR; // atmega8535 + #else + #error UDR not defined + #endif + store_char(c, &rx_buffer); + } +#elif defined(SIG_USART0_RECV) && defined(UDR0) + SIGNAL(SIG_USART0_RECV) + { + unsigned char c = UDR0; + store_char(c, &rx_buffer); + } +#elif defined(SIG_UART0_RECV) && defined(UDR0) + SIGNAL(SIG_UART0_RECV) + { + unsigned char c = UDR0; + store_char(c, &rx_buffer); + } +//#elif defined(SIG_USART_RECV) +#elif defined(USART0_RX_vect) + // fixed by Mark Sproul this is on the 644/644p + //SIGNAL(SIG_USART_RECV) + SIGNAL(USART0_RX_vect) + { + #if defined(UDR0) + unsigned char c = UDR0; + #elif defined(UDR) + unsigned char c = UDR; // atmega8, atmega32 + #else + #error UDR not defined + #endif + store_char(c, &rx_buffer); + } +#elif defined(SIG_UART_RECV) + // this is for atmega8 + SIGNAL(SIG_UART_RECV) + { + #if defined(UDR0) + unsigned char c = UDR0; // atmega645 + #elif defined(UDR) + unsigned char c = UDR; // atmega8 + #endif + store_char(c, &rx_buffer); + } +#elif defined(USBCON) + #warning No interrupt handler for usart 0 + #warning Serial(0) is on USB interface #else + #error No interrupt handler for usart 0 +#endif -#if defined(__AVR_ATmega8__) -SIGNAL(SIG_UART_RECV) -#else -SIGNAL(USART_RX_vect) +//#if defined(SIG_USART1_RECV) +#if defined(USART1_RX_vect) + //SIGNAL(SIG_USART1_RECV) + SIGNAL(USART1_RX_vect) + { + unsigned char c = UDR1; + store_char(c, &rx_buffer1); + } +#elif defined(SIG_USART1_RECV) + #error SIG_USART1_RECV #endif -{ -#if defined(__AVR_ATmega8__) - unsigned char c = UDR; -#else - unsigned char c = UDR0; + +#if defined(USART2_RX_vect) && defined(UDR2) + SIGNAL(USART2_RX_vect) + { + unsigned char c = UDR2; + store_char(c, &rx_buffer2); + } +#elif defined(SIG_USART2_RECV) + #error SIG_USART2_RECV #endif - store_char(c, &rx_buffer); -} +#if defined(USART3_RX_vect) && defined(UDR3) + SIGNAL(USART3_RX_vect) + { + unsigned char c = UDR3; + store_char(c, &rx_buffer3); + } +#elif defined(SIG_USART3_RECV) + #error SIG_USART3_RECV #endif + + // Constructors //////////////////////////////////////////////////////////////// HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, @@ -131,22 +194,16 @@ HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, void HardwareSerial::begin(long baud) { uint16_t baud_setting; - bool use_u2x; - - // U2X mode is needed for baud rates higher than (CPU Hz / 16) - if (baud > F_CPU / 16) { - use_u2x = true; - } else { - // figure out if U2X mode would allow for a better connection - - // calculate the percent difference between the baud-rate specified and - // the real baud rate for both U2X and non-U2X mode (0-255 error percent) - uint8_t nonu2x_baud_error = abs((int)(255-((F_CPU/(16*(((F_CPU/8/baud-1)/2)+1))*255)/baud))); - uint8_t u2x_baud_error = abs((int)(255-((F_CPU/(8*(((F_CPU/4/baud-1)/2)+1))*255)/baud))); - - // prefer non-U2X mode because it handles clock skew better - use_u2x = (nonu2x_baud_error > u2x_baud_error); + bool use_u2x = true; + +#if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) { + use_u2x = false; } +#endif if (use_u2x) { *_ucsra = 1 << _u2x; @@ -172,9 +229,18 @@ void HardwareSerial::end() cbi(*_ucsrb, _rxcie); } -uint8_t HardwareSerial::available(void) +int HardwareSerial::available(void) +{ + return (unsigned int)(RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % RX_BUFFER_SIZE; +} + +int HardwareSerial::peek(void) { - return (RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % RX_BUFFER_SIZE; + if (_rx_buffer->head == _rx_buffer->tail) { + return -1; + } else { + return _rx_buffer->buffer[_rx_buffer->tail]; + } } int HardwareSerial::read(void) @@ -184,7 +250,7 @@ int HardwareSerial::read(void) return -1; } else { unsigned char c = _rx_buffer->buffer[_rx_buffer->tail]; - _rx_buffer->tail = (_rx_buffer->tail + 1) % RX_BUFFER_SIZE; + _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % RX_BUFFER_SIZE; return c; } } @@ -213,14 +279,25 @@ void HardwareSerial::write(uint8_t c) // Preinstantiate Objects ////////////////////////////////////////////////////// -#if defined(__AVR_ATmega8__) -HardwareSerial Serial(&rx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRE, U2X); +#if defined(UBRRH) && defined(UBRRL) + HardwareSerial Serial(&rx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRE, U2X); +#elif defined(UBRR0H) && defined(UBRR0L) + HardwareSerial Serial(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0); +#elif defined(USBCON) + #warning no serial port defined (port 0) #else -HardwareSerial Serial(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0); + #error no serial port defined (port 0) #endif -#if defined(__AVR_ATmega1280__) -HardwareSerial Serial1(&rx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRE1, U2X1); -HardwareSerial Serial2(&rx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRE2, U2X2); -HardwareSerial Serial3(&rx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRE3, U2X3); +#if defined(UBRR1H) + HardwareSerial Serial1(&rx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRE1, U2X1); +#endif +#if defined(UBRR2H) + HardwareSerial Serial2(&rx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRE2, U2X2); #endif +#if defined(UBRR3H) + HardwareSerial Serial3(&rx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRE3, U2X3); +#endif + +#endif // whole file + diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.h old mode 100755 new mode 100644 similarity index 76% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.h rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.h index 6b620ed..3efa775 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.h +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/HardwareSerial.h @@ -15,6 +15,8 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 28 September 2010 by Mark Sproul */ #ifndef HardwareSerial_h @@ -22,11 +24,11 @@ #include -#include "Print.h" +#include "Stream.h" struct ring_buffer; -class HardwareSerial : public Print +class HardwareSerial : public Stream { private: ring_buffer *_rx_buffer; @@ -48,19 +50,27 @@ class HardwareSerial : public Print uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udre, uint8_t u2x); void begin(long); void end(); - uint8_t available(void); - int read(void); - void flush(void); + virtual int available(void); + virtual int peek(void); + virtual int read(void); + virtual void flush(void); virtual void write(uint8_t); using Print::write; // pull in write(str) and write(buf, size) from Print }; -extern HardwareSerial Serial; - -#if defined(__AVR_ATmega1280__) -extern HardwareSerial Serial1; -extern HardwareSerial Serial2; -extern HardwareSerial Serial3; +#if defined(UBRRH) || defined(UBRR0H) + extern HardwareSerial Serial; +#elif defined(USBCON) + #include "usb_api.h" +#endif +#if defined(UBRR1H) + extern HardwareSerial Serial1; +#endif +#if defined(UBRR2H) + extern HardwareSerial Serial2; +#endif +#if defined(UBRR3H) + extern HardwareSerial Serial3; #endif #endif diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/Print.cpp b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Print.cpp old mode 100755 new mode 100644 similarity index 95% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/Print.cpp rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/Print.cpp index fb5afc1..4ee556d --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/Print.cpp +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Print.cpp @@ -19,6 +19,7 @@ Modified 23 November 2006 by David A. Mellis */ +#include #include #include #include @@ -42,6 +43,13 @@ void Print::write(const uint8_t *buffer, size_t size) write(*buffer++); } +void Print::print(const String &s) +{ + for (int i = 0; i < s.length(); i++) { + write(s[i]); + } +} + void Print::print(const char str[]) { write(str); @@ -99,6 +107,12 @@ void Print::println(void) print('\n'); } +void Print::println(const String &s) +{ + print(s); + println(); +} + void Print::println(const char c[]) { print(c); diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/Print.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Print.h old mode 100755 new mode 100644 similarity index 95% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/Print.h rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/Print.h index 8a1e2b8..b092ae5 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/Print.h +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Print.h @@ -23,6 +23,8 @@ #include #include // for size_t +#include "WString.h" + #define DEC 10 #define HEX 16 #define OCT 8 @@ -38,7 +40,8 @@ class Print virtual void write(uint8_t) = 0; virtual void write(const char *str); virtual void write(const uint8_t *buffer, size_t size); - + + void print(const String &); void print(const char[]); void print(char, int = BYTE); void print(unsigned char, int = BYTE); @@ -48,6 +51,7 @@ class Print void print(unsigned long, int = DEC); void print(double, int = 2); + void println(const String &s); void println(const char[]); void println(char, int = BYTE); void println(unsigned char, int = BYTE); diff --git a/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Stream.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Stream.h new file mode 100644 index 0000000..93d8275 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Stream.h @@ -0,0 +1,35 @@ +/* + Stream.h - base class for character-based streams. + Copyright (c) 2010 David A. Mellis. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Stream_h +#define Stream_h + +#include +#include "Print.h" + +class Stream : public Print +{ + public: + virtual int available() = 0; + virtual int read() = 0; + virtual int peek() = 0; + virtual void flush() = 0; +}; + +#endif diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/Tone.cpp b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Tone.cpp old mode 100755 new mode 100644 similarity index 78% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/Tone.cpp rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/Tone.cpp index 827fe49..c3910e7 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/Tone.cpp +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/Tone.cpp @@ -28,15 +28,15 @@ Version Modified By Date Comments 09/11/25 Changed pin toggle method to XOR 09/11/25 Fixed timer0 from being excluded 0006 D Mellis 09/12/29 Replaced objects with functions - +0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register *************************************************/ #include #include -#include -#include +#include "wiring.h" +#include "pins_arduino.h" -#if defined(__AVR_ATmega8__) +#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) #define TCCR2A TCCR2 #define TCCR2B TCCR2 #define COM2A1 COM21 @@ -66,20 +66,27 @@ volatile long timer2_toggle_count; volatile uint8_t *timer2_pin_port; volatile uint8_t timer2_pin_mask; -#if defined(__AVR_ATmega1280__) +#if defined(TIMSK3) volatile long timer3_toggle_count; volatile uint8_t *timer3_pin_port; volatile uint8_t timer3_pin_mask; +#endif + +#if defined(TIMSK4) volatile long timer4_toggle_count; volatile uint8_t *timer4_pin_port; volatile uint8_t timer4_pin_mask; +#endif + +#if defined(TIMSK5) volatile long timer5_toggle_count; volatile uint8_t *timer5_pin_port; volatile uint8_t timer5_pin_mask; #endif -#if defined(__AVR_ATmega1280__) +// MLS: This does not make sense, the 3 options are the same +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define AVAILABLE_TONE_PINS 1 @@ -133,7 +140,7 @@ static int8_t toneBegin(uint8_t _pin) // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar switch (_timer) { -#if !defined(__AVR_ATmega8__) + #if defined(TCCR0A) && defined(TCCR0B) case 0: // 8 bit timer TCCR0A = 0; @@ -143,8 +150,9 @@ static int8_t toneBegin(uint8_t _pin) timer0_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer0_pin_mask = digitalPinToBitMask(_pin); break; -#endif + #endif + #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12) case 1: // 16 bit timer TCCR1A = 0; @@ -154,6 +162,9 @@ static int8_t toneBegin(uint8_t _pin) timer1_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer1_pin_mask = digitalPinToBitMask(_pin); break; + #endif + + #if defined(TCCR2A) && defined(TCCR2B) case 2: // 8 bit timer TCCR2A = 0; @@ -163,8 +174,9 @@ static int8_t toneBegin(uint8_t _pin) timer2_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer2_pin_mask = digitalPinToBitMask(_pin); break; + #endif -#if defined(__AVR_ATmega1280__) + #if defined(TCCR3A) && defined(TCCR3B) && defined(TIMSK3) case 3: // 16 bit timer TCCR3A = 0; @@ -174,15 +186,27 @@ static int8_t toneBegin(uint8_t _pin) timer3_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer3_pin_mask = digitalPinToBitMask(_pin); break; + #endif + + #if defined(TCCR4A) && defined(TCCR4B) && defined(TIMSK4) case 4: // 16 bit timer TCCR4A = 0; TCCR4B = 0; - bitWrite(TCCR4B, WGM42, 1); + #if defined(WGM42) + bitWrite(TCCR4B, WGM42, 1); + #elif defined(CS43) + #warning this may not be correct + // atmega32u4 + bitWrite(TCCR4B, CS43, 1); + #endif bitWrite(TCCR4B, CS40, 1); timer4_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer4_pin_mask = digitalPinToBitMask(_pin); break; + #endif + + #if defined(TCCR5A) && defined(TCCR5B) && defined(TIMSK5) case 5: // 16 bit timer TCCR5A = 0; @@ -192,7 +216,7 @@ static int8_t toneBegin(uint8_t _pin) timer5_pin_port = portOutputRegister(digitalPinToPort(_pin)); timer5_pin_mask = digitalPinToBitMask(_pin); break; -#endif + #endif } } @@ -258,12 +282,22 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) } } -#if !defined(__AVR_ATmega8__) +#if defined(TCCR0B) if (_timer == 0) + { TCCR0B = prescalarbits; + } else #endif +#if defined(TCCR2B) + { TCCR2B = prescalarbits; + } +#else + { + // dummy place holder to make the above ifdefs work + } +#endif } else { @@ -278,12 +312,20 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) } if (_timer == 1) + { +#if defined(TCCR1B) TCCR1B = (TCCR1B & 0b11111000) | prescalarbits; -#if defined(__AVR_ATmega1280__) +#endif + } +#if defined(TCCR3B) else if (_timer == 3) TCCR3B = (TCCR3B & 0b11111000) | prescalarbits; +#endif +#if defined(TCCR4B) else if (_timer == 4) TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; +#endif +#if defined(TCCR5B) else if (_timer == 5) TCCR5B = (TCCR5B & 0b11111000) | prescalarbits; #endif @@ -307,7 +349,7 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) switch (_timer) { -#if !defined(__AVR_ATmega8__) +#if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A) case 0: OCR0A = ocr; timer0_toggle_count = toggle_count; @@ -316,27 +358,43 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) #endif case 1: +#if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A) OCR1A = ocr; timer1_toggle_count = toggle_count; bitWrite(TIMSK1, OCIE1A, 1); +#elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A) + // this combination is for at least the ATmega32 + OCR1A = ocr; + timer1_toggle_count = toggle_count; + bitWrite(TIMSK, OCIE1A, 1); +#endif break; + +#if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A) case 2: OCR2A = ocr; timer2_toggle_count = toggle_count; bitWrite(TIMSK2, OCIE2A, 1); break; +#endif -#if defined(__AVR_ATmega1280__) +#if defined(TIMSK3) case 3: OCR3A = ocr; timer3_toggle_count = toggle_count; bitWrite(TIMSK3, OCIE3A, 1); break; +#endif + +#if defined(TIMSK4) case 4: OCR4A = ocr; timer4_toggle_count = toggle_count; bitWrite(TIMSK4, OCIE4A, 1); break; +#endif + +#if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A) case 5: OCR5A = ocr; timer5_toggle_count = toggle_count; @@ -349,51 +407,75 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) } -void noTone(uint8_t _pin) +// XXX: this function only works properly for timer 2 (the only one we use +// currently). for the others, it should end the tone, but won't restore +// proper PWM functionality for the timer. +void disableTimer(uint8_t _timer) { - int8_t _timer = -1; - - for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { - if (tone_pins[i] == _pin) { - _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); - tone_pins[i] = 255; - } - } - switch (_timer) { -#if defined(__AVR_ATmega8__) - case 1: - bitWrite(TIMSK1, OCIE1A, 0); - break; - case 2: - bitWrite(TIMSK2, OCIE2A, 0); - break; - -#else case 0: - TIMSK0 = 0; + #if defined(TIMSK0) + TIMSK0 = 0; + #elif defined(TIMSK) + TIMSK = 0; // atmega32 + #endif break; + +#if defined(TIMSK1) && defined(OCIE1A) case 1: - TIMSK1 = 0; + bitWrite(TIMSK1, OCIE1A, 0); break; +#endif + case 2: - TIMSK2 = 0; + #if defined(TIMSK2) && defined(OCIE2A) + bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt + #endif + #if defined(TCCR2A) && defined(WGM20) + TCCR2A = (1 << WGM20); + #endif + #if defined(TCCR2B) && defined(CS22) + TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22); + #endif + #if defined(OCR2A) + OCR2A = 0; + #endif break; -#endif -#if defined(__AVR_ATmega1280__) +#if defined(TIMSK3) case 3: TIMSK3 = 0; break; +#endif + +#if defined(TIMSK4) case 4: TIMSK4 = 0; break; +#endif + +#if defined(TIMSK5) case 5: TIMSK5 = 0; break; #endif } +} + + +void noTone(uint8_t _pin) +{ + int8_t _timer = -1; + + for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { + if (tone_pins[i] == _pin) { + _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); + tone_pins[i] = 255; + } + } + + disableTimer(_timer); digitalWrite(_pin, 0); } @@ -412,7 +494,7 @@ ISR(TIMER0_COMPA_vect) } else { - TIMSK0 = 0; // disable the interrupt + disableTimer(0); *timer0_pin_port &= ~(timer0_pin_mask); // keep pin low after stop } } @@ -431,7 +513,7 @@ ISR(TIMER1_COMPA_vect) } else { - TIMSK1 = 0; // disable the interrupt + disableTimer(1); *timer1_pin_port &= ~(timer1_pin_mask); // keep pin low after stop } } @@ -451,14 +533,18 @@ ISR(TIMER2_COMPA_vect) } else { - TIMSK2 = 0; // disable the interrupt - *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop + // need to call noTone() so that the tone_pins[] entry is reset, so the + // timer gets initialized next time we call tone(). + // XXX: this assumes timer 2 is always the first one used. + noTone(tone_pins[0]); +// disableTimer(2); +// *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop } } -//#if defined(__AVR_ATmega1280__) +//#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #if 0 ISR(TIMER3_COMPA_vect) @@ -473,7 +559,7 @@ ISR(TIMER3_COMPA_vect) } else { - TIMSK3 = 0; // disable the interrupt + disableTimer(3); *timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop } } @@ -490,7 +576,7 @@ ISR(TIMER4_COMPA_vect) } else { - TIMSK4 = 0; // disable the interrupt + disableTimer(4); *timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop } } @@ -507,7 +593,7 @@ ISR(TIMER5_COMPA_vect) } else { - TIMSK5 = 0; // disable the interrupt + disableTimer(5); *timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop } } diff --git a/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WCharacter.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WCharacter.h new file mode 100644 index 0000000..79733b5 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WCharacter.h @@ -0,0 +1,168 @@ +/* + WCharacter.h - Character utility functions for Wiring & Arduino + Copyright (c) 2010 Hernando Barragan. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef Character_h +#define Character_h + +#include + +// WCharacter.h prototypes +inline boolean isAlphaNumeric(int c) __attribute__((always_inline)); +inline boolean isAlpha(int c) __attribute__((always_inline)); +inline boolean isAscii(int c) __attribute__((always_inline)); +inline boolean isWhitespace(int c) __attribute__((always_inline)); +inline boolean isControl(int c) __attribute__((always_inline)); +inline boolean isDigit(int c) __attribute__((always_inline)); +inline boolean isGraph(int c) __attribute__((always_inline)); +inline boolean isLowerCase(int c) __attribute__((always_inline)); +inline boolean isPrintable(int c) __attribute__((always_inline)); +inline boolean isPunct(int c) __attribute__((always_inline)); +inline boolean isSpace(int c) __attribute__((always_inline)); +inline boolean isUpperCase(int c) __attribute__((always_inline)); +inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); +inline int toAscii(int c) __attribute__((always_inline)); +inline int toLowerCase(int c) __attribute__((always_inline)); +inline int toUpperCase(int c)__attribute__((always_inline)); + + +// Checks for an alphanumeric character. +// It is equivalent to (isalpha(c) || isdigit(c)). +inline boolean isAlphaNumeric(int c) +{ + return ( isalnum(c) == 0 ? false : true); +} + + +// Checks for an alphabetic character. +// It is equivalent to (isupper(c) || islower(c)). +inline boolean isAlpha(int c) +{ + return ( isalpha(c) == 0 ? false : true); +} + + +// Checks whether c is a 7-bit unsigned char value +// that fits into the ASCII character set. +inline boolean isAscii(int c) +{ + return ( isascii (c) == 0 ? false : true); +} + + +// Checks for a blank character, that is, a space or a tab. +inline boolean isWhitespace(int c) +{ + return ( isblank (c) == 0 ? false : true); +} + + +// Checks for a control character. +inline boolean isControl(int c) +{ + return ( iscntrl (c) == 0 ? false : true); +} + + +// Checks for a digit (0 through 9). +inline boolean isDigit(int c) +{ + return ( isdigit (c) == 0 ? false : true); +} + + +// Checks for any printable character except space. +inline boolean isGraph(int c) +{ + return ( isgraph (c) == 0 ? false : true); +} + + +// Checks for a lower-case character. +inline boolean isLowerCase(int c) +{ + return (islower (c) == 0 ? false : true); +} + + +// Checks for any printable character including space. +inline boolean isPrintable(int c) +{ + return ( isprint (c) == 0 ? false : true); +} + + +// Checks for any printable character which is not a space +// or an alphanumeric character. +inline boolean isPunct(int c) +{ + return ( ispunct (c) == 0 ? false : true); +} + + +// Checks for white-space characters. For the avr-libc library, +// these are: space, formfeed ('\f'), newline ('\n'), carriage +// return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). +inline boolean isSpace(int c) +{ + return ( isspace (c) == 0 ? false : true); +} + + +// Checks for an uppercase letter. +inline boolean isUpperCase(int c) +{ + return ( isupper (c) == 0 ? false : true); +} + + +// Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7 +// 8 9 a b c d e f A B C D E F. +inline boolean isHexadecimalDigit(int c) +{ + return ( isxdigit (c) == 0 ? false : true); +} + + +// Converts c to a 7-bit unsigned char value that fits into the +// ASCII character set, by clearing the high-order bits. +inline int toAscii(int c) +{ + return toascii (c); +} + + +// Warning: +// Many people will be unhappy if you use this function. +// This function will convert accented letters into random +// characters. + +// Converts the letter c to lower case, if possible. +inline int toLowerCase(int c) +{ + return tolower (c); +} + + +// Converts the letter c to upper case, if possible. +inline int toUpperCase(int c) +{ + return toupper (c); +} + +#endif \ No newline at end of file diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/WConstants.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WConstants.h similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/WConstants.h rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/WConstants.h diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/WInterrupts.c b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WInterrupts.c old mode 100755 new mode 100644 similarity index 74% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/WInterrupts.c rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/WInterrupts.c index 69a78b0..3b3e0c9 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/WInterrupts.c +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WInterrupts.c @@ -21,6 +21,7 @@ Boston, MA 02111-1307 USA Modified 24 November 2006 by David A. Mellis + Modified 1 August 2010 by Mark Sproul */ #include @@ -35,11 +36,6 @@ volatile static voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS]; // volatile static voidFuncPtr twiIntFunc; -#if defined(__AVR_ATmega8__) -#define EICRA MCUCR -#define EIMSK GICR -#endif - void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { intFunc[interruptNum] = userFunc; @@ -52,7 +48,7 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { // Enable the interrupt. switch (interruptNum) { -#if defined(__AVR_ATmega1280__) +#if defined(EICRA) && defined(EICRB) && defined(EIMSK) case 2: EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); EIMSK |= (1 << INT0); @@ -87,12 +83,33 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { break; #else case 0: + #if defined(EICRA) && defined(ISC00) && defined(EIMSK) EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); EIMSK |= (1 << INT0); + #elif defined(MCUCR) && defined(ISC00) && defined(GICR) + MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + GICR |= (1 << INT0); + #elif defined(MCUCR) && defined(ISC00) && defined(GIMSK) + MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + GIMSK |= (1 << INT0); + #else + #error attachInterrupt not finished for this CPU (case 0) + #endif break; + case 1: + #if defined(EICRA) && defined(ISC10) && defined(ISC11) && defined(EIMSK) EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); EIMSK |= (1 << INT1); + #elif defined(MCUCR) && defined(ISC10) && defined(ISC11) && defined(GICR) + MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + GICR |= (1 << INT1); + #elif defined(MCUCR) && defined(ISC10) && defined(GIMSK) && defined(GIMSK) + MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + GIMSK |= (1 << INT1); + #else + #warning attachInterrupt may need some more work for this cpu (case 1) + #endif break; #endif } @@ -105,7 +122,7 @@ void detachInterrupt(uint8_t interruptNum) { // to the number of the EIMSK bit to clear, as this isn't true on the // ATmega8. There, INT0 is 6 and INT1 is 7.) switch (interruptNum) { -#if defined(__AVR_ATmega1280__) +#if defined(EICRA) && defined(EICRB) && defined(EIMSK) case 2: EIMSK &= ~(1 << INT0); break; @@ -132,10 +149,27 @@ void detachInterrupt(uint8_t interruptNum) { break; #else case 0: + #if defined(EIMSK) && defined(INT0) EIMSK &= ~(1 << INT0); + #elif defined(GICR) && defined(ISC00) + GICR &= ~(1 << INT0); // atmega32 + #elif defined(GIMSK) && defined(INT0) + GIMSK &= ~(1 << INT0); + #else + #error detachInterrupt not finished for this cpu + #endif break; + case 1: + #if defined(EIMSK) && defined(INT1) EIMSK &= ~(1 << INT1); + #elif defined(GICR) && defined(INT1) + GICR &= ~(1 << INT1); // atmega32 + #elif defined(GIMSK) && defined(INT1) + GIMSK &= ~(1 << INT1); + #else + #warning detachInterrupt may need some more work for this cpu (case 1) + #endif break; #endif } @@ -150,7 +184,7 @@ void attachInterruptTwi(void (*userFunc)(void) ) { } */ -#if defined(__AVR_ATmega1280__) +#if defined(EICRA) && defined(EICRB) SIGNAL(INT0_vect) { if(intFunc[EXTERNAL_INT_2]) diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/WMath.cpp b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WMath.cpp similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/WMath.cpp rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/WMath.cpp diff --git a/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WProgram.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WProgram.h new file mode 100644 index 0000000..f73e760 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WProgram.h @@ -0,0 +1,63 @@ +#ifndef WProgram_h +#define WProgram_h + +#include +#include +#include + +#include + +#include "wiring.h" + +#ifdef __cplusplus +#include "WCharacter.h" +#include "WString.h" +#include "HardwareSerial.h" + +uint16_t makeWord(uint16_t w); +uint16_t makeWord(byte h, byte l); + +#define word(...) makeWord(__VA_ARGS__) + +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); + +void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); +void noTone(uint8_t _pin); + +// WMath prototypes +long random(long); +long random(long, long); +void randomSeed(unsigned int); +long map(long, long, long, long, long); + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +const static uint8_t A0 = 54; +const static uint8_t A1 = 55; +const static uint8_t A2 = 56; +const static uint8_t A3 = 57; +const static uint8_t A4 = 58; +const static uint8_t A5 = 59; +const static uint8_t A6 = 60; +const static uint8_t A7 = 61; +const static uint8_t A8 = 62; +const static uint8_t A9 = 63; +const static uint8_t A10 = 64; +const static uint8_t A11 = 65; +const static uint8_t A12 = 66; +const static uint8_t A13 = 67; +const static uint8_t A14 = 68; +const static uint8_t A15 = 69; +#else +const static uint8_t A0 = 14; +const static uint8_t A1 = 15; +const static uint8_t A2 = 16; +const static uint8_t A3 = 17; +const static uint8_t A4 = 18; +const static uint8_t A5 = 19; +const static uint8_t A6 = 20; +const static uint8_t A7 = 21; +#endif + +#endif + +#endif \ No newline at end of file diff --git a/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.cpp b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.cpp new file mode 100644 index 0000000..db5a441 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.cpp @@ -0,0 +1,443 @@ +/* + WString.cpp - String library for Wiring & Arduino + Copyright (c) 2009-10 Hernando Barragan. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include "WProgram.h" +#include "WString.h" + + +String::String( const char *value ) +{ + if ( value == NULL ) + value = ""; + getBuffer( _length = strlen( value ) ); + if ( _buffer != NULL ) + strcpy( _buffer, value ); +} + +String::String( const String &value ) +{ + getBuffer( _length = value._length ); + if ( _buffer != NULL ) + strcpy( _buffer, value._buffer ); +} + +String::String( const char value ) +{ + _length = 1; + getBuffer(1); + if ( _buffer != NULL ) { + _buffer[0] = value; + _buffer[1] = 0; + } +} + +String::String( const unsigned char value ) +{ + _length = 1; + getBuffer(1); + if ( _buffer != NULL) { + _buffer[0] = value; + _buffer[1] = 0; + } +} + +String::String( const int value, const int base ) +{ + char buf[33]; + itoa((signed long)value, buf, base); + getBuffer( _length = strlen(buf) ); + if ( _buffer != NULL ) + strcpy( _buffer, buf ); +} + +String::String( const unsigned int value, const int base ) +{ + char buf[33]; + ultoa((unsigned long)value, buf, base); + getBuffer( _length = strlen(buf) ); + if ( _buffer != NULL ) + strcpy( _buffer, buf ); +} + +String::String( const long value, const int base ) +{ + char buf[33]; + ltoa(value, buf, base); + getBuffer( _length = strlen(buf) ); + if ( _buffer != NULL ) + strcpy( _buffer, buf ); +} + +String::String( const unsigned long value, const int base ) +{ + char buf[33]; + ultoa(value, buf, 10); + getBuffer( _length = strlen(buf) ); + if ( _buffer != NULL ) + strcpy( _buffer, buf ); +} + +char String::charAt( unsigned int loc ) const +{ + return operator[]( loc ); +} + +void String::setCharAt( unsigned int loc, const char aChar ) +{ + if(_buffer == NULL) return; + if(_length > loc) { + _buffer[loc] = aChar; + } +} + +int String::compareTo( const String &s2 ) const +{ + return strcmp( _buffer, s2._buffer ); +} + +const String & String::concat( const String &s2 ) +{ + return (*this) += s2; +} + +const String & String::operator=( const String &rhs ) +{ + if ( this == &rhs ) + return *this; + + if ( rhs._length > _length ) + { + free(_buffer); + getBuffer( rhs._length ); + } + + if ( _buffer != NULL ) { + _length = rhs._length; + strcpy( _buffer, rhs._buffer ); + } + return *this; +} + +//const String & String::operator+=( const char aChar ) +//{ +// if ( _length == _capacity ) +// doubleBuffer(); +// +// _buffer[ _length++ ] = aChar; +// _buffer[ _length ] = '\0'; +// return *this; +//} + +const String & String::operator+=( const String &other ) +{ + _length += other._length; + if ( _length > _capacity ) + { + char *temp = (char *)realloc(_buffer, _length + 1); + if ( temp != NULL ) { + _buffer = temp; + _capacity = _length; + } else { + _length -= other._length; + return *this; + } + } + strcat( _buffer, other._buffer ); + return *this; +} + + +int String::operator==( const String &rhs ) const +{ + return ( _length == rhs._length && strcmp( _buffer, rhs._buffer ) == 0 ); +} + +int String::operator!=( const String &rhs ) const +{ + return ( _length != rhs.length() || strcmp( _buffer, rhs._buffer ) != 0 ); +} + +int String::operator<( const String &rhs ) const +{ + return strcmp( _buffer, rhs._buffer ) < 0; +} + +int String::operator>( const String &rhs ) const +{ + return strcmp( _buffer, rhs._buffer ) > 0; +} + +int String::operator<=( const String &rhs ) const +{ + return strcmp( _buffer, rhs._buffer ) <= 0; +} + +int String::operator>=( const String & rhs ) const +{ + return strcmp( _buffer, rhs._buffer ) >= 0; +} + +char & String::operator[]( unsigned int index ) +{ + static char dummy_writable_char; + if (index >= _length || !_buffer) { + dummy_writable_char = 0; + return dummy_writable_char; + } + return _buffer[ index ]; +} + +char String::operator[]( unsigned int index ) const +{ + // need to check for valid index, to do later + return _buffer[ index ]; +} + +boolean String::endsWith( const String &s2 ) const +{ + if ( _length < s2._length ) + return 0; + + return strcmp( &_buffer[ _length - s2._length], s2._buffer ) == 0; +} + +boolean String::equals( const String &s2 ) const +{ + return ( _length == s2._length && strcmp( _buffer,s2._buffer ) == 0 ); +} + +boolean String::equalsIgnoreCase( const String &s2 ) const +{ + if ( this == &s2 ) + return true; //1; + else if ( _length != s2._length ) + return false; //0; + + return strcmp(toLowerCase()._buffer, s2.toLowerCase()._buffer) == 0; +} + +String String::replace( char findChar, char replaceChar ) +{ + if ( _buffer == NULL ) return *this; + String theReturn = _buffer; + char* temp = theReturn._buffer; + while( (temp = strchr( temp, findChar )) != 0 ) + *temp = replaceChar; + + return theReturn; +} + +String String::replace( const String& match, const String& replace ) +{ + if ( _buffer == NULL ) return *this; + String temp = _buffer, newString; + + int loc; + while ( (loc = temp.indexOf( match )) != -1 ) + { + newString += temp.substring( 0, loc ); + newString += replace; + temp = temp.substring( loc + match._length ); + } + newString += temp; + return newString; +} + +int String::indexOf( char temp ) const +{ + return indexOf( temp, 0 ); +} + +int String::indexOf( char ch, unsigned int fromIndex ) const +{ + if ( fromIndex >= _length ) + return -1; + + const char* temp = strchr( &_buffer[fromIndex], ch ); + if ( temp == NULL ) + return -1; + + return temp - _buffer; +} + +int String::indexOf( const String &s2 ) const +{ + return indexOf( s2, 0 ); +} + +int String::indexOf( const String &s2, unsigned int fromIndex ) const +{ + if ( fromIndex >= _length ) + return -1; + + const char *theFind = strstr( &_buffer[ fromIndex ], s2._buffer ); + + if ( theFind == NULL ) + return -1; + + return theFind - _buffer; // pointer subtraction +} + +int String::lastIndexOf( char theChar ) const +{ + return lastIndexOf( theChar, _length - 1 ); +} + +int String::lastIndexOf( char ch, unsigned int fromIndex ) const +{ + if ( fromIndex >= _length ) + return -1; + + char tempchar = _buffer[fromIndex + 1]; + _buffer[fromIndex + 1] = '\0'; + char* temp = strrchr( _buffer, ch ); + _buffer[fromIndex + 1] = tempchar; + + if ( temp == NULL ) + return -1; + + return temp - _buffer; +} + +int String::lastIndexOf( const String &s2 ) const +{ + return lastIndexOf( s2, _length - s2._length ); +} + +int String::lastIndexOf( const String &s2, unsigned int fromIndex ) const +{ + // check for empty strings + if ( s2._length == 0 || s2._length - 1 > fromIndex || fromIndex >= _length ) + return -1; + + // matching first character + char temp = s2[ 0 ]; + + for ( int i = fromIndex; i >= 0; i-- ) + { + if ( _buffer[ i ] == temp && (*this).substring( i, i + s2._length ).equals( s2 ) ) + return i; + } + return -1; +} + +boolean String::startsWith( const String &s2 ) const +{ + if ( _length < s2._length ) + return 0; + + return startsWith( s2, 0 ); +} + +boolean String::startsWith( const String &s2, unsigned int offset ) const +{ + if ( offset > _length - s2._length ) + return 0; + + return strncmp( &_buffer[offset], s2._buffer, s2._length ) == 0; +} + +String String::substring( unsigned int left ) const +{ + return substring( left, _length ); +} + +String String::substring( unsigned int left, unsigned int right ) const +{ + if ( left > right ) + { + int temp = right; + right = left; + left = temp; + } + + if ( right > _length ) + { + right = _length; + } + + char temp = _buffer[ right ]; // save the replaced character + _buffer[ right ] = '\0'; + String outPut = ( _buffer + left ); // pointer arithmetic + _buffer[ right ] = temp; //restore character + return outPut; +} + +String String::toLowerCase() const +{ + String temp = _buffer; + + for ( unsigned int i = 0; i < _length; i++ ) + temp._buffer[ i ] = (char)tolower( temp._buffer[ i ] ); + return temp; +} + +String String::toUpperCase() const +{ + String temp = _buffer; + + for ( unsigned int i = 0; i < _length; i++ ) + temp._buffer[ i ] = (char)toupper( temp._buffer[ i ] ); + return temp; +} + +String String::trim() const +{ + if ( _buffer == NULL ) return *this; + String temp = _buffer; + unsigned int i,j; + + for ( i = 0; i < _length; i++ ) + { + if ( !isspace(_buffer[i]) ) + break; + } + + for ( j = temp._length - 1; j > i; j-- ) + { + if ( !isspace(_buffer[j]) ) + break; + } + + return temp.substring( i, j + 1); +} + +void String::getBytes(unsigned char *buf, unsigned int bufsize) +{ + if (!bufsize || !buf) return; + unsigned int len = bufsize - 1; + if (len > _length) len = _length; + strncpy((char *)buf, _buffer, len); + buf[len] = 0; +} + +void String::toCharArray(char *buf, unsigned int bufsize) +{ + if (!bufsize || !buf) return; + unsigned int len = bufsize - 1; + if (len > _length) len = _length; + strncpy(buf, _buffer, len); + buf[len] = 0; +} + + +long String::toInt() { + return atol(_buffer); +} diff --git a/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.h new file mode 100644 index 0000000..cadddb9 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/WString.h @@ -0,0 +1,112 @@ +/* + WString.h - String library for Wiring & Arduino + Copyright (c) 2009-10 Hernando Barragan. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef String_h +#define String_h + +//#include "WProgram.h" +#include +#include +#include + +class String +{ + public: + // constructors + String( const char *value = "" ); + String( const String &value ); + String( const char ); + String( const unsigned char ); + String( const int, const int base=10); + String( const unsigned int, const int base=10 ); + String( const long, const int base=10 ); + String( const unsigned long, const int base=10 ); + ~String() { free(_buffer); _length = _capacity = 0;} //added _length = _capacity = 0; + + // operators + const String & operator = ( const String &rhs ); + const String & operator +=( const String &rhs ); + //const String & operator +=( const char ); + int operator ==( const String &rhs ) const; + int operator !=( const String &rhs ) const; + int operator < ( const String &rhs ) const; + int operator > ( const String &rhs ) const; + int operator <=( const String &rhs ) const; + int operator >=( const String &rhs ) const; + char operator []( unsigned int index ) const; + char& operator []( unsigned int index ); + //operator const char *() const { return _buffer; } + + // general methods + char charAt( unsigned int index ) const; + int compareTo( const String &anotherString ) const; + unsigned char endsWith( const String &suffix ) const; + unsigned char equals( const String &anObject ) const; + unsigned char equalsIgnoreCase( const String &anotherString ) const; + int indexOf( char ch ) const; + int indexOf( char ch, unsigned int fromIndex ) const; + int indexOf( const String &str ) const; + int indexOf( const String &str, unsigned int fromIndex ) const; + int lastIndexOf( char ch ) const; + int lastIndexOf( char ch, unsigned int fromIndex ) const; + int lastIndexOf( const String &str ) const; + int lastIndexOf( const String &str, unsigned int fromIndex ) const; + const unsigned int length( ) const { return _length; } + void setCharAt(unsigned int index, const char ch); + unsigned char startsWith( const String &prefix ) const; + unsigned char startsWith( const String &prefix, unsigned int toffset ) const; + String substring( unsigned int beginIndex ) const; + String substring( unsigned int beginIndex, unsigned int endIndex ) const; + String toLowerCase( ) const; + String toUpperCase( ) const; + String trim( ) const; + void getBytes(unsigned char *buf, unsigned int bufsize); + void toCharArray(char *buf, unsigned int bufsize); + long toInt( ); + const String& concat( const String &str ); + String replace( char oldChar, char newChar ); + String replace( const String& match, const String& replace ); + friend String operator + ( String lhs, const String &rhs ); + + protected: + char *_buffer; // the actual char array + unsigned int _capacity; // the array length minus one (for the '\0') + unsigned int _length; // the String length (not counting the '\0') + + void getBuffer(unsigned int maxStrLen); + + private: + +}; + +// allocate buffer space +inline void String::getBuffer(unsigned int maxStrLen) +{ + _capacity = maxStrLen; + _buffer = (char *) malloc(_capacity + 1); + if (_buffer == NULL) _length = _capacity = 0; +} + +inline String operator+( String lhs, const String &rhs ) +{ + return lhs += rhs; +} + + +#endif diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/binary.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/binary.h similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/binary.h rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/binary.h diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/main.cpp b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/main.cpp old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/main.cpp rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/main.cpp diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/pins_arduino.c b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/pins_arduino.c old mode 100755 new mode 100644 similarity index 97% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/pins_arduino.c rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/pins_arduino.c index d7b076d..0c816e9 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/pins_arduino.c +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/pins_arduino.c @@ -19,7 +19,7 @@ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $Id: pins_arduino.c 804 2009-12-18 16:05:52Z dmellis $ + $Id$ */ #include @@ -77,12 +77,8 @@ #define PK 11 #define PL 12 -#define REPEAT8(x) x, x, x, x, x, x, x, x -#define BV0TO7 _BV(0), _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7) -#define BV7TO0 _BV(7), _BV(6), _BV(5), _BV(4), _BV(3), _BV(2), _BV(1), _BV(0) - -#if defined(__AVR_ATmega1280__) +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) const uint16_t PROGMEM port_to_mode_PGM[] = { NOT_A_PORT, &DDRA, diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/pins_arduino.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/pins_arduino.h similarity index 88% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/pins_arduino.h rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/pins_arduino.h index c7e40fd..bc931c5 100644 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/pins_arduino.h +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/pins_arduino.h @@ -49,6 +49,18 @@ #define TIMER5B 15 #define TIMER5C 16 +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +const static uint8_t SS = 53; +const static uint8_t MOSI = 51; +const static uint8_t MISO = 50; +const static uint8_t SCK = 52; +#else +const static uint8_t SS = 10; +const static uint8_t MOSI = 11; +const static uint8_t MISO = 12; +const static uint8_t SCK = 13; +#endif + // On the ATmega1280, the addresses of some of the port registers are // greater than 255, so we can't store them in uint8_t's. extern const uint16_t PROGMEM port_to_mode_PGM[]; diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring.c b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring.c old mode 100755 new mode 100644 similarity index 73% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring.c rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring.c index d857e8a..b90d07e --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring.c +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring.c @@ -19,7 +19,7 @@ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $Id: wiring.c 808 2009-12-18 17:44:08Z dmellis $ + $Id$ */ #include "wiring_private.h" @@ -80,7 +80,14 @@ unsigned long micros() { cli(); m = timer0_overflow_count; +#if defined(TCNT0) t = TCNT0; +#elif defined(TCNT0L) + t = TCNT0L; +#else + #error TIMER 0 not defined +#endif + #ifdef TIFR0 if ((TIFR0 & _BV(TOV0)) && (t < 255)) @@ -97,10 +104,14 @@ unsigned long micros() { void delay(unsigned long ms) { - unsigned long start = millis(); - - while (millis() - start <= ms) - ; + uint16_t start = (uint16_t)micros(); + + while (ms > 0) { + if (((uint16_t)micros() - start) >= 1000) { + ms--; + start += 1000; + } + } } /* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock. */ @@ -162,23 +173,38 @@ void init() // on the ATmega168, timer 0 is also used for fast hardware pwm // (using phase-correct PWM would mean that timer 0 overflowed half as often // resulting in different millis() behavior on the ATmega8 and ATmega168) -#if !defined(__AVR_ATmega8__) +#if defined(TCCR0A) && defined(WGM01) sbi(TCCR0A, WGM01); sbi(TCCR0A, WGM00); #endif + // set timer 0 prescale factor to 64 -#if defined(__AVR_ATmega8__) +#if defined(__AVR_ATmega128__) + // CPU specific: different values for the ATmega128 + sbi(TCCR0, CS02); +#elif defined(TCCR0) && defined(CS01) && defined(CS00) + // this combination is for the standard atmega8 sbi(TCCR0, CS01); sbi(TCCR0, CS00); -#else +#elif defined(TCCR0B) && defined(CS01) && defined(CS00) + // this combination is for the standard 168/328/1280/2560 sbi(TCCR0B, CS01); sbi(TCCR0B, CS00); +#elif defined(TCCR0A) && defined(CS01) && defined(CS00) + // this combination is for the __AVR_ATmega645__ series + sbi(TCCR0A, CS01); + sbi(TCCR0A, CS00); +#else + #error Timer 0 prescale factor 64 not set correctly #endif + // enable timer 0 overflow interrupt -#if defined(__AVR_ATmega8__) +#if defined(TIMSK) && defined(TOIE0) sbi(TIMSK, TOIE0); -#else +#elif defined(TIMSK0) && defined(TOIE0) sbi(TIMSK0, TOIE0); +#else + #error Timer 0 overflow interrupt not set correctly #endif // timers 1 and 2 are used for phase-correct hardware pwm @@ -186,36 +212,60 @@ void init() // note, however, that fast pwm mode can achieve a frequency of up // 8 MHz (with a 16 MHz clock) at 50% duty cycle + TCCR1B = 0; + // set timer 1 prescale factor to 64 +#if defined(TCCR1B) && defined(CS11) && defined(CS10) sbi(TCCR1B, CS11); sbi(TCCR1B, CS10); +#elif defined(TCCR1) && defined(CS11) && defined(CS10) + sbi(TCCR1, CS11); + sbi(TCCR1, CS10); +#endif // put timer 1 in 8-bit phase correct pwm mode +#if defined(TCCR1A) && defined(WGM10) sbi(TCCR1A, WGM10); +#elif defined(TCCR1) + #warning this needs to be finished +#endif // set timer 2 prescale factor to 64 -#if defined(__AVR_ATmega8__) +#if defined(TCCR2) && defined(CS22) sbi(TCCR2, CS22); -#else +#elif defined(TCCR2B) && defined(CS22) sbi(TCCR2B, CS22); +#else + #warning Timer 2 not finished (may not be present on this CPU) #endif + // configure timer 2 for phase correct pwm (8-bit) -#if defined(__AVR_ATmega8__) +#if defined(TCCR2) && defined(WGM20) sbi(TCCR2, WGM20); -#else +#elif defined(TCCR2A) && defined(WGM20) sbi(TCCR2A, WGM20); +#else + #warning Timer 2 not finished (may not be present on this CPU) #endif -#if defined(__AVR_ATmega1280__) - // set timer 3, 4, 5 prescale factor to 64 - sbi(TCCR3B, CS31); sbi(TCCR3B, CS30); - sbi(TCCR4B, CS41); sbi(TCCR4B, CS40); - sbi(TCCR5B, CS51); sbi(TCCR5B, CS50); - // put timer 3, 4, 5 in 8-bit phase correct pwm mode - sbi(TCCR3A, WGM30); - sbi(TCCR4A, WGM40); - sbi(TCCR5A, WGM50); +#if defined(TCCR3B) && defined(CS31) && defined(WGM30) + sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64 + sbi(TCCR3B, CS30); + sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode +#endif + +#if defined(TCCR4B) && defined(CS41) && defined(WGM40) + sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 + sbi(TCCR4B, CS40); + sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode +#endif + +#if defined(TCCR5B) && defined(CS51) && defined(WGM50) + sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 + sbi(TCCR5B, CS50); + sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode #endif +#if defined(ADCSRA) // set a2d prescale factor to 128 // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. // XXX: this will not work properly for other clock speeds, and @@ -226,13 +276,14 @@ void init() // enable a2d conversions sbi(ADCSRA, ADEN); +#endif // the bootloader connects pins 0 and 1 to the USART; disconnect them // here so they can be used as normal digital i/o; they will be // reconnected in Serial.begin() -#if defined(__AVR_ATmega8__) +#if defined(UCSRB) UCSRB = 0; -#else +#elif defined(UCSR0B) UCSR0B = 0; #endif -} \ No newline at end of file +} diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring.h old mode 100755 new mode 100644 similarity index 89% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring.h rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring.h index 8b42629..e29959b --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring.h +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring.h @@ -19,13 +19,14 @@ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $Id: wiring.h 804 2009-12-18 16:05:52Z dmellis $ + $Id$ */ #ifndef Wiring_h #define Wiring_h #include +#include #include "binary.h" #ifdef __cplusplus @@ -57,7 +58,12 @@ extern "C"{ #define FALLING 2 #define RISING 3 +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define INTERNAL1V1 2 +#define INTERNAL2V56 3 +#else #define INTERNAL 3 +#endif #define DEFAULT 1 #define EXTERNAL 0 @@ -79,8 +85,8 @@ extern "C"{ #define noInterrupts() cli() #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) -#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) -#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) +#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) ) +#define microsecondsToClockCycles(a) ( ((a) * (F_CPU / 1000L)) / 1000L ) #define lowByte(w) ((uint8_t) ((w) & 0xff)) #define highByte(w) ((uint8_t) ((w) >> 8)) @@ -90,6 +96,7 @@ extern "C"{ #define bitClear(value, bit) ((value) &= ~(1UL << (bit))) #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + typedef unsigned int word; #define bit(b) (1UL << (b)) @@ -106,19 +113,14 @@ int analogRead(uint8_t); void analogReference(uint8_t mode); void analogWrite(uint8_t, int); -void beginSerial(long); -void serialWrite(unsigned char); -int serialAvailable(void); -int serialRead(void); -void serialFlush(void); - unsigned long millis(void); unsigned long micros(void); void delay(unsigned long); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); -void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val); +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); void attachInterrupt(uint8_t, void (*)(void), int mode); void detachInterrupt(uint8_t); diff --git a/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c new file mode 100644 index 0000000..d248f4c --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_analog.c @@ -0,0 +1,259 @@ +/* + wiring_analog.c - analog input and output + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 28 September 2010 by Mark Sproul + + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + +uint8_t analog_reference = DEFAULT; + +void analogReference(uint8_t mode) +{ + // can't actually set the register here because the default setting + // will connect AVCC and the AREF pin, which would cause a short if + // there's something connected to AREF. + analog_reference = mode; +} + +int analogRead(uint8_t pin) +{ + uint8_t low, high; + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + if (pin >= 54) pin -= 54; // allow for channel or pin numbers +#else + if (pin >= 14) pin -= 14; // allow for channel or pin numbers +#endif + +#if defined(ADCSRB) && defined(MUX5) + // the MUX5 bit of ADCSRB selects whether we're reading from channels + // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). + ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); +#endif + + // set the analog reference (high two bits of ADMUX) and select the + // channel (low 4 bits). this also sets ADLAR (left-adjust result) + // to 0 (the default). +#if defined(ADMUX) + ADMUX = (analog_reference << 6) | (pin & 0x07); +#endif + + // without a delay, we seem to read from the wrong channel + //delay(1); + +#if defined(ADCSRA) && defined(ADCL) + // start the conversion + sbi(ADCSRA, ADSC); + + // ADSC is cleared when the conversion finishes + while (bit_is_set(ADCSRA, ADSC)); + + // we have to read ADCL first; doing so locks both ADCL + // and ADCH until ADCH is read. reading ADCL second would + // cause the results of each conversion to be discarded, + // as ADCL and ADCH would be locked when it completed. + low = ADCL; + high = ADCH; +#else + // we dont have an ADC, return 0 + low = 0; + high = 0; +#endif + + // combine the two bytes + return (high << 8) | low; +} + +// Right now, PWM output only works on the pins with +// hardware support. These are defined in the appropriate +// pins_*.c file. For the rest of the pins, we default +// to digital output. +void analogWrite(uint8_t pin, int val) +{ + // We need to make sure the PWM output is enabled for those pins + // that support it, as we turn it off when digitally reading or + // writing with them. Also, make sure the pin is in output mode + // for consistenty with Wiring, which doesn't require a pinMode + // call for the analog output pins. + pinMode(pin, OUTPUT); + if (val == 0) + { + digitalWrite(pin, LOW); + } + else if (val == 255) + { + digitalWrite(pin, HIGH); + } + else + { + switch(digitalPinToTimer(pin)) + { + // XXX fix needed for atmega8 + #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__) + case TIMER0A: + // connect pwm to pin on timer 0 + sbi(TCCR0, COM00); + OCR0 = val; // set pwm duty + break; + #endif + + #if defined(TCCR0A) && defined(COM0A1) + case TIMER0A: + // connect pwm to pin on timer 0, channel A + sbi(TCCR0A, COM0A1); + OCR0A = val; // set pwm duty + break; + #endif + + #if defined(TCCR0A) && defined(COM0B1) + case TIMER0B: + // connect pwm to pin on timer 0, channel B + sbi(TCCR0A, COM0B1); + OCR0B = val; // set pwm duty + break; + #endif + + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: + // connect pwm to pin on timer 1, channel A + sbi(TCCR1A, COM1A1); + OCR1A = val; // set pwm duty + break; + #endif + + #if defined(TCCR1A) && defined(COM1B1) + case TIMER1B: + // connect pwm to pin on timer 1, channel B + sbi(TCCR1A, COM1B1); + OCR1B = val; // set pwm duty + break; + #endif + + #if defined(TCCR2) && defined(COM21) + case TIMER2: + // connect pwm to pin on timer 2 + sbi(TCCR2, COM21); + OCR2 = val; // set pwm duty + break; + #endif + + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: + // connect pwm to pin on timer 2, channel A + sbi(TCCR2A, COM2A1); + OCR2A = val; // set pwm duty + break; + #endif + + #if defined(TCCR2A) && defined(COM2B1) + case TIMER2B: + // connect pwm to pin on timer 2, channel B + sbi(TCCR2A, COM2B1); + OCR2B = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: + // connect pwm to pin on timer 3, channel A + sbi(TCCR3A, COM3A1); + OCR3A = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3B1) + case TIMER3B: + // connect pwm to pin on timer 3, channel B + sbi(TCCR3A, COM3B1); + OCR3B = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3C1) + case TIMER3C: + // connect pwm to pin on timer 3, channel C + sbi(TCCR3A, COM3C1); + OCR3C = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4A1) + case TIMER4A: + // connect pwm to pin on timer 4, channel A + sbi(TCCR4A, COM4A1); + OCR4A = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4B1) + case TIMER4B: + // connect pwm to pin on timer 4, channel B + sbi(TCCR4A, COM4B1); + OCR4B = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4C1) + case TIMER4C: + // connect pwm to pin on timer 4, channel C + sbi(TCCR4A, COM4C1); + OCR4C = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5A1) + case TIMER5A: + // connect pwm to pin on timer 5, channel A + sbi(TCCR5A, COM5A1); + OCR5A = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5B1) + case TIMER5B: + // connect pwm to pin on timer 5, channel B + sbi(TCCR5A, COM5B1); + OCR5B = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5C1) + case TIMER5C: + // connect pwm to pin on timer 5, channel C + sbi(TCCR5A, COM5C1); + OCR5C = val; // set pwm duty + break; + #endif + + case NOT_ON_TIMER: + default: + if (val < 128) { + digitalWrite(pin, LOW); + } else { + digitalWrite(pin, HIGH); + } + } + } +} diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_digital.c b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_digital.c old mode 100755 new mode 100644 similarity index 50% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_digital.c rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_digital.c index 1cdbf6c..0949da4 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_digital.c +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_digital.c @@ -19,6 +19,8 @@ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Modified 28 September 2010 by Mark Sproul + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ */ @@ -36,8 +38,17 @@ void pinMode(uint8_t pin, uint8_t mode) // JWS: can I let the optimizer do this? reg = portModeRegister(port); - if (mode == INPUT) *reg &= ~bit; - else *reg |= bit; + if (mode == INPUT) { + uint8_t oldSREG = SREG; + cli(); + *reg &= ~bit; + SREG = oldSREG; + } else { + uint8_t oldSREG = SREG; + cli(); + *reg |= bit; + SREG = oldSREG; + } } // Forcing this inline keeps the callers from having to push their own stuff @@ -47,32 +58,67 @@ void pinMode(uint8_t pin, uint8_t mode) // But shouldn't this be moved into pinMode? Seems silly to check and do on // each digitalread or write. // -static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); -static inline void turnOffPWM(uint8_t timer) +// Mark Sproul: +// - Removed inline. Save 170 bytes on atmega1280 +// - changed to a switch statment; added 32 bytes but much easier to read and maintain. +// - Added more #ifdefs, now compiles for atmega645 +// +//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); +//static inline void turnOffPWM(uint8_t timer) +static void turnOffPWM(uint8_t timer) { - if (timer == TIMER1A) cbi(TCCR1A, COM1A1); - if (timer == TIMER1B) cbi(TCCR1A, COM1B1); - -#if defined(__AVR_ATmega8__) - if (timer == TIMER2) cbi(TCCR2, COM21); -#else - if (timer == TIMER0A) cbi(TCCR0A, COM0A1); - if (timer == TIMER0B) cbi(TCCR0A, COM0B1); - if (timer == TIMER2A) cbi(TCCR2A, COM2A1); - if (timer == TIMER2B) cbi(TCCR2A, COM2B1); -#endif - -#if defined(__AVR_ATmega1280__) - if (timer == TIMER3A) cbi(TCCR3A, COM3A1); - if (timer == TIMER3B) cbi(TCCR3A, COM3B1); - if (timer == TIMER3C) cbi(TCCR3A, COM3C1); - if (timer == TIMER4A) cbi(TCCR4A, COM4A1); - if (timer == TIMER4B) cbi(TCCR4A, COM4B1); - if (timer == TIMER4C) cbi(TCCR4A, COM4C1); - if (timer == TIMER5A) cbi(TCCR5A, COM5A1); - if (timer == TIMER5B) cbi(TCCR5A, COM5B1); - if (timer == TIMER5C) cbi(TCCR5A, COM5C1); -#endif + switch (timer) + { + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: cbi(TCCR1A, COM1A1); break; + #endif + #if defined(TCCR1A) && defined(COM1B1) + case TIMER1B: cbi(TCCR1A, COM1B1); break; + #endif + + #if defined(TCCR2) && defined(COM21) + case TIMER2: cbi(TCCR2, COM21); break; + #endif + + #if defined(TCCR0A) && defined(COM0A1) + case TIMER0A: cbi(TCCR0A, COM0A1); break; + #endif + + #if defined(TIMER0B) && defined(COM0B1) + case TIMER0B: cbi(TCCR0A, COM0B1); break; + #endif + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: cbi(TCCR2A, COM2A1); break; + #endif + #if defined(TCCR2A) && defined(COM2B1) + case TIMER2B: cbi(TCCR2A, COM2B1); break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: cbi(TCCR3A, COM3A1); break; + #endif + #if defined(TCCR3A) && defined(COM3B1) + case TIMER3B: cbi(TCCR3A, COM3B1); break; + #endif + #if defined(TCCR3A) && defined(COM3C1) + case TIMER3C: cbi(TCCR3A, COM3C1); break; + #endif + + #if defined(TCCR4A) && defined(COM4A1) + case TIMER4A: cbi(TCCR4A, COM4A1); break; + #endif + #if defined(TCCR4A) && defined(COM4B1) + case TIMER4B: cbi(TCCR4A, COM4B1); break; + #endif + #if defined(TCCR4A) && defined(COM4C1) + case TIMER4C: cbi(TCCR4A, COM4C1); break; + #endif + #if defined(TCCR5A) + case TIMER5A: cbi(TCCR5A, COM5A1); break; + case TIMER5B: cbi(TCCR5A, COM5B1); break; + case TIMER5C: cbi(TCCR5A, COM5C1); break; + #endif + } } void digitalWrite(uint8_t pin, uint8_t val) @@ -90,8 +136,17 @@ void digitalWrite(uint8_t pin, uint8_t val) out = portOutputRegister(port); - if (val == LOW) *out &= ~bit; - else *out |= bit; + if (val == LOW) { + uint8_t oldSREG = SREG; + cli(); + *out &= ~bit; + SREG = oldSREG; + } else { + uint8_t oldSREG = SREG; + cli(); + *out |= bit; + SREG = oldSREG; + } } int digitalRead(uint8_t pin) diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_private.h b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_private.h old mode 100755 new mode 100644 similarity index 96% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_private.h rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_private.h index 2dfe552..11f6f00 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_private.h +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_private.h @@ -53,7 +53,7 @@ extern "C"{ #define EXTERNAL_INT_6 6 #define EXTERNAL_INT_7 7 -#if defined(__AVR_ATmega1280__) +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define EXTERNAL_NUM_INTERRUPTS 8 #else #define EXTERNAL_NUM_INTERRUPTS 2 diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_pulse.c b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_pulse.c old mode 100755 new mode 100644 similarity index 91% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_pulse.c rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_pulse.c index 8f232f1..0d96886 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_pulse.c +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_pulse.c @@ -55,12 +55,15 @@ unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) return 0; // wait for the pulse to stop - while ((*portInputRegister(port) & bit) == stateMask) + while ((*portInputRegister(port) & bit) == stateMask) { + if (numloops++ == maxloops) + return 0; width++; + } // convert the reading to microseconds. The loop has been determined - // to be 10 clock cycles long and have about 16 clocks between the edge + // to be 20 clock cycles long and have about 16 clocks between the edge // and the start of the loop. There will be some error introduced by // the interrupt handlers. - return clockCyclesToMicroseconds(width * 10 + 16); + return clockCyclesToMicroseconds(width * 21 + 16); } diff --git a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_shift.c b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_shift.c old mode 100755 new mode 100644 similarity index 77% rename from arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_shift.c rename to arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_shift.c index 956f864..cfe7867 --- a/arduino-0018-linux-x64/hardware/arduino/cores/arduino/wiring_shift.c +++ b/arduino-0022-linux-x64/hardware/arduino/cores/arduino/wiring_shift.c @@ -24,9 +24,24 @@ #include "wiring_private.h" -void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val) +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) { + uint8_t value = 0; + uint8_t i; + + for (i = 0; i < 8; ++i) { + digitalWrite(clockPin, HIGH); + if (bitOrder == LSBFIRST) + value |= digitalRead(dataPin) << i; + else + value |= digitalRead(dataPin) << (7 - i); + digitalWrite(clockPin, LOW); + } + return value; +} + +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) { - int i; + uint8_t i; for (i = 0; i < 8; i++) { if (bitOrder == LSBFIRST) diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/MEGA-dfu_and_usbserial_combined.hex b/arduino-0022-linux-x64/hardware/arduino/firmwares/MEGA-dfu_and_usbserial_combined.hex new file mode 100644 index 0000000..e22196c --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/MEGA-dfu_and_usbserial_combined.hex @@ -0,0 +1,234 @@ +:20000000A2C00000BBC00000B9C00000B7C00000B5C00000B3C00000B1C00000AFC000004B +:20002000ADC00000ABC00000A9C000005AC400001EC40000A3C00000A1C000009FC000005C +:200040009DC000009BC0000099C0000097C0000095C0000093C0000091C0000014C100006A +:200060008DC000008BC0000089C0000087C0000085C0000083C0000081C000007FC0000050 +:200080007DC000007BC0000079C0000077C0000075C0000073C000001201100102000008E2 +:2000A0004123100001000102DC0109023E00020100C0320904000001020201000524000170 +:2000C00010042402060524060001070582030800FF09040100020A000000070504024000AC +:2000E0000107058302400001040309043203410072006400750069006E006F0020002800CA +:200100007700770077002E00610072006400750069006E006F002E0063006300290000003D +:200120002403410072006400750069006E006F0020004D00650067006100200032003500A5 +:2001400036003000000011241FBECFEFD2E0DEBFCDBF11E0A0E0B1E0E0EDFFE002C0059089 +:200160000D92A631B107D9F712E0A6E1B1E001C01D92AF32B107E1F7F1D028C741CF9C0139 +:20018000DC01AE57BF4FED91FC91119741911196FC93EE9380589F4FE817F90711F42D93A9 +:2001A0003C939FB7F894F901EC57FF4F8081815080839FBF842F0895DF92EF92FF920F935B +:2001C0001F93FC018489813019F0823021F405C040E3D42E04C0DD2402C030E2D32E838952 +:2001E000823011F488E0D82A8589873031F0883031F0863031F482E003C084E001C086E094 +:20020000D82A1092C9001092C8001092CA00E784F0880189128980E0E81681EEF80680E068 +:20022000080780E0180719F420E130E00FC0C801B701969587957795679560587B47814E2A +:200240009F4FA8019701A0D6215030403093CD002093CC00D092CA0080E0E81681EEF80612 +:2002600080E0080780E0180711F082E001C080E08093C80088E98093C9001F910F91FF9005 +:20028000EF90DF9008951F920F920FB60F9211242F938F939F93EF93FF939091CE008EB38C +:2002A0008430F1F4E0919901F0919A019083E0919901F0919A01CF01019690939A0180930C +:2002C00099018959914021F489E191E0928381839FB7F89480919D018F5F80939D019FBF3A +:2002E000FF91EF919F918F912F910F900FBE0F901F901895FC01858580FF02C05F9808959B +:200300005F9A089580E091E0D5C580E091E088C584B7877F84BF28E10FB6F89420936000CD +:20032000109260000FBE87E690E09093CD008093CC0086E08093CA001092C8002093C90019 +:20034000539A5A9A8AB180638AB98BB180638BB983D284E085BD5F9A579A08950F931F9322 +:20036000CF93DF93D5DF2FB7F8948EE991E090931F0280931E0290932102809320022FBFBB +:200380002FB7F89489E191E090939A018093990190939C0180939B012FBF7894CEE9D1E0D4 +:2003A00003E08FB7F894909122028FBF903809F180E091E0ABD497FD1CC0E0911E02F09161 +:2003C0001F028083E0911E02F0911F02CF01019690931F0280931E028E51924011F4D283DD +:2003E000C1839FB7F894809122028F5F809322029FBF8FB7F89410919D018FBFA89902C0BD +:20040000113678F1A89A80919D01882361F05D980093160108C089E191E0B1DE682F80E077 +:2004200091E0DAD411501123B1F780911601882351F0809116018150809316018091160101 +:20044000882309F45D9A80911701882351F08091170181508093170180911701882309F4F2 +:200460005C9A8FB7F894909122028FBF992369F08EE991E084DE982F8091C80085FFFCCFD3 +:200480009093CE005C980093170180E091E095D42AD487CFDA01923049F0933061F0913093 +:2004A000F9F4E8E9F0E022E130E01EC0EAEAF0E02EE330E019C0813049F0813018F08230CA +:2004C00079F408C0E8EEF0E0849107C0ECEEF0E0849103C0E0E2F1E08491282F30E004C010 +:2004E000E0E0F0E020E030E0ED93FC93C901089528E030E040E003C04F5F220F331F28177B +:200500003907D0F3842F8295807F08958093E9008091EB0081608093EB001092ED00609319 +:20052000EC004093ED008091EE00881F8827881F08951092F40090E09093E9001092F000D2 +:200540001092E8001092ED008091EB008E7F8093EB009F5F953081F70895809127028823BE +:200560008CF403C08EB38823B1F08091E80082FFF9CF8091E8008B778093E80008958EB395 +:20058000882349F08091E80080FFF9CF8091E8008E778093E800089594E68091EC0080FFAB +:2005A00005C08091E80080FF05C023C08091E80082FD1FC08EB3882311F482E008958EB3CE +:2005C000853011F483E008958091EB0085FF02C081E008958091E10082FFDFCF8091E1000E +:2005E0008B7F8093E100992311F484E008959150D4CF80E008959C0140912D0250912E020C +:200600004617570718F4F90120E038C06115710511F0AB01F8CF8091E8008E778093E800C8 +:2006200040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC08EB3882381F1AD +:200640008EB3853079F18091E80080FF17C09091F20006C081918093F100415050409F5FDD +:200660004115510511F09830A8F320E0983009F421E08091E8008E778093E80041155105FF +:2006800091F6222381F606C08EB3882349F08EB3853041F08091E80082FFF6CF80E00895C9 +:2006A00082E0089583E008959C0140912D0250912E024617570710F490E03BC06115710577 +:2006C00011F0AB01F9CF8091E8008E778093E80040E050E0F1CF8091E80083FF02C081E0FE +:2006E00008958091E80082FD30C08EB3882399F18EB3853091F18091E80080FF1AC08091A4 +:20070000F20009C0F9012F5F3F4FE491E093F100415050408F5F4115510511F0883090F338 +:2007200090E0883009F491E08091E8008E778093E8004115510579F6992369F606C08EB3ED +:20074000882349F08EB3853041F08091E80082FFF6CF80E0089582E0089583E008959C01B6 +:200760006115710529F48091E8008B778093E800F90120C08091E80083FF02C081E0089565 +:200780008EB3882339F18EB3853031F18091E80082FFF0CF06C08091F100819361507040B5 +:2007A00021F08091F2008823B1F78091E8008B778093E80061157105E9F606C08EB388235F +:2007C00049F08EB3853041F08091E80080FFF6CF80E0089582E0089583E0089542D044D05A +:2007E0001EBA10922502109224021092230284E089BD89B5826089BD09B400FEFDCF809121 +:20080000D800982F9F779093D80080688093D800809163008E7F809363008091D8008F7D69 +:200820008093D8008091E0008E7F8093E0008091E1008E7F8093E1008091E2008160809302 +:20084000E2008091E100877F8093E1008091E20088608093E2000895C1DF81E08093260221 +:2008600008951092E20008951092E10008951F920F920FB60F9211241F932F933F934F9385 +:200880005F936F937F938F939F93AF93BF93EF93FF93E9EEF0E0108117701082E0EFF0E066 +:2008A0008081877F80837894C3D0F894A9EEB0E01C92E0EFF0E08081886080831C93FF9164 +:2008C000EF91BF91AF919F918F917F916F915F914F913F912F911F910F900FBE0F901F90DE +:2008E00018951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF93BF93FA +:20090000EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E10080912A +:20092000E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC1EBAA7 +:20094000D1D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B400FE71 +:20096000FDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093E200E3 +:200980008091E20081608093E20080912502882311F481E001C084E08EBBA4D18091E10070 +:2009A00083FF27C08091E20083FF23C08091E100877F8093E10082E08EBB10922502809105 +:2009C000E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200AADD80E090 +:2009E00060E042E093DD8091F00088608093F00079D18091E10082FF0AC08091E20082FF3E +:200A000006C08091E1008B7F8093E1006BD1FF91EF91BF91AF919F918F917F916F915F91F4 +:200A20004F913F912F910F900FBE0F901F9018951F93DF93CF93CDB7DEB7AC970FB6F894AC +:200A4000DEBF0FBECDBFE7E2F2E08091F100819322E0EF32F207C9F78091270230912802EE +:200A6000353009F487C0363040F43130C9F1313070F0333009F01DC133C0383009F4EFC016 +:200A8000393009F4FEC0363009F013C192C0803821F0823809F00DC108C090912302809144 +:200AA0002402882399F0926011C080912B0287708093E9008091EB0090E025E09695879530 +:200AC0002A95E1F7982F91701092E9008091E800877F8093E8009093F1001092F100CAC001 +:200AE000882319F0823009F0E4C090E08F719070009721F0029709F0DDC00CC080912902A4 +:200B0000813009F0D7C010922402333069F5809324022AC080912902882331F520912B02FD +:200B2000277009F4C7C02093E9008091EB0080FFC1C0333021F48091EB00806213C08091C8 +:200B4000EB0080618093EB0081E090E002C0880F991F2A95E2F78093EA001092EA008091B7 +:200B6000EB0088608093EB001092E9008091E800877F83C0882309F09CC0109129028091FA +:200B8000E800877F8093E800E8DC04C08EB3882309F490C08091E80080FFF8CF812F8F77B6 +:200BA00011F492E001C093E09EBB80688093E30081C08058823008F07CC0809129029091F7 +:200BC0002A0223E08C3D920799F55FB7F894DE0115964EE020E030E061E2E42FF0E0609373 +:200BE0005700849120FF03C082958F704F5F982F9F70892F805D8A3308F0895F8C93119615 +:200C00001C9211972F5F3F4F12962431310529F75FBF8AE28B8383E08C838091E800877F06 +:200C20008093E800CE0103966AE270E0E4DC11C060912B02AE014F5F5F4F2CDCBC0100979F +:200C4000C9F18091E800877F8093E80089819A812BDD8091E8008B778093E8002BC080381A +:200C600041F58091E800877F8093E800809125028093F1008091E8008E778093E8006DDCC6 +:200C800019C08823B1F490912902923098F48091E800877F8093E800909325025EDC809102 +:200CA0002502882311F483E001C084E08EBB2DDB01C028DB8091E80083FF0AC08091EB007F +:200CC00080628093EB008091E800877F8093E800AC960FB6F894DEBF0FBECDBFCF91DF91E1 +:200CE0001F91089508951F938EB3882361F01091E9001092E9008091E80083FF01C098DE54 +:200D000017701093E9001F9108950895FC018EB3843021F587859089A189B2890097A10507 +:200D2000B105E1F085818093E9008091E80082FF15C08091F200882319F42FEF3FEF04C010 +:200D40008091F100282F30E08091F200882341F48091E8008B778093E80002C02FEF3FEF43 +:200D6000C9010895FC018EB3843011F587859089A189B2890097A105B105D1F081818093C1 +:200D8000E9008091F2008823A9F09091E8008091E8008E778093E80095FD0CC0FDDB982F24 +:200DA000882349F48091E8008E778093E80003C092E001C090E0892F0895FC018EB38430A5 +:200DC00051F487859089A189B2890097A105B10511F0CF01C7CF08951F93FC01162F8EB318 +:200DE0008430D9F487859089A189B2890097A105B10599F081818093E9008091E80085FDF3 +:200E000008C08091E8008E778093E800C5DB882329F41093F10080E001C082E01F91089545 +:200E20000F931F93CF93DF93EC010D96FC0189E0DF011D928A95E9F72A813B8109818C8108 +:200E4000882311F410E001C014E0C90151DB182B1260802F61E8412F59DB882329F12E8182 +:200E60003F810D818885882311F410E001C014E0C9013EDB182B1260802F60E8412F46DBA2 +:200E8000882391F02A853B8509858C85882311F410E001C014E0C9012BDB182B1260802F8F +:200EA00061EC412F33DB01C080E0DF91CF911F910F910895CF93DF93EC018091E80083FF4D +:200EC00060C0888190E020912B0230912C022817390709F056C080912802813261F082322B +:200EE00020F4803209F04DC019C0823269F1833209F047C038C080912702813A09F041C0A3 +:200F00008091E800877F8093E800CE010F9667E070E071DB8091E8008B7713C08091270278 +:200F2000813279F58091E800877F8093E800CE010F9667E070E013DCCE013ED98091E800BD +:200F40008E778093E8001DC0809127028132C9F48091E800877F8093E800809129028D87C0 +:200F6000CE01C8D90DC080912702813251F48091E800877F8093E800CE0160912902C5DE7A +:200F8000ECDADF91CF910895A1E21A2EAA1BBB1BFD010DC0AA1FBB1FEE1FFF1FA217B307AC +:200FA000E407F50720F0A21BB30BE40BF50B661F771F881F991F1A9469F760957095809539 +:200FC00090959B01AC01BD01CF010895F894FFCF000340000004400000020800000000008D +:200FE000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:201000004BC0000064C0000062C0000060C000005EC000005CC000005AC0000058C00000F3 +:2010200056C0000054C0000052C00000CBC400004EC000004CC000004AC0000048C00000B9 +:2010400046C0000044C0000042C0000040C000003EC000003CC000003AC0000038C0000098 +:2010600036C0000034C0000032C0000030C000002EC000002CC000002AC0000028C00000F8 +:2010800026C0000024C0000022C0000020C000001EC000001CC0000011241FBECFEFD2E088 +:2010A000DEBFCDBF11E0A0E0B1E0E4EBFCE102C005900D92A836B107D9F711E0A8E6B1E0ED +:2010C00001C01D92A738B107E1F74FD3F1C598CF982F15C08091F200882371F48091E8004A +:2010E0008B7F8093E80003C08EB3882351F08091E80082FFF9CF02C08091F1009150992358 +:2011000049F708952091760130917501809174019091730180936D0190936E01C901809388 +:201120006F0190937001089580917101843009F45AC0853030F4813059F0833009F0C3C0BE +:201140001FC0853009F4A0C0863009F0BCC0AFC080917201823008F0B6C0D4DF8091720129 +:20116000882361F480916D0190916E0123E0FC0120935700E89507B600FCFDCF85E008C027 +:2011800080917201882311F0823029F4BBDF89E0809301010895813009F095C020E030E08C +:2011A00040E050E0F90184918F3F81F0CA01AA27BB2780936C0130936E0120936D018AE0D6 +:2011C0008093010185E08093690108952F5F3F4F4F4F5F4F2030F0E13F07F0E04F07F0E0B6 +:2011E0005F0701F7089580917201833051F581E0809368018091770190917801892B71F062 +:2012000080917301813009F05EC0809176019091750190936B0180936A0108958091730133 +:20122000882361F42CE088E190E00FB6F894A895809360000FBE20936000089510920001A8 +:201240000895882309F03FC0809173018F3F09F03AC0E0E0F0E093E085E090935700E895A9 +:2012600007B600FCFDCF80935700E89507B600FCFDCFE058FF4F20E1E030F20771F781E123 +:2012800080935700E8950895E091730180917201882321F4F0E0EB5FFE4F05C0813099F437 +:2012A000F0E0EE52FF4F808180937C01089580917201833041F480917301882321F48091E0 +:2012C000740180936C0108952F923F924F925F926F927F929F92AF92BF92CF92DF92EF92F0 +:2012E000FF920F931F93CF93DF938091850190918601909378018093770180917901882399 +:2013000051F08091790181508093790180917901882309F45D9A80917A01882351F08091F0 +:201320007A01815080937A0180917A01882309F45C9A80918001833009F4B2C1843030F41C +:20134000813071F0823009F0E3C111C1853009F4C5C1853008F4BAC1863009F0D9C1CDC11F +:201360005C9883E080937A018091E800877F8093E80080916801882329F0D6DE5D9A5C9AAF +:201380001092680120917701309178012115310529F42AC08EB3882309F4BAC18091E8000F +:2013A00082FFF8CF8091F10080937101215030403093780120937701E2E7F1E00CC080919F +:2013C000F10081932150304081E0E737F80719F43183208308C08091F200882381F7309394 +:2013E000780120937701A0DE80910101853009F0BAC08091770190917801892B21F482E042 +:2014000080930101B0C08AE163DE80916D018F715FDEC0916F01D091700120916D0130916C +:201420006E0121968E01021B130B219780917201882309F093C0180136942794C901A091F0 +:201440006C01B0E09C01AD0162E0E62EF12C012D112DE20EF31E041F151F59016A0190E0D8 +:2014600099249394B5E0A3E048C08091F200882371F48091E8008B7F8093E80004C08EB352 +:20148000882309F445C18091E80082FFF8CF0894210831088091F100682F8091F100782F1D +:2014A000F5010B0190925700E89511249F5F903419F021143104A1F4F901B0935700E89524 +:2014C00007B600FCFDCF2114310451F0F701A0935700E89507B600FCFDCFA801970190E0A7 +:2014E00042E0442E512C612C712CE40CF51C061D171DA40CB51CC61CD71C2114310409F0A0 +:20150000B4CFD0936E01C0936D0181E180935700E89527C08091F200882371F48091E80079 +:201520008B7F8093E80004C08EB3882309F4F0C08091E80082FFF8CF6091F10080916D01A7 +:2015400090916E01A7D380916D0190916E01019690936E0180936D010150104001151105FB +:20156000C9F680E1B5DD8091E8008B7FC3C08091E800877F8093E8005D9883E08093790154 +:2015800004C08EB3882309F4C3C08091E80080FFF8CF80910101893091F08A3069F4809167 +:2015A0007201813049F480916D0190916E018093F1009093F1009BC080917C0196C0609173 +:2015C0006F017091700120916D0130916E016F5F7F4F7B01E21AF30A6150704080917201E4 +:2015E000882389F5870116950795C901A0916C01B0E09C01AD011FC08091F200803271F4B7 +:201600008091E8008E7F8093E80004C08EB3882309F47EC08091E80080FFF8CFF90185918F +:2016200094918093F1009093F100015010402E5F3F4F4F4F5F4F01151105F1F670936E01E0 +:2016400060936D0129C0823039F523C08091F200803271F48091E8008E7F8093E80004C09E +:201660008EB3882309F454C08091E80080FFF8CF00916D0110916E01C80104D38093F1007B +:201680000F5F1F4F10936E0100936D010894E108F108E114F104D1F682E08093010127C0CE +:2016A0008091E800877F8093E800809169018093F1001092F1001092F1001092F1008091E7 +:2016C00001018093F1001092F10011C08091E800877F8093E8001092690119C08091E800C8 +:2016E000877F8093E800809101018093F1008091E8008E7F8093E8000AC08091E800877F08 +:201700008093E8005D9A5C9A82E08093010187D0DF91CF911F910F91FF90EF90DF90CF9017 +:20172000BF90AF909F907F906F905F904F903F902F9008952BD181E085BF15BE089584B799 +:20174000877F84BF88E10FB6F89480936000109260000FBE81E085BF82E085BF8AB18063DB +:201760008AB98BB180638BB90CC1E9DF789401C080D2809100018823D9F78091680188235D +:20178000B9F7D8DFE0916A01F0916B010995FA01923071F0933089F0913029F488E091E06A +:2017A00022E130E019C080E090E020E030E014C08AE191E02BE130E00FC0882339F48091D9 +:2017C0003501282F30E085E391E006C080913901282F30E089E391E091838083C9010895C0 +:2017E0008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881FE4 +:2018000008951092F4001092F0001092E8001092ED00EBEEF0E080818E7F80830895809182 +:201820007F0188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B7F8093E8006D +:2018400008958EB3882349F08091E80080FFF9CF8091E8008E7F8093E80008959C0140917A +:201860008501509186014617570718F4F90120E038C06115710511F0AB01F8CF8091E80068 +:201880008E7F8093E80040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC091 +:2018A0008EB3882381F18EB3853079F18091E80080FF17C09091F20006C081918093F1002C +:2018C000415050409F5F4115510511F09032A8F320E0903209F421E08091E8008E7F809306 +:2018E000E8004115510591F6222381F606C08EB3882349F08EB3853041F08091E80082FF85 +:20190000F6CF80E0089582E0089583E0089554D056D01EBA10927D0184E089BD89B58260FA +:2019200089BD09B400FEFDCF8091D800982F9F779093D80080688093D800809163008E7FC5 +:20194000809363008091D8008F7D8093D8008091E0008E7F8093E0008091E1008E7F80932E +:20196000E1008091E20081608093E2008091E100877F8093E1008091E20088608093E20001 +:201980000895C5DF81E080937E010895C0DFE0EEF0E0808181608083E8EDF0E080818F77A8 +:2019A00080830AD00CD019BCE3E6F0E080818160808310927E0108951092E200089510929A +:2019C000E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF938A +:2019E000BF93EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E100F9 +:201A00008091E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC7D +:201A20001EBA26D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B451 +:201A400000FEFDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093D6 +:201A6000E2008091E20081608093E20080917D01882311F481E001C084E08EBBF9D08091D3 +:201A8000E10083FF22C08091E20083FF1EC08091E100877F8093E10082E08EBB10927D01F7 +:201AA0008091E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200A1DEF6 +:201AC00080E060E042E28CDED3D08091E10082FF0AC08091E20082FF06C08091E1008B7FC2 +:201AE0008093E100C5D0FF91EF91BF91AF919F918F917F916F915F914F913F912F910F905E +:201B00000FBE0F901F9018951F93DF93CF9300D0CDB7DEB7EFE7F1E08091F100819381E070 +:201B2000E738F807C9F790917F0180918001853011F1863040F48130B9F0813070F08330D5 +:201B400009F081C011C0883009F453C0893009F462C0863009F077C02DC0903809F474C00E +:201B6000923809F070C070C0992309F46DC0923009F069C069C0992309F065C01091810152 +:201B80008091E800877F8093E80049DE04C08EB3882309F459C08091E80080FFF8CF812F6F +:201BA0008F7711F492E001C093E09EBB80688093E3004AC09058923008F045C080918101F9 +:201BC0009091820160918301AE014F5F5F4FDFDDBC010097C9F18091E800877F8093E8001D +:201BE00089819A813BDE8091E8008B7F8093E8002BC0903841F58091E800877F8093E800C6 +:201C000080917D018093F1008091E8008E7F8093E80005DE19C09923B1F4909181019230AE +:201C200098F48091E800877F8093E80090937D01F6DD80917D01882311F483E001C084E0E3 +:201C40008EBB16D001C040DB8091E80083FF0AC08091EB0080628093EB008091E800877F59 +:201C60008093E8000F900F90CF91DF911F91089508958EB3882329F08091E80083FF01C030 +:201C800043CF0895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD6B +:201CA00020BD0FB6F894FA9AF99A0FBE01960895F894FFCF01021E938220DCFB1201100123 +:201CC00000000020EB03F72F00000001000109021B0001010080320904000000FE010200E6 +:201CE0000921030000000C0001040309042C03410072006400750069006E006F0020004D28 +:1C1D000000650067006100200032003500360030002000440046005500000000AE +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/README.txt b/arduino-0022-linux-x64/hardware/arduino/firmwares/README.txt new file mode 100644 index 0000000..386dcf0 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/README.txt @@ -0,0 +1,33 @@ +Arduino Uno and Mega 2560 Firmwares for the ATmega8U2 + +This directory contains the firmwares used on the ATmega8U2 on the Arduino +Uno and Arduino Mega 2560. The arduino-usbdfu directory contains the DFU +bootloader on the 8U2; the arduino-usbserial directory contains the actual +usb to serial firmware. Both should be compiled against LUFA 100807. The +two .hex files in this directory combine the dfu and serial firmwares into +a single file to burn onto the 8U2. + +To burn (Uno): +avrdude -p at90usb82 -F -P usb -c avrispmkii -U flash:w:UNO-dfu_and_usbserial_combined.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m + +To burn (Mega 2560): +avrdude -p at90usb82 -F -P usb -c avrispmkii -U flash:w:MEGA-dfu_and_usbserial_combined.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m + + +Note on USB Vendor IDs (VID) and Product IDs (PID): The arduino-usbdfu +project uses Atmel's VID and MCU-specific PIDs to maintain compatibility +with their FLIP software. The source code to the arduino-usbserial +project includes Atmel's VID and a PID donated by them to LUFA. This +PID is used in LUFA's USBtoSerial project, which forms the basis for +arduino-usbserial. According to the LUFA documentation, this VID/PID +combination is: + + "For use in testing of LUFA powered devices during development only, + by non-commercial entities. All devices must accept collisions on this + VID/PID range (from other in-development LUFA devices) to be resolved + by using a unique release number in the Device Descriptor. No devices + using this VID/PID combination may be released to the general public." + +The production version of the arduino-usbserial firmware uses the +Arduino VID. This is only for use with official Arduino hardware and +should not be used on other products. \ No newline at end of file diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/UNO-dfu_and_usbserial_combined.hex b/arduino-0022-linux-x64/hardware/arduino/firmwares/UNO-dfu_and_usbserial_combined.hex new file mode 100644 index 0000000..60acf44 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/UNO-dfu_and_usbserial_combined.hex @@ -0,0 +1,234 @@ +:200000009CC00000B5C00000B3C00000B1C00000AFC00000ADC00000ABC00000A9C000007B +:20002000A7C00000A5C00000A3C0000054C4000018C400009DC000009BC0000099C000008C +:2000400097C0000095C0000093C0000091C000008FC000008DC000008BC000000EC100009A +:2000600087C0000085C0000083C0000081C000007FC000007DC000007BC0000079C0000080 +:2000800077C0000075C0000073C0000071C000006FC000006DC00000120110010200000806 +:2000A0004123010001000102DC0109023E00020100C032090400000102020100052400017F +:2000C00010042402060524060001070582030800FF09040100020A000000070504024000AC +:2000E0000107058302400001040309043203410072006400750069006E006F0020002800CA +:200100007700770077002E00610072006400750069006E006F002E0063006300290000003D +:200120001803410072006400750069006E006F00200055006E006F00000011241FBECFEFB0 +:20014000D2E0DEBFCDBF11E0A0E0B1E0E4ECFFE002C005900D92A631B107D9F712E0A6E145 +:20016000B1E001C01D92AF32B107E1F7F1D028C747CF9C01DC01AE57BF4FED91FC91119707 +:2001800041911196FC93EE9380589F4FE817F90711F42D933C939FB7F894F901EC57FF4F10 +:2001A0008081815080839FBF842F0895DF92EF92FF920F931F93FC018489813019F082306F +:2001C00021F405C040E3D42E04C0DD2402C030E2D32E8389823011F488E0D82A8589873094 +:2001E00031F0883031F0863031F482E003C084E001C086E0D82A1092C9001092C800109201 +:20020000CA00E784F0880189128980E0E81681EEF80680E0080780E0180719F420E130E035 +:200220000FC0C801B701969587957795679560587B47814E9F4FA8019701A0D62150304050 +:200240003093CD002093CC00D092CA0080E0E81681EEF80680E0080780E0180711F082E047 +:2002600001C080E08093C80088E98093C9001F910F91FF90EF90DF9008951F920F920FB6B4 +:200280000F9211242F938F939F93EF93FF939091CE008EB38430F1F4E0919901F0919A016E +:2002A0009083E0919901F0919A01CF01019690939A01809399018959914021F489E191E08F +:2002C000928381839FB7F89480919D018F5F80939D019FBFFF91EF919F918F912F910F90B8 +:2002E0000FBE0F901F901895FC01858580FF02C05F9808955F9A089580E091E0D5C580E0F9 +:2003000091E088C584B7877F84BF28E10FB6F89420936000109260000FBE87E690E090935F +:20032000CD008093CC0086E08093CA001092C8002093C900539A5A9A8AB180638AB98BB16A +:2003400080638BB983D284E085BD5F9A579A08950F931F93CF93DF93D5DF2FB7F8948EE92F +:2003600091E090931F0280931E0290932102809320022FBF2FB7F89489E191E090939A0121 +:200380008093990190939C0180939B012FBF7894CEE9D1E003E08FB7F894909122028FBF97 +:2003A000903809F180E091E0ABD497FD1CC0E0911E02F0911F028083E0911E02F0911F0252 +:2003C000CF01019690931F0280931E028E51924011F4D283C1839FB7F894809122028F5FEB +:2003E000809322029FBF8FB7F89410919D018FBFA89902C0113678F1A89A80919D018823BA +:2004000061F05D980093160108C089E191E0B1DE682F80E091E0DAD411501123B1F7809156 +:200420001601882351F08091160181508093160180911601882309F45D9A809117018823FB +:2004400051F08091170181508093170180911701882309F45C9A8FB7F894909122028FBF0A +:20046000992369F08EE991E084DE982F8091C80085FFFCCF9093CE005C980093170180E03E +:2004800091E095D42AD487CFDA01923049F0933061F09130F9F4E8E9F0E022E130E01EC004 +:2004A000EAEAF0E02EE330E019C0813049F0813018F0823079F408C0E8EEF0E0849107C092 +:2004C000ECEEF0E0849103C0E0E2F1E08491282F30E004C0E0E0F0E020E030E0ED93FC9318 +:2004E000C901089528E030E040E003C04F5F220F331F28173907D0F3842F8295807F0895C1 +:200500008093E9008091EB0081608093EB001092ED006093EC004093ED008091EE00881F30 +:200520008827881F08951092F40090E09093E9001092F0001092E8001092ED008091EB000F +:200540008E7F8093EB009F5F953081F708958091270288238CF403C08EB38823B1F08091F2 +:20056000E80082FFF9CF8091E8008B778093E80008958EB3882349F08091E80080FFF9CF52 +:200580008091E8008E778093E800089594E68091EC0080FF05C08091E80080FF05C023C0EA +:2005A0008091E80082FD1FC08EB3882311F482E008958EB3853011F483E008958091EB00FD +:2005C00085FF02C081E008958091E10082FFDFCF8091E1008B7F8093E100992311F484E0A1 +:2005E00008959150D4CF80E008959C0140912D0250912E024617570718F4F90120E038C076 +:200600006115710511F0AB01F8CF8091E8008E778093E80040E050E0F0CF8091E80083FFF7 +:2006200002C081E008958091E80082FD2DC08EB3882381F18EB3853079F18091E80080FF5F +:2006400017C09091F20006C081918093F100415050409F5F4115510511F09830A8F320E0A5 +:20066000983009F421E08091E8008E778093E8004115510591F6222381F606C08EB388231A +:2006800049F08EB3853041F08091E80082FFF6CF80E0089582E0089583E008959C01409151 +:2006A0002D0250912E024617570710F490E03BC06115710511F0AB01F9CF8091E8008E7771 +:2006C0008093E80040E050E0F1CF8091E80083FF02C081E008958091E80082FD30C08EB32B +:2006E000882399F18EB3853091F18091E80080FF1AC08091F20009C0F9012F5F3F4FE491A4 +:20070000E093F100415050408F5F4115510511F0883090F390E0883009F491E08091E800EF +:200720008E778093E8004115510579F6992369F606C08EB3882349F08EB3853041F0809160 +:20074000E80082FFF6CF80E0089582E0089583E008959C016115710529F48091E8008B77CE +:200760008093E800F90120C08091E80083FF02C081E008958EB3882339F18EB3853031F13B +:200780008091E80082FFF0CF06C08091F10081936150704021F08091F2008823B1F780916B +:2007A000E8008B778093E80061157105E9F606C08EB3882349F08EB3853041F08091E8007E +:2007C00080FFF6CF80E0089582E0089583E0089542D044D01EBA10922502109224021092A8 +:2007E000230284E089BD89B5826089BD09B400FEFDCF8091D800982F9F779093D800806894 +:200800008093D800809163008E7F809363008091D8008F7D8093D8008091E0008E7F809305 +:20082000E0008091E1008E7F8093E1008091E20081608093E2008091E100877F8093E10030 +:200840008091E20088608093E2000895C1DF81E08093260208951092E20008951092E100AE +:2008600008951F920F920FB60F9211241F932F933F934F935F936F937F938F939F93AF932A +:20088000BF93EF93FF93E9EEF0E0108117701082E0EFF0E08081877F80837894C3D0F894CD +:2008A000A9EEB0E01C92E0EFF0E08081886080831C93FF91EF91BF91AF919F918F917F9129 +:2008C0006F915F914F913F912F911F910F900FBE0F901F9018951F920F920FB60F921124B4 +:2008E0002F933F934F935F936F937F938F939F93AF93BF93EF93FF938091E10080FF1BC034 +:200900008091E20080FF17C08091E1008E7F8093E1008091E2008E7F8093E2008091E200B3 +:2009200080618093E2008091D80080628093D80019BC1EBAD1D18091E10084FF29C080916D +:20094000E20084FF25C084E089BD89B5826089BD09B400FEFDCF8091D8008F7D8093D800D6 +:200960008091E1008F7E8093E1008091E2008F7E8093E2008091E20081608093E2008091B5 +:200980002502882311F481E001C084E08EBBA4D18091E10083FF27C08091E20083FF23C089 +:2009A0008091E100877F8093E10082E08EBB109225028091E1008E7F8093E1008091E200F1 +:2009C0008E7F8093E2008091E20080618093E200AADD80E060E042E093DD8091F0008860AA +:2009E0008093F00079D18091E10082FF0AC08091E20082FF06C08091E1008B7F8093E10043 +:200A00006BD1FF91EF91BF91AF919F918F917F916F915F914F913F912F910F900FBE0F902F +:200A20001F9018951F93DF93CF93CDB7DEB7AC970FB6F894DEBF0FBECDBFE7E2F2E0809185 +:200A4000F100819322E0EF32F207C9F78091270230912802353009F487C0363040F43130EC +:200A6000C9F1313070F0333009F01DC133C0383009F4EFC0393009F4FEC0363009F013C163 +:200A800092C0803821F0823809F00DC108C09091230280912402882399F0926011C080916D +:200AA0002B0287708093E9008091EB0090E025E0969587952A95E1F7982F91701092E90074 +:200AC0008091E800877F8093E8009093F1001092F100CAC0882319F0823009F0E4C090E078 +:200AE0008F719070009721F0029709F0DDC00CC080912902813009F0D7C0109224023330AB +:200B000069F5809324022AC080912902882331F520912B02277009F4C7C02093E9008091A1 +:200B2000EB0080FFC1C0333021F48091EB00806213C08091EB0080618093EB0081E090E0F5 +:200B400002C0880F991F2A95E2F78093EA001092EA008091EB0088608093EB001092E900F6 +:200B60008091E800877F83C0882309F09CC0109129028091E800877F8093E800E8DC04C0E5 +:200B80008EB3882309F490C08091E80080FFF8CF812F8F7711F492E001C093E09EBB80683B +:200BA0008093E30081C08058823008F07CC08091290290912A0223E08C3D920799F55FB7AE +:200BC000F894DE0115964EE020E030E061E2E42FF0E060935700849120FF03C082958F7044 +:200BE0004F5F982F9F70892F805D8A3308F0895F8C9311961C9211972F5F3F4F129624310A +:200C0000310529F75FBF8AE28B8383E08C838091E800877F8093E800CE0103966AE270E076 +:200C2000E4DC11C060912B02AE014F5F5F4F2CDCBC010097C9F18091E800877F8093E800EA +:200C400089819A812BDD8091E8008B778093E8002BC0803841F58091E800877F8093E8009E +:200C6000809125028093F1008091E8008E778093E8006DDC19C08823B1F4909129029230BF +:200C800098F48091E800877F8093E800909325025EDC80912502882311F483E001C084E0DA +:200CA0008EBB2DDB01C028DB8091E80083FF0AC08091EB0080628093EB008091E800877FFF +:200CC0008093E800AC960FB6F894DEBF0FBECDBFCF91DF911F91089508951F938EB3882338 +:200CE00061F01091E9001092E9008091E80083FF01C098DE17701093E9001F9108950895DF +:200D0000FC018EB3843021F587859089A189B2890097A105B105E1F085818093E90080916A +:200D2000E80082FF15C08091F200882319F42FEF3FEF04C08091F100282F30E08091F2003E +:200D4000882341F48091E8008B778093E80002C02FEF3FEFC9010895FC018EB3843011F550 +:200D600087859089A189B2890097A105B105D1F081818093E9008091F2008823A9F09091CF +:200D8000E8008091E8008E778093E80095FD0CC0FDDB982F882349F48091E8008E7780937C +:200DA000E80003C092E001C090E0892F0895FC018EB3843051F487859089A189B289009738 +:200DC000A105B10511F0CF01C7CF08951F93FC01162F8EB38430D9F487859089A189B28973 +:200DE0000097A105B10599F081818093E9008091E80085FD08C08091E8008E778093E8003D +:200E0000C5DB882329F41093F10080E001C082E01F9108950F931F93CF93DF93EC010D964E +:200E2000FC0189E0DF011D928A95E9F72A813B8109818C81882311F410E001C014E0C901A1 +:200E400051DB182B1260802F61E8412F59DB882329F12E813F810D818885882311F410E0A6 +:200E600001C014E0C9013EDB182B1260802F60E8412F46DB882391F02A853B8509858C8563 +:200E8000882311F410E001C014E0C9012BDB182B1260802F61EC412F33DB01C080E0DF916D +:200EA000CF911F910F910895CF93DF93EC018091E80083FF60C0888190E020912B02309171 +:200EC0002C022817390709F056C080912802813261F0823220F4803209F04DC019C082320A +:200EE00069F1833209F047C038C080912702813A09F041C08091E800877F8093E800CE0133 +:200F00000F9667E070E071DB8091E8008B7713C080912702813279F58091E800877F80930E +:200F2000E800CE010F9667E070E013DCCE013ED98091E8008E778093E8001DC080912702D9 +:200F40008132C9F48091E800877F8093E800809129028D87CE01C8D90DC0809127028132AD +:200F600051F48091E800877F8093E800CE0160912902C5DEECDADF91CF910895A1E21A2EA6 +:200F8000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FA217B307E407F50720F0A21BB30BE40B49 +:200FA000F50B661F771F881F991F1A9469F760957095809590959B01AC01BD01CF01089501 +:200FC000F894FFCF00034000000440000002080000000000000000000000FFFFFFFFFFFF2C +:200FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:201000004BC0000064C0000062C0000060C000005EC000005CC000005AC0000058C00000F3 +:2010200056C0000054C0000052C00000CBC400004EC000004CC000004AC0000048C00000B9 +:2010400046C0000044C0000042C0000040C000003EC000003CC000003AC0000038C0000098 +:2010600036C0000034C0000032C0000030C000002EC000002CC000002AC0000028C00000F8 +:2010800026C0000024C0000022C0000020C000001EC000001CC0000011241FBECFEFD2E088 +:2010A000DEBFCDBF11E0A0E0B1E0E4EBFCE102C005900D92AC35B107D9F711E0ACE5B1E0E7 +:2010C00001C01D92AB37B107E1F74FD3F1C598CF982F15C08091F200882371F48091E80047 +:2010E0008B7F8093E80003C08EB3882351F08091E80082FFF9CF02C08091F1009150992358 +:2011000049F7089520916A013091690180916801909167018093610190936201C9018093D0 +:20112000630190936401089580916501843009F45AC0853030F4813059F0833009F0C3C0E2 +:201140001FC0853009F4A0C0863009F0BCC0AFC080916601823008F0B6C0D4DF8091660141 +:20116000882361F4809161019091620123E0FC0120935700E89507B600FCFDCF85E008C03F +:2011800080916601882311F0823029F4BBDF89E0809301010895813009F095C020E030E098 +:2011A00040E050E0F90184918F3F81F0CA01AA27BB278093600130936201209361018AE0FA +:2011C0008093010185E080935D0108952F5F3F4F4F4F5F4F2030F0E13F07F0E04F07F0E0C2 +:2011E0005F0701F7089580916601833051F581E080935C0180916B0190916C01892B71F092 +:2012000080916701813009F05EC080916A019091690190935F0180935E010895809167017B +:20122000882361F42CE088E190E00FB6F894A895809360000FBE20936000089510920001A8 +:201240000895882309F03FC0809167018F3F09F03AC0E0E0F0E093E085E090935700E895B5 +:2012600007B600FCFDCF80935700E89507B600FCFDCFE058FF4F20E1E030F20771F781E123 +:2012800080935700E8950895E091670180916601882321F4F0E0EB5FFE4F05C0813099F44F +:2012A000F0E0EE52FF4F808180937001089580916601833041F480916701882321F4809104 +:2012C00068018093600108952F923F924F925F926F927F929F92AF92BF92CF92DF92EF9208 +:2012E000FF920F931F93CF93DF938091790190917A0190936C0180936B0180916D018823D5 +:2013000051F080916D01815080936D0180916D01882309F45D9A80916E01882351F0809120 +:201320006E01815080936E0180916E01882309F45C9A80917401833009F4B2C1843030F44C +:20134000813071F0823009F0E3C111C1853009F4C5C1853008F4BAC1863009F0D9C1CDC11F +:201360005C9883E080936E018091E800877F8093E80080915C01882329F0D6DE5D9A5C9AC7 +:2013800010925C0120916B0130916C012115310529F42AC08EB3882309F4BAC18091E80033 +:2013A00082FFF8CF8091F100809365012150304030936C0120936B01E6E6F1E00CC08091C0 +:2013C000F10081932150304081E0EB36F80719F43183208308C08091F200882381F7309391 +:2013E0006C0120936B01A0DE80910101853009F0BAC080916B0190916C01892B21F482E072 +:2014000080930101B0C08AE163DE809161018F715FDEC0916301D09164012091610130919C +:20142000620121968E01021B130B219780916601882309F093C0180136942794C901A09108 +:201440006001B0E09C01AD0162E0E62EF12C012D112DE20EF31E041F151F59016A0190E0E4 +:2014600099249394B5E0A3E048C08091F200882371F48091E8008B7F8093E80004C08EB352 +:20148000882309F445C18091E80082FFF8CF0894210831088091F100682F8091F100782F1D +:2014A000F5010B0190925700E89511249F5F903419F021143104A1F4F901B0935700E89524 +:2014C00007B600FCFDCF2114310451F0F701A0935700E89507B600FCFDCFA801970190E0A7 +:2014E00042E0442E512C612C712CE40CF51C061D171DA40CB51CC61CD71C2114310409F0A0 +:20150000B4CFD0936201C093610181E180935700E89527C08091F200882371F48091E80091 +:201520008B7F8093E80004C08EB3882309F4F0C08091E80082FFF8CF6091F10080916101B3 +:2015400090916201A7D3809161019091620101969093620180936101015010400115110537 +:20156000C9F680E1B5DD8091E8008B7FC3C08091E800877F8093E8005D9883E080936D0160 +:2015800004C08EB3882309F4C3C08091E80080FFF8CF80910101893091F08A3069F4809167 +:2015A0006601813049F480916101909162018093F1009093F1009BC08091700196C06091A3 +:2015C00063017091640120916101309162016F5F7F4F7B01E21AF30A615070408091660120 +:2015E000882389F5870116950795C901A0916001B0E09C01AD011FC08091F200803271F4C3 +:201600008091E8008E7F8093E80004C08EB3882309F47EC08091E80080FFF8CFF90185918F +:2016200094918093F1009093F100015010402E5F3F4F4F4F5F4F01151105F1F670936201EC +:201640006093610129C0823039F523C08091F200803271F48091E8008E7F8093E80004C0AA +:201660008EB3882309F454C08091E80080FFF8CF0091610110916201C80104D38093F10093 +:201680000F5F1F4F10936201009361010894E108F108E114F104D1F682E08093010127C0E6 +:2016A0008091E800877F8093E80080915D018093F1001092F1001092F1001092F1008091F3 +:2016C00001018093F1001092F10011C08091E800877F8093E80010925D0119C08091E800D4 +:2016E000877F8093E800809101018093F1008091E8008E7F8093E8000AC08091E800877F08 +:201700008093E8005D9A5C9A82E08093010187D0DF91CF911F910F91FF90EF90DF90CF9017 +:20172000BF90AF909F907F906F905F904F903F902F9008952BD181E085BF15BE089584B799 +:20174000877F84BF88E10FB6F89480936000109260000FBE81E085BF82E085BF8AB18063DB +:201760008AB98BB180638BB90CC1E9DF789401C080D2809100018823D9F780915C01882369 +:20178000B9F7D8DFE0915E01F0915F010995FA01923071F0933089F0913029F488E091E082 +:2017A00022E130E019C080E090E020E030E014C08AE191E02BE130E00FC0882339F48091D9 +:2017C0003501282F30E085E391E006C080913901282F30E089E391E091838083C9010895C0 +:2017E0008091EB0081608093EB001092ED006093EC004093ED008091EE00881F8827881FE4 +:2018000008951092F4001092F0001092E8001092ED00EBEEF0E080818E7F80830895809182 +:20182000730188238CF403C08EB38823B1F08091E80082FFF9CF8091E8008B7F8093E80079 +:2018400008958EB3882349F08091E80080FFF9CF8091E8008E7F8093E80008959C0140917A +:20186000790150917A014617570718F4F90120E038C06115710511F0AB01F8CF8091E80080 +:201880008E7F8093E80040E050E0F0CF8091E80083FF02C081E008958091E80082FD2DC091 +:2018A0008EB3882381F18EB3853079F18091E80080FF17C09091F20006C081918093F1002C +:2018C000415050409F5F4115510511F09032A8F320E0903209F421E08091E8008E7F809306 +:2018E000E8004115510591F6222381F606C08EB3882349F08EB3853041F08091E80082FF85 +:20190000F6CF80E0089582E0089583E0089554D056D01EBA1092710184E089BD89B5826006 +:2019200089BD09B400FEFDCF8091D800982F9F779093D80080688093D800809163008E7FC5 +:20194000809363008091D8008F7D8093D8008091E0008E7F8093E0008091E1008E7F80932E +:20196000E1008091E20081608093E2008091E100877F8093E1008091E20088608093E20001 +:201980000895C5DF81E0809372010895C0DFE0EEF0E0808181608083E8EDF0E080818F77B4 +:2019A00080830AD00CD019BCE3E6F0E08081816080831092720108951092E20008951092A6 +:2019C000E10008951F920F920FB60F9211242F933F934F935F936F937F938F939F93AF938A +:2019E000BF93EF93FF938091E10080FF1BC08091E20080FF17C08091E1008E7F8093E100F9 +:201A00008091E2008E7F8093E2008091E20080618093E2008091D80080628093D80019BC7D +:201A20001EBA26D18091E10084FF29C08091E20084FF25C084E089BD89B5826089BD09B451 +:201A400000FEFDCF8091D8008F7D8093D8008091E1008F7E8093E1008091E2008F7E8093D6 +:201A6000E2008091E20081608093E20080917101882311F481E001C084E08EBBF9D08091DF +:201A8000E10083FF22C08091E20083FF1EC08091E100877F8093E10082E08EBB1092710103 +:201AA0008091E1008E7F8093E1008091E2008E7F8093E2008091E20080618093E200A1DEF6 +:201AC00080E060E042E28CDED3D08091E10082FF0AC08091E20082FF06C08091E1008B7FC2 +:201AE0008093E100C5D0FF91EF91BF91AF919F918F917F916F915F914F913F912F910F905E +:201B00000FBE0F901F9018951F93DF93CF9300D0CDB7DEB7E3E7F1E08091F100819381E07C +:201B2000EB37F807C9F79091730180917401853011F1863040F48130B9F0813070F08330EA +:201B400009F081C011C0883009F453C0893009F462C0863009F077C02DC0903809F474C00E +:201B6000923809F070C070C0992309F46DC0923009F069C069C0992309F065C0109175015E +:201B80008091E800877F8093E80049DE04C08EB3882309F459C08091E80080FFF8CF812F6F +:201BA0008F7711F492E001C093E09EBB80688093E3004AC09058923008F045C08091750105 +:201BC0009091760160917701AE014F5F5F4FDFDDBC010097C9F18091E800877F8093E80035 +:201BE00089819A813BDE8091E8008B7F8093E8002BC0903841F58091E800877F8093E800C6 +:201C0000809171018093F1008091E8008E7F8093E80005DE19C09923B1F4909175019230C6 +:201C200098F48091E800877F8093E80090937101F6DD80917101882311F483E001C084E0FB +:201C40008EBB16D001C040DB8091E80083FF0AC08091EB0080628093EB008091E800877F59 +:201C60008093E8000F900F90CF91DF911F91089508958EB3882329F08091E80083FF01C030 +:201C800043CF0895F999FECF92BD81BDF89A992780B50895262FF999FECF1FBA92BD81BD6B +:201CA00020BD0FB6F894FA9AF99A0FBE01960895F894FFCF01021E938220DCFB1201100123 +:201CC00000000020EB03F72F00000001000109021B0001010080320904000000FE010200E6 +:201CE0000921030000000C0001040309042003410072006400750069006E006F002000552C +:101D0000006E006F002000440046005500000000F7 +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.c b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.c new file mode 100644 index 0000000..7bed831 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.c @@ -0,0 +1,728 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the DFU class bootloader. This file contains the complete bootloader logic. + */ + +#define INCLUDE_FROM_BOOTLOADER_C +#include "Arduino-usbdfu.h" + +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run + * via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application + * jumped to via an indirect jump to location 0x0000 (or other location specified by the host). + */ +bool RunBootloader = true; + +/** Flag to indicate if the bootloader is waiting to exit. When the host requests the bootloader to exit and + * jump to the application address it specifies, it sends two sequential commands which must be properly + * acknowledged. Upon reception of the first the RunBootloader flag is cleared and the WaitForExit flag is set, + * causing the bootloader to wait for the final exit command before shutting down. + */ +bool WaitForExit = false; + +/** Current DFU state machine state, one of the values in the DFU_State_t enum. */ +uint8_t DFU_State = dfuIDLE; + +/** Status code of the last executed DFU command. This is set to one of the values in the DFU_Status_t enum after + * each operation, and returned to the host when a Get Status DFU request is issued. + */ +uint8_t DFU_Status = OK; + +/** Data containing the DFU command sent from the host. */ +DFU_Command_t SentCommand; + +/** Response to the last issued Read Data DFU command. Unlike other DFU commands, the read command + * requires a single byte response from the bootloader containing the read data when the next DFU_UPLOAD command + * is issued by the host. + */ +uint8_t ResponseByte; + +/** Pointer to the start of the user application. By default this is 0x0000 (the reset vector), however the host + * may specify an alternate address when issuing the application soft-start command. + */ +AppPtr_t AppStartPtr = (AppPtr_t)0x0000; + +/** 64-bit flash page number. This is concatenated with the current 16-bit address on USB AVRs containing more than + * 64KB of flash memory. + */ +uint8_t Flash64KBPage = 0; + +/** Memory start address, indicating the current address in the memory being addressed (either FLASH or EEPROM + * depending on the issued command from the host). + */ +uint16_t StartAddr = 0x0000; + +/** Memory end address, indicating the end address to read to/write from in the memory being addressed (either FLASH + * of EEPROM depending on the issued command from the host). + */ +uint16_t EndAddr = 0x0000; + + +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ +volatile struct +{ + uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ + uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ + uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ +} PulseMSRemaining; + +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously + * runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start + * the loaded application code. + */ +int main(void) +{ + /* Configure hardware required by the bootloader */ + SetupHardware(); + + /* Enable global interrupts so that the USB stack can function */ + sei(); + + /* Run the USB management task while the bootloader is supposed to be running */ + while (RunBootloader || WaitForExit) + USB_USBTask(); + + /* Reset configured hardware back to their original states for the user application */ + ResetHardware(); + + /* Start the user application */ + AppStartPtr(); +} + +/** Configures all hardware required for the bootloader. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ +// clock_prescale_set(clock_div_1); + + /* Relocate the interrupt vector table to the bootloader section */ + MCUCR = (1 << IVCE); + MCUCR = (1 << IVSEL); + + LEDs_Init(); + + /* Initialize the USB subsystem */ + USB_Init(); +} + +/** Resets all configured hardware required for the bootloader back to their original states. */ +void ResetHardware(void) +{ + /* Shut down the USB subsystem */ + USB_ShutDown(); + + /* Relocate the interrupt vector table back to the application section */ + MCUCR = (1 << IVCE); + MCUCR = 0; +} + +/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific + * control requests that are not handled internally by the USB library (including the DFU commands, which are + * all issued via the control endpoint), so that they can be handled appropriately for the application. + */ +void EVENT_USB_Device_UnhandledControlRequest(void) +{ + /* Get the size of the command and data from the wLength value */ + SentCommand.DataSize = USB_ControlRequest.wLength; + + /* Turn off TX LED(s) once the TX pulse period has elapsed */ + if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_TX); + + /* Turn off RX LED(s) once the RX pulse period has elapsed */ + if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_RX); + + switch (USB_ControlRequest.bRequest) + { + case DFU_DNLOAD: + LEDs_TurnOnLEDs(LEDMASK_RX); + PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; + + Endpoint_ClearSETUP(); + + /* Check if bootloader is waiting to terminate */ + if (WaitForExit) + { + /* Bootloader is terminating - process last received command */ + ProcessBootloaderCommand(); + + /* Turn off TX/RX status LEDs so that they're not left on when application starts */ + LEDs_TurnOffLEDs(LEDMASK_TX); + LEDs_TurnOffLEDs(LEDMASK_RX); + + /* Indicate that the last command has now been processed - free to exit bootloader */ + WaitForExit = false; + } + + /* If the request has a data stage, load it into the command struct */ + if (SentCommand.DataSize) + { + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + /* First byte of the data stage is the DNLOAD request's command */ + SentCommand.Command = Endpoint_Read_Byte(); + + /* One byte of the data stage is the command, so subtract it from the total data bytes */ + SentCommand.DataSize--; + + /* Load in the rest of the data stage as command parameters */ + for (uint8_t DataByte = 0; (DataByte < sizeof(SentCommand.Data)) && + Endpoint_BytesInEndpoint(); DataByte++) + { + SentCommand.Data[DataByte] = Endpoint_Read_Byte(); + SentCommand.DataSize--; + } + + /* Process the command */ + ProcessBootloaderCommand(); + } + + /* Check if currently downloading firmware */ + if (DFU_State == dfuDNLOAD_IDLE) + { + if (!(SentCommand.DataSize)) + { + DFU_State = dfuIDLE; + } + else + { + /* Throw away the filler bytes before the start of the firmware */ + DiscardFillerBytes(DFU_FILLER_BYTES_SIZE); + + /* Throw away the packet alignment filler bytes before the start of the firmware */ + DiscardFillerBytes(StartAddr % FIXED_CONTROL_ENDPOINT_SIZE); + + /* Calculate the number of bytes remaining to be written */ + uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); + + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Write flash + { + /* Calculate the number of words to be written from the number of bytes to be written */ + uint16_t WordsRemaining = (BytesRemaining >> 1); + + union + { + uint16_t Words[2]; + uint32_t Long; + } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; + + uint32_t CurrFlashPageStartAddress = CurrFlashAddress.Long; + uint8_t WordsInFlashPage = 0; + + while (WordsRemaining--) + { + /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ + if (!(Endpoint_BytesInEndpoint())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Write the next word into the current flash page */ + boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_Word_LE()); + + /* Adjust counters */ + WordsInFlashPage += 1; + CurrFlashAddress.Long += 2; + + /* See if an entire page has been written to the flash page buffer */ + if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining)) + { + /* Commit the flash page to memory */ + boot_page_write(CurrFlashPageStartAddress); + boot_spm_busy_wait(); + + /* Check if programming incomplete */ + if (WordsRemaining) + { + CurrFlashPageStartAddress = CurrFlashAddress.Long; + WordsInFlashPage = 0; + + /* Erase next page's temp buffer */ + boot_page_erase(CurrFlashAddress.Long); + boot_spm_busy_wait(); + } + } + } + + /* Once programming complete, start address equals the end address */ + StartAddr = EndAddr; + + /* Re-enable the RWW section of flash */ + boot_rww_enable(); + } + else // Write EEPROM + { + while (BytesRemaining--) + { + /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ + if (!(Endpoint_BytesInEndpoint())) + { + Endpoint_ClearOUT(); + + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Read the byte from the USB interface and write to to the EEPROM */ + eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_Byte()); + + /* Adjust counters */ + StartAddr++; + } + } + + /* Throw away the currently unused DFU file suffix */ + DiscardFillerBytes(DFU_FILE_SUFFIX_SIZE); + } + } + + Endpoint_ClearOUT(); + + Endpoint_ClearStatusStage(); + + break; + case DFU_UPLOAD: + Endpoint_ClearSETUP(); + + LEDs_TurnOnLEDs(LEDMASK_TX); + PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + + if (DFU_State != dfuUPLOAD_IDLE) + { + if ((DFU_State == dfuERROR) && IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank Check + { + /* Blank checking is performed in the DFU_DNLOAD request - if we get here we've told the host + that the memory isn't blank, and the host is requesting the first non-blank address */ + Endpoint_Write_Word_LE(StartAddr); + } + else + { + /* Idle state upload - send response to last issued command */ + Endpoint_Write_Byte(ResponseByte); + } + } + else + { + /* Determine the number of bytes remaining in the current block */ + uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1); + + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read FLASH + { + /* Calculate the number of words to be written from the number of bytes to be written */ + uint16_t WordsRemaining = (BytesRemaining >> 1); + + union + { + uint16_t Words[2]; + uint32_t Long; + } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; + + while (WordsRemaining--) + { + /* Check if endpoint is full - if so clear it and wait until ready for next packet */ + if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Read the flash word and send it via USB to the host */ + #if (FLASHEND > 0xFFFF) + Endpoint_Write_Word_LE(pgm_read_word_far(CurrFlashAddress.Long)); + #else + Endpoint_Write_Word_LE(pgm_read_word(CurrFlashAddress.Long)); + #endif + + /* Adjust counters */ + CurrFlashAddress.Long += 2; + } + + /* Once reading is complete, start address equals the end address */ + StartAddr = EndAddr; + } + else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM + { + while (BytesRemaining--) + { + /* Check if endpoint is full - if so clear it and wait until ready for next packet */ + if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) + { + Endpoint_ClearIN(); + + while (!(Endpoint_IsINReady())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + + /* Read the EEPROM byte and send it via USB to the host */ + Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)StartAddr)); + + /* Adjust counters */ + StartAddr++; + } + } + + /* Return to idle state */ + DFU_State = dfuIDLE; + } + + Endpoint_ClearIN(); + + Endpoint_ClearStatusStage(); + break; + case DFU_GETSTATUS: + Endpoint_ClearSETUP(); + + /* Write 8-bit status value */ + Endpoint_Write_Byte(DFU_Status); + + /* Write 24-bit poll timeout value */ + Endpoint_Write_Byte(0); + Endpoint_Write_Word_LE(0); + + /* Write 8-bit state value */ + Endpoint_Write_Byte(DFU_State); + + /* Write 8-bit state string ID number */ + Endpoint_Write_Byte(0); + + Endpoint_ClearIN(); + + Endpoint_ClearStatusStage(); + break; + case DFU_CLRSTATUS: + Endpoint_ClearSETUP(); + + /* Reset the status value variable to the default OK status */ + DFU_Status = OK; + + Endpoint_ClearStatusStage(); + break; + case DFU_GETSTATE: + Endpoint_ClearSETUP(); + + /* Write the current device state to the endpoint */ + Endpoint_Write_Byte(DFU_State); + + Endpoint_ClearIN(); + + Endpoint_ClearStatusStage(); + break; + case DFU_ABORT: + Endpoint_ClearSETUP(); + + /* Turn off TX/RX status LEDs so that they're not left on when application starts */ + LEDs_TurnOffLEDs(LEDMASK_TX); + LEDs_TurnOffLEDs(LEDMASK_RX); + + /* Reset the current state variable to the default idle state */ + DFU_State = dfuIDLE; + + Endpoint_ClearStatusStage(); + break; + } +} + +/** Routine to discard the specified number of bytes from the control endpoint stream. This is used to + * discard unused bytes in the stream from the host, including the memory program block suffix. + * + * \param[in] NumberOfBytes Number of bytes to discard from the host from the control endpoint + */ +static void DiscardFillerBytes(uint8_t NumberOfBytes) +{ + while (NumberOfBytes--) + { + if (!(Endpoint_BytesInEndpoint())) + { + Endpoint_ClearOUT(); + + /* Wait until next data packet received */ + while (!(Endpoint_IsOUTReceived())) + { + if (USB_DeviceState == DEVICE_STATE_Unattached) + return; + } + } + else + { + Endpoint_Discard_Byte(); + } + } +} + +/** Routine to process an issued command from the host, via a DFU_DNLOAD request wrapper. This routine ensures + * that the command is allowed based on the current secure mode flag value, and passes the command off to the + * appropriate handler function. + */ +static void ProcessBootloaderCommand(void) +{ + /* Check if device is in secure mode */ +// if (IsSecure) +// { +// /* Don't process command unless it is a READ or chip erase command */ +// if (!(((SentCommand.Command == COMMAND_WRITE) && +// IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) || +// (SentCommand.Command == COMMAND_READ))) +// { +// /* Set the state and status variables to indicate the error */ +// DFU_State = dfuERROR; +// DFU_Status = errWRITE; +// +// /* Stall command */ +// Endpoint_StallTransaction(); +// +// /* Don't process the command */ +// return; +// } +// } + + /* Dispatch the required command processing routine based on the command type */ + switch (SentCommand.Command) + { + case COMMAND_PROG_START: + ProcessMemProgCommand(); + break; + case COMMAND_DISP_DATA: + ProcessMemReadCommand(); + break; + case COMMAND_WRITE: + ProcessWriteCommand(); + break; + case COMMAND_READ: + ProcessReadCommand(); + break; + case COMMAND_CHANGE_BASE_ADDR: + if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x03, 0x00)) // Set 64KB flash page command + Flash64KBPage = SentCommand.Data[2]; + break; + } +} + +/** Routine to concatenate the given pair of 16-bit memory start and end addresses from the host, and store them + * in the StartAddr and EndAddr global variables. + */ +static void LoadStartEndAddresses(void) +{ + union + { + uint8_t Bytes[2]; + uint16_t Word; + } Address[2] = {{.Bytes = {SentCommand.Data[2], SentCommand.Data[1]}}, + {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}}; + + /* Load in the start and ending read addresses from the sent data packet */ + StartAddr = Address[0].Word; + EndAddr = Address[1].Word; +} + +/** Handler for a Memory Program command issued by the host. This routine handles the preparations needed + * to write subsequent data from the host into the specified memory. + */ +static void ProcessMemProgCommand(void) +{ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Write FLASH command + IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Write EEPROM command + { + /* Load in the start and ending read addresses */ + LoadStartEndAddresses(); + + /* If FLASH is being written to, we need to pre-erase the first page to write to */ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) + { + union + { + uint16_t Words[2]; + uint32_t Long; + } CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}}; + + /* Erase the current page's temp buffer */ + boot_page_erase(CurrFlashAddress.Long); + boot_spm_busy_wait(); + } + + /* Set the state so that the next DNLOAD requests reads in the firmware */ + DFU_State = dfuDNLOAD_IDLE; + } +} + +/** Handler for a Memory Read command issued by the host. This routine handles the preparations needed + * to read subsequent data from the specified memory out to the host, as well as implementing the memory + * blank check command. + */ +static void ProcessMemReadCommand(void) +{ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) || // Read FLASH command + IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02)) // Read EEPROM command + { + /* Load in the start and ending read addresses */ + LoadStartEndAddresses(); + + /* Set the state so that the next UPLOAD requests read out the firmware */ + DFU_State = dfuUPLOAD_IDLE; + } + else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Blank check FLASH command + { + uint32_t CurrFlashAddress = 0; + + while (CurrFlashAddress < BOOT_START_ADDR) + { + /* Check if the current byte is not blank */ + #if (FLASHEND > 0xFFFF) + if (pgm_read_byte_far(CurrFlashAddress) != 0xFF) + #else + if (pgm_read_byte(CurrFlashAddress) != 0xFF) + #endif + { + /* Save the location of the first non-blank byte for response back to the host */ + Flash64KBPage = (CurrFlashAddress >> 16); + StartAddr = CurrFlashAddress; + + /* Set state and status variables to the appropriate error values */ + DFU_State = dfuERROR; + DFU_Status = errCHECK_ERASED; + + break; + } + + CurrFlashAddress++; + } + } +} + +/** Handler for a Data Write command issued by the host. This routine handles non-programming commands such as + * bootloader exit (both via software jumps and hardware watchdog resets) and flash memory erasure. + */ +static void ProcessWriteCommand(void) +{ + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x03)) // Start application + { + /* Indicate that the bootloader is terminating */ + WaitForExit = true; + + /* Check if data supplied for the Start Program command - no data executes the program */ + if (SentCommand.DataSize) + { + if (SentCommand.Data[1] == 0x01) // Start via jump + { + union + { + uint8_t Bytes[2]; + AppPtr_t FuncPtr; + } Address = {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}; + + /* Load in the jump address into the application start address pointer */ + AppStartPtr = Address.FuncPtr; + } + } + else + { + if (SentCommand.Data[1] == 0x00) // Start via watchdog + { + /* Start the watchdog to reset the AVR once the communications are finalized */ + wdt_enable(WDTO_250MS); + } + else // Start via jump + { + /* Set the flag to terminate the bootloader at next opportunity */ + RunBootloader = false; + } + } + } + else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) // Erase flash + { + uint32_t CurrFlashAddress = 0; + + /* Clear the application section of flash */ + while (CurrFlashAddress < BOOT_START_ADDR) + { + boot_page_erase(CurrFlashAddress); + boot_spm_busy_wait(); + boot_page_write(CurrFlashAddress); + boot_spm_busy_wait(); + + CurrFlashAddress += SPM_PAGESIZE; + } + + /* Re-enable the RWW section of flash as writing to the flash locks it out */ + boot_rww_enable(); + + /* Memory has been erased, reset the security bit so that programming/reading is allowed */ +// IsSecure = false; + } +} + +/** Handler for a Data Read command issued by the host. This routine handles bootloader information retrieval + * commands such as device signature and bootloader version retrieval. + */ +static void ProcessReadCommand(void) +{ + const uint8_t BootloaderInfo[3] = {BOOTLOADER_VERSION, BOOTLOADER_ID_BYTE1, BOOTLOADER_ID_BYTE2}; + const uint8_t SignatureInfo[3] = {AVR_SIGNATURE_1, AVR_SIGNATURE_2, AVR_SIGNATURE_3}; + + uint8_t DataIndexToRead = SentCommand.Data[1]; + + if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00)) // Read bootloader info + ResponseByte = BootloaderInfo[DataIndexToRead]; + else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01)) // Read signature byte + ResponseByte = SignatureInfo[DataIndexToRead - 0x30]; +} diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.h b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.h new file mode 100644 index 0000000..4fb236e --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Arduino-usbdfu.h @@ -0,0 +1,220 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Arduino-usbdfu.c. + */ + +#ifndef _ARDUINO_USB_DFU_BOOTLOADER_H_ +#define _ARDUINO_USB_DFU_BOOTLOADER_H_ + + /* Includes: */ + #include + #include + #include + #include + #include + #include + #include + #include + + #include "Descriptors.h" + + #include + #include + + /* Macros: */ + /** LED mask for the library LED driver, to indicate TX activity. */ + #define LEDMASK_TX LEDS_LED1 + + /** LED mask for the library LED driver, to indicate RX activity. */ + #define LEDMASK_RX LEDS_LED2 + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ + #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) + + /** Configuration define. Define this token to true to case the bootloader to reject all memory commands + * until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this + * can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are + * allowed at any time. + */ +// #define SECURE_MODE false + + /** Major bootloader version number. */ + #define BOOTLOADER_VERSION_MINOR 2 + + /** Minor bootloader version number. */ + #define BOOTLOADER_VERSION_REV 0 + + /** Complete bootloader version number expressed as a packed byte, constructed from the + * two individual bootloader version macros. + */ + #define BOOTLOADER_VERSION ((BOOTLOADER_VERSION_MINOR << 4) | BOOTLOADER_VERSION_REV) + + /** First byte of the bootloader identification bytes, used to identify a device's bootloader. */ + #define BOOTLOADER_ID_BYTE1 0xDC + + /** Second byte of the bootloader identification bytes, used to identify a device's bootloader. */ + #define BOOTLOADER_ID_BYTE2 0xFB + + /** Convenience macro, used to determine if the issued command is the given one-byte long command. + * + * \param[in] dataarr Command byte array to check against + * \param[in] cb1 First command byte to check + */ + #define IS_ONEBYTE_COMMAND(dataarr, cb1) (dataarr[0] == (cb1)) + + /** Convenience macro, used to determine if the issued command is the given two-byte long command. + * + * \param[in] dataarr Command byte array to check against + * \param[in] cb1 First command byte to check + * \param[in] cb2 Second command byte to check + */ + #define IS_TWOBYTE_COMMAND(dataarr, cb1, cb2) ((dataarr[0] == (cb1)) && (dataarr[1] == (cb2))) + + /** Length of the DFU file suffix block, appended to the end of each complete memory write command. + * The DFU file suffix is currently unused (but is designed to give extra file information, such as + * a CRC of the complete firmware for error checking) and so is discarded. + */ + #define DFU_FILE_SUFFIX_SIZE 16 + + /** Length of the DFU file filler block, appended to the start of each complete memory write command. + * Filler bytes are added to the start of each complete memory write command, and must be discarded. + */ + #define DFU_FILLER_BYTES_SIZE 26 + + /** DFU class command request to detach from the host. */ + #define DFU_DETATCH 0x00 + + /** DFU class command request to send data from the host to the bootloader. */ + #define DFU_DNLOAD 0x01 + + /** DFU class command request to send data from the bootloader to the host. */ + #define DFU_UPLOAD 0x02 + + /** DFU class command request to get the current DFU status and state from the bootloader. */ + #define DFU_GETSTATUS 0x03 + + /** DFU class command request to reset the current DFU status and state variables to their defaults. */ + #define DFU_CLRSTATUS 0x04 + + /** DFU class command request to get the current DFU state of the bootloader. */ + #define DFU_GETSTATE 0x05 + + /** DFU class command request to abort the current multi-request transfer and return to the dfuIDLE state. */ + #define DFU_ABORT 0x06 + + /** DFU command to begin programming the device's memory. */ + #define COMMAND_PROG_START 0x01 + + /** DFU command to begin reading the device's memory. */ + #define COMMAND_DISP_DATA 0x03 + + /** DFU command to issue a write command. */ + #define COMMAND_WRITE 0x04 + + /** DFU command to issue a read command. */ + #define COMMAND_READ 0x05 + + /** DFU command to issue a memory base address change command, to set the current 64KB flash page + * that subsequent flash operations should use. */ + #define COMMAND_CHANGE_BASE_ADDR 0x06 + + /* Type Defines: */ + /** Type define for a non-returning function pointer to the loaded application. */ + typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; + + /** Type define for a structure containing a complete DFU command issued by the host. */ + typedef struct + { + uint8_t Command; /**< Single byte command to perform, one of the COMMAND_* macro values */ + uint8_t Data[5]; /**< Command parameters */ + uint16_t DataSize; /**< Size of the command parameters */ + } DFU_Command_t; + + /* Enums: */ + /** DFU bootloader states. Refer to the DFU class specification for information on each state. */ + enum DFU_State_t + { + appIDLE = 0, + appDETACH = 1, + dfuIDLE = 2, + dfuDNLOAD_SYNC = 3, + dfuDNBUSY = 4, + dfuDNLOAD_IDLE = 5, + dfuMANIFEST_SYNC = 6, + dfuMANIFEST = 7, + dfuMANIFEST_WAIT_RESET = 8, + dfuUPLOAD_IDLE = 9, + dfuERROR = 10 + }; + + /** DFU command status error codes. Refer to the DFU class specification for information on each error code. */ + enum DFU_Status_t + { + OK = 0, + errTARGET = 1, + errFILE = 2, + errWRITE = 3, + errERASE = 4, + errCHECK_ERASED = 5, + errPROG = 6, + errVERIFY = 7, + errADDRESS = 8, + errNOTDONE = 9, + errFIRMWARE = 10, + errVENDOR = 11, + errUSBR = 12, + errPOR = 13, + errUNKNOWN = 14, + errSTALLEDPKT = 15 + }; + + /* Function Prototypes: */ + void SetupHardware(void); + void ResetHardware(void); + + void EVENT_USB_Device_UnhandledControlRequest(void); + + #if defined(INCLUDE_FROM_BOOTLOADER_C) + static void DiscardFillerBytes(uint8_t NumberOfBytes); + static void ProcessBootloaderCommand(void); + static void LoadStartEndAddresses(void); + static void ProcessMemProgCommand(void); + static void ProcessMemReadCommand(void); + static void ProcessWriteCommand(void); + static void ProcessReadCommand(void); + #endif + +#endif /* _ARDUINO_USB_DFU_BOOTLOADER_H_ */ diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Board/LEDs.h b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Board/LEDs.h new file mode 100644 index 0000000..152e8f5 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Board/LEDs.h @@ -0,0 +1,110 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/* + Board LEDs driver for the Benito board, from www.dorkbotpdx.org. +*/ + +#ifndef __LEDS_ARDUINOUNO_H__ +#define __LEDS_ARDUINOUNO_H__ + + /* Includes: */ + #include + +/* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the first LED on the board. */ + #define LEDS_LED1 (1 << 5) + + /** LED mask for the second LED on the board. */ + #define LEDS_LED2 (1 << 4) + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the none of the board LEDs */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRD |= LEDS_ALL_LEDS; + PORTD |= LEDS_ALL_LEDS; + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + PORTD &= ~LEDMask; + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + PORTD |= LEDMask; + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) + { + PORTD = ((PORTD | ActiveMask) & ~LEDMask); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + PORTD ^= LEDMask; + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return (PORTD & LEDS_ALL_LEDS); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.c b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.c new file mode 100644 index 0000000..4deaa06 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.c @@ -0,0 +1,189 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +USB_Descriptor_Device_t DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = 0x00, + .SubClass = 0x00, + .Protocol = 0x00, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x03EB, // Atmel + .ProductID = PRODUCT_ID_CODE, // MCU-dependent + .ReleaseNumber = 0x0000, + + .ManufacturerStrIndex = NO_DESCRIPTOR, + .ProductStrIndex = 0x01, + .SerialNumStrIndex = NO_DESCRIPTOR, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 1, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = USB_CONFIG_ATTR_BUSPOWERED, + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .DFU_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 0, + + .Class = 0xFE, + .SubClass = 0x01, + .Protocol = 0x02, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .DFU_Functional = + { + .Header = {.Size = sizeof(USB_DFU_Functional_Descriptor_t), .Type = DTYPE_DFUFunctional}, + + .Attributes = (ATTR_CAN_UPLOAD | ATTR_CAN_DOWNLOAD), + + .DetachTimeout = 0x0000, + .TransferSize = 0x0c00, + + .DFUSpecification = VERSION_BCD(01.01) + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +USB_Descriptor_String_t LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t ProductString = +{ + #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) + .Header = {.Size = USB_STRING_LEN(15), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Uno DFU" + #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) + .Header = {.Size = USB_STRING_LEN(21), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Mega 2560 DFU" + #endif +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = &DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = &ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + if (!(DescriptorNumber)) + { + Address = &LanguageString; + Size = LanguageString.Header.Size; + } + else + { + Address = &ProductString; + Size = ProductString.Header.Size; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.h b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.h new file mode 100644 index 0000000..6c93f20 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/Descriptors.h @@ -0,0 +1,177 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + /* Product-specific definitions: */ + #define ARDUINO_UNO_PID 0x0001 + #define ARDUINO_MEGA2560_PID 0x0010 + + /* Macros: */ + /** Descriptor type value for a DFU class functional descriptor. */ + #define DTYPE_DFUFunctional 0x21 + + /** DFU attribute mask, indicating that the DFU device will detach and re-attach when a DFU_DETACH + * command is issued, rather than the host issuing a USB Reset. + */ + #define ATTR_WILL_DETATCH (1 << 3) + + /** DFU attribute mask, indicating that the DFU device can communicate during the manifestation phase + * (memory programming phase). + */ + #define ATTR_MANEFESTATION_TOLLERANT (1 << 2) + + /** DFU attribute mask, indicating that the DFU device can accept DFU_UPLOAD requests to send data from + * the device to the host. + */ + #define ATTR_CAN_UPLOAD (1 << 1) + + /** DFU attribute mask, indicating that the DFU device can accept DFU_DNLOAD requests to send data from + * the host to the device. + */ + #define ATTR_CAN_DOWNLOAD (1 << 0) + + #if defined(__AVR_AT90USB1287__) + #define PRODUCT_ID_CODE 0x2FFB + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB1286__) + #define PRODUCT_ID_CODE 0x2FFB + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x97 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB647__) + #define PRODUCT_ID_CODE 0x2FF9 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB646__) + #define PRODUCT_ID_CODE 0x2FF9 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x96 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_ATmega32U6__) + #define PRODUCT_ID_CODE 0x2FFB + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega32U4__) + #define PRODUCT_ID_CODE 0x2FF4 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x87 + #elif defined(__AVR_ATmega32U2__) + #define PRODUCT_ID_CODE 0x2FF0 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x95 + #define AVR_SIGNATURE_3 0x8A + #elif defined(__AVR_ATmega16U4__) + #define PRODUCT_ID_CODE 0x2FF3 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x88 + #elif defined(__AVR_ATmega16U2__) + #define PRODUCT_ID_CODE 0x2FEF + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_AT90USB162__) + #define PRODUCT_ID_CODE 0x2FFA + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x94 + #define AVR_SIGNATURE_3 0x82 + #elif defined(__AVR_AT90USB82__) + #define PRODUCT_ID_CODE 0x2FEE + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x89 + #elif defined(__AVR_ATmega8U2__) + #define PRODUCT_ID_CODE 0x2FF7 + #define AVR_SIGNATURE_1 0x1E + #define AVR_SIGNATURE_2 0x93 + #define AVR_SIGNATURE_3 0x82 + #else + #error The selected AVR part is not currently supported by this bootloader. + #endif + + #if !defined(PRODUCT_ID_CODE) + #error Current AVR model is not supported by this bootloader. + #endif + + /* Type Defines: */ + /** Type define for a DFU class function descriptor. This descriptor gives DFU class information + * to the host when read, indicating the DFU device's capabilities. + */ + typedef struct + { + USB_Descriptor_Header_t Header; /**< Standard descriptor header structure */ + + uint8_t Attributes; /**< DFU device attributes, a mask comprising of the + * ATTR_* macros listed in this source file + */ + uint16_t DetachTimeout; /**< Timeout in milliseconds between a USB_DETACH + * command being issued and the device detaching + * from the USB bus + */ + uint16_t TransferSize; /**< Maximum number of bytes the DFU device can accept + * from the host in a transaction + */ + uint16_t DFUSpecification; /**< BCD packed DFU specification number this DFU + * device complies with + */ + } USB_DFU_Functional_Descriptor_t; + + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + USB_Descriptor_Interface_t DFU_Interface; + USB_DFU_Functional_Descriptor_t DFU_Functional; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/makefile b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/makefile new file mode 100644 index 0000000..1fb4ed3 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/makefile @@ -0,0 +1,710 @@ +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + + +# MCU name +MCU = atmega8u2 +MCU_AVRDUDE = at90usb82 + +# Specify the Arduino model using the assigned PID. This is used by Descriptors.c +# to set the product descriptor string (for DFU we must use the PID for each +# chip that dfu-bootloader or Flip expect) +# Uno PID: +ARDUINO_MODEL_PID = 0x0001 +# Mega 2560 PID: +#ARDUINO_MODEL_PID = 0x0010 + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_CLOCK below, as it is sourced by +# F_CLOCK after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_CLOCK, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_CLOCK = $(F_CPU) + + +# Starting byte address of the bootloader, as a byte address - computed via the formula +# BOOT_START = ((TOTAL_FLASH_BYTES - BOOTLOADER_SECTION_SIZE_BYTES) * 1024) +# +# Note that the bootloader size and start address given in AVRStudio is in words and not +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC. +BOOT_START = 0x1000 + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Arduino-usbdfu + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../.. + + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D CONTROL_ONLY_DEVICE +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=32 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -D NO_INTERNAL_SERIAL +LUFA_OPTS += -D NO_DEVICE_SELF_POWER +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP +LUFA_OPTS += -D NO_STREAM_CALLBACKS + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=c99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) +CDEFS += -DF_CLOCK=$(F_CLOCK)UL +CDEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CDEFS += -DTX_RX_LED_PULSE_MS=3 +CDEFS += $(LUFA_OPTS) + + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_CLOCK=$(F_CLOCK)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +ADEFS += $(LUFA_OPTS) + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START) +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Fuse settings for Arduino Uno DFU bootloader project +AVRDUDE_FUSES = -U efuse:w:0xF4:m -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m + +# Lock settings for Arduino Uno DFU bootloader project +AVRDUDE_LOCK = -U lock:w:0x0F:m + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkii + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -F -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_FUSES) $(AVRDUDE_LOCK) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program debug gdb-config diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/readme.txt b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/readme.txt new file mode 100644 index 0000000..e376679 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbdfu/readme.txt @@ -0,0 +1,7 @@ +To setup the project and program an ATMEG8U2 with the Arduino USB DFU bootloader: +1. unpack the source into LUFA's Bootloader directory +2. set ARDUINO_MODEL_PID in the makefile as appropriate +3. do "make clean; make; make program" + +Check that the board enumerates as either "Arduino Uno DFU" or "Arduino Mega 2560 DFU". Test by uploading the Arduino-usbserial application firmware (see instructions in Arduino-usbserial directory) + diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-mega.hex b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-mega.hex new file mode 100644 index 0000000..fbbeb07 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-mega.hex @@ -0,0 +1,256 @@ +:10000000A2C00000BBC00000B9C00000B7C0000023 +:10001000B5C00000B3C00000B1C00000AFC0000018 +:10002000ADC00000ABC00000A9C000005AC4000071 +:100030001EC40000A3C00000A1C000009FC00000BB +:100040009DC000009BC0000099C0000097C0000048 +:1000500095C0000093C0000091C0000014C10000D2 +:100060008DC000008BC0000089C0000087C0000068 +:1000700085C0000083C0000081C000007FC0000078 +:100080007DC000007BC0000079C0000077C0000088 +:1000900075C0000073C000001201100102000008CA +:1000A0004123100001000102DC0109023E000201AF +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:100120002403410072006400750069006E006F00D6 +:1001300020004D006500670061002000320035009E +:1001400036003000000011241FBECFEFD2E0DEBF2A +:10015000CDBF11E0A0E0B1E0E0EDFFE002C005900E +:100160000D92A631B107D9F712E0A6E1B1E001C0C6 +:100170001D92AF32B107E1F7F1D028C741CF9C0102 +:10018000DC01AE57BF4FED91FC9111974191119653 +:10019000FC93EE9380589F4FE817F90711F42D93C5 +:1001A0003C939FB7F894F901EC57FF4F8081815041 +:1001B00080839FBF842F0895DF92EF92FF920F9369 +:1001C0001F93FC018489813019F0823021F405C02D +:1001D00040E3D42E04C0DD2402C030E2D32E838954 +:1001E000823011F488E0D82A8589873031F0883050 +:1001F00031F0863031F482E003C084E001C086E053 +:10020000D82A1092C9001092C8001092CA00E78440 +:10021000F0880189128980E0E81681EEF80680E016 +:10022000080780E0180719F420E130E00FC0C8018A +:10023000B701969587957795679560587B47814E6E +:100240009F4FA8019701A0D6215030403093CD0098 +:100250002093CC00D092CA0080E0E81681EEF80628 +:1002600080E0080780E0180711F082E001C080E01C +:100270008093C80088E98093C9001F910F91FF9077 +:10028000EF90DF9008951F920F920FB60F921124F6 +:100290002F938F939F93EF93FF939091CE008EB304 +:1002A0008430F1F4E0919901F0919A019083E0910A +:1002B0009901F0919A01CF01019690939A01809350 +:1002C00099018959914021F489E191E092838183D8 +:1002D0009FB7F89480919D018F5F80939D019FBF90 +:1002E000FF91EF919F918F912F910F900FBE0F90E3 +:1002F0001F901895FC01858580FF02C05F980895C6 +:100300005F9A089580E091E0D5C580E091E088C5CE +:1003100084B7877F84BF28E10FB6F89420936000EC +:10032000109260000FBE87E690E09093CD0080931E +:10033000CC0086E08093CA001092C8002093C900C8 +:10034000539A5A9A8AB180638AB98BB180638BB908 +:1003500083D284E085BD5F9A579A08950F931F93C7 +:10036000CF93DF93D5DF2FB7F8948EE991E0909388 +:100370001F0280931E0290932102809320022FBFC0 +:100380002FB7F89489E191E090939A0180939901B5 +:1003900090939C0180939B012FBF7894CEE9D1E08C +:1003A00003E08FB7F894909122028FBF903809F143 +:1003B00080E091E0ABD497FD1CC0E0911E02F0916B +:1003C0001F028083E0911E02F0911F02CF0101966F +:1003D00090931F0280931E028E51924011F4D2839B +:1003E000C1839FB7F894809122028F5F809322028D +:1003F0009FBF8FB7F89410919D018FBFA89902C03D +:10040000113678F1A89A80919D01882361F05D985A +:100410000093160108C089E191E0B1DE682F80E009 +:1004200091E0DAD411501123B1F78091160188239D +:1004300051F0809116018150809316018091160130 +:10044000882309F45D9A80911701882351F08091E7 +:10045000170181508093170180911701882309F4B7 +:100460005C9A8FB7F894909122028FBF992369F01C +:100470008EE991E084DE982F8091C80085FFFCCF43 +:100480009093CE005C980093170180E091E095D4A2 +:100490002AD487CFDA01923049F0933061F091305D +:1004A000F9F4E8E9F0E022E130E01EC0EAEAF0E029 +:1004B0002EE330E019C0813049F0813018F08230ED +:1004C00079F408C0E8EEF0E0849107C0ECEEF0E0CB +:1004D000849103C0E0E2F1E08491282F30E004C071 +:1004E000E0E0F0E020E030E0ED93FC93C9010895F6 +:1004F00028E030E040E003C04F5F220F331F281791 +:100500003907D0F3842F8295807F08958093E90086 +:100510008091EB0081608093EB001092ED0060937E +:10052000EC004093ED008091EE00881F8827881F23 +:1005300008951092F40090E09093E9001092F0007A +:100540001092E8001092ED008091EB008E7F809376 +:10055000EB009F5F953081F70895809127028823F3 +:100560008CF403C08EB38823B1F08091E80082FF41 +:10057000F9CF8091E8008B778093E80008958EB3DF +:10058000882349F08091E80080FFF9CF8091E8004E +:100590008E778093E800089594E68091EC0080FFC8 +:1005A00005C08091E80080FF05C023C08091E8006D +:1005B00082FD1FC08EB3882311F482E008958EB3AC +:1005C000853011F483E008958091EB0085FF02C02F +:1005D00081E008958091E10082FFDFCF8091E1000A +:1005E0008B7F8093E100992311F484E0089591506A +:1005F000D4CF80E008959C0140912D0250912E02AD +:100600004617570718F4F90120E038C06115710545 +:1006100011F0AB01F8CF8091E8008E778093E8006D +:1006200040E050E0F0CF8091E80083FF02C081E01D +:1006300008958091E80082FD2DC08EB3882381F15A +:100640008EB3853079F18091E80080FF17C09091DA +:10065000F20006C081918093F100415050409F5FAD +:100660004115510511F09830A8F320E0983009F4B5 +:1006700021E08091E8008E778093E80041155105D4 +:1006800091F6222381F606C08EB3882349F08EB3FB +:10069000853041F08091E80082FFF6CF80E0089538 +:1006A00082E0089583E008959C0140912D025091CD +:1006B0002E024617570710F490E03BC061157105F4 +:1006C00011F0AB01F9CF8091E8008E778093E800BC +:1006D00040E050E0F1CF8091E80083FF02C081E06C +:1006E00008958091E80082FD30C08EB3882399F18F +:1006F0008EB3853091F18091E80080FF1AC080911F +:10070000F20009C0F9012F5F3F4FE491E093F1003F +:10071000415050408F5F4115510511F0883090F3E2 +:1007200090E0883009F491E08091E8008E77809322 +:10073000E8004115510579F6992369F606C08EB394 +:10074000882349F08EB3853041F08091E80082FF24 +:10075000F6CF80E0089582E0089583E008959C013B +:100760006115710529F48091E8008B778093E8008A +:10077000F90120C08091E80083FF02C081E0089564 +:100780008EB3882339F18EB3853031F18091E80042 +:1007900082FFF0CF06C08091F100819361507040DC +:1007A00021F08091F2008823B1F78091E8008B77E7 +:1007B0008093E80061157105E9F606C08EB38823C1 +:1007C00049F08EB3853041F08091E80080FFF6CF8C +:1007D00080E0089582E0089583E0089542D044D0F7 +:1007E0001EBA10922502109224021092230284E075 +:1007F00089BD89B5826089BD09B400FEFDCF8091B5 +:10080000D800982F9F779093D80080688093D80065 +:10081000809163008E7F809363008091D8008F7DEC +:100820008093D8008091E0008E7F8093E0008091DB +:10083000E1008E7F8093E1008091E20081608093EF +:10084000E2008091E100877F8093E1008091E200E7 +:1008500088608093E2000895C1DF81E080932602E2 +:1008600008951092E20008951092E10008951F92F9 +:100870000F920FB60F9211241F932F933F934F9314 +:100880005F936F937F938F939F93AF93BF93EF93F8 +:10089000FF93E9EEF0E0108117701082E0EFF0E0D6 +:1008A0008081877F80837894C3D0F894A9EEB0E0EC +:1008B0001C92E0EFF0E08081886080831C93FF91C0 +:1008C000EF91BF91AF919F918F917F916F915F91C8 +:1008D0004F913F912F911F910F900FBE0F901F903E +:1008E00018951F920F920FB60F9211242F933F93DA +:1008F0004F935F936F937F938F939F93AF93BF9328 +:10090000EF93FF938091E10080FF1BC08091E20094 +:1009100080FF17C08091E1008E7F8093E10080917D +:10092000E2008E7F8093E2008091E20080618093FC +:10093000E2008091D80080628093D80019BC1EBA72 +:10094000D1D18091E10084FF29C08091E20084FF31 +:1009500025C084E089BD89B5826089BD09B400FEE7 +:10096000FDCF8091D8008F7D8093D8008091E100E9 +:100970008F7E8093E1008091E2008F7E8093E20081 +:100980008091E20081608093E200809125028823BB +:1009900011F481E001C084E08EBBA4D18091E1001C +:1009A00083FF27C08091E20083FF23C08091E10094 +:1009B000877F8093E10082E08EBB109225028091B8 +:1009C000E1008E7F8093E1008091E2008E7F809332 +:1009D000E2008091E20080618093E200AADD80E085 +:1009E00060E042E093DD8091F00088608093F00049 +:1009F00079D18091E10082FF0AC08091E20082FFFC +:100A000006C08091E1008B7F8093E1006BD1FF9164 +:100A1000EF91BF91AF919F918F917F916F915F9176 +:100A20004F913F912F910F900FBE0F901F901895EF +:100A30001F93DF93CF93CDB7DEB7AC970FB6F89483 +:100A4000DEBF0FBECDBFE7E2F2E08091F1008193FF +:100A500022E0EF32F207C9F7809127023091280295 +:100A6000353009F487C0363040F43130C9F13130C7 +:100A700070F0333009F01DC133C0383009F4EFC0D5 +:100A8000393009F4FEC0363009F013C192C0803805 +:100A900021F0823809F00DC108C0909123028091A5 +:100AA0002402882399F0926011C080912B028770F4 +:100AB0008093E9008091EB0090E025E09695879582 +:100AC0002A95E1F7982F91701092E9008091E80043 +:100AD000877F8093E8009093F1001092F100CAC0E4 +:100AE000882319F0823009F0E4C090E08F71907093 +:100AF000009721F0029709F0DDC00CC08091290217 +:100B0000813009F0D7C010922402333069F5809308 +:100B100024022AC080912902882331F520912B02DA +:100B2000277009F4C7C02093E9008091EB0080FF93 +:100B3000C1C0333021F48091EB00806213C08091FA +:100B4000EB0080618093EB0081E090E002C0880FB1 +:100B5000991F2A95E2F78093EA001092EA008091AB +:100B6000EB0088608093EB001092E9008091E80030 +:100B7000877F83C0882309F09CC01091290280914F +:100B8000E800877F8093E800E8DC04C08EB3882308 +:100B900009F490C08091E80080FFF8CF812F8F7713 +:100BA00011F492E001C093E09EBB80688093E30063 +:100BB00081C08058823008F07CC0809129029091D9 +:100BC0002A0223E08C3D920799F55FB7F894DE0185 +:100BD00015964EE020E030E061E2E42FF0E0609313 +:100BE0005700849120FF03C082958F704F5F982F2C +:100BF0009F70892F805D8A3308F0895F8C931196EE +:100C00001C9211972F5F3F4F12962431310529F71F +:100C10005FBF8AE28B8383E08C838091E800877FCB +:100C20008093E800CE0103966AE270E0E4DC11C034 +:100C300060912B02AE014F5F5F4F2CDCBC0100972F +:100C4000C9F18091E800877F8093E80089819A81CB +:100C50002BDD8091E8008B778093E8002BC08038F3 +:100C600041F58091E800877F8093E800809125021C +:100C70008093F1008091E8008E778093E8006DDC2E +:100C800019C08823B1F490912902923098F4809190 +:100C9000E800877F8093E800909325025EDC8091D6 +:100CA0002502882311F483E001C084E08EBB2DDB94 +:100CB00001C028DB8091E80083FF0AC08091EB002F +:100CC00080628093EB008091E800877F8093E8004A +:100CD000AC960FB6F894DEBF0FBECDBFCF91DF91BB +:100CE0001F91089508951F938EB3882361F010918A +:100CF000E9001092E9008091E80083FF01C098DECE +:100D000017701093E9001F9108950895FC018EB3A8 +:100D1000843021F587859089A189B2890097A10542 +:100D2000B105E1F085818093E9008091E80082FFC0 +:100D300015C08091F200882319F42FEF3FEF04C013 +:100D40008091F100282F30E08091F200882341F457 +:100D50008091E8008B778093E80002C02FEF3FEF8F +:100D6000C9010895FC018EB3843011F587859089FF +:100D7000A189B2890097A105B105D1F08181809345 +:100D8000E9008091F2008823A9F09091E800809119 +:100D9000E8008E778093E80095FD0CC0FDDB982F6E +:100DA000882349F48091E8008E778093E80003C09F +:100DB00092E001C090E0892F0895FC018EB3843049 +:100DC00051F487859089A189B2890097A105B10561 +:100DD00011F0CF01C7CF08951F93FC01162F8EB3DA +:100DE0008430D9F487859089A189B2890097A105BB +:100DF000B10599F081818093E9008091E80085FD3B +:100E000008C08091E8008E778093E800C5DB8823D6 +:100E100029F41093F10080E001C082E01F91089551 +:100E20000F931F93CF93DF93EC010D96FC0189E0A4 +:100E3000DF011D928A95E9F72A813B8109818C8126 +:100E4000882311F410E001C014E0C90151DB182B14 +:100E50001260802F61E8412F59DB882329F12E8110 +:100E60003F810D818885882311F410E001C014E0D2 +:100E7000C9013EDB182B1260802F60E8412F46DB52 +:100E8000882391F02A853B8509858C85882311F478 +:100E900010E001C014E0C9012BDB182B1260802F79 +:100EA00061EC412F33DB01C080E0DF91CF911F91D6 +:100EB0000F910895CF93DF93EC018091E80083FFB9 +:100EC00060C0888190E020912B0230912C0228177D +:100ED000390709F056C080912802813261F08232D0 +:100EE00020F4803209F04DC019C0823269F183329A +:100EF00009F047C038C080912702813A09F041C00B +:100F00008091E800877F8093E800CE010F9667E02C +:100F100070E071DB8091E8008B7713C0809127022D +:100F2000813279F58091E800877F8093E800CE01D7 +:100F30000F9667E070E013DCCE013ED98091E800A7 +:100F40008E778093E8001DC0809127028132C9F41A +:100F50008091E800877F8093E800809129028D8747 +:100F6000CE01C8D90DC080912702813251F4809101 +:100F7000E800877F8093E800CE0160912902C5DEFA +:100F8000ECDADF91CF910895A1E21A2EAA1BBB1BC8 +:100F9000FD010DC0AA1FBB1FEE1FFF1FA217B30745 +:100FA000E407F50720F0A21BB30BE40BF50B661F5B +:100FB000771F881F991F1A9469F76095709580951F +:100FC00090959B01AC01BD01CF010895F894FFCF2E +:100FD0000003400000044000000208000000000080 +:060FE0000000000000000B +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-uno.hex b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-uno.hex new file mode 100644 index 0000000..ca51dfa --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-uno.hex @@ -0,0 +1,256 @@ +:100000009CC00000B5C00000B3C00000B1C000003B +:10001000AFC00000ADC00000ABC00000A9C0000030 +:10002000A7C00000A5C00000A3C0000054C4000089 +:1000300018C400009DC000009BC0000099C00000D3 +:1000400097C0000095C0000093C0000091C0000060 +:100050008FC000008DC000008BC000000EC10000EA +:1000600087C0000085C0000083C0000081C0000080 +:100070007FC000007DC000007BC0000079C0000090 +:1000800077C0000075C0000073C0000071C00000A0 +:100090006FC000006DC000001201100102000008D6 +:1000A0004123010001000102DC0109023E000201BE +:1000B00000C0320904000001020201000524000111 +:1000C0001004240206052406000107058203080027 +:1000D000FF09040100020A000000070504024000B5 +:1000E00001070583024000010403090432034100B3 +:1000F00072006400750069006E006F002000280027 +:100100007700770077002E006100720064007500B0 +:1001100069006E006F002E0063006300290000007C +:100120001803410072006400750069006E006F00E2 +:10013000200055006E006F00000011241FBECFEF9D +:10014000D2E0DEBFCDBF11E0A0E0B1E0E4ECFFE023 +:1001500002C005900D92A631B107D9F712E0A6E1D1 +:10016000B1E001C01D92AF32B107E1F7F1D028C76D +:1001700047CF9C01DC01AE57BF4FED91FC91119729 +:1001800041911196FC93EE9380589F4FE817F90721 +:1001900011F42D933C939FB7F894F901EC57FF4F5E +:1001A0008081815080839FBF842F0895DF92EF92DA +:1001B000FF920F931F93FC018489813019F08230E4 +:1001C00021F405C040E3D42E04C0DD2402C030E297 +:1001D000D32E8389823011F488E0D82A858987302C +:1001E00031F0883031F0863031F482E003C084E0B1 +:1001F00001C086E0D82A1092C9001092C80010925F +:10020000CA00E784F0880189128980E0E81681EE4F +:10021000F80680E0080780E0180719F420E130E0D4 +:100220000FC0C801B7019695879577956795605877 +:100230007B47814E9F4FA8019701A0D621503040A7 +:100240003093CD002093CC00D092CA0080E0E81615 +:1002500081EEF80680E0080780E0180711F082E0E0 +:1002600001C080E08093C80088E98093C9001F9195 +:100270000F91FF90EF90DF9008951F920F920FB6AD +:100280000F9211242F938F939F93EF93FF9390914D +:10029000CE008EB38430F1F4E0919901F0919A018F +:1002A0009083E0919901F0919A01CF01019690938A +:1002B0009A01809399018959914021F489E191E053 +:1002C000928381839FB7F89480919D018F5F809383 +:1002D0009D019FBFFF91EF919F918F912F910F9063 +:1002E0000FBE0F901F901895FC01858580FF02C0FE +:1002F0005F9808955F9A089580E091E0D5C580E009 +:1003000091E088C584B7877F84BF28E10FB6F89451 +:1003100020936000109260000FBE87E690E09093FB +:10032000CD008093CC0086E08093CA001092C80074 +:100330002093C900539A5A9A8AB180638AB98BB1C3 +:1003400080638BB983D284E085BD5F9A579A089504 +:100350000F931F93CF93DF93D5DF2FB7F8948EE9D8 +:1003600091E090931F0280931E029093210280934C +:1003700020022FBF2FB7F89489E191E090939A0162 +:100380008093990190939C0180939B012FBF789457 +:10039000CEE9D1E003E08FB7F894909122028FBFAD +:1003A000903809F180E091E0ABD497FD1CC0E0915A +:1003B0001E02F0911F028083E0911E02F0911F0245 +:1003C000CF01019690931F0280931E028E5192409E +:1003D00011F4D283C1839FB7F894809122028F5F7A +:1003E000809322029FBF8FB7F89410919D018FBF19 +:1003F000A89902C0113678F1A89A80919D018823AE +:1004000061F05D980093160108C089E191E0B1DECA +:10041000682F80E091E0DAD411501123B1F7809178 +:100420001601882351F080911601815080931601A6 +:1004300080911601882309F45D9A80911701882321 +:1004400051F080911701815080931701809117011D +:10045000882309F45C9A8FB7F894909122028FBF99 +:10046000992369F08EE991E084DE982F8091C8008D +:1004700085FFFCCF9093CE005C980093170180E03D +:1004800091E095D42AD487CFDA01923049F09330A5 +:1004900061F09130F9F4E8E9F0E022E130E01EC0CB +:1004A000EAEAF0E02EE330E019C0813049F0813013 +:1004B00018F0823079F408C0E8EEF0E0849107C0CB +:1004C000ECEEF0E0849103C0E0E2F1E08491282FAB +:1004D00030E004C0E0E0F0E020E030E0ED93FC9399 +:1004E000C901089528E030E040E003C04F5F220FCB +:1004F000331F28173907D0F3842F8295807F089502 +:100500008093E9008091EB0081608093EB00109272 +:10051000ED006093EC004093ED008091EE00881FA9 +:100520008827881F08951092F40090E09093E900C6 +:100530001092F0001092E8001092ED008091EB0014 +:100540008E7F8093EB009F5F953081F708958091B7 +:10055000270288238CF403C08EB38823B1F08091E6 +:10056000E80082FFF9CF8091E8008B778093E80064 +:1005700008958EB3882349F08091E80080FFF9CF79 +:100580008091E8008E778093E800089594E680914A +:10059000EC0080FF05C08091E80080FF05C023C00B +:1005A0008091E80082FD1FC08EB3882311F482E0A1 +:1005B00008958EB3853011F483E008958091EB00A7 +:1005C00085FF02C081E008958091E10082FFDFCFC6 +:1005D0008091E1008B7F8093E100992311F484E006 +:1005E00008959150D4CF80E008959C0140912D0250 +:1005F00050912E024617570718F4F90120E038C031 +:100600006115710511F0AB01F8CF8091E8008E778C +:100610008093E80040E050E0F0CF8091E80083FF55 +:1006200002C081E008958091E80082FD2DC08EB364 +:10063000882381F18EB3853079F18091E80080FFC5 +:1006400017C09091F20006C081918093F100415053 +:1006500050409F5F4115510511F09830A8F320E0FC +:10066000983009F421E08091E8008E778093E800CB +:100670004115510591F6222381F606C08EB38823D9 +:1006800049F08EB3853041F08091E80082FFF6CFCB +:1006900080E0089582E0089583E008959C014091F0 +:1006A0002D0250912E024617570710F490E03BC0E0 +:1006B0006115710511F0AB01F9CF8091E8008E77DB +:1006C0008093E80040E050E0F1CF8091E80083FFA4 +:1006D00002C081E008958091E80082FD30C08EB3B1 +:1006E000882399F18EB3853091F18091E80080FFE5 +:1006F0001AC08091F20009C0F9012F5F3F4FE491C9 +:10070000E093F100415050408F5F4115510511F0C9 +:10071000883090F390E0883009F491E08091E8000F +:100720008E778093E8004115510579F6992369F693 +:1007300006C08EB3882349F08EB3853041F0809196 +:10074000E80082FFF6CF80E0089582E0089583E01C +:1007500008959C016115710529F48091E8008B775B +:100760008093E800F90120C08091E80083FF02C077 +:1007700081E008958EB3882339F18EB3853031F14D +:100780008091E80082FFF0CF06C08091F100819354 +:100790006150704021F08091F2008823B1F7809180 +:1007A000E8008B778093E80061157105E9F606C0D3 +:1007B0008EB3882349F08EB3853041F08091E800F4 +:1007C00080FFF6CF80E0089582E0089583E00895E9 +:1007D00042D044D01EBA10922502109224021092E8 +:1007E000230284E089BD89B5826089BD09B400FE19 +:1007F000FDCF8091D800982F9F779093D800806884 +:100800008093D800809163008E7F809363008091F5 +:10081000D8008F7D8093D8008091E0008E7F8093F8 +:10082000E0008091E1008E7F8093E1008091E20002 +:1008300081608093E2008091E100877F8093E100F6 +:100840008091E20088608093E2000895C1DF81E03A +:100850008093260208951092E20008951092E1001C +:1008600008951F920F920FB60F9211241F932F938A +:100870003F934F935F936F937F938F939F93AF9328 +:10088000BF93EF93FF93E9EEF0E0108117701082B1 +:10089000E0EFF0E08081877F80837894C3D0F89484 +:1008A000A9EEB0E01C92E0EFF0E0808188608083E8 +:1008B0001C93FF91EF91BF91AF919F918F917F9189 +:1008C0006F915F914F913F912F911F910F900FBEAC +:1008D0000F901F9018951F920F920FB60F92112430 +:1008E0002F933F934F935F936F937F938F939F9338 +:1008F000AF93BF93EF93FF938091E10080FF1BC004 +:100900008091E20080FF17C08091E1008E7F80938C +:10091000E1008091E2008E7F8093E2008091E2000E +:1009200080618093E2008091D80080628093D8003B +:1009300019BC1EBAD1D18091E10084FF29C08091F9 +:10094000E20084FF25C084E089BD89B5826089BD4D +:1009500009B400FEFDCF8091D8008F7D8093D80030 +:100960008091E1008F7E8093E1008091E2008F7E94 +:100970008093E2008091E20081608093E2008091A8 +:100980002502882311F481E001C084E08EBBA4D14C +:100990008091E10083FF27C08091E20083FF23C0A4 +:1009A0008091E100877F8093E10082E08EBB10920E +:1009B00025028091E1008E7F8093E1008091E2002A +:1009C0008E7F8093E2008091E20080618093E2005C +:1009D000AADD80E060E042E093DD8091F000886075 +:1009E0008093F00079D18091E10082FF0AC080916C +:1009F000E20082FF06C08091E1008B7F8093E100DE +:100A00006BD1FF91EF91BF91AF919F918F917F91AA +:100A10006F915F914F913F912F910F900FBE0F906B +:100A20001F9018951F93DF93CF93CDB7DEB7AC9788 +:100A30000FB6F894DEBF0FBECDBFE7E2F2E08091C3 +:100A4000F100819322E0EF32F207C9F7809127028B +:100A500030912802353009F487C0363040F4313007 +:100A6000C9F1313070F0333009F01DC133C0383076 +:100A700009F4EFC0393009F4FEC0363009F013C173 +:100A800092C0803821F0823809F00DC108C09091E1 +:100A9000230280912402882399F0926011C08091F2 +:100AA0002B0287708093E9008091EB0090E025E0B5 +:100AB000969587952A95E1F7982F91701092E90005 +:100AC0008091E800877F8093E8009093F100109276 +:100AD000F100CAC0882319F0823009F0E4C090E028 +:100AE0008F719070009721F0029709F0DDC00CC063 +:100AF00080912902813009F0D7C01092240233304E +:100B000069F5809324022AC080912902882331F557 +:100B100020912B02277009F4C7C02093E90080912F +:100B2000EB0080FFC1C0333021F48091EB00806284 +:100B300013C08091EB0080618093EB0081E090E036 +:100B400002C0880F991F2A95E2F78093EA0010925D +:100B5000EA008091EB0088608093EB001092E9003E +:100B60008091E800877F83C0882309F09CC01091A2 +:100B700029028091E800877F8093E800E8DC04C0C8 +:100B80008EB3882309F490C08091E80080FFF8CFED +:100B9000812F8F7711F492E001C093E09EBB8068B3 +:100BA0008093E30081C08058823008F07CC080913F +:100BB000290290912A0223E08C3D920799F55FB7B4 +:100BC000F894DE0115964EE020E030E061E2E42F7B +:100BD000F0E060935700849120FF03C082958F70EE +:100BE0004F5F982F9F70892F805D8A3308F0895F4F +:100BF0008C9311961C9211972F5F3F4F12962431C0 +:100C0000310529F75FBF8AE28B8383E08C83809173 +:100C1000E800877F8093E800CE0103966AE270E0E7 +:100C2000E4DC11C060912B02AE014F5F5F4F2CDC02 +:100C3000BC010097C9F18091E800877F8093E800AC +:100C400089819A812BDD8091E8008B778093E80081 +:100C50002BC0803841F58091E800877F8093E800C1 +:100C6000809125028093F1008091E8008E77809337 +:100C7000E8006DDC19C08823B1F49091290292300C +:100C800098F48091E800877F8093E8009093250294 +:100C90005EDC80912502882311F483E001C084E0AA +:100CA0008EBB2DDB01C028DB8091E80083FF0AC0EA +:100CB0008091EB0080628093EB008091E800877F59 +:100CC0008093E800AC960FB6F894DEBF0FBECDBFA0 +:100CD000CF91DF911F91089508951F938EB38823BC +:100CE00061F01091E9001092E9008091E80083FF23 +:100CF00001C098DE17701093E9001F9108950895C0 +:100D0000FC018EB3843021F587859089A189B28951 +:100D10000097A105B105E1F085818093E9008091FC +:100D2000E80082FF15C08091F200882319F42FEFAC +:100D30003FEF04C08091F100282F30E08091F20055 +:100D4000882341F48091E8008B778093E80002C00B +:100D50002FEF3FEFC9010895FC018EB3843011F5E8 +:100D600087859089A189B2890097A105B105D1F045 +:100D700081818093E9008091F2008823A9F090910D +:100D8000E8008091E8008E778093E80095FD0CC024 +:100D9000FDDB982F882349F48091E8008E778093BB +:100DA000E80003C092E001C090E0892F0895FC01A3 +:100DB0008EB3843051F487859089A189B2890097D8 +:100DC000A105B10511F0CF01C7CF08951F93FC0114 +:100DD000162F8EB38430D9F487859089A189B28982 +:100DE0000097A105B10599F081818093E900809178 +:100DF000E80085FD08C08091E8008E778093E800C8 +:100E0000C5DB882329F41093F10080E001C082E063 +:100E10001F9108950F931F93CF93DF93EC010D96CD +:100E2000FC0189E0DF011D928A95E9F72A813B8167 +:100E300009818C81882311F410E001C014E0C901FC +:100E400051DB182B1260802F61E8412F59DB88237A +:100E500029F12E813F810D818885882311F410E0CE +:100E600001C014E0C9013EDB182B1260802F60E83E +:100E7000412F46DB882391F02A853B8509858C85A7 +:100E8000882311F410E001C014E0C9012BDB182BFA +:100E90001260802F61EC412F33DB01C080E0DF91D5 +:100EA000CF911F910F910895CF93DF93EC01809123 +:100EB000E80083FF60C0888190E020912B02309190 +:100EC0002C022817390709F056C080912802813278 +:100ED00061F0823220F4803209F04DC019C08232B4 +:100EE00069F1833209F047C038C080912702813A06 +:100EF00009F041C08091E800877F8093E800CE012F +:100F00000F9667E070E071DB8091E8008B7713C08B +:100F100080912702813279F58091E800877F809364 +:100F2000E800CE010F9667E070E013DCCE013ED9F9 +:100F30008091E8008E778093E8001DC080912702A1 +:100F40008132C9F48091E800877F8093E800809126 +:100F500029028D87CE01C8D90DC080912702813228 +:100F600051F48091E800877F8093E800CE01609182 +:100F70002902C5DEECDADF91CF910895A1E21A2EA5 +:100F8000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F2D +:100F9000A217B307E407F50720F0A21BB30BE40B7D +:100FA000F50B661F771F881F991F1A9469F76095C4 +:100FB0007095809590959B01AC01BD01CF0108957E +:040FC000F894FFCFD3 +:100FC400000340000004400000020800000000008C +:060FD40000000000000017 +:00000001FF diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.c b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.c new file mode 100644 index 0000000..4de73c8 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.c @@ -0,0 +1,242 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Main source file for the Arduino-usbserial project. This file contains the main tasks of + * the project and is responsible for the initial application hardware configuration. + */ + +#include "Arduino-usbserial.h" + +/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ +RingBuff_t USBtoUSART_Buffer; + +/** Circular buffer to hold data from the serial port before it is sent to the host. */ +RingBuff_t USARTtoUSB_Buffer; + +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ +volatile struct +{ + uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ + uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ + uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */ +} PulseMSRemaining; + +/** LUFA CDC Class driver interface configuration and state information. This structure is + * passed to all CDC Class driver functions, so that multiple instances of the same class + * within a device can be differentiated from one another. + */ +USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = + { + .Config = + { + .ControlInterfaceNumber = 0, + + .DataINEndpointNumber = CDC_TX_EPNUM, + .DataINEndpointSize = CDC_TXRX_EPSIZE, + .DataINEndpointDoubleBank = false, + + .DataOUTEndpointNumber = CDC_RX_EPNUM, + .DataOUTEndpointSize = CDC_TXRX_EPSIZE, + .DataOUTEndpointDoubleBank = false, + + .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, + .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, + .NotificationEndpointDoubleBank = false, + }, + }; + +/** Main program entry point. This routine contains the overall program flow, including initial + * setup of all components and the main program loop. + */ +int main(void) +{ + SetupHardware(); + + RingBuffer_InitBuffer(&USBtoUSART_Buffer); + RingBuffer_InitBuffer(&USARTtoUSB_Buffer); + + sei(); + + for (;;) + { + /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ + if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) + { + int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); + + /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ + if (!(ReceivedByte < 0)) + RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); + } + + /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ + RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); + if ((TIFR0 & (1 << TOV0)) || (BufferCount > BUFFER_NEARLY_FULL)) + { + TIFR0 |= (1 << TOV0); + + if (USARTtoUSB_Buffer.Count) { + LEDs_TurnOnLEDs(LEDMASK_TX); + PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS; + } + + /* Read bytes from the USART receive buffer into the USB IN endpoint */ + while (BufferCount--) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); + + /* Turn off TX LED(s) once the TX pulse period has elapsed */ + if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_TX); + + /* Turn off RX LED(s) once the RX pulse period has elapsed */ + if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse)) + LEDs_TurnOffLEDs(LEDMASK_RX); + } + + /* Load the next byte from the USART transmit buffer into the USART */ + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); + + LEDs_TurnOnLEDs(LEDMASK_RX); + PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; + } + + CDC_Device_USBTask(&VirtualSerial_CDC_Interface); + USB_USBTask(); + } +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Hardware Initialization */ + Serial_Init(9600, false); + LEDs_Init(); + USB_Init(); + + /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ + TCCR0B = (1 << CS02); + + /* Pull target /RESET line high */ + AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; + AVR_RESET_LINE_DDR |= AVR_RESET_LINE_MASK; +} + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); +} + +/** Event handler for the library USB Unhandled Control Request event. */ +void EVENT_USB_Device_UnhandledControlRequest(void) +{ + CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); +} + +/** Event handler for the CDC Class driver Line Encoding Changed event. + * + * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced + */ +void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + uint8_t ConfigMask = 0; + + switch (CDCInterfaceInfo->State.LineEncoding.ParityType) + { + case CDC_PARITY_Odd: + ConfigMask = ((1 << UPM11) | (1 << UPM10)); + break; + case CDC_PARITY_Even: + ConfigMask = (1 << UPM11); + break; + } + + if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) + ConfigMask |= (1 << USBS1); + + switch (CDCInterfaceInfo->State.LineEncoding.DataBits) + { + case 6: + ConfigMask |= (1 << UCSZ10); + break; + case 7: + ConfigMask |= (1 << UCSZ11); + break; + case 8: + ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); + break; + } + + /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ + UCSR1B = 0; + UCSR1A = 0; + UCSR1C = 0; + + /* Special case 57600 baud for compatibility with the ATmega328 bootloader. */ + UBRR1 = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) + ? SERIAL_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS) + : SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); + + UCSR1C = ConfigMask; + UCSR1A = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) ? 0 : (1 << U2X1); + UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); +} + +/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer + * for later transmission to the host. + */ +ISR(USART1_RX_vect, ISR_BLOCK) +{ + uint8_t ReceivedByte = UDR1; + + if (USB_DeviceState == DEVICE_STATE_Configured) + RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); +} + +/** Event handler for the CDC Class driver Host-to-Device Line Encoding Changed event. + * + * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced + */ +void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ + bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR); + + if (CurrentDTRState) + AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK; + else + AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK; +} diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.h b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.h new file mode 100644 index 0000000..99fde39 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial.h @@ -0,0 +1,79 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Arduino-usbserial.c. + */ + +#ifndef _ARDUINO_USBSERIAL_H_ +#define _ARDUINO_USBSERIAL_H_ + + /* Includes: */ + #include + #include + #include + #include + + #include "Descriptors.h" + + #include "Lib/LightweightRingBuff.h" + + #include + #include + #include + #include + #include + + /* Macros: */ + /** LED mask for the library LED driver, to indicate TX activity. */ + #define LEDMASK_TX LEDS_LED1 + + /** LED mask for the library LED driver, to indicate RX activity. */ + #define LEDMASK_RX LEDS_LED2 + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_ERROR (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ + #define LEDMASK_BUSY (LEDS_LED1 | LEDS_LED2) + + /* Function Prototypes: */ + void SetupHardware(void); + + void EVENT_USB_Device_Connect(void); + void EVENT_USB_Device_Disconnect(void); + void EVENT_USB_Device_ConfigurationChanged(void); + void EVENT_USB_Device_UnhandledControlRequest(void); + + void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); + +#endif /* _ARDUINO_USBSERIAL_H_ */ diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Board/LEDs.h b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Board/LEDs.h new file mode 100644 index 0000000..152e8f5 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Board/LEDs.h @@ -0,0 +1,110 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/* + Board LEDs driver for the Benito board, from www.dorkbotpdx.org. +*/ + +#ifndef __LEDS_ARDUINOUNO_H__ +#define __LEDS_ARDUINOUNO_H__ + + /* Includes: */ + #include + +/* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(INCLUDE_FROM_LEDS_H) + #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** LED mask for the first LED on the board. */ + #define LEDS_LED1 (1 << 5) + + /** LED mask for the second LED on the board. */ + #define LEDS_LED2 (1 << 4) + + /** LED mask for all the LEDs on the board. */ + #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2) + + /** LED mask for the none of the board LEDs */ + #define LEDS_NO_LEDS 0 + + /* Inline Functions: */ + #if !defined(__DOXYGEN__) + static inline void LEDs_Init(void) + { + DDRD |= LEDS_ALL_LEDS; + PORTD |= LEDS_ALL_LEDS; + } + + static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) + { + PORTD &= ~LEDMask; + } + + static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) + { + PORTD |= LEDMask; + } + + static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) + { + PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); + } + + static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) + { + PORTD = ((PORTD | ActiveMask) & ~LEDMask); + } + + static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) + { + PORTD ^= LEDMask; + } + + static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t LEDs_GetLEDs(void) + { + return (PORTD & LEDS_ALL_LEDS); + } + #endif + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.c b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.c new file mode 100644 index 0000000..705dddf --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.c @@ -0,0 +1,277 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * USB Device Descriptors, for library use when in USB device mode. Descriptors are special + * computer-readable structures which the host requests upon device enumeration, to determine + * the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/* On some devices, there is a factory set internal serial number which can be automatically sent to the host as + * the device's serial number when the Device Descriptor's .SerialNumStrIndex entry is set to USE_INTERNAL_SERIAL. + * This allows the host to track a device across insertions on different ports, allowing them to retain allocated + * resources like COM port numbers and drivers. On demos using this feature, give a warning on unsupported devices + * so that the user can supply their own serial number descriptor instead or remove the USE_INTERNAL_SERIAL value + * from the Device Descriptor (forcing the host to generate a serial number for each device from the VID, PID and + * port location). + */ +#if (USE_INTERNAL_SERIAL == NO_DESCRIPTOR) + #warning USE_INTERNAL_SERIAL is not available on this AVR - please manually construct a device serial descriptor. +#endif + +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall + * device characteristics, including the supported USB version, control endpoint size and the + * number of device configurations. The descriptor is read out by the USB host when the enumeration + * process begins. + */ +USB_Descriptor_Device_t PROGMEM DeviceDescriptor = +{ + .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + + .USBSpecification = VERSION_BCD(01.10), + .Class = 0x02, + .SubClass = 0x00, + .Protocol = 0x00, + + .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, + + .VendorID = 0x03EB, // Atmel + + .ProductID = 0x204B, // LUFA USB to Serial Demo Application + .ReleaseNumber = 0x0001, + + .ManufacturerStrIndex = 0x01, + .ProductStrIndex = 0x02, + .SerialNumStrIndex = USE_INTERNAL_SERIAL, + + .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + * of the device in one of its supported configurations, including information about any device interfaces + * and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + * a configuration so that the host may correctly communicate with the USB device. + */ +USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = +{ + .Config = + { + .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + + .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), + .TotalInterfaces = 2, + + .ConfigurationNumber = 1, + .ConfigurationStrIndex = NO_DESCRIPTOR, + + .ConfigAttributes = (USB_CONFIG_ATTR_BUSPOWERED | USB_CONFIG_ATTR_SELFPOWERED), + + .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) + }, + + .CDC_CCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 0, + .AlternateSetting = 0, + + .TotalEndpoints = 1, + + .Class = 0x02, + .SubClass = 0x02, + .Protocol = 0x01, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_Functional_IntHeader = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, + .SubType = 0x00, + + .Data = {0x01, 0x10} + }, + + .CDC_Functional_AbstractControlManagement = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(1)), .Type = 0x24}, + .SubType = 0x02, + + .Data = {0x06} + }, + + .CDC_Functional_Union = + { + .Header = {.Size = sizeof(CDC_FUNCTIONAL_DESCRIPTOR(2)), .Type = 0x24}, + .SubType = 0x06, + + .Data = {0x00, 0x01} + }, + + .CDC_NotificationEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_NOTIFICATION_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_NOTIFICATION_EPSIZE, + .PollingIntervalMS = 0xFF + }, + + .CDC_DCI_Interface = + { + .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, + + .InterfaceNumber = 1, + .AlternateSetting = 0, + + .TotalEndpoints = 2, + + .Class = 0x0A, + .SubClass = 0x00, + .Protocol = 0x00, + + .InterfaceStrIndex = NO_DESCRIPTOR + }, + + .CDC_DataOutEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_OUT | CDC_RX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + }, + + .CDC_DataInEndpoint = + { + .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, + + .EndpointAddress = (ENDPOINT_DESCRIPTOR_DIR_IN | CDC_TX_EPNUM), + .Attributes = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = CDC_TXRX_EPSIZE, + .PollingIntervalMS = 0x01 + } +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + * the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + * via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +USB_Descriptor_String_t PROGMEM LanguageString = +{ + .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + + .UnicodeString = {LANGUAGE_ID_ENG} +}; + +/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable + * form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t PROGMEM ManufacturerString = +{ + .Header = {.Size = USB_STRING_LEN(24), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino (www.arduino.cc)" +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + * Descriptor. + */ +USB_Descriptor_String_t PROGMEM ProductString = +{ + #if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID) + .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Uno" + #elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID) + .Header = {.Size = USB_STRING_LEN(17), .Type = DTYPE_String}, + + .UnicodeString = L"Arduino Mega 2560" + #endif + +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + * documentation) by the application code so that the address and size of a requested descriptor can be given + * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + * USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) +{ + const uint8_t DescriptorType = (wValue >> 8); + const uint8_t DescriptorNumber = (wValue & 0xFF); + + void* Address = NULL; + uint16_t Size = NO_DESCRIPTOR; + + switch (DescriptorType) + { + case DTYPE_Device: + Address = (void*)&DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + break; + case DTYPE_Configuration: + Address = (void*)&ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + break; + case DTYPE_String: + switch (DescriptorNumber) + { + case 0x00: + Address = (void*)&LanguageString; + Size = pgm_read_byte(&LanguageString.Header.Size); + break; + case 0x01: + Address = (void*)&ManufacturerString; + Size = pgm_read_byte(&ManufacturerString.Header.Size); + break; + case 0x02: + Address = (void*)&ProductString; + Size = pgm_read_byte(&ProductString.Header.Size); + break; + } + + break; + } + + *DescriptorAddress = Address; + return Size; +} diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.h b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.h new file mode 100644 index 0000000..3ac4e52 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Descriptors.h @@ -0,0 +1,88 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + + /* Includes: */ + #include + + #include + #include + + /* Product-specific definitions: */ + #define ARDUINO_UNO_PID 0x0001 + #define ARDUINO_MEGA2560_PID 0x0010 + + /* Macros: */ + /** Endpoint number of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPNUM 2 + + /** Endpoint number of the CDC device-to-host data IN endpoint. */ + #define CDC_TX_EPNUM 3 + + /** Endpoint number of the CDC host-to-device data OUT endpoint. */ + #define CDC_RX_EPNUM 4 + + /** Size in bytes of the CDC device-to-host notification IN endpoint. */ + #define CDC_NOTIFICATION_EPSIZE 8 + + /** Size in bytes of the CDC data IN and OUT endpoints. */ + #define CDC_TXRX_EPSIZE 64 + + /* Type Defines: */ + /** Type define for the device configuration descriptor structure. This must be defined in the + * application code, as the configuration descriptor contains several sub-descriptors which + * vary between devices, and which describe the device's usage to the host. + */ + typedef struct + { + USB_Descriptor_Configuration_Header_t Config; + USB_Descriptor_Interface_t CDC_CCI_Interface; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_IntHeader; + CDC_FUNCTIONAL_DESCRIPTOR(1) CDC_Functional_AbstractControlManagement; + CDC_FUNCTIONAL_DESCRIPTOR(2) CDC_Functional_Union; + USB_Descriptor_Endpoint_t CDC_NotificationEndpoint; + USB_Descriptor_Interface_t CDC_DCI_Interface; + USB_Descriptor_Endpoint_t CDC_DataOutEndpoint; + USB_Descriptor_Endpoint_t CDC_DataInEndpoint; + } USB_Descriptor_Configuration_t; + + /* Function Prototypes: */ + uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, + const uint8_t wIndex, + void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); + +#endif diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Lib/LightweightRingBuff.h b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Lib/LightweightRingBuff.h new file mode 100644 index 0000000..fb48c1f --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/Lib/LightweightRingBuff.h @@ -0,0 +1,197 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Ultra lightweight ring buffer, for fast insertion/deletion. + */ + +#ifndef _ULW_RING_BUFF_H_ +#define _ULW_RING_BUFF_H_ + + /* Includes: */ + #include + + #include + #include + + /* Defines: */ + /** Size of each ring buffer, in data elements - must be between 1 and 255. */ + #define BUFFER_SIZE 128 + + /** Maximum number of data elements to buffer before forcing a flush. + * Must be less than BUFFER_SIZE + */ + #define BUFFER_NEARLY_FULL 96 + + /** Type of data to store into the buffer. */ + #define RingBuff_Data_t uint8_t + + /** Datatype which may be used to store the count of data stored in a buffer, retrieved + * via a call to \ref RingBuffer_GetCount(). + */ + #if (BUFFER_SIZE <= 0xFF) + #define RingBuff_Count_t uint8_t + #else + #define RingBuff_Count_t uint16_t + #endif + + /* Type Defines: */ + /** Type define for a new ring buffer object. Buffers should be initialized via a call to + * \ref RingBuffer_InitBuffer() before use. + */ + typedef struct + { + RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */ + RingBuff_Data_t* In; /**< Current storage location in the circular buffer */ + RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */ + RingBuff_Count_t Count; + } RingBuff_t; + + /* Inline Functions: */ + /** Initializes a ring buffer ready for use. Buffers must be initialized via this function + * before any operations are called upon them. Already initialized buffers may be reset + * by re-initializing them using this function. + * + * \param[out] Buffer Pointer to a ring buffer structure to initialize + */ + static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) + { + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->In = Buffer->Buffer; + Buffer->Out = Buffer->Buffer; + } + } + + /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed + * by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that + * the buffer cannot be modified while the computation takes place. This value should be cached + * when reading out the contents of the buffer, so that as small a time as possible is spent + * in an atomic lock. + * + * \note The value returned by this function is guaranteed to only be the minimum number of bytes + * stored in the given buffer; this value may change as other threads write new data and so + * the returned number should be used only to determine how many successive reads may safely + * be performed on the buffer. + * + * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed + */ + static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer) + { + RingBuff_Count_t Count; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Count = Buffer->Count; + } + + return Count; + } + + /** Atomically determines if the specified ring buffer contains any free space. This should + * be tested before storing data to the buffer, to ensure that no data is lost due to a + * buffer overrun. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * + * \return Boolean true if the buffer contains no free space, false otherwise + */ + static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer) + { + return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE); + } + + /** Atomically determines if the specified ring buffer contains any data. This should + * be tested before removing data from the buffer, to ensure that the buffer does not + * underflow. + * + * If the data is to be removed in a loop, store the total number of bytes stored in the + * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable + * to reduce the time spent in atomicity locks. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * + * \return Boolean true if the buffer contains no free space, false otherwise + */ + static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer) + { + return (RingBuffer_GetCount(Buffer) == 0); + } + + /** Inserts an element into the ring buffer. + * + * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer + * otherwise data corruption may occur. Insertion and removal may occur from different execution + * threads. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * \param[in] Data Data element to insert into the buffer + */ + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, + const RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->Count++; + } + } + + /** Removes an element from the ring buffer. + * + * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer + * otherwise data corruption may occur. Insertion and removal may occur from different execution + * threads. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from + * + * \return Next data element stored in the buffer + */ + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) + { + Buffer->Count--; + } + + return Data; + } + +#endif diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/makefile b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/makefile new file mode 100644 index 0000000..79d6be2 --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/makefile @@ -0,0 +1,776 @@ +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. +# >> Modified for use with the LUFA project. << +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# Carlos Lamas +# Dean Camera +# Opendous Inc. +# Denver Gingerich +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make doxygen = Generate DoxyGen documentation for the project (must have +# DoxyGen installed) +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# MCU name(s) +# Since the ATMEGA8U2 part is not directly supported by the current +# versions of either avrdude or dfu-programmer, we specify a dummy +# part; AT90USB82 which is close enough in memory size and organization +MCU = atmega8u2 +MCU_AVRDUDE = at90usb82 +MCU_DFU = at90usb82 + +# Specify the Arduino model using the assigned PID. This is used by Descriptors.c +# to set PID and product descriptor string +# Uno PID: +ARDUINO_MODEL_PID = 0x0001 +# Mega 2560 PID: +#ARDUINO_MODEL_PID = 0x0010 + + +# Target board (see library "Board Types" documentation, NONE for projects not requiring +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called +# "Board" inside the application directory. +BOARD = USER + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_CLOCK below, as it is sourced by +# F_CLOCK after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# Input clock frequency. +# This will define a symbol, F_CLOCK, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_CLOCK = $(F_CPU) + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Arduino-usbserial + + +# Object files directory +# To put object files in current directory, use a dot (.), do NOT make +# this an empty or blank macro! +OBJDIR = . + + +# Path to the LUFA library +LUFA_PATH = ../.. + + +# LUFA library compile-time options +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_FLASH_DESCRIPTORS +LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" + + +# Create the LUFA source path variables by including the LUFA root makefile +include $(LUFA_PATH)/LUFA/makefile + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c \ + Descriptors.c \ + $(LUFA_SRC_USB) \ + $(LUFA_SRC_USBCLASS) \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Device.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/HostStandardReq.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Pipe.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBController.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/Events.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/USBInterrupt.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/USBTask.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/CDC.c \ + $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/CDC.c + + +# List C++ source files here. (C dependencies are automatically generated.) +CPPSRC = + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(LUFA_PATH)/ + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=gnu99 + + +# Place -D or -U options here for C sources +CDEFS = -DF_CPU=$(F_CPU)UL +CDEFS += -DF_CLOCK=$(F_CLOCK)UL +CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID) +CDEFS += -DBOARD=BOARD_$(BOARD) +CDEFS += $(LUFA_OPTS) +CDEFS += -DAVR_RESET_LINE_PORT="PORTD" +CDEFS += -DAVR_RESET_LINE_DDR="DDRD" +CDEFS += -DAVR_RESET_LINE_MASK="(1 << 7)" +CDEFS += -DTX_RX_LED_PULSE_MS=3 +CDEFS += -DPING_PONG_LED_PULSE_MS=100 + +# Place -D or -U options here for ASM sources +ADEFS = -DF_CPU=$(F_CPU) +ADEFS += -DF_CLOCK=$(F_CLOCK)UL +ADEFS += -DBOARD=BOARD_$(BOARD) +ADEFS += $(LUFA_OPTS) + +# Place -D or -U options here for C++ sources +CPPDEFS = -DF_CPU=$(F_CPU)UL +CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL +CPPDEFS += -DBOARD=BOARD_$(BOARD) +CPPDEFS += $(LUFA_OPTS) +#CPPDEFS += -D__STDC_LIMIT_MACROS +#CPPDEFS += -D__STDC_CONSTANT_MACROS + + + +#---------------- Compiler Options C ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char +CFLAGS += -funsigned-bitfields +CFLAGS += -ffunction-sections +CFLAGS += -fno-inline-small-functions +CFLAGS += -fpack-struct +CFLAGS += -fshort-enums +CFLAGS += -fno-strict-aliasing +CFLAGS += -Wall +CFLAGS += -Wstrict-prototypes +#CFLAGS += -mshort-calls +#CFLAGS += -fno-unit-at-a-time +#CFLAGS += -Wundef +#CFLAGS += -Wunreachable-code +#CFLAGS += -Wsign-compare +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Compiler Options C++ ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CPPFLAGS = -g$(DEBUG) +CPPFLAGS += $(CPPDEFS) +CPPFLAGS += -O$(OPT) +CPPFLAGS += -funsigned-char +CPPFLAGS += -funsigned-bitfields +CPPFLAGS += -fpack-struct +CPPFLAGS += -fshort-enums +CPPFLAGS += -fno-exceptions +CPPFLAGS += -Wall +CPPFLAGS += -Wundef +CFLAGS += -Wundef +#CPPFLAGS += -mshort-calls +#CPPFLAGS += -fno-unit-at-a-time +#CPPFLAGS += -Wstrict-prototypes +#CPPFLAGS += -Wunreachable-code +#CPPFLAGS += -Wsign-compare +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +#CPPFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + +# List any extra directories to look for libraries here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRALIBDIRS = + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += -Wl,--relax +LDFLAGS += -Wl,--gc-sections +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) +#LDFLAGS += -T linker_script.x + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkii + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FORCE = -F + +AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) +AVRDUDE_FLAGS += $(AVRDUDE_FORCE) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +AR = avr-ar rcs +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rm -rf +COPY = cp +WINSHELL = cmd + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling C: +MSG_COMPILING_CPP = Compiling C++: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: + + + + +# Define all object files. +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) + +# Define all listing files. +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +#all: begin gccversion sizebefore build checkinvalidevents showliboptions showtarget sizeafter end +all: begin gccversion sizebefore build showliboptions showtarget sizeafter end + +# Change the build target to build a HEX file or a library. +build: elf hex eep lss sym asm +#build: lib + + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym +asm: $(TARGET).s +LIBNAME=lib$(TARGET).a +lib: $(LIBNAME) + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +#$(LUFA_PATH)/LUFA/LUFA_Events.lst: +# @make -C $(LUFA_PATH)/LUFA/ LUFA_Events.lst + +#checkinvalidevents: $(LUFA_PATH)/LUFA/LUFA_Events.lst +# @echo +# @echo Checking for invalid events... +# @$(shell) avr-nm $(OBJ) | sed -n -e 's/^.*EVENT_/EVENT_/p' | \ +# grep -F -v --file=$(LUFA_PATH)/LUFA/LUFA_Events.lst > InvalidEvents.tmp || true +# @sed -n -e 's/^/ WARNING - INVALID EVENT NAME: /p' InvalidEvents.tmp +# @if test -s InvalidEvents.tmp; then exit 1; fi + +showliboptions: + @echo + @echo ---- Compile Time Library Options ---- + @for i in $(LUFA_OPTS:-D%=%); do \ + echo $$i; \ + done + @echo -------------------------------------- + +showtarget: + @echo + @echo --------- Target Information --------- + @echo AVR Model: $(MCU) + @echo Board: $(BOARD) + @echo Clock: $(F_CPU)Hz CPU, $(F_CLOCK)Hz Master + @echo -------------------------------------- + + +# Display compiler version information. +gccversion : + @$(CC) --version + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +flip: $(TARGET).hex + batchisp -hardware usb -device $(MCU_DFU) -operation erase f + batchisp -hardware usb -device $(MCU_DFU) -operation loadbuffer $(TARGET).hex program + batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 + +dfu: $(TARGET).hex + dfu-programmer $(MCU_DFU) erase + dfu-programmer $(MCU_DFU) flash --debug 1 $(TARGET).hex + dfu-programmer $(MCU_DFU) reset + + +flip-ee: $(TARGET).hex $(TARGET).eep + $(COPY) $(TARGET).eep $(TARGET)eep.hex + batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM erase + batchisp -hardware usb -device $(MCU_DFU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program + batchisp -hardware usb -device $(MCU_DFU) -operation start reset 0 + $(REMOVE) $(TARGET)eep.hex + +dfu-ee: $(TARGET).hex $(TARGET).eep + dfu-programmer $(MCU_DFU) flash-eeprom --debug 1 --suppress-bootloader-mem $(TARGET).eep + dfu-programmer $(MCU_DFU) reset + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT = $(OBJCOPY) --debugging +COFFCONVERT += --change-section-address .data-0x800000 +COFFCONVERT += --change-section-address .bss-0x800000 +COFFCONVERT += --change-section-address .noinit-0x800000 +COFFCONVERT += --change-section-address .eeprom-0x810000 + + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S -z $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Create library from object files. +.SECONDARY : $(TARGET).a +.PRECIOUS : $(OBJ) +%.a: $(OBJ) + @echo + @echo $(MSG_CREATING_LIBRARY) $@ + $(AR) $@ $(OBJ) + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +$(OBJDIR)/%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create object files from C++ source files. +$(OBJDIR)/%.o : %.cpp + @echo + @echo $(MSG_COMPILING_CPP) $< + $(CC) -c $(ALL_CPPFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C++ source files. +%.s : %.cpp + $(CC) -S $(ALL_CPPFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +$(OBJDIR)/%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list clean_binary end + +clean_binary: + $(REMOVE) $(TARGET).hex + +clean_list: + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) + $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVEDIR) .dep + +doxygen: + @echo Generating Project Documentation... + @doxygen Doxygen.conf + @echo Documentation Generation Complete. + +clean_doxygen: + rm -rf Documentation + +# Create object files directory +$(shell mkdir $(OBJDIR) 2>/dev/null) + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff doxygen clean \ +clean_list clean_doxygen program dfu flip flip-ee dfu-ee \ +debug gdb-config diff --git a/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/readme.txt b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/readme.txt new file mode 100644 index 0000000..289326b --- /dev/null +++ b/arduino-0022-linux-x64/hardware/arduino/firmwares/arduino-usbserial/readme.txt @@ -0,0 +1,13 @@ +To setup the project and upload the Arduino usbserial application firmware to an ATMEGA8U2 using the Arduino USB DFU bootloader: +1. unpack the source into LUFA's Projects directory +2. set ARDUINO_MODEL_PID in the makefile as appropriate +3. do "make clean; make" +4. put the 8U2 into USB DFU mode: +4.a. assert and hold the 8U2's RESET line +4.b. assert and hold the 8U2's HWB line +4.c. release the 8U2's RESET line +4.d. release the 8U2's HWB line +5. confirm that the board enumerates as either "Arduino Uno DFU" or "Arduino Mega 2560 DFU" +6. do "make dfu" (OS X or Linux - dfu-programmer must be installed first) or "make flip" (Windows - Flip must be installed first) + +Check that the board enumerates as either "Arduino Uno" or "Arduino Mega 2560". Test by uploading a new Arduino sketch from the Arduino IDE. diff --git a/arduino-0018-linux-x64/hardware/arduino/programmers.txt b/arduino-0022-linux-x64/hardware/arduino/programmers.txt similarity index 100% rename from arduino-0018-linux-x64/hardware/arduino/programmers.txt rename to arduino-0022-linux-x64/hardware/arduino/programmers.txt diff --git a/arduino-0022-linux-x64/hardware/tools/avrdude b/arduino-0022-linux-x64/hardware/tools/avrdude new file mode 100755 index 0000000000000000000000000000000000000000..f13912adc196c25dcf8dfcc742ff08f73071429a GIT binary patch literal 754889 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

    M5k59MRdyv!vEN~SC>p6Cvx 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 z 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 V4N`*$Hz#d-mX3wp&e_eI{{r{X1c3km literal 0 HcmV?d00001 diff --git a/arduino-0018-linux-x64/hardware/tools/avrdude.conf~ b/arduino-0022-linux-x64/hardware/tools/avrdude.conf similarity index 100% rename from arduino-0018-linux-x64/hardware/tools/avrdude.conf~ rename to arduino-0022-linux-x64/hardware/tools/avrdude.conf diff --git a/arduino-0018-linux-x64/lib/RXTXcomm.jar b/arduino-0022-linux-x64/lib/RXTXcomm.jar similarity index 89% rename from arduino-0018-linux-x64/lib/RXTXcomm.jar rename to arduino-0022-linux-x64/lib/RXTXcomm.jar index 84e5f01dff26139e016015725e00afc37ce58e0d..8971c811401b6e47b040bf83958e25f685784bca 100644 GIT binary patch delta 4830 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 diff --git a/arduino-0018-linux-x64/lib/about.jpg b/arduino-0022-linux-x64/lib/about.jpg old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/lib/about.jpg rename to arduino-0022-linux-x64/lib/about.jpg diff --git a/arduino-0022-linux-x64/lib/core.jar b/arduino-0022-linux-x64/lib/core.jar new file mode 100644 index 0000000000000000000000000000000000000000..70095f80b7bfbdb353456fd5b9c788072c80c650 GIT binary patch literal 173277 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%0APMg?AH}xFzwtmdCOk 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

    G>f8+@LfHXjE0ag6eiccf<)MbX?>tJ*MGC`|x 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%0DG<`N30qp5PR7xw+Oc;w z&9MOr93WHS4hw%Xf)q*iH4rysxKr)2CXf};$5mknFQhD?zY?FVXjR5Gbo_zd)DzJ< z=&8a!QU)ENdLvExgh;cVf-%lCQ6M(X-vxmw_OPyPNSSSky@aKtJXUFk&0Asso}{Yf)YuNMl7o``Vr)q#MeL=yiHQ=Sf4R5D*50tV8LPvR@<251z zp0HfIcdff}fa$g>0)BrGinrk4L%mfDy{^p}Q^hN)*&`yewm%ALc2KwS)d!asUiY}Y z){&`lfNfvP2qb3DcF+~|69}HS>>zZHi?ZuSE%~c{&RbZ-=$U12qaF<8306IxBj;>1|)1rx1P|qA1?%m_tCFi_UyTg5n_H zuya8Y7cyGbeMJ+UYr;H~V%w{YXCAUmj9Xg@&y;cVp)*C9@YM2d^Vw+V&tW*3GtHpO zv`bXXam*Y^;!zw^El4dZYe{LyYtJu9cN5Ab+@9O$(~P0!W622gaFm-` zV^M3pcx?vLDJ}1g`O?mrY*cs+U2Y!H{v;`;ZO|FQqze%!k~_on=|mhUQimBZ<*B#o z<7m7kM(M;sW>&IW!={2^#}56c=OJ;yJ_E0M)pZBXUwcF__kdg%C|kR_i{gYd69=>% zEVRWKB$$QRC*D^vACyD9$isYEKaDSCPSta1-&P~4ii;wVX#R@pksx?p z)BI7H7;7FO=n4Fg#Ta(kgmr?e+J&&p2fzUj;OvFsV}}qe^&$gJ>{UOCJtdqe(TF_U zp#14Pzro#n{q-n@nsK&E)%!Aj^XLAKj*NL#BLNDf&ZCkmX~Rx3&$(TW!cazqxm zE%_cVtR%SyrWd&Vi7nEs)IsYJ8Z?7>N~0ay1BYfP1GH8Rh|8*y|F^j ziv;2fDEc3WArqtu!F_Sy3h26qFi+(J)p)?<*#(=OBYmudG-&x?8l``FNXFMK@ek^< z%t;-QQ0GaaI+wqvk`K2UL)_@}X4F$BjAYp65k!=IBFxk1w^ZsXU&ECy$=H3LCj z=-fnobt0bMOhMgSb`|lYatjl>1B)wfX@M}gNlm=A1iwiN78v~xa3NYJg%_~K(^pVQ z51?;F!q@OYizt-+syBb<1h3ev#)Nbr%OjgZvY_lufLL8{{T{eu>WxhEe}&0P>BN%o zh>65>bX8(=Bs8^coqJ?#oN3l4Rmm`iaIXr>NGR(Tj!(2PZA-{Hq2-b-P3TavORfY` zlcO)aA~yH~Fhc`r=?JtzYFI{ooa&3n3-wxZf$0)>2}1Y~QuRi$-}r8GOPD zKbxTl!wGCAz?2c-ioYy}=R3vqfa0DHH*3p*59@agwT$H2vtb9`q_AhQJQ%O)7Px__ zg7yga)6=1P@eIrXAc-ro|0cE9sbj?Gt~IivwnArm`b@5SZ&dsYCBJ!7hb4n{mJXsx zR_z!k`s369+x!l5xV&ftZ+>t<6*0Aj1m&iVu@I1~5HJDrBOpRwEcu=ifcyB2^Az_= zC-MvU1?AEMwc-PSl znvp!yEEsMz^0Nq)I5TuMS;wcY0s9*=+@Tp#kSZ0%GyH^+X+|s56eiPTtNv+W#G5Zk zCWv&!g18%merhS^-*Hm}_L}lzX}n2J;1?g*N4Sh!5=a~5Cl)|kh<+tHqDnlF|JwME z)!O$r^u)26ybo4R%kO69bb}e}Pr?O1;wukC4LVfOk%hi)Kq^g*O(IqCE@*BmQ0;?Tm}7Mp?q z2Fc4NCA4rn&EjrC2MKAkrE9xBnuugoIr1~ad1(quv>Egub5ct3R*!V%Q^tZ{xR0XN zL%v4I@@kVrP3z6wI=Dl~#MDo}ML=3k;ZoK7#Ai*EJ|7m8RN~I7&Mli?Q8q< zT9%jzNr{G;3nVdzGUyuR(yM%}P|?&RL|Dg9CDhC%t7uAw=r4v`I36_Hioo9hh~B6^ z7Tugt%yrsswk1V9Zm2#cT+FnGb9H=@{=V>hseP;%oT)N{_!1boWX3|_Nm>zJ9(*M~aMi8UaktK=DN$!Z*P0I#MgrYeV^89Udo+Fzzr-J7YXiwLzG*E;&wU%{v;EuT`gh>M%OLAuE(+7{%}B7(q=iQ6@aBhDbl z^we{`A-m#_RQG>4Cu?D7GbN@+`wuxO43kPkW6(!MY+f~bYUZ&dqN*=Z+-?KMW1x2lh5@A4D-xSZ>ihQ8ppOIUPU zt2AivTz3#8>^6g%zqHzWbWf(%n29N5MLSCgmgV9zuG2&6zs`uac7E4ziK-NG9X%t2 zPq7=rxsDw(zWWsRP0ssI$svq$uEC@VrL=$Y{j;}_99I~#|Gfpr1PKK6-JA?$=U{7S z?C5B2V@mhm-hz#jxs$u1v7@b(%YU=E$tu=L$Z9A)HVxyn_T>ot#Rb2b43NZy<`u=s zs|73O{ZiCPHd;yALy9MDrfjGmbC>w$=>GUISu-k$YVmO_;w_)IuOrAb9L`xi?>Nr# z(9M2Jxz4|zAE#14c!g;FBt^zXgpl|=e(?20drV-H27lTE=uotk?0)q}1gL;%fay}U z5wO}qO=soVjJMI8bVW5oj?~c}$_7zyNAFQth2`TP=0trro9K=NLe3CX>nTl%FmOld zfy5el5glrQ2W!>rV{YmHoV+=cds5zJnOc(BUUzw-Ni_Wl4kbFgu{&%LH=d;02=ywNsikc{HRrb7WRnw84`^#~F6h z!N_ZrzAAN+WAc~|AiQ2a2n5|9cgoO_jcd|~&8Zm@m@I0991eES8j=(~#eVI!8wfAR?zoZDrA`B6) zxhg~OWD=Km>jXkZhnul~QST^x(ioZZ=98Nm1+7HwMog=Ak#XPS^NHzj!Gg|Id_#;m zssw{ozVPWhw44ZrGHRjNPoA1kWgu^9e!M4$VgukvMsaVfkO-VlHxzlP3ME4r&Dpp4 z{q1E-xSOyt`ua(`j@8kp4t*rZkfVrSY?B$rof+csBbyuxn%>Q|=QSsnT(rB(4wdFI z!C+bsmiO)kSuwoiLX-GB3NjN;pU^vA6irdzEI<>fOyg+Tx)4vMB3x>m_xgvb}Hd@Z3Y z?&>z#@(jM6r@7teg3gDK;Z@7(4+^o>WF3-0W61`*XI|A#(y^q24cthAlfsM#E`am` zjZb(F@)A+OyjjdVr60RdK{=Iq7QqZ@fH3fzFfz4$7=L~E9$p+$uTVrt!9MsA1dV1m zoYR^3qj0EdVIaU(=S+;oJ_Mz^@zMMt z?-#zAK!zNk_#C`omVS-UbcbC(?VDxrLeg&lk?x7-TO<^sqgRBPL5WaoxNZ5Z;F8MG#Fk1FcZKQ0u7n&@j-6s`opoLl0nDJdN*)!%L}kzu(vC7_0l z{5W&CD2wf1!!EjNGIq%{won@v(Ax|jNt@1^rV>FU{Xjh)Q%bRA1bTy4BovxP9s><} z3TL0Q@F<{csh7Y?hSfGVG~7F;`;!vfzU8~A6ZD^7604@SP9fhfi6@Bvn?Wq%W@v2Z zWNvHo4-2wb+46f+7J+9qo<>6+mcdS+%T_# zG1O&5F}aan{^Kdf)=``+T2aOl$YvyG1oQIfEE@n8Tiyh8n_cBp_Ac02E3e-3jA;47 zOW9-2QJeM_)Ald#m{4&)W1A0x;R~2!GdJjtzQ+uag3MqA8dz{iY%i@rd+bH|zHh4H zt|X+8T@-0_);Ya)$AQCGVUTC5R4EzC)3v^d|F9!3KjM3hxV&#v*I*6QAGBD_xDssV zQ*(q3b3)n)?bJ-w`4?RjRn^3+YT!7?>_Jx)=Z6ReEUe7j@KJ|NsX!tB2BlofX7Xkw zRX!Cjieqp5_Vmrx47^FVj5I~#W^+~vKgV_UdMoPI4`(Xfs%~2Be63nr4cMDzr^UlF zp8olrMX(R01(%V-LEtb1SS(>jv-az=Z_<~ZT_CrM+Z&gJxb34!@>c#e=Vai88S@BU z@OCQBJ2VH5NCc68Sw!$BGH6)o9-bi@$ds2~I&oCIgs{Lcg803FXit`eIO1HnJj-~k z$&m<0#60K}$3W3oY8pA!G)b;MrDR8a;CIBOfF#`wKOC5A9*l;v4*^KZXi=I*%f#|g z)+5vJcUsx6@W*W6C98(m@hDNz(_vsnZ|o{k$KE}&AB-ZTtD{YLG*>YqrejI(W3Tg8 z_iVa>LpMK`O<+0h13r^z)jRdpL9sC-s$cc|UC(_nO+nU~jyOol|N8qW?D2HrA3 z4C3nxWzcu0%hZ|0@8b7pi{;qQ5d^kT3Ga8FY&NnL?p2ASy?nJ zpKzN9J_hH=*n1eQpo+KNU1V{&o}BOT`9Iq5{-YrcATlb@{r!cP`kwUs`!D@}Zr}XN zll;FaHeOnAG;mpj{^6Ov>6yO4u|AW;^i&Ol(J}mr{lsMTl(O8!wA30rZN;SYRGVsy zk+HsmtlWf&u{?i~4dhHXTyRxzR)qe^u{?SCq}(h`ZJ4C_+Og^R*xM(7I5nlLbG5iE z4f*)gtf5idh;jh2rC6V8o1&$(vqFYGOa#mn|7^fF-9|K~&!2!Zh759_?#G;&^6UaW z60L`d?+#bi^;4ci94|Gc1*VX8(gmC}3={lc$hTz8(bm21W6sz&OZ6{xfd6&WQE@W2 z`o{~bTK(J=OAYm}47EAw1aUgK0@A1hmu$vRN>!U|*`k|-JvM}}@u-pGCGEL7=B8v( zeB4NllG!BEMuX5g=#mYfYz_zjHp)EL00G5=&3ljD2Qjmc4Ttv{)aJ@eG>&N;7~$yjN87j*`RhEW(g4cK;uiPJbQIo&y}|%8 z;m)j3U?zOsOd_{OgqWPvEB>UgL6DiFGk)fwRZVS~u0h&d zvCmZ}#Q|7T^iI^|&0&1%NiJU@4J-h)slL_Y$czE%FOP zjL$^c@?3dg+PimCUw<*lc%yVL{B%9&|&FSDZG+Qv9)-)kl9Ov-d!#j@0S z2gBHvtVJU&(k@V=kuTA3B(pl%KM8g5t4W6!xn<`%w-KQV?S^H1U@b}Fsp$`Ea78iB zGOy~%tl2q*X4Kzao$3_o%pLh%h3TafvdQ#aGlqp%^$Sw~aBPpa)z<5{8_*5Poi|45 zEhxsS-LDb&J4);F>k>2N5prClJsxjj+>1neG$KaXy`m^~aHCI1zLMtn#L{;Na-QqW z#Nrd4i_m>S|ICrTkt@^Un4eO6!1AsGz5;aMY?{cc8Zd+m`6HxTwu$NXQ(x%v}Us9F4>;nqJnBlV9OE}oDz-}jX?RqGiXRH zEjgNbA_Wc72@N-Cl6Nf^%3w`vA3`k60G9M+=!$rj@j*{;p5CVvd-L@x`eBGw$#q6@*EvT zI<<2>l@XbheJjWL?A9e`+G=Q%N3Uz{f_XpHmCCKOF5Oh(FjYCes@dSSF)m1*9PgIv zir1fTHKhdalJenGmJLuqX~ZZ>Jgb+lpnje65=&0gvi&k%W;0H*m4XkSeTy}wYAy#gvvSEtb$KMn&uAn5*{6dzmhZ8PMNa^t;HyeQm)>H zVhnsnnzK^7PIc1U8P3T(XI$8OyGd%|mo@k2x%sZpU$}ifg7-7h?^-O;%rf+{mk?Y2 zHXDFAdjM}$eTtZZn6H2TE%yrfyaqXQS>Y`5Ep4CL>huFozM49n;4bES!Q)k4>~wkR zk9^4DelCdFr;cmFuBD`%hD+??SuxB%!m)8Hk+cYSCE@) z=Igh=kR*o}a%(&Jd!cVy^5Odo%WtB841tNK?xWU-1c6n-iv2Eom^Iw4d+Pjr$beRd zxvB4WL6m~qZn5Kc=^H>>iwHxvh$b5Yq=I*=#zp7&4o>P0~qdGw!*oaQ?S__(NN3?Lj@Au zQ?`CgpNpIW?h|~As9BdGy$3WFMUL~M`vA0=S@F7jC>av02d&T}%6`5)bB78+x0BW9 zV9;!EBj2TQtm#QvkXK~NKtzLIXHGBXv+C?yH3z!3NAY@_L}$s2s7?NS4ViPx;|;=a z+2briaM|MvA)Klz!XD~a*TB405pXbF!RuuHyVMYz(Yc%|3ysI{=f^lJ&#~1e&ywdW zA2+pAX;gtKOGp`IOK=jcWKy$c4o%8ey&~m|-dad>oDhs>tBN^jwYF&}7QnVpDO6d} zm91kqIH!(PywW?Y+?j`9V)Hqbd}k=IRnjg+wx}|71#);nm&b6Vda-C1^m1LI2TL*2y5-JnsR3O&F{{zizkQtM9}>!*^7%$whE+d%jC*?%EOicNttX^hO&OCQfgT~2sc#-gFPCtQfeM(~NZih(Dt;7#6w zxZDAQr4EZ97Xwh_2S`cRnB?Y0R!O2&#U4eg@P$hXAQwDOJF4g;pZ@{?Emmc3^?buW zVc#hlRR7ilQq{LIH`4zPf%h-x!))bWN{jp`JW{=anIJSOReorw8zC0Mw!sC((P`<5 z=}46C3jk(=tOOTH{*l~$_}gW*Y{ayA4BhNIF^(M>KFBySJO|fr`{#Pc)0NHl>+2Ov z4{j283lOkR%l7hP3;otl4iCzWc(2}%Odv|n2Vqcsk92gJ@H7YfmfDYd@HV2Mr6eiU z(m_Heev%SY>E}RjNxP+aiOMpjXGbWjASUKn>maAM#bc2y<<^1v#(XJH(ZZTm5n=|a0zbmTX&4ivZI=__u`$N5bm3ktj*xz7 zgWTFQsRb6v`?FKRn!}JVa~qSkc=}2DZ40*6$L(Jml%92qV>VSuqr{r+@FxQ=^LL5FZ&>2qzMatJw2dsIQSoOS`XNuaugvG2CC zrJaXSJn!O(!Vy*(bEZG==Uycyq#JVeYGWA?;IaFWU%o;Ro_zY%Q={LlQl=0;y?%31 z)eU-)f%vM?&m%*!N|AD|sl`8G6Oj*hheAr&?-B@8T=NOPV)>5V-dhT_KWHN}FE|TJ z8)#3qB}uDuj>wB;*AtzA%(+6Z+e9N`x@XC~$IPiYeZjZ>+BTTwIsFaiy7db2&o)Pz zPW5+PH4u>ezhAca=B)nfG5GI*((i}@FDxW%hK88fA@d}?v3cSK<5l9|IP&s9 zqRMj3VTO9_QGmZqQGIuPmtt|UW6}rZivko$zFsSKK~iCesEei9;Ig3BghHM?RB`bf zNb%MxAInX(Y6Q)={cS9t$;tE-SC9M6bmsO)ZtsN+Q06TjdX2E)2n#K>U;&Z({84?ddhnR(E2jE61J9j%RGtOGh2}P2!yo`pP~it#&Ltqcf-yUc#Mz&emA~ z1fG6#X%_p{keJ3ZDF&WnJ}Q8WcP3BN-9Adq=HwcUcVt@DDeh-$weC__0km>>aodoBw3 zLzog53sC}KDHLwRO{hpAgJ;IWi*3nMN5-6K+8K0Qp-_s=EH)+^julrBrZ_~ zkE0^Cw9=G6tXV6s6d2+`Oe&t&poKN3LX?eyAMRP|EZ}hH=Y(($4C-Y)9%%_!_VwUwnQ#5Tl-h<&<7(CDMdXiWt8NSlH=fSS^DfvOWUVCPer}$vU+P6 zJ%N6DGdlL%p@f3^45&FkE1CkMU1PRt$A$9vg zM$2g;&vJ6(aHh3m1IcQO)fI2TA4mmA?s{ucUEvH$QjIe_f8C_wj+V&eh^ zV$d7PCvbP6$W)E|thBzC3wy0_&z!q(&-JxCfNxI&%y-BU>T75zH~k&@i}KJG>MN!c z!{JSvA$1^d{FPxQS)($z zL%fcNAwMDGxLDL`TA)EVIaxS}6B~($ z&}8KaUnE-f%)^SeSHsuv{3>5w41C#$t9|GMz^WKG@b|BUrH+xP5210`K7R6}aZZCe zWjICAc|l@~CRM_?8)I3l9d@7xp>Z&n6&QyDvl+hRE$>48!WI#Uhlu8bxKtscz^pIP` zt}Ri{W9$e`hsW>DB3Wn^pym*OVPF5ECFTU<4%fmL+ zM3W|qq=w|UK&ef)@?+W{WT< z%NT78nHeLotbEmWPWo;>Fb|LPOTY!m-D>J~o|>Dy%vFAEj^l1?q_h1NxtG^Ek|4~y z0dWmhMM-H5(h<0rBFw1Rk3X?L&PO52{G#!U3#>j{ga&j9(DNft9?Q^Aw#!H}cwx$R z<)|_x6btNy7Jn3#P*DHQ3(FB%b$K z#Hll`Pcz4wcR+($WTdE_7{{eQCV5og3KK$$;9O`36BSEr)e{+@vR~V%Esn2VlPJG% zvHVbRYX&ojg4-{;3o$WAlFDc-+cB`M(clZm%pJTc8!K>$)TUdl!V`+#oS)((RY*h*AX z2Vhc)mEslmvvB^QhgB(Dgg;SdTqHBa`LOtXZaFsKjkDjf=vKY@V{_d=uz7jYVkK(e zJUhs<%k7kPB?X#kPOv&$lZ%C~8Hfe1S?H5U=75R`1)VNmC)t0KSSL;(T7uaKKNDPX zPXy`~Hy@+(37D?4`G?`H*U#1Tb@0oQladt)>t^$};KTGT?d?d?`gbQE)s?aQu6T;7 z^9NbI>RH}kXYXcK={p@G8f-T4dAm8c^wt`8f;Q>EVsPP|z5+}}d5OYltyRWaV9AvbwA$p#MpvdqIgg9; zoND|#DX-_?F}eKYn#V|QxC1M!(lj= zodxdm+0*c)v`$yWz}9PH5_d(0@M>#V6B;J;wQJlS1=u&BjhX(f4br#EgxPt$lxWYY zhWeC^=p|N7!&DW~j&k#z4r^lvrW+WsyMd_7&5g`{ecS9C?gNpnYL2frLD_-SO`YcM16i#S3 zUcBjyer}*ya_Q%z_mYM`Tas9j+-QYhIf_%YB+q|#%Jmx~siElo4x9DUu!kf4`j_BF z+uJ?PpWnHv(BFYi-+52}W~!{_VD9wa)8uGXE!XcjzAsX9#zdzec}S9lB%Pun3WPgF zf^PDp0)N4F019w=$s#L@j3A?bKm-)IjzE`wWS%lJWkhN*urUpKPu?V%uiqrzUSKS5 zglBGg2}L(G?o7J(^Vc))ZqF2P@86fjSs>LtEH>4Ap%GDZRf9w zYa8lemmOT!LNu{HJ~P&ul% zQ30l?*ebVK0jJw;z@tXksrG^a5AvKQXXb#N7~rcsvG?_%Vd0;OJWRqt z3Si~W!b$fR`S=l9irc(Y2ldF_;5*IYJEtM8bDPFX&)+(ZO=1r`WPu)c3+&Nuf_L7Uai#Q2(^s0%HeUi z4zr&%>UMpzv z3f7`O1;x7McLlNLn1<5@r=>Qik~DXx#s8z=CjI!bHS4tQ;pdWqU&^goED%h#oLqR$ zb)K-x0GG@Zrhnp`s3pw?O%pmC;u@+|-KNxi99h8XcjAtSUMHX?4ee7Mv26(CqZCw3 zy6#FBBz588CgOYPjE%Dk?l1X7!0zC6`GgS1ew;(=m-*P>6IIIMp!cFnb{up7^{Ijf zDy88=8MgQL*Z)=7*#|XoL;?K3A}YmVQPiOwK!el|Eb=94LB2dd4W@vpb>hbn zQW6YF8lnZE+8Y_hR#b4DvEzuKlloD|R$?uKI@19~N`MZI_*reoR{X=-Dz=4cHTEqb zx!m5~RZlbIkL>Tgef!?--rerowmH9b=XB@qI_|Tp*Rf8W*gnDLo6%6Zgf@K{P#tRU zOC6{>m_Ebr(^>wVDfOz`dj`wP=#nN!bcABS9vGpxJ9=N0^13b6c4yV9hUGuxTsP+? z(rp!$hRwnHr&rH!{PDT9sd`P_!uydEEQ{8T|1K`?&WFZh&utIq)14h(Cqz1WdVA() z9@}vxY2^~Fe^1e&Q#*p%Z`uc+G&{Z@vvTJ7S?!e-^)-WI9&ZXWj(apBHRxpCKts)Y zj}wMWHMd9ZPprsNhFM@EMPOJ$zYN z^t{VmRGyNZMK8+Dn=Pj~0{j3I4vA)mFC@GfzI!a2k}3$BxI7B}!Y`;cnl+IAfvYnv z_BB^w3W*JX_qZNnhY}*Y3y-3nDHTbr!Bx7$@U#8!Y%j!Jn4+v~BEPUxbc)HO*H~Qn zOE^uOumpw8@dgz896q5uSQsn~@z8`1i*mkD#c8EqoX+e5(yLIGuUa`YtQakt3@aRU zFKjNr9>RwYtAt627%YYivp1jK8v+LVR-oBGu>3^~7E6XHr$1HTr7 z#gSpEo0(m!L9;1fAwKM?zc?(O44c!fy)+x_)g!Q(8N5_Xv$ z6Ne>`Ve8Y|?gxWbyM>xT=!$7Jj|?-U(TC-r+3R4l**vec!&5#nSV~EmL7i316l#_l zxzi_bANIcZ^s9DYCqd()R64H9%Bm-cvvV|sx)PZCY6|2Ui`H0BLRNfZ`c&B|AbNup z;#_3-Yh^zQmVz4~%eBUwrezF;8thp;u7Ah}52vU~D5^ZnYbd?CONy1<4C^CAY(v&I zq9aoK3?7{}PsBTipc(=y&1fjGFb0cA-NSrF$y>pw4v3L3msUe{e|Il|M#E7JvJ8Eh zNlR9)F)-_>FE}*~w<2IW_hn^s8bokp(B<%D{jG@OnbK+%>%Fb9tKn`grBq8NG=2ic64m#8$Q*n3M$r4CQbp}E$kxIQy zRhx?-e51gQ==cKHWo5VRB!J`$Y_cyE>V!~7%L0mjg{jQ7K-}}9YDG~bS3$5FjiK9r z9t+9L!1VlaM6p*CCgvzx>r@*i!)^Zk$T%P9gYSId|PrblhqUvnlp2Fz}TUgRw|2f1&1s~9O)nIVI)DA2ig(tGNM zr~~zVW6wf|UjF-x-*f$@K*!XUK`CK*{gjWau5oULGV&=>OML1$~x zlny5cz^k<2PV@AOP^FDfr5K*r{_d9)EA(7svzFr0+9Mz!UtqJqi&6q|pdlE&w9V>H ztUF!@t^5geQhb~F_P#jVX*0e&Nt^X;z2}I9D)~cm@onaJ?Ip#MZFX{gW8Vts9uEMW zAD}fiBm|IQmka6hJunMfJPq$_!~Z0~ij78#HqWes351>yT_{e2l?_j9(6L#-_WU?a z@bMOoHMy2D5(#++-Bh1n6i!hUALBKZ`4ULtY9SbYxTMRSt!(Ek0?hNMNjxm@gULA5 zjc6VU-F69%DZ^>_QBxdE87HKnaOEF7h4b)paX8-N1ObnKN)C>~4^QDxAqxa3!ci(X z4^Q*Y@!FC_c%DiBaU7m^lf!L+S-r;;6}5v?J$@EW9EhjCMzfIM2`&=3C@LD3&4#Sx*1bSbiiw*j z$8|L-idx&oODpwKsTYi>xLgBPD`HjDRs!D68WhwP5tO{&@64RdNl2)DfA8a%sJeY@0rviElsnop4vqkp{?U2CRb%t-_t|gX*`OC%7}Sjv0aaGbTH0qZ^JnOFJfg$}z4U31^Rf&ePI7J+#83YL3;kn)IXev03R( zXN~R}n|DT5+R|lb57Ama=$n4|-p0J%$AE(5Cl6^pev|OK1V0@=>ngBrkWRtxG6feR zou=+*AiYZ6Uybw{{AMfoI;3;(^Wj&FA1^YXPGSR|FBluM- zn8}U!EynLR_}zrx&G^;fcMEfW9_17Ib7f5q=v{GP{;*DCy8!tZ4QxL(2UHT=S% zmgUty-En;X<$t~+GJeIF=hjbr@TM8}EuK1ZarRpY$HLokdh2SAC+5Gq`%m|eoHlyRnFH!?`OoCC*v!|b_bPdB8TkB1?YbqGY@PYk_$4_< zKh*Harq5C(wSIRR^&#nL0aSK14^}?6$>^a(b>@nBB z6#wSvx8C{9TLtH?$-n)@Lk~am*0_F~E?>TQ$XDY(ng7W@d!>&$d*cVco;9>;Y<(bk z-fZWtU*CAfi!<)|=F?(L?@<}JbJ#O2%lrN2;-gl7a`)oqe?EF>_So?s|84d=zH8n; z`1|WFd+p||es?Z-5&ap4{!Ci<)@jG(e)04hOJDfl(#L<&=GRtEde2e&i-#9HdEMO~ zX5I4Z>v!GqeO2JjK36PXyyEX!&wsUl_Uo~)e*1@|lbX+8QZcb;;9tw`?EC)q1LseD z_r1KvZ-<@q(6W;TB%WIMLS@ktLl^$x-ZS@Y2)vp0`^A6D+nzo8^P2hh-nD#jdiJ2w z&&Iv|YH?27^UcByGw*Pm^1BtAzq|ck*F3$Xc*bu(yyxXB-YGxy#xoP1dj7dHHWd7H z=?^=<+I9NPcbs~{s1s-lN4k1yeYM>4JC;}hzl`yH*mdCOuJLbogTE0Dvnx72IK-~- zx!shfA9NnZji#O54gSOaUDJQQ8$KU}-|dQ@kprYJ?cB5z_^!%-fP!7&U+JcNxSRea zyD2}goAUcHF?7}L>5i`Pj&AUebt9kt-SBg7H|-AVhR?O#&_BN$I>%*n&Hqry`LxbT z0X(jo@>{xTcRu2fuH+W%2LDbs_z$|_e?m8QKEE4&O1hETH{H{4)s6hucVj=_bt8xJZsbtZ4gQ91@GafYAKH!mzu!%Hvl}^FfOch+ z)6p0gb|e2tH}u=Ok>}IhluvZi-wV63w@Ka5G5XSe`fF7x0D4q)<7A=7{#t_yaAN2` zuSU^se{JjK67E6AjBAC^FO2IB2{V@A^^>BXb%TVh*yk4TbBuPpmiwtwWMs;0?OGvc z@RKhQs#$G_=vRMjPPxPUo`Kjq7hYKxvE|dfs6`cV04~PbyjEb*BlO7N9oH#}PG8s?@pBlMD(?kIIVW-@zECFGWTnTJT8Vf_;m;9%7@3bt z1lKgY{-nxh)=RiaCfYmD59y0VByjI5{DVp_Rg)!Rq{6?f=xkMVeyR98UCA?1A`9NH z$_JEQ8mlCtNR>Yh;IY~OZNK7E71#WVe$CAi^MNW)e|BsaarHe)UkT+up(b%%r0gd# zSHj0BI=brboP3E#H^s$qNjWsQCCoJ|ufd9+l{Eqs>rmc}2R)W=nIQ3&U7e%&X}nD0 zt;GV(lI1fM{i|iRc3U_0yif6;rQ{h`W<&dWFPW z{OC$wbLL6B8unV2>ThAK#NRFxZKbkv=OT${RQQ)6Px_fTpEv~u?1}3>)vub*oC+h8 zFOiT>r;=Nv%6(AvYh_R(W`QoRqZR*EGbL=zj{zm07N5kEE-!9#2{|kJij2m2hWMI^ zqL}uXOtfDs|F%~t{GSS6r{=YmWfCzJ^?4m*wd()M#7dqi7Wip#S(9g>)z-G`Kju}f2*>qnlf4bLz!rk6`foq z=cg6^NyY!xITB&fKiz8g28mb0K+9JBN<1j>7b!vCt>iPOlYDBFU1`d$9+B0w4T^rl z5{a<%UaQ7$jdHY>e_NpXl~ChlqiT1j(pRQp+_IAkA#cjLP{jj&)$aRh93|8^vieo4 z_%H0l|4ua?GjEjy&Qf$Z7E3?SNcOm6_w#4YQqwL3MrMO6-UaeiXe*eK&8!s{1poV z!ODtqC`X%oSwYd%ikZ-RgQ;v+T9gXY{pb2Y(j$pRW6iP>96+r ztHRJ8h=goZ0EN9U7f>uJ@dnBc6QWI*fe=Ms81$C}s;|IEAVbxt4lX-csI5{^jgw0& zDi>C;eu(y0jGp)_tNayy+zDhySc5(K%B!@JpuZcvN+XX`#(_(S3DZc#S5>6cgCtNfUn?mMSs2tQ^H*3lE6Ik!#khei zN^EkKZOsc-MnDZDHJ`T(EsK6ZVCC~M8qqz9Kr8W;(elB8)YSrS5L{Nw>wq~-#$p&O z#Mt+{gF){iP23)#)PzOwNu3oXh)7XR6ik%+%gZYl__eu_Kv}V6)7}z)kw0)mM+8OW z)0<2x^Ukxxv(Ou?2%sAn@WsLh2-#!EheAGYMTs^)P*z5BtT;?=LPxZ$NJuJ#2%!gY z(`7GGK1J~1sjRHhBB3(Bzv@Vxz65Mn6i+P?BU-r6un&6hhQq-lRhy0y0Us()hu5A! zN8Tk%%0{ii(o_GeqIsAhem30+m~p0Y#_5uY%fv(x2u<_*{BX%L0_Fb72zu?ETLx7e zp$g>Cu};^8WhWtv|K2?mnp9S~aAIXeI9ORWrLx!$Ki_Wj-AEBdN>IxuYiVI05Zx;i1>1d7@pT#F%JO*-Cz-GNJKHhjmioJ0ICA06iG5H1jmH9 z0&<9iiYymfCuoy9YlVD5K_&q)Tbt1)*sLKd02h8Pk7OvAmyCDsRTLpH*!7 z&nh7V`jHOi5WJRH{L#GXlQ(6UE@gSPj#6mK0;Mg)1$? zH0LcYnu}?*$SY>xF7?hrGZ^7v0Q!sNRNZaC|B@}Ha1Q!_ugF_W4}oCBTkc2Lo(e9i z7IocG2GkS4%zWWMD~jie`z|?=t|Bk!4OE~o7Bfg;L?TctLTKqN55d;~6OaoVabGF# zk3eubrc0qV4lYa3o%#<2a6+B zS`{KrxGjG*mU9fIib{$#HeDPD3bSPDD;0kk*72sOs7wwa%z+DwA{ar8FCz?u{b4`T zAi!V+T42y7nnDCE)*2-;U_<$;g)C|BAcqY#T2PGeFHjP|qE8B|D7z|D9tio0velr? z#tHzfmIdZk$))Y6Q01sB!am;pQY-RvWsIihhC-a&f>?i}Pb?9v4p&Q!jy!i%_Q+qM zf_90gV8X{M6lfqs|xW`W_np^~4Vw7q|%VPU2*)#I@gd&SMTKSpRxz zy;JuVj%hFT<9$!@FHQUZ_diYaKOpv$<++u}i2>}S_0*mPj#nD)7pZ*0g8~8UB=y$T zC|vjimhYu)RoZTMqt_y!x^+Jj{F{WiR{ z7fXDj4X?IdiPl!w@PhyQ```LlDLz9oI9Q3hIsq<9d5%{iW2fqmJNT34L{a~f7OQ1wc(vMyl%t) z)`l;%;ZL>UXW8%tHvAkL{xloD)P_IZhOe^WT{e8R4L{6=ud(6PBN&mp)P_I9R=&Z8 zzuJbs--bWahHtdthuiQgY*zgG({$(3}vkm`*4ZqcfKg)*S zZo{v(;ahBY>)8UcO&k7ZBGk2ar&HYZ!QXSlo&2+Zr&HVzf33Jve|9;=4e=8cib=W+ zKhlQJwBbkD@I!3)(Kfu(hJVP0A8y01vEj39_=Pt7SQ|dehR?O(t!G@!)@}H6ZRHDX z_~kbIEE|4`4L`?*Ut+_T+VJPu@KrYatu}nM4KE``nOS4Qhiv7S+VEp+_y!w(kqv*p z4Ij7R8*TVs+VCrE_+Q!ZD{c6(Hhhx}KhB0v*zn_R_{}!_g*NCp}8>)XcM{iIWC8@3F89jD~tj&Lb!CR^HY z4ZDqS8sV)1zL{_j!U+N2K)5I2l>!bDW(b#T6!7(g8KNZ{1U#28L$hR!fUhP@F(s=6 zJdH5J;p7|vPbSPzH(4m)355F*&K2-D!VJ-pSpq(nFhjGXQ^02tX6Tj76!2+;8FD2x z0iQ_NL3r;WAch@Fn4wg%MZoty244sk*0Uvk*@Ib;V1^g{xhCazg0e?xD zAy2YFz`F=D)JfI|_(Q_S6Rr~QHo^=^l5+(7I$?$)$wC3IBg_yanJeJcgc(XCvjqGs zVTKS%r+}Xzd=lYI0Y5_cWWt(&A0&JV;k`ex|92C15^fRjZG<_cC$|dtX2PctP6+r0 z!lx5nDc~SsPSMFm0bfs;Q**LGz;g+6>P^-N_-evu60Q>PG{T%xlXC<-nJ}luWTAj3 z5I&1=u7Jl8KAUisfX^k&DJtm{@L7a8)g&_od>Ua+F-c9pClcn=lHB{F&_7{L1<4ix z_an?HAh}h*JqXkFCldlb@Mpm15nd_aZwb>CCmRL)C1JYSWP^Zr5vI#b)(H4R!gQ6% zDgkdJOc$A)BjDEwUqHA}!0QOpRVH%0Axu}5 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 z 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 P!lhs*z^5FKlJ)-sj%^3n literal 0 HcmV?d00001 diff --git a/arduino-0022-linux-x64/lib/pde.jar b/arduino-0022-linux-x64/lib/pde.jar new file mode 100644 index 0000000000000000000000000000000000000000..2519452a55f5f5c4b12f285824a24c917b56d58a GIT binary patch literal 371347 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�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�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%0A>h%wNmX_HRD`q+!xF^deOyS8$ z%8(Z`njuG|gI)!wL)IGh~C;Z5V<%iJsb#ZZg3ic>e;$Az<%B@VbbSK~$jAeo0?rHU@2lmf&`6Mj`fIN3*HkaZg| zD?9^!&8R~&pedt3Q$kYUP-B|+Fav-Pbl#8vx`jr>XbQF~F*JsEVEdmgyad;%?mCLa z0q2E@rrR3Gy;aFQafHM{S?+AKj<1RUJqEln>S7JSGYqoTF6W~r1}r7Vfxu(n7yF$W z<`?{9-CxDvI{W71aokCvQ&hsx@R4@@XmQJvMkNLba#)bA54Vj!QGwTLSfVxR2|#H% zRV`941haoLgF2@atqh1s-_EvVwx*NItmQ`EN?~_3>M)bXHTyNYcJji8tLUGaJ%$pi zZ>Y7wWO%NX@Xplz1T^Kgn?T$b%EYQZXc1C9D-t{-f%BKlS}OtkUiK+H>^02|gZNE+ z@M1{gjSczV{<9~vzG38|=ix4a9VSRQ7*NJx3+I$)u;bp8;AQA|3sP<%n`v)Zq~len z-|G#1H(>JbCUn}FCruF}sJtO`_L~h>Wka})KmO7=fmSIesjqHw>lc|QoOT43iQ%t6 zB5Rt@d-9Z`{5#rGX|oMxugdxlspL&LqT0Kk@>pXoqgJh9VpfbU zwE9YHh)ieGsb}flbvWIp0Gc1Ci9c4vervN@AQa7GsZ-1snA%z50NbZ?%V}lOprS7J z6R{GVU~+cGgNS+Y@LBlfF3FS9df=L8O1)>4{T8xUVSlNX ze-OGs^h9D`A+{2aIDN)$qLRmP1w$3mYi79BAFIZxreP;JXLIexgrtw)ITo<}VnPcbcWs2GRU4h}wnSi0L<8q=nsIerrNXr-e)? zDc0?$c9QWt3_FADrTTNk%osMu-Q%YhA0&BguFDJUKw00r$pG&_ZzO@K_lr=atmpYq zrM%~MNaGjf7cX^&_j4-05QFo@!JB8u{RGH81iYAjOOp8e*Utf>=p5u9eZgqa8L-p2 zu2O_BmQ^6G%)jeCvG*>gm{0z_JdZ=Y$c82di8se^#ywiQOyf^P=Y;^^?;#(&m0h5o z)i;nY^28b>v(fjddLKlkzf zk=wQZAWsjy|mDQTj+||(D{G%?M%yx-UstG#8GV&)wtK#>@Tl68+?)eQ75^$*UqhC99 zNS}v;+?BTllT&B6Bf`mShbGPhXhif?9e&yqRt#xx%3@@jsb?YQS9xcAMw$|=_b~svZqCqW+Dr3? zSyKiD1oUHW1?1%7Xlm~2YVBajXzb*~=<4m@X6(iI{|E9v0ZdoZ*VGk9+fLmglkY$) zqbDS9YAMf2l=ZL2B=p}OZhbjjFelWX{9!nT zb^Ze2{VP(R!W+V_l;nt?4OK@JOd0ncYm&^Ft*eK0uQ( zU!BoX&n1e5={K%C@*;(i@MC74rB*dKR-P-C)`%Bd$O8z$d;{B8x)^e3d)brm&bipOa!SLi*L z-0SeY<)Dl2r~KN|Z?+24CijGrBF0$z z=|v(9F}Z(bZS0VCDGP)#TR0JtVx7DIEvjj_U{yKW95IEqBd>B#5f!^4(MnG$b{m(q zV8m$oKX%hB4I{Cq06?=yQ#3Cz!7$9$@s=mQMD?cf8FUixETfq!y~%8`;0gGbUK9S# zlOpDGhF+#TvmuJFT(6c^x*G=vLAle3D>(|R%vnqqBh=jpm;RPGrH6)4bXOO<#_+QI z6q5wUJqmdg!M*!jYO?4+X|S3I49YmMl4t(rj9cC?$$p5NunsszJ)MW}K_fg{f`5I% z`LwYLHUaRrh(m%I#H}?q@i(G^z4D%HqyrJxj@$?fp9T z?E(4tA4qvLZ-A}H5AyB=76^#)|GG3OnVJ9B>g4)gn~TP~CYm``z({_+c7(Dsusb^} z<9rB}wRA)Uh&2hOG_*K9u7{+D(VDhpgph34`tW6mIp!o?my~w)8MlygLS^B3Uch2a`VW_Pug^>fB8EVjk@uM6UDdjKo4HA z=*iap%55%e=7XMe46P=$wg~oqP}{P7)l5ts}5>|W#ZR<^|8?+vW2`;K^PJ4HIS;C8-c@y9 zC1`EnarnDB0Vq)iov4^tyqjjY(yC%L9epvt0{|`*QY5X^p{Z&1XllX13NdN!=xBA? z*t1-KdML9^cdjs(5iBQp%07ipEAmn!q8sn8Jq&_HO`5`81sbgW`lJHTLE1QLw*^BC z;1+%K;%7tsE(byVUdeTv^e`TG>8?D11JDlR>X&Csu4yjM zVZ~isGA?zIR}dgcJ9YAmoi7!!$+-%OSAX%|Z-rTYK1Jf?N^BHL(4NYy&lY0O))y4&gifFcL0e(VglTRxw(x!mshR(sW4q^Lad z=zDy1LT~FU1=yNB;5VbODzWd{KplOwU6d=}YcA5EN0`604hs+yL3dfXegE;|>g1%k zUz$@`TSu4UK>u^h|I)Qg*Mj<)7+Up3+!1gmKSw{`%EUU4Z)!f~-&Ps18DS|DvHBft%357QEYkg?&m_6e>MabmD|Eg>fC4era1<+9ml!bP~b z&=WoOSV2qZ7Bzu3khBDqdBR>eix7(*DvT}m#DAU6U??no{dUfBM6Bk{qyuWCv?vsm zc$>9Y!r!e~OP~mZ^Po{*)ZvKYU`T$xxPVhI%)ZP*EbeJi$CF8TXut^f3Evm+!*wGz z^9W9CB4mWeYQ{)5;Ab~vP9xg(fv_umvRJc|22$Re;Ni1Fk^EvyAc#mxeQ0UJk+rlC z5LjS7{=Ejq;kxESUJ$+wDwFu*gnVGR<7p2Z(@i7(297tdyGtX^NIH9AO6l^_{tKa8 zBQ+t|`}82ghs+0M*u>fLf|~YpfJFODn&9+P*p>W(HMAJq)cD#bwGL3J(J;;|`W(?#UVPT!bDN*Ua=J$b3nQmI&4!Lp8kdx7V z_bK#O|H#VKzLo^tmI9879$B%qsTQ%9hgIp8=7=XW(ybx(^RYBfo&)z{Hl4yVYO<>K z405&jqFap(4-TvzRD6PQy4&3!&}h+App|w0|7*SV_K|#E1NO&{3iSU!2KILv`VZGc z%*@=#&DQll=|}_4N5>4~D}TT4C2Om8(~Joc;?d9+riO0a6Hy}D+(wJ2@MOyb$l0ma zTq-R+XCF%9fQ*bR?gbMSG*1JaXzvz$qa+r#11GF3EUtVLShS1xG39Y(chv?zag~0R zbLIbelymiV=`k(+_^;c7DByP&d4!Im$B!p);J{|;GqWHLpxm*(w;V!{%+Y}2a@Zo+ zd4=SUcqJks_KP>b*pj-TpUKJW-aANe`0w;kdy z*|lEa6-*EHwXgXf@@v*{BIx&o13FM4;}?^_{01NO9gZ|1jAxwj{JZO}UM9^?l^uk% zf2hwK?ndFwN<23wo80@hJi9uz}{4z7M^fnL#WC9JzRKu{maR>0iY+6&O?AhP57l#e} z!ZW&Qci^F#VPLMt0ScsQ^wJjdgUv9Xop--bTBI1wP^xt1wW@s!>et6SGBa^ zGPTSO=lMN;)~;kTBKOyRyy(u+qR*|$yP5m@>lsn&u(vM`s{BfCtzAiIpP;NB#veh4 zvltWe?L;45w?)iy!%^)5M0=gk$oF~L6X&<2mGV5duwLG+N)Jn3EBE)@N)uSiw)q#V z*qW>2(ACfTRKd-F=ANFIf^v*Fh?(2iM$||FOb`++129ipA~4TfVRL1;w`5AAJKx_K zmXwVA3b{5_!^hR z19iL)I|5vYC2TbMJDDvZN(Zqb7PG6o3J*Q6mDDn9tTy#%Svf(Wskr>a83&3>cr}I{%mT(T6zI5hO0ziK zYV4OQ)j@8qsf%L+X`vc;F5s>3)yfeqJRa%G+>hj@_AXp$#SRu}>IgHNS#!Hm>iKj= z@73X7xUa0;f`F+knY4uFrm-?MOh&c25mdB)V(U~bb#%RAqgRrU1`lsYcnNQzyNhyp zYc1ke4-C>fP~|)Kf99t$oVEl`EnAUMxON4|<#u^VB}r%8=zreqDhO!Zq=K04Z76W_#pP~ktZaFNAW;+K1yl8`#eLNVE+ zp0k}RZP9+L#=Wr1jmfitKCF@uN}?rq)KupdP@9Zj4R7{P#`R#nufgb=V4}ce;qs@w z=}FC_(n~9-riiMS6H&<KEg@#bLYVOOOIq1NxfHf_XLXI&x;OQ61rl~Jwj#``}^u8;8Cz$fYYC=ze3lfFQ zP{=Hrbj{^)%3{aZrRY>mlZkqZi<X0`z zotZD;_5zC5Dy6Jif8ERLv99{(X~zV{Nzx+sE;6MjvUsKQk9B-k^D#A?vzR&=N1pWG z-mdcL#mn5}@vEWy^y_?c8#7)B;RvhdZ^($ud`Cs31jiSFws(PBgd>PsYjb|r)^;P0 zf-~oVw7kWQmS9gqDXMb^be}r(tOF&%QhI-W5w*j6&0>T)TCeK7e*q9jh{v6KfLh`H zXwPP*N&7YeQM$enff{H)QtI}Htwi)_RXzd9@%{4}ySrC_SwY~cvNDjAs38DyNLEGk7K7QY#T;u77IWL{RNOe&> z&h5WRhMo8x(D!wnxOPyC*6Z=F>={Ow3&_yN{&sh+_kkG+=1WBAVq>TwoWP|SvKe?~ zkpo8X*eaA`k6xvfXH-flTd1l{8r2kiyX+Kwwz8{1vCMwxtA3Ora-Q@4ebllP76rH1 z`3-8xwC~Li#}w^e7+Aip5bb3@Ihf(!tc1fGI8okF{pM-Rd!S)a@ zYfzSU&2LaK36#k4{9Gy=_vvT{#d zg@+FM>y8C)Om}UV^6pn0iky>ESsCu}#c4*P%IbVok>F~sG-R5)fUFHDbOsY!*Vyq5 z>Ty|1_lGppDTck4emCpyr%thU_9>63ykp2FjI$iLN2xO>r#GlwW8Af_xw^%TRUwOY ze~0d#mww;7Jr=9IzOroMc?RP>`*2K}Q< za3vE8>SvB3F);)W9$3L;ZKE-Z!17ie>CpTuH}FmBVpP6{5*aF$>7+N+6%3*ab21z0 zkRj0skFh~_wi|ga5UGR1S*F_$OSmBk-N0tGR~eZ^8gJSk7&f&VGYMXZ4-U($7{Xs5 zjq%Ee|Gfaj=V>!WSu$i%;YLW`bKM9oU5SL2vFsNVYa|-KMm6@tI0DMM?h*h-!x^(8 z7S*CT*pY6(u$Pp_T6>VdQZE-lpP%uz%Q&S%3G~ zb^rS482@6vyb%iX{+Qks{EA)y`XlgtIP8La@p($!8EIDc+uNZ^v}m8tnj6<+4i&GF zp3hJ9qph*>m%8m(*&*c3%AGHB?(x(H9JO9}f)J%s2@cwWb|AEmYt_1gT=wQxsc)3# zO@5OGg#W0^5(1T&y27N&*5! zSQ!nu$gUMLwJO36eF4;1Kt25&ik`gt#5~wCe%^`q&v8pTLHT^N0^inBCT6(%Q1@Eq zXGPm|HxKgEiqSLT)e~XfQ^(6&{LjH z9g_%coq!&utW`J8N(s*u0{mdMmuSFfw|2twuy(@qFnjr#=54(H*Ad4V7l{lbtg>*) z#XLp8w1aJI(b16kjF%>LT+6ANt};s#*TWwn<6)L9V7TXOU)UGN%6vGhtaL7FI4`-P~6GKK-Do*QFaBUDbd zS!4XG+(2t$%3+JAk({=9W!j{$#R(-BZHzF+nXU{!-(#O0M_%!Bl}M*3J4c}?X#h!8 z>80n5({QoDt>0OFZi;5PJC6e)UVWxwEZr?d68z3>pn>HfrxjVD%@|&CS?xH71B|u}iBn%5+0FQgvFZ+1#4LO@zNm zYq%d;GFPbMV~ngKIn!?2k(rF?l8Ay?Z5IaRS&L{%`8!^X&Gdrre=xNnGAX^T=3*Xc8(_Xmx;RQPpw_8;pPPuFZMZJ^n(0Fs2$}@kqDq+e6V| zvmu&0T_~_e62MuvDCmSW2=b>l;DdXI?zFcLqyHc2^*AfAO+6F|=&0-otG-WVV6p4~ z?fMbA!=|jd$P-@$0nRa@dc|LbCCs79HY08)`P^NQop(P|UcBHw(caozP;V)#!19|O zdC$y$dZvol`nZN2U7sEGCiT9Eu$&g(lA5oV<(E>a8*7P<)Hv*UdPTAwp-$dRqL7ly z9S^AnK+K`RZ2E)ETOp*VFpbEmiUu2jp@1`B>$L0?;uu#Ugs<3$XW5A}WU^pYApW=V z5&^q)v;qiW3D4%o=&zjU|olOWT3S>hYup#NQqqH98F%v-!<`#J`?5t;!5$1$S z#vQKw84Dz|g7u*GMVo&I?(fuH9T9}xlPAv)?)*ybPE8VkPM#a)e_}qKe-|243I`lH zCp3G;)@S+u&Mp5@8xKUlw&(Ko8W-xCg z_S`r!5O-`VvTtdU#Z~oRyTbNkiK6{`SStftoN!*O7kX+1Z+JW++XDA60@|i}Ecir# ztM3@?%vKuHoo8}%%ljGB=R4u*EB$7`Vz`Zb-7c8NsclW3)jn%LKZM$(uiG0Cf4=)A zhRHy@uKcr2HsL})?wpU*TLgR?Z52uE5iRkfN7@u5t-#V7>nOVUkUsic*KN}Oe+K6@ z&$OcT?-rZPw}|lHb?pBWoK;=DY|Z`?nb*G~Gy0buY7zxKmZ(^5dx5w#Xj!X=ux+74 z5q1MHgXV&~X8+uz{e*qT$}hVwIN#H3Cf^1&iiwm=_t&|p`}ouQ9EWsrN~4?;uy2jv zyfc6MDb)Y-_moRfWuP%bm;3r%A2tF<EOqV*F!CE?dKv{_pl26+N};KE)7^)tAJ$ckD+s2v2KCp}Qp#UvSH zQ*&|TO~(hT{|PqFv8UWqg1C#yepOxY^XG74a5e<)dW3g#2?oS+VjAv>8OPZ zp7s{XwQkLJ!BAkcV1+@CeflX2j<+aPpKUVQM(%=JD*~kTiJ52%cpb=lBU#W z?4_?Oy?Br}^haWerZYzFG)XeL-=Iw*+S{?V%&$Vnq9grkU6xS-dZFU@P4DAXaZS%f zYo1`_S)G0ajz%U)WVfFeop-OF`n|`Ck$E1a~ zbn31re{_LJ27P5-_*Wk?v45|HR`v%HrVlvY#3eUkQSPi#tK|~IT z%HZl@^j!&v^E}7M<~LFMfBOgK;_oA9efRm&zl+!Zj*k96@loB?%GS!&%IrVl>aRCd zG!696G~1@pCQ>8~aOG+Y1Zs)IG6qcpYR)Kah#JyXdLx)>lE`fF8NnJ%8(%e>lNDpW z);-rDgPao+T3$Ena-p`5eCvPRctHV5hR#o0cY@nIN0*-;R}P9Gw*3`R?T*wT1D0sA z-I~1M7ZFkIPHKIP$ZD=tN{+h1=}0CkHA%N|#QE1C?ZDtj7AGGKaW44A`w(QwdQCZ! z4Ju0*jE}7;)Fp)~?$8os9HmBl8VD;092huTHltG2Hw3CJ2XhKrSdX?m_9^Uv#Pfty z88Lj9mB^ONND#II_CeiWo@hb#MBi>@*W+4FzOLPBeQjqx*c&zP)TNGK+y%q_WY zND;Ew%I3HLf}Sa1RGL>7Tug4T_O4367iCK3+E#5%X((X^`nyBMR>_i(rJf$l>ARTj*YjW6tdy}MngD~@}W{)_*(&ZPnV=Q6oInC06 zOIePSH%l?OaoMXiN}Q~jQcI~3{8ZHM7B0BeM^yiqO*AWW*g&d7bbzY^IfJI&uPK?< zS@8pzWm+|x12|-hHfw}j#_&9e0&R&W?YpaGnl)kKbPd0?Dst)7=3-fPpyMZ;S94IL zp|g0_QPZX`bb^>>x#$beA%thRcu?uIR?gJRDRP~~$PUdQ0-d$vwsRE9PMSScdP^ff z?HX0mno}?PIV8o79&{#5E^=1fxPQ$#)2oUVwUt6$bgUXjVj8f={uAy{b=2NNFr*u? zc5KiZfDGY)k2-)4Lx;EFj&?a8`KnD1dqSRXz`By9&dQ1^@GAg{_6fyj1jV!K_KG7A znTYjKAjq$f_7}`6I%*A+cNFbZh1qn}0ogW`990L7I!b|XwrE3-(iM4F&>?Ql*NBff z?0Zw_NnFv4y|%d&%^Yk{tJg#GM2bjJF2q|7D|{V^1C6)}wyPzR=FTx4WUm!7(jKO) zWfz--&K+72uii-#?3?JY$On%{As+3jrcI!Bq- z09gMH1M-PTYI8?HXY;>(sC(rAbzMAV zfE!0p#i2byRYO{0Xd_~4#nD>C!^)V^b}Y0u&u_aD_XK}X1kcPY-aOShaO7cb8?GyygtQM@rTs zg)P+KDjMpW^Ik>^%#q3iJ;<*XkRp>4rdaH|N|BgFE#W+a*cbX@jq$8+jbKpMltN*M zyU1Tp1<9K7#4U+V-q7NA(6u{uha@eq^#>@YV`K}dk`;9EN?0gs6X#&uNupB4!!RNG zg>FcN&TFVy{+L*wh-L=0@8DyN2FNMC@yOQI57B#Q6~i)cM8e}J(O^6z`RBP9S3SMy zdr)`U;tONSU|zfZ(nYMP$E$D(PP{;J_Q}fA+-R4h{9CgMiz>r)h!sj+`2Gdal|A~O zOf-}R;=UbG;Fq`KHX^P-NIgR?F z*Df#qzEV@J#u5zCt!_r3+vnXjQIq&+9bT#bZS*8sMb6#+Eo{T4VM%i|^*-q5{%e#*}XIy3i?=#W=tl;h8CgHZf!2(fGKYq~vS9#^X^#9biRq@onQxtd_y$-H&g?e?H zid+MQ%0k=E%J-C&>tgwW&?>j)&JfwO&5qTX+e81IY&PH9NsHP#?j@(3n?g2)FX&Iy zhn#LaSsWdbftM+sryQ57m&?x4eE*MIya1zf?Bii$SQz>fO-^VmH(jn7LLLWf>Y@^p z!Jo9ZHBB9(yO_}&m}m6%&Ch_|^5>XVKAL-=%Mv}o0XU)1=Q?rxWS$J@+uK_W3??4F zwwYaWsN9dItLC=BqM`oT#@a#`b9Z~^QYBjJ5%kl)7SR%-U5h#D^+&kf_J*6|senI* zb686;D-Br+GuZQnGVNRNhYanz&<3JkY^--sMby>JyQ`CSKuBE3yhLR+X0&0axQdZp zT0W8BHU+%(G^QZ+)r7Id(g_;LuGTQf;&V@TyDUB2u28b`-gNibM}gtO`<}3p3m){0 z`#;^_1hIz8C?)sXewR*B_!1T@3-H}Iu~h`6X9sCZER1?Ma+Xr2P1PxU7wX_gbIMrR>t?|8BEDl9&$fda?Z2jc z?v%mu(r+H>;xkz&2*H`>vqz)UzvZ_vU6RHh2obS&5#=TfmjGJuGxzwl4Pod0P(vV4 z!}Eakkz+@B&y3PY?lI4-5#t#EAGgIWe>4f^mGKGy0+Z}p=H$A8sCf7G+!h1FlJ^OS zc1=}OMDmb)V7z%X!z|XV8ePMVcH*pW;Otvd&nX5`rofMm>rmS&>YH~w{MshDu~DaG z0b2%Krnu6fE12f`>QB=Jx|$NdwB8GJ9)Vp2V?wg777LVwFnRuD^U7;|Y!Y>eo4-$8 zP~6U^GQ6fpF1tykCeOk^orj$s=0-PRlqk{%hGI(^lV4(>-oY{rdh!g-a{JS_4V%2l z*eU`Z7qNu^CH53R_w*(M)*%zR^^W}x6l7i0&p z#-Wv@iDLxf!c zfC?0f`$%uqH^kIC5p3^3{w>{}MW%RINogd16Ao&e zmmmJf(ae>nGKawrY&y;zcM+SE&~{ql+UKQU(E0KBC2*Ff3e1wv8A#1%rz(GW(v?%FU%b-xth!lp(zy(nwC$%7yNK32e|0O~r0wZ$C z?o~r?=M_h80hR`I^&M^;a&jHHx=abUy4ZK|} zciqrx9A~zcFcKtD{V*R+TMt7h_ghjSq%w@Kyyk*IIeWQYuKKo!fI^b zDg8?DvZD)wzy2`1vx|$s-e$p0`h_Q%{lOuny}f%ce9vHD`>qDIQ8q%J(~f(OeBU|& zGt$+L{H5!T#toz3t_{5JX54mfcjs!~q=LQs4S>rl+uJkS+bjMJdu?+3(qjj#BfJo* zvok!~f#%tc?{QZY)^8Yu?uHakaN>h($hhxJi%eCcanJi>B)G{dZN3G^+2IMEKN$GgF_3>cb@G>ai~vF|IrGj zMrH-JdpiAlR?&av#~Akd2Zvl6?`he~&y4>}j@|72rm1@RW{5go$hiD>8-?he%Ywe& z1PkJ;YG)n#(d#pA>c@vT%EFN03|1b2qa^8H=%8A@b0mq6K1A@I5a!K$AmZ~TyZSMV zn_D>PXN3^D?VVjzTL;WMmPE$N0s*3zPa-r!wY!Ihh9oCc@umFYXWi*)nXEO6Grs_^ zfeG907RonPxZVLRcR3;tK177QDDi87i~P!k)=_j>oW+|+pt*-9fwUZ+V+~9Q z|C#w+CUo$to%nG1rO583ISM-@SAx=?mW`Eod&`>;(2Y=0yh_!gOOD!427t=!miU~a zZYc?R4Ch;s(Lbtwtjm}yLg{)~r?694C3__Re%>L{Yw^dv;# z|2YaJ{z`VBQL=met5eP`iep~_GL8qPesn^L^l&fqQ|ce^l{h-RMWEQ2{-uSaay-UM zc923&10|PheB(2U)T%t{BXI%8WUr8NJZ98K+Y-BxMY~rP5|M5C6pQ2G4rHQvp)ts` zC!&nzwT^NiG^F+o{7`OA?3)Iew|7kM$Kx5jlw(d6w7s0X&BF&2MSUPb1=UG^;QKq|G5*}F}Wwnz( zRJjUx8Q{`JX!WC!<1ewFN;0=PZrhAmA)LM)N9gDAPBEW z7ottMB3k;NO`^EtM2*x26zwMJQYjy^u^v#PBpfzWQPk?L!A+nIbZGa+?AlOctWUCZ z3q;EBjUj=peoB1(dXj%(&RoE(`W{BT}Qs*6Nq5;nX`lhOP^P6aQ-AQ z`oXI$Dqs{}-#4vgC@j;0JB_6QWRFt<{=iqeak%b^x^lep@YL(`uXtwsTfQrFV*n_3 z?JDp0^OOsfG^`K0s(yBO|2c?sBLwSL((fOTg|s7zArzJomESu~>o+!Ian0&9BDv~7 z&A&xGi2kmNL97%SUZ4?bvcZq2SmB8JSar?L<=cXb=;V@-O@(s+Evm@knv-4p?iEyc z)jNQ0@iktPj7=Is%Njw)jW0>vUlb)*qtb{SUUegIqP;{>D}}0}R~bi8tB5tyhD8~r+>(pvlPS*&-$$VG z66BG5MyaU7W09#TLo!twllRm_DASVOK$NSHO&N{!DRpAkM!8t!Vh_lNVpqdr85BWI ztBRGDbINu@x%Dt=i{w#c)f&}wYog31Dh`6?Y{=bfkke^* zS^LrG)N2MZX{X91YK%#H~a{13JKxz+G-QIBwE21e_ zUTaY0qhd!NxecnEXND2GO#=#5=}l-ab=~m_hhIrYtJIXNb?-2 zdnq_A&Rs+VS~hF)++h!LlwEk*D%St}4JTqrikzPZntLRmqWOVExF((5azc`&#Ct(| zd&-QQ{R;@vw_jNX#*1}wGhYhT6piL^u>M6<5DU$76iai|-V!#7V_(K2Vkju7pn=d} zVnCw?Lw*i%nXc0a)o^!zSN)Mi*&GKK7L8)ETK55^7HRLFfer6p2QLFX09>{LXK9TK zc$hc-%YbsKpI&Dw{s2YZs`6UVBpDD+R8m92TyeH3h=*~F)>H4&uL6#HD1B>ADi)~ay zx3~V;$@eZ3k$RkXTi3qQ%OBp!8z8`6{zHYV4w!gyt1Y&PfcfcO2(@zC zg$@&&Cn!*Dlu9M1lG3Pm1+x?*-5{ze$=Yj0+91jNP9NqmLwC755u-26q+~wi`fLe5 zpvud2Q$meInv>vdH_A(s(HZkxe-8O_L#BE6vl9tEC#{9QR5aW^m(L|*UGxbxk&9JM zrVb8s$q`hmZYz79)fy&(mFT&GJdwbyJT&Rl_zs5D(UGZ9Auu^)eS|8JIBFhqk=)6T z>a++XF2qS#C6rqd%|f*(i7+Kb`o!IR_uicAj5mCt= z{i1AC+l+H9y2An{M{?yeDWMh3`AW8ref@qi+lv!RpW_E2Luog$q@C|n0TV0y&2T!Uw49qsh@lJM-C>8hZ}OX&ZktM~cXs~?~qmKlqB8)dw6t>GBv zIhW?MFpD4C8ckcN6E5PVtRG55$Q0tpXYSq;#qoTAu}1z27W`i00xf)qe4@nRiH=0) zkRVS3V9ekFHY6|ISE5brj+u1-D#6nQQu&(7yL6{i?U=l2OU)EHTF#M9K8*ed6+KBl zd}jRpO8)(ovPHD~hW6WECC>&3s`og3EPyfGRGyXj3KQUn`&aP-=|=+?>#=`8xnB4W zy>B-o-85`dM-w3B9kZq$i<0heZ`(Wa%3CiG)i>dw2!;bPSXW)~r#n2POFmk#?&Y0v z!qpfZH~f?!^?o3UuM)u5i3t9{Pm?Ic(O?Z~pp$48%4{S4JXm=ne;(>!BmOejrITnL z3S%Sw0u1X(%pBus@70k1Y0;M%_(M;m*JT0H2)lLfxPPxtVR&1eJhZpYq|{AQZUiHSIn zGqEEp@&FDP?y8+RB<4xzM=t)^g3c*(JbaB-1P_FGt{igJwn%gt&{gaO%qK`r--04!e!uvXWUs)vil}U&x5g zkmMF<$ivVoQXGS*2KkvND0Sip$Io>A5t}Ktg66G3yVvoY3@LDVDnq^xp%MNUybOiR z9#gvS;33p*!WW*M&K zy*xp5D5ZdIxqwci%dG4SsVv61l=T!twd>Q8nO1n2+1=*k&HM!olrJh!-!k}(QH?|bU=Oy$_`6z0hc@kx1e}HhLOyS&LOSf7J#l0Hj^9r zJR>)(ptx)Q(|D{9h6Z1xoJQE6<7ft)Ehr34m@J~8i5)yQ0bj&(J*A*ZEr?bQTI4xf zc*ZrCm<~-Xm3XMHm^(2dGes<7kr+U$3N83d@Z9}Z15PiX5tdeq?Bwd5%uyJU`D$A6 z&!O7LkoL&1m2@{2b~jc+Rc=!EKe#KLZkrU$>!EVu?Cvo#X7yf^4Ak2hFxcNDNbB?G zpNh}v8y~*U?J#IIs*CiNV}S2s%J)X)V>h&JOq6+Y@FLV#se1L`9v?FnX2T4rB% z<^V#apC@KmC~QdbbxI2Jnn5p~MFb_Qy~Fy4jdH zTTj?dK@0xS(qj3D17LV5oq-iRG$oi}fD;S>M<;!eWjv$Ha|xp<Pu$>_w}!=gD0mt4Mv*l#v$NKqPJ zefw*;_o8LUP(Cl5B$TAzWw;kB*nO*M?+1$w-|E-8W98IsYL5Nh1K<{~0Nf$W%9CyZ z$Y}|WVVwgU`U!im9)Z4&A+Ko9KltOlcPM<2xB4Y_?A|$h zg8y)X6Ahtm&<%Qk!ISDx2Px8M@{Twi^jV;;Np}K|O4vA8z!2W?ka+%j81lp3>TqJ3 z>F#JoVNQ^*u{A>1Rv=%vUDK}3C`2tHhCf4*sN^Cmr;004>LMZ~9IeUHHWJvAeYK{m z@B?h|YswGPXWM1)wrxk6X(4kJ#+POuv*hIE{7|W2*p-S?cvGQB=9|(n=orOll)Nk1 znwy7|ZRrA9TLc}kyDH$4xEXSF_>7UAwO$L>Pbx;8&1Ve{Pobo~eIbpz+311~a>Z}` z=2L~aabVinqx(@3`qplKpzjD%4-OaN)5I9TS6xHP^%pY}#P{L*p#Iu*y551&jHd#^ zp4Jao7}5#SW&RCiToLx7XA_84xsPTE$F?8~Z~Mu*sbJ;#$22_{$7p3~GJ{TQQiTH) zPl0|Q@zq@ink_kUMsN7u#h&2-m0w87#7TP};m{+k?yr+Ul>Zmh%C%k;;nnCzxurL@ z2DKzgCIC|--eSzT}HA?*`7hd!RP31r_d0(q^-i(Z+zPIswY1S+!CxVZqgP-COx>{?a zPo{AR`$sg_Kc#FR6ZY5FPQy-zHkC{V;GSYwCsoOVDadNOk%k-C589fU#rbuMFz7 z9neN_T!2c47=3W6F;55pwnL^SWm&gIZ*XU6@plA}mQHBMmbcNwdG*)JAQ?JL9Q)#*QXtjiF8OyN~Z)g z!Uh;7^ayuqOaf++=R%d5P;HbDN|YcoV}Tk}qhn+gO{U-E4u@7Lcs(%RM>Y!<(&9YFQ*AH#4e=P~!|K>1LYm$ZgvC zi>$<4k-T<$^pBwmbZsCh5S*_Li0i`O067`Hi0JRWlIF-7HbHg8u9zKd+=rbU<|Xa9 zBrc_x0fU)=&$!gPXG*k}Va|=o>=sx#RF{DgPE0Kkn++lxNHze%QSfw$qCW8W?^DP@ z=+z0|rK|Vuyo=Gr*+{sIH>z1lShbhv{oooq!M8WMs=>4DuI(`(a~d)eE3 zlzL6c`kHQ<;h>bjPm`|BN`MqJDczi@AX)iHQ+fAz%bbdoBn+c$06_+Q4$D5a);4Mpf*ScEVSPM!U}8 zhGB{-2O`|S_b}y!#t(YTlKc&S*+s{UCNk{wB(wp*X;S&cxeUs#Fti-yVD-VY_sZpn z!xr_oQ=ersB+nIdR!AZT0MK9G#PSuRh{q#YShjWkrf7}0m4(bLVQF@f}4PRbeG zoAd@(`qpEAR6iX5#v7YrE8u1qNr`MLBpP5q-d=8#f<4r=!n`yX*2oyQolw;WaT~UG z5|xUe(|)OZi3OG+~sbjj|43zYq~`7*itr zMM9skCeVlyy8NY1KVfRn@`dA{@!QO)8yE&4pUk)o4TcN{9@2YrS$*4nLTp4#CJEnF zxaw1@_kzKd1UbrWIxzeE>%0Dd9C$i|#{#I3LhFpcbNgbd5pP2wX~bK(ftY(~QK zd3Pid?%w;SeK!LydUlS1|I>!c)YZG-QO?^%zJU*fAsS>bw6QAM?*=VKoghzmX(2)+ zW4gQqr1kx|YNPHj0?Evc==Ke5qYi`y17o7Lh-lz6n>sj(JxR3BP@5GpxFw9$yR*yK%7R(Hyz4Y11z2D0a zb_}cc)uh`I@5S+q(jGOZ&7?67oAB+TcJaltwO%;l&vHeq=7ieEMVY8F)60BJcq-c8 z<9JNFrJAh(p9(gkBgWNl1@Aa#6Bl*F$oc1#C}Wq*J}Cr`>3z9~bd!GiEp7j=`%vZp za3CKy5r?aW!4Vw85ndHONv!z?vJvkS(b?sAKYd7a-K&BZ1XJHhCO|4B`_^YaH>k<< ziSuPlYb#PDWkD`V1&StuHY9~S1$9DZLM}xuMU-ddM1hX;F|^n}dTVGv>O6~cf6!gQ z_Ep_rkw8dil?Bv*H@+q5akv+iJJH@oe4LWgpgU4LyUKQo{%rMMH8VNO5jtnh(!Z

    gA9R&XC9A&VFy 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%0A)R)?GndUocV*n`vWWFgv(#989ZAZRm8 zxX}9=-)}kY4|3N zgwJn|Bqg$>^$x}6-k}Y*GBF){K4vv*md!fJI}Ug-&Ni{br5Hn!#$O8ptZ8_7y7ty& z7Ts&7>;|;8r8}x|XSHQw5lR>w=}si4vcSVHvH*Qf?~JP%irKWm25QPX_T~&XkdTdQ zZ4Dbtw94<7DV0Vi6{)PF*eB%*ma-&lYbyNKCCs=0${kn9lI2EH+d`r+ROFeM)OHF+w+Dnd1*BeDBU>TmcB2SYLZd)+-t*kOtWq&fQo zoK4JU$kb)V8LyBErzz7<$~Z`s?&dO1{!x92!%cJgqv^!OnzM4<$H@H3bL~xwqM(*Y z5xv`Nk^Vx)H>%ylVTbw4Ox!jI>(Ir^seSngeOm2$W$x{9x4QLp5d?NNYi2$f*Eux% z4ec)Yc$i>5UDm>H{F>Y4U;v@-Z3_ULXG}5yv;;BfVqDIy&)H6D6lLa|hy3|5a-YM? zX}XM#_+qu8;(#ZOgW*EEzbbsytp~u((NlTA*i(Bz*i*ePNO*GqPDl)_3y*j6i&b*- zi=M?$7s?bT%!mKO?4&fB{wn(e_=`?yaFy?OKPpx&&UWY7rp3Y}w7#g`l15aT@X9VH z4^2|D#53cKV`+%Y#IO&y2mI@A~$J@!Yl>4^i+8urbM8nHG>wdQ3@z&MvYP z4JlmU-sdbO{sMkK_FYNlN=^QP}RLML?BC3M{L$Cel+x6Y|Ic6R$t zN*Nf$nKHb&iV{h0t4ut$ZBJl}dblR~2o)NoB{PHv96rk0iuZ5>aiN+yAdDE~N#Z{W z^@H{pA{PAzp7kcU)Q1fD>e9JJy6?8j3N2N;pGh$0?F0Q%4#8w9QWtmhc-+0?|5TXja@odqiXTyF);DcZLP)plvgQkSS}qG0}_m)~fUk zXg%ZYDQS#EUcd|xHD;9Gh-9{?4{I353_*@H#Y7uxO{0MxQ;k-~Prbo54Gl#nh)}k! zN@kEvb^#SHtg-TVYb27=Gv= zTYEQ$CM!Cwj&A`+X$n@H%|k_1ns+g&-8Qwy%_7b(Q}g-wGFT;#ogn$-(?pyxyRI*D zI%HCJIV&s0W}RtfsY+v01w*_3-T*G=oQ@5yf})pJs-K!t64;4(P?^Y;SNWJ^U&-OP z%c8NO+cb(^+iR_(9IinpXE9``>q3bt@Cc6;Xtfwu~nAJ^lV>2Igr=0JWuEWNw%j|F~ z(3xVu2dF47j4#Y8x4E*d*{U|ALPFLZnUA+LX{s#1`jl!sMr6%%6qC%@3xfp(%@iM( zXsD*#N5F?`Bpl`ZSi9hazyf}q81p7tm}MpvojLZ|9nsV$q-rEd1SQ+!Qsv8b-L~1~ z?LpR?7478pjiqhqv*b-K8box@y47_ajV@0cgcyQr}Mo$zDfqZmEn9V0#P2iOD3ToiApnc=dg%zc z%B5Ex5Ko-#1FrD! z24+{Omh>KOUcCg6r``lulSAI;8UOK^ARy}za!Nh~9?B){H5lp{>;Z-6#S^6#$nAq) zK927{NV4zSEB#fooc)10&*$?CcFxxd+H6zw95KNsQG7xSZy1;O4DMgVx~`kakYKE7 z+%^b#X!B6`t)w+xn3a6ouoVAEA++;T?`a>w6U$RLAYSH%Zsz@Y@sLsU3vUyduu|+I z)@DjfnyV$ag2Qi5s&rqBnU2Um6h4%ig=i@K`5*=@pn|>QWivPis^4IUa`&}I=}oeV zsbzj!5fi!(N%$J<;2sMny|>yVR`^WWkM^OG&qJO{<~+xvcxoNb<1-Lk0BBtS2-w+u zV&m-!-@fpCe&w%C?Tt$%X?R$Zxu;5Wj*;Z8ijaZ3;A#|>@OHz#S@1U)K@jR^=p}P) zVN<#{)Z3YYhRz(-&@ToTAEy$-(${*tf0bgh8hI0|{DXq{N4l)X>Rsw$?Sk2&Ng{LTwBV~ zt*?=Q_=yizaBd)#&Nf4}o>_;+;HdkSMF9r?p;>v5LC1C<;acs!BDk7!I-uKq%XH6h zi~8{$acTe@k0`}kB%F|si0u~EPZdL;W*-&&!8xSjBPCo4ks)CkOn_?efbDYrE)<{? zbD0brGSoTZKsaBsEPzrP|FqUY9KVf4$WJu>gOH!PXvryHxd-8=IQRgiIBvzgp2} z+T8EjeSW;()%(71#?;3?<1GW1E9!i>?rgZ+^V>${s)*B{{i=|R+0L5ldBp`>swBrA z-G<@WSdi?AS66Ne)yZdun`#-0UF$n0+~3;p`a=69*i;-=8=CuR;^Fq4D}`bIe}g^y z<_-f-iW)HLt1a{pT2!VSLaoaRJl?hVmoq%Hn6={-gpTctb(io%1*-=O-H-=^cS+-3 zWyTVG8wU=~6b#LqcPo5Rmr$$dotev=-t|B($`xO0xFmX-I-054JPJXe5lOBB3$eN? zudKwwN=5ShmRYc_XrOdwuA@c@1D9Fk?G+3ZK7acU5 zPYy2jk1$%(oFsY5OG7?<#dT}y{**9u#h>M&=xHH5#mJpe8O<7nCG=dE@!KbV;WRrv z1ZdZ3;ySIVCze!2Zh$g|wL6*a2dv?xbLxUCkA=McF=o=!qK_)_Q@kndI*Js{nRew~ z`Ii?>>m(DDQ8P0ANkWtq*R1sHTng%%raY5otSi*bXBElymfomgPh=J*7q4I&Y=GQr;tVzN76*+(jfSZPP8E?!&G$rXLv;1!(sk#J>>9a%#-oyhe@}P;wm{F<-YDTccl2Kn$qoRfhA3fJg~@8( zpM&`dACSK|ow-)n&B>pVUll$Oe_4VYz%NkTIxkRt2K}12Wk&zPs;vTy)mk1=s(qoJ zePzAwO8blelL>oFS?;L#6d*11XmMq=sWDM>6TrEuQ2M!ah$p?Z_ag^^ zni(AE>HA`33$VBvbfsBsNtQ(HhBX+bRotmTtI?#f_TE0MOra*zG#X{{YN^$f^&TQQ1T4i%V{58jc zd>*V`oEa#rZg>k!RsF`t|p2*;3{3Fqf>5$f*OW)>R zM%dXikA-SDWP^q-2^_j=e581vXB-% zOzPmwGU&fAj$E7^jZT#GPIcC;vdiEdbr)4DPZd||jkY~5z!D#`gm|FU{M;6YLng(1 z%MX62)*`yreo2z}6Ynz_K@}gviOzp&=guCSZ(1cK=x$AA2PPpjQ1)#*;A0>6T5+9e zq12)J(P?uixYRK%ObVrSaK= zOK?4#F%S2*6r?7*gJn_%f*!0dRA{mWf6aej<~ z0zwP()daOug^!w=0zcM0d@my01qu)u>u#oiURQp!`U!!;S{GR~Q`-jStSHo+? zAFx`1D*P}S_&YI4f?KJ3{-Os61YsmqcL8-%0@O33kU5xkZdff#&S}je5_@;XcMVE5 zIFxueSaD>UDATIF8I{!rE!h1V{xDY(9nUhM;Jj9B4}U12dp%%E2{A`VCY}cf?wpyX zL8#fPC^=l%EZB-5BaK+o-oh=9Qn3*xWt%8=_=X7}fGK&R^+}Pff>?XAePb#bWeMbT1QTok%_1prH*RLTn0M(1XZ5B>nx#J zNHU5N_D(1*|jCMfD#WeNx@IbGDE5KtY9Ke z!n!6DEl%kQ^aS-d>B>~;YR<8W<_3w@VkHUZDA_&L<@m`Z%nnh5IQr$M4q3r)+q0+T za~b{OJm4Fyofh*R6!Glr!X~a=CX-upZqnr)Q3p*aGpgP3L;*IcJ`KmYVGxgx@xlNa z#h8I&F6l(s8vT%OA-!8GF*fP61B(^?;ASxdrwz9Nmn8_|IhS4GZ<4gii#aJ>n8~vX z&AI_A)y=tCHN@$27yT)GDa)yDXIQ3EXj`5DksgyN9lwNXHr@Sla>j;-CBh{QS!AT9 z>K$}gsI*WzF-@nhUauKA&2T`vZv9%A)I&CvgGVsTA2pQLG3qxFgAcNak8KbDgUC0* z-Mq9<@>HS^K3wx^D2bHAGdAeo1lgsQ)FYqV>^{fy(^;$L+Cm49H%N^5(1IV79JU}M zZw+mO?!G?{d4y)-I+iN9BNt#x$-V~537y@Yz3c#sVW75R)PCp?X=UF-)115QfNASH z+RO#{ddQ#PW|Z6ugjXQak|hxP7R9jWgWhXxR0O-aC)bC06m#gFoTsS4X6UJ7pSxp+v``3|e{6N6dBGikC6Z3OzkjylPv5@4 z|N8*C@xY z&v);_>Wk?{ik}*PxHDPhS8iUWZ@3No)wQ%Vw7$CEdY3*=(Lq?SJb8@S{Z0a7_I$wu zjNZtxg`Mx3lcP=b`Dcb<9r6x0es%B+PkYq4D+h@vh!cjP`xGA%#o2OEPl@nzyIZhy z%=Rl#a~tq=QlI~WRvv9;iAK-5Ci;Y$0k*lhmMPz7;3mR)DSB<3$Hn|8;c* zEYvwF6voOj^n^bmB4?{c=1y1Flpkk8++LoJb_#d7-E}Nw*xv^fCoa+W9ua%7IX!%a zyElA)G!byLWt19b8w4^02K_68o9RbinS}u(LD-yiZJjeyow}?IxO~ny;I!S5hObP} z>!JnfpDAWKlJO@Y$FO)Wv~Nz62-R$+%Fml^w>&&DO=$KbNIct+w7od?e?j-0OSh{_ zZ*cyt8vQoato6=UbXb=3)U=2&COSmHKhE{oAH&)HIQGuYlAF~U5;<((pHI;J(-<1qq@LrpI+3*$v&Fcuyha>!)ERcboomyd>ckTWu(C&|hN5u_HzW zB+7qQ@Jn)6y>LT+SZ{~2Fkjc*L!P|Z;A1aC==kimJZkTkdA<#=?-|_C!)F_!RvbA^ z?`mIH!>=e`UP$8~Q)HSO|4fYYzHB_7Az`kzMM#3w7E@{LN>-|`DVA+OEBv`}M%Pd^ zBVsCEQ(U#v9WA(0khW(<(O5$Do=2{k%TVXL8nNvD&n4ob2It3yAb+L4p~6Rz1!hzg z97L^C;ioQ=(=U>Svc@|6Bd;gU-wOC(Pc7YJ{4-K!aeSsWMD?;hE8Iz*ZugnE*iaHC znP;M&A+tC1me|J+sHZBG&n&0a+J~FcU1W`qF}fX#`v_t|Z&_7Yy7jwe?o0?AE9viW zHeUR`5x))c{R$+j-Tt24cYx30tWI@_{idYxkMpPjC_h^&CeNOk`J z@1J8rUfB``@+*5-USgwiTVAvmk&2<8jg5H(<~t0y1b(=PoY=2!JyUV%^yz)J4jmz- z+^(oVpoO6aHFozN7M}}2xkS?M~!9XF_Y{Um<$ix1{_{MAkwU^TL~m zzxE^7rSJ}x1w0Uak9B*HNZk!d!hpSP6RQcLiApSowYw>zaOL8VM&bDNCp0){%jroc zwT$JaDv7C0G$_(K7q#0dqSQ%6y;(s0hj+TDM`@LI@rI4nJzEmmO>NoPl=~5%ud)=4 zryZANUvOS5$D!=44noJ3J1p*<==N`?g<);dTvOqOR$|Z`^@t4lyca+1D}BRzOo(!e zO>2C8acD;J7|ky)#`~|!qM6pQi57G3SZ_f1h=%dlMLw6WhrC-`vOMwNNQL&^lK(>C zA{j+e8t%VeITeZ&(;UG;VQHEhx{iXNxoKq();V^!RP!DXjO;LkR|sD0!BqGL&|MQ^ z(R8@lwGbsgr}(2A*RVMf?Uk_sf1iY!2BlaRjCOdNZ9{(337OOx6|iS{PrJ>SLWwId zBQL$Poy=BLKQyO#?2hm;zt85i*?I6$vqV{Ye+@f2x2z1X7&0S3oqrqepkIGCysvQj z{6jRjhGj=;T9m^*4cRd=9qbWlD9d>@uwei5+i-mYr7iV3WDM<6$~B*$=N|8O6-~uy z)in^+mFC^eGW?`N`f^J|LctvIgj83T7M?Hz>%l^XIjHavY(pORa+n2RsP1N~%!|Sl zHd%4wQU%`;EGz1@M{L|w1Th(HXx|DOfZ01^^V4zO9;>&%D0Dg6;d`TbPwP|7sYp|E ziWGC*GUBP@);|2gA9LMkmCU(g*LtJ8WaOu1AIu|h({#Fx^>eJ~ouO-2_a(4&R}f3k zYTlR8Ctu>rX#SniXDsODU@v0HQ}iN!3~_w|I}1Zkq~R0C5&Y!V4>}nd$_s-N<2f3=1W3U2$1Y-c>dw z^ph%`GRT$yujlsRHki`3r8F`&{l!zI_?v0BUJ12bJ|v;m82Ea61~KbR1jZ<(_=M8x zohAhFtZHu#Z@mil)&#_2N%9z&-bPaWgPOh$@la`ESw{UluwJ#e4&k72HjnVnyDG$z z&#G*(xHWL4c1(G+mqGsBe^hf=)Lm~llt;;RRMNgmsx6RyNu_#-q6z0ZlIKo8vb-ra z=M<7q^9NkYAg(f~T0iv356b1L0<5Y+A{!&{nnE>YIaI8IimKuY&a39fi5NwtPKQ2GGlFY5;8vb?4__x|1in!KoG9T#kA3 zy`_3Wa6hCbx^%mik1Td!?=*v7W(q?+3{-(oS%fXPhsleE$*F?PI6ocJm+EWD7pVvX zIYkA_r-t#$qw1W|ARBj5_d zQjV^DjINxP$ZZ2dVhfAGOu}p^X4H{Bz#(qz6Bu}d5@bjZx?>9Auusy9^wz(tE@CKB zaSL|^Li{n93!UHe3!dFV_w_(svysz)^;E?v;c`rom!EYE_Lo)?s$m4TBDfgeL81|> z%ISE9(QEw7^tNIz-cxQ0?`2En@l1dz-yC7D?aB(hkRC9!BgMi=Kj`r3hNtSieE?)b zJfwI9bBC|h)SksDkCU<)m#V6&E$I$op)wIAeH#Ki*~)=<_H<~5kq9FgGjBdRO}kl8 zVZyvFH{skH0WH1lhpL|oJpv$$vja1{f_IRQSJlL&LPUjb0vP!sXN4TpV1Ocj0l^`7 zCjLmSEJLD=D^E=p=dmW{o2}5TBmM3zbR|iCHF$K3m0R;dTlFb}dJpRyfb?@v<(24n zDEcjPDw3 zFyH7;i55J02hfx~NyN7zM5toW%G1C`aq2?)b3lfjH3trq4w6FQ;J><~xfec1D7GwQ zOscu0K~J%==>8NcoI*MPm9!@2z0*$(Qsi!)0d(CxguJGR6w0g(Fj%5*a){X6NC07f zfI04m@B`8slPk~pf_$W`5=EpaqzaMF2ADOY6P3Gfizd!^3#Mcg70+x9z~b+Rl4BSG z@Te-wD7V@zcnC{X|2}xh0$s9YAfrJtk4Ke~6GF@@Vw4S^6KLu}2cEqyf=O|i910V< zBud6hhlIvLBxyp76aS9{9=cDS0OrI5jbXryW{|XjC}Mz;2cZqB2`ZVhI2GGKvpfLn5)jUXk>o* zF1E;qZT}=lJ61r_iLW$fuVV^WCz$t>VF_-XR2vOT@b7B5rAKC7F=1?f(PP}o^tyZ_ zPJbQ^YRZpiGF$;MN#M1nG$l7y5aNj#vObKM6Y8)btNaMs*zmA&pqvp=+JLA&(xfw_ zS0h4|6D7nPJboiV-3Z)ToKOciJ!zXgVbQdtP<2&0c~X#5QMVG1<(_W?fx0`f1%ZDAspgvO8ARThzcQ3Vh3|e+m&3wI zJL3!8kpyJwNRCJXT2yFOF5?yJs?})Xny1P*lV^37O8DhSwBzr!9`0TkgE)lz@B)t= zz$XQF3~r`j%m{D)=2gdi`0@Ysg030KJ=`>K!o1cD7~{M;pOSA|*dEOs7fAXLP7#J3 zE1;gEKE#&^l>aQtf)d;lO~t>0~>Ej>o>K^OrhV2*K>-RU?4~Q-SPY8jgO}bV~lV@4IZZYdJAE!C3 ze#CbB%CCG(FZuE+6~1{qF~*37pQn^y(`VFN_^}bKnIX9@`QgTXlp(h!7!q#LHg|=Z z|H6{94JL+}H%i_9BLLoDJ1HLO>otI;;EVS$U-}D{kws{0H|EphZMG<9xBO$9tmNhaD% zapS|Q9|$xzDsy6G#+fYBu;RyPm`1H@SKU!iPzQF7`F@6T;5_O?@&tMCSVd z7HJ1Zs6QjRy@N^w$*9$Q8b3z*q@FrWbnTM+lr1ZQ&+!f{L}69P6J8E3t%K{a&f5jY z){2*__`=N}iJz%2;DXwzF$gMm<(#|sZQtJa zoZHU*yVjqz+S}(GW6aTKf5K2KZDWoAU#`@b@^4xS7_z(tLFajo-@vZ#oR~5fIOj7< zFH33$J+QLf;{niaXmDXXWXqr4w`)nXiyGr&ZKmDq>dNuXQFJr2s%RqF33)Ew$PT>C z`E6doFUo)%q(k5>hrUd*=VaUB$zW{wfRusk@}Tl@!6SMQGoVat6wRngLZ;ICljocA zeRmbSS@B2AWLZqEUj+HOA_|Kj&0MxE{pCaD{k`<$f88fZLxwInP$5ew(vdjh+}Tai zY>H_2BLqv1Qh%$Y{*Ky~aV?j8YS-X&vWz9OrlFWWCWGDd$rByPo_$r;lOF5UZGX%T6pIJeAfOz-#?CLU!Kg<8dHv zi*Fc&s#CnwNKJazxM$h()-d^^IKY~dWO}TdOJi%x)I~J>w_ry1sswz>r5EDH6!K%H zalDAYRt%Y({*&xZ?kIE?d$~W6)80M+;pASbm+GU-P^NLGg$R(`&k&#c`ZZx6wL_GQvXNja3!flVLL$rF% z#y2<`|3$@!Ja3viD-6l&t{ScQ1V_p8rfS3L-_c1|i^ks&1SMER5XvE(a8_-3(aiwud5h1P??9oi@;ttZ zH=l0C!((eILc$vTNAv>ygAeRs@XIWuDYmu0su;EL48Hh-c{#ifrOM60$k)78wVWCi zs}-ud!K!^*jptYm1%y&kv*a3gSMr+S&rMbG*#26RHU~w*&lTFf^M(^3H_imLLpA%x zZM^SZ)dZj>mAdB|`#v007%UOH^2FvV7I6&^dk7q{7EBSsQ^Cu#~PsiBZliF-)neIt5Y_yI*voaH^_TA-Z3sb>`JV7UR? zYmL?5nLb+2?CcD>Ui|Br`^|S`?l8K3m}jKUa34ST>zeyTZs3s{lg9n+TKH~%if78` z;T3wA?Ouy#(&_#dJD~0esv9Ehn6E*pYvj$~oISjEoU38FYdr4or~Q;wf4yCUcdVQN z+d;y2S>^pFL)=et+Wv&^G##WB!;V&Xu0arB;SBzp(%3x^gHXCaAx|ppJ%~9e|Ih@$ zoE994*8$|5Tr}c`Niqhpqewh8!k9xe1~qy(iUw)0WDmO#0D{~CH5fBg&~7lhc=2uOW4agZ5{sx5t?PlAYqjXiq%Xw(nXA6 z-D9|Veiv=Bb-|G32K#P{ z43d@28lip$!Cz}I!>lUd#f@^|fGPpz^=gDOo0YJi%~^&G7rgd$RVvnXJT$ZoU9{D; zU3As;AJon30@^mN;a2B7Lrssod%xfG?Z4kBZ5_)d0W{B`w5-k`wyYmV=sZH#ZRpZ? zn{5-OpRm)UxaQ2y7bh5neX+5Wua)ghQNP z>e!WjD!!oqTICdDsh*ghn74D-b8lub63!z&72nPiF8T7i_{>A zIrX?{z=x{cQw>?YF6~{tM(xRXrMOAiBH5n34RyQ{++=^2KJ)uXdY1Ch@y^GD%H6LF zn!RT1IezHe1bx=Am-~=*FUEw|Jh2klTm`HDUvmVW&tAtkU8RU(8#a$I%+qIAObvvF{_UZMbO;W7Caw55Lvt z+yvq1XU2oz3X-y)JH!rW}bq3^EAAIcE}l`>2!4qH#F-?VF_?GpQDEMdtU( z;|g%7jDrWrM%b6f>Y`x|*+*14*6Orm?Kf!}aNtLAMhYCt_d_S0J4s78bW;{^ZO780 zV~n%+ODA13J^BhYvk8vm>GWQRFkBQqx(`X{H+#Tv1o3-~c$x=9_ zOv)MrX&tK*sIoE+DUXZlH`{bn*`K6x?kF@)Jtb5*^pey#x0AK9a>lkfdy-Z-W5&*O z$XnVnZ^6}k+!LrY{+v@LwsfG4<5o`?H=JR)hn$(Vtt=7yT&<&h}2Ga&Ral>^PP`GsL{wcO2Ro#Xlc#Y~4X@?66@(HGQ=W3@G z@j@_=Y`kqS9VAe#bN%z?#`W5#LXLR*lkQ))CAiP1Rw&=G95dgft?z}&4?722BNInQ z3xFA&ft?-Q|MKSunHxA57=2T7luWEmjGSy8h#CG7%%QXaSl~y=TnKEp|0z+EI6n`Z zcL3}R;srt=kSLjpf*|64@=Z7#RlNil+iH5ll%a${@cPp20(k@3FNXyppby1gJe*IS zKcBDB@$q_r&-Ma<@Ty-@`+fsit=h%N;IG&ZjL0PNY~I!$?y?%JKdNZ{Ay8fq7!+od zN%F=H@B7s_JZQ0c9w98ON(#Z49LF*Svdpclxh59)I+$-65^I~DO^mW3IdMF&UoEX0 z0hk>1+z=+b3>9v>Vn}uEgZu?5*OV;5gl0jBStiqJ+SaEK0ZUP!H+~Q$5p5Dvt6+g2 zhKv}lgguU2X7kKm(74GyA<_A|{v{6j)eD;-eo2wixGG&(>o8;9aiJX9=!Ale{+*)S zed=Bc3Mv0{$B32x=fe+IyOjYKUj!~ZETGF>Ufce{9#L`=AfvuX^ev)bs576bP1Uj_ zZT|jcy)bV$kd8jp6D=~!igZ%wY4kWMU24ZJcn7K!e2p4^oz))-RpK7R47HX>L+{*re2__xDe71u3!w0@NpwuLr>paA6gOMOGJ~lNv5Ao9ff;=GO5%BDSXY~l zyO2&wpIsrne?KAt`Xs-ZX5EPp$8&j_PV<=NdAj^~cpH)X5i@675LAUiwJKfbr|W+K z>WXxZpgJJ^_DR&Ao64nC|FrHox#XD*VMUb_V>({OSj%-3KB2$Gw9CCB8iF49Q6%AE zBxq$^B7K6getp)k0M+4YsR&iCyQ-*Sbm+uQ*Q?4b`h&p30=7e;sMAa!SZev453vH* zuaU)e&8zk@u_Q1{z&?LkrJ6S=b7n2@Jy(_^(*7c$@b{IEMBx2uc3XUmlhZmThpJyp zB@{f7RIHGaDl3-fkb!9llnYa%J)4k!6YP_n-cgq|dLZDUNHPA!)Pa!R;4SA7`T}I4 z5)wXHiHsSd?r_l&!>Wdkl+Ue)ZMeE}GF;jRb@4)UyI$g_`?@$-7xA1DhZr&Lr4QK8 zo`RdU>9GSEYA7~4jXmn&{&xS0&@V^a6*OoFn4rgNn9`S@Q$4^Io#xgCRdW?00NQZ9 z(7_W=mN)i1l{SNf6x0a3Rn3}rpqeuLIJ9?&n9{mOYnE`<( zp>WHzBUb*hs0b`Sz8DF{pAA6~wFzn7Aujy3H=_YFw4w@k4e&xsOp65X`2#-)!*WQe7x{kOd{;J{q_U(nDhf0M>XLMokUFI7v1=sIo58W!_^Rn8 zv0{xHep!_lUp7g}MBjA~HKnipxZgc53XTrS117;mEO2>NHg%SwahI)x%*f?xsTIk% zsrfr1Qrjzz z1FsSC?FZ-Kui>T{6=xs>*3T4K@tE^6suy{&nXEh`)aTjsYw~(f4tf)lf~6IlVwZS* zE+OnEMq>3bJAC+qL-eYU*{UvONyhEy7%)=n&jsB)FMW5G{%OO%fu?+DIltkEE*{+B zU-4bUR+D!%;(4h9+P6-$Ov?%Mu*-5Qka!Zjgy;MIu+8p3VCntMlvXv6SREhgO+8{WRnMCislck0mQjWyEHk5(X$U(g%>o4WFkqt}4&)E=7KUQ2MQxLZqJdC;D1 zGti)&?@Dlrw~mxkvtEm*@oW}IeRTSrob4>4-G>$!D32s4E-oIRyoWMRfU*__g`h}~ zL`+POgrF$?a+1}{#&o4Tos4{t^Y!*;^8E6<CImtrT6ulNjgnsyHhlKfZ0Ap*ri(BJy&wVl$T+|L zAkfer1~>XgidhrG81w8ov8U)#`=ijL2D-a+M+&;Ta)$~UpkPCC*7w5-JQ1s0DB^DRqJCz-7MMBg6^)`;ezh2*zthwuG#Sh`~Crb z{`i#7asK#J&td*Kly35UGv7>{J~|Zc!krXo@1mU*Xgt+xY_J}cYc8-JwQC44ALZ*% ze?AH~<-QzL?&2Lf=+E*UTjL#jS)tSzGznEwrQ&>5p<=zJL`?ib;yopY z&KRcTv~s=Zn1-Y!i5b;5zPwFxTFIe19wzagqD_8GM3Pq3AuPUxT%)3Jo9J<@=tQ01@!UM5lFFYhhH=-IPw`4UQbB zY9%xzM@=FIM&7od z;%Np6OAg7q)$xDVL4d=A3EF>oBV6*L2{)9T&#D_w(X3c=(^5ICS?_`lxf0Z&=#_6z z!<*d|x~cG{HB?Hcjpe(nk003JO$21UH9#Og4xOBzf~Xp7@|8-7Z2k2@yswP zSmX>GPwr1K{JCan#HbQp3+>r!Pnoc02)>pr+?*<q^H2y4zVxj9 zS*L$3Sj3GwIG+$0orLpu6pyf?;Fq%dkk6piFSM_gQu_%NT@5ld42Cn-|;k3npF?sYJ(NJZL-yLQT@&5qerh*+9@3Vai_^Yb=Sy2TI-QP5DGjP>tfzm z2ImKY5Y1rI2d~F-tp#gD=!av8GfXDzITv2tS>xgT+$tOOeH=FJKLcDS4_lbVl>Mh-hca$xel$prvj0| zXR?ZMbDZ_(XEnT2FtO>se6x@^uVyZvN~)Y#+4_~_*$Pp>tLoBLJod!#cMwKj5->o` zH=De*L-{QB7SDZryjLaH-!2M$ViJ@-GKX)^VxBfuNgu{l*N&1d90Jq;i6sW0FI+`1K5D-ME-q$A~DHa$0VgRUtyb$hg>N-;8L} zR;6@r{M``c66vu_86QaUr{!>Zta+tkKkD7)sE8PUYn#iCQ#NL&Y7KWeL~Q;|%5un1 z1CTj7No;O4l!*UowQ>dc?4$L@o+oo{I+UnAjxzmm>&ex+yd4kRyh!pm(5>M{F5kSR zt~pOK^El*nk5%8?$-AzJANUfitN~qtap{dz~kJ9D%1<|$VeDB+M2t+4t z=bi_w4d6IPq6mXfnz}hgN-szJTCTCRh8<#i=9=VQPuj)5(Li=iPcdgmt21Zr zM4xaZ3!5RauA7=Sd(}$NUg@9UpvD5O5ugtfE>eHWJ6TB{Y7m*xpuZ0k^~T1QNM_DQRCvO0Xvip6WG6SxHt8^V=a z7d2v2K)_i!>6=z>5oLe|pYWXg{YP=IoJOf}OcT)H^`+5cxhv`dinzpon@!_=|Dt?c z;`R;c4GK-6z(YdfmJLZ%i10%GKrkZW)~!k7N$-SZM3Xu4FqaGpN6@bl3C{6(g=i!$ zrch(p+hGi;5y5DCYetz!Fe6!Vvofp9puNhtEwefUQwTRE(AgjCbD?Ph3A=(I=0Eap z1*@z9zFypXy}S63wK4W`s7jwUsk>zXeVM;35C(whxF+XNAe$N6Y>?Wx(}4xD!wOJh zHnd$v`wf2~?3}(`QrDpEkB!9HvFp=DPFk#2C% zi$4lt!OsA-Mo`*oGLGo|LeXD=odxPu4k!~avl)_RmHH5pk+vzmCWl-9D0C1*|(mswic{1IZ5o8;o@%E}ZgQ%A4?QiUrW(=&G%MTV3fYQ!-+tT8P6 zWPozYuf?>0lVvT9aX=e=!LOCr9O67{fD*S4(>RpMR82LVcsU>~GqJx49|+QEyf`qf zC2jf^I8cP?(%^Rt%Kiv~EBiga7aoJNzk}d5>L3qE_ngi;`?m1^>TlN?Q0JP(Kvd0s z8j|JwaX|pPJLD&xI97O|TY*nx=FngH^BN868toKw(zLSQ9_az-54E59$Rd)7pE+ng zB3ks<)1c$i8dle6%vf4(4F)8B zjt?kIV}f&qK=h~BQ3T26Mpkh95<7{8nRCcP-SbrIlRHsX`kZ|#D2^Od2{>ujHnZlD zjBh?P@!^d(x+NH$7g4_Z%$#A0kFhKSwY`wc4L@+9rfo&}k{vCKEr@1^sgFTN4OpNI z)B4u>cN(fU1{vvXI2*18o6^+ra%UX^W4XWM_=4t8 z4p8maPOj?aTsU42JJ!uD4OuU?vj(P#k@=`xG{(;Phg~W=C(SJlG}7sVNoYR>1=)&& zAsDcC&~}NLws-F4%#Yk=@NUH%j|6C`(6FYeCJD&w{f=Td?EAefOnaD9kSy2x4MCZ9 zb2+3fX<42#nKfm#&j!1h*=;aAfko}dc@snd%+IjQf_2F4$r{bfa7h$WQSzA`gIRWz zK}^sbaC?fwJCi1M!GA~7)FISA@e(|941zcyFf(n7vGN0$_wS7wvsz0jSO#c+f*<1% zdHS1@MZ`COALAG77bfrXFrvBN!A|pu2JRV1jTZ(^9?lvP^-sr0E3Ao-N4_Mo5>5}> zOO|Q|FvTLWkY>dnmSiCQtOqSIk-k%RfipkZX^!n`R}@`uH#9|05il~oYrsAkraggcrx z5Kt<&=r9jAeUS66qOTHrr%}tGp6*mnG`^UDY;A2QvCgPRD`9{b|^JePtL? zISn4)X>IDs!1=nJ5*54(rJSO1%*$>utEmXivha_kz>NIKU7`7Dqc%pSNe$*rL4x{} zzf0?OQpif{#jx&^KO6eB$AdV;TvAU7Rq>?;GLZ+g$D_W~*Q0n-pNAURCxdj@o%S%h zXeFiggwX*k&nx1TTD2csv#g~H<91fD8q;g>vIRU`Ov)jNIrfhIRh1qUN@1xWFU|uP zHFy10RnpP7wsD5jlkjK`q*YBU!;x-lF>w+GY-E$CESsiwc2TJT=IpS$cGy&lqH9(u z&b@_>-wEGUL1B5f`JL2yJHC}LDgGPRWOYi>OMx8Q!2?s;UP=P4lI)WMH*z`i@c#S3 zd-wvoc8$uAmrbWi+x~VCA{wg_gUKqj*3#=l%Lwki2>@o4>{&a-1L}xi&Qx5!HQ?E| zi2UA1Du|X1H{E{HNN=b4#$9d|YnQ}J>6}g*} z!I%SzgVFmY`#%Mtoi^7gOm`#QWwWkZJ5>{ zJT1F7l?#96#``OX7tIJzrp5Ds8p0a~ou7Ug|6D*1D3n-WZv>35!(6b1KOSm0^7L zQ|bsUWlgyV654#B=w!uy1C>}xw6cOFfVt=2DY!3Jd!q(8w!iyK&ne9betcXB#ArC(b`>h`*Sv+*7rCJ7iWKz6mx}y1 zXF}oZ0pt<$z>}?(0;^2A|5QA|6h1t)@8jDO;vwAkk#h=qj+Ws}ynN;nJB{JQk zjtRdaPLN-IQF6@rmtr-VTd~U)!044I)>JyW1ddG0xy`GzyjnX=5+{&0a8%@ttTA4W zE?-v*TeB69`Q0$PcZQJZ{b>iMmW?qoVCFE%jgd_ymG03$fg{s9-`@~bX`%DCoX;|1 znUmapJC3_l+LBX4V+wH6<1iV&;uc6k5_=wU+;b-oX8H6H=p;Y6DpGuNDDx8O9KZOU zRzhJ;!hyd~wiq0!`i5-4T4;fsbiz*1^7GYNMWPVu)oXS`V;@EWE1p72Ta}dYkX4=! zF3Wp_l&djO|FSA9>s)%S*=)X zm#T+migcY(Mu!d+7>4l{b?v2=UOen}^mNUuY5Xld;d9mcTM?*GH>q}tg*x%#4kl4` zzEsj~*(o+yuAtB|t;RvAn&U3L__U0VXtiD;KiAatdkeAdQ+95rllfMv*PY>+Bvi`c zS|uu+)Dtq22lQn()qL2wv9ZGo5RZjQ;Qb$;-Q+bcyBsPtlIBp-jF)86R?Hlf^gb)i z&dr~yTvQzCE>$bmSmqdx{Vm8(!dreRZ!1glR&Ja_j?!eHTpt55kNSCbZBR^xnJkbhUY%1YVXGShop{h0R9jp-T+*p?3b97pLo&rQL7W~6lSMjcS_M*=Qf zjeNFI0NX}w*zxFx*hZJy^+xoE5JuUsxhArweV4xPn-RgnLlSu|YQ^#{gxK4FL_$0&&>Iom&z1qWc0|w=WTG*vfhn(qka6?<}cbtW# z>m_wVZ0?ns1)&q7>xA~Y#?pqY86Z*YRYBU}JoU#W4sNat)G|iJNdmNrQMT$W_Xaqi zaZ?}n7C6wpOHGFy9{^Jn%E_jbjIPzI(#CtY!G0}`9o7p}$J#hFZBn0^C|4(G9sXVm zSnOi_1;Ys0IE0VjC@d}w0WXc5WLTsQrMo$(xEN+q`Ubn%X(dcEIamU{-Y5^!P@5u` z4T5C~gW%=BI_cN8S`fNE6Y#RSPwEDVw&R9so(Itj0b_q)w&S1<8Zq}L;}@vZ4$AJZ z^GvYjdEO5AjmP!A5(_sOZ9viUK^(A6H*9i*MZK)k0JJ(qXT6Mdppt#!X*~ps4w$oH z@Mgqo)o@8#KJZ_Is07nqex7pq1*@#ot2TvJTV%7%a@Q@DwL?(8c+ctuw6j422BWFH zp_QvPMMFmSS5tddu-nq_2$|BqE*z)FtaZni1Npd2v!$yZHN7X?ccOK-toF;B;SV%P zj#ReDUC;Lvc`MXy^I(ot_O+5Y=l0Wb+nW2D4$7HZO-IXhC&>1Gs)+>JCREk>0jV@> z;Uu@rb&3F_hgEPBb?bOs!-mLET1?b8V`*b!ZJfbJ#X=o|mM|-0HV->0(nZb4-KG;F zig-hU%7GF|M8u3VRRY#9+DEjZcUJWoU6F}IPY$g}eh}t-I#kf%g?kQmV9B=ZY!cq* zpWnQzq8W*M)e}eLuB6vaVcR5LzPYnybmHGhtjJv~D(&!dRSBVzPeiI#FmnY@M6wGY zp}IVw>^d8vO!q*8X}=-sL`x9NPMPzUF$dQ;BiO~@iKds(38xo0246U1TKUltyxK!s z<@Ewv#qou;E8z)f=ZHc}P9hMk9!NsHKS&3QUKIyTUZ+AQ9<&hDP9_l4{golo=5B|rmez>Cp12ZVy>5jHc;Ol* zc*7euc+(k1bmK7;ZilRvZ^x__^ZBk;^M$qw_(0khbOYTmdlBuCei#fcJcuE%oy8Ca zKa3!7-H#v=y&{Jycp)1~`yeq?!xI7Kas)Ta`Jz_K_ySsGe9-JWx-sjdeBkP|eDLf; zK7sdSKST!cK1c?c?o$w5PiuaW-qVD3JXD2x+^Zoz{oO#AS!^N7F1q4BUveePt`b9h zIwcA{J}C%2{#!$kUD6Zn*3BF2=GP4~x46xJzTiqk`oI(V@v18<<%4YB(+zLW?*n5m z?}I(Jye+_;+Y`ZF*b|aEzbz(x_J+vx3N%>x3A9)HNw636Di+G|VKmtJ31ukog;H0F zFWf2q1$&eG$+1W90W*mBfv`99ni86FqDRmz@rCux=%nAvc(6s-&iBbU$s(a$=qWg= zdVN~duKwbmLVb-{)Gou%JEHs`v;0$xUvzZwIZ5pv_d#d*r{YUy>f!aP)IG=BKmF;9tn9_to6^2xRmk09KyWjs zCE{<8t2+SQjN!4Jl~&VDy^+u(ZZ68ga!xbFLz&x4nY#g5X(_*nMTI5%=E>6YDLUK? zSq<2<;%#I`+yIh}_tL>jns=9z`a9KLm-nz;g!iIdiFdzUiubHtj`#Sr%=6DfsAu1U zTp%p7tORY{q%9ns{`a0ABCrZ2Bkenr&|O;g!lZi z9tB0%M8H5Jo&_eJ-)*OABa6SziPh%ind)^fB5a1VT@*iZ=97Fst6tnt-tFXmI*aKz z+rxA{r>ENsf?EQFwBa`55sJE=U^o;X^l z8x(Rpa2KiEKIar%+j6QkgNIbZl-3TKz&rH>g(yFsFmvkO&rN&;c zmXW8>;e@Xc_O+QE4yXHaJXmqacLPxm-J6+)O`-UJD?8T9`uc=_k$DnR+~^NKnIbrz zk-z{lh}_L&FCjE|a&6^qn;-gj@_&b7fu9OB2D#xBKh$^c%4Qew+FBl!l&%xw)=U4J z1|q;v5_w~*_Fw{}awv@_xX%YmIQi<%T&k7voRuj>b(rIp?r?4>RD1U-^tSDa=V-fB z`X$pWfHpt@6^?XYI482wmXXhqJ`tHc#6Y&`G_z=rt;S+nR#^ATAcWE>mCIMIsVCfCG*{RXb>u4s9; zW)|t$uX)O|+wZYub`f4a30x%xXl!DgXtvY^!l?-PLlR3!61_MP4<%6-CCN`+DfzFg z!4DyfV1Mre`;f;mz;ZgLiBk%9E|u?G>KpIyN!9$7slUs3^ymXd*!I7wz9mj#%G%4HD z5>O^Yv|OK`pU0|dU)v0}Y4J$gl9|xELBFry#KPrsdR^-|h}`GE4ux{k{D^g&ai5;x zv30#W-uB@JvqOAxa6?6>k>0~azS30h_mKY6lDi9X#A|$u7?DCvZ4}fNgQ;b5iAjoeaC^#NgJ z*@H%W%9vIIst{WZJ<0La*WE~ztEQ|39l7K$u4}_*J^Ea{0trR2n0OV$rHfPR`QvY9 zw69K_ft!%14CX}Y;1qehJ;{B%aJ&NWb1M(-G`HVgD#!3!j=8s$9IZuy!epbLC1bbSiakS7uB1(&_Y=9 z3@;#ofm(lKt>C~3QXpr_%@R+x&cgC{R#e_S$FQFwM`RGToRwL?nj7V~Z}nJqd?S=~ z_lg=S3hljctg?H~*dp3!sh$8(WWDv$-SDUi>1u($Vz&T1i_Wh9JWZ)COXalP-uFpz9LfVbM&!!~sUFa{mlatz1WpD%^pM4G=0$UI9!7h3-@>6o>~?=jmey0zZ9C!!mnm1BjQ4&6F^qb84~ek5vo>Vn(a z7dH;zjkNn4wA^;E-7(EhM^AI1pUzvCkZZtyaQDu5GQkC!l|6zTm`!LAc0j;cb^Bg} zaJWr>uVm_&UMj#kTTCy~ImJz#nV0(OliC!H@Lgn?H0uIpCRc|se7NuvM0BEu-zk?b zuNRYTvoCl2yiAmH6gBDvt`bfbC5qPEm0pv%5l)u^>o*5m?l@tUL)>I45@FX^pY5D2y26Z-9+>`g1)saz}d> z0hf@LkE+o;DeDcyb3vqQ@-V-l{~f*Kc$&3mD$BANk@CPP*s_BX0Zwd}2hj?QWST_J` zamuX3kaX9gS(=5i5Ufk4Ml^@Z$>=_17H;Mn|5pv|b<^Ci?m;Se8ca!lV;6HqGvxYmOLi>W@vuG8@gZpq z1l<$g9LKzXwm=KaFx;C!G0x;Ydadq@C+Wc(4<{@T>-oa*dy~_WG$@2|#A1@U58q0; zS|}i`DeT%K8V54aN~_htJ8<;sUFI=`&T&ip`H#?Uj!Hu7ioo)wKxZp3XRD-lQ#wp+ zynU!Hk;-?Kbs?Z5Wq<-_-RWlUM|4p|C5Mm}eUYl4uqsm-i}Fbo;yB_3k0o;s;?BRd zLart!)MMWY68}~Z<$qfgY^`noOV8qe7>fY&)(x!)^A1!&$??q@%7$8DYzRouWuVZV zC}3f1t}F5d7o1I7!P|m=MfUvQcM1@U$RP6wM+bh7>@%5}POonJcz%HELuffq?g1jP zlFwQLJQyyGNct@UAz)ctbFHm1@|N(ivLvijUKmgZ4E{FKTCXn!v3k_UrY#&n?dFs# zwwb|Zj4=aU00}i!IF8v>)kwY^J=^J}w;1;Pl5418Qh*Iq@aD5u^%8*9-=UjOOa~BD zCLOG$66#rnNM_=fF|HH<@^}&rNKSo_$Ouu1QpS-r+V6FK+;`$q8YjBG==}@|MVs0;-x?gIPWdxFeh!oArS@_KSA#dPQb>>bR zEQ=M~^wkhs>TM1ym14R)u~fsLg48qZO}`hbsSWGkDSI(0q<8U~Zfv&moW!Qm3B+W{ z&3o+a@kfQzp{3KCdcp1nnN@H%r(yaTYCYb?@Wse|X z5o8xaiogGx(Qx(2SbXbS5H|mFLHyHXsH9`NK##(s+YxN~eGzsK5A%|1tpfoKVnaeD z$pV}BGB1X7wUv!<7ulP5Y&~m;gAn6A1HF?EHmNb^5u6BRo+UWe%$qwP)Y*3#X3{F#BWD5TtXkFh#^M6NvtW$-2V zt%4%x>HvuRW$YDxmmVWw7-gnfzLz!YAqhX^Yrr83|C~zpK1ymx4V}?>omd^wHO%1+ zPEY+AF^zCpDwGvQbDHri)C-a#j?^xaOjY8fwd%zJIU8w*euhY!i$yRf8i-N#;{r0H zRqRr30b6M6Y@DO+&m%mfsrqZhqB0iMD9^V<)JPY$UdWUSij? zpU`m0jz$&qY&jAuEi%Q%=!mT4u-rMf-CC9gptr`Mr`Uf~tYlF*X_%crF&vZ1%^|OQ z6n4E}R(_x|?2jh#Rx6V`gX9W(essEJ17!Z=J;miD!=;QYDCTYa24P2 zzH+X}wk2@Vwo76(MV;{;g9GL}q`ziqv>#uLgU$B-&6Os&d};CeEt0DLxk&!E9nt1{ zf9( z3ni>|rWPghnu+(mK1SiT&%=>C_@$fEeL9zFl>(oUJ|{07Uo5R_N*^LXIhb%l85ke7 zQ+u5KZk;jNLTr$5(nNA?30(o{&;zz6Qv#_vVYj6nR#WQ{Oo%5G>86_fBJ4i)$uN8p zjPbxer6g`WCLmpL{0I1g98z4fQMQRc;TbYyovVZg2@R4auFA&ADB;f`Z{_6<|1HII ziRClm$Ra{7s#~MAmG2f7Sx$N~7tr4;gG>rYtF5gxng|TB!Q~>&HcVOP2qOiTTDmoq zEe-es6(lifa^e+7jGm(R!H3&rEr%wdH+#p1`}I2grZ(IL&>;pB+CNAF)dmus`~Qn&9BT>Tr=`ai5Y z%>QU!l>d|1>YYr*^E;a#25DP_dKUeF{~C2LMX;_IgD7|~X2jWM1*c{{Z=Br`!B3x12H*ntPYtb|)ogG30H+Q`;7l8B3h`2#rGPYQbUYm1E-~1Nci~`&)+URE*D4sdCedYftEpj-VMg5@aBUxO^y8lx*5F8 zSRUk!BNZ;4nWt-?P5$WWRg{pv_7{uBnUG%5()*h4HM=Llts-vwqV$(+T3B=MEZ<|O zNF^_F+HS#=NfU{4Wn{6A*_O4KUu8vO1Tt*#%MX^0{D4{dC6+WN>4{+-^e4ORp&#Hn z2RFWMpF^^U+T4Rg=rGo3YX>*0!|@ShZh!YMvo}iH)Q_@IS)D8A7pL=~><<)kI^9C< zbh{s$V8MnzeN=zp3(w0LV^vXMHXANCY;q6lkQKHZOc*4ot5C($%r_IvZbTO@79N?l z%1D|>MTrJ5-IfrepG26%tLDWerjr#(gqXCL)Mv{c3V-Z7Qe;LWh2btqaw>NbsdNaf zTyzWPSB#-R9U9O zexJD!;GtaM3)`2>KuL*#t}+=`)_8dW^k|^-SiOg(f>#2l-UrWWCJ#{n7)CC`eh8u1 zGaOQuKHWb-{HuPKp!!8xzSFe(zB5^w{%3uY(0_DMiUt5Plm8{;B-JllB^8vf%_ggs z+f_+Sz2V^AO;I)DARuUK-+}`9bA3h}5Ku3x?e-SutEDI1wI8U99Lk^q-Q@a&NJOOR zkoHud`8N;&f#!zqQ$C{H$4ypjsfg(hn|B}CcWuXiF8lagy}@gd)Fc%`Qn*XS8bL4c zkX-23PGO^frf2Pahu}!*nAV0qvx-)u)Kbq3>q}6!RwtIdCNIn`RakNK9cI`5PMNw# zjh$5{q}{W#Z6EVQ1L2_E{el|`&?QzscNBWiXLwz6_GOWP2hVHE>xe_Ly9{fzK}10G zOC!)>qS0t*KQPv`|4|t1sAYV{>bF;Dt-00aT;n_OS7~Y;6}V|GF>eHALAgm-Ube_T zxteTBUtI35Xi2=XVKRU@!6%};Y+2N==#vb}{3Jh1=(jc^c}#hFJrU1p0Y=ARHnD}L z0uL!!hp~_eM~Rbz05Bfc46TM#tZcY>x?y0cu@ZsSHIz#=&7jiKP_bbV6miHlEjeIR zC@@TN+ncdmQya5b2mGP2%n2h=JxngtCOA{PmYpaod?I;%S~8wlsd+xwx~zRzF(!}n zl{!igtP^S|pSmmDfc!@G0rLBWA~xZ-Lm>xwyn26|zq$EoDB?j$akg9poT+$|zt^GN zTXU~r$wTf~+&Lc_5taJOe{LrRV{`Nbih`0<_Wt%O2NsWF*pkQMYQ}OXmy1fPSSRiT z67mmwK%y=r!7&6t4j{qphhmG7bcVGMcmC`NG`jAv*Y4+{?u>XMj--F$_23)XbRaEY zC&)`$@a)|Sk>>4}VB<};gD%;67VgK)OuD9!RlJBP=rhSlu){+q)*dtic+&17(ZW#s zlrNyAvW?|n!@D#VD@qLI2e8?QAHNXAo!b*r5UyHa9$3bdODz<%%LXW7?FU{w?zDfz z*|BFbA>T{*Aq6x~X=Z&wW(fNu#PBxXfgU(5CVg2H4pKO)OCTvV=3Ls|#A3C)if@!$ zD?=^5^8qt&cv(=EtkPy0mW_ymklab*$)s3dzWz{~`e|pi8@7CIah0uqVnR+Q?WV30 z&+K()GaDRmgn(Y})xv1KhGseaMxL4YhS0;y%H~%p}jOHTaEi_ zh|Y2FgHX3X#77h^KbQS;uAS9$CJ+iVS5?tdN%(zu#lWZe!H0lSW)2=7ELRsK2wZ66tJfv%@t(Vi4@XoWeF zUY>@w5L*?5M0A9$owD`_#ZA?gy>GjwOk+^=gg{6e9Cqmb07sTk9uPF^dI)tbh0l)) z>oie+`D``vfq}d|F7~0Pgda51Ag_A~B+q_Go2jeW8pfhQ=!~wqu9d+yAnnnO;k)YAR0gtzp$-l0%SSOm_DV$^3HZX3nY?oB} z=S812+H0GDM%XQ(Q(vEh!?qPDKly{6k(2gnB-YRm>d^@d7cSfgo@y88eEesG-v13a zzZjuGMg3g|@}T~24^{tVe*Vuopk!_F{aE#%h2Y}55MX>|J^pbyyA)MxUtuh9G*1+;GO7gw*&w?f%F6*xmb>6z@5tTSM7OW-GuOe6K!?HBT0GQ&iGCA8Ux`knUXw%(v4S-C!ne%+$ys79?iLw;3g9t@fAO_YrdwcRBT0lG_EP%vmshI;4 z0?**=57v)yt>!i*N=CN=fTV_0R?#iXtH}wQ5L|lPq2qzRV-_oQDoI9+RwKj=ZA3wG z`UF&6p7LZl96qunFw-qbx-yZ=s71{-IBp+cLApmRx zUQ7V$_#;(?J_IIlVL&C^iI%c8kPWpnsO6)zatFGa@t*I`8bjj}XlVG}zDI;e7S~|s zg~Jk>Owl;^8Rd&KJ6cTL1n1)$2&-b0liKmEWl+A7Z}0KT5zBnO@CYm`|?ih1dYUS_e#YCwT}3zHyxw&^8_ z!hpe}Oe<^})S{TCiJv4$jVujiJu696qpIk!*sGXXi)#DpWUQNlTZB#vy-QWMaUaTQ zLFj>40&l*hphVQ069c8|syj836TlRu5T8wyA!cr*b?G~F+3z^6!W49$CMBcecfKB12B6GwkD{wCVAK~#3y_b+mMYHqFqI)O zX1PR$dl{Eh*P`*}>zMdvDy*U&;VP_zKdc*md??rnoq`UL*f85dnxK3Qy=sw8M*Jq% zw40hYb1$P3sDfri6WxMg-m%da;8q6D2*!K{X@7(MUYJTX=-Orcjlh0~CCQ+R|D=51 ztab{j;1Epal?)}C54B(dGbf4XqfcnEWV@WM>yr4J_ihYq zMA+_5(&fi4{{&9_WD48vki3D03%f%H{NgF?hokK0KBm<)&09d@gwrv2z{n$3`M6xK zELBrbntmuCEztQZVJIIab($Re6^JI%%)3tXlOMh#mcJ#a3-`!mR^o}Dc~>|Uajh|9 zT4t{_YuY6OwPiSV#-;xf&|&6l>n!S7lu>|LiQj<>Ut}X47Z3O;zXYd+2q2zxPquO zBEcf^(Ql~g4H(M^E1>^vJV`3gYJj1T%q;oSa5#NZ%2r5MA^DEs1IVj>0X(-_p}uKM zweqeoVIzknE(m-l-}KKkkN10yqvug9pKcE*eZVO*Bl-k>BmobVsh%Obp#Qx2#Q+AD zDGOr-Bq~Pr^EI!ZjuLKN9wVXR}wmp{&){34LOJ4%7SMQZ5w)P`XOnoUqxjj%oY z9MqXJjZs5FVFOGzF4{tnXWNPq@d=QOwR$s?$nlBy(=#ddaOVJ^5Zaib}f zF=%PzlgrhFH2^JHgGex;AK;s9JH7lmWLh!Dv>9Ax|#)=rT6r>=eHqg=clFG6a^;oDCZ&okp9&$&p;ksfK(m4WCowa8O`L z$|YOSWZlPe=9pV^Jyr?4_&V={wTjj3x2jc~`}et)BMWD?nS0ISmVeWhZptEX;^56N z$yU;tXBW7to-RPw&4Ia@?|>>yBkl2fxSY}F3T1Sh9L%2(T<9gVK;!KZ;isPxIT@TG zcTq546@N*94=sUh^|`U$APu_{DKjXdQrV(LwZ_(~(cdkts?t-roN_2k>sK2R_cfMi9S3o=i`Ld+aA2t&M`Ks7ge*@Spy;-%w| zZ4~cfhgfyX{nhhf?hvsfR1(~RjkcaXYih?r;@dpf<;umg-#(7c_!~}|9YYb~E+Cib z=YQEAl#PEui?MjsL>DjLf1yLtl(BqE(`_iqs+HM6Ozd0~x5N+*i?g35S3g?E@WA$k zn~A9_3o!&(xVbKO-T?f>k)@}im&K4^b4=Snce;MWT}4AX@Dlz2jr>A0a^qXDb)H{G zyG*39Vbe4UPpF;YPAgUYzPFvw8#M5nlZLxAN+4a_$gE4al#{?{ZGI@(v2ITbUV*_g zW-v93OW0Cmp%|2Wj*!_Ll7b?1JtF-A7}Iy7_-OR*!(xPZQBXh;07`QtLBlq|zh1Q_p(S?86N) zUV`rY8>PLQ#U6fz00i`x5D19;KYB|3nYG#KkX{Rq$zR<@q)Zr}y$HbQh{8hYQb_$I z27`eh!2Td{AoM$Z#IK1kQYL%Y2neXtYZ{uI71u1AT_9b29~&s*1B&z?P_SiatG>OhW%sCcvk?>Zkv=$^ON zxF4bLv>!^~cxKn8xE~wfbX(86f*+;u$hYy}JvV*50M3_U@UO!Gw+{)(PfgFBryXCX zLtj*{y>GK4-?jJZfNl31PrNa!3qG^!W!|UHlcCbFPuV}axu_q)eY)N+QhC24W=TMy zpxW_iL2Y7DUgctRPkSr#R)~1RQFzty1&RbN11b}ik#hGEg&is?uSUD<7Q3NdibP}- zBZk(vHpxs!(j`1oL{nbsge|-k$Rv3hqEb>kVyU0|lr*XL2u7jsqL=fqRnP7yYnjhd zq;b_R1(lZEjH*?qp7O!@79X8;%%3D8RhK-C165f)4zaUsl-pSmC0VK1Rr@4BkKGTv zVzqYSX>cLki=^pooGUseqv)cWOaDxoDd;f^6`FL?B1sTW1nEU}>EN*v;b1Qg5!Smo z5^v}ayB{o>X_K#+Lq$x)*f9>TQbhCIs&%A`1r=s5=I7*`887vl13xdhm1UL{N3RQT z33M%nXGb(N=$N)^tt9UiFvr;wCP@tmj@nU=@oRE#tR_b#5ZUjM4%xX5OD9U!w1g$J z?YBTI4!Ft;8^jAW(==i*tWyk6WKC=|knff;nl2Qz+!Z}4XaT52VU^2Zr7f^L^5V*~}-TXBd#p z>G7x+)NrB$qfBNazhA*H>u8tw2cm6ZM5W*JGzF{?r;?b5*97BX^WD?{Q$9Zwm(LvPy^~b7lOe9B-qfAVOdCAR)3&mA2-HHiY&vB1xrNzVx+K$`s#GK6Ell)A zM2_G>gq=xwQ%*;aB*HvC5E;xv+E#Ja^-bEacFp>u$e0HDg&1p=aQhg8aq3$n zPt{j(!W6A=8ryB$t1ae7-JXn1k7nWg!B7|bG-j*Rv>^>pt!k#FGn>*%X;LCw%&erL znX#ubvBoemuW$&cPGY7LS4R=+-CW7rt6DcN#Me@uno9TVsVduA*Sa-VaOUpidE5%P z!J+gxVw!(uTRIF&KP;RX%o>H&V6;vkUa626a)J6}*70swx-eImLIe8?TC4FYAwnz8 z%gsHBxek)j;9yKHV@nRLw}+#`3wC<8AfdYxHq5 zG3Sp5L2CS16+LwNCpurdUTKb~gg~=+K8_X=I%d*z!DLsN?)*yps=++zlvS_=`myY- zqajzp1*;8Im+7XAlF>)at=y*;6Dc`O)B~nnZZCwG*j!A)1;XUZ`*p5&*}l@>Rr$Jr z^G}eu{kpjr-4j-Wqzjfq{Kf6aP>2>`DrSS~6S@ONx5daIR81TeY&%pfBe!V%t=12i zc8zYm5th55+1ZKvkyMy=m2RsM=R4G&t@^p5ZTF83fuc6d2c+$*y_YMdJ8+<`lx>oI zn^0GMyp$@o-Z1UK;5534o4Buk2wKOiLoO26VK+kGc^pFhYvqW%;B7J8!pHVuL6^@r zV4-Z3ZZf7ei@GwE|8m`iiC!@t*tCbDUD%1%N(U2J7`}#Vj1Mvc;@)q<2%g7(;=0eo z{k@a^S$m@HBiZir^V#EoKoED>Cl;IjU|nEC^pHUiHw?05``;nby2|GHC`Lx(#K*D(@pJ}byH zUNub>4KJTRM0w|RVGTjnpAs28-EKyiGXugNPgr~S4%iq|nu|}T!8tqnCc9m5NAj@) z^04q+gCaJbY&Ds`ZjwsjNto8kr$(L;BR2_gn=y)wE8#SCV(bvl2Z%Ao>!@Xl){ta; z8{Y23hCYKfw0<^Pmujr9BS(-;fF--%L9A;ox*9~h8S}dX3d6`F8&xA?nSXw zTp%y)nKI9=?)?+bWY^_b22)hma&NzhYtg#2oWegoL4T__g}_z8`L!&`vd+Qg^v0=Y z!^05P6Xr0%dvpfJ+NuXfLQ}fCozp7)Z@6Fyb(cUFMwcD;(;g$rj)RuJ!tY$V8Tf4q zm2rbbi(1z;tgI)I(ymc+TNe#p@~V`_?!|_fmbLZlC%DqCdGl+BwT|p3+*0Foi)QMK z>Zc!(U+iJL9S}XEvtBLKkGpVBg1DxoK-+{5^`MlylrGe0+|a>Spt_?)vB8w# z0{asJ01XGiOAG4mMZxNGqPJ<%8aGJX9|CY-RBv+V*g=)eMR|BvyeOc#0`izS{BD}> z@>wCaK!zEV;QCE(u&lxT*v;pT-*1 zSS@HgT5pbR3SVNWm^OU-WG52s2}D-J&^WBnR&_#=rFKMmVkhckmjEZThaasDXZ(Ae zKdEwLqoLnKXk6)Z;^K$W`2^5WU3%tl=MMh_9S}J59XQ!B{I4T;nNd9IF}y5JBRPe{ zVRH^&cL@G|SXMn6)_tocLmWag5p0^3fmO@8_!xJ% z&CX=n&hVOg4B4IUO%`{rO>IB6deE;ZR-b@9Q+3#_HT3`E&NOFgjf^IGu0UTU^O8&nB!oHT#e+69QT?MX0QMpAvvZrZ8B} zDSXxg1iEskPTs&a1pvliGRNR!vWyV7S$8t@m3(|rI*MOB?BSW-fKrpl8)ykD{@7TT0(Mvsc zGGi+q;DR@{-J78C?UcI;b#P-akS7=1f>HjNURigl%9G{(%GqgO^K=P*J|C}Hs~wMS z#^3jM=sN-YI~n&&>?wzDUn8NLOs5+^>7Hmu6t#lm|Ny@0Rq_K1Xue&V?uB>XR`r`kLu4B4G7gWsX9{ z(5_;;C)3m`{B1(1XZe&3q;w63XD9ef`zL# zBt%|`Pmt;^)zu!v!Pjy7>?Xak-ZiA8Tx6LHBhl55;qtyi%Plu7<<%$fO#IyR-Yl^) zhgp@i6gva7R)Ujuz$>?(p*qeyk!;xbJdT3=t?_9y4LeA0um_dYbCuF2i|% z%5Z3H&`q^|;Jr$lD<;I7Y?Goq3!M9ak~9*W4lS~ekNgShQ)z*G_Ja5szO3=1*)vr*u?TH>wE2`XqV$7J%WZXE7F4ZtzD?Twf*^cze@`f(TiuWrW&1Vq066i2Z zPrMp!u1DkJD|(qlZXBoPVE>NtNqx4#1$1mhNAT>{s%NAH`>Axyyp_G$oXz*&PQ+0P zSDjjZvwi{JBCh|t{M^A<-^p0S*5+TfsQ%$b`LkGZdG=RD*~<^H;5ka@fLwg2W?~j) zJbLb%7AH|PE!T`qiaV2!Fus0Yec-g09rznjjO)!MgaC2(m5%4F4UXpt9;W;E>1kac zlUwSaSca@qJ0a2bD2(WR(pbo8Mztd*V})<6G*N6-ew1*B4BN8yg5ASA+Q{tj;HkNj+=4*Eg}GDI`jMe!NmA+w<@>Nt=bW#B zIczRLnjDW8kKkre(=HmY;80-I^@=2aB84cUq4N@WEZ#@QBp^QhTKy%%Bw7U-A{H_RNhk_42148Dx zb|>qiX9(WlVy!<)mcC`H&EF%V|0G}kN7$_J4|m>wSZLZCYGG>B z(9CF>3C7XmyA|w_6d@`2g$iurcrIEUUWlAa@7T6|{6Iqchdpnszyz&1zwpS)otufv z(M9_BGoEhGx2=%NPZlj`hR|~YmHJ@h)yhbNGTsMpW=E-= za*Qhy?@G``8aWY(cu>a7qRr_SzzMrpg}!?jDAbc_6GZl;Z@P?JoR%{$$9yU3hjK#K zq2>o;Ap%c`n(1-%!?mPKm=_0?3`9A0^ZD?yBbAd_eRlYDQ&;WSAT3GMxdYpD1||2D ztdAEh4zpFQxis+J1{-FhS;mm5fU{)Qpl`Ke`oacX@C>YZE4_gBPgTq2O`$3A)+zH3 zCN!#b_W_TOoD)p#VQ;`u>$`{4jr)euZ@)skMV*~~wDNxK)uyR;&rj_G=OX8R(9Lxq z6-knb!F!S3bHm<#!b5QS=V1t;rh0#%R=tQ+?@?xSTisdjACvuSYWV6C2t$0AvgH3T zHU3-99IU7<`;Ss4Xqj3=RE_6H2qCsOM;Y0lIV_Z!U>1>)$Nj>(iF3K*Qo5QB{54W0 zOX?R6{|V%qbUQT@1RlO=WP07@c%9C4y!H3*@i83`e7(AepC$omz1lE$iU9R~OQVW_ zhQ*I7kT$FxT*1+&r1EMeYFDuKm|_OXcl7W+{05CuQj0?cwf17B_q2rEGO5*4nC7>Y zi$(1a14*)k{5kn_FO~~e<4+YQ#R#p_6SblaLe(ie(8w65pXe`<)QRp?sKa6rRZ(13 zE&KSjcB1h2YBm(2 z^$spa8I=WMT#<^GY1WeK^WuJ-07^`30$K++&aSeNx{lxC^q0<^ z(9?gWel{#7-jc21hnGxm;-4n1##6+*Oyc)GGxL}F6?Hm>1O|!ehle;Ptm%MNs$|cfs1?(}?&b;pW%joYiL# zgqd=t);kF?t_E3;xu+7w;-7(2Ug4~($AX2Gt*BgnCrt_1U$D?tGGC5sYO0oekL!z7 zD!(xFS7Aimyn+VN<{|bMDUtB7ccaH|qyh)^JYviqFQAKdcn@c?`+fis_^2cqHw9Es z>rJgS>X&{cT8?Z`YIhUfYh?b!grX)}?dDD>_p(&vESM{i;&A zNXqoYQ7^rH5vVUlSm`RC72S^Nbi|_KE?~0p1(~sCdvNzKeTc9hiv(2DY-t!0@ z6PawePq^!76W>6hxkY#3rz(Gnm2z{S|&%GbrYqIpn z+_Rk1y{nLF-qI}FrndcjE3w*6_CdG%`1t01#4fwZ_(4PJN&e7Ci&sJg?dwF}yZHmMIW_sviIx5ThU zNn~8+r`@USY#zs>iHV#n9GstS0im!9_GClUDT*7z5&<2MD#%rk6R+BbYq6k9k@YMj z9HkG(S}}ljwh{;T>4b+S!zSOU9W)85FNM6#^oT8Nhy_m*A>c^?a}UQlKH_(NII5V5 z?_K4^-x{b>iF!O@h)eJBg^!`66f&1=qdY(O=$i+>l$_?JK+_b z7DZ!P&ohMDqW++$HN+BxGrj*7r0>~3bMh@k|NHwg06!Y7r|sfe%)wFNBa7ILt*)1u zr5lnXvTf*#v*(ti$$*y)DgNc(`sRk5wEFu~lY_#J&p$nU3SJL(g6Kf4|h9{s(}^(u?!dCT!S z`?|;WyFvt_IV;^#3&Bbf|*Xq3}&|;H$&<|oUGnn^*%Y0u&A^_fXn#3U+09o*CL3eN)&<~H9v;EAIu=*dIc9f zLr1(X++n2$CEZxMpE^RTn}Q|fb(axJDH!?eWnLY5C%`oTv#D)#V;-xM zEFGs`e1&;JP40M^+2U%zvKT0d?&po--#WvZ{RC^13!EV>wkf7@4-m?uJH|g>VF5m z)c*iKL%Hg2*gt_^JJQYa6eI$Cp1r4*Gpg17%#j`c^y>3pz^5HG|E>4vYv=zkleLxr zr-ZPcrP71;-_RdEK8T$l?=uPES{aMeV-Wm#3A4VkD?WW8l82hClt4fi3Q%hJ)9f2T zm2^KiuxDdBbLThk1fue(q2pWBS#M9+EK^rb#3v_{eO-KSV(SO%BXHlD2^ywC)ig+F z8Pfx%5JOx495+pn;BxH~aN^Uq5gInS;_z!7udSCg(kCLaEvW9&SSyGALKYo!GZvwF zx=b2!&h0jF{4;`hnRIAcJirxHHN9k*jo_Hm=B8(=)*G}sZ8}1^>S<^FI?H`dedwa)|oXvq{{TE+y80pa<&2A16&5?qCr>4gwqx5{Hj| zlVL?VI%eX!8R+-y-?GKF^s}0*MVZQiwJ+@1x_L#TQpK95;;~GnddY&y+t$RTarJu# zHuXBw{o4E5^ZC7d)Nz~d2Ep$q&Ov{Vl2)uOls(QT%|I)y7umh967J`>c{nQVg$kq) z6o(Rueye~C>QEAZF6p`en4c1=U8${H&hLOwIiC=<@D>(6i7t>-upWj8h0~GY+T#%?GL#c&8uP{5S9Qgi4YZew`z&=6Eln$#FhH~^EQE{4>t@a|7MB=2#U36h2X&znsx-i{gg7tzk5$n>}SInMUBHo-`XOPXxH)-;H^>aq-i-vg~`VE zDWI~)xaQ0$X$$6+IRmGZPN_LH^CzLQ3-_QnRfi5Akomuq^6#~rx+7`j>{+zSW`v=% zt7b@ofD3sL;6)(~GYDtvw!?;izxDJyNagBAgl7;IviJ+QSLTpeMhGG-*?G1zmJc~@ zll{M25hFnR2}));`}5r*5t%qSS0|WxEathEBPQmq8cI;ct_?_}7=mLt{#xKiE0p(Bz9ipz)UQA(Cr@$338ZR9P(&^YZDBnsPbjY}SrAG!%brt` zk9x{z)=PvwzA*85+tcoANS6HQTFDf1I9cF zG1#TWkh~!KS~UR8`T;AxO<6?CUyhmk@3s9O_Ca7E|m9&)AIUWODmvYEuq_2%+~-<3hks6=0wDcwzsp^i43vEiNu%exF#! z)D}r?oH^Y@3o5KqP3)$~LV#N-pFzdc7FVr*3<>23H6g8=)Y57!<3idtVn8BjF>_-1 z8)dCB4QGO&Ex5dT5;!s)gs~l_G2i>#xU7$gTba ztD~gq=re)4GP7?c(Kh*-L+q^-P8}laCved|{5=OnQ#Ck24f;I%1Dh|+B0c@cn499R z=3)i1`5i28ESrY&@aEYKhc2*e`@g0N@X9L_+hP3XI~fL9E8)-T(-0FMpDmp5Hf!bS zNLbDaiODA5QIPYmT8Yfe;-F1J1>o(Fj6esC;2au-P}SfCIDV&PDX#o##463K4bk0G zh2lxWX_8h*;Fu;!w`gp^=BBoTyr1G8soYiBD4CV7f;B)LSSFXtzZ- z*K8qN#B;NZzv9|u3>mweDcqic#_SU7 zSu{(nbA#k!dBY(=ed`jTo5y4J0M)g45XHT5+$fr@T*;rcWbBmDdV5-L42%c?r_YQq$DVJFUYAAwX^1P#DzZK2>NPWI z$)zG{BfX$UQCENLX&)ke1(V&GWG!E=?-X2kLRDYE>?|mu5#b77l zx2bB}*B;^PV1B~5dn;*R?*TJu=qwEu`NY&y5#6~O)yY`ao5}$&((qT$Pv(wb9;+>G z2ZOHkt0`|FIs>r#z&@~Z^s6Uj7``wx#?gorV-plkA|x2_*AP##(4LUMkQ_+XTlMtB zI=NVpN9j*Hqxn2*Ml_ZqpmZ19OU+a+3DU0_P}`efV=&~#`GN9>H-zM0VoAkyh)^@?PpYzm0bH;3$| zXB3kRs%P)*2>)Px-+rhJNS7HH$WN3Eo|9L8;$v)0=0{euiSqWSbZL_awc+z)({=-e zkUfrCjq;`zY(2ZP%7g;~@mm+kjs={U;^{fsdk@tdWPNwn{Mmf6fKyv~!_bPPHwdDF zs0pYpP>(40sBp||LOZAE*S}@FBg-Sj!=zK~f!=)hGq`0m$tAONz{Vms#yICSO7#mFp(9|E>6E0_47OaV$8!j;mxh|i zW@vLAp#H#6WTzAs>8W=q;Y`3;CO<9`#8#TSo;B!^x)QO~%Y=ie3UvpwNYou(ctmRz zrop$KVkZ-u3M;f@fwHbtyB5{f=NqVjDiw$jm%UGdY3SzOk4ydNSc_{>OqQ(B$A70L z0nIrd{NnG}+g;cc&$3=MJ+U@!cc-rxXr^95y)r*K*J*M^{{Dp#2x$eXY)Nd2t-MNi}v(2?*Zjd1aXmCE=Z1IYrpm2PWziYa$^*#5jjmIw1kV zQ4i>Nld>h$KfDcY`99l;N&@IL?#JtHVGqZB^-|XBr^%ET9iwTtTRM|2+~lhamQSiQ zK-KKX9iES)E*s!!p9^_B-^p>Gy_WS}Kalm>(pwn0%pI1^J=SCXz1r1HTUa$G?QN%Y z^w_U{dLq2#l6X15{U;uo`XO!YBv$W<3Vcs&`Q-CK=D5-)j&eoD_^`(v1!OGQ zcKV>s(LH-U=Jr|64)x+&oh#D2lKWlaP0cA_a1B_NA1ToSHTG^s=0fwl0=w7fmzf0J zlj9Vv)0E1%vdCtXMQmlKog;yJl7q7clA)AGWnOEvu7?rQyWU)HgyG(o!$lW*`KB-+v(%=oq1j1Pv&t$1W8CMwu zx3@}VoVU?3((N%zMK=E9X&0aW9u6G3XH93}cJ5EU#&j~x`J5G$1awfeN&W1>vWa0w zQOk-Vx1XTK=KY&p+2m)P%JT;=^@%XgeTA&SF3_*h7+9{ll^?S8pe*94O@FZ7?cC^6 z80}7hGJ3Wm2|a&EP>EGTmN6&g<)y2(oB7)rax z>|e%W_1*@|g92))y)#P(6)kM!2@xVa!^@?RKGzs!(?M|G&lmDJn z7{UD@3q1Tw>D?4TX?n9;qb%s-B2QL-l%=GNPid513_U|Tp) zHV*CfZ2)c$T$FVK_6WEx)V+le2K5b+7{^JxrDRJZTobU}WAT|YJ;*0egb0DzZVqg`N%|#HC7BD$w0(kI4Ce z7-mzIag5<&3s>~8uONo_%C;a07FIr^Ih^3MUImglmg6g=3}@Ojy``rOZ%kaFW+_Sb zKejTB$KKcy*(27Bwy<&AL2yREBOD2rSMn=A5Wqn#@Q<(qK`o3PcqXRoQ&%#n;7m;Z z)>-%Lc^@eNaGri%0pMid={|>ToFf`q2(Z}`k@Z7YY562F4}Q7W{4mU&HczM~uW`yf z{}lJ(^ZBDK)Os^HpTK^t(U*PQ-8(4lSS!8PZ^`$j!o(yoF=5BWM4E@B+ed0 zYKVIoI>d~6ZpPWq95~4fovO&A>L1*en=vB_dr~^&mXxw5uHk=t0x?hWeUWUC1TT{o z^8Qs=Yj5x{ElBppHKqrP9y523$wiwlBK-=lBr`|0<5YcJT3PCqgG;{P6WYt%v`^~@ z|MoIP$6R%t(HPBjqG}%=CpjMW%8B)ZX|jBnm*WsR^SA78a)&W);g-Y7ns0hh^P67$zupQIGIunzb#`$4 zR%AF>>;JDNLqS>=ivhu#bls{!Tj=HNS=0}L1ixN*Ph=5yu0Ta%JfGav)G(|tx~l>9 zRT~>Y0silgzw)StY+d-u7ZOh~xyO^87}M8$e7--}g-XLQbx6W)IEORQZ4H|+&TI&+ zk8uXB@|Zc%mL#0xZyP4EmVzgF#WT+(4Tr*6nXY2OZ*?e7dFdbiERuH-2reue_SG@Q zNqF^SMF(;07Y4*N`%k$u9EiN#14ng|gV7i1CL@*T+F61UEHb*li61%SS94_}uge&X z-V}4C-BIP-wvP{Q*qgRB9QPaj6-XhPoP2rVgENI5u!J6BzV}55sRl1(WOk^|l8b>l zQ5x-w`^a-}uqX8XcF0V2-4T?d z==zIQ*QH6V4W0{VS{?;YBP`~DbqO$T+5s4&T1G`_ zx(P&K=71eBahLiAp}B=8$3=nCdb|EBr>H3RmJI|A1SEp`|L{`!x48c|v8W2|rMQUk zmCHKX)zxJ!cuJG>3j##~PjA8eXe~hCNA=yD3#G~eb62rHbGbNW-aSL;l=TFl1bIeZ zSo=6jkrhHByOzUQCYw|Dq$D$Qy1hNsQFisKLwu~#|LA$#wa0Vn*(cjE_swZJ5GY3B z5lm(v1UM_A7OM?&8N#L7@0{675WwcFW!oEw1>*(H2DL)2m*_VMY=dOi$RA>RzEZIN zD<5~pu9CYIlN@9kR4nAvHKYUo4G z=u>3a5rf02!09r!QYYU~()siL=*(cwa`h6}O(nZvs{zo)Zf z%|Ll5>SD!+TIUZw1xF%T5>D)E{!9#R%QkWp7x|?s+rUsPbm106H5~fD{ts`Jmj}bSDl$?R6dopGv z--!KJaY%q1@y0R+^zbMP3An0cO3(wTcT=JEWqslr8l6H}h4rX$*S=}k*DsU2d38nf zOcUKS78Yv{Wouf3>X;Bw_4x^w;Drmn2|Pc9WV%vL%Szg`yssE>VkWI`kOQp;3%> zsR^ay24(_xD4g0~;QN)qwQq7Y#o@$1F&vME_xqe5S_5yLMf=5+MK@}60|^!DIiW(M&%rG6-QKXY6&e_D{EMv7#6s~~xYffH^t@^IK&!8Vtyq#vwLa)%E)4u9ms2s1S4CZ;<++IahZ=Y+vnioUY=E{tOfwvs z>k-h-Xdm)G$5%`i_!9r%X}N|AzPZQhL4#g;x?G04GkT-rfbu%!8271pHN7LTEu6g- ziQy?Kro1P;wj%4#xur{~S&MY-y?d_?t`$6SxLR1pYr)l|mUe6H?^$un1y5JSbMd6R z&mxW!DEez}ik38Q6uSy|;UdyLeJrVa6?M&|{%=pP_)Nk1-6*X;q!}DMrqPUNQ|t~h zU}NX9)Zrup1e!KnG@&E%sES??>R^JM)Sh{Zht%(Zu}uc%Y2LEUr|s#_T+2{Q!Q_Of zq>C*_yjCRaS9)(B$St6=HA`lxT`86MPRg=)$?e#?2R5g%019O%)1suyp0%8I4=LUz zvIl)D17iC*=_a=^{leb5XQa_H%c@D7fTe+Sg%tEz@NNFb9=zNYb^Oibc8bM?rRb{~ zC3lE&4()AGkkAki?GTQ4&utZ#rJ}kg-CZZb0dumu5;hyW(|om!C%Vk_WwdyXlx?D0 zx>{?T{3VJxWSNOb;XhfcW7k3Tp5huF0k?W16o{7rdPUnhlxUBCu`JR`PW^tQ^D4rz z;A_htAt}DBI%D?G-@hJ5L*MNikGtP>3!m&M8*oe!UhHH>bN?U8-Z{GRXxkF5ifx?O zww+Xxif!ArZQHhO+qP}nNmcUY_I>y3ez)K2(LKi5W1N3~bFaM@_F8j>IBWiuE`1Ni z8LhApCGY{)d{W}t-5##u&XiJxW834dZ^`}fzyJo_+KfQedM**s%fY@P$2=`pg)NzQ zjK~My*C_79L~^$2VFi(W^t7?J4br8E71*J;6Xq|ZX;-8>Da{9cQkY}hn zOg=F~i_*~!bj=@`#5R#70O`VWvE@On(re&G{bF^y%%+-+(s{vSZaX6atCnQ&+sF*c zUeb~QxF?|zH_U+a`p6YVOOhNM2N&Nblyy;;OBrdRWVwT! zZtxFINL4g0ThUC(ldUOFM&tNp1=^!8SEMyEM ziehU{Z{#0eJq+bOWy#W8gt-|mQdw0SRMyMEx(it4?Tvu*awsSmMc7`X!-klGQ8!l1 zfYNeXr6OC+po)H;h|v>y)5*&ta41jsTvGX&50bJz1@|;BY=)B#K;5!sha338YI99H=t~?_e90WG?eye;2^EcY7^QD684) z@Wfn{-FsyE{5LLaoF*WclWzhG+3#4I^uMD35H@oavNo_WG_yAOj~H56%>hLT<&!h5 zFrnB8W0~M57CpNfDWdFRpin)2*qSI1f!^HoWL8?Rn9Jq0n15@;e)xxfw`%uosp45+ zJY|LFT_4_F0iWO>YZ)@+_@7mZ);k{0H<=#On|xnyPi#LvZnJ{HV3u`D(PDH}2gD*x z0Yj>=(q`;Yc5duMDUh%U>=kn7nVVTD6QEBZp`sA8~kW(*`f0s~-$N3;b5 z&=NyJund~=aSO5`W~j}G`+x{k7ku|^u7h@eS#!wXP^TGHa=sw*~Y`t*D}B%2Hllp^AdJ7Vc=3&j>= z4x*8-Y7+{z9z{+&cJ|sEb{5?u(wr3XXQDF@KEGDq7$#E6GxnqYqED$c(3r@ZExJU= zBVt7PU)_CxP#aV_KClA21f|T#DW4UoGeUG&7cHNX?2$DfAzM+QIhAxpf+!3(2>@qA zz)YB3;GCz)gk$X3Tc(lF(JPY13BjYRWjahQwjP-T{H6givEP?qjnUwklf!jhj~7$( zs44XiXO3t&!#xkBS0F6S#JWVW)Yx}9UNGAWR}?d*%%vWqeo#+L>UOAX0Gd!VGfaD`Msxx8xbEIccQ zVM<|&R~sha9%xhu#xlhi0>M+dtB+Q>EstKgZI5QVEe>yS)EwI2%$pxlqCpH`s>UBO{!=alU**yr?;6uh=@bj5Xaj z^}lo|SLHvoMXyyNHkH@}MpovBoIHtAusFMunpi(82Hd2?pM#5O!-+MRl$9+ascdA{ zz*J->I2bUUH6jJ~yZ&)eMAPiv+a zl+d`eZ!kK**`x=bRO3A4$=>=pY z;0jjjc4vHt(#RTcdGP=({heBS-h}45-_Rmuh0CLU8+b4i$zNe~*mX{K)!?=j@f;(_ zt3x3I!0Z%n@EpI}lc* z7D`pYH#-#Nc6JHs=yVGCyRHcJU~Ht1gcAs0Ya3kUud&KbEC*cFlq(w-V>jV%PfBK^1r;v^&A0e^Cf z%?6ZhblDY0(68OB0~%2hY*3}~2p&|rPA-e?qH z)pARC2HA=k z{SW%;sqe|B|F+bopl4-kX(VW4Wou*o%{BJ_i%9*)%z%P8`Z!b*m@L0$qrOILk*|)f zq-0QGF$82FdQPx2kVG?6#umlVRP1a1FrERBxhFmE+incwwwie_-RZ#eHiyG?*U5C& z$KR3fxdCz2Qz1;Y`O|?ZZT8WpU1fOENH?x1ZYZ>HGfDmNejMlp7>cd~p*D=*Fmr_R z^iV<>>ke)R&8kGawu?^0*ZfLMzxZ!~hI`jTF&RE%@&1Sa~+eOhyz9 zqV+9JPOPQUQftqc;LPQQ?tG~Jj{vPW`9Px_kvROqhR8Ogu|}+NjIgHI(fn!pO!IVb4qDDTPDTDv|~60C+)1AuzGdSEmP4Ow`FedFp1G>q4X z5GPh+6GMy~w2Rf|fLHKjjypAX?HvNixw*-UP|;V#J(&}3EM~AKnO^8~&S$2ki06`) zTSGAr?y&a331=EQzY!A*R?>&{BIBY-h2L|c=E1zCTVsJb>OyV_?#mMEK!pMhpIc;! zdrNy0m3a@rm9=tt$%3M}IBhrkLQNFPXE2~TM*%wkHQd)jejzfwt;i&2EY*Zx*}vNx zW)|OYG`*yYe|~6;sCHk3czYx>qOn-__=u$5aAUYwHHF?VUk{M7fe5FY7xC#ZBv>ox zXq2#a4Pr3Tu}G$>GuOcQ1RDUB#wk!f_2IjnpeT4+TnY{_s@bb$8*OMwHM-efoVI&) zHaF1fQxfMDClof7ntf|xp9g%;LW$uX03wg(5r%kQA^&sHaM;m{O5{7(A^9e-{%;A` z|ILE`74Td*Ab;~#Zync3X)ZJtaRa~bkVemgoiK|hfCj7=NKdXD9a0NP7U-%~nT2vH3o*cs+7BTe z(ZM7T3H4an>LD1)7UU{{&`IN4M?cMv>T)1(NNlQ?e~5IC1O?-rGSdoUwI=2yE`?dH zCJNWqY>oDe$eM>v3Q!FuP?fi`j^97F9Ba1Uv=b#MOBNSfsfQs;Yi>Kg=bdmo>)Q3+ zTHFGL(W)CUcZrG3YAmt~POh}R@3Xhd+!#1-?F&*-mSz!F)IgtU66)c~d!aZS= z&X$}B1uH$A>UE7uiL^+@jdYS&HcuA7BNuUU%w(DRb&y$RpEOT35qL#I!*^gc2#LD< z%9@Kf(pOs0$c1Hi3F6Ero2;c$jvC+C*~WKM^~JntSGZ= zkx)SnWgQQrsE}4sXt5-6qxL!{`in~(#qUeoZYdX+vI?k;X*B0kqK|JP#^j4a<;>xv zWN=g?NS}*ur=k{*3WUwvWidAIs$pokN)Ibr7MSyjF?2XH`0`JulC~@apR;cw?wvA{ z+GU?F=dvQfU2N{ zc?L!>@}kA41h$6D7$7ds68#}Ju67t z)83z;6)wfez`0&-TsM%=<0qB#Q2t<~ud<+h(vE#Eq38d}a^f_=KIY&^HN@x$@wYe6 zl5%UNws_hpJ_8e->5SZK@bS#$@g+JM_9YtwR{|E!M1D=uoSez^cR#GS9AA#nYO2=W z7Onr-$@GXMiTxafdh%^j7Kx0o{F*|S1a&kHo+dYIOpJ^?@nCmzox2X+QA~W(C{b|s zDp8h}b#Fz*Xm9`SSW@}Y&}S2!28woQxZ;4N7Q3OjAcedjIQtbahxp5SkvL1BqY8_< z2?U~0IqQ0Qnn3B1S=!Ox_jR?VOkb z*nTemftJ~FEX*uISYC!PpNqOsBMHEhmRBTM6zSbR^XBt)*-g@z7Lv3kj^z>_nd-i8VF&;V6i zrw={|SmJAZ%|3-YsKdU%nU(|E>|!Q)erN(Yfzx@+o`_zp#w~$UxOE#MSMUnTQ+&fG z0mG<}N|M0U<*O$$N>!b{;4QyFP9M-2V$qcq>d~P!#95$V<-Xy!U3dHh4>kl{Hi8D5 zx$$m6vJYI1H5zO~zFq1M#FJH-*|nM4RVz)s9#?+6(qIMncS?q?UwvSvf!(1gp_FE{pC%^DhTJ)#X4025@QMYt0&yw8(P)esiICY>nmmuGM7g zwUw(gP2QeEF>mBk&Hh=AJ^qztEE7daXqvwcMeReY8@8yLew$7PzfZ2UaY`F{&LGia z=I}ZD^`EcfH;QVI_V1kY`Fr90ce$scjg93$?_e#N4ygWL2$@ogugZhMJ@{rY%ggFQ zAVkk5+=l|K&?ymkCVSwoa{I%=wX5J|`A))DzyF%k=!{zE@O!N}g( z%-}n+vNkp|VHC4Aw)rP2S+X(`1N7KlYwgQZQ)h~|r2gPfx~rX`;klrCvYnF7GwYTU zr}6QPTPOF#uD8Iid4oD7xI*-PFCI64KZ81bI=g?K8q@@Fw*PbndIbEzDpK;EkmcjR zVRFqABNk+nSLa2W2y2wlkB?u7kfffkt1X}3DNdP5GGK=|5tum?U6&tXWOgq%4#>;K z41SiiFdI;0Co8+B9Ip&3auA{jzY(YTzd&46 z&)U%PUrgmevJ=uk{0Nm`n|g>KZ$G(XOVLI4phroCk&xkuH$6O{C4kSY z&tjmy7~Z!_oevf-h|V74;Huj=CpJHNk(X1*_n!|YxHYZz(>G2r-+0me-{U3Z`cISm zABZua@Sxj`<3rp7x9bvMRn$5fkpjpF<^l)3N)}S1o0!bNV|5(cnvmtDM$S%IvpK|1csayH>Bybvq{JnT<@5%o1iYf(KFnTzy>c1 zLZCdveSGee^gvQL!IfW)Q!pZVaLtiu>vGtxT95g!|27TFyIjY`|BW8OcfQ2&e}SNa zki4>(ppedQAq7EsFOrPe=bW&FXvMSsLI7u^-0>Ti#yCNt8qwqj;lTz-_SQV>MILbE_;z#P%H zBiiX2CW?NKC0CL09!ZZbjou*>EuH%3*-|7)Rs-roM0kQTE5QBp=Hta1$!5It+B@;W z8&$!%FYSmFd=Mu|3^14${}`8?v`vj<6yG>^hE%)k7}xR?1=NOgao`1W0S@etufxh=8?t5|lKkSPXznHX+ zu#&Xk|J<1%St*(RUnrR&t3?q0#JJpNegWE=LALk5F-6ny0Tr5K&K(R@P8*KUgFVN6 zc;8uU_3x-K2JCGUQXAv#jgJW`UkOKmW-!odawX5Qnd8nu*vLJHS=uKKAU>g zl=4>24CHhEX6i!BkupN&kU8-~yB?S9&?H?`WH7flF(b)Jyw*{N?r5jPD%dY!=YYAZ z%@^T_i#$H9$eWVwEWQjRxUV%f&nl(8qJDr8#FY$THk5}K8mV|P40vF~jya7%&qx5{ zePx~)Hd?;xwRhBZ%*b-i)E(MUV1gAhoS$r6oxzTTk^pK)b4Bl(VK9#d7uIiBr;(;s zQuXMMf1B@BrH%;q`i52G+vNWXI^_S&t^Ld76%_dul@$JI?MZS{HsAV+UehbA1ZL}r zC_qWyO*f754OaFb1VVBMafE@ZvAA&;PGJj!+HPHHuWFgG?B703uC!rHUY|I2rPM_|eaVY2NVIAsO)W`ChoowP^<5WdS z9#gWOc8mt(Rx-?F;u9`o=i=)WJ?h35l99U;7%h|sZL0PTs0-75rvsMU*j`Y@0cRt= zV9`y<&aH=b)MehhVU>uC(Mg||59Id>MS=;#pZJ;&qE8+pFR+{G8pY&CKI!0#z!Mz&*;-1cvD+tr26r>zT zM=xPpaPW@C8F?sdk{sKx%kut(dya|+N=Kne8=bBdar4^n_2S-K+{kbZ1@6aOf^v;S zD{uMFKA^VC<-+iLJ462;Z!krE0ZAbpA!$WHI!c<&wVQ0}MTj|KT18vgM7dlOj>H=Ex~5d)t8@Cxih z)|d<^ESBc0`lIU78m-7?PysQZg54bZ$kiH}uusi5;w+u1Htx1o3InWyby_w~SWWIX z)$8=`EiuAX3$1JbM%bc2jfU0}$e6v(GXz0bT-f=xgHwevu;;~viU3F#!?(-b6^=$G zH;Sak8Vvmq5v^d?DcsmjO$AClkb~~;sW2NMf2#xyt?P06FN)#6CSn`V4SQMVQVrV` zSXs-+f=4^)$EJnkTg|{LC@qYeu~{rRf!;>7{*l2r!S_H7V^Rya7uvaxar=2!erMpc zR%O(OxC7gG+?NJn-apCX)kF~pN8+NT(RhRPlNou&{RZ!-RwaI`7Nx>OTtad5r`>>6 z65ws2=ePQyWVs1oimOT&LnPHkFa8^?^Qneva_@JMP8t5coVWbC2DF6)GT)ptEqcRpTLqP>w3RNwsH^uinWNI z0#BRcbxYR9?eL%ngq$E-uUyaMGM(8m)BWK+sq^*c6Wq6h9S}sy4^I#?#bCKNfe?Hv z+3x@e3aP`OIiI*$Oi49_DwN=G9$anA1f#dq+(xA#+%#T+)NR~Kd4usxyVB}mn%sK1 z%5{95Z+^p$)NMAAPo`j2RBHH$?IdrQYPvo9SeQ*lxx*N^4AWt0r@|4hOD`HF0l5Lg zH1+yam`+iB%w(T6TbiB+gQ2F^npE8?9i~!I+=azPne-~LK+8o}acB58Tbe2n0T~=& zHsU5%K`cR1V(fu&;LG#}LFxu8M0hiwb3grL{vd3DCP=aU5PPtKg{#{J>n{9cSZPB7 z=j0X6rA=!;%zu+=fAKHuNF&d6^T=Q}lcZDa;w0mM%THqHvTdzwyfO^T4Z-VoN5_)s zU-S_|z=dZ?1#j#|_YRxznEt#D!u6=u7WeIXSRI>2u8UMF$^~*!PRwlc31Y=Y6J@M8 zT5JSw+?aqXCIC9j`Ck54Ztp^2`!n7$cL1|FX(qIEDVkx=17!T715O2MwKL=m3)eB1 zNnxpFb5_`8+j6*C6+qi;2Hl-j{q!_!ygaEhT>~$94SR>BV$oq^AqsLT78?OY>6Qqfjlb8h$AO&j7HiO6i+sBS@zKLn0pmzP*udtK@>8Kyju#AYo-N z35jQBQ5_>0!Ab|-^#!?xz;v@@DX-aF2{Oi+qoGbw=lX!Ka_<8WmgOci6pU&R#780` z6tQA!B}Q~=34*0@4Yo2_IRQ0n&_hq@r5x0R_G|?OH?28Ps6hMABK;LO%%C{qf(mo>xg{q~|33f{NU$9{@SO$^(>cRM%3hOA!2Zol z(7{`({UiSvqt$}PC_Q$RRXm+hi6l1JLh%$+Q-Ia=`EYa3-)J-GDVjT_g`QAmlY9Rg zWbuVgWN^ZqA9Bt z+c9W~zqH#pCZ|UYv@*bstInIossPKFJR+@~4Z?vdUIUElCy9cCP`W;SRcy~|7ZYdu zczVqnq_is6VuOWap0t_ohh-rO;~{`~w_uQgdA8ZmN>sRyx#f$*@a?3a{dwyV;3!!~ z`Rhwcuv3{tnmD>hMxALc%eJ5qI#Tk|4^dtDj*8L;{=k99;DA1vm^j1m}-4&P( zbh}>zXlJ;y*X6dlcOw)kaxc2~<+i&Qz80T88Xk0eD8HA)llWGfXlCT~_b%f#^dA&R zKlt0U-Vj&fTL)s$;#>$#t41Hc5uhA=sia7K9E@^miLV=7z^93Ox>o-z9pDp|$VdNF zrSqAoiP3VlrUrywFrAwOTL8`=Fa|MSQt%P0pItANUVxpSU5s7GHO}^303s1H1@bSp z3WQN&t-#9)gi_!q=zsQJ^kN~xGvD3|@ZA>tUp#C7>k5>ybu_cFcKFvTMUcGQH?tAK zXL9ytQzn#Bp%MtlU~^b@Z$xq6pkk<0^9^)vA&wcG6AKO*jNb`QlM z=5uXl;kf>cVin^-aAr_>XCaNDg8ZgibQS_C6IwFrze;d$EC9=tH{&sQc zT-eG|vDp|Qu1|>2t=++C(%4!7he7=^|IES06egHv9*9_fEG>?EXCAD5VxtI2$omuD z;3+luWQsgwgfu^p1e{>H)SBsUsoegLgn!0q7IZ=zZfbsq&inZ7^vGY zPW<18{{LYT|8$C8|0DZC$+WVFZ=OSI^49!48=wut<7$3JLW$CdC=V)AFO^bHvK45l z?~~$+fb!?(C;6S#V=nIIKzG&}+k^4iOH2ye53S2pQ?}k(IT6?lR!-JtfI3@29$seF z4*1G}9z9f8Tjm4!HELUA7ghE%;5;vrA{#wTm;JBT#+N^X3KQKVQ<-rWo+N!*1o;i@ z=)jpsogyP1y<$wX4TiZlBdT$_qP`+EDIwN_n4~0;WH>bv`uq zk$@g&wLuh5io1!*jbT7#U*k5yDD?0Nr} zbO1y}mX~CBCuI5?X5??U{|_}6SxY@fy$*?P7u z<;*a@0j5(@8*kWi@p!%$hHDN^G3JA=_Bf|aZOT9$_qc+T@!4PET`?1KmA;aDPdAzt z4<;+w1mAnYQ~8b0+|Mj1XO5_D8nXE7u>%yhU&^+KQ#Akee^F8W2QVI8vAEbUKYr)~ z{*TewzkvBCAWf=n-)tBd-ra@`Tx*gL)WitCMf*`l>vsJ{^≪MIi_vW$DwUS%KB+ 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 literal 0 HcmV?d00001 diff --git a/arduino-0018-linux-x64/lib/preferences.txt b/arduino-0022-linux-x64/lib/preferences.txt old mode 100755 new mode 100644 similarity index 83% rename from arduino-0018-linux-x64/lib/preferences.txt rename to arduino-0022-linux-x64/lib/preferences.txt index 0dc7963..63f63ac --- a/arduino-0018-linux-x64/lib/preferences.txt +++ b/arduino-0022-linux-x64/lib/preferences.txt @@ -72,8 +72,15 @@ platform.auto_file_type_associations = true # default size for the main window -default.window.width = 500 -default.window.height = 600 +editor.window.width.default = 500 +editor.window.height.default = 600 + +editor.window.width.min = 400 +editor.window.height.min = 500 +# tested as approx 440 on OS X +editor.window.height.min.macosx = 450 +# tested to be 515 on Windows XP, this leaves some room +editor.window.height.min.windows = 530 # font size for editor editor.font=Monospaced,plain,12 @@ -92,6 +99,21 @@ editor.caret.blink=true # area that's not in use by the text (replaced with tildes) editor.invalid=false +# enable ctrl-ins, shift-ins, shift-delete for cut/copy/paste +# on windows and linux, but disable on the mac +editor.keys.alternative_cut_copy_paste = true +editor.keys.alternative_cut_copy_paste.macosx = false + +# true if shift-backspace sends the delete character, +# false if shift-backspace just means backspace +editor.keys.shift_backspace_is_delete = true + +# home and end keys should only travel to the start/end of the current line +editor.keys.home_and_end_travel_far = false +# the OS X HI Guidelines say that home/end are relative to the document +# if you don't like it, this is the preference to change +editor.keys.home_and_end_travel_far.macosx = true + console = true console.output.file = stdout.txt console.error.file = stderr.txt @@ -197,14 +219,14 @@ preproc.substitute_unicode = true # viewed in (at least) Mozilla or IE. useful when debugging the preprocessor. preproc.output_parse_tree = false -# imports to use by default (changed for 0149, some imports removed) -preproc.imports = java.applet,java.awt,java.awt.image,java.awt.event,java.io,java.net,java.text,java.util,java.util.zip,java.util.regex +# Changed after 1.0.9 to a new name, and also includes the specific entries +preproc.imports.list = java.applet.*,java.awt.Dimension,java.awt.Frame,java.awt.event.MouseEvent,java.awt.event.KeyEvent,java.awt.event.FocusEvent,java.awt.Image,java.io.*,java.net.*,java.text.*,java.util.*,java.util.zip.*,java.util.regex.* # set the browser to be used on linux browser.linux = mozilla # set to the program to be used for launching apps on linux -#launcher.linux = gnome-open +#launcher.linux = xdg-open # FULL SCREEN (PRESENT MODE) run.present.bgcolor = #666666 @@ -215,7 +237,7 @@ run.present.exclusive = false run.present.exclusive.macosx = true # ARDUINO PREFERENCES -board = atmega328 +board = uno target = arduino upload.using = bootloader diff --git a/arduino-0018-linux-x64/lib/theme/buttons.gif b/arduino-0022-linux-x64/lib/theme/buttons.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/buttons.gif rename to arduino-0022-linux-x64/lib/theme/buttons.gif diff --git a/arduino-0018-linux-x64/lib/theme/resize.gif b/arduino-0022-linux-x64/lib/theme/resize.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/resize.gif rename to arduino-0022-linux-x64/lib/theme/resize.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-sel-left.gif b/arduino-0022-linux-x64/lib/theme/tab-sel-left.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-sel-left.gif rename to arduino-0022-linux-x64/lib/theme/tab-sel-left.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-sel-menu.gif b/arduino-0022-linux-x64/lib/theme/tab-sel-menu.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-sel-menu.gif rename to arduino-0022-linux-x64/lib/theme/tab-sel-menu.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-sel-mid.gif b/arduino-0022-linux-x64/lib/theme/tab-sel-mid.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-sel-mid.gif rename to arduino-0022-linux-x64/lib/theme/tab-sel-mid.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-sel-right.gif b/arduino-0022-linux-x64/lib/theme/tab-sel-right.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-sel-right.gif rename to arduino-0022-linux-x64/lib/theme/tab-sel-right.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-unsel-left.gif b/arduino-0022-linux-x64/lib/theme/tab-unsel-left.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-unsel-left.gif rename to arduino-0022-linux-x64/lib/theme/tab-unsel-left.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-unsel-menu.gif b/arduino-0022-linux-x64/lib/theme/tab-unsel-menu.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-unsel-menu.gif rename to arduino-0022-linux-x64/lib/theme/tab-unsel-menu.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-unsel-mid.gif b/arduino-0022-linux-x64/lib/theme/tab-unsel-mid.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-unsel-mid.gif rename to arduino-0022-linux-x64/lib/theme/tab-unsel-mid.gif diff --git a/arduino-0018-linux-x64/lib/theme/tab-unsel-right.gif b/arduino-0022-linux-x64/lib/theme/tab-unsel-right.gif similarity index 100% rename from arduino-0018-linux-x64/lib/theme/tab-unsel-right.gif rename to arduino-0022-linux-x64/lib/theme/tab-unsel-right.gif diff --git a/arduino-0018-linux-x64/lib/theme/theme.txt b/arduino-0022-linux-x64/lib/theme/theme.txt similarity index 100% rename from arduino-0018-linux-x64/lib/theme/theme.txt rename to arduino-0022-linux-x64/lib/theme/theme.txt diff --git a/arduino-0022-linux-x64/lib/version.txt b/arduino-0022-linux-x64/lib/version.txt new file mode 100644 index 0000000..e7b4a12 --- /dev/null +++ b/arduino-0022-linux-x64/lib/version.txt @@ -0,0 +1 @@ +0022 \ No newline at end of file diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.cpp b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.cpp new file mode 100644 index 0000000..845e2ef --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.cpp @@ -0,0 +1,715 @@ +//************************************************************************ +//* Arduino Test Suite +//* (C) 2010 by Mark Sproul +//* Open source as per standard Arduino code +//* +//* This library is free software; you can redistribute it and/or +//* modify it under the terms of the GNU Lesser General Public +//* License as published by the Free Software Foundation; either +//* version 2.1 of the License, or (at your option) any later version. +//* +//* This library is distributed in the hope that it will be useful, +//* but WITHOUT ANY WARRANTY; without even the implied warranty of +//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//* Lesser General Public License for more details. +//************************************************************************ +//* Aug 31, 2010 Started on TestArduino +//* Oct 18, 2010 Added memory testing +//************************************************************************ + +#include +#include +#include + + + +#include "ArduinoTestSuite.h" + + +#include "WProgram.h" +#include "HardwareSerial.h" +#include "pins_arduino.h" + + +#include "avr_cpunames.h" + +#if defined(USART3_RX_vect) + #define SERIAL_PORT_COUNT 4 +#elif defined(USART1_RX_vect) + #define SERIAL_PORT_COUNT 2 +#else + #define SERIAL_PORT_COUNT 1 +#endif + + + + +//************************************************************************ +enum +{ + ATS_Manufacturer = 1, + ATS_CPU, + ATS_GCC_version, + ATS_LIBC_version, + ATS_CompiledDate, + ATS_TestSuiteName, + ATS_FreeMemory, + + +}; +unsigned long gTestStartTime; +short gTagIndent; +int gYotalErrors; +int gTestCount; + + + +prog_char gTextMsg_Manufacturer[] PROGMEM = "MANUFACTURER"; +prog_char gTextMsg_CPUname[] PROGMEM = "CPU-NAME"; +prog_char gTextMsg_GCC_VERSION[] PROGMEM = "GCC-Version"; +prog_char gTextMsg_AVR_LIBC[] PROGMEM = "AVR-LibC-Ver"; +prog_char gTextMsg_COMPILED_DATE[] PROGMEM = "Compiled-date"; +prog_char gTextMsg_TEST_SUITE_NAME[] PROGMEM = "Test-Suite-Name"; +prog_char gTextMsg_memoryUsage[] PROGMEM = "Free-memory"; +prog_char gTextMsg_dotdotdot[] PROGMEM = "... "; +prog_char gTextMsg_ok[] PROGMEM = "ok"; +prog_char gTextMsg_FAIL[] PROGMEM = "FAIL"; +prog_char gTextMsg_spaceEqual[] PROGMEM = " = "; +prog_char gTextMsg_info[] PROGMEM = "info."; +prog_char gTextMsg_dashLine[] PROGMEM = "--------------------------"; +prog_char gTextMsg_DigitalRW[] PROGMEM = "DigitalReadWrite_"; +prog_char gTextMsg_PWMoutput[] PROGMEM = "PWMoutput_"; +prog_char gTextMsg_AnalogInput[] PROGMEM = "AnalogInput_"; + +//************************************************************************ +void Serial_print_P(prog_char *flashMemStr) +{ +char theChar; +int ii; + + ii = 0; +#if (FLASHEND > 0x10000) + while (theChar = pgm_read_byte_far(flashMemStr + ii++)) +#else + while (theChar = pgm_read_byte_near(flashMemStr + ii++)) +#endif + { + Serial.print(theChar); + } +} + +//************************************************************************ +void Serial_println_P(prog_char *flashMemStr) +{ + Serial_print_P(flashMemStr); + Serial.println(); +} + +//************************************************************************ +//* this is for internal use only, not made pubic to the API +static void ATS_PrintProperty( int propertyTagNum, + char *propertyName, + char *propertyValue) +{ +char lineBuffer[64]; + + strcpy_P(lineBuffer, gTextMsg_info); + switch(propertyTagNum) + { + case 0: + strcat(lineBuffer, propertyName); + break; + + case ATS_Manufacturer: + strcat_P(lineBuffer, gTextMsg_Manufacturer); + break; + + case ATS_CPU: + strcat_P(lineBuffer, gTextMsg_CPUname); + break; + + case ATS_GCC_version: + strcat_P(lineBuffer, gTextMsg_GCC_VERSION); + break; + + case ATS_LIBC_version: + strcat_P(lineBuffer, gTextMsg_AVR_LIBC); + break; + + case ATS_CompiledDate: + strcat_P(lineBuffer, gTextMsg_COMPILED_DATE); + break; + + case ATS_TestSuiteName: + strcat_P(lineBuffer, gTextMsg_TEST_SUITE_NAME); + break; + + case ATS_FreeMemory: + strcat_P(lineBuffer, gTextMsg_memoryUsage); + break; + } + + while (strlen(lineBuffer) < 20) + { + strcat(lineBuffer, " "); + } + + strcat_P(lineBuffer, gTextMsg_spaceEqual); + if (propertyValue != 0) + { + strcat(lineBuffer, propertyValue); + } + Serial.println(lineBuffer); + +} + + + + +//************************************************************************ +void ATS_begin(char *manufName, char *testSuiteName) +{ +int freeMemory; +char memoryMsg[48]; + + gYotalErrors = 0; + gTestCount = 0; + + Serial.begin(9600); + delay(1000); + + gTestStartTime = millis(); + + Serial.println(); + Serial.println(); + Serial.println(); + + ATS_PrintProperty(ATS_Manufacturer, 0, manufName); + ATS_PrintProperty(ATS_CPU, 0, _AVR_CPU_NAME_); + ATS_PrintProperty(ATS_GCC_version, 0, __VERSION__); + ATS_PrintProperty(ATS_LIBC_version, 0, __AVR_LIBC_VERSION_STRING__); + ATS_PrintProperty(ATS_CompiledDate, 0, __DATE__); + ATS_PrintProperty(ATS_TestSuiteName, 0, testSuiteName); + + freeMemory = ATS_GetFreeMemory(); + sprintf(memoryMsg, "%d bytes", freeMemory); + ATS_PrintProperty(ATS_FreeMemory, 0, memoryMsg); + + randomSeed(analogRead(0)); + +} + +//************************************************************************ +void ATS_end() +{ +long seconds; +long milliSecs; + + + Serial_println_P(gTextMsg_dashLine); + + // Ran 4 tests in 0.000s + Serial.print("Ran "); + Serial.print(gTestCount); + Serial.print(" tests in "); + + seconds = millis() / 1000; + milliSecs = millis() % 1000; + Serial.print(seconds); + Serial.print('.'); + Serial.print(milliSecs); + Serial.print('s'); + Serial.println(); + Serial.println(); + + if (gYotalErrors == 0) + { + Serial.print("OK"); + } + else + { + Serial.print("FAILED (failures="); + Serial.print(gYotalErrors); + Serial.print(")"); + } + Serial.println(); + + //* send control D to terminate (End Of File) + Serial.write(0x04); +} + + + +//************************************************************************ +void ATS_PrintTestStatus(char *testString, boolean passed) +{ +int sLen; + + Serial.print(testString); + sLen = strlen(testString); + while (sLen < 60) + { + Serial.print(' '); + sLen++; + } + Serial_print_P(gTextMsg_dotdotdot); + if (passed) + { + Serial_print_P(gTextMsg_ok); + } + else + { + Serial_print_P(gTextMsg_FAIL); + gYotalErrors++; + } + Serial.println(); + + gTestCount++; +} + + + +//************************************************************************ +//* returns true if no errors, false if there is an error +int ATS_Test_DigitalPinWithHelper(uint8_t digitalPinToTest, uint8_t helperpin) +{ +boolean passedOK; +int pinValue; +char testName[64]; +char numString[32]; + + strcpy_P(testName, gTextMsg_DigitalRW); + sprintf(numString, "%02d", digitalPinToTest); + strcat(testName, numString); + + passedOK = true; + + //* test senario 1 + pinMode(digitalPinToTest, OUTPUT); + pinMode(helperpin, INPUT); + + digitalWrite(digitalPinToTest, HIGH); + pinValue = digitalRead(helperpin); + if (pinValue != HIGH) + { + passedOK = false; + } + + digitalWrite(digitalPinToTest, LOW); + pinValue = digitalRead(helperpin); + if (pinValue != LOW) + { + passedOK = false; + } + + + //* now reverse the input/output + pinMode(digitalPinToTest, INPUT); + pinMode(helperpin, OUTPUT); + + digitalWrite(helperpin, HIGH); + pinValue = digitalRead(digitalPinToTest); + if (pinValue != HIGH) + { + passedOK = false; + } + + digitalWrite(helperpin, LOW); + pinValue = digitalRead(digitalPinToTest); + if (pinValue != LOW) + { + passedOK = false; + } + + + if (! passedOK) + { + sprintf(numString, " (helper pin=%02d)", helperpin); + strcat(testName, numString); + } + ATS_PrintTestStatus(testName, passedOK); + return(passedOK); +} + +//************************************************************************ +boolean ATS_Test_DigitalPin(uint8_t digitalPinToTest) +{ +boolean passedOK; +uint8_t helperpin; + + if ((digitalPinToTest % 2) == 0) + { + //* if its EVEN, add 1 + helperpin = digitalPinToTest + 1; + } + else + { + //* if its ODD + helperpin = digitalPinToTest - 1; + } + passedOK = ATS_Test_DigitalPinWithHelper(digitalPinToTest, helperpin); + return(passedOK); +} + + + +//************************************************************************ +//* returns true if no errors, false if there is an error +int ATS_TestTimer( uint8_t timerPinNumber, + uint8_t inputPin, + char *statusString, + char *errorString) +{ +boolean passedOK; +unsigned long loopCounter; +unsigned long lowCount; +unsigned long highCount; +unsigned long startTime; +int percentLow; +int percentHigh; +int pinValue; +char numString[48]; +int pwmValue; + + pwmValue = 128; + loopCounter = 0; + lowCount = 0; + highCount = 0; + passedOK = true; + + startTime = millis(); + pinMode(inputPin, INPUT); + analogWrite(timerPinNumber, pwmValue); + while ((millis() - startTime) < 500) + { + pinValue = digitalRead(inputPin); + if (pinValue == HIGH) + { + highCount++; + } + else + { + lowCount++; + } + } + analogWrite(timerPinNumber, 0); + + //* the difference should be about 50% + percentLow = lowCount / ((lowCount + highCount) / 100); + percentHigh = highCount / ((lowCount + highCount) / 100); + if ((percentLow > 45) && (percentLow < 55)) + { + passedOK = true; + } + else + { + passedOK = false; + strcat(errorString, " PWM ERROR"); + } + sprintf(numString, " (PWM=%02d %d%% LOW %d%% HIGH)", pwmValue, percentLow, percentHigh); + strcat(statusString, numString); + + return(passedOK); +} + + +//************************************************************************ +//* returns true if no errors, false if there is an error +boolean ATS_Test_PWMPinWithHelper(uint8_t pwmPinToTest, uint8_t helperpin) +{ +boolean passedOK; +char testName[64]; +char errorString[48]; +char numString[8]; +uint8_t timerNumber; + + + + strcpy_P(testName, gTextMsg_PWMoutput); + sprintf(numString, "%02d", pwmPinToTest); + strcat(testName, numString); + + passedOK = true; + errorString[0] = 0; + + + //* is pin1 a timer? + timerNumber = digitalPinToTimer(pwmPinToTest); + if (timerNumber != NOT_ON_TIMER) + { + passedOK = ATS_TestTimer(pwmPinToTest, helperpin, testName, errorString); + } + else + { + //* we should not get here + passedOK = false; + } + + ATS_PrintTestStatus(testName, passedOK); + + + return(passedOK); +} + +//************************************************************************ +boolean ATS_Test_PWM_Pin(uint8_t pwmPinToTest) +{ +boolean passedOK; +uint8_t helperpin; + + if ((pwmPinToTest % 2) == 0) + { + //* if its EVEN, add 1 + helperpin = pwmPinToTest + 1; + } + else + { + //* if its ODD + helperpin = pwmPinToTest - 1; + } + passedOK = ATS_Test_PWMPinWithHelper(pwmPinToTest, helperpin); + return(passedOK); +} + + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define kAnalogPinOffset 54 +#else + #define kAnalogPinOffset 14 +#endif + + +//************************************************************************ +boolean ATS_Test_AnalogInputWithHelper(uint8_t analogPintoTest, uint8_t helperPin) +{ +boolean passedOK; +char testName[64]; +char infoString[48]; +int analogValueHigh; +int analogValueLow; + + + //* first we have to set the ANALOG pin to INPUT + pinMode(analogPintoTest + kAnalogPinOffset, INPUT); + + passedOK = true; + + strcpy_P(testName, gTextMsg_AnalogInput); + sprintf(infoString, "%02d", analogPintoTest); + strcat(testName, infoString); + + + pinMode(helperPin, OUTPUT); + + digitalWrite(helperPin, LOW); + analogValueLow = analogRead(analogPintoTest); + if (analogValueLow > 100) + { + passedOK = false; + } + + + digitalWrite(helperPin, HIGH); + analogValueHigh = analogRead(analogPintoTest); + if (analogValueHigh < 1000) + { + passedOK = false; + } + + + sprintf(infoString, " (Low=%4d High=%4d helper pin=%d)", analogValueLow, analogValueHigh, helperPin); + strcat(testName, infoString); + + ATS_PrintTestStatus(testName, passedOK); + + return(passedOK); +} + + +//************************************************************************ +boolean ATS_Test_AnalogInput(uint8_t analogPinToTest) +{ +boolean passedOK; +uint8_t helperpin; + + if ((analogPinToTest % 2) == 0) + { + //* if its EVEN, add 1 + helperpin = kAnalogPinOffset + analogPinToTest + 1; + } + else + { + //* if its ODD + helperpin = kAnalogPinOffset + analogPinToTest - 1; + } + passedOK = ATS_Test_AnalogInputWithHelper(analogPinToTest, helperpin); + return(passedOK); +} + + +#define kSerialTestBaudRate 9600 +#define kSerialTestDelay 3 + + +#if (SERIAL_PORT_COUNT > 1) && !defined(__AVR_ATmega32U4__) +//************************************************************************ +//* retunrs 0 if no errors, 1 if an error occured +short ATS_TestSerialLoopback(HardwareSerial *theSerialPort, char *serialPortName) +{ +char xmitChar; +char rcvChar; +short ii; +short serialErrCt; +short timeOutLoopCtr; + + + serialErrCt = 1; + if (theSerialPort != 0) + { + serialErrCt = 0; + theSerialPort->begin(kSerialTestBaudRate); + + for (ii=0; ii<150; ii++) + { + xmitChar = ii; + theSerialPort->print(xmitChar); + + timeOutLoopCtr = 0; + //* wait for data to come back or timeout + while (!theSerialPort->available() && (timeOutLoopCtr < kSerialTestDelay)) + { + delay(1); + timeOutLoopCtr++; + } + + if (theSerialPort->available()) + { + //* get the char + rcvChar = theSerialPort->read(); + if (rcvChar != xmitChar) + { + serialErrCt = 1; + } + } + else + { + serialErrCt = 1; + } + } + theSerialPort->end(); + + if (serialErrCt == 0) + { + ATS_PrintTestStatus(serialPortName, PASSED); + } + else + { + ATS_PrintTestStatus(serialPortName, FAILED); + } + } + + return(serialErrCt); +} +#endif + + +//************************************************************************ +boolean ATS_Test_EEPROM(void) +{ +boolean passedOK; +uint8_t dataByte; +uint8_t dataByteRead; +uint16_t dataWord; +uint16_t dataWordRead; +uint32_t dataLongWord; +uint32_t dataLongWordRead; +int addressPtr; +char reportString[48]; + + passedOK = true; + //* test BYTE read/write + addressPtr = random(E2END); + dataByte = 0x5A; + eeprom_write_byte((uint8_t *)addressPtr, dataByte); + dataByteRead = eeprom_read_byte((uint8_t *)addressPtr); + + sprintf(reportString, "EEPROM_byte_rw (addr= 0x%04X)", addressPtr); + if (dataByteRead == dataByte) + { + ATS_PrintTestStatus(reportString, PASSED); + } + else + { + ATS_PrintTestStatus(reportString, FAILED); + passedOK = false; + } + + + //* test WORD read/write + addressPtr = random(E2END); + dataWord = 0xA55A; + eeprom_write_word((uint16_t *)addressPtr, dataWord); + dataWordRead = eeprom_read_word((uint16_t *)addressPtr); + + sprintf(reportString, "EEPROM_word_rw (addr= 0x%04X)", addressPtr); + if (dataWordRead == dataWord) + { + ATS_PrintTestStatus(reportString, PASSED); + } + else + { + ATS_PrintTestStatus(reportString, FAILED); + passedOK = false; + } + + + //* test Long WORD read/write + addressPtr = random(E2END); + dataLongWord = 0x5AA5A55A; + eeprom_write_dword((uint32_t *)addressPtr, dataLongWord); + dataLongWordRead = eeprom_read_dword((uint32_t *)addressPtr); + + sprintf(reportString, "EEPROM_dword_rw (addr= 0x%04X)", addressPtr); + if (dataLongWordRead == dataLongWord) + { + ATS_PrintTestStatus(reportString, PASSED); + } + else + { + ATS_PrintTestStatus(reportString, FAILED); + passedOK = false; + } + + + return(passedOK); +} + + + +//************************************************************************ +extern unsigned int __data_start; +extern unsigned int __data_end; +extern unsigned int __bss_start; +extern unsigned int __bss_end; +extern unsigned int __heap_start; +extern void *__brkval; + + + +//************************************************************************ +int ATS_GetFreeMemory() +{ +int free_memory; + + if((int)__brkval == 0) + { + free_memory = ((int)&free_memory) - ((int)&__bss_end); + } + else + { + free_memory = ((int)&free_memory) - ((int)__brkval); + } + return free_memory; +} + + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.h b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.h new file mode 100644 index 0000000..9501d67 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/ArduinoTestSuite.h @@ -0,0 +1,74 @@ +//************************************************************************ +//************************************************************************ +//* Aug 31, 2010 Started on TestArduino +//************************************************************************ + +#ifndef _AVR_IO_H_ + #include +#endif + +#ifndef WProgram_h + #include "WProgram.h" +#endif +#ifndef HardwareSerial_h + #include "HardwareSerial.h" +#endif + + +#if defined(USART3_RX_vect) + #define SERIAL_PORT_COUNT 4 +#elif defined(USART1_RX_vect) + #define SERIAL_PORT_COUNT 2 +#else + #define SERIAL_PORT_COUNT 1 +#endif + + +void ATS_begin(char *manufName, char *testSuiteName); +void ATS_end(); + +void ATS_PrintTestStatus(char *testString, boolean passed); +boolean ATS_Test_DigitalPin(uint8_t digitalPinToTest); +boolean ATS_Test_PWM_Pin(uint8_t digitalPinToTest); +boolean ATS_Test_AnalogInput(uint8_t analogPintoTest); +boolean ATS_Test_EEPROM(void); + +short ATS_TestSerialLoopback(HardwareSerial *theSerialPort, char *serialPortName); + + +int ATS_GetFreeMemory(); + +//************************************************************************ +//* this has to be an inline function because calling subroutines affects free memory +inline void ATS_ReportMemoryUsage(int _memoryUsageAtStart) +{ +int freeMemoryAtEnd; +int lostMemory; +boolean memoryOK; +char memoryUsage[48]; + + freeMemoryAtEnd = ATS_GetFreeMemory(); + lostMemory = _memoryUsageAtStart - freeMemoryAtEnd; + if (lostMemory == 0) + { + strcpy(memoryUsage, "Memory Usage"); + memoryOK = true; + } + else + { + sprintf(memoryUsage, "Memory Usage (lost %d bytes)", lostMemory); + memoryOK = false; + } + ATS_PrintTestStatus(memoryUsage, memoryOK); +} + + + +extern unsigned long gTestStartTime; +extern int gYotalErrors; +extern int gTestCount; + + +#define PASSED true +#define FAILED false + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/avr_cpunames.h b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/avr_cpunames.h new file mode 100644 index 0000000..8083216 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/avr_cpunames.h @@ -0,0 +1,186 @@ +//************************************************************************************************** +//* +//* Atmel AVR CPU name strings +//* +//************************************************************************************************** +//* Sep 19, 2010 Started on avr_cpunames.h +//************************************************************************************************** + +//#include "avr_cpunames.h" + +//************************************************************************************************** + + +#if defined (__AVR_AT94K__) + #define _AVR_CPU_NAME_ "AT94k" +#elif defined (__AVR_AT43USB320__) +#elif defined (__AVR_AT43USB355__) +#elif defined (__AVR_AT76C711__) +#elif defined (__AVR_AT86RF401__) +#elif defined (__AVR_AT90PWM1__) +#elif defined (__AVR_AT90PWM2__) +#elif defined (__AVR_AT90PWM2B__) +#elif defined (__AVR_AT90PWM3__) +#elif defined (__AVR_AT90PWM3B__) +#elif defined (__AVR_AT90PWM216__) +#elif defined (__AVR_AT90PWM316__) +#elif defined (__AVR_ATmega32C1__) +#elif defined (__AVR_ATmega32M1__) +#elif defined (__AVR_ATmega32U4__) + #define _AVR_CPU_NAME_ "ATmega32U4" +#elif defined (__AVR_ATmega32U6__) + #define _AVR_CPU_NAME_ "ATmega32U6" +#elif defined (__AVR_ATmega128__) + #define _AVR_CPU_NAME_ "Atmega128" +#elif defined (__AVR_ATmega1280__) + #define _AVR_CPU_NAME_ "ATmega1280" +#elif defined (__AVR_ATmega1281__) + #define _AVR_CPU_NAME_ "ATmega1281" +#elif defined (__AVR_ATmega1284P__) + #define _AVR_CPU_NAME_ "ATmega1284" +#elif defined (__AVR_ATmega2560__) + #define _AVR_CPU_NAME_ "ATmega2560" +#elif defined (__AVR_ATmega2561__) + #define _AVR_CPU_NAME_ "ATmega2561" +#elif defined (__AVR_AT90CAN32__) + #define _AVR_CPU_NAME_ "AT90CAN32" +#elif defined (__AVR_AT90CAN64__) + #define _AVR_CPU_NAME_ "AT90CAN64" +#elif defined (__AVR_AT90CAN128__) + #define _AVR_CPU_NAME_ "AT90CAN128" +#elif defined (__AVR_AT90USB82__) + #define _AVR_CPU_NAME_ "AT90USB82" +#elif defined (__AVR_AT90USB162__) + #define _AVR_CPU_NAME_ "AT90USB162" +#elif defined (__AVR_AT90USB646__) + #define _AVR_CPU_NAME_ "AT90USB646" +#elif defined (__AVR_AT90USB647__) + #define _AVR_CPU_NAME_ "AT90USB647" +#elif defined (__AVR_AT90USB1286__) + #define _AVR_CPU_NAME_ "AT90USB1286" +#elif defined (__AVR_AT90USB1287__) + #define _AVR_CPU_NAME_ "AT90USB1287" +#elif defined (__AVR_ATmega64__) + #define _AVR_CPU_NAME_ "ATmega64" +#elif defined (__AVR_ATmega640__) + #define _AVR_CPU_NAME_ "ATmega640" +#elif defined (__AVR_ATmega644__) + #define _AVR_CPU_NAME_ "ATmega644" +#elif defined (__AVR_ATmega644P__) + #define _AVR_CPU_NAME_ "ATmega644P" +#elif defined (__AVR_ATmega645__) + #define _AVR_CPU_NAME_ "ATmega645" +#elif defined (__AVR_ATmega6450__) + #define _AVR_CPU_NAME_ "ATmega6450" +#elif defined (__AVR_ATmega649__) + #define _AVR_CPU_NAME_ "ATmega649" +#elif defined (__AVR_ATmega6490__) + #define _AVR_CPU_NAME_ "ATmega6490" +#elif defined (__AVR_ATmega103__) + #define _AVR_CPU_NAME_ "ATmega103" +#elif defined (__AVR_ATmega32__) + #define _AVR_CPU_NAME_ "Atmega32" +#elif defined (__AVR_ATmega323__) + #define _AVR_CPU_NAME_ "ATmega323" +#elif defined (__AVR_ATmega324P__) + #define _AVR_CPU_NAME_ "ATmega324P" +#elif defined (__AVR_ATmega325__) + #define _AVR_CPU_NAME_ "ATmega325" +#elif defined (__AVR_ATmega325P__) + #define _AVR_CPU_NAME_ "ATmega325P" +#elif defined (__AVR_ATmega3250__) + #define _AVR_CPU_NAME_ "ATmega3250" +#elif defined (__AVR_ATmega3250P__) + #define _AVR_CPU_NAME_ "ATmega3250P" +#elif defined (__AVR_ATmega328P__) + #define _AVR_CPU_NAME_ "ATmega328P" +#elif defined (__AVR_ATmega329__) + #define _AVR_CPU_NAME_ "ATmega329" +#elif defined (__AVR_ATmega329P__) + #define _AVR_CPU_NAME_ "ATmega329P" +#elif defined (__AVR_ATmega3290__) + #define _AVR_CPU_NAME_ "ATmega3290" +#elif defined (__AVR_ATmega3290P__) + #define _AVR_CPU_NAME_ "ATmega3290P" +#elif defined (__AVR_ATmega32HVB__) + #define _AVR_CPU_NAME_ "ATmega32HVB" +#elif defined (__AVR_ATmega406__) + #define _AVR_CPU_NAME_ "ATmega406" +#elif defined (__AVR_ATmega16__) + #define _AVR_CPU_NAME_ "Atmega16" +#elif defined (__AVR_ATmega161__) + #define _AVR_CPU_NAME_ "ATmega161" +#elif defined (__AVR_ATmega162__) + #define _AVR_CPU_NAME_ "ATmega162" +#elif defined (__AVR_ATmega163__) + #define _AVR_CPU_NAME_ "ATmega163" +#elif defined (__AVR_ATmega164P__) + #define _AVR_CPU_NAME_ "ATmega164P" +#elif defined (__AVR_ATmega165__) + #define _AVR_CPU_NAME_ "ATmega165" +#elif defined (__AVR_ATmega165P__) + #define _AVR_CPU_NAME_ "ATmega165P" +#elif defined (__AVR_ATmega168__) + #define _AVR_CPU_NAME_ "ATmega168" +#elif defined (__AVR_ATmega168P__) + #define _AVR_CPU_NAME_ "ATmega168P" +#elif defined (__AVR_ATmega169__) + #define _AVR_CPU_NAME_ "Atmega169" +#elif defined (__AVR_ATmega169P__) + #define _AVR_CPU_NAME_ "ATmega169P" +#elif defined (__AVR_ATmega8HVA__) + #define _AVR_CPU_NAME_ "ATmega8HVA" +#elif defined (__AVR_ATmega16HVA__) + #define _AVR_CPU_NAME_ "ATmega16HVA" +#elif defined (__AVR_ATmega8__) + #define _AVR_CPU_NAME_ "ATmega8" +#elif defined (__AVR_ATmega48__) + #define _AVR_CPU_NAME_ "ATmega48" +#elif defined (__AVR_ATmega48P__) + #define _AVR_CPU_NAME_ "ATmega48P" +#elif defined (__AVR_ATmega88__) + #define _AVR_CPU_NAME_ "ATmega88" +#elif defined (__AVR_ATmega88P__) + #define _AVR_CPU_NAME_ "ATmega88P" +#elif defined (__AVR_ATmega8515__) + #define _AVR_CPU_NAME_ "ATmega8515" +#elif defined (__AVR_ATmega8535__) + #define _AVR_CPU_NAME_ "ATmega8535" +#elif defined (__AVR_AT90S8535__) +#elif defined (__AVR_AT90C8534__) +#elif defined (__AVR_AT90S8515__) +#elif defined (__AVR_AT90S4434__) +#elif defined (__AVR_AT90S4433__) +#elif defined (__AVR_AT90S4414__) +#elif defined (__AVR_ATtiny22__) +#elif defined (__AVR_ATtiny26__) +#elif defined (__AVR_AT90S2343__) +#elif defined (__AVR_AT90S2333__) +#elif defined (__AVR_AT90S2323__) +#elif defined (__AVR_AT90S2313__) +#elif defined (__AVR_ATtiny2313__) + #define _AVR_CPU_NAME_ "ATtiny2313" +#elif defined (__AVR_ATtiny13__) +#elif defined (__AVR_ATtiny13A__) +#elif defined (__AVR_ATtiny25__) +#elif defined (__AVR_ATtiny45__) +#elif defined (__AVR_ATtiny85__) +#elif defined (__AVR_ATtiny24__) +#elif defined (__AVR_ATtiny44__) +#elif defined (__AVR_ATtiny84__) +#elif defined (__AVR_ATtiny261__) +#elif defined (__AVR_ATtiny461__) +#elif defined (__AVR_ATtiny861__) +#elif defined (__AVR_ATtiny43U__) +#elif defined (__AVR_ATtiny48__) +#elif defined (__AVR_ATtiny88__) +#elif defined (__AVR_ATtiny167__) + +#else + #error cpu not defined +#endif + + +#if !defined (_AVR_CPU_NAME_) +// #define _AVR_CPU_NAME_ "UNKNOWN" +#endif diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Constants/ATS_Constants.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Constants/ATS_Constants.pde new file mode 100644 index 0000000..d58e8ba --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Constants/ATS_Constants.pde @@ -0,0 +1,76 @@ +//************************************************************************ +//* Arduino Test of Arduino Constants +//* (C) 2010 by Rick Anderson +//* Open source as per standard Arduino code +//* +//************************************************************************ +//* Oct 16, 2010 Test of Arduino Constants +//************************************************************************ + +#include "WProgram.h" +#include "HardwareSerial.h" +#include + +//************************************************************************ +void setup() +{ + int startMemoryUsage; + + //Start memory usage must be site prior to ATS_begin + startMemoryUsage = ATS_GetFreeMemory(); + ATS_begin("Arduino", "Test of Arduino Constants"); + /* + * Test Run Start + */ + + + //test true constant + ATS_PrintTestStatus("1. Test of true constant", true == 1); + + //test false consts + ATS_PrintTestStatus( "2. Test of false constant", false == 0); + + //Test of HIGH == 1 + ATS_PrintTestStatus( "3. Test of HIGH == 1", HIGH == 1); + + //Test of LOW == 0 + ATS_PrintTestStatus( "4. Test of LOW == 0", LOW == 0); + + //Test of INPUT == 1 + ATS_PrintTestStatus( "5. Test of INPUT == 1", HIGH == 1); + + //Test of OUTPUT == 0 + ATS_PrintTestStatus( "6. Test of OUTPUT == 0", LOW == 0); + + //test decimal + ATS_PrintTestStatus( "7. Test of decimal constant", 101 == ((1 * pow(10,2)) + (0 * pow(10,1)) + 1)); + + //test binary + ATS_PrintTestStatus( "8. Test of binary constant", B101 == 5); + + //test octal + ATS_PrintTestStatus( "9. Test of octal constant", 0101 == 65); + + //test hexadecimal + ATS_PrintTestStatus( "7. Test of hexadecimal constant", (0x101 == 257)); + + /* + * Test Run End + */ + ATS_ReportMemoryUsage(startMemoryUsage); + ATS_end(); + +} + + +//************************************************************************ +void loop() +{ + + +} + + + + + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Delay/ATS_Delay.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Delay/ATS_Delay.pde new file mode 100644 index 0000000..8ac9fd2 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Delay/ATS_Delay.pde @@ -0,0 +1 @@ +//************************************************************************ //* Arduino Test Suite //* ATS_ToneTest //* //* Copyright (c) 2010 Mark Sproul All right reserved. //* //* This library is free software; you can redistribute it and/or //* modify it under the terms of the GNU Lesser General Public //* License as published by the Free Software Foundation; either //* version 2.1 of the License, or (at your option) any later version. //* //* This library is distributed in the hope that it will be useful, //* but WITHOUT ANY WARRANTY; without even the implied warranty of //* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU //* Lesser General Public License for more details. //* //* You should have received a copy of the GNU Lesser General Public //* License along with this library; if not, write to the Free Software //* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA //************************************************************************ //* Aug 31, 2010 Started on TestArduino //* Oct 28, 2010 Started on Delay //************************************************************************ #include "WProgram.h" #include "HardwareSerial.h" #include //************************************************************************ void setup() { short ii; short testNum; int startMemoryUsage; unsigned long startMillis; unsigned long endMillis; unsigned long deltaMillis; unsigned long errMillis; boolean passed; char testNameString[80]; startMemoryUsage = ATS_GetFreeMemory(); ATS_begin("Arduino", "DelayTest"); testNum = 1; //* we start at 2 because 0/1 are RXD/TXD for (ii=0; ii<1000; ii+= 15) { startMillis = millis(); delay(ii); endMillis = millis(); deltaMillis = endMillis - startMillis; if (deltaMillis >= ii) { errMillis = deltaMillis - ii; } else { errMillis = ii - deltaMillis; } if (errMillis <= 1) { passed = true; } else { passed = false; } sprintf(testNameString, "DelayTest.%02d (delay= %4d actual delay=%ld err=%ld)", testNum, ii, deltaMillis, errMillis); ATS_PrintTestStatus(testNameString, passed); testNum++; } ATS_ReportMemoryUsage(startMemoryUsage); ATS_end(); } //************************************************************************ void loop() { } \ No newline at end of file diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_General/ATS_General.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_General/ATS_General.pde new file mode 100644 index 0000000..502248a --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_General/ATS_General.pde @@ -0,0 +1,94 @@ +//************************************************************************ +//* Arduino Test Suite +//* (C) 2010 by Mark Sproul +//* Open source as per standard Arduino code +//* +//************************************************************************ +//* Aug 31, 2010 Started on TestArduino +//* Oct 18, 2010 Added memory testing +//************************************************************************ + +#include "WProgram.h" +#include "HardwareSerial.h" +#include "pins_arduino.h" +#include +#include "avr_cpunames.h" + + +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#define kBoard_PinCount 20 +#define kBoard_AnalogCount 6 +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define kBoard_PinCount 70 +#define kBoard_AnalogCount 16 +#endif + + + + +//************************************************************************ +void setup() +{ + short ii; + uint8_t timerNumber; + int startMemoryUsage; + + startMemoryUsage = ATS_GetFreeMemory(); + + ATS_begin("Arduino", "general"); + + //* test digital pins + //* we start at 2 because 0/1 are RXD/TXD + for (ii=2; ii 1) + ATS_TestSerialLoopback(&Serial1, "Serial1"); +#endif +#if (SERIAL_PORT_COUNT > 2) + ATS_TestSerialLoopback(&Serial2, "Serial2"); +#endif +#if (SERIAL_PORT_COUNT > 3) + ATS_TestSerialLoopback(&Serial3, "Serial3"); +#endif + + ATS_Test_EEPROM(); + + + ATS_ReportMemoryUsage(startMemoryUsage); + + ATS_end(); + +} + + +//************************************************************************ +void loop() +{ + + +} + + + + + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_File/ATS_SD_File.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_File/ATS_SD_File.pde new file mode 100644 index 0000000..fefd6b0 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_File/ATS_SD_File.pde @@ -0,0 +1,106 @@ +// Tests writing to and reading from a file, in particular the +// the Stream implementation (e.g. read() and peek()). + +#include +#include + +void setup() +{ + int startMemoryUsage = ATS_GetFreeMemory(); + boolean b; + File f; + + ATS_begin("Arduino", "SD Test"); + + ATS_PrintTestStatus("SD.begin()", b = SD.begin(4)); + if (!b) goto done; + + SD.remove("test.txt"); + + f = SD.open("test.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + f.print("abc"); + f.print("de"); + f.close(); + + f = SD.open("test.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + f.print("fgh"); + f.close(); + + f = SD.open("test.txt"); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + ATS_PrintTestStatus("read()", f.read() == 'a'); + ATS_PrintTestStatus("peek()", f.peek() == 'b'); + ATS_PrintTestStatus("read()", f.read() == 'b'); + ATS_PrintTestStatus("read()", f.read() == 'c'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("peek()", f.peek() == 'd'); + ATS_PrintTestStatus("read()", f.read() == 'd'); + ATS_PrintTestStatus("available()", f.available() != 0); + ATS_PrintTestStatus("read()", f.read() == 'e'); + ATS_PrintTestStatus("available()", f.available() != 0); + ATS_PrintTestStatus("peek()", f.peek() == 'f'); + ATS_PrintTestStatus("read()", f.read() == 'f'); + ATS_PrintTestStatus("peek()", f.peek() == 'g'); + ATS_PrintTestStatus("available()", f.available() != 0); + ATS_PrintTestStatus("peek()", f.peek() == 'g'); + ATS_PrintTestStatus("read()", f.read() == 'g'); + ATS_PrintTestStatus("available()", f.available() != 0); + ATS_PrintTestStatus("available()", f.available() != 0); + ATS_PrintTestStatus("available()", f.available() != 0); + ATS_PrintTestStatus("peek()", f.peek() == 'h'); + ATS_PrintTestStatus("read()", f.read() == 'h'); + ATS_PrintTestStatus("available()", f.available() == 0); + ATS_PrintTestStatus("peek()", f.peek() == -1); + ATS_PrintTestStatus("read()", f.read() == -1); + ATS_PrintTestStatus("peek()", f.peek() == -1); + ATS_PrintTestStatus("read()", f.read() == -1); + + f.close(); + + SD.remove("test2.txt"); + + f = SD.open("test2.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + f.print("ABC"); + f.close(); + + f = SD.open("test.txt"); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + ATS_PrintTestStatus("peek()", f.peek() == 'a'); + + f.close(); + + f = SD.open("test2.txt"); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + ATS_PrintTestStatus("peek()", f.peek() == 'A'); + ATS_PrintTestStatus("read()", f.read() == 'A'); + + f.close(); + +done: + ATS_ReportMemoryUsage(startMemoryUsage); + ATS_end(); + +} + +void loop() {} + + + + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde new file mode 100644 index 0000000..c3804f4 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Files/ATS_SD_Files.pde @@ -0,0 +1,78 @@ +#include +#include + +void setup() +{ + int startMemoryUsage = ATS_GetFreeMemory(); + boolean b; + File f; + + ATS_begin("Arduino", "SD Files Test"); + + ATS_PrintTestStatus("SD.begin()", b = SD.begin(4)); + if (!b) goto done; + + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf.txt")); + ATS_PrintTestStatus("SD.open()", f = SD.open("asdf.txt", FILE_WRITE)); f.close(); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf.txt")); + ATS_PrintTestStatus("SD.exists()", SD.exists("/asdf.txt")); + ATS_PrintTestStatus("SD.remove()", SD.remove("asdf.txt")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf.txt")); + + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + ATS_PrintTestStatus("SD.mkdir()", SD.mkdir("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("/asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf/")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("asdf")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + + ATS_PrintTestStatus("SD.mkdir()", SD.mkdir("x/y/z")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y/z")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y/z/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("/x/y/z/")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("x/y/z")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x/y")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y/z")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("x/y/")); + ATS_PrintTestStatus("SD.exists()", SD.exists("x")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y/z")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("/x")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("x/y/z")); + + ATS_PrintTestStatus("!SD.open()", !(f = SD.open("asdf/asdf.txt", FILE_WRITE))); f.close(); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf.txt")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("SD.mkdir()", SD.mkdir("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.open()", f = SD.open("asdf/asdf.txt", FILE_WRITE)); f.close(); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("!SD.rmdir()", !SD.rmdir("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("SD.remove()", SD.remove("asdf/asdf.txt")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf/asdf.txt")); + ATS_PrintTestStatus("SD.exists()", SD.exists("asdf")); + ATS_PrintTestStatus("SD.rmdir()", SD.rmdir("asdf")); + ATS_PrintTestStatus("!SD.exists()", !SD.exists("asdf")); + +done: + ATS_ReportMemoryUsage(startMemoryUsage); + ATS_end(); + +} + +void loop() {} + + + + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde new file mode 100644 index 0000000..5b0916c --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_SD_Seek/ATS_SD_Seek.pde @@ -0,0 +1,109 @@ +// Tests writing to and reading from a file, in particular the +// the Stream implementation (e.g. read() and peek()). + +#include +#include + +void setup() +{ + int startMemoryUsage = ATS_GetFreeMemory(); + boolean b; + File f; + + ATS_begin("Arduino", "SD Test"); + + ATS_PrintTestStatus("SD.begin()", b = SD.begin(4)); + if (!b) goto done; + + SD.remove("test.txt"); + + f = SD.open("test.txt", FILE_WRITE); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + ATS_PrintTestStatus("initial position", f.position() == 0); + ATS_PrintTestStatus("initial size", f.size() == 0); + + f.print("0123456789"); + + ATS_PrintTestStatus("position after writing", f.position() == 10); + ATS_PrintTestStatus("size after writing", f.size() == 10); + + f.seek(0); + + ATS_PrintTestStatus("size after seek", f.size() == 10); + ATS_PrintTestStatus("position after seek", f.position() == 0); + + f.seek(7); + + ATS_PrintTestStatus("position after seek", f.position() == 7); + ATS_PrintTestStatus("reading after seek", f.read() == '7'); + ATS_PrintTestStatus("position after reading after seeking", f.position() == 8); + ATS_PrintTestStatus("reading after reading after seeking", f.read() == '8'); + + f.seek(3); + + ATS_PrintTestStatus("position after seeking", f.position() == 3); + ATS_PrintTestStatus("peeking after seeking", f.peek() == '3'); + ATS_PrintTestStatus("position after peeking after seeking", f.position() == 3); + ATS_PrintTestStatus("peeking after peeking after seeking", f.peek() == '3'); + ATS_PrintTestStatus("position after peeking after seeking", f.position() == 3); + ATS_PrintTestStatus("peeking after peeking after seeking", f.read() == '3'); + ATS_PrintTestStatus("position after peeking after seeking", f.position() == 4); + + f.seek(1); + + ATS_PrintTestStatus("position after seeking", f.position() == 1); + ATS_PrintTestStatus("peeking after seeking", f.peek() == '1'); + + f.seek(4); + + ATS_PrintTestStatus("position after seeking", f.position() == 4); + ATS_PrintTestStatus("peeking after seeking", f.peek() == '4'); + + f.seek(7); + + ATS_PrintTestStatus("position()", f.position() == 7); + ATS_PrintTestStatus("read()", f.read() == '7'); + + f.seek(0); + f.peek(); + f.print("AB"); + + ATS_PrintTestStatus("position()", f.position() == 2); + ATS_PrintTestStatus("size()", f.size() == 10); + ATS_PrintTestStatus("read()", f.read() == '2'); + + f.seek(0); + + ATS_PrintTestStatus("read()", f.read() == 'A'); + ATS_PrintTestStatus("read()", f.read() == 'B'); + ATS_PrintTestStatus("read()", f.read() == '2'); + + f.close(); + + f = SD.open("test.txt"); + ATS_PrintTestStatus("SD.open()", f); + if (!f) goto done; + + ATS_PrintTestStatus("position()", f.position() == 0); + ATS_PrintTestStatus("size()", f.size() == 10); + ATS_PrintTestStatus("peek()", f.peek() == 'A'); + ATS_PrintTestStatus("read()", f.read() == 'A'); + + f.seek(4); + + ATS_PrintTestStatus("position()", f.position() == 4); + ATS_PrintTestStatus("size()", f.size() == 10); + ATS_PrintTestStatus("peek()", f.peek() == '4'); + ATS_PrintTestStatus("read()", f.read() == '4'); + + f.close(); + +done: + ATS_ReportMemoryUsage(startMemoryUsage); + ATS_end(); + +} + +void loop() {} diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Skeleton/ATS_Skeleton.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Skeleton/ATS_Skeleton.pde new file mode 100644 index 0000000..33fc816 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_Skeleton/ATS_Skeleton.pde @@ -0,0 +1,52 @@ +//************************************************************************ +//* Arduino Test Example Skeleton +//* (C) 2010 by Rick Anderson +//* Open source as per standard Arduino code +//* +//************************************************************************ +//* Oct 16, 2010 Started on String Test +//************************************************************************ + +#include "WProgram.h" +#include "HardwareSerial.h" +#include + +//************************************************************************ +void setup() +{ + int startMemoryUsage; + + //startMemoryUsage must be set directly before ATS_begin + startMemoryUsage = ATS_GetFreeMemory(); + ATS_begin("Arduino", "Skeleton Test"); + /* + * Test Run Start + * Test one passes because result is set to true + * Test two fails becuase result is set to false + * You can test memory for any set of tests by using the ATS_ReportMemoryUsage test + * There is also a way to print current memeory for debugging + */ + ATS_PrintTestStatus("1. Test of true test status", true); + + ATS_PrintTestStatus("2. Test of false test status, this will fail.", false); + + ATS_ReportMemoryUsage(startMemoryUsage); + /* + * Test Run End + */ + + ATS_end(); + +} + + +//************************************************************************ +void loop() +{ + + +} + + + + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_StringIndexOfMemory/ATS_StringIndexOfMemory.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_StringIndexOfMemory/ATS_StringIndexOfMemory.pde new file mode 100644 index 0000000..71a6bea --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_StringIndexOfMemory/ATS_StringIndexOfMemory.pde @@ -0,0 +1,102 @@ +//************************************************************************ +//* Arduino Test Example Skeleton +//* (C) 2010 by Rick Anderson +//* Open source as per standard Arduino code +//* +//************************************************************************ +//* Oct 16, 2010 Started on String Test +//************************************************************************ + +#include "WProgram.h" +#include "HardwareSerial.h" +#include + +//************************************************************************ +void setup() +{ + char testName[64]; + int startMemoryUsage; + /* + * Create variable for the tests. + */ + + + String stringOne; + int firstClosingBracket; + int firstOpeningBracket; + int secondOpeningBracket; + int secondClosingBracket; + int bodyTag; + int firstListItem; + int secondListItem; + int lastOpeningBracket; + int lastListItem; + int lastParagraph; + int secondLastGraf; + + /*; + * initiate the test run + */ + startMemoryUsage = ATS_GetFreeMemory(); + ATS_begin("Arduino", "String Memory Test"); + // indexOf() returns the position (i.e. index) of a particular character + // in a string. For example, if you were parsing HTML tags, you could use it: + stringOne = ""; + firstClosingBracket = stringOne.indexOf('>'); + Serial.println("The index of > in the string " + stringOne + " is " + firstClosingBracket); + + stringOne = ""; + secondOpeningBracket = firstClosingBracket + 1; + secondClosingBracket = stringOne.indexOf('>', secondOpeningBracket ); + Serial.println("The index of the second > in the string " + stringOne + " is " + secondClosingBracket); + + // you can also use indexOf() to search for Strings: + stringOne = ""; + bodyTag = stringOne.indexOf(""); + Serial.println("The index of the body tag in the string " + stringOne + " is " + bodyTag); + + stringOne = "

    "; + firstListItem = stringOne.indexOf("
  • "); + secondListItem = stringOne.indexOf("item", firstListItem + 1 ); + Serial.println("The index of the second list item in the string " + stringOne + " is " + secondClosingBracket); + + // lastIndexOf() gives you the last occurrence of a character or string: + lastOpeningBracket = stringOne.lastIndexOf('<'); + Serial.println("The index of the last < in the string " + stringOne + " is " + lastOpeningBracket); + + lastListItem = stringOne.lastIndexOf("
  • "); + Serial.println("The index of the last list item in the string " + stringOne + " is " + lastListItem); + + + // lastIndexOf() can also search for a string: + stringOne = "

    Lorem ipsum dolor sit amet

    Ipsem

    Quod

    "; + lastParagraph = stringOne.lastIndexOf(" Started on String Test +//************************************************************************ + +#include "WProgram.h" +#include "HardwareSerial.h" +#include + +//************************************************************************ +void setup() +{ + + int startMemoryUsage; + + ATS_begin("Arduino", "Test of String Library"); + + /* + * Test Variable Setup + * Best practive set all your test variables prior to teseting. + * This is required for Memory tests. + */ + + String stringOne = String("stringThree = "); + String stringTwo = String("this string"); + String stringThree = String (); + char charResult[100]; + + + + /* + * Run the tests + */ + + // adding a constant integer to a string: + stringThree = stringOne + 123; + //strcpy(charResult, "\0"); + stringThree.toCharArray(charResult, sizeof(charResult)); + + ATS_PrintTestStatus("1. Adding a constant integer to a string:", strcmp(charResult,"stringThree = 123" ) == 0); + + // adding a constant long interger to a string: + stringThree = stringOne + 123456789; + stringThree.toCharArray(charResult, sizeof(charResult)); + + ATS_PrintTestStatus("2. Adding a constant long interger to a string", strcmp(charResult,"stringThree = 123456789" ) == 0); + + + // adding a constant character to a string: + stringThree = stringOne + 'A'; + stringThree.toCharArray(charResult, sizeof(charResult)); + + ATS_PrintTestStatus("3. Adding a constant character to a string", strcmp(charResult,"stringThree = A" ) == 0); + + + // adding a constant string to a string: + stringThree = stringOne + "abc"; + stringThree.toCharArray(charResult, sizeof(charResult)); + + ATS_PrintTestStatus("4. Adding a constant string variable to a string", strcmp(charResult,"stringThree = abc" ) == 0); + + //"5. Adding a constant long interger to a string" + stringThree = stringOne + stringTwo; + stringThree.toCharArray(charResult, sizeof(charResult)); + + ATS_PrintTestStatus("5. Adding a constant long interger to a string", strcmp(charResult,"stringThree = this string" ) == 0); + + + /* + * setup up String Comparison Operater Tests + */ + + stringOne = String("this"); + stringTwo = String("that"); + + // two strings equal: + ATS_PrintTestStatus("6. Two strings equal",stringOne == "this"); + + // two strings not equal: + ATS_PrintTestStatus("7. Two strings not equal",stringOne != stringTwo); + + // two strings not equal (case sensitivity matters): + stringOne = "This"; + stringTwo = "this"; + ATS_PrintTestStatus("8. Two strings not equal [case sensitivity matters]", stringOne != stringTwo); + + // you can also use equals() to see if two strings are the same: + stringOne = "this"; + stringTwo = "this"; + ATS_PrintTestStatus("9. Equals() method equals", stringOne.equals(stringTwo)); + + + // you can also use not equals() to see if two strings are not the same: + stringOne = String("This"); + stringTwo = String("this"); + ATS_PrintTestStatus("10. Not equals() method equals", !stringOne.equals(stringTwo)); + + // or perhaps you want to ignore case: + ATS_PrintTestStatus("11. EqualsIgnoreCase() method equals", stringOne.equalsIgnoreCase(stringTwo)); + + // a numeric string compared to the number it represents: + stringOne = "1"; + int numberOne = 1; + ATS_PrintTestStatus("12. A numeric string compared to the number it represents", stringOne == numberOne); + + // two numeric strings compared: + stringOne = "2"; + stringTwo = "1"; + ATS_PrintTestStatus("13. Two numeric strings compared",stringOne >= stringTwo); + + + // comparison operators can be used to compare strings for alphabetic sorting too: + +/* + stringOne = String("Brown"); + ATS_PrintTestStatus("14. comparison operator < can be used to compare strings for alphabetic sorting ",stringOne < "Charles"); + ATS_PrintTestStatus("15. comparison operator > can be used to compare strings for alphabetic sorting ",stringOne > "Adams"); + ATS_PrintTestStatus("16. comparison operator <= can be used to compare strings for alphabetic sorting ",stringOne <= "Browne"); + ATS_PrintTestStatus("17. comparison operator >= can be used to compare strings for alphabetic sorting ",stringOne >= "Brow"); + */ + + + // the compareTo() operator also allows you to compare strings + stringOne = "Cucumber"; + stringTwo = "Cucuracha"; + + ATS_PrintTestStatus("18. The compareTo() operator also allows you to compare strings", stringOne.compareTo(stringTwo) < 0); + + // compareTo() String with numnber > String with number: + stringOne = "Sensor: 50"; + stringTwo= "Sensor: 150"; + ATS_PrintTestStatus("19. The compareTo() String with integers", stringOne.compareTo(stringTwo) < 0); + + +// compareTo() String with numnber > String with number append integer, matches example code: + stringOne = "Sensor: "; + stringTwo= "Sensor: "; + stringOne += 50; + stringTwo += 150; + ATS_PrintTestStatus("20. The compareTo() compare strings with appended integers", stringOne.compareTo(stringTwo) < 0); + + + /* + * setup up String Append Operation Tests + */ + // Serious awful problem here + stringOne = String("Sensor "); + stringTwo = String("value"); + + stringOne += stringTwo; + ATS_PrintTestStatus("21. Adding string to string += ", stringOne.equals("Sensor value")); + + ATS_PrintTestStatus("22. The compareTo() compare strings with appended integers", stringOne.compareTo(stringTwo) < 0); + /* + * Test complete + */ + + ATS_end(); + +} + + +//************************************************************************ +void loop() +{ + + +} + + + + + + + + + + + + diff --git a/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_ToneTest/ATS_ToneTest.pde b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_ToneTest/ATS_ToneTest.pde new file mode 100644 index 0000000..8bec6be --- /dev/null +++ b/arduino-0022-linux-x64/libraries/ArduinoTestSuite/examples/ATS_ToneTest/ATS_ToneTest.pde @@ -0,0 +1,250 @@ +//************************************************************************ +//* Arduino Test Suite +//* ATS_ToneTest +//* +//* Copyright (c) 2010 Mark Sproul All right reserved. +//* +//* This library is free software; you can redistribute it and/or +//* modify it under the terms of the GNU Lesser General Public +//* License as published by the Free Software Foundation; either +//* version 2.1 of the License, or (at your option) any later version. +//* +//* This library is distributed in the hope that it will be useful, +//* but WITHOUT ANY WARRANTY; without even the implied warranty of +//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//* Lesser General Public License for more details. +//* +//* You should have received a copy of the GNU Lesser General Public +//* License along with this library; if not, write to the Free Software +//* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +//************************************************************************ +//* Aug 31, 2010 Started on TestArduino +//* Oct 23, 2010 Started on ToneTest +//************************************************************************ + + + + + +#include "WProgram.h" +#include "HardwareSerial.h" + +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) + #define kBoard_PinCount 20 + #define kBoard_AnalogCount 6 +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define kBoard_PinCount 70 + #define kBoard_AnalogCount 16 +#endif + +#include + +//************************************************************************ +void TestTonePin(uint8_t toneOutputPinNumber) +{ +uint8_t helperpin; +unsigned long startMilliSecs; +unsigned long highCount, lowCount; +int previousState; +int currentState; +char testNameString[80]; +long outputFreq; +long measuredFreq; +boolean passed; +long percentError; +long deltaFreq; + + if ((toneOutputPinNumber % 2) == 0) + { + //* if its EVEN, add 1 + helperpin = toneOutputPinNumber + 1; + } + else + { + //* if its ODD + helperpin = toneOutputPinNumber - 1; + } + + //* dont set the mode of the OUTPUT pin, the tone command does that + + pinMode(helperpin, INPUT); + + previousState = digitalRead(helperpin); + startMilliSecs = millis(); + highCount = 0; + lowCount = 0; + measuredFreq = 0; + //* we are going to watch for one second + outputFreq = random(200, 2000); + + tone(toneOutputPinNumber, outputFreq); + while ((millis() - startMilliSecs) < 1000) + { + currentState = digitalRead(helperpin); + if (currentState == HIGH) + { + highCount++; + } + else + { + lowCount++; + } + //* check to see if it changed state + if ((currentState == HIGH) && (previousState == LOW)) + { + measuredFreq++; + } + + previousState = currentState; + } + noTone(toneOutputPinNumber); + + deltaFreq = abs(measuredFreq - outputFreq); + + percentError = 100 - abs(((outputFreq - deltaFreq) * 100) / outputFreq); + + sprintf(testNameString, "ToneTest.%02d (out freq= %4ld measured freq= %4ld err= %ld%%)", toneOutputPinNumber, outputFreq, measuredFreq, percentError); + if (percentError < 5) + { + passed = true; + } + else + { + passed = false; + } + + ATS_PrintTestStatus(testNameString, passed); +} + + +//************************************************************************ +//* this test to make sure the duration option works +void TestToneDuration(uint8_t toneOutputPinNumber) +{ +uint8_t helperpin; +unsigned long startMilliSecs; +unsigned long highCount, lowCount; +int previousState; +int currentState; +char testNameString[80]; +long outputFreq; +long measuredFreq; +boolean passed; +long percentError; +long deltaFreq; +long durationTime; + + if ((toneOutputPinNumber % 2) == 0) + { + //* if its EVEN, add 1 + helperpin = toneOutputPinNumber + 1; + } + else + { + //* if its ODD + helperpin = toneOutputPinNumber - 1; + } + + //* dont set the mode of the OUTPUT pin, the tone command does that + + pinMode(helperpin, INPUT); + + previousState = digitalRead(helperpin); + startMilliSecs = millis(); + highCount = 0; + lowCount = 0; + measuredFreq = 0; + durationTime = 0; + //* we are going to watch for one second + outputFreq = random(500, 2000); + + tone(toneOutputPinNumber, outputFreq, 1000); + while ((millis() - startMilliSecs) < 2000) + { + currentState = digitalRead(helperpin); + if (currentState == HIGH) + { + highCount++; + } + else + { + lowCount++; + } + //* count the freq + if ((currentState == HIGH) && (previousState == LOW)) + { + measuredFreq++; + } + + //* check to see if it changed state + if (currentState != previousState) + { + durationTime = millis() - startMilliSecs; + } + + previousState = currentState; + } + + deltaFreq = abs(measuredFreq - outputFreq); + + percentError = 100 - abs(((outputFreq - deltaFreq) * 100) / outputFreq); + + sprintf(testNameString, "ToneTesDurationt.%02d (durationTime =%4ld/1000 freq err= %ld%%)", toneOutputPinNumber, durationTime, percentError); + if ((durationTime > 990) && (durationTime < 1010) && (percentError < 5)) + { + passed = true; + } + else + { + passed = false; + } + noTone(toneOutputPinNumber); + + ATS_PrintTestStatus(testNameString, passed); +} + + + +//************************************************************************ +void setup() +{ +short ii; +uint8_t timerNumber; +int startMemoryUsage; + + startMemoryUsage = ATS_GetFreeMemory(); + + ATS_begin("Arduino", "ToneTest"); + + + //* we start at 2 because 0/1 are RXD/TXD + for (ii=2; ii diff --git a/arduino-0018-linux-x64/libraries/EEPROM/examples/eeprom_read/eeprom_read.pde b/arduino-0022-linux-x64/libraries/EEPROM/examples/eeprom_read/eeprom_read.pde similarity index 93% rename from arduino-0018-linux-x64/libraries/EEPROM/examples/eeprom_read/eeprom_read.pde rename to arduino-0022-linux-x64/libraries/EEPROM/examples/eeprom_read/eeprom_read.pde index 2e30708..88e3488 100644 --- a/arduino-0018-linux-x64/libraries/EEPROM/examples/eeprom_read/eeprom_read.pde +++ b/arduino-0022-linux-x64/libraries/EEPROM/examples/eeprom_read/eeprom_read.pde @@ -3,6 +3,7 @@ * * Reads the value of each byte of the EEPROM and prints it * to the computer. + * This example code is in the public domain. */ #include diff --git a/arduino-0018-linux-x64/libraries/EEPROM/examples/eeprom_write/eeprom_write.pde b/arduino-0022-linux-x64/libraries/EEPROM/examples/eeprom_write/eeprom_write.pde similarity index 100% rename from arduino-0018-linux-x64/libraries/EEPROM/examples/eeprom_write/eeprom_write.pde rename to arduino-0022-linux-x64/libraries/EEPROM/examples/eeprom_write/eeprom_write.pde diff --git a/arduino-0018-linux-x64/libraries/EEPROM/keywords.txt b/arduino-0022-linux-x64/libraries/EEPROM/keywords.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/EEPROM/keywords.txt rename to arduino-0022-linux-x64/libraries/EEPROM/keywords.txt diff --git a/arduino-0018-linux-x64/libraries/Ethernet/Client.cpp b/arduino-0022-linux-x64/libraries/Ethernet/Client.cpp similarity index 53% rename from arduino-0018-linux-x64/libraries/Ethernet/Client.cpp rename to arduino-0022-linux-x64/libraries/Ethernet/Client.cpp index 0511c7b..3b1084f 100644 --- a/arduino-0018-linux-x64/libraries/Ethernet/Client.cpp +++ b/arduino-0022-linux-x64/libraries/Ethernet/Client.cpp @@ -1,7 +1,7 @@ +#include "w5100.h" +#include "socket.h" + extern "C" { - #include "types.h" - #include "w5100.h" - #include "socket.h" #include "string.h" } @@ -11,71 +11,67 @@ extern "C" { #include "Client.h" #include "Server.h" -uint16_t Client::_srcport = 0; +uint16_t Client::_srcport = 1024; -Client::Client(uint8_t sock) { - _sock = sock; +Client::Client(uint8_t sock) : _sock(sock) { } -Client::Client(uint8_t *ip, uint16_t port) { - _ip = ip; - _port = port; - _sock = 255; +Client::Client(uint8_t *ip, uint16_t port) : _ip(ip), _port(port), _sock(MAX_SOCK_NUM) { } uint8_t Client::connect() { - if (_sock != 255) + if (_sock != MAX_SOCK_NUM) return 0; - + for (int i = 0; i < MAX_SOCK_NUM; i++) { - uint8_t s = getSn_SR(i); - if (s == SOCK_CLOSED || s == SOCK_FIN_WAIT) { + uint8_t s = W5100.readSnSR(i); + if (s == SnSR::CLOSED || s == SnSR::FIN_WAIT) { _sock = i; break; } } - - if (_sock == 255) + + if (_sock == MAX_SOCK_NUM) return 0; - + _srcport++; - if (_srcport + 1024 == 0) _srcport = 0; - socket(_sock, Sn_MR_TCP, _srcport + 1024, 0); - + if (_srcport == 0) _srcport = 1024; + socket(_sock, SnMR::TCP, _srcport, 0); + if (!::connect(_sock, _ip, _port)) { - _sock = 255; + _sock = MAX_SOCK_NUM; return 0; } - - while (status() != SOCK_ESTABLISHED) { + + while (status() != SnSR::ESTABLISHED) { delay(1); - if (status() == SOCK_CLOSED) { - _sock = 255; + if (status() == SnSR::CLOSED) { + _sock = MAX_SOCK_NUM; return 0; } } - + return 1; } void Client::write(uint8_t b) { - if (_sock != 255) + if (_sock != MAX_SOCK_NUM) send(_sock, &b, 1); } void Client::write(const char *str) { - if (_sock != 255) + if (_sock != MAX_SOCK_NUM) send(_sock, (const uint8_t *)str, strlen(str)); } void Client::write(const uint8_t *buf, size_t size) { - if (_sock != 255) + if (_sock != MAX_SOCK_NUM) send(_sock, buf, size); } int Client::available() { - if (_sock != 255) - return getSn_RX_RSR(_sock); + if (_sock != MAX_SOCK_NUM) + return W5100.getRXReceivedSize(_sock); return 0; } @@ -87,47 +83,50 @@ int Client::read() { return b; } +int Client::peek() { + uint8_t b; + if (!available()) + return -1; + ::peek(_sock, &b); + return b; +} + void Client::flush() { while (available()) read(); } void Client::stop() { - if (_sock == 255) + if (_sock == MAX_SOCK_NUM) return; - + // attempt to close the connection gracefully (send a FIN to other side) disconnect(_sock); unsigned long start = millis(); - + // wait a second for the connection to close - while (status() != SOCK_CLOSED && millis() - start < 1000) + while (status() != SnSR::CLOSED && millis() - start < 1000) delay(1); - + // if it hasn't closed, close it forcefully - if (status() != SOCK_CLOSED) + if (status() != SnSR::CLOSED) close(_sock); - + EthernetClass::_server_port[_sock] = 0; - _sock = 255; + _sock = MAX_SOCK_NUM; } uint8_t Client::connected() { - if (_sock == 255) { - return 0; - } else { - uint8_t s = status(); - return !(s == SOCK_LISTEN || s == SOCK_CLOSED || s == SOCK_FIN_WAIT || - (s == SOCK_CLOSE_WAIT && !available())); - } + if (_sock == MAX_SOCK_NUM) return 0; + + uint8_t s = status(); + return !(s == SnSR::LISTEN || s == SnSR::CLOSED || s == SnSR::FIN_WAIT || + (s == SnSR::CLOSE_WAIT && !available())); } uint8_t Client::status() { - if (_sock == 255) { - return SOCK_CLOSED; - } else { - return getSn_SR(_sock); - } + if (_sock == MAX_SOCK_NUM) return SnSR::CLOSED; + return W5100.readSnSR(_sock); } // the next three functions are a hack so we can compare the client returned @@ -136,13 +135,13 @@ uint8_t Client::status() { // library. uint8_t Client::operator==(int p) { - return _sock == 255; + return _sock == MAX_SOCK_NUM; } uint8_t Client::operator!=(int p) { - return _sock != 255; + return _sock != MAX_SOCK_NUM; } Client::operator bool() { - return _sock != 255; + return _sock != MAX_SOCK_NUM; } diff --git a/arduino-0018-linux-x64/libraries/Ethernet/Client.h b/arduino-0022-linux-x64/libraries/Ethernet/Client.h similarity index 70% rename from arduino-0018-linux-x64/libraries/Ethernet/Client.h rename to arduino-0022-linux-x64/libraries/Ethernet/Client.h index 7c0ccdf..f0080bd 100644 --- a/arduino-0018-linux-x64/libraries/Ethernet/Client.h +++ b/arduino-0022-linux-x64/libraries/Ethernet/Client.h @@ -1,31 +1,37 @@ -#ifndef Client_h -#define Client_h - +#ifndef client_h +#define client_h +#include "WProgram.h" #include "Print.h" -class Client : public Print { -private: - static uint16_t _srcport; - uint8_t _sock; - uint8_t *_ip; - uint16_t _port; +class Client : public Stream { + public: + Client(); Client(uint8_t); Client(uint8_t *, uint16_t); + uint8_t status(); uint8_t connect(); virtual void write(uint8_t); virtual void write(const char *str); virtual void write(const uint8_t *buf, size_t size); - int available(); - int read(); - void flush(); + virtual int available(); + virtual int read(); + virtual int peek(); + virtual void flush(); void stop(); uint8_t connected(); uint8_t operator==(int); uint8_t operator!=(int); operator bool(); + friend class Server; + +private: + static uint16_t _srcport; + uint8_t _sock; + uint8_t *_ip; + uint16_t _port; }; #endif diff --git a/arduino-0018-linux-x64/libraries/Ethernet/Ethernet.cpp b/arduino-0022-linux-x64/libraries/Ethernet/Ethernet.cpp similarity index 59% rename from arduino-0018-linux-x64/libraries/Ethernet/Ethernet.cpp rename to arduino-0022-linux-x64/libraries/Ethernet/Ethernet.cpp index cb74876..91cbacd 100644 --- a/arduino-0018-linux-x64/libraries/Ethernet/Ethernet.cpp +++ b/arduino-0022-linux-x64/libraries/Ethernet/Ethernet.cpp @@ -1,13 +1,11 @@ -extern "C" { - #include "types.h" - #include "w5100.h" -} - +#include "w5100.h" #include "Ethernet.h" // XXX: don't make assumptions about the value of MAX_SOCK_NUM. -uint8_t EthernetClass::_state[MAX_SOCK_NUM] = { 0, 0, 0, 0 }; -uint16_t EthernetClass::_server_port[MAX_SOCK_NUM] = { 0, 0, 0, 0 }; +uint8_t EthernetClass::_state[MAX_SOCK_NUM] = { + 0, 0, 0, 0 }; +uint16_t EthernetClass::_server_port[MAX_SOCK_NUM] = { + 0, 0, 0, 0 }; void EthernetClass::begin(uint8_t *mac, uint8_t *ip) { @@ -21,18 +19,18 @@ void EthernetClass::begin(uint8_t *mac, uint8_t *ip) void EthernetClass::begin(uint8_t *mac, uint8_t *ip, uint8_t *gateway) { - uint8_t subnet[] = { 255, 255, 255, 0 }; + uint8_t subnet[] = { + 255, 255, 255, 0 }; begin(mac, ip, gateway, subnet); } void EthernetClass::begin(uint8_t *mac, uint8_t *ip, uint8_t *gateway, uint8_t *subnet) { - iinchip_init(); - sysinit(0x55, 0x55); - setSHAR(mac); - setSIPR(ip); - setGAR(gateway); - setSUBR(subnet); + W5100.init(); + W5100.setMACAddress(mac); + W5100.setIPAddress(ip); + W5100.setGatewayIp(gateway); + W5100.setSubnetMask(subnet); } EthernetClass Ethernet; diff --git a/arduino-0018-linux-x64/libraries/Ethernet/Ethernet.h b/arduino-0022-linux-x64/libraries/Ethernet/Ethernet.h similarity index 83% rename from arduino-0018-linux-x64/libraries/Ethernet/Ethernet.h rename to arduino-0022-linux-x64/libraries/Ethernet/Ethernet.h index bdfc4dd..a91f1aa 100644 --- a/arduino-0018-linux-x64/libraries/Ethernet/Ethernet.h +++ b/arduino-0022-linux-x64/libraries/Ethernet/Ethernet.h @@ -1,10 +1,13 @@ -#ifndef Ethernet_h -#define Ethernet_h +#ifndef ethernet_h +#define ethernet_h #include +//#include "w5100.h" #include "Client.h" #include "Server.h" +#define MAX_SOCK_NUM 4 + class EthernetClass { private: public: diff --git a/arduino-0018-linux-x64/libraries/Ethernet/Server.cpp b/arduino-0022-linux-x64/libraries/Ethernet/Server.cpp similarity index 74% rename from arduino-0018-linux-x64/libraries/Ethernet/Server.cpp rename to arduino-0022-linux-x64/libraries/Ethernet/Server.cpp index d17a5d3..4271741 100644 --- a/arduino-0018-linux-x64/libraries/Ethernet/Server.cpp +++ b/arduino-0022-linux-x64/libraries/Ethernet/Server.cpp @@ -1,8 +1,7 @@ +#include "w5100.h" +#include "socket.h" extern "C" { - #include "types.h" - #include "w5100.h" - #include "socket.h" - #include "string.h" +#include "string.h" } #include "Ethernet.h" @@ -18,8 +17,8 @@ void Server::begin() { for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { Client client(sock); - if (client.status() == SOCK_CLOSED) { - socket(sock, Sn_MR_TCP, _port, 0); + if (client.status() == SnSR::CLOSED) { + socket(sock, SnMR::TCP, _port, 0); listen(sock); EthernetClass::_server_port[sock] = _port; break; @@ -30,19 +29,20 @@ void Server::begin() void Server::accept() { int listening = 0; - + for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { Client client(sock); - + if (EthernetClass::_server_port[sock] == _port) { - if (client.status() == SOCK_LISTEN) { + if (client.status() == SnSR::LISTEN) { listening = 1; - } else if (client.status() == SOCK_CLOSE_WAIT && !client.available()) { + } + else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) { client.stop(); } } } - + if (!listening) { begin(); } @@ -51,19 +51,20 @@ void Server::accept() Client Server::available() { accept(); - + for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { Client client(sock); if (EthernetClass::_server_port[sock] == _port && - client.status() == SOCK_ESTABLISHED) { + (client.status() == SnSR::ESTABLISHED || + client.status() == SnSR::CLOSE_WAIT)) { if (client.available()) { // XXX: don't always pick the lowest numbered socket. return client; } } } - - return Client(255); + + return Client(MAX_SOCK_NUM); } void Server::write(uint8_t b) @@ -79,12 +80,12 @@ void Server::write(const char *str) void Server::write(const uint8_t *buffer, size_t size) { accept(); - + for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { Client client(sock); - + if (EthernetClass::_server_port[sock] == _port && - client.status() == SOCK_ESTABLISHED) { + client.status() == SnSR::ESTABLISHED) { client.write(buffer, size); } } diff --git a/arduino-0018-linux-x64/libraries/Ethernet/Server.h b/arduino-0022-linux-x64/libraries/Ethernet/Server.h similarity index 72% rename from arduino-0018-linux-x64/libraries/Ethernet/Server.h rename to arduino-0022-linux-x64/libraries/Ethernet/Server.h index 73d6a5e..6aa5d3a 100644 --- a/arduino-0018-linux-x64/libraries/Ethernet/Server.h +++ b/arduino-0022-linux-x64/libraries/Ethernet/Server.h @@ -1,15 +1,12 @@ -#ifndef Server_h -#define Server_h - -extern "C" { - #include "utility/types.h" -} +#ifndef server_h +#define server_h #include "Print.h" class Client; -class Server : public Print { +class Server : +public Print { private: uint16_t _port; void accept(); diff --git a/arduino-0022-linux-x64/libraries/Ethernet/Udp.cpp b/arduino-0022-linux-x64/libraries/Ethernet/Udp.cpp new file mode 100644 index 0000000..17eaac6 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/Udp.cpp @@ -0,0 +1,136 @@ +/* + * Udp.cpp: Library to send/receive UDP packets with the Arduino ethernet shield. + * This version only offers minimal wrapping of socket.c/socket.h + * Drop Udp.h/.cpp into the Ethernet library directory at hardware/libraries/Ethernet/ + * + * MIT License: + * Copyright (c) 2008 Bjoern Hartmann + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * bjoern@cs.stanford.edu 12/30/2008 + */ + +#include "w5100.h" +#include "socket.h" +#include "Ethernet.h" +#include "Udp.h" + +/* Start UDP socket, listening at local port PORT */ +void UdpClass::begin(uint16_t port) { + _port = port; + _sock = 0; //TODO: should not be hardcoded + socket(_sock, SnMR::UDP, _port, 0); +} + +/* Send packet contained in buf of length len to peer at specified ip, and port */ +/* Use this function to transmit binary data that might contain 0x00 bytes*/ +/* This function returns sent data size for success else -1. */ +uint16_t UdpClass::sendPacket(uint8_t * buf, uint16_t len, uint8_t * ip, uint16_t port){ + return sendto(_sock,(const uint8_t *)buf,len,ip,port); +} + +/* Send zero-terminated string str as packet to peer at specified ip, and port */ +/* This function returns sent data size for success else -1. */ +uint16_t UdpClass::sendPacket(const char str[], uint8_t * ip, uint16_t port){ + // compute strlen + const char *s; + for(s = str; *s; ++s); + uint16_t len = (s-str); + // send packet + return sendto(_sock,(const uint8_t *)str,len,ip,port); +} +/* Is data available in rx buffer? Returns 0 if no, number of available bytes if yes. + * returned value includes 8 byte UDP header!*/ +int UdpClass::available() { + return W5100.getRXReceivedSize(_sock); +} + + +/* Read a received packet into buffer buf (which is of maximum length len); */ +/* store calling ip and port as well. Call available() to make sure data is ready first. */ +/* NOTE: I don't believe len is ever checked in implementation of recvfrom(),*/ +/* so it's easy to overflow buffer. so we check and truncate. */ +/* returns number of bytes read, or negative number of bytes we would have needed if we truncated */ +int UdpClass::readPacket(uint8_t * buf, uint16_t bufLen, uint8_t *ip, uint16_t *port) { + int packetLen = available()-8; //skip UDP header; + if(packetLen < 0 ) return 0; // no real data here + if(packetLen > (int)bufLen) { + //packet is too large - truncate + //HACK - hand-parse the UDP packet using TCP recv method + uint8_t tmpBuf[8]; + int i; + //read 8 header bytes and get IP and port from it + recv(_sock,tmpBuf,8); + ip[0] = tmpBuf[0]; + ip[1] = tmpBuf[1]; + ip[2] = tmpBuf[2]; + ip[3] = tmpBuf[3]; + *port = tmpBuf[4]; + *port = (*port << 8) + tmpBuf[5]; + + //now copy first (bufLen) bytes into buf + for(i=0;i<(int)bufLen;i++) { + recv(_sock,tmpBuf,1); + buf[i]=tmpBuf[0]; + } + + //and just read the rest byte by byte and throw it away + while(available()) { + recv(_sock,tmpBuf,1); + } + + return (-1*packetLen); + + //ALTERNATIVE: requires stdlib - takes a bunch of space + /*//create new buffer and read everything into it + uint8_t * tmpBuf = (uint8_t *)malloc(packetLen); + recvfrom(_sock,tmpBuf,packetLen,ip,port); + if(!tmpBuf) return 0; //couldn't allocate + // copy first bufLen bytes + for(unsigned int i=0; i +// the sensor communicates using SPI, so include the library: +#include + + +// assign a MAC address for the ethernet controller. +// fill in your address here: +byte mac[] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; +// assign an IP address for the controller: +byte ip[] = { + 192,168,1,20 }; +byte gateway[] = { + 192,168,1,1}; +byte subnet[] = { + 255, 255, 255, 0 }; + + +// Initialize the Ethernet server library +// with the IP address and port you want to use +// (port 80 is default for HTTP): +Server server(80); + + +//Sensor's memory register addresses: +const int PRESSURE = 0x1F; //3 most significant bits of pressure +const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure +const int TEMPERATURE = 0x21; //16 bit temperature reading + +// pins used for the connection with the sensor +// the others you need are controlled by the SPI library): +const int dataReadyPin = 6; +const int chipSelectPin = 7; + +float temperature = 0.0; +long pressure = 0; +long lastReadingTime = 0; + +void setup() { + // start the SPI library: + SPI.begin(); + + // start the Ethernet connection and the server: + Ethernet.begin(mac, ip); + server.begin(); + + // initalize the data ready and chip select pins: + pinMode(dataReadyPin, INPUT); + pinMode(chipSelectPin, OUTPUT); + + Serial.begin(9600); + + //Configure SCP1000 for low noise configuration: + writeRegister(0x02, 0x2D); + writeRegister(0x01, 0x03); + writeRegister(0x03, 0x02); + + // give the sensor and Ethernet shield time to set up: + delay(1000); + + //Set the sensor to high resolution mode tp start readings: + writeRegister(0x03, 0x0A); + +} + +void loop() { + // check for a reading no more than once a second. + if (millis() - lastReadingTime > 1000){ + // if there's a reading ready, read it: + // don't do anything until the data ready pin is high: + if (digitalRead(dataReadyPin) == HIGH) { + getData(); + // timestamp the last time you got a reading: + lastReadingTime = millis(); + } + } + + // listen for incoming Ethernet connections: + listenForClients(); +} + + +void getData() { + Serial.println("Getting reading"); + //Read the temperature data + int tempData = readRegister(0x21, 2); + + // convert the temperature to celsius and display it: + temperature = (float)tempData / 20.0; + + //Read the pressure data highest 3 bits: + byte pressureDataHigh = readRegister(0x1F, 1); + pressureDataHigh &= 0b00000111; //you only needs bits 2 to 0 + + //Read the pressure data lower 16 bits: + unsigned int pressureDataLow = readRegister(0x20, 2); + //combine the two parts into one 19-bit number: + pressure = ((pressureDataHigh << 16) | pressureDataLow)/4; + + Serial.print("Temperature: "); + Serial.print(temperature); + Serial.println(" degrees C"); + Serial.print("Pressure: " + String(pressure)); + Serial.println(" Pa"); +} + +void listenForClients() { + // listen for incoming clients + Client client = server.available(); + if (client) { + Serial.println("Got a client"); + // an http request ends with a blank line + boolean currentLineIsBlank = true; + while (client.connected()) { + if (client.available()) { + char c = client.read(); + // if you've gotten to the end of the line (received a newline + // character) and the line is blank, the http request has ended, + // so you can send a reply + if (c == '\n' && currentLineIsBlank) { + // send a standard http response header + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println(); + // print the current readings, in HTML format: + client.print("Temperature: "); + client.print(temperature); + client.print(" degrees C"); + client.println("
    "); + client.print("Pressure: " + String(pressure)); + client.print(" Pa"); + client.println("
    "); + break; + } + if (c == '\n') { + // you're starting a new line + currentLineIsBlank = true; + } + else if (c != '\r') { + // you've gotten a character on the current line + currentLineIsBlank = false; + } + } + } + // give the web browser time to receive the data + delay(1); + // close the connection: + client.stop(); + } +} + + +//Send a write command to SCP1000 +void writeRegister(byte registerName, byte registerValue) { + // SCP1000 expects the register name in the upper 6 bits + // of the byte: + registerName <<= 2; + // command (read or write) goes in the lower two bits: + registerName |= 0b00000010; //Write command + + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + + SPI.transfer(registerName); //Send register location + SPI.transfer(registerValue); //Send value to record into register + + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); +} + + +//Read register from the SCP1000: +unsigned int readRegister(byte registerName, int numBytes) { + byte inByte = 0; // incoming from the SPI read + unsigned int result = 0; // result to return + + // SCP1000 expects the register name in the upper 6 bits + // of the byte: + registerName <<= 2; + // command (read or write) goes in the lower two bits: + registerName &= 0b11111100; //Read command + + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + // send the device the register you want to read: + int command = SPI.transfer(registerName); + // send a value of 0 to read the first byte returned: + inByte = SPI.transfer(0x00); + + result = inByte; + // if there's more than one byte returned, + // shift the first byte then get the second byte: + if (numBytes > 1){ + result = inByte << 8; + inByte = SPI.transfer(0x00); + result = result |inByte; + } + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); + // return the result: + return(result); +} diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/ChatServer/ChatServer.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/ChatServer/ChatServer.pde new file mode 100644 index 0000000..50ae014 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/ChatServer/ChatServer.pde @@ -0,0 +1,63 @@ +/* + Chat Server + + A simple server that distributes any incoming messages to all + connected clients. To use telnet to your device's IP address and type. + You can see the client's input in the serial monitor as well. + Using an Arduino Wiznet Ethernet shield. + + Circuit: + * Ethernet shield attached to pins 10, 11, 12, 13 + * Analog inputs attached to pins A0 through A5 (optional) + + created 18 Dec 2009 + by David A. Mellis + modified 10 August 2010 + by Tom Igoe + + */ + +#include +#include + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network. +// gateway and subnet are optional: +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +byte ip[] = { 192,168,1, 177 }; +byte gateway[] = { 192,168,1, 1 }; +byte subnet[] = { 255, 255, 0, 0 }; + +// telnet defaults to port 23 +Server server(23); +boolean gotAMessage = false; // whether or not you got a message from the client yet + +void setup() { + // initialize the ethernet device + Ethernet.begin(mac, ip, gateway, subnet); + // start listening for clients + server.begin(); + // open the serial port + Serial.begin(9600); +} + +void loop() { + // wait for a new client: + Client client = server.available(); + + // when the client sends the first byte, say hello: + if (client) { + if (!gotAMessage) { + Serial.println("We have a new client"); + client.println("Hello, client!"); + gotAMessage = true; + } + + // read the bytes incoming from the client: + char thisChar = client.read(); + // echo the bytes back to the client: + server.write(thisChar); + // echo the bytes to the server as well: + Serial.print(thisChar); + } +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClient/PachubeClient.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClient/PachubeClient.pde new file mode 100644 index 0000000..fe94541 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClient/PachubeClient.pde @@ -0,0 +1,139 @@ +/* + Pachube sensor client + + This sketch connects an analog sensor to Pachube (http://www.pachube.com) + using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or + the Adafruit Ethernet shield, either one will work, as long as it's got + a Wiznet Ethernet module on board. + + Circuit: + * Analog sensor attached to analog in 0 + * Ethernet shield attached to pins 10, 11, 12, 13 + + created 15 March 2010 + updated 4 Sep 2010 + by Tom Igoe + + http://www.tigoe.net/pcomp/code/category/arduinowiring/873 + This code is in the public domain. + + */ + +#include +#include + +// assign a MAC address for the ethernet controller. +// fill in your address here: +byte mac[] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; +// assign an IP address for the controller: +byte ip[] = { + 192,169,1,20 }; +byte gateway[] = { + 192,168,1,1}; +byte subnet[] = { + 255, 255, 255, 0 }; + +// The address of the server you want to connect to (pachube.com): +byte server[] = { + 209,40,205,190 }; + +// initialize the library instance: +Client client(server, 80); + +long lastConnectionTime = 0; // last time you connected to the server, in milliseconds +boolean lastConnected = false; // state of the connection last time through the main loop +const int postingInterval = 10000; //delay between updates to Pachube.com + +void setup() { + // start the ethernet connection and serial port: + Ethernet.begin(mac, ip); + Serial.begin(9600); + // give the ethernet module time to boot up: + delay(1000); +} + +void loop() { + // read the analog sensor: + int sensorReading = analogRead(A0); + + // if there's incoming data from the net connection. + // send it out the serial port. This is for debugging + // purposes only: + if (client.available()) { + char c = client.read(); + Serial.print(c); + } + + // if there's no net connection, but there was one last time + // through the loop, then stop the client: + if (!client.connected() && lastConnected) { + Serial.println(); + Serial.println("disconnecting."); + client.stop(); + } + + // if you're not connected, and ten seconds have passed since + // your last connection, then connect again and send data: + if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) { + sendData(sensorReading); + } + // store the state of the connection for next time through + // the loop: + lastConnected = client.connected(); +} + +// this method makes a HTTP connection to the server: +void sendData(int thisData) { + // if there's a successful connection: + if (client.connect()) { + Serial.println("connecting..."); + // send the HTTP PUT request. + // fill in your feed address here: + client.print("PUT /api/YOUR_FEED_HERE.csv HTTP/1.1\n"); + client.print("Host: www.pachube.com\n"); + // fill in your Pachube API key here: + client.print("X-PachubeApiKey: YOUR_KEY_HERE\n"); + client.print("Content-Length: "); + + // calculate the length of the sensor reading in bytes: + int thisLength = getLength(thisData); + client.println(thisLength, DEC); + + // last pieces of the HTTP PUT request: + client.print("Content-Type: text/csv\n"); + client.println("Connection: close\n"); + + // here's the actual content of the PUT request: + client.println(thisData, DEC); + + // note the time that the connection was made: + lastConnectionTime = millis(); + } + else { + // if you couldn't make a connection: + Serial.println("connection failed"); + } +} + + +// This method calculates the number of digits in the +// sensor reading. Since each digit of the ASCII decimal +// representation is a byte, the number of digits equals +// the number of bytes: + +int getLength(int someValue) { + // there's at least one byte: + int digits = 1; + // continually divide the value by ten, + // adding one to the digit count for each + // time you divide, until you're at 0: + int dividend = someValue /10; + while (dividend > 0) { + dividend = dividend /10; + digits++; + } + // return the number of digits: + return digits; +} + diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClientString/PachubeClientString.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClientString/PachubeClientString.pde new file mode 100644 index 0000000..225823a --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/PachubeClientString/PachubeClientString.pde @@ -0,0 +1,124 @@ +/* + Pachube sensor client with Strings + + This sketch connects an analog sensor to Pachube (http://www.pachube.com) + using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or + the Adafruit Ethernet shield, either one will work, as long as it's got + a Wiznet Ethernet module on board. + + This example uses the String library, which is part of the Arduino core from + version 0019. + + Circuit: + * Analog sensor attached to analog in 0 + * Ethernet shield attached to pins 10, 11, 12, 13 + + created 15 March 2010 + updated 4 Sep 2010 + by Tom Igoe + + This code is in the public domain. + + */ + +#include +#include + +// assign a MAC address for the ethernet controller. +// fill in your address here: +byte mac[] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; +// assign an IP address for the controller: +byte ip[] = { + 192,169,1,20 }; +byte gateway[] = { + 192,168,1,1}; +byte subnet[] = { + 255, 255, 255, 0 }; + +// The address of the server you want to connect to (pachube.com): +byte server[] = { + 209,40,205,190 }; + +// initialize the library instance: +Client client(server, 80); + +long lastConnectionTime = 0; // last time you connected to the server, in milliseconds +boolean lastConnected = false; // state of the connection last time through the main loop +const int postingInterval = 10000; //delay between updates to Pachube.com + +void setup() { + // start the ethernet connection and serial port: + Ethernet.begin(mac, ip); + Serial.begin(9600); + // give the ethernet module time to boot up: + delay(1000); +} + +void loop() { + // read the analog sensor: + int sensorReading = analogRead(A0); + // convert the data to a String to send it: + String dataString = String(sensorReading); + + // you can append multiple readings to this String if your + // pachube feed is set up to handle multiple values: + int otherSensorReading = analogRead(A1); + dataString += ","; + dataString += String(otherSensorReading); + + // if there's incoming data from the net connection. + // send it out the serial port. This is for debugging + // purposes only: + if (client.available()) { + char c = client.read(); + Serial.print(c); + } + + // if there's no net connection, but there was one last time + // through the loop, then stop the client: + if (!client.connected() && lastConnected) { + Serial.println(); + Serial.println("disconnecting."); + client.stop(); + } + + // if you're not connected, and ten seconds have passed since + // your last connection, then connect again and send data: + if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) { + sendData(dataString); + } + // store the state of the connection for next time through + // the loop: + lastConnected = client.connected(); +} + +// this method makes a HTTP connection to the server: +void sendData(String thisData) { + // if there's a successful connection: + if (client.connect()) { + Serial.println("connecting..."); + // send the HTTP PUT request. + // fill in your feed address here: + client.print("PUT /api/YOUR_FEED_HERE.csv HTTP/1.1\n"); + client.print("Host: www.pachube.com\n"); + // fill in your Pachube API key here: + client.print("X-PachubeApiKey: YOUR_KEY_HERE\n"); + client.print("Content-Length: "); + client.println(thisData.length(), DEC); + + // last pieces of the HTTP PUT request: + client.print("Content-Type: text/csv\n"); + client.println("Connection: close\n"); + + // here's the actual content of the PUT request: + client.println(thisData); + + // note the time that the connection was made: + lastConnectionTime = millis(); + } + else { + // if you couldn't make a connection: + Serial.println("connection failed"); + } +} diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/TelnetClient/TelnetClient.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/TelnetClient/TelnetClient.pde new file mode 100644 index 0000000..aca1fa9 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/TelnetClient/TelnetClient.pde @@ -0,0 +1,89 @@ +/* + Telnet client + + This sketch connects to a a telnet server (http://www.google.com) + using an Arduino Wiznet Ethernet shield. You'll need a telnet server + to test this with. + Processing's ChatServer example (part of the network library) works well, + running on port 10002. It can be found as part of the examples + in the Processing application, available at + http://processing.org/ + + Circuit: + * Ethernet shield attached to pins 10, 11, 12, 13 + + created 14 Sep 2010 + by Tom Igoe + + */ + +#include +#include + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network: +byte mac[] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +byte ip[] = { + 192,168,1,177 }; + +// Enter the IP address of the server you're connecting to: +byte server[] = { + 1,1,1,1 }; + +// Initialize the Ethernet client library +// with the IP address and port of the server +// that you want to connect to (port 23 is default for telnet; +// if you're using Processing's ChatServer, use port 10002): +Client client(server, 10002); + +void setup() { + // start the Ethernet connection: + Ethernet.begin(mac, ip); + // start the serial library: + Serial.begin(9600); + // give the Ethernet shield a second to initialize: + delay(1000); + Serial.println("connecting..."); + + // if you get a connection, report back via serial: + if (client.connect()) { + Serial.println("connected"); + } + else { + // if you didn't get a connection to the server: + Serial.println("connection failed"); + } +} + +void loop() +{ + // if there are incoming bytes available + // from the server, read them and print them: + if (client.available()) { + char c = client.read(); + Serial.print(c); + } + + // as long as there are bytes in the serial queue, + // read them and send them out the socket if it's open: + while (Serial.available() > 0) { + char inChar = Serial.read(); + if (client.connected()) { + client.print(inChar); + } + } + + // if the server's disconnected, stop the client: + if (!client.connected()) { + Serial.println(); + Serial.println("disconnecting."); + client.stop(); + // do nothing: + while(true); + } +} + + + + diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/UDPSendReceiveString/UDPSendReceiveString.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/UDPSendReceiveString/UDPSendReceiveString.pde new file mode 100644 index 0000000..cfe1b58 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/UDPSendReceiveString/UDPSendReceiveString.pde @@ -0,0 +1,107 @@ +/* + UDPSendReceive.pde: + This sketch receives UDP message strings, prints them to the serial port + and sends an "acknowledge" string back to the sender + + A Processing sketch is included at the end of file that can be used to send + and received messages for testing with a computer. + + created 21 Aug 2010 + by Michael Margolis + + This code is in the public domain. + */ + + +#include // needed for Arduino versions later than 0018 +#include +#include // UDP library from: bjoern@cs.stanford.edu 12/30/2008 + + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network: +byte mac[] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +byte ip[] = { + 192,168,1,177 }; + +unsigned int localPort = 8888; // local port to listen on + +// the next two variables are set when a packet is received +byte remoteIp[4]; // holds received packet's originating IP +unsigned int remotePort; // holds received packet's originating port + +// buffers for receiving and sending data +char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet, +char ReplyBuffer[] = "acknowledged"; // a string to send back + + +void setup() { + // start the Ethernet and UDP: + Ethernet.begin(mac,ip); + Udp.begin(localPort); + + Serial.begin(9600); +} + +void loop() { + // if there's data available, read a packet + int packetSize = Udp.available(); // note that this includes the UDP header + if(packetSize) + { + packetSize = packetSize - 8; // subtract the 8 byte header + Serial.print("Received packet of size "); + Serial.println(packetSize); + + // read the packet into packetBufffer and get the senders IP addr and port number + Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort); + Serial.println("Contents:"); + Serial.println(packetBuffer); + + Udp.sendPacket( ReplyBuffer, remoteIp, remotePort); + } + delay(10); +} + + +/* + Processing sketch to run with this example + ===================================================== + + // Processing UDP example to send and receive string data from Arduino + // press any key to send the "Hello Arduino" message + + + import hypermedia.net.*; + + UDP udp; // define the UDP object + + + void setup() { + udp = new UDP( this, 6000 ); // create a new datagram connection on port 6000 + //udp.log( true ); // <-- printout the connection activity + udp.listen( true ); // and wait for incoming message + } + + void draw() + { + } + + void keyPressed() { + String ip = "192.168.1.177"; // the remote IP address + int port = 8888; // the destination port + + udp.send("Hello World", ip, port ); // the message to send + + } + + void receive( byte[] data ) { // <-- default handler + //void receive( byte[] data, String ip, int port ) { // <-- extended handler + + for(int i=0; i < data.length; i++) + print(char(data[i])); + println(); + } + */ + + diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/UdpNtpClient/UdpNtpClient.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/UdpNtpClient/UdpNtpClient.pde new file mode 100644 index 0000000..0b3832b --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/UdpNtpClient/UdpNtpClient.pde @@ -0,0 +1,121 @@ +/* + + Udp NTP Client + + Get the time from a Network Time Protocol (NTP) time server + Demonstrates use of UDP sendPacket and ReceivePacket + For more on NTP time servers and the messages needed to communicate with them, + see http://en.wikipedia.org/wiki/Network_Time_Protocol + + created 4 Sep 2010 + by Michael Margolis + modified 17 Sep 2010 + by Tom Igoe + + This code is in the public domain. + + */ + +#include +#include +#include + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network: +byte mac[] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +byte ip[] = { + 192,168,1,177 }; + + +unsigned int localPort = 8888; // local port to listen for UDP packets + +byte timeServer[] = { + 192, 43, 244, 18}; // time.nist.gov NTP server + +const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message + +byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets + +void setup() +{ + // start Ethernet and UDP + Ethernet.begin(mac,ip); + Udp.begin(localPort); + + Serial.begin(9600); +} + +void loop() +{ + sendNTPpacket(timeServer); // send an NTP packet to a time server + + // wait to see if a reply is available + delay(1000); + if ( Udp.available() ) { + Udp.readPacket(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer + + //the timestamp starts at byte 40 of the received packet and is four bytes, + // or two words, long. First, esxtract the two words: + + unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); + unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); + // combine the four bytes (two words) into a long integer + // this is NTP time (seconds since Jan 1 1900): + unsigned long secsSince1900 = highWord << 16 | lowWord; + Serial.print("Seconds since Jan 1 1900 = " ); + Serial.println(secsSince1900); + + // now convert NTP time into everyday time: + Serial.print("Unix time = "); + // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: + const unsigned long seventyYears = 2208988800UL; + // subtract seventy years: + unsigned long epoch = secsSince1900 - seventyYears; + // print Unix time: + Serial.println(epoch); + + + // print the hour, minute and second: + Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) + Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) + Serial.print(':'); + Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) + Serial.print(':'); + Serial.println(epoch %60); // print the second + } + // wait ten seconds before asking for the time again + delay(10000); +} + +// send an NTP request to the time server at the given address +unsigned long sendNTPpacket(byte *address) +{ + // set all bytes in the buffer to 0 + memset(packetBuffer, 0, NTP_PACKET_SIZE); + // Initialize values needed to form NTP request + // (see URL above for details on the packets) + packetBuffer[0] = 0b11100011; // LI, Version, Mode + packetBuffer[1] = 0; // Stratum, or type of clock + packetBuffer[2] = 6; // Polling Interval + packetBuffer[3] = 0xEC; // Peer Clock Precision + // 8 bytes of zero for Root Delay & Root Dispersion + packetBuffer[12] = 49; + packetBuffer[13] = 0x4E; + packetBuffer[14] = 49; + packetBuffer[15] = 52; + + // all NTP fields have been given values, now + // you can send a packet requesting a timestamp: + Udp.sendPacket( packetBuffer,NTP_PACKET_SIZE, address, 123); //NTP requests are to port 123 +} + + + + + + + + + + diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde new file mode 100644 index 0000000..a2d3503 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/WebClient/WebClient.pde @@ -0,0 +1,71 @@ +/* + Web client + + This sketch connects to a website (http://www.google.com) + using an Arduino Wiznet Ethernet shield. + + Circuit: + * Ethernet shield attached to pins 10, 11, 12, 13 + + created 18 Dec 2009 + by David A. Mellis + + */ + +#include +#include + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network: +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +byte ip[] = { 192,168,1,177 }; +byte server[] = { 173,194,33,104 }; // Google + +// Initialize the Ethernet client library +// with the IP address and port of the server +// that you want to connect to (port 80 is default for HTTP): +Client client(server, 80); + +void setup() { + // start the Ethernet connection: + Ethernet.begin(mac, ip); + // start the serial library: + Serial.begin(9600); + // give the Ethernet shield a second to initialize: + delay(1000); + Serial.println("connecting..."); + + // if you get a connection, report back via serial: + if (client.connect()) { + Serial.println("connected"); + // Make a HTTP request: + client.println("GET /search?q=arduino HTTP/1.0"); + client.println(); + } + else { + // kf you didn't get a connection to the server: + Serial.println("connection failed"); + } +} + +void loop() +{ + // if there are incoming bytes available + // from the server, read them and print them: + if (client.available()) { + char c = client.read(); + Serial.print(c); + } + + // if the server's disconnected, stop the client: + if (!client.connected()) { + Serial.println(); + Serial.println("disconnecting."); + client.stop(); + + // do nothing forevermore: + for(;;) + ; + } +} + diff --git a/arduino-0022-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde b/arduino-0022-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde new file mode 100644 index 0000000..77bcb20 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/examples/WebServer/WebServer.pde @@ -0,0 +1,82 @@ +/* + Web Server + + A simple web server that shows the value of the analog input pins. + using an Arduino Wiznet Ethernet shield. + + Circuit: + * Ethernet shield attached to pins 10, 11, 12, 13 + * Analog inputs attached to pins A0 through A5 (optional) + + created 18 Dec 2009 + by David A. Mellis + modified 4 Sep 2010 + by Tom Igoe + + */ + +#include +#include + +// Enter a MAC address and IP address for your controller below. +// The IP address will be dependent on your local network: +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +byte ip[] = { 192,168,1, 177 }; + +// Initialize the Ethernet server library +// with the IP address and port you want to use +// (port 80 is default for HTTP): +Server server(80); + +void setup() +{ + // start the Ethernet connection and the server: + Ethernet.begin(mac, ip); + server.begin(); +} + +void loop() +{ + // listen for incoming clients + Client client = server.available(); + if (client) { + // an http request ends with a blank line + boolean currentLineIsBlank = true; + while (client.connected()) { + if (client.available()) { + char c = client.read(); + // if you've gotten to the end of the line (received a newline + // character) and the line is blank, the http request has ended, + // so you can send a reply + if (c == '\n' && currentLineIsBlank) { + // send a standard http response header + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println(); + + // output the value of each analog input pin + for (int analogChannel = 0; analogChannel < 6; analogChannel++) { + client.print("analog input "); + client.print(analogChannel); + client.print(" is "); + client.print(analogRead(analogChannel)); + client.println("
    "); + } + break; + } + if (c == '\n') { + // you're starting a new line + currentLineIsBlank = true; + } + else if (c != '\r') { + // you've gotten a character on the current line + currentLineIsBlank = false; + } + } + } + // give the web browser time to receive the data + delay(1); + // close the connection: + client.stop(); + } +} \ No newline at end of file diff --git a/arduino-0018-linux-x64/libraries/Ethernet/keywords.txt b/arduino-0022-linux-x64/libraries/Ethernet/keywords.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/Ethernet/keywords.txt rename to arduino-0022-linux-x64/libraries/Ethernet/keywords.txt diff --git a/arduino-0022-linux-x64/libraries/Ethernet/utility/socket.cpp b/arduino-0022-linux-x64/libraries/Ethernet/utility/socket.cpp new file mode 100644 index 0000000..628bca8 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/utility/socket.cpp @@ -0,0 +1,327 @@ +#include "w5100.h" +#include "socket.h" + +static uint16_t local_port; + +/** + * @brief This Socket function initialize the channel in perticular mode, and set the port and wait for W5100 done it. + * @return 1 for success else 0. + */ +uint8_t socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag) +{ + uint8_t ret; + if ((protocol == SnMR::TCP) || (protocol == SnMR::UDP) || (protocol == SnMR::IPRAW) || (protocol == SnMR::MACRAW) || (protocol == SnMR::PPPOE)) + { + close(s); + W5100.writeSnMR(s, protocol | flag); + if (port != 0) { + W5100.writeSnPORT(s, port); + } + else { + local_port++; // if don't set the source port, set local_port number. + W5100.writeSnPORT(s, local_port); + } + + W5100.execCmdSn(s, Sock_OPEN); + + return 1; + } + + return 0; +} + + +/** + * @brief This function close the socket and parameter is "s" which represent the socket number + */ +void close(SOCKET s) +{ + W5100.execCmdSn(s, Sock_CLOSE); + W5100.writeSnIR(s, 0xFF); +} + + +/** + * @brief This function established the connection for the channel in passive (server) mode. This function waits for the request from the peer. + * @return 1 for success else 0. + */ +uint8_t listen(SOCKET s) +{ + if (W5100.readSnSR(s) != SnSR::INIT) + return 0; + W5100.execCmdSn(s, Sock_LISTEN); + return 1; +} + + +/** + * @brief This function established the connection for the channel in Active (client) mode. + * This function waits for the untill the connection is established. + * + * @return 1 for success else 0. + */ +uint8_t connect(SOCKET s, uint8_t * addr, uint16_t port) +{ + if + ( + ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) || + ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || + (port == 0x00) + ) + return 0; + + // set destination IP + W5100.writeSnDIPR(s, addr); + W5100.writeSnDPORT(s, port); + W5100.execCmdSn(s, Sock_CONNECT); + + return 1; +} + + + +/** + * @brief This function used for disconnect the socket and parameter is "s" which represent the socket number + * @return 1 for success else 0. + */ +void disconnect(SOCKET s) +{ + W5100.execCmdSn(s, Sock_DISCON); +} + + +/** + * @brief This function used to send the data in TCP mode + * @return 1 for success else 0. + */ +uint16_t send(SOCKET s, const uint8_t * buf, uint16_t len) +{ + uint8_t status=0; + uint16_t ret=0; + uint16_t freesize=0; + + if (len > W5100.SSIZE) + ret = W5100.SSIZE; // check size not to exceed MAX size. + else + ret = len; + + // if freebuf is available, start. + do + { + freesize = W5100.getTXFreeSize(s); + status = W5100.readSnSR(s); + if ((status != SnSR::ESTABLISHED) && (status != SnSR::CLOSE_WAIT)) + { + ret = 0; + break; + } + } + while (freesize < ret); + + // copy data + W5100.send_data_processing(s, (uint8_t *)buf, ret); + W5100.execCmdSn(s, Sock_SEND); + + /* +2008.01 bj */ + while ( (W5100.readSnIR(s) & SnIR::SEND_OK) != SnIR::SEND_OK ) + { + /* m2008.01 [bj] : reduce code */ + if ( W5100.readSnSR(s) == SnSR::CLOSED ) + { + close(s); + return 0; + } + } + /* +2008.01 bj */ + W5100.writeSnIR(s, SnIR::SEND_OK); + return ret; +} + + +/** + * @brief This function is an application I/F function which is used to receive the data in TCP mode. + * It continues to wait for data as much as the application wants to receive. + * + * @return received data size for success else -1. + */ +uint16_t recv(SOCKET s, uint8_t *buf, uint16_t len) +{ + uint16_t ret=0; + + if ( len > 0 ) + { + W5100.recv_data_processing(s, buf, len); + W5100.execCmdSn(s, Sock_RECV); + ret = len; + } + return ret; +} + + +/** + * @brief Returns the first byte in the receive queue (no checking) + * + * @return + */ +uint16_t peek(SOCKET s, uint8_t *buf) +{ + W5100.recv_data_processing(s, buf, 1, 1); + + return 1; +} + + +/** + * @brief This function is an application I/F function which is used to send the data for other then TCP mode. + * Unlike TCP transmission, The peer's destination address and the port is needed. + * + * @return This function return send data size for success else -1. + */ +uint16_t sendto(SOCKET s, const uint8_t *buf, uint16_t len, uint8_t *addr, uint16_t port) +{ + uint16_t ret=0; + + if (len > W5100.SSIZE) ret = W5100.SSIZE; // check size not to exceed MAX size. + else ret = len; + + if + ( + ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || + ((port == 0x00)) ||(ret == 0) + ) + { + /* +2008.01 [bj] : added return value */ + ret = 0; + } + else + { + W5100.writeSnDIPR(s, addr); + W5100.writeSnDPORT(s, port); + + // copy data + W5100.send_data_processing(s, (uint8_t *)buf, ret); + W5100.execCmdSn(s, Sock_SEND); + + /* +2008.01 bj */ + while ( (W5100.readSnIR(s) & SnIR::SEND_OK) != SnIR::SEND_OK ) + { + if (W5100.readSnIR(s) & SnIR::TIMEOUT) + { + /* +2008.01 [bj]: clear interrupt */ + W5100.writeSnIR(s, (SnIR::SEND_OK | SnIR::TIMEOUT)); /* clear SEND_OK & TIMEOUT */ + return 0; + } + } + + /* +2008.01 bj */ + W5100.writeSnIR(s, SnIR::SEND_OK); + } + return ret; +} + + +/** + * @brief This function is an application I/F function which is used to receive the data in other then + * TCP mode. This function is used to receive UDP, IP_RAW and MAC_RAW mode, and handle the header as well. + * + * @return This function return received data size for success else -1. + */ +uint16_t recvfrom(SOCKET s, uint8_t *buf, uint16_t len, uint8_t *addr, uint16_t *port) +{ + uint8_t head[8]; + uint16_t data_len=0; + uint16_t ptr=0; + + if ( len > 0 ) + { + ptr = W5100.readSnRX_RD(s); + switch (W5100.readSnMR(s) & 0x07) + { + case SnMR::UDP : + W5100.read_data(s, (uint8_t *)ptr, head, 0x08); + ptr += 8; + // read peer's IP address, port number. + addr[0] = head[0]; + addr[1] = head[1]; + addr[2] = head[2]; + addr[3] = head[3]; + *port = head[4]; + *port = (*port << 8) + head[5]; + data_len = head[6]; + data_len = (data_len << 8) + head[7]; + + W5100.read_data(s, (uint8_t *)ptr, buf, data_len); // data copy. + ptr += data_len; + + W5100.writeSnRX_RD(s, ptr); + break; + + case SnMR::IPRAW : + W5100.read_data(s, (uint8_t *)ptr, head, 0x06); + ptr += 6; + + addr[0] = head[0]; + addr[1] = head[1]; + addr[2] = head[2]; + addr[3] = head[3]; + data_len = head[4]; + data_len = (data_len << 8) + head[5]; + + W5100.read_data(s, (uint8_t *)ptr, buf, data_len); // data copy. + ptr += data_len; + + W5100.writeSnRX_RD(s, ptr); + break; + + case SnMR::MACRAW: + W5100.read_data(s,(uint8_t*)ptr,head,2); + ptr+=2; + data_len = head[0]; + data_len = (data_len<<8) + head[1] - 2; + + W5100.read_data(s,(uint8_t*) ptr,buf,data_len); + ptr += data_len; + W5100.writeSnRX_RD(s, ptr); + break; + + default : + break; + } + W5100.execCmdSn(s, Sock_RECV); + } + return data_len; +} + + +uint16_t igmpsend(SOCKET s, const uint8_t * buf, uint16_t len) +{ + uint8_t status=0; + uint16_t ret=0; + + if (len > W5100.SSIZE) + ret = W5100.SSIZE; // check size not to exceed MAX size. + else + ret = len; + + if (ret == 0) + return 0; + + W5100.send_data_processing(s, (uint8_t *)buf, ret); + W5100.execCmdSn(s, Sock_SEND); + + while ( (W5100.readSnIR(s) & SnIR::SEND_OK) != SnIR::SEND_OK ) + { + status = W5100.readSnSR(s); + if (W5100.readSnIR(s) & SnIR::TIMEOUT) + { + /* in case of igmp, if send fails, then socket closed */ + /* if you want change, remove this code. */ + close(s); + return 0; + } + } + + W5100.writeSnIR(s, SnIR::SEND_OK); + return ret; +} + diff --git a/arduino-0022-linux-x64/libraries/Ethernet/utility/socket.h b/arduino-0022-linux-x64/libraries/Ethernet/utility/socket.h new file mode 100644 index 0000000..48e2d87 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/utility/socket.h @@ -0,0 +1,20 @@ +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +#include "w5100.h" + +extern uint8_t socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag); // Opens a socket(TCP or UDP or IP_RAW mode) +extern void close(SOCKET s); // Close socket +extern uint8_t connect(SOCKET s, uint8_t * addr, uint16_t port); // Establish TCP connection (Active connection) +extern void disconnect(SOCKET s); // disconnect the connection +extern uint8_t listen(SOCKET s); // Establish TCP connection (Passive connection) +extern uint16_t send(SOCKET s, const uint8_t * buf, uint16_t len); // Send data (TCP) +extern uint16_t recv(SOCKET s, uint8_t * buf, uint16_t len); // Receive data (TCP) +extern uint16_t peek(SOCKET s, uint8_t *buf); +extern uint16_t sendto(SOCKET s, const uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port); // Send data (UDP/IP RAW) +extern uint16_t recvfrom(SOCKET s, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port); // Receive data (UDP/IP RAW) + +extern uint16_t igmpsend(SOCKET s, const uint8_t * buf, uint16_t len); + +#endif +/* _SOCKET_H_ */ diff --git a/arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.cpp b/arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.cpp new file mode 100644 index 0000000..aaf3071 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#include +#include +#include + +#include "w5100.h" + +// W5100 controller instance +W5100Class W5100; + +#define TX_RX_MAX_BUF_SIZE 2048 +#define TX_BUF 0x1100 +#define RX_BUF (TX_BUF + TX_RX_MAX_BUF_SIZE) + +#define TXBUF_BASE 0x4000 +#define RXBUF_BASE 0x6000 + +void W5100Class::init(void) +{ + delay(300); + + SPI.begin(); + initSS(); + + writeMR(1< SSIZE) + { + // Wrap around circular buffer + uint16_t size = SSIZE - offset; + write(dstAddr, data, size); + write(SBASE[s], data + size, len - size); + } + else { + write(dstAddr, data, len); + } + + ptr += len; + writeSnTX_WR(s, ptr); +} + + +void W5100Class::recv_data_processing(SOCKET s, uint8_t *data, uint16_t len, uint8_t peek) +{ + uint16_t ptr; + ptr = readSnRX_RD(s); + read_data(s, (uint8_t *)ptr, data, len); + if (!peek) + { + ptr += len; + writeSnRX_RD(s, ptr); + } +} + +void W5100Class::read_data(SOCKET s, volatile uint8_t *src, volatile uint8_t *dst, uint16_t len) +{ + uint16_t size; + uint16_t src_mask; + uint16_t src_ptr; + + src_mask = (uint16_t)src & RMASK; + src_ptr = RBASE[s] + src_mask; + + if( (src_mask + len) > RSIZE ) + { + size = RSIZE - src_mask; + read(src_ptr, (uint8_t *)dst, size); + dst += size; + read(RBASE[s], (uint8_t *) dst, len - size); + } + else + read(src_ptr, (uint8_t *) dst, len); +} + + +uint8_t W5100Class::write(uint16_t _addr, uint8_t _data) +{ + setSS(); + SPI.transfer(0xF0); + SPI.transfer(_addr >> 8); + SPI.transfer(_addr & 0xFF); + SPI.transfer(_data); + resetSS(); + return 1; +} + +uint16_t W5100Class::write(uint16_t _addr, uint8_t *_buf, uint16_t _len) +{ + for (int i=0; i<_len; i++) + { + setSS(); + SPI.transfer(0xF0); + SPI.transfer(_addr >> 8); + SPI.transfer(_addr & 0xFF); + _addr++; + SPI.transfer(_buf[i]); + resetSS(); + } + return _len; +} + +uint8_t W5100Class::read(uint16_t _addr) +{ + setSS(); + SPI.transfer(0x0F); + SPI.transfer(_addr >> 8); + SPI.transfer(_addr & 0xFF); + uint8_t _data = SPI.transfer(0); + resetSS(); + return _data; +} + +uint16_t W5100Class::read(uint16_t _addr, uint8_t *_buf, uint16_t _len) +{ + for (int i=0; i<_len; i++) + { + setSS(); + SPI.transfer(0x0F); + SPI.transfer(_addr >> 8); + SPI.transfer(_addr & 0xFF); + _addr++; + _buf[i] = SPI.transfer(0); + resetSS(); + } + return _len; +} + +void W5100Class::execCmdSn(SOCKET s, SockCMD _cmd) { + // Send command to socket + writeSnCR(s, _cmd); + // Wait for command to complete + while (readSnCR(s)) + ; +} diff --git a/arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.h b/arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.h new file mode 100644 index 0000000..118e5d8 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Ethernet/utility/w5100.h @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#ifndef W5100_H_INCLUDED +#define W5100_H_INCLUDED + +#include +#include + +#define MAX_SOCK_NUM 4 + +typedef uint8_t SOCKET; + +#define IDM_OR 0x8000 +#define IDM_AR0 0x8001 +#define IDM_AR1 0x8002 +#define IDM_DR 0x8003 +/* +class MR { +public: + static const uint8_t RST = 0x80; + static const uint8_t PB = 0x10; + static const uint8_t PPPOE = 0x08; + static const uint8_t LB = 0x04; + static const uint8_t AI = 0x02; + static const uint8_t IND = 0x01; +}; +*/ +/* +class IR { +public: + static const uint8_t CONFLICT = 0x80; + static const uint8_t UNREACH = 0x40; + static const uint8_t PPPoE = 0x20; + static const uint8_t SOCK0 = 0x01; + static const uint8_t SOCK1 = 0x02; + static const uint8_t SOCK2 = 0x04; + static const uint8_t SOCK3 = 0x08; + static inline uint8_t SOCK(SOCKET ch) { return (0x01 << ch); }; +}; +*/ + +class SnMR { +public: + static const uint8_t CLOSE = 0x00; + static const uint8_t TCP = 0x01; + static const uint8_t UDP = 0x02; + static const uint8_t IPRAW = 0x03; + static const uint8_t MACRAW = 0x04; + static const uint8_t PPPOE = 0x05; + static const uint8_t ND = 0x20; + static const uint8_t MULTI = 0x80; +}; + +enum SockCMD { + Sock_OPEN = 0x01, + Sock_LISTEN = 0x02, + Sock_CONNECT = 0x04, + Sock_DISCON = 0x08, + Sock_CLOSE = 0x10, + Sock_SEND = 0x20, + Sock_SEND_MAC = 0x21, + Sock_SEND_KEEP = 0x22, + Sock_RECV = 0x40 +}; + +/*class SnCmd { +public: + static const uint8_t OPEN = 0x01; + static const uint8_t LISTEN = 0x02; + static const uint8_t CONNECT = 0x04; + static const uint8_t DISCON = 0x08; + static const uint8_t CLOSE = 0x10; + static const uint8_t SEND = 0x20; + static const uint8_t SEND_MAC = 0x21; + static const uint8_t SEND_KEEP = 0x22; + static const uint8_t RECV = 0x40; +}; +*/ + +class SnIR { +public: + static const uint8_t SEND_OK = 0x10; + static const uint8_t TIMEOUT = 0x08; + static const uint8_t RECV = 0x04; + static const uint8_t DISCON = 0x02; + static const uint8_t CON = 0x01; +}; + +class SnSR { +public: + static const uint8_t CLOSED = 0x00; + static const uint8_t INIT = 0x13; + static const uint8_t LISTEN = 0x14; + static const uint8_t SYNSENT = 0x15; + static const uint8_t SYNRECV = 0x16; + static const uint8_t ESTABLISHED = 0x17; + static const uint8_t FIN_WAIT = 0x18; + static const uint8_t CLOSING = 0x1A; + static const uint8_t TIME_WAIT = 0x1B; + static const uint8_t CLOSE_WAIT = 0x1C; + static const uint8_t LAST_ACK = 0x1D; + static const uint8_t UDP = 0x22; + static const uint8_t IPRAW = 0x32; + static const uint8_t MACRAW = 0x42; + static const uint8_t PPPOE = 0x5F; +}; + +class IPPROTO { +public: + static const uint8_t IP = 0; + static const uint8_t ICMP = 1; + static const uint8_t IGMP = 2; + static const uint8_t GGP = 3; + static const uint8_t TCP = 6; + static const uint8_t PUP = 12; + static const uint8_t UDP = 17; + static const uint8_t IDP = 22; + static const uint8_t ND = 77; + static const uint8_t RAW = 255; +}; + +class W5100Class { + +public: + void init(); + + /** + * @brief This function is being used for copy the data form Receive buffer of the chip to application buffer. + * + * It calculate the actual physical address where one has to read + * the data from Receive buffer. Here also take care of the condition while it exceed + * the Rx memory uper-bound of socket. + */ + void read_data(SOCKET s, volatile uint8_t * src, volatile uint8_t * dst, uint16_t len); + + /** + * @brief This function is being called by send() and sendto() function also. + * + * This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer + * register. User should read upper byte first and lower byte later to get proper value. + */ + void send_data_processing(SOCKET s, uint8_t *data, uint16_t len); + + /** + * @brief This function is being called by recv() also. + * + * This function read the Rx read pointer register + * and after copy the data from receive buffer update the Rx write pointer register. + * User should read upper byte first and lower byte later to get proper value. + */ + void recv_data_processing(SOCKET s, uint8_t *data, uint16_t len, uint8_t peek = 0); + + inline void setGatewayIp(uint8_t *_addr); + inline void getGatewayIp(uint8_t *_addr); + + inline void setSubnetMask(uint8_t *_addr); + inline void getSubnetMask(uint8_t *_addr); + + inline void setMACAddress(uint8_t * addr); + inline void getMACAddress(uint8_t * addr); + + inline void setIPAddress(uint8_t * addr); + inline void getIPAddress(uint8_t * addr); + + inline void setRetransmissionTime(uint16_t timeout); + inline void setRetransmissionCount(uint8_t _retry); + + void execCmdSn(SOCKET s, SockCMD _cmd); + + uint16_t getTXFreeSize(SOCKET s); + uint16_t getRXReceivedSize(SOCKET s); + + + // W5100 Registers + // --------------- +private: + static uint8_t write(uint16_t _addr, uint8_t _data); + static uint16_t write(uint16_t addr, uint8_t *buf, uint16_t len); + static uint8_t read(uint16_t addr); + static uint16_t read(uint16_t addr, uint8_t *buf, uint16_t len); + +#define __GP_REGISTER8(name, address) \ + static inline void write##name(uint8_t _data) { \ + write(address, _data); \ + } \ + static inline uint8_t read##name() { \ + return read(address); \ + } +#define __GP_REGISTER16(name, address) \ + static void write##name(uint16_t _data) { \ + write(address, _data >> 8); \ + write(address+1, _data & 0xFF); \ + } \ + static uint16_t read##name() { \ + uint16_t res = read(address); \ + res = (res << 8) + read(address + 1); \ + return res; \ + } +#define __GP_REGISTER_N(name, address, size) \ + static uint16_t write##name(uint8_t *_buff) { \ + return write(address, _buff, size); \ + } \ + static uint16_t read##name(uint8_t *_buff) { \ + return read(address, _buff, size); \ + } + +public: + __GP_REGISTER8 (MR, 0x0000); // Mode + __GP_REGISTER_N(GAR, 0x0001, 4); // Gateway IP address + __GP_REGISTER_N(SUBR, 0x0005, 4); // Subnet mask address + __GP_REGISTER_N(SHAR, 0x0009, 6); // Source MAC address + __GP_REGISTER_N(SIPR, 0x000F, 4); // Source IP address + __GP_REGISTER8 (IR, 0x0015); // Interrupt + __GP_REGISTER8 (IMR, 0x0016); // Interrupt Mask + __GP_REGISTER16(RTR, 0x0017); // Timeout address + __GP_REGISTER8 (RCR, 0x0019); // Retry count + __GP_REGISTER8 (RMSR, 0x001A); // Receive memory size + __GP_REGISTER8 (TMSR, 0x001B); // Transmit memory size + __GP_REGISTER8 (PATR, 0x001C); // Authentication type address in PPPoE mode + __GP_REGISTER8 (PTIMER, 0x0028); // PPP LCP Request Timer + __GP_REGISTER8 (PMAGIC, 0x0029); // PPP LCP Magic Number + __GP_REGISTER_N(UIPR, 0x002A, 4); // Unreachable IP address in UDP mode + __GP_REGISTER16(UPORT, 0x002E); // Unreachable Port address in UDP mode + +#undef __GP_REGISTER8 +#undef __GP_REGISTER16 +#undef __GP_REGISTER_N + + // W5100 Socket registers + // ---------------------- +private: + static inline uint8_t readSn(SOCKET _s, uint16_t _addr); + static inline uint8_t writeSn(SOCKET _s, uint16_t _addr, uint8_t _data); + static inline uint16_t readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); + static inline uint16_t writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); + + static const uint16_t CH_BASE = 0x0400; + static const uint16_t CH_SIZE = 0x0100; + +#define __SOCKET_REGISTER8(name, address) \ + static inline void write##name(SOCKET _s, uint8_t _data) { \ + writeSn(_s, address, _data); \ + } \ + static inline uint8_t read##name(SOCKET _s) { \ + return readSn(_s, address); \ + } +#define __SOCKET_REGISTER16(name, address) \ + static void write##name(SOCKET _s, uint16_t _data) { \ + writeSn(_s, address, _data >> 8); \ + writeSn(_s, address+1, _data & 0xFF); \ + } \ + static uint16_t read##name(SOCKET _s) { \ + uint16_t res = readSn(_s, address); \ + res = (res << 8) + readSn(_s, address + 1); \ + return res; \ + } +#define __SOCKET_REGISTER_N(name, address, size) \ + static uint16_t write##name(SOCKET _s, uint8_t *_buff) { \ + return writeSn(_s, address, _buff, size); \ + } \ + static uint16_t read##name(SOCKET _s, uint8_t *_buff) { \ + return readSn(_s, address, _buff, size); \ + } + +public: + __SOCKET_REGISTER8(SnMR, 0x0000) // Mode + __SOCKET_REGISTER8(SnCR, 0x0001) // Command + __SOCKET_REGISTER8(SnIR, 0x0002) // Interrupt + __SOCKET_REGISTER8(SnSR, 0x0003) // Status + __SOCKET_REGISTER16(SnPORT, 0x0004) // Source Port + __SOCKET_REGISTER_N(SnDHAR, 0x0006, 6) // Destination Hardw Addr + __SOCKET_REGISTER_N(SnDIPR, 0x000C, 4) // Destination IP Addr + __SOCKET_REGISTER16(SnDPORT, 0x0010) // Destination Port + __SOCKET_REGISTER16(SnMSSR, 0x0012) // Max Segment Size + __SOCKET_REGISTER8(SnPROTO, 0x0014) // Protocol in IP RAW Mode + __SOCKET_REGISTER8(SnTOS, 0x0015) // IP TOS + __SOCKET_REGISTER8(SnTTL, 0x0016) // IP TTL + __SOCKET_REGISTER16(SnTX_FSR, 0x0020) // TX Free Size + __SOCKET_REGISTER16(SnTX_RD, 0x0022) // TX Read Pointer + __SOCKET_REGISTER16(SnTX_WR, 0x0024) // TX Write Pointer + __SOCKET_REGISTER16(SnRX_RSR, 0x0026) // RX Free Size + __SOCKET_REGISTER16(SnRX_RD, 0x0028) // RX Read Pointer + __SOCKET_REGISTER16(SnRX_WR, 0x002A) // RX Write Pointer (supported?) + +#undef __SOCKET_REGISTER8 +#undef __SOCKET_REGISTER16 +#undef __SOCKET_REGISTER_N + + +private: + static const uint8_t RST = 7; // Reset BIT + + static const int SOCKETS = 4; + static const uint16_t SMASK = 0x07FF; // Tx buffer MASK + static const uint16_t RMASK = 0x07FF; // Rx buffer MASK +public: + static const uint16_t SSIZE = 2048; // Max Tx buffer size +private: + static const uint16_t RSIZE = 2048; // Max Rx buffer size + uint16_t SBASE[SOCKETS]; // Tx buffer base address + uint16_t RBASE[SOCKETS]; // Rx buffer base address + +private: +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + inline static void initSS() { DDRB |= _BV(4); }; + inline static void setSS() { PORTB &= ~_BV(4); }; + inline static void resetSS() { PORTB |= _BV(4); }; +#else + inline static void initSS() { DDRB |= _BV(2); }; + inline static void setSS() { PORTB &= ~_BV(2); }; + inline static void resetSS() { PORTB |= _BV(2); }; +#endif + +}; + +extern W5100Class W5100; + +uint8_t W5100Class::readSn(SOCKET _s, uint16_t _addr) { + return read(CH_BASE + _s * CH_SIZE + _addr); +} + +uint8_t W5100Class::writeSn(SOCKET _s, uint16_t _addr, uint8_t _data) { + return write(CH_BASE + _s * CH_SIZE + _addr, _data); +} + +uint16_t W5100Class::readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _len) { + return read(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); +} + +uint16_t W5100Class::writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _len) { + return write(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); +} + +void W5100Class::getGatewayIp(uint8_t *_addr) { + readGAR(_addr); +} + +void W5100Class::setGatewayIp(uint8_t *_addr) { + writeGAR(_addr); +} + +void W5100Class::getSubnetMask(uint8_t *_addr) { + readSUBR(_addr); +} + +void W5100Class::setSubnetMask(uint8_t *_addr) { + writeSUBR(_addr); +} + +void W5100Class::getMACAddress(uint8_t *_addr) { + readSHAR(_addr); +} + +void W5100Class::setMACAddress(uint8_t *_addr) { + writeSHAR(_addr); +} + +void W5100Class::getIPAddress(uint8_t *_addr) { + readSIPR(_addr); +} + +void W5100Class::setIPAddress(uint8_t *_addr) { + writeSIPR(_addr); +} + +void W5100Class::setRetransmissionTime(uint16_t _timeout) { + writeRTR(_timeout); +} + +void W5100Class::setRetransmissionCount(uint8_t _retry) { + writeRCR(_retry); +} + +#endif diff --git a/arduino-0022-linux-x64/libraries/Firmata/Boards.h b/arduino-0022-linux-x64/libraries/Firmata/Boards.h new file mode 100644 index 0000000..2036454 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Firmata/Boards.h @@ -0,0 +1,335 @@ +/* Boards.h - Hardware Abstraction Layer for Firmata library */ + +#ifndef Firmata_Boards_h +#define Firmata_Boards_h + +#include // for digitalRead, digitalWrite, etc + +// Normally Servo.h must be included before Firmata.h (which then includes +// this file). If Servo.h wasn't included, this allows the code to still +// compile, but without support for any Servos. Hopefully that's what the +// user intended by not including Servo.h +#ifndef MAX_SERVOS +#define MAX_SERVOS 0 +#endif + +/* + Firmata Hardware Abstraction Layer + +Firmata is built on top of the hardware abstraction functions of Arduino, +specifically digitalWrite, digitalRead, analogWrite, analogRead, and +pinMode. While these functions offer simple integer pin numbers, Firmata +needs more information than is provided by Arduino. This file provides +all other hardware specific details. To make Firmata support a new board, +only this file should require editing. + +The key concept is every "pin" implemented by Firmata may be mapped to +any pin as implemented by Arduino. Usually a simple 1-to-1 mapping is +best, but such mapping should not be assumed. This hardware abstraction +layer allows Firmata to implement any number of pins which map onto the +Arduino implemented pins in almost any arbitrary way. + + +General Constants: + +These constants provide basic information Firmata requires. + +TOTAL_PINS: The total number of pins Firmata implemented by Firmata. + Usually this will match the number of pins the Arduino functions + implement, including any pins pins capable of analog or digital. + However, Firmata may implement any number of pins. For example, + on Arduino Mini with 8 analog inputs, 6 of these may be used + for digital functions, and 2 are analog only. On such boards, + Firmata can implement more pins than Arduino's pinMode() + function, in order to accommodate those special pins. The + Firmata protocol supports a maximum of 128 pins, so this + constant must not exceed 128. + +TOTAL_ANALOG_PINS: The total number of analog input pins implemented. + The Firmata protocol allows up to 16 analog inputs, accessed + using offsets 0 to 15. Because Firmata presents the analog + inputs using different offsets than the actual pin numbers + (a legacy of Arduino's analogRead function, and the way the + analog input capable pins are physically labeled on all + Arduino boards), the total number of analog input signals + must be specified. 16 is the maximum. + +VERSION_BLINK_PIN: When Firmata starts up, it will blink the version + number. This constant is the Arduino pin number where a + LED is connected. + + +Pin Mapping Macros: + +These macros provide the mapping between pins as implemented by +Firmata protocol and the actual pin numbers used by the Arduino +functions. Even though such mappings are often simple, pin +numbers received by Firmata protocol should always be used as +input to these macros, and the result of the macro should be +used with with any Arduino function. + +When Firmata is extended to support a new pin mode or feature, +a pair of macros should be added and used for all hardware +access. For simple 1:1 mapping, these macros add no actual +overhead, yet their consistent use allows source code which +uses them consistently to be easily adapted to all other boards +with different requirements. + +IS_PIN_XXXX(pin): The IS_PIN macros resolve to true or non-zero + if a pin as implemented by Firmata corresponds to a pin + that actually implements the named feature. + +PIN_TO_XXXX(pin): The PIN_TO macros translate pin numbers as + implemented by Firmata to the pin numbers needed as inputs + to the Arduino functions. The corresponding IS_PIN macro + should always be tested before using a PIN_TO macro, so + these macros only need to handle valid Firmata pin + numbers for the named feature. + + +Port Access Inline Funtions: + +For efficiency, Firmata protocol provides access to digital +input and output pins grouped by 8 bit ports. When these +groups of 8 correspond to actual 8 bit ports as implemented +by the hardware, these inline functions can provide high +speed direct port access. Otherwise, a default implementation +using 8 calls to digitalWrite or digitalRead is used. + +When porting Firmata to a new board, it is recommended to +use the default functions first and focus only on the constants +and macros above. When those are working, if optimized port +access is desired, these inline functions may be extended. +The recommended approach defines a symbol indicating which +optimization to use, and then conditional complication is +used within these functions. + +readPort(port, bitmask): Read an 8 bit port, returning the value. + port: The port number, Firmata pins port*8 to port*8+7 + bitmask: The actual pins to read, indicated by 1 bits. + +writePort(port, value, bitmask): Write an 8 bit port. + port: The port number, Firmata pins port*8 to port*8+7 + value: The 8 bit value to write + bitmask: The actual pins to write, indicated by 1 bits. +*/ + +/*============================================================================== + * Board Specific Configuration + *============================================================================*/ + +// Arduino Duemilanove, Diecimila, and NG +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#define TOTAL_ANALOG_PINS 8 +#define TOTAL_PINS 24 // 14 digital + 2 unused + 8 analog +#define VERSION_BLINK_PIN 13 +#define IS_PIN_DIGITAL(p) (((p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21)) +#define IS_PIN_ANALOG(p) ((p) >= 16 && (p) <= 23) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (((p) < 16) ? (p) : (p) - 2) +#define PIN_TO_ANALOG(p) ((p) - 16) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) ((p) - 2) +#define ARDUINO_PINOUT_OPTIMIZE 1 + + +// old Arduinos +#elif defined(__AVR_ATmega8__) +#define TOTAL_ANALOG_PINS 6 +#define TOTAL_PINS 22 // 14 digital + 2 unused + 6 analog +#define VERSION_BLINK_PIN 13 +#define IS_PIN_DIGITAL(p) (((p) >= 2 && (p) <= 13) || ((p) >= 16 && (p) <= 21)) +#define IS_PIN_ANALOG(p) ((p) >= 16 && (p) <= 21) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 2 && (p) <= 13 && (p) - 2 < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (((p) < 16) ? (p) : (p) - 2) +#define PIN_TO_ANALOG(p) ((p) - 16) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) ((p) - 2) +#define ARDUINO_PINOUT_OPTIMIZE 1 + + +// Arduino Mega +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define TOTAL_ANALOG_PINS 16 +#define TOTAL_PINS 70 // 54 digital + 16 analog +#define VERSION_BLINK_PIN 13 +#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS) +#define IS_PIN_ANALOG(p) ((p) >= 54 && (p) < TOTAL_PINS) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 2 && (p) - 2 < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (p) +#define PIN_TO_ANALOG(p) ((p) - 54) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) ((p) - 2) + + +// Wiring +#elif defined(__AVR_ATmega128__) +#define TOTAL_ANALOG_PINS 8 +#define TOTAL_PINS 51 +#define VERSION_BLINK_PIN 48 +// TODO: hardware abstraction for wiring board + + +// Teensy 1.0 +#elif defined(__AVR_AT90USB162__) +#define TOTAL_ANALOG_PINS 0 +#define TOTAL_PINS 21 // 21 digital + no analog +#define VERSION_BLINK_PIN 6 +#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS) +#define IS_PIN_ANALOG(p) (0) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (p) +#define PIN_TO_ANALOG(p) (0) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) (p) + + +// Teensy 2.0 +#elif defined(__AVR_ATmega32U4__) +#define TOTAL_ANALOG_PINS 12 +#define TOTAL_PINS 25 // 11 digital + 12 analog +#define VERSION_BLINK_PIN 11 +#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS) +#define IS_PIN_ANALOG(p) ((p) >= 11 && (p) <= 22) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (p) +#define PIN_TO_ANALOG(p) (((p)<22)?21-(p):11) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) (p) + + +// Teensy++ 1.0 and 2.0 +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) +#define TOTAL_ANALOG_PINS 8 +#define TOTAL_PINS 46 // 38 digital + 8 analog +#define VERSION_BLINK_PIN 6 +#define IS_PIN_DIGITAL(p) ((p) >= 0 && (p) < TOTAL_PINS) +#define IS_PIN_ANALOG(p) ((p) >= 38 && (p) < TOTAL_PINS) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (p) +#define PIN_TO_ANALOG(p) ((p) - 38) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) (p) + + +// Sanguino +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) +#define TOTAL_ANALOG_PINS 8 +#define TOTAL_PINS 32 // 24 digital + 8 analog +#define VERSION_BLINK_PIN 0 +#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS) +#define IS_PIN_ANALOG(p) ((p) >= 24 && (p) < TOTAL_PINS) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (p) +#define PIN_TO_ANALOG(p) ((p) - 24) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) ((p) - 2) + + +// Illuminato +#elif defined(__AVR_ATmega645__) +#define TOTAL_ANALOG_PINS 6 +#define TOTAL_PINS 42 // 36 digital + 6 analog +#define VERSION_BLINK_PIN 13 +#define IS_PIN_DIGITAL(p) ((p) >= 2 && (p) < TOTAL_PINS) +#define IS_PIN_ANALOG(p) ((p) >= 36 && (p) < TOTAL_PINS) +#define IS_PIN_PWM(p) IS_PIN_DIGITAL(p) +#define IS_PIN_SERVO(p) ((p) >= 0 && (p) < MAX_SERVOS) +#define IS_PIN_I2C(p) (0) +#define PIN_TO_DIGITAL(p) (p) +#define PIN_TO_ANALOG(p) ((p) - 36) +#define PIN_TO_PWM(p) PIN_TO_DIGITAL(p) +#define PIN_TO_SERVO(p) ((p) - 2) + + +// anything else +#else +#error "Please edit Boards.h with a hardware abstraction for this board" +#endif + + +/*============================================================================== + * readPort() - Read an 8 bit port + *============================================================================*/ + +static inline unsigned char readPort(byte, byte) __attribute__((always_inline, unused)); +static inline unsigned char readPort(byte port, byte bitmask) +{ +#if defined(ARDUINO_PINOUT_OPTIMIZE) + if (port == 0) return PIND & B11111100 & bitmask; // ignore Rx/Tx 0/1 + if (port == 1) return PINB & B00111111 & bitmask; // pins 8-13 (14,15 are disabled for the crystal) + if (port == 2) return PINC & bitmask; + return 0; +#else + unsigned char out=0, pin=port*8; + if (IS_PIN_DIGITAL(pin+0) && (bitmask & 0x01) && digitalRead(PIN_TO_DIGITAL(pin+0))) out |= 0x01; + if (IS_PIN_DIGITAL(pin+1) && (bitmask & 0x02) && digitalRead(PIN_TO_DIGITAL(pin+1))) out |= 0x02; + if (IS_PIN_DIGITAL(pin+2) && (bitmask & 0x04) && digitalRead(PIN_TO_DIGITAL(pin+2))) out |= 0x04; + if (IS_PIN_DIGITAL(pin+3) && (bitmask & 0x08) && digitalRead(PIN_TO_DIGITAL(pin+3))) out |= 0x08; + if (IS_PIN_DIGITAL(pin+4) && (bitmask & 0x10) && digitalRead(PIN_TO_DIGITAL(pin+4))) out |= 0x10; + if (IS_PIN_DIGITAL(pin+5) && (bitmask & 0x20) && digitalRead(PIN_TO_DIGITAL(pin+5))) out |= 0x20; + if (IS_PIN_DIGITAL(pin+6) && (bitmask & 0x40) && digitalRead(PIN_TO_DIGITAL(pin+6))) out |= 0x40; + if (IS_PIN_DIGITAL(pin+7) && (bitmask & 0x80) && digitalRead(PIN_TO_DIGITAL(pin+7))) out |= 0x80; + return out; +#endif +} + +/*============================================================================== + * writePort() - Write an 8 bit port, only touch pins specified by a bitmask + *============================================================================*/ + +static inline unsigned char writePort(byte, byte, byte) __attribute__((always_inline, unused)); +static inline unsigned char writePort(byte port, byte value, byte bitmask) +{ +#if defined(ARDUINO_PINOUT_OPTIMIZE) + if (port == 0) { + bitmask = bitmask & 0xFC; // Tx & Rx pins + cli(); + PORTD = (PORTD & ~bitmask) | (bitmask & value); + sei(); + } else if (port == 1) { + cli(); + PORTB = (PORTB & ~bitmask) | (bitmask & value); + sei(); + } else if (port == 2) { + cli(); + PORTC = (PORTC & ~bitmask) | (bitmask & value); + sei(); + } +#else + byte pin=port*8; + if ((bitmask & 0x01)) digitalWrite(PIN_TO_DIGITAL(pin+0), (value & 0x01)); + if ((bitmask & 0x02)) digitalWrite(PIN_TO_DIGITAL(pin+1), (value & 0x02)); + if ((bitmask & 0x04)) digitalWrite(PIN_TO_DIGITAL(pin+2), (value & 0x04)); + if ((bitmask & 0x08)) digitalWrite(PIN_TO_DIGITAL(pin+3), (value & 0x08)); + if ((bitmask & 0x10)) digitalWrite(PIN_TO_DIGITAL(pin+4), (value & 0x10)); + if ((bitmask & 0x20)) digitalWrite(PIN_TO_DIGITAL(pin+5), (value & 0x20)); + if ((bitmask & 0x40)) digitalWrite(PIN_TO_DIGITAL(pin+6), (value & 0x40)); + if ((bitmask & 0x80)) digitalWrite(PIN_TO_DIGITAL(pin+7), (value & 0x80)); +#endif +} + + + + +#ifndef TOTAL_PORTS +#define TOTAL_PORTS ((TOTAL_PINS + 7) / 8) +#endif + + +#endif /* Firmata_Boards_h */ + diff --git a/arduino-0018-linux-x64/libraries/Firmata/Firmata.cpp b/arduino-0022-linux-x64/libraries/Firmata/Firmata.cpp similarity index 100% rename from arduino-0018-linux-x64/libraries/Firmata/Firmata.cpp rename to arduino-0022-linux-x64/libraries/Firmata/Firmata.cpp diff --git a/arduino-0018-linux-x64/libraries/Firmata/Firmata.h b/arduino-0022-linux-x64/libraries/Firmata/Firmata.h similarity index 57% rename from arduino-0018-linux-x64/libraries/Firmata/Firmata.h rename to arduino-0022-linux-x64/libraries/Firmata/Firmata.h index 899d845..9e8dda0 100644 --- a/arduino-0018-linux-x64/libraries/Firmata/Firmata.h +++ b/arduino-0022-linux-x64/libraries/Firmata/Firmata.h @@ -22,7 +22,7 @@ * software can test whether it will be compatible with the currently * installed firmware. */ #define FIRMATA_MAJOR_VERSION 2 // for non-compatible changes -#define FIRMATA_MINOR_VERSION 1 // for backwards compatible changes +#define FIRMATA_MINOR_VERSION 2 // for backwards compatible changes #define MAX_DATA_BYTES 32 // max number of data bytes in non-Sysex messages @@ -47,7 +47,14 @@ #define SHIFT_DATA 0x75 // a bitstream to/from a shift register #define I2C_REQUEST 0x76 // send an I2C read/write request #define I2C_REPLY 0x77 // a reply to an I2C read request -#define I2C_CONFIG 0x78 // config I2C settings such as delay times and power pins +#define I2C_CONFIG 0x78 // config I2C settings such as delay times and power pins +#define EXTENDED_ANALOG 0x6F // analog write (PWM, Servo, etc) to any pin +#define PIN_STATE_QUERY 0x6D // ask for a pin's current mode and value +#define PIN_STATE_RESPONSE 0x6E // reply with pin's current mode and value +#define CAPABILITY_QUERY 0x6B // ask for supported modes and resolution of all pins +#define CAPABILITY_RESPONSE 0x6C // reply with supported modes and resolution +#define ANALOG_MAPPING_QUERY 0x69 // ask for mapping of analog to pin numbers +#define ANALOG_MAPPING_RESPONSE 0x6A // reply with mapping info #define REPORT_FIRMWARE 0x79 // report name and version of the firmware #define SAMPLING_INTERVAL 0x7A // set the poll rate of the main loop #define SYSEX_NON_REALTIME 0x7E // MIDI Reserved for non-realtime messages @@ -66,6 +73,7 @@ #define SERVO 0x04 // digital pin in Servo output mode #define SHIFT 0x05 // shiftIn/shiftOut mode #define I2C 0x06 // pin included in I2C setup +#define TOTAL_PIN_MODES 7 extern "C" { // callback function types @@ -147,84 +155,8 @@ extern FirmataClass Firmata; */ #define setFirmwareVersion(x, y) setFirmwareNameAndVersion(__FILE__, x, y) -// total number of pins currently supported -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) // Arduino NG and Diecimila -#define TOTAL_ANALOG_PINS 8 -#define TOTAL_DIGITAL_PINS 22 // 14 digital + 8 analog -#define TOTAL_PORTS 3 // total number of ports for the board -#define ANALOG_PORT 2 // port# of analog used as digital -#define FIRST_ANALOG_PIN 14 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 13 // digital pin to blink version on -#define FIRST_SERVO_PIN 2 // pin# of the first servo pin -#elif defined(__AVR_ATmega8__) // old Arduinos -#define TOTAL_ANALOG_PINS 6 -#define TOTAL_DIGITAL_PINS 20 // 14 digital + 6 analog -#define TOTAL_PORTS 3 // total number of ports for the board -#define ANALOG_PORT 2 // port# of analog used as digital -#define FIRST_ANALOG_PIN 14 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 13 // digital pin to blink version on -#define FIRST_SERVO_PIN 2 // pin# of the first servo pin -#elif defined(__AVR_ATmega1280__)// Arduino Mega -#define TOTAL_ANALOG_PINS 16 -#define TOTAL_DIGITAL_PINS 70 // 54 digital + 16 analog -#define TOTAL_PORTS 9 // total number of ports for the board -#define ANALOG_PORT 8 // port# of analog used as digital -#define FIRST_ANALOG_PIN 54 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 13 // digital pin to blink version on -#define FIRST_SERVO_PIN 2 // pin# of the first servo pin -#elif defined(__AVR_ATmega128__)// Wiring -#define TOTAL_ANALOG_PINS 8 -#define TOTAL_DIGITAL_PINS 51 -#define TOTAL_PORTS 7 // total number of ports for the board -#define ANALOG_PORT 5 // port# of analog used as digital -#define FIRST_ANALOG_PIN 40 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 48 // digital pin to blink version on -#define FIRST_SERVO_PIN 8 // pin# of the first servo pin -#elif defined(__AVR_AT90USB162__) // Teensy -#define TOTAL_ANALOG_PINS 0 -#define TOTAL_DIGITAL_PINS 21 // 21 digital + no analog -#define TOTAL_PORTS 4 // total number of ports for the board -#define ANALOG_PORT 3 // port# of analog used as digital -#define FIRST_ANALOG_PIN 21 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 6 // digital pin to blink version on -#elif defined(__AVR_ATmega32U4__) // Teensy -#define TOTAL_ANALOG_PINS 12 -#define TOTAL_DIGITAL_PINS 25 // 11 digital + 12 analog -#define TOTAL_PORTS 4 // total number of ports for the board -#define ANALOG_PORT 3 // port# of analog used as digital -#define FIRST_ANALOG_PIN 11 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 11 // digital pin to blink version on -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) // Teensy++ -#define TOTAL_ANALOG_PINS 8 -#define TOTAL_DIGITAL_PINS 46 // 38 digital + 8 analog -#define TOTAL_PORTS 6 // total number of ports for the board -#define ANALOG_PORT 5 // port# of analog used as digital -#define FIRST_ANALOG_PIN 38 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 6 // digital pin to blink version on -#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) // Sanguino -#define TOTAL_ANALOG_PINS 8 -#define TOTAL_DIGITAL_PINS 32 // 24 digital + 8 analog -#define TOTAL_PORTS 4 // total number of ports for the board -#define ANALOG_PORT 3 // port# of analog used as digital -#define FIRST_ANALOG_PIN 24 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 0 // digital pin to blink version on -#elif defined(__AVR_ATmega645__) // Illuminato -#define TOTAL_ANALOG_PINS 6 -#define TOTAL_DIGITAL_PINS 42 // 36 digital + 6 analog -#define TOTAL_PORTS 6 // total number of ports for the board -#define ANALOG_PORT 4 // port# of analog used as digital -#define FIRST_ANALOG_PIN 36 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 13 // digital pin to blink version on -#else // anything else -#define TOTAL_ANALOG_PINS 6 -#define TOTAL_DIGITAL_PINS 14 -#define TOTAL_PORTS 3 // total number of ports for the board -#define ANALOG_PORT 2 // port# of analog used as digital -#define FIRST_ANALOG_PIN 14 // pin# corresponding to analog 0 -#define VERSION_BLINK_PIN 13 // digital pin to blink version on -#endif - - +/* Hardware Abstraction Layer */ +#include "Boards.h" #endif /* Firmata_h */ diff --git a/arduino-0018-linux-x64/libraries/Firmata/LICENSE.txt b/arduino-0022-linux-x64/libraries/Firmata/LICENSE.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/Firmata/LICENSE.txt rename to arduino-0022-linux-x64/libraries/Firmata/LICENSE.txt diff --git a/arduino-0018-linux-x64/libraries/Firmata/TODO.txt b/arduino-0022-linux-x64/libraries/Firmata/TODO.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/Firmata/TODO.txt rename to arduino-0022-linux-x64/libraries/Firmata/TODO.txt diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde b/arduino-0022-linux-x64/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde similarity index 67% rename from arduino-0018-linux-x64/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde rename to arduino-0022-linux-x64/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde index cd50791..5bca72a 100644 --- a/arduino-0018-linux-x64/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde +++ b/arduino-0022-linux-x64/libraries/Firmata/examples/AllInputsFirmata/AllInputsFirmata.pde @@ -11,19 +11,19 @@ byte pin; int analogValue; int previousAnalogValues[TOTAL_ANALOG_PINS]; -byte portStatus[TOTAL_PORTS]; +byte portStatus[TOTAL_PORTS]; // each bit: 1=pin is digital input, 0=other/ignore byte previousPINs[TOTAL_PORTS]; /* timer variables */ unsigned long currentMillis; // store the current value from millis() -unsigned long nextExecuteMillis; // for comparison with currentMillis +unsigned long previousMillis; // for comparison with currentMillis /* make sure that the FTDI buffer doesn't go over 60 bytes, otherwise you get long, random delays. So only read analogs every 20ms or so */ int samplingInterval = 19; // how often to run the main loop (in ms) void sendPort(byte portNumber, byte portValue) { - portValue = portValue &~ portStatus[portNumber]; + portValue = portValue & portStatus[portNumber]; if(previousPINs[portNumber] != portValue) { Firmata.sendDigitalPort(portNumber, portValue); previousPINs[portNumber] = portValue; @@ -32,29 +32,37 @@ void sendPort(byte portNumber, byte portValue) void setup() { + byte i, port, status; + Firmata.setFirmwareVersion(0, 1); - for(pin = 0; pin < TOTAL_DIGITAL_PINS; pin++) { - pinMode(pin, INPUT); + for(pin = 0; pin < TOTAL_PINS; pin++) { + if IS_PIN_DIGITAL(pin) pinMode(PIN_TO_DIGITAL(pin), INPUT); } - portStatus[0] = B00000011; // ignore Tx/RX pins - portStatus[1] = B11000000; // ignore 14/15 pins - portStatus[2] = B00000000; + for (port=0; port nextExecuteMillis) { - nextExecuteMillis = currentMillis + samplingInterval; + if(currentMillis - previousMillis > samplingInterval) { + previousMillis += samplingInterval; while(Firmata.available()) { Firmata.processInput(); } diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde b/arduino-0022-linux-x64/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde similarity index 93% rename from arduino-0018-linux-x64/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde rename to arduino-0022-linux-x64/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde index ab83726..df8b674 100644 --- a/arduino-0018-linux-x64/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde +++ b/arduino-0022-linux-x64/libraries/Firmata/examples/AnalogFirmata/AnalogFirmata.pde @@ -3,8 +3,8 @@ * * This example code is in the public domain. */ -#include #include +#include /*============================================================================== * GLOBAL VARIABLES @@ -17,7 +17,7 @@ int analogInputsToReport = 0; // bitwise array to store pin reporting int analogPin = 0; // counter for reading analog pins /* timer variables */ unsigned long currentMillis; // store the current value from millis() -unsigned long nextExecuteMillis; // for comparison with currentMillis +unsigned long previousMillis; // for comparison with currentMillis /*============================================================================== @@ -72,8 +72,8 @@ void loop() while(Firmata.available()) Firmata.processInput(); currentMillis = millis(); - if(currentMillis > nextExecuteMillis) { - nextExecuteMillis = currentMillis + 19; // run this every 20ms + if(currentMillis - previousMillis > 20) { + previousMillis += 20; // run this every 20ms for(analogPin=0;analogPin nextExecuteMillis) { - nextExecuteMillis = currentMillis + samplingInterval; + if (currentMillis - previousMillis > samplingInterval) { + previousMillis += samplingInterval; for (byte i = 0; i < queryIndex; i++) { readAndReportData(query[i].addr, query[i].reg, query[i].bytes); diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/OldStandardFirmata/LICENSE.txt b/arduino-0022-linux-x64/libraries/Firmata/examples/OldStandardFirmata/LICENSE.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/Firmata/examples/OldStandardFirmata/LICENSE.txt rename to arduino-0022-linux-x64/libraries/Firmata/examples/OldStandardFirmata/LICENSE.txt diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde b/arduino-0022-linux-x64/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde similarity index 93% rename from arduino-0018-linux-x64/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde rename to arduino-0022-linux-x64/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde index 5dd3679..56a47ac 100644 --- a/arduino-0018-linux-x64/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde +++ b/arduino-0022-linux-x64/libraries/Firmata/examples/OldStandardFirmata/OldStandardFirmata.pde @@ -30,12 +30,12 @@ int analogPin = 0; // counter for reading analog pins /* digital pins */ byte reportPINs[TOTAL_PORTS]; // PIN == input port byte previousPINs[TOTAL_PORTS]; // PIN == input port -byte pinStatus[TOTAL_DIGITAL_PINS]; // store pin status, default OUTPUT +byte pinStatus[TOTAL_PINS]; // store pin status, default OUTPUT byte portStatus[TOTAL_PORTS]; /* timer variables */ unsigned long currentMillis; // store the current value from millis() -unsigned long nextExecuteMillis; // for comparison with currentMillis +unsigned long previousMillis; // for comparison with currentMillis /*============================================================================== @@ -63,7 +63,7 @@ void checkDigitalInputs(void) switch(i) { case 0: outputPort(0, PIND &~ B00000011); break; // ignore Rx/Tx 0/1 case 1: outputPort(1, PINB); break; - case ANALOG_PORT: outputPort(ANALOG_PORT, PINC); break; + case 2: outputPort(2, PINC); break; } } } @@ -150,7 +150,7 @@ void reportAnalogCallback(byte pin, int value) void reportDigitalCallback(byte port, int value) { reportPINs[port] = (byte)value; - if(port == ANALOG_PORT) // turn off analog reporting when used as digital + if(port == 2) // turn off analog reporting when used as digital analogInputsToReport = 0; } @@ -173,7 +173,7 @@ void setup() portStatus[1] = B11000000; // ignore 14/15 pins portStatus[2] = B00000000; -// for(i=0; i nextExecuteMillis) { - nextExecuteMillis = currentMillis + 19; // run this every 20ms + if(currentMillis - previousMillis > 20) { + previousMillis += 20; // run this every 20ms /* SERIALREAD - Serial.read() uses a 128 byte circular buffer, so handle * all serialReads at once, i.e. empty the buffer */ while(Firmata.available()) diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/ServoFirmata/Makefile b/arduino-0022-linux-x64/libraries/Firmata/examples/ServoFirmata/Makefile similarity index 100% rename from arduino-0018-linux-x64/libraries/Firmata/examples/ServoFirmata/Makefile rename to arduino-0022-linux-x64/libraries/Firmata/examples/ServoFirmata/Makefile diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde b/arduino-0022-linux-x64/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde similarity index 61% rename from arduino-0018-linux-x64/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde rename to arduino-0022-linux-x64/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde index fa48e2b..6f78ccd 100644 --- a/arduino-0018-linux-x64/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde +++ b/arduino-0022-linux-x64/libraries/Firmata/examples/ServoFirmata/ServoFirmata.pde @@ -1,32 +1,35 @@ -/* This firmware supports as many servos as possible using the Servo" library - * included in Arduino 0012 +/* This firmware supports as many servos as possible using the Servo library + * included in Arduino 0017 * * TODO add message to configure minPulse/maxPulse/degrees * * This example code is in the public domain. */ -#include #include +#include -Servo servo9; -Servo servo10; +Servo servos[MAX_SERVOS]; void analogWriteCallback(byte pin, int value) { - if(pin == 9) - servo9.write(value); - if(pin == 10) - servo10.write(value); + if (IS_PIN_SERVO(pin)) { + servos[PIN_TO_SERVO(pin)].write(value); + } } void setup() { + byte pin; + Firmata.setFirmwareVersion(0, 2); Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); - servo9.attach(9); - servo10.attach(10); + for (pin=0; pin < TOTAL_PINS; pin++) { + if (IS_PIN_SERVO(pin)) { + servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin)); + } + } Firmata.begin(57600); } diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile b/arduino-0022-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile similarity index 100% rename from arduino-0018-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile rename to arduino-0022-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/Makefile diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde b/arduino-0022-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde similarity index 51% rename from arduino-0018-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde rename to arduino-0022-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde index 430d0d0..b505b33 100644 --- a/arduino-0018-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde +++ b/arduino-0022-linux-x64/libraries/Firmata/examples/SimpleAnalogFirmata/SimpleAnalogFirmata.pde @@ -4,12 +4,14 @@ */ #include -byte analogPin; +byte analogPin = 0; void analogWriteCallback(byte pin, int value) { - pinMode(pin,OUTPUT); - analogWrite(pin, value); + if (IS_PIN_PWM(pin)) { + pinMode(PIN_TO_DIGITAL(pin), OUTPUT); + analogWrite(PIN_TO_PWM(pin), value); + } } void setup() @@ -24,9 +26,10 @@ void loop() while(Firmata.available()) { Firmata.processInput(); } - for(analogPin = 0; analogPin < TOTAL_ANALOG_PINS; analogPin++) { - Firmata.sendAnalog(analogPin, analogRead(analogPin)); - } + // do one analogRead per loop, so if PC is sending a lot of + // analog write messages, we will only delay 1 analogRead + Firmata.sendAnalog(analogPin, analogRead(analogPin)); + analogPin = analogPin + 1; + if (analogPin >= TOTAL_ANALOG_PINS) analogPin = 0; } - diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile b/arduino-0022-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile similarity index 100% rename from arduino-0018-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile rename to arduino-0022-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/Makefile diff --git a/arduino-0018-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde b/arduino-0022-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde similarity index 70% rename from arduino-0018-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde rename to arduino-0022-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde index 50b54dd..64b566e 100644 --- a/arduino-0018-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde +++ b/arduino-0022-linux-x64/libraries/Firmata/examples/SimpleDigitalFirmata/SimpleDigitalFirmata.pde @@ -4,21 +4,21 @@ */ #include -byte previousPIN[2]; // PIN means PORT for input -byte previousPORT[2]; +byte previousPIN[TOTAL_PORTS]; // PIN means PORT for input +byte previousPORT[TOTAL_PORTS]; void outputPort(byte portNumber, byte portValue) { -// only send the data when it changes, otherwise you get too many messages! - if(previousPIN[portNumber] != portValue) { + // only send the data when it changes, otherwise you get too many messages! + if (previousPIN[portNumber] != portValue) { Firmata.sendDigitalPort(portNumber, portValue); previousPIN[portNumber] = portValue; } } void setPinModeCallback(byte pin, int mode) { - if(pin > 1) { // don't touch RxTx pins (0,1) - pinMode(pin, mode); + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), mode); } } @@ -27,7 +27,7 @@ void digitalWriteCallback(byte port, int value) byte i; byte currentPinValue, previousPinValue; - if(value != previousPORT[port]) { + if (port < TOTAL_PORTS && value != previousPORT[port]) { for(i=0; i<8; i++) { currentPinValue = (byte) value & (1 << i); previousPinValue = previousPORT[port] & (1 << i); @@ -49,8 +49,12 @@ void setup() void loop() { - outputPort(0, PIND &~ B00000011); // pins 0-7, ignoring Rx/Tx pins (0/1) - outputPort(1, PINB); // pins 8-13 + byte i; + + for (i=0; i +#include + +/*============================================================================== + * GLOBAL VARIABLES + *============================================================================*/ + +/* analog inputs */ +int analogInputsToReport = 0; // bitwise array to store pin reporting + +/* digital input ports */ +byte reportPINs[TOTAL_PORTS]; // 1 = report this port, 0 = silence +byte previousPINs[TOTAL_PORTS]; // previous 8 bits sent + +/* pins configuration */ +byte pinConfig[TOTAL_PINS]; // configuration of every pin +byte portConfigInputs[TOTAL_PORTS]; // each bit: 1 = pin in INPUT, 0 = anything else +int pinState[TOTAL_PINS]; // any value that has been written + +/* timer variables */ +unsigned long currentMillis; // store the current value from millis() +unsigned long previousMillis; // for comparison with currentMillis +int samplingInterval = 19; // how often to run the main loop (in ms) + +Servo servos[MAX_SERVOS]; + +/*============================================================================== + * FUNCTIONS + *============================================================================*/ + +void outputPort(byte portNumber, byte portValue, byte forceSend) +{ + // pins not configured as INPUT are cleared to zeros + portValue = portValue & portConfigInputs[portNumber]; + // only send if the value is different than previously sent + if(forceSend || previousPINs[portNumber] != portValue) { + Firmata.sendDigitalPort(portNumber, portValue); + previousPINs[portNumber] = portValue; + } +} + +/* ----------------------------------------------------------------------------- + * check all the active digital inputs for change of state, then add any events + * to the Serial output queue using Serial.print() */ +void checkDigitalInputs(void) +{ + /* Using non-looping code allows constants to be given to readPort(). + * The compiler will apply substantial optimizations if the inputs + * to readPort() are compile-time constants. */ + if (TOTAL_PORTS > 0 && reportPINs[0]) outputPort(0, readPort(0, portConfigInputs[0]), false); + if (TOTAL_PORTS > 1 && reportPINs[1]) outputPort(1, readPort(1, portConfigInputs[1]), false); + if (TOTAL_PORTS > 2 && reportPINs[2]) outputPort(2, readPort(2, portConfigInputs[2]), false); + if (TOTAL_PORTS > 3 && reportPINs[3]) outputPort(3, readPort(3, portConfigInputs[3]), false); + if (TOTAL_PORTS > 4 && reportPINs[4]) outputPort(4, readPort(4, portConfigInputs[4]), false); + if (TOTAL_PORTS > 5 && reportPINs[5]) outputPort(5, readPort(5, portConfigInputs[5]), false); + if (TOTAL_PORTS > 6 && reportPINs[6]) outputPort(6, readPort(6, portConfigInputs[6]), false); + if (TOTAL_PORTS > 7 && reportPINs[7]) outputPort(7, readPort(7, portConfigInputs[7]), false); + if (TOTAL_PORTS > 8 && reportPINs[8]) outputPort(8, readPort(8, portConfigInputs[8]), false); + if (TOTAL_PORTS > 9 && reportPINs[9]) outputPort(9, readPort(9, portConfigInputs[9]), false); + if (TOTAL_PORTS > 10 && reportPINs[10]) outputPort(10, readPort(10, portConfigInputs[10]), false); + if (TOTAL_PORTS > 11 && reportPINs[11]) outputPort(11, readPort(11, portConfigInputs[11]), false); + if (TOTAL_PORTS > 12 && reportPINs[12]) outputPort(12, readPort(12, portConfigInputs[12]), false); + if (TOTAL_PORTS > 13 && reportPINs[13]) outputPort(13, readPort(13, portConfigInputs[13]), false); + if (TOTAL_PORTS > 14 && reportPINs[14]) outputPort(14, readPort(14, portConfigInputs[14]), false); + if (TOTAL_PORTS > 15 && reportPINs[15]) outputPort(15, readPort(15, portConfigInputs[15]), false); +} + +// ----------------------------------------------------------------------------- +/* sets the pin mode to the correct state and sets the relevant bits in the + * two bit-arrays that track Digital I/O and PWM status + */ +void setPinModeCallback(byte pin, int mode) +{ + if (IS_PIN_SERVO(pin) && mode != SERVO && servos[PIN_TO_SERVO(pin)].attached()) { + servos[PIN_TO_SERVO(pin)].detach(); + } + if (IS_PIN_ANALOG(pin)) { + reportAnalogCallback(PIN_TO_ANALOG(pin), mode == ANALOG ? 1 : 0); // turn on/off reporting + } + if (IS_PIN_DIGITAL(pin)) { + if (mode == INPUT) { + portConfigInputs[pin/8] |= (1 << (pin & 7)); + } else { + portConfigInputs[pin/8] &= ~(1 << (pin & 7)); + } + } + pinState[pin] = 0; + switch(mode) { + case ANALOG: + if (IS_PIN_ANALOG(pin)) { + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups + } + pinConfig[pin] = ANALOG; + } + break; + case INPUT: + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups + pinConfig[pin] = INPUT; + } + break; + case OUTPUT: + if (IS_PIN_DIGITAL(pin)) { + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable PWM + pinMode(PIN_TO_DIGITAL(pin), OUTPUT); + pinConfig[pin] = OUTPUT; + } + break; + case PWM: + if (IS_PIN_PWM(pin)) { + pinMode(PIN_TO_PWM(pin), OUTPUT); + analogWrite(PIN_TO_PWM(pin), 0); + pinConfig[pin] = PWM; + } + break; + case SERVO: + if (IS_PIN_SERVO(pin)) { + pinConfig[pin] = SERVO; + if (!servos[PIN_TO_SERVO(pin)].attached()) { + servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin)); + } else { + Firmata.sendString("Servo only on pins from 2 to 13"); + } + } + break; + case I2C: + pinConfig[pin] = mode; + Firmata.sendString("I2C mode not yet supported"); + break; + default: + Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM + } + // TODO: save status to EEPROM here, if changed +} + +void analogWriteCallback(byte pin, int value) +{ + if (pin < TOTAL_PINS) { + switch(pinConfig[pin]) { + case SERVO: + if (IS_PIN_SERVO(pin)) + servos[PIN_TO_SERVO(pin)].write(value); + pinState[pin] = value; + break; + case PWM: + if (IS_PIN_PWM(pin)) + analogWrite(PIN_TO_PWM(pin), value); + pinState[pin] = value; + break; + } + } +} + +void digitalWriteCallback(byte port, int value) +{ + byte pin, lastPin, mask=1, pinWriteMask=0; + + if (port < TOTAL_PORTS) { + // create a mask of the pins on this port that are writable. + lastPin = port*8+8; + if (lastPin > TOTAL_PINS) lastPin = TOTAL_PINS; + for (pin=port*8; pin < lastPin; pin++) { + // do not disturb non-digital pins (eg, Rx & Tx) + if (IS_PIN_DIGITAL(pin)) { + // only write to OUTPUT and INPUT (enables pullup) + // do not touch pins in PWM, ANALOG, SERVO or other modes + if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) { + pinWriteMask |= mask; + pinState[pin] = ((byte)value & mask) ? 1 : 0; + } + } + mask = mask << 1; + } + writePort(port, (byte)value, pinWriteMask); + } +} + + +// ----------------------------------------------------------------------------- +/* sets bits in a bit array (int) to toggle the reporting of the analogIns + */ +//void FirmataClass::setAnalogPinReporting(byte pin, byte state) { +//} +void reportAnalogCallback(byte analogPin, int value) +{ + if (analogPin < TOTAL_ANALOG_PINS) { + if(value == 0) { + analogInputsToReport = analogInputsToReport &~ (1 << analogPin); + } else { + analogInputsToReport = analogInputsToReport | (1 << analogPin); + } + } + // TODO: save status to EEPROM here, if changed +} + +void reportDigitalCallback(byte port, int value) +{ + if (port < TOTAL_PORTS) { + reportPINs[port] = (byte)value; + } + // do not disable analog reporting on these 8 pins, to allow some + // pins used for digital, others analog. Instead, allow both types + // of reporting to be enabled, but check if the pin is configured + // as analog when sampling the analog inputs. Likewise, while + // scanning digital pins, portConfigInputs will mask off values from any + // pins configured as analog +} + +/*============================================================================== + * SYSEX-BASED commands + *============================================================================*/ + +void sysexCallback(byte command, byte argc, byte *argv) +{ + switch(command) { + case SERVO_CONFIG: + if(argc > 4) { + // these vars are here for clarity, they'll optimized away by the compiler + byte pin = argv[0]; + int minPulse = argv[1] + (argv[2] << 7); + int maxPulse = argv[3] + (argv[4] << 7); + + if (IS_PIN_SERVO(pin)) { + // servos are pins from 2 to 13, so offset for array + if (servos[PIN_TO_SERVO(pin)].attached()) + servos[PIN_TO_SERVO(pin)].detach(); + servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse); + setPinModeCallback(pin, SERVO); + } + } + break; + case SAMPLING_INTERVAL: + if (argc > 1) + samplingInterval = argv[0] + (argv[1] << 7); + else + Firmata.sendString("Not enough data"); + break; + case EXTENDED_ANALOG: + if (argc > 1) { + int val = argv[1]; + if (argc > 2) val |= (argv[2] << 7); + if (argc > 3) val |= (argv[3] << 14); + analogWriteCallback(argv[0], val); + } + break; + case CAPABILITY_QUERY: + Serial.write(START_SYSEX); + Serial.write(CAPABILITY_RESPONSE); + for (byte pin=0; pin < TOTAL_PINS; pin++) { + if (IS_PIN_DIGITAL(pin)) { + Serial.write((byte)INPUT); + Serial.write(1); + Serial.write((byte)OUTPUT); + Serial.write(1); + } + if (IS_PIN_ANALOG(pin)) { + Serial.write(ANALOG); + Serial.write(10); + } + if (IS_PIN_PWM(pin)) { + Serial.write(PWM); + Serial.write(8); + } + if (IS_PIN_SERVO(pin)) { + Serial.write(SERVO); + Serial.write(14); + } + Serial.write(127); + } + Serial.write(END_SYSEX); + break; + case PIN_STATE_QUERY: + if (argc > 0) { + byte pin=argv[0]; + Serial.write(START_SYSEX); + Serial.write(PIN_STATE_RESPONSE); + Serial.write(pin); + if (pin < TOTAL_PINS) { + Serial.write((byte)pinConfig[pin]); + Serial.write((byte)pinState[pin] & 0x7F); + if (pinState[pin] & 0xFF80) Serial.write((byte)(pinState[pin] >> 7) & 0x7F); + if (pinState[pin] & 0xC000) Serial.write((byte)(pinState[pin] >> 14) & 0x7F); + } + Serial.write(END_SYSEX); + } + break; + case ANALOG_MAPPING_QUERY: + Serial.write(START_SYSEX); + Serial.write(ANALOG_MAPPING_RESPONSE); + for (byte pin=0; pin < TOTAL_PINS; pin++) { + Serial.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127); + } + Serial.write(END_SYSEX); + break; + } +} + + +/*============================================================================== + * SETUP() + *============================================================================*/ +void setup() +{ + byte i; + + Firmata.setFirmwareVersion(2, 2); + + Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); + Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); + Firmata.attach(REPORT_ANALOG, reportAnalogCallback); + Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); + Firmata.attach(SET_PIN_MODE, setPinModeCallback); + Firmata.attach(START_SYSEX, sysexCallback); + + // TODO: load state from EEPROM here + + /* these are initialized to zero by the compiler startup code + for (i=0; i < TOTAL_PORTS; i++) { + reportPINs[i] = false; + portConfigInputs[i] = 0; + previousPINs[i] = 0; + } + */ + for (i=0; i < TOTAL_PINS; i++) { + if (IS_PIN_ANALOG(i)) { + // turns off pullup, configures everything + setPinModeCallback(i, ANALOG); + } else { + // sets the output to 0, configures portConfigInputs + setPinModeCallback(i, OUTPUT); + } + } + // by defult, do not report any analog inputs + analogInputsToReport = 0; + + Firmata.begin(57600); + + /* send digital inputs to set the initial state on the host computer, + * since once in the loop(), this firmware will only send on change */ + for (i=0; i < TOTAL_PORTS; i++) { + outputPort(i, readPort(i, portConfigInputs[i]), true); + } +} + +/*============================================================================== + * LOOP() + *============================================================================*/ +void loop() +{ + byte pin, analogPin; + + /* DIGITALREAD - as fast as possible, check for changes and output them to the + * FTDI buffer using Serial.print() */ + checkDigitalInputs(); + + /* SERIALREAD - processing incoming messagse as soon as possible, while still + * checking digital inputs. */ + while(Firmata.available()) + Firmata.processInput(); + + /* SEND FTDI WRITE BUFFER - make sure that the FTDI buffer doesn't go over + * 60 bytes. use a timer to sending an event character every 4 ms to + * trigger the buffer to dump. */ + + currentMillis = millis(); + if (currentMillis - previousMillis > samplingInterval) { + previousMillis += samplingInterval; + /* ANALOGREAD - do all analogReads() at the configured sampling interval */ + for(pin=0; pin +#include + +/*============================================================================== + * GLOBAL VARIABLES + *============================================================================*/ + +/* has the command arrived? */ +boolean firstCommand = false; +int dataOnSerial = 0; +boolean statusLed = false; + +/* analog inputs */ +int analogInputsToReport = 0; // bitwise array to store pin reporting + +/* digital input ports */ +byte reportPINs[TOTAL_PORTS]; // 1 = report this port, 0 = silence +byte previousPINs[TOTAL_PORTS]; // previous 8 bits sent + +/* pins configuration */ +byte pinConfig[TOTAL_PINS]; // configuration of every pin +byte portConfigInputs[TOTAL_PORTS]; // each bit: 1 = pin in INPUT, 0 = anything else +int pinState[TOTAL_PINS]; // any value that has been written + +/* timer variables */ +unsigned long currentMillis; // store the current value from millis() +unsigned long previousMillis; // for comparison with currentMillis +int samplingInterval = 19; // how often to run the main loop (in ms) +unsigned long toggleMillis; + +Servo servos[MAX_SERVOS]; + +/*============================================================================== + * FUNCTIONS + *============================================================================*/ + +void toggleLed() +{ + if (millis() - toggleMillis > 500) { + statusLed = !statusLed; + digitalWrite(13, statusLed); + toggleMillis = millis(); + } +} + +void outputPort(byte portNumber, byte portValue, byte forceSend) +{ + // pins not configured as INPUT are cleared to zeros + portValue = portValue & portConfigInputs[portNumber]; + // only send if the value is different than previously sent + if(forceSend || previousPINs[portNumber] != portValue) { + Firmata.sendDigitalPort(portNumber, portValue); + previousPINs[portNumber] = portValue; + } +} + +/* ----------------------------------------------------------------------------- + * check all the active digital inputs for change of state, then add any events + * to the Serial output queue using Serial.print() */ +void checkDigitalInputs(void) +{ + /* Using non-looping code allows constants to be given to readPort(). + * The compiler will apply substantial optimizations if the inputs + * to readPort() are compile-time constants. */ + if (TOTAL_PORTS > 0 && reportPINs[0]) outputPort(0, readPort(0, portConfigInputs[0]), false); + if (TOTAL_PORTS > 1 && reportPINs[1]) outputPort(1, readPort(1, portConfigInputs[1]), false); + if (TOTAL_PORTS > 2 && reportPINs[2]) outputPort(2, readPort(2, portConfigInputs[2]), false); + if (TOTAL_PORTS > 3 && reportPINs[3]) outputPort(3, readPort(3, portConfigInputs[3]), false); + if (TOTAL_PORTS > 4 && reportPINs[4]) outputPort(4, readPort(4, portConfigInputs[4]), false); + if (TOTAL_PORTS > 5 && reportPINs[5]) outputPort(5, readPort(5, portConfigInputs[5]), false); + if (TOTAL_PORTS > 6 && reportPINs[6]) outputPort(6, readPort(6, portConfigInputs[6]), false); + if (TOTAL_PORTS > 7 && reportPINs[7]) outputPort(7, readPort(7, portConfigInputs[7]), false); + if (TOTAL_PORTS > 8 && reportPINs[8]) outputPort(8, readPort(8, portConfigInputs[8]), false); + if (TOTAL_PORTS > 9 && reportPINs[9]) outputPort(9, readPort(9, portConfigInputs[9]), false); + if (TOTAL_PORTS > 10 && reportPINs[10]) outputPort(10, readPort(10, portConfigInputs[10]), false); + if (TOTAL_PORTS > 11 && reportPINs[11]) outputPort(11, readPort(11, portConfigInputs[11]), false); + if (TOTAL_PORTS > 12 && reportPINs[12]) outputPort(12, readPort(12, portConfigInputs[12]), false); + if (TOTAL_PORTS > 13 && reportPINs[13]) outputPort(13, readPort(13, portConfigInputs[13]), false); + if (TOTAL_PORTS > 14 && reportPINs[14]) outputPort(14, readPort(14, portConfigInputs[14]), false); + if (TOTAL_PORTS > 15 && reportPINs[15]) outputPort(15, readPort(15, portConfigInputs[15]), false); +} + +// ----------------------------------------------------------------------------- +/* sets the pin mode to the correct state and sets the relevant bits in the + * two bit-arrays that track Digital I/O and PWM status + */ +void setPinModeCallback(byte pin, int mode) +{ + if (IS_PIN_SERVO(pin) && mode != SERVO && servos[PIN_TO_SERVO(pin)].attached()) { + servos[PIN_TO_SERVO(pin)].detach(); + } + if (IS_PIN_ANALOG(pin)) { + reportAnalogCallback(PIN_TO_ANALOG(pin), mode == ANALOG ? 1 : 0); // turn on/off reporting + } + if (IS_PIN_DIGITAL(pin)) { + if (mode == INPUT) { + portConfigInputs[pin/8] |= (1 << (pin & 7)); + } else { + portConfigInputs[pin/8] &= ~(1 << (pin & 7)); + } + } + pinState[pin] = 0; + switch(mode) { + case ANALOG: + if (IS_PIN_ANALOG(pin)) { + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups + } + pinConfig[pin] = ANALOG; + } + break; + case INPUT: + if (IS_PIN_DIGITAL(pin)) { + pinMode(PIN_TO_DIGITAL(pin), INPUT); // disable output driver + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable internal pull-ups + pinConfig[pin] = INPUT; + } + break; + case OUTPUT: + if (IS_PIN_DIGITAL(pin)) { + digitalWrite(PIN_TO_DIGITAL(pin), LOW); // disable PWM + pinMode(PIN_TO_DIGITAL(pin), OUTPUT); + pinConfig[pin] = OUTPUT; + } + break; + case PWM: + if (IS_PIN_PWM(pin)) { + pinMode(PIN_TO_PWM(pin), OUTPUT); + analogWrite(PIN_TO_PWM(pin), 0); + pinConfig[pin] = PWM; + } + break; + case SERVO: + if (IS_PIN_SERVO(pin)) { + pinConfig[pin] = SERVO; + if (!servos[PIN_TO_SERVO(pin)].attached()) { + servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin)); + } else { + Firmata.sendString("Servo only on pins from 2 to 13"); + } + } + break; + case I2C: + pinConfig[pin] = mode; + Firmata.sendString("I2C mode not yet supported"); + break; + default: + Firmata.sendString("Unknown pin mode"); // TODO: put error msgs in EEPROM + } + // TODO: save status to EEPROM here, if changed +} + +void analogWriteCallback(byte pin, int value) +{ + if (pin < TOTAL_PINS) { + switch(pinConfig[pin]) { + case SERVO: + if (IS_PIN_SERVO(pin)) + servos[PIN_TO_SERVO(pin)].write(value); + pinState[pin] = value; + break; + case PWM: + if (IS_PIN_PWM(pin)) + analogWrite(PIN_TO_PWM(pin), value); + pinState[pin] = value; + break; + } + } +} + +void digitalWriteCallback(byte port, int value) +{ + byte pin, lastPin, mask=1, pinWriteMask=0; + + if (port < TOTAL_PORTS) { + // create a mask of the pins on this port that are writable. + lastPin = port*8+8; + if (lastPin > TOTAL_PINS) lastPin = TOTAL_PINS; + for (pin=port*8; pin < lastPin; pin++) { + // do not disturb non-digital pins (eg, Rx & Tx) + if (IS_PIN_DIGITAL(pin)) { + // only write to OUTPUT and INPUT (enables pullup) + // do not touch pins in PWM, ANALOG, SERVO or other modes + if (pinConfig[pin] == OUTPUT || pinConfig[pin] == INPUT) { + pinWriteMask |= mask; + pinState[pin] = ((byte)value & mask) ? 1 : 0; + } + } + mask = mask << 1; + } + writePort(port, (byte)value, pinWriteMask); + } +} + + +// ----------------------------------------------------------------------------- +/* sets bits in a bit array (int) to toggle the reporting of the analogIns + */ +//void FirmataClass::setAnalogPinReporting(byte pin, byte state) { +//} +void reportAnalogCallback(byte analogPin, int value) +{ + if (analogPin < TOTAL_ANALOG_PINS) { + if(value == 0) { + analogInputsToReport = analogInputsToReport &~ (1 << analogPin); + } else { + analogInputsToReport = analogInputsToReport | (1 << analogPin); + } + } + // TODO: save status to EEPROM here, if changed +} + +void reportDigitalCallback(byte port, int value) +{ + if (port < TOTAL_PORTS) { + reportPINs[port] = (byte)value; + } + // do not disable analog reporting on these 8 pins, to allow some + // pins used for digital, others analog. Instead, allow both types + // of reporting to be enabled, but check if the pin is configured + // as analog when sampling the analog inputs. Likewise, while + // scanning digital pins, portConfigInputs will mask off values from any + // pins configured as analog +} + +/*============================================================================== + * SYSEX-BASED commands + *============================================================================*/ + +void sysexCallback(byte command, byte argc, byte *argv) +{ + switch(command) { + case SERVO_CONFIG: + if(argc > 4) { + // these vars are here for clarity, they'll optimized away by the compiler + byte pin = argv[0]; + int minPulse = argv[1] + (argv[2] << 7); + int maxPulse = argv[3] + (argv[4] << 7); + + if (IS_PIN_SERVO(pin)) { + // servos are pins from 2 to 13, so offset for array + if (servos[PIN_TO_SERVO(pin)].attached()) + servos[PIN_TO_SERVO(pin)].detach(); + servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin), minPulse, maxPulse); + setPinModeCallback(pin, SERVO); + } + } + break; + case SAMPLING_INTERVAL: + if (argc > 1) + samplingInterval = argv[0] + (argv[1] << 7); + else + Firmata.sendString("Not enough data"); + break; + case EXTENDED_ANALOG: + if (argc > 1) { + int val = argv[1]; + if (argc > 2) val |= (argv[2] << 7); + if (argc > 3) val |= (argv[3] << 14); + analogWriteCallback(argv[0], val); + } + break; + case CAPABILITY_QUERY: + Serial.write(START_SYSEX); + Serial.write(CAPABILITY_RESPONSE); + for (byte pin=0; pin < TOTAL_PINS; pin++) { + if (IS_PIN_DIGITAL(pin)) { + Serial.write((byte)INPUT); + Serial.write(1); + Serial.write((byte)OUTPUT); + Serial.write(1); + } + if (IS_PIN_ANALOG(pin)) { + Serial.write(ANALOG); + Serial.write(10); + } + if (IS_PIN_PWM(pin)) { + Serial.write(PWM); + Serial.write(8); + } + if (IS_PIN_SERVO(pin)) { + Serial.write(SERVO); + Serial.write(14); + } + Serial.write(127); + } + Serial.write(END_SYSEX); + break; + case PIN_STATE_QUERY: + if (argc > 0) { + byte pin=argv[0]; + Serial.write(START_SYSEX); + Serial.write(PIN_STATE_RESPONSE); + Serial.write(pin); + if (pin < TOTAL_PINS) { + Serial.write((byte)pinConfig[pin]); + Serial.write((byte)pinState[pin] & 0x7F); + if (pinState[pin] & 0xFF80) Serial.write((byte)(pinState[pin] >> 7) & 0x7F); + if (pinState[pin] & 0xC000) Serial.write((byte)(pinState[pin] >> 14) & 0x7F); + } + Serial.write(END_SYSEX); + } + break; + case ANALOG_MAPPING_QUERY: + Serial.write(START_SYSEX); + Serial.write(ANALOG_MAPPING_RESPONSE); + for (byte pin=0; pin < TOTAL_PINS; pin++) { + Serial.write(IS_PIN_ANALOG(pin) ? PIN_TO_ANALOG(pin) : 127); + } + Serial.write(END_SYSEX); + break; + } +} + +/*============================================================================== + * SETUP() + *============================================================================*/ +void setup() +{ + byte i; + + Firmata.setFirmwareVersion(2, 2); + + Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); + Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); + Firmata.attach(REPORT_ANALOG, reportAnalogCallback); + Firmata.attach(REPORT_DIGITAL, reportDigitalCallback); + Firmata.attach(SET_PIN_MODE, setPinModeCallback); + Firmata.attach(START_SYSEX, sysexCallback); + + // TODO: load state from EEPROM here + + /* these are initialized to zero by the compiler startup code + for (i=0; i < TOTAL_PORTS; i++) { + reportPINs[i] = false; + portConfigInputs[i] = 0; + previousPINs[i] = 0; + } + */ + for (i=0; i < TOTAL_PINS; i++) { + if (IS_PIN_ANALOG(i)) { + // turns off pullup, configures everything + setPinModeCallback(i, ANALOG); + } else { + // sets the output to 0, configures portConfigInputs + setPinModeCallback(i, OUTPUT); + } + } + // by defult, do not report any analog inputs + analogInputsToReport = 0; + + Firmata.begin(57600); + + /* send digital inputs to set the initial state on the host computer, + * since once in the loop(), this firmware will only send on change */ + for (i=0; i < TOTAL_PORTS; i++) { + outputPort(i, readPort(i, portConfigInputs[i]), true); + } + + /* init the toggleLed counter */ + toggleMillis = millis(); + pinMode(13, OUTPUT); +} + +/*============================================================================== + * LOOP() + *============================================================================*/ +void loop() +{ + byte pin, analogPin; + + /* DIGITALREAD - as fast as possible, check for changes and output them to the + * FTDI buffer using Serial.print() */ + checkDigitalInputs(); + + //XXX: hack Firmata to blink until serial command arrives + dataOnSerial = Firmata.available(); + if (dataOnSerial > 0 && !firstCommand) { + firstCommand = true; + } + //XXX: do the blink if the first command hasn't arrived yet + // configures pin 13 as output and then back as input + if (!firstCommand) { + toggleLed(); + } + + /* SERIALREAD - processing incoming messagse as soon as possible, while still + * checking digital inputs. */ + while(dataOnSerial) { + Firmata.processInput(); + dataOnSerial = Firmata.available(); + } + + /* SEND FTDI WRITE BUFFER - make sure that the FTDI buffer doesn't go over + * 60 bytes. use a timer to sending an event character every 4 ms to + * trigger the buffer to dump. */ + + currentMillis = millis(); + if (currentMillis - previousMillis > samplingInterval) { + previousMillis += samplingInterval; + /* ANALOGREAD - do all analogReads() at the configured sampling interval */ + for(pin=0; pin + +void File::write(uint8_t val) { + SD.file.write(val); +} + +void File::write(const char *str) { + SD.file.write(str); +} + +void File::write(const uint8_t *buf, size_t size) { + SD.file.write(buf, size); +} + +int File::peek() { + char c = SD.file.read(); + if (c != -1) SD.file.seekCur(-1); + return c; +} + +int File::read() { + return SD.file.read(); +} + +int File::available() { + return size() - position(); +} + +void File::flush() { + SD.file.sync(); +} + +boolean File::seek(uint32_t pos) { + return SD.file.seekSet(pos); +} + +uint32_t File::position() { + return SD.file.curPosition(); +} + +uint32_t File::size() { + return SD.file.fileSize(); +} + +void File::close() { + SD.file.close(); +} + +File::operator bool() { + return SD.file.isOpen(); +} diff --git a/arduino-0022-linux-x64/libraries/SD/README.txt b/arduino-0022-linux-x64/libraries/SD/README.txt new file mode 100644 index 0000000..863e878 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/README.txt @@ -0,0 +1,11 @@ + +** SD - a slightly more friendly wrapper for sdfatlib ** + +This library aims to expose a subset of SD card functionality in the +form of a higher level "wrapper" object. + +License: GNU General Public License V3 + (Because sdfatlib is licensed with this.) + +(C) Copyright 2010 SparkFun Electronics + diff --git a/arduino-0022-linux-x64/libraries/SD/SD.cpp b/arduino-0022-linux-x64/libraries/SD/SD.cpp new file mode 100644 index 0000000..aca7468 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/SD.cpp @@ -0,0 +1,439 @@ +/* + + SD - a slightly more friendly wrapper for sdfatlib + + This library aims to expose a subset of SD card functionality + in the form of a higher level "wrapper" object. + + License: GNU General Public License V3 + (Because sdfatlib is licensed with this.) + + (C) Copyright 2010 SparkFun Electronics + + + This library provides four key benefits: + + * Including `SD.h` automatically creates a global + `SD` object which can be interacted with in a similar + manner to other standard global objects like `Serial` and `Ethernet`. + + * Boilerplate initialisation code is contained in one method named + `begin` and no further objects need to be created in order to access + the SD card. + + * Calls to `open` can supply a full path name including parent + directories which simplifies interacting with files in subdirectories. + + * Utility methods are provided to determine whether a file exists + and to create a directory heirarchy. + + + Note however that not all functionality provided by the underlying + sdfatlib library is exposed. + + */ + +/* + + Implementation Notes + + In order to handle multi-directory path traversal, functionality that + requires this ability is implemented as callback functions. + + Individual methods call the `walkPath` function which performs the actual + directory traversal (swapping between two different directory/file handles + along the way) and at each level calls the supplied callback function. + + Some types of functionality will take an action at each level (e.g. exists + or make directory) which others will only take an action at the bottom + level (e.g. open). + + */ + +#include "SD.h" + +// Used by `getNextPathComponent` +#define MAX_COMPONENT_LEN 12 // What is max length? +#define PATH_COMPONENT_BUFFER_LEN MAX_COMPONENT_LEN+1 + +bool getNextPathComponent(char *path, unsigned int *p_offset, + char *buffer) { + /* + + Parse individual path components from a path. + + e.g. after repeated calls '/foo/bar/baz' will be split + into 'foo', 'bar', 'baz'. + + This is similar to `strtok()` but copies the component into the + supplied buffer rather than modifying the original string. + + + `buffer` needs to be PATH_COMPONENT_BUFFER_LEN in size. + + `p_offset` needs to point to an integer of the offset at + which the previous path component finished. + + Returns `true` if more components remain. + + Returns `false` if this is the last component. + (This means path ended with 'foo' or 'foo/'.) + + */ + + // TODO: Have buffer local to this function, so we know it's the + // correct length? + + int bufferOffset = 0; + + int offset = *p_offset; + + // Skip root or other separator + if (path[offset] == '/') { + offset++; + } + + // Copy the next next path segment + while (bufferOffset < MAX_COMPONENT_LEN + && (path[offset] != '/') + && (path[offset] != '\0')) { + buffer[bufferOffset++] = path[offset++]; + } + + buffer[bufferOffset] = '\0'; + + // Skip trailing separator so we can determine if this + // is the last component in the path or not. + if (path[offset] == '/') { + offset++; + } + + *p_offset = offset; + + return (path[offset] != '\0'); +} + + + +boolean walkPath(char *filepath, SdFile& parentDir, + boolean (*callback)(SdFile& parentDir, + char *filePathComponent, + boolean isLastComponent, + void *object), + void *object = NULL) { + /* + + When given a file path (and parent directory--normally root), + this function traverses the directories in the path and at each + level calls the supplied callback function while also providing + the supplied object for context if required. + + e.g. given the path '/foo/bar/baz' + the callback would be called at the equivalent of + '/foo', '/foo/bar' and '/foo/bar/baz'. + + The implementation swaps between two different directory/file + handles as it traverses the directories and does not use recursion + in an attempt to use memory efficiently. + + If a callback wishes to stop the directory traversal it should + return false--in this case the function will stop the traversal, + tidy up and return false. + + If a directory path doesn't exist at some point this function will + also return false and not subsequently call the callback. + + If a directory path specified is complete, valid and the callback + did not indicate the traversal should be interrupted then this + function will return true. + + */ + + + SdFile subfile1; + SdFile subfile2; + + char buffer[PATH_COMPONENT_BUFFER_LEN]; + + unsigned int offset = 0; + + SdFile *p_parent; + SdFile *p_child; + + SdFile *p_tmp_sdfile; + + p_child = &subfile1; + + p_parent = &parentDir; + + while (true) { + + boolean moreComponents = getNextPathComponent(filepath, &offset, buffer); + + boolean shouldContinue = callback((*p_parent), buffer, !moreComponents, object); + + if (!shouldContinue) { + // TODO: Don't repeat this code? + // If it's one we've created then we + // don't need the parent handle anymore. + if (p_parent != &parentDir) { + (*p_parent).close(); + } + return false; + } + + if (!moreComponents) { + break; + } + + boolean exists = (*p_child).open(*p_parent, buffer, O_RDONLY); + + // If it's one we've created then we + // don't need the parent handle anymore. + if (p_parent != &parentDir) { + (*p_parent).close(); + } + + // Handle case when it doesn't exist and we can't continue... + if (exists) { + // We alternate between two file handles as we go down + // the path. + if (p_parent == &parentDir) { + p_parent = &subfile2; + } + + p_tmp_sdfile = p_parent; + p_parent = p_child; + p_child = p_tmp_sdfile; + } else { + return false; + } + } + + if (p_parent != &parentDir) { + (*p_parent).close(); // TODO: Return/ handle different? + } + + return true; +} + + + +/* + + The callbacks used to implement various functionality follow. + + Each callback is supplied with a parent directory handle, + character string with the name of the current file path component, + a flag indicating if this component is the last in the path and + a pointer to an arbitrary object used for context. + + */ + +boolean callback_pathExists(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + /* + + Callback used to determine if a file/directory exists in parent + directory. + + Returns true if file path exists. + + */ + SdFile child; + + boolean exists = child.open(parentDir, filePathComponent, O_RDONLY); + + if (exists) { + child.close(); + } + + return exists; +} + + + +boolean callback_makeDirPath(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + /* + + Callback used to create a directory in the parent directory if + it does not already exist. + + Returns true if a directory was created or it already existed. + + */ + boolean result = false; + SdFile child; + + result = callback_pathExists(parentDir, filePathComponent, isLastComponent, object); + if (!result) { + result = child.makeDir(parentDir, filePathComponent); + } + + return result; +} + + + +boolean callback_openPath(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + /* + + Callback used to open a file specified by a filepath that may + specify one or more directories above it. + + Expects the context object to be an instance of `SDClass` and + will use the `file` property of the instance to open the requested + file/directory with the associated file open mode property. + + Always returns true if the directory traversal hasn't reached the + bottom of the directory heirarchy. + + Returns false once the file has been opened--to prevent the traversal + from descending further. (This may be unnecessary.) + + */ + if (isLastComponent) { + SDClass *p_SD = static_cast(object); + p_SD->file.open(parentDir, filePathComponent, p_SD->fileOpenMode); + if (p_SD->fileOpenMode == FILE_WRITE) { + p_SD->file.seekSet(p_SD->file.fileSize()); + } + // TODO: Return file open result? + return false; + } + return true; +} + + +boolean callback_remove(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + if (isLastComponent) { + return SdFile::remove(parentDir, filePathComponent); + } + return true; +} + +boolean callback_rmdir(SdFile& parentDir, char *filePathComponent, + boolean isLastComponent, void *object) { + if (isLastComponent) { + SdFile f; + if (!f.open(parentDir, filePathComponent, O_READ)) return false; + return f.rmDir(); + } + return true; +} + + + +/* Implementation of class used to create `SDCard` object. */ + + + +boolean SDClass::begin(uint8_t csPin) { + /* + + Performs the initialisation required by the sdfatlib library. + + Return true if initialization succeeds, false otherwise. + + */ + return card.init(SPI_HALF_SPEED, csPin) && + volume.init(card) && + root.openRoot(volume); +} + + +File SDClass::open(char *filepath, uint8_t mode) { + /* + + Open the supplied file path for reading or writing. + + The file content can be accessed via the `file` property of + the `SDClass` object--this property is currently + a standard `SdFile` object from `sdfatlib`. + + Defaults to read only. + + If `write` is true, default action (when `append` is true) is to + append data to the end of the file. + + If `append` is false then the file will be truncated first. + + If the file does not exist and it is opened for writing the file + will be created. + + An attempt to open a file for reading that does not exist is an + error. + + */ + + // TODO: Allow for read&write? (Possibly not, as it requires seek.) + + fileOpenMode = mode; + walkPath(filepath, root, callback_openPath, this); + + return File(); + +} + + +//boolean SDClass::close() { +// /* +// +// Closes the file opened by the `open` method. +// +// */ +// file.close(); +//} + + +boolean SDClass::exists(char *filepath) { + /* + + Returns true if the supplied file path exists. + + */ + return walkPath(filepath, root, callback_pathExists); +} + + +//boolean SDClass::exists(char *filepath, SdFile& parentDir) { +// /* +// +// Returns true if the supplied file path rooted at `parentDir` +// exists. +// +// */ +// return walkPath(filepath, parentDir, callback_pathExists); +//} + + +boolean SDClass::mkdir(char *filepath) { + /* + + Makes a single directory or a heirarchy of directories. + + A rough equivalent to `mkdir -p`. + + */ + return walkPath(filepath, root, callback_makeDirPath); +} + +boolean SDClass::rmdir(char *filepath) { + /* + + Makes a single directory or a heirarchy of directories. + + A rough equivalent to `mkdir -p`. + + */ + return walkPath(filepath, root, callback_rmdir); +} + +boolean SDClass::remove(char *filepath) { + return walkPath(filepath, root, callback_remove); +} + +SDClass SD; \ No newline at end of file diff --git a/arduino-0022-linux-x64/libraries/SD/SD.h b/arduino-0022-linux-x64/libraries/SD/SD.h new file mode 100644 index 0000000..2c5c323 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/SD.h @@ -0,0 +1,88 @@ +/* + + SD - a slightly more friendly wrapper for sdfatlib + + This library aims to expose a subset of SD card functionality + in the form of a higher level "wrapper" object. + + License: GNU General Public License V3 + (Because sdfatlib is licensed with this.) + + (C) Copyright 2010 SparkFun Electronics + + */ + +#ifndef __SD_H__ +#define __SD_H__ + +#include + +#include +#include + +#define FILE_READ O_READ +#define FILE_WRITE (O_READ | O_WRITE | O_CREAT | O_SYNC) + +class File : public Stream { +public: + virtual void write(uint8_t); + virtual void write(const char *str); + virtual void write(const uint8_t *buf, size_t size); + virtual int read(); + virtual int peek(); + virtual int available(); + virtual void flush(); + boolean seek(uint32_t pos); + uint32_t position(); + uint32_t size(); + void close(); + operator bool(); +}; + +class SDClass { + +private: + // These are required for initialisation and use of sdfatlib + Sd2Card card; + SdVolume volume; + SdFile root; + +public: + // This needs to be called to set up the connection to the SD card + // before other methods are used. + boolean begin(uint8_t csPin = SD_CHIP_SELECT_PIN); + + // Open the specified file/directory with the supplied mode (e.g. read or + // write, etc). Returns a File object for interacting with the file. + // Note that currently only one file can be open at a time. + File open(char *filename, uint8_t mode = FILE_READ); + + // Methods to determine if the requested file path exists. + boolean exists(char *filepath); + + // Create the requested directory heirarchy--if intermediate directories + // do not exist they will be created. + boolean mkdir(char *filepath); + + // Delete the file. + boolean remove(char *filepath); + + boolean rmdir(char *filepath); + +private: + SdFile file; + + // This is used to determine the mode used to open a file + // it's here because it's the easiest place to pass the + // information through the directory walking function. But + // it's probably not the best place for it. + // It shouldn't be set directly--it is set via the parameters to `open`. + int fileOpenMode; + + friend class File; + friend boolean callback_openPath(SdFile&, char *, boolean, void *); +}; + +extern SDClass SD; + +#endif diff --git a/arduino-0022-linux-x64/libraries/SD/examples/Datalogger/Datalogger.pde b/arduino-0022-linux-x64/libraries/SD/examples/Datalogger/Datalogger.pde new file mode 100644 index 0000000..73d81af --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/examples/Datalogger/Datalogger.pde @@ -0,0 +1,86 @@ +/* + SD card datalogger + + This example shows how to log data from three analog sensors + to an SD card using the SD library. + + The circuit: + * analog sensors on analog ins 0, 1, and 2 + * SD card attached to SPI bus as follows: + ** MOSI - pin 11 + ** MISO - pin 12 + ** CLK - pin 13 + ** CS - pin 4 + + created 24 Nov 2010 + updated 2 Dec 2010 + by Tom Igoe + + This example code is in the public domain. + + */ + +#include + +// On the Ethernet Shield, CS is pin 4. Note that even if it's not +// used as the CS pin, the hardware CS pin (10 on most Arduino boards, +// 53 on the Mega) must be left as an output or the SD library +// functions will not work. +const int chipSelect = 4; + +void setup() +{ + Serial.begin(9600); + Serial.print("Initializing SD card..."); + // make sure that the default chip select pin is set to + // output, even if you don't use it: + pinMode(10, OUTPUT); + + // see if the card is present and can be initialized: + if (!SD.begin(chipSelect)) { + Serial.println("Card failed, or not present"); + // don't do anything more: + return; + } + Serial.println("card initialized."); +} + +void loop() +{ + // make a string for assembling the data to log: + String dataString = ""; + + // read three sensors and append to the string: + for (int analogPin = 0; analogPin < 3; analogPin++) { + int sensor = analogRead(analogPin); + dataString += String(sensor); + if (analogPin < 2) { + dataString += ","; + } + } + + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + File dataFile = SD.open("datalog.txt", FILE_WRITE); + + // if the file is available, write to it: + if (dataFile) { + dataFile.println(dataString); + dataFile.close(); + // print to the serial port too: + Serial.println(dataString); + } + // if the file isn't open, pop up an error: + else { + Serial.println("error opening datalog.txt"); + } +} + + + + + + + + + diff --git a/arduino-0022-linux-x64/libraries/SD/examples/DumpFile/DumpFile.pde b/arduino-0022-linux-x64/libraries/SD/examples/DumpFile/DumpFile.pde new file mode 100644 index 0000000..961717f --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/examples/DumpFile/DumpFile.pde @@ -0,0 +1,64 @@ +/* + SD card file dump + + This example shows how to read a file from the SD card using the + SD library and send it over the serial port. + + The circuit: + * SD card attached to SPI bus as follows: + ** MOSI - pin 11 + ** MISO - pin 12 + ** CLK - pin 13 + ** CS - pin 4 + + created 22 December 2010 + + This example code is in the public domain. + + */ + +#include + +// On the Ethernet Shield, CS is pin 4. Note that even if it's not +// used as the CS pin, the hardware CS pin (10 on most Arduino boards, +// 53 on the Mega) must be left as an output or the SD library +// functions will not work. +const int chipSelect = 4; + +void setup() +{ + Serial.begin(9600); + Serial.print("Initializing SD card..."); + // make sure that the default chip select pin is set to + // output, even if you don't use it: + pinMode(10, OUTPUT); + + // see if the card is present and can be initialized: + if (!SD.begin(chipSelect)) { + Serial.println("Card failed, or not present"); + // don't do anything more: + return; + } + Serial.println("card initialized."); + + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + File dataFile = SD.open("datalog.txt"); + + // if the file is available, write to it: + if (dataFile) { + while (dataFile.available()) { + Serial.write(dataFile.read()); + } + dataFile.close(); + } + // if the file isn't open, pop up an error: + else { + Serial.println("error opening datalog.txt"); + } +} + +void loop() +{ +} + diff --git a/arduino-0022-linux-x64/libraries/SD/examples/Files/Files.pde b/arduino-0022-linux-x64/libraries/SD/examples/Files/Files.pde new file mode 100644 index 0000000..5ed9fea --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/examples/Files/Files.pde @@ -0,0 +1,78 @@ +/* + SD card basic file example + + This example shows how to create and destroy an SD card file + The circuit: + * SD card attached to SPI bus as follows: + ** MOSI - pin 11 + ** MISO - pin 12 + ** CLK - pin 13 + ** CS - pin 4 + + created Nov 2010 + by David A. Mellis + updated 2 Dec 2010 + by Tom Igoe + + This example code is in the public domain. + + */ +#include + +File myFile; + +void setup() +{ + Serial.begin(9600); + Serial.print("Initializing SD card..."); + // On the Ethernet Shield, CS is pin 4. It's set as an output by default. + // Note that even if it's not used as the CS pin, the hardware SS pin + // (10 on most Arduino boards, 53 on the Mega) must be left as an output + // or the SD library functions will not work. + pinMode(10, OUTPUT); + + if (!SD.begin(4)) { + Serial.println("initialization failed!"); + return; + } + Serial.println("initialization done."); + + if (SD.exists("example.txt")) { + Serial.println("example.txt exists."); + } + else { + Serial.println("example.txt doesn't exist."); + } + + // open a new file and immediately close it: + Serial.println("Creating example.txt..."); + myFile = SD.open("example.txt", FILE_WRITE); + myFile.close(); + + // Check to see if the file exists: + if (SD.exists("example.txt")) { + Serial.println("example.txt exists."); + } + else { + Serial.println("example.txt doesn't exist."); + } + + // delete the file: + Serial.println("Removing example.txt..."); + SD.remove("example.txt"); + + if (SD.exists("example.txt")){ + Serial.println("example.txt exists."); + } + else { + Serial.println("example.txt doesn't exist."); + } +} + +void loop() +{ + // nothing happens after setup finishes. +} + + + diff --git a/arduino-0022-linux-x64/libraries/SD/examples/ReadWrite/ReadWrite.pde b/arduino-0022-linux-x64/libraries/SD/examples/ReadWrite/ReadWrite.pde new file mode 100644 index 0000000..9957218 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/examples/ReadWrite/ReadWrite.pde @@ -0,0 +1,79 @@ +/* + SD card read/write + + This example shows how to read and write data to and from an SD card file + The circuit: + * SD card attached to SPI bus as follows: + ** MOSI - pin 11 + ** MISO - pin 12 + ** CLK - pin 13 + ** CS - pin 4 + + created Nov 2010 + by David A. Mellis + updated 2 Dec 2010 + by Tom Igoe + + This example code is in the public domain. + + */ + +#include + +File myFile; + +void setup() +{ + Serial.begin(9600); + Serial.print("Initializing SD card..."); + // On the Ethernet Shield, CS is pin 4. It's set as an output by default. + // Note that even if it's not used as the CS pin, the hardware SS pin + // (10 on most Arduino boards, 53 on the Mega) must be left as an output + // or the SD library functions will not work. + pinMode(10, OUTPUT); + + if (!SD.begin(4)) { + Serial.println("initialization failed!"); + return; + } + Serial.println("initialization done."); + + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + myFile = SD.open("test.txt", FILE_WRITE); + + // if the file opened okay, write to it: + if (myFile) { + Serial.print("Writing to test.txt..."); + myFile.println("testing 1, 2, 3."); + // close the file: + myFile.close(); + Serial.println("done."); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } + + // re-open the file for reading: + myFile = SD.open("test.txt"); + if (myFile) { + Serial.println("test.txt:"); + + // read from the file until there's nothing else in it: + while (myFile.available()) { + Serial.write(myFile.read()); + } + // close the file: + myFile.close(); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } +} + +void loop() +{ + // nothing happens after setup +} + + diff --git a/arduino-0022-linux-x64/libraries/SD/keywords.txt b/arduino-0022-linux-x64/libraries/SD/keywords.txt new file mode 100644 index 0000000..419fe04 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/keywords.txt @@ -0,0 +1,30 @@ +####################################### +# Syntax Coloring Map SD +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +SD KEYWORD1 +File KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +begin KEYWORD2 +exists KEYWORD2 +mkdir KEYWORD2 +remove KEYWORD2 +rmdir KEYWORD2 +open KEYWORD2 +close KEYWORD2 +seek KEYWORD2 +position KEYWORD2 +size KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### +FILE_READ LITERAL1 +FILE_WRITE LITERAL1 diff --git a/arduino-0022-linux-x64/libraries/SD/utility/FatStructs.h b/arduino-0022-linux-x64/libraries/SD/utility/FatStructs.h new file mode 100644 index 0000000..f5bdaa5 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/FatStructs.h @@ -0,0 +1,418 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef FatStructs_h +#define FatStructs_h +/** + * \file + * FAT file structures + */ +/* + * mostly from Microsoft document fatgen103.doc + * http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + */ +//------------------------------------------------------------------------------ +/** Value for byte 510 of boot block or MBR */ +uint8_t const BOOTSIG0 = 0X55; +/** Value for byte 511 of boot block or MBR */ +uint8_t const BOOTSIG1 = 0XAA; +//------------------------------------------------------------------------------ +/** + * \struct partitionTable + * \brief MBR partition table entry + * + * A partition table entry for a MBR formatted storage device. + * The MBR partition table has four entries. + */ +struct partitionTable { + /** + * Boot Indicator . Indicates whether the volume is the active + * partition. Legal values include: 0X00. Do not use for booting. + * 0X80 Active partition. + */ + uint8_t boot; + /** + * Head part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t beginHead; + /** + * Sector part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned beginSector : 6; + /** High bits cylinder for first block in partition. */ + unsigned beginCylinderHigh : 2; + /** + * Combine beginCylinderLow with beginCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t beginCylinderLow; + /** + * Partition type. See defines that begin with PART_TYPE_ for + * some Microsoft partition types. + */ + uint8_t type; + /** + * head part of cylinder-head-sector address of the last sector in the + * partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t endHead; + /** + * Sector part of cylinder-head-sector address of the last sector in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned endSector : 6; + /** High bits of end cylinder */ + unsigned endCylinderHigh : 2; + /** + * Combine endCylinderLow with endCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t endCylinderLow; + /** Logical block address of the first block in the partition. */ + uint32_t firstSector; + /** Length of the partition, in blocks. */ + uint32_t totalSectors; +}; +/** Type name for partitionTable */ +typedef struct partitionTable part_t; +//------------------------------------------------------------------------------ +/** + * \struct masterBootRecord + * + * \brief Master Boot Record + * + * The first block of a storage device that is formatted with a MBR. + */ +struct masterBootRecord { + /** Code Area for master boot program. */ + uint8_t codeArea[440]; + /** Optional WindowsNT disk signature. May contain more boot code. */ + uint32_t diskSignature; + /** Usually zero but may be more boot code. */ + uint16_t usuallyZero; + /** Partition tables. */ + part_t part[4]; + /** First MBR signature byte. Must be 0X55 */ + uint8_t mbrSig0; + /** Second MBR signature byte. Must be 0XAA */ + uint8_t mbrSig1; +}; +/** Type name for masterBootRecord */ +typedef struct masterBootRecord mbr_t; +//------------------------------------------------------------------------------ +/** + * \struct biosParmBlock + * + * \brief BIOS parameter block + * + * The BIOS parameter block describes the physical layout of a FAT volume. + */ +struct biosParmBlock { + /** + * Count of bytes per sector. This value may take on only the + * following values: 512, 1024, 2048 or 4096 + */ + uint16_t bytesPerSector; + /** + * Number of sectors per allocation unit. This value must be a + * power of 2 that is greater than 0. The legal values are + * 1, 2, 4, 8, 16, 32, 64, and 128. + */ + uint8_t sectorsPerCluster; + /** + * Number of sectors before the first FAT. + * This value must not be zero. + */ + uint16_t reservedSectorCount; + /** The count of FAT data structures on the volume. This field should + * always contain the value 2 for any FAT volume of any type. + */ + uint8_t fatCount; + /** + * For FAT12 and FAT16 volumes, this field contains the count of + * 32-byte directory entries in the root directory. For FAT32 volumes, + * this field must be set to 0. For FAT12 and FAT16 volumes, this + * value should always specify a count that when multiplied by 32 + * results in a multiple of bytesPerSector. FAT16 volumes should + * use the value 512. + */ + uint16_t rootDirEntryCount; + /** + * This field is the old 16-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then totalSectors32 + * must be non-zero. For FAT32 volumes, this field must be 0. For + * FAT12 and FAT16 volumes, this field contains the sector count, and + * totalSectors32 is 0 if the total sector count fits + * (is less than 0x10000). + */ + uint16_t totalSectors16; + /** + * This dates back to the old MS-DOS 1.x media determination and is + * no longer usually used for anything. 0xF8 is the standard value + * for fixed (non-removable) media. For removable media, 0xF0 is + * frequently used. Legal values are 0xF0 or 0xF8-0xFF. + */ + uint8_t mediaType; + /** + * Count of sectors occupied by one FAT on FAT12/FAT16 volumes. + * On FAT32 volumes this field must be 0, and sectorsPerFat32 + * contains the FAT size count. + */ + uint16_t sectorsPerFat16; + /** Sectors per track for interrupt 0x13. Not used otherwise. */ + uint16_t sectorsPerTrtack; + /** Number of heads for interrupt 0x13. Not used otherwise. */ + uint16_t headCount; + /** + * Count of hidden sectors preceding the partition that contains this + * FAT volume. This field is generally only relevant for media + * visible on interrupt 0x13. + */ + uint32_t hidddenSectors; + /** + * This field is the new 32-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then + * totalSectors16 must be non-zero. + */ + uint32_t totalSectors32; + /** + * Count of sectors occupied by one FAT on FAT32 volumes. + */ + uint32_t sectorsPerFat32; + /** + * This field is only defined for FAT32 media and does not exist on + * FAT12 and FAT16 media. + * Bits 0-3 -- Zero-based number of active FAT. + * Only valid if mirroring is disabled. + * Bits 4-6 -- Reserved. + * Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. + * -- 1 means only one FAT is active; it is the one referenced in bits 0-3. + * Bits 8-15 -- Reserved. + */ + uint16_t fat32Flags; + /** + * FAT32 version. High byte is major revision number. + * Low byte is minor revision number. Only 0.0 define. + */ + uint16_t fat32Version; + /** + * Cluster number of the first cluster of the root directory for FAT32. + * This usually 2 but not required to be 2. + */ + uint32_t fat32RootCluster; + /** + * Sector number of FSINFO structure in the reserved area of the + * FAT32 volume. Usually 1. + */ + uint16_t fat32FSInfo; + /** + * If non-zero, indicates the sector number in the reserved area + * of the volume of a copy of the boot record. Usually 6. + * No value other than 6 is recommended. + */ + uint16_t fat32BackBootBlock; + /** + * Reserved for future expansion. Code that formats FAT32 volumes + * should always set all of the bytes of this field to 0. + */ + uint8_t fat32Reserved[12]; +}; +/** Type name for biosParmBlock */ +typedef struct biosParmBlock bpb_t; +//------------------------------------------------------------------------------ +/** + * \struct fat32BootSector + * + * \brief Boot sector for a FAT16 or FAT32 volume. + * + */ +struct fat32BootSector { + /** X86 jmp to boot program */ + uint8_t jmpToBootCode[3]; + /** informational only - don't depend on it */ + char oemName[8]; + /** BIOS Parameter Block */ + bpb_t bpb; + /** for int0x13 use value 0X80 for hard drive */ + uint8_t driveNumber; + /** used by Windows NT - should be zero for FAT */ + uint8_t reserved1; + /** 0X29 if next three fields are valid */ + uint8_t bootSignature; + /** usually generated by combining date and time */ + uint32_t volumeSerialNumber; + /** should match volume label in root dir */ + char volumeLabel[11]; + /** informational only - don't depend on it */ + char fileSystemType[8]; + /** X86 boot code */ + uint8_t bootCode[420]; + /** must be 0X55 */ + uint8_t bootSectorSig0; + /** must be 0XAA */ + uint8_t bootSectorSig1; +}; +//------------------------------------------------------------------------------ +// End Of Chain values for FAT entries +/** FAT16 end of chain value used by Microsoft. */ +uint16_t const FAT16EOC = 0XFFFF; +/** Minimum value for FAT16 EOC. Use to test for EOC. */ +uint16_t const FAT16EOC_MIN = 0XFFF8; +/** FAT32 end of chain value used by Microsoft. */ +uint32_t const FAT32EOC = 0X0FFFFFFF; +/** Minimum value for FAT32 EOC. Use to test for EOC. */ +uint32_t const FAT32EOC_MIN = 0X0FFFFFF8; +/** Mask a for FAT32 entry. Entries are 28 bits. */ +uint32_t const FAT32MASK = 0X0FFFFFFF; + +/** Type name for fat32BootSector */ +typedef struct fat32BootSector fbs_t; +//------------------------------------------------------------------------------ +/** + * \struct directoryEntry + * \brief FAT short directory entry + * + * Short means short 8.3 name, not the entry size. + * + * Date Format. A FAT directory entry date stamp is a 16-bit field that is + * basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the + * format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the + * 16-bit word): + * + * Bits 9-15: Count of years from 1980, valid value range 0-127 + * inclusive (1980-2107). + * + * Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. + * + * Bits 0-4: Day of month, valid value range 1-31 inclusive. + * + * Time Format. A FAT directory entry time stamp is a 16-bit field that has + * a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the + * 16-bit word, bit 15 is the MSB of the 16-bit word). + * + * Bits 11-15: Hours, valid value range 0-23 inclusive. + * + * Bits 5-10: Minutes, valid value range 0-59 inclusive. + * + * Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). + * + * The valid time range is from Midnight 00:00:00 to 23:59:58. + */ +struct directoryEntry { + /** + * Short 8.3 name. + * The first eight bytes contain the file name with blank fill. + * The last three bytes contain the file extension with blank fill. + */ + uint8_t name[11]; + /** Entry attributes. + * + * The upper two bits of the attribute byte are reserved and should + * always be set to 0 when a file is created and never modified or + * looked at after that. See defines that begin with DIR_ATT_. + */ + uint8_t attributes; + /** + * Reserved for use by Windows NT. Set value to 0 when a file is + * created and never modify or look at it after that. + */ + uint8_t reservedNT; + /** + * The granularity of the seconds part of creationTime is 2 seconds + * so this field is a count of tenths of a second and its valid + * value range is 0-199 inclusive. (WHG note - seems to be hundredths) + */ + uint8_t creationTimeTenths; + /** Time file was created. */ + uint16_t creationTime; + /** Date file was created. */ + uint16_t creationDate; + /** + * Last access date. Note that there is no last access time, only + * a date. This is the date of last read or write. In the case of + * a write, this should be set to the same date as lastWriteDate. + */ + uint16_t lastAccessDate; + /** + * High word of this entry's first cluster number (always 0 for a + * FAT12 or FAT16 volume). + */ + uint16_t firstClusterHigh; + /** Time of last write. File creation is considered a write. */ + uint16_t lastWriteTime; + /** Date of last write. File creation is considered a write. */ + uint16_t lastWriteDate; + /** Low word of this entry's first cluster number. */ + uint16_t firstClusterLow; + /** 32-bit unsigned holding this file's size in bytes. */ + uint32_t fileSize; +}; +//------------------------------------------------------------------------------ +// Definitions for directory entries +// +/** Type name for directoryEntry */ +typedef struct directoryEntry dir_t; +/** escape for name[0] = 0XE5 */ +uint8_t const DIR_NAME_0XE5 = 0X05; +/** name[0] value for entry that is free after being "deleted" */ +uint8_t const DIR_NAME_DELETED = 0XE5; +/** name[0] value for entry that is free and no allocated entries follow */ +uint8_t const DIR_NAME_FREE = 0X00; +/** file is read-only */ +uint8_t const DIR_ATT_READ_ONLY = 0X01; +/** File should hidden in directory listings */ +uint8_t const DIR_ATT_HIDDEN = 0X02; +/** Entry is for a system file */ +uint8_t const DIR_ATT_SYSTEM = 0X04; +/** Directory entry contains the volume label */ +uint8_t const DIR_ATT_VOLUME_ID = 0X08; +/** Entry is for a directory */ +uint8_t const DIR_ATT_DIRECTORY = 0X10; +/** Old DOS archive bit for backup support */ +uint8_t const DIR_ATT_ARCHIVE = 0X20; +/** Test value for long name entry. Test is + (d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. */ +uint8_t const DIR_ATT_LONG_NAME = 0X0F; +/** Test mask for long name entry */ +uint8_t const DIR_ATT_LONG_NAME_MASK = 0X3F; +/** defined attribute bits */ +uint8_t const DIR_ATT_DEFINED_BITS = 0X3F; +/** Directory entry is part of a long name */ +static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { + return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; +} +/** Mask for file/subdirectory tests */ +uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); +/** Directory entry is for a file */ +static inline uint8_t DIR_IS_FILE(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; +} +/** Directory entry is for a subdirectory */ +static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; +} +/** Directory entry is for a file or subdirectory */ +static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; +} +#endif // FatStructs_h diff --git a/arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.cpp b/arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.cpp new file mode 100644 index 0000000..26c4236 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.cpp @@ -0,0 +1,644 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#include +#include "Sd2Card.h" +//------------------------------------------------------------------------------ +#ifndef SOFTWARE_SPI +// functions for hardware SPI +/** Send a byte to the card */ +static void spiSend(uint8_t b) { + SPDR = b; + while (!(SPSR & (1 << SPIF))); +} +/** Receive a byte from the card */ +static uint8_t spiRec(void) { + spiSend(0XFF); + return SPDR; +} +#else // SOFTWARE_SPI +//------------------------------------------------------------------------------ +/** nop to tune soft SPI timing */ +#define nop asm volatile ("nop\n\t") +//------------------------------------------------------------------------------ +/** Soft SPI receive */ +uint8_t spiRec(void) { + uint8_t data = 0; + // no interrupts during byte receive - about 8 us + cli(); + // output pin high - like sending 0XFF + fastDigitalWrite(SPI_MOSI_PIN, HIGH); + + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, HIGH); + + // adjust so SCK is nice + nop; + nop; + + data <<= 1; + + if (fastDigitalRead(SPI_MISO_PIN)) data |= 1; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + } + // enable interrupts + sei(); + return data; +} +//------------------------------------------------------------------------------ +/** Soft SPI send */ +void spiSend(uint8_t data) { + // no interrupts during byte send - about 8 us + cli(); + for (uint8_t i = 0; i < 8; i++) { + fastDigitalWrite(SPI_SCK_PIN, LOW); + + fastDigitalWrite(SPI_MOSI_PIN, data & 0X80); + + data <<= 1; + + fastDigitalWrite(SPI_SCK_PIN, HIGH); + } + // hold SCK high for a few ns + nop; + nop; + nop; + nop; + + fastDigitalWrite(SPI_SCK_PIN, LOW); + // enable interrupts + sei(); +} +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +// send command and return error code. Return zero for OK +uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { + // end read if in partialBlockRead mode + readEnd(); + + // select card + chipSelectLow(); + + // wait up to 300 ms if busy + waitNotBusy(300); + + // send command + spiSend(cmd | 0x40); + + // send argument + for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); + + // send CRC + uint8_t crc = 0XFF; + if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 + if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA + spiSend(crc); + + // wait for response + for (uint8_t i = 0; ((status_ = spiRec()) & 0X80) && i != 0XFF; i++); + return status_; +} +//------------------------------------------------------------------------------ +/** + * Determine the size of an SD flash memory card. + * + * \return The number of 512 byte data blocks in the card + * or zero if an error occurs. + */ +uint32_t Sd2Card::cardSize(void) { + csd_t csd; + if (!readCSD(&csd)) return 0; + if (csd.v1.csd_ver == 0) { + uint8_t read_bl_len = csd.v1.read_bl_len; + uint16_t c_size = (csd.v1.c_size_high << 10) + | (csd.v1.c_size_mid << 2) | csd.v1.c_size_low; + uint8_t c_size_mult = (csd.v1.c_size_mult_high << 1) + | csd.v1.c_size_mult_low; + return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); + } else if (csd.v2.csd_ver == 1) { + uint32_t c_size = ((uint32_t)csd.v2.c_size_high << 16) + | (csd.v2.c_size_mid << 8) | csd.v2.c_size_low; + return (c_size + 1) << 10; + } else { + error(SD_CARD_ERROR_BAD_CSD); + return 0; + } +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectHigh(void) { + digitalWrite(chipSelectPin_, HIGH); +} +//------------------------------------------------------------------------------ +void Sd2Card::chipSelectLow(void) { + digitalWrite(chipSelectPin_, LOW); +} +//------------------------------------------------------------------------------ +/** Erase a range of blocks. + * + * \param[in] firstBlock The address of the first block in the range. + * \param[in] lastBlock The address of the last block in the range. + * + * \note This function requests the SD card to do a flash erase for a + * range of blocks. The data on the card after an erase operation is + * either 0 or 1, depends on the card vendor. The card must support + * single block erase. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { + if (!eraseSingleBlockEnable()) { + error(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); + goto fail; + } + if (type_ != SD_CARD_TYPE_SDHC) { + firstBlock <<= 9; + lastBlock <<= 9; + } + if (cardCommand(CMD32, firstBlock) + || cardCommand(CMD33, lastBlock) + || cardCommand(CMD38, 0)) { + error(SD_CARD_ERROR_ERASE); + goto fail; + } + if (!waitNotBusy(SD_ERASE_TIMEOUT)) { + error(SD_CARD_ERROR_ERASE_TIMEOUT); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Determine if card supports single block erase. + * + * \return The value one, true, is returned if single block erase is supported. + * The value zero, false, is returned if single block erase is not supported. + */ +uint8_t Sd2Card::eraseSingleBlockEnable(void) { + csd_t csd; + return readCSD(&csd) ? csd.v1.erase_blk_en : 0; +} +//------------------------------------------------------------------------------ +/** + * Initialize an SD flash memory card. + * + * \param[in] sckRateID SPI clock rate selector. See setSckRate(). + * \param[in] chipSelectPin SD chip select pin number. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. The reason for failure + * can be determined by calling errorCode() and errorData(). + */ +uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) { + errorCode_ = inBlock_ = partialBlockRead_ = type_ = 0; + chipSelectPin_ = chipSelectPin; + // 16-bit init start time allows over a minute + uint16_t t0 = (uint16_t)millis(); + uint32_t arg; + + // set pin modes + pinMode(chipSelectPin_, OUTPUT); + chipSelectHigh(); + pinMode(SPI_MISO_PIN, INPUT); + pinMode(SPI_MOSI_PIN, OUTPUT); + pinMode(SPI_SCK_PIN, OUTPUT); + +#ifndef SOFTWARE_SPI + // SS must be in output mode even it is not chip select + pinMode(SS_PIN, OUTPUT); + digitalWrite(SS_PIN, HIGH); // disable any SPI device using hardware SS pin + // Enable SPI, Master, clock rate f_osc/128 + SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); + // clear double speed + SPSR &= ~(1 << SPI2X); +#endif // SOFTWARE_SPI + + // must supply min of 74 clock cycles with CS high. + for (uint8_t i = 0; i < 10; i++) spiSend(0XFF); + + chipSelectLow(); + + // command to go idle in SPI mode + while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_CMD0); + goto fail; + } + } + // check SD version + if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { + type(SD_CARD_TYPE_SD1); + } else { + // only need last byte of r7 response + for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); + if (status_ != 0XAA) { + error(SD_CARD_ERROR_CMD8); + goto fail; + } + type(SD_CARD_TYPE_SD2); + } + // initialize card and send host supports SDHC if SD2 + arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; + + while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { + // check for timeout + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { + error(SD_CARD_ERROR_ACMD41); + goto fail; + } + } + // if SD2 read OCR register to check for SDHC card + if (type() == SD_CARD_TYPE_SD2) { + if (cardCommand(CMD58, 0)) { + error(SD_CARD_ERROR_CMD58); + goto fail; + } + if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); + // discard rest of ocr - contains allowed voltage range + for (uint8_t i = 0; i < 3; i++) spiRec(); + } + chipSelectHigh(); + +#ifndef SOFTWARE_SPI + return setSckRate(sckRateID); +#else // SOFTWARE_SPI + return true; +#endif // SOFTWARE_SPI + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Enable or disable partial block reads. + * + * Enabling partial block reads improves performance by allowing a block + * to be read over the SPI bus as several sub-blocks. Errors may occur + * if the time between reads is too long since the SD card may timeout. + * The SPI SS line will be held low until the entire block is read or + * readEnd() is called. + * + * Use this for applications like the Adafruit Wave Shield. + * + * \param[in] value The value TRUE (non-zero) or FALSE (zero).) + */ +void Sd2Card::partialBlockRead(uint8_t value) { + readEnd(); + partialBlockRead_ = value; +} +//------------------------------------------------------------------------------ +/** + * Read a 512 byte block from an SD card device. + * + * \param[in] block Logical block to be read. + * \param[out] dst Pointer to the location that will receive the data. + + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::readBlock(uint32_t block, uint8_t* dst) { + return readData(block, 0, 512, dst); +} +//------------------------------------------------------------------------------ +/** + * Read part of a 512 byte block from an SD card. + * + * \param[in] block Logical block to be read. + * \param[in] offset Number of bytes to skip at start of block + * \param[out] dst Pointer to the location that will receive the data. + * \param[in] count Number of bytes to read + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::readData(uint32_t block, + uint16_t offset, uint16_t count, uint8_t* dst) { + uint16_t n; + if (count == 0) return true; + if ((count + offset) > 512) { + goto fail; + } + if (!inBlock_ || block != block_ || offset < offset_) { + block_ = block; + // use address if not SDHC card + if (type()!= SD_CARD_TYPE_SDHC) block <<= 9; + if (cardCommand(CMD17, block)) { + error(SD_CARD_ERROR_CMD17); + goto fail; + } + if (!waitStartBlock()) { + goto fail; + } + offset_ = 0; + inBlock_ = 1; + } + +#ifdef OPTIMIZE_HARDWARE_SPI + // start first spi transfer + SPDR = 0XFF; + + // skip data before offset + for (;offset_ < offset; offset_++) { + while (!(SPSR & (1 << SPIF))); + SPDR = 0XFF; + } + // transfer data + n = count - 1; + for (uint16_t i = 0; i < n; i++) { + while (!(SPSR & (1 << SPIF))); + dst[i] = SPDR; + SPDR = 0XFF; + } + // wait for last byte + while (!(SPSR & (1 << SPIF))); + dst[n] = SPDR; + +#else // OPTIMIZE_HARDWARE_SPI + + // skip data before offset + for (;offset_ < offset; offset_++) { + spiRec(); + } + // transfer data + for (uint16_t i = 0; i < count; i++) { + dst[i] = spiRec(); + } +#endif // OPTIMIZE_HARDWARE_SPI + + offset_ += count; + if (!partialBlockRead_ || offset_ >= 512) { + // read rest of data, checksum and set chip select high + readEnd(); + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Skip remaining data in a block when in partial block read mode. */ +void Sd2Card::readEnd(void) { + if (inBlock_) { + // skip data and crc +#ifdef OPTIMIZE_HARDWARE_SPI + // optimize skip for hardware + SPDR = 0XFF; + while (offset_++ < 513) { + while (!(SPSR & (1 << SPIF))); + SPDR = 0XFF; + } + // wait for last crc byte + while (!(SPSR & (1 << SPIF))); +#else // OPTIMIZE_HARDWARE_SPI + while (offset_++ < 514) spiRec(); +#endif // OPTIMIZE_HARDWARE_SPI + chipSelectHigh(); + inBlock_ = 0; + } +} +//------------------------------------------------------------------------------ +/** read CID or CSR register */ +uint8_t Sd2Card::readRegister(uint8_t cmd, void* buf) { + uint8_t* dst = reinterpret_cast(buf); + if (cardCommand(cmd, 0)) { + error(SD_CARD_ERROR_READ_REG); + goto fail; + } + if (!waitStartBlock()) goto fail; + // transfer data + for (uint16_t i = 0; i < 16; i++) dst[i] = spiRec(); + spiRec(); // get first crc byte + spiRec(); // get second crc byte + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Set the SPI clock rate. + * + * \param[in] sckRateID A value in the range [0, 6]. + * + * The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum + * SPI rate is F_CPU/2 for \a sckRateID = 0 and the minimum rate is F_CPU/128 + * for \a scsRateID = 6. + * + * \return The value one, true, is returned for success and the value zero, + * false, is returned for an invalid value of \a sckRateID. + */ +uint8_t Sd2Card::setSckRate(uint8_t sckRateID) { + if (sckRateID > 6) { + error(SD_CARD_ERROR_SCK_RATE); + return false; + } + // see avr processor datasheet for SPI register bit definitions + if ((sckRateID & 1) || sckRateID == 6) { + SPSR &= ~(1 << SPI2X); + } else { + SPSR |= (1 << SPI2X); + } + SPCR &= ~((1 < SD_READ_TIMEOUT) { + error(SD_CARD_ERROR_READ_TIMEOUT); + goto fail; + } + } + if (status_ != DATA_START_BLOCK) { + error(SD_CARD_ERROR_READ); + goto fail; + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** + * Writes a 512 byte block to an SD card. + * + * \param[in] blockNumber Logical block to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { +#if SD_PROTECT_BLOCK_ZERO + // don't allow write to first block + if (blockNumber == 0) { + error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); + goto fail; + } +#endif // SD_PROTECT_BLOCK_ZERO + + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD24, blockNumber)) { + error(SD_CARD_ERROR_CMD24); + goto fail; + } + if (!writeData(DATA_START_BLOCK, src)) goto fail; + + // wait for flash programming to complete + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_TIMEOUT); + goto fail; + } + // response is r2 so get and check two bytes for nonzero + if (cardCommand(CMD13, 0) || spiRec()) { + error(SD_CARD_ERROR_WRITE_PROGRAMMING); + goto fail; + } + chipSelectHigh(); + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** Write one data block in a multiple block write sequence */ +uint8_t Sd2Card::writeData(const uint8_t* src) { + // wait for previous write to finish + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_MULTIPLE); + chipSelectHigh(); + return false; + } + return writeData(WRITE_MULTIPLE_TOKEN, src); +} +//------------------------------------------------------------------------------ +// send one block of data for write block or write multiple blocks +uint8_t Sd2Card::writeData(uint8_t token, const uint8_t* src) { +#ifdef OPTIMIZE_HARDWARE_SPI + + // send data - optimized loop + SPDR = token; + + // send two byte per iteration + for (uint16_t i = 0; i < 512; i += 2) { + while (!(SPSR & (1 << SPIF))); + SPDR = src[i]; + while (!(SPSR & (1 << SPIF))); + SPDR = src[i+1]; + } + + // wait for last data byte + while (!(SPSR & (1 << SPIF))); + +#else // OPTIMIZE_HARDWARE_SPI + spiSend(token); + for (uint16_t i = 0; i < 512; i++) { + spiSend(src[i]); + } +#endif // OPTIMIZE_HARDWARE_SPI + spiSend(0xff); // dummy crc + spiSend(0xff); // dummy crc + + status_ = spiRec(); + if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { + error(SD_CARD_ERROR_WRITE); + chipSelectHigh(); + return false; + } + return true; +} +//------------------------------------------------------------------------------ +/** Start a write multiple blocks sequence. + * + * \param[in] blockNumber Address of first block in sequence. + * \param[in] eraseCount The number of blocks to be pre-erased. + * + * \note This function is used with writeData() and writeStop() + * for optimized multiple block writes. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { +#if SD_PROTECT_BLOCK_ZERO + // don't allow write to first block + if (blockNumber == 0) { + error(SD_CARD_ERROR_WRITE_BLOCK_ZERO); + goto fail; + } +#endif // SD_PROTECT_BLOCK_ZERO + // send pre-erase count + if (cardAcmd(ACMD23, eraseCount)) { + error(SD_CARD_ERROR_ACMD23); + goto fail; + } + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD25, blockNumber)) { + error(SD_CARD_ERROR_CMD25); + goto fail; + } + return true; + + fail: + chipSelectHigh(); + return false; +} +//------------------------------------------------------------------------------ +/** End a write multiple blocks sequence. + * +* \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t Sd2Card::writeStop(void) { + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + spiSend(STOP_TRAN_TOKEN); + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto fail; + chipSelectHigh(); + return true; + + fail: + error(SD_CARD_ERROR_STOP_TRAN); + chipSelectHigh(); + return false; +} diff --git a/arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.h b/arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.h new file mode 100644 index 0000000..73b46fb --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/Sd2Card.h @@ -0,0 +1,233 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef Sd2Card_h +#define Sd2Card_h +/** + * \file + * Sd2Card class + */ +#include "Sd2PinMap.h" +#include "SdInfo.h" +/** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ +uint8_t const SPI_FULL_SPEED = 0; +/** Set SCK rate to F_CPU/4. See Sd2Card::setSckRate(). */ +uint8_t const SPI_HALF_SPEED = 1; +/** Set SCK rate to F_CPU/8. Sd2Card::setSckRate(). */ +uint8_t const SPI_QUARTER_SPEED = 2; +/** + * Define MEGA_SOFT_SPI non-zero to use software SPI on Mega Arduinos. + * Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * + * MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used + * on Mega Arduinos. Software SPI works well with GPS Shield V1.1 + * but many SD cards will fail with GPS Shield V1.0. + */ +#define MEGA_SOFT_SPI 0 +//------------------------------------------------------------------------------ +#if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) +#define SOFTWARE_SPI +#endif // MEGA_SOFT_SPI +//------------------------------------------------------------------------------ +// SPI pin definitions +// +#ifndef SOFTWARE_SPI +// hardware pin defs +/** + * SD Chip Select pin + * + * Warning if this pin is redefined the hardware SS will pin will be enabled + * as an output by init(). An avr processor will not function as an SPI + * master unless SS is set to output mode. + */ +/** The default chip select pin for the SD card is SS. */ +uint8_t const SD_CHIP_SELECT_PIN = SS_PIN; +// The following three pins must not be redefined for hardware SPI. +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = MOSI_PIN; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = MISO_PIN; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = SCK_PIN; +/** optimize loops for hardware SPI */ +#define OPTIMIZE_HARDWARE_SPI + +#else // SOFTWARE_SPI +// define software SPI pins so Mega can use unmodified GPS Shield +/** SPI chip select pin */ +uint8_t const SD_CHIP_SELECT_PIN = 10; +/** SPI Master Out Slave In pin */ +uint8_t const SPI_MOSI_PIN = 11; +/** SPI Master In Slave Out pin */ +uint8_t const SPI_MISO_PIN = 12; +/** SPI Clock pin */ +uint8_t const SPI_SCK_PIN = 13; +#endif // SOFTWARE_SPI +//------------------------------------------------------------------------------ +/** Protect block zero from write if nonzero */ +#define SD_PROTECT_BLOCK_ZERO 1 +/** init timeout ms */ +uint16_t const SD_INIT_TIMEOUT = 2000; +/** erase timeout ms */ +uint16_t const SD_ERASE_TIMEOUT = 10000; +/** read timeout ms */ +uint16_t const SD_READ_TIMEOUT = 300; +/** write time out ms */ +uint16_t const SD_WRITE_TIMEOUT = 600; +//------------------------------------------------------------------------------ +// SD card errors +/** timeout error for command CMD0 */ +uint8_t const SD_CARD_ERROR_CMD0 = 0X1; +/** CMD8 was not accepted - not a valid SD card*/ +uint8_t const SD_CARD_ERROR_CMD8 = 0X2; +/** card returned an error response for CMD17 (read block) */ +uint8_t const SD_CARD_ERROR_CMD17 = 0X3; +/** card returned an error response for CMD24 (write block) */ +uint8_t const SD_CARD_ERROR_CMD24 = 0X4; +/** WRITE_MULTIPLE_BLOCKS command failed */ +uint8_t const SD_CARD_ERROR_CMD25 = 0X05; +/** card returned an error response for CMD58 (read OCR) */ +uint8_t const SD_CARD_ERROR_CMD58 = 0X06; +/** SET_WR_BLK_ERASE_COUNT failed */ +uint8_t const SD_CARD_ERROR_ACMD23 = 0X07; +/** card's ACMD41 initialization process timeout */ +uint8_t const SD_CARD_ERROR_ACMD41 = 0X08; +/** card returned a bad CSR version field */ +uint8_t const SD_CARD_ERROR_BAD_CSD = 0X09; +/** erase block group command failed */ +uint8_t const SD_CARD_ERROR_ERASE = 0X0A; +/** card not capable of single block erase */ +uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0X0B; +/** Erase sequence timed out */ +uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0X0C; +/** card returned an error token instead of read data */ +uint8_t const SD_CARD_ERROR_READ = 0X0D; +/** read CID or CSD failed */ +uint8_t const SD_CARD_ERROR_READ_REG = 0X0E; +/** timeout while waiting for start of read data */ +uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X0F; +/** card did not accept STOP_TRAN_TOKEN */ +uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X10; +/** card returned an error token as a response to a write operation */ +uint8_t const SD_CARD_ERROR_WRITE = 0X11; +/** attempt to write protected block zero */ +uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X12; +/** card did not go ready for a multiple block write */ +uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X13; +/** card returned an error to a CMD13 status check after a write */ +uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X14; +/** timeout occurred during write programming */ +uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X15; +/** incorrect rate selected */ +uint8_t const SD_CARD_ERROR_SCK_RATE = 0X16; +//------------------------------------------------------------------------------ +// card types +/** Standard capacity V1 SD card */ +uint8_t const SD_CARD_TYPE_SD1 = 1; +/** Standard capacity V2 SD card */ +uint8_t const SD_CARD_TYPE_SD2 = 2; +/** High Capacity SD card */ +uint8_t const SD_CARD_TYPE_SDHC = 3; +//------------------------------------------------------------------------------ +/** + * \class Sd2Card + * \brief Raw access to SD and SDHC flash memory cards. + */ +class Sd2Card { + public: + /** Construct an instance of Sd2Card. */ + Sd2Card(void) : errorCode_(0), inBlock_(0), partialBlockRead_(0), type_(0) {} + uint32_t cardSize(void); + uint8_t erase(uint32_t firstBlock, uint32_t lastBlock); + uint8_t eraseSingleBlockEnable(void); + /** + * \return error code for last error. See Sd2Card.h for a list of error codes. + */ + uint8_t errorCode(void) const {return errorCode_;} + /** \return error data for last error. */ + uint8_t errorData(void) const {return status_;} + /** + * Initialize an SD flash memory card with default clock rate and chip + * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + */ + uint8_t init(void) { + return init(SPI_FULL_SPEED, SD_CHIP_SELECT_PIN); + } + /** + * Initialize an SD flash memory card with the selected SPI clock rate + * and the default SD chip select pin. + * See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + */ + uint8_t init(uint8_t sckRateID) { + return init(sckRateID, SD_CHIP_SELECT_PIN); + } + uint8_t init(uint8_t sckRateID, uint8_t chipSelectPin); + void partialBlockRead(uint8_t value); + /** Returns the current value, true or false, for partial block read. */ + uint8_t partialBlockRead(void) const {return partialBlockRead_;} + uint8_t readBlock(uint32_t block, uint8_t* dst); + uint8_t readData(uint32_t block, + uint16_t offset, uint16_t count, uint8_t* dst); + /** + * Read a cards CID register. The CID contains card identification + * information such as Manufacturer ID, Product name, Product serial + * number and Manufacturing date. */ + uint8_t readCID(cid_t* cid) { + return readRegister(CMD10, cid); + } + /** + * Read a cards CSD register. The CSD contains Card-Specific Data that + * provides information regarding access to the card's contents. */ + uint8_t readCSD(csd_t* csd) { + return readRegister(CMD9, csd); + } + void readEnd(void); + uint8_t setSckRate(uint8_t sckRateID); + /** Return the card type: SD V1, SD V2 or SDHC */ + uint8_t type(void) const {return type_;} + uint8_t writeBlock(uint32_t blockNumber, const uint8_t* src); + uint8_t writeData(const uint8_t* src); + uint8_t writeStart(uint32_t blockNumber, uint32_t eraseCount); + uint8_t writeStop(void); + private: + uint32_t block_; + uint8_t chipSelectPin_; + uint8_t errorCode_; + uint8_t inBlock_; + uint16_t offset_; + uint8_t partialBlockRead_; + uint8_t status_; + uint8_t type_; + // private functions + uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { + cardCommand(CMD55, 0); + return cardCommand(cmd, arg); + } + uint8_t cardCommand(uint8_t cmd, uint32_t arg); + void error(uint8_t code) {errorCode_ = code;} + uint8_t readRegister(uint8_t cmd, void* buf); + uint8_t sendWriteCommand(uint32_t blockNumber, uint32_t eraseCount); + void chipSelectHigh(void); + void chipSelectLow(void); + void type(uint8_t value) {type_ = value;} + uint8_t waitNotBusy(uint16_t timeoutMillis); + uint8_t writeData(uint8_t token, const uint8_t* src); + uint8_t waitStartBlock(void); +}; +#endif // Sd2Card_h diff --git a/arduino-0022-linux-x64/libraries/SD/utility/Sd2PinMap.h b/arduino-0022-linux-x64/libraries/SD/utility/Sd2PinMap.h new file mode 100644 index 0000000..4bd75a3 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/Sd2PinMap.h @@ -0,0 +1,353 @@ +/* Arduino SdFat Library + * Copyright (C) 2010 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +// Warning this file was generated by a program. +#ifndef Sd2PinMap_h +#define Sd2PinMap_h +#include + +//------------------------------------------------------------------------------ +/** struct for mapping digital pins */ +struct pin_map_t { + volatile uint8_t* ddr; + volatile uint8_t* pin; + volatile uint8_t* port; + uint8_t bit; +}; +//------------------------------------------------------------------------------ +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +// Mega + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 20; +uint8_t const SCL_PIN = 21; + +// SPI port +uint8_t const SS_PIN = 53; +uint8_t const MOSI_PIN = 51; +uint8_t const MISO_PIN = 50; +uint8_t const SCK_PIN = 52; + +static const pin_map_t digitalPinMap[] = { + {&DDRE, &PINE, &PORTE, 0}, // E0 0 + {&DDRE, &PINE, &PORTE, 1}, // E1 1 + {&DDRE, &PINE, &PORTE, 4}, // E4 2 + {&DDRE, &PINE, &PORTE, 5}, // E5 3 + {&DDRG, &PING, &PORTG, 5}, // G5 4 + {&DDRE, &PINE, &PORTE, 3}, // E3 5 + {&DDRH, &PINH, &PORTH, 3}, // H3 6 + {&DDRH, &PINH, &PORTH, 4}, // H4 7 + {&DDRH, &PINH, &PORTH, 5}, // H5 8 + {&DDRH, &PINH, &PORTH, 6}, // H6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 + {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 + {&DDRH, &PINH, &PORTH, 1}, // H1 16 + {&DDRH, &PINH, &PORTH, 0}, // H0 17 + {&DDRD, &PIND, &PORTD, 3}, // D3 18 + {&DDRD, &PIND, &PORTD, 2}, // D2 19 + {&DDRD, &PIND, &PORTD, 1}, // D1 20 + {&DDRD, &PIND, &PORTD, 0}, // D0 21 + {&DDRA, &PINA, &PORTA, 0}, // A0 22 + {&DDRA, &PINA, &PORTA, 1}, // A1 23 + {&DDRA, &PINA, &PORTA, 2}, // A2 24 + {&DDRA, &PINA, &PORTA, 3}, // A3 25 + {&DDRA, &PINA, &PORTA, 4}, // A4 26 + {&DDRA, &PINA, &PORTA, 5}, // A5 27 + {&DDRA, &PINA, &PORTA, 6}, // A6 28 + {&DDRA, &PINA, &PORTA, 7}, // A7 29 + {&DDRC, &PINC, &PORTC, 7}, // C7 30 + {&DDRC, &PINC, &PORTC, 6}, // C6 31 + {&DDRC, &PINC, &PORTC, 5}, // C5 32 + {&DDRC, &PINC, &PORTC, 4}, // C4 33 + {&DDRC, &PINC, &PORTC, 3}, // C3 34 + {&DDRC, &PINC, &PORTC, 2}, // C2 35 + {&DDRC, &PINC, &PORTC, 1}, // C1 36 + {&DDRC, &PINC, &PORTC, 0}, // C0 37 + {&DDRD, &PIND, &PORTD, 7}, // D7 38 + {&DDRG, &PING, &PORTG, 2}, // G2 39 + {&DDRG, &PING, &PORTG, 1}, // G1 40 + {&DDRG, &PING, &PORTG, 0}, // G0 41 + {&DDRL, &PINL, &PORTL, 7}, // L7 42 + {&DDRL, &PINL, &PORTL, 6}, // L6 43 + {&DDRL, &PINL, &PORTL, 5}, // L5 44 + {&DDRL, &PINL, &PORTL, 4}, // L4 45 + {&DDRL, &PINL, &PORTL, 3}, // L3 46 + {&DDRL, &PINL, &PORTL, 2}, // L2 47 + {&DDRL, &PINL, &PORTL, 1}, // L1 48 + {&DDRL, &PINL, &PORTL, 0}, // L0 49 + {&DDRB, &PINB, &PORTB, 3}, // B3 50 + {&DDRB, &PINB, &PORTB, 2}, // B2 51 + {&DDRB, &PINB, &PORTB, 1}, // B1 52 + {&DDRB, &PINB, &PORTB, 0}, // B0 53 + {&DDRF, &PINF, &PORTF, 0}, // F0 54 + {&DDRF, &PINF, &PORTF, 1}, // F1 55 + {&DDRF, &PINF, &PORTF, 2}, // F2 56 + {&DDRF, &PINF, &PORTF, 3}, // F3 57 + {&DDRF, &PINF, &PORTF, 4}, // F4 58 + {&DDRF, &PINF, &PORTF, 5}, // F5 59 + {&DDRF, &PINF, &PORTF, 6}, // F6 60 + {&DDRF, &PINF, &PORTF, 7}, // F7 61 + {&DDRK, &PINK, &PORTK, 0}, // K0 62 + {&DDRK, &PINK, &PORTK, 1}, // K1 63 + {&DDRK, &PINK, &PORTK, 2}, // K2 64 + {&DDRK, &PINK, &PORTK, 3}, // K3 65 + {&DDRK, &PINK, &PORTK, 4}, // K4 66 + {&DDRK, &PINK, &PORTK, 5}, // K5 67 + {&DDRK, &PINK, &PORTK, 6}, // K6 68 + {&DDRK, &PINK, &PORTK, 7} // K7 69 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) +// Sanguino + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 17; +uint8_t const SCL_PIN = 18; + +// SPI port +uint8_t const SS_PIN = 4; +uint8_t const MOSI_PIN = 5; +uint8_t const MISO_PIN = 6; +uint8_t const SCK_PIN = 7; + +static const pin_map_t digitalPinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 7}, // A7 24 + {&DDRA, &PINA, &PORTA, 6}, // A6 25 + {&DDRA, &PINA, &PORTA, 5}, // A5 26 + {&DDRA, &PINA, &PORTA, 4}, // A4 27 + {&DDRA, &PINA, &PORTA, 3}, // A3 28 + {&DDRA, &PINA, &PORTA, 2}, // A2 29 + {&DDRA, &PINA, &PORTA, 1}, // A1 30 + {&DDRA, &PINA, &PORTA, 0} // A0 31 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega32U4__) +// Teensy 2.0 + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 6; +uint8_t const SCL_PIN = 5; + +// SPI port +uint8_t const SS_PIN = 0; +uint8_t const MOSI_PIN = 2; +uint8_t const MISO_PIN = 3; +uint8_t const SCK_PIN = 1; + +static const pin_map_t digitalPinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 7}, // B7 4 + {&DDRD, &PIND, &PORTD, 0}, // D0 5 + {&DDRD, &PIND, &PORTD, 1}, // D1 6 + {&DDRD, &PIND, &PORTD, 2}, // D2 7 + {&DDRD, &PIND, &PORTD, 3}, // D3 8 + {&DDRC, &PINC, &PORTC, 6}, // C6 9 + {&DDRC, &PINC, &PORTC, 7}, // C7 10 + {&DDRD, &PIND, &PORTD, 6}, // D6 11 + {&DDRD, &PIND, &PORTD, 7}, // D7 12 + {&DDRB, &PINB, &PORTB, 4}, // B4 13 + {&DDRB, &PINB, &PORTB, 5}, // B5 14 + {&DDRB, &PINB, &PORTB, 6}, // B6 15 + {&DDRF, &PINF, &PORTF, 7}, // F7 16 + {&DDRF, &PINF, &PORTF, 6}, // F6 17 + {&DDRF, &PINF, &PORTF, 5}, // F5 18 + {&DDRF, &PINF, &PORTF, 4}, // F4 19 + {&DDRF, &PINF, &PORTF, 1}, // F1 20 + {&DDRF, &PINF, &PORTF, 0}, // F0 21 + {&DDRD, &PIND, &PORTD, 4}, // D4 22 + {&DDRD, &PIND, &PORTD, 5}, // D5 23 + {&DDRE, &PINE, &PORTE, 6} // E6 24 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) +// Teensy++ 1.0 & 2.0 + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 1; +uint8_t const SCL_PIN = 0; + +// SPI port +uint8_t const SS_PIN = 20; +uint8_t const MOSI_PIN = 22; +uint8_t const MISO_PIN = 23; +uint8_t const SCK_PIN = 21; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRE, &PINE, &PORTE, 0}, // E0 8 + {&DDRE, &PINE, &PORTE, 1}, // E1 9 + {&DDRC, &PINC, &PORTC, 0}, // C0 10 + {&DDRC, &PINC, &PORTC, 1}, // C1 11 + {&DDRC, &PINC, &PORTC, 2}, // C2 12 + {&DDRC, &PINC, &PORTC, 3}, // C3 13 + {&DDRC, &PINC, &PORTC, 4}, // C4 14 + {&DDRC, &PINC, &PORTC, 5}, // C5 15 + {&DDRC, &PINC, &PORTC, 6}, // C6 16 + {&DDRC, &PINC, &PORTC, 7}, // C7 17 + {&DDRE, &PINE, &PORTE, 6}, // E6 18 + {&DDRE, &PINE, &PORTE, 7}, // E7 19 + {&DDRB, &PINB, &PORTB, 0}, // B0 20 + {&DDRB, &PINB, &PORTB, 1}, // B1 21 + {&DDRB, &PINB, &PORTB, 2}, // B2 22 + {&DDRB, &PINB, &PORTB, 3}, // B3 23 + {&DDRB, &PINB, &PORTB, 4}, // B4 24 + {&DDRB, &PINB, &PORTB, 5}, // B5 25 + {&DDRB, &PINB, &PORTB, 6}, // B6 26 + {&DDRB, &PINB, &PORTB, 7}, // B7 27 + {&DDRA, &PINA, &PORTA, 0}, // A0 28 + {&DDRA, &PINA, &PORTA, 1}, // A1 29 + {&DDRA, &PINA, &PORTA, 2}, // A2 30 + {&DDRA, &PINA, &PORTA, 3}, // A3 31 + {&DDRA, &PINA, &PORTA, 4}, // A4 32 + {&DDRA, &PINA, &PORTA, 5}, // A5 33 + {&DDRA, &PINA, &PORTA, 6}, // A6 34 + {&DDRA, &PINA, &PORTA, 7}, // A7 35 + {&DDRE, &PINE, &PORTE, 4}, // E4 36 + {&DDRE, &PINE, &PORTE, 5}, // E5 37 + {&DDRF, &PINF, &PORTF, 0}, // F0 38 + {&DDRF, &PINF, &PORTF, 1}, // F1 39 + {&DDRF, &PINF, &PORTF, 2}, // F2 40 + {&DDRF, &PINF, &PORTF, 3}, // F3 41 + {&DDRF, &PINF, &PORTF, 4}, // F4 42 + {&DDRF, &PINF, &PORTF, 5}, // F5 43 + {&DDRF, &PINF, &PORTF, 6}, // F6 44 + {&DDRF, &PINF, &PORTF, 7} // F7 45 +}; +//------------------------------------------------------------------------------ +#else // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +// 168 and 328 Arduinos + +// Two Wire (aka I2C) ports +uint8_t const SDA_PIN = 18; +uint8_t const SCL_PIN = 19; + +// SPI port +uint8_t const SS_PIN = 10; +uint8_t const MOSI_PIN = 11; +uint8_t const MISO_PIN = 12; +uint8_t const SCK_PIN = 13; + +static const pin_map_t digitalPinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRB, &PINB, &PORTB, 0}, // B0 8 + {&DDRB, &PINB, &PORTB, 1}, // B1 9 + {&DDRB, &PINB, &PORTB, 2}, // B2 10 + {&DDRB, &PINB, &PORTB, 3}, // B3 11 + {&DDRB, &PINB, &PORTB, 4}, // B4 12 + {&DDRB, &PINB, &PORTB, 5}, // B5 13 + {&DDRC, &PINC, &PORTC, 0}, // C0 14 + {&DDRC, &PINC, &PORTC, 1}, // C1 15 + {&DDRC, &PINC, &PORTC, 2}, // C2 16 + {&DDRC, &PINC, &PORTC, 3}, // C3 17 + {&DDRC, &PINC, &PORTC, 4}, // C4 18 + {&DDRC, &PINC, &PORTC, 5} // C5 19 +}; +#endif // defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +//------------------------------------------------------------------------------ +static const uint8_t digitalPinCount = sizeof(digitalPinMap)/sizeof(pin_map_t); + +uint8_t badPinNumber(void) + __attribute__((error("Pin number is too large or not a constant"))); + +static inline __attribute__((always_inline)) + uint8_t getPinMode(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].ddr >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void setPinMode(uint8_t pin, uint8_t mode) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (mode) { + *digitalPinMap[pin].ddr |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].ddr &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +static inline __attribute__((always_inline)) + uint8_t fastDigitalRead(uint8_t pin) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + return (*digitalPinMap[pin].pin >> digitalPinMap[pin].bit) & 1; + } else { + return badPinNumber(); + } +} +static inline __attribute__((always_inline)) + void fastDigitalWrite(uint8_t pin, uint8_t value) { + if (__builtin_constant_p(pin) && pin < digitalPinCount) { + if (value) { + *digitalPinMap[pin].port |= 1 << digitalPinMap[pin].bit; + } else { + *digitalPinMap[pin].port &= ~(1 << digitalPinMap[pin].bit); + } + } else { + badPinNumber(); + } +} +#endif // Sd2PinMap_h diff --git a/arduino-0022-linux-x64/libraries/SD/utility/SdFat.h b/arduino-0022-linux-x64/libraries/SD/utility/SdFat.h new file mode 100644 index 0000000..048fa71 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/SdFat.h @@ -0,0 +1,547 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFat_h +#define SdFat_h +/** + * \file + * SdFile and SdVolume classes + */ +#include +#include "Sd2Card.h" +#include "FatStructs.h" +#include "Print.h" +//------------------------------------------------------------------------------ +/** + * Allow use of deprecated functions if non-zero + */ +#define ALLOW_DEPRECATED_FUNCTIONS 1 +//------------------------------------------------------------------------------ +// forward declaration since SdVolume is used in SdFile +class SdVolume; +//============================================================================== +// SdFile class + +// flags for ls() +/** ls() flag to print modify date */ +uint8_t const LS_DATE = 1; +/** ls() flag to print file size */ +uint8_t const LS_SIZE = 2; +/** ls() flag for recursive list of subdirectories */ +uint8_t const LS_R = 4; + +// use the gnu style oflag in open() +/** open() oflag for reading */ +uint8_t const O_READ = 0X01; +/** open() oflag - same as O_READ */ +uint8_t const O_RDONLY = O_READ; +/** open() oflag for write */ +uint8_t const O_WRITE = 0X02; +/** open() oflag - same as O_WRITE */ +uint8_t const O_WRONLY = O_WRITE; +/** open() oflag for reading and writing */ +uint8_t const O_RDWR = (O_READ | O_WRITE); +/** open() oflag mask for access modes */ +uint8_t const O_ACCMODE = (O_READ | O_WRITE); +/** The file offset shall be set to the end of the file prior to each write. */ +uint8_t const O_APPEND = 0X04; +/** synchronous writes - call sync() after each write */ +uint8_t const O_SYNC = 0X08; +/** create the file if nonexistent */ +uint8_t const O_CREAT = 0X10; +/** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ +uint8_t const O_EXCL = 0X20; +/** truncate the file to zero length */ +uint8_t const O_TRUNC = 0X40; + +// flags for timestamp +/** set the file's last access date */ +uint8_t const T_ACCESS = 1; +/** set the file's creation date and time */ +uint8_t const T_CREATE = 2; +/** Set the file's write date and time */ +uint8_t const T_WRITE = 4; +// values for type_ +/** This SdFile has not been opened. */ +uint8_t const FAT_FILE_TYPE_CLOSED = 0; +/** SdFile for a file */ +uint8_t const FAT_FILE_TYPE_NORMAL = 1; +/** SdFile for a FAT16 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT16 = 2; +/** SdFile for a FAT32 root directory */ +uint8_t const FAT_FILE_TYPE_ROOT32 = 3; +/** SdFile for a subdirectory */ +uint8_t const FAT_FILE_TYPE_SUBDIR = 4; +/** Test value for directory type */ +uint8_t const FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT16; + +/** date field for FAT directory entry */ +static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) { + return (year - 1980) << 9 | month << 5 | day; +} +/** year part of FAT directory date field */ +static inline uint16_t FAT_YEAR(uint16_t fatDate) { + return 1980 + (fatDate >> 9); +} +/** month part of FAT directory date field */ +static inline uint8_t FAT_MONTH(uint16_t fatDate) { + return (fatDate >> 5) & 0XF; +} +/** day part of FAT directory date field */ +static inline uint8_t FAT_DAY(uint16_t fatDate) { + return fatDate & 0X1F; +} +/** time field for FAT directory entry */ +static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) { + return hour << 11 | minute << 5 | second >> 1; +} +/** hour part of FAT directory time field */ +static inline uint8_t FAT_HOUR(uint16_t fatTime) { + return fatTime >> 11; +} +/** minute part of FAT directory time field */ +static inline uint8_t FAT_MINUTE(uint16_t fatTime) { + return(fatTime >> 5) & 0X3F; +} +/** second part of FAT directory time field */ +static inline uint8_t FAT_SECOND(uint16_t fatTime) { + return 2*(fatTime & 0X1F); +} +/** Default date for file timestamps is 1 Jan 2000 */ +uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; +/** Default time for file timestamp is 1 am */ +uint16_t const FAT_DEFAULT_TIME = (1 << 11); +//------------------------------------------------------------------------------ +/** + * \class SdFile + * \brief Access FAT16 and FAT32 files on SD and SDHC cards. + */ +class SdFile : public Print { + public: + /** Create an instance of SdFile. */ + SdFile(void) : type_(FAT_FILE_TYPE_CLOSED) {} + /** + * writeError is set to true if an error occurs during a write(). + * Set writeError to false before calling print() and/or write() and check + * for true after calls to print() and/or write(). + */ + bool writeError; + /** + * Cancel unbuffered reads for this file. + * See setUnbufferedRead() + */ + void clearUnbufferedRead(void) { + flags_ &= ~F_FILE_UNBUFFERED_READ; + } + uint8_t close(void); + uint8_t contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + uint8_t createContiguous(SdFile* dirFile, + const char* fileName, uint32_t size); + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster(void) const {return curCluster_;} + /** \return The current position for a file or directory. */ + uint32_t curPosition(void) const {return curPosition_;} + /** + * Set the date/time callback function + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here + * + * // return date using FAT_DATE macro to format fields + * *date = FAT_DATE(year, month, day); + * + * // return time using FAT_TIME macro to format fields + * *time = FAT_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + * See the timestamp() function. + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t* date, uint16_t* time)) { + dateTime_ = dateTime; + } + /** + * Cancel the date/time callback function. + */ + static void dateTimeCallbackCancel(void) { + // use explicit zero since NULL is not defined for Sanguino + dateTime_ = 0; + } + /** \return Address of the block that contains this file's directory. */ + uint32_t dirBlock(void) const {return dirBlock_;} + uint8_t dirEntry(dir_t* dir); + /** \return Index of this file's directory in the block dirBlock. */ + uint8_t dirIndex(void) const {return dirIndex_;} + static void dirName(const dir_t& dir, char* name); + /** \return The total number of bytes in a file or directory. */ + uint32_t fileSize(void) const {return fileSize_;} + /** \return The first cluster number for a file or directory. */ + uint32_t firstCluster(void) const {return firstCluster_;} + /** \return True if this is a SdFile for a directory else false. */ + uint8_t isDir(void) const {return type_ >= FAT_FILE_TYPE_MIN_DIR;} + /** \return True if this is a SdFile for a file else false. */ + uint8_t isFile(void) const {return type_ == FAT_FILE_TYPE_NORMAL;} + /** \return True if this is a SdFile for an open file/directory else false. */ + uint8_t isOpen(void) const {return type_ != FAT_FILE_TYPE_CLOSED;} + /** \return True if this is a SdFile for a subdirectory else false. */ + uint8_t isSubDir(void) const {return type_ == FAT_FILE_TYPE_SUBDIR;} + /** \return True if this is a SdFile for the root directory. */ + uint8_t isRoot(void) const { + return type_ == FAT_FILE_TYPE_ROOT16 || type_ == FAT_FILE_TYPE_ROOT32; + } + void ls(uint8_t flags = 0, uint8_t indent = 0); + uint8_t makeDir(SdFile* dir, const char* dirName); + uint8_t open(SdFile* dirFile, uint16_t index, uint8_t oflag); + uint8_t open(SdFile* dirFile, const char* fileName, uint8_t oflag); + + uint8_t openRoot(SdVolume* vol); + static void printDirName(const dir_t& dir, uint8_t width); + static void printFatDate(uint16_t fatDate); + static void printFatTime(uint16_t fatTime); + static void printTwoDigits(uint8_t v); + /** + * Read the next byte from a file. + * + * \return For success read returns the next byte in the file as an int. + * If an error occurs or end of file is reached -1 is returned. + */ + int16_t read(void) { + uint8_t b; + return read(&b, 1) == 1 ? b : -1; + } + int16_t read(void* buf, uint16_t nbyte); + int8_t readDir(dir_t* dir); + static uint8_t remove(SdFile* dirFile, const char* fileName); + uint8_t remove(void); + /** Set the file's current position to zero. */ + void rewind(void) { + curPosition_ = curCluster_ = 0; + } + uint8_t rmDir(void); + uint8_t rmRfStar(void); + /** Set the files position to current position + \a pos. See seekSet(). */ + uint8_t seekCur(uint32_t pos) { + return seekSet(curPosition_ + pos); + } + /** + * Set the files current position to end of file. Useful to position + * a file for append. See seekSet(). + */ + uint8_t seekEnd(void) {return seekSet(fileSize_);} + uint8_t seekSet(uint32_t pos); + /** + * Use unbuffered reads to access this file. Used with Wave + * Shield ISR. Used with Sd2Card::partialBlockRead() in WaveRP. + * + * Not recommended for normal applications. + */ + void setUnbufferedRead(void) { + if (isFile()) flags_ |= F_FILE_UNBUFFERED_READ; + } + uint8_t timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, + uint8_t hour, uint8_t minute, uint8_t second); + uint8_t sync(void); + /** Type of this SdFile. You should use isFile() or isDir() instead of type() + * if possible. + * + * \return The file or directory type. + */ + uint8_t type(void) const {return type_;} + uint8_t truncate(uint32_t size); + /** \return Unbuffered read flag. */ + uint8_t unbufferedRead(void) const { + return flags_ & F_FILE_UNBUFFERED_READ; + } + /** \return SdVolume that contains this file. */ + SdVolume* volume(void) const {return vol_;} + void write(uint8_t b); + int16_t write(const void* buf, uint16_t nbyte); + void write(const char* str); + void write_P(PGM_P str); + void writeln_P(PGM_P str); +//------------------------------------------------------------------------------ +#if ALLOW_DEPRECATED_FUNCTIONS +// Deprecated functions - suppress cpplint warnings with NOLINT comment + /** \deprecated Use: + * uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + */ + uint8_t contiguousRange(uint32_t& bgnBlock, uint32_t& endBlock) { // NOLINT + return contiguousRange(&bgnBlock, &endBlock); + } + /** \deprecated Use: + * uint8_t SdFile::createContiguous(SdFile* dirFile, + * const char* fileName, uint32_t size) + */ + uint8_t createContiguous(SdFile& dirFile, // NOLINT + const char* fileName, uint32_t size) { + return createContiguous(&dirFile, fileName, size); + } + + /** + * \deprecated Use: + * static void SdFile::dateTimeCallback( + * void (*dateTime)(uint16_t* date, uint16_t* time)); + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t& date, uint16_t& time)) { // NOLINT + oldDateTime_ = dateTime; + dateTime_ = dateTime ? oldToNew : 0; + } + /** \deprecated Use: uint8_t SdFile::dirEntry(dir_t* dir); */ + uint8_t dirEntry(dir_t& dir) {return dirEntry(&dir);} // NOLINT + /** \deprecated Use: + * uint8_t SdFile::makeDir(SdFile* dir, const char* dirName); + */ + uint8_t makeDir(SdFile& dir, const char* dirName) { // NOLINT + return makeDir(&dir, dirName); + } + /** \deprecated Use: + * uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag); + */ + uint8_t open(SdFile& dirFile, // NOLINT + const char* fileName, uint8_t oflag) { + return open(&dirFile, fileName, oflag); + } + /** \deprecated Do not use in new apps */ + uint8_t open(SdFile& dirFile, const char* fileName) { // NOLINT + return open(dirFile, fileName, O_RDWR); + } + /** \deprecated Use: + * uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag); + */ + uint8_t open(SdFile& dirFile, uint16_t index, uint8_t oflag) { // NOLINT + return open(&dirFile, index, oflag); + } + /** \deprecated Use: uint8_t SdFile::openRoot(SdVolume* vol); */ + uint8_t openRoot(SdVolume& vol) {return openRoot(&vol);} // NOLINT + + /** \deprecated Use: int8_t SdFile::readDir(dir_t* dir); */ + int8_t readDir(dir_t& dir) {return readDir(&dir);} // NOLINT + /** \deprecated Use: + * static uint8_t SdFile::remove(SdFile* dirFile, const char* fileName); + */ + static uint8_t remove(SdFile& dirFile, const char* fileName) { // NOLINT + return remove(&dirFile, fileName); + } +//------------------------------------------------------------------------------ +// rest are private + private: + static void (*oldDateTime_)(uint16_t& date, uint16_t& time); // NOLINT + static void oldToNew(uint16_t* date, uint16_t* time) { + uint16_t d; + uint16_t t; + oldDateTime_(d, t); + *date = d; + *time = t; + } +#endif // ALLOW_DEPRECATED_FUNCTIONS + private: + // bits defined in flags_ + // should be 0XF + static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC); + // available bits + static uint8_t const F_UNUSED = 0X30; + // use unbuffered SD read + static uint8_t const F_FILE_UNBUFFERED_READ = 0X40; + // sync of directory entry required + static uint8_t const F_FILE_DIR_DIRTY = 0X80; + +// make sure F_OFLAG is ok +#if ((F_UNUSED | F_FILE_UNBUFFERED_READ | F_FILE_DIR_DIRTY) & F_OFLAG) +#error flags_ bits conflict +#endif // flags_ bits + + // private data + uint8_t flags_; // See above for definition of flags_ bits + uint8_t type_; // type of file see above for values + uint32_t curCluster_; // cluster for current file position + uint32_t curPosition_; // current file position in bytes from beginning + uint32_t dirBlock_; // SD block that contains directory entry for file + uint8_t dirIndex_; // index of entry in dirBlock 0 <= dirIndex_ <= 0XF + uint32_t fileSize_; // file size in bytes + uint32_t firstCluster_; // first cluster of file + SdVolume* vol_; // volume where file is located + + // private functions + uint8_t addCluster(void); + uint8_t addDirCluster(void); + dir_t* cacheDirEntry(uint8_t action); + static void (*dateTime_)(uint16_t* date, uint16_t* time); + static uint8_t make83Name(const char* str, uint8_t* name); + uint8_t openCachedEntry(uint8_t cacheIndex, uint8_t oflags); + dir_t* readDirCache(void); +}; +//============================================================================== +// SdVolume class +/** + * \brief Cache for an SD data block + */ +union cache_t { + /** Used to access cached file data blocks. */ + uint8_t data[512]; + /** Used to access cached FAT16 entries. */ + uint16_t fat16[256]; + /** Used to access cached FAT32 entries. */ + uint32_t fat32[128]; + /** Used to access cached directory entries. */ + dir_t dir[16]; + /** Used to access a cached MasterBoot Record. */ + mbr_t mbr; + /** Used to access to a cached FAT boot sector. */ + fbs_t fbs; +}; +//------------------------------------------------------------------------------ +/** + * \class SdVolume + * \brief Access FAT16 and FAT32 volumes on SD and SDHC cards. + */ +class SdVolume { + public: + /** Create an instance of SdVolume */ + SdVolume(void) :allocSearchStart_(2), fatType_(0) {} + /** Clear the cache and returns a pointer to the cache. Used by the WaveRP + * recorder to do raw write to the SD card. Not for normal apps. + */ + static uint8_t* cacheClear(void) { + cacheFlush(); + cacheBlockNumber_ = 0XFFFFFFFF; + return cacheBuffer_.data; + } + /** + * Initialize a FAT volume. Try partition one first then try super + * floppy format. + * + * \param[in] dev The Sd2Card where the volume is located. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system or an I/O error. + */ + uint8_t init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0);} + uint8_t init(Sd2Card* dev, uint8_t part); + + // inline functions that return volume info + /** \return The volume's cluster size in blocks. */ + uint8_t blocksPerCluster(void) const {return blocksPerCluster_;} + /** \return The number of blocks in one FAT. */ + uint32_t blocksPerFat(void) const {return blocksPerFat_;} + /** \return The total number of clusters in the volume. */ + uint32_t clusterCount(void) const {return clusterCount_;} + /** \return The shift count required to multiply by blocksPerCluster. */ + uint8_t clusterSizeShift(void) const {return clusterSizeShift_;} + /** \return The logical block number for the start of file data. */ + uint32_t dataStartBlock(void) const {return dataStartBlock_;} + /** \return The number of FAT structures on the volume. */ + uint8_t fatCount(void) const {return fatCount_;} + /** \return The logical block number for the start of the first FAT. */ + uint32_t fatStartBlock(void) const {return fatStartBlock_;} + /** \return The FAT type of the volume. Values are 12, 16 or 32. */ + uint8_t fatType(void) const {return fatType_;} + /** \return The number of entries in the root directory for FAT16 volumes. */ + uint32_t rootDirEntryCount(void) const {return rootDirEntryCount_;} + /** \return The logical block number for the start of the root directory + on FAT16 volumes or the first cluster number on FAT32 volumes. */ + uint32_t rootDirStart(void) const {return rootDirStart_;} + /** return a pointer to the Sd2Card object for this volume */ + static Sd2Card* sdCard(void) {return sdCard_;} +//------------------------------------------------------------------------------ +#if ALLOW_DEPRECATED_FUNCTIONS + // Deprecated functions - suppress cpplint warnings with NOLINT comment + /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev); */ + uint8_t init(Sd2Card& dev) {return init(&dev);} // NOLINT + + /** \deprecated Use: uint8_t SdVolume::init(Sd2Card* dev, uint8_t vol); */ + uint8_t init(Sd2Card& dev, uint8_t part) { // NOLINT + return init(&dev, part); + } +#endif // ALLOW_DEPRECATED_FUNCTIONS +//------------------------------------------------------------------------------ + private: + // Allow SdFile access to SdVolume private data. + friend class SdFile; + + // value for action argument in cacheRawBlock to indicate read from cache + static uint8_t const CACHE_FOR_READ = 0; + // value for action argument in cacheRawBlock to indicate cache dirty + static uint8_t const CACHE_FOR_WRITE = 1; + + static cache_t cacheBuffer_; // 512 byte cache for device blocks + static uint32_t cacheBlockNumber_; // Logical number of block in the cache + static Sd2Card* sdCard_; // Sd2Card object for cache + static uint8_t cacheDirty_; // cacheFlush() will write block if true + static uint32_t cacheMirrorBlock_; // block number for mirror FAT +// + uint32_t allocSearchStart_; // start cluster for alloc search + uint8_t blocksPerCluster_; // cluster size in blocks + uint32_t blocksPerFat_; // FAT size in blocks + uint32_t clusterCount_; // clusters in one FAT + uint8_t clusterSizeShift_; // shift to convert cluster count to block count + uint32_t dataStartBlock_; // first data block number + uint8_t fatCount_; // number of FATs on volume + uint32_t fatStartBlock_; // start block for first FAT + uint8_t fatType_; // volume type (12, 16, OR 32) + uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir + uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 + //---------------------------------------------------------------------------- + uint8_t allocContiguous(uint32_t count, uint32_t* curCluster); + uint8_t blockOfCluster(uint32_t position) const { + return (position >> 9) & (blocksPerCluster_ - 1);} + uint32_t clusterStartBlock(uint32_t cluster) const { + return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} + uint32_t blockNumber(uint32_t cluster, uint32_t position) const { + return clusterStartBlock(cluster) + blockOfCluster(position);} + static uint8_t cacheFlush(void); + static uint8_t cacheRawBlock(uint32_t blockNumber, uint8_t action); + static void cacheSetDirty(void) {cacheDirty_ |= CACHE_FOR_WRITE;} + static uint8_t cacheZeroBlock(uint32_t blockNumber); + uint8_t chainSize(uint32_t beginCluster, uint32_t* size) const; + uint8_t fatGet(uint32_t cluster, uint32_t* value) const; + uint8_t fatPut(uint32_t cluster, uint32_t value); + uint8_t fatPutEOC(uint32_t cluster) { + return fatPut(cluster, 0x0FFFFFFF); + } + uint8_t freeChain(uint32_t cluster); + uint8_t isEOC(uint32_t cluster) const { + return cluster >= (fatType_ == 16 ? FAT16EOC_MIN : FAT32EOC_MIN); + } + uint8_t readBlock(uint32_t block, uint8_t* dst) { + return sdCard_->readBlock(block, dst);} + uint8_t readData(uint32_t block, uint16_t offset, + uint16_t count, uint8_t* dst) { + return sdCard_->readData(block, offset, count, dst); + } + uint8_t writeBlock(uint32_t block, const uint8_t* dst) { + return sdCard_->writeBlock(block, dst); + } +}; +#endif // SdFat_h diff --git a/arduino-0022-linux-x64/libraries/SD/utility/SdFatUtil.h b/arduino-0022-linux-x64/libraries/SD/utility/SdFatUtil.h new file mode 100644 index 0000000..8bf9048 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/SdFatUtil.h @@ -0,0 +1,70 @@ +/* Arduino SdFat Library + * Copyright (C) 2008 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#ifndef SdFatUtil_h +#define SdFatUtil_h +/** + * \file + * Useful utility functions. + */ +#include +#include +/** Store and print a string in flash memory.*/ +#define PgmPrint(x) SerialPrint_P(PSTR(x)) +/** Store and print a string in flash memory followed by a CR/LF.*/ +#define PgmPrintln(x) SerialPrintln_P(PSTR(x)) +/** Defined so doxygen works for function definitions. */ +#define NOINLINE __attribute__((noinline)) +//------------------------------------------------------------------------------ +/** Return the number of bytes currently free in RAM. */ +static int FreeRam(void) { + extern int __bss_end; + extern int* __brkval; + int free_memory; + if (reinterpret_cast(__brkval) == 0) { + // if no heap use from end of bss section + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(&__bss_end); + } else { + // use from top of stack to heap + free_memory = reinterpret_cast(&free_memory) + - reinterpret_cast(__brkval); + } + return free_memory; +} +//------------------------------------------------------------------------------ +/** + * %Print a string in flash memory to the serial port. + * + * \param[in] str Pointer to string stored in flash memory. + */ +static NOINLINE void SerialPrint_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) Serial.print(c); +} +//------------------------------------------------------------------------------ +/** + * %Print a string in flash memory followed by a CR/LF. + * + * \param[in] str Pointer to string stored in flash memory. + */ +static NOINLINE void SerialPrintln_P(PGM_P str) { + SerialPrint_P(str); + Serial.println(); +} +#endif // #define SdFatUtil_h diff --git a/arduino-0022-linux-x64/libraries/SD/utility/SdFatmainpage.h b/arduino-0022-linux-x64/libraries/SD/utility/SdFatmainpage.h new file mode 100644 index 0000000..73b3b63 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/SdFatmainpage.h @@ -0,0 +1,202 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ + +/** +\mainpage Arduino SdFat Library +
    Copyright © 2009 by William Greiman +
    + +\section Intro Introduction +The Arduino SdFat Library is a minimal implementation of FAT16 and FAT32 +file systems on SD flash memory cards. Standard SD and high capacity +SDHC cards are supported. + +The SdFat only supports short 8.3 names. + +The main classes in SdFat are Sd2Card, SdVolume, and SdFile. + +The Sd2Card class supports access to standard SD cards and SDHC cards. Most +applications will only need to call the Sd2Card::init() member function. + +The SdVolume class supports FAT16 and FAT32 partitions. Most applications +will only need to call the SdVolume::init() member function. + +The SdFile class provides file access functions such as open(), read(), +remove(), write(), close() and sync(). This class supports access to the root +directory and subdirectories. + +A number of example are provided in the SdFat/examples folder. These were +developed to test SdFat and illustrate its use. + +SdFat was developed for high speed data recording. SdFat was used to implement +an audio record/play class, WaveRP, for the Adafruit Wave Shield. This +application uses special Sd2Card calls to write to contiguous files in raw mode. +These functions reduce write latency so that audio can be recorded with the +small amount of RAM in the Arduino. + +\section SDcard SD\SDHC Cards + +Arduinos access SD cards using the cards SPI protocol. PCs, Macs, and +most consumer devices use the 4-bit parallel SD protocol. A card that +functions well on A PC or Mac may not work well on the Arduino. + +Most cards have good SPI read performance but cards vary widely in SPI +write performance. Write performance is limited by how efficiently the +card manages internal erase/remapping operations. The Arduino cannot +optimize writes to reduce erase operations because of its limit RAM. + +SanDisk cards generally have good write performance. They seem to have +more internal RAM buffering than other cards and therefore can limit +the number of flash erase operations that the Arduino forces due to its +limited RAM. + +\section Hardware Hardware Configuration + +SdFat was developed using an +
    Adafruit Industries + Wave Shield. + +The hardware interface to the SD card should not use a resistor based level +shifter. SdFat sets the SPI bus frequency to 8 MHz which results in signal +rise times that are too slow for the edge detectors in many newer SD card +controllers when resistor voltage dividers are used. + +The 5 to 3.3 V level shifter for 5 V Arduinos should be IC based like the +74HC4050N based circuit shown in the file SdLevel.png. The Adafruit Wave Shield +uses a 74AHC125N. Gravitech sells SD and MicroSD Card Adapters based on the +74LCX245. + +If you are using a resistor based level shifter and are having problems try +setting the SPI bus frequency to 4 MHz. This can be done by using +card.init(SPI_HALF_SPEED) to initialize the SD card. + +\section comment Bugs and Comments + +If you wish to report bugs or have comments, send email to fat16lib@sbcglobal.net. + +\section SdFatClass SdFat Usage + +SdFat uses a slightly restricted form of short names. +Only printable ASCII characters are supported. No characters with code point +values greater than 127 are allowed. Space is not allowed even though space +was allowed in the API of early versions of DOS. + +Short names are limited to 8 characters followed by an optional period (.) +and extension of up to 3 characters. The characters may be any combination +of letters and digits. The following special characters are also allowed: + +$ % ' - _ @ ~ ` ! ( ) { } ^ # & + +Short names are always converted to upper case and their original case +value is lost. + +\note + The Arduino Print class uses character +at a time writes so it was necessary to use a \link SdFile::sync() sync() \endlink +function to control when data is written to the SD card. + +\par +An application which writes to a file using \link Print::print() print()\endlink, +\link Print::println() println() \endlink +or \link SdFile::write write() \endlink must call \link SdFile::sync() sync() \endlink +at the appropriate time to force data and directory information to be written +to the SD Card. Data and directory information are also written to the SD card +when \link SdFile::close() close() \endlink is called. + +\par +Applications must use care calling \link SdFile::sync() sync() \endlink +since 2048 bytes of I/O is required to update file and +directory information. This includes writing the current data block, reading +the block that contains the directory entry for update, writing the directory +block back and reading back the current data block. + +It is possible to open a file with two or more instances of SdFile. A file may +be corrupted if data is written to the file by more than one instance of SdFile. + +\section HowTo How to format SD Cards as FAT Volumes + +You should use a freshly formatted SD card for best performance. FAT +file systems become slower if many files have been created and deleted. +This is because the directory entry for a deleted file is marked as deleted, +but is not deleted. When a new file is created, these entries must be scanned +before creating the file, a flaw in the FAT design. Also files can become +fragmented which causes reads and writes to be slower. + +Microsoft operating systems support removable media formatted with a +Master Boot Record, MBR, or formatted as a super floppy with a FAT Boot Sector +in block zero. + +Microsoft operating systems expect MBR formatted removable media +to have only one partition. The first partition should be used. + +Microsoft operating systems do not support partitioning SD flash cards. +If you erase an SD card with a program like KillDisk, Most versions of +Windows will format the card as a super floppy. + +The best way to restore an SD card's format is to use SDFormatter +which can be downloaded from: + +http://www.sdcard.org/consumers/formatter/ + +SDFormatter aligns flash erase boundaries with file +system structures which reduces write latency and file system overhead. + +SDFormatter does not have an option for FAT type so it may format +small cards as FAT12. + +After the MBR is restored by SDFormatter you may need to reformat small +cards that have been formatted FAT12 to force the volume type to be FAT16. + +If you reformat the SD card with an OS utility, choose a cluster size that +will result in: + +4084 < CountOfClusters && CountOfClusters < 65525 + +The volume will then be FAT16. + +If you are formatting an SD card on OS X or Linux, be sure to use the first +partition. Format this partition with a cluster count in above range. + +\section References References + +Adafruit Industries: + +http://www.adafruit.com/ + +http://www.ladyada.net/make/waveshield/ + +The Arduino site: + +http://www.arduino.cc/ + +For more information about FAT file systems see: + +http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + +For information about using SD cards as SPI devices see: + +http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf + +The ATmega328 datasheet: + +http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf + + + */ diff --git a/arduino-0022-linux-x64/libraries/SD/utility/SdFile.cpp b/arduino-0022-linux-x64/libraries/SD/utility/SdFile.cpp new file mode 100644 index 0000000..3eb58f4 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/SdFile.cpp @@ -0,0 +1,1252 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +#include +#include +//------------------------------------------------------------------------------ +// callback function for date/time +void (*SdFile::dateTime_)(uint16_t* date, uint16_t* time) = NULL; + +#if ALLOW_DEPRECATED_FUNCTIONS +// suppress cpplint warnings with NOLINT comment +void (*SdFile::oldDateTime_)(uint16_t& date, uint16_t& time) = NULL; // NOLINT +#endif // ALLOW_DEPRECATED_FUNCTIONS +//------------------------------------------------------------------------------ +// add a cluster to a file +uint8_t SdFile::addCluster() { + if (!vol_->allocContiguous(1, &curCluster_)) return false; + + // if first cluster of file link to directory entry + if (firstCluster_ == 0) { + firstCluster_ = curCluster_; + flags_ |= F_FILE_DIR_DIRTY; + } + return true; +} +//------------------------------------------------------------------------------ +// Add a cluster to a directory file and zero the cluster. +// return with first block of cluster in the cache +uint8_t SdFile::addDirCluster(void) { + if (!addCluster()) return false; + + // zero data in cluster insure first cluster is in cache + uint32_t block = vol_->clusterStartBlock(curCluster_); + for (uint8_t i = vol_->blocksPerCluster_; i != 0; i--) { + if (!SdVolume::cacheZeroBlock(block + i - 1)) return false; + } + // Increase directory file size by cluster size + fileSize_ += 512UL << vol_->clusterSizeShift_; + return true; +} +//------------------------------------------------------------------------------ +// cache a file's directory entry +// return pointer to cached entry or null for failure +dir_t* SdFile::cacheDirEntry(uint8_t action) { + if (!SdVolume::cacheRawBlock(dirBlock_, action)) return NULL; + return SdVolume::cacheBuffer_.dir + dirIndex_; +} +//------------------------------------------------------------------------------ +/** + * Close a file and force cached data and directory information + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include no file is open or an I/O error. + */ +uint8_t SdFile::close(void) { + if (!sync())return false; + type_ = FAT_FILE_TYPE_CLOSED; + return true; +} +//------------------------------------------------------------------------------ +/** + * Check for contiguous file and return its raw block range. + * + * \param[out] bgnBlock the first block address for the file. + * \param[out] endBlock the last block address for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is not contiguous, file has zero length + * or an I/O error occurred. + */ +uint8_t SdFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { + // error if no blocks + if (firstCluster_ == 0) return false; + + for (uint32_t c = firstCluster_; ; c++) { + uint32_t next; + if (!vol_->fatGet(c, &next)) return false; + + // check for contiguous + if (next != (c + 1)) { + // error if not end of chain + if (!vol_->isEOC(next)) return false; + *bgnBlock = vol_->clusterStartBlock(firstCluster_); + *endBlock = vol_->clusterStartBlock(c) + + vol_->blocksPerCluster_ - 1; + return true; + } + } +} +//------------------------------------------------------------------------------ +/** + * Create and open a new contiguous file of a specified size. + * + * \note This function only supports short DOS 8.3 names. + * See open() for more information. + * + * \param[in] dirFile The directory where the file will be created. + * \param[in] fileName A valid DOS 8.3 file name. + * \param[in] size The desired file size. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include \a fileName contains + * an invalid DOS 8.3 file name, the FAT volume has not been initialized, + * a file is already open, the file already exists, the root + * directory is full or an I/O error. + * + */ +uint8_t SdFile::createContiguous(SdFile* dirFile, + const char* fileName, uint32_t size) { + // don't allow zero length file + if (size == 0) return false; + if (!open(dirFile, fileName, O_CREAT | O_EXCL | O_RDWR)) return false; + + // calculate number of clusters needed + uint32_t count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; + + // allocate clusters + if (!vol_->allocContiguous(count, &firstCluster_)) { + remove(); + return false; + } + fileSize_ = size; + + // insure sync() will update dir entry + flags_ |= F_FILE_DIR_DIRTY; + return sync(); +} +//------------------------------------------------------------------------------ +/** + * Return a files directory entry + * + * \param[out] dir Location for return of the files directory entry. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::dirEntry(dir_t* dir) { + // make sure fields on SD are correct + if (!sync()) return false; + + // read entry + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) return false; + + // copy to caller's struct + memcpy(dir, p, sizeof(dir_t)); + return true; +} +//------------------------------------------------------------------------------ +/** + * Format the name field of \a dir into the 13 byte array + * \a name in standard 8.3 short name format. + * + * \param[in] dir The directory structure containing the name. + * \param[out] name A 13 byte char array for the formatted name. + */ +void SdFile::dirName(const dir_t& dir, char* name) { + uint8_t j = 0; + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) name[j++] = '.'; + name[j++] = dir.name[i]; + } + name[j] = 0; +} +//------------------------------------------------------------------------------ +/** List directory contents to Serial. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + * + * \param[in] indent Amount of space before file name. Used for recursive + * list to indicate subdirectory level. + */ +void SdFile::ls(uint8_t flags, uint8_t indent) { + dir_t* p; + + rewind(); + while ((p = readDirCache())) { + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip deleted entry and entries for . and .. + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // only list subdirectories and files + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + // print any indent spaces + for (int8_t i = 0; i < indent; i++) Serial.print(' '); + + // print file name with possible blank fill + printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0); + + // print modify date/time if requested + if (flags & LS_DATE) { + printFatDate(p->lastWriteDate); + Serial.print(' '); + printFatTime(p->lastWriteTime); + } + // print size if requested + if (!DIR_IS_SUBDIR(p) && (flags & LS_SIZE)) { + Serial.print(' '); + Serial.print(p->fileSize); + } + Serial.println(); + + // list subdirectory content if requested + if ((flags & LS_R) && DIR_IS_SUBDIR(p)) { + uint16_t index = curPosition()/32 - 1; + SdFile s; + if (s.open(this, index, O_READ)) s.ls(flags, indent + 2); + seekSet(32 * (index + 1)); + } + } +} +//------------------------------------------------------------------------------ +// format directory name field from a 8.3 name string +uint8_t SdFile::make83Name(const char* str, uint8_t* name) { + uint8_t c; + uint8_t n = 7; // max index for part before dot + uint8_t i = 0; + // blank fill name and extension + while (i < 11) name[i++] = ' '; + i = 0; + while ((c = *str++) != '\0') { + if (c == '.') { + if (n == 10) return false; // only one dot allowed + n = 10; // max index for full 8.3 name + i = 8; // place for extension + } else { + // illegal FAT characters + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + uint8_t b; + while ((b = pgm_read_byte(p++))) if (b == c) return false; + // check size and only allow ASCII printable characters + if (i > n || c < 0X21 || c > 0X7E)return false; + // only upper case allowed in 8.3 names - convert lower to upper + name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a'); + } + } + // must have a file name, extension is optional + return name[0] != ' '; +} +//------------------------------------------------------------------------------ +/** Make a new directory. + * + * \param[in] dir An open SdFat instance for the directory that will containing + * the new directory. + * + * \param[in] dirName A valid 8.3 DOS name for the new directory. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this SdFile is already open, \a dir is not a + * directory, \a dirName is invalid or already exists in \a dir. + */ +uint8_t SdFile::makeDir(SdFile* dir, const char* dirName) { + dir_t d; + + // create a normal file + if (!open(dir, dirName, O_CREAT | O_EXCL | O_RDWR)) return false; + + // convert SdFile to directory + flags_ = O_READ; + type_ = FAT_FILE_TYPE_SUBDIR; + + // allocate and zero first cluster + if (!addDirCluster())return false; + + // force entry to SD + if (!sync()) return false; + + // cache entry - should already be in cache due to sync() call + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + + // change directory entry attribute + p->attributes = DIR_ATT_DIRECTORY; + + // make entry for '.' + memcpy(&d, p, sizeof(d)); + for (uint8_t i = 1; i < 11; i++) d.name[i] = ' '; + d.name[0] = '.'; + + // cache block for '.' and '..' + uint32_t block = vol_->clusterStartBlock(firstCluster_); + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) return false; + + // copy '.' to block + memcpy(&SdVolume::cacheBuffer_.dir[0], &d, sizeof(d)); + + // make entry for '..' + d.name[1] = '.'; + if (dir->isRoot()) { + d.firstClusterLow = 0; + d.firstClusterHigh = 0; + } else { + d.firstClusterLow = dir->firstCluster_ & 0XFFFF; + d.firstClusterHigh = dir->firstCluster_ >> 16; + } + // copy '..' to block + memcpy(&SdVolume::cacheBuffer_.dir[1], &d, sizeof(d)); + + // set position after '..' + curPosition_ = 2 * sizeof(d); + + // write first block + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Open a file or directory by name. + * + * \param[in] dirFile An open SdFat instance for the directory containing the + * file to be opened. + * + * \param[in] fileName A valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * O_READ - Open for reading. + * + * O_RDONLY - Same as O_READ. + * + * O_WRITE - Open for writing. + * + * O_WRONLY - Same as O_WRITE. + * + * O_RDWR - Open for reading and writing. + * + * O_APPEND - If set, the file offset shall be set to the end of the + * file prior to each write. + * + * O_CREAT - If the file exists, this flag has no effect except as noted + * under O_EXCL below. Otherwise, the file shall be created + * + * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. + * + * O_SYNC - Call sync() after each write. This flag should not be used with + * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. + * These functions do character at a time writes so sync() will be called + * after each byte. + * + * O_TRUNC - If the file exists and is a regular file, and the file is + * successfully opened and is not read only, its length shall be truncated to 0. + * + * \note Directory files must be opened read only. Write and truncation is + * not allowed for directory files. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include this SdFile is already open, \a difFile is not + * a directory, \a fileName is invalid, the file does not exist + * or can't be opened in the access mode specified by oflag. + */ +uint8_t SdFile::open(SdFile* dirFile, const char* fileName, uint8_t oflag) { + uint8_t dname[11]; + dir_t* p; + + // error if already open + if (isOpen())return false; + + if (!make83Name(fileName, dname)) return false; + vol_ = dirFile->vol_; + dirFile->rewind(); + + // bool for empty entry found + uint8_t emptyFound = false; + + // search for file + while (dirFile->curPosition_ < dirFile->fileSize_) { + uint8_t index = 0XF & (dirFile->curPosition_ >> 5); + p = dirFile->readDirCache(); + if (p == NULL) return false; + + if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { + // remember first empty slot + if (!emptyFound) { + emptyFound = true; + dirIndex_ = index; + dirBlock_ = SdVolume::cacheBlockNumber_; + } + // done if no entries follow + if (p->name[0] == DIR_NAME_FREE) break; + } else if (!memcmp(dname, p->name, 11)) { + // don't open existing file if O_CREAT and O_EXCL + if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; + + // open found file + return openCachedEntry(0XF & index, oflag); + } + } + // only create file if O_CREAT and O_WRITE + if ((oflag & (O_CREAT | O_WRITE)) != (O_CREAT | O_WRITE)) return false; + + // cache found slot or add cluster if end of file + if (emptyFound) { + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + } else { + if (dirFile->type_ == FAT_FILE_TYPE_ROOT16) return false; + + // add and zero cluster for dirFile - first cluster is in cache for write + if (!dirFile->addDirCluster()) return false; + + // use first entry in cluster + dirIndex_ = 0; + p = SdVolume::cacheBuffer_.dir; + } + // initialize as empty file + memset(p, 0, sizeof(dir_t)); + memcpy(p->name, dname, 11); + + // set timestamps + if (dateTime_) { + // call user function + dateTime_(&p->creationDate, &p->creationTime); + } else { + // use default date/time + p->creationDate = FAT_DEFAULT_DATE; + p->creationTime = FAT_DEFAULT_TIME; + } + p->lastAccessDate = p->creationDate; + p->lastWriteDate = p->creationDate; + p->lastWriteTime = p->creationTime; + + // force write of entry to SD + if (!SdVolume::cacheFlush()) return false; + + // open entry in cache + return openCachedEntry(dirIndex_, oflag); +} +//------------------------------------------------------------------------------ +/** + * Open a file by index. + * + * \param[in] dirFile An open SdFat instance for the directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. + * + * See open() by fileName for definition of flags and return values. + * + */ +uint8_t SdFile::open(SdFile* dirFile, uint16_t index, uint8_t oflag) { + // error if already open + if (isOpen())return false; + + // don't open existing file if O_CREAT and O_EXCL - user call error + if ((oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) return false; + + vol_ = dirFile->vol_; + + // seek to location of entry + if (!dirFile->seekSet(32 * index)) return false; + + // read entry into cache + dir_t* p = dirFile->readDirCache(); + if (p == NULL) return false; + + // error if empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_FREE || + p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + return false; + } + // open cached entry + return openCachedEntry(index & 0XF, oflag); +} +//------------------------------------------------------------------------------ +// open a cached directory entry. Assumes vol_ is initializes +uint8_t SdFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { + // location of entry in cache + dir_t* p = SdVolume::cacheBuffer_.dir + dirIndex; + + // write or truncate is an error for a directory or read-only file + if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { + if (oflag & (O_WRITE | O_TRUNC)) return false; + } + // remember location of directory entry on SD + dirIndex_ = dirIndex; + dirBlock_ = SdVolume::cacheBlockNumber_; + + // copy first cluster number for directory fields + firstCluster_ = (uint32_t)p->firstClusterHigh << 16; + firstCluster_ |= p->firstClusterLow; + + // make sure it is a normal file or subdirectory + if (DIR_IS_FILE(p)) { + fileSize_ = p->fileSize; + type_ = FAT_FILE_TYPE_NORMAL; + } else if (DIR_IS_SUBDIR(p)) { + if (!vol_->chainSize(firstCluster_, &fileSize_)) return false; + type_ = FAT_FILE_TYPE_SUBDIR; + } else { + return false; + } + // save open flags for read/write + flags_ = oflag & (O_ACCMODE | O_SYNC | O_APPEND); + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + + // truncate file to zero length if requested + if (oflag & O_TRUNC) return truncate(0); + return true; +} +//------------------------------------------------------------------------------ +/** + * Open a volume's root directory. + * + * \param[in] vol The FAT volume containing the root directory to be opened. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the FAT volume has not been initialized + * or it a FAT12 volume. + */ +uint8_t SdFile::openRoot(SdVolume* vol) { + // error if file is already open + if (isOpen()) return false; + + if (vol->fatType() == 16) { + type_ = FAT_FILE_TYPE_ROOT16; + firstCluster_ = 0; + fileSize_ = 32 * vol->rootDirEntryCount(); + } else if (vol->fatType() == 32) { + type_ = FAT_FILE_TYPE_ROOT32; + firstCluster_ = vol->rootDirStart(); + if (!vol->chainSize(firstCluster_, &fileSize_)) return false; + } else { + // volume is not initialized or FAT12 + return false; + } + vol_ = vol; + // read only + flags_ = O_READ; + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + + // root has no directory entry + dirBlock_ = 0; + dirIndex_ = 0; + return true; +} +//------------------------------------------------------------------------------ +/** %Print the name field of a directory entry in 8.3 format to Serial. + * + * \param[in] dir The directory structure containing the name. + * \param[in] width Blank fill name if length is less than \a width. + */ +void SdFile::printDirName(const dir_t& dir, uint8_t width) { + uint8_t w = 0; + for (uint8_t i = 0; i < 11; i++) { + if (dir.name[i] == ' ')continue; + if (i == 8) { + Serial.print('.'); + w++; + } + Serial.print(dir.name[i]); + w++; + } + if (DIR_IS_SUBDIR(&dir)) { + Serial.print('/'); + w++; + } + while (w < width) { + Serial.print(' '); + w++; + } +} +//------------------------------------------------------------------------------ +/** %Print a directory date field to Serial. + * + * Format is yyyy-mm-dd. + * + * \param[in] fatDate The date field from a directory entry. + */ +void SdFile::printFatDate(uint16_t fatDate) { + Serial.print(FAT_YEAR(fatDate)); + Serial.print('-'); + printTwoDigits(FAT_MONTH(fatDate)); + Serial.print('-'); + printTwoDigits(FAT_DAY(fatDate)); +} +//------------------------------------------------------------------------------ +/** %Print a directory time field to Serial. + * + * Format is hh:mm:ss. + * + * \param[in] fatTime The time field from a directory entry. + */ +void SdFile::printFatTime(uint16_t fatTime) { + printTwoDigits(FAT_HOUR(fatTime)); + Serial.print(':'); + printTwoDigits(FAT_MINUTE(fatTime)); + Serial.print(':'); + printTwoDigits(FAT_SECOND(fatTime)); +} +//------------------------------------------------------------------------------ +/** %Print a value as two digits to Serial. + * + * \param[in] v Value to be printed, 0 <= \a v <= 99 + */ +void SdFile::printTwoDigits(uint8_t v) { + char str[3]; + str[0] = '0' + v/10; + str[1] = '0' + v % 10; + str[2] = 0; + Serial.print(str); +} +//------------------------------------------------------------------------------ +/** + * Read data from a file starting at the current position. + * + * \param[out] buf Pointer to the location that will receive the data. + * + * \param[in] nbyte Maximum number of bytes to read. + * + * \return For success read() returns the number of bytes read. + * A value less than \a nbyte, including zero, will be returned + * if end of file is reached. + * If an error occurs, read() returns -1. Possible errors include + * read() called before a file has been opened, corrupt file system + * or an I/O error occurred. + */ +int16_t SdFile::read(void* buf, uint16_t nbyte) { + uint8_t* dst = reinterpret_cast(buf); + + // error if not open or write only + if (!isOpen() || !(flags_ & O_READ)) return -1; + + // max bytes left in file + if (nbyte > (fileSize_ - curPosition_)) nbyte = fileSize_ - curPosition_; + + // amount left to read + uint16_t toRead = nbyte; + while (toRead > 0) { + uint32_t block; // raw device block number + uint16_t offset = curPosition_ & 0X1FF; // offset in block + if (type_ == FAT_FILE_TYPE_ROOT16) { + block = vol_->rootDirStart() + (curPosition_ >> 9); + } else { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + if (offset == 0 && blockOfCluster == 0) { + // start of new cluster + if (curPosition_ == 0) { + // use first cluster in file + curCluster_ = firstCluster_; + } else { + // get next cluster from FAT + if (!vol_->fatGet(curCluster_, &curCluster_)) return -1; + } + } + block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + } + uint16_t n = toRead; + + // amount to be read from current block + if (n > (512 - offset)) n = 512 - offset; + + // no buffering needed if n == 512 or user requests no buffering + if ((unbufferedRead() || n == 512) && + block != SdVolume::cacheBlockNumber_) { + if (!vol_->readData(block, offset, n, dst)) return -1; + dst += n; + } else { + // read block to cache and copy data to caller + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return -1; + uint8_t* src = SdVolume::cacheBuffer_.data + offset; + uint8_t* end = src + n; + while (src != end) *dst++ = *src++; + } + curPosition_ += n; + toRead -= n; + } + return nbyte; +} +//------------------------------------------------------------------------------ +/** + * Read the next directory entry from a directory file. + * + * \param[out] dir The dir_t struct that will receive the data. + * + * \return For success readDir() returns the number of bytes read. + * A value of zero will be returned if end of file is reached. + * If an error occurs, readDir() returns -1. Possible errors include + * readDir() called before a directory has been opened, this is not + * a directory file or an I/O error occurred. + */ +int8_t SdFile::readDir(dir_t* dir) { + int8_t n; + // if not a directory file or miss-positioned return an error + if (!isDir() || (0X1F & curPosition_)) return -1; + + while ((n = read(dir, sizeof(dir_t))) == sizeof(dir_t)) { + // last entry if DIR_NAME_FREE + if (dir->name[0] == DIR_NAME_FREE) break; + // skip empty entries and entry for . and .. + if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; + // return if normal file or subdirectory + if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; + } + // error, end of file, or past last entry + return n < 0 ? -1 : 0; +} +//------------------------------------------------------------------------------ +// Read next directory entry into the cache +// Assumes file is correctly positioned +dir_t* SdFile::readDirCache(void) { + // error if not directory + if (!isDir()) return NULL; + + // index of entry in cache + uint8_t i = (curPosition_ >> 5) & 0XF; + + // use read to locate and cache block + if (read() < 0) return NULL; + + // advance to next entry + curPosition_ += 31; + + // return pointer to entry + return (SdVolume::cacheBuffer_.dir + i); +} +//------------------------------------------------------------------------------ +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file read-only, is a directory, + * or an I/O error occurred. + */ +uint8_t SdFile::remove(void) { + // free any clusters - will fail if read-only or directory + if (!truncate(0)) return false; + + // cache directory entry + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // set this SdFile closed + type_ = FAT_FILE_TYPE_CLOSED; + + // write entry to SD + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \param[in] dirFile The directory that contains the file. + * \param[in] fileName The name of the file to be removed. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is a directory, is read only, + * \a dirFile is not a directory, \a fileName is not found + * or an I/O error occurred. + */ +uint8_t SdFile::remove(SdFile* dirFile, const char* fileName) { + SdFile file; + if (!file.open(dirFile, fileName, O_WRITE)) return false; + return file.remove(); +} +//------------------------------------------------------------------------------ +/** Remove a directory file. + * + * The directory file will be removed only if it is empty and is not the + * root directory. rmDir() follows DOS and Windows and ignores the + * read-only attribute for the directory. + * + * \note This function should not be used to delete the 8.3 version of a + * directory that has a long name. For example if a directory has the + * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include the file is not a directory, is the root + * directory, is not empty, or an I/O error occurred. + */ +uint8_t SdFile::rmDir(void) { + // must be open subdirectory + if (!isSubDir()) return false; + + rewind(); + + // make sure directory is empty + while (curPosition_ < fileSize_) { + dir_t* p = readDirCache(); + if (p == NULL) return false; + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + // error not empty + if (DIR_IS_FILE_OR_SUBDIR(p)) return false; + } + // convert empty directory to normal file for remove + type_ = FAT_FILE_TYPE_NORMAL; + flags_ |= O_WRITE; + return remove(); +} +//------------------------------------------------------------------------------ +/** Recursively delete a directory and all contained files. + * + * This is like the Unix/Linux 'rm -rf *' if called with the root directory + * hence the name. + * + * Warning - This will remove all contents of the directory including + * subdirectories. The directory will then be removed if it is not root. + * The read-only attribute for files will be ignored. + * + * \note This function should not be used to delete the 8.3 version of + * a directory that has a long name. See remove() and rmDir(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::rmRfStar(void) { + rewind(); + while (curPosition_ < fileSize_) { + SdFile f; + + // remember position + uint16_t index = curPosition_/32; + + dir_t* p = readDirCache(); + if (!p) return false; + + // done if past last entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // skip if part of long file name or volume label in root + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + if (!f.open(this, index, O_READ)) return false; + if (f.isSubDir()) { + // recursively delete + if (!f.rmRfStar()) return false; + } else { + // ignore read-only + f.flags_ |= O_WRITE; + if (!f.remove()) return false; + } + // position to next entry if required + if (curPosition_ != (32*(index + 1))) { + if (!seekSet(32*(index + 1))) return false; + } + } + // don't try to delete root + if (isRoot()) return true; + return rmDir(); +} +//------------------------------------------------------------------------------ +/** + * Sets a file's position. + * + * \param[in] pos The new position in bytes from the beginning of the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::seekSet(uint32_t pos) { + // error if file not open or seek past end of file + if (!isOpen() || pos > fileSize_) return false; + + if (type_ == FAT_FILE_TYPE_ROOT16) { + curPosition_ = pos; + return true; + } + if (pos == 0) { + // set position to start of file + curCluster_ = 0; + curPosition_ = 0; + return true; + } + // calculate cluster index for cur and new position + uint32_t nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); + uint32_t nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); + + if (nNew < nCur || curPosition_ == 0) { + // must follow chain from first cluster + curCluster_ = firstCluster_; + } else { + // advance from curPosition + nNew -= nCur; + } + while (nNew--) { + if (!vol_->fatGet(curCluster_, &curCluster_)) return false; + } + curPosition_ = pos; + return true; +} +//------------------------------------------------------------------------------ +/** + * The sync() call causes all modified data and directory fields + * to be written to the storage device. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include a call to sync() before a file has been + * opened or an I/O error. + */ +uint8_t SdFile::sync(void) { + // only allow open files and directories + if (!isOpen()) return false; + + if (flags_ & F_FILE_DIR_DIRTY) { + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // do not set filesize for dir files + if (!isDir()) d->fileSize = fileSize_; + + // update first cluster fields + d->firstClusterLow = firstCluster_ & 0XFFFF; + d->firstClusterHigh = firstCluster_ >> 16; + + // set modify time if user supplied a callback date/time function + if (dateTime_) { + dateTime_(&d->lastWriteDate, &d->lastWriteTime); + d->lastAccessDate = d->lastWriteDate; + } + // clear directory dirty + flags_ &= ~F_FILE_DIR_DIRTY; + } + return SdVolume::cacheFlush(); +} +//------------------------------------------------------------------------------ +/** + * Set a file's timestamps in its directory entry. + * + * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * T_ACCESS - Set the file's last access date. + * + * T_CREATE - Set the file's creation date and time. + * + * T_WRITE - Set the file's last write/modification date and time. + * + * \param[in] year Valid range 1980 - 2107 inclusive. + * + * \param[in] month Valid range 1 - 12 inclusive. + * + * \param[in] day Valid range 1 - 31 inclusive. + * + * \param[in] hour Valid range 0 - 23 inclusive. + * + * \param[in] minute Valid range 0 - 59 inclusive. + * + * \param[in] second Valid range 0 - 59 inclusive + * + * \note It is possible to set an invalid date since there is no check for + * the number of days in a month. + * + * \note + * Modify and access timestamps may be overwritten if a date time callback + * function has been set by dateTimeCallback(). + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + */ +uint8_t SdFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, + uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + if (!isOpen() + || year < 1980 + || year > 2107 + || month < 1 + || month > 12 + || day < 1 + || day > 31 + || hour > 23 + || minute > 59 + || second > 59) { + return false; + } + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + uint16_t dirDate = FAT_DATE(year, month, day); + uint16_t dirTime = FAT_TIME(hour, minute, second); + if (flags & T_ACCESS) { + d->lastAccessDate = dirDate; + } + if (flags & T_CREATE) { + d->creationDate = dirDate; + d->creationTime = dirTime; + // seems to be units of 1/100 second not 1/10 as Microsoft states + d->creationTimeTenths = second & 1 ? 100 : 0; + } + if (flags & T_WRITE) { + d->lastWriteDate = dirDate; + d->lastWriteTime = dirTime; + } + SdVolume::cacheSetDirty(); + return sync(); +} +//------------------------------------------------------------------------------ +/** + * Truncate a file to a specified length. The current file position + * will be maintained if it is less than or equal to \a length otherwise + * it will be set to end of file. + * + * \param[in] length The desired length for the file. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. + * Reasons for failure include file is read only, file is a directory, + * \a length is greater than the current file size or an I/O error occurs. + */ +uint8_t SdFile::truncate(uint32_t length) { +// error if not a normal file or read-only + if (!isFile() || !(flags_ & O_WRITE)) return false; + + // error if length is greater than current size + if (length > fileSize_) return false; + + // fileSize and length are zero - nothing to do + if (fileSize_ == 0) return true; + + // remember position for seek after truncation + uint32_t newPos = curPosition_ > length ? length : curPosition_; + + // position to last cluster in truncated file + if (!seekSet(length)) return false; + + if (length == 0) { + // free all clusters + if (!vol_->freeChain(firstCluster_)) return false; + firstCluster_ = 0; + } else { + uint32_t toFree; + if (!vol_->fatGet(curCluster_, &toFree)) return false; + + if (!vol_->isEOC(toFree)) { + // free extra clusters + if (!vol_->freeChain(toFree)) return false; + + // current cluster is end of chain + if (!vol_->fatPutEOC(curCluster_)) return false; + } + } + fileSize_ = length; + + // need to update directory entry + flags_ |= F_FILE_DIR_DIRTY; + + if (!sync()) return false; + + // set file to correct position + return seekSet(newPos); +} +//------------------------------------------------------------------------------ +/** + * Write data to an open file. + * + * \note Data is moved to the cache but may not be written to the + * storage device until sync() is called. + * + * \param[in] buf Pointer to the location of the data to be written. + * + * \param[in] nbyte Number of bytes to write. + * + * \return For success write() returns the number of bytes written, always + * \a nbyte. If an error occurs, write() returns -1. Possible errors + * include write() is called before a file has been opened, write is called + * for a read-only file, device is full, a corrupt file system or an I/O error. + * + */ +int16_t SdFile::write(const void* buf, uint16_t nbyte) { + // convert void* to uint8_t* - must be before goto statements + const uint8_t* src = reinterpret_cast(buf); + + // number of bytes left to write - must be before goto statements + uint16_t nToWrite = nbyte; + + // error if not a normal file or is read-only + if (!isFile() || !(flags_ & O_WRITE)) goto writeErrorReturn; + + // seek to end of file if append flag + if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { + if (!seekEnd()) goto writeErrorReturn; + } + + while (nToWrite > 0) { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + uint16_t blockOffset = curPosition_ & 0X1FF; + if (blockOfCluster == 0 && blockOffset == 0) { + // start of new cluster + if (curCluster_ == 0) { + if (firstCluster_ == 0) { + // allocate first cluster of file + if (!addCluster()) goto writeErrorReturn; + } else { + curCluster_ = firstCluster_; + } + } else { + uint32_t next; + if (!vol_->fatGet(curCluster_, &next)) return false; + if (vol_->isEOC(next)) { + // add cluster if at end of chain + if (!addCluster()) goto writeErrorReturn; + } else { + curCluster_ = next; + } + } + } + // max space in block + uint16_t n = 512 - blockOffset; + + // lesser of space and amount to write + if (n > nToWrite) n = nToWrite; + + // block for data write + uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + if (n == 512) { + // full block - don't need to use cache + // invalidate cache if block is in cache + if (SdVolume::cacheBlockNumber_ == block) { + SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; + } + if (!vol_->writeBlock(block, src)) goto writeErrorReturn; + src += 512; + } else { + if (blockOffset == 0 && curPosition_ >= fileSize_) { + // start of new block don't need to read into cache + if (!SdVolume::cacheFlush()) goto writeErrorReturn; + SdVolume::cacheBlockNumber_ = block; + SdVolume::cacheSetDirty(); + } else { + // rewrite part of block + if (!SdVolume::cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) { + goto writeErrorReturn; + } + } + uint8_t* dst = SdVolume::cacheBuffer_.data + blockOffset; + uint8_t* end = dst + n; + while (dst != end) *dst++ = *src++; + } + nToWrite -= n; + curPosition_ += n; + } + if (curPosition_ > fileSize_) { + // update fileSize and insure sync will update dir entry + fileSize_ = curPosition_; + flags_ |= F_FILE_DIR_DIRTY; + } else if (dateTime_ && nbyte) { + // insure sync will update modified date and time + flags_ |= F_FILE_DIR_DIRTY; + } + + if (flags_ & O_SYNC) { + if (!sync()) goto writeErrorReturn; + } + return nbyte; + + writeErrorReturn: + // return for write error + writeError = true; + return -1; +} +//------------------------------------------------------------------------------ +/** + * Write a byte to a file. Required by the Arduino Print class. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::write(uint8_t b) { + write(&b, 1); +} +//------------------------------------------------------------------------------ +/** + * Write a string to a file. Used by the Arduino Print class. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::write(const char* str) { + write(str, strlen(str)); +} +//------------------------------------------------------------------------------ +/** + * Write a PROGMEM string to a file. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::write_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) write(c); +} +//------------------------------------------------------------------------------ +/** + * Write a PROGMEM string followed by CR/LF to a file. + * + * Use SdFile::writeError to check for errors. + */ +void SdFile::writeln_P(PGM_P str) { + write_P(str); + println(); +} diff --git a/arduino-0022-linux-x64/libraries/SD/utility/SdInfo.h b/arduino-0022-linux-x64/libraries/SD/utility/SdInfo.h new file mode 100644 index 0000000..acde74d --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/SdInfo.h @@ -0,0 +1,232 @@ +/* Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino Sd2Card Library. If not, see + * . + */ +#ifndef SdInfo_h +#define SdInfo_h +#include +// Based on the document: +// +// SD Specifications +// Part 1 +// Physical Layer +// Simplified Specification +// Version 2.00 +// September 25, 2006 +// +// www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf +//------------------------------------------------------------------------------ +// SD card commands +/** GO_IDLE_STATE - init card in spi mode if CS low */ +uint8_t const CMD0 = 0X00; +/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ +uint8_t const CMD8 = 0X08; +/** SEND_CSD - read the Card Specific Data (CSD register) */ +uint8_t const CMD9 = 0X09; +/** SEND_CID - read the card identification information (CID register) */ +uint8_t const CMD10 = 0X0A; +/** SEND_STATUS - read the card status register */ +uint8_t const CMD13 = 0X0D; +/** READ_BLOCK - read a single data block from the card */ +uint8_t const CMD17 = 0X11; +/** WRITE_BLOCK - write a single data block to the card */ +uint8_t const CMD24 = 0X18; +/** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */ +uint8_t const CMD25 = 0X19; +/** ERASE_WR_BLK_START - sets the address of the first block to be erased */ +uint8_t const CMD32 = 0X20; +/** ERASE_WR_BLK_END - sets the address of the last block of the continuous + range to be erased*/ +uint8_t const CMD33 = 0X21; +/** ERASE - erase all previously selected blocks */ +uint8_t const CMD38 = 0X26; +/** APP_CMD - escape for application specific command */ +uint8_t const CMD55 = 0X37; +/** READ_OCR - read the OCR register of a card */ +uint8_t const CMD58 = 0X3A; +/** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be + pre-erased before writing */ +uint8_t const ACMD23 = 0X17; +/** SD_SEND_OP_COMD - Sends host capacity support information and + activates the card's initialization process */ +uint8_t const ACMD41 = 0X29; +//------------------------------------------------------------------------------ +/** status for card in the ready state */ +uint8_t const R1_READY_STATE = 0X00; +/** status for card in the idle state */ +uint8_t const R1_IDLE_STATE = 0X01; +/** status bit for illegal command */ +uint8_t const R1_ILLEGAL_COMMAND = 0X04; +/** start data token for read or write single block*/ +uint8_t const DATA_START_BLOCK = 0XFE; +/** stop token for write multiple blocks*/ +uint8_t const STOP_TRAN_TOKEN = 0XFD; +/** start data token for write multiple blocks*/ +uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC; +/** mask for data response tokens after a write block operation */ +uint8_t const DATA_RES_MASK = 0X1F; +/** write data accepted token */ +uint8_t const DATA_RES_ACCEPTED = 0X05; +//------------------------------------------------------------------------------ +typedef struct CID { + // byte 0 + uint8_t mid; // Manufacturer ID + // byte 1-2 + char oid[2]; // OEM/Application ID + // byte 3-7 + char pnm[5]; // Product name + // byte 8 + unsigned prv_m : 4; // Product revision n.m + unsigned prv_n : 4; + // byte 9-12 + uint32_t psn; // Product serial number + // byte 13 + unsigned mdt_year_high : 4; // Manufacturing date + unsigned reserved : 4; + // byte 14 + unsigned mdt_month : 4; + unsigned mdt_year_low :4; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}cid_t; +//------------------------------------------------------------------------------ +// CSD for version 1.00 cards +typedef struct CSDV1 { + // byte 0 + unsigned reserved1 : 6; + unsigned csd_ver : 2; + // byte 1 + uint8_t taac; + // byte 2 + uint8_t nsac; + // byte 3 + uint8_t tran_speed; + // byte 4 + uint8_t ccc_high; + // byte 5 + unsigned read_bl_len : 4; + unsigned ccc_low : 4; + // byte 6 + unsigned c_size_high : 2; + unsigned reserved2 : 2; + unsigned dsr_imp : 1; + unsigned read_blk_misalign :1; + unsigned write_blk_misalign : 1; + unsigned read_bl_partial : 1; + // byte 7 + uint8_t c_size_mid; + // byte 8 + unsigned vdd_r_curr_max : 3; + unsigned vdd_r_curr_min : 3; + unsigned c_size_low :2; + // byte 9 + unsigned c_size_mult_high : 2; + unsigned vdd_w_cur_max : 3; + unsigned vdd_w_curr_min : 3; + // byte 10 + unsigned sector_size_high : 6; + unsigned erase_blk_en : 1; + unsigned c_size_mult_low : 1; + // byte 11 + unsigned wp_grp_size : 7; + unsigned sector_size_low : 1; + // byte 12 + unsigned write_bl_len_high : 2; + unsigned r2w_factor : 3; + unsigned reserved3 : 2; + unsigned wp_grp_enable : 1; + // byte 13 + unsigned reserved4 : 5; + unsigned write_partial : 1; + unsigned write_bl_len_low : 2; + // byte 14 + unsigned reserved5: 2; + unsigned file_format : 2; + unsigned tmp_write_protect : 1; + unsigned perm_write_protect : 1; + unsigned copy : 1; + unsigned file_format_grp : 1; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}csd1_t; +//------------------------------------------------------------------------------ +// CSD for version 2.00 cards +typedef struct CSDV2 { + // byte 0 + unsigned reserved1 : 6; + unsigned csd_ver : 2; + // byte 1 + uint8_t taac; + // byte 2 + uint8_t nsac; + // byte 3 + uint8_t tran_speed; + // byte 4 + uint8_t ccc_high; + // byte 5 + unsigned read_bl_len : 4; + unsigned ccc_low : 4; + // byte 6 + unsigned reserved2 : 4; + unsigned dsr_imp : 1; + unsigned read_blk_misalign :1; + unsigned write_blk_misalign : 1; + unsigned read_bl_partial : 1; + // byte 7 + unsigned reserved3 : 2; + unsigned c_size_high : 6; + // byte 8 + uint8_t c_size_mid; + // byte 9 + uint8_t c_size_low; + // byte 10 + unsigned sector_size_high : 6; + unsigned erase_blk_en : 1; + unsigned reserved4 : 1; + // byte 11 + unsigned wp_grp_size : 7; + unsigned sector_size_low : 1; + // byte 12 + unsigned write_bl_len_high : 2; + unsigned r2w_factor : 3; + unsigned reserved5 : 2; + unsigned wp_grp_enable : 1; + // byte 13 + unsigned reserved6 : 5; + unsigned write_partial : 1; + unsigned write_bl_len_low : 2; + // byte 14 + unsigned reserved7: 2; + unsigned file_format : 2; + unsigned tmp_write_protect : 1; + unsigned perm_write_protect : 1; + unsigned copy : 1; + unsigned file_format_grp : 1; + // byte 15 + unsigned always1 : 1; + unsigned crc : 7; +}csd2_t; +//------------------------------------------------------------------------------ +// union of old and new style CSD register +union csd_t { + csd1_t v1; + csd2_t v2; +}; +#endif // SdInfo_h diff --git a/arduino-0022-linux-x64/libraries/SD/utility/SdVolume.cpp b/arduino-0022-linux-x64/libraries/SD/utility/SdVolume.cpp new file mode 100644 index 0000000..ece4acb --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SD/utility/SdVolume.cpp @@ -0,0 +1,295 @@ +/* Arduino SdFat Library + * Copyright (C) 2009 by William Greiman + * + * This file is part of the Arduino SdFat Library + * + * This Library is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Arduino SdFat Library. If not, see + * . + */ +#include +//------------------------------------------------------------------------------ +// raw block cache +// init cacheBlockNumber_to invalid SD block number +uint32_t SdVolume::cacheBlockNumber_ = 0XFFFFFFFF; +cache_t SdVolume::cacheBuffer_; // 512 byte cache for Sd2Card +Sd2Card* SdVolume::sdCard_; // pointer to SD card object +uint8_t SdVolume::cacheDirty_ = 0; // cacheFlush() will write block if true +uint32_t SdVolume::cacheMirrorBlock_ = 0; // mirror block for second FAT +//------------------------------------------------------------------------------ +// find a contiguous group of clusters +uint8_t SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { + // start of group + uint32_t bgnCluster; + + // flag to save place to start next search + uint8_t setStart; + + // set search start cluster + if (*curCluster) { + // try to make file contiguous + bgnCluster = *curCluster + 1; + + // don't save new start location + setStart = false; + } else { + // start at likely place for free cluster + bgnCluster = allocSearchStart_; + + // save next search start if one cluster + setStart = 1 == count; + } + // end of group + uint32_t endCluster = bgnCluster; + + // last cluster of FAT + uint32_t fatEnd = clusterCount_ + 1; + + // search the FAT for free clusters + for (uint32_t n = 0;; n++, endCluster++) { + // can't find space checked all clusters + if (n >= clusterCount_) return false; + + // past end - start from beginning of FAT + if (endCluster > fatEnd) { + bgnCluster = endCluster = 2; + } + uint32_t f; + if (!fatGet(endCluster, &f)) return false; + + if (f != 0) { + // cluster in use try next cluster as bgnCluster + bgnCluster = endCluster + 1; + } else if ((endCluster - bgnCluster + 1) == count) { + // done - found space + break; + } + } + // mark end of chain + if (!fatPutEOC(endCluster)) return false; + + // link clusters + while (endCluster > bgnCluster) { + if (!fatPut(endCluster - 1, endCluster)) return false; + endCluster--; + } + if (*curCluster != 0) { + // connect chains + if (!fatPut(*curCluster, bgnCluster)) return false; + } + // return first cluster number to caller + *curCluster = bgnCluster; + + // remember possible next free cluster + if (setStart) allocSearchStart_ = bgnCluster + 1; + + return true; +} +//------------------------------------------------------------------------------ +uint8_t SdVolume::cacheFlush(void) { + if (cacheDirty_) { + if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { + return false; + } + // mirror FAT tables + if (cacheMirrorBlock_) { + if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) { + return false; + } + cacheMirrorBlock_ = 0; + } + cacheDirty_ = 0; + } + return true; +} +//------------------------------------------------------------------------------ +uint8_t SdVolume::cacheRawBlock(uint32_t blockNumber, uint8_t action) { + if (cacheBlockNumber_ != blockNumber) { + if (!cacheFlush()) return false; + if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) return false; + cacheBlockNumber_ = blockNumber; + } + cacheDirty_ |= action; + return true; +} +//------------------------------------------------------------------------------ +// cache a zero block for blockNumber +uint8_t SdVolume::cacheZeroBlock(uint32_t blockNumber) { + if (!cacheFlush()) return false; + + // loop take less flash than memset(cacheBuffer_.data, 0, 512); + for (uint16_t i = 0; i < 512; i++) { + cacheBuffer_.data[i] = 0; + } + cacheBlockNumber_ = blockNumber; + cacheSetDirty(); + return true; +} +//------------------------------------------------------------------------------ +// return the size in bytes of a cluster chain +uint8_t SdVolume::chainSize(uint32_t cluster, uint32_t* size) const { + uint32_t s = 0; + do { + if (!fatGet(cluster, &cluster)) return false; + s += 512UL << clusterSizeShift_; + } while (!isEOC(cluster)); + *size = s; + return true; +} +//------------------------------------------------------------------------------ +// Fetch a FAT entry +uint8_t SdVolume::fatGet(uint32_t cluster, uint32_t* value) const { + if (cluster > (clusterCount_ + 1)) return false; + uint32_t lba = fatStartBlock_; + lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; + if (lba != cacheBlockNumber_) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; + } + if (fatType_ == 16) { + *value = cacheBuffer_.fat16[cluster & 0XFF]; + } else { + *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; + } + return true; +} +//------------------------------------------------------------------------------ +// Store a FAT entry +uint8_t SdVolume::fatPut(uint32_t cluster, uint32_t value) { + // error if reserved cluster + if (cluster < 2) return false; + + // error if not in FAT + if (cluster > (clusterCount_ + 1)) return false; + + // calculate block address for entry + uint32_t lba = fatStartBlock_; + lba += fatType_ == 16 ? cluster >> 8 : cluster >> 7; + + if (lba != cacheBlockNumber_) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; + } + // store entry + if (fatType_ == 16) { + cacheBuffer_.fat16[cluster & 0XFF] = value; + } else { + cacheBuffer_.fat32[cluster & 0X7F] = value; + } + cacheSetDirty(); + + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + return true; +} +//------------------------------------------------------------------------------ +// free a cluster chain +uint8_t SdVolume::freeChain(uint32_t cluster) { + // clear free cluster location + allocSearchStart_ = 2; + + do { + uint32_t next; + if (!fatGet(cluster, &next)) return false; + + // free cluster + if (!fatPut(cluster, 0)) return false; + + cluster = next; + } while (!isEOC(cluster)); + + return true; +} +//------------------------------------------------------------------------------ +/** + * Initialize a FAT volume. + * + * \param[in] dev The SD card where the volume is located. + * + * \param[in] part The partition to be used. Legal values for \a part are + * 1-4 to use the corresponding partition on a device formatted with + * a MBR, Master Boot Record, or zero if the device is formatted as + * a super floppy with the FAT boot sector in block zero. + * + * \return The value one, true, is returned for success and + * the value zero, false, is returned for failure. Reasons for + * failure include not finding a valid partition, not finding a valid + * FAT file system in the specified partition or an I/O error. + */ +uint8_t SdVolume::init(Sd2Card* dev, uint8_t part) { + uint32_t volumeStartBlock = 0; + sdCard_ = dev; + // if part == 0 assume super floppy with FAT boot sector in block zero + // if part > 0 assume mbr volume with partition table + if (part) { + if (part > 4)return false; + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + part_t* p = &cacheBuffer_.mbr.part[part-1]; + if ((p->boot & 0X7F) !=0 || + p->totalSectors < 100 || + p->firstSector == 0) { + // not a valid partition + return false; + } + volumeStartBlock = p->firstSector; + } + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + bpb_t* bpb = &cacheBuffer_.fbs.bpb; + if (bpb->bytesPerSector != 512 || + bpb->fatCount == 0 || + bpb->reservedSectorCount == 0 || + bpb->sectorsPerCluster == 0) { + // not valid FAT volume + return false; + } + fatCount_ = bpb->fatCount; + blocksPerCluster_ = bpb->sectorsPerCluster; + + // determine shift that is same as multiply by blocksPerCluster_ + clusterSizeShift_ = 0; + while (blocksPerCluster_ != (1 << clusterSizeShift_)) { + // error if not power of 2 + if (clusterSizeShift_++ > 7) return false; + } + blocksPerFat_ = bpb->sectorsPerFat16 ? + bpb->sectorsPerFat16 : bpb->sectorsPerFat32; + + fatStartBlock_ = volumeStartBlock + bpb->reservedSectorCount; + + // count for FAT16 zero for FAT32 + rootDirEntryCount_ = bpb->rootDirEntryCount; + + // directory start for FAT16 dataStart for FAT32 + rootDirStart_ = fatStartBlock_ + bpb->fatCount * blocksPerFat_; + + // data start for FAT16 and FAT32 + dataStartBlock_ = rootDirStart_ + ((32 * bpb->rootDirEntryCount + 511)/512); + + // total blocks for FAT16 or FAT32 + uint32_t totalBlocks = bpb->totalSectors16 ? + bpb->totalSectors16 : bpb->totalSectors32; + // total data blocks + clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); + + // divide by cluster size to get cluster count + clusterCount_ >>= clusterSizeShift_; + + // FAT type is determined by cluster count + if (clusterCount_ < 4085) { + fatType_ = 12; + } else if (clusterCount_ < 65525) { + fatType_ = 16; + } else { + rootDirStart_ = bpb->fat32RootCluster; + fatType_ = 32; + } + return true; +} diff --git a/arduino-0022-linux-x64/libraries/SPI/SPI.cpp b/arduino-0022-linux-x64/libraries/SPI/SPI.cpp new file mode 100644 index 0000000..42915df --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SPI/SPI.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * SPI Master library for arduino. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#include "pins_arduino.h" +#include "SPI.h" + +SPIClass SPI; + +void SPIClass::begin() { + // Set direction register for SCK and MOSI pin. + // MISO pin automatically overrides to INPUT. + // When the SS pin is set as OUTPUT, it can be used as + // a general purpose output port (it doesn't influence + // SPI operations). + + pinMode(SCK, OUTPUT); + pinMode(MOSI, OUTPUT); + pinMode(SS, OUTPUT); + + digitalWrite(SCK, LOW); + digitalWrite(MOSI, LOW); + digitalWrite(SS, HIGH); + + // Warning: if the SS pin ever becomes a LOW INPUT then SPI + // automatically switches to Slave, so the data direction of + // the SS pin MUST be kept as OUTPUT. + SPCR |= _BV(MSTR); + SPCR |= _BV(SPE); +} + +void SPIClass::end() { + SPCR &= ~_BV(SPE); +} + +void SPIClass::setBitOrder(uint8_t bitOrder) +{ + if(bitOrder == LSBFIRST) { + SPCR |= _BV(DORD); + } else { + SPCR &= ~(_BV(DORD)); + } +} + +void SPIClass::setDataMode(uint8_t mode) +{ + SPCR = (SPCR & ~SPI_MODE_MASK) | mode; +} + +void SPIClass::setClockDivider(uint8_t rate) +{ + SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK); + SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((rate >> 2) & SPI_2XCLOCK_MASK); +} + diff --git a/arduino-0022-linux-x64/libraries/SPI/SPI.h b/arduino-0022-linux-x64/libraries/SPI/SPI.h new file mode 100644 index 0000000..9d7c3c7 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SPI/SPI.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2010 by Cristian Maglie + * SPI Master library for arduino. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#ifndef _SPI_H_INCLUDED +#define _SPI_H_INCLUDED + +#include +#include +#include + +#define SPI_CLOCK_DIV4 0x00 +#define SPI_CLOCK_DIV16 0x01 +#define SPI_CLOCK_DIV64 0x02 +#define SPI_CLOCK_DIV128 0x03 +#define SPI_CLOCK_DIV2 0x04 +#define SPI_CLOCK_DIV8 0x05 +#define SPI_CLOCK_DIV32 0x06 +#define SPI_CLOCK_DIV64 0x07 + +#define SPI_MODE0 0x00 +#define SPI_MODE1 0x04 +#define SPI_MODE2 0x08 +#define SPI_MODE3 0x0C + +#define SPI_MODE_MASK 0x0C // CPOL = bit 3, CPHA = bit 2 on SPCR +#define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR +#define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR + +class SPIClass { +public: + inline static byte transfer(byte _data); + + // SPI Configuration methods + + inline static void attachInterrupt(); + inline static void detachInterrupt(); // Default + + static void begin(); // Default + static void end(); + + static void setBitOrder(uint8_t); + static void setDataMode(uint8_t); + static void setClockDivider(uint8_t); +}; + +extern SPIClass SPI; + +byte SPIClass::transfer(byte _data) { + SPDR = _data; + while (!(SPSR & _BV(SPIF))) + ; + return SPDR; +} + +void SPIClass::attachInterrupt() { + SPCR |= _BV(SPIE); +} + +void SPIClass::detachInterrupt() { + SPCR &= ~_BV(SPIE); +} + +#endif diff --git a/arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.pde b/arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.pde new file mode 100644 index 0000000..9d77a42 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor.pde @@ -0,0 +1,143 @@ +/* + SCP1000 Barometric Pressure Sensor Display + + Shows the output of a Barometric Pressure Sensor on a + Uses the SPI library. For details on the sensor, see: + http://www.sparkfun.com/commerce/product_info.php?products_id=8161 + http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ + + This sketch adapted from Nathan Seidle's SCP1000 example for PIC: + http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip + + Circuit: + SCP1000 sensor attached to pins 6, 7, 10 - 13: + DRDY: pin 6 + CSB: pin 7 + MOSI: pin 11 + MISO: pin 12 + SCK: pin 13 + + created 31 July 2010 + modified 14 August 2010 + by Tom Igoe + */ + +// the sensor communicates using SPI, so include the library: +#include + +//Sensor's memory register addresses: +const int PRESSURE = 0x1F; //3 most significant bits of pressure +const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure +const int TEMPERATURE = 0x21; //16 bit temperature reading +const byte READ = 0b11111100; // SCP1000's read command +const byte WRITE = 0b00000010; // SCP1000's write command + +// pins used for the connection with the sensor +// the other you need are controlled by the SPI library): +const int dataReadyPin = 6; +const int chipSelectPin = 7; + +void setup() { + Serial.begin(9600); + + // start the SPI library: + SPI.begin(); + + // initalize the data ready and chip select pins: + pinMode(dataReadyPin, INPUT); + pinMode(chipSelectPin, OUTPUT); + + //Configure SCP1000 for low noise configuration: + writeRegister(0x02, 0x2D); + writeRegister(0x01, 0x03); + writeRegister(0x03, 0x02); + // give the sensor time to set up: + delay(100); +} + +void loop() { + //Select High Resolution Mode + writeRegister(0x03, 0x0A); + + // don't do anything until the data ready pin is high: + if (digitalRead(dataReadyPin) == HIGH) { + //Read the temperature data + int tempData = readRegister(0x21, 2); + + // convert the temperature to celsius and display it: + float realTemp = (float)tempData / 20.0; + Serial.print("Temp[C]="); + Serial.print(realTemp); + + + //Read the pressure data highest 3 bits: + byte pressure_data_high = readRegister(0x1F, 1); + pressure_data_high &= 0b00000111; //you only needs bits 2 to 0 + + //Read the pressure data lower 16 bits: + unsigned int pressure_data_low = readRegister(0x20, 2); + //combine the two parts into one 19-bit number: + long pressure = ((pressure_data_high << 16) | pressure_data_low)/4; + + // display the temperature: + Serial.println("\tPressure [Pa]=" + String(pressure)); + } +} + +//Read from or write to register from the SCP1000: +unsigned int readRegister(byte thisRegister, int bytesToRead ) { + byte inByte = 0; // incoming byte from the SPI + unsigned int result = 0; // result to return + Serial.print(thisRegister, BIN); + Serial.print("\t"); + // SCP1000 expects the register name in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the address and the command into one byte + byte dataToSend = thisRegister & READ; + Serial.println(thisRegister, BIN); + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + // send the device the register you want to read: + SPI.transfer(dataToSend); + // send a value of 0 to read the first byte returned: + result = SPI.transfer(0x00); + // decrement the number of bytes left to read: + bytesToRead--; + // if you still have another byte to read: + if (bytesToRead > 0) { + // shift the first byte left, then get the second byte: + result = result << 8; + inByte = SPI.transfer(0x00); + // combine the byte you just got with the previous one: + result = result | inByte; + // decrement the number of bytes left to read: + bytesToRead--; + } + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); + // return the result: + return(result); +} + + +//Sends a write command to SCP1000 + +void writeRegister(byte thisRegister, byte thisValue) { + + // SCP1000 expects the register address in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the register address and the command into one byte: + byte dataToSend = thisRegister | WRITE; + + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + + SPI.transfer(dataToSend); //Send register location + SPI.transfer(thisValue); //Send value to record into register + + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); +} + diff --git a/arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor/BarometricPressureSensor.pde b/arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor/BarometricPressureSensor.pde new file mode 100644 index 0000000..9c9c9b6 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SPI/examples/BarometricPressureSensor/BarometricPressureSensor/BarometricPressureSensor.pde @@ -0,0 +1,143 @@ +/* + SCP1000 Barometric Pressure Sensor Display + + Shows the output of a Barometric Pressure Sensor on a + Uses the SPI library. For details on the sensor, see: + http://www.sparkfun.com/commerce/product_info.php?products_id=8161 + http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ + + This sketch adapted from Nathan Seidle's SCP1000 example for PIC: + http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip + + Circuit: + SCP1000 sensor attached to pins 6, 7, 10 - 13: + DRDY: pin 6 + CSB: pin 7 + MOSI: pin 11 + MISO: pin 12 + SCK: pin 13 + + created 31 July 2010 + modified 14 August 2010 + by Tom Igoe + */ + +// the sensor communicates using SPI, so include the library: +#include + +//Sensor's memory register addresses: +const int PRESSURE = 0x1F; //3 most significant bits of pressure +const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure +const int TEMPERATURE = 0x21; //16 bit temperature reading +cont byte READ = 0b00000000; // SCP1000's read command +const byte WRITE = 0b00000010; // SCP1000's write command +// pins used for the connection with the sensor +// the other you need are controlled by the SPI library): +const int dataReadyPin = 6; +const int chipSelectPin = 7; + +void setup() { + Serial.begin(9600); + + // start the SPI library: + SPI.begin(); + + // initalize the data ready and chip select pins: + pinMode(dataReadyPin, INPUT); + pinMode(chipSelectPin, OUTPUT); + + //Configure SCP1000 for low noise configuration: + writeRegister(0x02, 0x2D); + writeRegister(0x01, 0x03); + writeRegister(0x03, 0x02); + // give the sensor time to set up: + delay(100); +} + +void loop() { + //Select High Resolution Mode + writeRegister(0x03, 0x0A); + + // don't do anything until the data ready pin is high: + if (digitalRead(dataReadyPin) == HIGH) { + //Read the temperature data + int tempData = readRegister(0x21, 2); + + // convert the temperature to celsius and display it: + float realTemp = (float)tempData / 20.0; + Serial.print("Temp[C]="); + Serial.print(realTemp); + + + //Read the pressure data highest 3 bits: + byte pressure_data_high = readRegister(0x1F, 1); + pressure_data_high &= 0b00000111; //you only needs bits 2 to 0 + + //Read the pressure data lower 16 bits: + unsigned int pressure_data_low = readRegister(0x20, 2); + //combine the two parts into one 19-bit number: + long pressure = ((pressure_data_high << 16) | pressure_data_low)/4; + + // display the temperature: + Serial.println("\tPressure [Pa]=" + String(pressure)); + } +} + +//Read from or write to register from the SCP1000: +unsigned int readRegister(byte thisRegister, int bytesToRead ) { + byte inByte = 0; // incoming byte from the SPI + unsigned int result = 0; // result to return + + // SCP1000 expects the register name in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the address and the command into one byte + dataToSend = thisRegister & READ; + + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + // send the device the register you want to read: + SPI.transfer(dataToSend); + // send a value of 0 to read the first byte returned: + result = SPI.transfer(0x00); + // decrement the number of bytes left to read: + bytesToRead--; + // if you still have another byte to read: + if (bytesToRead > 0) { + // shift the first byte left, then get the second byte: + result = result << 8; + inByte = SPI.transfer(0x00); + // combine the byte you just got with the previous one: + result = result | inByte; + // decrement the number of bytes left to read: + bytesToRead--; + } + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); + // return the result: + return(result); +} + + +//Sends a write command to SCP1000 + +void writeRegister(byte thisRegister, byte thisValue) { + + // SCP1000 expects the register address in the upper 6 bits + // of the byte. So shift the bits left by two bits: + thisRegister = thisRegister << 2; + // now combine the register address and the command into one byte: + dataToSend = thisRegister | WRITE; + + // take the chip select low to select the device: + digitalWrite(chipSelectPin, LOW); + + SPI.transfer(dataToSend); //Send register location + SPI.transfer(thisValue); //Send value to record into register + + // take the chip select high to de-select: + digitalWrite(chipSelectPin, HIGH); +} + + + diff --git a/arduino-0022-linux-x64/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.pde b/arduino-0022-linux-x64/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.pde new file mode 100644 index 0000000..ef97dae --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SPI/examples/DigitalPotControl/DigitalPotControl.pde @@ -0,0 +1,71 @@ +/* + Digital Pot Control + + This example controls an Analog Devices AD5206 digital potentiometer. + The AD5206 has 6 potentiometer channels. Each channel's pins are labeled + A - connect this to voltage + W - this is the pot's wiper, which changes when you set it + B - connect this to ground. + + The AD5206 is SPI-compatible,and to command it, you send two bytes, + one with the channel number (0 - 5) and one with the resistance value for the + channel (0 - 255). + + The circuit: + * All A pins of AD5206 connected to +5V + * All B pins of AD5206 connected to ground + * An LED and a 220-ohm resisor in series connected from each W pin to ground + * CS - to digital pin 10 (SS pin) + * SDI - to digital pin 11 (MOSI pin) + * CLK - to digital pin 13 (SCK pin) + + created 10 Aug 2010 + by Tom Igoe + + Thanks to Heather Dewey-Hagborg for the original tutorial, 2005 + +*/ + + +// inslude the SPI library: +#include + + +// set pin 10 as the slave select for the digital pot: +const int slaveSelectPin = 10; + +void setup() { + // set the slaveSelectPin as an output: + pinMode (slaveSelectPin, OUTPUT); + // initialize SPI: + SPI.begin(); +} + +void loop() { + // go through the six channels of the digital pot: + for (int channel = 0; channel < 6; channel++) { + // change the resistance on this channel from min to max: + for (int level = 0; level < 255; level++) { + digitalPotWrite(channel, level); + delay(10); + } + // wait a second at the top: + delay(100); + // change the resistance on this channel from max to min: + for (int level = 0; level < 255; level++) { + digitalPotWrite(channel, 255 - level); + delay(10); + } + } + +} + +int digitalPotWrite(int address, int value) { + // take the SS pin low to select the chip: + digitalWrite(slaveSelectPin,LOW); + // send in the address and value via SPI: + SPI.transfer(address); + SPI.transfer(value); + // take the SS pin high to de-select the chip: + digitalWrite(slaveSelectPin,HIGH); +} \ No newline at end of file diff --git a/arduino-0022-linux-x64/libraries/SPI/keywords.txt b/arduino-0022-linux-x64/libraries/SPI/keywords.txt new file mode 100644 index 0000000..fa76165 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/SPI/keywords.txt @@ -0,0 +1,36 @@ +####################################### +# Syntax Coloring Map SPI +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +SPI KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +begin KEYWORD2 +end KEYWORD2 +transfer KEYWORD2 +setBitOrder KEYWORD2 +setDataMode KEYWORD2 +setClockDivider KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### +SPI_CLOCK_DIV4 LITERAL1 +SPI_CLOCK_DIV16 LITERAL1 +SPI_CLOCK_DIV64 LITERAL1 +SPI_CLOCK_DIV128 LITERAL1 +SPI_CLOCK_DIV2 LITERAL1 +SPI_CLOCK_DIV8 LITERAL1 +SPI_CLOCK_DIV32 LITERAL1 +SPI_CLOCK_DIV64 LITERAL1 +SPI_MODE0 LITERAL1 +SPI_MODE1 LITERAL1 +SPI_MODE2 LITERAL1 +SPI_MODE3 LITERAL1 \ No newline at end of file diff --git a/arduino-0018-linux-x64/libraries/Servo/Servo.cpp b/arduino-0022-linux-x64/libraries/Servo/Servo.cpp old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/libraries/Servo/Servo.cpp rename to arduino-0022-linux-x64/libraries/Servo/Servo.cpp diff --git a/arduino-0018-linux-x64/libraries/Servo/Servo.h b/arduino-0022-linux-x64/libraries/Servo/Servo.h old mode 100755 new mode 100644 similarity index 98% rename from arduino-0018-linux-x64/libraries/Servo/Servo.h rename to arduino-0022-linux-x64/libraries/Servo/Servo.h index 7d608b3..bf3e012 --- a/arduino-0018-linux-x64/libraries/Servo/Servo.h +++ b/arduino-0022-linux-x64/libraries/Servo/Servo.h @@ -57,7 +57,7 @@ */ // Say which 16 bit timers can be used and in what order -#if defined(__AVR_ATmega1280__) +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define _useTimer5 #define _useTimer1 #define _useTimer3 diff --git a/arduino-0018-linux-x64/libraries/Servo/examples/Knob/Knob.pde b/arduino-0022-linux-x64/libraries/Servo/examples/Knob/Knob.pde similarity index 100% rename from arduino-0018-linux-x64/libraries/Servo/examples/Knob/Knob.pde rename to arduino-0022-linux-x64/libraries/Servo/examples/Knob/Knob.pde diff --git a/arduino-0018-linux-x64/libraries/Servo/examples/Sweep/Sweep.pde b/arduino-0022-linux-x64/libraries/Servo/examples/Sweep/Sweep.pde similarity index 95% rename from arduino-0018-linux-x64/libraries/Servo/examples/Sweep/Sweep.pde rename to arduino-0022-linux-x64/libraries/Servo/examples/Sweep/Sweep.pde index 52e6056..fb326e7 100644 --- a/arduino-0018-linux-x64/libraries/Servo/examples/Sweep/Sweep.pde +++ b/arduino-0022-linux-x64/libraries/Servo/examples/Sweep/Sweep.pde @@ -1,5 +1,7 @@ // Sweep // by BARRAGAN +// This example code is in the public domain. + #include diff --git a/arduino-0018-linux-x64/libraries/Servo/keywords.txt b/arduino-0022-linux-x64/libraries/Servo/keywords.txt old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/libraries/Servo/keywords.txt rename to arduino-0022-linux-x64/libraries/Servo/keywords.txt diff --git a/arduino-0018-linux-x64/libraries/SoftwareSerial/SoftwareSerial.cpp b/arduino-0022-linux-x64/libraries/SoftwareSerial/SoftwareSerial.cpp old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/libraries/SoftwareSerial/SoftwareSerial.cpp rename to arduino-0022-linux-x64/libraries/SoftwareSerial/SoftwareSerial.cpp diff --git a/arduino-0018-linux-x64/libraries/SoftwareSerial/SoftwareSerial.h b/arduino-0022-linux-x64/libraries/SoftwareSerial/SoftwareSerial.h old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/libraries/SoftwareSerial/SoftwareSerial.h rename to arduino-0022-linux-x64/libraries/SoftwareSerial/SoftwareSerial.h diff --git a/arduino-0018-linux-x64/libraries/SoftwareSerial/keywords.txt b/arduino-0022-linux-x64/libraries/SoftwareSerial/keywords.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/SoftwareSerial/keywords.txt rename to arduino-0022-linux-x64/libraries/SoftwareSerial/keywords.txt diff --git a/arduino-0018-linux-x64/libraries/Sprite/Sprite.cpp b/arduino-0022-linux-x64/libraries/Sprite/Sprite.cpp similarity index 100% rename from arduino-0018-linux-x64/libraries/Sprite/Sprite.cpp rename to arduino-0022-linux-x64/libraries/Sprite/Sprite.cpp diff --git a/arduino-0018-linux-x64/libraries/Sprite/Sprite.h b/arduino-0022-linux-x64/libraries/Sprite/Sprite.h similarity index 100% rename from arduino-0018-linux-x64/libraries/Sprite/Sprite.h rename to arduino-0022-linux-x64/libraries/Sprite/Sprite.h diff --git a/arduino-0018-linux-x64/libraries/Sprite/binary.h b/arduino-0022-linux-x64/libraries/Sprite/binary.h similarity index 100% rename from arduino-0018-linux-x64/libraries/Sprite/binary.h rename to arduino-0022-linux-x64/libraries/Sprite/binary.h diff --git a/arduino-0018-linux-x64/libraries/Sprite/keywords.txt b/arduino-0022-linux-x64/libraries/Sprite/keywords.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/Sprite/keywords.txt rename to arduino-0022-linux-x64/libraries/Sprite/keywords.txt diff --git a/arduino-0018-linux-x64/libraries/Stepper/Stepper.cpp b/arduino-0022-linux-x64/libraries/Stepper/Stepper.cpp similarity index 100% rename from arduino-0018-linux-x64/libraries/Stepper/Stepper.cpp rename to arduino-0022-linux-x64/libraries/Stepper/Stepper.cpp diff --git a/arduino-0018-linux-x64/libraries/Stepper/Stepper.h b/arduino-0022-linux-x64/libraries/Stepper/Stepper.h similarity index 100% rename from arduino-0018-linux-x64/libraries/Stepper/Stepper.h rename to arduino-0022-linux-x64/libraries/Stepper/Stepper.h diff --git a/arduino-0018-linux-x64/libraries/Stepper/examples/MotorKnob/MotorKnob.pde b/arduino-0022-linux-x64/libraries/Stepper/examples/MotorKnob/MotorKnob.pde similarity index 94% rename from arduino-0018-linux-x64/libraries/Stepper/examples/MotorKnob/MotorKnob.pde rename to arduino-0022-linux-x64/libraries/Stepper/examples/MotorKnob/MotorKnob.pde index 062cac9..d428186 100644 --- a/arduino-0018-linux-x64/libraries/Stepper/examples/MotorKnob/MotorKnob.pde +++ b/arduino-0022-linux-x64/libraries/Stepper/examples/MotorKnob/MotorKnob.pde @@ -5,6 +5,7 @@ * (or other sensor) on analog input 0. * * http://www.arduino.cc/en/Reference/Stepper + * This example code is in the public domain. */ #include diff --git a/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.pde b/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.pde new file mode 100644 index 0000000..2dbb57d --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.pde @@ -0,0 +1,44 @@ + +/* + Stepper Motor Control - one revolution + + This program drives a unipolar or bipolar stepper motor. + The motor is attached to digital pins 8 - 11 of the Arduino. + + The motor should revolve one revolution in one direction, then + one revolution in the other direction. + + + Created 11 Mar. 2007 + Modified 30 Nov. 2009 + by Tom Igoe + + */ + +#include + +const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution + // for your motor + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8,9,10,11); + +void setup() { + // set the speed at 60 rpm: + myStepper.setSpeed(60); + // initialize the serial port: + Serial.begin(9600); +} + +void loop() { + // step one revolution in one direction: + Serial.println("clockwise"); + myStepper.step(stepsPerRevolution); + delay(500); + + // step one revolution in the other direction: + Serial.println("counterclockwise"); + myStepper.step(-stepsPerRevolution); + delay(500); +} + diff --git a/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.pde b/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.pde new file mode 100644 index 0000000..36d3299 --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.pde @@ -0,0 +1,44 @@ + +/* + Stepper Motor Control - one step at a time + + This program drives a unipolar or bipolar stepper motor. + The motor is attached to digital pins 8 - 11 of the Arduino. + + The motor will step one step at a time, very slowly. You can use this to + test that you've got the four wires of your stepper wired to the correct + pins. If wired correctly, all steps should be in the same direction. + + Use this also to count the number of steps per revolution of your motor, + if you don't know it. Then plug that number into the oneRevolution + example to see if you got it right. + + Created 30 Nov. 2009 + by Tom Igoe + + */ + +#include + +const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution + // for your motor + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8,9,10,11); + +int stepCount = 0; // number of steps the motor has taken + +void setup() { + // initialize the serial port: + Serial.begin(9600); +} + +void loop() { + // step one step: + myStepper.step(1); + Serial.print("steps:" ); + Serial.println(stepCount); + stepCount++; + delay(500); +} + diff --git a/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.pde b/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.pde new file mode 100644 index 0000000..dbd0f7f --- /dev/null +++ b/arduino-0022-linux-x64/libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.pde @@ -0,0 +1,49 @@ + +/* + Stepper Motor Control - speed control + + This program drives a unipolar or bipolar stepper motor. + The motor is attached to digital pins 8 - 11 of the Arduino. + A potentiometer is connected to analog input 0. + + The motor will rotate in a clockwise direction. The higher the potentiometer value, + the faster the motor speed. Because setSpeed() sets the delay between steps, + you may notice the motor is less responsive to changes in the sensor value at + low speeds. + + Created 30 Nov. 2009 + Modified 28 Oct 2010 + by Tom Igoe + + */ + +#include + +const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution +// for your motor + + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8,9,10,11); + +int stepCount = 0; // number of steps the motor has taken + +void setup() { + // initialize the serial port: + Serial.begin(9600); +} + +void loop() { + // read the sensor value: + int sensorReading = analogRead(A0); + // map it to a range from 0 to 100: + int motorSpeed = map(sensorReading, 0, 1023, 0, 100); + // set the motor speed: + if (motorSpeed > 0) { + myStepper.setSpeed(motorSpeed); + // step 1/100 of a revolution: + myStepper.step(stepsPerRevolution/100); + } +} + + diff --git a/arduino-0018-linux-x64/libraries/Stepper/keywords.txt b/arduino-0022-linux-x64/libraries/Stepper/keywords.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/Stepper/keywords.txt rename to arduino-0022-linux-x64/libraries/Stepper/keywords.txt diff --git a/arduino-0018-linux-x64/libraries/Wire/Wire.cpp b/arduino-0022-linux-x64/libraries/Wire/Wire.cpp old mode 100755 new mode 100644 similarity index 96% rename from arduino-0018-linux-x64/libraries/Wire/Wire.cpp rename to arduino-0022-linux-x64/libraries/Wire/Wire.cpp index 0ee3012..849439b --- a/arduino-0018-linux-x64/libraries/Wire/Wire.cpp +++ b/arduino-0022-linux-x64/libraries/Wire/Wire.cpp @@ -28,12 +28,12 @@ extern "C" { // Initialize Class Variables ////////////////////////////////////////////////// -uint8_t* TwoWire::rxBuffer = 0; +uint8_t TwoWire::rxBuffer[BUFFER_LENGTH]; uint8_t TwoWire::rxBufferIndex = 0; uint8_t TwoWire::rxBufferLength = 0; uint8_t TwoWire::txAddress = 0; -uint8_t* TwoWire::txBuffer = 0; +uint8_t TwoWire::txBuffer[BUFFER_LENGTH]; uint8_t TwoWire::txBufferIndex = 0; uint8_t TwoWire::txBufferLength = 0; @@ -51,13 +51,9 @@ TwoWire::TwoWire() void TwoWire::begin(void) { - // init buffer for reads - rxBuffer = (uint8_t*) calloc(BUFFER_LENGTH, sizeof(uint8_t)); rxBufferIndex = 0; rxBufferLength = 0; - // init buffer for writes - txBuffer = (uint8_t*) calloc(BUFFER_LENGTH, sizeof(uint8_t)); txBufferIndex = 0; txBufferLength = 0; diff --git a/arduino-0018-linux-x64/libraries/Wire/Wire.h b/arduino-0022-linux-x64/libraries/Wire/Wire.h old mode 100755 new mode 100644 similarity index 96% rename from arduino-0018-linux-x64/libraries/Wire/Wire.h rename to arduino-0022-linux-x64/libraries/Wire/Wire.h index 9e849d5..a6c29c4 --- a/arduino-0018-linux-x64/libraries/Wire/Wire.h +++ b/arduino-0022-linux-x64/libraries/Wire/Wire.h @@ -27,12 +27,12 @@ class TwoWire { private: - static uint8_t* rxBuffer; + static uint8_t rxBuffer[]; static uint8_t rxBufferIndex; static uint8_t rxBufferLength; static uint8_t txAddress; - static uint8_t* txBuffer; + static uint8_t txBuffer[]; static uint8_t txBufferIndex; static uint8_t txBufferLength; diff --git a/arduino-0018-linux-x64/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde b/arduino-0022-linux-x64/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde old mode 100755 new mode 100644 similarity index 98% rename from arduino-0018-linux-x64/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde rename to arduino-0022-linux-x64/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde index c89b0f0..4bb4b83 --- a/arduino-0018-linux-x64/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde +++ b/arduino-0022-linux-x64/libraries/Wire/examples/SFRRanger_reader/SFRRanger_reader.pde @@ -7,6 +7,9 @@ // Created 29 April 2006 +// This example code is in the public domain. + + #include void setup() diff --git a/arduino-0018-linux-x64/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde b/arduino-0022-linux-x64/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde similarity index 90% rename from arduino-0018-linux-x64/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde rename to arduino-0022-linux-x64/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde index 35ee5d6..00a15cc 100644 --- a/arduino-0018-linux-x64/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde +++ b/arduino-0022-linux-x64/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.pde @@ -7,6 +7,11 @@ // Created 31 March 2006 +// This example code is in the public domain. + +// This example code is in the public domain. + + #include void setup() diff --git a/arduino-0018-linux-x64/libraries/Wire/examples/master_reader/master_reader.pde b/arduino-0022-linux-x64/libraries/Wire/examples/master_reader/master_reader.pde similarity index 93% rename from arduino-0018-linux-x64/libraries/Wire/examples/master_reader/master_reader.pde rename to arduino-0022-linux-x64/libraries/Wire/examples/master_reader/master_reader.pde index 1b139de..4e0ffba 100644 --- a/arduino-0018-linux-x64/libraries/Wire/examples/master_reader/master_reader.pde +++ b/arduino-0022-linux-x64/libraries/Wire/examples/master_reader/master_reader.pde @@ -7,6 +7,9 @@ // Created 29 March 2006 +// This example code is in the public domain. + + #include void setup() diff --git a/arduino-0018-linux-x64/libraries/Wire/examples/master_writer/master_writer.pde b/arduino-0022-linux-x64/libraries/Wire/examples/master_writer/master_writer.pde similarity index 92% rename from arduino-0018-linux-x64/libraries/Wire/examples/master_writer/master_writer.pde rename to arduino-0022-linux-x64/libraries/Wire/examples/master_writer/master_writer.pde index d0ff9fa..5278787 100644 --- a/arduino-0018-linux-x64/libraries/Wire/examples/master_writer/master_writer.pde +++ b/arduino-0022-linux-x64/libraries/Wire/examples/master_writer/master_writer.pde @@ -7,6 +7,9 @@ // Created 29 March 2006 +// This example code is in the public domain. + + #include void setup() diff --git a/arduino-0018-linux-x64/libraries/Wire/examples/slave_receiver/slave_receiver.pde b/arduino-0022-linux-x64/libraries/Wire/examples/slave_receiver/slave_receiver.pde similarity index 95% rename from arduino-0018-linux-x64/libraries/Wire/examples/slave_receiver/slave_receiver.pde rename to arduino-0022-linux-x64/libraries/Wire/examples/slave_receiver/slave_receiver.pde index 53c86b5..3e85f3d 100644 --- a/arduino-0018-linux-x64/libraries/Wire/examples/slave_receiver/slave_receiver.pde +++ b/arduino-0022-linux-x64/libraries/Wire/examples/slave_receiver/slave_receiver.pde @@ -7,6 +7,9 @@ // Created 29 March 2006 +// This example code is in the public domain. + + #include void setup() diff --git a/arduino-0018-linux-x64/libraries/Wire/examples/slave_sender/slave_sender.pde b/arduino-0022-linux-x64/libraries/Wire/examples/slave_sender/slave_sender.pde similarity index 93% rename from arduino-0018-linux-x64/libraries/Wire/examples/slave_sender/slave_sender.pde rename to arduino-0022-linux-x64/libraries/Wire/examples/slave_sender/slave_sender.pde index f500644..e19f0e7 100644 --- a/arduino-0018-linux-x64/libraries/Wire/examples/slave_sender/slave_sender.pde +++ b/arduino-0022-linux-x64/libraries/Wire/examples/slave_sender/slave_sender.pde @@ -7,6 +7,9 @@ // Created 29 March 2006 +// This example code is in the public domain. + + #include void setup() diff --git a/arduino-0018-linux-x64/libraries/Wire/keywords.txt b/arduino-0022-linux-x64/libraries/Wire/keywords.txt similarity index 100% rename from arduino-0018-linux-x64/libraries/Wire/keywords.txt rename to arduino-0022-linux-x64/libraries/Wire/keywords.txt diff --git a/arduino-0018-linux-x64/libraries/Wire/utility/twi.c b/arduino-0022-linux-x64/libraries/Wire/utility/twi.c similarity index 96% rename from arduino-0018-linux-x64/libraries/Wire/utility/twi.c rename to arduino-0022-linux-x64/libraries/Wire/utility/twi.c index 2ad2a71..236878c 100644 --- a/arduino-0018-linux-x64/libraries/Wire/utility/twi.c +++ b/arduino-0022-linux-x64/libraries/Wire/utility/twi.c @@ -40,15 +40,15 @@ static uint8_t twi_slarw; static void (*twi_onSlaveTransmit)(void); static void (*twi_onSlaveReceive)(uint8_t*, int); -static uint8_t* twi_masterBuffer; +static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH]; static volatile uint8_t twi_masterBufferIndex; static uint8_t twi_masterBufferLength; -static uint8_t* twi_txBuffer; +static uint8_t twi_txBuffer[TWI_BUFFER_LENGTH]; static volatile uint8_t twi_txBufferIndex; static volatile uint8_t twi_txBufferLength; -static uint8_t* twi_rxBuffer; +static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; static volatile uint8_t twi_rxBufferIndex; static volatile uint8_t twi_error; @@ -88,11 +88,6 @@ void twi_init(void) // enable twi module, acks, and twi interrupt TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); - - // allocate buffers - twi_masterBuffer = (uint8_t*) calloc(TWI_BUFFER_LENGTH, sizeof(uint8_t)); - twi_txBuffer = (uint8_t*) calloc(TWI_BUFFER_LENGTH, sizeof(uint8_t)); - twi_rxBuffer = (uint8_t*) calloc(TWI_BUFFER_LENGTH, sizeof(uint8_t)); } /* @@ -418,12 +413,14 @@ SIGNAL(TWI_vect) if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){ twi_rxBuffer[twi_rxBufferIndex] = '\0'; } + // sends ack and stops interface for clock stretching + twi_stop(); // callback to user defined callback twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex); - // ack future responses - twi_reply(1); - // leave slave receiver state - twi_state = TWI_READY; + // since we submit rx buffer to "wire" library, we can reset it + twi_rxBufferIndex = 0; + // ack future responses and leave slave receiver state + twi_releaseBus(); break; case TW_SR_DATA_NACK: // data received, returned nack case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack diff --git a/arduino-0018-linux-x64/libraries/Wire/utility/twi.h b/arduino-0022-linux-x64/libraries/Wire/utility/twi.h old mode 100755 new mode 100644 similarity index 100% rename from arduino-0018-linux-x64/libraries/Wire/utility/twi.h rename to arduino-0022-linux-x64/libraries/Wire/utility/twi.h diff --git a/arduino-0018-linux-x64/reference/ASCIIchart.html b/arduino-0022-linux-x64/reference/ASCIIchart.html similarity index 100% rename from arduino-0018-linux-x64/reference/ASCIIchart.html rename to arduino-0022-linux-x64/reference/ASCIIchart.html diff --git a/arduino-0022-linux-x64/reference/Abs.html b/arduino-0022-linux-x64/reference/Abs.html new file mode 100644 index 0000000..591cbdf --- /dev/null +++ b/arduino-0022-linux-x64/reference/Abs.html @@ -0,0 +1,172 @@ + + + + Arduino - Abs + + + + + + + +
    + + + + + + +
    + +
    +

    Reference   Language | Libraries | Comparison | Changes +

    +

    abs(x)

    +

    Description

    +

    Computes the absolute value of a number. +

    +

    Parameters

    +

    x: the number +

    +

    Returns

    +

    x: if x is greater than or equal to 0. +

    +

    -x: if x is less than 0. +

    +

    Warning

    +

    Because of the way the abs() function is implemented, avoid using other functions inside the brackets, it may lead to incorrect results. +

    +

    +abs(a++);   // avoid this - yields incorrect results
    +
    +a++;          // use this instead -
    +abs(a);       // keep other math outside the function
    +
    +
    +

    Reference Home +

    +

    Corrections, suggestions, and new documentation should be posted to the Forum. +

    +

    The text of the Arduino reference is licensed under a +Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. +

    +
    + + + + + + + +
    + + + +
    + + diff --git a/arduino-0022-linux-x64/reference/AnalogRead.html b/arduino-0022-linux-x64/reference/AnalogRead.html new file mode 100644 index 0000000..53f9d74 --- /dev/null +++ b/arduino-0022-linux-x64/reference/AnalogRead.html @@ -0,0 +1,189 @@ + + + + Arduino - AnalogRead + + + + + + + +
    + + + + + + +
    + +
    +

    Reference   Language | Libraries | Comparison | Changes +

    +

    analogRead()

    +

    Description

    +

    Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, .0049 volts (4.9 mV) per unit. The input range and resolution can be changed using analogReference(). +

    +

    It takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second. +

    +

    Syntax

    +

    analogRead(pin) +

    +

    Parameters

    +

    pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega) +

    +

    Returns

    +

    int (0 to 1023) +

    +

    Note

    +

    If the analog input pin is not connected to anything, the value returned by analogRead() will fluctuate based on a number of factors (e.g. the values of the other analog inputs, how close your hand is to the board, etc.). +

    +

    Example

    +
     
    +int analogPin = 3;     // potentiometer wiper (middle terminal) connected to analog pin 3
    +                       // outside leads to ground and +5V
    +int val = 0;           // variable to store the value read
    +
    +void setup()
    +{
    +  Serial.begin(9600);          //  setup serial
    +}
    +
    +void loop()
    +{
    +  val = analogRead(analogPin);    // read the input pin
    +  Serial.println(val);             // debug value
    +}
    +
    +
    +

    See also

    +

    Reference Home +

    +

    Corrections, suggestions, and new documentation should be posted to the Forum. +

    +

    The text of the Arduino reference is licensed under a +Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. +

    +
    + + + + + + + +
    + + + +
    + + diff --git a/arduino-0022-linux-x64/reference/AnalogReference.html b/arduino-0022-linux-x64/reference/AnalogReference.html new file mode 100644 index 0000000..86f064e --- /dev/null +++ b/arduino-0022-linux-x64/reference/AnalogReference.html @@ -0,0 +1,176 @@ + + + + Arduino - AnalogReference + + + + + + + +
    + + + + + + +
    + +
    +

    Reference   Language | Libraries | Comparison | Changes +

    +

    analogReference(type)

    +

    Description

    +

    Configures the reference voltage used for analog input (i.e. the value used as the top of the input range). The options are: +

    +

    • DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards) +
    • INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328 and 2.56 volts on the ATmega8 (not available on the Arduino Mega) +
    • INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only) +
    • INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only) +
    • EXTERNAL: the voltage applied to the AREF pin is used as the reference. +

    Parameters

    +

    type: which type of reference to use (DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, or EXTERNAL). +

    +

    Returns

    +

    None. +

    +

    Note

    +

    After changing the analog reference, the first few readings from analogRead() may not be accurate. +

    +

    Warning

    +

    If you're using an external reference voltage (applied to the AREF pin), you must set the analog reference to EXTERNAL before calling analogRead(). Otherwise, you will short together the active reference voltage (internally generated) and the AREF pin, possibly damaging the microcontroller on your Arduino board. +

    +

    Alternatively, you can connect the external reference voltage to the AREF pin through a 5K resistor, allowing you to switch between external and internal reference voltages. Note that the resistor will alter the voltage that gets used as the reference because there is an internal 32K resistor on the AREF pin. The two act as a voltage divider, so, for example, 2.5V applied through the resistor will yield 2.5 * 32 / (32 + 5) = ~2.2V at the AREF pin. +

    +

    See also

    +

    Reference Home +

    +

    Corrections, suggestions, and new documentation should be posted to the Forum. +

    +

    The text of the Arduino reference is licensed under a +Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. +

    +
    + + + + + + + +
    + + + +
    + + diff --git a/arduino-0022-linux-x64/reference/AnalogWrite.html b/arduino-0022-linux-x64/reference/AnalogWrite.html new file mode 100644 index 0000000..cd8b688 --- /dev/null +++ b/arduino-0022-linux-x64/reference/AnalogWrite.html @@ -0,0 +1,195 @@ + + + + Arduino - AnalogWrite + + + + + + + +
    + + + + + + +
    + +
    +

    Reference   Language | Libraries | Comparison | Changes +

    +

    analogWrite()

    +

    Description

    +

    Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite() (or a call to digitalRead() or digitalWrite() on the same pin). The frequency of the PWM signal is approximately 490 Hz. +

    +

    On most Arduino boards (those with the ATmega168 or ATmega328), this function works on pins 3, 5, 6, 9, 10, and 11. On the Arduino Mega, it works on pins 2 through 13. Older Arduino boards with an ATmega8 only support analogWrite() on pins 9, 10, and 11. You do not need to call pinMode() to set the pin as an output before calling analogWrite(). +

    +

    The analogWrite function has nothing whatsoever to do with the analog pins or the analogRead function. +

    +

    Syntax

    +

    analogWrite(pin, value) +

    +

    Parameters

    +

    pin: the pin to write to. +

    +

    value: the duty cycle: between 0 (always off) and 255 (always on). +

    +

    Returns

    +

    nothing +

    +

    Notes and Known Issues

    +

    The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. This is because of interactions with the millis() and delay() functions, which share the same internal timer used to generate those PWM outputs. This will be noticed mostly on low duty-cycle settings (e.g 0 - 10) and may result in a value of 0 not fully turning off the output on pins 5 and 6. +

    +

    Example

    +

    Sets the output to the LED proportional to the value read from the potentiometer. +

    +

     
    +int ledPin = 9;      // LED connected to digital pin 9
    +int analogPin = 3;   // potentiometer connected to analog pin 3
    +int val = 0;         // variable to store the read value
    +
    +void setup()
    +{
    +  pinMode(ledPin, OUTPUT);   // sets the pin as output
    +}
    +
    +void loop()
    +{
    +  val = analogRead(analogPin);   // read the input pin
    +  analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
    +}
    +
    +
    +

    See also

    +

    Reference Home +

    +

    Corrections, suggestions, and new documentation should be posted to the Forum. +

    +

    The text of the Arduino reference is licensed under a +Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. +

    +
    + + + + + + + +
    + + + +
    + + diff --git a/arduino-0022-linux-x64/reference/Arithmetic.html b/arduino-0022-linux-x64/reference/Arithmetic.html new file mode 100644 index 0000000..8d1003b --- /dev/null +++ b/arduino-0022-linux-x64/reference/Arithmetic.html @@ -0,0 +1,183 @@ + + + + Arduino - Arithmetic + + + + + + + +
    + + + + + + +
    + +
    +

    Reference   Language | Libraries | Comparison | Changes +

    +

    Addition, Subtraction, Multiplication, & Division

    +

    Description

    +

    These operators return the sum, difference, product, or quotient (respectively) of the two operands. The operation is conducted using the data type of the operands, so, for example, 9 / 4 gives 2 since 9 and 4 are ints. This also means that the operation can overflow if the result is larger than that which can be stored in the data type (e.g. adding 1 to an int with the value 32,767 gives -32,768). If the operands are of different types, the "larger" type is used for the calculation. +

    +

    If one of the numbers (operands) are of the type float or of type double, floating point math will be used for the calculation. +

    +

    Examples

    +
    +y = y + 3;
    +x = x - 7;
    +i = j * 6;
    +r = r / 5;
    +
    +
    +

    Syntax

    +
    +result = value1 + value2;
    +result = value1 - value2;
    +result = value1 * value2;
    +result = value1 / value2;
    +
    +
    +

    Parameters:

    +

    value1: any variable or constant +

    +

    value2: any variable or constant +

    +

    Programming Tips:

    +
    • Know that integer constants default to int, so some constant calculations may overflow (e.g. 60 * 1000 will yield a negative result). +

    • Choose variable sizes that are large enough to hold the largest results from your calculations +

    • Know at what point your variable will "roll over" and also what happens in the other direction e.g. (0 - 1) OR (0 - - 32768) +

    • For math that requires fractions, use float variables, but be aware of their drawbacks: large size, slow computation speeds +

    • Use the cast operator e.g. (int)myFloat to convert one variable type to another on the fly. +

    Reference Home +

    +

    Corrections, suggestions, and new documentation should be posted to the Forum. +

    +

    The text of the Arduino reference is licensed under a +Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain. +

    +
    + + + + + + + +
    + + + +
    + + diff --git a/arduino-0018-linux-x64/reference/Array.html b/arduino-0022-linux-x64/reference/Array.html similarity index 51% rename from arduino-0018-linux-x64/reference/Array.html rename to arduino-0022-linux-x64/reference/Array.html index 01382b4..fb6afdc 100644 --- a/arduino-0018-linux-x64/reference/Array.html +++ b/arduino-0022-linux-x64/reference/Array.html @@ -1,51 +1,122 @@ - + Arduino - Array - + + + +
    -
  • aPeA&?MLO`Xu~6$u-&f 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 [, [, ] ...] ; # are quoted strings -# desc = ; # quoted string -# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | -# avr910 | butterfly | usbasp | -# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | -# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | -# dragon_hvsp; # programmer type -# baudrate = ; # baudrate for avr910-programmer -# vcc = [, ... ] ; # pin number(s) -# reset = ; # pin number -# sck = ; # pin number -# mosi = ; # pin number -# miso = ; # pin number -# errled = ; # pin number -# rdyled = ; # pin number -# pgmled = ; # pin number -# vfyled = ; # pin number -# ; -# -# part -# id = ; # quoted string -# desc = ; # quoted string -# has_jtag = ; # part has JTAG i/f -# has_debugwire = ; # part has debugWire i/f -# devicecode = ; # deprecated, use stk500_devcode -# stk500_devcode = ; # numeric -# avr910_devcode = ; # numeric -# signature = ; # signature bytes -# chip_erase_delay = ; # micro-seconds -# reset = dedicated | io; -# retry_pulse = reset | sck; -# pgm_enable = ; -# chip_erase = ; -# chip_erase_delay = ; # chip erase delay (us) -# # STK500 parameters (parallel programming IO lines) -# pagel = ; # pin name in hex, i.e., 0xD7 -# bs2 = ; # pin name in hex, i.e., 0xA0 -# serial = ; # can use serial downloading -# parallel = ; # can use par. programming -# # STK500v2 parameters, to be taken from Atmel's XML files -# timeout = ; -# stabdelay = ; -# cmdexedelay = ; -# synchloops = ; -# bytedelay = ; -# pollvalue = ; -# pollindex = ; -# predelay = ; -# postdelay = ; -# pollmethod = ; -# mode = ; -# delay = ; -# blocksize = ; -# readsize = ; -# hvspcmdexedelay = ; -# # STK500v2 HV programming parameters, from XML -# pp_controlstack = , , ...; # PP only -# hvsp_controlstack = , , ...; # HVSP only -# hventerstabdelay = ; -# progmodedelay = ; # PP only -# latchcycles = ; -# togglevtg = ; -# poweroffdelay = ; -# resetdelayms = ; -# resetdelayus = ; -# hvleavestabdelay = ; -# resetdelay = ; -# synchcycles = ; # HVSP only -# chiperasepulsewidth = ; # PP only -# chiperasepolltimeout = ; -# chiperasetime = ; # HVSP only -# programfusepulsewidth = ; # PP only -# programfusepolltimeout = ; -# programlockpulsewidth = ; # PP only -# programlockpolltimeout = ; -# # JTAG ICE mkII parameters, also from XML files -# allowfullpagebitstream = ; -# enablepageprogramming = ; -# idr = ; # IO addr of IDR (OCD) reg. -# rampz = ; # IO addr of RAMPZ reg. -# spmcr = ; # mem addr of SPMC[S]R reg. -# eecr = ; # mem addr of EECR reg. -# # (only when != 0x3c) -# -# memory -# paged = ; # yes / no -# size = ; # bytes -# page_size = ; # bytes -# num_pages = ; # numeric -# min_write_delay = ; # micro-seconds -# max_write_delay = ; # micro-seconds -# readback_p1 = ; # byte value -# readback_p2 = ; # byte value -# pwroff_after_write = ; # yes / no -# read = ; -# write = ; -# read_lo = ; -# read_hi = ; -# write_lo = ; -# write_hi = ; -# loadpage_lo = ; -# loadpage_hi = ; -# writepage = ; -# ; -# ; -# -# If any of the above parameters are not specified, the default value -# of 0 is used for numerics or the empty string ("") for string -# values. If a required parameter is left empty, AVRDUDE will -# complain. -# -# NOTES: -# * 'devicecode' is the device code used by the STK500 (see codes -# listed below) -# * Not all memory types will implement all instructions. -# * AVR Fuse bits and Lock bits are implemented as a type of memory. -# * Example memory types are: -# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high -# fuse), "signature", "calibration", "lock" -# * The memory type specified on the avrdude command line must match -# one of the memory types defined for the specified chip. -# * The pwroff_after_write flag causes avrdude to attempt to -# power the device off and back on after an unsuccessful write to -# the affected memory area if VCC programmer pins are defined. If -# VCC pins are not defined for the programmer, a message -# indicating that the device needs a power-cycle is printed out. -# This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: -# -# http://www.atmel.com/atmel/acrobat/doc1280.pdf -# -# INSTRUCTION FORMATS -# -# Instruction formats are specified as a comma seperated list of -# string values containing information (bit specifiers) about each -# of the 32 bits of the instruction. Bit specifiers may be one of -# the following formats: -# -# '1' = the bit is always set on input as well as output -# -# '0' = the bit is always clear on input as well as output -# -# 'x' = the bit is ignored on input and output -# -# 'a' = the bit is an address bit, the bit-number matches this bit -# specifier's position within the current instruction byte -# -# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 -# is address bit 12 on input, a0 is address bit 0. -# -# 'i' = the bit is an input data bit -# -# 'o' = the bit is an output data bit -# -# Each instruction must be composed of 32 bit specifiers. The -# instruction specification closely follows the instruction data -# provided in Atmel's data sheets for their parts. -# -# See below for some examples. -# -# -# The following are STK500 part device codes to use for the -# "devicecode" field of the part. These came from Atmel's software -# section avr061.zip which accompanies the application note -# AVR061 available from: -# -# http://www.atmel.com/atmel/acrobat/doc2525.pdf -# - -#define ATTINY10 0x10 -#define ATTINY11 0x11 -#define ATTINY12 0x12 -#define ATTINY15 0x13 -#define ATTINY13 0x14 - -#define ATTINY22 0x20 -#define ATTINY26 0x21 -#define ATTINY28 0x22 -#define ATTINY2313 0x23 - -#define AT90S1200 0x33 - -#define AT90S2313 0x40 -#define AT90S2323 0x41 -#define AT90S2333 0x42 -#define AT90S2343 0x43 - -#define AT90S4414 0x50 -#define AT90S4433 0x51 -#define AT90S4434 0x52 -#define ATMEGA48 0x59 - -#define AT90S8515 0x60 -#define AT90S8535 0x61 -#define AT90C8534 0x62 -#define ATMEGA8515 0x63 -#define ATMEGA8535 0x64 - -#define ATMEGA8 0x70 -#define ATMEGA88 0x73 -#define ATMEGA168 0x86 - -#define ATMEGA161 0x80 -#define ATMEGA163 0x81 -#define ATMEGA16 0x82 -#define ATMEGA162 0x83 -#define ATMEGA169 0x84 - -#define ATMEGA323 0x90 -#define ATMEGA32 0x91 - -#define ATMEGA64 0xA0 - -#define ATMEGA103 0xB1 -#define ATMEGA128 0xB2 -#define AT90CAN128 0xB3 - -#define AT86RF401 0xD0 - -#define AT89START 0xE0 -#define AT89S51 0xE0 -#define AT89S52 0xE1 - -# The following table lists the devices in the original AVR910 -# appnote: -# |Device |Signature | Code | -# +-------+----------+------+ -# |tiny12 | 1E 90 05 | 0x55 | -# |tiny15 | 1E 90 06 | 0x56 | -# | | | | -# | S1200 | 1E 90 01 | 0x13 | -# | | | | -# | S2313 | 1E 91 01 | 0x20 | -# | S2323 | 1E 91 02 | 0x48 | -# | S2333 | 1E 91 05 | 0x34 | -# | S2343 | 1E 91 03 | 0x4C | -# | | | | -# | S4414 | 1E 92 01 | 0x28 | -# | S4433 | 1E 92 03 | 0x30 | -# | S4434 | 1E 92 02 | 0x6C | -# | | | | -# | S8515 | 1E 93 01 | 0x38 | -# | S8535 | 1E 93 03 | 0x68 | -# | | | | -# |mega32 | 1E 95 01 | 0x72 | -# |mega83 | 1E 93 05 | 0x65 | -# |mega103| 1E 97 01 | 0x41 | -# |mega161| 1E 94 01 | 0x60 | -# |mega163| 1E 94 02 | 0x64 | - -# Appnote AVR109 also has a table of AVR910 device codes, which -# lists: -# dev avr910 signature -# ATmega8 0x77 0x1E 0x93 0x07 -# ATmega8515 0x3B 0x1E 0x93 0x06 -# ATmega8535 0x6A 0x1E 0x93 0x08 -# ATmega16 0x75 0x1E 0x94 0x03 -# ATmega162 0x63 0x1E 0x94 0x04 -# ATmega163 0x66 0x1E 0x94 0x02 -# ATmega169 0x79 0x1E 0x94 0x05 -# ATmega32 0x7F 0x1E 0x95 0x02 -# ATmega323 0x73 0x1E 0x95 0x01 -# ATmega64 0x46 0x1E 0x96 0x02 -# ATmega128 0x44 0x1E 0x97 0x02 -# -# These codes refer to "BOOT" device codes which are apparently -# different than standard device codes, for whatever reasons -# (often one above the standard code). - -# There are several extended versions of AVR910 implementations around -# in the Internet. These add the following codes (only devices that -# actually exist are listed): - -# ATmega8515 0x3A -# ATmega128 0x43 -# ATmega64 0x45 -# ATtiny26 0x5E -# ATmega8535 0x69 -# ATmega32 0x72 -# ATmega16 0x74 -# ATmega8 0x76 -# ATmega169 0x78 - -# -# Overall avrdude defaults -# -default_parallel = "/dev/parport0"; -default_serial = "/dev/ttyS0"; - - -# -# PROGRAMMER DEFINITIONS -# - -programmer - id = "avrisp"; - desc = "Atmel AVR ISP"; - type = stk500; -; - -programmer - id = "avrispv2"; - desc = "Atmel AVR ISP V2"; - type = stk500v2; -; - -programmer - id = "avrispmkII"; - desc = "Atmel AVR ISP mkII"; - type = stk500v2; -; - -programmer - id = "avrisp2"; - desc = "Atmel AVR ISP mkII"; - type = stk500v2; -; - -# This is supposed to be the "default" STK500 entry. -# Attempts to select the correct firmware version -# by probing for it. Better use one of the entries -# below instead. -programmer - id = "stk500"; - desc = "Atmel STK500"; - type = stk500generic; -; - -programmer - id = "stk500v1"; - desc = "Atmel STK500 Version 1.x firmware"; - type = stk500; -; - -programmer - id = "stk500v2"; - desc = "Atmel STK500 Version 2.x firmware"; - type = stk500v2; -; - -programmer - id = "stk500pp"; - desc = "Atmel STK500 V2 in parallel programming mode"; - type = stk500pp; -; - -programmer - id = "stk500hvsp"; - desc = "Atmel STK500 V2 in high-voltage serial programming mode"; - type = stk500hvsp; -; - -programmer - id = "avr910"; - desc = "Atmel Low Cost Serial Programmer"; - type = avr910; -; - -programmer - id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; - type = usbasp; -; - -#programmer -# id = "usbtiny"; -# desc = "USBtiny simple USB programmer"; -# type = usbtiny; -#; - -programmer - id = "butterfly"; - desc = "Atmel Butterfly Development Board"; - type = butterfly; -; - -programmer - id = "avr109"; - desc = "Atmel AppNote AVR109 Boot Loader"; - type = butterfly; -; - -programmer - id = "avr911"; - desc = "Atmel AppNote AVR911 AVROSP"; - type = butterfly; -; - -programmer - id = "jtagmkI"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 115200; # default is 115200 - type = jtagmki; -; - -# easier to type -programmer - id = "jtag1"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 115200; # default is 115200 - type = jtagmki; -; - -# easier to type -programmer - id = "jtag1slow"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 19200; - type = jtagmki; -; - -programmer - id = "jtagmkII"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 19200; # default is 19200 - type = jtagmkii; -; - -# easier to type -programmer - id = "jtag2slow"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 19200; # default is 19200 - type = jtagmkii; -; - -# JTAG ICE mkII @ 115200 Bd -programmer - id = "jtag2fast"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 115200; - type = jtagmkii; -; - -# make the fast one the default, people will love that -programmer - id = "jtag2"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 115200; - type = jtagmkii; -; - -# JTAG ICE mkII in ISP mode -programmer - id = "jtag2isp"; - desc = "Atmel JTAG ICE mkII in ISP mode"; - baudrate = 115200; - type = jtagmkii_isp; -; - -# JTAG ICE mkII in debugWire mode -programmer - id = "jtag2dw"; - desc = "Atmel JTAG ICE mkII in debugWire mode"; - baudrate = 115200; - type = jtagmkii_dw; -; - -# AVR Dragon in JTAG mode -programmer - id = "dragon_jtag"; - desc = "Atmel AVR Dragon in JTAG mode"; - baudrate = 115200; - type = dragon_jtag; -; - -# AVR Dragon in ISP mode -programmer - id = "dragon_isp"; - desc = "Atmel AVR Dragon in ISP mode"; - baudrate = 115200; - type = dragon_isp; -; - -# AVR Dragon in PP mode -programmer - id = "dragon_pp"; - desc = "Atmel AVR Dragon in PP mode"; - baudrate = 115200; - type = dragon_pp; -; - -# AVR Dragon in HVSP mode -programmer - id = "dragon_hvsp"; - desc = "Atmel AVR Dragon in HVSP mode"; - baudrate = 115200; - type = dragon_hvsp; -; - -# AVR Dragon in debugWire mode -programmer - id = "dragon_dw"; - desc = "Atmel AVR Dragon in debugWire mode"; - baudrate = 115200; - type = dragon_dw; -; - -programmer - id = "pavr"; - desc = "Jason Kyle's pAVR Serial Programmer"; - type = avr910; -; - -# Parallel port programmers. - -programmer - id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; - type = par; - vcc = 2, 3, 4, 5; - reset = 7; - sck = 8; - mosi = 9; - miso = 10; -; - -programmer - id = "stk200"; - desc = "STK200"; - type = par; - buff = 4, 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; -; - -# The programming dongle used by the popular Ponyprog -# utility. It is almost similar to the STK200 one, -# except that there is a LED indicating that the -# programming is currently in progress. - -programmer - id = "pony-stk200"; - desc = "Pony Prog STK200"; - type = par; - buff = 4, 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; - pgmled = 8; -; - -programmer - id = "dt006"; - desc = "Dontronics DT006"; - type = par; - reset = 4; - sck = 5; - mosi = 2; - miso = 11; -; - -programmer - id = "bascom"; - desc = "Bascom SAMPLE programming cable"; - type = par; - reset = 4; - sck = 5; - mosi = 2; - miso = 11; -; - -programmer - id = "alf"; - desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; - type = par; - vcc = 2, 3, 4, 5; - buff = 6; - reset = 7; - sck = 8; - mosi = 9; - miso = 10; - errled = 1; - rdyled = 14; - pgmled = 16; - vfyled = 17; -; - -programmer - id = "sp12"; - desc = "Steve Bolt's Programmer"; - type = par; - vcc = 4,5,6,7,8; - reset = 3; - sck = 2; - mosi = 9; - miso = 11; -; - -programmer - id = "picoweb"; - desc = "Picoweb Programming Cable, http://www.picoweb.net/"; - type = par; - reset = 2; - sck = 3; - mosi = 4; - miso = 13; -; - -programmer - id = "abcmini"; - desc = "ABCmini Board, aka Dick Smith HOTCHIP"; - type = par; - reset = 4; - sck = 3; - mosi = 2; - miso = 10; -; - -programmer - id = "futurlec"; - desc = "Futurlec.com programming cable."; - type = par; - reset = 3; - sck = 2; - mosi = 1; - miso = 10; -; - - -# From the contributor of the "xil" jtag cable: -# The "vcc" definition isn't really vcc (the cable gets its power from -# the programming circuit) but is necessary to switch one of the -# buffer lines (trying to add it to the "buff" lines doesn't work). -# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK -# to SCK (plus vcc/gnd of course) -programmer - id = "xil"; - desc = "Xilinx JTAG cable"; - type = par; - mosi = 2; - sck = 3; - reset = 4; - buff = 5; - miso = 13; - vcc = 6; -; - - -programmer - id = "dapa"; - desc = "Direct AVR Parallel Access cable"; - type = par; - vcc = 3; - reset = 16; - sck = 1; - mosi = 2; - miso = 11; -; - -programmer - id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; - type = par; - reset = ~6; - sck = ~8; - mosi = ~7; - miso = ~10; -; - -programmer - id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; - type = par; - reset = ~4; - sck = 3; - mosi = 2; - miso = 10; -; - -programmer - id = "blaster"; - desc = "Altera ByteBlaster"; - type = par; - sck = 2; - miso = 11; - reset = 3; - mosi = 8; - buff = 14; -; - -# It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) -programmer - id = "frank-stk200"; - desc = "Frank STK200"; - type = par; - vcc = 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; - pgmled = 8; -; - - -# -# some ultra cheap programmers use bitbanging on the -# serialport. -# -# PC - DB9 - Pins for RS232: -# -# GND 5 -- |O -# | O| <- 9 RI -# DTR 4 <- |O | -# | O| <- 8 CTS -# TXD 3 <- |O | -# | O| -> 7 RTS -# RXD 2 -> |O | -# | O| <- 6 DSR -# DCD 1 -> |O -# -# Using RXD is currently not supported. -# Using RI is not supported under Win32 but is supported under Posix. - -# serial ponyprog design (dasa2 in uisp) -# reset=!txd sck=rts mosi=dtr miso=cts - -programmer - id = "ponyser"; - desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; - type = serbb; - reset = ~3; - sck = 7; - mosi = 4; - miso = 8; -; - -# Same as above, different name -# reset=!txd sck=rts mosi=dtr miso=cts - -programmer - id = "siprog"; - desc = "Lancos SI-Prog "; - type = serbb; - reset = ~3; - sck = 7; - mosi = 4; - miso = 8; -; - -# unknown (dasa in uisp) -# reset=rts sck=dtr mosi=txd miso=cts - -programmer - id = "dasa"; - desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; - type = serbb; - reset = 7; - sck = 4; - mosi = 3; - miso = 8; -; - -# unknown (dasa3 in uisp) -# reset=!dtr sck=rts mosi=txd miso=cts - -programmer - id = "dasa3"; - desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; - type = serbb; - reset = ~4; - sck = 7; - mosi = 3; - miso = 8; -; - -# -# PART DEFINITIONS -# - -#------------------------------------------------------------ -# ATtiny11 -#------------------------------------------------------------ - -# This is an HVSP-only device. - -part - id = "t11"; - desc = "ATtiny11"; - stk500_devcode = 0x11; - signature = 0x1e 0x90 0x04; - chip_erase_delay = 20000; - - timeout = 200; - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - blocksize = 64; - readsize = 256; - delay = 5; - ; - - memory "flash" - size = 1024; - blocksize = 128; - readsize = 256; - delay = 3; - ; - - memory "signature" - size = 3; - ; - - memory "lock" - size = 1; - ; - - memory "calibration" - size = 1; - ; - - memory "fuse" - size = 1; - ; -; - -#------------------------------------------------------------ -# ATtiny12 -#------------------------------------------------------------ - -part - id = "t12"; - desc = "ATtiny12"; - stk500_devcode = 0x12; - avr910_devcode = 0x55; - signature = 0x1e 0x90 0x05; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 8; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - size = 1024; - min_write_delay = 4500; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -; - -#------------------------------------------------------------ -# ATtiny13 -#------------------------------------------------------------ - -part - id = "t13"; - desc = "ATtiny13"; - has_debugwire = yes; - flash_instr = 0xB4, 0x0E, 0x1E; - eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x14; - signature = 0x1e 0x90 0x07; - chip_erase_delay = 4000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 90; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 1024; - page_size = 32; - num_pages = 32; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny15 -#------------------------------------------------------------ - -part - id = "t15"; - desc = "ATtiny15"; - stk500_devcode = 0x13; - avr910_devcode = 0x56; - signature = 0x1e 0x90 0x06; - chip_erase_delay = 8200; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 5; - synchcycles = 6; - latchcycles = 16; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - min_write_delay = 8200; - max_write_delay = 8200; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - size = 1024; - min_write_delay = 4100; - max_write_delay = 4100; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x o o o o x x o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x i i i i 1 1 i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -; - -#------------------------------------------------------------ -# AT90s1200 -#------------------------------------------------------------ - -part - id = "1200"; - desc = "AT90S1200"; - stk500_devcode = 0x33; - avr910_devcode = 0x13; - signature = 0x1e 0x90 0x01; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 1; - bytedelay = 0; - pollindex = 0; - pollvalue = 0xFF; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 64; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 32; - readsize = 256; - ; - memory "flash" - size = 1024; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x02; - delay = 15; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s4414 -#------------------------------------------------------------ - -part - id = "4414"; - desc = "AT90S4414"; - stk500_devcode = 0x50; - avr910_devcode = 0x28; - signature = 0x1e 0x92 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s2313 -#------------------------------------------------------------ - -part - id = "2313"; - desc = "AT90S2313"; - stk500_devcode = 0x40; - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 128; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 2048; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s2333 -#------------------------------------------------------------ - -part - id = "2333"; -##### WARNING: No XML file for device 'AT90S2333'! ##### - desc = "AT90S2333"; - stk500_devcode = 0x42; - avr910_devcode = 0x34; - signature = 0x1e 0x91 0x05; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - ; - memory "flash" - size = 2048; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - pwroff_after_write = yes; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - - -#------------------------------------------------------------ -# AT90s2343 (also AT90s2323 and ATtiny22) -#------------------------------------------------------------ - -part - id = "2343"; - desc = "AT90S2343"; - stk500_devcode = 0x43; - avr910_devcode = 0x4c; - signature = 0x1e 0x91 0x03; - chip_erase_delay = 18000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 0; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 2048; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 128; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o o x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o o x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - - -#------------------------------------------------------------ -# AT90s4433 -#------------------------------------------------------------ - -part - id = "4433"; - desc = "AT90S4433"; - stk500_devcode = 0x51; - avr910_devcode = 0x30; - signature = 0x1e 0x92 0x03; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - pwroff_after_write = yes; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s4434 -#------------------------------------------------------------ - -part - id = "4434"; -##### WARNING: No XML file for device 'AT90S4434'! ##### - desc = "AT90S4434"; - stk500_devcode = 0x52; - avr910_devcode = 0x6c; - signature = 0x1e 0x92 0x02; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s8515 -#------------------------------------------------------------ - -part - id = "8515"; - desc = "AT90S8515"; - stk500_devcode = 0x60; - avr910_devcode = 0x38; - signature = 0x1e 0x93 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 512; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 8192; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s8535 -#------------------------------------------------------------ - -part - id = "8535"; - desc = "AT90S8535"; - stk500_devcode = 0x61; - avr910_devcode = 0x68; - signature = 0x1e 0x93 0x03; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 8192; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x x o"; - write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o x x x x x x"; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# ATmega103 -#------------------------------------------------------------ - -part - id = "m103"; - desc = "ATMEGA103"; - stk500_devcode = 0xB1; - avr910_devcode = 0x41; - signature = 0x1e 0x97 0x01; - chip_erase_delay = 112000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, - 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, - 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, - 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 10; - - memory "eeprom" - size = 4096; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 22000; - max_write_delay = 56000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x11; - delay = 70; - blocksize = 256; - readsize = 256; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o x o 1 o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega64 -#------------------------------------------------------------ - -part - id = "m64"; - desc = "ATMEGA64"; - has_jtag = yes; - stk500_devcode = 0xA0; - avr910_devcode = 0x45; - signature = 0x1e 0x96 0x02; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x22; - spmcr = 0x68; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - - -#------------------------------------------------------------ -# ATmega128 -#------------------------------------------------------------ - -part - id = "m128"; - desc = "ATMEGA128"; - has_jtag = yes; - stk500_devcode = 0xB2; - avr910_devcode = 0x43; - signature = 0x1e 0x97 0x02; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x22; - spmcr = 0x68; - rampz = 0x3b; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90CAN128 -#------------------------------------------------------------ - -part - id = "c128"; - desc = "AT90CAN128"; - has_jtag = yes; - stk500_devcode = 0xB3; -# avr910_devcode = 0x43; - signature = 0x1e 0x97 0x81; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - eecr = 0x3f; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega16 -#------------------------------------------------------------ - -part - id = "m16"; - desc = "ATMEGA16"; - has_jtag = yes; - stk500_devcode = 0x82; - avr910_devcode = 0x74; - signature = 0x1e 0x94 0x03; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 100; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "calibration" - size = 4; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega164P -#------------------------------------------------------------ - -# close to ATmega16 - -part - id = "m164p"; - desc = "ATMEGA164P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x94 0x0a; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega324P -#------------------------------------------------------------ - -# similar to ATmega164P - -part - id = "m324p"; - desc = "ATMEGA324P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x95 0x08; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega644 -#------------------------------------------------------------ - -# similar to ATmega164 - -part - id = "m644"; - desc = "ATMEGA644"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x96 0x09; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega644P -#------------------------------------------------------------ - -# similar to ATmega164p - -part - id = "m644p"; - desc = "ATMEGA644P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x96 0x0a; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - - -#------------------------------------------------------------ -# ATmega162 -#------------------------------------------------------------ - -part - id = "m162"; - desc = "ATMEGA162"; - has_jtag = yes; - stk500_devcode = 0x83; - avr910_devcode = 0x63; - signature = 0x1e 0x94 0x04; - chip_erase_delay = 9000; - pagel = 0xd7; - bs2 = 0xa0; - - idr = 0x04; - spmcr = 0x57; - allowfullpagebitstream = yes; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - - ; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 4; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; -; - - - -#------------------------------------------------------------ -# ATmega163 -#------------------------------------------------------------ - -part - id = "m163"; - desc = "ATMEGA163"; - stk500_devcode = 0x81; - avr910_devcode = 0x64; - signature = 0x1e 0x94 0x02; - chip_erase_delay = 32000; - pagel = 0xd7; - bs2 = 0xa0; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 30; - programfusepulsewidth = 0; - programfusepolltimeout = 2; - programlockpulsewidth = 0; - programlockpolltimeout = 2; - - - memory "eeprom" - size = 512; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 16000; - max_write_delay = 16000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o x x o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i 1 1 i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x 1 o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x 0 x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega169 -#------------------------------------------------------------ - -part - id = "m169"; - desc = "ATMEGA169"; - has_jtag = yes; - stk500_devcode = 0x85; - avr910_devcode = 0x78; - signature = 0x1e 0x94 0x05; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega329 -#------------------------------------------------------------ - -part - id = "m329"; - desc = "ATMEGA329"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x95 0x03; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega3290 -#------------------------------------------------------------ - -# identical to ATmega329 - -part - id = "m3290"; - desc = "ATMEGA3290"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x95 0x04; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a3 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega649 -#------------------------------------------------------------ - -part - id = "m649"; - desc = "ATMEGA649"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x96 0x03; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega6490 -#------------------------------------------------------------ - -# identical to ATmega649 - -part - id = "m6490"; - desc = "ATMEGA6490"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x96 0x04; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega32 -#------------------------------------------------------------ - -part - id = "m32"; - desc = "ATMEGA32"; - has_jtag = yes; - stk500_devcode = 0x91; - avr910_devcode = 0x72; - signature = 0x1e 0x95 0x02; - chip_erase_delay = 9000; - pagel = 0xd7; - bs2 = 0xa0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega161 -#------------------------------------------------------------ - -part - id = "m161"; - desc = "ATMEGA161"; - stk500_devcode = 0x80; - avr910_devcode = 0x60; - signature = 0x1e 0x94 0x01; - chip_erase_delay = 28000; - pagel = 0xd7; - bs2 = 0xa0; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 30; - programfusepulsewidth = 0; - programfusepolltimeout = 2; - programlockpulsewidth = 0; - programlockpolltimeout = 2; - - memory "eeprom" - size = 512; - min_write_delay = 3400; - max_write_delay = 3400; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 14000; - max_write_delay = 14000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 16; - blocksize = 128; - readsize = 256; - ; - - memory "fuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x o x o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x 1 i 1 i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega8 -#------------------------------------------------------------ - -part - id = "m8"; - desc = "ATMEGA8"; - stk500_devcode = 0x70; - avr910_devcode = 0x76; - signature = 0x1e 0x93 0x07; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 10000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - -#------------------------------------------------------------ -# ATmega8515 -#------------------------------------------------------------ - -part - id = "m8515"; - desc = "ATMEGA8515"; - stk500_devcode = 0x63; - avr910_devcode = 0x3A; - signature = 0x1e 0x93 0x06; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - - -#------------------------------------------------------------ -# ATmega8535 -#------------------------------------------------------------ - -part - id = "m8535"; - desc = "ATMEGA8535"; - stk500_devcode = 0x64; - avr910_devcode = 0x69; - signature = 0x1e 0x93 0x08; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATtiny26 -#------------------------------------------------------------ - -part - id = "t26"; - desc = "ATTINY26"; - stk500_devcode = 0x21; - avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x09; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 16; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x x x x i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny261 -#------------------------------------------------------------ -# Close to ATtiny26 - -part - id = "t261"; - desc = "ATTINY261"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x0c; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 128; - page_size = 4; - num_pages = 32; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny461 -#------------------------------------------------------------ -# Close to ATtiny261 - -part - id = "t461"; - desc = "ATTINY461"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x92 0x08; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 256; - page_size = 4; - num_pages = 64; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny861 -#------------------------------------------------------------ -# Close to ATtiny461 - -part - id = "t861"; - desc = "ATTINY861"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x93 0x0d; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 512; - num_pages = 128; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATmega48 -#------------------------------------------------------------ - -part - id = "m48"; - desc = "ATMEGA48"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x59; -# avr910_devcode = 0x; - signature = 0x1e 0x92 0x05; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 45000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 256; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x x", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega88 -#------------------------------------------------------------ - -part - id = "m88"; - desc = "ATMEGA88"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x73; -# avr910_devcode = 0x; - signature = 0x1e 0x93 0x0a; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 512; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega168 -#------------------------------------------------------------ - -part - id = "m168"; - desc = "ATMEGA168"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x86; - # avr910_devcode = 0x; - signature = 0x1e 0x94 0x06; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 512; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; -; - -#------------------------------------------------------------ -# ATmega328 -#------------------------------------------------------------ - -part - id = "m328p"; - desc = "ATMEGA328P"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x86; - # avr910_devcode = 0x; - signature = 0x1e 0x95 0x0F; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 1024; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; -; - #------------------------------------------------------------ -# ATtiny2313 -#------------------------------------------------------------ - -part - id = "t2313"; - desc = "ATtiny2313"; - has_debugwire = yes; - flash_instr = 0xB2, 0x0F, 0x1F; - eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x23; -## Use the ATtiny26 devcode: - avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x0a; - pagel = 0xD4; - bs2 = 0xD6; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, - 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, - 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, - 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - -# The information in the data sheet of April/2004 is wrong, this works: - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - -# The information in the data sheet of April/2004 is wrong, this works: - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - -# The information in the data sheet of April/2004 is wrong, this works: - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. -# The information in the data sheet of April/2004 is wrong, this works: - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM2 -#------------------------------------------------------------ - -part - id = "pwm2"; - desc = "AT90PWM2"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x81; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; -# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM3 -#------------------------------------------------------------ - -# Completely identical to AT90PWM2 (including the signature!) - -part - id = "pwm3"; - desc = "AT90PWM3"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x81; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; -# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM2B -#------------------------------------------------------------ -# Same as AT90PWM2 but different signature. - -part - id = "pwm2b"; - desc = "AT90PWM2B"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x83; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM3B -#------------------------------------------------------------ - -# Completely identical to AT90PWM2B (including the signature!) - -part - id = "pwm3b"; - desc = "AT90PWM3B"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x83; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny25 -#------------------------------------------------------------ - -part - id = "t25"; - desc = "ATtiny25"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x08; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny45 -#------------------------------------------------------------ - -part - id = "t45"; - desc = "ATtiny45"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x92 0x06; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 256; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny85 -#------------------------------------------------------------ - -part - id = "t85"; - desc = "ATtiny85"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x93 0x0b; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega640 -#------------------------------------------------------------ -# Almost same as ATmega1280, except for different memory sizes - -part - id = "m640"; - desc = "ATMEGA640"; - signature = 0x1e 0x96 0x08; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega1280 -#------------------------------------------------------------ - -part - id = "m1280"; - desc = "ATMEGA1280"; - signature = 0x1e 0x97 0x03; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega1281 -#------------------------------------------------------------ -# Identical to ATmega1280 - -part - id = "m1281"; - desc = "ATMEGA1281"; - signature = 0x1e 0x97 0x04; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega2560 -#------------------------------------------------------------ - -part - id = "m2560"; - desc = "ATMEGA2560"; - signature = 0x1e 0x98 0x01; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 262144; - page_size = 256; - num_pages = 1024; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - load_ext_addr = " 0 1 0 0 1 1 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 a16", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega2561 -#------------------------------------------------------------ - -part - id = "m2561"; - desc = "ATMEGA2561"; - signature = 0x1e 0x98 0x02; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 262144; - page_size = 256; - num_pages = 1024; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - load_ext_addr = " 0 1 0 0 1 1 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 a16", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny24 -#------------------------------------------------------------ - -part - id = "t24"; - desc = "ATtiny24"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x0b; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny44 -#------------------------------------------------------------ - -part - id = "t44"; - desc = "ATtiny44"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x92 0x07; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 256; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny84 -#------------------------------------------------------------ - -part - id = "t84"; - desc = "ATtiny84"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x93 0x0c; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB646 -#------------------------------------------------------------ - -part - id = "usb646"; - desc = "AT90USB646"; -# signature = 0x1e 0x96 0x82; ? - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB647 -#------------------------------------------------------------ -# identical to AT90USB646 - -part - id = "usb647"; - desc = "AT90USB647"; -# signature = 0x1e 0x96 0x82; ? - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB1286 -#------------------------------------------------------------ - -part - id = "usb1286"; - desc = "AT90USB1286"; - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB1287 -#------------------------------------------------------------ -# identical to AT90USB1286 - -part - id = "usb1287"; - desc = "AT90USB1287"; - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega325 -#------------------------------------------------------------ - -part - id = "m325"; - desc = "ATMEGA325"; - signature = 0x1e 0x95 0x05; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega645 -#------------------------------------------------------------ - -part - id = "m645"; - desc = "ATMEGA645"; - signature = 0x1E 0x96 0x05; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega3250 -#------------------------------------------------------------ - -part - id = "m3250"; - desc = "ATMEGA3250"; - signature = 0x1E 0x95 0x06; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega6450 -#------------------------------------------------------------ - -part - id = "m6450"; - desc = "ATMEGA6450"; - signature = 0x1E 0x96 0x06; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; diff --git a/arduino-0018-linux-x64/lib/antlr.jar b/arduino-0018-linux-x64/lib/antlr.jar deleted file mode 100644 index 42f25e5407012bc8fe5a18fda9fa5b2e326833fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 443876 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