From Technologic Systems Manuals
Jump to: navigation, search
WARNING: This product is in the Engineering Sampling program. This means the documentation and product itself may change several times before the product is deemed ready for large quantity orders. Please force-refresh (shift-f5 on most browsers) to clear your cache when visiting this page to ensure you are viewing the most recent version of this documentation. Of course also please check back often as this information is subject to change.
TS-7800-V2
ts-7800-v2.gif
Product Page
Product Images
Specifications
Documentation
Schematic
Mechanical Drawing
FTP Path
Processor
Marvell MV88F6820
Armada 385 ARM Cortex-A9 1.3 GHz Dual Core CPU


Contents

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:

U-Boot SPL 2017.09-g2113ce6a21 (Mar 06 2018 - 16:20:06)
Detected Device ID 6820 (SAR1 0xCB00230D)
mv_ddr: mv_ddr-armada-17.10.3-g2113ce6a21 (Mar 06 2018 - 16:20:23)
DDR3 Training Sequence - Switching XBAR Window to FastPath Window
mv_ddr: completed successfully
Trying to boot from MMC1
force part -> 1


U-Boot 2017.09-g2113ce6a21 (Mar 06 2018 - 16:20:06 -0700)

SoC:   MV88F6820-A0 at 1332 MHz
I2C:   ready
DRAM:  1 GiB (666 MHz, ECC not enabled)
MMC:   mv_sdh: 0
*** Warning - bad CRC, using default environment

PCI:
  00:01.0     - 1204:0001 - Does not fit any class
Model: Technologic Systems TS-7800-V2
Found FPGA at 00.01.00
fpga_rev=0x22
board_id=0xB480
Bootflags: WDOG+ ECC- PCIE- MSATA+
SCSI:  MVEBU SATA INIT
SATA link 0 timeout.
SATA link 1 timeout.
AHCI 0001.0000 32 slots 2 ports 6 Gbps 0x3 impl SATA mode
flags: 64bit ncq led only pmp fbss pio slum part sxs
Net:   eth0: ethernet@70000
Press ESC twice to abort autoboot in 0 second(s)
Booting from the eMMC ...
** File not found /boot/boot.ub **
18642 bytes read in 145 ms (125 KiB/s)
4796480 bytes read in 937 ms (4.9 MiB/s)
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Device Tree to 0fff8000, end 0ffff8d1 ... OK

Starting kernel ...

Note the message "*** Warning - bad CRC, using default environment" is expected unless there is a custom u-Boot configuration present. For more information on loading custom u-Boot configurations please see the Custom U-boot section.

The "SD Boot" jumper, when set, will cause U-Boot to load the kernel from eMMC and then boot to SD, and when unset, U-Boot will load the kernel from eMMC and 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 
help
# This can also be used to see more information on a specific command
help i2c
 
# Boots into the compressed binary at $loadaddr.  
bootz
# 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
dhcp
# 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
fuse
 
# 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.
mtest
 
# Check for new SD card
mmc rescan
# Read SD card size
mmc dev 1
mmcinfo
# Read eMMC Size
mmc dev 0
mmcinfo
 
# The NFS command is like 'load', but used over the network
dhcp
env set serverip 192.168.0.11
nfs ${loadaddr} 192.168.0.11:/path/to/somefile
 
# Test ICMP
dhcp
ping 192.168.0.11
 
# Reboot
reset
 
# 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
else
	echo Could not find kernel
fi
 
# Commands can be timed with "time"
time bdinfo
 
# Print U-boot version/build information
version

2.4 Modify Linux Kernel cmdline

The Linux kernel cmdline can be customized by modifying the cmdline_append variable. If new arguments are added, the existing value should also be included with the new arguments.

env set cmdline_append console=ttymxc0,115200 init=/sbin/init quiet
env save

The kernel command line can also be modified from from the onboard Linux. From the linux shell prompt run the following commands to install the necessary tools and create the script:

apt-get update && apt-get install u-boot-tools -y
echo "env set cmdline_append console=ttymxc0,115200 init=/sbin/init quiet" > /boot/boot.scr
mkimage -A arm -T script -C none -n 'tsimx6 boot script' -d /boot/boot.scr /boot/boot.ub

The boot.scr includes the plain text commands to be run in U-Boot on startup. The mkimage tool adds a checksum and header to this file which can be loaded by U-Boot. The .ub file should not be edited directly.

2.5 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.6 Jumper Configuration

Jumper Function
SD Boot Boot to SD (Otherwise eMMC)
EN Console Enables the console, when populated, ttts9 is TTL on PC104 pins 14 and 15. When depopulated, ttts9 is on DB9 pins 2 and 3, replacing console RS232.
U Boot Stops boot in u-boot rather than booting to the disk image. Also used to enter your Production Mechanism.

2.7 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

 fpga_rev=0x1B
 board_id=0xB480
 Bootflags: WDOG+ ECC- PCIE- MSATA+
 SCSI:  MVEBU SATA INIT
 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

2.8 ts7800ctl

The ts7800ctl (or tshwctl) utility allows the downstream developer access to core functionalities in the microcontroller, FPGA, CPU, and other hardware features of the TS-7800-V2 not specifically supported by other common Linux software.

Usage: ts7800ctl [OPTION] ...
Examine/Modify state of TS-7800-V2 hardware.
 
General options:
  -s    seconds         Number of seconds to sleep for
  -r    CHANS           Sample ADC channels CHANS, e.g. "0-2,4", "1,3,4"output raw data to standard out
  -S    CHANS           Sample ADC channels CHANS, e.g. "0-2,4", "1,3,4"output string parseable data to standard out
  -n                    Red LED on
  -F                    Red LED off
  -g                    Green LED on
  -G                    Green LED off
  -i                    Display board info
  -o                    Display one time programmable data
  -m                    Display contents of non-volatile memory
  -a[N]                 Display accelerometer data, loop N times (0=forever)
  -t                    Display board temperature
  -A    ADDR            Write DATA to ADDR in non-volatile memory
  -D    DATA            Write DATA to ADDR in non-volatile memory
  -M[xx:xx:xx:xx:xx:xx] Display [or optionally set] the MAC address
  -O                    Display odometer(hrs board has been running for)
  -B                    Display birthdate
  -l   RATE             Set CPU clock rate, or if no argument lists possible rates (max default)
  -c   CORES            Set 1/2 Cores (max default)
  -V                    Verbose output
  -h                    This help screen

3 Backup / Restore

3.1 Backup/Restore 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


Backup

Entire SD card

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

Initrd

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

Restore

Entire SD card

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

Initrd

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

From TS-7800-V2


Backup

Entire card

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

Restore

The entire card from SBC

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

3.2 Backup/Restore eMMC

The TS-7800-V2 eMMC media backup and restore process must be performed while the TS-7800-V2 is booted from a separate media resource. There are several possible devices possible. These instructions will focus largely on USB and SATA media, but any other possible boot media could be used instead (eg. Network boot or micro SD).

Note: These instructions include commands that will erase target media. Be careful not to accidentally erase the wrong media.

3.2.1 Preparing the backup media

Use Linux PC to install image onto 8GB or greater USB media (or SATA).

Prepare the transfer media using the Linux PC:

wget ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7800-v2-linux/binaries/ts-images/ts7800v2-deb_stretch-latest.tar.xz
sudo mkdir mount
sudo mkfs.ext4 /dev/your_usb_or_sata_drive_partition_1  #this erases the media - make sure it doesn't have anything you want to keep on it!
sudo mount /dev/your_usb_or_sata_drive_partition_1 mount
cd mount
sudo tar -xJf ../ts7800v2-deb_stretch-latest.tar.xz -C . --numeric-owner
sudo cp ../ts7800v2-deb_stretch-latest.tar.xz root/
cd ..
sync
sudo umount mount

3.2.2 Backing up eMMC

This backs up the data partition of the eMMC device -- note this backup does NOT include uBoot or any other special partitions. Be sure the backup media has sufficient free space.

Populate the U BOOT jumper. Install backup media. Power on SBC.

#at U-Boot prompt, if USB media was used:
run usbboot
#at U-Boot prompt, if SATA media was used:
run sataboot
 
#Debian will load from the selected media.
#Log in as root, no password is required.
 
mkdir mount
mount /dev/mmcblk0p1 mount
cd mount
tar -cJf ../emmcBackup.tar.xz -C . --numeric-owner *  #this will take a while.
sync
cd ..
umount mount
shutdown -h now

Once the SBC indicates it has halted, remove power from the SBC and disconnect your backup media, the backup file is at "/root/emmcBackup.tar.xz" on the backup media.

3.2.3 Restoring eMMC

Remove the media from the PC and install it onto the TS-7800-V2. Populate the U BOOT jumper.

Use the media to install the new image onto the eMMC on the TS-7800-V2:

#at U-Boot prompt, if USB media was used:
run usbboot 
#at U-Boot prompt, if SATA media was used:
run sataboot
 
#debian loads from selected media.
#login as root, there is no password reuquired.
 
mount /dev/mmcblk0p1 mount
mkfs.ext4 /dev/mmcblk0p1  #note:  This step erases the eMMC user data partition.
mount /dev/mmcblk0p1 mount
cd mount
tar -xJf ../ts7800v2-deb_stretch-latest.tar.xz -C . --numeric-owner

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:

Prepare a USB media device (thumb drive, memory stick, etc.). Use a partitioning tool such as 'fdisk' 'cfdisk' or 'gparted' in linux to create a single linux partition on the media. This will use an MBR partition scheme and not GPT/GUID. Then format the device using 'sudo mkfs.ext3 /dev/devicename_here' if your preferred partition tool (such as fdisk) does not format the media for you. Once the media is formatted, extract the above tarball with:

# Assuming your media 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
sync
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 media that is not eMMC. Once booted, run the following commands:

mkfs.ext3 /dev/mmcblk0p1
mkdir /mnt/emmc
mount /dev/mmcblk0p1 /mnt/emmc
wget ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7800-v2-linux/binaries/ts-images/ts7800v2-deb_stretch-latest.tar.xz
tar -xJf ts7800v2-deb_stretch-latest.tar.xz -C /mnt/emmc/
umount /mnt/emmc
sync

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 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 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
dhclient


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.

/etc/systemd/network/eth.network

[Match]
Name=eth*
 
[Network]
DHCP=yes

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.

/etc/systemd/network/eth0.network

[Match]
Name=eth0
 
[Network]
Address=192.168.0.50/24
Gateway=192.168.0.1
DNS=192.168.0.1

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

[Unit]
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
 
[Service]
Type=simple
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I
 
[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service


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

[Match]
Name=wlan0
 
[Network]
DHCP=yes

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


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

You may now configure the 'wlan0' interface like any other. For example

# For static IP:
ifconfig wlan0 192.168.0.23 up
# Or for DHCP:
dhclient -v wlan0

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:

ssid=YourWiFiName
wpa_passphrase=Somepassphrase
interface=wlan0
bridge=br0
auth_algs=3
channel=7
driver=nl80211
hw_mode=g
logger_stdout=-1
logger_stdout_level=2
max_num_sta=5
rsn_pairwise=CCMP
wpa=2
wpa_key_mgmt=WPA-PSK
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:

[Unit]
Description=Hostapd IEEE 802.11 AP
Wants=network.target
Before=network.target
Before=network.service
After=sys-subsystem-net-devices-wlan0.device
After=sys-subsystem-net-devices-br0.device
BindsTo=sys-subsystem-net-devices-wlan0.device
BindsTo=sys-subsystem-net-devices-br0.device
 
[Service]
Type=forking
PIDFile=/run/hostapd.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B
 
[Install]
WantedBy=multi-user.target

Then enable this in systemd:

systemctl enable hostapd_user.service


Set up bridging

Create the following files with the listed contents.


/etc/systemd/network/br0.netdev

[NetDev]
Name=br0
Kind=bridge


/etc/systemd/network/br0.network

[Match]
Name=br0
 
[Network]
DHCP=yes


/etc/systemd/network/bridge.network

[Match]
Name=eth0
 
[Network]
Bridge=br0

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

[Unit]
Description=Run an application on startup
 
[Service]
Type=simple
ExecStart=/usr/local/bin/your_app_or_script
 
[Install]
WantedBy=multi-user.target

If networking is a dependency add "After=network.target" 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.

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.
su root
# Not needed for the immediate apt-get install, but used
# so we can install package:armhf for cross compiling
dpkg --add-architecture armhf
apt-get update
apt-get install curl build-essential crossbuild-essential-armhf -y

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:
wget https://raw.githubusercontent.com/bagder/curl/master/docs/examples/simple.c
# 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:
./hello-world
# Returns Exec format error
apt-get install qemu-user-static
./hello-world

4.7 Debian Read Only

Debian supports running as a read only filesystem. This is useful for systems that may lose power and shut down at any time. This is the simplest way to prevent filesystem corruption.

An example /etc/fstab would include:

/dev/root            /                    auto       defaults              1  1
proc                 /proc                proc       defaults              0  0
devpts               /dev/pts             devpts     mode=0620,gid=5       0  0
usbdevfs             /proc/bus/usb        usbdevfs   noauto                0  0
tmpfs                /run                 tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
tmpfs                /var/run                 tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
tmpfs                /var/volatile        tmpfs      defaults              0  0
tmpfs                /tmp                 tmpfs      defaults              0  0
tmpfs                /var/tmp             tmpfs      defaults              0  0

/dev/root is an abstraction to the real root filesystem device. This actually refers to the device u-boot specifes in the kernel cmdline as 'root='. Check "cat /proc/cmdline" to see what device this is on your system, but /dev/root can be left for these purposes.

To make Linux mount this as read only, change the mount options on /dev/root/ from "defaults" to "ro".

/dev/root            /                    auto       ro              1  1

After this, reboot. Some applications may fail to start because they are failing to write.

4.7.1 Debian Fix Read Only Services

Most services will just run while the OS is read only, but some may fail to start because writes are failing. The steps to fix this are application specific, but normally the writes need to be moved to a tmpfs, or disabled. This example will show fixing Apache2 to work while read only.

root@ts7800-v2:/root# /usr/sbin/apache2
(30)Read-only file system: AH00091: apache2: could not open error log file /var/log/apache2/error.log.
AH00015: Unable to open logs

There are two ways to handle this. The writes can be put into a tmpfs, or logs can be disabled. To put these logs in a tmpfs, first temporarily enable read/write:

mount -o remount,rw /

Now edit /etc/fstab and add the line:

tmpfs                /var/log/apache2     tmpfs      defaults              0  0

This will cause writes to /var/log/apache2 to go to a tmpfs, but these must be rotated or the tmpfs may run out of room. If the writes fail apache will stop crash.

The filesystem cannot be remounted read only while there are open file handles, so now reboot the system. Apache will start as normal.

Alternatively, logs can be shut off. Instead of the /var/log/apache2 fstab line, this can be run to disable logs:

# Disable logs on specific apache2 sites.
find /etc/apache2/sites-enabled/* -exec sed -i 's/#*[Cc]ustom[Ll]og/#CustomLog/g' {} \;
find /etc/apache2/sites-enabled/* -exec sed -i 's/#*[Ee]rror[Ll]og/#ErrorLog/g' {} \;
 
# disable the vhost access log
echo "" > /etc/apache2/conf-enabled/other-vhosts-access-log.conf
 
vim /etc/apache2/apache2.conf
## Replace: 
# ErrorLog ${APACHE_LOG_DIR}/error.log
## with:
ErrorLog /dev/null

Reboot, and apache should start up while the filesystem is read only.

4.7.2 Debian Stretch Create a read/write partition

While keeping the OS read/write it may be beneficial to keep one partition read/write to save log or configuration data. Our default images use one partition for the "/" partition including all of the Linux rootfs, but this example will resize that partition and create one other for data. First, boot to the disk and check the size of the partition:

Filesystem     1M-blocks  Used Available Use% Mounted on
/dev/root           3487  1484      1807  46% /
...

In this case the /dev/root filesystem is using 1484MB. As an example we will resize the filesystem to 1750MB which leave some room to grow if new packages are needed.

Use fdisk to get the sector count of the emmc: root@ts7800-v2:~# fdisk -l /dev/mmcblk0 Disk /dev/mmcblk0: 3.5 GiB, 3783262208 bytes, 7389184 sectors

Take a backup copy of the eMMC in a tar as described here. Copy this to your Linux workstation and the new image will be created there.

Create a file on your workstation the same size as the eMMC: dd if=/dev/zero bs=512 count=7389184 of=my-image.dd

LOOPDEV=$(losetup -f)
sudo losetup $LOOPDEV my-image.dd
sudo fdisk $LOOPDEV

Set up your partitions to your rootfs image size, and make the second partition cover the rest of the disk.

Welcome to fdisk (util-linux 2.30.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x8e8595de.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-7389183, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-7389183, default 7389183): +1750M

Created a new partition 1 of type 'Linux' and of size 1.7 GiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (3586048-7389183, default 3586048): 
Last sector, +sectors or +size{K,M,G,T,P} (3586048-7389183, default 7389183): 

Created a new partition 2 of type 'Linux' and of size 1.8 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Invalid argument

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

Detach the loopback device and recreate it with kpartx which will understand these new partitions.

sudo losetup -d $LOOPDEV
sudo kpartx -va my-image.dd

In my case this created loop1p1/loop1p2:

add map loop1p1 (253:0): 0 3584000 linear 7:1 2048
add map loop1p2 (253:1): 0 3803136 linear 7:1 3586048

Create the filesystems and extract your image:

sudo mkfs.ext4 /dev/mapper/loop1p1
sudo mkfs.ext4 /dev/mapper/loop1p2
sudo mkdir /mnt/emmc
sudo mount /dev/mapper/loop1p1 /mnt/emmc
sudo tar -xf /path/to/your/image.tar.xz -C /mnt/emmc
sudo mkdir /mnt/emmc/srv/

Open the /mnt/emmc/etc/fstab and add a line:

 /dev/mmcblk0p2   /srv          auto    ro                 0    2

This will mount the new partition automatically on startup.

</source> sudo umount /mnt/emmc sudo kpartx -d my-image.dd xz my-image.dd </source>

Write this my-image.dd.xz to your eMMC as described here. On startup the new data partition will be mounted at /srv. Make this partition read/write with:

mount -o remount,rw /srv/
 
# Whenever possible, make read only when done writing
mount -o remount,ro /srv/

The remount to read only will fail if there are any open file handles on this disk. See the lsof tool for more information on tracking down open file handles.

5 Production Mechanism

If the u-boot jumper is connected on startup, the TS-7800-V2 will scan for USB mass storage devices. If one is found, it will execute a file in the first partition called /tsinit.ub. This is intended for the initial production of boards and allows mass programming boards with a USB thumbdrive.

Download the latest USB production image here.

The blast image and scripts require a minimum of 50 MB; this plus any disk images or tarballs used dictate the minimum disk size required. The USB drive must have at least 1 partition, with the first partition being formatted ext2/3/4 or fat32/vfat.

# This assumes your thumbdrive is /dev/sdc:
sudo mkfs.ext4 /dev/sdc1
sudo mkdir /mnt/sd/
sudo mount /dev/sdc1 /mnt/sd/
sudo tar --numeric-owner -xJf /path/to/tsa38x_usb_blaster-latest.tar.xz -C /mnt/sd/
 
# Now you would create your images on the /mnt/sd/, but for
# an example these steps would write our latest debian image:
sudo wget -O /mnt/sd/emmcimage.tar.xz http://ftp.embeddedarm.com/ftp/ts-arm-sbc/ts-7800-v2-linux/binaries/ts-images/ts7800v2-deb_stretch-latest.tar.xz
# You can use a symlink to write the same image to sd
sudo ln -s /mnt/sd/emmcimage.tar.xz /mnt/sd/sdimage.tar.xz
sudo umount /mnt/sd
sync

The USB drive boots into a small buildroot initramfs environment with filesystem and partitioning tools. This can be used to format SD, eMMC, SATA, or even rewrite u-boot and its environment. The buildroot starts up and calls /blast.sh on the USB device. By default this script is set up to look for a number of of specific files on the USB disk and write to media on the host device. The blast.sh script will turn on both LEDs when it is run. Upon completion of the script the green led will blink for pass, or the red led will blink for failure. This script can be used without modification to write images from USB with these filenames:

SD Card sdimage.tar.xz Tar of the filesystem. This will repartition the SD card to 1 ext4 partition and extract this tar to the filesystem. If present, a /md5sums.txt will be checked and every file can be verified on the filesystem. This md5sums file is optional and can be omitted, but it must not be blank if present.
sdimage.dd.bz2 Disk image of the card. This will be written to tssdcarda directly. If present a sdimage.dd.md5 will cause the written data on the SD card to be read back and verified against this checksum.
eMMC emmcimage.tar.xz Tar of the filesystem. This will repartition the eMMC to 1 ext4 partition and extract this tar to the filesystem. If present, a /md5sums.txt will be checked and every file can be verified on the filesystem. This md5sums file is optional and can be omitted, but it must not be blank if present.
emmcimage.dd.xz Disk image of the card. This will be written to mmcblk0 directly. If present a emmcimage.dd.md5 will cause the written data on the eMMC to be read back and verified against this checksum.
SATA sataimage.tar.xz Tar of the filesystem. This will repartition the SATA drive to 1 ext4 partition and extract this tar to the filesystem. If present, a /md5sums.txt will be checked and every file can be verified on the filesystem. This md5sums file is optional and can be omitted, but it must not be blank if present.
sataimage.dd.xz Disk image of the card. This will be written to sda directly. If present a sataimage.dd.md5 will cause the written data on the SATA to be read back and verified against this checksum.
SPI u-boot.kwb This will rewrite u-boot on the SPI flash.
FPGA ts7800-fpga-<rev>.rpd If this file is present, and <rev> is later than what is programmed on the board, this will update the FPGA. This update will run first, and will reboot if an update is needed. Users should only copy files here as recommended by Technologic support. Updating the FPGA to any other files may require an RMA to repair the board.


Most users should be able to use the above script without modification, but our buildroot sources are available from our github repo. To build the whole setup and create a USB drive, the following commands can be used. This will wipe any data on the specified partition and replace it with an ext4 formatted filesystem. This filesystem will have all of the necessary files written to it to create a bootable USB drive. Note that this must be the first partition of the disk.

# Assuming /dev/sdc1 is your usb drive's first partition
make tsa38x_defconfig && make && sudo ./make_usb_prog.sh /dev/sdc1

6 Compile The Kernel

WARNING: BACK UP YOUR DATA FIRST

Prerequisites

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.

RHEL/Fedora/CentOS:

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

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

# Download the cross compile toolchain from Technologic Systems:
wget ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7800-v2-linux/cross-toolchains/armv7-marvell-linux-gnueabi-hard_i686_64K_Dev_20131002.tar.bz2
 
# Extract to /opt/toolchains/
sudo mkdir /opt/toolchains/
sudo tar -xjf armv7-marvell-linux-gnueabi-hard_i686_64K_Dev_20131002.tar.bz2 -C /opt/toolchains
 
#Download the kernel sources
git clone https://github.com/embeddedarm/linux-armada38x.git
 
cd linux-4.4.8

Export the CROSS_COMPILE variable with a path that points to the appropriate cross-compiler prefix.

export CROSS_COMPILE="/opt/toolchains/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 -j4 && make -j4 modules

Next generate a tar including the new kernel, device trees, and modules.

mkdir -p target/boot
INSTALL_MOD_PATH="target/" make modules_install 
cp arch/arm/boot/zImage  target/boot/zImage
cp arch/arm/boot/dts/armada-385-ts*.dtb target/boot/
cd target
tar cJf ../newkernel-$(git rev-parse --short HEAD).tar.xz .
cd ../

This will create a file like newkernel-8cac5540.tar.xz. The git hash indicates the source revision. Copy this to your target media. For example, if are booted to the target eMMC or SATA on the board:

tar -xf newkernel-8cac5540.tar.xz -C /

Reboot the board, and run "uname -a". This will print out the running kernel's revision: 4.4.8-g8cac5540.

7 Features

7.1 CPU Functionality

7.1.1 ECC

This CPU optionally supports ECC which is turned off by default. The TS-7800-V2 off the shelf builds include two RAM chips supporting 512MiB each. Enabling ECC will use one of these chips to store the ECC data only which halves the usable RAM.

ECC is enabled by modifying the #Boot Flags.

Once enabled, the CPU is capable of autocorrecting single bit failures, and detecting double bit failures. The mvebu_edac driver will report any failures to the kernel log. In the case of a single bit failure:

 EDAC MC0: 1 CE MVEBU on mc#0csrow#0channel#0 (csrow:0 channel:0 page:0xc8e offset:0xc8e000 grain:8 syndrome:0x5b99e5 - Single bit ECC Failure)

A double bit failure will print out this message, and also attempt a system reboot.

 EDAC MC0: 1 UE MVEBU on mc#0csrow#0channel#0 (csrow:0 channel:0 page:0x8e offset:0x8e000 grain:8 - Double bit ECC Failure)

To have the system not reboot in case of a double bit failure and just report change the kernel cmdline to include "mvebu_edac.edac_reboot_on_fail=0".

7.1.2 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.

7.1.3 Interrupts

The 88F6020 has 192 interrupts available on chip as well as another 16 implemented in the PCIe connected FPGA through MSI interrupts. There are 3 interrupts on the PC104 bus which can be used by end users.

IRQ Description
109 16550 port 0
110 16550 port 1
111 16550 port 2
112 16550 port 3
113 16550 port 4
114 16550 port 5
115 16550 port 6
116 16550 port 7
117 16550 port 8
118 16550 port 9
119 16550 port 10
120 FPGA CAN core
121 Reserved
122 PC104 IRQ5
123 PC104 IRQ6
124 PC104 IRQ7

In Linux, interrupts are not available to software outside the kernel.

7.1.4 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


7.1.5 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.

Testing indicates the USB3.0 functionality should be capable of operating at line rate. To date all testing has been limited by the external test apparatus being unable to saturate the USB 3.0 pipe.

7.1.6 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 scan" 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".

The PCIe port (on select TS-7800-V2 models) is configurable for mSATA functionality by setting a Boot Flag.

7.1.7 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.

7.1.8 Speed Scale

By default the CPU included is rated for 1333MHz. The CPU will be clocked up to this max speed by default at all times. It is possible to adjust this clock speed to 1066MHz, or 666MHz. Note that this does improve the power dissipation when the cpu would otherwise be loaded, but reducing the clock speed of this CPU does not reduce dissipation when the cpu is idle. Running at 1.3GHz with both cores enabled at idle is the same power consumption as 666MHz with only one core.

See the #Power_Consumption section for more information on these savings when loaded.

To reduce the clock speed:

# Specify the rate you want with 1066 or 666 directly:
ts7800ctl -l 1066
 
# Specify 0 to attempt to auto set back to the max:
ts7800ctl -l 0
 
# Specify 1 core instead of two
ts7800ctl -c 1

These commands will require a power cycle.

7.2 SiLabs Functionality

7.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:

GND GND GND GND GND
2 4 6 8 10
1 3 5 7 9
CH0 CH1 CH2 CH3 CH4

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.

Examples

# 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

7.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

7.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
0x8 31 CPU_ACCESS_FPGA_FLASH#
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-23 Reserved
22 WIFI_RESET#
21 EN_WIFI_PWR
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

7.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.

7.3.2.1 PWM

There are six PWM channels available, and these are presented on the DIO header, pins 1,3,5,7,9, and 11. To use these, use the pwmctl utility. The source for this utility is available for download here There are two independent 'generators' that may be programmed with a period between 1us (1MHz) and 409.5ms (2.44Hz). The PWM channels may select either of the two generators.

Some examples of using the PWM follows.

# Setup the first generator to have a frequency of 10KHz (ie, period=100us)
pwmctl -c 6 -d 100 -g 0
 
# Setup the second generator to have a frequency of 10Hz (ie, period=100ms)
pwmctl -c 7 -d 1000 -g 1
 
# Put a signal on DIO pin 1, 10KHz, 50% duty-cycle, using the 10KHz generator
pwmctl -c 0 -d 50% -g 0
 
# Put a signal on DIO pin 2, 10Hz, 20% duty-cycle, using the 10Hz generator
pwmctl -c 1 -d 20% -g 1
Note: The DIO pins are active low, which means that a signal with, for example, a 20% duty-cycle will be low 20% of the time.

7.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 122 + the PC104 IRQ number. These will be IRQs 122, 123, and 124.

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.

7.3.3.1 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.

7.3.3.2 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:

pc104on
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 = 123) is a 16550A
 serial8250: **ttyZ3** at MMIO 0xee0003a8 (irq = 124) is a 16550A
 serial8250: **ttyZ4** at MMIO 0xee0002a8 (irq = 123) is a 16550A
 serial8250: **ttyZ5** at MMIO 0xee0003a0 (irq = 124) is a 16550A

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

7.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.

Note, unless otherwise specified, the port numbering is for /dev/tttsN where N is the port number below.

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[1] PC104 C14 C15 C13 N/A N/A
/dev/ttyS1 RS-232 COM2 3 2 N/A N/A N/A
  1. The location of ttts9 depends on the EN_CON jumper. If populated, ttts9 behaves as documented above. If the jumper is depopulated, /dev/ttts9 is routed instead as RS232 to DB9 pins 3(TX) and 2(RX). Additionally, if the WIFI_RESET bit in SYSCON is set to a 1, then ttts9 is routed instead to the wifi/bluetooth module, and is no longer available as a general-purpose serial port

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.

7.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.

7.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.

7.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

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

7.8 Watchdog

The TS-7800-V2 includes a watchdog on the supervisory microcontroller. This is armed immediately from power on for 10 seconds. As soon as U-boot loads it will start feeding the watchdog. U-boot will feed for 60 seconds every 1 second. Once Linux takes over, there is a kernel driver which can feed the watchdog. This must be initiated by userspace. By default we use the watchdog software daemon to handle feeding.

To take over feeding in your application entirely, remove the "watchdog" daemon. The kernel provides an interface to the watchdog driver at /dev/watchdog. Refer to the kernel documentation for more information on interfacing with this directly:

7.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.

7.10 Accelerometer

The TS-7800-V2 offers optional 3-axis Accelerometer, using a Freescale MM8451 chip. The device may be accessed via the i2c bus, at slave-address 0x1C. The ts7800ctl program also has an option to display the acceleration value for the X,Y, and Z axes.

ts7800ctl -a                                 
accel_x=-0.0327                                                                 
accel_y=0.0225                                                                  
accel_z=0.983

Alternatively, you may use the kernel driver for the MMA8451...

modprobe mma8451

Now the chip may be accessed through the kernel 'event' interface: That is, events from the chip may be read from "/dev/input/event0".

Sample code (accel-test) is available [TBD] that shows how to use this interface.

7.11 Status LEDs

There are two status LEDs (one green, one red, next to the 5V power input near the PC104 header) on the TS-7800-V2. Both are normally quiescent (un-lit) in the default shipping image. The downstream developer has complete liberty to define the behavior of these LEDs in their software.

Simple control of the two LEDs is provided in the ts7800ctl software

7.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.13 SPI

There is no native-mode SPI available on any of the TS-7800-V2's connectors. However, the linux kernel has a "bit-banging" SPI driver, which can use GPIO pins, including those that are presented on the DIO, LCD, and PC/104 connectors. The default device-tree for the TS-7800-V2 includes the configuration required to connect an off-board SPI EEPROM to the DIO connector. The section is shown below:

 spi_gpio@0 {
      compatible = "spi-gpio";
      #address-cells = <0x1>;
      #size-cells = <0>;
      num-chipselects = <1>;
 
      cs-gpios  = <&ts7800v2_gpio 4  GPIO_ACTIVE_LOW>; /* CN8 pin  6*/
      gpio-miso = <&ts7800v2_gpio 8  GPIO_ACTIVE_HIGH>; /* CN8 pin 10*/
      gpio-mosi = <&ts7800v2_gpio 10  GPIO_ACTIVE_HIGH>; /* CN8 pin 12*/
      gpio-sck  = <&ts7800v2_gpio 12  GPIO_ACTIVE_HIGH>; /* CN8 pin 14*/
      status = "okay";
 
      eeprom: at25@0 {
            compatible = "atmel,at25";
            at25,byte-len = <0x8000>;
            at25,addr-mode = <2>;
            at25,page-size = <64>;
 
            reg = <0>;
            spi-max-frequency = <1000000>;
            status = "okay";
      };
   };

With such an eeprom connected, and the spi-gpio module loaded, the device will be accessible via the sysfs interface, typically at:

/sys/class/spi_master/spi32765/spi32765.0/eeprom

To use a different configuration, perhaps for different pins, or a different SPI device, the device-tree must be modified and the kernel recompiled. For more information on spidev, please see the kernel.org documentation here.

7.14 I2C

As with SPI there is no native-mode I2C available on any of the TS-7800-V2's connectors. However, the linux kernel has a "bit-banging" I2C driver, which can use GPIO pins, including those that are presented on the DIO, LCD, and PC/104 connectors. The default device-tree for the TS-7800-V2 includes the configuration required to connect an off-board I2C OLED display to the DIO connector. The section is shown below:

i2c_gpio@0 {
      compatible = "i2c-gpio";
      gpios = <
         &ts7800v2_gpio 0 GPIO_ACTIVE_LOW /* sda = CN8 pin 1*/
         &ts7800v2_gpio 1 GPIO_ACTIVE_LOW /* scl = CN8 pin 3*/
         >;
 
      status = "okay";
      i2c-gpio,sda-open-drain;
      i2c-gpio,scl-open-drain;
      i2c-gpio,delay-us = <2>;	/* ~100 kHz */
      #address-cells = <1>;
      #size-cells = <0>;
 
      ssd1306: oled@3c {   /* Used for an Arduino-style OLED display on i2c */
         compatible = "solomon,ssd1306fb-i2c";
         reg = <0x3c>;
         reset-gpios = <&ts7800v2_gpio 11 0>;   // CN8 pin 13
         solomon,height = <64>;
         solomon,width = <128>;
         solomon,page-offset = <0>;
         solomon,com-invdir;
         solomon,com-offset = <0>;
         solomon,prechargep1 = <1>;
         solomon,prechargep2 = <0xF>;
         status = "okay";
      };
   };

With such an display connected, run "modprobe ssd1307fb" and the display will be available as a framebuffer device at /dev/fb0.

For more information on programming with the i2c-dev interface, please see the kernel.org documentation here.

7.15 CAN

Note: CAN is implemented as of the 23 April 2018 image, however it is not yet well-proven and may not function completely as expected. There are likely still bugs to be found.

The TS-7800-V2 offers one CAN port available at COM3 pins 4 (CAN_H) and 9 (CAN_L). A kernel driver, ts7800v2-can, is provided. An example on how to use CAN follows.

   modprobe ts7800v2-can
   ip link set can0 type can bitrate 125000
   ifconfig can0 up
   cansend can0 123#12.34.56.78
Note: cansend is part of the can-utils package, which may be installed with 'apt-get install can-utils'.

8 External Interfaces

8.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
GND DIO_04 SPI_FRAME DIO_08 SPI_MISO SPI_MOSI SPI_CLK 3.3V
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

8.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
GND BIAS RW DB0 DB2 DB4 DB6
2 4 6 8 10 12 14
1 3 5 7 9 11 13
+5V RS EN DB1 DB3 DB5 DB7

8.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.

8.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.

8.5 Mini PCI Express Connector

TBD: This section still under construction.

8.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.

8.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.

8.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").

8.9 Micro USB Connector

The micro USB connector provides the downstream developer with a dedicated USB Serial console interface. This port will always echo the activity of ttyS0, and the interface at the CN12 location is available regardless of the status of the EN_CON jumper.

8.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.

8.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).

8.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.

8.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
0 GPIO
1 ISA
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
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
00
A 0xE8000030 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
00
B 0xE8000034 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
00
C 0xE8000038 19
18
17
16
15
14
13
12
11
10
09
08
07
06
05
04
03
02
01
00
D 0xE800003C 19
18
17
16
15
14
13
12
11
10
09
08
07
06
05
04
03
02
01
00

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:

Pin ISA GPIO Pin ISA GPIO
A1 IOCHK# A[0] B1 GND GND
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
A10 IORDY A[9] B10 GND GND
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:

Pin ISA GPIO Pin ISA GPIO
C0 GND GND D0 GND GND
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
C19 GND GND D19 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.

9 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.

9.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 (support@embeddedarm.com).

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.

9.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.

9.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.

9.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.

9.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.

9.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.

9.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.

For instructions on starting software automatically, see the Starting Automatically section.

9.2.6 Userspace Interrupts

Userspace interrupts are not currently implemented on the TS-7800-V2. This is significantly different from the TS-7800. Please contact Technologic Systems (support@embeddedarm.com) if this functionality is needed in your application.

9.2.7 Production Mechanism

TBD.

This section will house the instructions necessary to show the downstream developer how to create a USB-bootable media that will replace the functionality previously owned on the TS-7800 by the tsinit script. This mechanism is somewhat more secure in that it will require the U-BOOT jumper to be populated (or a button installed and pressed during power-up somewhere on the downstream's enclosure).

9.3 Hardware Differences

9.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.

9.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.

9.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).

9.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.

9.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.

9.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.

9.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:

TSUART 16550 UART
/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

9.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

9.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.

10 Specifications

10.1 Power Specifications

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

Input Min voltage Max voltage
5V input 4.5 5.25
TS-781 TBD TBD

10.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. See the Speed Scale section for how to modify the CPU clock rate.

TS-7800-V2-DMW9I
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
TS-7800-V2-DMN1I
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

10.3 Temperature Specification

All TS-7800-V2 are rated for -40 to +85 degrees C ambient with the CPU set to run at 666 MHz (with provided heatsink). Temperature tolerance is lower when operating at the full 1.334 MHz speed. See the graphic below for more detail. See the Speed Scale section for how to modify the CPU clock rate.

TS-7800-V2 HotTempTestGraph.jpg

10.4 I/O Specifications

10.5 Rail Specifications


11 Revisions and Changes

11.1 Errata

There are currently no errata related to this product.

11.2 PCB Revisions

PCB Revision Description of changes
Rev A. Initial Release

11.3 U-Boot Revisions

Version Description of changes
U-Boot SPL 2017.09-g2113ce6a21 (Mar 06 2018 - 16:20:06)
  • Engineering Sample Program release.
U-Boot 2017.09-g970b04e89c (Apr 30 2018 - 08:19:08 -0700)
  • Added support for new SPI flash vendor, fixes network boot issue for production
u-boot-ts7800v2-emmc-May-03-2018.kwb
  • Fixed USB to only reset the USB 5V once on a reboot.

11.4 FPGA Revisions

Version Description of changes
0x22: Revision 34. Engineering Sampling release version.
0x27: Revision 39. Engineering Sampling Update. Added CAN and PWM.

11.5 Microcontroller Revisions

Version Description of changes
7 Release to Engineering Sampling.

11.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.
07 Mar 2018: Engineering Sample Release Linux ts7800-v2 4.4.8-armada-17.02.2-g5e5adf1 #0 SMP PREEMPT Wed Mar 7 10:46:07 MST 2018 armv7l GNU/Linux

11.7 Software Image Revisions

Version Description of changes
7 Feb 2018: Engineering Sampling Release Candidate New Product Introduction Candidate using a default "debootstrap" Debian. Added packages build-essential, watchdog, hexedit, vim, ftp, and joe.
27 Feb 2018: Engineering Sampling Release Candidate 2. Added new ts7800ctl binary to enable on-board temp sensor. Updated /sbin/tshwinit. Installed Picocom. Updated Aptitude databases. Ran distribution-upgrade.
07 Mar 2018: Engineering Sampling Release. Installed Git, added load_fpga_flash command to /sbin/.
23 Apr 2018: Engineering Sampling Update 1 New version of ts7800ctl adding access to the optional accelerometer. Installed wireless_tools, can-utils, and lrzsz packages. Updated kernel with wifi driver firmware. Updated /etc/hosts. Updated /etc/fstab. Updated /sbin/tshwinit. Updated /sbin/dhclient-script.
TBD: Engineering Sampling Update 2 Missing SD media non-SD boot will no longer cause boot delays. Added packages gdb, curl, Ruby, screen, and command-not-found. Removed package linux-image-4.9.0-6-armmp. Installed all Debian updates and updated apt repositories. Fixed permission errors in /var/cache/man/*.

11.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.