Power on vs. reset?

Harald Seiler hws at denx.de
Thu Apr 30 10:45:26 CEST 2020


Hello Simon,

On Wed, 2020-04-29 at 14:17 -0600, Simon Glass wrote:
> Hi,
> 
> When I use interactive_board, in some cases by board poweron() method
> will reset the board and in some cases will not.
> 
> Really, I suppose it should not, unless U-Boot has been updated.
> 
> So how should I indicate that a reset is required (e.g. to boot U-Boot
> from scratch)?

Not sure if I entirely understand what you mean ...

Your poweron() method should just perform a 'power on' operation.
A powercycle/reset is essentially calling poweroff() and then poweron()
again.

For resetting the board in a testcase, you want to use the following
pattern:

    @tbot.testcase
    @tbot.with_lab
    def reset_test(lh):
        with tbot.acquire_board(lh) as b:
            with tbot.acquire_uboot(b) as ub:
                # This is before the reset, U-Boot is running
                ...

        # Board is now off again

        with tbot.acquire_board(lh) as b:
            with tbot.acquire_uboot(b) as ub:
                # This is after the reset, U-Boot is (hopefully)
                # running again
                ...

        # Board is now off

I have been thinking about adding a generic reset() or reinit() method to
machines which first unwinds the entire context and then rebuilds it but
doing this is not trivial and I'll have to put a few more thoughts into
how this can be done safely ...



If you were instead talking about wanting to not reset the board on every
tbot run, Heikos response goes in the right direction.  The current
solution for this isn't as flexible as I would like and I'll definitely
work on this some more but right now what you can do is this:

In you board config, make the poweron() and poweroff() stubs if a certain
flag is present:

    class MyBoard(connector.ConsoleConnector, board.PowerControl, board.Board):
        name = "my-board"

        def poweron():
            if "no-reset" not in tbot.flags:
                self.host.exec0("...")

        def poweroff():
            if "no-reset" not in tbot.flags:
                self.host.exec0("...")

And in your boards U-Boot class, remove the autoboot intercept like this:

    class MyBoardUBoot(board.Connector, board.UBootAutobootIntercept, board.UBootShell):
        if "no-reset" in tbot.flags:
            autoboot_prompt = None

For Linux it is more difficult, you need to have two separate classes:

    class MyBoardLinuxWithBoot(board.LinuxUbootConnector, board.LinuxBootLogin, linux.Ash):
        ...

    class MyBoardLinuxWithoutBoot(board.Connector, linux.Ash):
        # This class expects Linux to have already booted and the serial
        # console is waiting at a shell prompt.
        ...

    if "no-reset" in tbot.flags:
        MyBoardLinux = MyBoardLinuxWithoutBoot
    else:
        MyBoardLinux = MyBoardLinuxWithBoot

I know this isn't pretty and it means you'll have to manually power on the
board initially, but as I said, I hope to improve on this.

> Regards,
> Simon
-- 
Harald



More information about the tbot mailing list