From Technologic Systems Manuals
Revision as of 18:03, 7 March 2018 by Mpeters (Talk | contribs)

Jump to: navigation, search
WARNING: This is PRELIMINARY INFORMATION ONLY. It is certain to change while undergoing editing.
Product Page
Product Images
Mechanical Drawing
FTP Path
Marvell MV88F6820
Armada 385 ARM Cortex-A9 1.3 GHz Dual Core CPU


1 Overview

The TS-7800-V2 is a Single Board Computer (SBC) based on a Marvell MV88F6820 1.3GHz Cortex-A9 (ARMv7 architecture) Dual Core CPU. The CPU features a set of high-end peripherals such as a 10/100/1000 Ethernet, mPCIe, mSATA, dual USB 3.0, eMMC for onboard storage, and more. This device features WIFI, Bluetooth, an accelerometer, and an FPGA allowing more DIO, UARTs, and an ISA bus to implement additional industry-standard IO.

This SBC provides a migration path for customers using TS-7800-V2 in their products. Electrically and mechanically this board is almost identical to the original TS-7800. Be sure to see our guide on migrating from TS-7800 original to the TS-7800-V2 for more information.

2 Getting Started

A Linux PC is recommended for development. For developers who use Windows, virtualized Linux using VMWare or virtualbox is 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 macrocontroller. 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.

Once you have a development environment, you should continue on and power 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.

2.1 Getting Console and Powering up

Set the "EN Con" jumper, and use a null modem cable to connect the board's DB-9 connector to your workstation's COM port. Alternatively, connect a micro USB Type B cable to CN12, with the other end going to a USB port on your workstation.

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

The TS-7800-V2 receives power through the +5VDC power connector with a 2A minimum supply. Once power is applied, the device will output information via the console. The first output is from U-Boot:

BootROM - 1.73                                                                  
Booting from MMC                                                                
General initialization - Version: 1.0.0                                         
AVS selection from EFUSE disabled (Skip reading EFUSE values)                   
Overriding default AVS value to: 0x23                                           
Detected Device ID 6820                                                         
High speed PHY - Version: 2.0                                                   
Init Customer board board SerDes lanes topology details:                        
 | Lane # | Speed|    Type     |                                                
 |   0    |  3   |  SATA0      |                                                
 |   1    |  5   |  USB3 HOST0 |                                                
 |   2    |  3   |  SATA1      |                                                
 |   3    |  5   |  USB3 HOST1 |                                                
 |   5    |  5   |  PCIe2      |                                                
mvSysEnvReadPcieGenSetting: TWSI Read of SatR field 'isForceGen1 failed         
:** Link is Gen1, check the EP capability                                       
PCIe, Idx 2: remains Gen1                                                       
High speed PHY - Ended Successfully                                             
DDR3 Training Sequence - Ver TIP-1.54.0                                         
DDR3 Training Sequence - Switching XBAR Window to FastPath Window               
DDR3 Training Sequence - Ended Successfully                                     
BootROM: Image checksum verification PASSED                                     
 __   __                      _ _                                               
|  \/  | __ _ _ ____   _____| | |                                               
| |\/| |/ _` | '__\ \ / / _ \ | |                                               
| |  | | (_| | |   \ V /  __/ | |                                               
|_|  |_|\__,_|_|    \_/ \___|_|_|                                               
         _   _     ____              _                                          
        | | | |   | __ )  ___   ___ | |_                                        
        | | | |___|  _ \ / _ \ / _ \| __|                                       
        | |_| |___| |_) | (_) | (_) | |_                                        
         \___/    |____/ \___/ \___/ \__|                                       
 ** LOADER **                                                                   
U-Boot 2013.01 (May 01 2017 - 14:41:41) Marvell version: 2016_T1.0.eng_drop_v2  
mvBoardIoExpanderDataSet: Write IO expander (addr=0x20, offset=2, value=0x40 tol
Board: Technologic Systems TS-7800v2                                            
SoC:   MV88F6820 Rev A0                                                         
       running 2 CPUs                                                           
CPU:   ARM Cortex A9 MPCore (Rev 1) LE                                          
       CPU 0                                                                    
       CPU    @ 1066 [MHz]                                                      
       L2     @ 533 [MHz]                                                       
       TClock @ 250 [MHz]                                                       
       DDR3    @ 533 [MHz]                                                      
       DDR3 32 Bit Width,FastPath Memory Access, DLB Enabled, ECC Disabled      
DRAM:  1 GiB                                                                    
MMC:   mv_sdh: 0                                                                
sdhci_transfer_data: Error detected in status(0x408000)!                        
*** Warning - bad CRC, using default environment                                
PCI-e 2 (IF 0 - bus 1) Root Complex Interface, Detected Link X1, GEN 1.1        
USB2.0 0: Host Mode                                                             
USB3.0 0: Host Mode                                                             
USB3.0 1: Host Mode                                                             
Map:   Code:                    0x3fee4000:0x3ff97500                           
       BSS:                     0x3ffef754                                      
       Stack:                   0x3f963f20                                      
       Heap:                    0x3f964000:0x3fee4000                           
       U-Boot Environment:      0x00100200:0x00180200 (MMC)                     
Board configuration detected:                                                   
|  port  | Interface | PHY address  |                                           
| egiga0 |   RGMII   |     0x01     |                                           
egiga0 [PRIME]                                                                  
Hit any key to stop autoboot:  0     

The "SD Boot" jumper, when set, will cause U-Boot to boot to SD, and when unset, U-Boot will boot to eMMC.

Note: The "*** Warning - bad CRC, using default environment" can be safely ignored. This indicates that u-boot scripts are not being customized. Typing "env save" will hide these messages, but this is not needed.

2.2 U-Boot Environment

The U-Boot environment on the TS-7800-V2 is stored in the on-board eMMC flash.

# Print all environment variables
env print -a
# Sets the variable bootdelay to 5 seconds
env set bootdelay 5;
# Variables can also contain commands
env set hellocmd 'led red on; echo Hello world; led green on;'
# Execute commands saved in a variable
env run hellocmd;
# Commit env changes to the spi flash
# Otherwise changes are lost
env save
# Restore env to default
env default -a
# Remove a variable
env delete emmcboot

2.3 U-Boot Commands

# The most important command is 
# This can also be used to see more information on a specific command
help i2c
# Boots into the compressed binary at $loadaddr.  
# Boots into the compressed binary at $loadaddr, specifies the fdtaddr 
# so Linux knows where to find the board device-tree
bootz ${loadaddr} - ${fdtaddr}
# Get a DHCP address
# This sets ${ipaddr}, ${dnsip}, ${gatewayip}, ${netmask}
# and ${ip_dyn} which can be used to check if the dhcp was successful
# These commands are used for scripting:
false # do nothing, unsuccessfully
true # do nothing, successfully
# This command lets you set fuses in the processor
# Setting fuses can brick your board, will void your warranty,
# and should not be done in most cases
# This command is used to copy a file from most devices
# Load kernel from SD
ext4load mmc 1:2 ${loadaddr} /boot/zImage
# Load Kernel from eMMC
ext4load mmc 0:2 ${loadaddr} /boot/zImage
# You can view the fdt from u-boot with fdt
ext4load mmc 0:2 $fdtaddr /boot/armada-38x.dtb
fdt addr ${fdtaddr}
fdt print
# You can blindly jump into any memory
# This is similar to bootm, but it does not use the 
# u-boot header
ext4load mmc 0:2 ${loadaddr} /boot/custombinary
go ${loadaddr}
# Browse fat,ext2,ext3,or ext4 filesystems:
ext4ls mmc 0:1 /
# Access memory like devmem in Linux, you can read/write arbitrary memory
# using mw and md
# write
mw 0x10000000 0xc0ffee00 1
# read
md 0x10000000 1
# Test memory.
# Check for new SD card
mmc rescan
# Read SD card size
mmc dev 1
# Read eMMC Size
mmc dev 0
# The NFS command is like 'load', but used over the network
env set serverip
nfs ${loadaddr}
# Test ICMP
# Reboot
# Delay in seconds
sleep 10
# You can load HUSH scripts that have been created with mkimage
ext4load mmc 0:1 ${loadaddr} /boot/ubootscript
source ${loadaddr}
# Most commands have return values that can be used to test
# success, and HUSH scripting supports comparisons like
# test in Bash, but much more minimal
if load mmc 1:1 ${fdtaddr} /boot/uImage;
	then echo Loaded Kernel
	echo Could not find kernel
# Commands can be timed with "time"
time bdinfo
# Print U-boot version/build information

2.4 First Linux Boot

U-Boot is always loaded from the onboard eMMC boot partitions (/dev/mmcblk0boot*). U-boot can access the eMMC, SATA, Network, an USB. By default it will load Linux from the first partition on the eMMC, but it can be configured to boot to SATA or Network by default. When the U-Boot jumper is present the board will attempt to boot to USB for our #Production Mechanism.

The eMMC and SD cards shipped with the unit are pre-programmed with our Debian Stretch image.

2.5 Jumper Configuration

Jumper Function
SD Boot Boot to SD (Otherwise eMMC)
EN Console Enables the console
U Boot Stops boot in u-boot rather than booting to the disk image. Also used to enter our #Production Mechanism.

2.6 Boot Flags

Some features of the board can only be configured in early boot. These behaviors can be changed from Linux using the ts7800ctl.

Boot flags byte
Bit Description
7 1 = Enable mPCIe, disable mSATA

0 = Enable mSata, disable mPCIe

6 1 = Enable ECC and only use one chip

0 = Use both chips as RAM

5:1 Reserved
0 1 = Enable watchdog by default

0 = Disable watchdog

Bit 7 allows controlling CN44 on whether this header supports mSATA or mPCIE. Only one SERDES can be present on this header at once.

Bit 6 controls whether ECC is enabled or not. The default builds of the TS-7800-V2 use two 512MB DDR3 chips, and ECC is enabled by dedicating one of those chips to ECC. This will split the usable RAM in half, but allow auto correction of single bit errors, or detection of double bit errors.

Bit 0 allows disabling the watchdog right out of reset. This only enables whether it is enabled on power on, but the default u-boot will start feeding the watchdog as soon as it starts. To completely disable the watchdog later software would need to not feed the watchdog, or stop feeding and send a byte to turn off the watchdog. See the #Watchdog section for more information.

On startup u-boot will print out: Model: Technologic Systems TS-7800-V2

 Bootflags: WDOG+ ECC- PCIE- MSATA+
 SATA link 0 timeout.

This bootflags shows which boot flags are enabled/disabled. To modify these, use ts7800ctl from Linux.

# Default boot strapping.  Disables ECC, disables mPCIE, enables mSATA and WDOG
ts7800ctl -A 7 -D 0x1
# Enable ECC, disable mPCIE, enable mSATA and WDOG
ts7800ctl -A 7 -D 0x41
# Disable ECC, Enable PCIe and WDOG
ts7800ctl -A 7 -D 0x81

3 Backup / Restore

3.1 SD Card

TBD: This section is currently undergoing a major rewrite. Please stay tuned.

Note that only either the full-size SD card, or the micro SD card may be present on the TS-7800-V2. Attempting to use both interfaces at the same time will result in corruption on both media.

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 it will be assumed that your workstation uses the '/dev/mmcblk0' format. Both of the sd cards will use the same commands, but with the name of the block device being "/dev/tssdcarda".

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.

From Workstation


Entire SD card

dd if=/dev/mmcblk0 of=/path/to/backup.dd bs=4M conv=fsync


dd if=/dev/mmcblk0p2 of=/path/to/initrd bs=4M conv=fsync


Entire SD card

dd if=/path/to/backup.dd of=/dev/mmcblk0 bs=4M conv=fsync


dd if=/path/to/initrd  of=/dev/mmcblk0p2 bs=4M conv=fsync

From TS-7800-V2


Entire card

dd if=/dev/tssdcarda of=/path/to/backup.dd bs=4M conv=fsync


The entire card from SBC

dd if=/path/to/sdimage.dd of=/dev/ttssdcarda bs=4M conv=fsync

3.2 eMMC

TBD: This documentation is still in process.

4 Debian

Debian is a community run Linux distribution. Debian provides tens of thousands of precompiled applications and services. This distribution is known for stability and large community providing support and documentation. The installation is specific to our board, but most Debian documentation applies:

4.1 Getting Started with Debian

Once installed the default user is "root" with no password. Services such as telnet, ssh, or others will typically require a password to be configured before they allow remote connections.

The image can be downloaded here:

To prepare an SD card, use partitioning tools such as 'fdisk' 'cfdisk' or 'gparted' in linux to create a single linux partition on the SD card. This should use an MBR partition scheme and not GPT/GUID. Once it is formatted, extract the above tarball with:

# Assuming your SD card is /dev/sdc with one partition
mkfs.ext3 /dev/sdc1
mkdir /mnt/sd/
sudo mount /dev/sdc1 /mnt/sd/
sudo tar --numeric-owner -xjf ts7800v2-debian-armhf-stretch-latest.tar.bz2 -C /mnt/sd
sudo umount /mnt/sd
Note: The ext4 filesystem can be used instead of ext3, but it may require additional options. U-Boot does not support the 64bit addressing added as the default behavior in recent revisions of mkfs.ext4. If using e2fsprogs 1.43 or newer, the options "-O ^64bit,^metadata_csum" must be used with ext4 for proper compatibility. Older versions of e2fsprogs do not need these options passed nor are they needed for ext3.

To rewrite the eMMC the unit must be booted to SD or any other media that is not eMMC. Once booted, run the following commands.:

mkfs.ext3 /dev/mmcblk0p1
mkdir /mnt/emmc
mount /dev/mmcblk0p1 /mnt/emmc
tar xjf ts7800v2-debian-armhf-stretch-latest.tar.bz2 -C /mnt/emmc/
umount /mnt/emmc

The same commands can be used to write a SATA drive by substituting /dev/mmcblk2p1 with /dev/sda1.

4.2 Debian Networking

From almost any Linux system you can use 'ip' command or the 'ifconfig' and 'route' commands to initially set up the network.

# 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 subnet mask)
ifconfig eth0
# Set a specific subnet
ifconfig eth0 netmask
# Configure your route.  This is the server that provides your internet connection.
route add default gw
# Edit /etc/resolv.conf for your DNS server
echo "nameserver" > /etc/resolv.conf

Most networks will offer a DHCP server, an IP address can be obtained from a server with a single command in linux:

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

Systemd provides a networking configuration option to allow for automatic configuration on startup. Systemd-networkd has a number of different configuration files, some of the default examples and setup steps are outlined below.



To use DHCP to configure DNS via systemd, start and enable the network name resolver service, systemd-resolved:

systemctl start systemd-resolved.service 
systemctl enable systemd-resolved.service
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

For a static config create a network configuration for that specific interface.



For more information on networking, see Debian and systemd's documentation:

4.2.1 Debian WIFI Client

Note: Before configuring the WiFi client, the driver must be installed and the interface configured. See the WiFi section for details on how to do this.

If connecting to a WPA/WPA2 network, a wpa_supplicant config file must first be created:

wpa_passphrase yournetwork yournetworkpassphrase > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

Create the file /lib/systemd/system/wpa_supplicant@.service with these contents

Description=WPA supplicant daemon (interface-specific version)
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I

Create the file /etc/systemd/network/ with:


See the systemctl-networkd example for setting a static IP for a network interface. The can be configured the same way as an

To enable all of the changes that have been made, run the following commands:

systemctl enable wpa_supplicant@wlan0
systemctl start wpa_supplicant@wlan0
systemctl restart systemd-networkd

4.2.2 Debian WIFI Access Point

Note: Before configuring the WiFi Access Point, the driver must be installed and the interface configured. See the WiFi section for details on how to do this.

First, hostapd needs to be installed in order to manage the access point on the device.

apt-get update && apt-get install hostapd -y

Note: The install process may start an unconfigured hostapd process. This process must be killed before moving foward.

Edit /etc/hostapd/hostapd.conf to have the following lines:

wpa_pairwise=TKIP CCMP
Note: Refer to the kernel's hostapd documentation for more wireless configuration options.

The access point can be started and tested by hand:

hostapd /etc/hostapd/hostapd.conf

Systemd auto-start with bridge to eth0

It is possible to configure the auto-start of hostapd through systemd. The configuration outlined below will set up a bridge with eth0, meaning the WiFi connection is directly connected to the ethernet network. The ethernet network is required to have a DHCP server present and active on it to assign WiFi clients a DHCP address. This setup will allow WiFi clients access to the same network as the ethernet port, and the bridge interface will allow the Device itself to access the network.

Set up hostapd

First, create the file /etc/systemd/system/hostapd_user.service with the following contents:

Description=Hostapd IEEE 802.11 AP
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/ -B

Then enable this in systemd:

systemctl enable hostapd_user.service

Set up bridging

Create the following files with the listed contents.







4.3 Debian Installing New Software

Debian provides the apt-get system which allows management of pre-built applications. First apt will need a network connection to the internet. The update command will download a list of prebuilt packages and the current version.

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.

apt-get update

A common example is installing Java runtime support for a system. Find the package name first with search, and then install it.

root@ts:~# apt-cache search openjdk
jvm-7-avian-jre - lightweight virtual machine using the OpenJDK class library
freemind - Java Program for creating and viewing Mindmaps
icedtea-7-plugin - web browser plugin based on OpenJDK and IcedTea to execute Java applets
default-jdk - Standard Java or Java compatible Development Kit
default-jdk-doc - Standard Java or Java compatible Development Kit (documentation)
default-jre - Standard Java or Java compatible Runtime
default-jre-headless - Standard Java or Java compatible Runtime (headless)
jtreg - Regression Test Harness for the OpenJDK platform
libreoffice - office productivity suite (metapackage)
icedtea-7-jre-jamvm - Alternative JVM for OpenJDK, using JamVM
openjdk-7-dbg - Java runtime based on OpenJDK (debugging symbols)
openjdk-7-demo - Java runtime based on OpenJDK (demos and examples)
openjdk-7-doc - OpenJDK Development Kit (JDK) documentation
openjdk-7-jdk - OpenJDK Development Kit (JDK)
openjdk-7-jre - OpenJDK Java runtime, using Hotspot Zero
openjdk-7-jre-headless - OpenJDK Java runtime, using Hotspot Zero (headless)
openjdk-7-jre-lib - OpenJDK Java runtime (architecture independent libraries)
openjdk-7-source - OpenJDK Development Kit (JDK) source files
uwsgi-app-integration-plugins - plugins for integration of uWSGI and application
uwsgi-plugin-jvm-openjdk-7 - Java plugin for uWSGI (OpenJDK 7)
uwsgi-plugin-jwsgi-openjdk-7 - JWSGI plugin for uWSGI (OpenJDK 7)

In this case you will want the openjdk-7-jre package. Names of packages are on Debian's wiki or the packages site.

With the package name apt-get install can be used to install the prebuilt packages.

apt-get install openjdk-7-jre
# More than one package can be installed at a time.
apt-get install openjdk-7-jre nano vim mplayer

For more information on using apt-get refer to Debian's documentation here.

4.4 Debian Setting Up SSH

To install ssh, install the package as normal with apt-get:

apt-get install openssh-server

Make sure the device is configured on the network and set a password for the remote user. SSH will not allow remote connections without a password or a valid SSH key pair.

passwd root

After this setup it is now possible to connect from a remote PC supporting SSH. On Linux/OS X this is the "ssh" command, or from Windows using a client such as putty.

Note: If a DNS server is not present on the target network, it is possible to save time at login by adding "UseDNS no" in /etc/ssh/sshd_config.

4.5 Debian Starting Automatically

A systemd service can be created to start up headless applications. Create a file in /etc/systemd/system/yourapp.service

Description=Run an application on startup

If networking is a dependency add "" in the Unit section. Once you have this file in place add it to startup with:

# Start the app on startup, but will not start it now
systemctl enable yourapp.service
# Start the app now, but doesn't change auto startup
systemctl start yourapp.service
Note: See the systemd documentation for in depth documentation on services.

To start an application on bootup with X11 instead change the x-session-manager. By default the system starts xfce:

root@ts:~# ls -lah /usr/bin/x-session-manager 
lrwxrwxrwx 1 root root 35 May 26  2015 /usr/bin/x-session-manager -> /etc/alternatives/x-session-manager
root@ts:~# ls -lah /etc/alternatives/x-session-manager
lrwxrwxrwx 1 root root 19 May 26  2015 /etc/alternatives/x-session-manager -> /usr/bin/startxfce4

The x-session can be modified to only start specified processes. Create the file /usr/bin/mini-x-session with these contents:

matchbox-window-manager -use_titlebar no &
exec xfce4-terminal

You may need to "apt-get install matchbox-window-manager." first. This is a tiny window manager which also has a few flags that simplify embedded use. Now enable this session manager and restart slim to restart x11 and show it now.

chmod a+x /usr/bin/mini-x-session
rm /etc/alternatives/x-session-manager
ln -s /usr/bin/mini-x-session /etc/alternatives/x-session-manager
service slim restart

If the x-session-manager process ever closes x11 will restart. The exec command allows a new process to take over the existing PID. In the above example xfce4-terminal takes over the PID of x-session-manager. If the terminal is closed with commands like exit the slim/x11 processes will restart.

4.6 Debian Application Development

4.6.1 Debian Stretch Cross Compiling

Debian Stretch provides cross compilers from its distribution. An install on a workstation can build for the same release on other architectures. A Linux desktop or laptop PC, virtual machine, or chroot will need to be used for this. Install Debian Stretch for your workstation here.

From a Debian workstation (not the target), run these commands to set up the cross compiler:

# Run "lsb_release -a" and verify Debian 9.X is returned.  These instructions are not
# expected to work on any other version or distribution.
apt-get install curl build-essential
su root
echo "deb stretch main" > /etc/apt/sources.list.d/emdebian.list
curl | apt-key add -
# Note that while Ubuntu uses apt as well, Ubuntu host setup is slightly different, instead of the above commands use the following:
# echo "deb [arch=armhf] trusty main restricted universe multiverse" >> /etc/apt/sources.list
# echo "deb [arch=armhf] trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
# echo "deb [arch=armhf] trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
dpkg --add-architecture armhf
apt-get update
apt-get install crossbuild-essential-armhf

This will install a toolchain that can be used with the prefix "arm-linux-gnueabihf-". The standard GCC tools will start with that name, eg "arm-linux-gnueabihf-gcc".

The toolchain can now compile a simple hello world application. Create hello-world.c on the Debian workstation:

#include <stdio.h>
int main(){
    printf("Hello World\n");

To compile this:

arm-linux-gnueabihf-gcc hello-world.c -o hello-world
file hello-world

This will return that the binary created is for ARM. Copy this to the target platform to run it there.

Debian Stretch supports multiarch which can install packages designed for other architectures. On workstations this is how 32-bit and 64-bit support is provided. This can also be used to install armhf packages on an x86 based workstation.

This cross compile environment can link to a shared library from the Debian root. The package would be installed in Debian on the workstation to provide headers and .so. This is included in most "-dev" packages. When run on the arm target it will also need a copy of the library installed, but it does not need the -dev package.

apt-get install libcurl4-openssl-dev:armhf
# Download the simple.c example from curl:
# After installing the supporting library, curl will link as compiling on the unit.
arm-linux-gnueabihf-gcc simple.c -o simple -lcurl

Copy the binary to the target platform and run on the target. This can be accomplished with network protocols like NFS, SCP, FTP, etc.

If any created binaries do not rely on hardware support like GPIO or CAN, they can be run using qemu.

# using the hello world example from before:
# Returns Exec format error
apt-get install qemu-user-static

5 Compile The Kernel



This guide is intended to run on an x86 compatible Linux workstation. While you may be able to compile the kernel on the board, we do not recommend it. A typical workstation compile will take several minutes. The same compile on the board may take several hours.


yum install ncurses-devel ncurses
yum groupinstall "Development Tools" "Development Libraries"
apt-get install build-essential libncurses5-dev libncursesw5-dev

For other distributions, please refer to their documentation to find equivalent tools. Next you need to set up the cross compiler and sources:

# Download the cross compile toolchain from Technologic Systems:
#Extract to current working directory:
tar -xjf armv7-marvell-linux-gnueabi-hard_i686_64K_Dev_20131002.tar.bz2
#Download the kernel sources
git clone
cd linux-4.4.8

Export the CROSS_COMPILE variable with a path that points to the appropriate cross-compiler. If you followed the steps above exactly, the toolchain is extracted into the same directory as the kernel.

export CROSS_COMPILE=../armv7-marvell-linux-gnueabi-hard_i686_64K_Dev_20131002/bin/arm-marvell-linux-gnueabi-
export ARCH=arm

Now you will want to configure your settings. You can start with our default config by running:

make ts7800_v2_defconfig

At this point you can configure any additional options with:

make menuconfig

After you saved the configuration, you can build your kernel and modules with:

make && make modules

6 Features

6.1 CPU Functionality

6.1.1 MMU

The 88F6020 features a Memory Management Unit, enabling high level operating systems such as Embedded Linux to run on the TS-7800-V2. In the same way, the Linux TS-Kernel takes advantage of the MMU functionality. The MMU is controlled by page tables stored in system memory and is responsible for virtual address to physical address translation, memory protection through access permissions and domains, MMU cache and write buffer access. In doing so, software applications can access larger "virtual" memory space than the available physical memory size, allowing multiple programs to run and use the system memory simultaneously.

6.1.2 Interrupts

The 88F6020 has 192 interrupts available on chip as well as another TBD implemented in the Intel FPGA by using the doorbell interrupt register (???).


For more information about the interrupt functionalities, refer to the 88F6020 User's Guide.

6.1.3 Onboard eMMC Flash

This board includes a Micron eMMC module. Our off the shelf builds are 4GiB, but up to 64GiB are available for larger builds. The eMMC flash appears to Linux as an SD card at /dev/mmcblk0. Our default programming will include one partition programmed with our Debian image.

The CPU boots out of the emmc's hardware boot partitions /dev/mmcblk0boot0 and /dev/mmcblk0boot1. These are both 16MB, and are separate from the mmcblk0 flash. Erasing or manipulating /dev/mmcblk0 and its partitions will not affect these hardware partitions. The board boots to /dev/mmcblk0boot0 by default, but boot1 can be selected if it has been written with a valid bootloader. This allows atomic updates in the field of u-boot, but should only be done with care as it can leave your board not booting if a bad image is written before switching the active boot partition.

WARNING: This may need a development board or RMA to recover the board if the CPU fails to boot. Make certain a valid u-boot is present on a boot device before switching to it.

Write a u-boot to mmcblk0boot1 with:

echo 0 > /sys/block/mmcblk0boot1/force_ro
dd if=/path/to/u-boot.kwb bs=1M of=/dev/mmcblk0boot1

Once the data has been verified as written, the active boot partition can be switched to mmcblk0boot1:

# The argument after enable should be 2 for mmcblk0boot1, or 1 for mmcblk0boot0
mmc bootpart enable 2 1 /dev/mmcblk0

The active partition can be read as part of the extcsd read:

mmc extcsd read /dev/mmcblk0

6.1.4 USB Host

The USB Connector on the TS-7800-V2 provide two USB 3.0 interfaces for the user. These are directly connected to the MV88F6020 processor, which integrates a USB dual-port Extensible Host Controller Interface (xHCI), providing serial communications ports at a baud rate of up to 5 Gbit/s ("SuperSpeed"). The MV88F6020 also has a USB 2.0 controller, with Enhanced Host Controller Interface (EHCI) for full compatibility with USB 2.0 at speeds up to 480 Mbits/sec ("High-Speed").

Linux provides support for most USB devices through drivers. Direct access to communicate with USB peripherals is typically done with libusb.

Additional non-volatile storage may be added with a USB flash drive. This device supplies additional non-volatile storage either for data or for a complete operation system distribution, such as Debian. A tar-file of Debian is available on the Technologic Systems FTP site.

6.1.5 SATA

The TS-7800-V2 provides up to two SATA 3.0 ports at data rates of up to 6 Gbits/sec.

SATA drives will appear (in Linux) as /dev/sda and (with the optional second SATA port) /dev/sdb. In U-Boot, after executing the "scsi init" command, they will appear as SCSI drives "scsi 1:0" and (with the optional second SATA port) "scsi 0:0".

If the drive is formatted, with the required files in the "/boot" subdirectory, the board may be booted from the drive by substituting (for example) "scsi 0:1" for "mmc 0:2" in the ext4load command (see the #U-Boot Commands section for more details on booting). It will also be necessary to modify the bootargs from (for example) "root=/dev/mmcblk0p2" to "root=/dev/sda1".

6.1.6 DDR3 RAM

The TS-7800-V2 has 1 GB of DDR3. Optionally the RAM can be placed in ECC mode through a software switch covered in the Boot Flags section.

6.1.7 Speed Scale

TBD: How to set CPU Speed Grade.

6.2 SiLabs Functionality

6.2.1 ADC Sampling

The TS-7800-V2 provides an analog to digital capture function through the on-board SiLabs microcontroller. The microcontroller has five 10 bit 0-5V analog inputs and is capable of sampling at up to 500 kspa. The analog input channels are brought out to the A/D header (see table below). A voltage divider is used on each input to divide the input voltage by two; therefore, the maximum input voltage at the header should not exceed 6.6V.

The A/D header is laid out as follows:

2 4 6 8 10
1 3 5 7 9

The ADC is implemented using ts7800ctl:

root@ts7800:root# ts7800ctl -S 0,1
[0x00000000, 0]=1023
[0x00000001, 1]=0810
[0x00000002, 0]=1023
[0x00000003, 1]=1023
[0x00000004, 0]=1023

This requests ts7800ctl to output ADC in string data. This returns:

 [Hex counter, Channel]=Value

If you prefer to implement this in your own code, you can get ts7800ctl.c here.


# Capture 1000 raw binary samples from channel 0 and print the output to a file in a comma separated format.
ts7800ctl -r"0" | dd bs=2 count=1000 2>/dev/null | hexdump -v -e '1/2 "%u, "' > ch0_500_samples.csv
#Capture 500 samples from channel 0 and 500 samples from channel 1. Write the 
#samples to a file where all channel 0 samples are in the first column and all 
#channel 1 samples are in the second column.
ts7800ctl -r"0-1" | dd bs=2 count=1000 | hexdump -v -e '1/2 "0x%x\t" 1/2 "0x%x\n"' > ch0_ch1_1k_samples.dat
#Capture 1000 samples from channel 0, and then print the output to standard out in ASCII.
ts7800ctl -S"0,1" 2>/dev/null | dd bs=19 count=1000
#Capture 5 samples from channel 0 and 5 samples from channel 1, then print the output to standard out in ASCII.
ts7800ctl -S"0-1" 2>/dev/null | dd bs=19 count=10

6.3 FPGA Functionality

The 20,000 LUT Altera Cyclone IV FPGA is an integral part of the TS-7800-V2 design. After an operating system has booted, the FPGA provides the CPU access to the PC/104 connector. 89 PC/104 pins are connected to the FPGA. The default FPGA load allows these pins to be used either as a standard PC/104 bus or for GPIO. Due to the flexibility of FPGAs, many other functionalities are possible such as quadrature encoders, PWM outputs, extra serial ports, DMX, or other unique communications protocols. Please contact Technologic Systems if you require custom FPGA logic.

The default FPGA has several cores available at 0xe8000000 as a 32-bit bus. Most of these are abstracted by existing drivers or utilities.

Offset Description
0x00-0xff Syscon
0x100-0x1ff SD card controller
0x200-0x2ff IRQ controller
0x400-0x4ff DMA channel interface
0x800-0x8ff NAND controller

6.3.1 FPGA Syscon

By default the Intel FPGA on the TS-7800-V2 is loaded with a system controller core at base physical address 0xFC081000. Add that base to the offsets below to access these registers. With the exception of the UART control registers, these registers are all 32 bits wide and should therefore be accessed with 32 bit writes. The UART registers are 16 bit registers.

Offset Bits Description
0x0 31-8 Board ID: 0xb480
7-0 FPGA Revision
0x4 31 U-Boot jumper status (1 = on)
30 SD Boot jumper status (1 = on)
29-16 LCD header data in pins 14-1
15-0 DIO header data in pins 16-1
30 Green LED (1 is on)
29:16 LCD header Data Output (pin 1:14)
15:0 DIO Header Data Output (pin 1:16)
0xc 31-21 Reserved
20 Red LED (1 is on)
19 EN_CONSOLE jumper status (1 = on)
18-17 Reserved
16 UART4 RTS on COM3
15 1 = RS422 on COM2 using TSUART2

0 = dual RS485 using TSUART2 and TSUART3

14 UART DTR for COM1
13 UART RTS for COM1
12-0 PC104 Configuration
0x10 31-0 PC104 row A GPIO data
0x14 31-0 PC104 row B GPIO data
0x18 31-20 Reserved
19-0 PC104 row C GPIO data
0x1c 31-20 Reserved
19-0 PC104 row D GPIO data
0x20 31-0 PC104 row A GPIO data direction
0x24 31-0 PC104 row B GPIO data direction
0x28 31-20 Reserved
19-0 PC104 row C GPIO data direction
0x2c 31-20 Reserved
19-0 PC104 row D GPIO data direction
0x30 31-0 PC104 row A MUX function
0x34 31-0 PC104 row B MUX function
0x38 31-20 Reserved
19-0 PC104 row C MUX function
0x3c 31-20 Reserved
19-0 PC104 row D MUX function
0x40 31-0 Free running microsecond counter
0x44 31-0 32 bits of random data updated every second

6.3.2 LCD and DIO

The DIO and LCD headers are controlled by 32 bit registers at 0xe8000004 and 0xe8000008. Bits 15-0 control the DIO header and bits 29-16 control the LCD header. The register at 0xe8000008 is the output register. Writing a 0 drives the pin low but writing a 1 only tri-states. To use these pins for input, write a 1 to the output register and read the register at 0xe8000004. See the #LCD Header and #DIO Header sections for more details on the pinout. See the syscon for more information on the FPGA Register map that controls these IO.

6.3.3 PC104

To access peripherals on the PC104 bus it is necessary to add the base address from the table below to the offset of the peripheral to get a memory address for accessing the peripheral. For example, for ISA 8-bit I/O address 0x100, add 0xFA000000 to 0x100 to get 0xFA000100.

Memory I/O
8-bit 0xF8000000 0xFA000000
16-bit 0xF9000000 0xFB000000

For backward-compatibility with the TS-7800, the linux devmem driver has been adapted to allow the old addresses to be used as before from within an application. These addresses are shown in the next table.

Memory I/O
8-bit 0xEC000000 0xEE000000
16-bit 0xED000000 0xEF000000

IRQs 5, 6, and 7 on the PC104 bus from the TS-7800-V2 are 64 + the PC104 IRQ number. These will be IRQs 69, 70, and 71.

WARNING: The Ethernet connector near the PC/104 bus is near the edge of the PC/104 specification. It is advised to apply a piece of electrical tape on top of the ethernet connector when using a PC/104 daughter board to help prevent any damage.

The TS-7800-V2 provides control over some of the ISA parameters of the PC-104 bus through a 32-bit register located at address 0xE800000C, which is defined as follows:

Bit(s) Function
5-0 ISA strobe length
9-6 ISA setup length
10 Honor ISA 0WS/ENDX signal (1=true)
11 TS special ISA pinout enable (1=true)
12 ISA oscillator select
Value Function
0 high-jitter approximation of 14.318Mhz
1 clean 25Mhz

(Other bits in this register should be masked out.)

The ISA strobe length and ISA setup length are both given as the number of extra 10ns periods.

The ISA strobe length is the amount of additional time that ISA_IOR, ISA_IOW, ISA_MEMR, and ISA_MEMW are held asserted. The minimum (when bits are zero) is 20ns. The default power-on value is 40, for a 420ns strobe length. If configured to honor the ISA 0WS/ENDX signal, the peripheral will skip the remaining strobe time for an early transaction end, allowing for faster devices than standard ISA allows.

The ISA setup length is the additional amount of time above 20ns that the address and data are held stable before asserting the strobe. The default is 14 (160ns).

There is an additional 20ns hold time at the end of the strobe where address and data are kept valid. The default total bus cycle length is then 160ns (setup) plus 420ns (strobe) plus 20ns (hold) for a total of 500ns (2Mhz). This is very conservative for modern hardware and most designs can actually run much faster.

The TS special ISA pinout is designed to enable compatibility with products from TS that use the 16-bit bus on the 64-pin PC/104 header. For example the TS-ETH2 is a 16-bit peripheral that has a jumper labeled "ARM." When this jumper is shorted it will expect to use the TS special ISA pinout, if it is left open it will expect to use standard PC/104 16-bit pinout. Please note that disabling the special pinout is generally not required as both 8 and 16-bit bus cycles will still function normally when it is enabled. Disabling the special ISA mode will result in quirky behavior that may show double read strobes. PC104 GPIO

The PC-104 connector can be multiplexed between PC-104 functionality and GPIO functionality. There are up to 89 general purpose digital I/O pins available. This corresponds to 104 pins total minus fifteen pins carrying power or ground rails.

Each GPIO pin has a two corresponding register bits, one in the GPIO data register, and one in the GPIO direction register. The direction register determines if the pin is an output (actively driven) or an input (tri-stated, driven externally). A high ("1") value sets a particular pin to be an output, while a low ("0") value sets it to be an input. The data register, when read, contains the current state of all pins in GPIO mode. When written, the value written will determine the state of all pins in GPIO mode, but only for pins which have their direction set to "output".

The GPIO register map is as follows:

Address Row Register
0xE8000010 A Data
0xE8000014 B Data
0xE8000018 C Data
0xE800001C D Data
0xE8000020 A Direction
0xE8000024 B Direction
0xE8000028 C Direction
0xE800002C D Direction

A simple command-line example to toggle pins on Row A is thus:

#connect an LED from ground (cathode) to Row A pin 2 (andode).
#set row A to all GPIO mode
peekpoke 32 0xe8000030 0x0
#set row A to all output:
peekpoke 32 0xe8000020 0xffffffff
#turn on the pin we attached an LED to with 0b000000010
peekpoke 32 0xe8000010 0x2
#turn off the pin
peekpoke 32 0xe8000010 0x0
#... or turn on the whole row:
peekpoke 32 0xe8000010 0xffffffff

Row A is the row nearest the edge of the board on the longer PC104 socket. Pin 1 is at the end nearest the DB9 connector. From outside (nearest to the edge of the board) to inside (closest to the center of the board) the pin row labels are D, C, A, B. For more pin descriptions and positions, see the table below in section 6.11. PC104 16550

Many of our PC104 peripherals interface with the TS-7800-V2 using a 16550 UART. To connect to these devices we provide a generic driver. For example, to use a TS-SER4 with jumpers IRQ2 and IRQ4 on:

modprobe ts7800_isa16550 irq=6 io=0x3e8
# On the TS-SER4, we have multiple 16550 devices.  To use
# these, the parameters for each must be specified:
rmmod ts7800_isa16550
modprobe ts7800_isa16550 irq=6,7,6,7 io=0x2e8,0x3a8,0x2a8,0x3a0

After loading dmesg will indicate the new device name for each uart discovered:

 serial8250: **ttyZ2** at MMIO 0xee0002e8 (irq = 70) is a 16550A
 serial8250: **ttyZ3** at MMIO 0xee0003a8 (irq = 71) is a 16550A
 serial8250: **ttyZ4** at MMIO 0xee0002a8 (irq = 70) is a 16550A
 serial8250: **ttyZ5** at MMIO 0xee0003a0 (irq = 71) is a 16550A

Note that the interrupts for the PC104 bus start at #64, so "irq = 70" will be shown when "irq=6" is specified.

6.4 Serial Ports

The TS-7800-V2 has 10 UARTs. Two of these UARTs, which appear on the COM1 (DB9) header and the COM2 (10-pin) header are driven by the CPU. Under Linux these show up under /dev as ttyS0 and ttyS1. The other 8 UARTs are driven by the FPGA. Under Linux these show up under /dev as tttsn where n is the UART number listed in the table below.

Please note that the pin numbering on the 10 pin COM headers is as shown here:

6 7 8 9 10
1 2 3 4 5

When some UART ports are enabled, they override the meanings of other pins with their own meanings. When disabled, the pins revert to their original meaning. The table below describes the ten UART ports. The "RS-" column indicates whether the port is RS-232, RS-485/422, or TTL.

WARNING: Pay special attention to the pin definitions on this chart. These definitions are made specifically for compatibility with the original TS-7800 and may not match other TS products.
Number Type Header TX RX TXEN RTS CTS
0 RS232 COM1 7 8 N/A N/A N/A
1 RS232 COM1 4 1 N/A N/A N/A
2 RS485/RS422 COM2 +6 -1 +4 -9 N/A N/A N/A
3 RS485 COM2 +4 -9 N/A N/A N/A N/A
4 RS232 COM3 3 2 N/A 7 8
5 RS232 COM3 7 8 N/A N/A N/A
6 TTL DIO 13 15 11 N/A N/A
7 TTL LCD 13 14 12 N/A N/A
8 TTL PC104 C17 C18 C16 N/A N/A
9 TTL PC104 C14 C15 C13 N/A N/A

You can select RS-422 on port 2 by setting bit 15 of register 0xe800000C to 1. If it is 0, it will default to RS485.

6.5 Realtime Clock

Prototype P2: The TS-7800-V2 uses the Realtime Clock on the Marvell 88F6820. Linux supports this RTC with the armada38x-rtc driver.

Revision A: The TS-7800-V2 uses an M41T00S Realtime Clock. Linux supports this RTC with the rtc_ds1307 driver.

6.6 Temperature Sensor

The TS-7800-V2 uses the temperature sensor in the SiLabs microcontroller. This device has an I2C interface to the CPU. The temperature may be read with the ts7800ctl utility

ts7800ctl -t

The temperature is printed in millicelsius.

6.7 WiFi

The TS-7800-V2 offers optional WiFi (and Bluetooth) using an ATWILC3000-MR110CA IEEE 802.11 b/g/n Link Controller Module With Integrated Bluetooth® 4.0. Linux provides support for this module using the wilc driver.

Summary features:

  • IEEE 802.11 b/g/n RF/PHY/MAC SOC
  • IEEE 802.11 b/g/n (1x1) for up to 72 Mbps PHY rate
  • Single spatial stream in 2.4GHz ISM band
  • Integrated PA and T/R Switch Integrated Chip Antenna
  • Superior Sensitivity and Range via advanced PHY signal processing
  • Advanced Equalization and Channel Estimation
  • Advanced Carrier and Timing Synchronization
  • Wi-Fi Direct and Soft-AP support
  • Supports IEEE 802.11 WEP, WPA, and WPA2 Security
  • Supports China WAPI security
  • Operating temperature range of -40°C to +85°C

To use Wifi, you must first install the driver, as follows

# Ensure that the CPU_ACCESS_FPGA_FLASH# bit in SysCon is 0
peekpoke 32 0xFC081008 0x3fffffff
modprobe wilc-spi

Now you may configure the 'wlan0' interface like any other. For example

ifconfig wlan0 up

See the WiFi Client and WiFi Access Point sections for more details on connecting to networks.

6.8 Watchdog

TBD: This section still under construction.

6.9 Bluetooth

The WIFI option on the board also includes a bluetooth 4.0 module. To use bluetooth, it is necessary to first configure the WiFi interface. Then, run the following commands:

# Install bluez if it is not already present
apt-get update
apt-get install bluez bluez-tools
# Enable Bluetooth, and load the driver firmware
echo BT_POWER_UP > /dev/wilc_bt
echo BT_FW_CHIP_WAKEUP > /dev/wilc_bt
echo BT_DOWNLOAD_FW > /dev/wilc_bt
hciattach /dev/ttts8 any 115200 noflow
hciconfig hci0 up

Now you may scan for available devices with:

hcitool scan

This will return a list of devices such as:

14:74:11:AB:12:34	SAMSUNG-SM-G900A

You may request more information from a detected device like so:

hcitool info 14:74:11:AB:12:34

This will produce lots of details about the device, for example:

Requesting information ...                                                      
        BD Address:  14:74:11:AB:12:34                                          
        OUI Company: Samsung Electronics Co.,Ltd (4C-A5-6D)                     
        Device Name: SAMSUNG-SM-G900A                                           
        LMP Version: 4.1 (0x7) LMP Subversion: 0x610c                           
        Manufacturer: Broadcom Corporation (15)                                 
        Features page 0: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87        

Bluez has support for many different profiles for HID, A2DP, and many more. Refer to the Bluez documentation for more information.

6.10 Accelerometer

The TS-7800-V2 offers optional 9-axis MotionTracking, using an InvenSense MPU-9250 Gyro/Accelerometer/Compass device.

6.11 Status LEDs

TBD: This section still under construction.

6.12 Auxiliary Power Source

A 5-volt power supply is available on CN1 (if populated). Power to this header is controlled by GPIO #43. To turn on the power:

echo 43 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio43/direction
echo 1 > /sys/class/gpio/gpio43/value

To turn it off again:

echo 0 > /sys/class/gpio/gpio43/value

7 External Interfaces

7.1 DIO Header

Access to the DIO header is described here. These pins can be driven low, otherwise they are inputs with pull-up resistors. The pull-ups are via 2.2k Ohms on the odd numbered pins 1-15. Pin 10 has a 10k pull-up and is a read-only input. The rest are pulled up by the FPGA through 20k-150k nominal resistance. The pinout for the DIO header is shown below.

DIO Header
2 4 6 8 10(RO) 12 14 16
1 3 5 7 9 11 13 15
DIO_01 DIO_03 DIO_05 DIO_07 DIO_09 DIO_11 DIO_13 DIO_15

7.2 LCD Header

This header is laid out to drive our LCD-LED product. The file tolcd.c in our samples directory demonstrates this. Like the DIO header, pins 7-14 can be driven low, otherwise they tri-state with a 2.2k Ohm pull-up. Pins 4 and 5 are pulled up by 475 Ohm and 51 Ohm inline resistance, respectively.

LCD Header
2 4 6 8 10 12 14
1 3 5 7 9 11 13

7.3 Ethernet Port

The MV88F6820 Ethernet LAN controller incorporates all the logic needed to interface directly to the low-power Marvell 88E1512 Ethernet PHY, which in turn is connected to the integrated RJ-45 connector with built-in 10/100/1000 transformer and LED indicators.

The RJ-45 connector has a pair of built-in LEDs, both of them green. By default, the LED on the left indicates link status (on=link; off=no link), and the LED on the right indicates activity. The 88E1512 PHY supports many other configurations for these LEDS, such as blinking the link LED once, twice, or three times, to indicate 10, 100, or 1000 Gbps, respectively. See the 88E1512 datasheet for more details.

Note: TS-Kernel provides all the software support to use the MV88F6820 10/100/1000 Ethernet core. For more details, find the TCP/IP configuration instructions on the Linux documentation.

7.4 SD Connectors

There is a micro-SD connector on the top of the TS-7800-V2, and a full-size SD connector on the underside. These connectors are wired in parallel, which means that only one of them may have a card installed at any given time. The card shows up as /dev/tssdcarda on the TS-7800-V2.

SD Memory Card technology provides large capacity and fast access combined with a compact and slim profile, making it very appealing for a wide range of next generation products and applications. In addition, SD Cards feature content protection, planned capacity growth, high-speed data transfer, and a write protect switch. These devices supply additional non-volatile storage either for data or for a complete operation system distribution, such as Debian, to be used with the TS-7800-V2 SBC.

The TS-7800-V2 fully supports SDHC cards as well.

7.5 Mini PCI Express Connector

TBD: This section still under construction.

7.6 Power Supply Connector

The TS-7800-V2 requires regulated 5VDC at 2000 mA.

WARNING: Supply voltages over 6 VDC may damage the TS-7800-V2.

Be sure to use a regulated 5 VDC power supply, preferably with current limiting to 2 to 3 Amps. A current-limited supply is very forgiving of common errors during development. A PC power supply that may be capable of supplying 20 Amps or more is not recommended. It is possible to do irreversible damage to the TS-7800-V2 if the polarity of the supply is reversed.

TBD: TS-781 Power Regulator Feature should be mentioned here.

7.7 DB9 Connector

The DB9 connector brings out 1 CPU serial port (COM1, /dev/ttyS0, by default the Linux console) and 2 other RS-232 UARTs. Tx and Rx signals for COM1 are on pins 3 and 2. All signals are at RS-232 levels.

7.8 USB Host Connectors

The USB Connectors on the TS-7800-V2 provide two USB 3.0 interfaces. These operate at a baud rate of up to 5 Gbit/s ("SuperSpeed"). The host-controller also provides full compatibility with USB 2.0 at speeds up to 480 Mbits/sec ("High-Speed").

7.9 Micro USB Connector


7.10 COM2 Header

The COM2 header brings out COM2, /dev/ttyS1, with Tx and Rx on pins 3 and 2 at RS-232 levels. RS-485 (or RS-422) ports are also available on this header. See the #Serial Ports section for more details.

7.11 COM3 Header

The COM3 header brings out two UARTs at RS-232 levels. See the #Serial Ports section for more details. CAN is also on this header at pins 4 (CAN_H) and 9 (CAN_L).

7.12 A/D Header

The A/D header makes available 5 channels of 10 bit resolution A/D conversion. See the #ADC Sampling section for more details.

TBD: Pinouts table goes here.

7.13 PC104 Header

The PC-104 connector consists of pins in four rows labeled A, B, C, and D. The numbering of the pins in each row is shown below:

D 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
C 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
A 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01
B 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01

The PC-104 connector can be multiplexed between different functionalities including ISA bus and GPIO. The power-up default is GPIO mode, with all I/Os in a neutral state. To enable the PC-104 bus (ISA) signals, it is necessary to write the following values to the registers specified:

 0x55555555 to address 0xE8000030
 0x55555555 to address 0xE8000034
 0x55555 to address 0xE8000038
 0x55555 to address 0xE800003C

This is to say, you should add these commands to the startup service of your application if your design will rely on PC104 hardware:

 peekpoke 32 0xE8000030 0x55555555
 peekpoke 32 0xE8000034 0x55555555
 peekpoke 32 0xE8000038 0x55555
 peekpoke 32 0xE800003C 0x55555

More specifically, the functionality of the PC-104 connector can be configured in a more fine-grained manner, two pins at a time. Each pin pair will have one of two functions:

Value Description
2 Reserved
3 Reserved

Setting the function of each pair of pins is done by writing the function number to the appropriate pair of bits in the register corresponding to the row in question. The table below shows the bit positions in each register on the top row, while the cells below in the same column give the corresponding pin numbers for each row which are programmed with those bits at the specified register address.

Row Register bits 31
A 0xE8000030 31
B 0xE8000034 31
C 0xE8000038 19
D 0xE800003C 19

For example, to set the function of pins B19 and B20, this the table above indicates to use bits [19:18] of the register at address 0xE8000034.

The function of the PC-104 connector pins are given in the table below. The "ISA" column gives the name of the pin signal when it is configured as ISA, while the "GPIO" column gives the name of the pin signal when it is configured as GPIO. To save space, there are two sets of columns in each table, whereby the pin name is listed first, followed by the ISA signal and then the GPIO signal, and then this order is repeated for the other set of pins on the same physical header.

The 64-pin connector is given first:

A2 D7 A[1] B2 RESET B[1]
A3 D6 A[2] B3 +5V +5V
A4 D5 A[3] B4 IRQ9 B[3]
A5 D4 A[4] B5 3.3V 3.3V
A6 D3 A[5] B6 DRQ2 B[5]
A7 D2 A[6] B7 NC B[6]
A8 D1 A[7] B8 ENDX# B[7]
A9 D0 A[8] B9 8V_30V 8V_30V
A11 AEN A[10] B11 MEMW# B[10]
A12 A19 A[11] B12 MEMR# B[11]
A13 A18 A[12] B13 IOW# B[12]
A14 A17 A[13] B14 IOR# B[13]
A15 A16 A[14] B15 DACK3# B[14]
A16 A15 A[15] B16 DRQ3 B[15]
A17 A14 A[16] B17 DACK1# B[16]
A18 A13 A[17] B18 DRQ1 B[17]
A19 A12 A[18] B19 RFRSH# B[18]
A20 A11 A[19] B20 BCLK B[19]
A21 A10 A[20] B21 IRQ7 B[20]
A22 A9 A[21] B22 IRQ6 B[21]
A23 A8 A[22] B23 IRQ5 B[22]
A24 A7 A[23] B24 IRQ4 B[23]
A25 A6 A[24] B25 IRQ3 B[24]
A26 A5 A[25] B26 DACK2# B[25]
A27 A4 A[26] B27 TC B[26]
A28 A3 A[27] B28 BALE B[27]
A29 A2 A[28] B29 +5V +5V
A30 A1 A[29] B30 OSC B[29]
A31 A0 A[30] B31 GND GND
A32 GND GND B32 ISA_B32 B[31]

Here are the pin assignments for the 40-pin connector:

C1 SBHE# C[1] D1 MEM16# D[1]
C2 LA23 C[2] D2 IO16# D[2]
C3 LA22 C[3] D3 IRQ10 D[3]
C4 LA21 C[4] D4 IRQ11 D[4] (RO)
C5 LA20 C[5] D5 IRQ12 D[5] (RO)
C6 LA19 C[6] D6 IRQ15 D[6] (RO)
C7 LA18 C[7] D7 IRQ14 D[7] (RO)
C8 LA17 C[8] D8 3.3V 3.3V
C9 MEMR# C[9] D9 DRQ0 D[9]
C10 MEMW# C[10] D10 DACK5# D[10]
C11 SD8 C[11] D11 DRQ5 D[11]
C12 SD9 C[12] D12 DACK6# D[12]
C13 SD10 C[13] D13 DRQ6 D[13]
C14 SD11 C[14] D14 DACK7# D[14]
C15 SD12 C[15] D15 DRQ7 D[15]
C16 SD13 C[16] D16 +5V +5V
C17 SD14 C[17] D17 MASTER# D[17]
C18 SD15 C[18] D18 GND GND
Note: The GPIO nomenclature in these tables is such that, for example, "A[0]" means "Bit 0 of GPIO Register A", and in general "X[n]" means "Bit n of GPIO Register X" and "X[n:m]" means "Bits n through m of GPIO register X", where X is one of A, B, C, or D.

8 Migration Path

While 100% backwards-compatibility is often an impossible challenge that manufacturers choose not to pursue, Technologic Systems is introducing the TS-7800-V2 with the intent to provide a favorable compromise between backward compatibility and the forward-looking features necessary to meet the demands of today's embedded systems market.

Due to the decade-long reign of the TS-7800, many technologies have sufficiently changed that render a 100% backwards-compatible design completely impossible. With that in mind, the design team has made great efforts to implement features intended to ease any transition from the original TS-7800 into the TS-7800-V2 Industrial SBC platform, such as providing a driver that automatically remaps old memory addresses to their new locations, and providing symbolic links such that the serial port device nodes continue to work without any need to change to the new naming conventions offered by the newer platform.

This chapter is intended to supplement the existing manual, detailing and highlighting specific articles and information needed to speed your migration into the TS-7800-V2 platform.

8.1 Booting

The TS-7800-V2 makes significant changes to the boot process. The first difference is the replacement of the TS-BOOTROM with the more modern U-Boot bootloader. Next, in keeping with the newer Debian 9 ("Stretch") version, there is no longer an initrd. This is important to note for those designs where operating from the RAMDisk was preferred. If this functionality is necessary for your specific application, please contact Technologic Systems' support team (

The TS-7800-V2's boot pattern is most easily described by the image below:

The default TS-7800-V2 boot pattern provided by Technologic Systems.

Very important: The SD card from a TS-7800 cannot directly boot a TS-7800-V2, however the implementation team has implemented in uBoot a means for the TS-7800-V2 to retain backward compatibility by having u-Boot load the kernel from the eMMC and then use the SD media as the SBC's root filesystem. Direct-boot options (which use the kernel on the target media) on the TS-7800-V2 are eMMC, USB, and SATA. Please see the above boot map.

The TS-7800-V2 is binary-compatible with EABI Linux user-space applications that were created for the earlier product, and these should run unchanged on the TS-7800-V2. OABI applications may need to be recompiled using a more modern compiler.

8.2 Software Differences

This is where the TS-7800-V2 takes a turn into realms previously unknown to its predecessor. The TS-7800-V2 employs several new software technologies to bring the venerable TS-7800 platform into the current Linux era. Older technologies such as the initrd and init.d are completely deprecated in favor of the u-Boot bootloader and the systemd init system. For those with existing init.d scripts, those scripts must be modified and enabled for compatibility with the systemd scripting system. Pertinent documentation is included in the Starting Automatically section.

8.2.1 New U-Boot

U-Boot replaces the older TS-BOOTROM bootloader. U-Boot is significantly more powerful and allows the downstream developer more control over the earliest and lowest levels of system boot, including the ability to introduce custom early-boot scripts and conditions without the need to recompile or reinstall the U-Boot binary. More information on the U-Boot system used on the TS-7800-V2 is found in the U-Boot section. Note: While it is possible to replace the U-Boot binary, Technologic Systems does not recommend doing so. Mistakenly installing a non-functional U-Boot binary will "brick" the TS-7800-V2, and the only means of recovery could be to return the device for re-imaging via RMA.

8.2.2 New Boot Process

The original TS-7800 had a three stage boot. The BootROM loaded the kernel and jumped into an initial RAMDisk (initrd) running Busybox, which then loaded the downstream developer's application, or started the Debian loader. The TS-7800-V2 no longer uses the initrd, in favor of loading Debian directly.

8.2.3 New Kernel

The TS-7800 shipped with Linux 2.6. The TS-7800-V2 ships with Linux 4.4. If you have written custom drivers for the earlier kernel, you will need to recompile them (and very likely make changes to them) for the newer kernel.

8.2.4 New Partition Scheme

The original TS-7800 used a 3-partition system, one for kernel, one for initrd, and one for the Linux Root Filesystem. The TS-7800-V2 has media with just one primary partition. This removes the initrd completely, and moves the kernel into the primary partition. The U-Boot bootloader occupies a special hardware portion of the eMMC chip, and is seen from Linux as a separate device.

8.2.5 Systemd versus init.d

The initd. system has been a mainstay standard boot methodology for many years in the Linux community. It featured a structured scripting system that ensured software was loaded in the proper order via a staged priority mechanism. This worked well during an era when the computer largely could only complete one task at a time and all software to be loaded needed to be loaded sequentially. The flaw in this strategy is as time has passed and computers have become more capable, there is no longer a need for linear execution, and many software packages can start independently of other software packages by employing multiple system threads. A new startup system was needed.

Enter: systemd. Systemd employs a more robust prerequisite-based startup scripting system that allows for much faster boot times by starting software as its prerequisites are fulfilled instead of starting just one service at a time. This makes for more complicated, but also more robust startup and shut-down scripts in the Linux distribution.

Unfortunately init.d scripts written for the TS-7800 will not directly work on the TS-7800-V2: Some adjustment must be made to the older scripts to make them work under systemd.

The .service file simply tells the new system when to start the service, much as the init.d file did previously. Instead of a linear numerical system, it determines what to start based on dependencies, so for example if the old script just needs to make sure the network exists before it can run, simply add "requires=network.service" to the appropriate part of the new myservice.service file. This replaces the older init.d "S99" and "K99" style.

What follows are the instructions for writing startup scripts in Debian Jessie.

TBD: Create an example relevant to the TS-7800-V2.

A systemd service can be created to start up headless applications. Create a file in /etc/systemd/system/yourapp.service

Description=Run an application on startup

If networking is a dependency add "" in the Unit section. Once you have this file in place add it to startup with:

# Start the app on startup, but will not start it now
systemctl enable yourapp.service
# Start the app now, but doesn't change auto startup
systemctl start yourapp.service
Note: See the systemd documentation for in depth documentation on services.

To start an application on bootup with X11 instead change the x-session-manager. By default the system starts xfce:

root@ts:~# ls -lah /usr/bin/x-session-manager 
lrwxrwxrwx 1 root root 35 May 26  2015 /usr/bin/x-session-manager -> /etc/alternatives/x-session-manager
root@ts:~# ls -lah /etc/alternatives/x-session-manager
lrwxrwxrwx 1 root root 19 May 26  2015 /etc/alternatives/x-session-manager -> /usr/bin/startxfce4

The x-session can be modified to only start specified processes. Create the file /usr/bin/mini-x-session with these contents:

matchbox-window-manager -use_titlebar no &
exec xfce4-terminal

You may need to "apt-get install matchbox-window-manager." first. This is a tiny window manager which also has a few flags that simplify embedded use. Now enable this session manager and restart slim to restart x11 and show it now.

chmod a+x /usr/bin/mini-x-session
rm /etc/alternatives/x-session-manager
ln -s /usr/bin/mini-x-session /etc/alternatives/x-session-manager
service slim restart

If the x-session-manager process ever closes x11 will restart. The exec command allows a new process to take over the existing PID. In the above example xfce4-terminal takes over the PID of x-session-manager. If the terminal is closed with commands like exit the slim/x11 processes will restart.

8.3 Hardware Differences

8.3.1 New CPU

The TS-7800 uses a Marvell Feroceon MV88F5182 single-core CPU running at 500MHz. The TS-7800-V2 uses a Marvell Armada 385 88F6820 dual-core CPU running at 1.3 GHz. Naturally, this should result in a significant performance increase. The 88F6820 also adds 1 MB of L2 cache (shared between the cores). The additional performance of the TS-7800-V2 should not cause any problems for your application, as long as your code doesn't use simple software loops as a timing reference; such loops will run many times faster than they did on the TS-7800. Also, it is important to note that a single task, single thread application will not get the full benefit from the second CPU core.

8.3.2 More RAM

The TS-7800 has 128 MB of DDR1 RAM, while the TS-7800-V2 has 1 GB of DDR3 RAM with optional ECC mode (making 512MB). There are more details on ECC in the Boot Flags section.

8.3.3 New FLASH

The TS-7800 has 512 MB of on-board NAND flash, while the TS-7800-V2 has 4 GB of eMMC. This can optionally be converted into 2GB of SLC eMMC (information on this permanent conversion is in the eMMC Flash section).

8.3.4 New SD

Unlike the TS-7800, the SD connectors on the TS-7800-V2 are wired in parallel, meaning that only one may be used at any given time. You must not have a card in both slots.

8.3.5 New Microcontroller

The TS-7800 uses an ATMega48 AVR RISC-based microcontroller to perform various ancillary tasks on the board, such as Analog-to-digital conversion. The TS-7800-V2 uses a SiLabs C8051F381 to do the same job. The ts7800ctl utility continues to provide the same access to these functions as it did on the original TS-7800.

8.3.6 New Mini PCIe Bus

This is new for the TS-7800-V2 on certain build variants, and allows for the connection of mSATA or PCIe Cards to the board.

8.3.7 New UARTs

The tsuarts of the original TS-7800 have been replaced with full 16550 UARTs in the new FPGA. Symbolic links allow the downstream developer to use the original tsuart naming so ported applications may continue to use the names of the TSUART devices. These links are detailed in the following table:

/dev/ttts0 /dev/ttyS2
/dev/ttts1 /dev/ttyS3
/dev/ttts2 /dev/ttyS4
/dev/ttts3 /dev/ttyS5
/dev/ttts4 /dev/ttyS6
/dev/ttts5 /dev/ttyS7
/dev/ttts6 /dev/ttyS8
/dev/ttts7 /dev/ttyS9
/dev/ttts8 /dev/ttyS10
/dev/ttts9 /dev/ttyS11

8.3.8 New Physical Addressing

These have changed significantly, but our team has gone to great lengths to ensure application compatibilty in user space. From user space, no modifications should be necessary as all of the original TS-7800 memory mappings have been cross-mapped in the devmem driver for you. However, if you have kernel drivers that access these devices, then they will need to be modified to use the new addresses. The address mappings are described below.

TS-7800 TS-7800-V2
FPGA 32-bit 0xE8000000 0xFC081000
PC104 8-bit memory 0xEC000000 0xF8000000
PC104 16-bit memory 0xED000000 0xF9000000
PC104 8-bit I/O 0xEE000000 0xFA000000
PC104 16-bit I/O 0xEF000000 0xFB000000

8.3.9 New Temperature Sensor

The TS-7800 used a Texas Instruments TMP124 temperature sense chip, with SPI interface to the CPU. The TS-7800-V2 uses the temperature sensor in the SiLabs microcontroller. If you have applications that interface directly with the TMP124, they will need to be modified to use the new ts7800ctl access method. The ts7800ctl utility supplied on the TS-7800-V2 works the same way as previous.

Alternatively, there is an optional temperature sensor included if the optional accelerometer package is purchased.

9 Specifications

9.1 Power Specifications

The stock TS-7800-V2 expects 5V DC.

Input Min voltage Max voltage
5V input 4.5 5.25

9.2 Power Consumption

All tests are performed at 5V, with Ethernet, USB, mSATA, SD, disconnected unless otherwise specified. The different CPU frequencies are only tested when loaded and have the same power consumption at idle. Savings were not found by disabling CPU cores.

Test Average Max
Idle at 1.3GHz with Ethernet off 0.821A/4.11W 1.013A/5.07W
Idle at 1.3GHz, Ethernet connected 0.902A/4.51W 1.210A/6.05W
Busy both cores 666MHz (openssl speed) 0.984A/4.92W 1.111A/5.55W
Busy both cores 1066MHz (openssl speed) 1.252A/6.26W 1.308A/6.54W
Busy both cores 1333MHz (openssl speed) 1.355A/6.78W 1.572A/7.86W
Busy single core 1333MHz (openssl speed) 1.039A/5.20W 1.240A/6.20W
mSATA writing [1] 1.481A/7.41W 1.787A/8.94W
Sleep Mode 572uA/2.86mW 583uA/2.92mW
Test Average Max
Idle (no changes) 0.81A/4.05W 1.15A/5.75W
Busy both cores at 1.333MHz (openssl speed) 1.39A/6.95W 1.55A/7.75W
  1. Tested with Mushkin MKNSSDAT30GB, cpu at 1.3GHz and otherwise idle

9.3 Temperature Specification

All TS-7800-V2 are rated for -40 to +85 degrees C ambient with the CPU set to run at 1066 MHz. Temperature tolerance is lower when operating at the full 1.334 MHz speed. See the graphic below for more detail.

TS-7800-V2 HotTempTestGraph.jpg

9.4 I/O Specifications

9.5 Rail Specifications

10 Revisions and Changes

10.1 Errata

There are currently no errata related to this product.

10.2 PCB Revisions

PCB Revision Description of changes
Rev A. Initial Release

10.3 U-Boot Revisions

Version Description of changes
TBD: Release Version New Product

10.4 FPGA Revisions

Version Description of changes
TBD: Release Version New Product

10.5 Microcontroller Revisions

Version Description of changes
TBD: Release Version New Product

10.6 Kernel Revisions

Version Description of changes
6 Feb 2018: Pre-Release Version New Product Introduction / Initial candidate for Engineering Sampling Program
27 Feb 2018: Pre-release Configuration 2 Replaced RTC driver for compatibility with Rev. A01 SBC.

10.7 Software Image Revisions

Version Description of changes
7 Feb 2018: Engineering Sampling Release Candidate. New Product Introduction Candidate
27 Feb 2018: Engineering Sampling Release Candidate 2. Added new ts7800ctl binary to enable on-board temp sensor. Installed Picocom. Updated Aptitude databases. Ran distribution-upgrade.

10.8 Model Numbers

The TS part numbers for the TS-7800-V2 are TS-7800-V2-DMN1I, and TS-7800-V2-DMW9I. These codes disambiguate as follows:

Family Cores Memory Radio Option Set Temperature
TS-7800-V2 D = Dual M = 1GB DDR3 N = None 1 = Base Model I = Industrial (-40 to +85 C)
W=Wifi/Bluetooth 9 = Dev / All Options

During the engineering sampling phase, only the TS-7800-V2-DMN1I will be available for general purchase.