| # 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 it’s | |
| 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 |