This page documents an ARM9 single board computer designed for image acquisition and processing. It's an open implementation, which means schematics and layout files are freely available. The platform runs Linux/ARM, and is very easy to develop for. All software development tools are free. With the exception of Altera's Quartus II Web Edition (used to program the FPGA), every tool is also open-source.
The platform features the following:
The ARM9 SBC was developed in 2005 as my graduation project at the University of São Paulo's Polytechnic School of Engineering. I thought it would be interesting to make my graduation project a digital camera. I also wanted to develop an ARM platform, so I decided to merge both ideas into a Linux camera/SBC combo. The result was a 16.5x7.5 cm (6.5x3.0 in) single board computer which runs off a USB keydrive. It runs a typical ARM port of Debian Linux with a patched 2.6 kernel.
Schematics are also available in PDF and PS format.
|
layout.pdf layout.ps |
drill.pdf drill.ps |
|
top.pdf top.ps |
bot.pdf bot.ps |
|
pwr.pdf pwr.ps |
gnd.pdf gnd.ps |
|
sst.pdf sst.ps |
ssb.pdf ssb.ps |
|
smt.pdf smt.ps |
smb.pdf smb.ps |
You can also download Gerber files which can be used to manufacture the PCB.
Uncompressing Linux................................................................. done, booting the kernel.
Linux version 2.6.12-rc4 (root@flavio.dyndns.org) (gcc version 3.4.3) #14 Wed Aug 24 12:58:34 BRT 2005
CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Machine: ATMEL AT91RM9200
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists
Kernel command line: mem=32M console=ttyS0,115200 root=/dev/scsi/host0/bus0/target0/lun0/part1 rw
AT91: 128 gpio irqs in 4 banks
PID hash table entries: 256 (order: 8, 4096 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 32MB = 32MB total
Memory: 30336KB available (1667K code, 292K data, 72K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
SCSI subsystem initialized
usbcore: registered new driver usbfs
usbcore: registered new driver hub
NetWinder Floating Point Emulator V0.97 (double precision)
devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x1
AT91 Real Time Clock driver.
AT91 SPI driver loaded
AT91 Watchdog Timer enabled (5 seconds)
ttyS0 at MMIO 0xfefff200 (irq = 1) is a AT91_SERIAL
ttyS1 at MMIO 0xfefc4000 (irq = 7) is a AT91_SERIAL
io scheduler noop registered
io scheduler anticipatory registered
at91_ether: Your bootloader did not configure a MAC address.
eth0: AT91 ethernet at 0xfefbc000 int=24 10-HalfDuplex (00:00:00:00:00:00)
eth0: Intel LXT971A PHY
at91rm9200-ohci at91rm9200-ohci: AT91RM9200 OHCI
at91rm9200-ohci at91rm9200-ohci: new USB bus registered, assigned bus number 1
at91rm9200-ohci at91rm9200-ohci: irq 23, io base 0x00300000
usb usb1: Product: AT91RM9200 OHCI
usb usb1: Manufacturer: Linux 2.6.12-rc4 ohci_hcd
usb usb1: SerialNumber: at91rm9200
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
Initializing USB Mass Storage driver...
usb 1-1: new full speed USB device using at91rm9200-ohci and address 2
usb 1-1: Product: Cruzer Micro
usb 1-1: Manufacturer: SanDisk Corporation
usb 1-1: SerialNumber: SNDK2199950D57608305
scsi0 : SCSI emulation for USB Mass Storage devices
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
mice: PS/2 mouse device common for all mice
i2c /dev entries driver
Found AT91 i2c
NET: Registered protocol family 2
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
NET: Registered protocol family 1
NET: Registered protocol family 17
Vendor: SanDisk Model: Cruzer Micro Rev: 0.2
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sda: 1000944 512-byte hdwr sectors (512 MB)
sda: Write Protect is off
sda: assuming drive cache: write through
SCSI device sda: 1000944 512-byte hdwr sectors (512 MB)
sda: Write Protect is off
sda: assuming drive cache: write through
/dev/scsi/host0/bus0/target0/lun0: p1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
ReiserFS: sda1: found reiserfs format "3.6" with standard journal
ReiserFS: sda1: using ordered data mode
ReiserFS: sda1: journal params: device sda1, size 8192, journal first block 18, max trans len 1024, max batch 900, max commit age 30, max trans age 30
ReiserFS: sda1: checking transaction log (sda1)
ReiserFS: sda1: Using r5 hash to sort names
VFS: Mounted root (reiserfs filesystem).
Mounted devfs on /dev
Freeing init memory: 72K
INIT: version 2.86 booting
Activating swap.
Checking root file system...
fsck 1.37 (21-Mar-2005)
Reiserfs super block in block 16 on 0x801 of format 3.6 with standard journal
Blocks (total/free): 125104/74850 by 4096 bytes
Filesystem is clean
Filesystem seems mounted read-only. Skipping journal replay.
Checking internal tree..finished
System time was Thu Jan 1 00:00:29 UTC 1998.
Setting the System Clock using the Hardware Clock as reference...
System Clock set. System local time is now Thu Jan 1 00:00:30 UTC 1998.
Cleaning up ifupdown...done.
Checking all file systems...
fsck 1.37 (21-Mar-2005)
Setting kernel variables ...
... done.
Mounting local filesystems...
Cleaning /tmp /var/run /var/lock.
Setting up networking...done.
Setting up IP spoofing protection: rp_filter.
Configuring network interfaces...eth0: Setting MAC address to aa:bb:cc:00:11:22
eth0: Link down.
eth0: Link down.
done.
Setting the System Clock using the Hardware Clock as reference...
System Clock set. Local time: Wed Dec 31 22:00:35 BRST 1997
Initializing random number generator...done.
INIT: Entering runlevel: 2
Starting internet superserver: inetd.
Starting OpenBSD Secure Shell server: sshd.
Debian GNU/Linux 3.1 (none) ttyS0
(none) login:
In order to boot the SBC, the following are required:
To access the Micron CMOS sensor you'll need to program the FPGA. Altera's Quartus II Web Edition is free and can be downloaded at their web site. I wrote simple demo code featuring a full-page burst mode SDRAM controller in order to read whole frames. It's more than adequate for taking snapshots. You can download it here.
I wrote a few user-space utilities to configure the FPGA, configure the Micron sensor and read frames. They're very simple, but do the job nicely.
I'd like to thank the following people who helped me along on the course of this project:
Everything in this page may be distributed freely, provided that it is not modified in any form and identifies the author.
Suggestions, questions and bug reports may be e-mailed to Flavio Ribeiro, fr@ime.usp.br.
A few visitors have inquired about buying an SBC. I only made one prototype, but I could make a short run (25 units or so) if I get enough requests. Semiconductors and PCBs are quite expensive in small quantities, so smaller runs probably wouldn't be cost effective.