<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.asteroidos.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MagneFire</id>
	<title>AsteroidOS - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.asteroidos.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MagneFire"/>
	<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php/Special:Contributions/MagneFire"/>
	<updated>2026-05-30T11:09:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:MIT&amp;diff=597</id>
		<title>Template:MIT</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:MIT&amp;diff=597"/>
		<updated>2024-12-15T13:50:29Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Icon box&lt;br /&gt;
| box-icons = [[File:MIT_logo.svg|80px]]&lt;br /&gt;
| box-text = This file is licensed under the Expat License, sometimes known as the &#039;&#039;&#039;MIT License&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Copyright © {{{1}}}&lt;br /&gt;
&lt;br /&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:&lt;br /&gt;
&lt;br /&gt;
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.&lt;br /&gt;
&lt;br /&gt;
The Software is provided &amp;quot;as is&amp;quot;, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software. &lt;br /&gt;
| border-color = #88a&lt;br /&gt;
| border-width = 3px&lt;br /&gt;
| background = #f7f8ff&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:GPL-3.0&amp;diff=595</id>
		<title>Template:GPL-3.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:GPL-3.0&amp;diff=595"/>
		<updated>2024-12-15T13:50:29Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.gnu.org/licenses/quick-guide-gplv3.html GNU GPLv3]&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Reference_icon.svg&amp;diff=593</id>
		<title>File:Reference icon.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Reference_icon.svg&amp;diff=593"/>
		<updated>2024-12-15T13:50:29Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{MIT|1=2011-2019 [https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/AUTHORS.txt OOjs UI Team and other contributors]}}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Red_warning_icon.svg&amp;diff=591</id>
		<title>File:Red warning icon.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Red_warning_icon.svg&amp;diff=591"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
[https://commons.wikimedia.org/wiki/File:OOjs_UI_icon_notice-destructive.svg Source]&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{MIT|1=2011-2019 [https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/AUTHORS.txt OOjs UI Team and other contributors]}}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Icon-numix-light-start-here.svg&amp;diff=589</id>
		<title>File:Icon-numix-light-start-here.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Icon-numix-light-start-here.svg&amp;diff=589"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Source: https://github.com/numixproject/numix-icon-theme&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{GPL-3.0}}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Wikipedia&amp;diff=587</id>
		<title>Template:Wikipedia</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Wikipedia&amp;diff=587"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Template:Template}}{{DISPLAYTITLE:Template:wikipedia}}&lt;br /&gt;
&lt;br /&gt;
Link to an Wikipedia article.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;{{wikipedia|Wiki_page_name_with_underscores_instead_of_spaces|optional title}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;{{wikipedia|GCC}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{wikipedia|GCC}}&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;{{wikipedia|GCC|GNU Compiler Collection}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{wikipedia|GCC|GNU Compiler Collection}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://en.wikipedia.org/wiki/{{{1}}} {{{2|{{{1}}}}}}]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Warning&amp;diff=585</id>
		<title>Template:Warning</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Warning&amp;diff=585"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Template}}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;{{warning|Danger! Danger!}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{warning|Danger! Danger!}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{Icon box&lt;br /&gt;
| box-icons = [[File:Red warning icon.svg|20px|link=|Icon]]&lt;br /&gt;
| box-text = &amp;lt;b&amp;gt;WARNING:&amp;lt;/b&amp;gt; {{{1}}}&lt;br /&gt;
| border-color = #d33&lt;br /&gt;
| border-width = 1px&lt;br /&gt;
| background = #fee7e6&lt;br /&gt;
| nomargin = yes&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Template&amp;diff=583</id>
		<title>Template:Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Template&amp;diff=583"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Template}}&lt;br /&gt;
&#039;&#039;&#039;A special template for use in &#039;&#039;all&#039;&#039; template pages.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
This template should be added at the very beginning of all template pages between &#039;noinclude&#039; tags:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;noinclude&amp;amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Template}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;amp;lt;/noinclude&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
A brief description of the template, usage instructions, and output example should also be added between the &#039;noinclude&#039; tags (as in this template).&lt;br /&gt;
&lt;br /&gt;
The template wikitext must be written between &#039;includeonly&#039; tags:&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;includeonly&amp;amp;gt;...&amp;amp;lt;/includeonly&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [https://wiki.archlinux.org/index.php/Template:Template ArchWiki: Template:Template]: the page on which this one is based on&lt;br /&gt;
* [https://wiki.archlinux.org/index.php/Help:Template ArchWiki: Help:Template]: advanced usage instructions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div style=&amp;quot;border: 1px solid lightgray; background: #f8f8f8; padding: 5px; display: inline-block; margin-bottom: 1em;&amp;quot;&amp;gt;This page is a template. It contains no postmarketOS-related information, but should be used as part of other articles.&amp;lt;br&amp;gt;&lt;br /&gt;
Check out [[Special:Whatlinkshere/Template:{{PAGENAME}}|all pages using this template]] and feel free to discuss it in the gitlab [https://gitlab.postmarketos.org/postmarketOS/wiki/-/issues issues].&amp;lt;br&amp;gt;&lt;br /&gt;
For more information, read [[Templates]] and [[Template:Template]].&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Note&amp;diff=581</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Note&amp;diff=581"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Template}}&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;{{note|This page is a work in progress, and is not complete enough at this point to be useful.}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|This page is a work in progress, and is not complete enough at this point to be useful.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{Icon box&lt;br /&gt;
| box-icons = [[File:Reference icon.svg|20px|link=|Note]]&lt;br /&gt;
| box-text = {{{1}}}&lt;br /&gt;
| border-color = #ac6600&lt;br /&gt;
| border-width = 1px&lt;br /&gt;
| background = #f6efe5&lt;br /&gt;
| nomargin = yes&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:MR&amp;diff=579</id>
		<title>Template:MR</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:MR&amp;diff=579"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Template:Template}}{{DISPLAYTITLE:Template:MR}}&lt;br /&gt;
&lt;br /&gt;
Link to a gitlab merge request by specifying:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the merge request&lt;br /&gt;
* &amp;lt;code&amp;gt;repository&amp;lt;/code&amp;gt; (defaults to [https://gitlab.postmarketos.org/postmarketOS/pmbootstrap pmbootstrap])&lt;br /&gt;
* &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt; (defaults to [https://gitlab.postmarketos.org/postmarketOS postmarketOS])&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;{{MR|id|repository|project}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{MR|1600}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{MR|1600}}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{MR|78|osk-sdl}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{MR|78|osk-sdl}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://{{#ifeq:{{{3|postmarketOS}}}|postmarketOS|gitlab.postmarketos.org|gitlab.com}}/{{{3|postmarketOS}}}/{{{2|pmbootstrap}}}/-/merge_requests/{{{1}}} {{{2|}}}!{{{1}}}]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Issue&amp;diff=577</id>
		<title>Template:Issue</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Issue&amp;diff=577"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Template:Template}}{{DISPLAYTITLE:Template:issue}}&lt;br /&gt;
&lt;br /&gt;
Link to a gitlab issue by specifying:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; of the issue&lt;br /&gt;
* &amp;lt;code&amp;gt;repository&amp;lt;/code&amp;gt; (defaults to [https://gitlab.postmarketos.org/postmarketOS/pmbootstrap pmbootstrap])&lt;br /&gt;
* &amp;lt;code&amp;gt;project&amp;lt;/code&amp;gt; (defaults to [https://gitlab.postmarketos.org/postmarketOS postmarketOS])&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;{{issue|id|repository|project}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{issue|1}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{issue|1}}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{issue|1|osk-sdl}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{issue|1|osk-sdl}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;[https://{{#ifeq:{{{3|postmarketOS}}}|postmarketOS|gitlab.postmarketos.org|gitlab.com}}/{{{3|postmarketOS}}}/{{{2|pmbootstrap}}}/-/issues/{{{1}}} {{{2|}}}#{{{1}}}]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Infobox/row&amp;diff=575</id>
		<title>Template:Infobox/row</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Infobox/row&amp;diff=575"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/noinclude&amp;gt;{{#if:{{{header|}}}&lt;br /&gt;
 |&amp;lt;tr&amp;gt;&amp;lt;th colspan=&amp;quot;2&amp;quot; class=&amp;quot;{{{class|}}}&amp;quot; style=&amp;quot;text-align:center; {{{headerstyle|}}}&amp;quot;&amp;gt;{{{header}}}&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 |{{#if:{{{data|}}}&lt;br /&gt;
  |&amp;lt;tr class=&amp;quot;{{{rowclass|}}}&amp;quot;&amp;gt;{{#if:{{{label|}}}&lt;br /&gt;
   |&amp;lt;th scope=&amp;quot;row&amp;quot; style=&amp;quot;text-align:left; {{{labelstyle|}}}&amp;quot;&amp;gt;{{{label}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;td class=&amp;quot;{{{class|}}}&amp;quot; style=&amp;quot;{{{datastyle|}}}&amp;quot;&amp;gt;&lt;br /&gt;
   |&amp;lt;td colspan=&amp;quot;2&amp;quot; class=&amp;quot;{{{class|}}}&amp;quot; style=&amp;quot;text-align:center; {{{datastyle|}}}&amp;quot;&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
{{{data}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Infobox_device&amp;diff=573</id>
		<title>Template:Infobox device</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Infobox_device&amp;diff=573"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Fix for avoiding multiples duplicated note/warning at the top of pages that have multiple device info boxes&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;div  class=&amp;quot;devicenotewarningboxes&amp;quot;  style=&amp;quot;margin: 0.5em 0 0.5em 1em;padding: 0.2em;text-align: left;width: 22em; font-size: 88%; box-sizing: border-box;float: right;clear: right;&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Unsupported architecture warning box&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#switch:{{lc:{{{architecture|}}}}}||x86|x86_64|aarch64|armhf|armv7|riscv64|other=no|#default=yes}}&lt;br /&gt;
|yes|&lt;br /&gt;
{{Warning|This device cannot run postmarketOS, as its architecture is unsupported.}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Armhf warning box&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#switch:{{{architecture|}}}|armhf|ARMhf|other=yes|#default=no}}|yes|{{Warning|This device is &#039;&#039;&#039;not recommended&#039;&#039;&#039; for future use with postmarketOS due to its armhf architecture. Alpine Linux (the distribution that postmarketOS extends) {{issue|599|pmaports}} has been considering dropping it.{{#ifeq:{{lc:{{{changearch|}}} }}|armv7||&amp;lt;br&amp;gt;The processor of the device may support the armv7 architecture. If so, you can [[:Tips_and_tricks#Update_the_architecture_of_your_device|modify the device package and change the architecture accordingly]]. }} }} }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
changearch note box&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{changearch|}}}|{{note| This device is still running on {{lc:{{{architecture|}}} }}, although the processor supports {{lc:{{{changearch|}}} }}. If you own it, change it and test it [[Tips_and_tricks#Update_the_architecture_of_your_device|that]] way. }} }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Cant boot from internal storage note box &lt;br /&gt;
--&amp;gt;{{#ifeq:{{{boot_internal_storage|yes}}}|no|{{Note|pmOS can&#039;t run on its internal storage.{{#ifeq: {{{booting|no}}}|yes| However, it&#039;s possible to boot pmOS from {{#switch:yes| &lt;br /&gt;
  {{#ifeq: {{#replace: {{lc: {{{status_otg |-}}}  }}|n|-}}  |-|| yes }} &lt;br /&gt;
| {{#ifeq: {{#replace: {{lc: {{{status_usba|-}}}  }}|n|-}}  |-|| yes }}&lt;br /&gt;
|other=Usb Stick|#default=}} {{#ifeq: {{#replace: {{lc:{{{status_sdcard|-}}} }}|n|-}} |-|| Sdcard }}. }} }} }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Generic device note box&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{genericdevice|}}}|{{#ifeq:{{{optionalgenericdevice|no}}}|yes|{{note|This page is about the dedicated port of this device. There is also an optional generic port available for this device - see &#039;&#039;&#039;[[{{{genericdevice|}}}]]&#039;&#039;&#039;. }}|{{note|This device is supported as part of a generic port. Refer to &#039;&#039;&#039;[[{{{genericdevice|}}}]]&#039;&#039;&#039; for installation instructions and more information.}} }} }} &lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!--Close for the fix--&amp;gt;{{Infobox&lt;br /&gt;
| name=Infobox&lt;br /&gt;
| bodystyle=&lt;br /&gt;
| title =   {{#replace:{{{manufacturer|}}}|/|/&amp;lt;br&amp;gt;}} {{#replace:{{{name|}}}|/|/&amp;lt;br&amp;gt;}} &lt;br /&gt;
| titlestyle = &lt;br /&gt;
&lt;br /&gt;
|image        = {{#if:{{{image|}}}|[[{{{image|}}}|200px|alt={{{imagecaption|}}}]]}}&lt;br /&gt;
|imagestyle   = &lt;br /&gt;
|caption      = {{{imagecaption|}}}&lt;br /&gt;
|captionstyle = &lt;br /&gt;
&lt;br /&gt;
|header1 =&lt;br /&gt;
|label1  = Manufacturer&lt;br /&gt;
|data1   =  {{#if:{{{manufacturer|}}}|[[:Category:{{{manufacturer|}}}|{{{manufacturer}}}]]}}   &lt;br /&gt;
&lt;br /&gt;
|header2 =&lt;br /&gt;
|label2  = Name&lt;br /&gt;
|data2   = {{#replace:{{{name|}}}|/|/&amp;lt;br&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
|header3 =&lt;br /&gt;
|label3  = Codename&lt;br /&gt;
|data3   = {{{codename|}}}&lt;br /&gt;
&lt;br /&gt;
|header4 =&lt;br /&gt;
|label4  = Model&lt;br /&gt;
|data4   = {{{model|}}}&lt;br /&gt;
&lt;br /&gt;
|header5 =&lt;br /&gt;
|label5  = Released&lt;br /&gt;
|data5   = {{{releaseyear|}}}&lt;br /&gt;
&lt;br /&gt;
|header6 =&lt;br /&gt;
|label6  = Pre-released&lt;br /&gt;
|data6   = {{{prereleaseyear|}}}&lt;br /&gt;
&amp;lt;!--lc is for making type be lowercase--&amp;gt;&lt;br /&gt;
|header7 = &lt;br /&gt;
|label7  = Type&lt;br /&gt;
|data7   = {{#if:{{{type|}}}|[[:Category:{{{type|}}}|{{lc:{{{type|}}}}}]]}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hide Hardware header if all subfeatures are listed as unavailable.&lt;br /&gt;
     We use a funny trick here - let say every  string is unseted in Hardware&lt;br /&gt;
     so when combined together they form &amp;quot;&amp;quot;... If that is detected,&lt;br /&gt;
     we hide the header. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|header8 = {{#ifeq:{{{som|}}}{{{chipset|}}}{{{cpu|}}}{{{gpu|}}}{{{display|}}}{{{storage|}}}{{{memory|}}}{{{architecture|}}}{{{wp_type|}}}|||Hardware}}&lt;br /&gt;
|label8  =&lt;br /&gt;
|data8  =&lt;br /&gt;
&lt;br /&gt;
|header9 = &lt;br /&gt;
|label9 = Chipset&lt;br /&gt;
|data9  = {{#if:{{{chipset|}}}|[[{{{chipset|}}}]]}}&lt;br /&gt;
&lt;br /&gt;
|header10 = &lt;br /&gt;
|label10  = CPU&lt;br /&gt;
|data10   = {{{cpu|}}}&lt;br /&gt;
&lt;br /&gt;
|header11 = &lt;br /&gt;
|label11  = GPU&lt;br /&gt;
|data11   = {{{gpu|}}}&lt;br /&gt;
&lt;br /&gt;
|header12 = &lt;br /&gt;
|label12  = System-on-Module&lt;br /&gt;
|data12   = {{#if:{{{som|}}}|[[{{{som|}}}]]}}&lt;br /&gt;
&lt;br /&gt;
|header13 = &lt;br /&gt;
|label13  = Display&lt;br /&gt;
|data13   = {{{display|}}}&lt;br /&gt;
&lt;br /&gt;
|header14 = &lt;br /&gt;
|label14  = Storage&lt;br /&gt;
|data14   = {{{storage|}}}&lt;br /&gt;
&lt;br /&gt;
|header15 = &lt;br /&gt;
|label15  = Memory&lt;br /&gt;
|data15   = {{{memory|}}}&lt;br /&gt;
&lt;br /&gt;
|header16 = &lt;br /&gt;
|label16  = Architecture&lt;br /&gt;
|data16   = {{#if:{{lc:{{{architecture|}}} }}|[[:Category:{{lc:{{{architecture|}}} }}|{{lc:{{{architecture|}}} }}]]}} &lt;br /&gt;
&lt;br /&gt;
|header17 = &lt;br /&gt;
|label17  = Write-Protect type&lt;br /&gt;
|data17   = {{#if:{{{wp_type|}}}|{{{wp_type|}}}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Software header. Same trick as above. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|header18 = {{#ifeq: {{#replace:{{{status_fossbootloader|-}}}|-|}} {{{originalsoftware|}}}{{{originalversion|}}}{{{extendedversion|}}}{{{optionalsoftware|}}}|||Software}}&lt;br /&gt;
|label18  =&lt;br /&gt;
|data18   =&lt;br /&gt;
&lt;br /&gt;
|header19 =&lt;br /&gt;
|label19  = Original software&lt;br /&gt;
|data19   = {{#if:{{{originalsoftware|}}}|[[:Category:{{{originalsoftware|}}}|{{{originalsoftware}}}]]}}&lt;br /&gt;
&lt;br /&gt;
|header20 =&lt;br /&gt;
|label20  = &amp;lt;abbr title=&amp;quot;The version the device was shipped with.&amp;quot;&amp;gt;Original version&amp;lt;/abbr&amp;gt;&lt;br /&gt;
|data20   = {{{originalversion|}}}&lt;br /&gt;
&lt;br /&gt;
|header21 =&lt;br /&gt;
|label21  = &amp;lt;abbr title=&amp;quot;The most recent supported version from the manufacturer.&amp;quot;&amp;gt;Extended version&amp;lt;/abbr&amp;gt;&lt;br /&gt;
|data21   = {{{extendedversion|}}}&lt;br /&gt;
&lt;br /&gt;
|header22 =&lt;br /&gt;
|label22  = Optional software&lt;br /&gt;
|data22   =  {{{optionalsoftware|}}}&lt;br /&gt;
&lt;br /&gt;
|header23 =&lt;br /&gt;
|label23  = {{#ifeq:{{{status_fossbootloader|-}}}|-|| FOSS bootloader }}&lt;br /&gt;
|data23   = {{#ifeq:{{{status_fossbootloader|-}}}|-|| {{#switch: {{{status_fossbootloader|N}}}|Y|y=yes|P|p=partial|N|n=no|{{{status_fossbootloader|}}} }} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- postmarketos header. Same trick as above. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|header24 = {{#ifeq: {{{prebuiltimages|{{#switch: {{{category|testing}}}|main = yes|community = yes|testing = no}}}}}{{#replace:{{{status_mainline|N}}}|-|}}  {{{pmoskernel|}}}{{{whet_dhry|}}}{{{genericdevice|}}}{{{category|testing}}}|||postmarketOS}}&lt;br /&gt;
|label24  =&lt;br /&gt;
|data24   =&lt;br /&gt;
&lt;br /&gt;
|header25 =&lt;br /&gt;
|label25  = Category&lt;br /&gt;
|data25   = {{{category|testing}}}&lt;br /&gt;
&lt;br /&gt;
|header26 =&lt;br /&gt;
|label26 = &amp;lt;abbr title=&amp;quot;Whether pre-built images are available at postmarketos.org/download.&amp;quot;&amp;gt;Pre-built images&amp;lt;/abbr&amp;gt;&lt;br /&gt;
|data26 = {{{prebuiltimages|{{#switch: {{{category|testing}}}|main = yes|community = yes|testing = no}}}}}&lt;br /&gt;
&lt;br /&gt;
|header27 =&lt;br /&gt;
|label27  = {{#ifeq:{{{category|testing}}}|testing | &amp;lt;abbr title=&amp;quot;Instead of a Linux kernel fork, it is possible to run [[(Close to) Mainline]].&amp;quot;&amp;gt;Mainline&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data27   = {{#ifeq:{{{category|testing}}}|testing |{{#switch: {{{status_mainline|N}}}|Y|y=yes|P|p=partial|N|n=no|{{{status_mainline|no}}} }} }}&lt;br /&gt;
&lt;br /&gt;
|header28 =&lt;br /&gt;
|label28  = postmarketOS kernel&lt;br /&gt;
|data28   = {{{pmoskernel|}}}&lt;br /&gt;
&lt;br /&gt;
|header29 = &lt;br /&gt;
|label29  = Unixbench Whet/Dhry score&lt;br /&gt;
|data29   = {{#if:{{{whet_dhry|}}}|{{{whet_dhry|}}}}}&lt;br /&gt;
&lt;br /&gt;
|header30 = &lt;br /&gt;
|label30  =  {{#ifeq: {{{optionalgenericdevice|no}}}|yes|Optional Generic Port|Generic port}}&lt;br /&gt;
|data30   = {{#if:{{{genericdevice|}}}|[[{{{genericdevice|}}}]]}} &lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Unsupported devices / Non Booting Box&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{{supported|yes}}}|yes|{{#ifeq: {{{booting|yes}}} | no | &amp;lt;div class=&amp;quot;infobox&amp;quot; style=&amp;quot;width: 22em; box-sizing: border-box; background-color: #fee7e6; border-color: #d33; border-width: 2px; color: #000; padding: 4px; text-align: center;&amp;quot;&amp;gt;This device is marked as &#039;&#039;&#039;not booting&#039;&#039;&#039;.{{#if: {{{status|}}} | &amp;lt;/br&amp;gt;Status: &#039;&#039;{{{status|}}}&#039;&#039; |}}&amp;lt;/div&amp;gt;|}}}}&lt;br /&gt;
{{#ifeq:{{{packaged|yes}}}|no|{{#ifeq: {{{booting|yes}}}| yes | &amp;lt;div class=&amp;quot;infobox&amp;quot; style=&amp;quot;width: 22em; box-sizing: border-box; background-color: #fee7e6; border-color: #d33; border-width: 2px; color: #000; padding: 4px; text-align: left;&amp;quot;&amp;gt;This device has been tested with postmarketOS, but &#039;&#039;&#039;its device package has not yet been added to the postmarketOS repositories&#039;&#039;&#039;.&amp;lt;/br&amp;gt;&amp;lt;small&amp;gt;This means that it cannot be selected in pmbootstrap.&amp;lt;/small&amp;gt;{{#if: {{{status|}}} | &amp;lt;/br&amp;gt;Status: &#039;&#039;{{{status|}}}&#039;&#039; |}}&amp;lt;/div&amp;gt;|}}|}}&lt;br /&gt;
{{#ifeq:{{{supported|yes}}}|no|{{#ifeq: yes| yes | &amp;lt;div class=&amp;quot;infobox&amp;quot; style=&amp;quot;width: 22em; box-sizing: border-box; background-color: #fee7e6; border-color: #d33; border-width: 2px; color: #000; padding: 4px; text-align: left;&amp;quot;&amp;gt;This device is &#039;&#039;&#039;unsupported&#039;&#039;&#039; by postmarketOS (most likely due to its architecture being unsupported, or limited system resources).&amp;lt;/br&amp;gt;{{#if: {{{status|}}} | &amp;lt;/br&amp;gt;&#039;&#039;Reason: {{{status|}}}&#039;&#039; |}}&amp;lt;/div&amp;gt;|}}|}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Hide features on generic non-booting non-supported device unless the page specifically disabled the hiding.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{{hidefeatures| {{#switch: yes| {{#ifeq:{{{type|}}}|generic|yes|no}} | {{#ifeq:{{{booting|yes}}}|no|yes|no}} | {{#ifeq:{{{supported|yes}}}|no|yes|no}} |other=yes|#default=no}} }}} |yes||&lt;br /&gt;
{{Infobox&lt;br /&gt;
| name=Features&lt;br /&gt;
| bodystyle=&lt;br /&gt;
| title = Features&lt;br /&gt;
| titlestyle = &lt;br /&gt;
&lt;br /&gt;
|header1 =&lt;br /&gt;
|label1  = {{#ifeq:{{{status_flashing|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to flash the device with `pmbootstrap flasher`.&amp;quot;&amp;gt;Flashing&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data1   = {{#ifeq:{{{status_flashing|}}}|-|| {{Feature|{{{status_flashing|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header2  =&lt;br /&gt;
|label2  = {{#ifeq:{{{status_usbnet|}}}|-|| &amp;lt;abbr title=&amp;quot;After connecting the device with USB to your PC, you can connect to it via telnet (initramfs) or SSH (booted system).&amp;quot;&amp;gt;USB Networking&amp;lt;/abbr&amp;gt; }} &lt;br /&gt;
|data2   = {{#ifeq:{{{status_usbnet|}}}|-|| {{Feature|{{{status_usbnet|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--flag Internal storage at broken by default on rotuer because most rotuers use raw nand/Nor and that isnt supported by pmOS.--&amp;gt;&lt;br /&gt;
|header3 =&lt;br /&gt;
|label3  = {{#ifeq:{{{status_emmc| {{#ifeq:{{lc:{{{type|}}}}}|router|P}} }}}|-|| Internal storage }}&lt;br /&gt;
|data3   = {{#ifeq:{{{status_emmc| {{#ifeq:{{lc:{{{type|}}}}}|router|P}} }}}|-|| {{Feature|{{{status_emmc| {{#ifeq:{{lc:{{{type|}}}}}|router|P}} }}} }} }}&lt;br /&gt;
&lt;br /&gt;
|header4 =&lt;br /&gt;
|label4  = {{#ifeq:{{{status_sdcard|}}}|-|| &amp;lt;abbr title=&amp;quot;Also includes other external storage cards&amp;quot;&amp;gt;SD card&amp;lt;/abbr&amp;gt;  }}&lt;br /&gt;
|data4  = {{#ifeq:{{{status_sdcard|}}}|-|| {{Feature|{{{status_sdcard|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header5 =&lt;br /&gt;
|label5  = {{#ifeq:{{{status_battery|}}}|-|| &amp;lt;abbr title=&amp;quot;Charging and battery level reporting works&amp;quot;&amp;gt;Battery&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data5   = {{#ifeq:{{{status_battery|}}}|-|| {{Feature|{{{status_battery|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header6 =&lt;br /&gt;
|label6  = {{#ifeq:{{{status_screen|}}}|-|| &amp;lt;abbr title=&amp;quot;Display works. Ideally with sleep mode and brightness control.&amp;quot;&amp;gt;Screen&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data6   = {{#ifeq:{{{status_screen|}}}|-|| {{Feature|{{{status_screen|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header7 =&lt;br /&gt;
|label7  = {{#ifeq:{{{status_touch|}}}|-|| Touchscreen }}&lt;br /&gt;
|data7   = {{#ifeq:{{{status_touch|}}}|-|| {{Feature|{{{status_touch|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware (only used on laptops), hidden by default --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|header8 =&lt;br /&gt;
|label8 = {{#ifeq:{{{status_keyboard|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable=|#default=-}}}}}|-|| Keyboard }}&lt;br /&gt;
|data8  = {{#ifeq:{{{status_keyboard|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable=|#default=-}}}}}|-|| {{Feature|{{{status_keyboard|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware (only used on laptops), hidden by default --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|header9 =&lt;br /&gt;
|label9  = {{#ifeq:{{{status_touchpad|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable=|#default=-}}}}}|-|| Touchpad }}&lt;br /&gt;
|data9   = {{#ifeq:{{{status_touchpad|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable=|#default=-}}}}}|-|| {{Feature|{{{status_touchpad|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware, hidden by default --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|header10 =&lt;br /&gt;
|label10  = {{#ifeq:{{{status_stylus|-}}}|-|| Stylus }}&lt;br /&gt;
|data10  = {{#ifeq:{{{status_stylus|-}}}|-|| {{Feature|{{{status_stylus|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hide Multimedia header if all subfeatures are listed as unavailable.&lt;br /&gt;
     We use a funny trick here - every unavailable feature is set to &amp;quot;-&amp;quot;,&lt;br /&gt;
     so when combined together they form &amp;quot;---&amp;quot;... If that is detected,&lt;br /&gt;
     we hide the header.Smaller trick as above.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|header11 = {{#ifeq: {{{status_3d|}}}{{{status_dvb|-}}}{{{status_audio|}}}{{{status_camera|}}}{{{status_cameraflash|}}}{{{status_irtx|-}}}{{{status_irrx|{{#switch: {{lc:{{{type|}}}}}|set-top box|other=|#default=-}} }}}|-------||Multimedia}}&lt;br /&gt;
|label11  =&lt;br /&gt;
|data11   =&lt;br /&gt;
&lt;br /&gt;
|header12 =&lt;br /&gt;
|label12  = {{#ifeq:{{{status_3d|}}}|-|| 3D Acceleration }}&lt;br /&gt;
|data12   = {{#ifeq:{{{status_3d|}}}|-|| {{Feature|{{{status_3d|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware, hidden by default --&amp;gt;&lt;br /&gt;
|header13 =&lt;br /&gt;
|label13  = {{#ifeq:{{{status_dvb|-}}}|-|| &amp;lt;abbr title=&amp;quot;TV tuner/DVB device&amp;quot;&amp;gt;Built-in DVB&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data13   = {{#ifeq:{{{status_dvb|-}}}|-|| {{Feature|{{{status_dvb|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header14 =&lt;br /&gt;
|label14  = {{#ifeq:{{{status_audio|}}}|-|| &amp;lt;abbr title=&amp;quot;Audio playback, microphone, headset and buttons.&amp;quot;&amp;gt;Audio&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data14  = {{#ifeq:{{{status_audio|}}}|-|| {{Feature|{{{status_audio|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header15 =&lt;br /&gt;
|label15  = {{#ifeq:{{{status_camera|}}}|-|| Camera }}&lt;br /&gt;
|data15   = {{#ifeq:{{{status_camera|}}}|-|| {{Feature|{{{status_camera|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header16 =&lt;br /&gt;
|label16  = {{#ifeq:{{{status_cameraflash|}}}|-|| Camera Flash }}&lt;br /&gt;
|data16   = {{#ifeq:{{{status_cameraflash|}}}|-|| {{Feature|{{{status_cameraflash|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware, hidden by default. Listed in Multimedia since it&#039;s most likely to be used for TV remotes ( emulating a remote). --&amp;gt;&lt;br /&gt;
|header17 =&lt;br /&gt;
|label17  = {{#ifeq:{{{status_irtx|-}}}|-|| IR TX }}&lt;br /&gt;
|data17   = {{#ifeq:{{{status_irtx|-}}}|-|| {{Feature|{{{status_irtx|}}}}} }}&lt;br /&gt;
&amp;lt;!-- Uncommon hardware  (only used in stb), hidden by default. Listed in Multimedia since it&#039;s most likely to be used for TV remotes ( receiving signal). --&amp;gt;&lt;br /&gt;
|header18 =&lt;br /&gt;
|label18  = {{#ifeq:{{{status_irrx|{{#switch: {{lc:{{{type|}}}}}|set-top box|other=|#default=-}} }}} |-|| IR RX }}&lt;br /&gt;
|data18   = {{#ifeq:{{{status_irrx|{{#switch: {{lc:{{{type|}}}}}|set-top box|other=|#default=-}} }}} |-|| {{Feature|{{{status_irrx|}}} }} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Connectivity header, see notes in Multimedia header --&amp;gt;&lt;br /&gt;
|header19 = {{#ifeq: {{{status_wifi|}}}{{{status_bluetooth|}}}{{{status_ethernet|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable|Development Board|single Board Computer|set-top box|other=|#default=-}}}}}{{{status_gps|}}}{{{status_nfc|}}}|-----||Connectivity}}&lt;br /&gt;
|label19  =&lt;br /&gt;
|data19   =&lt;br /&gt;
&lt;br /&gt;
|header20 =&lt;br /&gt;
|label20  = {{#ifeq:{{{status_wifi|}}}|-|| WiFi }}&lt;br /&gt;
|data20   = {{#ifeq:{{{status_wifi|}}}|-|| {{Feature|{{{status_wifi|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header21 =&lt;br /&gt;
|label21  = {{#ifeq:{{{status_bluetooth|}}}|-|| Bluetooth }}&lt;br /&gt;
|data21   = {{#ifeq:{{{status_bluetooth|}}}|-|| {{Feature|{{{status_bluetooth|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware (only used on laptops/SBCs), hidden by default --&amp;gt;&lt;br /&gt;
|header22 =&lt;br /&gt;
|label22  = {{#ifeq:{{{status_ethernet|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable|Development Board|single Board Computer|set-top box|other=|#default=-}}}}}|-|| Ethernet }}&lt;br /&gt;
|data22   = {{#ifeq:{{{status_ethernet|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable|development Board|single Board Computer|set-top box|other=|#default=-}}}}}|-|| {{Feature|{{{status_ethernet|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header23 =&lt;br /&gt;
|label23  = {{#ifeq:{{{status_gps|}}}|-|| GPS }}&lt;br /&gt;
|data23   = {{#ifeq:{{{status_gps|}}}|-|| {{Feature|{{{status_gps|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header24 =&lt;br /&gt;
|label24  = {{#ifeq:{{{status_nfc|}}}|-|| &amp;lt;abbr title=&amp;quot;Near Field Communication&amp;quot;&amp;gt;NFC&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data24   = {{#ifeq:{{{status_nfc|}}}|-|| {{Feature|{{{status_nfc|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Modem header; see Multimedia above for switch explanation. --&amp;gt;&lt;br /&gt;
|header25 = {{#ifeq: {{{status_calls|}}}{{{status_sms|}}}{{{status_mobiledata|}}}|---||Modem}}&lt;br /&gt;
|label25  =&lt;br /&gt;
|data25   =&lt;br /&gt;
&lt;br /&gt;
|header26 =&lt;br /&gt;
|label26  = {{#ifeq:{{{status_calls|}}}|-|| Calls }}&lt;br /&gt;
|data26   = {{#ifeq:{{{status_calls|}}}|-|| {{Feature|{{{status_calls|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header27 =&lt;br /&gt;
|label27  = {{#ifeq:{{{status_sms|}}}|-|| SMS }}&lt;br /&gt;
|data27   = {{#ifeq:{{{status_sms|}}}|-|| {{Feature|{{{status_sms|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header28 =&lt;br /&gt;
|label28  = {{#ifeq:{{{status_mobiledata|}}}|-|| Mobile data }}&lt;br /&gt;
|data28   = {{#ifeq:{{{status_mobiledata|}}}|-|| {{Feature|{{{status_mobiledata|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Miscellaneous header. Same trick as above. --&amp;gt;&lt;br /&gt;
|header29 = {{#ifeq: {{{status_fde|}}}{{{status_usba|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable|single board computer|development Board|set-top box|other=|#default=-}}}}}{{{status_otg|}}}{{{status_hdmidp|}}}{{{status_haptics|}}}|-----||Miscellaneous}}&lt;br /&gt;
|label29  =&lt;br /&gt;
|data29   =&lt;br /&gt;
&lt;br /&gt;
|header30 =&lt;br /&gt;
|label30  = {{#ifeq:{{{status_fde|}}}|-|| &amp;lt;abbr title=&amp;quot;Full disk encryption and unlocking with unl0kr.&amp;quot;&amp;gt;FDE&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data30   = {{#ifeq:{{{status_fde|}}}|-|| {{Feature|{{{status_fde|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware (only used on laptops/SBCs), hidden by default --&amp;gt;&lt;br /&gt;
|header31 =&lt;br /&gt;
|label31  = {{#ifeq:{{{status_usba|{{#switch:{{lc:{{{type|}}}}}|laptop|convertible|detachable|single Board computer|development Board|set-top box|other=|#default=-}}}}}|-|| &amp;lt;abbr title=&amp;quot;Full-sized USB-A port works (Usually applicable to SBCs and laptops).&amp;quot;&amp;gt;USB-A&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data31   = {{#ifeq:{{{status_usba|{{#switch: {{lc:{{{type|}}}}}|laptop|convertible|detachable|single board bomputer|development Board|set-top box|other=|#default=-}}}}}|-|| {{Feature|{{{status_usba|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header32 =&lt;br /&gt;
|label32  = {{#ifeq:{{{status_otg|}}}|-|| &amp;lt;abbr title=&amp;quot;USB On-The-Go or USB-C Role switching&amp;gt;USB OTG&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data32   = {{#ifeq:{{{status_otg|}}}|-|| {{Feature|{{{status_otg|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header33 =&lt;br /&gt;
|label33  = {{#ifeq:{{{status_hdmidp|}}}|-|| &amp;lt;abbr title=&amp;quot;Video and audio output with HDMI or Display Port works.&amp;quot;&amp;gt;HDMI/DP&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data33  = {{#ifeq:{{{status_hdmidp|}}}|-|| {{Feature|{{{status_hdmidp|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Sensors header. Same trick as above. --&amp;gt;&lt;br /&gt;
|header34 = {{#ifeq:{{{status_accel|}}}{{{status_magnet|}}}{{{status_light|}}}{{{status_proximity|}}}{{{status_hall|}}}{{{status_barometer|}}}{{{status_powersensor|-}}}|-------||Sensors}}&lt;br /&gt;
|label34  =&lt;br /&gt;
|data34   =&lt;br /&gt;
&lt;br /&gt;
|header35 =&lt;br /&gt;
|label35  = {{#ifeq:{{{status_accel|}}}|-|| &amp;lt;abbr title=&amp;quot;Auto screen rotation works in desktops e.g. Phosh or Plasma Mobile&amp;quot;&amp;gt;Accelerometer&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data35   = {{#ifeq:{{{status_accel|}}}|-|| {{Feature|{{{status_accel|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header36 =&lt;br /&gt;
|label36 = {{#ifeq:{{{status_magnet|}}}|-|| &amp;lt;abbr title=&amp;quot;Sensor to measure magnetism&amp;quot;&amp;gt;Magnetometer&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data36   = {{#ifeq:{{{status_magnet|}}}|-|| {{Feature|{{{status_magnet|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header37 =&lt;br /&gt;
|label37  = {{#ifeq:{{{status_light|}}}|-|| Ambient Light }}&lt;br /&gt;
|data37   = {{#ifeq:{{{status_light|}}}|-|| {{Feature|{{{status_light|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header38 =&lt;br /&gt;
|label38  = {{#ifeq:{{{status_proximity|}}}|-|| Proximity }}&lt;br /&gt;
|data38   = {{#ifeq:{{{status_proximity|}}}|-|| {{Feature|{{{status_proximity|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header39 =&lt;br /&gt;
|label39  = {{#ifeq:{{{status_hall|}}}|-|| &amp;lt;abbr title=&amp;quot;Also known as flip cover sensor&amp;quot;&amp;gt;Hall Effect&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data39   = {{#ifeq:{{{status_hall|}}}|-|| {{Feature|{{{status_hall|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header40 =&lt;br /&gt;
|label40  = {{#ifeq:{{{status_haptics|}}}|-|| Haptics }}&lt;br /&gt;
|data40   = {{#ifeq:{{{status_haptics|}}}|-|| {{Feature|{{{status_haptics|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header41 =&lt;br /&gt;
|label41 = {{#ifeq:{{{status_barometer|}}}|-|| &amp;lt;abbr title=&amp;quot;Sensor to measure air pressure&amp;gt;Barometer&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data41   = {{#ifeq:{{{status_barometer|}}}|-|| {{Feature|{{{status_barometer|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Uncommon hardware, hidden by default --&amp;gt;&lt;br /&gt;
|header42 =&lt;br /&gt;
|label42  = {{#ifeq:{{{status_powersensor|-}}}|-|| &amp;lt;abbr title=&amp;quot;Sensor to monitor current, voltage and power. Not fuel gauge!&amp;quot;&amp;gt;Power Sensor&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data42   = {{#ifeq:{{{status_powersensor|-}}}|-|| {{Feature|{{{status_powersensor|}}}}} }}&lt;br /&gt;
}}&amp;lt;!--Close for hidefeatures--&amp;gt;}}{{#if: {{{status_uboot|}}}&lt;br /&gt;
|{{Infobox&lt;br /&gt;
| name=U-Boot&lt;br /&gt;
| bodystyle=&lt;br /&gt;
| title = U-Boot&lt;br /&gt;
| titlestyle = &lt;br /&gt;
&lt;br /&gt;
|header1 =&lt;br /&gt;
|label1  = {{#ifeq:{{{status_uboot_primary|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to replace stock bootloader with U-Boot.&amp;quot;&amp;gt;Primary Bootloader&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data1   = {{#ifeq:{{{status_uboot_primary|}}}|-|| {{Feature|{{{status_uboot_primary|}}}}} }}&lt;br /&gt;
|header2 =&lt;br /&gt;
|label2  = {{#ifeq:{{{status_uboot_secondary|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to chainload U-Boot from stock bootloader.&amp;quot;&amp;gt;Secondary Bootloader&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data2   = {{#ifeq:{{{status_uboot_secondary|}}}|-|| {{Feature|{{{status_uboot_secondary|}}}}} }}&lt;br /&gt;
|header3 =&lt;br /&gt;
|label3  = {{#ifeq:{{{status_uboot_mainline|}}}|-|| &amp;lt;abbr title=&amp;quot;Latest versions of U-Boot are not broken and it is possible to use them.&amp;quot;&amp;gt;Mainline&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data3   = {{#ifeq:{{{status_uboot_mainline|}}}|-|| {{Feature|{{{status_uboot_mainline|}}}}} }}&lt;br /&gt;
|header4 =&lt;br /&gt;
|label4  = {{#ifeq:{{{status_uboot_internalstorage|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to boot from internal storage (e.g. eMMC or UFS).&amp;quot;&amp;gt;Internal Storage&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data4   = {{#ifeq:{{{status_uboot_internalstorage|}}}|-|| {{Feature|{{{status_uboot_internalstorage|}}}}} }}&lt;br /&gt;
|header5 =&lt;br /&gt;
|label5  = {{#ifeq:{{{status_uboot_sd|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to boot from SD card.&amp;quot;&amp;gt;SD card&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data5   = {{#ifeq:{{{status_uboot_sd|}}}|-|| {{Feature|{{{status_uboot_sd|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header6 =&lt;br /&gt;
|label6  = {{#ifeq:{{{status_uboot_usbhost|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to boot from a USB storage or connect a keyboard.&amp;quot;&amp;gt;USB Host&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data6   = {{#ifeq:{{{status_uboot_usbhost|}}}|-|| {{Feature|{{{status_uboot_usbhost|}}}}} }}&lt;br /&gt;
&lt;br /&gt;
|header7 =&lt;br /&gt;
|label7  = {{#ifeq:{{{status_uboot_usbperipheral|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to use device as a peripheral in U-Boot, e.g. for fastboot mode.&amp;quot;&amp;gt;USB Peripheral&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data7   = {{#ifeq:{{{status_uboot_usbperipheral|}}}|-|| {{Feature|{{{status_uboot_usbperipheral|}}}}} }}&lt;br /&gt;
|header8 =&lt;br /&gt;
|label8  = {{#ifeq:{{{status_uboot_screen|}}}|-|| Display }}&lt;br /&gt;
|data8   = {{#ifeq:{{{status_uboot_screen|}}}|-|| {{Feature|{{{status_uboot_screen|}}}}} }}&lt;br /&gt;
|header9 =&lt;br /&gt;
|label9  = {{#ifeq:{{{status_uboot_keyboard|}}}|-|| Keyboard }}&lt;br /&gt;
|data9   = {{#ifeq:{{{status_uboot_keyboard|}}}|-|| {{Feature|{{{status_uboot_keyboard|}}}}} }}&lt;br /&gt;
|header10 =&lt;br /&gt;
|label10  = {{#ifeq:{{{status_uboot_buttons|}}}|-|| &amp;lt;abbr title=&amp;quot;It is possible to navigate in boot menu or grub with volume and power buttons.&amp;quot;&amp;gt;Buttons&amp;lt;/abbr&amp;gt; }}&lt;br /&gt;
|data10   = {{#ifeq:{{{status_uboot_buttons|}}}|-|| {{Feature|{{{status_uboot_buttons|}}}}} }}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Close for status_uboot&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Windows Phone Tips ant Trick Box&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#ifeq:{{#switch:{{lc:{{{originalsoftware|}}}}}|windows mobile|windows phone|other=yes|#default=no}}|yes|&lt;br /&gt;
{{Sidebox&lt;br /&gt;
| box-text = &amp;lt;b&amp;gt;This device is a Windows Phone.&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;See the [[Windows Mobile]] page for common tips, guides and troubleshooting steps&lt;br /&gt;
| border-color = #1ba1e2&lt;br /&gt;
| border-width = 3px&lt;br /&gt;
| background = #a2ddfa&lt;br /&gt;
}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
cargo_declare (for defining the table)&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#cargo_declare:&lt;br /&gt;
_table=Devices&lt;br /&gt;
|Manufacturer=String&lt;br /&gt;
|Name=String&lt;br /&gt;
|Codename=String&lt;br /&gt;
|Model=String&lt;br /&gt;
|Released=Date&lt;br /&gt;
|Chipset=String&lt;br /&gt;
|OriginalSoftware=String&lt;br /&gt;
|PmosKernel=String&lt;br /&gt;
|CPU=String&lt;br /&gt;
|GPU=String&lt;br /&gt;
|Display=String&lt;br /&gt;
|Storage=String&lt;br /&gt;
|Memory=String&lt;br /&gt;
|StatusUsbnet=String (size=1)&lt;br /&gt;
|StatusFlashing=String (size=1)&lt;br /&gt;
|StatusTouch=String (size=1)&lt;br /&gt;
|StatusScreen=String (size=1)&lt;br /&gt;
|StatusSdcard=String&lt;br /&gt;
|StatusWifi=String (size=1)&lt;br /&gt;
|StatusFde=String (size=1)&lt;br /&gt;
|StatusMainline=String (size=1)&lt;br /&gt;
|StatusBattery=String (size=1)&lt;br /&gt;
|Status3d=String (size=1)&lt;br /&gt;
|StatusAccel=String (size=1)&lt;br /&gt;
|StatusMagnet=String (size=1)&lt;br /&gt;
|StatusLight=String (size=1)&lt;br /&gt;
|StatusProximity=String (size=1)&lt;br /&gt;
|StatusHall=String (size=1)&lt;br /&gt;
|StatusAudio=String (size=1)&lt;br /&gt;
|StatusBluetooth=String (size=1)&lt;br /&gt;
|StatusCamera=String (size=1)&lt;br /&gt;
|StatusDvb=String (size=1)&lt;br /&gt;
|Statuscameraflash=String (size=1)&lt;br /&gt;
|StatusGps=String (size=1)&lt;br /&gt;
|StatusMobiledata=String (size=1)&lt;br /&gt;
|StatusSms=String (size=1)&lt;br /&gt;
|StatusCalls=String (size=1)&lt;br /&gt;
|StatusStatus=Text&lt;br /&gt;
|StatusUart=String (size=1)&lt;br /&gt;
|StatusHaptics=String (size=1)&lt;br /&gt;
|Architecture=String&lt;br /&gt;
|StatusEthernet=String&lt;br /&gt;
|Booting=Boolean&lt;br /&gt;
|Packaged=Boolean&lt;br /&gt;
|Supported=Boolean&lt;br /&gt;
|WhetDhry=Float&lt;br /&gt;
|StatusOtg=String (size=1)&lt;br /&gt;
|Category=String&lt;br /&gt;
|PrebuiltImages=Boolean&lt;br /&gt;
|StatusNfc=String (size=1)&lt;br /&gt;
|StatusIrtx=String (size=1)&lt;br /&gt;
|StatusIrrx=String (size=1)&lt;br /&gt;
|StatusUbootPrimary=String&lt;br /&gt;
|StatusUbootSecondary=String&lt;br /&gt;
|StatusUbootMainline=String&lt;br /&gt;
|StatusUbootInternalStorage=String&lt;br /&gt;
|StatusUbootSd=String&lt;br /&gt;
|StatusUbootUsbhost=String&lt;br /&gt;
|StatusUbootUsbperipheral=String&lt;br /&gt;
|StatusUbootScreen=String&lt;br /&gt;
|StatusUbootKeyboard=String&lt;br /&gt;
|StatusUbootButtons=String&lt;br /&gt;
|StatusUboot=String&lt;br /&gt;
|StatusBarometer=String&lt;br /&gt;
|StatusPowerSensor=String&lt;br /&gt;
|StatusUsba=String&lt;br /&gt;
|genericdevice=String&lt;br /&gt;
|optionalgenericdevice=Boolean&lt;br /&gt;
|som=String&lt;br /&gt;
|StatusStylus=String&lt;br /&gt;
|StatusHdmidp=String&lt;br /&gt;
|StatusKeyboard=String&lt;br /&gt;
|StatusTouchpad=String&lt;br /&gt;
|DeviceType=String&lt;br /&gt;
|StatusEmmc=String&lt;br /&gt;
|boot_internal_storage=String&lt;br /&gt;
|DevicePage=Page &amp;lt;!-- This contains the escaped page name and can be used to join the device owner and devices table --&amp;gt;&lt;br /&gt;
|ChangeArch=String&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Setting Category&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:Devices]]&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{type|}}}|[[Category:{{{type|}}}]]|}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{lc:{{{architecture|}}} }}|[[Category:{{lc:{{{architecture|}}} }}]]|}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{manufacturer|}}}|[[Category:{{{manufacturer|}}}]]|}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{originalsoftware|}}}|[[Category:{{{originalsoftware|}}}]]|}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq:{{{supported|yes}}}|yes|{{#ifeq:{{{booting|no}}}|no|[[Category:Not booting]]}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq:{{{supported|yes}}}|yes|{{#ifeq:{{{packaged|yes}}}|no|{{#ifeq: {{{booting|yes}}}| yes |[[Category:Not Packaged]]|}}|}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq:{{{supported|yes}}}|no|[[Category:Unsupported Devices]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{changearch|}}}|[[Category:Ports that could be switched to another architecture]]}}&lt;br /&gt;
{{#ifeq:{{{status_uart|}}}|Y|[[Category:Devices with known UART pinout]]}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
Store variables to the cargo table&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#cargo_store:_table=Devices|Manufacturer={{{manufacturer|}}}|Name={{{name|}}}|Codename={{{codename|}}}|boot_internal_storage={{{boot_internal_storage|yes}}}|Model={{{model|}}}|Released={{{releaseyear|}}}|Pre-released={{{prereleaseyear|}}}|Chipset={{{chipset|}}}|OriginalSoftware={{{originalsoftware|}}}|PmosKernel={{{pmoskernel|}}}|CPU={{{cpu|}}}|GPU={{{gpu|}}}|Display={{{display|}}}|Storage={{{storage|}}}|Memory={{{memory|}}}|StatusUsbnet={{{status_usbnet|}}}|StatusFlashing={{{status_flashing|}}}|StatusTouch={{{status_touch|}}}|StatusScreen={{{status_screen|}}}|StatusWifi={{{status_wifi|}}}|StatusFde={{{status_fde|}}}|StatusMainline={{{status_mainline|}}}|StatusBattery={{{status_battery|}}}|Status3d={{{status_3d|}}}|StatusAccel={{{status_accel|}}}|StatusMagnet={{{status_magnet|}}}|StatusLight={{{status_light|}}}|StatusProximity={{{status_proximity|}}}|StatusHall={{{status_hall|}}}|StatusAudio={{{status_audio|}}}|StatusBluetooth={{{status_bluetooth|}}}|StatusCamera={{{status_camera|}}}|StatusCameraFlash={{{status_cameraflash|}}}|StatusDvb={{{status_dvb|}}}|StatusGps={{{status_gps|}}}|StatusMobiledata={{{status_mobiledata|}}}|StatusSms={{{status_sms|}}}|StatusCalls={{{status_calls|}}}|StatusStatus={{{status|}}}|Architecture={{lc:{{{architecture|}}} }}|Booting={{{booting|}}}|Supported={{{supported|}}}|Packaged={{{packaged|}}}|WhetDhry={{{whet_dhry|}}}|WpType={{{wp_type|}}}|StatusOtg={{{status_otg|}}}|Category={{{category|testing}}}|PrebuiltImages={{{prebuiltimages|{{#switch: {{{category|testing}}}|main = yes|community = yes|testing = no}}}}}|StatusNfc={{{status_nfc|}}}|StatusHaptics={{{status_haptics|}}}|StatusIrtx={{{status_irtx|}}}|StatusIrrx={{{status_irrx|}}}|StatusUart={{{status_uart|}}}|StatusStylus={{{status_stylus|}}}|StatusUbootPrimary={{{status_uboot_primary|}}}|StatusUbootSecondary={{{status_uboot_secondary|}}}|StatusUbootMainline={{{status_uboot_mainline|}}}|StatusUbootInternalStorage={{{status_uboot_internalstorage|}}}|StatusUbootSd={{{status_uboot_sd|}}}|StatusUbootUsbhost={{{status_uboot_usbhost|}}}|StatusUbootUsbperipheral={{{status_uboot_usbperipheral|}}}|StatusUbootScreen={{{status_uboot_screen|}}}|StatusUbootKeyboard={{{status_uboot_keyboard|}}}|StatusUbootButtons={{{status_uboot_buttons|}}}|StatusUboot={{{status_uboot|}}}|StatusBarometer={{{status_barometer|}}}|StatusPowerSensor={{{status_powersensor|}}}|StatusUsba={{{status_usba|}}}|StatusEthernet={{{status_ethernet|}}}|StatusHdmidp={{{status_hdmidp|}}}|StatusKeyboard={{{status_keyboard|}}}|StatusTouchpad={{{status_touchpad|}}}|GenericDevice={{{genericdevice|}}}|OptionalGenericDevice={{{optionalgenericdevice|no}}}|DeviceType={{lc:{{{type|}}}}}|DevicePage={{PAGENAMEE}}|StatusEmmc= {{{status_emmc | {{#ifeq:{{lc:{{{type|}}} }}|router|N}} }}} |StatusSdcard={{{status_sdcard|}}}|ChangeArch={{{changearch|}}}|som={{som|}} }}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Infobox&amp;diff=571</id>
		<title>Template:Infobox</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Infobox&amp;diff=571"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{{child|}}}|yes||&amp;lt;table class=&amp;quot;infobox {{{bodyclass|}}}&amp;quot; cellspacing=&amp;quot;3&amp;quot; style=&amp;quot;{{#ifeq:{{{subbox|}}}|yes&lt;br /&gt;
 |padding:0; border:none; border-spacing:3px; margin:-3px; width:auto; min-width:100%; font-size:100%; clear:none; float:none; background-color:transparent;&lt;br /&gt;
 |border-spacing: 3px; width:22em;&lt;br /&gt;
}} {{{bodystyle|}}}&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
 Caption&lt;br /&gt;
--&amp;gt;{{#if:{{{title|}}}|&amp;lt;caption class=&amp;quot;{{{titleclass|}}}&amp;quot; style=&amp;quot;{{{titlestyle|}}}&amp;quot;&amp;gt;{{{title}}}&amp;lt;/caption&amp;gt;}}&amp;lt;!--&lt;br /&gt;
 Header&lt;br /&gt;
--&amp;gt;{{#if:{{{above|}}}|&amp;lt;tr&amp;gt;&amp;lt;th colspan=&amp;quot;2&amp;quot; class=&amp;quot;{{{aboveclass|}}}&amp;quot; style=&amp;quot;text-align:center; font-size:125%; font-weight:bold; {{{abovestyle|}}}&amp;quot;&amp;gt;{{{above}}}&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;}}&lt;br /&gt;
}}{{#ifeq:{{{child|}}}|yes|{{{title|}}}}}&amp;lt;!--&lt;br /&gt;
 Subheader1&lt;br /&gt;
--&amp;gt;{{#if:{{{subheader|{{{subheader1|}}}}}}|{{Infobox/row&lt;br /&gt;
 |data={{{subheader|{{{subheader1|}}}}}}&lt;br /&gt;
 |datastyle={{{subheaderstyle|{{{subheaderstyle1|}}}}}}&lt;br /&gt;
 |class={{{subheaderclass|}}}&lt;br /&gt;
 |rowclass={{{subheaderrowclass|{{{subheaderrowclass1|}}}}}}&lt;br /&gt;
}} }}&amp;lt;!--&lt;br /&gt;
 Subheader2&lt;br /&gt;
--&amp;gt;{{#if:{{{subheader2|}}}|{{Infobox/row&lt;br /&gt;
 |data={{{subheader2}}}&lt;br /&gt;
 |datastyle={{{subheaderstyle|{{{subheaderstyle2|}}}}}}&lt;br /&gt;
 |class={{{subheaderclass|}}}&lt;br /&gt;
 |rowclass={{{subheaderrowclass2|}}}&lt;br /&gt;
}} }}&amp;lt;!--&lt;br /&gt;
 Image1&lt;br /&gt;
--&amp;gt;{{#if:{{{image|{{{image1|}}}}}}|{{Infobox/row&lt;br /&gt;
 |data={{{image|{{{image1}}} }}}{{#if:{{{caption|{{{caption1|}}}}}}|&amp;lt;br /&amp;gt;&amp;lt;span style=&amp;quot;{{{captionstyle|}}}&amp;quot;&amp;gt;{{{caption|{{{caption1}}}}}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
 |datastyle={{{imagestyle|}}}&lt;br /&gt;
 |class={{{imageclass|}}}&lt;br /&gt;
 |rowclass={{{imagerowclass1|}}}&lt;br /&gt;
}} }}&amp;lt;!--&lt;br /&gt;
 Image2&lt;br /&gt;
--&amp;gt;{{#if:{{{image2|}}}|{{Infobox/row&lt;br /&gt;
 |data={{{image2}}}{{#if:{{{caption2|}}}|&amp;lt;br /&amp;gt;&amp;lt;span style=&amp;quot;{{{captionstyle|}}}&amp;quot;&amp;gt;{{{caption2}}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
 |datastyle={{{imagestyle|}}}&lt;br /&gt;
 |class={{{imageclass|}}}&lt;br /&gt;
 |rowclass={{{imagerowclass2|}}}&lt;br /&gt;
}} }}&amp;lt;!--&lt;br /&gt;
 Image3&lt;br /&gt;
--&amp;gt;{{#if:{{{image3|}}}|{{Infobox/row&lt;br /&gt;
 |data={{{image3}}}{{#if:{{{caption3|}}}|&amp;lt;br /&amp;gt;&amp;lt;span style=&amp;quot;{{{captionstyle|}}}&amp;quot;&amp;gt;{{{caption3}}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
 |datastyle={{{imagestyle|}}}&lt;br /&gt;
 |class={{{imageclass|}}}&lt;br /&gt;
 |rowclass={{{imagerowclass3|}}}&lt;br /&gt;
}} }}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{Infobox/row&lt;br /&gt;
 |header={{{header1|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label1|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data1|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class1|}}}   |rowclass={{{rowclass1|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header2|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label2|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data2|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class2|}}}   |rowclass={{{rowclass2|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header3|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label3|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data3|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class3|}}}   |rowclass={{{rowclass3|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header4|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label4|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data4|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class4|}}}   |rowclass={{{rowclass4|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header5|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label5|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data5|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class5|}}}   |rowclass={{{rowclass5|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header6|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label6|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data6|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class6|}}}   |rowclass={{{rowclass6|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header7|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label7|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data7|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class7|}}}   |rowclass={{{rowclass7|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header8|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label8|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data8|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class8|}}}   |rowclass={{{rowclass8|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header9|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label9|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data9|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class9|}}}   |rowclass={{{rowclass9|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header10|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label10|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data10|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class10|}}}   |rowclass={{{rowclass10|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header11|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label11|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data11|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class11|}}}   |rowclass={{{rowclass11|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header12|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label12|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data12|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class12|}}}   |rowclass={{{rowclass12|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header13|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label13|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data13|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class13|}}}   |rowclass={{{rowclass13|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header14|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label14|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data14|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class14|}}}   |rowclass={{{rowclass14|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header15|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label15|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data15|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class15|}}}   |rowclass={{{rowclass15|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header16|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label16|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data16|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class16|}}}   |rowclass={{{rowclass16|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header17|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label17|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data17|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class17|}}}   |rowclass={{{rowclass17|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header18|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label18|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data18|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class18|}}}   |rowclass={{{rowclass18|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header19|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label19|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data19|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class19|}}}   |rowclass={{{rowclass19|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header20|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label20|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data20|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class20|}}}   |rowclass={{{rowclass20|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header21|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label21|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data21|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class21|}}}   |rowclass={{{rowclass21|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header22|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label22|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data22|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class22|}}}   |rowclass={{{rowclass22|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header23|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label23|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data23|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class23|}}}   |rowclass={{{rowclass23|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header24|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label24|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data24|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class24|}}}   |rowclass={{{rowclass24|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header25|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label25|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data25|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class25|}}}   |rowclass={{{rowclass25|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header26|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label26|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data26|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class26|}}}   |rowclass={{{rowclass26|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header27|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label27|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data27|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class27|}}}   |rowclass={{{rowclass27|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header28|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label28|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data28|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class28|}}}   |rowclass={{{rowclass28|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header29|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label29|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data29|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class29|}}}   |rowclass={{{rowclass29|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header30|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label30|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data30|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class30|}}}   |rowclass={{{rowclass30|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header31|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label31|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data31|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class31|}}}   |rowclass={{{rowclass31|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header32|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label32|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data32|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class32|}}}   |rowclass={{{rowclass32|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header33|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label33|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data33|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class33|}}}   |rowclass={{{rowclass33|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header34|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label34|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data34|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class34|}}}   |rowclass={{{rowclass34|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header35|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label35|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data35|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class35|}}}   |rowclass={{{rowclass35|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header36|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label36|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data36|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class36|}}}   |rowclass={{{rowclass36|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header37|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label37|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data37|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class37|}}}   |rowclass={{{rowclass37|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header38|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label38|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data38|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class38|}}}   |rowclass={{{rowclass38|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header39|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label39|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data39|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class39|}}}   |rowclass={{{rowclass39|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header40|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label40|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data40|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class40|}}}   |rowclass={{{rowclass40|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header41|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label41|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data41|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class41|}}}   |rowclass={{{rowclass41|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header42|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label42|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data42|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class42|}}}   |rowclass={{{rowclass42|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header43|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label43|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data43|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class43|}}}   |rowclass={{{rowclass43|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header44|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label44|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data44|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class44|}}}   |rowclass={{{rowclass44|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header45|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label45|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data45|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class45|}}}   |rowclass={{{rowclass45|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header46|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label46|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data46|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class46|}}}   |rowclass={{{rowclass46|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header47|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label47|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data47|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class47|}}}   |rowclass={{{rowclass47|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header48|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label48|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data48|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class48|}}}   |rowclass={{{rowclass48|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header49|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label49|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data49|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class49|}}}   |rowclass={{{rowclass49|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header50|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label50|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data50|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class50|}}}   |rowclass={{{rowclass50|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header51|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label51|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data51|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class51|}}}   |rowclass={{{rowclass51|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header52|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label52|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data52|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class52|}}}   |rowclass={{{rowclass52|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header53|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label53|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data53|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class53|}}}   |rowclass={{{rowclass53|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header54|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label54|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data54|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class54|}}}   |rowclass={{{rowclass54|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header55|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label55|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data55|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class55|}}}   |rowclass={{{rowclass55|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header56|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label56|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data56|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class56|}}}   |rowclass={{{rowclass56|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header57|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label57|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data57|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class57|}}}   |rowclass={{{rowclass57|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header58|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label58|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data58|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class58|}}}   |rowclass={{{rowclass58|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header59|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label59|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data59|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class59|}}}   |rowclass={{{rowclass59|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header60|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label60|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data60|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class60|}}}   |rowclass={{{rowclass60|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header61|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label61|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data61|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class61|}}}   |rowclass={{{rowclass61|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header62|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label62|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data62|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class62|}}}   |rowclass={{{rowclass62|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header63|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label63|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data63|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class63|}}}   |rowclass={{{rowclass63|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header64|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label64|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data64|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class64|}}}   |rowclass={{{rowclass64|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header65|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label65|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data65|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class65|}}}   |rowclass={{{rowclass65|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header66|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label66|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data66|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class66|}}}   |rowclass={{{rowclass66|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header67|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label67|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data67|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class67|}}}   |rowclass={{{rowclass67|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header68|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label68|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data68|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class68|}}}   |rowclass={{{rowclass68|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header69|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label69|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data69|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class69|}}}   |rowclass={{{rowclass69|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header70|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label70|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data70|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class70|}}}   |rowclass={{{rowclass70|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header71|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label71|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data71|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class71|}}}   |rowclass={{{rowclass71|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header72|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label72|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data72|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class72|}}}   |rowclass={{{rowclass72|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header73|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label73|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data73|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class73|}}}   |rowclass={{{rowclass73|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header74|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label74|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data74|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class74|}}}   |rowclass={{{rowclass74|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header75|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label75|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data75|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class75|}}}   |rowclass={{{rowclass75|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header76|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label76|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data76|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class76|}}}   |rowclass={{{rowclass76|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header77|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label77|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data77|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class77|}}}   |rowclass={{{rowclass77|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header78|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label78|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data78|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class78|}}}   |rowclass={{{rowclass78|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header79|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label79|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data79|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class79|}}}   |rowclass={{{rowclass79|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header80|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label80|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data80|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class80|}}}   |rowclass={{{rowclass80|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header81|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label81|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data81|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class81|}}}   |rowclass={{{rowclass81|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header82|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label82|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data82|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class82|}}}   |rowclass={{{rowclass82|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header83|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label83|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data83|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class83|}}}   |rowclass={{{rowclass83|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header84|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label84|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data84|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class84|}}}   |rowclass={{{rowclass84|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header85|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label85|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data85|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class85|}}}   |rowclass={{{rowclass85|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header86|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label86|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data86|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class86|}}}   |rowclass={{{rowclass86|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header87|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label87|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data87|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class87|}}}   |rowclass={{{rowclass87|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header88|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label88|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data88|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class88|}}}   |rowclass={{{rowclass88|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header89|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label89|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data89|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class89|}}}   |rowclass={{{rowclass89|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header90|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label90|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data90|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class90|}}}   |rowclass={{{rowclass90|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header91|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label91|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data91|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class91|}}}   |rowclass={{{rowclass91|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header92|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label92|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data92|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class92|}}}   |rowclass={{{rowclass92|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header93|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label93|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data93|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class93|}}}   |rowclass={{{rowclass93|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header94|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label94|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data94|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class94|}}}   |rowclass={{{rowclass94|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header95|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label95|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data95|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class95|}}}   |rowclass={{{rowclass95|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header96|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label96|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data96|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class96|}}}   |rowclass={{{rowclass96|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header97|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label97|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data97|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class97|}}}   |rowclass={{{rowclass97|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header98|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label98|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data98|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class98|}}}   |rowclass={{{rowclass98|}}}&lt;br /&gt;
}}{{Infobox/row&lt;br /&gt;
 |header={{{header99|}}} |headerstyle={{{headerstyle|}}}&lt;br /&gt;
 |label={{{label99|}}}   |labelstyle={{{labelstyle|}}}&lt;br /&gt;
 |data={{{data99|}}}     |datastyle={{{datastyle|}}}&lt;br /&gt;
 |class={{{class99|}}}   |rowclass={{{rowclass99|}}}&lt;br /&gt;
}}&amp;lt;!-- Below&lt;br /&gt;
--&amp;gt;{{#if:{{{below|}}}|&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; class=&amp;quot;{{{belowclass|}}}&amp;quot; style=&amp;quot;text-align:center; {{{belowstyle|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{below}}}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;}}&amp;lt;!--&lt;br /&gt;
 Navbar&lt;br /&gt;
--&amp;gt;{{#if:{{{name|}}}|&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:right&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;}}&lt;br /&gt;
{{#ifeq:{{{child|}}}|yes||&amp;lt;/table&amp;gt;}}{{#switch:{{lc:{{{italic title|¬}}}}}&lt;br /&gt;
 |¬|no       = &amp;lt;!-- no italic title --&amp;gt;&lt;br /&gt;
 ||force|yes = {{italic title|force={{#ifeq:{{lc:{{{italic title|}}}}}|force|true}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;{{Template}}&lt;br /&gt;
This template is for device information boxes, as seen on just about every device page.&lt;br /&gt;
&lt;br /&gt;
Usage instructions are in [[Help:Device Page]].&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Icon_box&amp;diff=569</id>
		<title>Template:Icon box</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Icon_box&amp;diff=569"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Template}}&lt;br /&gt;
This is a template for a box with an icon, largely inspired by Wikipedia&#039;s {{wikipedia|Template:Mbox}}. It&#039;s mainly used for license boxes.&lt;br /&gt;
&lt;br /&gt;
{{Icon box&lt;br /&gt;
| box-icons = [[File:Icon-numix-light-start-here.svg|28px|link=|Icon]]&lt;br /&gt;
| box-text = This is an example of the icon box.&amp;lt;br&amp;gt;I can also use HTML tags and [[Templates|MediaWiki syntax, like links]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Icon box&lt;br /&gt;
| box-icons = [[File:Icon-numix-light-start-here.svg|28px|link=|Icon]]&lt;br /&gt;
| box-text = This is an example of the icon box.&amp;lt;br&amp;gt;I can also use HTML tags and [[Templates|MediaWiki syntax, like links]].&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Icon box&lt;br /&gt;
| box-icons = [[File:Icon-numix-light-start-here.svg|28px|link=|Icon]]&lt;br /&gt;
| box-text = This is an example license box.&lt;br /&gt;
| border-color = #88a&lt;br /&gt;
| border-width = 3px&lt;br /&gt;
| background = #f7f8ff&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Icon box&lt;br /&gt;
| box-icons = [[File:Icon-numix-light-start-here.svg|28px|link=|Icon]]&lt;br /&gt;
| box-text = This is an example license box.&lt;br /&gt;
| border-color = #88a&lt;br /&gt;
| border-width = 3px&lt;br /&gt;
| background = #f7f8ff&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Icon box&lt;br /&gt;
| box-icons = [[File:Icon-numix-light-start-here.svg|20px|link=|Note]]&lt;br /&gt;
| box-text = This is a box with no side margins.&lt;br /&gt;
| border-color = #ac6600&lt;br /&gt;
| border-width = 1px&lt;br /&gt;
| background = #f6efe5&lt;br /&gt;
| nomargin = yes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Icon box&lt;br /&gt;
| box-icons = [[File:Icon-numix-light-start-here.svg|20px|link=|Note]]&lt;br /&gt;
| box-text = This is a box with no side margins.&lt;br /&gt;
| border-color = #ac6600&lt;br /&gt;
| border-width = 1px&lt;br /&gt;
| background = #f6efe5&lt;br /&gt;
| nomargin = yes&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|&#039;&#039;&#039;Warning:&#039;&#039;&#039; Make sure to set your icon&#039;s size (like in the examples above).}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;table role=&amp;quot;{{{role|text container}}}&amp;quot; style=&amp;quot;color: {{{color|inherit}}}; background-color: {{{background|inherit}}}; border: {{{border-width|1px}}} {{{border-style|solid}}} {{{border-color|#eaecf0}}}; margin: 4px {{#if: {{{nomargin|}}}|0|10%}}; border-collapse: collapse;&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;padding: 2px 0 2px 0.9em; text-align: center; line-height: 1;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;white-space: nowrap;&amp;quot;&amp;gt;{{{box-icons}}}&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;padding: {{{padding|0.35em}}} 0.9em; width: 100%;&amp;quot;&amp;gt;{{{box-text}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;role&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;HTML role&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;HTML accessible role parameter to add to the box.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;text container&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;color&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Text color&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Text color in any format supported by CSS (hex, rgb(...), ...)&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;inherit&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;background&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Background color&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Background color in any format supported by CSS (hex, rgb(...), ...)&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;inherit&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;border-width&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Border width&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Border width with unit&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;1px&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;1px&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;border-style&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Border style&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;CSS border-style value&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;solid&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;solid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;border-color&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Border color&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Text color in any format supported by CSS (hex, rgb(...), ...)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;#eaecf0&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;nomargin&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Disable margin&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;If set, removes the margin from the sides of the box.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;box-icons&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Box icons&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Standard wikitext containing the icons to place inside of the box, see example syntax.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;padding&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Padding&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Padding to add to the box, with the unit&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;0.35em&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;box-text&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Box text&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Text inside of the box.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Floating box with an icon and background. Used for licensing templates, Template:Note and similar boxes.&amp;quot;,&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;block&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;box-text&amp;quot;,&lt;br /&gt;
		&amp;quot;box-icons&amp;quot;,&lt;br /&gt;
		&amp;quot;nomargin&amp;quot;,&lt;br /&gt;
		&amp;quot;color&amp;quot;,&lt;br /&gt;
		&amp;quot;background&amp;quot;,&lt;br /&gt;
		&amp;quot;border-color&amp;quot;,&lt;br /&gt;
		&amp;quot;border-style&amp;quot;,&lt;br /&gt;
		&amp;quot;border-width&amp;quot;,&lt;br /&gt;
		&amp;quot;padding&amp;quot;,&lt;br /&gt;
		&amp;quot;role&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Feature&amp;diff=567</id>
		<title>Template:Feature</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Feature&amp;diff=567"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:{{#sub:{{{1|}}}|0|1}}&lt;br /&gt;
    |P=&amp;lt;div class=&amp;quot;feature feature-partial&amp;quot;&amp;gt;Partial&amp;lt;/div&amp;gt; &lt;br /&gt;
    |Y=&amp;lt;div class=&amp;quot;feature feature-yes&amp;quot;&amp;gt;Works&amp;lt;/div&amp;gt; &lt;br /&gt;
    |N=&amp;lt;div class=&amp;quot;feature feature-no&amp;quot;&amp;gt;Broken&amp;lt;/div&amp;gt; &lt;br /&gt;
    |-=&amp;lt;div class=&amp;quot;feature feature-unavailable&amp;quot;&amp;gt;Unavailable&amp;lt;/div&amp;gt; &lt;br /&gt;
    |&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Device_owners&amp;diff=565</id>
		<title>Template:Device owners</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Device_owners&amp;diff=565"/>
		<updated>2024-12-15T13:50:28Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Template:Template}}{{DISPLAYTITLE:Template:Device owners}}&lt;br /&gt;
&lt;br /&gt;
Creates a list of users owning the device.&lt;br /&gt;
&lt;br /&gt;
Use [[Template:Owns device]] in your userpage to add your name to the list (changes are only reflected after you use [https://www.mediawiki.org/wiki/Manual:Purge purge the page&#039;s cache]).&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Device owners}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
Show a list of device owners&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Device owners}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[User:MartijnBraam|MartijnBraam]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=DeviceOwners&lt;br /&gt;
|fields=CONCAT( &#039;[[&#039;, _pageName, &#039;|&#039;,_pageTitle,&#039;]]&#039; )=User,Notes&lt;br /&gt;
|format=ul&lt;br /&gt;
|columns=2&lt;br /&gt;
|where=Device=&amp;quot;{{PAGENAMEE}}&amp;quot;&lt;br /&gt;
|limit=9999&lt;br /&gt;
|more results text=&lt;br /&gt;
&amp;lt;!--|intro=Users owning this device:--&amp;gt;&lt;br /&gt;
|default=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=MediaWiki:Common.css&amp;diff=563</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=MediaWiki:Common.css&amp;diff=563"/>
		<updated>2024-12-15T13:49:23Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Created page with &amp;quot;/* CSS placed here will be applied to all skins */ table.feature-colors td.feature, .cargoTable td.feature, .feature {   text-align: center; } table.feature-colors td.feature-yes, .cargoTable td.feature-yes, .feature-yes {   background: #CFFFBF !important; } table.feature-colors td.feature-partial, .cargoTable td.feature-partial, .feature-partial {   background: #FFCFA5 !important; } table.feature-colors td.feature-unavailable, .cargoTable td.feature-unavailable, .featur...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
table.feature-colors td.feature, .cargoTable td.feature, .feature {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
table.feature-colors td.feature-yes, .cargoTable td.feature-yes, .feature-yes {&lt;br /&gt;
  background: #CFFFBF !important;&lt;br /&gt;
}&lt;br /&gt;
table.feature-colors td.feature-partial, .cargoTable td.feature-partial, .feature-partial {&lt;br /&gt;
  background: #FFCFA5 !important;&lt;br /&gt;
}&lt;br /&gt;
table.feature-colors td.feature-unavailable, .cargoTable td.feature-unavailable, .feature-unavailable {&lt;br /&gt;
  background: #E1E1E1 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Make cargo tables nicer */&lt;br /&gt;
table.cargoTable td,&lt;br /&gt;
table.cargoTable th {&lt;br /&gt;
  border: 1px solid #a2a9b1;&lt;br /&gt;
  padding: 0.2em 0.4em;&lt;br /&gt;
}&lt;br /&gt;
table.cargoTable th {&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
}&lt;br /&gt;
table.cargoTable td {&lt;br /&gt;
  white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
table.cargoTable td.odd,&lt;br /&gt;
table.cargoTable td.even {&lt;br /&gt;
  background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Responsive image on front page */&lt;br /&gt;
.res-img img {&lt;br /&gt;
	max-width:100%;&lt;br /&gt;
	height:auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Infobox template style */&lt;br /&gt;
.infobox {&lt;br /&gt;
    border: 1px solid #a2a9b1;&lt;br /&gt;
    border-spacing: 3px;&lt;br /&gt;
    background-color: #f8f9fa;&lt;br /&gt;
    color: black;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0.5em 0 0.5em 1em;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.infobox caption {&lt;br /&gt;
    font-size: 125%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.infobox td,&lt;br /&gt;
.infobox th {&lt;br /&gt;
    vertical-align: top;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered td,&lt;br /&gt;
.infobox.bordered th {&lt;br /&gt;
    border: 1px solid #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered .borderless td,&lt;br /&gt;
.infobox.bordered .borderless th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.sisterproject {&lt;br /&gt;
    width: 20em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.infobox.standard-talk.bordered td,&lt;br /&gt;
.infobox.standard-talk.bordered th {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* styles for bordered infobox with merged rows */&lt;br /&gt;
.infobox.bordered .mergedtoprow td,&lt;br /&gt;
.infobox.bordered .mergedtoprow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    border-top: 1px solid #a2a9b1;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.bordered .mergedrow td,&lt;br /&gt;
.infobox.bordered .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles for geography infoboxes, eg countries,&lt;br /&gt;
   country subdivisions, cities, etc.            */&lt;br /&gt;
.infobox.geography {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    line-height: 1.2em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography  td,&lt;br /&gt;
.infobox.geography  th {&lt;br /&gt;
    border-top: 1px solid #a2a9b1;&lt;br /&gt;
    padding: 0.4em 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
.infobox.geography .mergedtoprow td,&lt;br /&gt;
.infobox.geography .mergedtoprow th {&lt;br /&gt;
    border-top: 1px solid #a2a9b1;&lt;br /&gt;
    padding: 0.4em 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography .mergedrow td,&lt;br /&gt;
.infobox.geography .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography .mergedbottomrow td,&lt;br /&gt;
.infobox.geography .mergedbottomrow th {&lt;br /&gt;
    border-top: 0;&lt;br /&gt;
    border-bottom: 1px solid #a2a9b1;&lt;br /&gt;
    padding: 0 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography .maptable td,&lt;br /&gt;
.infobox.geography .maptable th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=User:MagneFire/sandbox&amp;diff=562</id>
		<title>User:MagneFire/sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=User:MagneFire/sandbox&amp;diff=562"/>
		<updated>2024-12-15T13:39:13Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Created page with &amp;quot;{{Infobox device | manufacturer = PINE64 | name = PinePhone | codename = pine64-pinephone | image = File:Pinephone-plasma-mobile.jpg | imagecaption = PinePhone running Plasma Mobile | releaseyear = 2020 | category = main | originalsoftware = postmarketOS | pmoskernel =  | chipset = Allwinner A64 | cpu = 4x 1152 MHz Cortex-A53 | gpu = Mali-400 MP2 | display = 720x1440 IPS | storage = 16 GB / 32 GB | memory = 2 GB / 3 GB | architecture = aarch64 | type = handset | whet_dhr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox device&lt;br /&gt;
| manufacturer = PINE64&lt;br /&gt;
| name = PinePhone&lt;br /&gt;
| codename = pine64-pinephone&lt;br /&gt;
| image = File:Pinephone-plasma-mobile.jpg&lt;br /&gt;
| imagecaption = PinePhone running Plasma Mobile&lt;br /&gt;
| releaseyear = 2020&lt;br /&gt;
| category = main&lt;br /&gt;
| originalsoftware = postmarketOS&lt;br /&gt;
| pmoskernel = &lt;br /&gt;
| chipset = Allwinner A64&lt;br /&gt;
| cpu = 4x 1152 MHz Cortex-A53&lt;br /&gt;
| gpu = Mali-400 MP2&lt;br /&gt;
| display = 720x1440 IPS&lt;br /&gt;
| storage = 16 GB / 32 GB&lt;br /&gt;
| memory = 2 GB / 3 GB&lt;br /&gt;
| architecture = aarch64&lt;br /&gt;
| type = handset&lt;br /&gt;
| whet_dhry = 1314.3&lt;br /&gt;
| status_usbnet = Y&lt;br /&gt;
| status_flashing = -&lt;br /&gt;
| status_touch = Y&lt;br /&gt;
| status_screen = Y&lt;br /&gt;
| status_wifi = Y&lt;br /&gt;
| status_xwayland = Y&lt;br /&gt;
| status_fde = Y&lt;br /&gt;
| status_mainline = Y&lt;br /&gt;
| status_battery = Y&lt;br /&gt;
| status_3d = Y&lt;br /&gt;
| status_audio = Y&lt;br /&gt;
| status_bluetooth = Y&lt;br /&gt;
| status_camera = P&lt;br /&gt;
| status_gps = Y&lt;br /&gt;
| status_mobiledata = Y&lt;br /&gt;
| status_emmc = Y&lt;br /&gt;
| status_sms = Y&lt;br /&gt;
| status_calls = Y&lt;br /&gt;
| status_otg = Y&lt;br /&gt;
| status_nfc = -&lt;br /&gt;
| status_accel = Y&lt;br /&gt;
| status_magnet = P&lt;br /&gt;
| status_light = Y&lt;br /&gt;
| status_proximity = -&lt;br /&gt;
| status_hall = Y&lt;br /&gt;
| status_barometer = -&lt;br /&gt;
| status_powersensor = -&lt;br /&gt;
| status_usba = -&lt;br /&gt;
| status_hdmidp = P&lt;br /&gt;
| status_keyboard = Y&lt;br /&gt;
| status_touchpad = -&lt;br /&gt;
| status_irtx = -&lt;br /&gt;
| status_irrx = -&lt;br /&gt;
| status_trustzone = -&lt;br /&gt;
| status_fossbootloader = Y&lt;br /&gt;
| status_stylus = -&lt;br /&gt;
| status_haptics = &lt;br /&gt;
| status_ethernet = -&lt;br /&gt;
| status_cameraflash = &lt;br /&gt;
| status_dvb = -&lt;br /&gt;
| booting = yes&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=561</id>
		<title>Building AsteroidOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=561"/>
		<updated>2024-12-12T20:50:40Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
If you decide to compile AsteroidOS from source be aware that it’s a simple process but requires a lot of disk space (potentially more than 100GB) and the first build might take you a lot of time (hours). Report any problem to the [https://github.com/AsteroidOS/asteroid/issues issue tracker]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://asteroidos.org/asteroid.mp4 Video showing the build process]&lt;br /&gt;
&lt;br /&gt;
= General information =&lt;br /&gt;
&lt;br /&gt;
You might want to build AsteroidOS in a &#039;&#039;container engine&#039;&#039; such as [https://www.docker.com/ Docker] or [https://podman.io/ podman] because you&#039;ll get a clean build environment that works no matter what kinds of package repositories or package versions you have installed or how outdated your Linux distribution is or which Linux distribution you&#039;re using in the first place.&lt;br /&gt;
&lt;br /&gt;
Another advantage of Docker specifically is that it &#039;&#039;should&#039;&#039; also work on Windows and OS X. (However, this has not been tested yet!)&lt;br /&gt;
&lt;br /&gt;
Using containers also allows you to easily roll back.  Without a container, if you decided to delete the AsteroidOS repository and uninstall the prerequisite software packages from your computer, you will potentially remove packages that you had installed before and might actually still need.  With a container, simply deleting the container image has no other effect on the host computer.&lt;br /&gt;
&lt;br /&gt;
= Clone the repository =&lt;br /&gt;
&lt;br /&gt;
Clone the main repository using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t set a global git name and email yet, adapt the following &#039;&#039;git config&#039;&#039; commands to your information. (This is only required to clone some git repositories when building.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before you continue to &#039;&#039;Build without containers&#039;&#039; or &#039;&#039;Build with containers&#039;&#039;, make sure you&#039;re in the asteroid directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build without containers =&lt;br /&gt;
&lt;br /&gt;
== Downloading ==&lt;br /&gt;
&lt;br /&gt;
Install the prerequisites:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Distribution prerequisite installation&lt;br /&gt;
|-&lt;br /&gt;
! Distro !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu || &amp;lt;code&amp;gt;apt-get install git build-essential chrpath cpio diffstat gawk liblz4-tool python3 shared-mime-info texinfo wget zstd &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fedora || &amp;lt;code&amp;gt;dnf install chrpath diffstat g++ lz4 perl perl-bignum python3-pip rpcgen socat texinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arch || &amp;lt;code&amp;gt;pacman -Sy base-devel chrpath cpio diffstat gawk inetutils lz4 python3 rpcsvc-proto shared-mime-info texinfo wget zstd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alpine || &amp;lt;code&amp;gt;apk add binutils chrpath gcc g++ gawk gcc lz4 make patch perl rpcgen&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;Note: Alpine Linux does not contain diffstat in its repositories, thus you have to [https://github.com/asottile-archive/diffstat build it yourself from source].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This repository basically only contains a shell script that populates &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; with OpenEmbedded and the appropriate Asteroid layers. Then, it setups the environment for a bitbake build. The following command will setup a build for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; (the LG G Watch) but you can also build an image for other watches by using the corresponding codename. (Codenames can be found on the [https://asteroidos.org/watches/ Watches page].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory # Be careful that this script must be sourced and not only ran&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the environment has been correctly setup, you should now be in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
Once the environment is prepared, you can simply trigger a build with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-image&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Notes:&#039;&#039;&lt;br /&gt;
1) The build process requires roughly 2GB memory per thread. It might be necessary to limit the number of threads. This can be done by prepending &amp;lt;code&amp;gt;BB_NUMBER_THREADS=n&amp;lt;/code&amp;gt; to the build command. Or by adding &amp;lt;code&amp;gt;BB_NUMBER_THREADS = &amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;build/conf/local.conf&amp;lt;/code&amp;gt;. Where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the amount of threads.&lt;br /&gt;
2) Bitbake is a powerful tool that can also build single packages (e.g: &amp;lt;code&amp;gt;bitbake strace&amp;lt;/code&amp;gt;) or  [[Creating an Asteroid app#Building the Cross Compilation Toolchain|Building the SDK]] for example. Refer to its documentation for more details.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to the [[#Installing|Installing]] section below.&lt;br /&gt;
&lt;br /&gt;
== Updating the Sources ==&lt;br /&gt;
&lt;br /&gt;
You can update the AsteroidOS sources with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Build with containers =&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested on Ubuntu 19.04 (with Docker) and Fedora 34 (with podman), but should also be applicable to Debian Sid (at least at the time of writing). For other distributions the dependencies may have different names and you may have to install additional ones.&lt;br /&gt;
&lt;br /&gt;
From a user&#039;s point of view, Docker and podman are quite similar and accept almost all of the exact same commands, but there are some difference.  The most significant differences for building Asteroid are that podman does not use a daemon and can be run &amp;quot;rootless&amp;quot; (that is, as a non-root user).  This makes some things a bit easier, but either can be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Remove the Docker container called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; if it already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build a container image called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; from the given Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the software ==&lt;br /&gt;
&lt;br /&gt;
Now that the container with the toolchain software has been created, we can use this to build AsteroidOS.  All of the tools are contained and run within the container, but we use a &#039;&#039;shared volume&#039;&#039;, essentially some drive space that both the host computer and the container can read and write, for actually creating the AsteroidOS image files.&lt;br /&gt;
&lt;br /&gt;
In this example, we will build AsteroidOS for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt;(the LG G Watch).  To build for a different watch than the LG G Watch, use its corresponding codename instead of &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; when executing the &amp;lt;code&amp;gt;docker run ...&amp;lt;/code&amp;gt; command.  You can find the codenames for the supported watches on the [https://asteroidos.org/watches/ Watches page].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assuming that you have carefully followed the instructions so far and are in the &amp;lt;code&amp;gt;asteroid&amp;lt;/code&amp;gt; directory, you can now build the software.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run this as a non root user&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v  &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The files created during the build are placed in the current directory; more specifically, the source files are placed in a &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and build artefacts, including the final binary images are placed in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the Docker command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;sudo docker run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt;  Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-u &amp;quot;$(id -u):$(id -g)&amp;quot;&amp;lt;/code&amp;gt; Ensures that the current user id and group id from the host is used on files inside the container to avoid permission issues.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v /etc/passwd:/etc/passwd&amp;lt;/code&amp;gt;  Ensures that the user ids and groups from the host are also available in the Docker container. (Otherwise the &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; would be useless.)&lt;br /&gt;
*&amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; Contains the user names and their ids.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig&amp;quot;&amp;lt;/code&amp;gt; Share your user&#039;s git config with the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd):/asteroid&amp;quot;&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;quot;dory&amp;quot; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the podman version of the command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt; Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd)&amp;quot;:/asteroid:z&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container. The &amp;lt;code&amp;gt;:z&amp;lt;/code&amp;gt; tells SELinux, if it&#039;s running, to allow multiple containers to share this mount.&lt;br /&gt;
*&amp;lt;code&amp;gt;--userns keep-id&amp;lt;/code&amp;gt; Run as the current user inside the container&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to [[#Installing|Installing]] below.&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
&lt;br /&gt;
After a while, whether you build with or without containers, the generated image should be available in &amp;lt;code&amp;gt;build/tmp-glibc/deploy/images/dory/&amp;lt;/code&amp;gt; (for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; -- for other watches, the image files are in the corresponding code word directory.)&lt;br /&gt;
&lt;br /&gt;
Install AsteroidOS using your usual device&#039;s instructions, which you can find linked from the [https://asteroidos.org/watches/ Watches page].&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=560</id>
		<title>Building AsteroidOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=560"/>
		<updated>2024-12-12T20:49:38Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
|title = An amazing Infobox&lt;br /&gt;
|header1 = It works!&lt;br /&gt;
|label2 = Configured by&lt;br /&gt;
|data2 = trog&lt;br /&gt;
|label3 = Web&lt;br /&gt;
|data3 = [https://trog.qgl.org trog.qgl.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers]]&lt;br /&gt;
If you decide to compile AsteroidOS from source be aware that it’s a simple process but requires a lot of disk space (potentially more than 100GB) and the first build might take you a lot of time (hours). Report any problem to the [https://github.com/AsteroidOS/asteroid/issues issue tracker]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://asteroidos.org/asteroid.mp4 Video showing the build process]&lt;br /&gt;
&lt;br /&gt;
= General information =&lt;br /&gt;
&lt;br /&gt;
You might want to build AsteroidOS in a &#039;&#039;container engine&#039;&#039; such as [https://www.docker.com/ Docker] or [https://podman.io/ podman] because you&#039;ll get a clean build environment that works no matter what kinds of package repositories or package versions you have installed or how outdated your Linux distribution is or which Linux distribution you&#039;re using in the first place.&lt;br /&gt;
&lt;br /&gt;
Another advantage of Docker specifically is that it &#039;&#039;should&#039;&#039; also work on Windows and OS X. (However, this has not been tested yet!)&lt;br /&gt;
&lt;br /&gt;
Using containers also allows you to easily roll back.  Without a container, if you decided to delete the AsteroidOS repository and uninstall the prerequisite software packages from your computer, you will potentially remove packages that you had installed before and might actually still need.  With a container, simply deleting the container image has no other effect on the host computer.&lt;br /&gt;
&lt;br /&gt;
= Clone the repository =&lt;br /&gt;
&lt;br /&gt;
Clone the main repository using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t set a global git name and email yet, adapt the following &#039;&#039;git config&#039;&#039; commands to your information. (This is only required to clone some git repositories when building.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before you continue to &#039;&#039;Build without containers&#039;&#039; or &#039;&#039;Build with containers&#039;&#039;, make sure you&#039;re in the asteroid directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build without containers =&lt;br /&gt;
&lt;br /&gt;
== Downloading ==&lt;br /&gt;
&lt;br /&gt;
Install the prerequisites:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Distribution prerequisite installation&lt;br /&gt;
|-&lt;br /&gt;
! Distro !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu || &amp;lt;code&amp;gt;apt-get install git build-essential chrpath cpio diffstat gawk liblz4-tool python3 shared-mime-info texinfo wget zstd &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fedora || &amp;lt;code&amp;gt;dnf install chrpath diffstat g++ lz4 perl perl-bignum python3-pip rpcgen socat texinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arch || &amp;lt;code&amp;gt;pacman -Sy base-devel chrpath cpio diffstat gawk inetutils lz4 python3 rpcsvc-proto shared-mime-info texinfo wget zstd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alpine || &amp;lt;code&amp;gt;apk add binutils chrpath gcc g++ gawk gcc lz4 make patch perl rpcgen&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;Note: Alpine Linux does not contain diffstat in its repositories, thus you have to [https://github.com/asottile-archive/diffstat build it yourself from source].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This repository basically only contains a shell script that populates &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; with OpenEmbedded and the appropriate Asteroid layers. Then, it setups the environment for a bitbake build. The following command will setup a build for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; (the LG G Watch) but you can also build an image for other watches by using the corresponding codename. (Codenames can be found on the [https://asteroidos.org/watches/ Watches page].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory # Be careful that this script must be sourced and not only ran&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the environment has been correctly setup, you should now be in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
Once the environment is prepared, you can simply trigger a build with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-image&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Notes:&#039;&#039;&lt;br /&gt;
1) The build process requires roughly 2GB memory per thread. It might be necessary to limit the number of threads. This can be done by prepending &amp;lt;code&amp;gt;BB_NUMBER_THREADS=n&amp;lt;/code&amp;gt; to the build command. Or by adding &amp;lt;code&amp;gt;BB_NUMBER_THREADS = &amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;build/conf/local.conf&amp;lt;/code&amp;gt;. Where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the amount of threads.&lt;br /&gt;
2) Bitbake is a powerful tool that can also build single packages (e.g: &amp;lt;code&amp;gt;bitbake strace&amp;lt;/code&amp;gt;) or  [[Creating an Asteroid app#Building the Cross Compilation Toolchain|Building the SDK]] for example. Refer to its documentation for more details.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to the [[#Installing|Installing]] section below.&lt;br /&gt;
&lt;br /&gt;
== Updating the Sources ==&lt;br /&gt;
&lt;br /&gt;
You can update the AsteroidOS sources with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Build with containers =&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested on Ubuntu 19.04 (with Docker) and Fedora 34 (with podman), but should also be applicable to Debian Sid (at least at the time of writing). For other distributions the dependencies may have different names and you may have to install additional ones.&lt;br /&gt;
&lt;br /&gt;
From a user&#039;s point of view, Docker and podman are quite similar and accept almost all of the exact same commands, but there are some difference.  The most significant differences for building Asteroid are that podman does not use a daemon and can be run &amp;quot;rootless&amp;quot; (that is, as a non-root user).  This makes some things a bit easier, but either can be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Remove the Docker container called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; if it already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build a container image called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; from the given Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the software ==&lt;br /&gt;
&lt;br /&gt;
Now that the container with the toolchain software has been created, we can use this to build AsteroidOS.  All of the tools are contained and run within the container, but we use a &#039;&#039;shared volume&#039;&#039;, essentially some drive space that both the host computer and the container can read and write, for actually creating the AsteroidOS image files.&lt;br /&gt;
&lt;br /&gt;
In this example, we will build AsteroidOS for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt;(the LG G Watch).  To build for a different watch than the LG G Watch, use its corresponding codename instead of &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; when executing the &amp;lt;code&amp;gt;docker run ...&amp;lt;/code&amp;gt; command.  You can find the codenames for the supported watches on the [https://asteroidos.org/watches/ Watches page].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assuming that you have carefully followed the instructions so far and are in the &amp;lt;code&amp;gt;asteroid&amp;lt;/code&amp;gt; directory, you can now build the software.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run this as a non root user&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v  &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The files created during the build are placed in the current directory; more specifically, the source files are placed in a &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and build artefacts, including the final binary images are placed in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the Docker command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;sudo docker run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt;  Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-u &amp;quot;$(id -u):$(id -g)&amp;quot;&amp;lt;/code&amp;gt; Ensures that the current user id and group id from the host is used on files inside the container to avoid permission issues.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v /etc/passwd:/etc/passwd&amp;lt;/code&amp;gt;  Ensures that the user ids and groups from the host are also available in the Docker container. (Otherwise the &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; would be useless.)&lt;br /&gt;
*&amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; Contains the user names and their ids.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig&amp;quot;&amp;lt;/code&amp;gt; Share your user&#039;s git config with the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd):/asteroid&amp;quot;&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;quot;dory&amp;quot; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the podman version of the command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt; Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd)&amp;quot;:/asteroid:z&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container. The &amp;lt;code&amp;gt;:z&amp;lt;/code&amp;gt; tells SELinux, if it&#039;s running, to allow multiple containers to share this mount.&lt;br /&gt;
*&amp;lt;code&amp;gt;--userns keep-id&amp;lt;/code&amp;gt; Run as the current user inside the container&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to [[#Installing|Installing]] below.&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
&lt;br /&gt;
After a while, whether you build with or without containers, the generated image should be available in &amp;lt;code&amp;gt;build/tmp-glibc/deploy/images/dory/&amp;lt;/code&amp;gt; (for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; -- for other watches, the image files are in the corresponding code word directory.)&lt;br /&gt;
&lt;br /&gt;
Install AsteroidOS using your usual device&#039;s instructions, which you can find linked from the [https://asteroidos.org/watches/ Watches page].&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=559</id>
		<title>Building AsteroidOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=559"/>
		<updated>2024-12-12T20:49:25Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
If you decide to compile AsteroidOS from source be aware that it’s a simple process but requires a lot of disk space (potentially more than 100GB) and the first build might take you a lot of time (hours). Report any problem to the [https://github.com/AsteroidOS/asteroid/issues issue tracker]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://asteroidos.org/asteroid.mp4 Video showing the build process]&lt;br /&gt;
&lt;br /&gt;
= General information =&lt;br /&gt;
&lt;br /&gt;
You might want to build AsteroidOS in a &#039;&#039;container engine&#039;&#039; such as [https://www.docker.com/ Docker] or [https://podman.io/ podman] because you&#039;ll get a clean build environment that works no matter what kinds of package repositories or package versions you have installed or how outdated your Linux distribution is or which Linux distribution you&#039;re using in the first place.&lt;br /&gt;
&lt;br /&gt;
Another advantage of Docker specifically is that it &#039;&#039;should&#039;&#039; also work on Windows and OS X. (However, this has not been tested yet!)&lt;br /&gt;
&lt;br /&gt;
Using containers also allows you to easily roll back.  Without a container, if you decided to delete the AsteroidOS repository and uninstall the prerequisite software packages from your computer, you will potentially remove packages that you had installed before and might actually still need.  With a container, simply deleting the container image has no other effect on the host computer.&lt;br /&gt;
&lt;br /&gt;
= Clone the repository =&lt;br /&gt;
&lt;br /&gt;
Clone the main repository using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t set a global git name and email yet, adapt the following &#039;&#039;git config&#039;&#039; commands to your information. (This is only required to clone some git repositories when building.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before you continue to &#039;&#039;Build without containers&#039;&#039; or &#039;&#039;Build with containers&#039;&#039;, make sure you&#039;re in the asteroid directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build without containers =&lt;br /&gt;
&lt;br /&gt;
== Downloading ==&lt;br /&gt;
&lt;br /&gt;
Install the prerequisites:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Distribution prerequisite installation&lt;br /&gt;
|-&lt;br /&gt;
! Distro !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu || &amp;lt;code&amp;gt;apt-get install git build-essential chrpath cpio diffstat gawk liblz4-tool python3 shared-mime-info texinfo wget zstd &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fedora || &amp;lt;code&amp;gt;dnf install chrpath diffstat g++ lz4 perl perl-bignum python3-pip rpcgen socat texinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arch || &amp;lt;code&amp;gt;pacman -Sy base-devel chrpath cpio diffstat gawk inetutils lz4 python3 rpcsvc-proto shared-mime-info texinfo wget zstd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alpine || &amp;lt;code&amp;gt;apk add binutils chrpath gcc g++ gawk gcc lz4 make patch perl rpcgen&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;Note: Alpine Linux does not contain diffstat in its repositories, thus you have to [https://github.com/asottile-archive/diffstat build it yourself from source].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This repository basically only contains a shell script that populates &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; with OpenEmbedded and the appropriate Asteroid layers. Then, it setups the environment for a bitbake build. The following command will setup a build for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; (the LG G Watch) but you can also build an image for other watches by using the corresponding codename. (Codenames can be found on the [https://asteroidos.org/watches/ Watches page].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory # Be careful that this script must be sourced and not only ran&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the environment has been correctly setup, you should now be in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
Once the environment is prepared, you can simply trigger a build with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-image&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Notes:&#039;&#039;&lt;br /&gt;
1) The build process requires roughly 2GB memory per thread. It might be necessary to limit the number of threads. This can be done by prepending &amp;lt;code&amp;gt;BB_NUMBER_THREADS=n&amp;lt;/code&amp;gt; to the build command. Or by adding &amp;lt;code&amp;gt;BB_NUMBER_THREADS = &amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;build/conf/local.conf&amp;lt;/code&amp;gt;. Where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the amount of threads.&lt;br /&gt;
2) Bitbake is a powerful tool that can also build single packages (e.g: &amp;lt;code&amp;gt;bitbake strace&amp;lt;/code&amp;gt;) or  [[Creating an Asteroid app#Building the Cross Compilation Toolchain|Building the SDK]] for example. Refer to its documentation for more details.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to the [[#Installing|Installing]] section below.&lt;br /&gt;
&lt;br /&gt;
== Updating the Sources ==&lt;br /&gt;
&lt;br /&gt;
You can update the AsteroidOS sources with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Build with containers =&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested on Ubuntu 19.04 (with Docker) and Fedora 34 (with podman), but should also be applicable to Debian Sid (at least at the time of writing). For other distributions the dependencies may have different names and you may have to install additional ones.&lt;br /&gt;
&lt;br /&gt;
From a user&#039;s point of view, Docker and podman are quite similar and accept almost all of the exact same commands, but there are some difference.  The most significant differences for building Asteroid are that podman does not use a daemon and can be run &amp;quot;rootless&amp;quot; (that is, as a non-root user).  This makes some things a bit easier, but either can be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Remove the Docker container called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; if it already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build a container image called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; from the given Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the software ==&lt;br /&gt;
&lt;br /&gt;
Now that the container with the toolchain software has been created, we can use this to build AsteroidOS.  All of the tools are contained and run within the container, but we use a &#039;&#039;shared volume&#039;&#039;, essentially some drive space that both the host computer and the container can read and write, for actually creating the AsteroidOS image files.&lt;br /&gt;
&lt;br /&gt;
In this example, we will build AsteroidOS for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt;(the LG G Watch).  To build for a different watch than the LG G Watch, use its corresponding codename instead of &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; when executing the &amp;lt;code&amp;gt;docker run ...&amp;lt;/code&amp;gt; command.  You can find the codenames for the supported watches on the [https://asteroidos.org/watches/ Watches page].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assuming that you have carefully followed the instructions so far and are in the &amp;lt;code&amp;gt;asteroid&amp;lt;/code&amp;gt; directory, you can now build the software.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run this as a non root user&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v  &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The files created during the build are placed in the current directory; more specifically, the source files are placed in a &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and build artefacts, including the final binary images are placed in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the Docker command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;sudo docker run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt;  Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-u &amp;quot;$(id -u):$(id -g)&amp;quot;&amp;lt;/code&amp;gt; Ensures that the current user id and group id from the host is used on files inside the container to avoid permission issues.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v /etc/passwd:/etc/passwd&amp;lt;/code&amp;gt;  Ensures that the user ids and groups from the host are also available in the Docker container. (Otherwise the &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; would be useless.)&lt;br /&gt;
*&amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; Contains the user names and their ids.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig&amp;quot;&amp;lt;/code&amp;gt; Share your user&#039;s git config with the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd):/asteroid&amp;quot;&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;quot;dory&amp;quot; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the podman version of the command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt; Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd)&amp;quot;:/asteroid:z&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container. The &amp;lt;code&amp;gt;:z&amp;lt;/code&amp;gt; tells SELinux, if it&#039;s running, to allow multiple containers to share this mount.&lt;br /&gt;
*&amp;lt;code&amp;gt;--userns keep-id&amp;lt;/code&amp;gt; Run as the current user inside the container&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to [[#Installing|Installing]] below.&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
&lt;br /&gt;
After a while, whether you build with or without containers, the generated image should be available in &amp;lt;code&amp;gt;build/tmp-glibc/deploy/images/dory/&amp;lt;/code&amp;gt; (for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; -- for other watches, the image files are in the corresponding code word directory.)&lt;br /&gt;
&lt;br /&gt;
Install AsteroidOS using your usual device&#039;s instructions, which you can find linked from the [https://asteroidos.org/watches/ Watches page].&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=558</id>
		<title>Building AsteroidOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=558"/>
		<updated>2024-12-11T22:06:53Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
|title = An amazing Infobox&lt;br /&gt;
|header1 = It works!&lt;br /&gt;
|label2 = Configured by&lt;br /&gt;
|data2 = trog&lt;br /&gt;
|label3 = Web&lt;br /&gt;
|data3 = [https://trog.qgl.org trog.qgl.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Developers]]&lt;br /&gt;
If you decide to compile AsteroidOS from source be aware that it’s a simple process but requires a lot of disk space (potentially more than 100GB) and the first build might take you a lot of time (hours). Report any problem to the [https://github.com/AsteroidOS/asteroid/issues issue tracker]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://asteroidos.org/asteroid.mp4 Video showing the build process]&lt;br /&gt;
&lt;br /&gt;
= General information =&lt;br /&gt;
&lt;br /&gt;
You might want to build AsteroidOS in a &#039;&#039;container engine&#039;&#039; such as [https://www.docker.com/ Docker] or [https://podman.io/ podman] because you&#039;ll get a clean build environment that works no matter what kinds of package repositories or package versions you have installed or how outdated your Linux distribution is or which Linux distribution you&#039;re using in the first place.&lt;br /&gt;
&lt;br /&gt;
Another advantage of Docker specifically is that it &#039;&#039;should&#039;&#039; also work on Windows and OS X. (However, this has not been tested yet!)&lt;br /&gt;
&lt;br /&gt;
Using containers also allows you to easily roll back.  Without a container, if you decided to delete the AsteroidOS repository and uninstall the prerequisite software packages from your computer, you will potentially remove packages that you had installed before and might actually still need.  With a container, simply deleting the container image has no other effect on the host computer.&lt;br /&gt;
&lt;br /&gt;
= Clone the repository =&lt;br /&gt;
&lt;br /&gt;
Clone the main repository using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t set a global git name and email yet, adapt the following &#039;&#039;git config&#039;&#039; commands to your information. (This is only required to clone some git repositories when building.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before you continue to &#039;&#039;Build without containers&#039;&#039; or &#039;&#039;Build with containers&#039;&#039;, make sure you&#039;re in the asteroid directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build without containers =&lt;br /&gt;
&lt;br /&gt;
== Downloading ==&lt;br /&gt;
&lt;br /&gt;
Install the prerequisites:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Distribution prerequisite installation&lt;br /&gt;
|-&lt;br /&gt;
! Distro !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu || &amp;lt;code&amp;gt;apt-get install git build-essential chrpath cpio diffstat gawk liblz4-tool python3 shared-mime-info texinfo wget zstd &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fedora || &amp;lt;code&amp;gt;dnf install chrpath diffstat g++ lz4 perl perl-bignum python3-pip rpcgen socat texinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arch || &amp;lt;code&amp;gt;pacman -Sy base-devel chrpath cpio diffstat gawk inetutils lz4 python3 rpcsvc-proto shared-mime-info texinfo wget zstd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alpine || &amp;lt;code&amp;gt;apk add binutils chrpath gcc g++ gawk gcc lz4 make patch perl rpcgen&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;Note: Alpine Linux does not contain diffstat in its repositories, thus you have to [https://github.com/asottile-archive/diffstat build it yourself from source].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This repository basically only contains a shell script that populates &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; with OpenEmbedded and the appropriate Asteroid layers. Then, it setups the environment for a bitbake build. The following command will setup a build for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; (the LG G Watch) but you can also build an image for other watches by using the corresponding codename. (Codenames can be found on the [https://asteroidos.org/watches/ Watches page].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory # Be careful that this script must be sourced and not only ran&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the environment has been correctly setup, you should now be in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
Once the environment is prepared, you can simply trigger a build with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-image&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Notes:&#039;&#039;&lt;br /&gt;
1) The build process requires roughly 2GB memory per thread. It might be necessary to limit the number of threads. This can be done by prepending &amp;lt;code&amp;gt;BB_NUMBER_THREADS=n&amp;lt;/code&amp;gt; to the build command. Or by adding &amp;lt;code&amp;gt;BB_NUMBER_THREADS = &amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;build/conf/local.conf&amp;lt;/code&amp;gt;. Where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the amount of threads.&lt;br /&gt;
2) Bitbake is a powerful tool that can also build single packages (e.g: &amp;lt;code&amp;gt;bitbake strace&amp;lt;/code&amp;gt;) or  [[Creating an Asteroid app#Building the Cross Compilation Toolchain|Building the SDK]] for example. Refer to its documentation for more details.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to the [[#Installing|Installing]] section below.&lt;br /&gt;
&lt;br /&gt;
== Updating the Sources ==&lt;br /&gt;
&lt;br /&gt;
You can update the AsteroidOS sources with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Build with containers =&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested on Ubuntu 19.04 (with Docker) and Fedora 34 (with podman), but should also be applicable to Debian Sid (at least at the time of writing). For other distributions the dependencies may have different names and you may have to install additional ones.&lt;br /&gt;
&lt;br /&gt;
From a user&#039;s point of view, Docker and podman are quite similar and accept almost all of the exact same commands, but there are some difference.  The most significant differences for building Asteroid are that podman does not use a daemon and can be run &amp;quot;rootless&amp;quot; (that is, as a non-root user).  This makes some things a bit easier, but either can be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Remove the Docker container called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; if it already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build a container image called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; from the given Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the software ==&lt;br /&gt;
&lt;br /&gt;
Now that the container with the toolchain software has been created, we can use this to build AsteroidOS.  All of the tools are contained and run within the container, but we use a &#039;&#039;shared volume&#039;&#039;, essentially some drive space that both the host computer and the container can read and write, for actually creating the AsteroidOS image files.&lt;br /&gt;
&lt;br /&gt;
In this example, we will build AsteroidOS for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt;(the LG G Watch).  To build for a different watch than the LG G Watch, use its corresponding codename instead of &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; when executing the &amp;lt;code&amp;gt;docker run ...&amp;lt;/code&amp;gt; command.  You can find the codenames for the supported watches on the [https://asteroidos.org/watches/ Watches page].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assuming that you have carefully followed the instructions so far and are in the &amp;lt;code&amp;gt;asteroid&amp;lt;/code&amp;gt; directory, you can now build the software.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run this as a non root user&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v  &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The files created during the build are placed in the current directory; more specifically, the source files are placed in a &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and build artefacts, including the final binary images are placed in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the Docker command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;sudo docker run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt;  Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-u &amp;quot;$(id -u):$(id -g)&amp;quot;&amp;lt;/code&amp;gt; Ensures that the current user id and group id from the host is used on files inside the container to avoid permission issues.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v /etc/passwd:/etc/passwd&amp;lt;/code&amp;gt;  Ensures that the user ids and groups from the host are also available in the Docker container. (Otherwise the &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; would be useless.)&lt;br /&gt;
*&amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; Contains the user names and their ids.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig&amp;quot;&amp;lt;/code&amp;gt; Share your user&#039;s git config with the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd):/asteroid&amp;quot;&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;quot;dory&amp;quot; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the podman version of the command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt; Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd)&amp;quot;:/asteroid:z&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container. The &amp;lt;code&amp;gt;:z&amp;lt;/code&amp;gt; tells SELinux, if it&#039;s running, to allow multiple containers to share this mount.&lt;br /&gt;
*&amp;lt;code&amp;gt;--userns keep-id&amp;lt;/code&amp;gt; Run as the current user inside the container&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to [[#Installing|Installing]] below.&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
&lt;br /&gt;
After a while, whether you build with or without containers, the generated image should be available in &amp;lt;code&amp;gt;build/tmp-glibc/deploy/images/dory/&amp;lt;/code&amp;gt; (for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; -- for other watches, the image files are in the corresponding code word directory.)&lt;br /&gt;
&lt;br /&gt;
Install AsteroidOS using your usual device&#039;s instructions, which you can find linked from the [https://asteroidos.org/watches/ Watches page].&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Installing_the_SDK&amp;diff=544</id>
		<title>Installing the SDK</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Installing_the_SDK&amp;diff=544"/>
		<updated>2024-09-22T20:34:26Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Correct SDK link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
The Software Development Kit (SDK) for AsteroidOS is a set of tools and libraries for developing software to run on AsteroidOS.  Since AsteroidOS is a Linux distribution, you can use just about any programming language to develop software, but most of the core applications use a combination of C++ and Qt, with CMake to build. This page describes how to install and configure the SDK.&lt;br /&gt;
&lt;br /&gt;
==== Which SDK? ====&lt;br /&gt;
One thing to note is that while this describes &amp;quot;the SDK&amp;quot;, there are actually two versions -- the main one is used to develop software that runs on ARM-based watches running AsteroidOS.  The other one is the SDK for developing applications that run on the emulator, which uses qemux86.  See the [[Emulator]] page for details on the qemux86 version.  &lt;br /&gt;
&lt;br /&gt;
You can install both SDKs on the same machine -- they do not interfere.&lt;br /&gt;
&lt;br /&gt;
= Build or Download =&lt;br /&gt;
You can either build the SDK from sources or download a prebuilt version.  Using a prebuilt version is much faster and easier, and is recommended for developers who want to get started quickly.  &lt;br /&gt;
&lt;br /&gt;
The prebuilt SDK is available [https://release.asteroidos.org/nightlies/sdk/oecore-meta-toolchain-qt5-x86_64-armv7vehf-neon-sturgeon-toolchain-nodistro.0.sh here].  If you wish to build it yourself, see [[Building the SDK]].&lt;br /&gt;
&lt;br /&gt;
== Installing the SDK ==&lt;br /&gt;
If you downloaded a prebuilt SDK, run the downloaded script. If you built your own, the generated installation script should be in &amp;lt;code&amp;gt;tmp-glibc/deploy/sdk/&amp;lt;/code&amp;gt; (relative to the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory).  In either case, navigate to the directory which contains the &amp;lt;code&amp;gt;oecore-meta-toolchain-qt5-x86_64-armv7vehf-neon-sturgeon-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; script and run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./oecore-meta-toolchain-qt5-x86_64-armv7vehf-neon-sturgeon-toolchain-nodistro.0.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script will install the cross-compiler and ARM libraries in &amp;lt;code&amp;gt;/usr/local/oecore-x86_64&amp;lt;/code&amp;gt; by default, along with a script that needs to be sourced before every build. If you want to compile software for AsteroidOS on a watch, the command-line steps generally look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
cmake -B build&lt;br /&gt;
cmake --build build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installing the emulator version of the SDK ===&lt;br /&gt;
Installing the emulator version of the SDK is almost exactly the same.  The only difference is that the file name for the installer is &amp;lt;code&amp;gt;oecore-meta-toolchain-qt5-x86_64-core2-32-qemux86-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
As noted above, you can install either or both versions on the same computer with no problem.  They are completely independent.&lt;br /&gt;
&lt;br /&gt;
See [[Creating an Asteroid app]] for next steps.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=531</id>
		<title>Tetra hardware</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=531"/>
		<updated>2024-08-10T18:22:33Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The tetra hardware is based on the Broadcom BCM23550 (referred to as &#039;&#039;java&#039;&#039; in the device tree) chipset.&lt;br /&gt;
[[File:Front of tetra main board.jpg|alt=Front of tetra main board|thumb|Front of tetra main board]]&lt;br /&gt;
[[File:Front of tetra main board NFC antenna removed.jpg|alt=Front of tetra main board NFC antenna removed|thumb|Front of tetra main board NFC antenna removed]]&lt;br /&gt;
[[File:Back-of-tetra-main-board.jpg|alt=Back of tetra main board|thumb|Back of tetra main board]]&lt;br /&gt;
[[File:Back LCD of tetra.jpg|alt=Back LCD of tetra|thumb|Back LCD of tetra]]&lt;br /&gt;
[[File:Back cover of tetra.jpg|alt=Back cover of tetra|thumb|Back cover of tetra]]&lt;br /&gt;
&lt;br /&gt;
=== Front PCB ===&lt;br /&gt;
The front of the PCB is covered by a flexible PCB antenna used for NFC. This is connected to the PCB via a U.FL connector.&lt;br /&gt;
&lt;br /&gt;
Removing the NFC antenna reveals the Broadcom SoC and on its left a shield on top of the memory.&lt;br /&gt;
&lt;br /&gt;
The shield with a QR code is covering the BCM43341 Bluetooth/WiFi chip.&lt;br /&gt;
&lt;br /&gt;
The unmarked chip on the top left is most likely the bcmpmu (Broadcom Power Management Unit).&lt;br /&gt;
&lt;br /&gt;
The vibrator motor is permanently soldered on the front PCB. The back has kapton tape to avoid short circuiting against the metal bottom case.&lt;br /&gt;
&lt;br /&gt;
=== Back PCB ===&lt;br /&gt;
The back of the PCB has testpoints, pogo pins and space for an unpopulated connector.&lt;br /&gt;
&lt;br /&gt;
=== Casing ===&lt;br /&gt;
The case is closed via four screws and a silicone like glue.&lt;br /&gt;
&lt;br /&gt;
The front part consists of the LCD and a transparent part for the ambient light sensor.&lt;br /&gt;
&lt;br /&gt;
The back part contains a epoxied micro USB connector and a (lightly) glued in 1.59Wh battery.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=530</id>
		<title>Tetra hardware</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=530"/>
		<updated>2024-08-10T18:21:03Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The tetra hardware is based on the Broadcom BCM23550 (referred to as &#039;&#039;java&#039;&#039; in the device tree) chipset.&lt;br /&gt;
[[File:Front of tetra main board.jpg|alt=Front of tetra main board|thumb|Front of tetra main board]]&lt;br /&gt;
[[File:Front of tetra main board NFC antenna removed.jpg|alt=Front of tetra main board NFC antenna removed|thumb|Front of tetra main board NFC antenna removed]]&lt;br /&gt;
[[File:Back-of-tetra-main-board.jpg|alt=Back of tetra main board|thumb|Back of tetra main board]]&lt;br /&gt;
[[File:Back LCD of tetra.jpg|alt=Back LCD of tetra|thumb|Back LCD of tetra]]&lt;br /&gt;
[[File:Back cover of tetra.jpg|alt=Back cover of tetra|thumb|Back cover of tetra]]&lt;br /&gt;
&lt;br /&gt;
=== Front PCB ===&lt;br /&gt;
The front of the PCB is covered by a flexible PCB antenna used for NFC. This is connected to the PCB via a U.FL connector.&lt;br /&gt;
&lt;br /&gt;
Removing the NFC antenna reveals the Broadcom SoC and on its left a shield on top of the memory.&lt;br /&gt;
&lt;br /&gt;
The shield with a QR code is covering the BCM43341 Bluetooth/WiFi chip.&lt;br /&gt;
&lt;br /&gt;
The unmarked chip on the top left is most likely the bcmpmu (Broadcom Power Management Unit).&lt;br /&gt;
&lt;br /&gt;
=== Back PCB ===&lt;br /&gt;
The back of the PCB has testpoints, pogo pins and space for an unpopulated connector.&lt;br /&gt;
&lt;br /&gt;
=== Casing ===&lt;br /&gt;
The case is closed via four screws and a silicone like glue.&lt;br /&gt;
&lt;br /&gt;
The front part consists of the LCD and a transparent part for the ambient light sensor.&lt;br /&gt;
&lt;br /&gt;
The back part contains a epoxied micro USB connector and a (lightly) glued in 1.59Wh battery.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=529</id>
		<title>Tetra hardware</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=529"/>
		<updated>2024-08-10T18:17:24Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The tetra hardware is based on the Broadcom BCM23550 (referred to as &#039;&#039;java&#039;&#039; in the device tree) chipset.&lt;br /&gt;
[[File:Front of tetra main board.jpg|alt=Front of tetra main board|thumb|Front of tetra main board]]&lt;br /&gt;
[[File:Front of tetra main board NFC antenna removed.jpg|alt=Front of tetra main board NFC antenna removed|thumb|Front of tetra main board NFC antenna removed]]&lt;br /&gt;
[[File:Back-of-tetra-main-board.jpg|alt=Back of tetra main board|thumb|Back of tetra main board]]&lt;br /&gt;
[[File:Back LCD of tetra.jpg|alt=Back LCD of tetra|thumb|Back LCD of tetra]]&lt;br /&gt;
[[File:Back cover of tetra.jpg|alt=Back cover of tetra|thumb|Back cover of tetra]]&lt;br /&gt;
&lt;br /&gt;
=== Front ===&lt;br /&gt;
The front of the PCB is covered by a flexible PCB antenna used for NFC. This is connected to the PCB via a U.FL connector.&lt;br /&gt;
&lt;br /&gt;
Removing the NFC antenna reveals the Broadcom SoC and on its left a shield on top of the memory.&lt;br /&gt;
&lt;br /&gt;
The shield with a QR code is covering the BCM43341 Bluetooth/WiFi chip.&lt;br /&gt;
&lt;br /&gt;
The unmarked chip on the top left is most likely the bcmpmu (Broadcom Power Management Unit).&lt;br /&gt;
&lt;br /&gt;
=== Back ===&lt;br /&gt;
The back of the PCB has testpoints, pogo pins and space for an unpopulated connector.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=528</id>
		<title>Tetra hardware</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=528"/>
		<updated>2024-08-10T18:15:55Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The tetra hardware is based on the Broadcom BCM23550 (referred to as &#039;&#039;java&#039;&#039; in the device tree) chipset.&lt;br /&gt;
[[File:Front of tetra main board.jpg|alt=Front of tetra main board|thumb|Front of tetra main board]]&lt;br /&gt;
[[File:Front of tetra main board NFC antenna removed.jpg|alt=Front of tetra main board NFC antenna removed|thumb|Front of tetra main board NFC antenna removed]]&lt;br /&gt;
[[File:Back-of-tetra-main-board.jpg|alt=Back of tetra main board|thumb|Back of tetra main board]]&lt;br /&gt;
[[File:Back LCD of tetra.jpg|alt=Back LCD of tetra|thumb|Back LCD of tetra]]&lt;br /&gt;
[[File:Back cover of tetra.jpg|alt=Back cover of tetra|thumb|Back cover of tetra]]&lt;br /&gt;
&lt;br /&gt;
=== Front ===&lt;br /&gt;
The front of the PCB is covered by a flexible PCB antenna used for NFC. This is connected to the PCB via a U.FL connector.&lt;br /&gt;
&lt;br /&gt;
Removing the NFC antenna reveals the Broadcom SoC and on its left a shield on top of the memory.&lt;br /&gt;
&lt;br /&gt;
The shield with a QR code is covering the BCM43341 Bluetooth/WiFi chip.&lt;br /&gt;
&lt;br /&gt;
=== Back ===&lt;br /&gt;
The back of the PCB has testpoints, pogo pins and space for an unpopulated connector.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=527</id>
		<title>Tetra hardware</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Tetra_hardware&amp;diff=527"/>
		<updated>2024-08-10T18:07:46Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Created page with &amp;quot;The tetra hardware is based on the Broadcom BCM23550 (referred to as &amp;#039;&amp;#039;java&amp;#039;&amp;#039; in the device tree) chipset. Front of tetra main board Front of tetra main board NFC antenna removed Back of tetra main board File:B...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The tetra hardware is based on the Broadcom BCM23550 (referred to as &#039;&#039;java&#039;&#039; in the device tree) chipset.&lt;br /&gt;
[[File:Front of tetra main board.jpg|alt=Front of tetra main board|thumb|Front of tetra main board]]&lt;br /&gt;
[[File:Front of tetra main board NFC antenna removed.jpg|alt=Front of tetra main board NFC antenna removed|thumb|Front of tetra main board NFC antenna removed]]&lt;br /&gt;
[[File:Back-of-tetra-main-board.jpg|alt=Back of tetra main board|thumb|Back of tetra main board]]&lt;br /&gt;
[[File:Back LCD of tetra.jpg|alt=Back LCD of tetra|thumb|Back LCD of tetra]]&lt;br /&gt;
[[File:Back cover of tetra.jpg|alt=Back cover of tetra|thumb|Back cover of tetra]]&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Back_cover_of_tetra.jpg&amp;diff=526</id>
		<title>File:Back cover of tetra.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Back_cover_of_tetra.jpg&amp;diff=526"/>
		<updated>2024-08-10T17:59:38Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back cover of tetra&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Back_LCD_of_tetra.jpg&amp;diff=525</id>
		<title>File:Back LCD of tetra.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Back_LCD_of_tetra.jpg&amp;diff=525"/>
		<updated>2024-08-10T17:59:18Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back LCD of tetra&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Back-of-tetra-main-board.jpg&amp;diff=524</id>
		<title>File:Back-of-tetra-main-board.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Back-of-tetra-main-board.jpg&amp;diff=524"/>
		<updated>2024-08-10T17:57:26Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: MagneFire moved page File:1000039885.jpg to File:Back-of-tetra-main-board.jpg without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back of tetra&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Front_of_tetra_main_board_NFC_antenna_removed.jpg&amp;diff=523</id>
		<title>File:Front of tetra main board NFC antenna removed.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Front_of_tetra_main_board_NFC_antenna_removed.jpg&amp;diff=523"/>
		<updated>2024-08-10T17:54:58Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Front of tetra main board NFC antenna removed&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Front_of_tetra_main_board.jpg&amp;diff=522</id>
		<title>File:Front of tetra main board.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Front_of_tetra_main_board.jpg&amp;diff=522"/>
		<updated>2024-08-10T17:53:38Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Front of tetra main board&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=File:Back-of-tetra-main-board.jpg&amp;diff=521</id>
		<title>File:Back-of-tetra-main-board.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=File:Back-of-tetra-main-board.jpg&amp;diff=521"/>
		<updated>2024-08-10T17:45:51Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back of tetra&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Porting_Guide&amp;diff=453</id>
		<title>Porting Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Porting_Guide&amp;diff=453"/>
		<updated>2024-07-07T14:37:50Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Audio: Fix command padding&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Porters]]&lt;br /&gt;
An AsteroidOS hardware adaptation layer consists of:&lt;br /&gt;
* OpenEmbedded recipes describing the compilation of the various HW adaptation components.&lt;br /&gt;
* An appropriate vendor kernel able to boot the watch’s SoC and including the required drivers.&lt;br /&gt;
* A set of Wear OS’s proprietary binary blobs used through libhybris in order to access some of the Android’s HALs.&lt;br /&gt;
* Some middleware configuration files to use your HW adaptation.&lt;br /&gt;
== Creating an OpenEmbedded BSP layer ==&lt;br /&gt;
&lt;br /&gt;
In order to add the support of your watch to AsteroidOS, you’ll need to write an OpenEmbedded layer. Start by making sure you are familiar with the core concepts behind OpenEmbedded by reading the two related documentation pages.&lt;br /&gt;
* [[OpenEmbedded]]&lt;br /&gt;
* [[Building AsteroidOS]]&lt;br /&gt;
The easiest way to create an OpenEmbedded layer for hardware adaptation is to modify one that already exists. If you want to base your port on an Android 5.5.1 base, you should base your layer on [https://github.com/AsteroidOS/meta-dory-hybris meta-dory-hybris]. If you want to base your port on an Android 6 base, you should base your layer on [https://github.com/AsteroidOS/meta-swift-hybris meta-swift-hybris]. If you want to base your port on an Android 8 base, you should base your layer on [https://github.com/AsteroidOS/meta-mooneye-hybris meta-mooneye-hybris].&lt;br /&gt;
&lt;br /&gt;
Start by cloning the most appropriate layer into an &amp;lt;code&amp;gt;src/meta-XXX-hybris/&amp;lt;/code&amp;gt; directory in your AsteroidOS build tree. From now on, XXX will be a reference to your watch’s codename. Once you have that layer setup, [https://github.com/AsteroidOS/meta-swift-hybris/commit/b665878f80936f21cec1757cdc4d10fa95af1841 roughly replace] all references to the previous codename with XXX in the layer and add the path to your layer in your &amp;lt;code&amp;gt;build/conf/bblayers.conf&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
The layer should describe a machine configuration to bitbake in &amp;lt;code&amp;gt;[https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf conf/machine/XXX.conf]&amp;lt;/code&amp;gt;. The definition of a machine allows to [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf#L25 install hardware-specific packages] in a generated rootfs and to give very general information about the hardware adaptation like the [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf#L18 kernel] or [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf#L10 egl providers] that should be used. Having a new machine also allows to modify other layers’ recipes based on the build’s target. For example a &amp;lt;code&amp;gt;.bbappend&amp;lt;/code&amp;gt; file using the _XXX suffix appropriately can [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/brcm-patchram-plus/brcm-patchram-plus_git.bbappend#L1 modify built files], [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-qt/qt5/qt5-qpa-hwcomposer-plugin_git.bbappend#L1 apply patches], [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-nemomobile/sensorfw/sensorfw_git.bbappend#L1 add build dependencies], [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-multimedia/pulseaudio/pulseaudio_%25.bbappend#L1 add runtime dependencies] or [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/brcm-patchram-plus/brcm-patchram-plus_git.bbappend#L3 change compilation flags]. bbappends are very powerful but should be used scarcely to avoid conflicts with other layers.&lt;br /&gt;
&lt;br /&gt;
An hardware adaptation layer does not only modify other recipes with bbappend, it also provides a couple of new recipes that are hardware-specific. You can usually find two very important recipes: the [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb kernel recipe] and the [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/android/android_dory-lp.bb Android’s blobs recipe]. Those recipes will need extra-care and are the topic of the two following paragraphs.&lt;br /&gt;
&lt;br /&gt;
== Creating an appropriate Linux kernel recipe ==&lt;br /&gt;
The kernel recipe describes how to fetch/patch/configure/compile/install/package the vendor kernel. All of those steps may need to be modified from your base recipe.&lt;br /&gt;
&lt;br /&gt;
=== Getting kernel source ===&lt;br /&gt;
&lt;br /&gt;
First of all, you need to find the [https://android.googlesource.com/kernel/msm/+refs git repository], branch and commit containing the source code of the watch you want to work on. Adapt [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L11 SRC_URI] and [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L16 SRCREV] accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Defconfig ===&lt;br /&gt;
Then, try to find your watch’s [https://android.googlesource.com/kernel/msm/+/android-msm-dory-3.10-marshmallow-mr1-wear-release/arch/arm/configs/dory_defconfig defconfig] in the kernel’s &amp;lt;code&amp;gt;arch/arm/configs/&amp;lt;/code&amp;gt; directory. &lt;br /&gt;
Copy this base defconfig onto &amp;lt;code&amp;gt;[https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/defconfig meta-XXX-hybris/recipes-kernel/linux/linux-XXX/defconfig]&amp;lt;/code&amp;gt;.&lt;br /&gt;
If you&#039;re porting a watch with an android base before Oreo (8), you should be able to use the [https://github.com/AsteroidOS/meta-asteroid/blob/master/scripts/check-config &amp;lt;code&amp;gt;check-config&amp;lt;/code&amp;gt; script of meta-asteroid] with the &amp;lt;code&amp;gt;-w&amp;lt;/code&amp;gt; flag to fix a couple of configuration values.&lt;br /&gt;
Android Pie (9)&#039;s libraries generally need SELinux to function, and our config checker script hasn&#039;t yet been adapted for this. You&#039;ll need to go through and enable relevant SELinux options manually, and currently it&#039;s best to cross-reference against the changes that were made to the defconfig of [beluga https://github.com/AsteroidOS/meta-smartwatch/blob/master/meta-beluga/recipes-kernel/linux/linux-beluga/defconfig] or [triggerfish https://github.com/AsteroidOS/meta-smartwatch/blob/master/meta-triggerfish/recipes-kernel/linux/linux-triggerfish/defconfig]. &lt;br /&gt;
&lt;br /&gt;
=== Patches ===&lt;br /&gt;
If you need to patch your kernel’s tree, add the path to [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/0001-Backport-mainline-4.1-Bluetooth-subsystem.patch the patches] to [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L14 SRC_URI].&lt;br /&gt;
&lt;br /&gt;
=== Boot image building ===&lt;br /&gt;
The output of a kernel compilation is a single zImage. In order to be started by your watch’s bootloader, this image needs to be packed with an initramfs into a single boot.img file. (for more information cf. [[Boot Process]]) Three different tools can be used to pack the boot.img file: abootimg, mkboot and mkbootimg. Since some watches only work with one of those tools (without any apparent reason), you can [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L36 inherit] one of the [https://github.com/AsteroidOS/meta-asteroid/tree/master/classes provided bbclass] and adapt the config accordingly.&lt;br /&gt;
&#039;&#039;&#039;Extra-Note&#039;&#039;&#039;: The Yocto project provides a [http://www.yoctoproject.org/docs/1.6.1/kernel-dev/kernel-dev.html handy manual] on how to work with the Linux kernel with OpenEmbedded.&lt;br /&gt;
&lt;br /&gt;
== Building the Android&#039;s &amp;lt;code&amp;gt;/system/&amp;lt;/code&amp;gt; directory ==&lt;br /&gt;
&lt;br /&gt;
In order to get a full AsteroidOS environment, you will need to install the Android HALs required by the usage of libhybris in various AsteroidOS components.&lt;br /&gt;
&lt;br /&gt;
Actually, only a very limited set of libs from Android is needed. Some of those libs (like bionic) need to be patched and must be recompiled from source. Hence, you’ll need to start by cloning a [https://github.com/AsteroidOS/android_manifest/blob/master/default.xml modified and stripped down Android source tree] to compile the needed drivers. You can find detailed info on the build process that has been used for dory in [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/README-system-dir README-system-dir]. You’ll most likely need to adapt those instructions to your own need, thus you are strongly encouraged to document your steps in your own README-system-dir for reproducibility and in order to help future porters.&lt;br /&gt;
&lt;br /&gt;
Once you’ll get your first &amp;lt;code&amp;gt;/system/&amp;lt;/code&amp;gt; directory, you can modify &amp;lt;code&amp;gt;meta-XXX-hybris/recipes-android/android/android_XXX-*.bb&amp;lt;/code&amp;gt; to use your prebuilt tarball. The next steps in hardware adaptation will most likely require you to iterate various modifications to this system directory so don’t get too emotionally attached to this tarball yet.&lt;br /&gt;
&lt;br /&gt;
== Boot ==&lt;br /&gt;
If you boot your generated boot.img from your watch’s bootloader, fastboot should load your kernel which will load the initramfs’s init script which will eventually load you rootfs’s init system. (for more information cf. [[Boot Process]]) You can usually know if those steps have successfully been completed when the watch stays up and running and shows the AsteroidOS boot logo for a while (shown by psplash which is ran by systemd on the rootfs). In case your boot stops earlier, you have a boot problem to debug.&lt;br /&gt;
&lt;br /&gt;
You need to proceed by elimination to find what causes your boot to fail. First of all, disable the ramfs &amp;amp;rarr; rootfs switch by adding a bash infinite loop early [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-core/initrdscripts/initramfs-boot-android/init.sh#L54 in your ramdisk’s init script]. If you notice your watch does not crash anymore, you may have an issue with your rootfs. The Troubleshooting section of the [[Boot Process|Boot Process page]] should help you retrieve your systemd logs and isolate the cause of your boot problem.&lt;br /&gt;
&lt;br /&gt;
If your watch keeps on crashing, you may have a problem with your kernel. Start by making sure you tried the different boot.img packing tools. If the problem persists, you’ll want to retrieve your kernel’s message logs. This can usually be retrieved from a &amp;lt;code&amp;gt;/proc/last_kmsg&amp;lt;/code&amp;gt; virtual file in Wear OS when enabling the &amp;lt;code&amp;gt;CONFIG_ANDROID_RAM_CONSOLE&amp;lt;/code&amp;gt; kernel option. Analyzing the logs should also help narrowing down the issue to a faulty driver or config.&lt;br /&gt;
&lt;br /&gt;
== USB ==&lt;br /&gt;
If you have your AsteroidOS system running, you will want to get a shell access to it with adb or SSH over USB. Use &amp;lt;code&amp;gt;dmesg -w&amp;lt;/code&amp;gt; on your computer to check if your watch appears after having been booted for a few seconds. If you don’t see your watch, you may have a problem with your USB setup.&lt;br /&gt;
&lt;br /&gt;
First of all, try to replicate the config of your Wear OS’s init scripts in [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-core/initrdscripts/initramfs-boot-android/init.sh#L26 your ramdisk’s init script]. Once you’re sure the USB config is the same, you should try to run [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-core/initrdscripts/initramfs-boot-android/init.sh#L52 adbd from your ramdisk] instead of the rootfs, if it solves the problem you may have an issue with usb_moded not starting adbd or RNDIS properly.&lt;br /&gt;
&lt;br /&gt;
If the problem is the same, you may have a problem with your kernel’s config or drivers. First of all, make sure &amp;lt;code&amp;gt;CONFIG_USB_G_ANDROID&amp;lt;/code&amp;gt; is still enabled in the generated &amp;lt;code&amp;gt;build/tmp-glibc/work/XXX-oe-linux-gnueabi/linux-XXX/*/git/.config&amp;lt;/code&amp;gt; as it is quite common to find bitbake removing this option. If the option is still there, your kernel may need special patches.&lt;br /&gt;
&lt;br /&gt;
== Display ==&lt;br /&gt;
As soon as you’ll get access to a shell on AsteroidOS, you may find yourself without asteroid-launcher running. Checking the system logs with &amp;lt;code&amp;gt;journalctl –no-pager&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;systemctl –no-pager&amp;lt;/code&amp;gt; usually shows a segfault from the asteroid-launcher process. This is to be expected on your first run and there is nothing to worry about. In order to reproduce the bug, you can start asteroid-launcher manually with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EGL_PLATFORM=hwcomposer QT_QPA_PLATFORM=hwcomposer asteroid-launcher&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
asteroid-launcher uses lipstick which uses the hwcomposer QPA which uses libhybris which uses the Android graphic HAL to display things on screen. You may need to adapt the Android graphic HAL to answer the needs of hybris. (usually a matter of starting the right android boot services, having the right files placed in the right directories, having the right &amp;lt;code&amp;gt;system.prop&amp;lt;/code&amp;gt; options etc…)&lt;br /&gt;
&lt;br /&gt;
For more information on the Graphic Stack you may want to refer to [[Graphic Stack|the associated documentation page]]. For more information on how to debug an issue, check the Troubleshooting paragraph of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Touch ==&lt;br /&gt;
Once you’ll get asteroid-launcher displaying things on screen, you may have no touch feedback from the UI. If that is the case, you’ll need to modify the asteroid-launcher start command to use a different evdevtouch file. For example, tetra uses [https://github.com/AsteroidOS/meta-tetra-hybris/tree/master/recipes-asteroid/asteroid-launcher this bbappend] to use &amp;lt;code&amp;gt;/dev/input/event1&amp;lt;/code&amp;gt; instead of the default event0.&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
Smartwatches usually don’t carry speakers but they often have microphones. AsteroidOS does not use those microphones yet but it’s usually easy to support and should be supported for the future of the project. AsteroidOS uses [https://github.com/AsteroidOS/meta-asteroid/tree/master/recipes-multimedia/pulseaudio pulseaudio] for its audio stack. pulseaudio takes benefits from the pulseaudio-droid-card module to use the Android’s Audio HAL. In order to test the microphone, you can install and run parec from the &amp;lt;code&amp;gt;build/tmp-glibc/work/armv7vehf-neon-oe-linux-gnueabi/pulseaudio/15.0-r0/packages-split/pulseaudio-misc/&amp;lt;/code&amp;gt; package. If you lack an audio interface, make sure you [https://github.com/AsteroidOS/meta-dory-hybris/commit/0276357cdb266ce28eb37ca958c70f5273d588cd loaded the audio firmware].&lt;br /&gt;
&lt;br /&gt;
In case a problem persist, enabling [https://wiki.ubuntu.com/PulseAudio/Log extra debug information] from pulseaudio can give you detailed info on the cause of the issue.&lt;br /&gt;
&lt;br /&gt;
To play an audio file use the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gst-launch-1.0 filesrc location=input.mp3 ! mpegaudioparse ! mpg123audiodec ! pulsesink&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make an audio recording, use the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gst-launch-1.0 pulsesrc ! audioconvert ! wavenc ! filesink location=recording.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bluetooth ==&lt;br /&gt;
Smartwatches make extensive use of Bluetooth for connectivity. The AsteroidOS project comes with a set of Bluetooth Low Energy profiles implemented in the asteroid-btsyncd server daemon and AsteroidOSSync client. (for more information cf. [[Bluetooth]]) Bluetooth required a few extra steps to work on your port.&lt;br /&gt;
&lt;br /&gt;
asteroid-btsyncd uses BlueZ’s DBus API to create a BLE server. Those APIs require a recent Bluetooth subsystem in your kernel. Unfortunately, Wear OS watches usually come with outdated kernels and a newer BT subsystem needs to be backported. The patch used in dory can be found [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/0002-Backport-mainline-4.1-Bluetooth-subsystem.patch here] and should be adaptable to your kernel’s tree with very few conflicts.&lt;br /&gt;
&lt;br /&gt;
Most Wear OS smartwatches carry a Broadcom BT chip that requires a proprietary firmware to be applied with a tool named brcm-patchram-plus. This tool is called from a systemd service named patchram.service, your HW adaptation layer should include a [https://github.com/AsteroidOS/meta-dory-hybris/tree/master/recipes-android/brcm-patchram-plus modified &amp;lt;code&amp;gt;patchram.service&amp;lt;/code&amp;gt;] file that uses the provided vendor’s firmware and tty line. Information about the config you should use can be found in the [https://android.googlesource.com/platform/hardware/broadcom/libbt/+/master/include/ Android’s libbt-broadcom repository].&lt;br /&gt;
&lt;br /&gt;
With a backported BT subsystem and patched BT firmware, you should already be able to get Bluetooth connectivity on your port but with very limited battery life. Broadcom’s bluetooth’s low power mode is handled by a kernel module named Bluesleep (or more recently Nitrous) that expects custom information to be written in &amp;lt;code&amp;gt;/proc/lpm/&amp;lt;/code&amp;gt;. With BlueZ, this proc interface is never used hence the kernel driver must be adapted to receive HCI events from the BT subsystem with [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/0003-bluesleep-Use-kernel-s-HCI-events-instead-of-proc-bl.patch a patch]. Finally, brcm-patchram-plus must also be [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/brcm-patchram-plus/brcm-patchram-plus_git.bbappend#L3 compiled with a special flag] defining the target device and the [https://github.com/AsteroidOS/brcm-patchram-plus/commit/94fb127e614b19a9a95561b8c1a0716e2e1e6293 low power mode options to use].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sensors ==&lt;br /&gt;
In AsteroidOS, sensors can be used by developers through the QtSensors API that uses the sensorfw backend. Sensorfwd is a sensor daemon that can use libhybris to interface with the Android’s Sensors HAL.&lt;br /&gt;
&lt;br /&gt;
Most watches have a dedicated microcontroller that interfaces with sensors. This means that a daemon or kernel module (or something else) is responsible to upload and interface with the microcontroller from AsteroidOS.&lt;br /&gt;
&lt;br /&gt;
In order to use sensors on AsteroidOS, you need to make sure libhybris recognizes your sensors by running the &amp;lt;code&amp;gt;test_sensors&amp;lt;/code&amp;gt; command. For some platforms it is required to start a sensor daemon. This can usually be found in Wear OS&#039;s init scripts. A likely output of &amp;lt;code&amp;gt;test_sensor&amp;lt;/code&amp;gt; for a platform needing a sensor daemon is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sensors_open() failed: Operation not permitted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information on how to debug an issue, check the Troubleshooting paragraph of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Haptics ==&lt;br /&gt;
In AsteroidOS, vibrations can be used by developers through the QtFeedback and ngfd APIs that usually rely on a libhybris backend which uses the Android’s vibration HAL.&lt;br /&gt;
In order to use vibration on Asteroid with the Android HAL, you need to make sure libhybris recognizes your vibrator by running the &amp;lt;code&amp;gt;test_vibrator&amp;lt;/code&amp;gt; command. For more information on how to debug an issue, check the Troubleshooting paragraph of this page.&lt;br /&gt;
&lt;br /&gt;
A much cleaner way to vibrate in AsteroidOS would be to use an ffmemless kernel driver and the sensorfwd’s ffmemless backend but most watches don’t come with such a kernel driver and it would need to be developed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WLAN ==&lt;br /&gt;
WLAN is not used by AsteroidOS’s user-interface yet but it should be supported for the future of the project. Some information about setting up a Wi-Fi interface can be found in the last paragraph of the [[SSH| SSH documentation page]].&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
While porting AsteroidOS to your watch, you will most likely meet all kind of problems. In order to debug what’s going wrong with your setup you should install debug tools such as strace and gdb and the required debug sybols to your generated rootfs. For example, you can temporarily append the &amp;lt;code&amp;gt;strace gdb asteroid-launcher-dbg&amp;lt;/code&amp;gt; packages to the [https://github.com/AsteroidOS/meta-asteroid/blob/master/classes/asteroid-image.bbclass#L9 asteroid-image class].&lt;br /&gt;
&lt;br /&gt;
Other logical places to look for information that may help you solve the problems are: &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;journalctl --no-pager&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/system/bin/logcat&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Once you come up with more information about your bug, your first reflex should be to [https://log.asteroidos.org/search search the asteroid’s IRC logs] for similar issues. The SailfishOS porters community is another great place to search for information, you may also want to try your chance at [[google:site:merproject.org+irc+QCOM_BSP|searching the merproject’s IRC logs]]. Lastly you can also look through the [https://github.com/search?q=org%3AAsteroidOS+mdss_mdp_overlay_pipe_setup&amp;amp;type=Issues GitHub issues] for more information by other porters.&lt;br /&gt;
&lt;br /&gt;
If you still couldn’t find a solution to your problem in the logs, don’t hesitate to ask questions on the #asteroid IRC or [https://matrix.to/#/#Asteroid:matrix.org #Asteroid:matrix.org] channel. There should be several porters able to help you.&lt;br /&gt;
&lt;br /&gt;
== Upstream your work ==&lt;br /&gt;
That’s it, you can finally use AsteroidOS on your watch! Sharing your work with the rest community should be the final step to ensure your layer will be maintained through time. Start by requesting on IRC the creation of a new AsteroidOS/meta-XXX-hybris repository and send a pull request to this repository. Your work will be carefully reviewed and commented before being integrated upstream. You’ll also need to send a [https://github.com/AsteroidOS/asteroid/pull/8 pull-request to the AsteroidOS/asteroid repository] to integrate your machine to &amp;lt;code&amp;gt;prepare-build.sh&amp;lt;/code&amp;gt; and join the very privileged circle of AsteroidOS porters! Make sure your work is correctly detailed on the [[Porting Status]] page and share a photo of your watch for public twitter announcement.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Local_version_of_asteroidos.org&amp;diff=415</id>
		<title>Local version of asteroidos.org</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Local_version_of_asteroidos.org&amp;diff=415"/>
		<updated>2024-01-04T14:31:06Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Newline fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
This web site can be built and run locally within a software container, such as those created by &#039;&#039;container engines&#039;&#039; like [https://www.docker.com/ Docker] or [https://podman.io/ podman]. One reason for doing this is to be able to install and build the documentation without having to load the collection of tools on your real computer. Building and running a documentation server in a local container is the topic of this page.&lt;br /&gt;
&lt;br /&gt;
This documentation will use &amp;lt;code&amp;gt;podman&amp;lt;/code&amp;gt;, but the commands for &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; are identical. If you wish to use &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;podman&amp;lt;/code&amp;gt;, just substitute &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;podman&amp;lt;/code&amp;gt; in each of the commands shown below.&lt;br /&gt;
&lt;br /&gt;
= Rootless setup =&lt;br /&gt;
&lt;br /&gt;
In case the commands described in the next sections fail, try to either prepend &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; to them or log in as root via e.g &amp;lt;code&amp;gt;su root&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You can manually set up rootless container use on a Linux distribution that has not automatically done this for you while installing the container engine, by following the official instructions.&lt;br /&gt;
*[https://docs.docker.com/engine/security/rootless/ How to install docker in rootless mode] is described in the docker documentation.&lt;br /&gt;
*Podman can be used rootless by users that have a UID/GID range defined. This can be done using the following command for your USERNAME, as [https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md described in the podman documentation].&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 USERNAME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Building the web site =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build -t asteroidos-web \&lt;br /&gt;
  https://raw.githubusercontent.com/AsteroidOS/asteroidos.org/master/Dockerfile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create an &amp;lt;code&amp;gt;asteroidos-web&amp;lt;/code&amp;gt; image which is only around 236 MB and based on the Alpine Linux distribution.&lt;br /&gt;
&lt;br /&gt;
= Running locally =&lt;br /&gt;
&lt;br /&gt;
This section describes how to make changes to the documentation locally and try them out in a container.&lt;br /&gt;
&lt;br /&gt;
Create a local version of this repository with &amp;lt;code&amp;gt;git clone https://github.com/AsteroidOS/asteroidos.org.git&amp;lt;/code&amp;gt;. Then go into that directory with &amp;lt;code&amp;gt;cd asteroidos.org&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This will start the container and run it in the background with the tag &amp;lt;code&amp;gt;asteroidos-web&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run --rm --detach \&lt;br /&gt;
  --name asteroidos-web \&lt;br /&gt;
  --publish 8080:80 \&lt;br /&gt;
  --volume &amp;quot;$(pwd)&amp;quot;:/tmp/asteroidos.org:z \&lt;br /&gt;
  asteroidos-web&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the initial clone of &amp;lt;code&amp;gt;asteroidos.org&amp;lt;/code&amp;gt; you need to install the node dependencies first before &amp;lt;code&amp;gt;grunt&amp;lt;/code&amp;gt; works&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman exec asteroidos-web npm install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will rebuild the website and you will be able to see it by pointing your browser to &amp;lt;code&amp;gt;localhost:8080/&amp;lt;/code&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman exec asteroidos-web grunt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you decide to make changes to your copy of the website, you can make the changes and then rebuild by running &amp;lt;code&amp;gt;grunt&amp;lt;/code&amp;gt; again within the container.&lt;br /&gt;
&lt;br /&gt;
== Running the unmodified version ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; if you want to simply run and view the unmodified version, you can simply use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run --rm --detach --publish 8080:80 asteroidos-web&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will run the version of the website within the container that existed when the container was constructed.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Useful_Commands&amp;diff=407</id>
		<title>Useful Commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Useful_Commands&amp;diff=407"/>
		<updated>2023-12-10T19:49:45Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Fix copy code for sections: USB, Screen and Restart&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AsteroidOS comes with several command line tools that are very handy to control a watch from [[SSH]] or a script. This page tries to document the basic features of those commands, don&#039;t hesitate to use their &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; options if you want to learn more.&lt;br /&gt;
&lt;br /&gt;
Commands and gestures to enter the fastboot (bootloader) mode are listed at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
== Notifications ==&lt;br /&gt;
&lt;br /&gt;
AsteroidOS complies to the [freedesktop.org notifications specification](https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html), which means you can use standard Linux desktop tools such as libnotify to show notifications in asteroid-launcher.&lt;br /&gt;
On AsteroidOS a useful command named &amp;lt;code&amp;gt;notificationtool&amp;lt;/code&amp;gt; is provided that allows you to create/update/close/list notifications from the CLI.&lt;br /&gt;
&lt;br /&gt;
Following example creates a new notification with various parameters&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
notificationtool -o add \&lt;br /&gt;
        --icon=ios-happy \&lt;br /&gt;
        --application=&amp;quot;Super App&amp;quot; \&lt;br /&gt;
        --urgency=3 \&lt;br /&gt;
        --hint=&amp;quot;x-nemo-preview-summary Incredible preview title&amp;quot; \&lt;br /&gt;
        --hint=&amp;quot;x-nemo-preview-body Exceptional preview content&amp;quot; \&lt;br /&gt;
        --hint=&amp;quot;x-nemo-feedback notif_strong&amp;quot; \&lt;br /&gt;
        &amp;quot;Great Title&amp;quot; \&lt;br /&gt;
        &amp;quot;Amazing content&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Launch applications ==&lt;br /&gt;
&lt;br /&gt;
AsteroidOS uses an &amp;lt;code&amp;gt;invoker&amp;lt;/code&amp;gt; to launch apps. The invoker is used to allow for quicker app startup by caching many of the Qt components into memory.&lt;br /&gt;
&lt;br /&gt;
This example launches the alarm clock app using the invoker and hides the title bar.&lt;br /&gt;
Ensure that this command is executed under the &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EGL_PLATFORM=wayland \&lt;br /&gt;
        QT_QPA_PLATFORM=wayland \&lt;br /&gt;
        QT_WAYLAND_DISABLE_WINDOWDECORATION=1 \&lt;br /&gt;
        invoker --single-instance --type=qt5 \&lt;br /&gt;
        /usr/lib/asteroid-alarmclock&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshots ==&lt;br /&gt;
&lt;br /&gt;
The AsteroidOS Wayland compositor is named asteroid-launcher, it is based on lipstick which offers a DBus API to take screenshots. This DBus interface can be used from the command line with dbus-send but a tool named screenshottool makes the usage of this command easier.&lt;br /&gt;
&lt;br /&gt;
Save a screenshot in &amp;lt;code&amp;gt;$HOME&amp;lt;/code&amp;gt; after 3 seconds&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screenshottool /home/ceres/screenshot.jpg 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alarms ==&lt;br /&gt;
&lt;br /&gt;
Managing the time is very important on a smartwatch. Systemd provides basic timer capabilities but the timed daemon goes further and is much more capable. This daemon also comes with a tool named &amp;lt;code&amp;gt;timedclient-qt5&amp;lt;/code&amp;gt; that can help you run commands on special events.&lt;br /&gt;
&lt;br /&gt;
Execute the /home/ceres/test.sh script every day at 12:15&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedclient-qt5 -a&#039;whenDue;runCommand=/home/ceres/test.sh@ceres&#039; \&lt;br /&gt;
        -r&#039;hour=12;minute=15;everyDayOfWeek;everyDayOfMonth;everyMonth&#039; \&lt;br /&gt;
        -e&#039;APPLICATION=Test;TITLE=Test&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== USB ==&lt;br /&gt;
&lt;br /&gt;
In AsteroidOS, the USB mode is handled by a daemon named usb_moded. This daemon offers a DBus interface that is exposed to the GUI by asteroid-launcher and asteroid-settings. However, usb_moded also comes with a command named &amp;lt;code&amp;gt;usb_moded_util&amp;lt;/code&amp;gt; to control this DBus interface from the command line.&lt;br /&gt;
&lt;br /&gt;
Return a list of supported modes:&lt;br /&gt;
&amp;lt;pre&amp;gt;usb_moded_util -m&amp;lt;/pre&amp;gt;&lt;br /&gt;
Show the currently used USB mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;usb_moded_util -q&amp;lt;/pre&amp;gt;&lt;br /&gt;
Set USB to the ADB Mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;usb_moded_util -s adb_mode&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screen ==&lt;br /&gt;
&lt;br /&gt;
A daemon named MCE is in charge of handling various screen related behaviors. For example, MCE handles the device locking, the tap to unlock, the current brightness, fading and dimming and others.... It can be controlled thanks to a CLI tool named &amp;lt;code&amp;gt;mcetool&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Display the current state of various variables:&lt;br /&gt;
&amp;lt;pre&amp;gt;mcetool&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enable &amp;quot;demo mode&amp;quot;: screen stays on:&lt;br /&gt;
&amp;lt;pre&amp;gt;mcetool -D on&amp;lt;/pre&amp;gt;&lt;br /&gt;
Disable the tap to unlock functionality:&lt;br /&gt;
&amp;lt;pre&amp;gt;mcetool -M disabled&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Restart ==&lt;br /&gt;
&lt;br /&gt;
Systemd is the init system used by AsteroidOS. It is controlled by a command named &amp;lt;code&amp;gt;systemctl&amp;lt;/code&amp;gt;. This command can be used to restart the user session or the entire system into a different mode.&lt;br /&gt;
&lt;br /&gt;
Restart the ceres session (including the entire UI):&lt;br /&gt;
&amp;lt;pre&amp;gt;systemctl restart user@1000&amp;lt;/pre&amp;gt;&lt;br /&gt;
Simply reboot your watch:&lt;br /&gt;
&amp;lt;pre&amp;gt;reboot&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart the watch in bootloader mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;systemctl --force reboot bootloader&amp;lt;/pre&amp;gt;&lt;br /&gt;
Restart the watch in recovery mode:&lt;br /&gt;
&amp;lt;pre&amp;gt;systemctl --force reboot recovery&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time zone, date &amp;amp; time ==&lt;br /&gt;
&lt;br /&gt;
Although we offer [[Synchronization Clients | synchronisation clients]] for different platforms, it might still be useful to set the time zone or synchronise the date and time using standard Linux tools. The Linux folder &amp;lt;code&amp;gt;/usr/share/zoneinfo/&amp;lt;/code&amp;gt; contains the naming scheme for your local time zone in &amp;lt;code&amp;gt;&amp;lt;continent&amp;gt;/&amp;lt;zone&amp;gt;&amp;lt;/code&amp;gt; format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssh root@192.168.2.15 &amp;quot;timedatectl set-timezone &amp;lt;continent&amp;gt;/&amp;lt;zone&amp;gt;&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;ssh root@192.168.2.15 &amp;quot;date -s @`(date -u +&amp;quot;%s&amp;quot; )`&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Boot to fastboot (bootloader) menu =&lt;br /&gt;
&lt;br /&gt;
In case you can not boot to the fastboot menu using &lt;br /&gt;
&amp;lt;pre&amp;gt;adb reboot bootloader&amp;lt;/pre&amp;gt;&lt;br /&gt;
Try the manual method for your watch specified below. These methods come in very handy in case your watch does neither boot AsteroidOS, nor WearOS successfully in its current state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Anthias, Bass, Dory, Lenok, Mooneye, Sparrow, Swift, Wren====&lt;br /&gt;
During the first seconds of the boot process, swipe diagonally across the screen. Starting from the top/left outer edge of the screen to the bottom/right.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Catfish, hoki, Skipjack====&lt;br /&gt;
Power down the watch. Keep holding both buttons during the boot process until the fastboot menu appears.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firefish, Ray====&lt;br /&gt;
After the watch stops vibrating on startup, immediately touch the top/left &amp;amp; bottom/right of the screen and press the middle button while the manufacturer logo displays.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Nemo, triggerfish====&lt;br /&gt;
Power down the watch. Keep holding the lower button while powering on the device.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Pike====&lt;br /&gt;
Power down the watch. Keep holding both buttons during the boot process, then select fastboot from the menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sawfish, Sawshark, Sturgeon====&lt;br /&gt;
Press and hold the power button when the manufacturer bootlogo appears, until the vibration finishes. Release the button and press it again quickly. The time frame for this method is short and might need several attempts. Some users report that spamming power button presses already during the vibration helps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Smelt====&lt;br /&gt;
Keep holding the power button during the boot process and release it quickly after the second (double) vibration.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Category:Watches&amp;diff=276</id>
		<title>Category:Watches</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Category:Watches&amp;diff=276"/>
		<updated>2023-07-10T17:27:35Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Include alphabetical ordering to the stars.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=== Supported watches ===&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Watches&lt;br /&gt;
|where=Status=&amp;quot;supported&amp;quot;&lt;br /&gt;
|fields=Picture,Name,CONCAT(&amp;quot;&amp;lt;b&amp;gt;&amp;quot;,Model,&amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;(&amp;quot;,Name,&amp;quot;)&amp;lt;br/&amp;gt;&amp;quot;,Stars,&amp;quot; stars&amp;quot;)=capt,_pageName&lt;br /&gt;
|order by=Watches.Stars DESC, Watches.Name ASC&lt;br /&gt;
|format=gallery&lt;br /&gt;
|mode=traditional&lt;br /&gt;
|caption field=capt&lt;br /&gt;
|alt field=Name&lt;br /&gt;
|link field=_pageName&lt;br /&gt;
|show filename=0&lt;br /&gt;
|show bytes=0&lt;br /&gt;
|show dimensions=0&lt;br /&gt;
|default=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Experimental watches ===&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Watches&lt;br /&gt;
|where=Status=&amp;quot;experimental&amp;quot;&lt;br /&gt;
|fields=Picture,Name,CONCAT(&amp;quot;&amp;lt;b&amp;gt;&amp;quot;,Model,&amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;(&amp;quot;,Name,&amp;quot;)&amp;lt;br/&amp;gt;&amp;quot;,Stars,&amp;quot; stars&amp;quot;)=capt,_pageName&lt;br /&gt;
|order by=Watches.Stars DESC, Watches.Name ASC&lt;br /&gt;
|format=gallery&lt;br /&gt;
|mode=traditional&lt;br /&gt;
|caption field=capt&lt;br /&gt;
|alt field=Name&lt;br /&gt;
|link field=_pageName&lt;br /&gt;
|show filename=0&lt;br /&gt;
|show bytes=0&lt;br /&gt;
|show dimensions=0&lt;br /&gt;
|default=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Hoki&amp;diff=275</id>
		<title>Hoki</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Hoki&amp;diff=275"/>
		<updated>2023-07-10T17:22:58Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=hoki&lt;br /&gt;
|Model=Fossil Gen 6&lt;br /&gt;
|Picture=hoki.png&lt;br /&gt;
|Status=supported&lt;br /&gt;
|Stars=2&lt;br /&gt;
|Chipset=msm8937&lt;br /&gt;
|KernelVersion=4.14&lt;br /&gt;
|AndroidVersion=pie&lt;br /&gt;
|StatusDisplay=good&lt;br /&gt;
|StatusTouch=good&lt;br /&gt;
|StatusBluetooth=good&lt;br /&gt;
|StatusHaptics=good&lt;br /&gt;
|StatusTiltToWake=bad&lt;br /&gt;
|StatusLightSensor=bad&lt;br /&gt;
|StatusAlwaysOnDisplay=partial&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=bad&lt;br /&gt;
|StatusSpeaker=bad&lt;br /&gt;
|StatusCompass=bad&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=bad&lt;br /&gt;
|StatusUSB=partial&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=missing&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=good&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Watches]]&lt;br /&gt;
Hoki (Fossil Gen 6) is a compact, feature complete watch.&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
= Repair =&lt;br /&gt;
&lt;br /&gt;
= Miscellaneous hardware docs =&lt;br /&gt;
== Keys ==&lt;br /&gt;
== Manually getting to fastboot ==&lt;br /&gt;
Press and hold all three buttons, wait until fastboot appears.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Hoki&amp;diff=274</id>
		<title>Hoki</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Hoki&amp;diff=274"/>
		<updated>2023-07-10T17:21:13Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=hoki&lt;br /&gt;
|Model=Fossil Gen 6&lt;br /&gt;
|Picture=hoki.png&lt;br /&gt;
|Status=supported&lt;br /&gt;
|Stars=2&lt;br /&gt;
|Chipset=msm8937&lt;br /&gt;
|KernelVersion=4.14&lt;br /&gt;
|AndroidVersion=pie&lt;br /&gt;
|StatusDisplay=good&lt;br /&gt;
|StatusTouch=good&lt;br /&gt;
|StatusBluetooth=good&lt;br /&gt;
|StatusHaptics=good&lt;br /&gt;
|StatusTiltToWake=bad&lt;br /&gt;
|StatusLightSensor=bad&lt;br /&gt;
|StatusAlwaysOnDisplay=partial&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=bad&lt;br /&gt;
|StatusSpeaker=bad&lt;br /&gt;
|StatusCompass=bad&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=bad&lt;br /&gt;
|StatusUSB=partial&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=missing&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=good&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Watches]]&lt;br /&gt;
Hoki (Fossil Gen 6) is a&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
= Repair =&lt;br /&gt;
&lt;br /&gt;
= Miscellaneous hardware docs =&lt;br /&gt;
== Keys ==&lt;br /&gt;
== Manually getting to fastboot ==&lt;br /&gt;
Press and hold all three buttons, wait until fastboot appears.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Hoki&amp;diff=273</id>
		<title>Hoki</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Hoki&amp;diff=273"/>
		<updated>2023-07-10T17:18:07Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Created page with &amp;quot;{{Watches |Name=hoki |Model=Fossil Gen 6 |Picture=hoki.png |Status=supported |Stars=2 |Chipset=msm8937 |KernelVersion=4.14 |AndroidVersion=pie |StatusDisplay=good |StatusTouch=good |StatusBluetooth=good |StatusHaptics=good |StatusTiltToWake=bad |StatusLightSensor=bad |StatusAlwaysOnDisplay=partial |StatusDualDisplay=missing |StatusMicrophone=bad |StatusSpeaker=bad |StatusCompass=bad |StatusSteps=bad |StatusHeartRate=bad |StatusUSB=partial |StatusWLAN=bad |StatusGPS=bad |...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=hoki&lt;br /&gt;
|Model=Fossil Gen 6&lt;br /&gt;
|Picture=hoki.png&lt;br /&gt;
|Status=supported&lt;br /&gt;
|Stars=2&lt;br /&gt;
|Chipset=msm8937&lt;br /&gt;
|KernelVersion=4.14&lt;br /&gt;
|AndroidVersion=pie&lt;br /&gt;
|StatusDisplay=good&lt;br /&gt;
|StatusTouch=good&lt;br /&gt;
|StatusBluetooth=good&lt;br /&gt;
|StatusHaptics=good&lt;br /&gt;
|StatusTiltToWake=bad&lt;br /&gt;
|StatusLightSensor=bad&lt;br /&gt;
|StatusAlwaysOnDisplay=partial&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=bad&lt;br /&gt;
|StatusSpeaker=bad&lt;br /&gt;
|StatusCompass=bad&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=bad&lt;br /&gt;
|StatusUSB=partial&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=missing&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=good&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Watches]]&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Documentation&amp;diff=251</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Documentation&amp;diff=251"/>
		<updated>2023-07-04T21:23:41Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Remove welcome message&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Code of Conduct]]&lt;br /&gt;
* [[:Category:Watches| Watches]]&lt;br /&gt;
&lt;br /&gt;
=== For Users: ===&lt;br /&gt;
* [[Synchronization Clients]]&lt;br /&gt;
* [[SSH]]&lt;br /&gt;
* [[Watchface and Package Installation]]&lt;br /&gt;
* [[Backup Guide]]&lt;br /&gt;
* [[IP Connection]]&lt;br /&gt;
* [[Useful Commands]]&lt;br /&gt;
* [[Porting Status]]&lt;br /&gt;
* [[Updating AsteroidOS]]&lt;br /&gt;
* [[Translating AsteroidOS]]&lt;br /&gt;
* [[Licenses]]&lt;br /&gt;
&lt;br /&gt;
=== For Developers: ===&lt;br /&gt;
* [[Building AsteroidOS]]&lt;br /&gt;
* [[Creating an Asteroid app]]&lt;br /&gt;
* [[Creating a Watchface]]&lt;br /&gt;
* [[Emulator]]&lt;br /&gt;
* [[Local version of asteroidos.org]]&lt;br /&gt;
* [[Bluetooth]]&lt;br /&gt;
* [[BLE profiles]]&lt;br /&gt;
&lt;br /&gt;
=== For Porters: ===&lt;br /&gt;
* [[Porting Guide]]&lt;br /&gt;
* [[OpenEmbedded]]&lt;br /&gt;
* [[Boot Process]]&lt;br /&gt;
* [[Graphic Stack]]&lt;br /&gt;
* [[Technical Details of AsteroidOS Watches]]&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Porting_Guide&amp;diff=241</id>
		<title>Porting Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Porting_Guide&amp;diff=241"/>
		<updated>2023-07-02T19:58:06Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Fix some code blocks.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Porters]]&lt;br /&gt;
An AsteroidOS hardware adaptation layer consists of:&lt;br /&gt;
* OpenEmbedded recipes describing the compilation of the various HW adaptation components.&lt;br /&gt;
* An appropriate vendor kernel able to boot the watch’s SoC and including the required drivers.&lt;br /&gt;
* A set of Wear OS’s proprietary binary blobs used through libhybris in order to access some of the Android’s HALs.&lt;br /&gt;
* Some middleware configuration files to use your HW adaptation.&lt;br /&gt;
== Creating an OpenEmbedded BSP layer ==&lt;br /&gt;
&lt;br /&gt;
In order to add the support of your watch to AsteroidOS, you’ll need to write an OpenEmbedded layer. Start by making sure you are familiar with the core concepts behind OpenEmbedded by reading the two related documentation pages.&lt;br /&gt;
* [[OpenEmbedded]]&lt;br /&gt;
* [[Building AsteroidOS]]&lt;br /&gt;
The easiest way to create an OpenEmbedded layer for hardware adaptation is to modify one that already exists. If you want to base your port on an Android 5.5.1 base, you should base your layer on [https://github.com/AsteroidOS/meta-dory-hybris meta-dory-hybris]. If you want to base your port on an Android 6 base, you should base your layer on [https://github.com/AsteroidOS/meta-swift-hybris meta-swift-hybris]. If you want to base your port on an Android 8 base, you should base your layer on [https://github.com/AsteroidOS/meta-mooneye-hybris meta-mooneye-hybris].&lt;br /&gt;
&lt;br /&gt;
Start by cloning the most appropriate layer into an &amp;lt;code&amp;gt;src/meta-XXX-hybris/&amp;lt;/code&amp;gt; directory in your AsteroidOS build tree. From now on, XXX will be a reference to your watch’s codename. Once you have that layer setup, [https://github.com/AsteroidOS/meta-swift-hybris/commit/b665878f80936f21cec1757cdc4d10fa95af1841 roughly replace] all references to the previous codename with XXX in the layer and add the path to your layer in your &amp;lt;code&amp;gt;build/conf/bblayers.conf&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
The layer should describe a machine configuration to bitbake in &amp;lt;code&amp;gt;[https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf conf/machine/XXX.conf]&amp;lt;/code&amp;gt;. The definition of a machine allows to [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf#L25 install hardware-specific packages] in a generated rootfs and to give very general information about the hardware adaptation like the [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf#L18 kernel] or [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/conf/machine/dory.conf#L10 egl providers] that should be used. Having a new machine also allows to modify other layers’ recipes based on the build’s target. For example a &amp;lt;code&amp;gt;.bbappend&amp;lt;/code&amp;gt; file using the _XXX suffix appropriately can [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/brcm-patchram-plus/brcm-patchram-plus_git.bbappend#L1 modify built files], [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-qt/qt5/qt5-qpa-hwcomposer-plugin_git.bbappend#L1 apply patches], [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-nemomobile/sensorfw/sensorfw_git.bbappend#L1 add build dependencies], [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-multimedia/pulseaudio/pulseaudio_%25.bbappend#L1 add runtime dependencies] or [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/brcm-patchram-plus/brcm-patchram-plus_git.bbappend#L3 change compilation flags]. bbappends are very powerful but should be used scarcely to avoid conflicts with other layers.&lt;br /&gt;
&lt;br /&gt;
An hardware adaptation layer does not only modify other recipes with bbappend, it also provides a couple of new recipes that are hardware-specific. You can usually find two very important recipes: the [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb kernel recipe] and the [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/android/android_dory-lp.bb Android’s blobs recipe]. Those recipes will need extra-care and are the topic of the two following paragraphs.&lt;br /&gt;
&lt;br /&gt;
== Creating an appropriate Linux kernel recipe ==&lt;br /&gt;
The kernel recipe describes how to fetch/patch/configure/compile/install/package the vendor kernel. All of those steps may need to be modified from your base recipe.&lt;br /&gt;
&lt;br /&gt;
First of all, you need to find the [https://android.googlesource.com/kernel/msm/+refs git repository], branch and commit containing the source code of the watch you want to work on. Adapt [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L11 SRC_URI] and [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L16 SRCREV] accordingly.&lt;br /&gt;
&lt;br /&gt;
Then, try to find your watch’s [https://android.googlesource.com/kernel/msm/+/android-msm-dory-3.10-marshmallow-mr1-wear-release/arch/arm/configs/dory_defconfig defconfig] in the kernel’s &amp;lt;code&amp;gt;arch/arm/configs/&amp;lt;/code&amp;gt; directory. Copy this base defconfig onto &amp;lt;code&amp;gt;[https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/defconfig meta-XXX-hybris/recipes-kernel/linux/linux-XXX/defconfig]&amp;lt;/code&amp;gt; and use the [https://github.com/AsteroidOS/meta-asteroid/blob/master/scripts/check-config &amp;lt;code&amp;gt;check-config&amp;lt;/code&amp;gt; script of meta-asteroid] with the &amp;lt;code&amp;gt;-w&amp;lt;/code&amp;gt; flag to fix a couple of configuration values.&lt;br /&gt;
&lt;br /&gt;
If you need to patch your kernel’s tree, add the path to [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/0001-Backport-mainline-4.1-Bluetooth-subsystem.patch the patches] to [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L14 SRC_URI].&lt;br /&gt;
&lt;br /&gt;
The output of a kernel compilation is a single zImage. In order to be started by your watch’s bootloader, this image needs to be packed with an initramfs into a single boot.img file. (for more information cf. [[Boot Process]]) Three different tools can be used to pack the boot.img file: abootimg, mkboot and mkbootimg. Since some watches only work with one of those tools (without any apparent reason), you can [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory_lp-mr1.bb#L36 inherit] one of the [https://github.com/AsteroidOS/meta-asteroid/tree/master/classes provided bbclass] and adapt the config accordingly.&lt;br /&gt;
&#039;&#039;&#039;Extra-Note&#039;&#039;&#039;: The Yocto project provides a [http://www.yoctoproject.org/docs/1.6.1/kernel-dev/kernel-dev.html handy manual] on how to work with the Linux kernel with OpenEmbedded.&lt;br /&gt;
&lt;br /&gt;
== Building the Android&#039;s &amp;lt;code&amp;gt;/system/&amp;lt;/code&amp;gt; directory ==&lt;br /&gt;
&lt;br /&gt;
In order to get a full AsteroidOS environment, you will need to install the Android HALs required by the usage of libhybris in various AsteroidOS components.&lt;br /&gt;
&lt;br /&gt;
Actually, only a very limited set of libs from Android is needed. Some of those libs (like bionic) need to be patched and must be recompiled from source. Hence, you’ll need to start by cloning a [https://github.com/AsteroidOS/android_manifest/blob/master/default.xml modified and stripped down Android source tree] to compile the needed drivers. You can find detailed info on the build process that has been used for dory in [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/README-system-dir README-system-dir]. You’ll most likely need to adapt those instructions to your own need, thus you are strongly encouraged to document your steps in your own README-system-dir for reproducibility and in order to help future porters.&lt;br /&gt;
&lt;br /&gt;
Once you’ll get your first &amp;lt;code&amp;gt;/system/&amp;lt;/code&amp;gt; directory, you can modify &amp;lt;code&amp;gt;meta-XXX-hybris/recipes-android/android/android_XXX-*.bb&amp;lt;/code&amp;gt; to use your prebuilt tarball. The next steps in hardware adaptation will most likely require you to iterate various modifications to this system directory so don’t get too emotionally attached to this tarball yet.&lt;br /&gt;
&lt;br /&gt;
== Boot ==&lt;br /&gt;
If you boot your generated boot.img from your watch’s bootloader, fastboot should load your kernel which will load the initramfs’s init script which will eventually load you rootfs’s init system. (for more information cf. [[Boot Process]]) You can usually know if those steps have successfully been completed when the watch stays up and running and shows the AsteroidOS boot logo for a while (shown by psplash which is ran by systemd on the rootfs). In case your boot stops earlier, you have a boot problem to debug.&lt;br /&gt;
&lt;br /&gt;
You need to proceed by elimination to find what causes your boot to fail. First of all, disable the ramfs &amp;amp;rarr; rootfs switch by adding a bash infinite loop early [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-core/initrdscripts/initramfs-boot-android/init.sh#L54 in your ramdisk’s init script]. If you notice your watch does not crash anymore, you may have an issue with your rootfs. The Troubleshooting section of the [[Boot Process|Boot Process page]] should help you retrieve your systemd logs and isolate the cause of your boot problem.&lt;br /&gt;
&lt;br /&gt;
If your watch keeps on crashing, you may have a problem with your kernel. Start by making sure you tried the different boot.img packing tools. If the problem persists, you’ll want to retrieve your kernel’s message logs. This can usually be retrieved from a &amp;lt;code&amp;gt;/proc/last_kmsg&amp;lt;/code&amp;gt; virtual file in Wear OS when enabling the &amp;lt;code&amp;gt;CONFIG_ANDROID_RAM_CONSOLE&amp;lt;/code&amp;gt; kernel option. Analyzing the logs should also help narrowing down the issue to a faulty driver or config.&lt;br /&gt;
&lt;br /&gt;
== USB ==&lt;br /&gt;
If you have your AsteroidOS system running, you will want to get a shell access to it with adb or SSH over USB. Use &amp;lt;code&amp;gt;dmesg -w&amp;lt;/code&amp;gt; on your computer to check if your watch appears after having been booted for a few seconds. If you don’t see your watch, you may have a problem with your USB setup.&lt;br /&gt;
&lt;br /&gt;
First of all, try to replicate the config of your Wear OS’s init scripts in [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-core/initrdscripts/initramfs-boot-android/init.sh#L26 your ramdisk’s init script]. Once you’re sure the USB config is the same, you should try to run [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-core/initrdscripts/initramfs-boot-android/init.sh#L52 adbd from your ramdisk] instead of the rootfs, if it solves the problem you may have an issue with usb_moded not starting adbd or RNDIS properly.&lt;br /&gt;
&lt;br /&gt;
If the problem is the same, you may have a problem with your kernel’s config or drivers. First of all, make sure &amp;lt;code&amp;gt;CONFIG_USB_G_ANDROID&amp;lt;/code&amp;gt; is still enabled in the generated &amp;lt;code&amp;gt;build/tmp-glibc/work/XXX-oe-linux-gnueabi/linux-XXX/*/git/.config&amp;lt;/code&amp;gt; as it is quite common to find bitbake removing this option. If the option is still there, your kernel may need special patches.&lt;br /&gt;
&lt;br /&gt;
== Display ==&lt;br /&gt;
As soon as you’ll get access to a shell on AsteroidOS, you may find yourself without asteroid-launcher running. Checking the system logs with &amp;lt;code&amp;gt;journalctl –no-pager&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;systemctl –no-pager&amp;lt;/code&amp;gt; usually shows a segfault from the asteroid-launcher process. This is to be expected on your first run and there is nothing to worry about. In order to reproduce the bug, you can start asteroid-launcher manually with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EGL_PLATFORM=hwcomposer QT_QPA_PLATFORM=hwcomposer asteroid-launcher&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
asteroid-launcher uses lipstick which uses the hwcomposer QPA which uses libhybris which uses the Android graphic HAL to display things on screen. You may need to adapt the Android graphic HAL to answer the needs of hybris. (usually a matter of starting the right android boot services, having the right files placed in the right directories, having the right &amp;lt;code&amp;gt;system.prop&amp;lt;/code&amp;gt; options etc…)&lt;br /&gt;
&lt;br /&gt;
For more information on the Graphic Stack you may want to refer to [[Graphic Stack|the associated documentation page]]. For more information on how to debug an issue, check the Troubleshooting paragraph of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Touch ==&lt;br /&gt;
Once you’ll get asteroid-launcher displaying things on screen, you may have no touch feedback from the UI. If that is the case, you’ll need to modify the asteroid-launcher start command to use a different evdevtouch file. For example, tetra uses [https://github.com/AsteroidOS/meta-tetra-hybris/tree/master/recipes-asteroid/asteroid-launcher this bbappend] to use &amp;lt;code&amp;gt;/dev/input/event1&amp;lt;/code&amp;gt; instead of the default event0.&lt;br /&gt;
&lt;br /&gt;
== Audio ==&lt;br /&gt;
Smartwatches usually don’t carry speakers but they often have microphones. AsteroidOS does not use those microphones yet but it’s usually easy to support and should be supported for the future of the project. AsteroidOS uses [https://github.com/AsteroidOS/meta-asteroid/tree/master/recipes-multimedia/pulseaudio pulseaudio] for its audio stack. pulseaudio takes benefits from the pulseaudio-droid-card module to use the Android’s Audio HAL. In order to test the microphone, you can install and run parec from the &amp;lt;code&amp;gt;build/tmp-glibc/work/armv7ve-neon-oe-linux-gnueabi/pulseaudio/9.0-r0/packages-split/pulseaudio-misc/&amp;lt;/code&amp;gt; package. If you lack an audio interface, make sure you [https://github.com/AsteroidOS/meta-dory-hybris/commit/0276357cdb266ce28eb37ca958c70f5273d588cd loaded the audio firmware].&lt;br /&gt;
&lt;br /&gt;
In case a problem persist, enabling [https://wiki.ubuntu.com/PulseAudio/Log extra debug information] from pulseaudio can give you detailed info on the cause of the issue.&lt;br /&gt;
&lt;br /&gt;
To play an audio file use the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gst-launch-1.0 filesrc location=input.mp3 ! mpegaudioparse! mpg123audiodec ! pulsesink&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make an audio recording, use the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gst-launch-1.0 pulsesrc ! audioconvert ! wavenc ! filesink location=recording.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bluetooth ==&lt;br /&gt;
Smartwatches make extensive use of Bluetooth for connectivity. The AsteroidOS project comes with a set of Bluetooth Low Energy profiles implemented in the asteroid-btsyncd server daemon and AsteroidOSSync client. (for more information cf. [[Bluetooth]]) Bluetooth required a few extra steps to work on your port.&lt;br /&gt;
&lt;br /&gt;
asteroid-btsyncd uses BlueZ’s DBus API to create a BLE server. Those APIs require a recent Bluetooth subsystem in your kernel. Unfortunately, Wear OS watches usually come with outdated kernels and a newer BT subsystem needs to be backported. The patch used in dory can be found [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/0002-Backport-mainline-4.1-Bluetooth-subsystem.patch here] and should be adaptable to your kernel’s tree with very few conflicts.&lt;br /&gt;
&lt;br /&gt;
Most Wear OS smartwatches carry a Broadcom BT chip that requires a proprietary firmware to be applied with a tool named brcm-patchram-plus. This tool is called from a systemd service named patchram.service, your HW adaptation layer should include a [https://github.com/AsteroidOS/meta-dory-hybris/tree/master/recipes-android/brcm-patchram-plus modified &amp;lt;code&amp;gt;patchram.service&amp;lt;/code&amp;gt;] file that uses the provided vendor’s firmware and tty line. Information about the config you should use can be found in the [https://android.googlesource.com/platform/hardware/broadcom/libbt/+/master/include/ Android’s libbt-broadcom repository].&lt;br /&gt;
&lt;br /&gt;
With a backported BT subsystem and patched BT firmware, you should already be able to get Bluetooth connectivity on your port but with very limited battery life. Broadcom’s bluetooth’s low power mode is handled by a kernel module named Bluesleep (or more recently Nitrous) that expects custom information to be written in &amp;lt;code&amp;gt;/proc/lpm/&amp;lt;/code&amp;gt;. With BlueZ, this proc interface is never used hence the kernel driver must be adapted to receive HCI events from the BT subsystem with [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-kernel/linux/linux-dory/0003-bluesleep-Use-kernel-s-HCI-events-instead-of-proc-bl.patch a patch]. Finally, brcm-patchram-plus must also be [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/brcm-patchram-plus/brcm-patchram-plus_git.bbappend#L3 compiled with a special flag] defining the target device and the [https://github.com/AsteroidOS/brcm-patchram-plus/commit/94fb127e614b19a9a95561b8c1a0716e2e1e6293 low power mode options to use].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sensors ==&lt;br /&gt;
In AsteroidOS, sensors can be used by developers through the QtSensors API that uses the sensorfw backend. Sensorfwd is a sensor daemon that can use libhybris to interface with the Android’s Sensors HAL.&lt;br /&gt;
&lt;br /&gt;
Most watches have a dedicated microcontroller that interfaces with sensors. This means that a daemon or kernel module (or something else) is responsible to upload and interface with the microcontroller from AsteroidOS.&lt;br /&gt;
&lt;br /&gt;
In order to use sensors on AsteroidOS, you need to make sure libhybris recognizes your sensors by running the &amp;lt;code&amp;gt;test_sensors&amp;lt;/code&amp;gt; command. For some platforms it is required to start a sensor daemon. This can usually be found in Wear OS&#039;s init scripts. A likely output of &amp;lt;code&amp;gt;test_sensor&amp;lt;/code&amp;gt; for a platform needing a sensor daemon is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sensors_open() failed: Operation not permitted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information on how to debug an issue, check the Troubleshooting paragraph of this page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Haptics ==&lt;br /&gt;
In AsteroidOS, vibrations can be used by developers through the QtFeedback and ngfd APIs that usually rely on a libhybris backend which uses the Android’s vibration HAL.&lt;br /&gt;
In order to use vibration on Asteroid with the Android HAL, you need to make sure libhybris recognizes your vibrator by running the &amp;lt;code&amp;gt;test_vibrator&amp;lt;/code&amp;gt; command. For more information on how to debug an issue, check the Troubleshooting paragraph of this page.&lt;br /&gt;
&lt;br /&gt;
A much cleaner way to vibrate in AsteroidOS would be to use an ffmemless kernel driver and the sensorfwd’s ffmemless backend but most watches don’t come with such a kernel driver and it would need to be developed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WLAN ==&lt;br /&gt;
WLAN is not used by AsteroidOS’s user-interface yet but it should be supported for the future of the project. Some information about setting up a Wi-Fi interface can be found in the last paragraph of the [[SSH| SSH documentation page]].&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
While porting AsteroidOS to your watch, you will most likely meet all kind of problems. In order to debug what’s going wrong with your setup you should install debug tools such as strace and gdb and the required debug sybols to your generated rootfs. For example, you can temporarily append the &amp;lt;code&amp;gt;strace gdb asteroid-launcher-dbg&amp;lt;/code&amp;gt; packages to the [https://github.com/AsteroidOS/meta-asteroid/blob/master/classes/asteroid-image.bbclass#L9 asteroid-image class].&lt;br /&gt;
&lt;br /&gt;
Other logical places to look for information that may help you solve the problems are: &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;journalctl --no-pager&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/system/bin/logcat&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Once you come up with more information about your bug, your first reflex should be to [https://log.asteroidos.org/search search the asteroid’s IRC logs] for similar issues. The SailfishOS porters community is another great place to search for information, you may also want to try your chance at [[google:site:merproject.org+irc+QCOM_BSP|searching the merproject’s IRC logs]]. Lastly you can also look through the [https://github.com/search?q=org%3AAsteroidOS+mdss_mdp_overlay_pipe_setup&amp;amp;type=Issues GitHub issues] for more information by other porters.&lt;br /&gt;
&lt;br /&gt;
If you still couldn’t find a solution to your problem in the logs, don’t hesitate to ask questions on the #asteroid IRC or [https://matrix.to/#/#Asteroid:matrix.org #Asteroid:matrix.org] channel. There should be several porters able to help you.&lt;br /&gt;
&lt;br /&gt;
== Upstream your work ==&lt;br /&gt;
That’s it, you can finally use AsteroidOS on your watch! Sharing your work with the rest community should be the final step to ensure your layer will be maintained through time. Start by requesting on IRC the creation of a new AsteroidOS/meta-XXX-hybris repository and send a pull request to this repository. Your work will be carefully reviewed and commented before being integrated upstream. You’ll also need to send a [https://github.com/AsteroidOS/asteroid/pull/8 pull-request to the AsteroidOS/asteroid repository] to integrate your machine to &amp;lt;code&amp;gt;prepare-build.sh&amp;lt;/code&amp;gt; and join the very privileged circle of AsteroidOS porters! Make sure your work is correctly detailed on the [[Porting Status]] page and share a photo of your watch for public twitter announcement.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Frequently_Asked_Questions_(FAQ)&amp;diff=240</id>
		<title>Frequently Asked Questions (FAQ)</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Frequently_Asked_Questions_(FAQ)&amp;diff=240"/>
		<updated>2023-07-02T19:54:49Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Styling fixes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is AsteroidOS? ==&lt;br /&gt;
AsteroidOS is an open source Linux distribution that runs on many different smartwatches. It uses [http://www.qt.io/ Qt] and QML to provide the graphical interface.&lt;br /&gt;
&lt;br /&gt;
One of the main goals of AsteroidOS is to provide users with greater control over their devices and data privacy. The operating system is fully customizable, and users can modify it to meet their specific needs.&lt;br /&gt;
&lt;br /&gt;
== Which features are provided? ==&lt;br /&gt;
Currently, AsteroidOS has these features available:&lt;br /&gt;
&lt;br /&gt;
- Always-on-Display&lt;br /&gt;
&lt;br /&gt;
- Tilt-to-Wake&lt;br /&gt;
&lt;br /&gt;
- Palm-to-Sleep&lt;br /&gt;
&lt;br /&gt;
- Phone notifications&lt;br /&gt;
&lt;br /&gt;
- Multiple app launcher styles&lt;br /&gt;
&lt;br /&gt;
- Wallpapers&lt;br /&gt;
&lt;br /&gt;
- [https://github.com/AsteroidOS/unofficial-watchfaces Community watchfaces]&lt;br /&gt;
&lt;br /&gt;
- Nightstand mode&lt;br /&gt;
&lt;br /&gt;
== Are any apps preinstalled? ==&lt;br /&gt;
The following apps are delivered with an AsteroidOS installation:&lt;br /&gt;
&lt;br /&gt;
- Agenda, a calendar&lt;br /&gt;
&lt;br /&gt;
- Alarm clock&lt;br /&gt;
&lt;br /&gt;
- Calculator&lt;br /&gt;
&lt;br /&gt;
- Compass&lt;br /&gt;
&lt;br /&gt;
- Diamonds game&lt;br /&gt;
&lt;br /&gt;
- Flashlight&lt;br /&gt;
&lt;br /&gt;
- Heartrate check&lt;br /&gt;
&lt;br /&gt;
- Music, a media remote control&lt;br /&gt;
&lt;br /&gt;
- Settings&lt;br /&gt;
&lt;br /&gt;
- Stopwatch&lt;br /&gt;
&lt;br /&gt;
- Timer&lt;br /&gt;
&lt;br /&gt;
- Weather forecast&lt;br /&gt;
&lt;br /&gt;
== Does an app store exist? ==&lt;br /&gt;
A store to install apps does not yet exist. But this is something that is being considered for future implementation. There are a number of contributed apps that are not installed in the default image. These can be [[Watchface and Package Installation|installed manually]] if desired.&lt;br /&gt;
&lt;br /&gt;
== Where can I find a phone synchronization app? ==&lt;br /&gt;
A phone is not &#039;&#039;required&#039;&#039; to use AsteroidOS, but several convenient functions are available when an AsteroidOS watch is paired with one of the [[Synchronization Clients|synchronization clients listed in the documentation]].&lt;br /&gt;
&lt;br /&gt;
- Android users can use &amp;quot;AsteroidOSSync&amp;quot; which is available for [https://f-droid.org/packages/org.asteroidos.sync/ download on F-Droid]. Or try [https://f-droid.org/packages/nodomain.freeyourgadget.gadgetbridge/ Gadgetbridge from F-Droid] with initial AsteroidOS support.&lt;br /&gt;
&lt;br /&gt;
- Ubuntu Touch users can download [https://open-store.io/app/telescope.asteroidos Telescope&amp;quot; from OpenStore]&lt;br /&gt;
&lt;br /&gt;
- There is currently no app for iPhone, however notifications can be shared from an iPhone to the watch. See [[Synchronization Clients|this page]] for details.&lt;br /&gt;
&lt;br /&gt;
== What features and apps does AsteroidOS &#039;&#039;&#039;not&#039;&#039;&#039; provide? ==&lt;br /&gt;
There are a great many more &#039;&#039;ideas&#039;&#039; for apps than apps at the moment. Some of the more commonly requested, but not yet available applications and features are:&lt;br /&gt;
&lt;br /&gt;
- Call answering from the watch&lt;br /&gt;
&lt;br /&gt;
- Fitness and health tracking application (step counter, ongoing heartrate monitor, etc.)&lt;br /&gt;
&lt;br /&gt;
- Support for using the watch as a phone (for some watches that incorporate a cellular phone chip)&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;And many more&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Some of these are being worked on, and others are just ideas at this point. If you think you might like to contribute, see our [https://github.com/AsteroidOS/asteroid/issues GitHub repository] and the [https://asteroidos.org/contact/ Contact] page. There are many opportunities for creativity!&lt;br /&gt;
&lt;br /&gt;
== Is AsteroidOS based on Android? ==&lt;br /&gt;
No. AsteroidOS uses [[wikipedia:Hybris_(software)|libhybris]] to simplify porting to most Android and WearOS watches, but it is not Android nor is it WearOS or a derivative of either.&lt;br /&gt;
&lt;br /&gt;
Hardware drivers on modern smartwatches are specifically tailored for Android and WearOS devices. These drivers are closely tied to the hardware and are not compatible with other operating systems, which usually makes porting to alternative platforms a complex and time-consuming process. Libhybris allows AsteroidOS to leverage the proprietary binary drivers and thus greatly helps porting Linux to Android based hardware.&lt;br /&gt;
&lt;br /&gt;
== Can I run WearOS applications? ==&lt;br /&gt;
No. [[wikipedia:Wear_OS|WearOS]] is a version of Android that runs on wearable devices. AsteroidOS is a Linux distribution that does not run Android and therefore cannot run either Android or WearOS applications.&lt;br /&gt;
&lt;br /&gt;
== What is different to WearOS? ==&lt;br /&gt;
One significant difference is that AsteroidOS is open source software, while WearOS is not. That is, if you want to change something and you are a developer, you can [[Building AsteroidOS|build the software]] yourself. Or perhaps you would like to [[Creating a Watchface|create your own watchface]].&lt;br /&gt;
&lt;br /&gt;
Another significant difference is that AsteroidOS, unlike WearOS, tries to make the watch usable without pairing it with a phone. In contrast, WearOS watches only run when they are paired with a phone.&lt;br /&gt;
&lt;br /&gt;
== Does AsteroidOS have any tracking features? ==&lt;br /&gt;
No. AsteroidOS does not collect any tracking data and you don&#039;t need to use or establish any accounts to use it. Nothing on the default installation is able to connect to the internet. While it is possible to [[IP Connection|connect an AsteroidOS watch to the internet]] this must be explicitly done by the user.&lt;br /&gt;
&lt;br /&gt;
== Can my watch run AsteroidOS? ==&lt;br /&gt;
Maybe. Check the [[Category:Watches|Watches]] page. It lists all devices supported by AsteroidOS. The star rating indicates the current level of support for each device&#039;s hardware features. Watches with at least 3 stars can be considered suitable for everyday use.&lt;br /&gt;
&lt;br /&gt;
== My watch isn&#039;t listed. ==&lt;br /&gt;
Maybe  you can still run Asteroid OS in the future. See the [[Porting Status|porting status]] page for details on what kinds of watches might be supported in the future and what the general requirements are for running AsteroidOS.&lt;br /&gt;
&lt;br /&gt;
If you are interested in porting AsteroidOS to a new watch yourself, please read the [[Porting Guide]] page and contact us via our [https://asteroidos.org/contact/ matrix channel] in case of possible questions.&lt;br /&gt;
&lt;br /&gt;
== Which features of my watch are currently supported? ==&lt;br /&gt;
The available AsteroidOS features depend on the watch you want to use. Review the table on the installation page for your device to get detailed support information.&lt;br /&gt;
&lt;br /&gt;
Or check the [https://asteroidos.org/watches/features/ features table] to see a matrix of all AsteroidOS watches and their feature support.&lt;br /&gt;
&lt;br /&gt;
== Will I be able to revert to the previous operating system? ==&lt;br /&gt;
Yes, very easily if you choose the &amp;quot;temporary install&amp;quot; option.&lt;br /&gt;
&lt;br /&gt;
For most watches, you may choose to only temporarily install AsteroidOS alongside the existing OS, called a &amp;quot;dual-boot&amp;quot;. When doing so, the &amp;lt;code&amp;gt;asteroidos.ext4&amp;lt;/code&amp;gt; image is pushed to the userdata partition using ADB. With no alteration to the previous OS. The downside of this method being, AsteroidOS needs to be manually booted using &amp;lt;code&amp;gt;fastboot boot boot-image.fastboot&amp;lt;/code&amp;gt; while connected via USB, after every reboot or shutdown. Else, the previous OS will start up as usual.&lt;br /&gt;
&lt;br /&gt;
In case you decide to replace your previous OS using the full install method, to make the watch boot into AsteroidOS without manual intervention. It is advised that you [[Backup Guide|make a backup of your entire watch]] before flashing AsteroidOS. Only then, you will be able to re-flash those backups to restore the previous OS later.&lt;br /&gt;
&lt;br /&gt;
== When can I expect updates? ==&lt;br /&gt;
The complete rebuild of all packages for all Watch system images and architectures takes almost a week. The build process is started at the beginning of a week. Therefore, it can be expected that new nightlies will be available on the weekend. These will contain all the changes that have been merged up to the start of the build process.&lt;br /&gt;
&lt;br /&gt;
== Can I compile AsteroidOS myself? ==&lt;br /&gt;
If you do not want to flash a prebuilt image onto your watch or wait for the nightlies to be updated, review the [[Building AsteroidOS]] page for detailed instructions on how to compile AsteroidOS yourself.&lt;br /&gt;
&lt;br /&gt;
== My question is not answered. ==&lt;br /&gt;
There are many additional resources. The [[Documentation]] page should be your first stop. It has a lot of useful information about both using and developing for AsteroidOS. If you can&#039;t find your answer on this web site, see [https://asteroidos.org/contact/ Contact].&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Frequently_Asked_Questions_(FAQ)&amp;diff=239</id>
		<title>Frequently Asked Questions (FAQ)</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Frequently_Asked_Questions_(FAQ)&amp;diff=239"/>
		<updated>2023-07-02T19:49:15Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Fix link to package installation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is AsteroidOS? ==&lt;br /&gt;
AsteroidOS is an open source Linux distribution that runs on many different smartwatches. It uses [http://www.qt.io/ Qt] and QML to provide the graphical interface.&lt;br /&gt;
&lt;br /&gt;
One of the main goals of AsteroidOS is to provide users with greater control over their devices and data privacy. The operating system is fully customizable, and users can modify it to meet their specific needs.&lt;br /&gt;
&lt;br /&gt;
== Which features are provided? ==&lt;br /&gt;
Currently, AsteroidOS has these features available:&lt;br /&gt;
&lt;br /&gt;
- Always-on-Display&lt;br /&gt;
&lt;br /&gt;
- Tilt-to-Wake&lt;br /&gt;
&lt;br /&gt;
- Palm-to-Sleep&lt;br /&gt;
&lt;br /&gt;
- Phone notifications&lt;br /&gt;
&lt;br /&gt;
- Multiple app launcher styles&lt;br /&gt;
&lt;br /&gt;
- Wallpapers&lt;br /&gt;
&lt;br /&gt;
- [https://github.com/AsteroidOS/unofficial-watchfaces Community watchfaces]&lt;br /&gt;
&lt;br /&gt;
- Nightstand mode&lt;br /&gt;
&lt;br /&gt;
== Are any apps preinstalled? ==&lt;br /&gt;
The following apps are delivered with an AsteroidOS installation:&lt;br /&gt;
&lt;br /&gt;
- Agenda, a calendar&lt;br /&gt;
&lt;br /&gt;
- Alarm clock&lt;br /&gt;
&lt;br /&gt;
- Calculator&lt;br /&gt;
&lt;br /&gt;
- Compass&lt;br /&gt;
&lt;br /&gt;
- Diamonds game&lt;br /&gt;
&lt;br /&gt;
- Flashlight&lt;br /&gt;
&lt;br /&gt;
- Heartrate check&lt;br /&gt;
&lt;br /&gt;
- Music, a media remote control&lt;br /&gt;
&lt;br /&gt;
- Settings&lt;br /&gt;
&lt;br /&gt;
- Stopwatch&lt;br /&gt;
&lt;br /&gt;
- Timer&lt;br /&gt;
&lt;br /&gt;
- Weather forecast&lt;br /&gt;
&lt;br /&gt;
== Does an app store exist? ==&lt;br /&gt;
A store to install apps does not yet exist. But this is something that is being considered for future implementation. There are a number of contributed apps that are not installed in the default image. These can be [[Watchface and Package Installation|installed manually]] if desired.&lt;br /&gt;
&lt;br /&gt;
== Where can I find a phone synchronization app? ==&lt;br /&gt;
A phone is not *required* to use AsteroidOS, but several convenient functions are available when an AsteroidOS watch is paired with one of the [[Synchronization Clients|synchronization clients listed in the documentation]].&lt;br /&gt;
&lt;br /&gt;
- Android users can use &amp;quot;AsteroidOSSync&amp;quot; which is available for [https://f-droid.org/packages/org.asteroidos.sync/ download on F-Droid]. Or try [https://f-droid.org/packages/nodomain.freeyourgadget.gadgetbridge/ Gadgetbridge from F-Droid] with initial AsteroidOS support.&lt;br /&gt;
&lt;br /&gt;
- Ubuntu Touch users can download [https://open-store.io/app/telescope.asteroidos Telescope&amp;quot; from OpenStore]&lt;br /&gt;
&lt;br /&gt;
- There is currently no app for iPhone, however notifications can be shared from an iPhone to the watch. See [[Synchronization Clients|this page]] for details.&lt;br /&gt;
&lt;br /&gt;
== What features and apps does AsteroidOS &#039;&#039;&#039;not&#039;&#039;&#039; provide? ==&lt;br /&gt;
There are a great many more *ideas* for apps than apps at the moment. Some of the more commonly requested, but not yet available applications and features are:&lt;br /&gt;
&lt;br /&gt;
- Call answering from the watch&lt;br /&gt;
&lt;br /&gt;
- Fitness and health tracking application (step counter, ongoing heartrate monitor, etc.)&lt;br /&gt;
&lt;br /&gt;
- Support for using the watch as a phone (for some watches that incorporate a cellular phone chip)&lt;br /&gt;
&lt;br /&gt;
- *And many more*&lt;br /&gt;
&lt;br /&gt;
Some of these are being worked on, and others are just ideas at this point. If you think you might like to contribute, see our [https://github.com/AsteroidOS/asteroid/issues GitHub repository] and the [https://asteroidos.org/contact/ Contact] page. There are many opportunities for creativity!&lt;br /&gt;
&lt;br /&gt;
== Is AsteroidOS based on Android? ==&lt;br /&gt;
No. AsteroidOS uses [[wikipedia:Hybris_(software)|libhybris]] to simplify porting to most Android and WearOS watches, but it is not Android nor is it WearOS or a derivative of either.&lt;br /&gt;
&lt;br /&gt;
Hardware drivers on modern smartwatches are specifically tailored for Android and WearOS devices. These drivers are closely tied to the hardware and are not compatible with other operating systems, which usually makes porting to alternative platforms a complex and time-consuming process. Libhybris allows AsteroidOS to leverage the proprietary binary drivers and thus greatly helps porting Linux to Android based hardware.&lt;br /&gt;
&lt;br /&gt;
== Can I run WearOS applications? ==&lt;br /&gt;
No. [[wikipedia:Wear_OS|WearOS]] is a version of Android that runs on wearable devices. AsteroidOS is a Linux distribution that does not run Android and therefore cannot run either Android or WearOS applications.&lt;br /&gt;
&lt;br /&gt;
== What is different to WearOS? ==&lt;br /&gt;
One significant difference is that AsteroidOS is open source software, while WearOS is not. That is, if you want to change something and you are a developer, you can [[Building AsteroidOS|build the software]] yourself. Or perhaps you would like to [[Creating a Watchface|create your own watchface]].&lt;br /&gt;
&lt;br /&gt;
Another significant difference is that AsteroidOS, unlike WearOS, tries to make the watch usable without pairing it with a phone. In contrast, WearOS watches only run when they are paired with a phone.&lt;br /&gt;
&lt;br /&gt;
== Does AsteroidOS have any tracking features? ==&lt;br /&gt;
No. AsteroidOS does not collect any tracking data and you don&#039;t need to use or establish any accounts to use it. Nothing on the default installation is able to connect to the internet. While it is possible to [[IP Connection|connect an AsteroidOS watch to the internet]] this must be explicitly done by the user.&lt;br /&gt;
&lt;br /&gt;
== Can my watch run AsteroidOS? ==&lt;br /&gt;
Maybe. Check the [[Category:Watches|Watches]] page. It lists all devices supported by AsteroidOS. The star rating indicates the current level of support for each device&#039;s hardware features. Watches with at least 3 stars can be considered suitable for everyday use.&lt;br /&gt;
&lt;br /&gt;
== My watch isn&#039;t listed. ==&lt;br /&gt;
Maybe  you can still run Asteroid OS in the future. See the [[Porting Status|porting status]] page for details on what kinds of watches might be supported in the future and what the general requirements are for running AsteroidOS.&lt;br /&gt;
&lt;br /&gt;
If you are interested in porting AsteroidOS to a new watch yourself, please read the [[Porting Guide]] page and contact us via our [https://asteroidos.org/contact/ matrix channel] in case of possible questions.&lt;br /&gt;
&lt;br /&gt;
== Which features of my watch are currently supported? ==&lt;br /&gt;
The available AsteroidOS features depend on the watch you want to use. Review the table on the installation page for your device to get detailed support information.&lt;br /&gt;
&lt;br /&gt;
Or check the [https://asteroidos.org/watches/features/ features table] to see a matrix of all AsteroidOS watches and their feature support.&lt;br /&gt;
&lt;br /&gt;
== Will I be able to revert to the previous operating system? ==&lt;br /&gt;
Yes, very easily if you choose the &amp;quot;temporary install&amp;quot; option.&lt;br /&gt;
&lt;br /&gt;
For most watches, you may choose to only temporarily install AsteroidOS alongside the existing OS, called a &amp;quot;dual-boot&amp;quot;. When doing so, the `asteroidos.ext4` image is pushed to the userdata partition using ADB. With no alteration to the previous OS. The downside of this method being, AsteroidOS needs to be manually booted using `fastboot boot boot-image.fastboot` while connected via USB, after every reboot or shutdown. Else, the previous OS will start up as usual.&lt;br /&gt;
&lt;br /&gt;
In case you decide to replace your previous OS using the full install method, to make the watch boot into AsteroidOS without manual intervention. It is advised that you [[Backup Guide|make a backup of your entire watch]] before flashing AsteroidOS. Only then, you will be able to re-flash those backups to restore the previous OS later.&lt;br /&gt;
&lt;br /&gt;
== When can I expect updates? ==&lt;br /&gt;
The complete rebuild of all packages for all Watch system images and architectures takes almost a week. The build process is started at the beginning of a week. Therefore, it can be expected that new nightlies will be available on the weekend. These will contain all the changes that have been merged up to the start of the build process.&lt;br /&gt;
&lt;br /&gt;
== Can I compile AsteroidOS myself? ==&lt;br /&gt;
If you do not want to flash a prebuilt image onto your watch or wait for the nightlies to be updated, review the [[Building AsteroidOS]] page for detailed instructions on how to compile AsteroidOS yourself.&lt;br /&gt;
&lt;br /&gt;
== My question is not answered. ==&lt;br /&gt;
There are many additional resources. The [[Documentation]] page should be your first stop. It has a lot of useful information about both using and developing for AsteroidOS. If you can&#039;t find your answer on this web site, see [https://asteroidos.org/contact/ Contact].&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Frequently_Asked_Questions_(FAQ)&amp;diff=238</id>
		<title>Frequently Asked Questions (FAQ)</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Frequently_Asked_Questions_(FAQ)&amp;diff=238"/>
		<updated>2023-07-02T19:19:43Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Initial copy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is AsteroidOS? ==&lt;br /&gt;
AsteroidOS is an open source Linux distribution that runs on many different smartwatches. It uses [http://www.qt.io/ Qt] and QML to provide the graphical interface.&lt;br /&gt;
&lt;br /&gt;
One of the main goals of AsteroidOS is to provide users with greater control over their devices and data privacy. The operating system is fully customizable, and users can modify it to meet their specific needs.&lt;br /&gt;
&lt;br /&gt;
== Which features are provided? ==&lt;br /&gt;
Currently, AsteroidOS has these features available:&lt;br /&gt;
&lt;br /&gt;
- Always-on-Display&lt;br /&gt;
&lt;br /&gt;
- Tilt-to-Wake&lt;br /&gt;
&lt;br /&gt;
- Palm-to-Sleep&lt;br /&gt;
&lt;br /&gt;
- Phone notifications&lt;br /&gt;
&lt;br /&gt;
- Multiple app launcher styles&lt;br /&gt;
&lt;br /&gt;
- Wallpapers&lt;br /&gt;
&lt;br /&gt;
- [https://github.com/AsteroidOS/unofficial-watchfaces Community watchfaces]&lt;br /&gt;
&lt;br /&gt;
- Nightstand mode&lt;br /&gt;
&lt;br /&gt;
== Are any apps preinstalled? ==&lt;br /&gt;
The following apps are delivered with an AsteroidOS installation:&lt;br /&gt;
&lt;br /&gt;
- Agenda, a calendar&lt;br /&gt;
&lt;br /&gt;
- Alarm clock&lt;br /&gt;
&lt;br /&gt;
- Calculator&lt;br /&gt;
&lt;br /&gt;
- Compass&lt;br /&gt;
&lt;br /&gt;
- Diamonds game&lt;br /&gt;
&lt;br /&gt;
- Flashlight&lt;br /&gt;
&lt;br /&gt;
- Heartrate check&lt;br /&gt;
&lt;br /&gt;
- Music, a media remote control&lt;br /&gt;
&lt;br /&gt;
- Settings&lt;br /&gt;
&lt;br /&gt;
- Stopwatch&lt;br /&gt;
&lt;br /&gt;
- Timer&lt;br /&gt;
&lt;br /&gt;
- Weather forecast&lt;br /&gt;
&lt;br /&gt;
== Does an app store exist? ==&lt;br /&gt;
A store to install apps does not yet exist. But this is something that is being considered for future implementation. There are a number of contributed apps that are not installed in the default image. These can be [[Package Installation|installed manually]] if desired.&lt;br /&gt;
&lt;br /&gt;
== Where can I find a phone synchronization app? ==&lt;br /&gt;
A phone is not *required* to use AsteroidOS, but several convenient functions are available when an AsteroidOS watch is paired with one of the [[Synchronization Clients|synchronization clients listed in the documentation]].&lt;br /&gt;
&lt;br /&gt;
- Android users can use &amp;quot;AsteroidOSSync&amp;quot; which is available for [https://f-droid.org/packages/org.asteroidos.sync/ download on F-Droid]. Or try [https://f-droid.org/packages/nodomain.freeyourgadget.gadgetbridge/ Gadgetbridge from F-Droid] with initial AsteroidOS support.&lt;br /&gt;
&lt;br /&gt;
- Ubuntu Touch users can download [https://open-store.io/app/telescope.asteroidos Telescope&amp;quot; from OpenStore]&lt;br /&gt;
&lt;br /&gt;
- There is currently no app for iPhone, however notifications can be shared from an iPhone to the watch. See [[Synchronization Clients|this page]] for details.&lt;br /&gt;
&lt;br /&gt;
== What features and apps does AsteroidOS &#039;&#039;&#039;not&#039;&#039;&#039; provide? ==&lt;br /&gt;
There are a great many more *ideas* for apps than apps at the moment. Some of the more commonly requested, but not yet available applications and features are:&lt;br /&gt;
&lt;br /&gt;
- Call answering from the watch&lt;br /&gt;
&lt;br /&gt;
- Fitness and health tracking application (step counter, ongoing heartrate monitor, etc.)&lt;br /&gt;
&lt;br /&gt;
- Support for using the watch as a phone (for some watches that incorporate a cellular phone chip)&lt;br /&gt;
&lt;br /&gt;
- *And many more*&lt;br /&gt;
&lt;br /&gt;
Some of these are being worked on, and others are just ideas at this point. If you think you might like to contribute, see our [https://github.com/AsteroidOS/asteroid/issues GitHub repository] and the [https://asteroidos.org/contact/ Contact] page. There are many opportunities for creativity!&lt;br /&gt;
&lt;br /&gt;
== Is AsteroidOS based on Android? ==&lt;br /&gt;
No. AsteroidOS uses [[wikipedia:Hybris_(software)|libhybris]] to simplify porting to most Android and WearOS watches, but it is not Android nor is it WearOS or a derivative of either.&lt;br /&gt;
&lt;br /&gt;
Hardware drivers on modern smartwatches are specifically tailored for Android and WearOS devices. These drivers are closely tied to the hardware and are not compatible with other operating systems, which usually makes porting to alternative platforms a complex and time-consuming process. Libhybris allows AsteroidOS to leverage the proprietary binary drivers and thus greatly helps porting Linux to Android based hardware.&lt;br /&gt;
&lt;br /&gt;
== Can I run WearOS applications? ==&lt;br /&gt;
No. [[wikipedia:Wear_OS|WearOS]] is a version of Android that runs on wearable devices. AsteroidOS is a Linux distribution that does not run Android and therefore cannot run either Android or WearOS applications.&lt;br /&gt;
&lt;br /&gt;
== What is different to WearOS? ==&lt;br /&gt;
One significant difference is that AsteroidOS is open source software, while WearOS is not. That is, if you want to change something and you are a developer, you can [[Building AsteroidOS|build the software]] yourself. Or perhaps you would like to [[Creating a Watchface|create your own watchface]].&lt;br /&gt;
&lt;br /&gt;
Another significant difference is that AsteroidOS, unlike WearOS, tries to make the watch usable without pairing it with a phone. In contrast, WearOS watches only run when they are paired with a phone.&lt;br /&gt;
&lt;br /&gt;
== Does AsteroidOS have any tracking features? ==&lt;br /&gt;
No. AsteroidOS does not collect any tracking data and you don&#039;t need to use or establish any accounts to use it. Nothing on the default installation is able to connect to the internet. While it is possible to [[IP Connection|connect an AsteroidOS watch to the internet]] this must be explicitly done by the user.&lt;br /&gt;
&lt;br /&gt;
== Can my watch run AsteroidOS? ==&lt;br /&gt;
Maybe. Check the [[Category:Watches|Watches]] page. It lists all devices supported by AsteroidOS. The star rating indicates the current level of support for each device&#039;s hardware features. Watches with at least 3 stars can be considered suitable for everyday use.&lt;br /&gt;
&lt;br /&gt;
== My watch isn&#039;t listed. ==&lt;br /&gt;
Maybe  you can still run Asteroid OS in the future. See the [[Porting Status|porting status]] page for details on what kinds of watches might be supported in the future and what the general requirements are for running AsteroidOS.&lt;br /&gt;
&lt;br /&gt;
If you are interested in porting AsteroidOS to a new watch yourself, please read the [[Porting Guide]] page and contact us via our [https://asteroidos.org/contact/ matrix channel] in case of possible questions.&lt;br /&gt;
&lt;br /&gt;
== Which features of my watch are currently supported? ==&lt;br /&gt;
The available AsteroidOS features depend on the watch you want to use. Review the table on the installation page for your device to get detailed support information.&lt;br /&gt;
&lt;br /&gt;
Or check the [https://asteroidos.org/watches/features/ features table] to see a matrix of all AsteroidOS watches and their feature support.&lt;br /&gt;
&lt;br /&gt;
== Will I be able to revert to the previous operating system? ==&lt;br /&gt;
Yes, very easily if you choose the &amp;quot;temporary install&amp;quot; option.&lt;br /&gt;
&lt;br /&gt;
For most watches, you may choose to only temporarily install AsteroidOS alongside the existing OS, called a &amp;quot;dual-boot&amp;quot;. When doing so, the `asteroidos.ext4` image is pushed to the userdata partition using ADB. With no alteration to the previous OS. The downside of this method being, AsteroidOS needs to be manually booted using `fastboot boot boot-image.fastboot` while connected via USB, after every reboot or shutdown. Else, the previous OS will start up as usual.&lt;br /&gt;
&lt;br /&gt;
In case you decide to replace your previous OS using the full install method, to make the watch boot into AsteroidOS without manual intervention. It is advised that you [[Backup Guide|make a backup of your entire watch]] before flashing AsteroidOS. Only then, you will be able to re-flash those backups to restore the previous OS later.&lt;br /&gt;
&lt;br /&gt;
== When can I expect updates? ==&lt;br /&gt;
The complete rebuild of all packages for all Watch system images and architectures takes almost a week. The build process is started at the beginning of a week. Therefore, it can be expected that new nightlies will be available on the weekend. These will contain all the changes that have been merged up to the start of the build process.&lt;br /&gt;
&lt;br /&gt;
== Can I compile AsteroidOS myself? ==&lt;br /&gt;
If you do not want to flash a prebuilt image onto your watch or wait for the nightlies to be updated, review the [[Building AsteroidOS]] page for detailed instructions on how to compile AsteroidOS yourself.&lt;br /&gt;
&lt;br /&gt;
== My question is not answered. ==&lt;br /&gt;
There are many additional resources. The [[Documentation]] page should be your first stop. It has a lot of useful information about both using and developing for AsteroidOS. If you can&#039;t find your answer on this web site, see [https://asteroidos.org/contact/ Contact].&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Creating_an_Asteroid_app&amp;diff=173</id>
		<title>Creating an Asteroid app</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Creating_an_Asteroid_app&amp;diff=173"/>
		<updated>2023-06-26T19:33:02Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
= Using QtCreator =&lt;br /&gt;
QtCreator is an integrated development environment for making Qt QML applications.&lt;br /&gt;
&lt;br /&gt;
== Getting the Cross Compilation Toolchain ==&lt;br /&gt;
&lt;br /&gt;
The app creation process of AsteroidOS needs a Software Development Kit generated by OpenEmbedded. You can either grab a prebuilt SDK for the nightlies [https://release.asteroidos.org/nightlies/sdk/oecore-x86_64-armv7vehf-neon-toolchain-nodistro.0.sh here] and install it on your system or you can build it yourself as follows:&lt;br /&gt;
&lt;br /&gt;
== Building the Cross Compilation Toolchain ==&lt;br /&gt;
&lt;br /&gt;
Alternatively you can also build the toolchain from source. If you’ve already got an OpenEmbedded build directory via the [[Building AsteroidOS]] page, cd to that directory. Else, create one with:&lt;br /&gt;
&lt;br /&gt;
=== Build without containers ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, build the cross compilation toolchain with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory&lt;br /&gt;
bitbake meta-toolchain-qt5&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Build with containers===&lt;br /&gt;
&lt;br /&gt;
Assuming you already prepared a docker or podman build environment like in: [[Building AsteroidOS]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
sudo docker run -it \&lt;br /&gt;
  --name asteroidos-toolchain \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake meta-toolchain-qt5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
podman run --rm -it \&lt;br /&gt;
  -v &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake meta-toolchain-qt5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install the SDK ==&lt;br /&gt;
&lt;br /&gt;
If you downloaded a prebuilt SDK, run the downloaded script. If you followed the previous steps, this will have generated the same installation script in &amp;lt;code&amp;gt;tmp-glibc/deploy/sdk/&amp;lt;/code&amp;gt;, you can run it as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
./tmp-glibc/deploy/sdk/oecore-x86_64-armv7vehf-neon-toolchain-nodistro.0.sh&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script will install the cross-compiler and ARM libraries in &amp;lt;code&amp;gt;/usr/local/oecore-x86_64&amp;lt;/code&amp;gt; by default, along with a script that needs to be sourced before every build. If you want to build a simple project via the terminal, this can be done like that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
cmake -B build&lt;br /&gt;
cmake --build build&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configure QtCreator for cross compilation==&lt;br /&gt;
&lt;br /&gt;
Before running QtCreator you must run the previously mentioned script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
qtcreator&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
One other environment variable needs to be set to work seamlessly with AsteroidOS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
export CMAKE_PROGRAM_PATH=/usr/local/oecore-x86_64/sysroots/armv7vehf-neon-oe-linux-gnueabi/usr/bin/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be done automatically by prepending &amp;lt;code&amp;gt;source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&amp;lt;/code&amp;gt; and the export command before &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/usr/bin/qtcreator.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that you are in QtCreator go to &amp;lt;code&amp;gt;Tools&amp;lt;/code&amp;gt; &amp;amp;rarr; &amp;lt;code&amp;gt;Options&amp;lt;/code&amp;gt; &amp;amp;rarr; &amp;lt;code&amp;gt;Devices&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Add a new Generic Linux Device.&lt;br /&gt;
- Name it &amp;quot;AsteroidOS Watch&amp;quot;.&lt;br /&gt;
- Choose 192.168.2.15 as IP address.&lt;br /&gt;
- Use root as user.&lt;br /&gt;
- Choose Password authentication and leave the password field empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under the &amp;lt;code&amp;gt;Kits&amp;lt;/code&amp;gt; add a kit with the previously defined device:&lt;br /&gt;
- Set &amp;lt;code&amp;gt;Device type&amp;lt;/code&amp;gt; to Generic Linux Device.&lt;br /&gt;
- Set the &amp;lt;code&amp;gt;Device&amp;lt;/code&amp;gt; to AsteroidOS Watch.&lt;br /&gt;
- Set the sysroot to &amp;lt;code&amp;gt;/usr/local/oecore-x86_64/sysroots/armv7vehf-neon-oe-linux-gnueabi/&amp;lt;/code&amp;gt;.&lt;br /&gt;
- In the CMake generator change the &amp;lt;code&amp;gt;Generator&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;Unix Makefiles&amp;lt;/code&amp;gt;.&lt;br /&gt;
- Change &amp;lt;code&amp;gt;Qt version&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;.&lt;br /&gt;
- Change &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; compiler to &amp;lt;code&amp;gt;&amp;lt;No compiler&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
- Change &amp;lt;code&amp;gt;C++&amp;lt;/code&amp;gt; compiler to &amp;lt;code&amp;gt;&amp;lt;No compiler&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
- Change &amp;lt;code&amp;gt;CMake Tool&amp;lt;/code&amp;gt; to System CMake at /usr/local/oecore-x86_64/usr/bin/cmake&lt;br /&gt;
- Clear the &amp;lt;code&amp;gt;CMake Configuration&amp;lt;/code&amp;gt; fields.&lt;br /&gt;
&lt;br /&gt;
Note that if these steps are not done *in this order*, QtCreator will not let you change both the &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; compiler and &amp;lt;code&amp;gt;C++&amp;lt;/code&amp;gt; compiler to &amp;lt;code&amp;gt;&amp;lt;No compiler&amp;gt;&amp;lt;/code&amp;gt;.  Specifically, setting Qt version to &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt; must be done first.&lt;br /&gt;
&lt;br /&gt;
= First app=&lt;br /&gt;
&lt;br /&gt;
[https://github.com/AsteroidOS/asteroid-helloworld Asteroid-helloworld] can act as a cool QML demo app to make your first steps into AsteroidOS development easier. You can clone it, build it, install it and then modify it to follow your needs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid-helloworld&lt;br /&gt;
cd asteroid-helloworld/&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
qtcreator CMakeLists.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Try to build and deploy the app. If it wasn’t already installed, a new icon should have already appeared on asteroid-launcher.&lt;br /&gt;
&lt;br /&gt;
You can start by modifying occurrences of “asteroid-helloworld” to your app’s name. Then you can change the *.desktop file which describes the icon on the apps launcher. Then modify main.qml to describe your UI. To get started with QML development you can read the [http://doc.qt.io/qt-5/qml-tutorial.html official tutorial].&lt;br /&gt;
&lt;br /&gt;
==Deploy an app from QtCreator== &lt;br /&gt;
&lt;br /&gt;
Open the project as described in the previous sections.&lt;br /&gt;
&lt;br /&gt;
- Click on the &amp;lt;code&amp;gt;Projects&amp;lt;/code&amp;gt; button on the left sidebar.&lt;br /&gt;
- Under the &amp;lt;code&amp;gt;Build &amp;amp; Run&amp;lt;/code&amp;gt; section click on the &amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt; configuration. This opens all run settings.&lt;br /&gt;
- Scroll down to the &amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt; settings.&lt;br /&gt;
&lt;br /&gt;
Change the following &amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt; settings:&lt;br /&gt;
- Set the &amp;lt;code&amp;gt;Run configuration&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;Custom Executable (on AsteroidOS Watch)&amp;lt;/code&amp;gt;.&lt;br /&gt;
- Set the &amp;lt;code&amp;gt;Remote executable&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;invoker&amp;lt;/code&amp;gt;. Add the &amp;lt;code&amp;gt;--single-instance --type=qtcomponents-qt5 /usr/local/bin/asteroid-helloworld&amp;lt;/code&amp;gt; command line arguments.&lt;br /&gt;
&lt;br /&gt;
Change the following &amp;lt;code&amp;gt;Environment&amp;lt;/code&amp;gt; variables:&lt;br /&gt;
- Add &amp;lt;code&amp;gt;XDG_RUNTIME_DIR&amp;lt;/code&amp;gt; and set its value to &amp;lt;code&amp;gt;/run/user/1000&amp;lt;/code&amp;gt;. So that the invoker works under the root user.&lt;br /&gt;
- (Optional) Add &amp;lt;code&amp;gt;QT_WAYLAND_DISABLE_WINDOWDECORATION&amp;lt;/code&amp;gt; with value &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. To make the app full screen and hide the titlebar.&lt;br /&gt;
&lt;br /&gt;
Your app should now be able to run from the application when you click the start button in the bottom left sidebar.&lt;br /&gt;
&lt;br /&gt;
=Tips and tricks=&lt;br /&gt;
&lt;br /&gt;
If you want to start your app from the command line, open a shell with [[SSH]], connect to ceres and use invoker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
invoker --type=qtcomponents-qt5 /usr/bin/asteroid-stopwatch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to disable screen locking for easier development you can enable the demo mode of mce as root with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mcetool -D on&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
The most common problems stem from not following these directions *exactly*.  QtCreator helpfully tries to find compilers and set variables, but tends to set things up for the desktop as the target rather than AsteroidOS, so it often gets things wrong.  The first step for troubleshooting with QtCreator is to go very carefully over each of the steps listed above and verify that they all match exactly.&lt;br /&gt;
&lt;br /&gt;
==Could not find a package configuration file provided by &amp;quot;ECM&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
This is most often caused not having the environment variables set up as shown above under the topic of [[#Configure QtCreator for cross compilation | configuring QtCreator]].  The environment variables must all be set and then you must lauch &amp;lt;code&amp;gt;qtcreator&amp;lt;/code&amp;gt; *in the same shell*.  If you&#039;re not sure you&#039;ve done this, an easy way to check is to try this command from the command line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
echo $CC&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This should result in a line like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
arm-oe-linux-gnueabi-gcc -march=armv7ve -mfpu=neon -mfloat-abi=hard --sysroot=/usr/local/oecore-x86_64/sysroots/armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If instead you get an empty line or some other non-ARM compiler, you may have made an error.  One common error is to run the script directly instead of running it using &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; on some Linux distributions).  Another common error that causes the error about not finding ECM is if, in the Kit, the system CMake is used instead of the one for the AsteroidOS SDK.&lt;br /&gt;
&lt;br /&gt;
= warning: The project contains C++ source files, but the currently active kit has no C++ compiler. The code model will not be fully functional.&lt;br /&gt;
&lt;br /&gt;
This is not really an error but a warning.  It&#039;s the result of having correctly chosen &amp;lt;code&amp;gt;&amp;lt;No compiler&amp;gt;&amp;lt;/code&amp;gt; as per the instructions above and may safely be ignored.&lt;br /&gt;
&lt;br /&gt;
== file INSTALL cannot find ... .desktop==&lt;br /&gt;
&lt;br /&gt;
This is probably the result of a missing &amp;lt;code&amp;gt;CMAKE_PROGRAM_PATH&amp;lt;/code&amp;gt;.  As mentioned above, this must be set in order for a script that generates the desktop file to be correctly found and uses.&lt;br /&gt;
&lt;br /&gt;
==Remote process crashed==&lt;br /&gt;
&lt;br /&gt;
One possibility is that your software has a bug, but another is that the &amp;lt;code&amp;gt;XDG_RUNTIME_DIR&amp;lt;/code&amp;gt; is not set to &amp;lt;code&amp;gt;/run/user/1000&amp;lt;/code&amp;gt; as mentioned above.&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;I fixed it but I get the same error!&amp;quot;==&lt;br /&gt;
&lt;br /&gt;
This most often happens when something was originally wrong with the configuration, but a CMake scan was made and a possibly faulty Makefile from an earlier attempt still exists.  To fix this, choose &amp;lt;code&amp;gt;Build&amp;lt;/code&amp;gt; from the menu, and then &amp;lt;code&amp;gt;Rescan project&amp;lt;/code&amp;gt;.  This will run CMake again, ignoring existing cached values and forcing the recreation of a Makefile.&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=MediaWiki:Mainpage&amp;diff=98</id>
		<title>MediaWiki:Mainpage</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=MediaWiki:Mainpage&amp;diff=98"/>
		<updated>2023-06-25T17:22:39Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: Created page with &amp;quot;Documentation&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Main_Page&amp;diff=97</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Main_Page&amp;diff=97"/>
		<updated>2023-06-25T17:22:33Z</updated>

		<summary type="html">&lt;p&gt;MagneFire: MagneFire moved page Main Page to Documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Documentation]]&lt;/div&gt;</summary>
		<author><name>MagneFire</name></author>
	</entry>
</feed>