No description
Find a file
2021-09-09 16:57:11 +02:00
lv_drivers@8860f0dd5e Update submodules 2021-09-09 14:10:38 +02:00
lvgl@9fc0c3cf98 Update submodules 2021-09-09 16:57:11 +02:00
unsqu33kr Split auto-generated layouts into dedicated file 2021-09-09 14:07:50 +02:00
.gitignore Initial import 2021-09-02 20:08:45 +02:00
.gitmodules Initial import 2021-09-02 20:08:45 +02:00
COPYING Initial import 2021-09-02 20:08:45 +02:00
FontAwesome5-Solid+Brands+Regular.woff Add fonts and command for converting them 2021-09-08 12:22:10 +02:00
generate-keymaps.sh Split auto-generated layouts into dedicated file 2021-09-09 14:07:50 +02:00
layouts.c Split auto-generated layouts into dedicated file 2021-09-09 14:07:50 +02:00
layouts.h Split auto-generated layouts into dedicated file 2021-09-09 14:07:50 +02:00
libinput_multi.c Add support for full keyboards 2021-09-04 15:30:58 +02:00
libinput_multi.h Add support for full keyboards 2021-09-04 15:30:58 +02:00
libinput_xkb.c Add support for full keyboards 2021-09-04 15:30:58 +02:00
libinput_xkb.h Add support for full keyboards 2021-09-04 15:30:58 +02:00
lv_conf.h Disable building examples and add upstream PR 2021-09-03 10:54:03 +02:00
lv_drv_conf.h Add support for full keyboards 2021-09-04 15:30:58 +02:00
main.c Replace device discovery with upstreamed code 2021-09-09 14:19:10 +02:00
Makefile Replace device discovery with upstreamed code 2021-09-09 14:19:10 +02:00
Montserrat-Regular.ttf Add fonts and command for converting them 2021-09-08 12:22:10 +02:00
montserrat_extended_32.c Add missing punctuation characters 2021-09-09 08:42:14 +02:00
README.md Update PR status 2021-09-09 16:56:21 +02:00
uskr_layouts.c Split auto-generated layouts into dedicated file 2021-09-09 14:07:50 +02:00
uskr_layouts.h Split auto-generated layouts into dedicated file 2021-09-09 14:07:50 +02:00

Unl0kr

Proof-of-concept framebuffer-based disk unlocker for the initramfs based on lvgl.

Disclaimer: Doesn't actually unlock anything 😜

About

This is an experiment that attempts to evaluate the fitness of lvgl to build a graphical user interface on the Linux framebuffer for unlocking encrypted hard drives during boot. It's neither functional nor meant to replace postmarketOS/osk-sdl. For background see postmarketOS/osk-sdl#121.

Status

The biggest obstacle is input processing. lv_drivers provides an evdev interface (supporting touchscreens, pointer devices and keypads) and a libinput interface (supporting touchscreens only). Presently there is no support for full physical keyboards (short of using the SDL interface) and no automated device detection. Additonally, the drivers can currently not be used with multiple devices at the same time.

What works

  • Password-entry UI including on-screen keyboard on the framebuffer
  • Input device discovery for keyboards, mice and trackpads
  • On-screen keyboard control via one or more mouse / trackpad (including cursor)
  • On-screen keyboard control via one or more hardware keyboard (including support for multiple layouts using XKB)
    • Works great on my laptop keyboard but occasionally drops keys on my Ergodox EZ)
  • On-screen keyboard control via touchscreen (tested on PinePhone)
  • Switching on-screen keyboard layout at runtime (layouts still to be refined, currently based on squeekboard subset)
  • Switching between light and dark theme at runtime
  • Disclosing and hiding entered password at runtime
  • Powering off via soft button
  • Toggling on-screen keyboard via soft button

To do

... everything else ...

Upstreaming

As far as feasible and sensible, lvgl and lv_drivers fixes and enhancements are being upstreamed. Ideally all code outside of main.c should be contributed back but I'm not yet sure if that will be possible.

Upstreamed contributions so far:

lvgl

lv_drivers

Development

Dependencies

Building & running

For development and testing you can run the app in a VT. sudo is needed to access input device files.

$ make
$ sudo chvt 2
$ sudo ./unl0kr

Changing fonts

Fonts need to be converted to C arrays before they can be used with lvgl. This is most conveniently done using the official online font converter. Useful unicode ranges for the conversion are 0x0020-0x007F (basic Latin), 0x00A0-0x00FF (Latin-1 supplement), 0x0100-0x017F (Latin extended A), 0x2000-0x206F (general punctuation) and 0x20A0-0x20CF (currency symbols). For the various LV_SYMBOL_... glyphs, make sure to also add Font Awesome with the following code points:

0xF001, 0xF008, 0xF00B, 0xF00C, 0xF00D, 0xF011, 0xF013, 0xF015, 0xF019, 0xF01C, 0xF021, 0xF026, 0xF027, 0xF028, 0xF03E, 0xF0E0, 0xF304, 0xF043, 0xF048, 0xF04B, 0xF04C, 0xF04D, 0xF051, 0xF052, 0xF053, 0xF054, 0xF067, 0xF068, 0xF06E, 0xF070, 0xF071, 0xF074, 0xF077, 0xF078, 0xF079, 0xF07B, 0xF093, 0xF095, 0xF0C4, 0xF0C5, 0xF0C7, 0xF0C9, 0xF0E7, 0xF0EA, 0xF0F3, 0xF11C, 0xF124, 0xF158, 0xF1EB, 0xF240, 0xF241, 0xF242, 0xF243, 0xF244, 0xF287, 0xF293, 0xF2ED, 0xF55A, 0xF7C2, 0xF8A2

as well as 0xF042 for the adjust icon.

It's also possible to do the conversion on the commandline, e.g.

$ npx lv_font_conv --bpp 4 --size 32 --no-compress -o montserrat_extended_32.c --format lvgl \
    --font Montserrat-Regular.ttf \
      --range '0x0020-0x007F' \
      --range '0x00A0-0x00FF' \
      --range '0x0100-0x017F' \
      --range '0x2000-0x206F' \
      --range '0x20A0-0x20CF' \
    --font FontAwesome5-Solid+Brands+Regular.woff \
      --range '0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF0E0,0xF304,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF287,0xF293,0xF2ED,0xF55A,0xF7C2,0xF8A2' \
      --range '0xF042'

Changing layouts

The layouts in uskr_layouts.h and uskr_layouts.c are generated from squeekboard layouts using the unsqu33kr/unsqu33kr.py script. To regenerate the files, run

$ ./generate-keymaps.sh

Screen recording

For demonstration purposes you can record the framebuffer device, e.g. with ffmpeg:

$ sudo ffmpeg -f fbdev -i /dev/fb0 -r 24 -c:v libx264 -b:v 500k demo.avi

Acknowledgements

The lv_port_linux_frame_buffer project served as a starting point for the codebase. The mouse cursor image was taken from lv_sim_emscripten.

License

Unl0kr is licensed under the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

The Montserrat font is licensed under the Open Font License.

The Font Awesome font is licensed under the Open Font License version 1.1.