Giter Club home page Giter Club logo

ariadne-bootloader's Introduction

PayPayl donate button

Bootloader for Arduino with Ethernet

This is a beta stage bootloader for Arduino Ethernet board and the regular Arduino with Ethernet Shield. It is based on previous unfinished work by the Arduino developers. The bootloader implements a TFTP server on the Arduino board and flashing works using any regular TFTP client.

The Files and Folders in this Repository

The structure of this repository is made to follow the standarts of the Arduino IDE. This way you can simply copy the folders in your sketchbook and be ready

  • hardware: This is where the bootloader resides.
  • java-client: Demo client for the bootloader. Inherited by the initial project. Untested and probably non-functional
  • libraries: Helper libraries to support functions of the bootloader
  • utilities: Various stuff used for development and debugging

Downloading and Installing Files

First of all, you need to clone or download the repository. To clone the repository you need to have git installed, then you can run git clone https://github.com/codebendercc/Ariadne-Bootloader.git in a directory. This way you can later update your local repository by running git pull inside the Ariadne-Bootloader directory.

In case you want to avoid this hassle, you can use the ZIP button at the top of the page to download the latest snapshot of the repository in a zip archive and extract it.

After that you have to copy the hardware and libraries folders inside your sketchbook folder. Take extra care during coping not to overwrite any other files. Restart the Arduino IDE to load the new boards and libraries.

Installing the Bootloader

To burn the bootloader, you will need an ISP(in-system programmer) like [AVR-ISP][2], [USBtinyISP][3] or you can build a [ParallelProgrammer][4] or an [ArduinoISP][5]. The first three programmers should be connected to the ICSP pins (the 2 by 3 pin header) and make sure you plug it in the right way. The board must be powered by an external power supply or the USB port. In the case of ArduinoISP you should consult the above link for further instructions on how to build and use. [2]: http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2726 [3]: http://www.ladyada.net/make/usbtinyisp/ [4]: http://arduino.cc/en/Hacking/ParallelProgrammer [5]: http://arduino.cc/en/Tutorial/ArduinoISP

After you have connected the Arduino board and the programmer to your computer launch the Arduino IDE. Navigate to the Tools > Board menu and select Arduino Duemilanove/Uno(ATmega328) w/ Ariadne Bootloader if you have an Arduino Duemilanove or Uno with an Ethernet Shield or Arduino Ethernet w/ Ariadne Bootloader for Arduino Ethernet. Then go to Tools > Programmer and select the programmer you are using. In case you are using ArduinoISP, make sure that the selected port in the Tools > Serial Port menu refers to the ArduinoISP and not the board that you want to burn the bootloader on. Now, just launch the Tools > Burn Bootloader command and wait for about 15 seconds for the operation to complete.

In the case of Arduino Mega the previous ISPs do not reliably work because of design differences. To install the bootloader in these boards you will need one of the more expensive models, like [Atmel's AVRISP mkII][6], [Olimex's AVR-ISP-MK2][7] or another similar programmer. If you don't have any compatible programmer but more than one Arduinos available, you can use Nick Gammon's excellent [guide][8] on how to use one to program the other. This method has been reported to work for flashing Ariadne on Arduino Mega. [6]: http://www.atmel.com/tools/AVRISPMKII.aspx [7]: https://www.olimex.com/Products/AVR/Programmers/AVR-ISP-MK2/ [8]: http://www.gammon.com.au/forum/?id=11635

Serial Flashing

Ariadne bootloader supports flashing through serial like any other regular bootloader. This way of uploading is built upon the default bootloaders so it should be pretty straight forward to use. Just plug in the USB cable and select the serial port and the appropriate board from the Tools > Board menu. After that you must press the reset button and the indication LED on pin 13 or pin 9, in case of Arduino Ethernet, will start blinking rapidly. This means that the bootloader is running and the Arduino is ready to be programmed. If there is a valid program already flashed on the Arduino, you have to reprogram the device in the next 10 seconds. If you don't, the bootloader will initiate the program that is already in the Arduino. In case there is no program flashed or the program has been marked as invalid, the bootloader will never time out and you can reprogram it at any time.

After a succesful flashing,

  • Arduino Duemilanove will automatically start the user's application.
  • Arduino Uno will do a reset cycle and start the program after the bootloader times out.
  • Arduino Mega will behave in a similar way as Arduino Uno

This happens because Uno has the autoreset feature that resets the board after a serial connection.

Due to the fact that "autoreset" for remote tftp programming is implemented using a watchdog timer timeout, the bootloader will do a full cycle after every reset, physical or software. For those who miss the Adaboot No-Wait Mod-like functionality, we have been testing some options on how to circumvent these limitations, but they still need refinement.

Default Network Settings

The default built-in network settings of the bootloader are listed below.

`

  • IP Address: 192.168.1.128

  • Subnet Mask: 255.255.255.0

  • Gateway: 192.168.1.1

  • MAC Address: 0xDE.0xAD.0xBE.0xEF.0xFE.0xED

  • TFTP Negotiation Port: 69

  • TFTP Data Port: 46969 `

NOTE: The Arduino Ethernet that were sent as Indiegogo Perks were flashed with different network settings. Their bootloader still defaults to the previous settings but the current values are on the accompaning leaflet.

Configuring Network Settings

These can be changed using our NetEEPROM library. The library is going to have it's own documentation on how it can be used but for the purpose of changing and reading the network settings you can use the included examples. To load them navigate to File > Examples > NetEEPROM and select one of the examples. You can write the network settings using the WriteNetworkSettings sketch or print them to the serial using the ReadNetworkSettings.

Note that the settings array in the WriteNetworkSettings sketch hasn't got the settings in the usual order but rather in the order that Wiznet chips read them, so make sure you have put the correct values. If you set the network settings you also have to set the TFTP data transfer port. The default is good enough but you may need to change it for the reasons that are listed below in the [Configuring your Router for Remote Flashing][9] section. There is also documentation on how use these sketches in the form of comments so be sure to read them. [9]: https://github.com/codebendercc/Ariadne-Bootloader#configuring-your-router-for-remote-flashing

TFTP Flashing

Now for the real reason we made this bootloader and why you should use it. First of all you can watch Ariadne in action in this how-to video for remote flashing using TFTP [here][10]. In the video you may notice that the board is being reset by hand. In the next couple of weeks we are going to release the library that will allow remote resetting through a simple web server with some security measures. More on that as the library progresses. [10]: http://youtu.be/KCHqhV6xPMg

Converting your sketch to the right format

Unlike serial flashing that uses HEX files to flash the Arduino, the TFTP server implemented in the bootloader works with binary files. This means that you have to manually convert your programs to the right format. To do that, first build your sketch inside Arduino IDE using the Verify button. After that, without exiting the Arduino IDE you need to navigate to the temporary directory where your project was built. On all platforms, you can find out the temporary build folder by checking Show verbose output during compilation in Arduino IDE's preferences dialog and the path for the compiled .hex file will be printed in the last line of the compilation output.

Windows

On Windows, the temporary directory can be

C:\Documents and Settings\Administrator\Local Settings\Temp\build5571819468326525374.tmp\Blink.cpp.hex
"C:\Program Files\Arduino\hardware\tools\avr\bin\avr-objcopy.exe" -I ihex
"C:\Documents and Settings\Administrator\Local Settings\Temp\build5571819468326525374.tmp\Blink.cpp.hex"
-O binary Blink.cpp.bin

Linux

OS X

That is C:\Users\owner\AppData\Local\Temp\ on Windows, /tmp on Linux. On MacOS you'll need to go to Arduino's preferences, and check the "Show verbose output during compilation" checkbox. After that, when you compile, you will see the path for the compiled .hex file in the last line of the compilation output.. There you will find a folder named something like build2429295348207572157.tmp. That is where the Arduino temporary build files reside. Enter the directory and make sure that there is a .elf or a .hex file with the same name as your sketch. That is the file you need to convert. To achieve that you have to run one of the following commands in a terminal.

  • avr-objcopy -I ihex [sketch].hex -O binary [sketch].bin

In Windows and MacOS you can find the avr-objcopy program in your Arduino IDE installation folder under hardware/tools/avr/bin/. Or,if you have scons installed, you can use the modified SConstruct script you can find in Ariadne-Bootloader/utilities. This being based on the arscons script, it can be used in two ways. If you used the previous process to generate the HEX file you can just copy the SConstruct file inside the temporary Arduino IDE build directory (as mentioned above) and run scons in a terminal inside that directory.

The other way to use it is to copy the SConstruct script inside the sketch's directory and, as above, run scons in a terminal inside that directory. This way you will build your project outside Arduino IDE creating the .bin file in the process. Note that this way the sketch's folder will be polluted with Arduino's build files, much like the temporary directory Arduino IDE uses.

For testing purposes you can find a blink sketch in binary form inside the Ariadne-Bootloader/utilities/tests/blink folder. The fade sketch in the tests/fade folder will also give you a view of what a failed upload looks like. This sketch fails because it is written in plain C and not in Arduino. That way it lacks some "signatures" the bootloader uses to validate Arduino sketches. The third sketch in tests/led_display is an easter egg for which you need to find out how we had our led matrices connected on Arduino Uno. Or we might release the schematics at some point. Who knows.

Using a tftp client to upload the sketch

Now that the binary is ready, you have to upload it. First you have to connect to your Arduino using any tftp client you may have on your computer. All three major operating systems have their own clients that you can use through the command line.

Windows

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>tftp

Transfers files to and from a remote computer running the TFTP service.

TFTP [-i] host [GET | PUT] source [destination]

  -i              Specifies binary image transfer mode (also called
                  octet). In binary image mode the file is moved
                  literally, byte by byte. Use this mode when
                  transferring binary files.
  host            Specifies the local or remote host.
  GET             Transfers the file destination on the remote host to
                  the file source on the local host.
  PUT             Transfers the file source on the local host to
                  the file destination on the remote host.
  source          Specifies the file to transfer.
  destination     Specifies where to transfer the file.


C:\Documents and Settings\Administrator>tftp -i 192.168.1.128 PUT sketch.bin
tftp: can't read from local file 'sketch.bin'

C:\Documents and Settings\Administrator>tftp -i 192.168.1.128 PUT sketch.bin

Linux

On some Linux distributions, like Fedora/RedHat, before you use tftp, you should load the ip_conntrack_tftp module or the tftp client won't be able to acknowledge(ACK) the incoming packets. That is needed because TFTP is insecure and it is not enabled by default. Other distributions like Arch, don't need this step. To do that, open a terminal and run

modprobe ip_conntrack_tftp

as root using su or sudo.

After that open a terminal as a regular user and type

tftp [ip] [port]

For the default bootloader settings that would be:

tftp 192.168.1.128 69

In this case it could just be tftp 192.168.1.128 as 69 is the default tftp port and the client would automatically connect to it. For any other port you have to explicitly set it.

Now you should have been greeted by the

tftp>

prompt.

First you have to enter this command:

tftp> mode octet

This way you tell the TFTP client to send binary data. This is absolutely needed as if your client is in netascii mode, uploading will fail. After this, it is advised to use the two following commands to make the process more informative so you can have a better view of what is happening, but they are not needed.

tftp> trace
tftp> verbose

Now to actually upload the binary file all you have to do is reset the board and in the next 10 seconds run the following command.

tftp> put [sketch].bin

The 10 second time frame is in case you already have a valid program uploaded on the Arduino. In case you don't have a program loaded or it has been marked invalid, you don't have any time constraints.

Now you should see your tftp client sending packets and the indication LED on pin 13 or pin 9 blinking in a random way, almost like having a hiccup. A correct output sample of the TFTP client uploading the blink sketch is below:

tftp> mode octet
tftp> trace
Trace mode on.
tftp> verbose
Verbose mode on.
tftp> put blink.bin
sent WRQ <file: blink.bin, mode: octet <>>
received ACK <block: 0>
sent DATA <block: 1, size: 512>
received ACK <block: 1>
sent DATA <block: 2, size: 512>
received ACK <block: 2>
sent DATA <block: 3, size: 512>
received ACK <block: 3>
sent DATA <block: 4, size: 512>
received ACK <block: 4>
sent DATA <block: 5, size: 42>
received ACK <block: 5>
tftp>

After a successful upload the bootloader will start the uploaded application instantly.

In case that for some reason the upload fails, first of all stop your TFTP client from sending any more packets. After that you should wait for the upload process on the bootloader to timeout. That takes about 10 seconds too. For this period you should witness the indication led doing some random blinking. After the timeout and since there is no valid program in the memory, the TFTP server should restart itself and wait for a new upload.

Configuring your Router for Remote Flashing

If you are having trouble flashing your Arduino at home from the road, you probably need to enable [port forwarding][11]. You need to forward ports 69 and 46969 to your Arduino in your router's configuration. In case you have changed the incoming data port from 46969 to another port i.e. 50232, you have to forward 50232 port instead of 46969. This is particularly useful when you have more than one Arduinos, that you want to flash, behind your router. In addition to this you are going to have to translate an external port of your choice on the router to the internal port and ip of the Arduino in the local network. [11]: http://en.wikipedia.org/wiki/Port_forwarding

An example is that you have 2 devices, one at 192.168.1.128 and one at 192.168.1.129. They both listen to port 69 for the initial connection. In this case you can translate external port 6969(any random port will do) on your router to 192.168.1.128:69 and external port 6970 to 192.168.1.129:69 and specify these in the tftp client you are using.

Port Forward has [excellent guides][12] on how to enable port forwarding for a vast number of routers. [12]: http://portforward.com/english/routers/port_forwarding/

Codebender

One of the best and easiest ways to use this bootloader is along with [codebender.cc][13]. Just register, enter your Arduino's IP (external IP for those in corporate or home networks behind NAT) and flash. [13]: http://codebender.cc

Helper Libraries

Supported Boards

Supported MCUs:

  • ATmega328
  • ATmega2560
  • ATmega1284

Supported ethernet controllers:

  • WizNet W5100
  • WizNet W5200
  • WizNet W5500

Tested Arduino Boards:

Other Tested Boards

These boards have been also tested and found to be working with Ariadne Bootloader. I don't have any of these so a big thank you goes to the people that took their time to test them.

Contributors

Donators PayPayl donate button

Hachi Manzur (AVRISP mkII programmer, testing)

If you feel that you should be in this list, please contact me via email.

Acknoledgements

Ariadne bootloader is built upon some great open source projects.

Credit should also go to mharizanov for commenting some of the initial Arduino code, making it easy for me to start and follower who's sketches served as a starting point for the included NetEEPROM and EthernetReset libraries.

License

This is free software and it is released under the [GPLv2, GNU General Public License][99] [99]: https://www.gnu.org/licenses/gpl-2.0.html

ariadne-bootloader's People

Contributors

andrebstv avatar arjenhiemstra avatar jkramarz avatar loathingkernel avatar m4rk avatar mbanzi avatar per1234 avatar tzikis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ariadne-bootloader's Issues

Cannot use http post method with ethernet.client when ariadne ethernet.reset in use

Hi thanks for reading this, I know its been a while since a release, but this bootloader is so useful to me I hope its not just left in a sunset phase now.
I'm trying to use ariadne with its ethernet reset server alongside my sketch for some home automation equipment (saves massively and avoids laptops up ladders to update my controllers in odd locations). One of the tasks that does is send out a http POST to a remote home-assistant automation server with a JSON formatted string so it can keep the master house gui in sync with all the nodes.

When I enable reset.check in the main loop, the following code stops working

if (jsonclient.connect(Configuration.extJsonServer, Configuration.extJsonServerPort)) {
  // Make a HTTP JSON request:
  mylocalJsonData = (F("POST /api/states/switch."));
  Serial.print (F("inner loop json data is "));Serial.print (String(mylocalJsonData)+ "\n");
} else { Serial.print ("Error :- "+String(jsonclient)+ "\n");}

In the serial log I see this
" Error :- 0"
Error code zero indicating failed connection of course. And it also doesn't send the packets out the interface at all on tcpdump output.
My sketch has 2 other ethernet services which function fine, (udp for ntp client, and ethernet server listening on port 80 http use in my sketch which uses GET requests) so it seems its just the outbound POST from my arduino ethernet tcp as a client affected.

If I comment out reset.check(); in the main loop, the json POST starts working. It has to be a POST to authenticate to the remote server in the JSON headers.

I read a post from a few years ago from Stelios Tsampas where he was discussing how to work around a similar sounding issue, is it documented somewhere and this issue now solved?
http://developers.arduino.narkive.com/m4JMgDNs/remotely-resetting-an-arduino

As a workaround, I already have a authenticated section in my configuration web gui, can I call a reset method from that instead of running a whole daemon on a higher port with a check in the main loop just for the reset? I already have a function that calls the following to do a soft reset after updating network config in eeprom, I could just expand that out if so.
asm volatile (" jmp 0");

ResetServer Won't Compile

I apologize for what is probably a simple question, but I downloaded the latest set of ariadne libraries. I can read and write network settings and upload sketches via the cloud (from codebender). I cannot, however, seem to get the "ResetServer" example from the EthernetReset library to work.

It will not verify. It initially shows the error

In file included from ResetServer.ino:34:
C:\Program Files (x86)\arduino-1.0.3\libraries\NetEEPROM/NetEEPROM.h:36: error: expected class-name before '{' token

I have poked around and made a few changes. Eventually I got it to compile but I never got it to work. The server at port 80 works fine, but I can't seem to reset or reprogram.

Thanks for any help!

getting error when flashing with tftp

i get a error from the arduino when im flashing using the tftp client take a look at this.
this is the output fom the serial port.

ˆC¡*¥¹é Ariadne for Arduino Uno, Version 0.5
Net: EEPROM settings
Net: Address: 0xC0.0xA8.0x01.0x78
Net: Subnet: 0xFF.0xFF.0xFF.0x00
Net: Gateway: 0xC0.0xA8.0x01.0x01
Net: MAC: 0x12.0x34.0x56.0x78.0x9A.0xBC
Net: Network init done
Tftp: Init socket to port 0x0045
Tftp: TFTP server init done
Tftp: DataPort: 0xB779
Tftp: Processing packet of size 0x001E
Tftp: Set up return address
Tftp: This is block 0x426C with opcode 0x0002 and data length 0x0012
Tftp: Write request
Tftp: Init socket to port 0xB779
Tftp: Changed to port 0xB779
Tftp: Sent ACK
Tftp: Response sent
Tftp: Init socket to port 0x0045
Tftp: TFTP server init done
Tftp: DataPort: 0xB779
Tftp: Processing packet of size 0x001E
Tftp: Set up return address
Tftp: This is block 0x426C with opcode 0x0002 and data length 0x0012
Tftp: Write request
Tftp: Init socket to port 0xB779
Tftp: Changed to port 0xB779
Tftp: Sent ACK
Tftp: Response sent
Tftp: Init socket to port 0x0045
Tftp: TFTP server init done
Tftp: DataPort: 0xB779
Tftp: Processing packet of size 0x001F
Tftp: Set up return address
Tftp: This is block 0x0000 with opcode 0x0005 and data length 0x0013
Tftp: Error
Tftp: Response sent
Tftp: Processing packet of size 0x8613
Tftp: Overflow
Tftp: Set up return address
Tftp: This is block 0x979A with opcode 0x6D2C and data length 0xBCD4
Tftp: Invalid opcode 0x0000
Tftp: Init socket to port 0xB779
Tftp: Response sent
Tftp: Init socket to port 0x0045
Tftp: TFTP server init done
Tftp: DataPort: 0xB779

any ideas?

TFTP upload not working with mini W5100 Board

Hello everyone,
I have often successfully used this wonderful software with Arduino UNO, Mega and the Ethernet Shield. Everything was great as far.

Unfortunately, I get the things with a W5100 Minibourd not go. (Here for example: https://www.amazon.com/XCSOURCE-Ethernet-Network-Arduino-TE230/dp/B01149ETWA or http://www.ebay.de/itm/New-Mini-W5100-LAN-Ethernet-Shield-Network-Module-board-Fuer-Arduino-DE-TE230-/261950470314 ) The normal Ethernet examples (web server, etc.) with the default bootloader work perfectly.

Ariadne can be installed without problems, ping 192.168.1.128 works. If I then, however, wants to change the network settings, or by TFPT something wants to upload does not work that way. While the LED is still blinking as tert expect, unfortunately, a ping 192.168.1.128 or to the new address is not working.

What am I doing wrong?

Greetings from Germany
Funny Paul

Automatic reset for every TFTP put operation

Hi, I know this is not a forum for support but I really need help.
I would like the bootloader to reset every time a TFTP put operation is performed. That is, every time I want to upload a new code would not need to use an http request to reprogram it, causing the upload to be "automatic".
Not sure, but in this case it would be necessary to use only wdt.reset () and NetEEPROM.writeImgBad()?
Which part of the code should I take a look?
Thanks.

Flashing bootloader erases EEPROM by default

Due to the fuses set in boards.txt, the EEPROM is erased when Ariadne is flashed onto the ATMega, not sure if this is intended functionality, but I made it a point to move EEPROM data "out of the way" of the Ariadne settings locations in the EEPROM only to find out it was erased anyways. Patch below maintains existing fuse settings but adds the "don't erase EEPROM" fuse flag

/hardware/ariadne/boards.txt
@@ -7,7 +7,7 @@
 ariadne328.upload.speed=115200

 ariadne328.bootloader.low_fuses=0xFF
-ariadne328.bootloader.high_fuses=0xD8
+ariadne328.bootloader.high_fuses=0xD0
 ariadne328.bootloader.extended_fuses=0x05
 ariadne328.bootloader.path=ariadne
 ariadne328.bootloader.file=ariadne_atmega328.hex
@@ -28,7 +28,7 @@
 ariadne328eth.upload.speed=115200

 ariadne328eth.bootloader.low_fuses=0xFF
-ariadne328eth.bootloader.high_fuses=0xD8
+ariadne328eth.bootloader.high_fuses=0xD0
 ariadne328eth.bootloader.extended_fuses=0x05
 ariadne328eth.bootloader.path=ariadne
 ariadne328eth.bootloader.file=ariadne_atmega328_ethernet.hex

Ethernet transfer fails for cloud flashing when SD card is inserted

I had been successfully remote flashing my arduino ethernet via the "cloud flash" capability of codebender.

At some point, I was no longer able to load sketches; roughly 49 out of 50 times it would simply fail with the "Cloud Flash failed" message. I also noticed that the transmit LED on the board appeared to be lighting up much less frequently than I remembered.

After some fiddling, I removed the 4GB SD card and suddenly things started working again. I can replicate this behavior consistently: card in = fail, card out = success.

Thanks for any help!

Bootloader burned successfully, Failed to upload bin via TFTP.

Hello, so I am able to burn the bootloader and upload the "ReadNetworkSettings" sketch using Serial USB Comm.

I am also able to ping the default IP when the Arduino is powered and connected (192.168.1.128)

Then I tried to upload the sample "blink" ( utilities\tests\blink\atmega328_blink9.bin ) by resetting the Arduino Board (LED13 now blinks quickly), then type "tftp -i 192.168.1.128 PUT atmega328_blink9.bin" (I already cd'd to the folder). After some times, it says "Connect request failed".

Previously, after uploading the sample "ReadNetworkSetting", the Arduino will be able to run the sketch after about 10 seconds after reset (the upload period).

But if I did attempt to TFTP the sketch (atmega328_blink9.bin), my Arduino is now not able to load the previous sketch and will keep blinking quickly (even after resetting, and waiting for 10 seconds). The previously uploaded sketch is now gone, but I am still able to upload sketches via serial. What should I do?.. (Windows 10 64bit, Arduino 1.6.7)

Add uploading of the sketch through SD

Since most ethernet shields have an SD card socket this might would be useful to have.
I am just leaving it here to see how many people are interested in having this feature integrated to
Ariadne.

It has been done before so, probably, i will be using the existing solution if it fits nicely with the rest of the code.

burning bootloader to mega and some questions

I was able to burn the bootloader to mega using usbisp/usbasp programmer using avrdude command.

avrdude -c usbasp -p m2560 -P usb -b 115200 -e -u -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xD8:m -U efuse:w:0xFF:m
avrdude -c usbasp -p m2560 -P usb -b 115200 -V -U flash:w:ariadne_atmega2560.hex
avrdude -c usbasp -p m2560 -P usb -b 115200 -U lock:w:0x0F:m

Questions:
How do I change the location/address in eeprom where network info is stored. Most programs will store data starting at address 0, I think it will be better if the bootloader stores at the end of the eeprom.

I am running a webserver in my arduino program. I just need to add a uri that will make my code execute these lines of code to reboot the arduino right? Then I start tftp program to upload the new firmware?

#include <avr/wdt.h>
....
wdt_disable();
wdt_enable(WDTO_2S);
while(1);

thanks for sharing the program.

Bootloader hanging on field application -2560

Hi,

I couldn`t help but notice the bootloader is not protected by a WDT. I have a device on the field that from time to time hangs, and as I can see from logs writen on a SD card It does in the bootloader section. (it shows a "reboot" string on the log and then no "Power ON" string which is the very first thing it does on app start).

Ive changed the bootloader code to include proper wdt protection, but Im unable to compile it... It may sound like a noob error, but it fails on the memcpy_PF... I`ve seen previous ppl having this error but no solution to it.

I do compile on windows, using the WinAVR toolchain.

Where should I change on the makefile so I can compile it? Tried everywhere and still got this error.

Note that I would gladly post the wdt fix once I`ve tested.

Support for ENC28J60

Can we get support for ENC28J60 ethernet chip? This project is a very cool way to push sketches. How can we use it on 28j60 instead of W5100?

bin-file generated from PlatformIO (avr-gcc ide) does not work with Ariadne

Hello!

Ariadne works fine for bin-files from various Arduino-IDE-Versions.
If I try to upload a file from PlatformIO (http://platformio.org) Ariadne respond back an error (received opcode=800 sent WRQ <file=firmware.bin, mode=octet>).

Debug output:
Main: Ariadne for Arduino Uno, Version 0.5
Net: Built-in settings
Net: .Address: 0xC0.0xA8.0x01.0x80
Net: . Subnet: 0xFF.0xFF.0xFF.0x00
Net: .Gateway: 0xC0.0xA8.0x01.0xFE
Net: . MAC: 0xDE.0xAD.0xBE.0xEF.0xFE.0xED
Net: Network init done
Tftp: Init socket to port 0x0045
Tftp: TFTP server init done
Tftp: .DataPort: 0xB779
Tftp: Processing packet of size 0x001D
Tftp: Set up return address
Tftp: This is block 0x6669 with opcode 0x0002 and data length 0x0011
Tftp: Write request
Tftp: Init socket to port 0xB779
Tftp: Changed to port 0xB779
Tftp: Sent ACK
Tftp: Response sent
Tftp: Processing packet of size 0x020C
Tftp: Set up return address
Tftp: This is block 0x0001 with opcode 0x0003 and data length 0x0200
Tftp: Data block
Tftp: Writing data from address 0x000000
Tftp: Packet length adjusted to 0x0200
Tftp: Response sent
Tftp: Processing packet of size 0x8800
Tftp: Overflow
Tftp: Set up return address
Tftp: This is block 0xC19C with opcode 0x0A0B and data length 0xFE1D
Tftp: Invalid opcode 0x0000
Tftp: Init socket to port 0xB779
Tftp: Response sent
Tftp: Processing packet of size 0x020C
Tftp: Set up return address
Tftp: This is block 0x0001 with opcode 0x0003 and data length 0x0200
Tftp: Data block
Tftp: Writing data from address 0x000000
Tftp: Packet length adjusted to 0x0200
Tftp: Response sent
Tftp: Processing packet of size 0x8800
Tftp: Overflow
Tftp: Set up return address
Tftp: This is block 0xC19C with opcode 0x0A0B and data length 0xFE1D
Tftp: Invalid opcode 0x0000
Tftp: Init socket to port 0xB779
Tftp: Response sent
Tftp: Processing packet of size 0x020C
Tftp: Set up return address
Tftp: This is block 0x0001 with opcode 0x0003 and data length 0x0200
Tftp: Data block
Tftp: Writing data from address 0x000000
Tftp: Packet length adjusted to 0x0200
Tftp: Response sent
Tftp: Processing packet of size 0x8800
Tftp: Overflow

Robert

Please specify fuses for alternative ICSP programmer.

Hello,

I try program this Ariadne-Bootloader to Arduino Mega2560 by ASIX PRESTO Programmer (I have only this programmer).

When I open hex file, there are some alert about Little or Big Endian:

image

Please help me with settings fuses. Is somewhere specify fuses for ariadne-bootloader?

mega2560conf

I try default fuses with SPI prog. enabled, but it is not function ...

Many thanks,

Jan

Need Example(s) for Reading-Writing Ariadne MAC address within my own sketch

Ariadne Bootloader has been working well for me using a Arduino Ethernet Clone but the one item I have not been able to figure out (I'm just learning C++) is how to set/read the MAC address using the pointer variable.
ip = NetEEPROM.readIP();
gateway = NetEEPROM.readGW();
subnet = NetEEPROM.readSN();
All work fine but I can't figure out the MAC syntax/format.

Such as:
mac[] = NetEEPROM.readMAC();

Does NOT work correctly.

Sorry for this newbee question.

network reset

When I performed a network reset, without loading a new schetch, the watchdog timmer remains enabled at 2s. and the arduino is not booting again (the bootloader waits 5s. for a schetch to upload, but it does't disable watchdog timmer)

I solved this using wdt_enable(WDTO_8S) instead of wdt_enable(WDTO_2S) inside library

I hope you can fix this inside bootloader

Endless reset

I'm getting endless reset after watchdog resets arduino (in the sketch I set it to 8sec as sketch is too big and it gets hangups time to time), and it does not stop even if I press reset button, only if I reflash the sketch. Is thwere any solution for that?

Bootloader hangs on Mega2560

Hi all,

i think this ist not a real issue, and should be solved in short time.

I am normaly using the Mega2560-Board without any Bootloader. but in one project i need the possibility to do a sketch-update via Ethernet.
So the Ariadne-Bootloader was a perfect solution!

It is running perfect!

But, when there is connected a PC to "Serial" it hangs, when both (PC and Arduino) starting at the same time. i think the pc is sending some trash, and the bootloader is thinking "hey cool, i have to receive a sketch"...
Disconnecting the PC from Serial is solving this problem. but i need this connection for controlling/debugging.

I don't need the serial-update feature. is it possible to disable it, or to get a version of this bootloader without serial functions?

Thanks a lot in advance.

cu
Hagen

Bootloader ability to write directly to EEPROM

Since the network settings are being store in the EEPROM, it might be useful to have support for direct EEPROM access to avoid using a sketch. It might be less time consuming and more straight forward

Compile Problem

Hi Guys,

I try to recompile the bootloader for the mega2560 because I want to adapt it for a mega2561 and a w5500. But as you can see below I get an error.

The standard libs from the arduino package do not have the memcpy_PF in pgmspace.h.

the culprit is in tftp.c:

if (FLASHEND > 0x10000)

        memcpy_PF(txBuffer, PROGMEM_OFFSET + (uint32_t)(uint16_t)tftp_unknown_error_packet, packetLength);

else

        memcpy_P(txBuffer, tftp_unknown_error_packet, packetLength);

endif

I already tried Arduino 1.05 and arduino 1.55, so I was wondering how did you compile the 2560 bootloaders?

cheers,

John

../../../../tools/avr/bin/avr-gcc -g -Wall -Wextra -Wstrict-prototypes -Os -fno-
inline-small-functions -fno-split-wide-types -mno-interrupts -mrelax -funsigned-
char -funsigned-bitfields -fpack-struct -fshort-enums -fno-jump-tables -std=gnu9
9 -mmcu=atmega2560 -DF_CPU=16000000L '-DDEBUG_MAIN=1' '-DDEBUG_NET=1' '-DDEBUG
_TFTP=1' '-DDEBUG_VALD=1' '-DBAUD_RATE=115200' -Wl,--section-start=.text=0x3e000
-Wl,--relax -Wl,--gc-sections -o ariadne_debug2560.elf main.o spi.o w5100.o tft
p.o validate.o debug.o watchdog.o serial.o util.o announce.o optiboot.o stk500bo
ot.o
tftp.o: In function tftpPoll': C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\ariadne/tftp.c:4 79: undefined reference tomemcpy_PF'
tftp.o: In function sendResponse': C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\ariadne/tftp.c:3 56: undefined reference tomemcpy_PF'
C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\ariadne/tftp.c:3
58: undefined reference to `memcpy_PF'
make: *** [ariadne_debug2560.elf] Error 1
rm watchdog.o w5100.o tftp.o optiboot.o spi.o stk500boot.o serial.o validate.o a
nnounce.o debug.o main.o util.o

Ariadne installation via Arduino Boards Manager

I have created a working implementation of installation of Ariadne to the Arduino IDE via Boards Manager. The URL is:

https://per1234.github.io/Ariadne-Bootloader/package_codebendercc_ariadne-bootloader_index.json

This can be added to Arduino IDE 1.6.4 in File > Preferences > Additional Boards Manager URLs. Then Ariadne Bootloader will appear as one of the options for installation under Tools > Board > Boards Manager...

I would like to create a pull request to add this capability to Ariadne but first I need the installation file to be available. The most common way of doing this seems to be a Github release. My installation file is here:
https://github.com/per1234/Ariadne-Bootloader/releases/download/v1.0.0/ariadne.zip
You can download mine to use or create your own. If you create your own notice that the folder structure has to be changed slightly.

For examples of how others have set this up see:
https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls

Thanks, Per

TFTP upload fails with the message "Timeout occurred, Connect request failed"

I have burned Ariadne Aootloader to an arduino mega2560 using another arduino mega 2560 as an ISP, using Nick Gammon's Atmega_Board_Programmer. I followed Nick's instructions, to convert the .hex bootloader files on disk for use with his sketch. Everything reports a successful burn, and I can upload sketches via serial no problem (blink, fade etc).

However successful this sounds, I cannot upload via TFTP :

  • I am connected to the Ethernet shield directly via Ethernet cable (no router)
  • I have uploaded the WriteNetworkSettings sketch and changed the gateway IP to the same IP as my windows PC.
  • I can ping the device on the default IP address 192.168.1.128
  • I have converted the fade.hex to bin using avr-objcopy.exe
  • I am resetting the board and waiting for about 10sec (for ethernet to settle) and then typing into a command prompt: tftp -i 192.168.1.128 PUT Fade.bin
  • I have led pin 13 flashing at about 5Hz for about 20 sec and then it goes into the sketch which i uploaded via serial - currently I'm using the standard fade example.

TFTP still fails. What have I missed?
suddenly my username doesnt seem so clever :(

Ariadne misuses W5100 and W5200

@MarekLew wrote:

Library TFTP wrong use registers REG_S3_RX_RD0, REG_S3_TX_WR0, REG_S3_RX_RSR0.

Trying to modify AriadneBootloader for W5200 and ATmega2560 with progaram> 64KB noticed that the transmission every time it stops at 55KB for the 2K buffer soket.

Analyzed the library and documentation W5100 and W5200.

REG_S3_TX_WR0 is NO PHYSICAL ADDRESS for the third soket and can not be freely modified. Is the number of bytes processed the program. A REG_S3_RX_RSR0 tells you how many bytes have to be read in the buffer.

In a few days try shared corrected code. For now, I have to very modified system and W5200. In the meantime, put 'suggested amendments.

Today I have only smartphone.

When soket is initialized:
spiWriteWord (REG_S3_RX_RD0, 0);

You can not move REG_S3_RX_RD0 of S3_RX_START:
-- If (readPointer == 0) readPointer = S3_RX_START;

or move back
-- If (readPointer == S3_RX_END) readPointer = S3_RX_START;
repleace with like this
++ if ((--packetSize) == 0)break;//end of package
or better
-- for(count = TFTP_PACKET_MAX_SIZE; count--;) {
++ for(count = packetSize; count--;) {

to read the bytes from the physical address, use the mask and shift:

-- SpiWriteWord (REG_S3_RX_RD0, readPointer);
++ SpiWriteWord (REG_S3_RX_RD0, S3_RX_START + (readPointer & 0x7ff));

0x7ff - mask for 2k

And of course analogous not to REG_S3_TX_WR0:

-- writePointer = spiReadWord (REG_S3_TX_WR0 - S3_TX_START);
++ writePointer = spiReadWord (REG_S3_TX_RD0);

-- If (writePointer == S3_TX_END) writePointer = S3_TX_START;
-- SpiWriteWord (REG_S3_TX_WR0, writePointer - S3_TX_START);
++ SpiWriteWord (REG_S3_TX_WR0, S3_TX_START + (writePointer & 0x7ff));

And now at last
uint16_t PacketSize = spiReadWord (REG_S3_RX_RSR0);
contains useful information how much data is left in the buffer.

You can probably remove.

while ((spiReadReg (REG_S3_IR) & IR_RECV)) {
spiWriteReg (REG_S3_IR, IR_RECV);
/ / FIXME: is this right after all? smaller delay but
/ / Still a delay and it still breaks occasionally
delayms (TFTP_PACKET_DELAY);
}

Besides, I've used yet PacketSize I used to check whether the data came in full.

I not use this for W5100 only W5200 and 4K socket.

Sorry for my English, I used a translator.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.