Lately I’ve been busy with university stuff. In particular, my final year project, which is investigating Controller Area Networks, in the context of the Atmel AT91SAM7X256 MCU. These microcontrollers are a low-cost system-on-chip based around the ARM7TMDI core. This particular one includes 64KB RAM, 256KB flash, RS-232, device-side USB 2.0, 10/100Mbps ethernet, and of course, a CAN interface.
When I first started looking into this project, I was thinking about using Linux and SocketCAN… well, needless to say the moment I saw the specs on the exact board I was using (the AT91SAM7X-EK), I soon realised Linux was simply out of the question. That doesn’t mean however, that one is stuck to using proprietary kernels and toolchains. The following, are some notes on how to code for these things… and where I’m at.
You don’t have to use a kernel of course, you can code bare-iron, but I decided to go with a multitasking kernel to make my life easier — I can code each thread to do something basic, and let the kernel manage the IPC and task switching for me, hooking them together. There are a few options out there, but so far the option I’m liking the most, is the FreeRTOS kernel. This kernel is free software under the GNU GPL, and supports many platforms, including ARM7.
There are a few compiler toolchains you can use for this board. The DVD that comes with the board, includes a version of IAR Embedded Workbench, which isn’t too bad, but unless you pay for a license, your code size is limited to 32KB. The GNU toolchain however, is very mature for the ARM7 platform… and getting a toolchain up and running isn’t too difficult.
FreeRTOS can be built using IAR, and indeed to get me started, that’s what I did. Once I was comfortable with the system though, I turned my attention to getting a GNU toolchain running on my laptop. The toolchain needs to be built, targetting the arm-elf platform, using the newlib C library. Thumb mode, multilib, and interworking support need to be included in this toolchain to build FreeRTOS. There are numerous prebuilt toolchains, and guides on how to do them from source… but I wound up going my own way…
In my devspace, you’ll find a compressed Makefile. Download this into an empty directory, decompress it, then rename it to Makefile. Gentoo users, may find it helpful to symlink their distfiles directory (/usr/portage/distfiles for most people) to ‘src’ — the Makefile uses the same toolchain sources as Gentoo. Edit Makefile to point to your local Gentoo mirror (I use these mirrors because they’ve got all the sources in one place), then run make. With luck, it’ll build everything and install it for you. It runs as a user, then uses sudo to copy the files to /usr/local where they are to be installed.
At the end, you’ll be left with a full arm-elf toolchain, based on GCC 4.2.3, binutils 2.18 and newlib 1.15.0.
Building the FreeRTOS kernel
FreeRTOS comes with numerous demos which can be used as starting points for your own projects. The best one for the AT91SAM7X using GCC, is the lwIP_Rowley_ARM7 demo. This demo does three things:
- Runs a webserver displaying some task statistics
- Flashes the onboard LEDs to indicate it’s working
- Emulates a CDC-ACM device, writing characters to it at 115200 baud 8N1.
To start, go into the Demos/lwIP_Rowley_ARM7 directory, and rename ‘makefile’ to ‘Makefile’. To set the IP configuration, edit EMAC/SAM7_EMAC.h and change the IP address settings as appropriate (line 69 onwards). Save this, then type make. It should go ahead and build an rtosdemo.bin file, which is your executable to be flashed.
Flashing the project
This is where my usage of free software came unstuck. There are a few projects that theoretically allow you to flash these devices. The kit comes with a SAM-ICE J-Tag, which is equivalent to the J-Link device developed by Segger. These, to my knowledge, do not work using J-Tag tools available under Linux. You could use one of the Wiggler-style J-Tag cables, but I don’t have one of those at my disposal.
The AT91SAM7X has a trick up its sleeve though. If you power the board up for a few seconds with the ERASE jumper enabled, power it down, then power it back up with the ERASE jumper removed, it’ll revert back to using SAM-BA firmware. SAM-BA allows for the board to be flashed either via the DBGU serial port, or, via a CDC-ACM USB device. Tools such as Sam_I_Am, then connect to the /dev/ttyACM0 device created. For this to work, a small patch needs to be applied to the cdc-acm driver in the Linux kernel (This same patch also adds support for the FreeRTOS CDC device created by the above demo).
For me, this has been the most promising, but hasn’t quite gotten things going… I’m able to flash the device, but for some reason, it sees it as an AT91SAM7S256… and the thing won’t boot. If anyone has some pointers as to what could be going wrong, I’m all ears.
At the moment, I’m using the SAM-BA flashing utility available from Atmel’s website free of charge. This is a Windows NT utility requiring administrator privileges, which is suboptimal, but so be it, it works, I just boot my desktop PC into Windows 2000, and access the output binary via SMB. This works, and isn’t too painful. It may also work in a VM, I haven’t tried yet.
I’ll keep tinkering with the Linux utilities, because I feel it’s almost there… I’ve thrown this post up so that others who may be looking for this information, have somewhere to work from. Apart from the little issues I’ve had, I’ve found this board quite enjoyable to work with. I can use mostly my own tools to work with the files, and the C compiler is both stable (unlike the GNU toolchain for Altera Nios II) and fully ANSI C compliant (unlike the Z-World compiler used on Rabbit Semiconductor devices) — a nice change indeed. 😉