blob: 0e095bf9fee592afb52efb431472a49ce465ea8e [file] [log] [blame] [view]
# ChromeOS Fingerprint Sensor: Quick Factory Guide
The goal of this document is to outline how ODM partners can make use of the
existing ChromeOS factory scripts to meet ChromeOS FPS factory requirements.
[TOC]
## Factory Requirements
### Flash firmware for fingerprint sensor microcontroller (FPMCU)
FPMCU firmware must be flashed before fingerprint functional test is run. ODM
partners may work with the module house to preflash FPMCU firmware before
factory SMT. However, this way ODM partners have to coordinate with the module
house to make sure the preflash FPMCU firmware blob is extracted from the FSI
release image (from `/opt/google/biod/fw/`). If the FPMCU firmware doesnt match
the FPMCU firmware blob checked into the release image, the end users will see
the critical update screen in their out-of-box experience, because
`bio_fw_updater` tries to update FPMCU firmware at boot time. This is a bad user
experience we want to avoid. Most importantly, in PVT/MP build, only the FPMCU
firmware in the release image would be signed by MP key. So you **MUST** ensure
FPMCU is flashed with the MP-signed firmware blob extracted from FSI, before
shipping the devices.
As opposed to pre-flashing FPMCU in the module house, ODM partners are
encouraged to make use of [`update_fpmcu_firmware.py`] to update FPMCU firmware
in the factory flow. This script can detect fingerprint MCU board name, find the
right FPMCU firmware blob for the DUT from the release partition, and then flash
FPMCU by [`flash_fp_mcu`] tool. Please note that this script may take more than
30 secs to complete, which is slow.
Since `bio_fw_updater` has been disabled in factory test image via
[crrev/c/1913645](https://chromium-review.googlesource.com/c/chromiumos/platform2/+/1913645),
in the factory flow, the FPMCU firmware should not be overwritten by
`boot-update-firmware` service during reboot.
### Run fingerprint sensor functional test
Please add [`fingerprint_mcu.py`] to your device test list. A more detailed
description about this test can be found [here][factory requirements].
### Initialize FPMCU entropy in factory finalization
The support for FPMCU entropy initialization has been integrated into the
factory finalization script. So FPMCU entropy should be automatically
initialized in factory finalization, if a FPMCU is found on DUT. Note that FPMCU
entropy initialization would fail if `rollback_block_id` is not equal to zero,
which means the entropy has been initialized before. It is usually caused by
biod trying to initialize FPMCU entropy and increment `rollback_block_id` at
boot time. Since we have disabled biod and `bio_crypto_init` in factory test
image via
[crrev/c/1910290](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1910290),
we expect `rollback_block_id` would stay zero during the factory flow, and FPMCU
entropy initialization should succeed in factory finalization. So just run
factory finalization as any other CrOS boards.
### Enable FPMCU software write protection (SWWP) in factory finalization in PVT/MP
The support for FPMCU SWWP has been integrated into factory finalization script.
So FPMCU SWWP should be automatically enabled in factory finalization together
with AP/EC SWWP when `write_protection` arg is set to `true` and a FPMCU is
found on DUT. Just run factory finalization as any other CrOS boards.
### Reset entropy for factory re-finalization (in case of RMA or OQC)
For the boards that have been finalized, FPMCU entropy has been initialized. So
running re-finalization for those boards are expected to fail at FPMCU entropy
initialization. Before running re-finalization for those boards, ODM partners
have to remove hardware write protection (HWWP) and then run
[`update_fpmcu_firmware.py`] to reset `rollback_block_id` and entropy. So the
follow-up re-finalization (which re-initialize entropy) can succeed.
## References
* CrOS fingerprint factory requirements: [doc link][factory requirements]
* The summary of CLs:
* Add a factory script to update FPMCU firmware:
[crrev/c/1918679](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1918679),
[crrev/c/1913493](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1913493),
[crrev/c/1927149](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1927149),
[crrev/c/1984618](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1984618),
[crrev/c/2036574](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/2036574)
* Disable FPS-related services that will interfere with the factory flow:
[crrev/c/1913645](https://chromium-review.googlesource.com/c/chromiumos/platform2/+/1913645),
[crrev/c/1910290](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1910290)
* Support FPMCU in factory finalization:
[crrev/c/1868795](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1868795),
[crrev/c/1902267](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1902267),
[crrev/c/1900503](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1900503),
[crrev/c/1925927](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1925927),
[crrev/c/1948163](https://chromium-review.googlesource.com/c/chromiumos/platform/factory/+/1948163)
[`update_fpmcu_firmware.py`]: https://crsrc.org/o/src/platform/factory/py/test/pytests/update_fpmcu_firmware.py;drc=672e24bb3e2dd0dec7578dcd4c52805d022662d1
[factory requirements]: ./fingerprint-factory-requirements.md
[`fingerprint_mcu.py`]: https://crsrc.org/o/src/platform/factory/py/test/pytests/fingerprint_mcu.py;drc=672e24bb3e2dd0dec7578dcd4c52805d022662d1
[`flash_fp_mcu`]: https://crsrc.org/o/src/platform/ec/util/flash_fp_mcu;drc=12c473337e3bdcce6d180d266c9e9f8127448f33
OSZAR »