You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.7 KiB
63 lines
2.7 KiB
Pinephone keyboard firmware |
|
--------------------------- |
|
|
|
Current firmware implementation relies on polling the key matrix |
|
once every 20ms. |
|
|
|
The controller has ability to detect change on |
|
the row input port, so it is possible to ground all column GPIOs |
|
enable pull-ups on row GPIOs, and wait on change on the row GPIOs. |
|
|
|
This only works when no key is pressed, otherwise one pressed |
|
key would mask changes in the state of other keys on the same row. |
|
This is good to achieve large power savings by not polling when |
|
we detect that no keys are pressed, which is the normal state |
|
of all keys. |
|
|
|
Firmware thus switches between two modes of operation: |
|
|
|
- idle - when no keys are pressed, columns are grouded, rows are pulled up |
|
and the controller only reacts on the change in the row GPIOs |
|
- when the change is detected, it switches to active mode |
|
- active - when a key is pressed, the firmware performs periodic |
|
full scans of the keyboard matrix, to determine what keys |
|
are actually pressed |
|
- when no keys are pressed anymore it switches to idle mode |
|
|
|
It is possible to power down the CPU and all peripherals in idle mode |
|
via PCON.PD bit and only wait to be woken up by GPIO change interrupt. |
|
(or I2C interrupt) |
|
|
|
My prototype keyboard has Z key always pressed due to some HW bug, |
|
so this method of switching to idle mode and powering down the |
|
controller will not work on my keyboard. The firmware implements |
|
in this case a always active polling mode. |
|
|
|
|
|
Observations |
|
------------ |
|
|
|
- Power consumption in polled mode is about 20mW. |
|
- I2C interrupts don't always wake from power down. (maybe the wakeup |
|
only works on the I2C address match condition, as stated in the manual |
|
so we need to ensure that the controller is not put back to powerdown |
|
mode, until the I2C transaction finishes) |
|
|
|
|
|
How to flash the firmware |
|
------------------------- |
|
|
|
- If you have original firmware, it's enough to just run the flashing tool. |
|
- If you have this firmware, you can enter flashing mode by pressing |
|
FN + PINE + F |
|
- If you have broken firmware, you need to short P90 (7th test pad from the left) |
|
to GND and power cycle the keyboard controller. |
|
- Power cycling requires powering down the connected pinehone and maybe |
|
ensuring VOUT is disabled on the kb charger (can be done via I2C, |
|
or by pressing the charger key) |
|
- You need to keep P90 shorted until the flashing is complete. |
|
- You can insert the flasing USB cable safely even with 5V/VBUS wire |
|
connected regardless of whether the charger's VOUT is enabled or not. |
|
- Flashing tool is configured by modifying the source code for now. |
|
If your firmware grows, don't forget to increase the flashing area |
|
size. Currently it's set to 0x2000 - 0x2600.
|
|
|