Power on vs. reset?

Simon Glass sjg at chromium.org
Thu Apr 30 14:22:17 CEST 2020


Hi Harald,

On Thu, 30 Apr 2020 at 02:45, Harald Seiler <hws at denx.de> wrote:
>
> 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 ...

Yes I think that would be useful. The way I see it is that reset may
result in U-Boot booting, or not ,if it is not present. But typically
if I have just built U-Boot and want to get it on the board I should
reset it.

>
>
>
> 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.

That seems OK for now. I an guessing I need to add a new flag in flags
in main.py

Regards,
Simon


More information about the tbot mailing list