[tbot] Problem with context exit (and serial transmission)

Lukasz Majewski lukma at denx.de
Sat Feb 2 22:57:44 UTC 2019

Dear tbot users,

I'm trying to build a more sophisticated tbot scenario:

1. I allow board to boot till linux prompt and change the u-boot env
variable with fw_setenv foo "AAA" (this is one test - separate one ->

2. Then I start another test, which in u-boot updates fitImage

Please find following snippet:

def kernel_active_update(
    lab: typing.Optional[linux.LabHost] = None,
) -> None:
# --------- Problem / why do I need this code ?
     with lab or tbot.acquire_lab() as lh:
         lh.exec0("pkill", "-9", "picocom")
# ---------
     uboot_kernel_write(reset=True, serverip="")

The linux_falcon_boot() and uboot_kernel_write() works without problems
when executed as standalone tests (and I only expect them to be run one
by one).

The question is - why do I need to kill manually the picocom process
and put some sleep between invocation of those two tests?

From the doc I thought that when we exit context (from one test with
disabling power) and start the context again (and power up in another
test), the "channel" would be put into default state (I mean the picocom
would be killed and re-spawned accordingly).

When I comment lines between #---- I do see following error
(for /dev/tty_display5 or ttyUSB0):

│   BlockingIOError: [Errno 11] Resource temporarily unavailable
│   During handling of the above exception, another exception occurred:
line 85, in recv 
│       raise channel.ChannelClosedException() 

Thanks in advance for help.

The separate tests in questions (for a reference):

import contextlib
import typing
import tbot
from tbot.machine import board
from tbot.machine import linux

TFTP_DIR = "/srv/tftp"

def uboot_kernel_write(
    lab: typing.Optional[tbot.selectable.LabHost] = None,
    uboot: typing.Optional[board.UBootMachine] = None,
    serverip: str = "",
    reset: bool = False,
) -> None:
    with contextlib.ExitStack() as cx:
        lh = cx.enter_context(lab or tbot.acquire_lab())
        if uboot is not None:
            ub = uboot
            b = cx.enter_context(tbot.acquire_board(lh))
            ub = cx.enter_context(tbot.acquire_uboot(b))

        p = linux.Path(lh, TFTP_DIR+"/fitImage")
        if not p.is_file():
            raise Exception(f"{p} must be a fitImage file!")

        ub.exec0("setenv", "serverip", serverip)
        ub.exec0("run", "tftp_mmc_fitImg")
        if reset:


import contextlib
import typing
import tbot
from tbot.machine import linux, board

def linux_falcon_boot(
    lab: typing.Optional[linux.LabHost] = None,
    board_linux: typing.Optional[board.LinuxStandaloneMachine] = None,
    falcon_status: str = "disable",
) -> None:
    with contextlib.ExitStack() as cx:
        if board_linux is None:
            lh  = cx.enter_context(lab or tbot.acquire_lab())
            b   = cx.enter_context(tbot.acquire_board(lh))
            lnx = cx.enter_context(tbot.acquire_linux(b))
            lnx = board_linux

        lnx.exec0("fw_setenv", "boot_os", "y" if falcon_status ==
        "enable" else "" )

Best regards,

Lukasz Majewski


DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/tbot/attachments/20190202/fb6a84f9/attachment.sig>

More information about the tbot mailing list