blob: 180740ae73b7399bc82f51aa39ec0ce207484bc5 [file] [log] [blame]
Manufacturing Support
=====================
.. toctree::
:hidden:
Description
~~~~~~~~~~~
An mfgimage is a binary that gets written to a Mynewt device at
manufacturing time. Unlike a Mynewt target which corresponds to a
single executable image, an mfgimage represents the entire contents
of a flash device.
Definitions
~~~~~~~~~~~
============= ============================ =======
Term Long Name Meaning
============= ============================ =======
Flashdev Flash device A single piece of flash hardware. A typical device might contain two flashdevs: 1) internal flash, and 2) external SPI flash.
Mfgimage Manufacturing image A file with the entire contents of a single flashdev. At manufacturing time, a separate mfgimage is written to each of the device's flashdevs.
Boot Mfgimage Boot manufacturing image The mfgimage containing the boot loader; always written to internal flash.
MMR Manufacturing Meta Region A chunk of read-only data included in every mfgimage. Contains identifying information for the mfgimage and other data that stays with the device until end of life.
TLV Type Length Value A simple extensible means of representing data. Contains three fields: 1) type of data, 2) length of data, and 3) the data itself.
MfgID Manufacturing ID Identifies which set of mfgimages a device was built with. Expressed as a list of SHA256 hashes.
============= ============================ =======
Details
~~~~~~~
Typically, an mfgimage consists of:
* 1 boot loader.
* 1 or 2 Mynewt images.
* Extra configuration (e.g., a pre-populated ``sys/config`` region).
In addition, each mfgimage contains a manufacturing meta region (MMR).
The MMR consists of read-only data that resides in flash for the
lifetime of the device. There is currently support for three MMR TLV
types:
* Hash of mfgimage
* Flash map
* Device / offset of next MMR
The manufacturing hash indicates which manufacuturing image a device
was built with. A management system may need this information to
determine which images a device can be upgraded to, for example. A
Mynewt device exposes its manufacturing hash via the ``id/mfghash``
config setting.
Since MMRs are not intended to be modified or erased, they must be placed in
unmodifiable areas of flash. In the boot mfgimage, the MMR *must* be placed in
the flash area containing the boot loader. For non-boot mfgimages, the MMR can go in any unused area in the relevant flashdev.
Manufacturing ID
~~~~~~~~~~~~~~~~
Each mfgimage has its own MMR containing a hash.
The MMR at the end of the boot mfgimage ("boot MMR") must be present. The boot
MMR indicates the flash locations of other MMRs via the ``mmr_ref`` TLV type.
At startup, the firmware reads the boot MMR. Next, it reads
any additional MMRs indicated by ``mmr_ref`` TLVs. An ``mmr_ref`` TLV contains
one field: The ID of the flash area where the next MMR is located.
After all MMRs have been read, the firmware populates the ``id/mfghash``
setting with a colon-separated list of hashes. By reading and parsing
this setting, a client can derive the full list of mfgimages that the
device was built with.
One important implication is that MMR areas should never be moved in a BSP's
flash map. Such a change would produce firmware that is incompatible with
older devices.
MMR Structure
~~~~~~~~~~~~~
An MMR is always located at the end its flash area. Any other placement is invalid.
An MMR has the following structure:
::
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TLV type | TLV size | TLV data ("TLV size" bytes) ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ~
~ ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TLV type | TLV size | TLV data ("TLV size" bytes) ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ~
~ ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Region size | Version | 0xff padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic (0x3bb2a269) |
+-+-+-+-+-+--+-+-+-+-+-+end of flash area-+-+-+-+-+-+-+-+-+-+-+-+
The number of TLVs is variable; two are shown above for illustrative
purposes.
**Fields:**
*<TLVs>*
1. TLV type: Indicates the type of data to follow.
2. TLV size: The number of bytes of data to follow.
3. TLV data: "TLV size" bytes of data.
*<Footer>*
4. Region size: The size, in bytes, of the entire manufacturing meta region; includes TLVs and footer.
5. Version: Manufacturing meta version number; always 0x02.
6. Magic: Indicates the presence of the manufacturing meta region.
API
---
.. doxygenfile:: sys/mfg/include/mfg/mfg.h