1<!doctype html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=robots content="noodp"><title>Mainlining Nexus 9: First Boot - Rayyan Ansari</title><meta name=description content="A developer experienced with open-source who has worked on a variety of projects, ranging from user interface design to the Linux kernel."><meta property="og:title" content="Mainlining Nexus 9: First Boot"> 2<meta property="og:description" content="Having received the Google Nexus 9 tablet recently, I decided to try mainlining it…"><meta property="og:type" content="article"><meta property="og:url" content="https://ansari.sh/posts/mainline-nexus-9-p1/"><meta property="article:section" content="posts"><meta property="article:published_time" content="2022-09-21T17:14:42+01:00"><meta property="article:modified_time" content="2022-09-21T17:14:42+01:00"><meta name=twitter:card content="summary"><meta name=twitter:title content="Mainlining Nexus 9: First Boot"><meta name=twitter:description content="Having received the Google Nexus 9 tablet recently, I decided to try mainlining it…"><meta name=application-name content="Rayyan Ansari"><meta name=apple-mobile-web-app-title content="Rayyan Ansari"><link rel="shortcut icon" type=image/x-icon href=/favicon.ico><link rel=icon type=image/png sizes=32x32 href=/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/favicon-16x16.png><link rel=apple-touch-icon sizes=180x180 href=/apple-touch-icon.png><link rel=manifest href=/site.webmanifest><link rel=canonical href=https://ansari.sh/posts/mainline-nexus-9-p1/><link rel=prev href=https://ansari.sh/posts/finding_sensors_i2c/><link rel=stylesheet href=/css/page.min.css><link rel=stylesheet href=/css/home.min.css><link href=https://www.googletagmanager.com rel=preconnect crossorigin><link rel=dns-prefetch href=https://www.googletagmanager.com>
2<script type=application/ld+json>{"@context":"http://schema.org","@type":"BlogPosting","headline":"Mainlining Nexus 9: First Boot","inLanguage":"en","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/ansari.sh\/posts\/mainline-nexus-9-p1\/"},"genre":"posts","wordcount":973,"url":"https:\/\/ansari.sh\/posts\/mainline-nexus-9-p1\/","datePublished":"2022-09-21T17:14:42+01:00","dateModified":"2022-09-21T17:14:42+01:00","publisher":{"@type":"Organization","name":"Rayyan Ansari"},"author":{"@type":"Person","name":"Rayyan Ansari"},"description":""}</script>
vendor: 63 bytes, line 2
2<script async src="https://www.googletagmanager.com/gtag/js?id=
2G-DT74XX3JFY
vendor: 11 bytes, line 2
2"></script>
2<script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-DT74XX3JFY",{anonymize_ip:!1})}</script>
2</head><body data-header-desktop=fixed data-header-mobile=auto>
2<script>(window.localStorage&&localStorage.getItem("theme")?localStorage.getItem("theme")==="dark":"light"==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches:"light"==="dark")&&document.body.setAttribute("theme","dark")</script>
2<div id=mask></div><div class=wrapper><header class=desktop id=header-desktop><div class=header-wrapper><div class=header-title><a href=/ title="Rayyan Ansari"><span id=id-1 class=typeit></span></a></div><div class=menu><div class=menu-inner><a class=menu-item href=/posts/>Posts </a><a class=menu-item href=/my-work/>My Work </a><a class=menu-item href=/about/>About </a><span class="menu-item delimiter"></span></div></div></div></header><header class=mobile id=header-mobile><div class=header-container><div class=header-wrapper><div class=header-title><a href=/ title="Rayyan Ansari"><span id=id-2 class=typeit></span></a></div><div class=menu-toggle id=menu-toggle-mobile><span></span><span></span><span></span></div></div><div class=menu id=menu-mobile><a class=menu-item href=/posts/ title>Posts</a><a class=menu-item href=/my-work/ title>My Work</a><a class=menu-item href=/about/ title>About</a><div class=menu-item></div></div></div></header><main class=main><div class=container><div class=toc id=toc-auto><h2 class=toc-title>Contents</h2><div class=toc-content id=toc-content-auto></div></div><article class="page single" data-toc=disable><div class=single-card><h2 class="single-title animated flipInX">Mainlining Nexus 9: First Boot</h2><div class=post-meta><div class=post-meta-line><span class=post-author><a href=https://ansari.sh title=Author target=_blank rel="noopener noreffer author" class=author><i class="fas fa-user-circle fa-fw"></i>Rayyan Ansari</a></span></div><div class=post-meta-line><span><i class="far fa-calendar-alt fa-fw"></i> <time datetime=2022-09-21>2022-09-21</time></span> <span><i class="fas fa-pencil-alt fa-fw"></i> 973 words</span> 3<span><i class="far fa-clock fa-fw"></i> 5 minutes</span> </div></div><hr><div class="details toc" id=toc-static data-kept><div class="details-summary toc-title"><span>Contents</span> 4<span><i class="details-icon fas fa-angle-right"></i></span></div><div class="details-content toc-content" id=toc-content-static><nav id=TableOfContents><ul><li><a href=#information-gathering>Information Gathering</a><ul><li><a href=#downstream-device-tree>Downstream Device Tree</a></li><li><a href=#command-line-parameters>Command line parameters</a></li><li><a href=#boot-image>Boot image</a></li></ul></li><li><a href=#writing-the-mainline-device-tree>Writing the mainline device tree</a><ul><li><a href=#framebuffer>Framebuffer</a></li><li><a href=#complete-device-tree>Complete Device Tree</a></li></ul></li><li><a href=#booting>Booting</a></li><li><a href=#next-steps>Next steps</a></li></ul></nav></div></div><div class=content id=content><p>Having received the Google Nexus 9 tablet recently, I decided to try mainlining it, given that it uses the NVIDIA Tegra K1 (tegra132 variant) that has good mainline support. The Nexus 9 is an Android ARM64 tablet branded as Google but made by HTC, codenamed <em>“flounder”</em>. There seem to be no tegra132 devices with a device tree in mainline right now, apart from a developer board.</p><h2 id=information-gathering>Information Gathering</h2><h3 id=downstream-device-tree>Downstream Device Tree</h3><p>The device tree used by the downstream Linux kernel cannot be used with the mainline kernel - but it is a good reference for writing a new device tree. It can be dumped by a running device using <code>dtc</code>, the device tree compiler. This program can decompile device trees as well as compile them. The benefit of doing it this way is that the entire device tree will be dumped into one file - unlike the downstream released kernel sources which have a mess of a device tree split up across several files.</p><p>First, a static, cross-compiled version of dtc needs to be built (unless you want to copy all the libraries over), which can be done by modifying the <code>Makefile</code>
4. This can then be copied over to either Android with root access, or TWRP. The device tree can then be dumped using this command:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-sh data-lang=sh><span class=line><span class=cl>dtc -I fs -O dts -o flounder-downstream.dts /proc/device-tree 5</span></span></code></pre></div><h3 id=command-line-parameters>Command line parameters</h3><p>The cmdline parameters often include useful information such as memory addresses or panel types. Some of these are passed by the bootloader, and some of these are hardcoded in the kernel. The cmdline is easier to find compared to the device tree:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-sh data-lang=sh><span class=line><span class=cl>cat /proc/cmdline > cmdline-downstream.txt 6</span></span></code></pre></div><p>My cmdline looks like this - I could already see some useful information such as the framebuffer memory address and size, which will be useful later:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-gdscript3 data-lang=gdscript3><span class=line><span class=cl><span class=n>no_console_suspend</span><span class=o>=</span><span class=mi>1</span> <span class=n>tegra_wdt</span><span class=o>.</span><span class=n>enable_on_probe</span><span class=o>=</span><span class=mi>1</span> <span class=n>tegra_wdt</span><span class=o>.</span><span class=n>heartbeat</span><span class=o>=</span><span class=mi>120</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>hardware</span><span class=o>=</span><span class=n>flounder</span> <span class=n>tegraid</span><span class=o>=</span><span class=mf>40.0</span><span class=o>.</span><span class=mf>0.00</span><span class=o>.</span><span class=mi>00</span> <span class=n>vmalloc</span><span class=o>=</span><span class=mi>256</span><span class=n>M</span> <span class=n>video</span><span class=o>=</span><span class=n>tegrafb</span> <span class=n>console</span><span class=o>=</span><span class=n>ttyS0</span><span class=p>,</span><span class=mi>115200</span><span class=n>n8</span> <span class=n>earlyprintk</span> <span class=n>MTS</span> <span class=n>Version</span><span class=o>=</span><span class=mi>33985182</span> <span class=n>memtype</span><span class=o>=</span><span class=mi>0</span> <span class=n>tzram</span><span class=o>=</span><span class=mi>4</span><span class=n>M</span><span class=err>@</span><span class=mi>3962</span><span class=n>M</span> <span class=n>ddr_die</span><span class=o>=</span><span class=mi>1024</span><span class=n>M</span><span class=err>@</span><span class=mi>2048</span><span class=n>M</span> <span class=n>ddr_die</span><span class=o>=</span><span class=mi>1024</span><span class=n>M</span><span class=err>@</span><span class=mi>3072</span><span class=n>M</span> <span class=n>section</span><span class=o>=</span><span class=mi>128</span><span class=n>M</span> <span class=n>lp0_vec</span><span class=o>=</span><span class=mi>2048</span><span class=err>@</span><span class=mh>0xf7fff000</span> <span class=n>tegra_fbmem</span><span class=o>=</span><span class=mi>12713984</span><span class=err>@</span><span class=mh>0xac001000</span> <span class=n>nvdumper_reserved</span><span class=o>=</span><span class=mh>0xf7800000</span> <span class=n>core_edp_mv</span><span class=o>=</span><span class=mi>1150</span> <span class=n>core_edp_ma</span><span class=o>=</span><span class=mi>4000</span> <span class=n>gpt</span> <span class=n>gpt_sector</span><span class=o>=</span><span class=mi>69631</span> <span class=n>watchdog</span><span class=o>=</span><span class=n>disable</span> <span class=n>nck</span><span class=o>=</span><span class=mi>1048576</span><span class=err>@</span><span class=mh>0xf7900000</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>hardware</span><span class=o>=</span><span class=n>flounder</span> <span class=n>buildvariant</span><span class=o>=</span><span class=n>userdebug</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>serialno</span><span class=o>=</span><span class=n>
6HT4B7JT02439</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>baseband</span><span class=o>=</span><span class=n>N</span><span class=o>/</span><span class=n>A</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>mode</span><span class=o>=</span><span class=n>normal</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>bootloader</span><span class=o>=</span><span class=mf>3.50</span><span class=o>.</span><span class=mf>0.0143</span> <span class=n>swoff</span><span class=o>=</span><span class=mi>128</span> <span class=n>flounder</span><span class=o>.</span><span class=n>wifimacaddr</span><span class=o>=</span><span class=n>B4</span><span class=p>:</span><span class=n>CE</span><span class=p>:</span><span class=n>F6</span><span class=p>:</span><span class=mi>08</span><span class=p>:</span><span class=mi>90</span><span class=p>:</span><span class=mi>37</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>wificountrycode</span><span class=o>=</span><span class=n>DE</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>bootreason</span><span class=o>=</span><span class=n>hard_reset</span> <span class=n>hw_revision</span><span class=o>=</span><span class=mi>128</span> <span class=n>radioflag</span><span class=o>=</span><span class=mh>0x0</span> <span class=n>androidboot</span><span class=o>.</span><span class=n>misc_pagesize</span><span class=o>=</span><span class=mi>2048</span> 7</span></span></code></pre></div><h3 id=boot-image>Boot image</h3><p>Some bootloaders are picky where certain components such as the kernel and initramfs should be located within the boot image. postmarketOS maintains a tool called <code>pmbootstrap</code>, which amongst many other things, can analyse boot images to find the correct addresses for different sections.</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-sh data-lang=sh><span class=line><span class=cl>$ pmbootstrap bootimg_analyze boot-downstream.img 8</span></span><span class=line><span class=cl> 9</span></span><span class=line><span class=cl><span class=nv>deviceinfo_kernel_cmdline</span><span class=o>=</span><span class=s2>"androidboot.hardware=flounder"</span> 10</span></span><span class=line><span class=cl><span class=nv>deviceinfo_generate_bootimg</span><span class=o>=</span><span class=s2>"true"</span> 11</span></span><span class=line><span class=cl><span class=nv>deviceinfo_bootimg_qcdt</span><span class=o>=</span><span class=s2>"false"</span> 12</span></span><span class=line><span class=cl><span class=nv>deviceinfo_bootimg_mtk_mkimage</span><span class=o>=</span><span class=s2>"false"</span> 13</span></span><span class=line><span class=cl><span class=nv>deviceinfo_bootimg_dtb_second</span><span class=o>=</span><span class=s2>"false"</span> 14</span></span><span class=line><span class=cl><span class=nv>deviceinfo_flash_pagesize</span><span class=o>=</span><span class=s2>"2048"</span> 15</span></span><span class=line><span class=cl><span class=nv>deviceinfo_header_version</span><span class=o>=</span><span class=s2>"0"</span> 16</span></span><span class=line><span class=cl><span class=nv>deviceinfo_flash_offset_base</span><span class=o>=</span><span class=s2>"0x10000000"</span> 17</span></span><span class=line><span class=cl><span class=nv>deviceinfo_flash_offset_kernel</span><span class=o>=</span><span class=s2>"0x00008000"</span> 18</span></span><span class=line><span class=cl><span class=nv>deviceinfo_flash_offset_ramdisk</span><span class=o>=</span><span class=s2>"0x01000000"</span> 19</span></span><span class=line><span class=cl><span class=nv>deviceinfo_flash_offset_second</span><span class=o>=</span><span class=s2>"0x00f00000"</span> 20</span></span><span class=line><span class=cl><span class=nv>deviceinfo_flash_offset_tags</span><span class=o>=</span><span class=s2>"0x00000100"</span> 21</span></span></code></pre></div><p>This information can be used with <code>mkbootimg</code> to create a boot image that will work with this device.</p><h2 id=writing-the-mainline-device-tree>Writing the mainline device tree</h2><p>A basic device tree can be written with simple information such as the device compatible and memory address. For tegra132 a source for <code>clk32_in</code> is also needed, but for now I’ve just used a dummy <code>fixed-clock</code> which should be changed later.</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-c data-lang=c><span class=line><span class=cl><span class=c1>// SPDX-License-Identifier: GPL-2.0 22</span></span></span><span class=line><span class=cl><span class=c1></span><span class=o>/</span><span class=n>dts</span><span class=o>-</span><span class=n>v1</span><span class=o>/</span><span class=p>;</span> 23</span></span><span class=line><span class=cl> 24</span></span><span class=line><span class=cl><span class=cp>#include</span> <span class=cpf>"tegra132.dtsi"</span><span class=cp> 25</span></span></span><span class=line><span class=cl><span class=cp></span> 26</span></span><span class=line><span class=cl><span class=o>/</span> <span class=p>{</span> 27</span></span><span class=line><span class=cl> 28</span></span><span class=line><span class=cl> <span class=n>model</span> <span class=o>=</span> <span class=s>"Google Nexus 9"</span><span class=p>;</span> 29</span></span><span class=line><span class=cl> <span class=n>compatible</span> <span class=o>=</span> <span class=s>"google,flounder64"</span><span class=p>,</span> <span class=s>"nvidia,tegra132"</span><span class=p>;</span> <span class=cm>/* bootloader wants this */</span> 30</span></span><span class=line><span class=cl> <span class=n>chassis</span> <span class=o>=</span> <span class=s>"tablet"</span><span class=p>;</span> 31</span></span><span class=line><span class=cl> 32</span></span><span class=line><span class=cl> <span class=n>memory</span><span class=err>@</span><span class=mi>80000000</span> <span class=p>{</span> 33</span></span><span class=line><span class=cl> <span class=n>device_type</span> <span class=o>=</span> <span class=s>"memory"</span><span class=p>;</span> 34</span></span><span class=line><span class=cl> <span class=n>reg</span> <span class=o>=</span> <span class=o><</span><span class=mh>0x0</span> <span class=mh>0x80000000</span> <span class=mh>0x0</span> <span class=mh>0x80000000</span><span class=o>></span><span class=p>;</span> 35</span></span><span class=line><span class=cl> <span class=p>};</span> 36</span></span><span class=line><span class=cl> 37</span></span><span class=line><span class=cl> <span class=nl>clk32k_in</span><span class=p>:</span> <span class=n>clock</span><span class=o>-</span><span class=mi>32</span><span class=n>k</span> <span class=p>{</span> 38</span></span><span class=line><span class=cl> <span class=n>compatible</span> <span class=o>=</span> <span class=s>"fixed-clock"</span><span class=p>;</span> 39</span></span><span class=line><span class=cl> <span class=n>clock</span><span class=o>-</span><span class=n>frequency</span> <span class=o>=</span> <span class=o><</span><span class=mi>32768</span><span class=o>></span><span class=p>;</span> 40</span></span><span class=line><span class=cl> <span class=cp>#clock-cells = <0>; 41</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=p>};</span> 42</span></span><span class=line><span class=cl><span class=p>};</span> 43</span></span></code></pre></div><p>After some testing I found out that I needed to use <code>google,flounder64</code> as the compatible, like the downstream kernel, otherwise HBOOT (the bootloader) would not select it.</p><h3 id=framebuffer>Framebuffer</h3><p>I don’t have UART access, so I had to setup a framebuffer using the memory address provided by the bootloader to check if mainline is booting. The cmdline has this parameter: <code>tegra_fbmem=12713984@0xac001000</code> which contains the memory address and size. This, along with the framebuffer size (screen size), is enough to make a simplefb node.</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-c data-lang=c><span class=line><span class=cl> <span class=nl>framebufffer</span><span class=p>:</span> <span class=n>framebuffer</span><span class=err>@</span><span class=n>ac001000</span> <span class=p>{</span> 44</span></span><span class=line><span class=cl> <span class=n>compatible</span> <span class=o>=</span> <span class=s>"simple-framebuffer"</span><span class=p>;</span> 45</span></span><span class=line><span class=cl> <span class=n>reg</span> <span class=o>=</span> <span class=o><</span><span class=mh>0x0</span> <span class=mh>0xac001000</span> <span class=mh>0x0</span> <span class=mh>0xc20000</span><span class=o>></span><span class=p>;</span> 46</span></span><span class=line><span class=cl> <span class=n>width</span> <span class=o>=</span> <span class=o><</span><span class=mi>1536</span><span class=o>></span><span class=p>;</span> 47</span></span><span class=line><span class=cl> <span class=n>height</span> <span class=o>=</span> <span class=o><</span><span class=mi>2048</span><span class=o>></span><span class=p>;</span> 48</span></span><span class=line><span class=cl> <span class=n>
48stride</span> <span class=o>=</span> <span class=o><</span><span class=p>(</span><span class=mi>1536</span> <span class=o>*</span> <span class=mi>4</span><span class=p>)</span><span class=o>></span><span class=p>;</span> 49</span></span><span class=line><span class=cl> <span class=n>format</span> <span class=o>=</span> <span class=s>"a8b8g8r8"</span><span class=p>;</span> 50</span></span><span class=line><span class=cl> <span class=p>};</span> 51</span></span></code></pre></div><p>A <code>reserved-memory</code> node should also be added to make sure that the framebuffer memory is not overwitten by something else:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-c data-lang=c><span class=line><span class=cl> <span class=n>reserved</span><span class=o>-</span><span class=n>memory</span> <span class=p>{</span> 52</span></span><span class=line><span class=cl> <span class=cp>#address-cells = <2>; 53</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=cp>#size-cells = <2>; 54</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=n>ranges</span><span class=p>;</span> 55</span></span><span class=line><span class=cl> <span class=n>framebuffer</span><span class=err>@</span><span class=n>ac001000</span> <span class=p>{</span> 56</span></span><span class=line><span class=cl> <span class=n>reg</span> <span class=o>=</span> <span class=o><</span><span class=mh>0x0</span> <span class=mh>0xac001000</span> <span class=mh>0x0</span> <span class=mh>0xc20000</span><span class=o>></span><span class=p>;</span> 57</span></span><span class=line><span class=cl> <span class=n>no</span><span class=o>-</span><span class=n>map</span><span class=p>;</span> 58</span></span><span class=line><span class=cl> <span class=p>};</span> 59</span></span><span class=line><span class=cl> <span class=p>};</span> 60</span></span></code></pre></div><p>I found out that the framebuffer turns into garbage after a while, which is due to the kernel automatically turning off unused clocks. This should be fixed by adding the correct <code>clocks</code> to the simplefb node, but for now I added the <code>clk_ignore_unused</code> bootarg.</p><h3 id=complete-device-tree>Complete Device Tree</h3><div class=highlight><pre tabindex=0 class=chroma><code class=language-c data-lang=c><span class=line><span class=cl><span class=c1>// SPDX-License-Identifier: GPL-2.0 61</span></span></span><span class=line><span class=cl><span class=c1></span><span class=o>/</span><span class=n>dts</span><span class=o>-</span><span class=n>v1</span><span class=o>/</span><span class=p>;</span> 62</span></span><span class=line><span class=cl> 63</span></span><span class=line><span class=cl><span class=cp>#include</span> <span class=cpf>"tegra132.dtsi"</span><span class=cp> 64</span></span></span><span class=line><span class=cl><span class=cp></span> 65</span></span><span class=line><span class=cl><span class=o>/</span> <span class=p>{</span> 66</span></span><span class=line><span class=cl> 67</span></span><span class=line><span class=cl> <span class=n>model</span> <span class=o>=</span> <span class=s>"Google Nexus 9"</span><span class=p>;</span> 68</span></span><span class=line><span class=cl> <span class=n>compatible</span> <span class=o>=</span> <span class=s>"google,flounder64"</span><span class=p>,</span> <span class=s>"nvidia,tegra132"</span><span class=p>;</span> <span class=cm>/* bootloader wants this */</span> 69</span></span><span class=line><span class=cl> <span class=n>chassis</span> <span class=o>=</span> <span class=s>"tablet"</span><span class=p>;</span> 70</span></span><span class=line><span class=cl> 71</span></span><span class=line><span class=cl> <span class=n>chosen</span> <span class=p>{</span> 72</span></span><span class=line><span class=cl> <span class=cp>#address-cells = <2>; 73</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=cp>#size-cells = <2>; 74</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=n>ranges</span><span class=p>;</span> 75</span></span><span class=line><span class=cl> 76</span></span><span class=line><span class=cl> <span class=n>bootargs</span> <span class=o>=</span> <span class=s>"clk_ignore_unused"</span><span class=p>;</span> 77</span></span><span class=line><span class=cl> <span class=nl>framebufffer</span><span class=p>:</span> <span class=n>framebuffer</span><span class=err>@</span><span class=n>ac001000</span> <span class=p>{</span> 78</span></span><span class=line><span class=cl> <span class=n>compatible</span> <span class=o>=</span> <span class=s>"simple-framebuffer"</span><span class=p>;</span> 79</span></span><span class=line><span class=cl> <span class=n>reg</span> <span class=o>=</span> <span class=o><</span><span class=mh>0x0</span> <span class=mh>0xac001000</span> <span class=mh>0x0</span> <span class=mh>0xc20000</span><span class=o>></span><span class=p>;</span> 80</span></span><span class=line><span class=cl> <span class=n>width</span> <span class=o>=</span> <span class=o><</span><span class=mi>1536</span><span class=o>></span><span class=p>;</span> 81</span></span><span class=line><span class=cl> <span class=n>height</span> <span class=o>=</span> <span class=o><</span><span class=mi>2048</span><span class=o>></span><span class=p>;</span> 82</span></span><span class=line><span class=cl> <span class=n>
82stride</span> <span class=o>=</span> <span class=o><</span><span class=p>(</span><span class=mi>1536</span> <span class=o>*</span> <span class=mi>4</span><span class=p>)</span><span class=o>></span><span class=p>;</span> 83</span></span><span class=line><span class=cl> <span class=n>format</span> <span class=o>=</span> <span class=s>"a8b8g8r8"</span><span class=p>;</span> 84</span></span><span class=line><span class=cl> <span class=p>};</span> 85</span></span><span class=line><span class=cl> <span class=p>};</span> 86</span></span><span class=line><span class=cl> 87</span></span><span class=line><span class=cl> <span class=n>memory</span><span class=err>@</span><span class=mi>80000000</span> <span class=p>{</span> 88</span></span><span class=line><span class=cl> <span class=n>device_type</span> <span class=o>=</span> <span class=s>"memory"</span><span class=p>;</span> 89</span></span><span class=line><span class=cl> <span class=n>reg</span> <span class=o>=</span> <span class=o><</span><span class=mh>0x0</span> <span class=mh>0x80000000</span> <span class=mh>0x0</span> <span class=mh>0x80000000</span><span class=o>></span><span class=p>;</span> 90</span></span><span class=line><span class=cl> <span class=p>};</span> 91</span></span><span class=line><span class=cl> 92</span></span><span class=line><span class=cl> <span class=n>reserved</span><span class=o>-</span><span class=n>memory</span> <span class=p>{</span> 93</span></span><span class=line><span class=cl> <span class=cp>#address-cells = <2>; 94</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=cp>#size-cells = <2>; 95</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=n>ranges</span><span class=p>;</span> 96</span></span><span class=line><span class=cl> <span class=n>framebuffer</span><span class=err>@</span><span class=n>ac001000</span> <span class=p>{</span> 97</span></span><span class=line><span class=cl> <span class=n>reg</span> <span class=o>=</span> <span class=o><</span><span class=mh>0x0</span> <span class=mh>0xac001000</span> <span class=mh>0x0</span> <span class=mh>0xc20000</span><span class=o>></span><span class=p>;</span> 98</span></span><span class=line><span class=cl> <span class=n>no</span><span class=o>-</span><span class=n>map</span><span class=p>;</span> 99</span></span><span class=line><span class=cl> <span class=p>};</span> 100</span></span><span class=line><span class=cl> <span class=p>};</span> 101</span></span><span class=line><span class=cl> 102</span></span><span class=line><span class=cl> <span class=nl>clk32k_in</span><span class=p>:</span> <span class=n>clock</span><span class=o>-</span><span class=mi>32</span><span class=n>k</span> <span class=p>{</span> 103</span></span><span class=line><span class=cl> <span class=n>compatible</span> <span class=o>=</span> <span class=s>"fixed-clock"</span><span class=p>;</span> 104</span></span><span class=line><span class=cl> <span class=n>clock</span><span class=o>-</span><span class=n>frequency</span> <span class=o>=</span> <span class=o><</span><span class=mi>32768</span><span class=o>></span><span class=p>;</span> 105</span></span><span class=line><span class=cl> <span class=cp>#clock-cells = <0>; 106</span></span></span><span class=line><span class=cl><span class=cp></span> <span class=p>};</span> 107</span></span><span class=line><span class=cl><span class=p>};</span> 108</span></span></code></pre></div><h2 id=booting>Booting</h2><p>The bootloader for this device requires that the DTB be appended to the kernel. This can be done with <code>cat</code>:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-fallback data-lang=fallback><span class=line><span class=cl>cat arch/arm64/boot/Image.gz arch/arm64/boot/dts/nvidia/tegra132-flounder.dtb > image-dtb 109</span></span></code></pre></div><p>A boot image can be made with <code>mkbootimg</code> using the information found by analysing the stock boot image:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-fallback data-lang=fallback><span class=line><span class=cl>mkbootimg --kernel image-dtb -o boot.img --base 0x10000000 --kernel_offset 0x00008000 --ramdisk_offset 0x01000000 --second_offset 0x00f00000 --tags_offset 0x00000100 110</span></span></code></pre></div><p>Now with the mainline boot image, all that’s left to do is test it:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-fallback data-lang=fallback><span class=line><span class=cl>fastboot boot boot.img 111</span></span></code></pre></div><p>And it boots! The Linux boot logs print on the screen until it kernel panics because it can’t find a root file system.</p><h2 id=next-steps>Next steps</h2><p>While seeing mainline Linux boot on the device is pretty cool, there needs to be a way for me to be able to run commands on it.</p><p>For this, I’ll need to:</p><ul><li>Get USB working</li><li>Make a custom initramfs with busybox</li><li>Find out more information about this device and the Tegra architecture</li></ul></div><div class=post-footer id=post-footer><div class=post-info><div class=post-info-line><div class=post-info-mod><span>Updated on 2022-09-21</span></div><div class=post-info-mod></div></div></div><div class=post-nav><a href=/posts/finding_sensors_i2c/ class=prev rel=prev title="Finding unknown sensors with I²C probing"><i class="fas fa-angle-left fa-fw"></i>Previous Post</a></div></div></div></article></div></main><footer class=footer></footer></div><div id=fixed-buttons><a href=# id=back-to-top class=fixed-button title="Back to Top"><i class="fas fa-chevron-up fa-fw"></i></a></div><link rel=stylesheet href=/lib/fontawesome-free/all.min.css><link rel=stylesheet href=/lib/animate/animate.min.css>
111<script src=/lib/lazysizes/lazysizes.min.js></script>
111<script src=/lib/typeit/typeit.min.js></script>
111<script src=/lib/clipboard/clipboard.min.js></script>
111<script>window.config={code:{copyTitle:"Copy to clipboard",maxShownLines:50},comment:{},data:{"id-1":"Rayyan Ansari","id-2":"Rayyan Ansari"},typeit:{cursorChar:"|",cursorSpeed:1e3,data:{"id-1":["id-1"],"id-2":["id-2"]},duration:10,speed:60}}</script>
111<script src=/js/theme.min.js></script>
111</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.