One of my final assignments in my final year of Computer Engineering is to build a ‘Wacky Racer’ car. It is a group assignment with six students in each team. The project requirements include:
- Be controllable from a bog-standard infrared TV remote control.
- Be controllable wirelessly from a mobile phone.
- Can capture still images and send them wirelessly to a mobile phone or laptop.
- Have a soft on/off switch that will power up your vehicle.
- Have a green LED that indicates the system is powered up.
- Have a red LED that indicates that the battery needs charging.
- Only use a single battery pack for everything.
- Have no trailing cables.
- Use almost exclusively surface mount components apart from the supplied connectors.
- Monitor the battery voltage and motor speed.
- Be dastardly!
- Comprise three PCBs, each with a microcontroller:
- Motor board: power supply/motor-control/steering/infrared comms
- Camera board: using the TCM8230MD image sensor.
- Communications board: wifi or bluetooth
- The boards are to communicate with an I2C bus only.
- Each board is to have a UART or USB debug interface.
- Each board needs to be able to run standalone for debugging.
We decided to use a Atmel ATSAM4S16B Microcontroller for all three boards. With our PCBs designed, manufactured and the components placed, and the voltage levels appearing to be correct we then needed to configure a toolchain to connect to our board using it’s JTAG header. The instructions below cover installing OpenOCD 0.6.1 and installing an ARM EABI toolchain. We are using a USB to JTAG converter supplied by our department (Electrical Engineering) at the University of Canterbury, however the process will be similar for commercially available adapters. Note that our adapter is based on a FTDI FT2232 chip.
Ubuntu Linux (12.10) is used in this tutorial.
1). Installing OpenOCD
The FTDI drivers are required. Install these with the following command:
sudo apt-get install libusb-dev libftdi-dev
Now, download OpenOCD 0.6.1 from http://sourceforge.net/projects/openocd/files/openocd/0.6.1/openocd-0.6.1.tar.bz2/download
Unzip it (I use the gui folder manager because I can never remember the command) and cd into the openocd-0.6.1 directory. Now build and install OpenOCD with the following commands:
./configure --enable-ft2232_libftdi make sudo make install
Test that the install worked by running openocd and checking that something like the following appears:
Open On-Chip Debugger 0.6.1 (2013-05-17-12:52)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Runtime Error: embedded:startup.tcl:47: Can’t find openocd.cfg
in procedure ‘script’
at file “embedded:startup.tcl”, line 47
Error: Debug Adapter has to be specified, see “interface” command
in procedure ‘init’
2). Running OpenOCD
The next thing to do is to get the OpenOCD config files sorted for the SAM4S target and the USB to JTAG interface. Do this by creating a file called myconfig.cfg in your home directory and put the following in it:
# This section configures OpenOCD for using the university's USB-JTAG adapter. interface ft2232 ft2232_layout usbjtag ft2232_vid_pid 0x0403 0x6010 adapter_khz 4 adapter_nsrst_delay 200 jtag_ntrst_delay 200 # This section configures OpenOCD for working with a SAM7 chip. source [find target/at91sam4sXX.cfg] # Halt the MCU when GDB connects otherwise the connection fails. ($_TARGETNAME is defined in at91sam7sx.cfg) $_TARGETNAME configure -event gdb-attach { echo "Halting target due to gdb attach" halt } $_TARGETNAME configure -event gdb-detach { echo "Resuming target due to gdb detach" resume }
At this point, connect your board via the USB to JTAG adapter, and run OpenOCD from the same directory as your myconfig.cfg file with the following command:
sudo openocd -f myconfig.cfg
3). Connecting to OpenOCD
There are two approaches to connecting to OpenOCD, telnet or GDB. Use can use one of the following commands in a new terminal to connect to OpenOCD:
telnet localhost 4444 #telnet
telnet localhost 3333 #gdb
For the remainder of this tutorial we shall focus on using the GDB connection method.
4). Configuring an ARM EABI toolchain (with GDB)
We need to install a version of GDB configured for an ARM target. We might as well install our cross-compiler at the same time. This can all be achieved in one swoop by using James Snyder’s build system from https://github.com/jsnyder/arm-eabi-toolchain.
Install this as follows (alternatively, if you are used to cloning Git repos you can just follow the README on the github page):
Install git:
sudo apt-get install git
Install the required dependencies for the toolchain:
sudo apt-get install curl flex bison libgmp3-dev libmpfr-dev texinfo \ libelf-dev autoconf build-essential libncurses5-dev libmpc-dev \
Clone the repo:
git clone https://github.com/jsnyder/arm-eabi-toolchain.git
Install the toolchain:
cd arm-eabi-toolchain sudo make install-cross
Now wait for ages while the makefile does it’s thing. When it’s done, add the stuff to your system path and clean up.
export PATH=$HOME/arm-cs-tools/bin:$PATH sudo make clean
You can check this all went well by starting the ARM version of GDB at the command line.
arm-none-eabi-gdb
You should be presented with a (gdb) prompt.
5). Using arm-none-eabi-gdb alongside OpenOCD
The following script can be used to upload a program to the SAM4S target using the GDB method:
target remote tcp:localhost:3333 monitor reset monitor sleep 500 monitor poll monitor soft_reset_halt load monitor reset
Save this script as program.gdb. Once you have compiled your program, and with the OpenOCD dameon running, you can invoke this script using the following command:
./arm-none-eabi-gdb -batch -x 'program.gdb myProgram.elf
Where myProgram.elf is your compiled application.
TODO: 6). Compiling a program for the SAM4S + an example blinking LED program.