TS-7840: Difference between revisions

From embeddedTS Manuals
No edit summary
Line 91: Line 91:


== U-boot Distro Boot ==
== U-boot Distro Boot ==
The TS-7840 uses u-boots [ distro bootcmd].
U-boot by default uses u-boots [https://github.com/embeddedarm/u-boot-armada38x/blob/u-boot-2017.09/doc/README.distro 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:
{| class=wikitable
! 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 <ref>DHCP can advertise a TFTP server (next-path, root-path, and filename) to point to a u-boot script.
|-
| 5
| pxe
| PXE File <ref>DHCP can advertise a TFTP server (next-path, root-path, and filename) with a PXE file to control boot.
|}
<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:
<source lang=bash>
# 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
</source>
 
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:
{| class=wikitable
! 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
|}
 
Our Debian images use a u-boot script in /boot/boot.scr.uimg.


== U-Boot Environment ==
== U-Boot Environment ==

Revision as of 16:18, 16 September 2019

WARNING: This is PRELIMINARY INFORMATION ONLY. It is certain to change while undergoing editing.
TS-7840
ts-7840.gif
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.

Device Manager Putty Configuration

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.

U-Boot

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 Cite error: Closing </ref> missing for <ref> tag
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:

GPIO Read Decodes
Offset Description
0x00 Output Enable [1]
0x04 Output Data
0x0C Data In
0x10 IRQ Enable [2]
0x14 IRQ Status [3]
0x18 IRQ nPOL [4]
GPIO Write Decodes
Offset Description
0x00 Output Enable Set
0x04 Output Enable Clear
0x08 Output Data Set
0x0c Output Data Clear
0x10 IRQ Enable
0x18 IRQ nPOL


  1. Output when 1, input when 0
  2. IRQ Enabled when 1, input when 0
  3. IRQ triggered when 1. The PCIe interrupt is only triggered if IRQ Enable is set, but this status will reflect changes whether or not the enable is on.
  4. IRQ active high when 0, active low when 1