[tbot] Problem with context exit (and serial transmission)
Harald Seiler
hws at denx.de
Sun Feb 3 21:09:23 UTC 2019
Hi Lukasz,
On Sat, 2019-02-02 at 23:57 +0100, Lukasz Majewski wrote:
> def kernel_active_update(
> lab: typing.Optional[linux.LabHost] = None,
> ) -> None:
> linux_falcon_boot(falcon_status="disable")
> # --------- Problem / why do I need this code ?
> with lab or tbot.acquire_lab() as lh:
> lh.exec0("pkill", "-9", "picocom")
> time.sleep(3)
> # ---------
> uboot_kernel_write(reset=True, serverip="192.168.2.222")
Unrelated to your issue I have noticed something: While your code works,
you have a hidden performance cost: Each testcase will create its own
connection to the lab-host. In case of a local lab this will not be
noticeable but with ssh connections it will be a few seconds each time.
You can easily fix this though! The testcases you listed in the end already
have a `lab` parameter where you can supply an existing lab-host connection:
def kernel_active_update(
lab: typing.Optional[linux.LabHost] = None,
) -> None:
with lab or tbot.acquire_lab() as lh:
linux_falcon_boot(lab=lh, falcon_status="disable")
uboot_kernel_write(lab=lh, reset=True, serverip="...")
One more note:
> if reset:
> ub.exec0("reset")
Executing `reset` with `exec0` is not really portable. If your board has
autoboot enabled, tbot would hang indefinitely waiting for the U-Boot prompt
to reappear. If you absolutely have to execute reset, I'd do so manually
and then wait for the U-Boot header string to reappear before exiting the
board context (not tested, sorry):
if reset:
ub.channel.send("reset\n")
ub.channel.read_until_prompt(
# U-Boot Header
prompt="U-Boot",
# Because the header can appear anywhere in the stream
must_end=False,
)
# Actually power off the board now by exiting its context
> 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?
It looks like picocom doesn't like the way tbot ends a session. I found
a workaround: Add the following function in your board-config (where the
call to picocom is defined):
def cleanup(self) -> None:
# Send ^A^Q to quit picocom
if self.channel is not None:
self.channel.send("\x01\x11")
Docs for cleanup can be found here:
https://rahix.de/tbot/module-board.html#tbot.machine.board.Board.cleanup
> 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).
Yes, you got that correctly. Apparently picocom does not exit cleanly by
default ... I'll see if I can somehow fix this without the solution mentioned
above.
--
Harald
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-62 Fax: +49-8142-66989-80 Email: hws at denx.de
More information about the tbot
mailing list