TS-7840
WARNING: | This is PRELIMINARY INFORMATION ONLY. It is certain to change while undergoing editing. |
Product Page | |
Product Images | |
Specifications | |
Documentation | |
---|---|
Schematic | |
Mechanical Drawing | |
FTP Path | |
Processor | |
Marvell MV88F6820 | |
Armada 385 ARM Cortex-A9 1.3-1.8 GHz Dual Core CPU |
Overview
The TS-7840 is a Single Board Computer (SBC) based on a Marvell MV88F6820 1.3GHz Cortex-A9 Dual Core CPU. This board provides 3 independent gigabit Ethernet controllers, including one gigabit port that goes to an onboard switch providing 5 additional PoE capable RJ45 Ethernets that can be use for filtering or switching.
Getting Started
A Linux PC is recommended for development. For developers who use Windows, virtualized Linux using VMWare or similar are recommended in order to make the full power of Linux available. The developer will need to be comfortable with Linux anyway in order to work with embedded Linux on the target platform. The main reasons that Linux is useful are:
- Linux filesystems on the microSD card can be accessed on the PC.
- More ARM cross-compilers are available.
- If recovery is needed, a bootable medium can be written.
- A network filesystem can be served.
- Builds such as Linux kernel, buildroot, yocto, distro-seed will not work from WSL1/2 on a case insensitive filesystem.
WARNING: | Be sure to take appropriate Electrostatic Discharge (ESD) precautions. Disconnect the power source before moving, cabling, or performing any set up procedures. Inappropriate handling may cause damage to the board. |
Connect USB Console
The board includes a USB Type B header connected to the onboard preprogrammed microcontroller. This acts as a USB serial device using the CP210x Virtual COM port. Most operating systems have built-in support for this device, however drivers are available here.
Console from Linux
There are many serial terminal applications for Linux, three common used applications are picocom
, screen
, and minicom
. These examples demonstrate all three applications and assume that the serial device is "/dev/ttyUSB0" which is common for USB adapters. Be sure to replace the serial device string with that of the device on your workstation.
picocom
is a very small and simple client.
sudo picocom -b 115200 /dev/ttyUSB0
screen
is a terminal multiplexer which happens to have serial support.
sudo screen /dev/ttyUSB0 115200
Or a very commonly used client is minicom
which is quite powerful but requires some setup:
sudo minicom -s
- Navigate to 'serial port setup'
- Type "a" and change location of serial device to "/dev/ttyUSB0" then hit "enter"
- If needed, modify the settings to match this and hit "esc" when done:
E - Bps/Par/Bits : 115200 8N1 F - Hardware Flow Control : No G - Software Flow Control : No
- Navigate to 'Save setup as dfl', hit "enter", and then "esc"
Console from Windows
Putty is a small simple client available for download here. Open up Device Manager to determine your console port. See the putty configuration image for more details.
Powering up
The TS-7840 receives power through the 4 pin terminal block (CN4). If a power supply is ordered with the TS-7840 it will include the correct terminal block connected to the power supply. Otherwise the terminal block will ship with the unit.
Pin | Description |
---|---|
1 | 10-48VDC |
2 | GND |
3 | POE 48VDC |
4 | POE GND |
Once power is applied the device will output information via the built in USB console.
The first output is from U-Boot:
U-Boot SPL 2017.09-g2bce19ae53 (Aug 26 2019 - 17:13:17) Detected Device ID 6820 (SAR1 0xCB00230F) mv_ddr: mv_ddr-armada-17.10.3 DDR3 Training Sequence - Switching XBAR Window to FastPath Window DDR Training Sequence - Start scrubbing DDR3 Training Sequence - End scrubbing mv_ddr: completed successfully Trying to boot from MMC1 force part -> 1 U-Boot 2017.09-g2bce19ae53 (Aug 26 2019 - 17:13:17 -0700) SoC: MV88F6820-A0 at 1332 MHz I2C: ready DRAM: 2 GiB (666 MHz, ECC enabled) MMC: mv_sdh: 0 Model: Technologic Systems TS-7840 FPGA Base 0xE8000000 SCSI: MVEBU SATA INIT SATA link 0 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: eth2: ethernet@30000, eth3: ethernet@34000, eth1: ethernet@70000 Press ESC twice to abort autoboot in 3 second(s)
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. |
This u-boot and its environment is loaded from the emmc boot partition 0 (/dev/mmcblk0boot0). This a hardware partition that is independent of the main flash on the emmc (/dev/mmcblk0). From here, u-boot will follow u-boots standard Distro boot command. This will check for boot files on the first USB mass storage, then the m.2 SATA, and will by default find a bootable image on eMMC. From here the board will boot to our default #Debian image.
First Linux Boot
When booting with the default settings, a shipped board will boot to the eMMC. The eMMC by default are pre-programmed with our default Debian 10 Buster image. After Linux boots it will ask the user to log in with a username and password. This uses "root" as the username with no password. This can be changed after logging in with the command "passwd" to set an account password.
From the Linux prompt you can now begin testing out hardware, or beginning your application development.
U-Boot
U-boot is a bootloader and comes preinstalled on this board. This is loaded in the eMMC hardware boot partitions in /dev/mmcblk0boot0. U-boot sets up the hardware, initializes ECC by scrubbing RAM, and then loads the OS from the available storage devices. Most users will not need to customize u-boot further, and can proceed to the #Debian sections for information on application development.
U-boot Distro Boot
U-boot by default uses u-boots distro bootcmd to determine how to boot. As shipped the board will boot to the preprogrammed eMMC with our #Debian image.
By default this will look at:
Order | U-boot device name | Description |
---|---|---|
1 | usb0 | First detected USB mass storage device |
2 | scsi0 | M.2 SATA port |
3 | mmc0 | Onboard eMMC storage |
4 | dhcp | DHCP Option [1] |
5 | pxe | PXE File [2] |
<Resources />
The default boot order can be left for most users, but boot can be optimized for one boot device by stopping at u-boot and running:
# Boot straight to mmc:
env set boot_targets 'mmc0';
env save
# Boot to usb, then mmc only
env set boot_targets 'usb0 mmc0';
env save
# Set back to default boot order
env set boot_targets 'usb0 scsi0 mmc0 dhcp pxe'
env save
U-boot will search the boot media on either the 1st partition, or if the disk is partitioned with GPT instead of MBR it will search the "bootable" partition. It will then search for these files:
Order | Search for | Paths | Description |
---|---|---|---|
1 | extlinux | /extlinux/extlinux.conf, /boot/extlinux/extlinux.conf | Menu conf file of kernels |
2 | U-boot script | /boot.scr.uimg, /boot.scr, /boot/boot.scr.uimg, /boot/boot.scr | u-boot script with instructions to load the OS |
3 | EFI Binary | efi/boot/bootarm.efi | EFI binary (such as grub) |
Our Debian images use a u-boot script in /boot/boot.scr.uimg.
U-Boot Environment
The U-Boot environment on the TS-7840 is stored in the on-board eMMC flash in the /dev/mmcblk0boot0 partition.
# 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
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 is used to copy a file from most devices
# Load kernel from SD
load mmc 1:2 ${loadaddr} /boot/zImage
# Load Kernel from eMMC
load mmc 0:2 ${loadaddr} /boot/zImage
# You can view the fdt from u-boot with fdt
load 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
load mmc 0:2 ${loadaddr} /boot/custombinary
go ${loadaddr}
# Browse fat,ext2,ext3,or ext4 filesystems:
ls 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
# 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
load mmc 0:1 ${loadaddr} /boot/ubootscript.uimg
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/zImage;
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
Backup / Restore
TODO
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:
Getting Started with Debian
Once installed, the default user is "root" with no password.
Note: | This is a shared image that supports the TS-7820, TS-7825 and TS-7840 |
This image can be written to a USB drive, or to the eMMC. For development, a USB thumbdrive will be simplest. If a bootable USB drive is connected this will take priority over other boot media. Plug in a USB drive and check the last output from "dmesg" to get the USB disk. For example, this may be /dev/sdc.
# Erase all older partitions
sudo sgdisk --zap-all /dev/sdc
# Create one GPT Linux partition
sudo sgdisk -n 0:0:0 -t 0:8300 /dev/sdc
# Create a filesystem and mount
sudo mkfs.ext4 /dev/sdc1
sudo mkdir /mnt/usb/
sudo mount /dev/sdc1 /mnt/usb/
# Extract downloaded image:
sudo tar --numeric-owner -xf ts7840-debian-buster-latest.tar.xz -C /mnt/usb/
sudo chmod 755 /mnt/usb/
sudo umount /mnt/usb/
These commands will also work while booted from a USB drive to rewrite the eMMC. Instead of /dev/sdc you would use /dev/mmcblk0, and instead of /dev/sdc1 you would use /dev/mmcblk0p1.
Debian Installing New Software
Debian provides the apt-get system which allows management of pre-built applications. The apt tools require a network connection to the internet in order to automatically download and install new software. The update command will download a list of the current versions of pre-built packages.
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@tsa38x:~# apt-cache search openjdk default-jdk - Standard Java or Java compatible Development Kit default-jdk-doc - Standard Java or Java compatible Development Kit (documentation) default-jdk-headless - Standard Java or Java compatible Development Kit (headless) 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) openjdk-11-dbg - Java runtime based on OpenJDK (debugging symbols) openjdk-11-demo - Java runtime based on OpenJDK (demos and examples) openjdk-11-doc - OpenJDK Development Kit (JDK) documentation openjdk-11-jdk - OpenJDK Development Kit (JDK) openjdk-11-jdk-headless - OpenJDK Development Kit (JDK) (headless) openjdk-11-jre - OpenJDK Java runtime, using Hotspot JIT openjdk-11-jre-headless - OpenJDK Java runtime, using Hotspot JIT (headless) openjdk-11-jre-zero - Alternative JVM for OpenJDK, using Zero openjdk-11-source - OpenJDK Development Kit (JDK) source files uwsgi-app-integration-plugins - plugins for integration of uWSGI and application uwsgi-plugin-jvm-openjdk-11 - Java plugin for uWSGI (OpenJDK 11) uwsgi-plugin-jwsgi-openjdk-11 - JWSGI plugin for uWSGI (OpenJDK 11) uwsgi-plugin-ring-openjdk-11 - Closure/Ring plugin for uWSGI (OpenJDK 11) uwsgi-plugin-servlet-openjdk-11 - JWSGI plugin for uWSGI (OpenJDK 11) java-package - Utility for creating Java Debian packages
In this case, the wanted package will likely be the "openjdk-11-jre" package. Names of packages can be found on Debian's wiki pages or the packages site.
With the package name apt-get install can be used to install the prebuilt packages.
apt-get install openjdk-11-jre
# More than one package can be installed at a time.
apt-get install openjdk-11-jre nano vim mplayer
For more information on using apt-get refer to Debian's documentation here.
Debian Setting Up SSH
Openssh is installed in our default Debian image, but by default openssh does not permit root logins, and requires a password to be set. Additionally, a host key is required if one hasn't already been created on the target board. To allow remote root login:
sed --in-place 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart ssh.service
/bin/ls /etc/ssh/ssh_host*key >/dev/null 2>&1 || ssh-keygen -A
passwd root # Set any password
If you ssh to this system it will now support ssh as root.
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. |
Debian Application Development
Debian Stretch Cross Compiling
Debian only provides their cross compiler for their distribution. Our examples will set up a chroot for Debian to use for development. If using Debian 10 Buster directly, or through a VM, the schroot commands and debootstrap can be skipped.
First install the host system dependencies to use schroot and debootstrap:
# Ubuntu/Debian
sudo apt-get install debootstrap schroot
# Fedora
sudo dnf install debootstrap schroot
# Centos/redhat
sudo yum install debootstrap schroot
Use debootstrap to install a base Debian 10 for your host.
# Generate Debian Buster rootfs
sudo debootstrap buster /opt/chroots/buster-armdev/ http://deb.debian.org/debian
Then configure schroot to enter this rootfs. Replace "youruser" with your linux username.
sudo tee /etc/schroot/chroot.d/buster-armdev <<'EOF' >/dev/null
[buster-armdev]
description=Debian Buster for ARM development
directory=/opt/chroots/buster-armdev/
root-users=youruser
users=youruser
type=directory
EOF
Log into this schroot and install the armhf development tools (Skip if running a native Debian Buster host):
schroot -c buster-armdev
This will change your PS1 variable to indicate that you are in the Debian root. For example:
mark@mark-desktop:~$ sudo schroot -c buster-armdev (buster-armdev)root@mark-desktop:/home/mark#
Install Debian's development tools for armhf:
# This workaround is required for Debian Buster
rm /var/lib/dpkg/statoverride
dpkg --add-architecture armhf
apt-get update
apt-get install -y build-essential gcc-arm-linux-gnueabihf bc \
lzop u-boot-tools libncursesw5-dev file wget
exit
At this point the Debian chroot is ready to compile armhf binaries. For example, create a hello world in your home folder at ~/Documents/hello.c
#include <stdio.h>
int main(){
printf("Hello World\n");
}
To compile this, you can enter the schroot as a normal user:
schroot -c buster-armdev
Keep in mind that when this is run as a normal user it does not modify your prompt. This will look like any other prompt, but will use your Debian applications instead. You can verify this is Debian with:
mark@mark-desktop:~/Documents$ cat /etc/issue Debian GNU/Linux 10 \n \l
While logged into this schroot, run:
arm-linux-gnueabihf-gcc hello.c -o hello
exit
From here you can check "file hello" to verify the binary type:
mark@mark-desktop:~/Documents$ file hello hello: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=8a8cee3341d3ef76ef6796f72d5722ae9d77c8ea, not stripped
This can also be used to develop against dynamic libraries from Debian. The armhf packages can be installed in the chroot. For example, to link against curl:
# Run as root to install dependencies
sudo schroot -c buster-armdev
apt-get install libcurl4-openssl-dev:armhf
exit
# Return to arm chroot as a normal user:
schroot -c buster-armdev
# Download curl's simple.c example
wget https://raw.githubusercontent.com/bagder/curl/master/docs/examples/simple.c
arm-linux-gnueabihf-gcc simple.c -o simple -lcurl
The "simple" binary is now built for armhf and links dynamically to curl.
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 current working directory:
tar -xjf armv7-marvell-linux-gnueabi-hard_i686_64K_Dev_20131002.tar.bz2
#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. If you followed the steps above exactly, the toolchain is extracted into the same directory as the kernel.
export CROSS_COMPILE=../armv7-marvell-linux-gnueabi-hard_i686_64K_Dev_20131002/bin/arm-marvell-linux-gnueabi-
export ARCH=arm
Now you will want to configure your settings. You can start with our default config by running:
make ts7800_v2_defconfig
At this point you can configure any additional options with:
make menuconfig
After you saved the configuration, you can build your kernel and modules with:
make && make modules
Features
GPIO
The Armada 385 and FPGA GPIO are exposed using a kernel character device. This interface provides a set of files and directories for interacting with GPIO which can be used from any language that interact with special files in linux using ioctl() or similar. For our platforms, we pre-install the "libgpiod" library and binaries. Documentation on these tools can be found here. This section only covers using these userspace tools and does not provide guidance on using the libgpiod library in end applications. Please see the libgpiod documentation for this purpose.
A user with suitable permissions to read and write /dev/gpiochip* files can immediately interact with GPIO pins. For example, to read the push switch on the TS-8551-4100 which is connected to FPGA DIO_9:
gpioget 5 46
Multiple pins in the same chip can be read simultaneously by passing multiple pin numbers separated by spaces.
To write to a pin, the 'gpioset' command is used. For example, to set LCD_D02:
gpioset 2 7=0
Multiple pins in the same chip can be set simultaneously by passing multiple pin=value pairs separated by spaces.
If a call with 'gpioset' or 'gpioget' fails with "Device or resource busy," that means that specific GPIO is claimed by another device. The command 'cat /sys/kernel/debug/gpio' can be used to get a list of all of the system GPIO and what has claimed them.
The 'gpiomon' tool can be used to monitor pins for changes.
FPGA GPIO
Chip | Pin | Net | Description |
---|---|---|---|
2 | 0 | uart0_irq | FPGA internal |
2 | 1 | uart1_irq | FPGA internal |
2 | 2 | uart2_irq | FPGA internal |
2 | 3 | uart3_irq | FPGA internal |
2 | 4 | uart4_irq | FPGA internal |
2 | 5 | uart5_irq | FPGA internal |
2 | 6 | uart6_irq | FPGA internal |
2 | 7 | uart7_irq | FPGA internal |
2 | 8 | uart8_irq | FPGA internal |
2 | 9 | gps_pps | PPS signal from onboard GPS |
2 | 10 | can_irq | FPGA internal |
2 | 11 | NC | NC |
2 | 12 | NC | NC |
2 | 13 | NC | NC |
2 | 14 | NC | NC |
2 | 15 | NC | NC |
2 | 16 | NC | NC |
2 | 17 | NC | NC |
2 | 18 | NC | NC |
2 | 19 | NC | NC |
2 | 20 | NC | NC |
2 | 21 | NC | NC |
2 | 22 | ird_network_rdy_pad | CN8 pin 19 |
2 | 23 | ird_modem_on_pad | CN8 pin 5 |
2 | 24 | oled_i2c_dat_pad | CN13 pin 1 |
2 | 25 | oled_i2c_clk_pad | CN13 pin 2 |
2 | 26 | grn_led_padn | LED1 |
2 | 27 | red_led_padn | LED1 |
2 | 28 | blu_led_pad | LED2 |
2 | 29 | prog_silab_clk_padn | Onboard Silabs |
2 | 30 | prog_silab_data_pad | Onboard Silabs |
2 | 31 | cpu_push_sw_padn | SW1 |
3 | 0 | en_ls_out_1_pad | CN17 top pin 7 |
3 | 1 | en_ls_out_2_pad | CN17 top pin 8 |
3 | 2 | en_ls_out_3_pad | CN17 bottom bin 15 |
3 | 3 | en_hs_sw_pad | CN17 bottom pin 16 |
3 | 4 | mikro_pwm_pad | CN12 pin 16 |
3 | 5 | NC | NC |
3 | 6 | en_poe_padn | Onboard POE |
3 | 7 | i2c_poe_clk_pad | Onboard POE |
3 | 8 | i2c_poe_dat_in_pad | Onboard POE |
3 | 9 | i2c_poe_dat_out_pad | Onboard POE |
3 | 10 | cage1_sda_pad | Onboard SFP K3 |
3 | 11 | cage1_scl_pad | Onboard SFP K3 |
3 | 12 | cage1_present_padn | Onboard SFP K3 |
3 | 13 | cage2_present_padn | Onboard SFP K2 |
3 | 14 | cage2_sda_pad | Onboard SFP K2 |
3 | 15 | cage2_scl_pad | Onboard SFP K2 |
3 | 16 | en_nimbel_4v_pad | Onboard |
3 | 17 | en_nimbel_3v3_pad | Enable 3.3V to nimbelink header |
3 | 18 | en_emmc_3v3_pad | Enable onboard eMMC power |
3 | 19 | en_modem_5v_pad | Enables power to ADSL modem, Internal USB, and Iridium Modem |
3 | 20 | en_usb_5v_pad | Enable USB 5V to USB headers |
3 | 21 | en_nim_usb_padn | Enables USB to the Nimbelink socket |
3 | 22 | mini_pcie_reset_padn | J4 pin 22 |
3 | 23 | ssd_present_padn | K6 pin 1 |
3 | 24 | en_xbee_usb_padn | Enable USB port on XBEE socket |
3 | 25 | mikro_int_pad | CN12 pin 15 |
3 | 26 | mikro_reset_pad | CN12 pin 2 |
3 | 27 | mikro_an_3v_pad | CN12 pin 1 |
3 | 28 | aux_i2c_dat_pad | Mikrobus I2C |
3 | 29 | aux_i2c_clk_pad | Mikrobus I2C |
3 | 30 | phy_0_led_pad | T2 bottom left LED |
3 | 31 | phy_1_led_pad | T2 top left LED |
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.
SATA
The TS-7800-V2 provides up to two SATA 3.0 ports at data rates of up to 6 Gbits/sec.
SATA drives will appear (in Linux) as /dev/sda and (with the optional second SATA port) /dev/sdb. In U-Boot, after executing the "scsi init" command, they will appear as SCSI drives "scsi 1:0" and (with the optional second SATA port) "scsi 0:0".
If the drive is formatted, with the required files in the "/boot" subdirectory, the board may be booted from the drive by substituting (for example) "scsi 0:1" for "mmc 0:2" in the ext4load command (see the #U-Boot Commands section for more details on booting). It will also be necessary to modify the bootargs from (for example) "root=/dev/mmcblk0p2" to "root=/dev/sda1".
DDR3 RAM
The TS-7800-V2 comes with 1 GB of DDR3 as standard, with 2 GB as an option.
SiLabs Functionality
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
FPGA Functionality
The TS-7840 includes an Intel Cyclone IV FPGA. This is connected to the CPU over a x1 PCIe 2.0 lane, and provides additional perihperals and IO expansion to the system.
The onboard FPGA also permits customization such as adding quadrature encoders, PWM, additional serial ports, DMX, or other unique communication protocols. Please contact Technologic Systems if you require custom FPGA logic.
The FPGA registers are in PCIe BAR0 of 1e6d:7840, and use legacy level based interrupts for the shared peripherals.
All FPGA peripherals have drivers in our default BSP, but the FPGA registers can be manually accessed with fpga_peekpoke:
# 0x0 maps to the FPGA syscon, and register 0 of the syscon returns a static value.
fpga_peekpoke 32 0x0
Prints out 0xDEADBEEF.
Offset | Description |
---|---|
0x0 | FPGA Syscon |
0x40 | FPGA DIO Bank 2 |
0x5c | FPGA DIO Bank 1 |
0x80 | 16550 #0 (COM1 RS-232) |
0x88 | 16550 #1 (COM2 RS-232) |
0x90 | 16550 #2 (GPS) |
0x98 | 16550 #3 (Nimbelink) |
0xa0 | 16550 #4 (Iridium Modem) |
0xa8 | 16550 #5 (DSL Modem Debug) |
0xb0 | 16550 #6 (Mikrobus UART) |
0xb8 | 16550 #7 (RS-485) |
0xc0 | 16550 #8 (XBEE) |
0x200 | SJA1000 compatible CAN controller |
0x400 | SPI controller |
FPGA Syscon
Offset | Bits | Access | Description |
---|---|---|---|
0x0 | 31:0 | Read Only | Static value of 0xdeadbeef |
0x4 | 31:0 | Read Only | CRC32 of running FPGA |
0x8 | 31:0 | RW | ASMI |
0xc | 31:0 | RW | Scratch register |
0x10 | 31:5 | N/A | Reserved |
4 | Read Only | strap_5_pad | |
3 | Read Only | strap_4_pad | |
2 | Read Only | strap_3_pad | |
1 | Read Only | strap_2_pad | |
0 | Read Only | strap_1_pad | |
0x14 | 31:0 | N/A | Reserved |
0x18 | 31 | Read/Write | Set 1 to reload FPGA from 0xf0000 in SPI flash |
30:0 | N/A | Reserved | |
0x1c | 31:0 | Read Only | Reserved |
0x20 | 31:0 | Read Only | High Accuracy ms timer [3] |
0x24 | 31:0 | Read Only | FPGA RNG |
0x28 | 31:0 | N/A | Reserved |
0x2c | 31:0 | N/A | Reserved |
0x30 | 31:0 | N/A | Reserved |
0x34 | 31:0 | Read/Write | GPS Count |
0x38 | 31:0 | Read Only | Epoch Time |
0x3c | 31:0 | Read Only | Epoch Time Fraction |
FPGA DIO
This FPGA includes two banks of GPIO with atomic set/clr for data and output enable, as well as level based IRQs. Under Linux this is exposed as /dev/gpiochip2 and /dev/gpiochip3. These character devices are normally accessed with libgpiod. The utilities from libgpiod are included in our shipping image and allow accessing GPIO from the shell prompt.
See gpioinfo for a list of all usable GPIO:
gpioinfo /dev/gpiochip2 /dev/gpiochip3
Returns:
gpiochip2 - 32 lines: line 0: "uart0_irq" unused input active-high line 1: "uart1_irq" unused input active-high line 2: "uart2_irq" unused input active-high line 3: "uart3_irq" unused input active-high line 4: "uart4_irq" unused input active-high line 5: "uart5_irq" unused input active-high line 6: "uart6_irq" unused input active-high line 7: "uart7_irq" unused input active-high line 8: "uart8_irq" unused input active-high line 9: "gps_pps" unused input active-high line 10: "can_irq" unused input active-high line 11: "reserved" "interrupt" input active-high [used] line 12: "reserved" unused input active-high line 13: "reserved" unused input active-high line 14: "reserved" unused input active-high line 15: "reserved" unused input active-high line 16: "reserved" unused input active-high line 17: "reserved" "blue-led" output active-high [used] line 18: "reserved" unused input active-high line 19: "reserved" unused input active-high line 20: "reserved" unused input active-high line 21: "reserved" "sda" input active-high [used] line 22: "ird_network_rdy_pad" "scl" input active-high [used] line 23: "ird_modem_on_pad" unused input active-high line 24: "oled_i2c_dat_pad" unused input active-high line 25: "oled_i2c_clk_pad" unused input active-high line 26: "grn_led_padn" "green-led" output active-low [used] line 27: "red_led_padn" "red-led" output active-low [used] line 28: "blu_led_pad" unused output active-high line 29: "prog_silab_clk_padn" unused input active-high line 30: "prog_silab_data_pad" unused input active-high line 31: "cpu_push_sw_padn" unused input active-high gpiochip3 - 32 lines: line 0: "en_ls_out_1_pad" unused input active-high line 1: "en_ls_out_2_pad" unused input active-high line 2: "en_ls_out_3_pad" unused input active-high line 3: "en_hs_sw_pad" unused input active-high line 4: "mikro_pwm_pad" unused input active-high line 5: "reserved" unused input active-high line 6: "en_poe_padn" unused input active-high line 7: "i2c_poe_clk_pad" unused input active-high line 8: "i2c_poe_dat_in_pad" unused input active-high line 9: "i2c_poe_dat_out_pad" unused input active-high line 10: "cage1_sda_pad" unused input active-high line 11: "cage1_scl_pad" unused input active-high line 12: "cage1_present_padn" unused input active-high line 13: "cage2_present_padn" unused input active-high line 14: "cage2_sda_pad" unused input active-high line 15: "cage2_scl_pad" unused input active-high line 16: "en_nimbel_4v_pad" unused input active-high line 17: "en_nimbel_3v3_pad" unused input active-high line 18: "en_emmc_3v3_pad" unused input active-high line 19: "en_modem_5v_pad" unused input active-high line 20: "en_usb_5v_pad" unused output active-high line 21: "en_nim_usb_padn" unused input active-high line 22: "mini_pcie_reset_padn" unused output active-high line 23: "ssd_present_padn" unused input active-high line 24: "en_xbee_usb_padn" unused input active-high line 25: "mikro_int_pad" unused input active-high line 26: "mikro_reset_padn" unused input active-high line 27: "mikro_an_3v_pad" unused input active-high line 28: "aux_i2c_dat_pad" "sda" input active-high [used] line 29: "aux_i2c_clk_pad" "scl" input active-high [used] line 30: "phy_0_led_pad" "phy-0-led" output active-low [used] line 31: "phy_1_led_pad" "phy-1-led" output active-low [used]
From here, commands such as gpioget and gpioset can be used:
gpioget /dev/gpiochip2 31 # Get cpu_push_sw_padn
# Returns 1 when not pressed, 0 when pressed
gpioset /dev/gpiochip3 21=0 # Set en_usb_5v_pad to 0, turning off USB 5V
gpioset /dev/gpiochip3 21=1 # Re-enable USB
These driver interfaces should be used in most cases, but the register documentation is provided for driver writers or for those with reasons to go directly to the hardware:
|
|