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