TS-4200: Difference between revisions

From embeddedTS Manuals
No edit summary
No edit summary
Line 18: Line 18:
}}
}}


= Overview =
The TS-4200 is a high performance low power 400MHz Atmel AT91SAM9G20 ARM9 with 128MB RAM.
= Getting Started =
{{:Generic Getting Started}}
The TS-4700 receives power through several pins on the socket connector.  Refer to your baseboard documentation or schematics for locating the power in on your board.
== Get a Console ==
Console on the TS-4200 will by default come out of the CPU UART (ttyS0).  The console will use 8n1, no flow control, and a 115200 baud rate.  You can also telnet to the board with the [[default network configuration]], though this will omit the [[TS-BOOTROM]] messages which can be helpful for diagnostics.
{{:Console from Workstation}}
== Initrd / Busybox / Fastboot ==
When the board first boots you should see output similar to this:
  >> TS-BOOTROM - built Mar  9 2011 09:59:23
  >> Copyright (c) 2011, Technologic Systems
  >> Booting from SD card...
  .
  .
  .
  Uncompressing Linux... done, booting the kernel.
  >> Booted from: SD card                Booted in: 1.40 seconds
  >> SBC Model number: TS-4200            SBC Sub-model number: 0
  >> CPU clock rate: 396 MHz              RAM size: 128MB
  >> NAND Flash size: 256MB              NAND Flash Type: 0xdc20 (STMicro)
  >> MAC number: 00:D0:69:44:3E:9B        SBC FPGA Version: 4
  >> Temperature Sensor: 31.500 degC      MODE1 bootstrap: OFF
  >> RTC present: YES                    Date and Time: Jan  1 2001 00:01:49
  >> Base board type: TS-8200/Unknown    Base board FPGA Version: not present
  >> MODE2 bootstrap: ON                  SD card size: 1886MB
  >> Offboard SPI flash type: not present Offboard SPI flash size: not present
  >> XUARTs detected: 0                  CAN present: NO
  >> Linux kernel version: 2.6.36.2      Linux kernel date: Oct 7 2011
  >> Bootrom date: unknown                INITRD date: Oct  7 2011
  >> ts4200ctl date: Sep 27 2011          sdctl date: not present
  >> canctl date: not present            nandctl date: Sep 26 2011
  >> spiflashctl date: not present        xuartctl date: not present
  >> dioctl date: not present            spictl date: not present
  >> dmxctl date: not present            busybox date: Sep 26 2011 (v1.18.3)
  >> ts4200.subr date: Sep 29 2011        daqctl date: not present
  >> linuxrc date: Sep 27 2011            rootfs date: Oct  7 2011
  >> MBR date: Sept 20 2011
 
  Type 'tshelp' for help
  #
This is a busybox shell which presents you with a very minimalistic system.  This filesystem is loaded into memory, so none of the changes will be saved unless you type the command
<source lang=bash>
save
</source>
or mount a filesystem as read/write.  This can also provide a simple mechanism for running your application in an entirely read-only environment.  The linuxrc script will be the first thing executed as soon as the kernel is loaded.  This sets the default IP address, starts the userspace ctl applications, and more.  Read the linuxrc for more information.
While busybox itself doesn't contain much functionality, it does mount the [[Debian]] partition under /mnt/root/.  It will also add common paths and load libraries from the [[Debian]] system.  Many of the [[Debian]] applications will work by default. Whether or not a Debian application will work in fastboot needs to be judged per application.  If an application relies on certain paths being in certain places, or running services, you should instead boot to [[Debian]] to run them.
This shell when started on the COM port is what is blocking a [[Debian]] boot.  If you close it by typing
<source lang=bash>
exit
</source>
the boot process will continue.  If you are connected through telnet, this will instead open up its own instance of the shell so typing
<source lang=bash>
exit
</source>
will only end that session.  Through any connection method you can relink the linuxrc to change it to boot by default to Debian.
The initrd has these boot scripts available:
{| class="wikitable"
|-
! Script
! Function
|-
| linuxrc-fastboot (default)
| Boots immediately to a shell in ramdisk.  This will mount whichever boot medium you have selected to /mnt/root/.  When you type 'exit', it will boot to that medium.
|-
| linuxrc-nandmount
| Same as the linuxrc-fastboot script, but will mount and boot the debian partition from NAND.
|-
| linuxrc-sdmount
| Same as the linuxrc-fastboot script, but will mount and boot the debian partition from SD.
|-
| linuxrc-sdroot
| Boots immediately to the Debian stored on either SD or NAND depending on which device you have currently selected.
|-
| linuxrc-sdroot-readonly
| Same as linuxrc-sdroot, except it will mount the Debian partition read only while creating a unionfs with a ramdisk.  Changes will only happen in memory and not on disk.
|-
| linuxrc-usbroot
| Mounts the first partition of the first detected USB mass storage device and boots there.
|}
{{Note|Keep in mind the boot medium is selected by the pinout on your baseboard, not through software.}}
For example, to set the linuxrc to boot immediately to Debian on the SD you would run this:
<source lang=bash>
rm linuxrc; ln -s /linuxrc-sdroot /linuxrc; save
</source>
The small default initrd is only 2Mbyte but there is space for approximately 300 Kbyte of additional user applications. The binaries on the initrd are dynamically linked against embedded Linux's "uclibc" library instead of the more common Linux C library "glibc". "uclibc" is a smaller version of the standard C library optimized for embedded systems and requires a different set of GCC compiler tools which are available [ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/cross-toolchains/arm-uclibc-4.3.5-buildroot.tar.bz2 here].
The compiled instance of busybox includes several internal commands listed below:
  BusyBox v1.18.3 (2011-09-22 17:52:49 MST) multi-call binary.
  Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
  and others. Licensed under GPLv2.
  See source distribution for full notice.
 
  Usage: busybox [function] [arguments]...
    or: busybox --list[-full]
    or: function [arguments]...
 
  BusyBox is a multi-call binary that combines many common Unix
  utilities into a single executable.  Most people will create a
  link to busybox for each function they wish to use and BusyBox
  will act like whatever it was invoked as.
 
  Currently defined functions:
  [, [[, ar, ash, basename, cat, chat, chgrp, chmod, chown, chroot, chrt,
  cmp, cp, cpio, cttyhack, cut, date, dc, dd, depmod, devmem, df,
  dirname, dmesg, dnsdomainname, du, echo, egrep, env, expr, false,
  fdisk, fgrep, find, free, grep, gunzip, gzip, halt, head, hostname,
  hush, hwclock, ifconfig, insmod, ipcrm, ipcs, kill, killall, ln, login,
  ls, lsmod, lsusb, md5sum, mdev, microcom, mkdir, mkfifo, mknod,
  modinfo, modprobe, more, mount, mv, netstat, nohup, ping, pivot_root,
  poweroff, printf, ps, pwd, rdate, reboot, rm, rmdir, rmmod, route, rx,
  sed, seq, setconsole, setsid, sh, sha1sum, sha256sum, sha512sum, sleep,
  stty, sync, sysctl, tail, tar, tee, telnetd, test, tftp, time, top,
  touch, tr, true, udhcpc, umount, uname, unxz, unzip, uptime, usleep,
  uudecode, uuencode, vi, watch, wget, xargs, xz, xzcat, yes, zcat
Also on the initrd are the TS specific applications: [[dioctl]], [[dmxctl]], [[nandctl]], [[ts4700ctl]], and [[xuartctl]].  We also provide the ts4700.subr which provides the following functions:
 
  eth_off()
  eth_on()
  attime()
  usb_off()
  usb_on()
  usbload()
  sdload()
  nandsave()
  sdsave()
  save()
  sd2nand()
  nand2sd()
  setdiopin()
  getdiopin()
  getadc()
  pc104on()
  pc104off()
  setupclk()
  tshelp()
By default, linuxrc will not insert the necessary modules into the kernel to mount and use USB devices within the initrd/busybox environment if there is no USB device present upon bootup (USB support is enabled by default within the Debian environment). The quickest way to get a USB device (like a USB thumb drive) to mount in the initrd/busybox environment is to ensure that it is plugged in before the SBC is powered up. In order to get hot-swappable USB devices regardless of device presence at bootup time, you must "modprobe" the necessary modules. This has been done for you in the ts4200.subr file with the usbload() function.
= Boot Process =
[[File:Socket-boot-diagram.png|400px|thumb|right|Boot Process]]
{{:TS-Bootrom}}
= Backup / Restore =
{{:Write images through USB}}
== MicroSD Card ==
If backing up on a separate workstation, keep in mind windows does not have direct block device support needed to write these images.  You will also need to determine the SD card device.  You can usually find this in the output of 'dmesg' after inserting the SD card and you will typically see something like '/dev/sdb' as the block device and '/dev/sdb1' for the first partition.  On some newer kernels you will see '/dev/mmcblk0' as the block device and '/dev/mmcblkop1' for the first partition.  For these examples I will use the '/dev/mmcblk0' format.
If you are backing up directly on the board you will likely need to use some kind of offboard storage like a thumbdrive or external hard drive.  Make sure you have any nbd devices unmounted before trying to restore new ones.
You can find the latest SD card image [ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/binaries/ts-images/2gbsd-4200-latest.dd.bz2 here].  Make sure you decompress the image first before writing.
{{Note|Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks.  All of Technologic System's images are 10% smaller than the target disc size.  We STRONGLY recommend following that same practice on any mass-replicated images.}}
''' From Workstation ''' 
----
'''Backup '''
Entire SD card
<source lang=bash>
dd if=/dev/mmcblk0 of=/path/to/backup.dd bs=32k
</source>
{{Note|Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks.  All of Technologic System's images are 10% smaller than the target disc size.  We STRONGLY recommend following that same practice on any mass-replicated images.}}
Kernel
<source lang=bash>
dd if=/dev/mmcblk0p2 of=/path/to/zImage bs=32k
</source>
Initrd
<source lang=bash>
dd if=/dev/mmcblk0p3 of=/path/to/initrd bs=32k
</source>
''' Restore'''
Entire SD card
<source lang=bash>
dd if=/path/to/backup.dd of=/dev/mmcblk0 bs=32k
</source>
Kernel
<source lang=bash>
dd if=/path/to/zImage bs=32k of=/dev/mmcblk0p2
</source>
Initrd
<source lang=bash>
dd if=/initrd bs=32k of=/dev/mmcblk0p3
</source>
''' From SBC '''
----
'''Backup'''
Entire card
<source lang=bash>
dd if=/dev/mmcblk0 of=/path/to/backup.dd
</source>
Kernel
<source lang=bash>
dd if=/dev/mmcblk0p2 of=/path/to/backup.dd
</source>
Initrd
<source lang=bash>
dd if=/dev/mmcblk0p3 of=/path/to/backup.dd
</source>
'''Restore'''
The entire card from SBC
<source lang=bash>
dd if=/path/to/2gbsd-4200-latest.dd of=/dev/mmcblk0
</source>
Kernel
<source lang=bash>
dd if=/mnt/root/zImage of=/dev/mmcblk0p2
</source>
Initrd
<source lang=bash>
dd if=/mnt/root/initrd of=/dev/mmcblk0p3
</source>
''' Expected Partition Layout '''
{| class="wikitable"
|-
! Partition
! Contents
|-
| 1
| FAT32 (empty)
|-
| 2
| kernel binary (0xda)
|-
| 3
| initrd (0xda)
|-
| 4
| Debian root filesystem (EXT3)
|}
== XNAND ==
This needs to be done directly on the SBC.  Please note that all NBD partitions from the NAND card must be dismounted before attempting to image the NAND on the SBC.
{{Warning|Since there is no locking mechanism, it is not safe to run 2 copies of nandctl on this board.  Make sure you unmount your filesystems and stop running nandctl if you prefer to backup/write data with that.  These examples use 'dd' which is safe to use while nandctl is running.}}
You can find the latest xnand image [ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/binaries/ts-images/xnand-4200-latest.dd.gz here].
'''Backup'''
Entire Image
<source lang=bash>
# Compressed
dd if=/dev/nbd0 bs=131072 count=2048 | bzip2 > backup.dd.bz2
# or uncompressed
dd if=/dev/nbd0 bs=131072 count=2048 of=backup.dd
</source>
Kernel
<source lang=bash>
dd if=/dev/nbd1 bs=512 count=5119 of=/path/to/backup/zImage
</source>
Initrd
<source lang=bash>
dd if=/dev/nbd2 bs=512 count=5120 of=/path/to/backup/initrd
</source>
'''Restore'''
Entire Image
<source lang=bash>
dd if=xnand-4200-latest.dd bs=131072 count=2048 of=/dev/nbd0
</source>
Kernel
<source lang=bash>
dd of=/dev/nbd1 bs=512 count=5119 if=/path/to/backup/zImage
</source>
Initrd
<source lang=bash>
dd of=/dev/nbd2 bs=512 count=5120 if=/path/to/backup/initrd
</source>
''' Expected Partition Layout '''
{| class="wikitable"
|-
! Partition
! Contents
|-
| 1
| kernel binary (0xda)
|-
| 2
| initrd (0xda)
|-
| 3
| Debian root filesystem (EXT3)
|}


== Syscon ==
== Syscon ==
Line 151: Line 475:
| IRQ mask register
| IRQ mask register
|}
|}
= Operating System =
== Linux ==
=== Debian ===
Our boards boot a standard [[Debian]] Squeeze (EABI) distribution from the SD card which provides a large amount of software that you can install with relatively little effort.  See the [[Debian]] page for more general information on installing/removing software, and further documentation.
=== Emdebian ===
We also have Emdebian Grip on the XNAND.  Emdebian is binary compatible with standard [[Debian]], however it has a much smaller base.  You can read more about this project [http://www.emdebian.org/ here].
=== Software Development ===
Most of our examples are going to be in C, but Debian will include support for many more programming languages. Including (but not limited to) C++, PERL, PHP, SH, Java, BASIC, TCL, and Python. Most of the functionality from our software examples can be done from using system calls to run our userspace utilities. For higher performance, you will need to either use C/C++ or find functionally equivalent ways to perform the same actions as our examples. Our userspace applications are all designed to go through a TCP interface. By looking at the source for these applications, you can learn our protocol for communicating with the hardware interfaces in any language.
The most common method of development is directly on the SBC. Since debian has space available on the SD card, we include the build-essentials package which comes with everything you need to do C/C++ development on the board.
{{:Generic Linux Development}}
==== Cross Compiling ====
While you can develop entirely on the board itself, if you prefer to develop from another x86 compatible Linux system we have a cross compiler available.  For this board you will want to use [ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/cross-toolchains/arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 this toolchain].  To compile your application, you only need to use the version of GCC in the cross toolchain instead of the version supplied with your distribution.  The resulting binary will be for ARM.
<source lang=bash>
[user@localhost]$ /opt/4200/arm-2008q3/bin/arm-none-linux-gnueabi-gcc hello.c -o hello
[user@localhost]$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped
</source>
This is one of the simplest examples.  If you want to work with a project, you will typically create a makefile.  You can read more about makefiles [[http://www.gnu.org/software/make/manual/make.html#Introduction here]].  Another common requirement is linking to third party libraries provided by [[Debian]] on the board.  There is no exact set of steps you can take for every project, but the process will be very much the same.  Find the headers, and the libraries.  Sometimes you have to also copy over their binaries.  In this example, I will link to sqlite from Debian (which will also work in the Ubuntu image).
Install the sqlite library and header on the board:
<source lang=bash>
apt-get update && apt-get install -y libsqlite3-0 libsqlite-dev
</source>
This will fetch the binaries from the internet and install them.  You can list the installed files with dpkg:
<source lang=bash>
dpkg -L libsqlite3-0 libsqlite3-dev
</source>
The interesting files from this output will be the .so files, and the .h files.  In this case you will need to copy these files to your project directory.
I have a sample example with libsqlite3 below.  This is not intended to provide any functionality, but just call functions provided by sqlite.
<source lang=c>
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
int main(int argc, char **argv)
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
printf("opening test.db\n");
rc = sqlite3_open("test.db", &db);
if(rc){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
if(rc!=SQLITE_OK){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
printf("closing test.db\n");
sqlite3_close(db);
return 0;
}
</source>
To build this with the external libraries I have the makefile below.  This will have to be adjusted for your toolchain path.  In this example I placed the headers in external/include and the library in external/lib.
<source lang=make>
CC=/opt/4200/arm-2008q3/bin/arm-none-linux-gnueabi-gcc
CFLAGS=-c -Wall
all: sqlitetest
sqlitetest: sqlitetest.o
        $(CC) sqlitetest.o external/lib/libsqlite3.so.0 -o sqlitetest
sqlitetest.o: sqlitetest.c
        $(CC) $(CFLAGS) sqlitetest.c -Iexternal/include/
clean: 
        rm -rf *o sqlitetest.o sqlitetest
</source>
You can then copy this directly to the board and execute it.  There are many ways to transfer the compiled binaries to the board.  Using a network filesystem such as sshfs or NFS will be the simplest to use if you are frequently updating data, but will require more setup.  See your linux distribution's manual for more details.  The simplest network method is using ssh/sftp.  You can use winscp if from windows, or scp from linux.  Make sure you set a password from debian for root.  Otherwise the ssh server will deny connections.  From winscp, enter the ip address of the SBC, the root username, and the password you have set.  This will provide you with an explorer window you can drag files into.
For scp in linux, run:
<source lang=bash>
#replace with your app name and your SBC IP address
scp sqlitetest root@192.168.0.50:/root/
</source>
After transferring the file to the board, execute it:
<source lang=bash>
ts4200:~# ./sqlitetest
opening test.db
closing test.db
</source>
=== Kernel Compile Guide ===
{{Warning|BACKUP YOUR DATA FIRST}}
''' Prerequisites '''
RHEL/Fedora/CentOS:
<source lang=bash>
yum install ncurses-devel ncurses
yum groupinstall "Development Tools" "Development Libraries"
</source>
Ubuntu/Debian:
<source lang=bash>
apt-get install build-essential libncurses5-dev libncursesw5-dev
</source>
For other distributions, please refer to their documentation to find equivalent tools.
'''Set up the Sources and Toolchain'''
<source lang=bash>
# Download the cross compile toolchain (EABI)from Technologic Systems:
ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/cross-toolchains/arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
# Extract to current working directory:
tar xvf arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
# Download the Kernel sources
wget ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/sources/linux-2.6.36-ts-src-latest.tar.gz
# Extract the Kernel Sources
gzip -dc linux-2.6.36-ts-src-latest.tar.gz | tar xf -
cd linux-2.6.36-release/
</source>
'''Configure the Sources'''
The kernel sources need a few variables to be exported.
<source lang=bash>
# Set the CROSS_COMPILE variable to the absolute path to the toolchain.  This may be different for your system:
export CROSS_COMPILE=/opt/4200/arm-2008q3/bin/arm-none-linux-gnueabi-
# Normally, ARCH will be set based on your build hosts architecture.
export ARCH=arm
</source>
This sets up the default configuration that we ship with for the TS-4700
<source lang=bash>
make ts4200_defconfig
</source>
This will bring up a graphical menu where you can edit the configuration to include support for new devices.  For Example, to include support for a Prolific USB to serial adapter you would go to 'Device Drivers -> USB Support-> USB Serial Support' and then select 'USB Prolific 2303 Single Port Serial Driver'.  Since the kernel only has a limited space try to build build drivers as modules whenever possible.
<source lang=bash>
make menuconfig
</source>
'''Build the kernel'''
Once you have it configured, start building.  This usually takes a few minutes.
<source lang=bash>
make && make modules
</source>
The new kernel will be at "arch/arm/boot" in a compressed format called zImage.  The uncompressed version is simply called Image.  With the default partitioning scheme it is REQUIRED that the kernel be < 2096640 bytes in size.  If you need to shorten the size, try including your changes to the kernel as modules instead.  Otherwise you will need to resize the kernel partition to account for the size difference.
'''Install the kernel'''
Now that you have a kernel you can install it as you would our stock.  See the [[#Backup / Restore]] section for examples on writing this to disk.
'''Install Modules'''
Script to make directory and install modules
<source lang=bash>
./build-module-bundles.sh
</source>
The build-module-bundles.sh script is meant to be run as a user (not root) and will create directories and install modules to them.  The directory structure is created at /home/`whoami`/src/ts-4200/dist/<ts4200 kernel release number>/modules-install/.  In that directory is initrd-modules/, lib/, and modules-<ts4200 kernel release number>.tgz. 
initrd-modules/modules.tar.gz is a tarball that contains a minimal number of modules.  This tarball needs to be copied to the initrd partition of the boot media.  The boot process of the board will automatically un'tar this and insert any necessary modules.
Now the contents of lib/ can be copied to the root of the TS-4200. It is also possible to copy over modules-<ts4200 kernel release number>.tgz to the TS-4700 and unpack it in the root linux directory.  You may want to remove any old modules on the board in /lib/modules/* before copying them to the board to rule out any incompatibilities.  Once you boot up to the board, you need to run 'depmod' once to calculate module dependencies.  You can then run 'modprobe' with the device drivers you've added.  For the Prolific adapter added in the example, this would be:
<source lang=bash>
modprobe pl2303
</source>
{{:General Footer}}

Revision as of 13:00, 21 October 2011

TS-4200
TS-4200.jpg
Released Mar. 2011
Product Page
Documentation
Schematic
Mechanical Drawing
FTP Path
CPU Datasheet
CPU Manual
CPU Technical Reference Manual

Overview

The TS-4200 is a high performance low power 400MHz Atmel AT91SAM9G20 ARM9 with 128MB RAM.

Getting Started

A Linux PC is recommended for development. For developers who use Windows, virtualized Linux using VMWare or similar are recommended in order to make the full power of Linux available. The developer will need to be comfortable with Linux anyway in order to work with embedded Linux on the target platform. The main reasons that Linux is useful are:

  • Linux filesystems on the microSD card can be accessed on the PC.
  • More ARM cross-compilers are available.
  • If recovery is needed, a bootable medium can be written.
  • A network filesystem can be served.
  • Builds such as Linux kernel, buildroot, yocto, distro-seed will not work from WSL1/2 on a case insensitive filesystem.
WARNING: Be sure to take appropriate Electrostatic Discharge (ESD) precautions. Disconnect the power source before moving, cabling, or performing any set up procedures. Inappropriate handling may cause damage to the board.

The TS-4700 receives power through several pins on the socket connector. Refer to your baseboard documentation or schematics for locating the power in on your board.

Get a Console

Console on the TS-4200 will by default come out of the CPU UART (ttyS0). The console will use 8n1, no flow control, and a 115200 baud rate. You can also telnet to the board with the default network configuration, though this will omit the TS-BOOTROM messages which can be helpful for diagnostics.

Use a null modem cable to connect the ARM system to your workstation. If you do not have a COM port on your system (as many newer systems do not), you can find a USB serial adapter that will bring out RS232.

Console from Linux

There are many serial clients for Linux, but 3 simple ones would be picocom, screen, and minicom. These examples assume that your COM device is /dev/ttyUSB0 (common for USB adapters), but replace them with the COM device on your workstation.

Linux has a few applications capable of connecting to the board over serial. You can use any of these clients that may be installed or available in your workstation's package manager:

Picocom is a very small and simple client.

picocom -b 115200 /dev/ttyUSB0

Screen is a terminal multiplexer which happens to have serial support.

screen /dev/ttyUSB0 115200

Or a very commonly used client is minicom which is quite powerful:

minicom -s
  • Navigate to 'serial port setup'
  • Type "a" and change location of serial device to '/dev/ttyUSB0' then hit "enter"
  • If needed, modify the settings to match this and hit "esc" when done:
     E - Bps/Par/Bits          : 115200 8N1
     F - Hardware Flow Control : No
     G - Software Flow Control : No
  • Navigate to 'Save setup as dfl', hit "enter", and then "esc"

Console from Windows

Putty is a small simple client available for download here. Open up Device Manager to determine your console port. See the putty configuration image for more details.

Device Manager Putty Configuration

Initrd / Busybox / Fastboot

When the board first boots you should see output similar to this:

 >> TS-BOOTROM - built Mar  9 2011 09:59:23
 >> Copyright (c) 2011, Technologic Systems
 >> Booting from SD card...
 .
 .
 .
 Uncompressing Linux... done, booting the kernel.
 >> Booted from: SD card                 Booted in: 1.40 seconds
 >> SBC Model number: TS-4200            SBC Sub-model number: 0
 >> CPU clock rate: 396 MHz              RAM size: 128MB
 >> NAND Flash size: 256MB               NAND Flash Type: 0xdc20 (STMicro)
 >> MAC number: 00:D0:69:44:3E:9B        SBC FPGA Version: 4
 >> Temperature Sensor: 31.500 degC      MODE1 bootstrap: OFF
 >> RTC present: YES                     Date and Time: Jan  1 2001 00:01:49
 >> Base board type: TS-8200/Unknown     Base board FPGA Version: not present
 >> MODE2 bootstrap: ON                  SD card size: 1886MB
 >> Offboard SPI flash type: not present Offboard SPI flash size: not present
 >> XUARTs detected: 0                   CAN present: NO
 >> Linux kernel version: 2.6.36.2       Linux kernel date: Oct 7 2011
 >> Bootrom date: unknown                INITRD date: Oct  7 2011
 >> ts4200ctl date: Sep 27 2011          sdctl date: not present
 >> canctl date: not present             nandctl date: Sep 26 2011
 >> spiflashctl date: not present        xuartctl date: not present
 >> dioctl date: not present             spictl date: not present
 >> dmxctl date: not present             busybox date: Sep 26 2011 (v1.18.3)
 >> ts4200.subr date: Sep 29 2011        daqctl date: not present
 >> linuxrc date: Sep 27 2011            rootfs date: Oct  7 2011
 >> MBR date: Sept 20 2011
 
 Type 'tshelp' for help
 # 

This is a busybox shell which presents you with a very minimalistic system. This filesystem is loaded into memory, so none of the changes will be saved unless you type the command

save

or mount a filesystem as read/write. This can also provide a simple mechanism for running your application in an entirely read-only environment. The linuxrc script will be the first thing executed as soon as the kernel is loaded. This sets the default IP address, starts the userspace ctl applications, and more. Read the linuxrc for more information.

While busybox itself doesn't contain much functionality, it does mount the Debian partition under /mnt/root/. It will also add common paths and load libraries from the Debian system. Many of the Debian applications will work by default. Whether or not a Debian application will work in fastboot needs to be judged per application. If an application relies on certain paths being in certain places, or running services, you should instead boot to Debian to run them.

This shell when started on the COM port is what is blocking a Debian boot. If you close it by typing

exit

the boot process will continue. If you are connected through telnet, this will instead open up its own instance of the shell so typing

exit

will only end that session. Through any connection method you can relink the linuxrc to change it to boot by default to Debian.

The initrd has these boot scripts available:

Script Function
linuxrc-fastboot (default) Boots immediately to a shell in ramdisk. This will mount whichever boot medium you have selected to /mnt/root/. When you type 'exit', it will boot to that medium.
linuxrc-nandmount Same as the linuxrc-fastboot script, but will mount and boot the debian partition from NAND.
linuxrc-sdmount Same as the linuxrc-fastboot script, but will mount and boot the debian partition from SD.
linuxrc-sdroot Boots immediately to the Debian stored on either SD or NAND depending on which device you have currently selected.
linuxrc-sdroot-readonly Same as linuxrc-sdroot, except it will mount the Debian partition read only while creating a unionfs with a ramdisk. Changes will only happen in memory and not on disk.
linuxrc-usbroot Mounts the first partition of the first detected USB mass storage device and boots there.
Note: Keep in mind the boot medium is selected by the pinout on your baseboard, not through software.

For example, to set the linuxrc to boot immediately to Debian on the SD you would run this:

rm linuxrc; ln -s /linuxrc-sdroot /linuxrc; save

The small default initrd is only 2Mbyte but there is space for approximately 300 Kbyte of additional user applications. The binaries on the initrd are dynamically linked against embedded Linux's "uclibc" library instead of the more common Linux C library "glibc". "uclibc" is a smaller version of the standard C library optimized for embedded systems and requires a different set of GCC compiler tools which are available here.

The compiled instance of busybox includes several internal commands listed below:

 BusyBox v1.18.3 (2011-09-22 17:52:49 MST) multi-call binary.
 Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
 and others. Licensed under GPLv2.
 See source distribution for full notice.
 
 Usage: busybox [function] [arguments]...
    or: busybox --list[-full]
    or: function [arguments]...
 
 	BusyBox is a multi-call binary that combines many common Unix
 	utilities into a single executable.  Most people will create a
 	link to busybox for each function they wish to use and BusyBox
 	will act like whatever it was invoked as.
 
 Currently defined functions:
 	[, [[, ar, ash, basename, cat, chat, chgrp, chmod, chown, chroot, chrt,
 	cmp, cp, cpio, cttyhack, cut, date, dc, dd, depmod, devmem, df,
 	dirname, dmesg, dnsdomainname, du, echo, egrep, env, expr, false,
 	fdisk, fgrep, find, free, grep, gunzip, gzip, halt, head, hostname,
 	hush, hwclock, ifconfig, insmod, ipcrm, ipcs, kill, killall, ln, login,
 	ls, lsmod, lsusb, md5sum, mdev, microcom, mkdir, mkfifo, mknod,
 	modinfo, modprobe, more, mount, mv, netstat, nohup, ping, pivot_root,
 	poweroff, printf, ps, pwd, rdate, reboot, rm, rmdir, rmmod, route, rx,
 	sed, seq, setconsole, setsid, sh, sha1sum, sha256sum, sha512sum, sleep,
 	stty, sync, sysctl, tail, tar, tee, telnetd, test, tftp, time, top,
 	touch, tr, true, udhcpc, umount, uname, unxz, unzip, uptime, usleep,
 	uudecode, uuencode, vi, watch, wget, xargs, xz, xzcat, yes, zcat


Also on the initrd are the TS specific applications: dioctl, dmxctl, nandctl, ts4700ctl, and xuartctl. We also provide the ts4700.subr which provides the following functions:

 eth_off()
 eth_on()
 attime()
 usb_off()
 usb_on()
 usbload()
 sdload()
 nandsave()
 sdsave()
 save()
 sd2nand()
 nand2sd()
 setdiopin()
 getdiopin()
 getadc()
 pc104on()
 pc104off()
 setupclk()
 tshelp()

By default, linuxrc will not insert the necessary modules into the kernel to mount and use USB devices within the initrd/busybox environment if there is no USB device present upon bootup (USB support is enabled by default within the Debian environment). The quickest way to get a USB device (like a USB thumb drive) to mount in the initrd/busybox environment is to ensure that it is plugged in before the SBC is powered up. In order to get hot-swappable USB devices regardless of device presence at bootup time, you must "modprobe" the necessary modules. This has been done for you in the ts4200.subr file with the usbload() function.

Boot Process

Boot Process

This section describes what code is executed when a system is powered on or reset using our TS-BOOTROM. The sequence is:

  • CPU BootROM
  • TS-BOOTROM
  • Linux kernel
  • linuxrc (initrd)
  • Debian init
  • Embedded application

The Debian init step may be excluded on systems that do not require Debian.

This board does not support U-Boot, RedBoot, or other standard bootloaders. The TS-BOOTROM is optimized for speed. This makes our systems ideal for applications that need to start immediately upon power-up. The TS-BOOTROM performs basic register initializations and RAM initialization, and then it selects a boot media based on jumper settings. If the media indicated by the jumper is clearly not bootable, the bootrom may fall back and boot from the other device.

Once the boot media is chosen, the TS-BOOTROM passes control to the 446 bytes of code found in the MBR. This code scans the partition table for partitions with an ID of 0xDA. The first partition found with this magic ID is loaded into RAM and treated as a kernel binary. If a second partition with this id is found, it is loaded into RAM and treated as an initial ramdisk. When this is done, execution jumps into the kernel.

For the small minority of systems that have a need to perform other behavior at boot time instead of executing a Linux kernel, developers will need to fully understand the functionality of the TS-BOOTROM. Second stage bootloaders, custom microcontroller-style binaries, or other operating systems can be loaded by TS-BOOTROM as long as they have an execution entry point in the same place as the Linux kernel would have on the particular System-on-Module in question. Contact embeddedTS if you need to execute a binary besides Linux.

Backup / Restore

If you are using a Windows workstation there is no support for writing directly to block devices. However, as long as one of your booting methods still can boot a kernel and the initrd you can rewrite everything by using a usb drive. This is also a good way to blast many stock boards when moving your product into production. You can find more information about this method with an example script here.

Note: Note that the MBR installed by default on this board contains a 446 byte bootloader program that loads the initial power-on kernel and initrd from the first and second partitions. Replacing it with an MBR found on a PC would not work as a PC MBR contains an x86 code bootup program.

MicroSD Card

If backing up on a separate workstation, keep in mind windows does not have direct block device support needed to write these images. You will also need to determine the SD card device. You can usually find this in the output of 'dmesg' after inserting the SD card and you will typically see something like '/dev/sdb' as the block device and '/dev/sdb1' for the first partition. On some newer kernels you will see '/dev/mmcblk0' as the block device and '/dev/mmcblkop1' for the first partition. For these examples I will use the '/dev/mmcblk0' format.

If you are backing up directly on the board you will likely need to use some kind of offboard storage like a thumbdrive or external hard drive. Make sure you have any nbd devices unmounted before trying to restore new ones.

You can find the latest SD card image here. Make sure you decompress the image first before writing.

Note: Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks. All of Technologic System's images are 10% smaller than the target disc size. We STRONGLY recommend following that same practice on any mass-replicated images.

From Workstation


Backup

Entire SD card

dd if=/dev/mmcblk0 of=/path/to/backup.dd bs=32k
Note: Not all SD cards are created equally, over time they tend to shrink in size due to automatic retiring of bad blocks. All of Technologic System's images are 10% smaller than the target disc size. We STRONGLY recommend following that same practice on any mass-replicated images.

Kernel

dd if=/dev/mmcblk0p2 of=/path/to/zImage bs=32k

Initrd

dd if=/dev/mmcblk0p3 of=/path/to/initrd bs=32k

Restore

Entire SD card

dd if=/path/to/backup.dd of=/dev/mmcblk0 bs=32k

Kernel

dd if=/path/to/zImage bs=32k of=/dev/mmcblk0p2

Initrd

dd if=/initrd bs=32k of=/dev/mmcblk0p3

From SBC


Backup

Entire card

dd if=/dev/mmcblk0 of=/path/to/backup.dd

Kernel

dd if=/dev/mmcblk0p2 of=/path/to/backup.dd

Initrd

dd if=/dev/mmcblk0p3 of=/path/to/backup.dd

Restore

The entire card from SBC

dd if=/path/to/2gbsd-4200-latest.dd of=/dev/mmcblk0

Kernel

dd if=/mnt/root/zImage of=/dev/mmcblk0p2

Initrd

dd if=/mnt/root/initrd of=/dev/mmcblk0p3

Expected Partition Layout

Partition Contents
1 FAT32 (empty)
2 kernel binary (0xda)
3 initrd (0xda)
4 Debian root filesystem (EXT3)

XNAND

This needs to be done directly on the SBC. Please note that all NBD partitions from the NAND card must be dismounted before attempting to image the NAND on the SBC.

WARNING: Since there is no locking mechanism, it is not safe to run 2 copies of nandctl on this board. Make sure you unmount your filesystems and stop running nandctl if you prefer to backup/write data with that. These examples use 'dd' which is safe to use while nandctl is running.

You can find the latest xnand image here.

Backup

Entire Image

# Compressed
dd if=/dev/nbd0 bs=131072 count=2048 | bzip2 > backup.dd.bz2
# or uncompressed
dd if=/dev/nbd0 bs=131072 count=2048 of=backup.dd

Kernel

dd if=/dev/nbd1 bs=512 count=5119 of=/path/to/backup/zImage

Initrd

dd if=/dev/nbd2 bs=512 count=5120 of=/path/to/backup/initrd

Restore

Entire Image

dd if=xnand-4200-latest.dd bs=131072 count=2048 of=/dev/nbd0

Kernel

dd of=/dev/nbd1 bs=512 count=5119 if=/path/to/backup/zImage

Initrd

dd of=/dev/nbd2 bs=512 count=5120 if=/path/to/backup/initrd

Expected Partition Layout

Partition Contents
1 kernel binary (0xda)
2 initrd (0xda)
3 Debian root filesystem (EXT3)

Syscon

Offset Bits Usage
0x0 15:0 Model ID: Reads 0x4200
0x2 15 Green LED (1 = on)
14 Red LED (1 = on)
13:8 Reserved
7:4 Board Sub-model: reads 0x0 on standard unit
3:0 FPGA revision
0x4 15:0 DIO direction for DIO 15(MSB)-0(LSB)
0x6 15:0 DIO output data for DIO 15(MSB)-0(LSB)
0x8 15:0 DIO input data for DIO 15(MSB)-0(LSB)
0xa 15:12 Reserved
11 UART0 9 bit mode (so that TX_EN works correctly)
10 1 = use DIO12 for uart0 TX_EN instead of DIO
9 1 = use 512Hz for WDT instead of 200Hz
8 1 = auto reboot when DIO 9 is driven low (enable reset button)
7:6 Scratch Register (used by bootrom)
5:4 Mode strapping inputs Mode2 and Mode1
3 Reserved
2 1 = Enable power to Ethernet PHY
1 1 = Enable power to SD card
0 Offboard reset signal (1 = reset)
0xc 15:0 32-bit 1MHz free running counter (16 LSBs)
0xe 15:0 32-bit 1MHz free running counter (16 MSBs)
0x10 15:0 Watchdog feed register
0x12 15:0 DIO direction for DIO 31(MSB) - 16(LSB)
0x14 15:0 DIO output data for DIO 31(MSB) - 16(LSB)
0x16 15:0 DIO input data for DIO 31(MSB) - 16(LSB)
0x18 15:0 Hardware RNG (16 LSB)
0x1a 15:0 Hardware RNG (16 MSB)
0x1c 15 Embedded FlashROM CLK
14:8 Embedded FlashROM Address
7:0 Embedded FlashROM Data Byte
0x1e 15:0 UART0 baud rate divisor (for UART0 TX_EN)
0x20 15:0 MUXBUS configuration register
0x22 15:0 IRQ register
0x24 15:0 IRQ mask register

Operating System

Linux

Debian

Our boards boot a standard Debian Squeeze (EABI) distribution from the SD card which provides a large amount of software that you can install with relatively little effort. See the Debian page for more general information on installing/removing software, and further documentation.

Emdebian

We also have Emdebian Grip on the XNAND. Emdebian is binary compatible with standard Debian, however it has a much smaller base. You can read more about this project here.

Software Development

Most of our examples are going to be in C, but Debian will include support for many more programming languages. Including (but not limited to) C++, PERL, PHP, SH, Java, BASIC, TCL, and Python. Most of the functionality from our software examples can be done from using system calls to run our userspace utilities. For higher performance, you will need to either use C/C++ or find functionally equivalent ways to perform the same actions as our examples. Our userspace applications are all designed to go through a TCP interface. By looking at the source for these applications, you can learn our protocol for communicating with the hardware interfaces in any language.

The most common method of development is directly on the SBC. Since debian has space available on the SD card, we include the build-essentials package which comes with everything you need to do C/C++ development on the board.


Editors

Vim is a very common editor to use in Linux. While it isn't the most intuitive at a first glance, you can run 'vimtutor' to get a ~30 minute instruction on how to use this editor. Once you get past the initial learning curve it can make you very productive. You can find the vim documentation here.

Emacs is another very common editor. Similar to vim, it is difficult to learn but rewarding in productivity. You can find documentation on emacs here.

Nano while not as commonly used for development is the easiest. It doesn't have as many features to assist in code development, but is much simpler to begin using right away. If you've used 'edit' on Windows/DOS, this will be very familiar. You can find nano documentation here.

Compilers

We only recommend the gnu compiler collection. There are many other commercial compilers which can also be used, but will not be supported by us. You can install gcc on most boards in Debian by simply running 'apt-get update && apt-get install build-essential'. This will include everything needed for standard development in c/c++.

You can find the gcc documentation here. You can find a simple hello world tutorial for c++ with gcc here.

Build tools

When developing your application typing out the compiler commands with all of your arguments would take forever. The most common way to handle these build systems is using a make file. This lets you define your project sources, libraries, linking, and desired targets. You can read more about makefiles here.

If you are building an application intended to be more portable than on this one system, you can also look into the automake tools which are intended to help make that easier. You can find an introduction to the autotools here.

Cmake is another alternative which generates a makefile. This is generally simpler than using automake, but is not as mature as the automake tools. You can find a tutorial here.

Debuggers

Linux has a few tools which are very helpful for debugging code. The first of which is gdb (part of the gnu compiler collection). This lets you run your code with breakpoints, get backgraces, step forward or backward, and pick apart memory while your application executes. You can find documentation on gdb here.

Strace will allow you to watch how your application interacts with the running kernel which can be useful for diagnostics. You can find the manual page here.

Ltrace will do the same thing with any generic library. You can find the manual page here.

Cross Compiling

While you can develop entirely on the board itself, if you prefer to develop from another x86 compatible Linux system we have a cross compiler available. For this board you will want to use this toolchain. To compile your application, you only need to use the version of GCC in the cross toolchain instead of the version supplied with your distribution. The resulting binary will be for ARM.

[user@localhost]$ /opt/4200/arm-2008q3/bin/arm-none-linux-gnueabi-gcc hello.c -o hello
[user@localhost]$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped

This is one of the simplest examples. If you want to work with a project, you will typically create a makefile. You can read more about makefiles [here]. Another common requirement is linking to third party libraries provided by Debian on the board. There is no exact set of steps you can take for every project, but the process will be very much the same. Find the headers, and the libraries. Sometimes you have to also copy over their binaries. In this example, I will link to sqlite from Debian (which will also work in the Ubuntu image).

Install the sqlite library and header on the board:

apt-get update && apt-get install -y libsqlite3-0 libsqlite-dev

This will fetch the binaries from the internet and install them. You can list the installed files with dpkg:

dpkg -L libsqlite3-0 libsqlite3-dev

The interesting files from this output will be the .so files, and the .h files. In this case you will need to copy these files to your project directory.

I have a sample example with libsqlite3 below. This is not intended to provide any functionality, but just call functions provided by sqlite.

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

int main(int argc, char **argv)
{
	sqlite3 *db;
	char *zErrMsg = 0;
	int rc;
	printf("opening test.db\n");
	rc = sqlite3_open("test.db", &db);
	if(rc){
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		exit(1);
	}
	if(rc!=SQLITE_OK){
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
	}
	printf("closing test.db\n");
	sqlite3_close(db);
	return 0;
}

To build this with the external libraries I have the makefile below. This will have to be adjusted for your toolchain path. In this example I placed the headers in external/include and the library in external/lib.

CC=/opt/4200/arm-2008q3/bin/arm-none-linux-gnueabi-gcc
CFLAGS=-c -Wall

all: sqlitetest

sqlitetest: sqlitetest.o
        $(CC) sqlitetest.o external/lib/libsqlite3.so.0 -o sqlitetest
sqlitetest.o: sqlitetest.c
        $(CC) $(CFLAGS) sqlitetest.c -Iexternal/include/

clean:  
        rm -rf *o sqlitetest.o sqlitetest

You can then copy this directly to the board and execute it. There are many ways to transfer the compiled binaries to the board. Using a network filesystem such as sshfs or NFS will be the simplest to use if you are frequently updating data, but will require more setup. See your linux distribution's manual for more details. The simplest network method is using ssh/sftp. You can use winscp if from windows, or scp from linux. Make sure you set a password from debian for root. Otherwise the ssh server will deny connections. From winscp, enter the ip address of the SBC, the root username, and the password you have set. This will provide you with an explorer window you can drag files into.

For scp in linux, run:

#replace with your app name and your SBC IP address
scp sqlitetest root@192.168.0.50:/root/

After transferring the file to the board, execute it:

ts4200:~# ./sqlitetest 
opening test.db
closing test.db


Kernel Compile Guide

WARNING: BACKUP YOUR DATA FIRST

Prerequisites

RHEL/Fedora/CentOS:

yum install ncurses-devel ncurses
yum groupinstall "Development Tools" "Development Libraries"

Ubuntu/Debian:

apt-get install build-essential libncurses5-dev libncursesw5-dev

For other distributions, please refer to their documentation to find equivalent tools.

Set up the Sources and Toolchain

# Download the cross compile toolchain (EABI)from Technologic Systems:
ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/cross-toolchains/arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

# Extract to current working directory:
tar xvf arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

# Download the Kernel sources
wget ftp://ftp.embeddedarm.com/ts-socket-macrocontrollers/ts-4200-linux/sources/linux-2.6.36-ts-src-latest.tar.gz

# Extract the Kernel Sources
gzip -dc linux-2.6.36-ts-src-latest.tar.gz | tar xf -

cd linux-2.6.36-release/

Configure the Sources

The kernel sources need a few variables to be exported.

# Set the CROSS_COMPILE variable to the absolute path to the toolchain.  This may be different for your system:
export CROSS_COMPILE=/opt/4200/arm-2008q3/bin/arm-none-linux-gnueabi-

# Normally, ARCH will be set based on your build hosts architecture.
export ARCH=arm

This sets up the default configuration that we ship with for the TS-4700

make ts4200_defconfig

This will bring up a graphical menu where you can edit the configuration to include support for new devices. For Example, to include support for a Prolific USB to serial adapter you would go to 'Device Drivers -> USB Support-> USB Serial Support' and then select 'USB Prolific 2303 Single Port Serial Driver'. Since the kernel only has a limited space try to build build drivers as modules whenever possible.

make menuconfig

Build the kernel Once you have it configured, start building. This usually takes a few minutes.

make && make modules

The new kernel will be at "arch/arm/boot" in a compressed format called zImage. The uncompressed version is simply called Image. With the default partitioning scheme it is REQUIRED that the kernel be < 2096640 bytes in size. If you need to shorten the size, try including your changes to the kernel as modules instead. Otherwise you will need to resize the kernel partition to account for the size difference.

Install the kernel Now that you have a kernel you can install it as you would our stock. See the #Backup / Restore section for examples on writing this to disk.

Install Modules Script to make directory and install modules

./build-module-bundles.sh

The build-module-bundles.sh script is meant to be run as a user (not root) and will create directories and install modules to them. The directory structure is created at /home/`whoami`/src/ts-4200/dist/<ts4200 kernel release number>/modules-install/. In that directory is initrd-modules/, lib/, and modules-<ts4200 kernel release number>.tgz.

initrd-modules/modules.tar.gz is a tarball that contains a minimal number of modules. This tarball needs to be copied to the initrd partition of the boot media. The boot process of the board will automatically un'tar this and insert any necessary modules.

Now the contents of lib/ can be copied to the root of the TS-4200. It is also possible to copy over modules-<ts4200 kernel release number>.tgz to the TS-4700 and unpack it in the root linux directory. You may want to remove any old modules on the board in /lib/modules/* before copying them to the board to rule out any incompatibilities. Once you boot up to the board, you need to run 'depmod' once to calculate module dependencies. You can then run 'modprobe' with the device drivers you've added. For the Prolific adapter added in the example, this would be:

modprobe pl2303


Product Notes

FCC Advisory

This equipment generates, uses, and can radiate radio frequency energy and if not installed and used properly (that is, in strict accordance with the manufacturer's instructions), may cause interference to radio and television reception. It has been type tested and found to comply with the limits for a Class A digital device in accordance with the specifications in Part 15 of FCC Rules, which are designed to provide reasonable protection against such interference when operated in a commercial environment. Operation of this equipment in a residential area is likely to cause interference, in which case the owner will be required to correct the interference at his own expense.

If this equipment does cause interference, which can be determined by turning the unit on and off, the user is encouraged to try the following measures to correct the interference:

Reorient the receiving antenna. Relocate the unit with respect to the receiver. Plug the unit into a different outlet so that the unit and receiver are on different branch circuits. Ensure that mounting screws and connector attachment screws are tightly secured. Ensure that good quality, shielded, and grounded cables are used for all data communications. If necessary, the user should consult the dealer or an experienced radio/television technician for additional suggestions. The following booklets prepared by the Federal Communications Commission (FCC) may also prove helpful:

How to Identify and Resolve Radio-TV Interference Problems (Stock No. 004-000-000345-4) Interface Handbook (Stock No. 004-000-004505-7) These booklets may be purchased from the Superintendent of Documents, U.S. Government Printing Office, Washington, DC 20402.

Limited Warranty

See our Terms and Conditions for more details.