64 lines
2.7 KiB
Plaintext
64 lines
2.7 KiB
Plaintext
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.
|