blob: 371b9be48c13d33c335cfa2a88d4557f6d360d42 [file] [log] [blame] [view] [edit]
# Running detachable base fw tests
FAFT is currently not supported for detachable base tests because it does not
support two ECs on the same device.
[Tracking bug](https://issuetracker.google.com/36075961). Because of this,
the firmware tests for detachable bases were written as scripts that need to be
manually run on the DUT. Setting up and running the tests takes approximately
1-2 hours and keyboard EC firmware updates are fairly infrequent
(once a year on average pre-FSI, and ~once post-FSI).
[TOC]
# Prepare Host and DUT
Tests already come installed in the DUT ChromeOS test image at
`/usr/local/bin/hammertests`. Before you start, ensure that the test folder
exists in the test image.
A list of current devices with detachable base mappings is as follows:
| Device |Detachable keyboard |
|----------------------|-------------------------------|
|Poppy |Hammer
|Soraka |Staff
|Nocturne |Whiskers
|Krane |Masterball
|Kodama |Magnemite
|Kakadu |Moonball
|Katsu |Don
|CoachZ |Zed
|Homestar |Star
|Wormdingler |Eel
|Quackingstick |Duck
|Starmie |Jewel
## On Host
1. Create a [chroot](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#Create-a-chroot)
from [ToT checkout](https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md#Get-the-source-code).
2. Obtain the images that will be used in the tests. Obtain the base ec image
from GoldenEye/ BCS/ APFE.
[Usually the dev will have supplied the image in the testing request bug or
indicated where to download it from, because these tests are typically run
before RO is locked in the firmware branch].
3. Select build # you want to test.
4. Select board name.
5. Download the `firmware_from_source.tar` file and unzip via
`mkdir -p firmware_from_source && tar xvf firmware_from_source.tar -C firmware_from_source`.
6. Export a variable `BASE_KB_BOARD` to specify the base keyboard board you
want to run during the test. For example, `export BASE_KB_BOARD=hammer`.
7. Copy the `firmware_from_source/${BASE_KB_BOARD}/ec.bin` into the chroot
created in step 1. You can rename this file if you wish to indicate that its
base firmware, e.g., `${BASE_KB_BOARD}_ec.bin`.
8. Flash the keyboard EC with the image obtained in step 2, following the steps
in this [document](https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/docs/hammer.md#Flash-EC)
9. Generate the images needed for tests, from the base ec image obtained in
step 5 following the steps below:
a. **Inside chroot**: Run the shell script
[gen_test_images.sh](https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/server/cros/faft/gen_test_images.sh) that generates the necessary
images, supplying ec.bin as the first argument for the BOARD name
(where board is the name of the detachable base) and the IMAGE name as
the second argument:
~/chromiumos/src/third_party/autotest/files/server/cros/faft/gen_test_images.sh "${BASE_KB_BOARD}" "${BASE_KB_BOARD}_ec.bin"
**The above script needs to run inside chroot of the DUT host**
*For devices without fingerprint sensor, if you see error message like `Unable to open
/mnt/host/source/src/third_party/autotest/files/server/cros/faft/fingerprint_dev_keys/${BASE_KB_BOARD}/dev_key.pem`,
please create a placeholder for that folder and file, a symlink from any existing key to the missing path manually is ok.*
Ensure that the ec.bin image used above is the same image running on the
base ec of the DUT. If they are different, RW verification will fail
during testing.
You should then see the following 17 images created:
1. EC_RW.bin
2. ${BASE_KB_BOARD}_corrupt_first_byte.bin
3. ${BASE_KB_BOARD}.dev.hex
4. ${BASE_KB_BOARD}.dev.rb9
5. key.vbprik2
6. ${BASE_KB_BOARD}_corrupt_first_byte.bin.hex
7. ${BASE_KB_BOARD}.dev.rb0
8. ${BASE_KB_BOARD}.dev.rb9.hex
9. key.vbpubk2
10. ${BASE_KB_BOARD}_corrupt_last_byte.bin
11. ${BASE_KB_BOARD}.dev.rb0.hex
12. ${BASE_KB_BOARD}.bin
13. ${BASE_KB_BOARD}_corrupt_last_byte.bin.hex
14. ${BASE_KB_BOARD}.dev.rb1
15. ${BASE_KB_BOARD}.bin.hex
16. ${BASE_KB_BOARD}.dev
17. ${BASE_KB_BOARD}.dev.rb1.hex
There is one image file that must be **manually** included in the images
folder. For first-time firmware qualification e.g. of a new keyboard,
include a copy of the firmware and name it `${BASE_KB_BOARD}_older.bin`.
For revised firmware qualifications i.e. qualifying new version of
RO/RW but not the first RO/RW, include an image of the older firmware
and also name it `${BASE_KB_BOARD}_older.bin`. The image
`${BASE_KB_BOARD}_older.bin` is used to test that RW updates can happen with
the new firmware. In the case of first time firmware, the tests still
check that RW region is updatable even though the older image is the
same as the newer image.
b. Copy the new images folder in your chroot into the DUT from the host
via ssh (ensure ssh test keys are added to the shell window first):
scp -r images root@dut.ip.address:/usr/local/bin/hammertests
## On DUT
Flash the DUT with a test ChromeOS image. The test image already has the base
tests in the folder `/usr/local/bin/hammertests`, You should see the
following tests.
1. flash_wrong_address.py
2. rb_protection.py
3. rb_rw_protected.py
4. ro_boot_valid_rw.py
5. ro_stay_ro.py
6. ro_update_rw.py
7. rw_no_update_ro.py
8. transfer_touchpad_works.py
9. verify_pairing.py
You should also see the following control files
1. hammertests_control.py
2. hammertests_control_rb.py
3. hammertests_control_tp.py
# Test Execution
To run the tests, simply run each of the **control files** in the DUT from the
`/usr/local/bin/hammertests` directory. You can do this directly on the DUT or
ssh via the host. E.g.
./hammertests_control.py
Each control file runs a number of tests, and creates log folders corresponding
to each of the tests outlined above. Some tests have several iterations.
| Control file |Tests executed |
|----------------------|-------------------------------|
|hammertests_control.py|flash_wrong_address.py
| |rb_rw_protected.py
| |ro_boot_valid_rw.py
| |ro_stay_ro.py
| |ro_update_rw.py
| |rw_no_update_ro.py
| |verify_pairing.py
Image that should be flashed on DUT for hammertests_control.py:
`$BASE_NAME_ec.bin` *(locked)*.
This **locked** image should be supplied by the dev who requests the testing and
attached in the testing request bug.
| Control file |Tests executed |
|-------------------------|--------------------|
|hammertests_control_rb.py|rb_protection.py
Image that should be flashed on DUT for hammertests_control_rb.py:
`${BASE_KB_BOARD}.dev.rb1` *(rollback version = 1)*.
| Control file |Tests executed |
|-------------------------|---------------------------|
|hammertests_control_tp.py|transfer_touchpad_works.py
Image that should be flashed on DUT for hammertests_control_tp.py:
`$BASE_NAME_ec.bin` *(unlocked)*.
This **unlocked** image should be supplied by the dev who requests the testing
and attached in the testing request bug.
After running all the tests, **attach the log files** to the request bug.
# Manual Tests
## RO cannot update RW with dev signed image:
- Flash the image `${BASE_KB_BOARD}.dev` generated by ./gen_test_images.sh and verify on
the ec console that RW update fails due to failed signature verification.
## Keyboard
- Run command `evtest` on DUT and check that each key works.
- (Vivaldi keyboard only) Check that function key works in Chrome.
Use a web page like
[keyboard event viewer](https://w3c.github.io/uievents/tools/key-event-viewer.html)
to verify that Chrome can detect F1~F10 by pressing search + top row keys.
### Keyboard backlight works
- Can control backlight using:
echo $VALUE > /sys/class/leds/hammer::kbd_backlight/brightness
- Or via powerd:
backlight_dbus_tool --increase_keyboard
Keyboard backlight not advertised on SKUs where backlight not available
Implemented here: https://issuetracker.google.com/67722756.
TODO(drinkcat): give system path to keyboard backlight to distinguish devices
that have backlight support from those that don't
## Touchpad
### Touchpad works
Needed:
- Base running RW version b under test with touchpad FW v2
Steps:
- Manual testing
- Check that touchpad works
- 1 to 5 finger swipes
- Click using touchpad works
### I2C passthrough interface does not work
(to be active only when WP is off, for Elan usage)
- WP on, cannot update the touchpad FW over I2C
ec_touchpad_updater -f FW_IMAGE
- WP off (through servo or physically remove the screw), can update the
touchpad FW over I2C:
ec_touchpad_updater -f FW_IMAGE
## Touchpad dimensions are correct
No errors of this kind in EC console:
[1.430530 reset rv 0 buf=0000]
[1.432640 max=3206/1832 width=124/124 adj=0 dpi=800/800]
*[1.432948 *** TP mismatch!]*
[1.433585 elan_tp_init:0]
See https://issuetracker.google.com/67982128 for example.
We only really need to test for version update when we release new TP firmware