From bcce1a8f390b5db080a8da9ef1ccc7d4716fea07 Mon Sep 17 00:00:00 2001 From: mleopold Date: Tue, 6 Nov 2007 10:32:53 +0000 Subject: [PATCH] New TEP: Createing new T2 platform --- doc/html/tep131.html | 1976 ++++++++++++++++++++++++++++++++++++++++++ doc/pdf/tep131.pdf | Bin 0 -> 232853 bytes doc/txt/tep131.txt | 1675 +++++++++++++++++++++++++++++++++++ 3 files changed, 3651 insertions(+) create mode 100644 doc/html/tep131.html create mode 100644 doc/pdf/tep131.pdf create mode 100644 doc/txt/tep131.txt diff --git a/doc/html/tep131.html b/doc/html/tep131.html new file mode 100644 index 00000000..934f88da --- /dev/null +++ b/doc/html/tep131.html @@ -0,0 +1,1976 @@ + + + + + + +Creating a New Platform for TinyOS 2.x + + + + +
+

Creating a New Platform for TinyOS 2.x

+ +++ + + + + + + + + + + + + + + + + + + + + + +
TEP:131
Group:TinyOS 8051 Working Group
Type:Informational
Status:Draft
TinyOS-Version:2.x
Author:Martin Leopold
Draft-Created:6-Nov-2007
Draft-Version:1
Draft-Modified:6-Nov-2007
Draft-Discuss:TinyOS Developer List <tinyos-devel at mail.millennium.berkeley.edu>
+
+

Note

+

This memo is informational. It will hopefully be a basis for +discussions and suggestions for improvements. Distribution of this +memo is unlimited. This memo is in full compliance with TEP 1.

+
+
+

Abstract

+

The purpose of this TEP is to provide on overview of how to build a +new TinyOS 2 platform. While the purpose of most TEPs is to describe +TinyOS 2 entities, we will present concrete suggestions on how to +implement a new TinyOS 2 platform. We will use examples and briefly +cover the relevant TEPs to present a platform that adheres to the +current TinyOS standards. We will not cover the TEPs in detail, but to +the full text of each TEP for further information.

+

This TEP will go through the tool chain setup and the most basic +components for a functional TinyOS platform. We consider only TinyOS +version 2.x (from now on TinyOS).

+

Before venturing on this quest we will take a diversion and introduce +general TinyOS 2 concepts and terminology (Section 1), readers +familiar to TinyOS 2 can skip this section. This document will +introduce the TinyOS 2 platform (Section 2) and describes the 3 +elements that make up a platform: the tool chain (Section 3) the +platform definitions (Section 4) and the chips definitions (Section +5).

+
+ +
+

1. TinyOS Overview

+

Before describing the process of writing TinyOS platforms we will +briefly sum up the TinyOS ecosystem and the terminology required in +this TEP. To learn more visit the TinyOS website http://www.tinyos.net.

+

A systems overview is depicted below. In this TEP we will primarily +concern our selves with the platform portion of figure and briefly +cover the tool chain. This involves writing the necessary drivers and +writing rules to pass the code to the TinyOS tool chain. We will not +cover sensor boards in this TEP refer to, see [TEP109] for details.

+
++------------------------------------------+
+|              Application                 |
++------------------------------------------+
++--------+   +----------+   +--------------+
+| TinyOS | + | Platform | + | Sensor board |
++--------+   +----------+   +--------------+
+                    |
+                    V
+           +-------------------+
+           | TinyOS tool chain |
+           +-------------------+
+                    |
+ Target platform    V
+  +-------------------------------------+
+  |  +-------+    +-----+    +-------+  |
+  |  | Radio |----| MCU |----|Sensors|  |
+  |  +-------+    +-----+    +-------+  |
+  +-------------------------------------+
+
+
+

1.1 TinyOS 2 architecture

+

TinyOS 2.x is built on a tree-layered hardware abstraction +architecture (HAA)[TEP2]. This architecture separates the code for +each platform into distinct layers:

+
+
    +
  1. the Hardware Independent Layer (HIL)
  2. +
  3. the Hardware Adaptation Layer (HAL)
  4. +
  5. the Hardware Presentation Layer (HPL)
  6. +
+
+

A platform is built from bottom up, starting with the HPL level, +building HAL and HIL layers on top. Platform independent applications +are written using HIL level interfaces, allowing them to move easily +from platform to platform. While applications can target a platform +specific HAL layer for finer control of hardware specific features, +this will could prohibit such an application from being easily +portable. An overview of the TinyOS 2 architecture is given in +[tos2.0view].

+

The requirements for the platform implementation is described in +TinyOS Enhancement Proposals (TEP). Each TEP covers a particular area +and specifies the recommendations within that area, some of which are +relevant for platforms. While no specific label or designation is +given to platforms adhering to the set of TEPs, [TEP1] states: +"Developers desiring to add code (or TEPs) to TinyOS SHOULD follow all +current BCPs (Best Current Practice)". At the time of writing no TEP +has been awarded this designation or been finalized and we will refer +to the drafts as they are.

+

This document will not go through each of the requirements, but merely +outline how to build a basic functional platform. For further +information see "TinyOS 2.0 Overview" [tos2.0view] or the TEP list on +the TinyOS website http://www.tinyos.net.

+
+
+

1.2 TinyOS Contrib

+

The core of TinyOS is maintained by a set of working groups that +govern specific parts of the source code. New project can benefit from +the contrib section of TinyOS. This is a separate section of the +website and source repository maintained more loosely than the core of +TinyOS. It is intended for sharing code at an early stage or code that +may not gain the same popularity as the core.

+

New projects request a directory in this repository by following a +simple procedure on the TinyOS contrib web page

+

In contrib is a skeleton project skel that provides the most basic +framework for setting up a new platform, MCU, etc.

+
+
+
+

2. A TinyOS Platform

+

A TinyOS platform provides the code and tool chain definitions that +enable an application writer to implement an application for a mote. A +platform in TinyOS exposes some or all of the features of a particular +physical mote device to TinyOS applications - it refers to an entire +system, not a single chip. In order to write programs for a device +using TinyOS a platform for that device must exist within TinyOS.

+

A physical platform is comprised of a set of chips. Similarly a TinyOS +platform is the collection of the components representing these chips +(corresponding to drivers) Common chips can be shared among platforms +and implementing a new platform could simply mean wiring existing +components in a new way. If the chips that make up the platform are +not supported by TinyOS implementing the new platform consists if +implementing components for those chips (much like implementing +drivers).

+
+

2.1 A New Platform

+

Platforms are discovered at compile time by the TinyOS tool +chain and a new platform placed in the search path will be discovered +automatically. In addition sensor boards can be defined in a very +similar manner, however we will not cover sensor boards, see [TEP109] +for details. Defining a new platform boils down to 3 things:

+
+
    +
  1. definitions of the chips that make up the platform,
  2. +
  3. platform definitions (combining chips to a platform) and,
  4. +
  5. the tool chain or make definitions.
  6. +
+
+

The code for a TinyOS platform is spread out in a few locations of the +TinyOS tree depending based on those 3 categories. Below is an +overview of the locations and some of the files we will be needing in +the following (for further information see see "Coding Conventions" +[TEP3] and the "README" files in each directory).

+

Through this TEP we will use the terms PlatformX and MCUX to denote +the new generic platform and MCU being created:

+
+tos
+ +--chips                            1. Chip definitions
+ |    +--chipX
+ +--platforms
+ |    +--platformX                   2. Platform definitions
+ |         +--PlatformP/PlatformC
+ |         +--PlatformLeds              example component
+ |         +--.platform
+ |         +--hardware.h
+ |         +--chips
+ |              +--MCUX                 Platform specific features
+ |              +--chipX
+ +--sensorboards
+ |    +--boardX
+ |         +--.sensor
+ +--support
+      +--make                        3. Make definitions
+           +--platformX.target          platformX make targets
+           +--MCUX
+                +--MCUX.rules           make rules for MCUX
+                +--install.extra        additional target for MCUX
+
+

In the following we will briefly introduce each of the parts and +describe them in more detail in sections 2 through 4.

+
+
+

2.2 The Chips

+

Each of the chips that provide software accessible functionality must +have definitions present in the chips directory sensors, radios, +micro controllers (MCU) alike. Each chip is assigned a separate +directory under tos/chips. This directory contains chip specific +interfaces (HPL and HAL interfaces) and their implementations as well +as implementations of the hardware independent interface (HIL).

+

Some chips, MCUs in particular, contain distinct subsystems, such as +uart, timer, A/D converter, SPI, and so forth. These subsystems are +often put in a sub directory of their own within the chip-specific +directory.

+

If some feature of a chip is available or used only on a particular +platform, the platform directory can contain code that is specific to +this combination of chip and platform, say pin assignments, interrupt +assignments, etc. For example such additions would be placed in +tos/platforms/platformX/chips/chipX for PlatformX.

+
+
+

2.3 The Platform Directory

+

The platform is the piece of the puzzle that ties the components +corresponding to physical chips (drivers) together to form a +platform. The platform ties together the code that exposes the +features of the platform to TinyOS programs. In practise this is done +by i) including code for each of the chips and ii) by providing any +additional code that is specific to this particular platform.

+

A platform PlatformX would be placed in the directory +tos/platforms/platformX/ and code for subsystems reside in further +sub directories. Also in this directory is the .platform file that +sets up include paths and more (see Section 3).

+

An empty platform with no code (null) is provided and serves as an +example for other platforms.

+
+
+

2.4 The Tool-Chain (Make System)

+

The build system for TinyOS is written using GNU Make [1]. The +build system controls the process from pre-processing a TinyOS +application into a single C file and to pass this file to the +appropriate compiler and other tools. The make system is documented in +support/make/README and in TinyOS 2 Tutorial Lesson 10[TUT10].

+

The make system is located in the support directory. This +directory contains a platform definition and Make rules to build an +application for this platform (see Section 2).

+ + + + + +
[1]http://www.gnu.org/software/make/
+
+
+

2.5 The Minimal Platform

+

Before describing each of the subsystems, we will show a simple check +list. The absolute minimal TinyOS platform would have to provide the +following resources, given a PlatformX with MCUX:

+
    +
  • a platform directory tos/platform/PlatformX/ with the following
      +
    • a platform definition (.platform file)
    • +
    • a hardware.h header
    • +
    +
  • +
  • a platformX.target in tos/support/make
  • +
  • a MCUX.rules in tos/support/make/MCUX
  • +
  • a MCUX directory in tos/chips/MCUX, containing
      +
    • a McuSleepC (must enable interrupts)
    • +
    • a mcuxhardware.h (defines nesc_atomic_start/nesc_atomic_end)
    • +
    +
  • +
+
+
+
+

3. Tool Chain

+

The major components in the tool chain of TinyOS are i) the compiler +and ii) the build system that uses the compiler to produce an +executable binary or hex file. The first is installed separately, +while the second is part of the TinyOS source code. The compile +process transforms a set of nesC files into a binary executable or hex +file. Involved in this process is set of separate tools that are +linked in a chain. We will briefly cover this chain in a moment, but a +detailed description is beyond the scope of this TEP.

+

The make system is split in two: a general part and a platform +specific part. Section 3.1 will introduce the general mechanism and +Section 3.2 will cover how to introduce a new platform in the tool +chain.

+
+

3.1 Compiling using nesC

+

The process of the build system is depicted below. This system feeds +the source code through the tools to produce an executable or hex file +for uploading to the platform. The nesC pre-compiler is split in two +tools ncc an nescc. These two tools are used to assemble nesC source +files into a single C file which is compiled using a regular C +compiler. This requires that a C compiler is available for a given +platform and that this compiler accepts the dialect produced by nesC.

+
+  TinyOS
+application
+    |
+    |
+    V
++------+       +-----+        +---------+         +------------+
+| ncc  | app.c |     | Binary |         | app.hex |            |
+|  +   |------>| GCC |------->| objdump |-------->| programmer |
+| nesC |       |     |        |         |         |            |
++------+       +-----+        +---------+         +------------+
+                                                        |
+                                                        |
+                                                        V
+                                                      Target
+                                                     platform
+
+

The core TinyOS platforms are centered around GCC, this includes the +telos family, mica family and intelmote2. The nesC compiler expects +code resembling GCC C-dialect and also outputs code in GCC +C-dialect. The current TinyOS platforms are supported by GCC, but for +some processor architectures GCC is not available (e.g. Motorola HCS08, +Intel MCS51).

+

Porting to platforms that are GCC supported can benefit from the +existing tool flow, while porting to other platforms requires some +effort. A straight forward solution adopted for these platforms is to +post-process the C files produced by nesC to fit the needs of a +specific compiler, see TEP121 for an example of such a solution.

+
+
+

3.2 The Make System

+

TinyOS controls the build process using make. The global make file +searches certain locations to find make definitions for all available +platforms. In order to make a new platform available to the TinyOS +make system, a few files must be created in particular locations. These +files will be read by the global make system and exposed to the users +by make targets. Often the required rules are tied to a particular MCU +that is shared among several platforms and TinyOS leverages this fact +by creating a light-weight .target file pointing to the appropriate +rules in a .rules file. The make system is documented in +support/make/README and in TinyOS 2 Tutorial Lesson 10[TUT10].

+

The make system looks for .target files in support/make and the +directories listed in the environment variable TOSMAKE_PATH. Each +of the files found contain make targets for one TinyOS platform. The +target files usually do not contain the rules to build the binary +files, but include the appropriate rules from a .rules file, located +in a sub directory for the appropriate MCU architecture (e.g. avr for +the ATMega128 used by Mica). In this way many platforms share the +build rules, but have different .target files. In addition .extra +targets can be used to define helper targets such as install or clean.

+

Setting up the make system, requires two steps (Section 3.2.1 gives an +example):

+
+
    +
  1. Creating a platformX.target file that allows the make system to +discover the new platform. This file must contain a make rule with +the name of the platform. Further this target must depend on the +targets given in the variable BUILD_DEPS - this variable +contains the remainder of targets to be build during the build +process.
  2. +
  3. Creating a .rules file in a sub diretory of +support/make. Each file contain the actual target for +producing the binaries, hex files, etc. for one platform. They are +assembled in the BUILD_DEPS variable.
  4. +
+
+

We will cover these two files next.

+
+

3.2.1 The .target file

+

As mentioned above TinyOS searches for targets in the support/make +directory of the TinyOS source code and in the directories listed in +the environment variable TOSMAKE_PATH. A .target file for the +platform must exist in one of these locations. The .target usually +only sets up variables related to this platform and provide a target +named after the platform, this target depend on other rules to build +the binaries. These rules are included by calling +TOSMake_include_platform. As an example the mica2.target is +listed below:

+
+PLATFORM = mica2
+SENSORBOARD ?= micasb
+PROGRAMMER_PART ?= -dpart=ATmega128 --wr_fuse_e=ff
+PFLAGS += -finline-limit=100000
+
+AVR_FUSE_H ?= 0xd9
+
+$(call TOSMake_include_platform,avr)
+
+mica2: $(BUILD_DEPS)
+        @:
+
+

Pay attention to the call to TOSMake_include_platform,avr this call +includes .rules files in support/make or any sub directory of +TOSHMAKE_PATH named avr.

+
+
+

3.2.2 The .rules file

+

The .rules file contain the make rules for building the target +binary. If a MCU implementation already exists for a new platform, +simply pointing to this .rules from the corresponding .target is +sufficient. If not the .rules file must be built for a new MCU +architecture.

+

TOSMake_include_platform expects a sub directory with a rule file +of the form avr/avr.rules. The call also includes additional +.rules and .extra files present in that sub directory. See +support/make/README for details.

+

For example a simplified .rules file could look like this (from +avr/avr.rules):

+
+...
+
+    BUILD_DEPS = srec tosimage
+
+srec: exe FORCE
+        $(OBJCOPY) --output-target=srec $(MAIN_EXE) $(MAIN_SREC)
+
+tosimage: ihex build_tosimage FORCE
+        @:
+
+exe: builddir $(BUILD_EXTRA_DEPS) FORCE
+        @echo "    compiling $(COMPONENT) to a $(PLATFORM) binary"
+        $(NCC) -o $(MAIN_EXE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS)
+                  $(COMPONENT).nc $(LIBS) $(LDFLAGS)
+...
+
+
+
+
+
+

4. The Platform

+

A TinyOS platform is a collection of components corresponding to a +physical devices (a collection of drivers). A platform is constructed +by defining which components make up the platform and by providing any +additional platform specific components. The content of a platform is +not covered by a TEP at the time of writing and the following is based +on the available tutorials, READMEs and the current consensus.

+

The platform definitions for a PlatformX are located in +tos/platforms/platformX and contain 3 major elements:

+
+
    +
  1. The .platform file containing include paths and other arguments +for nesC
  2. +
  3. Platform boot procedure: PlatformP/PlatformC
  4. +
  5. Platform specific code, including a header for hardware specific +funtions (hardware.h) and code that is specific to the combination +of chip and platform (e.g. pin assignments, modifications, etc.).
  6. +
+
+

In the following we will describe each of these in more detail, below +is a depiction of a fictuous platform and the required definitions.

+
+Platform:                           .platform
+                                        include MCU driver
+  +-------------------------+           include Radio driver
+  |                         |           include Sensors driver
+  | Chips:                  |
+  |             +-------+   |       PlatformP
+  |             | Radio |   |           Initialize MCU
+  |             +--+----+   |           Initialize Sensor
+  |   +-----+      |        |           Initialize Radio
+  |   | MCU +------+        |
+  |   +-----+      |        |       hardware.h
+  |             +--+----+   |           Include MCU HW macros
+  |             | Leds  |   |
+  |             +-------+   |       HIL interfaces, eg:
+  |                         |           PlatformLeds
+  +-------------------------+
+
+

All the files we describe here must be found in a common directory +named after the platform; we call this a platform directory. This +directory must be found in the TinyOS tool chain search path for +example tos/platforms (or found in TOSHMAKE_PATH see Section +3.2.1). For example a platform named PlatformX could be placed in the +directory tos/platforms/platformX.

+
+

4.1 .platform file

+

All platform directories must carry a .platform file, this file +defines what makes up the platform. This file carries instructions for +the make system on where to locate the drivers for each of the +components of the platform. The definitions are read in a two step +process: the file is read by the ncc script that passes the +appropriate arguments to the nesC pre-processor[nescman]. The +.platform file is written as a Perl script interpreted by ncc.

+

The file is documented in form of the README file in the platforms +directory (tos/platforms), and the source code of the ncc script +found in the TinyOS distribution. Valuable information can also be +found in [TEP106], [TEP109], TinyOS 2 Tutorial Lesson 10[TUT10].

+

In addition to setting up include paths for nesC other arguments can +be passed on. In particular the components to be used for the +scheduler are selected with the '-fnesc-scheduler' command line +argument (see [TEP106]). The include paths are passed on using the +'-I' command line argument covered in [TEP109].

+

As an example, an abbreviated .platform file for the mica2 platform +looks like this:

+
+push( @includes, qw(
+  %T/platforms/mica
+  %T/platforms/mica2/chips/cc1000
+  %T/chips/cc1000
+  %T/chips/atm128
+  %T/chips/atm128/adc
+  %T/chips/atm128/pins
+  %T/chips/atm128/spi
+  %T/chips/atm128/timer
+  %T/lib/timer
+  %T/lib/serial
+  %T/lib/power
+) );
+
+@opts = qw(
+  -gcc=avr-gcc
+  -mmcu=atmega128
+  -fnesc-target=avr
+  -fnesc-no-debug
+  -fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask
+);
+
+
+
+

4.2 PlatformP and PlatformC

+

The PlatformP and PlatformC components are responsible for booting +this platform to a usable state. In general this usually means things +like calibrating clock and initializing I/O pins. If this platform +requires that some devices are initialized in a particular order this +can be implemented in a platform dependent way here. The boot process +covered in [TEP107].

+

Most hardware peripherals require an initialization procedure of some +sort. For most peripheral devices this procedure is only required when +the device is in use and can be left out if the device is +unused. TinyOS accomplishes this by providing a few initialization +call backs interfaces. When a given component is included it wires an +initialization procedure to one of these interfaces. In this way the +procedure will only be included when the component is included, this +process is known as auto wiring[TOSPRG].

+

The boot sequence calls two initialization interfaces in the following +order: PlatformC.Init and MainC.SoftwareInit. +PlatformC.Init must take care of initializing the hardware to an +operable state and initialization that has hidden dependencies must +occur here. Other components are initialized as part of +SoftwareInit and the orderign is determined at compile +time.

+

Common tasks in PlatformC.Init include clock calibration and IO +pins. However this component can be used to provide greater control of +the boot process if required. Consider for example that some component +which is initialized in SoftwareInit requires that some other +component has been initialized previously - lets say that the radio +must be initialized prior to the radio stack or that a component +prints a message to the UART during boot. How can this order be +ensured? One solution is to provide an additional initialization +handle prior to SoftwareInit and wire such procedures to this +handle. Below is an example from the Mica mote family using the +MoteInit interface. Components that must be initialized early in +the boot process is wired to this interface. If greater level of +control is required this strategy can be trivially be expanded to +further levels of interfaces for example MoteInit1 being initialized +prior to MoteInit2, this strategy is chosen by the MSP430 +implementation.

+
+

4.2.1 PlatformC

+

Below is depicted the PlatformC component from the Mica family of platforms.

+
+#include "hardware.h"
+
+configuration PlatformC {
+  provides {
+    interface Init;
+    /**
+     * Provides calibration information for other components.
+     */
+    interface Atm128Calibrate;
+  }
+  uses interface Init as SubInit;
+} implementation {
+  components PlatformP, MotePlatformC, MeasureClockC;
+
+  Init = PlatformP;
+  Atm128Calibrate = MeasureClockC;
+
+  PlatformP.MeasureClock -> MeasureClockC;
+  PlatformP.MoteInit -> MotePlatformC;
+  MotePlatformC.SubInit = SubInit;
+}
+
+
+
+

4.2.1 PlatformP

+

Below is depicted the PlatformP component from the Mica family of platforms.

+
+module PlatformP
+{
+  provides interface Init;
+  uses interface Init as MoteInit;
+  uses interface Init as MeasureClock;
+
+}
+implementation
+{
+  void power_init() {
+     ...
+  }
+
+  command error_t Init.init()
+  {
+    error_t ok;
+
+    ok = call MeasureClock.init();
+    ok = ecombine(ok, call MoteInit.init());
+    return ok;
+  }
+}
+
+
+
+

4.2.3 Init example: PlatformLedsC

+

Below is an example from mica/PlatformLedsC.nc wiring to the platform +specific MoteInit interface.

+
+configuration PlatformLedsC {
+  provides interface GeneralIO as Led0;
+...
+  uses interface Init;
+} implementation {
+  components HplAtm128GeneralIOC as IO;
+  components PlatformP;
+
+  Init = PlatformP.MoteInit;
+...
+
+
+
+
+

3.3 Platform Specific Code

+

In addition to PlatformP/PlatformC the platform directory contain +additional code that is specific to this platform. First this could be +code that ties platform independent resources to particular instances +on this platform, second it could be code that is only relevant on +this particular platform (e.g. the clock rate of this platform). For +example the LEDs are a an example of the first: most platform have a +few LEDs, and the particular pin on this platform is tied to the +platform independent implementation using PlatformLedsC.

+

TinyOS requires that the header hardware.h is present while other +component can be named freely.

+
+

4.3.1 Platform Headers

+

TinyOS relies on a few C-header files being present for each +platform. These headers are then automatically included from the +respective parts of the TinyOS system. TinyOS expects that the +following files are present and that certain properties are defined in +them.

+
+

hardware.h

+

The hardware.h header file is included by tos/system/MainC.nc +and usually in turn includes a MCU specific header file, with a few +required macros (such as avr128hardware.h, see Section 5.1.1). The +header is documented in TinyOS 2 Tutorial Lesson 10[TUT10]

+

In addition the hardware.h file can set flags that are not related to +the hardware in general, but to this platform (e.g. clock rate). Below +is a snippet from mica2/hardware.h

+
+#ifndef MHZ
+/* Clock rate is ~8MHz except if specified by user
+   (this value must be a power of 2, see MicaTimer.h and MeasureClockC.nc) */
+#define MHZ 8
+#endif
+
+#include <atm128hardware.h>
+
+enum {
+  PLATFORM_BAUDRATE = 57600L
+};
+...
+
+
+
+

platform_message.h

+

As part of the TinyOS 2 message buffer abstraction[TEP111], TinyOS +includes the header platform_message.h from the internal TinyOS +header message.h. This header is only strictly required for +platforms wishing to use the message_t abstraction - this is not +described further in this TEP, but is used widely throughout TinyOS +(See [TEP111] for details). The is expected to define the structures: +message_header_t, message_footer_t, and message_metadata_t which +are used to fill out the generic message_t structure.

+

Below is an example from the mica2 platform_message.h

+
+typedef union message_header {
+  cc1000_header_t cc1k;
+  serial_header_t serial;
+} message_header_t;
+
+typedef union message_footer {
+  cc1000_footer_t cc1k;
+} message_footer_t;
+
+typedef union message_metadata {
+  cc1000_metadata_t cc1k;
+} message_metadata_t;
+
+
+
+
+

4.3.2 Platform Specific Components

+

The code for platform dependent features also resides in the platform +directory. If the code can be tied to a particular chip it can be +placed in a separate directory below the chips directory. As an +example the following section of +micaz/chips/cc2420/HplCC2420PinsC.nc ties specific pins to general +names on the MicaZ platform.

+
+configuration HplCC2420PinsC {
+  provides {
+    interface GeneralIO as CCA;
+    interface GeneralIO as CSN;
+    interface GeneralIO as FIFO;
+    interface GeneralIO as FIFOP;
+    interface GeneralIO as RSTN;
+    interface GeneralIO as SFD;
+    interface GeneralIO as VREN;
+  }
+}
+
+implementation {
+
+  components HplAtm128GeneralIOC as IO;
+
+  CCA    = IO.PortD6;
+  CSN    = IO.PortB0;
+  FIFO   = IO.PortB7;
+  FIFOP  = IO.PortE6;
+  RSTN   = IO.PortA6;
+  SFD    = IO.PortD4;
+  VREN   = IO.PortA5;
+
+}
+
+
+
+
+
+

5. The chips

+

The functionality of each chip is provided by a set of one or more +interfaces and one or more components, in traditional terms this makes +up a driver. Each chip is assigned a sub directory in the the +tos/chips directory. All code that define the functionality of a +chip is located here regardless of the type of chip (MCU, radio, +etc.). In addition MCU's group the code related to separate sub +systems into further sub directories (e.g. tos/chips/atm128/timer).

+

In this section we will go trough some of the peripherals commonly +built into MCUs, but we will not go trough other chips such as sensors +or radio.

+
+

5.1 MCU Internals

+

Apart from the drivers for each of the peripheral units, a few +additional definitions are required for the internals of the MCU. This +includes i) atomic begin/end and ii) low power mode. The first is +defined in the header hardware.h and the latter component +MCUSleepC.

+
+

5.1.1 mcuXardware.h

+

Each architecture defines a set of required and useful macros in a +header filed named after the architecture (for example +atm128hardware.h for ATMega128). This header is then in turn +included from hardware.h in the platform directory (See Section +4.3.1).

+

A few of the macros are required by nesC code generation. nesC will +output code using these macros and they must be defined in advance, +other useful macros such as interrupt handlers on this particular +platform can be defined here as well. The required macros are:

+
+
    +
  • __nesc_enable_interrupt / __nesc_disable_interrupt
  • +
  • __nesc_atomic_start / __nesc_atomic_end
  • +
+
+

Below is a few examples from atm128hardware.h

+
+/* We need slightly different defs than SIGNAL, INTERRUPT */
+#define AVR_ATOMIC_HANDLER(signame) \
+  void signame() __attribute__ ((signal)) @atomic_hwevent() @C()
+
+#define AVR_NONATOMIC_HANDLER(signame) \
+  void signame() __attribute__ ((interrupt)) @hwevent() @C()
+
+...
+
+inline void __nesc_enable_interrupt()  { sei(); }
+inline void __nesc_disable_interrupt() { cli(); }
+
+...
+
+inline __nesc_atomic_t
+__nesc_atomic_start(void) @spontaneous()  {
+    __nesc_atomic_t result = SREG;
+    __nesc_disable_interrupt();
+    asm volatile("" : : : "memory");
+    return result;
+}
+
+/* Restores interrupt mask to original state. */
+inline void
+__nesc_atomic_end(__nesc_atomic_t original_SREG) @spontaneous() {
+  asm volatile("" : : : "memory");
+  SREG = original_SREG;
+}
+
+
+
+

5.1.2 MCUSleepC

+

TinyOS manages the power state of the MCU through a few +interfaces. These interfaces allow components to signal how and when +this platform should enter low power mode. Each new MCU in TinyOS must +implement the MCUSleepC component that provide the McuSleep and +McuPowerState interfaces.

+

The TinyOS scheduler calls McuSleep.sleep() when it runs out of +tasks to start. The purpose of this function is to make the MCU enter +the appropriate sleep mode. The call to McuSleep.sleep() is made +from within an atomic section making it essential that sleep() enables +interrupts before entering sleep mode! If the interrupts not enabled +prior to entering sleep mode the MCU will not be able to power back up.

+

A dummy MCU sleep component that does not enter sleep mode, but merely +switches interrupts on and off is shown below. This ensures that the +platform will not lock up even without proper sleep support.

+
+#include "hardware.h"
+
+module McuSleepC {
+  provides interface McuSleep;
+  provides interface McuPowerState;
+  uses  interface McuPowerOverride;
+} implementation {
+  async command void McuSleep.sleep() {
+    __nesc_enable_interrupt();
+    // Enter sleep here
+    __nesc_disable_interrupt();
+  }
+
+  async command void McuPowerState.update() { }
+}
+
+
+
+
+

5.2 GeneralIO

+

Virtually all micro controllers feature a set of input output (I/O) +pins. The features of these pins is often configurable and often some +pins only support a subset of features. The HIL level interface for +TinyOS is described in [TEP117] and uses two interface to describe +general purpose I/O pins common to many MCUs:

+
    +
  • GeneralIO: Digital input/output. The GeneralIO interface +describes a digital pin with a state of either clr or set, the +pin must be capable of both input and output. Some MCUs provide pins +with different capabilities: more modes (e.g. an alternate +peripheral mode), less modes (e.g. only input) or a third +"tri-state" mode. Such chip specific additional features are not +supported. Some chips group a set of pins into "ports" that can be +read or written simultaneously, the HIL level interface does not +support reading or setting an entire port.
  • +
  • GpioInterrupt: Edge triggered interrupts. GpioInterrupt support +a single pin providing an interrupt triggered on a rising or falling +edge. Pins capable of triggering on an input level or only +triggering on one edge is not supported.
  • +
+

While these interfaces are aimed at the HIL level some platforms use +the GeneralIO and GpioInterrupt interface to represent the HPL level +(atm128 for example) and others platforms define their own interface +to capture the entire functionality (msp430, pxa27x for example).

+

[TEP117] states that each platform must provide the general IO pins of +that platform through the GeneralIO interface and should do this +though the component GeneralIOC. It is however not clear how the +entire set of pins should be provided - this could be in the form of a +list of pins, group of pins, a generic component, etc.

+

The pin implementations are usually found in the pins sub directory +for a particular MCU (e.g. msp430/pins for MSP430 pin +implementation).

+
+

5.2.1 Example MSP430

+

The MSP430 implementation builds the platform independent pin +implementation as a stack of components starting with a platform +specific component for each pin.

+
+           |  GeneralIO
++---------------------+
+|      Msp430GpioC    |
++---------------------+
+           |  HplMsp430GeneralIO
++---------------------+
+| HplMsp430GeneralIOC |
++---------------------+
+           |  HplMsp430GeneralIO
++---------------------+
+| HplMsp430GeneralIOP |
++---------------------+
+
+

At the bottom the component HplMsp430GeneralIOP provides a general +implementation of one Msp430 pin using the HplMsp430GeneralIO +interface. The generic component HplMsp430GeneralIOP is then +instantiated for each pin by HplMsp430GeneralIOC.

+
+interface HplMsp430GeneralIO {
+  async command void set();
+  async command void clr();
+  async command void toggle();
+  async command uint8_t getRaw();
+  async command bool get();
+  async command void makeInput();
+  async command bool isInput();
+  async command void makeOutput();
+  async command bool isOutput();
+  async command void selectModuleFunc();
+  async command bool isModuleFunc();
+  async command void selectIOFunc();
+  async command bool isIOFunc();
+}
+
+

This interface is implemented in the generic component +HplMsp430GeneralIOP (abbreviated):

+
+ generic module HplMsp430GeneralIOP(uint8_t port_in_addr, ...)  {
+   provides interface HplMsp430GeneralIO as IO;
+ } implementation  {
+   #define PORTx (*(volatile TYPE_PORT_OUT*)port_out_addr)
+
+   async command void IO.set() { atomic PORTx |= (0x01 << pin); }
+   async command void IO.clr() { atomic PORTx &= ~(0x01 << pin); }
+   async command void IO.toggle() { atomic PORTx ^= (0x01 << pin); }
+
+...
+
+

These are then instantiated from HplMsp430GeneralIOC (abbreviated):

+
+configuration HplMsp430GeneralIOC {
+  provides interface HplMsp430GeneralIO as Port10;
+  provides interface HplMsp430GeneralIO as Port11;
+...
+} implementation {
+  components
+    new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 0) as P10,
+    new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 1) as P11,
+...
+  Port10 = P10;
+  Port11 = P11;
+...
+
+

And finally these are transformed from the interface +HplMsp430GeneralIO to the platform independent GeneralIO using the +generic component Msp430GpioC (abbreviated):

+
+generic module Msp430GpioC() {
+  provides interface GeneralIO;
+  uses interface HplMsp430GeneralIO as HplGeneralIO;
+} implementation {
+  async command void GeneralIO.set() { call HplGeneralIO.set(); }
+  async command void GeneralIO.clr() { call HplGeneralIO.clr(); }
+  async command void GeneralIO.toggle() { call HplGeneralIO.toggle(); }
+...
+
+
+
+
+

5.3 LEDs

+

Having a few leds on a platform is quite common and TinyOS supports +three leds in a platform independent manner. Three leds are provided +through the LedsC component regardless of the amount of leds +available on the platform. The LED implementation is not covered by a +TEP at the time of writing, but the general consensus between most +platforms seems to be to provide access to 3 LEDs through the +component PlatformLedsC. This component is then used by LedC and +LedP (from tos/system) to provide a platform independent Led +interface.

+

The PlatformLedsC implementation is found in the platform directory of +each platform (e.g. tos/platforms/mica2 for mica2). The consensus is +as follows:

+
    +
  • Each platform provides the component PlatformLedsC
  • +
  • PlatformLedsC provides Led0, Led1, Led2 using the GeneralIO +interface. If the platform has less than 3 Leds these are wired to +the component NoPinC
  • +
  • PlatformLedsC uses the Init interface and usually it wired back to +an initialization in PlatformP - this way when LedC is included in +an application it will be initialized when PlatformP call this +interface
  • +
+
+

5.3.1 Example Mica2dot

+
+configuration PlatformLedsC
+{
+  provides interface GeneralIO as Led0;
+  provides interface GeneralIO as Led1;
+  provides interface GeneralIO as Led2;
+  uses interface Init;
+}
+implementation  {
+  components HplAtm128GeneralIOC as IO;
+  components new NoPinC();
+  components PlatformP;
+
+  Init = PlatformP.MoteInit;
+
+  Led0 = IO.PortA2;  // Pin A2 = Red LED
+  Led1 = NoPinC;
+  Led2 = NoPinC;
+}
+
+
+
+

5.3.2 LEDs implementation discussion

+

The Led interface described above is not specified in a TEP, though at +the time of writing most platforms seem to follow this pattern. Not +being covered by a TEP leads to a few uncertainties:

+
    +
  • PlatformLedsC exports leds using the GeneralIO interface. The +intention is of course that a led is connected to a pin and this pin +is used to turn the led on. LedC uses this assumption to calls the +appropriate makeOutput and set/clr calls. However this might +not be the case - a led could be connected differently making the +semantics of, say makeOutput unclear. Furthermore it is assumed +that the set call turns the led on, while the actual pin might have +to be cleared (active low). And what is the semantics of makeInput +on a LED? Abstracting these differences into on/off, enable/disable +semantics would clear up the uncertainties.
  • +
  • Initializing the Leds is important - the Leds can consume power even +when turned off, if the corresponding pins are configured +inappropriately. Including the LedsC component initializes the Leds +as output when this component is used, if not they must be +initialized elsewhere (e.g. PlatformP). It would seem elegant to +group related code (e.g. one Leds component).
  • +
  • The interface does not provide a uniform way of accessing any +additional LEDs other than the 3 found on the Mica motes. While this +is inherently platform specific, having a common consensus would be +useful, say for example exporting an array of Led. In this way a +program requiring say 4 leds could be compiled if 4 leds are available.
  • +
+
+
+
+

5.4 Timers

+

The timer subsystem in TinyOS 2 is described in [TEP102] the TEP +specifies interfaces at HAL and HIL levels that a platform must adhere +to. The timer does not cover the possible design choices at the HPL +level. The timers defined in this TEP are described in terms of +width of the underlying counters (e.g. 8, 16, 32 bit) and in the +tick period or frequency denoted precision (e.g. 10 kHz, 1 ms, 1 +us). The timer subsystem is provided through a set of hardware +independent interfaces and a set of recommended configuration modules. +As such some features of a particular device may not be available in a +device independent manner.

+

The functionality commonly seen in MCU timer units is often split in 3 +parts: control, timer/counter, capture/compare(trigger). Timer control +in is inherently platform specific and is not covered by a TEP. The +timer [TEP102] covers timer/counter while capture/compare is covered +by [TEP117]. From the TEPs it is not clear how capture/compare and +timer/counter relate to each other even though they are likely to +refer to the same time base. The calibration of the system clock is +often connected with the timer system and lives in the timer +directory, but it is not covered in [TEP102].

+

The timer implementation for a given MCU is placed in the timer sub +directory of the directory for a given MCU +(e.g. tos/chips/avr/timer). Often clock initialization components +are placed in the same directory, but these are not covered by the +TEPs.

+
+

5.4.1 Timer Layers

+

TEP117 follows the 3 layer architecture and separates the platform +dependent and independent abstractions. It poses not restrictions on +the HPL layer, but provides a suggested HAL layer and requirements at +the HIL level. It defines a set of interfaces and precisions that are +used at the HAL and HIL levels.

+

The common features of a timer are separated into a set of interfaces, +corresponding roughly to common features in MCU timer units. The +interfaces covered by the [TEP102] are (capture from [TEP117]):

+
    +
  • BusyWait<precision_tag,size_type> Short synchronous delays
  • +
  • Counter<precision_tag, size_type> Current time, and overflow events
  • +
  • Alarm<precision_tag,size_type> Extend Counter with at a given time
  • +
  • Timer<precision_tag> 32 bit current time, one shot and periodic events
  • +
  • LocalTime<precision_tag> 32 bit current time without overflow
  • +
  • GpioCapture 16 bit time value on an external event (precision unspecified)
  • +
+

The precisions defined in [TEP117] are defined as "binary" meaning +1024 parts of a second. Platforms must provide these precisions (if +possible) regardless of the underlying system frequency (i.e. this +could be a power of 10).

+
    +
  • TMilli 1024 Hz (period 0.98 ms)
  • +
  • TMicro 1048576 Hz (period 0.95 us)
  • +
  • T32khz 32.768 kHz (period 30.5 us)
  • +
+
+

HPL

+

The features of the underlying hardware timers are generally exposed +using one or more hardware specific interfaces. Many MCU provide a +rich a set of different timer units varying in timer width, frequency +and features.

+

Many MCUs provides features that are quite close to the features +described by the interfaces above. The HPL layer exposes these +features and the layers above utilize the available hardware and +virtualize the features if necessary.

+

Consider for example generating events at a specific time. Often a +timer unit has a single counter and a few compare registers that +generate interrupts. The counter and compare registers often translate +relative straightforward to Counter and Alarm interfaces.

+
+
+

HAL

+

Each platform should expose a hardware timer of precision P and width W +as Counter${P}${W}C, Alarm${P}${W}C(). For example an 8 bit, 32.768 kHz +timer should be exposed as Counter32khz8C and Alarm32khz8C

+

Alarm/Counters come in pairs and refer to a particular hardware unit, +while there is only one counter there is commonly multiple compare +registers. Alarm is a generic component and each instantiation must +provide an independent alarm allocating more Alarm components than +available compare register should provide a compile time error.

+
+
+

HIL

+

Each platform must expose the following components that provide +specific width and precision that are guaranteed to exist on TEP +compliant platforms.

+
+
    +
  • HilTimerMilliC A 32 bit Timer interface of TMilli precision
  • +
  • BusyWaitMicroC A BusyWait interface of TMicro precision
  • +
+
+
+
+
+

5.4.2 Timer Implementation

+

Implementing the timers for TinyOS in short consists of utilizing the +available HW timer features to provide TinyOS style timers +interfaces. In general the approach taken by existing platforms is to +create a set of HPL level timer and control interfaces that export the +available hardware features and adapt these to specific precisions and +widths at the HAL level. However the specific HPL level design choices +differ from platform to platform.

+

For example one could export all timers as a simple list, a component +for each timer, a parameterised interface, etc. Similarly for the +control features this could be provided with the timer interfaces or +kept as a separate interface. In the following we will go through a +few examples and point out their differences.

+
+
+

5.4.3 Example: ATMega128l

+

The ATMega128l implementation (atm128) exports the system timers one +component each. Each component provide 4 interfaces - one for each of +the functions of the unit: timer, capture, compare and control. The +timer, capture, and compare interfaces are generic based on the width +(either 8 or 16 bit) while two separate control interfaces are +provided.

+

Depicted below is a diagram of how HplAtm128Timer1C could be stacked +to provide platform independent interfaces (not shown are +HplAtm128Timer0Async, HplAtm128Timer2, HplAtm128Timer3):

+
+          +------------------------------------------------+
+          |              HplAtm128Timer1C                  |
+          +-----+-------------------+-----------------+----+
+HplAtm128Capture|     HplAtm128Timer| HplAtm128Compare|
+                |                   |                 |
+     +----------+---------+         |                 |
+     | Atm128GpioCaptureC |         |                 |
+     +----------+---------+         |                 |
+                |                 +-+-----------------+--+
+     GpioCapture|                 |      Atm128AlarmC    |
+                |                 +----------+-----------+
+                |                       Alarm|
+
+

The hardware features is exported using 3 interfaces: +HplAtm128Timer, HplAtm128Compare and HplAtm128Capture.

+
+interface HplAtm128Timer<timer_size>
+{
+  async command timer_size get();
+  async command void       set( timer_size t );
+  async event void overflow();
+  async command void reset();
+  async command void start();
+...
+
+interface HplAtm128Compare<size_type>
+{
+  async command size_type get();
+  async command void set(size_type t);
+  async event void fired();           //<! Signalled on compare interrupt
+  async command void reset();
+...
+
+interface HplAtm128Capture<size_type>
+{
+  async command size_type get();
+  async command void      set(size_type t);
+  async event void captured(size_type t);
+  async command void reset();
+
+
+
In addition to the timer related interfaces two control interfaces are
+
provided: 'HplAtm128TimerCtrl16' and 'HplAtm128TimerCtrl8' (below).
+
+
+#include <Atm128Timer.h>
+
+interface HplAtm128TimerCtrl8
+{
+  /// Timer control register: Direct access
+  async command Atm128TimerControl_t getControl();
+  async command void setControl( Atm128TimerControl_t control );
+
+  /// Interrupt mask register: Direct access
+  async command Atm128_TIMSK_t getInterruptMask();
+  async command void setInterruptMask( Atm128_TIMSK_t mask);
+
+  /// Interrupt flag register: Direct access
+  async command Atm128_TIFR_t getInterruptFlag();
+  async command void setInterruptFlag( Atm128_TIFR_t flags );
+}
+
+

Each of the hardware timers are exported in one component for example +'HplAtm128Timer1P':

+
+#include <Atm128Timer.h>
+
+module HplAtm128Timer1P
+{
+  provides {
+    // 16-bit Timers
+    interface HplAtm128Timer<uint16_t>   as Timer;
+    interface HplAtm128TimerCtrl16       as TimerCtrl;
+    interface HplAtm128Capture<uint16_t> as Capture;
+    interface HplAtm128Compare<uint16_t> as CompareA;
+    interface HplAtm128Compare<uint16_t> as CompareB;
+    interface HplAtm128Compare<uint16_t> as CompareC;
+  }
+  uses interface HplAtm128TimerCtrl8     as Timer0Ctrl;
+}
+implementation
+{
+  //=== Read the current timer value. ===================================
+  async command uint16_t Timer.get() { return TCNT1; }
+
+  //=== Set/clear the current timer value. ==============================
+  async command void Timer.set(uint16_t t) { TCNT1 = t; }
+...
+
+
+
+

5.4.4 Example: MSP430

+

The MSP430 features two very similar (but not identical) timers. Both +timers are provided through the same interfaces in a way similar to +ATMega128l: 'Msp430Timer', 'Msp430Capture' 'Msp430Compare', +'Msp430TimerControl'. All timer interfaces (for both timers) are +accessed through the component Msp430TimerC.

+

The Msp430TimerControl is show below. It is slightly different +than the ATMega equivalent - notice that 'setControl' accepts a struct +with configuration parameters instead of setting these with a command +each.

+
+#include "Msp430Timer.h"
+
+interface Msp430TimerControl
+{
+  async command msp430_compare_control_t getControl();
+  async command bool isInterruptPending();
+  async command void clearPendingInterrupt();
+
+  async command void setControl(msp430_compare_control_t control );
+  async command void setControlAsCompare();
+  async command void setControlAsCapture(bool low_to_high);
+
+  async command void enableEvents();
+  async command void disableEvents();
+  async command bool areEventsEnabled();
+}
+
+

Each timer is implemented through the generic component 'Msp430TimerP' +that is instantiated for each timer in 'Msp430TimerC':

+
+configuration Msp430TimerC
+{
+  provides interface Msp430Timer as TimerA;
+  provides interface Msp430TimerControl as ControlA0;
+  provides interface Msp430TimerControl as ControlA1;
+  provides interface Msp430TimerControl as ControlA2;
+  provides interface Msp430Compare as CompareA0;
+  provides interface Msp430Compare as CompareA1;
+  provides interface Msp430Compare as CompareA2;
+  provides interface Msp430Capture as CaptureA0;
+  provides interface Msp430Capture as CaptureA1;
+  provides interface Msp430Capture as CaptureA2;
+...
+}
+implementation
+{
+  components new Msp430TimerP( TAIV_, TAR_, TACTL_, TAIFG, TACLR, TAIE,
+               TASSEL0, TASSEL1, FALSE ) as Msp430TimerA
+           , new Msp430TimerP( TBIV_, TBR_, TBCTL_, TBIFG, TBCLR, TBIE,
+               TBSSEL0, TBSSEL1, TRUE ) as Msp430TimerB
+           , new Msp430TimerCapComP( TACCTL0_, TACCR0_ ) as Msp430TimerA0
+           , new Msp430TimerCapComP( TACCTL1_, TACCR1_ ) as Msp430TimerA1
+           , new Msp430TimerCapComP( TACCTL2_, TACCR2_ ) as Msp430TimerA2
+...
+
+
+
+

5.4.5 Example: PXA27x

+

The PXA27x (XScale) platform provides a component for each of the +timers classes on the system. Each component provides a few interfaces +that exposes all features of that unit. Each interface combines timer +and control interface features. For example 'HplPXA27xOSTimerC' +provides 12 instances of the 'HplPXA27xOSTimer' interface and one +instace 'HplPXA27xOSTimerWatchdog'. Similarly for 'HplPXA27xSleep' and +'HplPXA27xWatchdog'.

+
+interface HplPXA27xOSTimer
+{
+  async command void setOSCR(uint32_t val);
+  async command uint32_t getOSCR();
+...
+
+
+  async event void fired();
+}
+
+

All the OS timers are exported through HplPXA27xOSTimerC

+
+configuration HplPXA27xOSTimerC {
+
+  provides {
+    interface Init;
+    interface HplPXA27xOSTimer as OST0;
+    interface HplPXA27xOSTimer as OST0M1;
+    interface HplPXA27xOSTimer as OST0M2;
+    interface HplPXA27xOSTimer as OST0M3;
+...
+implementation {
+  components HplPXA27xOSTimerM, HplPXA27xInterruptM;
+
+  Init = HplPXA27xOSTimerM;
+
+  OST0 = HplPXA27xOSTimerM.PXA27xOST[0];
+  OST0M1 = HplPXA27xOSTimerM.PXA27xOST[1];
+  OST0M2 = HplPXA27xOSTimerM.PXA27xOST[2];
+  OST0M3 = HplPXA27xOSTimerM.PXA27xOST[3];
+...
+
+

These interfaces are further abstracted through 'HalPXA27xOSTimerMapC' +as a parameterised interface:

+
+configuration HalPXA27xOSTimerMapC {
+  provides {
+    interface Init;
+    interface HplPXA27xOSTimer as OSTChnl[uint8_t id];
+  }
+} implementation {
+  components HplPXA27xOSTimerC;
+
+  Init = HplPXA27xOSTimerC;
+
+  OSTChnl[0] = HplPXA27xOSTimerC.OST4;
+  OSTChnl[1] = HplPXA27xOSTimerC.OST5;
+  OSTChnl[2] = HplPXA27xOSTimerC.OST6;
+ ...
+
+
+
+

5.4.6 Timer Discussion

+

While the TEP is clear on many points there are few that are left up +to the implementer. The relation between timers and capture events is +unclear and covered in two TEPs. Capture refers to timers[TEP102] but +the reverse is not clear[TEP102]. This has a few implications for the +timer/capture relationship:

+
    +
  • Many devices feature multiple timers of the same width and +precision. It is not clear how this is provided. In particular how +this relates to a capture event - e.g. how does a capture event from +timer 2 relate to a time value from timer 1. Presumably TinyOS has +one system time based on a single timer which is used by all timer +capture interfaces and visualized if necessary.
  • +
  • The interfaces provide a an elegant way to expand a 16 bit timer to +a 32 bit interface. However this is not the case for capture events.
  • +
+
+
+
+

5.5 I/O buses (UART, SPI, I2C)

+

Most modern microprocessors provide a selection of standard I/O bus +units such as serial (UART or USART), I2C, SPI, etc. The drivers for +the available buses are usually put in a sub directory for the MCU +(e.g. chip/atm128/spi for SPI on ATMega128l).

+

There are a few TEP that cover different buses in TinyOS, and low +level serial communication:

+
    +
  • TEP113 Serial Communication: Serial
  • +
  • TEP117 Low-Level I/O: Serial, SPI, I2C
  • +
+

On some hardware platforms a single I/O unit is shared among a number +of buses. The MSP430 for example implements SPI, I2C and USART in a +single USART unit that can only operate in one mode at a time. In such +cases the single hardware unit must be shared among the drivers.

+
+

5.5.1 Serial Communication

+

Serial communication in TinyOS 2.x is implemented as a serial +communications stack with a UART or USART at the bottom. The bottom +layer is covered in [TEP113] and [TEP117]. TEP117 states that each +platform must provide access to a serial port through the +'SerialByteComm' interface from the component UartC. However UartC is +not provided by any platforms at the time of writing. There seems to +be a consensus to build the component 'PlatformSerialC' providing the +'UartStream' and 'StdControl' interfaces. Either component will be +placed in the platform directory (e.g. tos/platforms/mica2 for +mica2). The serial stack is built upon 'PlatformSerialC' and this +component will be required to take advantage of the serial stack.

+

[TEP117] defines 'UartStream' and 'UartByte' to access the a UART +multiple bytes at a time and one byte at a time (synchronously), while +[TEP113] defines 'UartByte' to send and receive one byte at a time +(asynchronously).

+
+
+

5.5.2 I2C, SPI

+

SPI and I2C buses are provided through straightforward interfaces that +match the functionality of the buses closely.

+
+

SpiByte, SpiPacket

+
+interface SpiByte {
+  async command uint8_t write( uint8_t tx );
+}
+
+
+interface SpiPacket {
+  async command error_t send( uint8_t* txBuf, uint8_t* rxBuf, uint16_t len );
+  async event void sendDone( uint8_t* txBuf, uint8_t* rxBuf, uint16_t len,
+                             error_t error );
+}
+
+
+
+

I2CPacket

+
+interface I2CPacket<addr_size> {
+  async command error_t read(i2c_flags_t flags, uint16_t addr,
+                             uint8_t length, uint8_t* data);
+  async command error_t write(i2c_flags_t flags, uint16_t addr,
+                              uint8_t length,  uint8_t* data);
+  async event void readDone(error_t error, uint16_t addr,
+                            uint8_t length, uint8_t* data);
+  async event void writeDone(error_t error, uint16_t addr,
+                             uint8_t length, uint8_t* data);
+}
+
+
+
+
+

5.5.3 Example

+
+
..ATMega128
+
-> does not provide SerialByteComm
+
..MSP430
+
-> Uart1C provides SerialByteComm along with Init and StdControl +-> sender det meste videre til Msp430Uart1C (som mangler Init!?!?) +Msp430Uart0C +-> SerialByteComm, Msp430UartControl, Msp430UartConfigure, Resurce +-> Sender videre til Msp430Uart1P & Msp430Usart1C +-> Sender videre til HplMsp430Usart1C->HplMsp430Usart1P
+
..PXA27
+
Parametriseret m. HplPXA27xUARTP (Init && HplPXA27xUART) +-> init sætter en masse registre og enabler interrupt +HalPXA27xSerialP: HplPXA27xUART, Init, noget DMA noget
+
+
+
+
+
+

6. Authors

+
+
Martin Leoold
+
University of Copenhagen, Dept. of Computer Science
+
Universitetsparken 1
+
DK-2100 København Ø
+
Denmark
+

+
Phone +45 3532 1464
+

+ +
+
+
+

7. Citations

+ + + + + +
[TEP1]TEP 1: TEP Structure and Keywords +<http://www.tinyos.net/tinyos-2.x/doc/html/tep1.html>
+ + + + + +
[TEP2]TEP 2: Hardware Abstraction Architecture +<http://www.tinyos.net/tinyos-2.x/doc/html/tep2.html>
+ + + + + +
[TEP3]TEP 3: Coding Standard +<http://www.tinyos.net/tinyos-2.x/doc/html/tep3.html>
+ + + + + +
[TEP102]TEP 102: Timers +<http://www.tinyos.net/tinyos-2.x/doc/html/tep102.html>
+ + + + + +
[TEP106]TEP 106: Schedulers and Tasks +<http://www.tinyos.net/tinyos-2.x/doc/html/tep106.html>
+ + + + + +
[TEP107]TEP 107: TinyOS 2.x Boot Sequence +<http://www.tinyos.net/tinyos-2.x/doc/html/tep107.html>
+ + + + + +
[TEP109]TEP 109: Sensors and Sensor Boards +<http://www.tinyos.net/tinyos-2.x/doc/html/tep109.html>
+ + + + + +
[TEP111]TEP 111: message_t +<http://www.tinyos.net/tinyos-2.x/doc/html/tep111.html>
+ + + + + +
[TEP113]TEP 113: Serial Communication +<http://www.tinyos.net/tinyos-2.x/doc/html/tep113.html>
+ + + + + +
[TEP117]TEP 117: Low-Level I/O +<http://www.tinyos.net/tinyos-2.x/doc/html/tep117.html>
+ + + + + +
[TEP121]TEP 121: Towards TinyOS for 8051 +<http://www.tinyos.net/tinyos-2.x/doc/html/tep121.html>
+ + + + + +
[TOSPRG]Philip Levis: TinyOS Programming +<http://www.tinyos.net/tinyos-2.x/doc/pdf/tinyos-programming.pdf>
+ + + + + +
[tos2.0view]Philip Levis. "TinyOS 2.0 Overview" Feb 8 2006 +<http://www.tinyos.net/tinyos-2.x/doc/html/overview.html>
+ + + + + +
[nescman]David Gay, Philip Levis, David Culler, Eric Brewer. "NesC 1.2 Language Reference Manual" August 2005
+ + + + + +
[TUT10]
+
TinyOS 2 Tutorial Lesson 10
+
<http://www.tinyos.net/tinyos-2.x/doc/html/tutorial/lesson10.html>
+
+

LocalWords: TinyOS TEP TEPs nesC

+
+
+
+ + diff --git a/doc/pdf/tep131.pdf b/doc/pdf/tep131.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bcf4294f2ff78d076e22e14304f63cb6baf4c890 GIT binary patch literal 232853 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 literal 0 HcmV?d00001 diff --git a/doc/txt/tep131.txt b/doc/txt/tep131.txt new file mode 100644 index 00000000..287afa06 --- /dev/null +++ b/doc/txt/tep131.txt @@ -0,0 +1,1675 @@ + +====================================== +Creating a New Platform for TinyOS 2.x +====================================== + +:TEP: 131 +:Group: TinyOS 8051 Working Group +:Type: Informational +:Status: Draft +:TinyOS-Version: 2.x +:Author: Martin Leopold + +:Draft-Created: 6-Nov-2007 +:Draft-Version: 1 +:Draft-Modified: 6-Nov-2007 +:Draft-Discuss: TinyOS Developer List + +.. Note:: + This memo is informational. It will hopefully be a basis for + discussions and suggestions for improvements. Distribution of this + memo is unlimited. This memo is in full compliance with TEP 1. + +Abstract +==================================================================== + +The purpose of this TEP is to provide on overview of how to build a +new TinyOS 2 platform. While the purpose of most TEPs is to describe +TinyOS 2 entities, we will present concrete suggestions on how to +implement a new TinyOS 2 platform. We will use examples and briefly +cover the relevant TEPs to present a platform that adheres to the +current TinyOS standards. We will not cover the TEPs in detail, but to +the full text of each TEP for further information. + +This TEP will go through the tool chain setup and the most basic +components for a functional TinyOS platform. We consider only TinyOS +version 2.x (from now on TinyOS). + +Before venturing on this quest we will take a diversion and introduce +general TinyOS 2 concepts and terminology (Section 1), readers +familiar to TinyOS 2 can skip this section. This document will +introduce the TinyOS 2 platform (Section 2) and describes the 3 +elements that make up a platform: the tool chain (Section 3) the +platform definitions (Section 4) and the chips definitions (Section +5). + +Table of Content +==================================================================== + +.. contents:: + +1. TinyOS Overview +==================================================================== + +Before describing the process of writing TinyOS platforms we will +briefly sum up the TinyOS ecosystem and the terminology required in +this TEP. To learn more visit the TinyOS website http://www.tinyos.net. + +A systems overview is depicted below. In this TEP we will primarily +concern our selves with the platform portion of figure and briefly +cover the tool chain. This involves writing the necessary drivers and +writing rules to pass the code to the TinyOS tool chain. We will not +cover sensor boards in this TEP refer to, see [TEP109_] for details. + +:: + + +------------------------------------------+ + | Application | + +------------------------------------------+ + +--------+ +----------+ +--------------+ + | TinyOS | + | Platform | + | Sensor board | + +--------+ +----------+ +--------------+ + | + V + +-------------------+ + | TinyOS tool chain | + +-------------------+ + | + Target platform V + +-------------------------------------+ + | +-------+ +-----+ +-------+ | + | | Radio |----| MCU |----|Sensors| | + | +-------+ +-----+ +-------+ | + +-------------------------------------+ + + +1.1 TinyOS 2 architecture +-------------------------------------------------------------------- + +TinyOS 2.x is built on a tree-layered hardware abstraction +architecture (HAA)[TEP2_]. This architecture separates the code for +each platform into distinct layers: + + 1. the Hardware Independent Layer (HIL) + 2. the Hardware Adaptation Layer (HAL) + 3. the Hardware Presentation Layer (HPL) + +A platform is built from bottom up, starting with the HPL level, +building HAL and HIL layers on top. Platform independent applications +are written using HIL level interfaces, allowing them to move easily +from platform to platform. While applications can target a platform +specific HAL layer for finer control of hardware specific features, +this will could prohibit such an application from being easily +portable. An overview of the TinyOS 2 architecture is given in +[tos2.0view_]. + +The requirements for the platform implementation is described in +TinyOS Enhancement Proposals (TEP). Each TEP covers a particular area +and specifies the recommendations within that area, some of which are +relevant for platforms. While no specific label or designation is +given to platforms adhering to the set of TEPs, [TEP1_] states: +"Developers desiring to add code (or TEPs) to TinyOS SHOULD follow all +current BCPs (Best Current Practice)". At the time of writing no TEP +has been awarded this designation or been finalized and we will refer +to the drafts as they are. + +This document will not go through each of the requirements, but merely +outline how to build a basic functional platform. For further +information see "TinyOS 2.0 Overview" [tos2.0view_] or the TEP list on +the TinyOS website http://www.tinyos.net. + + +1.2 TinyOS Contrib +-------------------------------------------------------------------- + +The core of TinyOS is maintained by a set of working groups that +govern specific parts of the source code. New project can benefit from +the *contrib* section of TinyOS. This is a separate section of the +website and source repository maintained more loosely than the core of +TinyOS. It is intended for sharing code at an early stage or code that +may not gain the same popularity as the core. + +New projects request a directory in this repository by following a +simple procedure on the `TinyOS contrib web page +`_ + +In contrib is a skeleton project *skel* that provides the most basic +framework for setting up a new platform, MCU, etc. + +2. A TinyOS Platform +==================================================================== + +A TinyOS platform provides the code and tool chain definitions that +enable an application writer to implement an application for a mote. A +platform in TinyOS exposes some or all of the features of a particular +physical mote device to TinyOS applications - it refers to an entire +system, not a single chip. In order to write programs for a device +using TinyOS a platform for that device must exist within TinyOS. + +A physical platform is comprised of a set of chips. Similarly a TinyOS +platform is the collection of the components representing these chips +(corresponding to drivers) Common chips can be shared among platforms +and implementing a new platform could simply mean wiring existing +components in a new way. If the chips that make up the platform are +not supported by TinyOS implementing the new platform consists if +implementing components for those chips (much like implementing +drivers). + + +2.1 A New Platform +-------------------------------------------------------------------- + +Platforms are discovered at compile time by the TinyOS tool +chain and a new platform placed in the search path will be discovered +automatically. In addition sensor boards can be defined in a very +similar manner, however we will not cover sensor boards, see [TEP109_] +for details. Defining a new platform boils down to 3 things: + + 1. definitions of the chips that make up the platform, + 2. platform definitions (combining chips to a platform) and, + 3. the tool chain or make definitions. + +The code for a TinyOS platform is spread out in a few locations of the +TinyOS tree depending based on those 3 categories. Below is an +overview of the locations and some of the files we will be needing in +the following (for further information see see "Coding Conventions" +[TEP3_] and the "README" files in each directory). + +Through this TEP we will use the terms PlatformX and MCUX to denote +the new generic platform and MCU being created: + +:: + + tos + +--chips 1. Chip definitions + | +--chipX + +--platforms + | +--platformX 2. Platform definitions + | +--PlatformP/PlatformC + | +--PlatformLeds example component + | +--.platform + | +--hardware.h + | +--chips + | +--MCUX Platform specific features + | +--chipX + +--sensorboards + | +--boardX + | +--.sensor + +--support + +--make 3. Make definitions + +--platformX.target platformX make targets + +--MCUX + +--MCUX.rules make rules for MCUX + +--install.extra additional target for MCUX + + +In the following we will briefly introduce each of the parts and +describe them in more detail in sections 2 through 4. + + +2.2 The Chips +-------------------------------------------------------------------- + +Each of the chips that provide software accessible functionality must +have definitions present in the chips directory sensors, radios, +micro controllers (MCU) alike. Each chip is assigned a separate +directory under ``tos/chips``. This directory contains chip specific +interfaces (HPL and HAL interfaces) and their implementations as well +as implementations of the hardware independent interface (HIL). + +Some chips, MCUs in particular, contain distinct subsystems, such as +uart, timer, A/D converter, SPI, and so forth. These subsystems are +often put in a sub directory of their own within the chip-specific +directory. + +If some feature of a chip is available or used only on a particular +platform, the platform directory can contain code that is specific to +this combination of chip and platform, say pin assignments, interrupt +assignments, etc. For example such additions would be placed in +``tos/platforms/platformX/chips/chipX`` for PlatformX. + +2.3 The Platform Directory +-------------------------------------------------------------------- + +The platform is the piece of the puzzle that ties the components +corresponding to physical chips (drivers) together to form a +platform. The platform ties together the code that exposes the +features of the platform to TinyOS programs. In practise this is done +by i) including code for each of the chips and ii) by providing any +additional code that is specific to this particular platform. + +A platform *PlatformX* would be placed in the directory +``tos/platforms/platformX/`` and code for subsystems reside in further +sub directories. Also in this directory is the ``.platform`` file that +sets up include paths and more (see Section 3). + +An empty platform with no code (null) is provided and serves as an +example for other platforms. + + +2.4 The Tool-Chain (Make System) +-------------------------------------------------------------------- + +The build system for TinyOS is written using GNU Make [#make]_. The +build system controls the process from pre-processing a TinyOS +application into a single C file and to pass this file to the +appropriate compiler and other tools. The make system is documented in +``support/make/README`` and in TinyOS 2 Tutorial Lesson 10[TUT10_]. + +The make system is located in the ``support`` directory. This +directory contains a platform definition and Make rules to build an +application for this platform (see Section 2). + +.. [#make] http://www.gnu.org/software/make/ + +2.5 The Minimal Platform +-------------------------------------------------------------------- + +Before describing each of the subsystems, we will show a simple check +list. The absolute minimal TinyOS platform would have to provide the +following resources, given a *PlatformX* with *MCUX*: + +* a platform directory ``tos/platform/PlatformX/`` with the following + + - a platform definition (*.platform* file) + - a *hardware.h* header + +* a *platformX.target* in ``tos/support/make`` +* a *MCUX.rules* in ``tos/support/make/MCUX`` +* a *MCUX* directory in ``tos/chips/MCUX``, containing + + - a *McuSleepC* (must enable interrupts) + - a *mcuxhardware.h* (defines *nesc_atomic_start*/*nesc_atomic_end*) + + +3. Tool Chain +==================================================================== + +The major components in the tool chain of TinyOS are i) the compiler +and ii) the build system that uses the compiler to produce an +executable binary or hex file. The first is installed separately, +while the second is part of the TinyOS source code. The compile +process transforms a set of nesC files into a binary executable or hex +file. Involved in this process is set of separate tools that are +linked in a chain. We will briefly cover this chain in a moment, but a +detailed description is beyond the scope of this TEP. + +The make system is split in two: a general part and a platform +specific part. Section 3.1 will introduce the general mechanism and +Section 3.2 will cover how to introduce a new platform in the tool +chain. + +3.1 Compiling using nesC +-------------------------------------------------------------------- + +The process of the build system is depicted below. This system feeds +the source code through the tools to produce an executable or hex file +for uploading to the platform. The nesC pre-compiler is split in two +tools ncc an nescc. These two tools are used to assemble nesC source +files into a single C file which is compiled using a regular C +compiler. This requires that a C compiler is available for a given +platform and that this compiler accepts the dialect produced by nesC. + +:: + + TinyOS + application + | + | + V + +------+ +-----+ +---------+ +------------+ + | ncc | app.c | | Binary | | app.hex | | + | + |------>| GCC |------->| objdump |-------->| programmer | + | nesC | | | | | | | + +------+ +-----+ +---------+ +------------+ + | + | + V + Target + platform + + +The core TinyOS platforms are centered around GCC, this includes the +telos family, mica family and intelmote2. The nesC compiler expects +code resembling GCC C-dialect and also outputs code in GCC +C-dialect. The current TinyOS platforms are supported by GCC, but for +some processor architectures GCC is not available (e.g. Motorola HCS08, +Intel MCS51). + +Porting to platforms that are GCC supported can benefit from the +existing tool flow, while porting to other platforms requires some +effort. A straight forward solution adopted for these platforms is to +post-process the C files produced by nesC to fit the needs of a +specific compiler, see TEP121 for an example of such a solution. + +3.2 The Make System +-------------------------------------------------------------------- + +TinyOS controls the build process using make. The global make file +searches certain locations to find make definitions for all available +platforms. In order to make a new platform available to the TinyOS +make system, a few files must be created in particular locations. These +files will be read by the global make system and exposed to the users +by make targets. Often the required rules are tied to a particular MCU +that is shared among several platforms and TinyOS leverages this fact +by creating a light-weight *.target* file pointing to the appropriate +rules in a *.rules* file. The make system is documented in +``support/make/README`` and in TinyOS 2 Tutorial Lesson 10[TUT10_]. + +The make system looks for *.target* files in ``support/make`` and the +directories listed in the environment variable ``TOSMAKE_PATH``. Each +of the files found contain make targets for one TinyOS platform. The +target files usually do not contain the rules to build the binary +files, but include the appropriate rules from a *.rules* file, located +in a sub directory for the appropriate MCU architecture (e.g. avr for +the ATMega128 used by Mica). In this way many platforms share the +build rules, but have different *.target* files. In addition *.extra* +targets can be used to define helper targets such as install or clean. + +Setting up the make system, requires two steps (Section 3.2.1 gives an +example): + + 1. Creating a *platformX.target* file that allows the make system to + discover the new platform. This file must contain a make rule with + the name of the platform. Further this target must depend on the + targets given in the variable ``BUILD_DEPS`` - this variable + contains the remainder of targets to be build during the build + process. + + 2. Creating a *.rules* file in a sub diretory of + ``support/make``. Each file contain the actual target for + producing the binaries, hex files, etc. for one platform. They are + assembled in the ``BUILD_DEPS`` variable. + +We will cover these two files next. + +3.2.1 The .target file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As mentioned above TinyOS searches for targets in the ``support/make`` +directory of the TinyOS source code and in the directories listed in +the environment variable ``TOSMAKE_PATH``. A *.target* file for the +platform must exist in one of these locations. The *.target* usually +only sets up variables related to this platform and provide a target +named after the platform, this target depend on other rules to build +the binaries. These rules are included by calling +*TOSMake_include_platform*. As an example the ``mica2.target`` is +listed below: + +:: + + PLATFORM = mica2 + SENSORBOARD ?= micasb + PROGRAMMER_PART ?= -dpart=ATmega128 --wr_fuse_e=ff + PFLAGS += -finline-limit=100000 + + AVR_FUSE_H ?= 0xd9 + + $(call TOSMake_include_platform,avr) + + mica2: $(BUILD_DEPS) + @: + +Pay attention to the call to *TOSMake_include_platform,avr* this call +includes ``.rules`` files in ``support/make`` or any sub directory of +``TOSHMAKE_PATH`` named *avr*. + + +3.2.2 The .rules file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The *.rules* file contain the make rules for building the target +binary. If a MCU implementation already exists for a new platform, +simply pointing to this *.rules* from the corresponding *.target* is +sufficient. If not the *.rules* file must be built for a new MCU +architecture. + +``TOSMake_include_platform`` expects a sub directory with a rule file +of the form ``avr/avr.rules``. The call also includes additional +*.rules* and *.extra* files present in that sub directory. See +``support/make/README`` for details. + +For example a simplified .rules file could look like this (from +*avr/avr.rules*): + + +:: + + ... + + BUILD_DEPS = srec tosimage + + srec: exe FORCE + $(OBJCOPY) --output-target=srec $(MAIN_EXE) $(MAIN_SREC) + + tosimage: ihex build_tosimage FORCE + @: + + exe: builddir $(BUILD_EXTRA_DEPS) FORCE + @echo " compiling $(COMPONENT) to a $(PLATFORM) binary" + $(NCC) -o $(MAIN_EXE) $(OPTFLAGS) $(PFLAGS) $(CFLAGS) + $(COMPONENT).nc $(LIBS) $(LDFLAGS) + ... + + +4. The Platform +==================================================================== + +A TinyOS platform is a collection of components corresponding to a +physical devices (a collection of drivers). A platform is constructed +by defining which components make up the platform and by providing any +additional platform specific components. The content of a platform is +not covered by a TEP at the time of writing and the following is based +on the available tutorials, *READMEs* and the current consensus. + +The platform definitions for a *PlatformX* are located in +``tos/platforms/platformX`` and contain 3 major elements: + + 1. The *.platform* file containing include paths and other arguments + for nesC + + 2. Platform boot procedure: PlatformP/PlatformC + + 3. Platform specific code, including a header for hardware specific + funtions (hardware.h) and code that is specific to the combination + of chip and platform (e.g. pin assignments, modifications, etc.). + +In the following we will describe each of these in more detail, below +is a depiction of a fictuous platform and the required definitions. + +:: + + Platform: .platform + include MCU driver + +-------------------------+ include Radio driver + | | include Sensors driver + | Chips: | + | +-------+ | PlatformP + | | Radio | | Initialize MCU + | +--+----+ | Initialize Sensor + | +-----+ | | Initialize Radio + | | MCU +------+ | + | +-----+ | | hardware.h + | +--+----+ | Include MCU HW macros + | | Leds | | + | +-------+ | HIL interfaces, eg: + | | PlatformLeds + +-------------------------+ + + +All the files we describe here must be found in a common directory +named after the platform; we call this a platform directory. This +directory must be found in the TinyOS tool chain search path for +example ``tos/platforms`` (or found in ``TOSHMAKE_PATH`` see Section +3.2.1). For example a platform named PlatformX could be placed in the +directory ``tos/platforms/platformX``. + +4.1 .platform file +-------------------------------------------------------------------- + +All platform directories must carry a ``.platform`` file, this file +defines what makes up the platform. This file carries instructions for +the make system on where to locate the drivers for each of the +components of the platform. The definitions are read in a two step +process: the file is read by the ncc script that passes the +appropriate arguments to the nesC pre-processor[nescman_]. The +.platform file is written as a Perl script interpreted by ncc. + +The file is documented in form of the README file in the platforms +directory (*tos/platforms*), and the source code of the ncc script +found in the TinyOS distribution. Valuable information can also be +found in [TEP106_], [TEP109_], TinyOS 2 Tutorial Lesson 10[TUT10_]. + +In addition to setting up include paths for nesC other arguments can +be passed on. In particular the components to be used for the +scheduler are selected with the '-fnesc-scheduler' command line +argument (see [TEP106_]). The include paths are passed on using the +'-I' command line argument covered in [TEP109_]. + +As an example, an abbreviated *.platform* file for the mica2 platform +looks like this: + +:: + + push( @includes, qw( + %T/platforms/mica + %T/platforms/mica2/chips/cc1000 + %T/chips/cc1000 + %T/chips/atm128 + %T/chips/atm128/adc + %T/chips/atm128/pins + %T/chips/atm128/spi + %T/chips/atm128/timer + %T/lib/timer + %T/lib/serial + %T/lib/power + ) ); + + @opts = qw( + -gcc=avr-gcc + -mmcu=atmega128 + -fnesc-target=avr + -fnesc-no-debug + -fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask + ); + + +4.2 PlatformP and PlatformC +-------------------------------------------------------------------- + +The PlatformP and PlatformC components are responsible for booting +this platform to a usable state. In general this usually means things +like calibrating clock and initializing I/O pins. If this platform +requires that some devices are initialized in a particular order this +can be implemented in a platform dependent way here. The boot process +covered in [TEP107_]. + +Most hardware peripherals require an initialization procedure of some +sort. For most peripheral devices this procedure is only required when +the device is in use and can be left out if the device is +unused. TinyOS accomplishes this by providing a few initialization +call backs interfaces. When a given component is included it wires an +initialization procedure to one of these interfaces. In this way the +procedure will only be included when the component is included, this +process is known as auto wiring[TOSPRG_]. + +The boot sequence calls two initialization interfaces in the following +order: ``PlatformC.Init`` and ``MainC.SoftwareInit``. +``PlatformC.Init`` must take care of initializing the hardware to an +operable state and initialization that has hidden dependencies must +occur here. Other components are initialized as part of +``SoftwareInit`` and the orderign is determined at compile +time. + +Common tasks in ``PlatformC.Init`` include clock calibration and IO +pins. However this component can be used to provide greater control of +the boot process if required. Consider for example that some component +which is initialized in SoftwareInit requires that some other +component has been initialized previously - lets say that the radio +must be initialized prior to the radio stack or that a component +prints a message to the UART during boot. How can this order be +ensured? One solution is to provide an additional initialization +handle prior to SoftwareInit and wire such procedures to this +handle. Below is an example from the Mica mote family using the +``MoteInit`` interface. Components that must be initialized early in +the boot process is wired to this interface. If greater level of +control is required this strategy can be trivially be expanded to +further levels of interfaces for example MoteInit1 being initialized +prior to MoteInit2, this strategy is chosen by the MSP430 +implementation. + +4.2.1 PlatformC +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Below is depicted the PlatformC component from the Mica family of platforms. + +:: + + #include "hardware.h" + + configuration PlatformC { + provides { + interface Init; + /** + * Provides calibration information for other components. + */ + interface Atm128Calibrate; + } + uses interface Init as SubInit; + } implementation { + components PlatformP, MotePlatformC, MeasureClockC; + + Init = PlatformP; + Atm128Calibrate = MeasureClockC; + + PlatformP.MeasureClock -> MeasureClockC; + PlatformP.MoteInit -> MotePlatformC; + MotePlatformC.SubInit = SubInit; + } + +4.2.1 PlatformP +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Below is depicted the PlatformP component from the Mica family of platforms. + +:: + + module PlatformP + { + provides interface Init; + uses interface Init as MoteInit; + uses interface Init as MeasureClock; + + } + implementation + { + void power_init() { + ... + } + + command error_t Init.init() + { + error_t ok; + + ok = call MeasureClock.init(); + ok = ecombine(ok, call MoteInit.init()); + return ok; + } + } + +4.2.3 Init example: PlatformLedsC +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Below is an example from mica/PlatformLedsC.nc wiring to the platform +specific *MoteInit* interface. + +:: + + configuration PlatformLedsC { + provides interface GeneralIO as Led0; + ... + uses interface Init; + } implementation { + components HplAtm128GeneralIOC as IO; + components PlatformP; + + Init = PlatformP.MoteInit; + ... + +3.3 Platform Specific Code +-------------------------------------------------------------------- + +In addition to PlatformP/PlatformC the platform directory contain +additional code that is specific to this platform. First this could be +code that ties platform independent resources to particular instances +on this platform, second it could be code that is only relevant on +this particular platform (e.g. the clock rate of this platform). For +example the LEDs are a an example of the first: most platform have a +few LEDs, and the particular pin on this platform is tied to the +platform independent implementation using PlatformLedsC. + +TinyOS requires that the header ``hardware.h`` is present while other +component can be named freely. + +4.3.1 Platform Headers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +TinyOS relies on a few C-header files being present for each +platform. These headers are then automatically included from the +respective parts of the TinyOS system. TinyOS expects that the +following files are present and that certain properties are defined in +them. + +hardware.h +********************** + +The ``hardware.h`` header file is included by ``tos/system/MainC.nc`` +and usually in turn includes a MCU specific header file, with a few +required macros (such as avr128hardware.h, see Section 5.1.1). The +header is documented in TinyOS 2 Tutorial Lesson 10[TUT10_] + +In addition the hardware.h file can set flags that are not related to +the hardware in general, but to this platform (e.g. clock rate). Below +is a snippet from ``mica2/hardware.h`` + +:: + + #ifndef MHZ + /* Clock rate is ~8MHz except if specified by user + (this value must be a power of 2, see MicaTimer.h and MeasureClockC.nc) */ + #define MHZ 8 + #endif + + #include + + enum { + PLATFORM_BAUDRATE = 57600L + }; + ... + +platform_message.h +********************** + +As part of the TinyOS 2 message buffer abstraction[TEP111_], TinyOS +includes the header *platform_message.h* from the internal TinyOS +header *message.h*. This header is only strictly required for +platforms wishing to use the message_t abstraction - this is not +described further in this TEP, but is used widely throughout TinyOS +(See [TEP111_] for details). The is expected to define the structures: +*message_header_t*, *message_footer_t*, and *message_metadata_t* which +are used to fill out the generic *message_t* structure. + +Below is an example from the ``mica2`` *platform_message.h* + +:: + + typedef union message_header { + cc1000_header_t cc1k; + serial_header_t serial; + } message_header_t; + + typedef union message_footer { + cc1000_footer_t cc1k; + } message_footer_t; + + typedef union message_metadata { + cc1000_metadata_t cc1k; + } message_metadata_t; + + +4.3.2 Platform Specific Components +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The code for platform dependent features also resides in the platform +directory. If the code can be tied to a particular chip it can be +placed in a separate directory below the ``chips`` directory. As an +example the following section of +``micaz/chips/cc2420/HplCC2420PinsC.nc`` ties specific pins to general +names on the MicaZ platform. + +:: + + configuration HplCC2420PinsC { + provides { + interface GeneralIO as CCA; + interface GeneralIO as CSN; + interface GeneralIO as FIFO; + interface GeneralIO as FIFOP; + interface GeneralIO as RSTN; + interface GeneralIO as SFD; + interface GeneralIO as VREN; + } + } + + implementation { + + components HplAtm128GeneralIOC as IO; + + CCA = IO.PortD6; + CSN = IO.PortB0; + FIFO = IO.PortB7; + FIFOP = IO.PortE6; + RSTN = IO.PortA6; + SFD = IO.PortD4; + VREN = IO.PortA5; + + } + + + +5. The chips +==================================================================== + +The functionality of each chip is provided by a set of one or more +interfaces and one or more components, in traditional terms this makes +up a driver. Each chip is assigned a sub directory in the the +``tos/chips`` directory. All code that define the functionality of a +chip is located here regardless of the type of chip (MCU, radio, +etc.). In addition MCU's group the code related to separate sub +systems into further sub directories (e.g. ``tos/chips/atm128/timer``). + +In this section we will go trough some of the peripherals commonly +built into MCUs, but we will not go trough other chips such as sensors +or radio. + +5.1 MCU Internals +-------------------------------------------------------------------- + +Apart from the drivers for each of the peripheral units, a few +additional definitions are required for the internals of the MCU. This +includes i) atomic begin/end and ii) low power mode. The first is +defined in the header *hardware.h* and the latter component +*MCUSleepC*. + +5.1.1 mcuXardware.h +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each architecture defines a set of required and useful macros in a +header filed named after the architecture (for example +*atm128hardware.h* for ATMega128). This header is then in turn +included from *hardware.h* in the platform directory (See Section +4.3.1). + +A few of the macros are required by nesC code generation. nesC will +output code using these macros and they must be defined in advance, +other useful macros such as interrupt handlers on this particular +platform can be defined here as well. The required macros are: + + * *__nesc_enable_interrupt* / *__nesc_disable_interrupt* + * *__nesc_atomic_start* / *__nesc_atomic_end* + +Below is a few examples from *atm128hardware.h* + +:: + + /* We need slightly different defs than SIGNAL, INTERRUPT */ + #define AVR_ATOMIC_HANDLER(signame) \ + void signame() __attribute__ ((signal)) @atomic_hwevent() @C() + + #define AVR_NONATOMIC_HANDLER(signame) \ + void signame() __attribute__ ((interrupt)) @hwevent() @C() + + ... + + inline void __nesc_enable_interrupt() { sei(); } + inline void __nesc_disable_interrupt() { cli(); } + + ... + + inline __nesc_atomic_t + __nesc_atomic_start(void) @spontaneous() { + __nesc_atomic_t result = SREG; + __nesc_disable_interrupt(); + asm volatile("" : : : "memory"); + return result; + } + + /* Restores interrupt mask to original state. */ + inline void + __nesc_atomic_end(__nesc_atomic_t original_SREG) @spontaneous() { + asm volatile("" : : : "memory"); + SREG = original_SREG; + } + + +5.1.2 MCUSleepC +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +TinyOS manages the power state of the MCU through a few +interfaces. These interfaces allow components to signal how and when +this platform should enter low power mode. Each new MCU in TinyOS must +implement the *MCUSleepC* component that provide the *McuSleep* and +*McuPowerState* interfaces. + +The TinyOS scheduler calls *McuSleep.sleep()* when it runs out of +tasks to start. The purpose of this function is to make the MCU enter +the appropriate sleep mode. The call to *McuSleep.sleep()* is made +from within an atomic section making it essential that sleep() enables +interrupts before entering sleep mode! If the interrupts not enabled +prior to entering sleep mode the MCU will not be able to power back up. + +A dummy MCU sleep component that does not enter sleep mode, but merely +switches interrupts on and off is shown below. This ensures that the +platform will not lock up even without proper sleep support. + +:: + + #include "hardware.h" + + module McuSleepC { + provides interface McuSleep; + provides interface McuPowerState; + uses interface McuPowerOverride; + } implementation { + async command void McuSleep.sleep() { + __nesc_enable_interrupt(); + // Enter sleep here + __nesc_disable_interrupt(); + } + + async command void McuPowerState.update() { } + } + + +5.2 GeneralIO +-------------------------------------------------------------------- + +Virtually all micro controllers feature a set of input output (I/O) +pins. The features of these pins is often configurable and often some +pins only support a subset of features. The HIL level interface for +TinyOS is described in [TEP117_] and uses two interface to describe +general purpose I/O pins common to many MCUs: + +* **GeneralIO**: Digital input/output. The GeneralIO interface + describes a digital pin with a state of either *clr* or *set*, the + pin must be capable of both input and output. Some MCUs provide pins + with different capabilities: more modes (e.g. an alternate + peripheral mode), less modes (e.g. only input) or a third + "tri-state" mode. Such chip specific additional features are not + supported. Some chips group a set of pins into "ports" that can be + read or written simultaneously, the HIL level interface does not + support reading or setting an entire port. + +* **GpioInterrupt**: Edge triggered interrupts. GpioInterrupt support + a single pin providing an interrupt triggered on a rising or falling + edge. Pins capable of triggering on an input level or only + triggering on one edge is not supported. + +While these interfaces are aimed at the HIL level some platforms use +the GeneralIO and GpioInterrupt interface to represent the HPL level +(atm128 for example) and others platforms define their own interface +to capture the entire functionality (msp430, pxa27x for example). + +[TEP117_] states that each platform must provide the general IO pins of +that platform through the *GeneralIO* interface and should do this +though the component *GeneralIOC*. It is however not clear how the +entire set of pins should be provided - this could be in the form of a +list of pins, group of pins, a generic component, etc. + +The pin implementations are usually found in the *pins* sub directory +for a particular MCU (e.g. *msp430/pins* for MSP430 pin +implementation). + +5.2.1 Example MSP430 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The MSP430 implementation builds the platform independent pin +implementation as a stack of components starting with a platform +specific component for each pin. + +:: + + | GeneralIO + +---------------------+ + | Msp430GpioC | + +---------------------+ + | HplMsp430GeneralIO + +---------------------+ + | HplMsp430GeneralIOC | + +---------------------+ + | HplMsp430GeneralIO + +---------------------+ + | HplMsp430GeneralIOP | + +---------------------+ + +At the bottom the component ``HplMsp430GeneralIOP`` provides a general +implementation of one Msp430 pin using the ``HplMsp430GeneralIO`` +interface. The generic component ``HplMsp430GeneralIOP`` is then +instantiated for each pin by ``HplMsp430GeneralIOC``. + +:: + + interface HplMsp430GeneralIO { + async command void set(); + async command void clr(); + async command void toggle(); + async command uint8_t getRaw(); + async command bool get(); + async command void makeInput(); + async command bool isInput(); + async command void makeOutput(); + async command bool isOutput(); + async command void selectModuleFunc(); + async command bool isModuleFunc(); + async command void selectIOFunc(); + async command bool isIOFunc(); + } + +This interface is implemented in the generic component +HplMsp430GeneralIOP (abbreviated): + +:: + + generic module HplMsp430GeneralIOP(uint8_t port_in_addr, ...) { + provides interface HplMsp430GeneralIO as IO; + } implementation { + #define PORTx (*(volatile TYPE_PORT_OUT*)port_out_addr) + + async command void IO.set() { atomic PORTx |= (0x01 << pin); } + async command void IO.clr() { atomic PORTx &= ~(0x01 << pin); } + async command void IO.toggle() { atomic PORTx ^= (0x01 << pin); } + + ... + +These are then instantiated from HplMsp430GeneralIOC (abbreviated): + +:: + + configuration HplMsp430GeneralIOC { + provides interface HplMsp430GeneralIO as Port10; + provides interface HplMsp430GeneralIO as Port11; + ... + } implementation { + components + new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 0) as P10, + new HplMsp430GeneralIOP(P1IN_, P1OUT_, P1DIR_, P1SEL_, 1) as P11, + ... + Port10 = P10; + Port11 = P11; + ... + + +And finally these are transformed from the interface +HplMsp430GeneralIO to the platform independent GeneralIO using the +generic component Msp430GpioC (abbreviated): + +:: + + generic module Msp430GpioC() { + provides interface GeneralIO; + uses interface HplMsp430GeneralIO as HplGeneralIO; + } implementation { + async command void GeneralIO.set() { call HplGeneralIO.set(); } + async command void GeneralIO.clr() { call HplGeneralIO.clr(); } + async command void GeneralIO.toggle() { call HplGeneralIO.toggle(); } + ... + + +5.3 LEDs +-------------------------------------------------------------------- + +Having a few leds on a platform is quite common and TinyOS supports +three leds in a platform independent manner. Three leds are provided +through the *LedsC* component regardless of the amount of leds +available on the platform. The LED implementation is not covered by a +TEP at the time of writing, but the general consensus between most +platforms seems to be to provide access to 3 LEDs through the +component *PlatformLedsC*. This component is then used by *LedC* and +*LedP* (from ``tos/system``) to provide a platform independent Led +interface. + +The PlatformLedsC implementation is found in the platform directory of +each platform (e.g. *tos/platforms/mica2* for mica2). The consensus is +as follows: + +* Each platform provides the component PlatformLedsC + +* PlatformLedsC provides Led0, Led1, Led2 using the GeneralIO + interface. If the platform has less than 3 Leds these are wired to + the component NoPinC + +* PlatformLedsC *uses* the Init interface and usually it wired back to + an initialization in PlatformP - this way when LedC is included in + an application it will be initialized when PlatformP call this + interface + +5.3.1 Example Mica2dot +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + configuration PlatformLedsC + { + provides interface GeneralIO as Led0; + provides interface GeneralIO as Led1; + provides interface GeneralIO as Led2; + uses interface Init; + } + implementation { + components HplAtm128GeneralIOC as IO; + components new NoPinC(); + components PlatformP; + + Init = PlatformP.MoteInit; + + Led0 = IO.PortA2; // Pin A2 = Red LED + Led1 = NoPinC; + Led2 = NoPinC; + } + + + + +5.3.2 LEDs implementation discussion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The Led interface described above is not specified in a TEP, though at +the time of writing most platforms seem to follow this pattern. Not +being covered by a TEP leads to a few uncertainties: + +* *PlatformLedsC* exports leds using the *GeneralIO* interface. The + intention is of course that a led is connected to a pin and this pin + is used to turn the led on. *LedC* uses this assumption to calls the + appropriate *makeOutput* and *set*/*clr* calls. However this might + not be the case - a led could be connected differently making the + semantics of, say *makeOutput* unclear. Furthermore it is assumed + that the set call turns the led on, while the actual pin might have + to be cleared (active low). And what is the semantics of *makeInput* + on a LED? Abstracting these differences into on/off, enable/disable + semantics would clear up the uncertainties. + +* Initializing the Leds is important - the Leds can consume power even + when turned off, if the corresponding pins are configured + inappropriately. Including the LedsC component initializes the Leds + as output when this component is used, if not they must be + initialized elsewhere (e.g. PlatformP). It would seem elegant to + group related code (e.g. one Leds component). + +* The interface does not provide a uniform way of accessing any + additional LEDs other than the 3 found on the Mica motes. While this + is inherently platform specific, having a common consensus would be + useful, say for example exporting an array of Led. In this way a + program requiring say 4 leds could be compiled if 4 leds are available. + + +5.4 Timers +-------------------------------------------------------------------- + +The timer subsystem in TinyOS 2 is described in [TEP102_] the TEP +specifies interfaces at HAL and HIL levels that a platform must adhere +to. The timer does not cover the possible design choices at the HPL +level. The timers defined in this TEP are described in terms of +*width* of the underlying counters (e.g. 8, 16, 32 bit) and in the +tick period or frequency denoted *precision* (e.g. 10 kHz, 1 ms, 1 +us). The timer subsystem is provided through a set of hardware +independent interfaces and a set of recommended configuration modules. +As such some features of a particular device may not be available in a +device independent manner. + +The functionality commonly seen in MCU timer units is often split in 3 +parts: control, timer/counter, capture/compare(trigger). Timer control +in is inherently platform specific and is not covered by a TEP. The +timer [TEP102_] covers timer/counter while capture/compare is covered +by [TEP117_]. From the TEPs it is not clear how capture/compare and +timer/counter relate to each other even though they are likely to +refer to the same time base. The calibration of the system clock is +often connected with the timer system and lives in the timer +directory, but it is not covered in [TEP102_]. + +The timer implementation for a given MCU is placed in the *timer* sub +directory of the directory for a given MCU +(e.g. *tos/chips/avr/timer*). Often clock initialization components +are placed in the same directory, but these are not covered by the +TEPs. + +5.4.1 Timer Layers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +TEP117_ follows the 3 layer architecture and separates the platform +dependent and independent abstractions. It poses not restrictions on +the HPL layer, but provides a suggested HAL layer and requirements at +the HIL level. It defines a set of interfaces and precisions that are +used at the HAL and HIL levels. + +The common features of a timer are separated into a set of interfaces, +corresponding roughly to common features in MCU timer units. The +interfaces covered by the [TEP102_] are (capture from [TEP117_]): + +* **BusyWait** Short synchronous delays +* **Counter** Current time, and overflow events +* **Alarm** Extend Counter with at a given time +* **Timer** 32 bit current time, one shot and periodic events +* **LocalTime** 32 bit current time without overflow +* **GpioCapture** 16 bit time value on an external event (precision unspecified) + +The precisions defined in [TEP117_] are defined as "binary" meaning +1024 parts of a second. Platforms must provide these precisions (if +possible) regardless of the underlying system frequency (i.e. this +could be a power of 10). + +* **TMilli** 1024 Hz (period 0.98 ms) +* **TMicro** 1048576 Hz (period 0.95 us) +* **T32khz** 32.768 kHz (period 30.5 us) + +HPL +******** +The features of the underlying hardware timers are generally exposed +using one or more hardware specific interfaces. Many MCU provide a +rich a set of different timer units varying in timer width, frequency +and features. + +Many MCUs provides features that are quite close to the features +described by the interfaces above. The HPL layer exposes these +features and the layers above utilize the available hardware and +virtualize the features if necessary. + +Consider for example generating events at a specific time. Often a +timer unit has a single counter and a few compare registers that +generate interrupts. The counter and compare registers often translate +relative straightforward to Counter and Alarm interfaces. + +HAL +******** + +Each platform should expose a hardware timer of precision P and width W +as Counter${P}${W}C, Alarm${P}${W}C(). For example an 8 bit, 32.768 kHz +timer should be exposed as Counter32khz8C and Alarm32khz8C + +Alarm/Counters come in pairs and refer to a particular hardware unit, +while there is only one counter there is commonly multiple compare +registers. Alarm is a generic component and each instantiation must +provide an independent alarm allocating more Alarm components than +available compare register should provide a compile time error. + +HIL +********* + +Each platform must expose the following components that provide +specific width and precision that are guaranteed to exist on TEP +compliant platforms. + + * **HilTimerMilliC** A 32 bit Timer interface of TMilli precision + * **BusyWaitMicroC** A BusyWait interface of TMicro precision + + +5.4.2 Timer Implementation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Implementing the timers for TinyOS in short consists of utilizing the +available HW timer features to provide TinyOS style timers +interfaces. In general the approach taken by existing platforms is to +create a set of HPL level timer and control interfaces that export the +available hardware features and adapt these to specific precisions and +widths at the HAL level. However the specific HPL level design choices +differ from platform to platform. + +For example one could export all timers as a simple list, a component +for each timer, a parameterised interface, etc. Similarly for the +control features this could be provided with the timer interfaces or +kept as a separate interface. In the following we will go through a +few examples and point out their differences. + + +5.4.3 Example: ATMega128l +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ATMega128l implementation (atm128) exports the system timers one +component each. Each component provide 4 interfaces - one for each of +the functions of the unit: timer, capture, compare and control. The +timer, capture, and compare interfaces are generic based on the width +(either 8 or 16 bit) while two separate control interfaces are +provided. + +Depicted below is a diagram of how ``HplAtm128Timer1C`` could be stacked +to provide platform independent interfaces (not shown are +``HplAtm128Timer0Async``, ``HplAtm128Timer2``, ``HplAtm128Timer3``): + +:: + + +------------------------------------------------+ + | HplAtm128Timer1C | + +-----+-------------------+-----------------+----+ + HplAtm128Capture| HplAtm128Timer| HplAtm128Compare| + | | | + +----------+---------+ | | + | Atm128GpioCaptureC | | | + +----------+---------+ | | + | +-+-----------------+--+ + GpioCapture| | Atm128AlarmC | + | +----------+-----------+ + | Alarm| + + +The hardware features is exported using 3 interfaces: +``HplAtm128Timer``, ``HplAtm128Compare`` and ``HplAtm128Capture``. + +:: + + interface HplAtm128Timer + { + async command timer_size get(); + async command void set( timer_size t ); + async event void overflow(); + async command void reset(); + async command void start(); + ... + + interface HplAtm128Compare + { + async command size_type get(); + async command void set(size_type t); + async event void fired(); // + { + async command size_type get(); + async command void set(size_type t); + async event void captured(size_type t); + async command void reset(); + + +In addition to the timer related interfaces two control interfaces are + provided: 'HplAtm128TimerCtrl16' and 'HplAtm128TimerCtrl8' (below). + +:: + + #include + + interface HplAtm128TimerCtrl8 + { + /// Timer control register: Direct access + async command Atm128TimerControl_t getControl(); + async command void setControl( Atm128TimerControl_t control ); + + /// Interrupt mask register: Direct access + async command Atm128_TIMSK_t getInterruptMask(); + async command void setInterruptMask( Atm128_TIMSK_t mask); + + /// Interrupt flag register: Direct access + async command Atm128_TIFR_t getInterruptFlag(); + async command void setInterruptFlag( Atm128_TIFR_t flags ); + } + + +Each of the hardware timers are exported in one component for example +'HplAtm128Timer1P': + +:: + + #include + + module HplAtm128Timer1P + { + provides { + // 16-bit Timers + interface HplAtm128Timer as Timer; + interface HplAtm128TimerCtrl16 as TimerCtrl; + interface HplAtm128Capture as Capture; + interface HplAtm128Compare as CompareA; + interface HplAtm128Compare as CompareB; + interface HplAtm128Compare as CompareC; + } + uses interface HplAtm128TimerCtrl8 as Timer0Ctrl; + } + implementation + { + //=== Read the current timer value. =================================== + async command uint16_t Timer.get() { return TCNT1; } + + //=== Set/clear the current timer value. ============================== + async command void Timer.set(uint16_t t) { TCNT1 = t; } + ... + + +5.4.4 Example: MSP430 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The MSP430 features two very similar (but not identical) timers. Both +timers are provided through the same interfaces in a way similar to +ATMega128l: 'Msp430Timer', 'Msp430Capture' 'Msp430Compare', +'Msp430TimerControl'. All timer interfaces (for both timers) are +accessed through the component Msp430TimerC. + +The ``Msp430TimerControl`` is show below. It is slightly different +than the ATMega equivalent - notice that 'setControl' accepts a struct +with configuration parameters instead of setting these with a command +each. + +:: + + #include "Msp430Timer.h" + + interface Msp430TimerControl + { + async command msp430_compare_control_t getControl(); + async command bool isInterruptPending(); + async command void clearPendingInterrupt(); + + async command void setControl(msp430_compare_control_t control ); + async command void setControlAsCompare(); + async command void setControlAsCapture(bool low_to_high); + + async command void enableEvents(); + async command void disableEvents(); + async command bool areEventsEnabled(); + } + +Each timer is implemented through the generic component 'Msp430TimerP' +that is instantiated for each timer in 'Msp430TimerC': + +:: + + configuration Msp430TimerC + { + provides interface Msp430Timer as TimerA; + provides interface Msp430TimerControl as ControlA0; + provides interface Msp430TimerControl as ControlA1; + provides interface Msp430TimerControl as ControlA2; + provides interface Msp430Compare as CompareA0; + provides interface Msp430Compare as CompareA1; + provides interface Msp430Compare as CompareA2; + provides interface Msp430Capture as CaptureA0; + provides interface Msp430Capture as CaptureA1; + provides interface Msp430Capture as CaptureA2; + ... + } + implementation + { + components new Msp430TimerP( TAIV_, TAR_, TACTL_, TAIFG, TACLR, TAIE, + TASSEL0, TASSEL1, FALSE ) as Msp430TimerA + , new Msp430TimerP( TBIV_, TBR_, TBCTL_, TBIFG, TBCLR, TBIE, + TBSSEL0, TBSSEL1, TRUE ) as Msp430TimerB + , new Msp430TimerCapComP( TACCTL0_, TACCR0_ ) as Msp430TimerA0 + , new Msp430TimerCapComP( TACCTL1_, TACCR1_ ) as Msp430TimerA1 + , new Msp430TimerCapComP( TACCTL2_, TACCR2_ ) as Msp430TimerA2 + ... + + +5.4.5 Example: PXA27x +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The PXA27x (XScale) platform provides a component for each of the +timers classes on the system. Each component provides a few interfaces +that exposes all features of that unit. Each interface combines timer +and control interface features. For example 'HplPXA27xOSTimerC' +provides 12 instances of the 'HplPXA27xOSTimer' interface and one +instace 'HplPXA27xOSTimerWatchdog'. Similarly for 'HplPXA27xSleep' and +'HplPXA27xWatchdog'. + + +:: + + interface HplPXA27xOSTimer + { + async command void setOSCR(uint32_t val); + async command uint32_t getOSCR(); + ... + + + async event void fired(); + } + +All the OS timers are exported through HplPXA27xOSTimerC + +:: + + configuration HplPXA27xOSTimerC { + + provides { + interface Init; + interface HplPXA27xOSTimer as OST0; + interface HplPXA27xOSTimer as OST0M1; + interface HplPXA27xOSTimer as OST0M2; + interface HplPXA27xOSTimer as OST0M3; + ... + implementation { + components HplPXA27xOSTimerM, HplPXA27xInterruptM; + + Init = HplPXA27xOSTimerM; + + OST0 = HplPXA27xOSTimerM.PXA27xOST[0]; + OST0M1 = HplPXA27xOSTimerM.PXA27xOST[1]; + OST0M2 = HplPXA27xOSTimerM.PXA27xOST[2]; + OST0M3 = HplPXA27xOSTimerM.PXA27xOST[3]; + ... + +These interfaces are further abstracted through 'HalPXA27xOSTimerMapC' +as a parameterised interface: + +:: + + configuration HalPXA27xOSTimerMapC { + provides { + interface Init; + interface HplPXA27xOSTimer as OSTChnl[uint8_t id]; + } + } implementation { + components HplPXA27xOSTimerC; + + Init = HplPXA27xOSTimerC; + + OSTChnl[0] = HplPXA27xOSTimerC.OST4; + OSTChnl[1] = HplPXA27xOSTimerC.OST5; + OSTChnl[2] = HplPXA27xOSTimerC.OST6; + ... + + +5.4.6 Timer Discussion +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +While the TEP is clear on many points there are few that are left up +to the implementer. The relation between timers and capture events is +unclear and covered in two TEPs. Capture refers to timers[TEP102_] but +the reverse is not clear[TEP102_]. This has a few implications for the +timer/capture relationship: + +* Many devices feature multiple timers of the same width and + precision. It is not clear how this is provided. In particular how + this relates to a capture event - e.g. how does a capture event from + timer 2 relate to a time value from timer 1. Presumably TinyOS has + one system time based on a single timer which is used by all timer + capture interfaces and visualized if necessary. + +* The interfaces provide a an elegant way to expand a 16 bit timer to + a 32 bit interface. However this is not the case for capture events. + + + +5.5 I/O buses (UART, SPI, I2C) +-------------------------------------------------------------------- + +Most modern microprocessors provide a selection of standard I/O bus +units such as serial (UART or USART), I2C, SPI, etc. The drivers for +the available buses are usually put in a sub directory for the MCU +(e.g. *chip/atm128/spi* for SPI on ATMega128l). + +There are a few TEP that cover different buses in TinyOS, and low +level serial communication: + +* TEP113_ Serial Communication: Serial +* TEP117_ Low-Level I/O: Serial, SPI, I2C + +On some hardware platforms a single I/O unit is shared among a number +of buses. The MSP430 for example implements SPI, I2C and USART in a +single USART unit that can only operate in one mode at a time. In such +cases the single hardware unit must be shared among the drivers. + +5.5.1 Serial Communication +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Serial communication in TinyOS 2.x is implemented as a serial +communications stack with a UART or USART at the bottom. The bottom +layer is covered in [TEP113_] and [TEP117_]. TEP117 states that each +platform must provide access to a serial port through the +'SerialByteComm' interface from the component UartC. However UartC is +not provided by any platforms at the time of writing. There seems to +be a consensus to build the component 'PlatformSerialC' providing the +'UartStream' and 'StdControl' interfaces. Either component will be +placed in the platform directory (e.g. *tos/platforms/mica2* for +mica2). The serial stack is built upon 'PlatformSerialC' and this +component will be required to take advantage of the serial stack. + +[TEP117_] defines 'UartStream' and 'UartByte' to access the a UART +multiple bytes at a time and one byte at a time (synchronously), while +[TEP113_] defines 'UartByte' to send and receive one byte at a time +(asynchronously). + +5.5.2 I2C, SPI +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +SPI and I2C buses are provided through straightforward interfaces that +match the functionality of the buses closely. + +SpiByte, SpiPacket +****************** +:: + + interface SpiByte { + async command uint8_t write( uint8_t tx ); + } + +:: + + interface SpiPacket { + async command error_t send( uint8_t* txBuf, uint8_t* rxBuf, uint16_t len ); + async event void sendDone( uint8_t* txBuf, uint8_t* rxBuf, uint16_t len, + error_t error ); + } + +I2CPacket +********* +:: + + interface I2CPacket { + async command error_t read(i2c_flags_t flags, uint16_t addr, + uint8_t length, uint8_t* data); + async command error_t write(i2c_flags_t flags, uint16_t addr, + uint8_t length, uint8_t* data); + async event void readDone(error_t error, uint16_t addr, + uint8_t length, uint8_t* data); + async event void writeDone(error_t error, uint16_t addr, + uint8_t length, uint8_t* data); + } + +5.5.3 Example +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +..ATMega128 + -> does not provide SerialByteComm + +..MSP430 + -> Uart1C provides SerialByteComm along with Init and StdControl + -> sender det meste videre til Msp430Uart1C (som mangler Init!?!?) + Msp430Uart0C + -> SerialByteComm, Msp430UartControl, Msp430UartConfigure, Resurce + -> Sender videre til Msp430Uart1P & Msp430Usart1C + -> Sender videre til HplMsp430Usart1C->HplMsp430Usart1P + +..PXA27 + Parametriseret m. HplPXA27xUARTP (Init && HplPXA27xUART) + -> init sætter en masse registre og enabler interrupt + HalPXA27xSerialP: HplPXA27xUART, Init, noget DMA noget + + +6. Authors +==================================================================== + +| Martin Leoold +| University of Copenhagen, Dept. of Computer Science +| Universitetsparken 1 +| DK-2100 København Ø +| Denmark +| +| Phone +45 3532 1464 +| +| email - leopold@diku.dk + + +7. Citations +==================================================================== +.. [TEP1] TEP 1: TEP Structure and Keywords + + +.. [TEP2] TEP 2: Hardware Abstraction Architecture + + +.. [TEP3] TEP 3: Coding Standard + + +.. [TEP102] TEP 102: Timers + + +.. [TEP106] TEP 106: Schedulers and Tasks + + +.. [TEP107] TEP 107: TinyOS 2.x Boot Sequence + + +.. [TEP109] TEP 109: Sensors and Sensor Boards + + +.. [TEP111] TEP 111: message_t + + +.. [TEP113] TEP 113: Serial Communication + + +.. [TEP117] TEP 117: Low-Level I/O + + +.. [TEP121] TEP 121: Towards TinyOS for 8051 + + +.. [TOSPRG] Philip Levis: TinyOS Programming + + +.. [tos2.0view] Philip Levis. "TinyOS 2.0 Overview" *Feb 8 2006* + + +.. [nescman] David Gay, Philip Levis, David Culler, Eric Brewer. "NesC 1.2 Language Reference Manual" *August 2005* + +.. [TUT10] TinyOS 2 Tutorial Lesson 10 + + + LocalWords: TinyOS TEP TEPs nesC -- 2.39.2