Following the suggestion by CptTitanic, I've written source code to verify processor operation, and I've found that the problem does not appear to be the external clocks at all!
The line of code
AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_OSCBYPASS;
seems to bypass the main clock, and by running a small test program from internal SRAM, I can write to the DBGU serial port at different baud settings. I also used an oscilloscope to check again that the clocks were working.
I then modified my small test program to write 32-bit numbers into SDRAM and read back the numbers. Unfortunately, I found that "D5" on the memory bus does not seem to respond. X-ray inspection of the PCB shows that "D5" is not completely soldered to the pad, so of course the SAMBA external memory test fails!
To compile the test code, I used makefiles provided in the AT91lib software library that can be found on the SAM9RL-EK homepage on the Atmel website. The makefiles were adapted from the "getting started" example given in the /packages/ directory.
GNU compilers were used; these were the Codesourcery Lite versions.
I also obtained a Windows binary package of OpenOCD from Freddie Chopin's website (
http://www.freddiechopin.info), and I used an Amontec Jtagkey-tiny to upload code to the AT91SAM processor internal SRAM.
Thankfully, OpenOCD supports the AT91SAM9RL processor. I had to write a small configuration file, and then use telnet to send commands to OpenOCD.
In my openocd.cfg configuration file, I had the following two lines:
source [find interface/jtagkey-tiny.cfg]
source [find target/at91sam9rl.cfg]
I ran openocd by typing "openocd" in the same directory that I had created the openocd.cfg configuration file. The openocd binary had been added to my system $PATH variable.
I then opened another Terminal window and started telnet:
telnet localhost 4444
The telnet commands that I sent to OpenOCD were the following:
halt
load_image test-at91sam9rl-ek-at91sam9rl64-sram.bin 0x00300000
resume 0x00300000
The processor had to be stopped before loading the test program image. The resume operation started the program at the proper address.
I set this up in 32-bit Windows XP running in Virtual Box, but I am certain that this procedure would also work with Linux or even with Mac OS X. I found that OpenOCD and the JTAG drivers were more difficult to compile under Windows 7 (64-bit), so I abandoned this endeavor. Windows XP works just fine for running OpenOCD.
So thank you very much, CptTitanic, for your suggestion to write test code: I think this helped to lead me in the right direction.