Power on vs. reset?

Simon Glass sjg at chromium.org
Thu Apr 30 14:53:34 CEST 2020


Hi Harald,

On Thu, 30 Apr 2020 at 06:26, Harald Seiler <hws at denx.de> wrote:
>
> Hello Simon,
>
> On Thu, 2020-04-30 at 06:22 -0600, Simon Glass wrote:
> > 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
>
> Flags are passed on the commandline with -f.  E.g. for the code above you add
>
>         -fno-reset

Ah I see, thanks. I was confused by the 'flags' variable.

Regards,
Simon


More information about the tbot mailing list