[Tinyos Core WG] Boot Order
David Moss
dmm at rincon.com
Tue May 27 08:37:07 PDT 2008
Ah - SpiByte is indeed the piece I've been missing. Drivers like the radios
and flash should provide a standalone initialization module which simply
shuts off the chip at init. This chip initialization module could be
referenced by platform code so you don't have to think about it - similar to
the behavior now, but modularized. This way, you won't need the full chip
driver to automatically put every chip to sleep at boot.
Thanks Phil,
-David
-----Original Message-----
From: Philip Levis [mailto:pal at cs.stanford.edu]
Sent: Friday, May 23, 2008 7:27 PM
To: David Moss
Cc: 'TinyOS Core WG'
Subject: Re: [Tinyos Core WG] Boot Order
On May 23, 2008, at 10:53 AM, David Moss wrote:
> An Init interface will complete when the Task queue is empty.
> Waiting for an
> interrupt breaks that model, which is the reason why interrupts are
> disabled
> during Init.
No -- you can wait for an interrupt with a self-posting task. Or,
just spin on the interrupt pending flag (no need to enable).
>
> That, in the past, has lead to platform-specific driver
> initialization code
> like this (MotePlatformC.nc):
>
> void TOSH_FLASH_M25P_DP() {
> // SIMO0, UCLK0
> TOSH_MAKE_SIMO0_OUTPUT();
> TOSH_MAKE_UCLK0_OUTPUT();
> TOSH_MAKE_FLASH_HOLD_OUTPUT();
> TOSH_MAKE_FLASH_CS_OUTPUT();
> TOSH_SET_FLASH_HOLD_PIN();
> TOSH_SET_FLASH_CS_PIN();
>
> TOSH_wait();
>
> // initiate sequence;
> TOSH_CLR_FLASH_CS_PIN();
> TOSH_CLR_UCLK0_PIN();
>
> TOSH_FLASH_M25P_DP_bit(TRUE); // 0
> TOSH_FLASH_M25P_DP_bit(FALSE); // 1
> TOSH_FLASH_M25P_DP_bit(TRUE); // 2
> TOSH_FLASH_M25P_DP_bit(TRUE); // 3
> TOSH_FLASH_M25P_DP_bit(TRUE); // 4
> TOSH_FLASH_M25P_DP_bit(FALSE); // 5
> TOSH_FLASH_M25P_DP_bit(FALSE); // 6
> TOSH_FLASH_M25P_DP_bit(TRUE); // 7
>
> TOSH_SET_FLASH_CS_PIN();
>
> TOSH_SET_SIMO0_PIN();
> TOSH_MAKE_SIMO0_INPUT();
> TOSH_MAKE_UCLK0_INPUT();
> TOSH_CLR_FLASH_HOLD_PIN();
> }
>
Not really; this code is for the most part just hacked (still
bleeding) from 1.x; no-one bothered to make it cleam.
> This is bad. Architecturally, the flash driver itself should be
> responsible
> for putting the flash chip into deep sleep using the SPI bus... not
> some
> platform-specific code in a platform directory.
Agreed. But I don't think this is because of the architecture, rather
just a 1.x holdover.
>
> TEP 107 does allow you to enable interrupts during Init, as long as
> you turn
> them back off and don't let any other component capture an
> interrupt (other
> components should enable their own interrupts when they're ready to
> handle
> them anyway). Would you say that the code above could be rewritten
> into the
> flash driver in SoftwareInit by enabling interrupts, accessing the
> SPI bus,
> and spinning a task until the SPI bus commands are complete? Doing
> so would
> still require platform-dependent code to enable/disable the correct
> SPI
> interrupts if you don't want to turn all of them on.
Actually, what I'd do is use SpiByte to send the commands. Since it
blocks, interrupts being disabled is not a problem.
Phil
More information about the Tinyos-2.0wg
mailing list