Difference between revisions of "Add support for serial-only targets to Fuego"

From eLinux.org
Jump to: navigation, search
(serio tool: change github link from devttys0/ to frowand/ for version with more fixes)
(add serio to "related stuff" section)
Line 44: Line 44:
 
* see the lrzsz package for Debian and Ubuntu
 
* see the lrzsz package for Debian and Ubuntu
 
** See the [https://ohse.de/uwe/software/lrzsz.html lrzsz] home page  
 
** See the [https://ohse.de/uwe/software/lrzsz.html lrzsz] home page  
 +
* the serio program (see below)
 
* See the [[Fuego]] page on this wiki
 
* See the [[Fuego]] page on this wiki
  

Revision as of 11:01, 27 April 2016

Summary
Add support for serial-only targets to Fuego
Proposer
Tim Bird

Description

Currently, the Fuego test system supports targets that have an ssh daemon running on the target. ssh is used for command execution and file transfer operations.

This project will consist of adding support to the Fuego test system for command execution, file transfer operations, and log retrieval for targets that only support a serial console.

It is envisioned that something like zmodem will be used on both host and target side to transfer files over the serial connection, and that command execution will be accomplished by just echoing the command to the shell on the serial console.

Fuego already includes stubs for where to place the commands to perform execution and file transfer. Please, in see the file, the functions:

  • fuego-core/engine/overlays/base/base-board.fuegoclass,
    • ov_transport_get()
    • ov_transport_put()
    • ov_transport_cmd()

All of these functions take multiple arguments. In the case of get(), the first argument is the source, and subsequent arguments are the destinations.

Note: This makes no sense - it should be all but last argument are sources, and last argument is the destination

The first argument may contain a wildcard.

In the case of put(), all but the last argument are the sources, and the last argument is the destination.

In the case of cmd(), all arguments are passed as a single string to the target to execute.


Details

  • add the lrzsz package to DockerFile container build script
  • add lrzsz package as a test to Fuego
    • This should allow it to be built for an arbitrary target, using the target SDK installed for Fuego
  • add appropriate commands in base-boards.class
  • make a test to verify that it is working
  • run Fuego test suite on a beaglebone, using the serial transport option

Related work

  • see the lrzsz package for Debian and Ubuntu
  • the serio program (see below)
  • See the Fuego page on this wiki

Scope

I would expect this to take about 2 weeks, including test time.

Contractor Candidates

  • Cogent Embedded
  • others?

Comments

serio tool

  You can find this tool on github at: https://github.com/frowand/serio
  
This version has the patches from Andrew Jone's blog entry (see below), plus some additional fixes.

Frank Rowand wrote: (from http://andylinuxblog.blogspot.tw/2014/11/serio-serial-file-transfer-program.html)

Serio: A serial file transfer program without needing z/y/xmodem

In one of my previous posts I talked about using zmodem as a backup/emergency method to transfer files onto an embedded device using the serial console. This technique requires you to have the lrz binary on the target to initiate the transfer. But what happens if you have no way of getting lrz onto the target in the first place? In this post I show you a method of serial transfer requiring no binaries to be on the target, and absolutely no setup on the target-side.

First, check that you have a Python 2.x version installed. If you don't, apt-get or yum install it onto your host OS. Check the version with python --version.

Now get the utility, which is called 'serio'. Get it with

  hg clone https://code.google.com/p/serio/

Before you go ahead, there are two patches you need to apply (by hand):

Patch 1:

Insert self.last_size = 0 at the location shown, highlighted in green:

  if callable(fp.read) and callable(fp.write) and callable(fp.readline) and callable (fp.readlines):
                       self.fp = fp
                       self.current = 0
                       self.showprogress = progress
                       self.last_size = 0

Patch 2:

Get rid of this line, on line 19:

  self.s.open()

and insert these lines instead:

  already_open = self.s.isOpen()
  if not already_open:
          self.s.open()

Update (14 June 2015): I tried this again recently. It seems you may need to use self.serial.isOpen() and self.serial.open() instead.

That patch above is for people who get the "Port is already open" error. Now you can run the utility:


sudo ./serio -s lrz -d lrz -p /dev/ttyS0

where -s is the source file, -d is the destination, and -p is the serial (console) port. You'll get a nice progress bar.

I recommend putting lrz onto your target (as per my example) so you can do zmodem transfers from here on in.

Help! It transfers, but the executable doesn't work!

  • Check that the echo command on your target supports the "-n" and "-e" options (that's all you need).
  • Try cross-compiling a minimal "hello world" program with your toolchain and try transferring that, as a test. Run it, and if you see "hello world" your settings are probably OK. See the next point...
  • Open the source code and modify the parameter IO_TIME = .1 to be something greater than .1 (try .3 or .5).
  • In addition to the previous step, try using your toolchain's strip command to reduce the size of the binary.

(end of Andy's blog entry)