This application boots a recovery environment for your Toon 1 from a Raspberry Pi or another device with a JTAG debugger attached.
At the moment, the following is implemented:
- Detection of the U-Boot version
- Loading of modified U-Boot version using JTAG
- Logging in to supported versions of U-Boot
- Setting up the U-Boot environment so the Toon boots into the recovery console
- Set your own boot server IP address and/or the gateway IP address
The recovery will be loaded over NFS from the server which you provide (using option --serverip). You must download the NFS server image and unpack the tar.gz file into /srv/nfs. The image file is stored in github using LFS.
Then enable NFS on your server and enable NFSv2. This is needed for the Toon uboot which only supports NFSv2. Check how to enable NFS v2 in the manuals of your linux distro. For a Raspberry Pi 3 the instructions are below. Check if NFSv2 is enabled with
cat /proc/fs/nfsd/versions
Then enable the NFS export of the NFS directory with this in the /etc/exports file. Don't forget that you need to reload the exports if you change it.
/srv/nfs *(rw,no_subtree_check,async,no_root_squash)
Complete instructions for a Raspberry Pi 3 are below. Thanks for jozg for this.
sudo apt-get install nfs-kernel-server portmap nfs-common
sudo nano /etc/exports
Add the NFS export to this file
/srv/nfs *(rw,no_subtree_check,async,no_root_squash)
To enable NFS v2:
sudo nano /etc/default/nfs-kernel-server
Change:
RPCNFSDCOUNT=8
to:
RPCNFSDCOUNT="-V 2 8"
And change:
RPCMOUNTDOPTS="--manage-gids"
to:
RPCMOUNTDOPTS="-V 2 --manage-gids"
Then create the NFS recovery environment.
mkdir -p /srv/nfs
cd /srv/nfs
curl -Nks "http://qutility.nl/toon-recovery-nfs-server-image.tar.gz" | tar zxvf -
Finally restart the NFS kernel server to allow all changes to be affective.
sudo service nfs-kernel-server restart
Just like the Toon Rooter it at least requires a serial connection to the Toon. If your Toon 1 is from a newer generation with U-Boot after version 2010-R8, it also requires a JTAG connection. Serial and JTAG connection can be used from the GPIO of a Raspberry PI.
Make sure there's no power going in to either of the devices, and double check the connections before powering up again. Connect your Toon's debugging header to a Raspberry Pi according to the following pin assignments:
Toon | Signal | Pi |
---|---|---|
1 | RTCK | |
2 | TRST | 24 |
3 | GND | 25 |
4 | TCK | 23 |
5 | GND | 20 |
6 | TMS | 22 |
7 | SRST | 18 |
8 | TDI | 19 |
9 | Vt | |
10 | TDO | 21 |
11 | RxD | 8 |
12 | ||
13 | TxD | 10 |
14 | GND | 9 |
Then make sure the serial port on the Pi is enabled and the serial console is disabled
using raspi_config
and reboot if necessary. Install the dependencies mentioned in the
Dependencies-section.
Then get and run this application:
sudo apt install python-serial
git clone https://github.com/ToonSoftwareCollective/ToonRecovery.git
cd ToonRecovery
sudo python . --jtag-available
Als you need to connect the Toon to your network using the builtin UTP/LAN/ethernet port. It is not possible to boot from wifi.
Then reset your Toon and let the magic happen :) After it is finished you must connect to your toon over serial and you will see that your Toon is booted into the recovery console. The root password from recovery is set to 'toon'. You will probably want to change that aftwerwards.
When the Toon is booted into the recovery environment start your favourite serial terminal console client. You will presented a menu like this one.
Welcome to the Toon recovery environment.
--> Your Toon has hostname: eneco-001-xxxxxx
--> We have a VPN config file in the backup location
=========================================
1) Backup Toon VPN config
2) Format Toon filesystem
3) Recover Toon filesystem
4) Restore Toon hostname and VPN config from backup
9) Reboot Toon
0) Drop to shell
=========================================
Choose an option:
The first option will mount your Toon filesystem (if possible) and make a backup of your VPN config file. This is the only thing which makes your Toon unique and necessary to have your Toon connected to the Eneco server later on (for example, for updates).
The second option will format your Toon filesystem. Be sure you have a backup of the VPN config and agree with formatting the filesystem. You will loose every history of your Toon!
The third option will allow you to recover your Toon from a few supplied firmware versions.
The fourth option will recover your Toon VPN config and hostname after the recovery.
You should definitely get a Pi.
However, if you're adamant that you want to recover your Toon from another device and
you have a JTAG debugger lying around that works with OpenOCD, you should be able to
use this script without issue. Just put the configuration file for your debugger in the
assets/adapters
directory (make sure it has a .cfg
extension) and pass the name
of the file (without extension) to the script using the --jtag-hardware
argument.
I'm pretty sure Windows is not going to work though, so you should use a Linux
(virtual) machine.
usage: sudo python . [-h] [--serial-port PATH] [--gatewayip IP] [--serverip IP]
[--output-level INFO|DEBUG] [--jtag-available] [--jtag-hardware TYPE]
[--dont-check-uboot] [--boot-only]
Recover your Toon.
optional arguments:
-h, --help show this help message and exit
--serial-port PATH The path of the serial port to use. Per default it will use /dev/serial0
--output-level INFO|DEBUG
The level of output to print to the console
--gatewayip IP Set a gateway IP address if DHCP is not providing the gateway IP to your toon.
--serverip IP Set the NFS server IP address where the recovery image is located. Defaults to
where this script is running on.
--jtag-available Indicates you have a JTAG debugger connected to your
Toon's JTAG headers
--jtag-hardware TYPE The JTAG debugger type that we're working with. The
default is to autodetect the JTAG debugger (which
currently only works on Raspberry Pi). Supported
values are: auto, rpi1, rpi2, rpi3
--dont-check-uboot Don't check whether we can access the installer
version of U-Boot before using JTAG to start up the
custom one.
--boot-only Don't auto-recover, just boot into the serial
console for manual recovery
-
Python 2.7
-
OpenOCD from git (for newer Toons) (see instructions)
If your Toon has a newer U-Boot version than 2010-R8, a JTAG interface is required to upload a bootloader that we have access to through the serial console. To do this, you need to build a version of OpenOCD (at the time of writing the version in apt doesn't support using the Pi's headers as JTAG debugger).
git clone --recursive git://git.code.sf.net/p/openocd/code openocd
cd openocd
sudo apt install make libtool libtool-bin pkg-config autoconf automake texinfo libusb-1.0 libusb-dev
{
./bootstrap &&\
./configure --enable-sysfsgpio\
--enable-bcm2835gpio \
--prefix=/usr\
&&\
make -j4
} 2>&1 | tee openocd_build.log
sudo make install
these instructions were based on the instructions posted here by rboers
This application is based on ToonRooter from Marten Jacobs https://github.com/martenjacobs/ToonRooter and information provided by
- TheHogNL
- MarcelR