TS-7600: Difference between revisions
(→FPGA) |
|||
Line 178: | Line 178: | ||
==== Example NBUS application ==== | ==== Example NBUS application ==== | ||
When writing applications that should communicate over the NBUS you should use the calls in [ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7600-linux/sources/nbus.c nbus.c] and [ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7600-linux/sources/nbus.h nbus.h]. These will compile for c/c++ but if you are using another language such as Java or Python the best implementation is typically to write your hardware accesses in C, and use your languages popen/system() calls to execute the application handling NBUS calls. | When writing applications that should communicate over the NBUS you should use the calls in [ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7600-linux/sources/nbus.c nbus.c] and [ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7600-linux/sources/nbus.h nbus.h]. These will compile for c/c++ but if you are using another language such as Java or Python the best implementation is typically to write your hardware accesses in C, and use your languages popen/system() calls to execute the application handling NBUS calls. | ||
All of the registers used in this example code are documented in the [[#Syscon]]. | |||
<source lang=c> | <source lang=c> |
Revision as of 10:23, 16 April 2013
Product Page | |||
Documentation | |||
---|---|---|---|
Schematic | |||
Mechanical Drawing | |||
FTP Path | |||
Processor | |||
Freescale i.MX283 | |||
454MHz ARM9 | |||
CPU Datasheet | |||
RAM | |||
128MB - 256MB DDR2 | |||
FPGA | |||
Lattice LFXP2 5K | |||
Reprogrammable with Opencore | |||
DIO | |||
55x DIO | |||
External Interfaces | |||
USB 2.0 2 hosts | |||
1x 10/100 Ethernet | |||
1x I2C/TWI | |||
SPI | |||
8x TTL UART | |||
Internal Storage Media | |||
2x SD | |||
Power Requirements | |||
5VDC, or USB Device | |||
Operates around 1.19W | |||
Operating Temperature | |||
| |||
| |||
Mechanical | |||
66.04mm X 74.30mm | |||
Height 17.10mm (approx) | |||
Weight 41.6g (approx) |
Overview
The TS-7600 was released April. 2013. This is a small embedded board with a Freescale i.MX283 454Mhz ARM9 CPU, Lattice XP2 5k FPGA, and 128-256MB DDR SDRAM.
Getting Started
A Linux PC is recommended for development, and will be assumed for this documentation. For users in Windows or OSX we recommend virtualizing a Linux PC. Most of our platforms run Debian and if there is no personal distribution preference this is what we recommend for ease of use.
Virtualization
Suggested Linux Distributions
It may be possible to develop using a Windows or OSX system, but this is not supported. Development will include accessing drives formatted for Linux and often Linux based tools.
Development Kit and Accessories
The KIT-7600 includes the items that are necessary for development with the TS-7600.
The other options include:
Item | Description |
---|---|
The CN-PC104-40PIN-F is the mating connector for the 44 pin male header on the SBC. The 4 omitted pins are the JTAG pins which are only used for factory programming. The pins on this header are a very common 0.100" pitch. | |
The WIFI-N-USB is an ASUS 802.11N adapter. See the WIFI-N-USB page for more details. | |
The TS-ENC750 provides both the TS-752 and a metal enclosure. | |
The TS-ENC750-DIN is the TS-ENC750 with a DIN rail mount. | |
The TS-752 demonstrates the flexibility of a Technologic Systems SoM by connecting FPGA driven IO pins to relays, buffered digital inputs, buffered digital outputs, and RS-485 drivers. It also provides an RS-232 driver for the serial console. A TS-ENC750 with a TS-7500 or TS-7550 can provide a complete solution for many embedded applications. |
Get a Console
With the development kit you should have the TS-752 which brings out the debug console ttyS0 from the ARM processor as RS232. Custom baseboards should emulate the TS-752 for bringing out console. See the schematics available on the TS-752 page. The console from the UART will use 115200 baud, 8n1 (8 data bits 1 stop bit), and no flow control.
Console from Linux
There are many serial terminal applications for Linux, three common used applications are picocom
, screen
, and minicom
. These examples demonstrate all three applications and assume that the serial device is "/dev/ttyUSB0" which is common for USB adapters. Be sure to replace the serial device string with that of the device on your workstation.
picocom
is a very small and simple client.
sudo picocom -b 115200 /dev/ttyUSB0
screen
is a terminal multiplexer which happens to have serial support.
sudo screen /dev/ttyUSB0 115200
Or a very commonly used client is minicom
which is quite powerful but requires some setup:
sudo 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.
Booting up the board
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-7600 has 2 ways that it can be powered. The TS-7500 has a 5V line on the #44 Pin Header which can be used to supply power. The TS-752 baseboard can power the 5V rail through the terminal blocks with the PS-5VDC-REG-8PG. The second option is to use the USB Device port which can provide 500mA at 5V. The TS-7600 will require approximately 250mA at idle. An ideal power supply for the TS-7600 will allow up to 1A.
WARNING: | Do not use multiple power connections simultaneously or you may damage the board. |
Once you have applied power you should look for console output. The first output is from the bootrom:
>> TS-BOOTROM - built Apr 12 2013 13:35:38 >> Copyright (c) 2009, Technologic Systems >> Booting from SD card... . . .
This output will only appear on the serial console on the 26 pin header and cannot be redirected like the rest of the booting messages. The "Booting From" message will indicate your boot media. The 3 dots after indicate steps of the booting procedure. The first dot means the MBR was copied into memory and executed. The next two dots indicate that the MBR executed and the kernel and initrd were found and copied to memory.
Initrd / Busybox
todo
Debian Configuration
For development, it is recommended to work directly in Debian on the SD card. Debian provides many more packages and a much more familiar environment for users already versed in Debian. Through Debian it is possible to configure the network, use the 'apt-get' suite to manage packages, and perform other configuration tasks. Out of the box the Debian distribution does not have any default username/password set. The account "root" is set up with no password configured. It is possible to log in via the serial console without a password but many services such as ssh will require a password set or will not allow root login at all. It is advised to set a root password and create a user account when the unit is first booted.
Note: | Setting up a password for root is only feasible on the uSD image. |
It is also possible to cross compile applications. Using a Debian host system will allow for installing a cross compiler to build applications. The advantage of using a Debian host system comes from compiling against libraries. Debian cross platform support allows one to install the necessary development libraries on the host, building the application on the host, and simply installing the runtime libraries on the target device. The library versions will be the same and completely compatible with each other. See the respective Debian cross compiling section for more information.
Configuring the Network
From almost any Linux system you can use "ip" or the ifconfig/route commands to initially set up the network. To configure the network interface manually you can use the same set of commands in the initramfs or Debian.
# Bring up the CPU network interface
ifconfig eth0 up
# Or if you're on a baseboard with a second ethernet port, you can use that as:
ifconfig eth1 up
# Set an ip address (assumes 255.255.255.0 subnet mask)
ifconfig eth0 192.168.0.50
# Set a specific subnet
ifconfig eth0 192.168.0.50 netmask 255.255.0.0
# Configure your route. This is the server that provides your internet connection.
route add default gw 192.168.0.1
# Edit /etc/resolv.conf for your DNS server
echo "nameserver 192.168.0.1" > /etc/resolv.conf
Most commonly networks will offer DHCP which can be set up with one command:
Configure DHCP in Debian:
# To setup the default CPU ethernet port
dhclient eth0
# Or if you're on a baseboard with a second ethernet port, you can use that as:
dhclient eth1
# You can configure all ethernet ports for a dhcp response with
dhclient
Configure DHCP in the initrd:
udhcpc -i eth0
# Or if you're on a baseboard with a second ethernet port, you can use that as:
udhcpc -i eth1
To make your network settings take effect on startup in Debian, edit /etc/network/interfaces:
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or # /usr/share/doc/ifupdown/examples for more information. # We always want the loopback interface. # auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.0.50 netmask 255.255.255.0 gateway 192.168.0.1 auto eth1 iface eth1 inet dhcp
Note: | During Debian's startup it will assign the interfaces eth0 and eth1 to the detected mac addresses in /etc/udev/rules.d/70-persistent-net.rules. If the system is imaged while this file exists it will assign the new interfaces as eth1 and eth2. This file is generated automatically on startup, and should be removed before your first software image is created. The initrd network configuration does not use this file. |
In this example eth0 is a static configuration and eth1 receives its configuration from the DHCP server. For more information on network configuration in Debian see their documentation here.
Installing New Software
Debian provides the apt-get system which lets you manage pre-built applications. Before you do this you need to update Debian's list of package versions and locations. This assumes you have a valid network connection to the internet.
Note: | The NAND image is based on the emdebian project which is no longer maintained. |
Debian Squeeze has been moved to archive so you will need to update /etc/apt/sources.list to contain only these two lines:
deb http://archive.debian.org/debian squeeze main deb-src http://archive.debian.org/debian squeeze main
apt-get update
For example, lets say you wanted to install openjdk for Java support. You can use the apt-cache command to search the local cache of Debian's packages.
<user>@<hostname>:~# apt-cache search openjdk icedtea-6-jre-cacao - Alternative JVM for OpenJDK, using Cacao icedtea6-plugin - web browser plugin based on OpenJDK and IcedTea to execute Java applets openjdk-6-dbg - Java runtime based on OpenJDK (debugging symbols) openjdk-6-demo - Java runtime based on OpenJDK (demos and examples) openjdk-6-doc - OpenJDK Development Kit (JDK) documentation openjdk-6-jdk - OpenJDK Development Kit (JDK) openjdk-6-jre-headless - OpenJDK Java runtime, using Hotspot Zero (headless) openjdk-6-jre-lib - OpenJDK Java runtime (architecture independent libraries) openjdk-6-jre-zero - Alternative JVM for OpenJDK, using Zero/Shark openjdk-6-jre - OpenJDK Java runtime, using Hotspot Zero openjdk-6-source - OpenJDK Development Kit (JDK) source files openoffice.org - office productivity suite freemind - Java Program for creating and viewing Mindmaps default-jdk-doc - Standard Java or Java compatible Development Kit (documentation) default-jdk - Standard Java or Java compatible Development Kit default-jre-headless - Standard Java or Java compatible Runtime (headless) default-jre - Standard Java or Java compatible Runtime
In this case you will likely want openjdk-6-jre to provide a runtime environment, and possibly openjdk-6-jdk to provide a development environment. You can often find the names of packages from Debian's wiki or from just searching on google as well.
Once you have the package name you can use apt-get to install the package and any dependencies. This assumes you have a network connection to the internet.
apt-get install openjdk-6-jre
# You can also chain packages to be installed
apt-get install openjdk-6-jre nano vim mplayer
For more information on using apt-get refer to Debian's documentation here.
Setting up SSH
On our boards we include the Debian package for openssh-server, but we remove the automatically generated keys for security reasons. To regenerate these keys:
dpkg-reconfigure openssh-server
Make sure your board is configured properly on the network, and set a password for your remote user. SSH will not allow remote connections without a password or a shared key.
Note: | Setting up a password for root is only feasible on the uSD image. |
passwd root
You should now be able to connect from a remote Linux or OSX system using "ssh" or from Windows using a client such as putty.
Note: | If your intended application does not have a DNS source on the target network, it can save login time to add "UseDNS no" in /etc/ssh/sshd_config. |
Starting Automatically
From Debian the most straightforward way to add your application to startup is to create a startup script. This is an example simple startup script that will toggle the red led on during startup, and off during shutdown. In this case I'll name the file customstartup, but you can replace this with your application name as well.
Edit the file /etc/init.d/customstartup to contain this:
#! /bin/sh # /etc/init.d/customstartup case "$1" in start) /path/to/your/application ## If you are launching a daemon or other long running processes ## this should be started with # nohup /usr/local/bin/yourdaemon & ;; stop) # if you have anything that needs to run on shutdown /path/to/your/shutdown/scripts ;; *) echo "Usage: customstartup start|stop" >&2 exit 3 ;; esac exit 0
Note: | The $PATH variable is not set up by default in init scripts so this will either need to be done manually or the full path to your application must be included. |
To make this run during startup and shutdown:
update-rc.d customstartup defaults
To manually start and stop the script:
/etc/init.d/customstartup start
/etc/init.d/customstartup stop
While this is useful for headless applications, if you are using X11 you should modify "/usr/bin/default-x-session":
#!/bin/sh
export HOME=/root/
export ICEWM_PRIVCFG=/mnt/root/root/.icewm/
icewm-lite &
while ! xprop -root | grep -q _NET_SUPPORTING_WM_CHECK
do
sleep 0.1
done
exec /usr/bin/fullscreen-webkit http://127.0.0.1
Replace fullscreen-webkit with your own graphical application.
Backup / Restore
todo
MicroSD Card
todo
Software Development
Accessing Hardware Registers
Cross Compiling
Compile the Kernel
Features
CPU
This board features the i.MX283 454MHz ARM9 from Freescale. For more information about the processor and it's included peripherals, refer to the cpu manual.
FPGA
todo
FPGA Bitstreams
todo
FPGA Programming
todo
NBUS (FPGA to CPU connection)
This CPU uses a NAND bus to access the FPGA registers. Since this is not an atomic access, we have created the NBUS to allow applications to safely share access to FPGA resources.
Example NBUS application
When writing applications that should communicate over the NBUS you should use the calls in nbus.c and nbus.h. These will compile for c/c++ but if you are using another language such as Java or Python the best implementation is typically to write your hardware accesses in C, and use your languages popen/system() calls to execute the application handling NBUS calls.
All of the registers used in this example code are documented in the #Syscon.
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include "nbus.h"
int main (int argc, char **argv)
{
uint16_t val;
int i;
nbuslock();
//// Set DIO 7 low
// Set output value to 0
val = nbuspeek16(0xa);
nbuspoke16(0xa, val & ~(1 << 7));
// Set dio 7 direction to output
val = nbuspeek16(0xc);
nbuspoke16(0xc, val | (1 << 7));
//// Set DIO 7 high
// DDR is already set to output, so
// set output value
val = nbuspeek16(0xa);
nbuspoke16(0xa, val | (1 << 7));
//// Toggle Red LED 10 times
val = nbuspeek16(0x2);
for(i = 0; i < 10; i++) {
// The first time this is called in the loop
// the NBUS lock is already acquired, but will is safe
// to call if you already have the lock
nbuslock();
if(i % 2) {
nbuspoke16(0x2, val & ~(1 << 14));
} else {
nbuspoke16(0x2, val | ( 1 << 14));
}
// The NBUS lock should be held as little as possible
// since other peripherals will need access. When
// going into an operation like a sleep, a flush, or
// any other syscal that will stall the system without
// actually needing the lock, it should be released first.
nbusunlock();
sleep(1);
}
return 0;
}
XUARTs
The XUART controller is a core we have included in the FPGA, as well as a userspace application called xuartctl for accessing these UARTs. Rather than using a kernel driver with the standard serial interface, we have implemented the XUARTs with features to simplify application development. The XUARTs allow you to easily use arbitrary baud rates, nonstandard modes such as DMX or 9n1, and they allow a very low latency operation. The XUART layer also uses the very low overhead TCP layer which allows you to transport serial over the network without writing any code.
The simplest example to get started is to define the port with:
xuartctl --server --port=1 --speed=115200
This will return "ttyname=/dev/pts/0", or a higher pts number. You can use this /dev/pts/# device to access the UART, but note that the pts device number can change based on other ssh, telnet or other processes. See this section for a sample script to setup the XUARTs with a predictable device name.
For more information and detailed usage, see the xuartctl page.
The XUARTs like many other standard UARTs poll the RX buffers by default. The XUARTs have large RX FIFOs so polling at 100hz is the best choice for many applications. At the expense of more CPU time you can use an IRQ to achieve a much lower latency. This board uses IRQ 29 for the XUART IRQ. You can edit the linuxrc script and change the xuartctl server to start with:
xuartctl --irq=29 --server
Battery powered RTC
todo
COM Ports
The XUART ports will be controlled with xuartctl. By default they will not have devices in /dev/.
Name | Type | Location |
---|---|---|
ttyS0 (console) | TTL | pins 7 (TX) and 8 (RX) of the #44 Pin Header. |
XUART0 | TTL | pins 5 (TX) and 6 (RX) of the #44 Pin Header. |
XUART1 | TTL | pins 19 (TX), 20 (RX), and 27 (TXEN) of the #44 Pin Header. |
XUART2 | TTL | pins 21 (TX), 22 (RX), and 28 (TXEN) of the #44 Pin Header. |
XUART3 | TTL | pins 23 (TX) and 24 (RX) of the #44 Pin Header. |
XUART4 | TTL | pins 25 (TX) and 26 (RX) of the #44 Pin Header. |
XUART5 | TTL | pins 31 (TX), 32 (RX), and 29 (TXEN) of the #44 Pin Header. |
XUART6 | TTL | pins 34 (TX), 33 (RX), and 30 (TXEN) of the #44 Pin Header. |
XUART7 | TTL | pins 36 (TX) and 35 (RX) of the #44 Pin Header. |
SD
todo
SPI Flash
todo
CAN
Note: | The default TS-7600 bitstream does not include CAN. See the #FPGA Bitstreams section for more information on bitstreams including CAN. |
Syscon
The registers listed below are all 16 bit registers and must be accessed with 16 bit reads and writes. This register block appears at base address 0x80004000. For example, to identify the TS-4710:
peekpoke 16 0x80004000
This will return 0x4710 to read back the model ID.
Many of the syscon options can be manipulated using tshwctl.
Usage: tshwctl [OPTION] ... Technologic Systems TS-76xx FPGA manipulation. General options: -g, --getmac Display ethernet MAC address -s, --setmac=MAC Set ethernet MAC address -R, --reboot Reboot the board -t, --getrtc Get system time from RTC time/date -S, --setrtc Set RTC time/date from system time -F, --rtctemp Print RTC temperature -v, --nvram Get/Set RTC NVRAM -i, --info Display board FPGA info -B, --baseboard Display baseboard ID -a, --adc Display MCP3428 ADC readings in millivolts -e, --greenledon Turn green LED on -b, --greenledoff Turn green LED off -c, --redledon Turn red LED on -d, --redledoff Turn red LED off -D, --setdio=LVAL Set DIO output to LVAL -O, --setdiodir=LVAL Set DIO direction to LVAL (1 - output) -G, --getdio Get DIO input -Z, --getdioreg Get DIO direction and output register values -x, --random Get 16-bit hardware random number -W, --watchdog Daemonize and set up /dev/watchdog -A, --autofeed=SETTING Daemonize and auto feed watchdog -n, --setrng Seed the kernel random number generator -X, --resetswitchon Enable reset switch -Y, --resetswitchoff Disable reset switch -l, --loadfpga=FILE Load FPGA bitstream from FILE -q, --cputemp Display the CPU die temperature -U, --removejp=JP Remove soft jumper numbered JP (1-8) -S, --setjp=JP Set soft jumper numbered JP (1-8) -h, --help This help
Offset | Bits | Usage |
---|---|---|
0x0 | 15:0 | Model ID: Reads 0x7600 |
0x2 | 15 | Green LED (1 - on) |
14 | Red LED (1 - on) | |
13-12 | Scratch Reg | |
11 | Reset Switch Enable (1 - reboot when dio9 low) | |
10 | Reserved latched mode3 value | |
9 | Reserved latched mode2 value | |
8 | Reserved latched mode1 value | |
7-4 | Board Submodel (0x0 on production units) | |
3:0 | FPGA revision | |
0x4 | 15:0 | Random data changed every 1 second |
0x6 | 15-4 | Reserved |
3 | Lattice tagmem clock | |
2 | Lattice tagmem serial in | |
1 | Lattice tagmem CSn | |
0 | Lattice tagmem serial out | |
0x8 | 15:0 | DIO 15:0 input data |
0xa | 15:0 | DIO 15:0 output data |
0xc | 15:0 | DIO 15:0 data direction (1 - output) |
0xe | 15:0 | DIO 31:16 input data |
0x10 | 15:0 | DIO 31:16 output data |
0x12 | 15:0 | DIO 31:16 data direction (1 - output) |
0x14 | 15:0 | DIO 47:32 input data |
0x16 | 15:0 | DIO 47:32 output data |
0x18 | 15:0 | DIO 47:32 data direction (1 - output) |
0x1a | 15:0 | DIO 63:48 input data |
0x1c | 15:0 | DIO 63:48 output data |
0x1e | 15:0 | DIO 53:48 data direction (1 - output) |
0x20 | 15:9 | Reserved |
8:6 | DIO 66:64 input data | |
5:3 | DIO 66:64 output data | |
2:0 | DIO 66:64 data direction (1 - output) | |
0x22 | 15:0 | #Watchdog |
Watchdog
todo
DIO
todo
DIO Number | Location | Alternate Function |
---|
Random Number Generator
Because many embedded systems do not have much entropy, we have included a core in the FPGA with a random number generator. On startup, tshwctl is called with the --setrng option to seed Linux's random number generator from the hardware random number generator. Without a good source of entropy, Linux's random number generator will start up in a very predictable state which is undesirable for the security of many cryptography protocols.
Interrupts
I2C
todo
SPI
todo
External Reset
Driving the external reset pin (DIO 9) low will reset the CPU by default. You can disable this functionality by running:
tshwctl --resetswitchoff
Temperature Sensor
todo
Connectors
44 Pin Header
The 44 pin header contains almost all of the I/O on the TS-7500. On the baseboard, typically the 4 JTAG pins are left hanging:
The CN-PC104-40PIN-F is available as a mating connector to this header.
|
|
Note: | Use of the JTAG pins for programming the board is not supported or recommended. |
None of the DIO are tolerant to 5V. The FPGA DIO all support up to 3.3V with 12mA drive capability.
TS-752
See the TS-752 page for more information on the other available connectors.
COM Ports
The XUART ports will be controlled with xuartctl. By default they will not have devices in /dev/. Keep in mind these will be brought out in different locations when using a TS-752.
Name | Type | Location | TX Enable |
---|---|---|---|
ttyS0 | TTL | pins 7 (TX) and 8 (RX) of the ##44 Pin Header. | N/A |
XUART0 | TTL | pins 5 (TX) and 6 (RX) of the #44 Pin Header. | N/A |
XUART1 | TTL | pins 19 (TX) and 20 (RX) of the #44 Pin Header. | pin 27 of the #44 Pin Header |
XUART2 | TTL | pins 21 (TX) and 22 (RX) of the #44 Pin Header | pin 28 of the #44 Pin Header |
XUART3 | TTL | pins 23 (TX) and 24 (RX) of the #44 Pin Header | N/A |
XUART4 | TTL | pin 25 (TX) and 26 (RX) on the #44 Pin Header | N/A |
XUART5 | TTL | pin 31 (TX) and 32 (RX) on the #44 Pin Header | pin 29 of the #44 Pin Header |
XUART6 | TTL | pin 34 (RX) and 33 (TX) on the #44 Pin Header | pin 30 of the #44 Pin Header |
XUART7 | TTL | pin 36 (RX) and 35 (TX on the #44 Pin Header | N/A |
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.