<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://iloskutov.github.io/mueslios/feed.xml" rel="self" type="application/atom+xml" /><link href="https://iloskutov.github.io/mueslios/" rel="alternate" type="text/html" /><updated>2026-11-14T20:48:36+00:00</updated><id>https://iloskutov.github.io/mueslios/feed.xml</id><title type="html">MüesliOS</title><subtitle>A phone OS on Genode, on the Google Pixel 7: progress notes.</subtitle><author><name>Ivan Loskutov</name></author><entry><title type="html">First demo: calls and SMS</title><link href="https://iloskutov.github.io/mueslios/2026/11/14/calls-and-sms.html" rel="alternate" type="text/html" title="First demo: calls and SMS" /><published>2026-11-14T00:00:00+00:00</published><updated>2026-11-14T00:00:00+00:00</updated><id>https://iloskutov.github.io/mueslios/2026/11/14/calls-and-sms</id><content type="html" xml:base="https://iloskutov.github.io/mueslios/2026/11/14/calls-and-sms.html"><![CDATA[<p>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.</p>

<video src="/mueslios/assets/video/phone-demo-2026-11-14.mp4" poster="/mueslios/assets/video/phone-demo-2026-11-14.jpg" controls="" muted="" playsinline="" width="360"></video>

<h2 id="the-hard-part-telephony">The hard part: telephony</h2>

<p>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.</p>

<p>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
(<code class="language-plaintext highlighter-rouge">cbd</code>, <code class="language-plaintext highlighter-rouge">rild</code>, <code class="language-plaintext highlighter-rouge">rfsd</code>, …) 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.</p>

<h2 id="what-runs-in-the-demo">What runs in the demo</h2>

<ul>
  <li><strong>Genode with its own kernel (base-hw)</strong> on all eight cores, with drivers
for the panel, touchscreen, keys, UFS storage and audio.</li>
  <li><strong>The Android modem services</strong> on this loader.</li>
  <li><strong>Telephony</strong> split into small components: the link to the modem, call
log, SMS store, contacts and notifications.</li>
  <li><strong>A shell and 3 apps</strong> (phone, messages, contacts), written with
<a href="https://lvgl.io">LVGL</a>.</li>
  <li><strong>A lock screen</strong> with a PIN.</li>
  <li><strong>Call audio.</strong> 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.</li>
</ul>

<h2 id="already-working-but-not-in-the-demo-yet">Already working, but not in the demo yet</h2>

<p>Some other parts already work in their own tests, and they will extend the
functionality in the next iterations:</p>

<ul>
  <li>Wi-Fi</li>
  <li>mobile data over the modem</li>
  <li>USB gadget (serial console, adb)</li>
  <li>3D acceleration on the Mali GPU (Mesa)</li>
  <li>battery state and real-time clock</li>
</ul>

<h2 id="code">Code</h2>

<p>The code is on GitHub: the <a href="https://github.com/iloskutov/genode-pixel">Pixel drivers</a>,
the <a href="https://github.com/iloskutov/genode-muesli">MüesliOS components</a>, and
the <a href="https://github.com/iloskutov/goa-packages">apps and telephony</a>.</p>

<h2 id="how-to-build">How to build</h2>

<p>You need a Pixel 7 with
<a href="https://github.com/iloskutov/genode-pixel/blob/main/doc/device_preparation.md">unlocked boot loader</a>, Android with <code class="language-plaintext highlighter-rouge">adb root</code>
(e.g. LineageOS) on slot a, an active SIM without PIN, and the Genode tool
chain 25.05. The demo overwrites <code class="language-plaintext highlighter-rouge">modem_b</code>, so slot b can’t boot Android
after it.</p>

<p>Get the sources:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone <span class="nt">-b</span> 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
<span class="nb">cd </span>genode-pub
tool/create_builddir arm_v8a
</code></pre></div></div>

<p>In <code class="language-plaintext highlighter-rouge">build/arm_v8a/etc/build.conf</code> enable <code class="language-plaintext highlighter-rouge">libports</code>, <code class="language-plaintext highlighter-rouge">dde_linux</code> and
<code class="language-plaintext highlighter-rouge">gems</code>, and add before the <code class="language-plaintext highlighter-rouge">base-$(KERNEL)</code> line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>REPOSITORIES += $(GENODE_DIR)/repos/pixel
REPOSITORIES += $(GENODE_DIR)/repos/muesli
BOARD_RUN_OPT(google_pixel7) := --include image/pixel_boot_img
</code></pre></div></div>

<p>Prepare ports and download the apps from the
<a href="https://iloskutov.github.io/depot-pixel">depot</a>:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tool/ports/prepare_port android_boot_tools pixel_linux google_soc_gs <span class="se">\</span>
    google_display google_touch google_aoc google_amplifiers google_s5300 <span class="se">\</span>
    google_trusty lwext4 hacl libc libpng zlib stdcxx jitterentropy

<span class="nv">U</span><span class="o">=</span>iloskutov_pixel7
<span class="nb">mkdir</span> <span class="nt">-p</span> repos/muesli/sculpt/depot/<span class="nv">$U</span> depot/<span class="nv">$U</span>
<span class="nb">cp</span> ../goa-packages/depot/<span class="nv">$U</span>/<span class="k">*</span> repos/muesli/sculpt/depot/<span class="nv">$U</span>/
<span class="nb">cp</span> ../goa-packages/depot/<span class="nv">$U</span>/<span class="k">*</span> depot/<span class="nv">$U</span>/
<span class="k">for </span>a <span class="k">in </span>lvgl/2026-11-11 faenschterli/2026-11-12 telephony/2026-11-13 <span class="se">\</span>
         phone/2026-11-13 messages/2026-11-13 contacts/2026-11-13 <span class="se">\</span>
         android_loader/2026-11-14 android_prop/2026-11-07 <span class="se">\</span>
         android_binder/2026-11-07 modem_orchestrator/2026-11-07 <span class="se">\</span>
         rild_modem/2026-11-07 modem_console/2026-11-07
<span class="k">do </span>tool/depot/download <span class="nv">$U</span>/bin/arm_v8a/<span class="nv">$a</span> <span class="o">||</span> <span class="nb">break</span><span class="p">;</span> <span class="k">done</span>
</code></pre></div></div>

<p>Copy the modem daemons and audio firmware from the phone (they are
proprietary, so they are not in the repos), build, flash and boot:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb root
repos/pixel/tool/pull_modem_files
repos/pixel/tool/pull_audio_firmware
<span class="nb">cd </span>build/arm_v8a
make run/phone_pixel <span class="nv">KERNEL</span><span class="o">=</span>hw <span class="nv">BOARD</span><span class="o">=</span>google_pixel7
adb reboot bootloader
fastboot flash modem_b var/run/phone_pixel.modem_b.img
fastboot boot var/run/phone_pixel.img
</code></pre></div></div>

<p>The PIN is <code class="language-plaintext highlighter-rouge">1234</code>. A restart brings Android back.</p>

<h2 id="next-steps">Next steps</h2>

<p>There are still an enormous number of things to do:</p>

<ul>
  <li>enabling the remaining hardware</li>
  <li>performance improvements, like CPU frequency control and CPU balancing</li>
  <li>power management</li>
  <li>everyday software (porting it or using virtualization)</li>
  <li>and many, many others</li>
</ul>]]></content><author><name>Ivan Loskutov</name></author><summary type="html"><![CDATA[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.]]></summary></entry></feed>