First demo: calls and SMS
For around a year I am working on bringing a Genode based OS to the Google Pixel 7. I call it MüesliOS. And now there is a first demo: the phone can make calls, with sound in the earpiece, and send and receive SMS. It is a first prototype of a mobile shell with 3 apps, which I hope will become the base of a real mobile OS later.
The hard part: telephony
The main challenge was telephony. The modem is a separate computer inside the phone, and only the kernel driver for it is open source. And this driver gives you just a communication channel with the modem. Over this channel the AP talks with the CP using a proprietary protocol, which is not documented anywhere.
After long debugging and a lot of experiments the solution was found, and
it is quite simple: we can just run the unmodified Android vendor services
(cbd, rild, rfsd, …) on Genode directly. A small loader maps their
ELF files and gives them what they expect from Android: the C library,
properties and binder. So now the Android RIL stack runs on top of
MüesliOS.
What runs in the demo
- Genode with its own kernel (base-hw) on all eight cores, with drivers for the panel, touchscreen, keys, UFS storage and audio.
- The Android modem services on this loader.
- Telephony split into small components: the link to the modem, call log, SMS store, contacts and notifications.
- A shell and 3 apps (phone, messages, contacts), written with LVGL.
- A lock screen with a PIN.
- Call audio. The speech goes between the modem and the audio DSP. The driver switches on the earpiece for a call and loads the voice processing parameters, which a tool makes from the vendor’s parameter file.
Already working, but not in the demo yet
Some other parts already work in their own tests, and they will extend the functionality in the next iterations:
- Wi-Fi
- mobile data over the modem
- USB gadget (serial console, adb)
- 3D acceleration on the Mali GPU (Mesa)
- battery state and real-time clock
Code
The code is on GitHub: the Pixel drivers, the MüesliOS components, and the apps and telephony.
How to build
You need a Pixel 7 with
unlocked boot loader, Android with adb root
(e.g. LineageOS) on slot a, an active SIM without PIN, and the Genode tool
chain 25.05. The demo overwrites modem_b, so slot b can’t boot Android
after it.
Get the sources:
git clone -b pixel7 https://github.com/iloskutov/genode.git genode-pub
git clone https://github.com/iloskutov/genode-pixel.git genode-pub/repos/pixel
git clone https://github.com/iloskutov/genode-muesli.git genode-pub/repos/muesli
git clone https://github.com/iloskutov/goa-packages.git
cd genode-pub
tool/create_builddir arm_v8a
In build/arm_v8a/etc/build.conf enable libports, dde_linux and
gems, and add before the base-$(KERNEL) line:
REPOSITORIES += $(GENODE_DIR)/repos/pixel
REPOSITORIES += $(GENODE_DIR)/repos/muesli
BOARD_RUN_OPT(google_pixel7) := --include image/pixel_boot_img
Prepare ports and download the apps from the depot:
tool/ports/prepare_port android_boot_tools pixel_linux google_soc_gs \
google_display google_touch google_aoc google_amplifiers google_s5300 \
google_trusty lwext4 hacl libc libpng zlib stdcxx jitterentropy
U=iloskutov_pixel7
mkdir -p repos/muesli/sculpt/depot/$U depot/$U
cp ../goa-packages/depot/$U/* repos/muesli/sculpt/depot/$U/
cp ../goa-packages/depot/$U/* depot/$U/
for a in lvgl/2026-11-11 faenschterli/2026-11-12 telephony/2026-11-13 \
phone/2026-11-13 messages/2026-11-13 contacts/2026-11-13 \
android_loader/2026-11-14 android_prop/2026-11-07 \
android_binder/2026-11-07 modem_orchestrator/2026-11-07 \
rild_modem/2026-11-07 modem_console/2026-11-07
do tool/depot/download $U/bin/arm_v8a/$a || break; done
Copy the modem daemons and audio firmware from the phone (they are proprietary, so they are not in the repos), build, flash and boot:
adb root
repos/pixel/tool/pull_modem_files
repos/pixel/tool/pull_audio_firmware
cd build/arm_v8a
make run/phone_pixel KERNEL=hw BOARD=google_pixel7
adb reboot bootloader
fastboot flash modem_b var/run/phone_pixel.modem_b.img
fastboot boot var/run/phone_pixel.img
The PIN is 1234. A restart brings Android back.
Next steps
There are still an enormous number of things to do:
- enabling the remaining hardware
- performance improvements, like CPU frequency control and CPU balancing
- power management
- everyday software (porting it or using virtualization)
- and many, many others