<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pine64.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=CounterPillow</id>
	<title>PINE64 - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pine64.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=CounterPillow"/>
	<link rel="alternate" type="text/html" href="https://wiki.pine64.org/wiki/Special:Contributions/CounterPillow"/>
	<updated>2026-06-06T14:12:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20749</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20749"/>
		<updated>2023-09-15T17:33:18Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
{{hint|'''For prospective editors:''' This guide was authored by [[User:CounterPillow]]. Please read the lengthy comment at the top of the article in the edit window before trying to contribute to it in any way.}}&lt;br /&gt;
&amp;lt;!--FOR EDITORS PLEASE READ AND RESPECT&lt;br /&gt;
This guide makes a lot of deliberately chosen recommendations, and generally does not suggest &amp;quot;alternatives&amp;quot; at every step. This is on purpose. The author weighed the options against each other, and chose one they felt was the best fit for the situation to streamline the guide, or of the best educational value. This helps avoid needlessly bloating an already lengthy guide, and reduces potential for user confusion or decision paralysis. For this reason, the guide will remain in CounterPillow's user namespace.&lt;br /&gt;
&lt;br /&gt;
Please respect that this is the work of an individual and you should not tamper with their author voice. In particular:&lt;br /&gt;
- Do not suggest alternative ways of doing a thing, e.g. alternative disk formatting tools, alternative OS images, alternative firewall management systems, the blight upon humanity that is Docker, and so on.&lt;br /&gt;
- Do not alter the recommendations made, especially not in the Security Advice and Maintaining Your Server sections.&lt;br /&gt;
- Do not reorder sections or steps, the order they're done in is usually deliberately chosen to introduce new concepts as few at a time as possible.&lt;br /&gt;
What you may do is contribute fixes such as typo/grammar fixes, or illustrative diagrams for explained concepts or hardware configurations. If you think you have something to contribute beyond that, please discuss it with CounterPillow first.&lt;br /&gt;
&lt;br /&gt;
TL;DR: Don't shit up my guide. I put a lot of time into it, and it's opinionated for a reason.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it. You require no preexisting Linux knowledge whatsoever.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
=== Permissions ===&lt;br /&gt;
&lt;br /&gt;
On Unix-like systems like Linux, files and directories are owned by one user and one group. Additionally, there are read/write/execute permissions applying for each file or directory for either the user, the group or everyone else. A user may be part of multiple groups at the same time.&lt;br /&gt;
&lt;br /&gt;
We can view these permissions with &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; in the first column. You'll see something like:&lt;br /&gt;
&lt;br /&gt;
 -rwxrw-r--&lt;br /&gt;
&lt;br /&gt;
This would indicate a file (&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; not being present as the first letter, instead being &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;) that is&lt;br /&gt;
&lt;br /&gt;
* '''r'''eadable by the user that owns it, '''w'''ritable by the user that owns it, e'''x'''ecutable by the user that owns it&lt;br /&gt;
* readable by anyone in the group that owns it, writable by anyone in the group that owns it, '''not''' executable by anyone in the group that owns it (unless, in this case, that specific user owns it)&lt;br /&gt;
* readable by everyone else, but neither writable nor executable by them.&lt;br /&gt;
&lt;br /&gt;
You can ignore the next column (the number) in the output. The two columns that come after that are the user and the group that own the file/directory respectively.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' &amp;quot;Executable&amp;quot; on a directory doesn't quite do what one might think it does: it means one is able to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into the directory and read what files/directories it contains.}}&lt;br /&gt;
&lt;br /&gt;
We can change the owner of a file with the &amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 sudo chown &amp;lt;var&amp;gt;newuser&amp;lt;/var&amp;gt;:&amp;lt;var&amp;gt;newgroup&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would change the user that owns &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to &amp;lt;var&amp;gt;newuser&amp;lt;/var&amp;gt;, and the group that owns the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to &amp;lt;var&amp;gt;newgroup&amp;lt;/var&amp;gt;. By adding the &amp;lt;code&amp;gt;-R&amp;lt;/code&amp;gt; argument, we can also make this operation apply recursively to every file and directory contained within a targeted directory.&lt;br /&gt;
&lt;br /&gt;
Similarly, we can modify the permission flags for the '''u'''ser, '''g'''roup and '''o'''ther users with the &amp;lt;code&amp;gt;chmod&amp;lt;/code&amp;gt; command. This is best illustrated with a few examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod o+w &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: give everybody write permissions to &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod g=rw &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: set group permissions to read and write &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, but remove the group execute flag if present.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod u-x &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: remove execute permissions for the user that owns &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, but leave read/write flags as-is.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod ug=rw &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: set user and group permissions for &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to read/write but not execute.&lt;br /&gt;
&lt;br /&gt;
You can once again combine this with the &amp;lt;code&amp;gt;-R&amp;lt;/code&amp;gt; argument to make the operation recursive.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Hint:''' Only the superuser can change the permissions of files or directories not owned by them.}}&lt;br /&gt;
{{hint|'''Further Explanation:''' Consult &amp;lt;code&amp;gt;man chown&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;man chmod&amp;lt;/code&amp;gt; for further details. You can close the manual reader by pressing '''q'''.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Network ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Fixed LAN IP Address ===&lt;br /&gt;
&lt;br /&gt;
By default, the Plebian images use NetworkManager to automatically configure the ethernet interface in such a way that it asks your router to assign it an IP address inside your local network with a protocol called DHCP. What happens is that the Quartz64 asks the router for an IP address, and the router hands it one from a pool of addresses for a limited span of time, a so-called &amp;quot;lease&amp;quot;. Dynamically configuring the IP address like this is great for quickly getting started, especially when in combination with mDNS, as everything just works automatically out of the box.&lt;br /&gt;
&lt;br /&gt;
However, a bit later on in this guide, we'll want the router to know exactly what IP address our Quartz64 Model B is going to respond to even across power cycles of either device. That's why at this point, we'll set it up to have a fixed local network address, with '''one''' of two methods.&lt;br /&gt;
&lt;br /&gt;
==== Method A: Using Reserved DHCP Leases ====&lt;br /&gt;
&lt;br /&gt;
With this method, we'll simply configure your router to always hand the same IP address out over DHCP for the hardware address (MAC) of your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Many routers will have a web interface through which you can configure them. To find your router's IP address, type &amp;lt;code&amp;gt;ip route&amp;lt;/code&amp;gt; into your SSH session with the Quartz64 Model B and hit enter to run the command. It should output something like:&lt;br /&gt;
&lt;br /&gt;
 default via 192.168.0.1 dev end0 proto dhcp src 192.168.0.58 metric 100&lt;br /&gt;
 192.168.0.0/24 dev end0 proto kernel scope link src 192.168.0.58 metric 100&lt;br /&gt;
&lt;br /&gt;
In this case, we can see that our router is &amp;lt;code&amp;gt;192.168.0.1&amp;lt;/code&amp;gt;, as the ''default via'' route goes through it. Yours may be different.&lt;br /&gt;
&lt;br /&gt;
You can now type this router IP address into your web browser, and with any luck, you'll be greeted with a web login prompt. If you've never set a password on your router's management interface, check the bottom or sides of your device for a sticker that lists a default password.&lt;br /&gt;
&lt;br /&gt;
The precise management interface differs from router to router, so this guide can't give precise instructions. However, once logged in, there is usually a section labelled &amp;quot;DHCP&amp;quot;. In it, you may be able to configure reserved IP addresses for a specific MAC address. To find the MAC address of your Quartz64 Model B, run &amp;quot;ip link&amp;quot; on it, which will give you output like this:&lt;br /&gt;
&lt;br /&gt;
 1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
 2: end0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/ether 76:36:c7:c4:57:e2 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&lt;br /&gt;
What we want here is the first colon separated address in the second link (end0), in this case &amp;lt;code&amp;gt;76:36:c7:c4:57:e2&amp;lt;/code&amp;gt;. Your router should let you enter this MAC address somewhere to reserve a specific address from the DHCP pool for it.&lt;br /&gt;
&lt;br /&gt;
==== Method B: Using A Fixed IP ====&lt;br /&gt;
&lt;br /&gt;
If Method A isn't available to you, this method should always work.&lt;br /&gt;
&lt;br /&gt;
Instead of using DHCP to request a lease for an IP address, our Quartz64 Model B can also simply assume it can communicate using a fixed IP address.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' Our fixed IP address should be ''outside'' the range of IP addresses our router hands out through DHCP, as otherwise collisions may occur! In the router web interface, look for a DHCP start address field and DHCP pool size field. An IP address either smaller than the start address (though above 0 and not colliding with the router's address) or larger than the start address plus the pool size (though below 255) will work; you may have to reduce the size of the DHCP pool if it's all maxed out though.&lt;br /&gt;
&lt;br /&gt;
For example, with a DHCP pool that starts at 192.168.0.40 and has a size of 215, we could use a fixed IP address like 192.168.0.10 without accidentally colliding with one the router hands out.&lt;br /&gt;
&lt;br /&gt;
Run the command&lt;br /&gt;
&lt;br /&gt;
 sudo nmtui&lt;br /&gt;
&lt;br /&gt;
which should open up an interactive connection editor. Use your cursor keys to highlight the entry &amp;quot;Wired connection 1&amp;quot;, and hit the right arrow key to navigate towards the &amp;quot;Edit&amp;quot; option, and hit enter.&lt;br /&gt;
&lt;br /&gt;
Navigate to &amp;quot;IPv4 CONFIGURATION&amp;quot; and hit enter on &amp;quot;&amp;amp;lt;Automatic&amp;amp;gt;&amp;quot;, then select &amp;quot;&amp;amp;lt;Manual&amp;amp;gt;&amp;quot;. Navigate to the right over the &amp;quot;&amp;amp;lt;Show&amp;amp;gt;&amp;quot;, and hit enter again. You should now be greeted by a whole host of options:&lt;br /&gt;
&lt;br /&gt;
# In &amp;quot;Addresses:&amp;quot;, hit &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and enter your chosen fixed IPv4 address followed by &amp;lt;code&amp;gt;/32&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;192.168.0.21/32&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In &amp;quot;Gateway&amp;quot;, enter your router's IPv4 address.&lt;br /&gt;
# In DNS Servers, enter on &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and add &amp;lt;code&amp;gt;1.1.1.1&amp;lt;/code&amp;gt;. Repeat the same process, but with &amp;lt;code&amp;gt;1.0.0.1&amp;lt;/code&amp;gt;. This will add Cloudflare's DNS servers, as we'll no longer be receiving the router's DNS servers with manual configuration.&lt;br /&gt;
# Check the box next to &amp;quot;Ignore automatically obtained DNS parameters&amp;quot; by navigating over it and hitting the space bar. This makes sure that if our router tries to give us some DNS servers anyway, we don't use them.&lt;br /&gt;
# Check &amp;quot;Require IPv4 addressing for this connection&amp;quot; in the same way.&lt;br /&gt;
# Just to be consistent, go to &amp;quot;IPv6 CONFIGURATION&amp;quot;, but this time leave it on Automatic. Hit &amp;quot;&amp;amp;lt;Show...&amp;amp;gt;&amp;quot; to expand it.&lt;br /&gt;
# Add the following two Cloudflare DNS servers: &amp;lt;code&amp;gt;2606:4700:4700::1111&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;2606:4700:4700::1001&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check &amp;quot;Ignore automatically obtained DNS parameters&amp;quot;.&lt;br /&gt;
# Navigate down to &amp;quot;&amp;amp;lt;OK&amp;amp;gt;&amp;quot; and hit enter&lt;br /&gt;
# Hit escape twice to quit nmtui&lt;br /&gt;
&lt;br /&gt;
The easiest way to make sure your new network connection settings are used is to reboot your board with&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
After logging back in, the command&lt;br /&gt;
&lt;br /&gt;
 ip addr&lt;br /&gt;
&lt;br /&gt;
should show your chosen IP under end0 after &amp;quot;inet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Firewall ===&lt;br /&gt;
&lt;br /&gt;
Even in a home network that is behind a router's NAT (more on that later), it's good practice to have your individual devices protected by firewalls as well. A firewall can work in many ways, but the simplest and most common method of operation is that it drops all incoming connection attempts originating from globally routed IPs and only allows those on network ports the administrator has explicitly allowed. This prevents locally running services that accidentally listen to incoming connections from all IPs from being accessible to any surprise guests.&lt;br /&gt;
&lt;br /&gt;
While the Linux kernel includes all the logic to filter network packets, we still need an application to set up and manage these filter rules persistently. There are a multitude of such applications that can do this by building their own concept on top of Linux's packet filtering infrastructure, but the one we will be using in this guide is firewalld. firewalld is the default service for managing firewall rules in RedHat Enterprise Linux, Fedora and openSUSE, and is also available to be used on many other Linux distributions, such as Debian (the one we're using).&lt;br /&gt;
&lt;br /&gt;
firewalld has a concept of &amp;quot;zones&amp;quot;, which are logical constructs that either allow certain services through or not, can either be applied to specific interfaces or source IPs, and can pass network traffic between each other with policies. In our case, NetworkManager has assigned the ''end0'' interface the pre-defined ''public'' zone already. Our plan here is to use the pre-defined ''home'' zone for any traffic originating from Local Area Network IP addresses, and let ''public'' handle all the rest.&lt;br /&gt;
&lt;br /&gt;
We first need to install firewalld through Debian's package manager, apt. The first command refreshes our index of packages, the second installs firewalld:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install firewalld&lt;br /&gt;
&lt;br /&gt;
{{note|'''Warning:''' Debian automatically starts firewalld and configures it to auto-start on boot. It happens to be configured in a way that breaks our mDNS (.local domain) resolution. After installing firewalld, immediately work through the next few steps without closing your SSH session as you'll otherwise have to type the board's IP address manually to get back in.}}&lt;br /&gt;
&lt;br /&gt;
We should now tell firewalld about what IP prefixes we consider to be our local network:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --new-ipset=lanv4 --type=hash:net&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv4 --add-entry=10.0.0.0/8&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv4 --add-entry=172.16.0.0/12&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv4 --add-entry=192.168.0.0/16&lt;br /&gt;
 sudo firewall-cmd --permanent --new-ipset=lanv6 --option=family=inet6 --type=hash:net&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv6 --add-entry=fe80::/64&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' We've used [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation CIDR notation] here to denote entire ranges of IP addresses. These specific ranges are specified by the IETF and IANA to be used for private networks, such as our local area network (LAN).}}&lt;br /&gt;
&lt;br /&gt;
Now that we have a ''lanv4'' and ''lanv6'' ipset, we can tell firewalld that any traffic originating from these IPs should be considered part of our ''home'' zone:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=home --add-source=ipset:lanv4&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=home --add-source=ipset:lanv6&lt;br /&gt;
&lt;br /&gt;
We should now reload those new permanent settings, so that our mDNS announcements work again:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
Next, we'll want to remove the ''ssh'' service from the ''public'' zone, as Debian added it there by default:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=public --remove-service=ssh&lt;br /&gt;
 sudo firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
Finally, we want to add a service definition for Minecraft, which uses port 25565 with the TCP protocol, and allow it for our ''home'' and ''public'' zone:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --new-service=minecraft&lt;br /&gt;
 sudo firewall-cmd --permanent --service=minecraft --add-port=25565/tcp&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=home --add-service=minecraft&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=public --add-service=minecraft&lt;br /&gt;
 sudo firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' You can find a (somewhat lacking) documentation for firewalld on [https://firewalld.org/documentation/ the official firewalld website]. A better resource is, as always, &amp;lt;code&amp;gt;man firewall-cmd&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{hint|'''For Expert Users:''' Experienced users might at this point run &amp;lt;code&amp;gt;sudo iptables -L&amp;lt;/code&amp;gt; to look at the actual filtering rules that firewalld has added, and they would be shocked to see some completely empty chains with an ACCEPT policy. Fear not, the firewall is working, but the iptables utility isn't. Modern kernels all use nftables, which confuses the legacy iptables specific tools when something like firewalld makes full use of nftables. Use &amp;lt;code&amp;gt;sudo nft list table inet firewalld&amp;lt;/code&amp;gt; to get a listing of the filtering rules.}}&lt;br /&gt;
&lt;br /&gt;
== Formatting The NVMe Drive ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to wipefs + fdisk + format the NVMe drive, make a mount point and put it in fstab.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Minecraft Java Edition Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Add a minecraft system user with a minecraft group that has write permissions to the minecraft directory on NVMe, add minecraft to supplemental groups for user.&lt;br /&gt;
# Install Java, download PaperMC to the Minecraft directory, symlink it to paper.jar, run it once, accept the EULA.&lt;br /&gt;
# Edit server.properties, enable rcon with a password, enable whitelist, edit motd and set difficulty.&lt;br /&gt;
# Add the systemd unit to /etc/systemd/system/, set it to auto-start, then start it.&lt;br /&gt;
# Add player to whitelist and ops through rcon.&lt;br /&gt;
# Connect to the server for the first time!}}&lt;br /&gt;
&lt;br /&gt;
=== Getting An RCon Client ===&lt;br /&gt;
&lt;br /&gt;
Minecraft's server has a control protocol called &amp;quot;rcon&amp;quot;. We'll need this protocol to gracefully shut down the Minecraft server, and add ourselves to ops later on. For this, we'll need a Minecraft RCon client. [https://github.com/Tiiffi/mcrcon Tiiffi/mcrcon] is a good one, but we need to compile and install it first.&lt;br /&gt;
&lt;br /&gt;
To start off, let's install some required tools to compile it. In your Quartz64 Model B's SSH session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install build-essential&lt;br /&gt;
&lt;br /&gt;
Next we'll download the source code for mcrcon:&lt;br /&gt;
&lt;br /&gt;
 wget --content-disposition https://github.com/Tiiffi/mcrcon/archive/refs/tags/v0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should have downloaded us an ''mcrcon-0.7.2.tar.gz'' archive file. Let's verify that what we've downloaded matches what this guide expects:&lt;br /&gt;
&lt;br /&gt;
 sha256sum mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should output the following; compare the first string of letter and numbers to yours, they must match:&lt;br /&gt;
&lt;br /&gt;
 1743b25a2d031b774e805f4011cb7d92010cb866e3b892f5dfc5b42080973270  mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
Now let's unpack the ''.tar.gz'' archive and change into the directory it contains:&lt;br /&gt;
&lt;br /&gt;
 tar -xf mcrcon-0.7.2.tar.gz&lt;br /&gt;
 cd mcrcon-0.7.2/&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; is the standard utility for creating, modifying, inspecting and unpacking tar archives, commonly referred to as &amp;quot;tarballs&amp;quot;. The &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; argument states that we want to e'''x'''tract, and the &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; argument specifies that the next argument is the filename of the tarball we wish to operate on. &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; will automatically infer the compression of the tarball, in this case gzip, and decompress it as it is unpacking.}}&lt;br /&gt;
&lt;br /&gt;
In this directory (check with &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;!) there should be some files, including a ''Makefile''. This allows us to now compile the source code and install the resulting binary:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' A Makefile instructs the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; command on how to build a project that uses it. In this case, it also contains a ''install'' target, which copies the resulting binary into ''/usr/local/bin'' and its manual page into the local prefix for manual pages. Since only the superuser can write to these directories, we need to run the install target with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
If everything went well, we should now have the &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt; command available, as well as its manual page with &amp;lt;code&amp;gt;man mcrcon&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''For The Future:''' If you ever need to recompile &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt;, for example, after a major version distribution upgrade years down the line that gets rid of ''libc.so.6'', you can run:&lt;br /&gt;
&lt;br /&gt;
 sudo make uninstall&lt;br /&gt;
 make clean&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Making The Server Accessible From Outside Your Home Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain what a dynamic IP is, set up ddclient with DuckDNS, have a systemd timer for that.&lt;br /&gt;
# Explain what port forwarding is, why it's needed, and why this depends on your router. Warn not to forward port 22/tcp, only port 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Maintaining Your Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain how to start, stop, restart the Minecraft server with systemctl.&lt;br /&gt;
# Explain how to access server logs with journalctl.&lt;br /&gt;
# Explain how to keep PaperMC updated (including changing the symlink).&lt;br /&gt;
# Explain apt update and apt upgrade. Recommend unattended-upgrades.&lt;br /&gt;
# Explain Debian major releases and to keep an eye out for them.&lt;br /&gt;
# Recommend htop to see how CPU and RAM usage is looking.&lt;br /&gt;
# Recommend some backup solutions; rsync to flash drive, short mention of borg/borgmatic over the network.&lt;br /&gt;
# Explain how to transfer files to/from server: sftp, rsync, winscp, etc.}}&lt;br /&gt;
&lt;br /&gt;
== Security Advice ==&lt;br /&gt;
&lt;br /&gt;
This section will give some general security advice on running your own server, and elaborates on some decisions this guide makes.&lt;br /&gt;
&lt;br /&gt;
=== SSH Public Key Authentication ===&lt;br /&gt;
&lt;br /&gt;
If you absolutely insist on opening up the SSH port to the public internet, you should use public key authentication and disable password authentication for SSH altogether.&lt;br /&gt;
&lt;br /&gt;
This way, public key cryptography is used to authenticate, which is computationally extremely hard to break in this case. The password you encrypt your private key with never travels over the network.&lt;br /&gt;
&lt;br /&gt;
To generate an SSH public/private key pair, run&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen&lt;br /&gt;
&lt;br /&gt;
on '''your client machine''', i.e. not the Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Then copy the newly generated SSH public key over to the Quartz64 Model B with&lt;br /&gt;
&lt;br /&gt;
 ssh-copy-id &amp;lt;var&amp;gt;youruser&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Try logging in with ssh now. It should prompt you for your key's password, rather than the user account's password.&lt;br /&gt;
&lt;br /&gt;
If it works, you should then finally disable password authentication by editing ''/etc/ssh/sshd_config'' as the superuser and setting:&lt;br /&gt;
&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
&lt;br /&gt;
Then, restart the ''sshd.service'' with &amp;lt;code&amp;gt;sudo systemctl restart sshd.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that from this point on, if you want to log in from a different machine, you'll need to either copy your public/private keypair over or generate a new one there and edit ''~/.ssh/authorized_keys'' manually, or run &amp;lt;code&amp;gt;ssh-copy-id&amp;lt;/code&amp;gt; with the &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; argument pointing to that public key.&lt;br /&gt;
&lt;br /&gt;
=== On Minecraft Server Modifications And Plugins ===&lt;br /&gt;
&lt;br /&gt;
Please note that Minecraft server modifications or plugins run with the same access as your Minecraft server. While we tried our best in this guide to restrict the Minecraft server's access to the rest of the system, it can obviously still do bad things to our Minecraft world, our computational resources and our network. That's why, whenever you install a server-side modification or plugin, you should ask yourself these questions:&lt;br /&gt;
&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to not be malicious?&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to have the latest version uploaded by the mod/plugin's author rather than an untrustworthy third party?&lt;br /&gt;
# Do you trust the mod/plugin author to not be malicious?&lt;br /&gt;
# Do you trust the mod/plugin author to have good security practices, as to not get their account compromised or development computer infected with malware?&lt;br /&gt;
# Do you trust the mod/plugin to not open up security vulnerabilities in your server?&lt;br /&gt;
&lt;br /&gt;
Chances are the answers to some of these questions will be &amp;quot;no&amp;quot;. In that case you have some leg work to do: research the site and users, double-check you're on the right domain, read the code for anything fishy, and if you're ever unsure, ask for a second opinion from somebody knowledgeable on the topics.&lt;br /&gt;
&lt;br /&gt;
This is not unwarranted paranoia: Minecraft server modifications [https://github.com/dogboy21/serializationisbad have introduced security vulnerabilities before]. Well trusted people's accounts [https://github.com/fractureiser-investigation/fractureiser have been hijacked before, or their uploads unknowingly infected with malware]. And the way this happened? They themselves were downloading modifications from malicious users.&lt;br /&gt;
&lt;br /&gt;
Please do note that all these issues generally do not apply to Minecraft Data Packs. While they are more limited than modifications or plugins that hook into the actual code, these limitations are good in the context of security.&lt;br /&gt;
&lt;br /&gt;
=== Do Not Engage In Security By Obscurity ===&lt;br /&gt;
&lt;br /&gt;
You may be tempted to not enable a whitelist because you think nobody is going to find your Minecraft server anyway. This is false. People and bots are constantly scanning the entire internet for open services. This includes Minecraft servers. If you do not have a whitelist, you will sooner or later get uninvited visitors.&lt;br /&gt;
&lt;br /&gt;
Similarly, if you expose any service other than the Minecraft server to the internet through your router, expect that to be instantly discovered as well. Automated exploit scanners will then likely be hitting it regularly.&lt;br /&gt;
&lt;br /&gt;
This sounds scary, but it's really not: if your system is up-to-date and follows best security practices, you generally won't have much to fear. It just means that you can't expose any insecurely configured service to the internet and expect nobody to find it.&lt;br /&gt;
&lt;br /&gt;
=== Can't Be Bothered To Maintain It? Turn It Off ===&lt;br /&gt;
&lt;br /&gt;
One of the biggest possible dangers to your home network's security is unwillingness to take responsibility. If you no longer want to maintain the server, turn the board off, unplug it, and delete the port forwarding rule in your router's web interface.&lt;br /&gt;
&lt;br /&gt;
The majority of security breaches don't happen because somebody tries very hard to breach one target, but because a lot of people try very little to breach many targets. Chances are they will find a system somewhere that nobody feels responsible for anymore, and which hasn't been updated in 5 years, and runs a service of a version with a known vulnerability. Avoid being that system: if your Quartz64 Model B begins operating as part of a botnet due to your indifference, the rest of the internet will suffer.&lt;br /&gt;
&lt;br /&gt;
=== Why Reboots Are Sometimes Recommended ===&lt;br /&gt;
&lt;br /&gt;
Occasionally, your Linux kernel package (''linux-image-arm64'') will update. This is great! The kernel is the most basic part of the operating system, and responsible for enforcing fundamental privilege separation. Unfortunately, live-patching the running kernel (i.e. updating it in memory without requiring a reboot) is something that only enterprise-grade commercial Linux distributions like RedHat Enterprise Linux or SUSE Linux do. Since we're running Debian here and Debian doesn't have this feature, the only way to run the newly updated kernel is to reboot the system.&lt;br /&gt;
&lt;br /&gt;
You can run &amp;lt;code&amp;gt;cat /var/run/reboot-required&amp;lt;/code&amp;gt; to see if your Quartz64 Model B requires a reboot. It's worth noting that the Linux kernel development community does not distinguish regular bugs from security bugs, as many a &amp;quot;regular&amp;quot; bug could be a security bug in the right circumstances. However, Debian itself [https://www.debian.org/security/#DSAS publishes security advisories] when a Linux kernel update they ship fixes known potential security issues.&lt;br /&gt;
&lt;br /&gt;
Whether or not you want to reboot for a specific kernel update is up to you. People run servers with hundreds of days of uptime (check with the command &amp;lt;code&amp;gt;uptime&amp;lt;/code&amp;gt;) just fine; just because a potential security issue was fixed in the Linux kernel doesn't mean it'd be part of a realistic attack scenario on a specific system. In our case, the attack scenario we're most worried about is that somebody manages to breach the PaperMC Minecraft server, and then gains arbitrary code execution in its context, from which they will then likely attempt to attack the kernel to gain additional privileges. A second, much less likely attack scenario is that the Linux kernel would have a vulnerability in its network stack that would allow an attacker to remotely exploit it. Such vulnerabilities are exceedingly rare in Linux.&lt;br /&gt;
&lt;br /&gt;
=== Why Not Docker: On Software Supply Chains And Understanding Your Stack ===&lt;br /&gt;
&lt;br /&gt;
For the majority of this guide, self-declared DevOps EpicPoggers Awesomeninjas have probably been foaming at their mouth jumping at the opportunity to exclaim that one should just use Docker. This section serves as a soapbox to talk about the problems with that suggestion.&lt;br /&gt;
&lt;br /&gt;
While a Docker container may be, well, contained, it pulls in an entire stacking doll of other images it is built upon. This means an entire operating system to support the application being run, minus a kernel.&lt;br /&gt;
&lt;br /&gt;
This is great if you are the person writing the image manifests, know what your dependency requirements are, and track the entire software supply chain to ensure you always get the right versions for your stack, with all the latest vulnerabilities patched.&lt;br /&gt;
&lt;br /&gt;
However, this is not how the vast majority of people use Docker. The overwhelming majority of Docker users simply pull some random person's image, run it, and thus make these assumptions:&lt;br /&gt;
&lt;br /&gt;
# That the author of the image is not malicious. Malicious images [https://sysdig.com/blog/analysis-of-supply-chain-attacks-through-public-docker-images/ are widespread on Docker Hub].&lt;br /&gt;
# That the author of the image has good security practices in order to avoid publishing malicious images. We know account compromises will happen as Docker Hub seemingly does not require Two-Factor Authentication.&lt;br /&gt;
# That the author will update the images when critical security fixes in any of the things they depend on are fixed. A [https://dl.acm.org/doi/10.1145/3029806.3029832 2017 research paper] found that many images are hundreds of days old.&lt;br /&gt;
# That any of the things that image depends on, recursively, will also meet these three points.&lt;br /&gt;
&lt;br /&gt;
For a single service/single node scenario, Docker complicates the software supply chain massively. Instead of getting most of our system from a source we already trust (Debian), we're now getting a whole second system from a myriad of sources opaquely compiled into one image.&lt;br /&gt;
&lt;br /&gt;
Additionally, Docker complicates the following things:&lt;br /&gt;
&lt;br /&gt;
* Knowing what version a specific runtime dependency is, and that all copies of this dependency on the entire system are patched against the latest vulnerability.&lt;br /&gt;
* Updating the container image and spinning up a new container based on it; this is not handled through your system's package manager.&lt;br /&gt;
* Persistent data; it's stored in Docker volumes, which may or may not be attached to containers, and you need to actively try to have them stored somewhere other than the default location.&lt;br /&gt;
* Service management; Docker reinvents service management in its own, arguably worse way.&lt;br /&gt;
* Networking; things are on a virtual network with Docker, which complicates firewall rules and other network configurations.&lt;br /&gt;
* Logging; Docker reinvents this too.&lt;br /&gt;
&lt;br /&gt;
By not using a Docker container, but rather a locked down systemd service, we get the following benefits:&lt;br /&gt;
&lt;br /&gt;
* All system software updates, including the Java Runtime, are handled by Debian, irrespective of the version of the Minecraft server we run.&lt;br /&gt;
* All of our services use the same system dependencies, and we can answer the question of &amp;quot;has &amp;lt;var&amp;gt;xyz&amp;lt;/var&amp;gt; been patched?&amp;quot; by just looking at &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We still get reasonably strong process isolation thanks to the various security sandboxing options our systemd service uses, despite not using Linux namespaces (containers).&lt;br /&gt;
* Our persistent data is where we expect it to be, owned by the user and group we expect it to be owned by.&lt;br /&gt;
* Our network is not burdened with virtual interfaces and forwarding rules.&lt;br /&gt;
* Our Minecraft server is tracked and dependency ordered by systemd's service management. It's automatically started on boot, and gracefully stopped on shutdown.&lt;br /&gt;
* Our Minecraft server's logs will show up in the system journal, and we can filter through them or correlate them with other sources just as with any other service reporting to the journal.&lt;br /&gt;
&lt;br /&gt;
Container images built from manifests start to make sense when you are running complex sets of services scaled horizontally across a massive homogeneous cluster, where you want to rescale as needed and deploy new versions of your entire stack as immutable images that you can roll back easily. They also make some amount of sense in a case where you only have access to a very old userland (e.g. a stable enterprise Linux release) but need to run software requiring a myriad of dependencies that are either not packaged or not of a recent enough version in your distribution.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20748</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20748"/>
		<updated>2023-09-15T15:50:30Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
{{hint|'''For prospective editors:''' This guide was authored by [[User:CounterPillow]]. Please read the lengthy comment at the top of the article in the edit window before trying to contribute to it in any way.}}&lt;br /&gt;
&amp;lt;!--FOR EDITORS PLEASE READ AND RESPECT&lt;br /&gt;
This guide makes a lot of deliberately chosen recommendations, and generally does not suggest &amp;quot;alternatives&amp;quot; at every step. This is on purpose. The author weighed the options against each other, and chose one they felt was the best fit for the situation to streamline the guide, or of the best educational value. This helps avoid needlessly bloating an already lengthy guide, and reduces potential for user confusion or decision paralysis. For this reason, the guide will remain in CounterPillow's user namespace.&lt;br /&gt;
&lt;br /&gt;
Please respect that this is the work of an individual and you should not tamper with their author voice. In particular:&lt;br /&gt;
- Do not suggest alternative ways of doing a thing, e.g. alternative disk formatting tools, alternative OS images, alternative firewall management systems, the blight upon humanity that is Docker, and so on.&lt;br /&gt;
- Do not alter the recommendations made, especially not in the Security Advice and Maintaining Your Server sections.&lt;br /&gt;
- Do not reorder sections or steps, the order they're done in is usually deliberately chosen to introduce new concepts as few at a time as possible.&lt;br /&gt;
What you may do is contribute fixes such as typo/grammar fixes, or illustrative diagrams for explained concepts or hardware configurations. If you think you have something to contribute beyond that, please discuss it with CounterPillow first.&lt;br /&gt;
&lt;br /&gt;
TL;DR: Don't shit up my guide. I put a lot of time into it, and it's opinionated for a reason.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
=== Permissions ===&lt;br /&gt;
&lt;br /&gt;
On Unix-like systems like Linux, files and directories are owned by one user and one group. Additionally, there are read/write/execute permissions applying for each file or directory for either the user, the group or everyone else.&lt;br /&gt;
&lt;br /&gt;
We can view these permissions with &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; in the first column. You'll see something like:&lt;br /&gt;
&lt;br /&gt;
 -rwxrw-r--&lt;br /&gt;
&lt;br /&gt;
This would indicate a file (&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; not being present as the first letter, instead being &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;) that is&lt;br /&gt;
&lt;br /&gt;
* '''r'''eadable by the user that owns it, '''w'''ritable by the user that owns it, e'''x'''ecutable by the user that owns it&lt;br /&gt;
* readable by anyone in the group that owns it, writable by anyone in the group that owns it, '''not''' executable by anyone in the group that owns it (unless, in this case, that specific user owns it)&lt;br /&gt;
* readable by everyone else, but neither writable nor executable by them.&lt;br /&gt;
&lt;br /&gt;
You can ignore the next column (the number) in the output. The two columns that come after that are the user and the group that own the file/directory respectively.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' &amp;quot;Executable&amp;quot; on a directory doesn't quite do what one might think it does: it means one is able to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into the directory and read what files/directories it contains.}}&lt;br /&gt;
&lt;br /&gt;
We can change the owner of a file with the &amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 sudo chown &amp;lt;var&amp;gt;newuser&amp;lt;/var&amp;gt;:&amp;lt;var&amp;gt;newgroup&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would change the user that owns &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to &amp;lt;var&amp;gt;newuser&amp;lt;/var&amp;gt;, and the group that owns the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to &amp;lt;var&amp;gt;newgroup&amp;lt;/var&amp;gt;. By adding the &amp;lt;code&amp;gt;-R&amp;lt;/code&amp;gt; argument, we can also make this operation apply recursively to every file and directory contained within a targeted directory.&lt;br /&gt;
&lt;br /&gt;
Similarly, we can modify the permission flags for the '''u'''ser, '''g'''roup and '''o'''ther users with the &amp;lt;code&amp;gt;chmod&amp;lt;/code&amp;gt; command. This is best illustrated with a few examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod o+w &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: give everybody write permissions to &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod g=rw &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: set group permissions to read and write &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, but remove the group execute flag if present.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod u-x &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: remove execute permissions for the user that owns &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, but leave read/write flags as-is.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod ug=rw &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: set user and group permissions for &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to read/write but not execute.&lt;br /&gt;
&lt;br /&gt;
You can once again combine this with the &amp;lt;code&amp;gt;-R&amp;lt;/code&amp;gt; argument to make the operation recursive.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Hint:''' Only the superuser can change the permissions of files or directories not owned by them.}}&lt;br /&gt;
{{hint|'''Further Explanation:''' Consult &amp;lt;code&amp;gt;man chown&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;man chmod&amp;lt;/code&amp;gt; for further details. You can close the manual reader by pressing '''q'''.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Network ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Fixed LAN IP Address ===&lt;br /&gt;
&lt;br /&gt;
By default, the Plebian images use NetworkManager to automatically configure the ethernet interface in such a way that it asks your router to assign it an IP address inside your local network with a protocol called DHCP. What happens is that the Quartz64 asks the router for an IP address, and the router hands it one from a pool of addresses for a limited span of time, a so-called &amp;quot;lease&amp;quot;. Dynamically configuring the IP address like this is great for quickly getting started, especially when in combination with mDNS, as everything just works automatically out of the box.&lt;br /&gt;
&lt;br /&gt;
However, a bit later on in this guide, we'll want the router to know exactly what IP address our Quartz64 Model B is going to respond to even across power cycles of either device. That's why at this point, we'll set it up to have a fixed local network address, with '''one''' of two methods.&lt;br /&gt;
&lt;br /&gt;
==== Method A: Using Reserved DHCP Leases ====&lt;br /&gt;
&lt;br /&gt;
With this method, we'll simply configure your router to always hand the same IP address out over DHCP for the hardware address (MAC) of your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Many routers will have a web interface through which you can configure them. To find your router's IP address, type &amp;lt;code&amp;gt;ip route&amp;lt;/code&amp;gt; into your SSH session with the Quartz64 Model B and hit enter to run the command. It should output something like:&lt;br /&gt;
&lt;br /&gt;
 default via 192.168.0.1 dev end0 proto dhcp src 192.168.0.58 metric 100&lt;br /&gt;
 192.168.0.0/24 dev end0 proto kernel scope link src 192.168.0.58 metric 100&lt;br /&gt;
&lt;br /&gt;
In this case, we can see that our router is &amp;lt;code&amp;gt;192.168.0.1&amp;lt;/code&amp;gt;, as the ''default via'' route goes through it. Yours may be different.&lt;br /&gt;
&lt;br /&gt;
You can now type this router IP address into your web browser, and with any luck, you'll be greeted with a web login prompt. If you've never set a password on your router's management interface, check the bottom or sides of your device for a sticker that lists a default password.&lt;br /&gt;
&lt;br /&gt;
The precise management interface differs from router to router, so this guide can't give precise instructions. However, once logged in, there is usually a section labelled &amp;quot;DHCP&amp;quot;. In it, you may be able to configure reserved IP addresses for a specific MAC address. To find the MAC address of your Quartz64 Model B, run &amp;quot;ip link&amp;quot; on it, which will give you output like this:&lt;br /&gt;
&lt;br /&gt;
 1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
 2: end0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/ether 76:36:c7:c4:57:e2 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&lt;br /&gt;
What we want here is the first colon separated address in the second link (end0), in this case &amp;lt;code&amp;gt;76:36:c7:c4:57:e2&amp;lt;/code&amp;gt;. Your router should let you enter this MAC address somewhere to reserve a specific address from the DHCP pool for it.&lt;br /&gt;
&lt;br /&gt;
==== Method B: Using A Fixed IP ====&lt;br /&gt;
&lt;br /&gt;
If Method A isn't available to you, this method should always work.&lt;br /&gt;
&lt;br /&gt;
Instead of using DHCP to request a lease for an IP address, our Quartz64 Model B can also simply assume it can communicate using a fixed IP address.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' Our fixed IP address should be ''outside'' the range of IP addresses our router hands out through DHCP, as otherwise collisions may occur! In the router web interface, look for a DHCP start address field and DHCP pool size field. An IP address either smaller than the start address (though above 0 and not colliding with the router's address) or larger than the start address plus the pool size (though below 255) will work; you may have to reduce the size of the DHCP pool if it's all maxed out though.&lt;br /&gt;
&lt;br /&gt;
For example, with a DHCP pool that starts at 192.168.0.40 and has a size of 215, we could use a fixed IP address like 192.168.0.10 without accidentally colliding with one the router hands out.&lt;br /&gt;
&lt;br /&gt;
Run the command&lt;br /&gt;
&lt;br /&gt;
 sudo nmtui&lt;br /&gt;
&lt;br /&gt;
which should open up an interactive connection editor. Use your cursor keys to highlight the entry &amp;quot;Wired connection 1&amp;quot;, and hit the right arrow key to navigate towards the &amp;quot;Edit&amp;quot; option, and hit enter.&lt;br /&gt;
&lt;br /&gt;
Navigate to &amp;quot;IPv4 CONFIGURATION&amp;quot; and hit enter on &amp;quot;&amp;amp;lt;Automatic&amp;amp;gt;&amp;quot;, then select &amp;quot;&amp;amp;lt;Manual&amp;amp;gt;&amp;quot;. Navigate to the right over the &amp;quot;&amp;amp;lt;Show&amp;amp;gt;&amp;quot;, and hit enter again. You should now be greeted by a whole host of options:&lt;br /&gt;
&lt;br /&gt;
# In &amp;quot;Addresses:&amp;quot;, hit &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and enter your chosen fixed IPv4 address followed by &amp;lt;code&amp;gt;/32&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;192.168.0.21/32&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In &amp;quot;Gateway&amp;quot;, enter your router's IPv4 address.&lt;br /&gt;
# In DNS Servers, enter on &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and add &amp;lt;code&amp;gt;1.1.1.1&amp;lt;/code&amp;gt;. Repeat the same process, but with &amp;lt;code&amp;gt;1.0.0.1&amp;lt;/code&amp;gt;. This will add Cloudflare's DNS servers, as we'll no longer be receiving the router's DNS servers with manual configuration.&lt;br /&gt;
# Check the box next to &amp;quot;Ignore automatically obtained DNS parameters&amp;quot; by navigating over it and hitting the space bar. This makes sure that if our router tries to give us some DNS servers anyway, we don't use them.&lt;br /&gt;
# Check &amp;quot;Require IPv4 addressing for this connection&amp;quot; in the same way.&lt;br /&gt;
# Just to be consistent, go to &amp;quot;IPv6 CONFIGURATION&amp;quot;, but this time leave it on Automatic. Hit &amp;quot;&amp;amp;lt;Show...&amp;amp;gt;&amp;quot; to expand it.&lt;br /&gt;
# Add the following two Cloudflare DNS servers: &amp;lt;code&amp;gt;2606:4700:4700::1111&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;2606:4700:4700::1001&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check &amp;quot;Ignore automatically obtained DNS parameters&amp;quot;.&lt;br /&gt;
# Navigate down to &amp;quot;&amp;amp;lt;OK&amp;amp;gt;&amp;quot; and hit enter&lt;br /&gt;
# Hit escape twice to quit nmtui&lt;br /&gt;
&lt;br /&gt;
The easiest way to make sure your new network connection settings are used is to reboot your board with&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
After logging back in, the command&lt;br /&gt;
&lt;br /&gt;
 ip addr&lt;br /&gt;
&lt;br /&gt;
should show your chosen IP under end0 after &amp;quot;inet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Firewall ===&lt;br /&gt;
&lt;br /&gt;
Even in a home network that is behind a router's NAT (more on that later), it's good practice to have your individual devices protected by firewalls as well. A firewall can work in many ways, but the simplest and most common method of operation is that it drops all incoming connection attempts originating from globally routed IPs and only allows those on network ports the administrator has explicitly allowed. This prevents locally running services that accidentally listen to incoming connections from all IPs from being accessible to any surprise guests.&lt;br /&gt;
&lt;br /&gt;
While the Linux kernel includes all the logic to filter network packets, we still need an application to set up and manage these filter rules persistently. There are a multitude of such applications that can do this by building their own concept on top of Linux's packet filtering infrastructure, but the one we will be using in this guide is firewalld. firewalld is the default service for managing firewall rules in RedHat Enterprise Linux, Fedora and openSUSE, and is also available to be used on many other Linux distributions, such as Debian (the one we're using).&lt;br /&gt;
&lt;br /&gt;
firewalld has a concept of &amp;quot;zones&amp;quot;, which are logical constructs that either allow certain services through or not, can either be applied to specific interfaces or source IPs, and can pass network traffic between each other with policies. In our case, NetworkManager has assigned the ''end0'' interface the pre-defined ''public'' zone already. Our plan here is to use the pre-defined ''home'' zone for any traffic originating from Local Area Network IP addresses, and let ''public'' handle all the rest.&lt;br /&gt;
&lt;br /&gt;
We first need to install firewalld through Debian's package manager, apt. The first command refreshes our index of packages, the second installs firewalld:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install firewalld&lt;br /&gt;
&lt;br /&gt;
{{note|'''Warning:''' Debian automatically starts firewalld and configures it to auto-start on boot. It happens to be configured in a way that breaks our mDNS (.local domain) resolution. After installing firewalld, immediately work through the next few steps without closing your SSH session as you'll otherwise have to type the board's IP address manually to get back in.}}&lt;br /&gt;
&lt;br /&gt;
We should now tell firewalld about what IP prefixes we consider to be our local network:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --new-ipset=lanv4 --type=hash:net&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv4 --add-entry=10.0.0.0/8&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv4 --add-entry=172.16.0.0/12&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv4 --add-entry=192.168.0.0/16&lt;br /&gt;
 sudo firewall-cmd --permanent --new-ipset=lanv6 --option=family=inet6 --type=hash:net&lt;br /&gt;
 sudo firewall-cmd --permanent --ipset=lanv6 --add-entry=fe80::/64&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' We've used [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation CIDR notation] here to denote entire ranges of IP addresses. These specific ranges are specified by the IETF and IANA to be used for private networks, such as our local area network (LAN).}}&lt;br /&gt;
&lt;br /&gt;
Now that we have a ''lanv4'' and ''lanv6'' ipset, we can tell firewalld that any traffic originating from these IPs should be considered part of our ''home'' zone:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=home --add-source=ipset:lanv4&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=home --add-source=ipset:lanv6&lt;br /&gt;
&lt;br /&gt;
We should now reload those new permanent settings, so that our mDNS announcements work again:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
Next, we'll want to remove the ''ssh'' service from the ''public'' zone, as Debian added it there by default:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=public --remove-service=ssh&lt;br /&gt;
 sudo firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
Finally, we want to add a service definition for Minecraft, which uses port 25565 with the TCP protocol, and allow it for our ''home'' and ''public'' zone:&lt;br /&gt;
&lt;br /&gt;
 sudo firewall-cmd --permanent --new-service=minecraft&lt;br /&gt;
 sudo firewall-cmd --permanent --service=minecraft --add-port=25565/tcp&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=home --add-service=minecraft&lt;br /&gt;
 sudo firewall-cmd --permanent --zone=public --add-service=minecraft&lt;br /&gt;
 sudo firewall-cmd --reload&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' You can find a (somewhat lacking) documentation for firewalld on [https://firewalld.org/documentation/ the official firewalld website]. A better resource is, as always, &amp;lt;code&amp;gt;man firewall-cmd&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
== Formatting The NVMe Drive ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to wipefs + fdisk + format the NVMe drive, make a mount point and put it in fstab.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Minecraft Java Edition Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Add a minecraft system user with a minecraft group that has write permissions to the minecraft directory on NVMe, add minecraft to supplemental groups for user.&lt;br /&gt;
# Install Java, download PaperMC to the Minecraft directory, symlink it to paper.jar, run it once, accept the EULA.&lt;br /&gt;
# Edit server.properties, enable rcon with a password, enable whitelist, edit motd and set difficulty.&lt;br /&gt;
# Add the systemd unit to /etc/systemd/system/, set it to auto-start, then start it.&lt;br /&gt;
# Add player to whitelist and ops through rcon.&lt;br /&gt;
# Connect to the server for the first time!}}&lt;br /&gt;
&lt;br /&gt;
=== Getting An RCon Client ===&lt;br /&gt;
&lt;br /&gt;
Minecraft's server has a control protocol called &amp;quot;rcon&amp;quot;. We'll need this protocol to gracefully shut down the Minecraft server, and add ourselves to ops later on. For this, we'll need a Minecraft RCon client. [https://github.com/Tiiffi/mcrcon Tiiffi/mcrcon] is a good one, but we need to compile and install it first.&lt;br /&gt;
&lt;br /&gt;
To start off, let's install some required tools to compile it. In your Quartz64 Model B's SSH session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install build-essential&lt;br /&gt;
&lt;br /&gt;
Next we'll download the source code for mcrcon:&lt;br /&gt;
&lt;br /&gt;
 wget --content-disposition https://github.com/Tiiffi/mcrcon/archive/refs/tags/v0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should have downloaded us an ''mcrcon-0.7.2.tar.gz'' archive file. Let's verify that what we've downloaded matches what this guide expects:&lt;br /&gt;
&lt;br /&gt;
 sha256sum mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should output the following; compare the first string of letter and numbers to yours, they must match:&lt;br /&gt;
&lt;br /&gt;
 1743b25a2d031b774e805f4011cb7d92010cb866e3b892f5dfc5b42080973270  mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
Now let's unpack the ''.tar.gz'' archive and change into the directory it contains:&lt;br /&gt;
&lt;br /&gt;
 tar -xf mcrcon-0.7.2.tar.gz&lt;br /&gt;
 cd mcrcon-0.7.2/&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; is the standard utility for creating, modifying, inspecting and unpacking tar archives, commonly referred to as &amp;quot;tarballs&amp;quot;. The &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; argument states that we want to e'''x'''tract, and the &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; argument specifies that the next argument is the filename of the tarball we wish to operate on. &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; will automatically infer the compression of the tarball, in this case gzip, and decompress it as it is unpacking.}}&lt;br /&gt;
&lt;br /&gt;
In this directory (check with &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;!) there should be some files, including a ''Makefile''. This allows us to now compile the source code and install the resulting binary:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' A Makefile instructs the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; command on how to build a project that uses it. In this case, it also contains a ''install'' target, which copies the resulting binary into ''/usr/local/bin'' and its manual page into the local prefix for manual pages. Since only the superuser can write to these directories, we need to run the install target with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
If everything went well, we should now have the &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt; command available, as well as its manual page with &amp;lt;code&amp;gt;man mcrcon&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''For The Future:''' If you ever need to recompile &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt;, for example, after a major version distribution upgrade years down the line that gets rid of ''libc.so.6'', you can run:&lt;br /&gt;
&lt;br /&gt;
 sudo make uninstall&lt;br /&gt;
 make clean&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Making The Server Accessible From Outside Your Home Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain what a dynamic IP is, set up ddclient with DuckDNS, have a systemd timer for that.&lt;br /&gt;
# Explain what port forwarding is, why it's needed, and why this depends on your router. Warn not to forward port 22/tcp, only port 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Maintaining Your Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain how to start, stop, restart the Minecraft server with systemctl.&lt;br /&gt;
# Explain how to access server logs with journalctl.&lt;br /&gt;
# Explain how to keep PaperMC updated (including changing the symlink).&lt;br /&gt;
# Explain apt update and apt upgrade. Recommend unattended-upgrades.&lt;br /&gt;
# Explain Debian major releases and to keep an eye out for them.&lt;br /&gt;
# Recommend htop to see how CPU and RAM usage is looking.&lt;br /&gt;
# Recommend some backup solutions; rsync to flash drive, short mention of borg/borgmatic over the network.&lt;br /&gt;
# Explain how to transfer files to/from server: sftp, rsync, winscp, etc.}}&lt;br /&gt;
&lt;br /&gt;
== Security Advice ==&lt;br /&gt;
&lt;br /&gt;
This section will give some general security advice on running your own server, and elaborates on some decisions this guide makes.&lt;br /&gt;
&lt;br /&gt;
=== SSH Public Key Authentication ===&lt;br /&gt;
&lt;br /&gt;
If you absolutely insist on opening up the SSH port to the public internet, you should use public key authentication and disable password authentication for SSH altogether.&lt;br /&gt;
&lt;br /&gt;
This way, public key cryptography is used to authenticate, which is computationally extremely hard to break in this case. The password you encrypt your private key with never travels over the network.&lt;br /&gt;
&lt;br /&gt;
To generate an SSH public/private key pair, run&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen&lt;br /&gt;
&lt;br /&gt;
on '''your client machine''', i.e. not the Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Then copy the newly generated SSH public key over to the Quartz64 Model B with&lt;br /&gt;
&lt;br /&gt;
 ssh-copy-id &amp;lt;var&amp;gt;youruser&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Try logging in with ssh now. It should prompt you for your key's password, rather than the user account's password.&lt;br /&gt;
&lt;br /&gt;
If it works, you should then finally disable password authentication by editing ''/etc/ssh/sshd_config'' as the superuser and setting:&lt;br /&gt;
&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
&lt;br /&gt;
Then, restart the ''sshd.service'' with &amp;lt;code&amp;gt;sudo systemctl restart sshd.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that from this point on, if you want to log in from a different machine, you'll need to either copy your public/private keypair over or generate a new one there and edit ''~/.ssh/authorized_keys'' manually, or run &amp;lt;code&amp;gt;ssh-copy-id&amp;lt;/code&amp;gt; with the &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; argument pointing to that public key.&lt;br /&gt;
&lt;br /&gt;
=== On Minecraft Server Modifications And Plugins ===&lt;br /&gt;
&lt;br /&gt;
Please note that Minecraft server modifications or plugins run with the same access as your Minecraft server. While we tried our best in this guide to restrict the Minecraft server's access to the rest of the system, it can obviously still do bad things to our Minecraft world, our computational resources and our network. That's why, whenever you install a server-side modification or plugin, you should ask yourself these questions:&lt;br /&gt;
&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to not be malicious?&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to have the latest version uploaded by the mod/plugin's author rather than an untrustworthy third party?&lt;br /&gt;
# Do you trust the mod/plugin author to not be malicious?&lt;br /&gt;
# Do you trust the mod/plugin author to have good security practices, as to not get their account compromised or development computer infected with malware?&lt;br /&gt;
# Do you trust the mod/plugin to not open up security vulnerabilities in your server?&lt;br /&gt;
&lt;br /&gt;
Chances are the answers to some of these questions will be &amp;quot;no&amp;quot;. In that case you have some leg work to do: research the site and users, double-check you're on the right domain, read the code for anything fishy, and if you're ever unsure, ask for a second opinion from somebody knowledgeable on the topics.&lt;br /&gt;
&lt;br /&gt;
This is not unwarranted paranoia: Minecraft server modifications [https://github.com/dogboy21/serializationisbad have introduced security vulnerabilities before]. Well trusted people's accounts [https://github.com/fractureiser-investigation/fractureiser have been hijacked before, or their uploads unknowingly infected with malware]. And the way this happened? They themselves were downloading modifications from malicious users.&lt;br /&gt;
&lt;br /&gt;
Please do note that all these issues generally do not apply to Minecraft Data Packs. While they are more limited than modifications or plugins that hook into the actual code, these limitations are good in the context of security.&lt;br /&gt;
&lt;br /&gt;
=== Do Not Engage In Security By Obscurity ===&lt;br /&gt;
&lt;br /&gt;
You may be tempted to not enable a whitelist because you think nobody is going to find your Minecraft server anyway. This is false. People and bots are constantly scanning the entire internet for open services. This includes Minecraft servers. If you do not have a whitelist, you will sooner or later get uninvited visitors.&lt;br /&gt;
&lt;br /&gt;
Similarly, if you expose any service other than the Minecraft server to the internet through your router, expect that to be instantly discovered as well. Automated exploit scanners will then likely be hitting it regularly.&lt;br /&gt;
&lt;br /&gt;
This sounds scary, but it's really not: if your system is up-to-date and follows best security practices, you generally won't have much to fear. It just means that you can't expose any insecurely configured service to the internet and expect nobody to find it.&lt;br /&gt;
&lt;br /&gt;
=== Can't Be Bothered To Maintain It? Turn It Off ===&lt;br /&gt;
&lt;br /&gt;
One of the biggest possible dangers to your home network's security is unwillingness to take responsibility. If you no longer want to maintain the server, turn the board off, unplug it, and delete the port forwarding rule in your router's web interface.&lt;br /&gt;
&lt;br /&gt;
The majority of security breaches don't happen because somebody tries very hard to breach one target, but because a lot of people try very little to breach many targets. Chances are they will find a system somewhere that nobody feels responsible for anymore, and which hasn't been updated in 5 years, and runs a service of a version with a known vulnerability. Avoid being that system: if your Quartz64 Model B begins operating as part of a botnet due to your indifference, the rest of the internet will suffer.&lt;br /&gt;
&lt;br /&gt;
=== Why Reboots Are Sometimes Recommended ===&lt;br /&gt;
&lt;br /&gt;
Occasionally, your Linux kernel package (''linux-image-arm64'') will update. This is great! The kernel is the most basic part of the operating system, and responsible for enforcing fundamental privilege separation. Unfortunately, live-patching the running kernel (i.e. updating it in memory without requiring a reboot) is something that only enterprise-grade commercial Linux distributions like RedHat Enterprise Linux or SUSE Linux do. Since we're running Debian here and Debian doesn't have this feature, the only way to run the newly updated kernel is to reboot the system.&lt;br /&gt;
&lt;br /&gt;
You can run &amp;lt;code&amp;gt;cat /var/run/reboot-required&amp;lt;/code&amp;gt; to see if your Quartz64 Model B requires a reboot. It's worth noting that the Linux kernel development community does not distinguish regular bugs from security bugs, as many a &amp;quot;regular&amp;quot; bug could be a security bug in the right circumstances. However, Debian itself [https://www.debian.org/security/#DSAS publishes security advisories] when a Linux kernel update they ship fixes known potential security issues.&lt;br /&gt;
&lt;br /&gt;
Whether or not you want to reboot for a specific kernel update is up to you. People run servers with hundreds of days of uptime (check with the command &amp;lt;code&amp;gt;uptime&amp;lt;/code&amp;gt;) just fine; just because a potential security issue was fixed in the Linux kernel doesn't mean it'd be part of a realistic attack scenario on a specific system. In our case, the attack scenario we're most worried about is that somebody manages to breach the PaperMC Minecraft server, and then gains arbitrary code execution in its context, from which they will then likely attempt to attack the kernel to gain additional privileges. A second, much less likely attack scenario is that the Linux kernel would have a vulnerability in its network stack that would allow an attacker to remotely exploit it. Such vulnerabilities are exceedingly rare in Linux.&lt;br /&gt;
&lt;br /&gt;
=== Why Not Docker: On Software Supply Chains And Understanding Your Stack ===&lt;br /&gt;
&lt;br /&gt;
For the majority of this guide, self-declared DevOps EpicPoggers Awesomeninjas have probably been foaming at their mouth jumping at the opportunity to exclaim that one should just use Docker. This section serves as a soapbox to talk about the problems with that suggestion.&lt;br /&gt;
&lt;br /&gt;
While a Docker container may be, well, contained, it pulls in an entire stacking doll of other images it is built upon. This means an entire operating system to support the application being run, minus a kernel.&lt;br /&gt;
&lt;br /&gt;
This is great if you are the person writing the image manifests, know what your dependency requirements are, and track the entire software supply chain to ensure you always get the right versions for your stack, with all the latest vulnerabilities patched.&lt;br /&gt;
&lt;br /&gt;
However, this is not how the vast majority of people use Docker. The overwhelming majority of Docker users simply pull some random person's image, run it, and thus make these assumptions:&lt;br /&gt;
&lt;br /&gt;
# That the author of the image is not malicious. Malicious images [https://sysdig.com/blog/analysis-of-supply-chain-attacks-through-public-docker-images/ are widespread on Docker Hub].&lt;br /&gt;
# That the author of the image has good security practices in order to avoid publishing malicious images. We know account compromises will happen as Docker Hub seemingly does not require Two-Factor Authentication.&lt;br /&gt;
# That the author will update the images when critical security fixes in any of the things they depend on are fixed. A [https://dl.acm.org/doi/10.1145/3029806.3029832 2017 research paper] found that many images are hundreds of days old.&lt;br /&gt;
# That any of the things that image depends on, recursively, will also meet these three points.&lt;br /&gt;
&lt;br /&gt;
For a single service/single node scenario, Docker complicates the software supply chain massively. Instead of getting most of our system from a source we already trust (Debian), we're now getting a whole second system from a myriad of sources opaquely compiled into one image.&lt;br /&gt;
&lt;br /&gt;
Additionally, Docker complicates the following things:&lt;br /&gt;
&lt;br /&gt;
* Knowing what version a specific runtime dependency is, and that all copies of this dependency on the entire system are patched against the latest vulnerability.&lt;br /&gt;
* Updating the container image and spinning up a new container based on it; this is not handled through your system's package manager.&lt;br /&gt;
* Persistent data; it's stored in Docker volumes, which may or may not be attached to containers, and you need to actively try to have them stored somewhere other than the default location.&lt;br /&gt;
* Service management; Docker reinvents service management in its own, arguably worse way.&lt;br /&gt;
* Networking; things are on a virtual network with Docker, which complicates firewall rules and other network configurations.&lt;br /&gt;
* Logging; Docker reinvents this too.&lt;br /&gt;
&lt;br /&gt;
By not using a Docker container, but rather a locked down systemd service, we get the following benefits:&lt;br /&gt;
&lt;br /&gt;
* All system software updates, including the Java Runtime, are handled by Debian, irrespective of the version of the Minecraft server we run.&lt;br /&gt;
* All of our services use the same system dependencies, and we can answer the question of &amp;quot;has &amp;lt;var&amp;gt;xyz&amp;lt;/var&amp;gt; been patched?&amp;quot; by just looking at &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We still get reasonably strong process isolation thanks to the various security sandboxing options our systemd service uses, despite not using Linux namespaces (containers).&lt;br /&gt;
* Our persistent data is where we expect it to be, owned by the user and group we expect it to be owned by.&lt;br /&gt;
* Our network is not burdened with virtual interfaces and forwarding rules.&lt;br /&gt;
* Our Minecraft server is tracked and dependency ordered by systemd's service management. It's automatically started on boot, and gracefully stopped on shutdown.&lt;br /&gt;
* Our Minecraft server's logs will show up in the system journal, and we can filter through them or correlate them with other sources just as with any other service reporting to the journal.&lt;br /&gt;
&lt;br /&gt;
Container images built from manifests start to make sense when you are running complex sets of services scaled horizontally across a massive homogeneous cluster, where you want to rescale as needed and deploy new versions of your entire stack as immutable images that you can roll back easily. They also make some amount of sense in a case where you only have access to a very old userland (e.g. a stable enterprise Linux release) but need to run software requiring a myriad of dependencies that are either not packaged or not of a recent enough version in your distribution.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20747</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20747"/>
		<updated>2023-09-15T13:53:19Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
{{hint|'''For prospective editors:''' This guide was authored by [[User:CounterPillow]]. Please read the lengthy comment at the top of the article in the edit window before trying to contribute to it in any way.}}&lt;br /&gt;
&amp;lt;!--FOR EDITORS PLEASE READ AND RESPECT&lt;br /&gt;
This guide makes a lot of deliberately chosen recommendations, and generally does not suggest &amp;quot;alternatives&amp;quot; at every step. This is on purpose. The author weighed the options against each other, and chose one they felt was the best fit for the situation to streamline the guide, or of the best educational value. This helps avoid needlessly bloating an already lengthy guide, and reduces potential for user confusion or decision paralysis. For this reason, the guide will remain in CounterPillow's user namespace.&lt;br /&gt;
&lt;br /&gt;
Please respect that this is the work of an individual and you should not tamper with their author voice. In particular:&lt;br /&gt;
- Do not suggest alternative ways of doing a thing, e.g. alternative disk formatting tools, alternative OS images, alternative firewall management systems, the blight upon humanity that is Docker, and so on.&lt;br /&gt;
- Do not alter the recommendations made, especially not in the Security Advice and Maintaining Your Server sections.&lt;br /&gt;
- Do not reorder sections or steps, the order they're done in is usually deliberately chosen to introduce new concepts as few at a time as possible.&lt;br /&gt;
What you may do is contribute fixes such as typo/grammar fixes, or illustrative diagrams for explained concepts or hardware configurations. If you think you have something to contribute beyond that, please discuss it with CounterPillow first.&lt;br /&gt;
&lt;br /&gt;
TL;DR: Don't shit up my guide. I put a lot of time into it, and it's opinionated for a reason.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
=== Permissions ===&lt;br /&gt;
&lt;br /&gt;
On Unix-like systems like Linux, files and directories are owned by one user and one group. Additionally, there are read/write/execute permissions applying for each file or directory for either the user, the group or everyone else.&lt;br /&gt;
&lt;br /&gt;
We can view these permissions with &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; in the first column. You'll see something like:&lt;br /&gt;
&lt;br /&gt;
 -rwxrw-r--&lt;br /&gt;
&lt;br /&gt;
This would indicate a file (&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; not being present as the first letter, instead being &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;) that is&lt;br /&gt;
&lt;br /&gt;
* '''r'''eadable by the user that owns it, '''w'''ritable by the user that owns it, e'''x'''ecutable by the user that owns it&lt;br /&gt;
* readable by anyone in the group that owns it, writable by anyone in the group that owns it, '''not''' executable by anyone in the group that owns it (unless, in this case, that specific user owns it)&lt;br /&gt;
* readable by everyone else, but neither writable nor executable by them.&lt;br /&gt;
&lt;br /&gt;
You can ignore the next column (the number) in the output. The two columns that come after that are the user and the group that own the file/directory respectively.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' &amp;quot;Executable&amp;quot; on a directory doesn't quite do what one might think it does: it means one is able to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into the directory and read what files/directories it contains.}}&lt;br /&gt;
&lt;br /&gt;
We can change the owner of a file with the &amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 sudo chown &amp;lt;var&amp;gt;newuser&amp;lt;/var&amp;gt;:&amp;lt;var&amp;gt;newgroup&amp;lt;/var&amp;gt; &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would change the user that owns &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to &amp;lt;var&amp;gt;newuser&amp;lt;/var&amp;gt;, and the group that owns the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to &amp;lt;var&amp;gt;newgroup&amp;lt;/var&amp;gt;. By adding the &amp;lt;code&amp;gt;-R&amp;lt;/code&amp;gt; argument, we can also make this operation apply recursively to every file and directory contained within a targeted directory.&lt;br /&gt;
&lt;br /&gt;
Similarly, we can modify the permission flags for the '''u'''ser, '''g'''roup and '''o'''ther users with the &amp;lt;code&amp;gt;chmod&amp;lt;/code&amp;gt; command. This is best illustrated with a few examples:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod o+w &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: give everybody write permissions to &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod g=rw &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: set group permissions to read and write &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, but remove the group execute flag if present.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod u-x &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: remove execute permissions for the user that owns &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, but leave read/write flags as-is.&lt;br /&gt;
* &amp;lt;code&amp;gt;chmod ug=rw &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;: set user and group permissions for &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; to read/write but not execute.&lt;br /&gt;
&lt;br /&gt;
You can once again combine this with the &amp;lt;code&amp;gt;-R&amp;lt;/code&amp;gt; argument to make the operation recursive.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Hint:''' Only the superuser can change the permissions of files or directories not owned by them.}}&lt;br /&gt;
{{hint|'''Further Explanation:''' Consult &amp;lt;code&amp;gt;man chown&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;man chmod&amp;lt;/code&amp;gt; for further details. You can close the manual reader by pressing '''q'''.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Network ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Fixed LAN IP Address ===&lt;br /&gt;
&lt;br /&gt;
By default, the Plebian images use NetworkManager to automatically configure the ethernet interface in such a way that it asks your router to assign it an IP address inside your local network with a protocol called DHCP. What happens is that the Quartz64 asks the router for an IP address, and the router hands it one from a pool of addresses for a limited span of time, a so-called &amp;quot;lease&amp;quot;. Dynamically configuring the IP address like this is great for quickly getting started, especially when in combination with mDNS, as everything just works automatically out of the box.&lt;br /&gt;
&lt;br /&gt;
However, a bit later on in this guide, we'll want the router to know exactly what IP address our Quartz64 Model B is going to respond to even across power cycles of either device. That's why at this point, we'll set it up to have a fixed local network address, with '''one''' of two methods.&lt;br /&gt;
&lt;br /&gt;
==== Method A: Using Reserved DHCP Leases ====&lt;br /&gt;
&lt;br /&gt;
With this method, we'll simply configure your router to always hand the same IP address out over DHCP for the hardware address (MAC) of your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Many routers will have a web interface through which you can configure them. To find your router's IP address, type &amp;lt;code&amp;gt;ip route&amp;lt;/code&amp;gt; into your SSH session with the Quartz64 Model B and hit enter to run the command. It should output something like:&lt;br /&gt;
&lt;br /&gt;
 default via 192.168.0.1 dev end0 proto dhcp src 192.168.0.58 metric 100&lt;br /&gt;
 192.168.0.0/24 dev end0 proto kernel scope link src 192.168.0.58 metric 100&lt;br /&gt;
&lt;br /&gt;
In this case, we can see that our router is &amp;lt;code&amp;gt;192.168.0.1&amp;lt;/code&amp;gt;, as the ''default via'' route goes through it. Yours may be different.&lt;br /&gt;
&lt;br /&gt;
You can now type this router IP address into your web browser, and with any luck, you'll be greeted with a web login prompt. If you've never set a password on your router's management interface, check the bottom or sides of your device for a sticker that lists a default password.&lt;br /&gt;
&lt;br /&gt;
The precise management interface differs from router to router, so this guide can't give precise instructions. However, once logged in, there is usually a section labelled &amp;quot;DHCP&amp;quot;. In it, you may be able to configure reserved IP addresses for a specific MAC address. To find the MAC address of your Quartz64 Model B, run &amp;quot;ip link&amp;quot; on it, which will give you output like this:&lt;br /&gt;
&lt;br /&gt;
 1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
 2: end0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/ether 76:36:c7:c4:57:e2 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&lt;br /&gt;
What we want here is the first colon separated address in the second link (end0), in this case &amp;lt;code&amp;gt;76:36:c7:c4:57:e2&amp;lt;/code&amp;gt;. Your router should let you enter this MAC address somewhere to reserve a specific address from the DHCP pool for it.&lt;br /&gt;
&lt;br /&gt;
==== Method B: Using A Fixed IP ====&lt;br /&gt;
&lt;br /&gt;
If Method A isn't available to you, this method should always work.&lt;br /&gt;
&lt;br /&gt;
Instead of using DHCP to request a lease for an IP address, our Quartz64 Model B can also simply assume it can communicate using a fixed IP address.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' Our fixed IP address should be ''outside'' the range of IP addresses our router hands out through DHCP, as otherwise collisions may occur! In the router web interface, look for a DHCP start address field and DHCP pool size field. An IP address either smaller than the start address (though above 0 and not colliding with the router's address) or larger than the start address plus the pool size (though below 255) will work; you may have to reduce the size of the DHCP pool if it's all maxed out though.&lt;br /&gt;
&lt;br /&gt;
For example, with a DHCP pool that starts at 192.168.0.40 and has a size of 215, we could use a fixed IP address like 192.168.0.10 without accidentally colliding with one the router hands out.&lt;br /&gt;
&lt;br /&gt;
Run the command&lt;br /&gt;
&lt;br /&gt;
 sudo nmtui&lt;br /&gt;
&lt;br /&gt;
which should open up an interactive connection editor. Use your cursor keys to highlight the entry &amp;quot;Wired connection 1&amp;quot;, and hit the right arrow key to navigate towards the &amp;quot;Edit&amp;quot; option, and hit enter.&lt;br /&gt;
&lt;br /&gt;
Navigate to &amp;quot;IPv4 CONFIGURATION&amp;quot; and hit enter on &amp;quot;&amp;amp;lt;Automatic&amp;amp;gt;&amp;quot;, then select &amp;quot;&amp;amp;lt;Manual&amp;amp;gt;&amp;quot;. Navigate to the right over the &amp;quot;&amp;amp;lt;Show&amp;amp;gt;&amp;quot;, and hit enter again. You should now be greeted by a whole host of options:&lt;br /&gt;
&lt;br /&gt;
# In &amp;quot;Addresses:&amp;quot;, hit &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and enter your chosen fixed IPv4 address followed by &amp;lt;code&amp;gt;/32&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;192.168.0.21/32&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In &amp;quot;Gateway&amp;quot;, enter your router's IPv4 address.&lt;br /&gt;
# In DNS Servers, enter on &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and add &amp;lt;code&amp;gt;1.1.1.1&amp;lt;/code&amp;gt;. Repeat the same process, but with &amp;lt;code&amp;gt;1.0.0.1&amp;lt;/code&amp;gt;. This will add Cloudflare's DNS servers, as we'll no longer be receiving the router's DNS servers with manual configuration.&lt;br /&gt;
# Check the box next to &amp;quot;Ignore automatically obtained DNS parameters&amp;quot; by navigating over it and hitting the space bar. This makes sure that if our router tries to give us some DNS servers anyway, we don't use them.&lt;br /&gt;
# Check &amp;quot;Require IPv4 addressing for this connection&amp;quot; in the same way.&lt;br /&gt;
# Just to be consistent, go to &amp;quot;IPv6 CONFIGURATION&amp;quot;, but this time leave it on Automatic. Hit &amp;quot;&amp;amp;lt;Show...&amp;amp;gt;&amp;quot; to expand it.&lt;br /&gt;
# Add the following two Cloudflare DNS servers: &amp;lt;code&amp;gt;2606:4700:4700::1111&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;2606:4700:4700::1001&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check &amp;quot;Ignore automatically obtained DNS parameters&amp;quot;.&lt;br /&gt;
# Navigate down to &amp;quot;&amp;amp;lt;OK&amp;amp;gt;&amp;quot; and hit enter&lt;br /&gt;
# Hit escape twice to quit nmtui&lt;br /&gt;
&lt;br /&gt;
The easiest way to make sure your new network connection settings are used is to reboot your board with&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
After logging back in, the command&lt;br /&gt;
&lt;br /&gt;
 ip addr&lt;br /&gt;
&lt;br /&gt;
should show your chosen IP under end0 after &amp;quot;inet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Firewall ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to set up a persistent firewall that allows ports 22/tcp from LAN and 25565/tcp from anywhere.}}&lt;br /&gt;
&lt;br /&gt;
== Formatting The NVMe Drive ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to wipefs + fdisk + format the NVMe drive, make a mount point and put it in fstab.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Minecraft Java Edition Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Add a minecraft system user with a minecraft group that has write permissions to the minecraft directory on NVMe, add minecraft to supplemental groups for user.&lt;br /&gt;
# Install Java, download PaperMC to the Minecraft directory, symlink it to paper.jar, run it once, accept the EULA.&lt;br /&gt;
# Edit server.properties, enable rcon with a password, enable whitelist, edit motd and set difficulty.&lt;br /&gt;
# Add the systemd unit to /etc/systemd/system/, set it to auto-start, then start it.&lt;br /&gt;
# Add player to whitelist and ops through rcon.&lt;br /&gt;
# Connect to the server for the first time!}}&lt;br /&gt;
&lt;br /&gt;
=== Getting An RCon Client ===&lt;br /&gt;
&lt;br /&gt;
Minecraft's server has a control protocol called &amp;quot;rcon&amp;quot;. We'll need this protocol to gracefully shut down the Minecraft server, and add ourselves to ops later on. For this, we'll need a Minecraft RCon client. [https://github.com/Tiiffi/mcrcon Tiiffi/mcrcon] is a good one, but we need to compile and install it first.&lt;br /&gt;
&lt;br /&gt;
To start off, let's install some required tools to compile it. In your Quartz64 Model B's SSH session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install build-essential&lt;br /&gt;
&lt;br /&gt;
Next we'll download the source code for mcrcon:&lt;br /&gt;
&lt;br /&gt;
 wget --content-disposition https://github.com/Tiiffi/mcrcon/archive/refs/tags/v0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should have downloaded us an ''mcrcon-0.7.2.tar.gz'' archive file. Let's verify that what we've downloaded matches what this guide expects:&lt;br /&gt;
&lt;br /&gt;
 sha256sum mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should output the following; compare the first string of letter and numbers to yours, they must match:&lt;br /&gt;
&lt;br /&gt;
 1743b25a2d031b774e805f4011cb7d92010cb866e3b892f5dfc5b42080973270  mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
Now let's unpack the ''.tar.gz'' archive and change into the directory it contains:&lt;br /&gt;
&lt;br /&gt;
 tar -xf mcrcon-0.7.2.tar.gz&lt;br /&gt;
 cd mcrcon-0.7.2/&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; is the standard utility for creating, modifying, inspecting and unpacking tar archives, commonly referred to as &amp;quot;tarballs&amp;quot;. The &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; argument states that we want to e'''x'''tract, and the &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; argument specifies that the next argument is the filename of the tarball we wish to operate on. &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; will automatically infer the compression of the tarball, in this case gzip, and decompress it as it is unpacking.}}&lt;br /&gt;
&lt;br /&gt;
In this directory (check with &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;!) there should be some files, including a ''Makefile''. This allows us to now compile the source code and install the resulting binary:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' A Makefile instructs the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; command on how to build a project that uses it. In this case, it also contains a ''install'' target, which copies the resulting binary into ''/usr/local/bin'' and its manual page into the local prefix for manual pages. Since only the superuser can write to these directories, we need to run the install target with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
If everything went well, we should now have the &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt; command available, as well as its manual page with &amp;lt;code&amp;gt;man mcrcon&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''For The Future:''' If you ever need to recompile &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt;, for example, after a major version distribution upgrade years down the line that gets rid of ''libc.so.6'', you can run:&lt;br /&gt;
&lt;br /&gt;
 sudo make uninstall&lt;br /&gt;
 make clean&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Making The Server Accessible From Outside Your Home Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain what a dynamic IP is, set up ddclient with DuckDNS, have a systemd timer for that.&lt;br /&gt;
# Explain what port forwarding is, why it's needed, and why this depends on your router. Warn not to forward port 22/tcp, only port 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Maintaining Your Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain how to start, stop, restart the Minecraft server with systemctl.&lt;br /&gt;
# Explain how to access server logs with journalctl.&lt;br /&gt;
# Explain how to keep PaperMC updated (including changing the symlink).&lt;br /&gt;
# Explain apt update and apt upgrade. Recommend unattended-upgrades.&lt;br /&gt;
# Explain Debian major releases and to keep an eye out for them.&lt;br /&gt;
# Recommend htop to see how CPU and RAM usage is looking.&lt;br /&gt;
# Recommend some backup solutions; rsync to flash drive, short mention of borg/borgmatic over the network.&lt;br /&gt;
# Explain how to transfer files to/from server: sftp, rsync, winscp, etc.}}&lt;br /&gt;
&lt;br /&gt;
== Security Advice ==&lt;br /&gt;
&lt;br /&gt;
This section will give some general security advice on running your own server, and elaborates on some decisions this guide makes.&lt;br /&gt;
&lt;br /&gt;
=== SSH Public Key Authentication ===&lt;br /&gt;
&lt;br /&gt;
If you absolutely insist on opening up the SSH port to the public internet, you should use public key authentication and disable password authentication for SSH altogether.&lt;br /&gt;
&lt;br /&gt;
This way, public key cryptography is used to authenticate, which is computationally extremely hard to break in this case. The password you encrypt your private key with never travels over the network.&lt;br /&gt;
&lt;br /&gt;
To generate an SSH public/private key pair, run&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen&lt;br /&gt;
&lt;br /&gt;
on '''your client machine''', i.e. not the Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Then copy the newly generated SSH public key over to the Quartz64 Model B with&lt;br /&gt;
&lt;br /&gt;
 ssh-copy-id &amp;lt;var&amp;gt;youruser&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Try logging in with ssh now. It should prompt you for your key's password, rather than the user account's password.&lt;br /&gt;
&lt;br /&gt;
If it works, you should then finally disable password authentication by editing ''/etc/ssh/sshd_config'' as the superuser and setting:&lt;br /&gt;
&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
&lt;br /&gt;
Then, restart the ''sshd.service'' with &amp;lt;code&amp;gt;sudo systemctl restart sshd.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that from this point on, if you want to log in from a different machine, you'll need to either copy your public/private keypair over or generate a new one there and edit ''~/.ssh/authorized_keys'' manually, or run &amp;lt;code&amp;gt;ssh-copy-id&amp;lt;/code&amp;gt; with the &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; argument pointing to that public key.&lt;br /&gt;
&lt;br /&gt;
=== On Minecraft Server Modifications And Plugins ===&lt;br /&gt;
&lt;br /&gt;
Please note that Minecraft server modifications or plugins run with the same access as your Minecraft server. While we tried our best in this guide to restrict the Minecraft server's access to the rest of the system, it can obviously still do bad things to our Minecraft world, our computational resources and our network. That's why, whenever you install a server-side modification or plugin, you should ask yourself these questions:&lt;br /&gt;
&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to not be malicious?&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to have the latest version uploaded by the mod/plugin's author rather than an untrustworthy third party?&lt;br /&gt;
# Do you trust the mod/plugin author to not be malicious?&lt;br /&gt;
# Do you trust the mod/plugin author to have good security practices, as to not get their account compromised or development computer infected with malware?&lt;br /&gt;
# Do you trust the mod/plugin to not open up security vulnerabilities in your server?&lt;br /&gt;
&lt;br /&gt;
Chances are the answers to some of these questions will be &amp;quot;no&amp;quot;. In that case you have some leg work to do: research the site and users, double-check you're on the right domain, read the code for anything fishy, and if you're ever unsure, ask for a second opinion from somebody knowledgeable on the topics.&lt;br /&gt;
&lt;br /&gt;
This is not unwarranted paranoia: Minecraft server modifications [https://github.com/dogboy21/serializationisbad have introduced security vulnerabilities before]. Well trusted people's accounts [https://github.com/fractureiser-investigation/fractureiser have been hijacked before, or their uploads unknowingly infected with malware]. And the way this happened? They themselves were downloading modifications from malicious users.&lt;br /&gt;
&lt;br /&gt;
Please do note that all these issues generally do not apply to Minecraft Data Packs. While they are more limited than modifications or plugins that hook into the actual code, these limitations are good in the context of security.&lt;br /&gt;
&lt;br /&gt;
=== Do Not Engage In Security By Obscurity ===&lt;br /&gt;
&lt;br /&gt;
You may be tempted to not enable a whitelist because you think nobody is going to find your Minecraft server anyway. This is false. People and bots are constantly scanning the entire internet for open services. This includes Minecraft servers. If you do not have a whitelist, you will sooner or later get uninvited visitors.&lt;br /&gt;
&lt;br /&gt;
Similarly, if you expose any service other than the Minecraft server to the internet through your router, expect that to be instantly discovered as well. Automated exploit scanners will then likely be hitting it regularly.&lt;br /&gt;
&lt;br /&gt;
This sounds scary, but it's really not: if your system is up-to-date and follows best security practices, you generally won't have much to fear. It just means that you can't expose any insecurely configured service to the internet and expect nobody to find it.&lt;br /&gt;
&lt;br /&gt;
=== Can't Be Bothered To Maintain It? Turn It Off ===&lt;br /&gt;
&lt;br /&gt;
One of the biggest possible dangers to your home network's security is unwillingness to take responsibility. If you no longer want to maintain the server, turn the board off, unplug it, and delete the port forwarding rule in your router's web interface.&lt;br /&gt;
&lt;br /&gt;
The majority of security breaches don't happen because somebody tries very hard to breach one target, but because a lot of people try very little to breach many targets. Chances are they will find a system somewhere that nobody feels responsible for anymore, and which hasn't been updated in 5 years, and runs a service of a version with a known vulnerability. Avoid being that system: if your Quartz64 Model B begins operating as part of a botnet due to your indifference, the rest of the internet will suffer.&lt;br /&gt;
&lt;br /&gt;
=== Why Reboots Are Sometimes Recommended ===&lt;br /&gt;
&lt;br /&gt;
Occasionally, your Linux kernel package (''linux-image-arm64'') will update. This is great! The kernel is the most basic part of the operating system, and responsible for enforcing fundamental privilege separation. Unfortunately, live-patching the running kernel (i.e. updating it in memory without requiring a reboot) is something that only enterprise-grade commercial Linux distributions like RedHat Enterprise Linux or SUSE Linux do. Since we're running Debian here and Debian doesn't have this feature, the only way to run the newly updated kernel is to reboot the system.&lt;br /&gt;
&lt;br /&gt;
You can run &amp;lt;code&amp;gt;cat /var/run/reboot-required&amp;lt;/code&amp;gt; to see if your Quartz64 Model B requires a reboot. It's worth noting that the Linux kernel development community does not distinguish regular bugs from security bugs, as many a &amp;quot;regular&amp;quot; bug could be a security bug in the right circumstances. However, Debian itself [https://www.debian.org/security/#DSAS publishes security advisories] when a Linux kernel update they ship fixes known potential security issues.&lt;br /&gt;
&lt;br /&gt;
Whether or not you want to reboot for a specific kernel update is up to you. People run servers with hundreds of days of uptime (check with the command &amp;lt;code&amp;gt;uptime&amp;lt;/code&amp;gt;) just fine; just because a potential security issue was fixed in the Linux kernel doesn't mean it'd be part of a realistic attack scenario on a specific system. In our case, the attack scenario we're most worried about is that somebody manages to breach the PaperMC Minecraft server, and then gains arbitrary code execution in its context, from which they will then likely attempt to attack the kernel to gain additional privileges. A second, much less likely attack scenario is that the Linux kernel would have a vulnerability in its network stack that would allow an attacker to remotely exploit it. Such vulnerabilities are exceedingly rare in Linux.&lt;br /&gt;
&lt;br /&gt;
=== Why Not Docker: On Software Supply Chains And Understanding Your Stack ===&lt;br /&gt;
&lt;br /&gt;
For the majority of this guide, self-declared DevOps EpicPoggers Awesomeninjas have probably been foaming at their mouth jumping at the opportunity to exclaim that one should just use Docker. This section serves as a soapbox to talk about the problems with that suggestion.&lt;br /&gt;
&lt;br /&gt;
While a Docker container may be, well, contained, it pulls in an entire stacking doll of other images it is built upon. This means an entire operating system to support the application being run, minus a kernel.&lt;br /&gt;
&lt;br /&gt;
This is great if you are the person writing the image manifests, know what your dependency requirements are, and track the entire software supply chain to ensure you always get the right versions for your stack, with all the latest vulnerabilities patched.&lt;br /&gt;
&lt;br /&gt;
However, this is not how the vast majority of people use Docker. The overwhelming majority of Docker users simply pull some random person's image, run it, and thus make these assumptions:&lt;br /&gt;
&lt;br /&gt;
# That the author of the image is not malicious. Malicious images [https://sysdig.com/blog/analysis-of-supply-chain-attacks-through-public-docker-images/ are widespread on Docker Hub].&lt;br /&gt;
# That the author of the image has good security practices in order to avoid publishing malicious images. We know account compromises will happen as Docker Hub seemingly does not require Two-Factor Authentication.&lt;br /&gt;
# That the author will update the images when critical security fixes in any of the things they depend on are fixed. A [https://dl.acm.org/doi/10.1145/3029806.3029832 2017 research paper] found that many images are hundreds of days old.&lt;br /&gt;
# That any of the things that image depends on, recursively, will also meet these three points.&lt;br /&gt;
&lt;br /&gt;
For a single service/single node scenario, Docker complicates the software supply chain massively. Instead of getting most of our system from a source we already trust (Debian), we're now getting a whole second system from a myriad of sources opaquely compiled into one image.&lt;br /&gt;
&lt;br /&gt;
Additionally, Docker complicates the following things:&lt;br /&gt;
&lt;br /&gt;
* Knowing what version a specific runtime dependency is, and that all copies of this dependency on the entire system are patched against the latest vulnerability.&lt;br /&gt;
* Updating the container image and spinning up a new container based on it; this is not handled through your system's package manager.&lt;br /&gt;
* Persistent data; it's stored in Docker volumes, which may or may not be attached to containers, and you need to actively try to have them stored somewhere other than the default location.&lt;br /&gt;
* Service management; Docker reinvents service management in its own, arguably worse way.&lt;br /&gt;
* Networking; things are on a virtual network with Docker, which complicates firewall rules and other network configurations.&lt;br /&gt;
* Logging; Docker reinvents this too.&lt;br /&gt;
&lt;br /&gt;
By not using a Docker container, but rather a locked down systemd service, we get the following benefits:&lt;br /&gt;
&lt;br /&gt;
* All system software updates, including the Java Runtime, are handled by Debian, irrespective of the version of the Minecraft server we run.&lt;br /&gt;
* All of our services use the same system dependencies, and we can answer the question of &amp;quot;has &amp;lt;var&amp;gt;xyz&amp;lt;/var&amp;gt; been patched?&amp;quot; by just looking at &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We still get reasonably strong process isolation thanks to the various security sandboxing options our systemd service uses, despite not using Linux namespaces (containers).&lt;br /&gt;
* Our persistent data is where we expect it to be, owned by the user and group we expect it to be owned by.&lt;br /&gt;
* Our network is not burdened with virtual interfaces and forwarding rules.&lt;br /&gt;
* Our Minecraft server is tracked and dependency ordered by systemd's service management. It's automatically started on boot, and gracefully stopped on shutdown.&lt;br /&gt;
* Our Minecraft server's logs will show up in the system journal, and we can filter through them or correlate them with other sources just as with any other service reporting to the journal.&lt;br /&gt;
&lt;br /&gt;
Container images built from manifests start to make sense when you are running complex sets of services scaled horizontally across a massive homogeneous cluster, where you want to rescale as needed and deploy new versions of your entire stack as immutable images that you can roll back easily. They also make some amount of sense in a case where you only have access to a very old userland (e.g. a stable enterprise Linux release) but need to run software requiring a myriad of dependencies that are either not packaged or not of a recent enough version in your distribution.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20745</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20745"/>
		<updated>2023-09-14T16:09:26Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
{{hint|'''For prospective editors:''' This guide was authored by [[User:CounterPillow]]. Please read the lengthy comment at the top of the article in the edit window before trying to contribute to it in any way.}}&lt;br /&gt;
&amp;lt;!--FOR EDITORS PLEASE READ AND RESPECT&lt;br /&gt;
This guide makes a lot of deliberately chosen recommendations, and generally does not suggest &amp;quot;alternatives&amp;quot; at every step. This is on purpose. The author weighed the options against each other, and chose one they felt was the best fit for the situation to streamline the guide, or of the best educational value. This helps avoid needlessly bloating an already lengthy guide, and reduces potential for user confusion or decision paralysis. For this reason, the guide will remain in CounterPillow's user namespace.&lt;br /&gt;
&lt;br /&gt;
Please respect that this is the work of an individual and you should not tamper with their author voice. In particular:&lt;br /&gt;
- Do not suggest alternative ways of doing a thing, e.g. alternative disk formatting tools, alternative OS images, alternative firewall management systems, the blight upon humanity that is Docker, and so on.&lt;br /&gt;
- Do not alter the recommendations made, especially not in the Security Advice and Maintaining Your Server sections.&lt;br /&gt;
- Do not reorder sections or steps, the order they're done in is usually deliberately chosen to introduce new concepts as few at a time as possible.&lt;br /&gt;
What you may do is contribute fixes such as typo/grammar fixes, or illustrative diagrams for explained concepts or hardware configurations. If you think you have something to contribute beyond that, please discuss it with CounterPillow first.&lt;br /&gt;
&lt;br /&gt;
TL;DR: Don't shit up my guide. I put a lot of time into it, and it's opinionated for a reason.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
=== Permissions ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Write a section explaining file ownership and permissions.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Network ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Fixed LAN IP Address ===&lt;br /&gt;
&lt;br /&gt;
By default, the Plebian images use NetworkManager to automatically configure the ethernet interface in such a way that it asks your router to assign it an IP address inside your local network with a protocol called DHCP. What happens is that the Quartz64 asks the router for an IP address, and the router hands it one from a pool of addresses for a limited span of time, a so-called &amp;quot;lease&amp;quot;. Dynamically configuring the IP address like this is great for quickly getting started, especially when in combination with mDNS, as everything just works automatically out of the box.&lt;br /&gt;
&lt;br /&gt;
However, a bit later on in this guide, we'll want the router to know exactly what IP address our Quartz64 Model B is going to respond to even across power cycles of either device. That's why at this point, we'll set it up to have a fixed local network address, with '''one''' of two methods.&lt;br /&gt;
&lt;br /&gt;
==== Method A: Using Reserved DHCP Leases ====&lt;br /&gt;
&lt;br /&gt;
With this method, we'll simply configure your router to always hand the same IP address out over DHCP for the hardware address (MAC) of your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Many routers will have a web interface through which you can configure them. To find your router's IP address, type &amp;lt;code&amp;gt;ip route&amp;lt;/code&amp;gt; into your SSH session with the Quartz64 Model B and hit enter to run the command. It should output something like:&lt;br /&gt;
&lt;br /&gt;
 default via 192.168.0.1 dev end0 proto dhcp src 192.168.0.58 metric 100&lt;br /&gt;
 192.168.0.0/24 dev end0 proto kernel scope link src 192.168.0.58 metric 100&lt;br /&gt;
&lt;br /&gt;
In this case, we can see that our router is &amp;lt;code&amp;gt;192.168.0.1&amp;lt;/code&amp;gt;, as the ''default via'' route goes through it. Yours may be different.&lt;br /&gt;
&lt;br /&gt;
You can now type this router IP address into your web browser, and with any luck, you'll be greeted with a web login prompt. If you've never set a password on your router's management interface, check the bottom or sides of your device for a sticker that lists a default password.&lt;br /&gt;
&lt;br /&gt;
The precise management interface differs from router to router, so this guide can't give precise instructions. However, once logged in, there is usually a section labelled &amp;quot;DHCP&amp;quot;. In it, you may be able to configure reserved IP addresses for a specific MAC address. To find the MAC address of your Quartz64 Model B, run &amp;quot;ip link&amp;quot; on it, which will give you output like this:&lt;br /&gt;
&lt;br /&gt;
 1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
 2: end0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/ether 76:36:c7:c4:57:e2 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&lt;br /&gt;
What we want here is the first colon separated address in the second link (end0), in this case &amp;lt;code&amp;gt;76:36:c7:c4:57:e2&amp;lt;/code&amp;gt;. Your router should let you enter this MAC address somewhere to reserve a specific address from the DHCP pool for it.&lt;br /&gt;
&lt;br /&gt;
==== Method B: Using A Fixed IP ====&lt;br /&gt;
&lt;br /&gt;
If Method A isn't available to you, this method should always work.&lt;br /&gt;
&lt;br /&gt;
Instead of using DHCP to request a lease for an IP address, our Quartz64 Model B can also simply assume it can communicate using a fixed IP address.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' Our fixed IP address should be ''outside'' the range of IP addresses our router hands out through DHCP, as otherwise collisions may occur! In the router web interface, look for a DHCP start address field and DHCP pool size field. An IP address either smaller than the start address (though above 0 and not colliding with the router's address) or larger than the start address plus the pool size (though below 255) will work; you may have to reduce the size of the DHCP pool if it's all maxed out though.&lt;br /&gt;
&lt;br /&gt;
For example, with a DHCP pool that starts at 192.168.0.40 and has a size of 215, we could use a fixed IP address like 192.168.0.10 without accidentally colliding with one the router hands out.&lt;br /&gt;
&lt;br /&gt;
Run the command&lt;br /&gt;
&lt;br /&gt;
 sudo nmtui&lt;br /&gt;
&lt;br /&gt;
which should open up an interactive connection editor. Use your cursor keys to highlight the entry &amp;quot;Wired connection 1&amp;quot;, and hit the right arrow key to navigate towards the &amp;quot;Edit&amp;quot; option, and hit enter.&lt;br /&gt;
&lt;br /&gt;
Navigate to &amp;quot;IPv4 CONFIGURATION&amp;quot; and hit enter on &amp;quot;&amp;amp;lt;Automatic&amp;amp;gt;&amp;quot;, then select &amp;quot;&amp;amp;lt;Manual&amp;amp;gt;&amp;quot;. Navigate to the right over the &amp;quot;&amp;amp;lt;Show&amp;amp;gt;&amp;quot;, and hit enter again. You should now be greeted by a whole host of options:&lt;br /&gt;
&lt;br /&gt;
# In &amp;quot;Addresses:&amp;quot;, hit &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and enter your chosen fixed IPv4 address followed by &amp;lt;code&amp;gt;/32&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;192.168.0.21/32&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In &amp;quot;Gateway&amp;quot;, enter your router's IPv4 address.&lt;br /&gt;
# In DNS Servers, enter on &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and add &amp;lt;code&amp;gt;1.1.1.1&amp;lt;/code&amp;gt;. Repeat the same process, but with &amp;lt;code&amp;gt;1.0.0.1&amp;lt;/code&amp;gt;. This will add Cloudflare's DNS servers, as we'll no longer be receiving the router's DNS servers with manual configuration.&lt;br /&gt;
# Check the box next to &amp;quot;Ignore automatically obtained DNS parameters&amp;quot; by navigating over it and hitting the space bar. This makes sure that if our router tries to give us some DNS servers anyway, we don't use them.&lt;br /&gt;
# Check &amp;quot;Require IPv4 addressing for this connection&amp;quot; in the same way.&lt;br /&gt;
# Just to be consistent, go to &amp;quot;IPv6 CONFIGURATION&amp;quot;, but this time leave it on Automatic. Hit &amp;quot;&amp;amp;lt;Show...&amp;amp;gt;&amp;quot; to expand it.&lt;br /&gt;
# Add the following two Cloudflare DNS servers: &amp;lt;code&amp;gt;2606:4700:4700::1111&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;2606:4700:4700::1001&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check &amp;quot;Ignore automatically obtained DNS parameters&amp;quot;.&lt;br /&gt;
# Navigate down to &amp;quot;&amp;amp;lt;OK&amp;amp;gt;&amp;quot; and hit enter&lt;br /&gt;
# Hit escape twice to quit nmtui&lt;br /&gt;
&lt;br /&gt;
The easiest way to make sure your new network connection settings are used is to reboot your board with&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
After logging back in, the command&lt;br /&gt;
&lt;br /&gt;
 ip addr&lt;br /&gt;
&lt;br /&gt;
should show your chosen IP under end0 after &amp;quot;inet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Firewall ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to set up a persistent firewall that allows ports 22/tcp from LAN and 25565/tcp from anywhere.}}&lt;br /&gt;
&lt;br /&gt;
== Formatting The NVMe Drive ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to wipefs + fdisk + format the NVMe drive, make a mount point and put it in fstab.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Minecraft Java Edition Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Add a minecraft system user with a minecraft group that has write permissions to the minecraft directory on NVMe, add minecraft to supplemental groups for user.&lt;br /&gt;
# Install Java, download PaperMC to the Minecraft directory, symlink it to paper.jar, run it once, accept the EULA.&lt;br /&gt;
# Edit server.properties, enable rcon with a password, enable whitelist, edit motd and set difficulty.&lt;br /&gt;
# Add the systemd unit to /etc/systemd/system/, set it to auto-start, then start it.&lt;br /&gt;
# Add player to whitelist and ops through rcon.&lt;br /&gt;
# Connect to the server for the first time!}}&lt;br /&gt;
&lt;br /&gt;
=== Getting An RCon Client ===&lt;br /&gt;
&lt;br /&gt;
Minecraft's server has a control protocol called &amp;quot;rcon&amp;quot;. We'll need this protocol to gracefully shut down the Minecraft server, and add ourselves to ops later on. For this, we'll need a Minecraft RCon client. [https://github.com/Tiiffi/mcrcon Tiiffi/mcrcon] is a good one, but we need to compile and install it first.&lt;br /&gt;
&lt;br /&gt;
To start off, let's install some required tools to compile it. In your Quartz64 Model B's SSH session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install build-essential&lt;br /&gt;
&lt;br /&gt;
Next we'll download the source code for mcrcon:&lt;br /&gt;
&lt;br /&gt;
 wget --content-disposition https://github.com/Tiiffi/mcrcon/archive/refs/tags/v0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should have downloaded us an ''mcrcon-0.7.2.tar.gz'' archive file. Let's verify that what we've downloaded matches what this guide expects:&lt;br /&gt;
&lt;br /&gt;
 sha256sum mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should output the following; compare the first string of letter and numbers to yours, they must match:&lt;br /&gt;
&lt;br /&gt;
 1743b25a2d031b774e805f4011cb7d92010cb866e3b892f5dfc5b42080973270  mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
Now let's unpack the ''.tar.gz'' archive and change into the directory it contains:&lt;br /&gt;
&lt;br /&gt;
 tar -xf mcrcon-0.7.2.tar.gz&lt;br /&gt;
 cd mcrcon-0.7.2/&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; is the standard utility for creating, modifying, inspecting and unpacking tar archives, commonly referred to as &amp;quot;tarballs&amp;quot;. The &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; argument states that we want to e'''x'''tract, and the &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; argument specifies that the next argument is the filename of the tarball we wish to operate on. &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; will automatically infer the compression of the tarball, in this case gzip, and decompress it as it is unpacking.}}&lt;br /&gt;
&lt;br /&gt;
In this directory (check with &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;!) there should be some files, including a ''Makefile''. This allows us to now compile the source code and install the resulting binary:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' A Makefile instructs the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; command on how to build a project that uses it. In this case, it also contains a ''install'' target, which copies the resulting binary into ''/usr/local/bin'' and its manual page into the local prefix for manual pages. Since only the superuser can write to these directories, we need to run the install target with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
If everything went well, we should now have the &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt; command available, as well as its manual page with &amp;lt;code&amp;gt;man mcrcon&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''For The Future:''' If you ever need to recompile &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt;, for example, after a major version distribution upgrade years down the line that gets rid of ''libc.so.6'', you can run:&lt;br /&gt;
&lt;br /&gt;
 sudo make uninstall&lt;br /&gt;
 make clean&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Making The Server Accessible From Outside Your Home Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain what a dynamic IP is, set up ddclient with DuckDNS, have a systemd timer for that.&lt;br /&gt;
# Explain what port forwarding is, why it's needed, and why this depends on your router. Warn not to forward port 22/tcp, only port 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Maintaining Your Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain how to start, stop, restart the Minecraft server with systemctl.&lt;br /&gt;
# Explain how to access server logs with journalctl.&lt;br /&gt;
# Explain how to keep PaperMC updated (including changing the symlink).&lt;br /&gt;
# Explain apt update and apt upgrade. Recommend unattended-upgrades.&lt;br /&gt;
# Explain Debian major releases and to keep an eye out for them.&lt;br /&gt;
# Recommend htop to see how CPU and RAM usage is looking.&lt;br /&gt;
# Recommend some backup solutions; rsync to flash drive, short mention of borg/borgmatic over the network.&lt;br /&gt;
# Explain how to transfer files to/from server: sftp, rsync, winscp, etc.}}&lt;br /&gt;
&lt;br /&gt;
== Security Advice ==&lt;br /&gt;
&lt;br /&gt;
This section will give some general security advice on running your own server, and elaborates on some decisions this guide makes.&lt;br /&gt;
&lt;br /&gt;
=== SSH Public Key Authentication ===&lt;br /&gt;
&lt;br /&gt;
If you absolutely insist on opening up the SSH port to the public internet, you should use public key authentication and disable password authentication for SSH altogether.&lt;br /&gt;
&lt;br /&gt;
This way, public key cryptography is used to authenticate, which is computationally extremely hard to break in this case. The password you encrypt your private key with never travels over the network.&lt;br /&gt;
&lt;br /&gt;
To generate an SSH public/private key pair, run&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen&lt;br /&gt;
&lt;br /&gt;
on '''your client machine''', i.e. not the Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Then copy the newly generated SSH public key over to the Quartz64 Model B with&lt;br /&gt;
&lt;br /&gt;
 ssh-copy-id &amp;lt;var&amp;gt;youruser&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Try logging in with ssh now. It should prompt you for your key's password, rather than the user account's password.&lt;br /&gt;
&lt;br /&gt;
If it works, you should then finally disable password authentication by editing ''/etc/ssh/sshd_config'' as the superuser and setting:&lt;br /&gt;
&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
&lt;br /&gt;
Then, restart the ''sshd.service'' with &amp;lt;code&amp;gt;sudo systemctl restart sshd.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that from this point on, if you want to log in from a different machine, you'll need to either copy your public/private keypair over or generate a new one there and edit ''~/.ssh/authorized_keys'' manually, or run &amp;lt;code&amp;gt;ssh-copy-id&amp;lt;/code&amp;gt; with the &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt; argument pointing to that public key.&lt;br /&gt;
&lt;br /&gt;
=== On Minecraft Server Modifications And Plugins ===&lt;br /&gt;
&lt;br /&gt;
Please note that Minecraft server modifications or plugins run with the same access as your Minecraft server. While we tried our best in this guide to restrict the Minecraft server's access to the rest of the system, it can obviously still do bad things to our Minecraft world, our computational resources and our network. That's why, whenever you install a server-side modification or plugin, you should ask yourself these questions:&lt;br /&gt;
&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to not be malicious?&lt;br /&gt;
# Do you trust the website/service you are downloading the mod/plugin from to have the latest version uploaded by the mod/plugin's author rather than an untrustworthy third party?&lt;br /&gt;
# Do you trust the mod/plugin author to not be malicious?&lt;br /&gt;
# Do you trust the mod/plugin author to have good security practices, as to not get their account compromised or development computer infected with malware?&lt;br /&gt;
# Do you trust the mod/plugin to not open up security vulnerabilities in your server?&lt;br /&gt;
&lt;br /&gt;
Chances are the answers to some of these questions will be &amp;quot;no&amp;quot;. In that case you have some leg work to do: research the site and users, double-check you're on the right domain, read the code for anything fishy, and if you're ever unsure, ask for a second opinion from somebody knowledgeable on the topics.&lt;br /&gt;
&lt;br /&gt;
This is not unwarranted paranoia: Minecraft server modifications [https://github.com/dogboy21/serializationisbad have introduced security vulnerabilities before]. Well trusted people's accounts [https://github.com/fractureiser-investigation/fractureiser have been hijacked before, or their uploads unknowingly infected with malware]. And the way this happened? They themselves were downloading modifications from malicious users.&lt;br /&gt;
&lt;br /&gt;
Please do note that all these issues generally do not apply to Minecraft Data Packs. While they are more limited than modifications or plugins that hook into the actual code, these limitations are good in the context of security.&lt;br /&gt;
&lt;br /&gt;
=== Do Not Engage In Security By Obscurity ===&lt;br /&gt;
&lt;br /&gt;
You may be tempted to not enable a whitelist because you think nobody is going to find your Minecraft server anyway. This is false. People and bots are constantly scanning the entire internet for open services. This includes Minecraft servers. If you do not have a whitelist, you will sooner or later get uninvited visitors.&lt;br /&gt;
&lt;br /&gt;
Similarly, if you expose any service other than the Minecraft server to the internet through your router, expect that to be instantly discovered as well. Automated exploit scanners will then likely be hitting it regularly.&lt;br /&gt;
&lt;br /&gt;
This sounds scary, but it's really not: if your system is up-to-date and follows best security practices, you generally won't have much to fear. It just means that you can't expose any insecurely configured service to the internet and expect nobody to find it.&lt;br /&gt;
&lt;br /&gt;
=== Can't Be Bothered To Maintain It? Turn It Off ===&lt;br /&gt;
&lt;br /&gt;
One of the biggest possible dangers to your home network's security is unwillingness to take responsibility. If you no longer want to maintain the server, turn the board off, unplug it, and delete the port forwarding rule in your router's web interface.&lt;br /&gt;
&lt;br /&gt;
The majority of security breaches don't happen because somebody tries very hard to breach one target, but because a lot of people try very little to breach many targets. Chances are they will find a system somewhere that nobody feels responsible for anymore, and which hasn't been updated in 5 years, and runs a service of a version with a known vulnerability. Avoid being that system: if your Quartz64 Model B begins operating as part of a botnet due to your indifference, the rest of the internet will suffer.&lt;br /&gt;
&lt;br /&gt;
=== Why Reboots Are Sometimes Recommended ===&lt;br /&gt;
&lt;br /&gt;
Occasionally, your Linux kernel package (''linux-image-arm64'') will update. This is great! The kernel is the most basic part of the operating system, and responsible for enforcing fundamental privilege separation. Unfortunately, live-patching the running kernel (i.e. updating it in memory without requiring a reboot) is something that only enterprise-grade commercial Linux distributions like RedHat Enterprise Linux or SUSE Linux do. Since we're running Debian here and Debian doesn't have this feature, the only way to run the newly updated kernel is to reboot the system.&lt;br /&gt;
&lt;br /&gt;
You can run &amp;lt;code&amp;gt;cat /var/run/reboot-required&amp;lt;/code&amp;gt; to see if your Quartz64 Model B requires a reboot. It's worth noting that the Linux kernel development community does not distinguish regular bugs from security bugs, as many a &amp;quot;regular&amp;quot; bug could be a security bug in the right circumstances. However, Debian itself [https://www.debian.org/security/#DSAS publishes security advisories] when a Linux kernel update they ship fixes known potential security issues.&lt;br /&gt;
&lt;br /&gt;
Whether or not you want to reboot for a specific kernel update is up to you. People run servers with hundreds of days of uptime (check with the command &amp;lt;code&amp;gt;uptime&amp;lt;/code&amp;gt;) just fine; just because a potential security issue was fixed in the Linux kernel doesn't mean it'd be part of a realistic attack scenario on a specific system. In our case, the attack scenario we're most worried about is that somebody manages to breach the PaperMC Minecraft server, and then gains arbitrary code execution in its context, from which they will then likely attempt to attack the kernel to gain additional privileges. A second, much less likely attack scenario is that the Linux kernel would have a vulnerability in its network stack that would allow an attacker to remotely exploit it. Such vulnerabilities are exceedingly rare in Linux.&lt;br /&gt;
&lt;br /&gt;
=== Why Not Docker: On Software Supply Chains And Understanding Your Stack ===&lt;br /&gt;
&lt;br /&gt;
For the majority of this guide, self-declared DevOps EpicPoggers Awesomeninjas have probably been foaming at their mouth jumping at the opportunity to exclaim that one should just use Docker. This section serves as a soapbox to talk about the problems with that suggestion.&lt;br /&gt;
&lt;br /&gt;
While a Docker container may be, well, contained, it pulls in an entire stacking doll of other images it is built upon. This means an entire operating system to support the application being run, minus a kernel.&lt;br /&gt;
&lt;br /&gt;
This is great if you are the person writing the image manifests, know what your dependency requirements are, and track the entire software supply chain to ensure you always get the right versions for your stack, with all the latest vulnerabilities patched.&lt;br /&gt;
&lt;br /&gt;
However, this is not how the vast majority of people use Docker. The overwhelming majority of Docker users simply pull some random person's image, run it, and thus make these assumptions:&lt;br /&gt;
&lt;br /&gt;
# That the author of the image is not malicious. Malicious images [https://sysdig.com/blog/analysis-of-supply-chain-attacks-through-public-docker-images/ are widespread on Docker Hub].&lt;br /&gt;
# That the author of the image has good security practices in order to avoid publishing malicious images. We know account compromises will happen as Docker Hub seemingly does not require Two-Factor Authentication.&lt;br /&gt;
# That the author will update the images when critical security fixes in any of the things they depend on are fixed. A [https://dl.acm.org/doi/10.1145/3029806.3029832 2017 research paper] found that many images are hundreds of days old.&lt;br /&gt;
# That any of the things that image depends on, recursively, will also meet these three points.&lt;br /&gt;
&lt;br /&gt;
For a single service/single node scenario, Docker complicates the software supply chain massively. Instead of getting most of our system from a source we already trust (Debian), we're now getting a whole second system from a myriad of sources opaquely compiled into one image.&lt;br /&gt;
&lt;br /&gt;
Additionally, Docker complicates the following things:&lt;br /&gt;
&lt;br /&gt;
* Knowing what version a specific runtime dependency is, and that all copies of this dependency on the entire system are patched against the latest vulnerability.&lt;br /&gt;
* Updating the container image and spinning up a new container based on it; this is not handled through your system's package manager.&lt;br /&gt;
* Persistent data; it's stored in Docker volumes, which may or may not be attached to containers, and you need to actively try to have them stored somewhere other than the default location.&lt;br /&gt;
* Service management; Docker reinvents service management in its own, arguably worse way.&lt;br /&gt;
* Networking; things are on a virtual network with Docker, which complicates firewall rules and other network configurations.&lt;br /&gt;
* Logging; Docker reinvents this too.&lt;br /&gt;
&lt;br /&gt;
By not using a Docker container, but rather a locked down systemd service, we get the following benefits:&lt;br /&gt;
&lt;br /&gt;
* All system software updates, including the Java Runtime, are handled by Debian, irrespective of the version of the Minecraft server we run.&lt;br /&gt;
* All of our services use the same system dependencies, and we can answer the question of &amp;quot;has &amp;lt;var&amp;gt;xyz&amp;lt;/var&amp;gt; been patched?&amp;quot; by just looking at &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* We still get reasonably strong process isolation thanks to the various security sandboxing options our systemd service uses, despite not using Linux namespaces (containers).&lt;br /&gt;
* Our persistent data is where we expect it to be, owned by the user and group we expect it to be owned by.&lt;br /&gt;
* Our network is not burdened with virtual interfaces and forwarding rules.&lt;br /&gt;
* Our Minecraft server is tracked and dependency ordered by systemd's service management. It's automatically started on boot, and gracefully stopped on shutdown.&lt;br /&gt;
* Our Minecraft server's logs will show up in the system journal, and we can filter through them or correlate them with other sources just as with any other service reporting to the journal.&lt;br /&gt;
&lt;br /&gt;
Container images built from manifests start to make sense when you are running complex sets of services scaled horizontally across a massive homogeneous cluster, where you want to rescale as needed and deploy new versions of your entire stack as immutable images that you can roll back easily. They also make some amount of sense in a case where you only have access to a very old userland (e.g. a stable enterprise Linux release) but need to run software requiring a myriad of dependencies that are either not packaged or not of a recent enough version in your distribution.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20744</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20744"/>
		<updated>2023-09-14T10:20:07Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
{{hint|'''For prospective editors:''' This guide was authored by [[User:CounterPillow]]. Please read the lengthy comment at the top of the article in the edit window before trying to contribute to it in any way.}}&lt;br /&gt;
&amp;lt;!--FOR EDITORS PLEASE READ AND RESPECT&lt;br /&gt;
This guide makes a lot of deliberately chosen recommendations, and generally does not suggest &amp;quot;alternatives&amp;quot; at every step. This is on purpose. The author weighed the options against each other, and chose one they felt was the best fit for the situation to streamline the guide, or of the best educational value. This helps avoid needlessly bloating an already lengthy guide, and reduces potential for user confusion or decision paralysis. For this reason, the guide will remain in CounterPillow's user namespace.&lt;br /&gt;
&lt;br /&gt;
Please respect that this is the work of an individual and you should not tamper with their author voice. In particular:&lt;br /&gt;
- Do not suggest alternative ways of doing a thing, e.g. alternative disk formatting tools, alternative OS images, alternative firewall management systems, the blight upon humanity that is Docker, and so on.&lt;br /&gt;
- Do not alter the recommendations made, especially not in the Security Advice and Maintaining Your Server sections.&lt;br /&gt;
- Do not reorder sections or steps, the order they're done in is usually deliberately chosen to introduce new concepts as few at a time as possible.&lt;br /&gt;
What you may do is contribute fixes such as typo/grammar fixes, or illustrative diagrams for explained concepts or hardware configurations. If you think you have something to contribute beyond that, please discuss it with CounterPillow first.&lt;br /&gt;
&lt;br /&gt;
TL;DR: Don't shit up my guide. I put a lot of time into it, and it's opinionated for a reason.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
=== Permissions ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Write a section explaining file ownership and permissions.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Network ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Fixed LAN IP Address ===&lt;br /&gt;
&lt;br /&gt;
By default, the Plebian images use NetworkManager to automatically configure the ethernet interface in such a way that it asks your router to assign it an IP address inside your local network with a protocol called DHCP. What happens is that the Quartz64 asks the router for an IP address, and the router hands it one from a pool of addresses for a limited span of time, a so-called &amp;quot;lease&amp;quot;. Dynamically configuring the IP address like this is great for quickly getting started, especially when in combination with mDNS, as everything just works automatically out of the box.&lt;br /&gt;
&lt;br /&gt;
However, a bit later on in this guide, we'll want the router to know exactly what IP address our Quartz64 Model B is going to respond to even across power cycles of either device. That's why at this point, we'll set it up to have a fixed local network address, with '''one''' of two methods.&lt;br /&gt;
&lt;br /&gt;
==== Method A: Using Reserved DHCP Leases ====&lt;br /&gt;
&lt;br /&gt;
With this method, we'll simply configure your router to always hand the same IP address out over DHCP for the hardware address (MAC) of your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Many routers will have a web interface through which you can configure them. To find your router's IP address, type &amp;lt;code&amp;gt;ip route&amp;lt;/code&amp;gt; into your SSH session with the Quartz64 Model B and hit enter to run the command. It should output something like:&lt;br /&gt;
&lt;br /&gt;
 default via 192.168.0.1 dev end0 proto dhcp src 192.168.0.58 metric 100&lt;br /&gt;
 192.168.0.0/24 dev end0 proto kernel scope link src 192.168.0.58 metric 100&lt;br /&gt;
&lt;br /&gt;
In this case, we can see that our router is &amp;lt;code&amp;gt;192.168.0.1&amp;lt;/code&amp;gt;, as the ''default via'' route goes through it. Yours may be different.&lt;br /&gt;
&lt;br /&gt;
You can now type this router IP address into your web browser, and with any luck, you'll be greeted with a web login prompt. If you've never set a password on your router's management interface, check the bottom or sides of your device for a sticker that lists a default password.&lt;br /&gt;
&lt;br /&gt;
The precise management interface differs from router to router, so this guide can't give precise instructions. However, once logged in, there is usually a section labelled &amp;quot;DHCP&amp;quot;. In it, you may be able to configure reserved IP addresses for a specific MAC address. To find the MAC address of your Quartz64 Model B, run &amp;quot;ip link&amp;quot; on it, which will give you output like this:&lt;br /&gt;
&lt;br /&gt;
 1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
 2: end0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/ether 76:36:c7:c4:57:e2 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&lt;br /&gt;
What we want here is the first colon separated address in the second link (end0), in this case &amp;lt;code&amp;gt;76:36:c7:c4:57:e2&amp;lt;/code&amp;gt;. Your router should let you enter this MAC address somewhere to reserve a specific address from the DHCP pool for it.&lt;br /&gt;
&lt;br /&gt;
==== Method B: Using A Fixed IP ====&lt;br /&gt;
&lt;br /&gt;
If Method A isn't available to you, this method should always work.&lt;br /&gt;
&lt;br /&gt;
Instead of using DHCP to request a lease for an IP address, our Quartz64 Model B can also simply assume it can communicate using a fixed IP address.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' Our fixed IP address should be ''outside'' the range of IP addresses our router hands out through DHCP, as otherwise collisions may occur! In the router web interface, look for a DHCP start address field and DHCP pool size field. An IP address either smaller than the start address (though above 0 and not colliding with the router's address) or larger than the start address plus the pool size (though below 255) will work; you may have to reduce the size of the DHCP pool if it's all maxed out though.&lt;br /&gt;
&lt;br /&gt;
For example, with a DHCP pool that starts at 192.168.0.40 and has a size of 215, we could use a fixed IP address like 192.168.0.10 without accidentally colliding with one the router hands out.&lt;br /&gt;
&lt;br /&gt;
Run the command&lt;br /&gt;
&lt;br /&gt;
 sudo nmtui&lt;br /&gt;
&lt;br /&gt;
which should open up an interactive connection editor. Use your cursor keys to highlight the entry &amp;quot;Wired connection 1&amp;quot;, and hit the right arrow key to navigate towards the &amp;quot;Edit&amp;quot; option, and hit enter.&lt;br /&gt;
&lt;br /&gt;
Navigate to &amp;quot;IPv4 CONFIGURATION&amp;quot; and hit enter on &amp;quot;&amp;amp;lt;Automatic&amp;amp;gt;&amp;quot;, then select &amp;quot;&amp;amp;lt;Manual&amp;amp;gt;&amp;quot;. Navigate to the right over the &amp;quot;&amp;amp;lt;Show&amp;amp;gt;&amp;quot;, and hit enter again. You should now be greeted by a whole host of options:&lt;br /&gt;
&lt;br /&gt;
# In &amp;quot;Addresses:&amp;quot;, hit &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and enter your chosen fixed IPv4 address followed by &amp;lt;code&amp;gt;/32&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;192.168.0.21/32&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In &amp;quot;Gateway&amp;quot;, enter your router's IPv4 address.&lt;br /&gt;
# In DNS Servers, enter on &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and add &amp;lt;code&amp;gt;1.1.1.1&amp;lt;/code&amp;gt;. Repeat the same process, but with &amp;lt;code&amp;gt;1.0.0.1&amp;lt;/code&amp;gt;. This will add Cloudflare's DNS servers, as we'll no longer be receiving the router's DNS servers with manual configuration.&lt;br /&gt;
# Check the box next to &amp;quot;Ignore automatically obtained DNS parameters&amp;quot; by navigating over it and hitting the space bar. This makes sure that if our router tries to give us some DNS servers anyway, we don't use them.&lt;br /&gt;
# Check &amp;quot;Require IPv4 addressing for this connection&amp;quot; in the same way.&lt;br /&gt;
# Just to be consistent, go to &amp;quot;IPv6 CONFIGURATION&amp;quot;, but this time leave it on Automatic. Hit &amp;quot;&amp;amp;lt;Show...&amp;amp;gt;&amp;quot; to expand it.&lt;br /&gt;
# Add the following two Cloudflare DNS servers: &amp;lt;code&amp;gt;2606:4700:4700::1111&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;2606:4700:4700::1001&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check &amp;quot;Ignore automatically obtained DNS parameters&amp;quot;.&lt;br /&gt;
# Navigate down to &amp;quot;&amp;amp;lt;OK&amp;amp;gt;&amp;quot; and hit enter&lt;br /&gt;
# Hit escape twice to quit nmtui&lt;br /&gt;
&lt;br /&gt;
The easiest way to make sure your new network connection settings are used is to reboot your board with&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
After logging back in, the command&lt;br /&gt;
&lt;br /&gt;
 ip addr&lt;br /&gt;
&lt;br /&gt;
should show your chosen IP under end0 after &amp;quot;inet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Firewall ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to set up a persistent firewall that allows ports 22/tcp from LAN and 25565/tcp from anywhere.}}&lt;br /&gt;
&lt;br /&gt;
== Formatting The NVMe Drive ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to wipefs + fdisk + format the NVMe drive, make a mount point and put it in fstab.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Minecraft Java Edition Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Add a minecraft system user with a minecraft group that has write permissions to the minecraft directory on NVMe, add minecraft to supplemental groups for user.&lt;br /&gt;
# Install Java, download PaperMC to the Minecraft directory, symlink it to paper.jar, run it once, accept the EULA.&lt;br /&gt;
# Edit server.properties, enable rcon with a password, enable whitelist, edit motd and set difficulty.&lt;br /&gt;
# Add the systemd unit to /etc/systemd/system/, set it to auto-start, then start it.&lt;br /&gt;
# Add player to whitelist and ops through rcon.&lt;br /&gt;
# Connect to the server for the first time!}}&lt;br /&gt;
&lt;br /&gt;
=== Getting An RCon Client ===&lt;br /&gt;
&lt;br /&gt;
Minecraft's server has a control protocol called &amp;quot;rcon&amp;quot;. We'll need this protocol to gracefully shut down the Minecraft server, and add ourselves to ops later on. For this, we'll need a Minecraft RCon client. [https://github.com/Tiiffi/mcrcon Tiiffi/mcrcon] is a good one, but we need to compile and install it first.&lt;br /&gt;
&lt;br /&gt;
To start off, let's install some required tools to compile it. In your Quartz64 Model B's SSH session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install build-essential&lt;br /&gt;
&lt;br /&gt;
Next we'll download the source code for mcrcon:&lt;br /&gt;
&lt;br /&gt;
 wget --content-disposition https://github.com/Tiiffi/mcrcon/archive/refs/tags/v0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should have downloaded us an ''mcrcon-0.7.2.tar.gz'' archive file. Let's verify that what we've downloaded matches what this guide expects:&lt;br /&gt;
&lt;br /&gt;
 sha256sum mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
This should output the following; compare the first string of letter and numbers to yours, they must match:&lt;br /&gt;
&lt;br /&gt;
 1743b25a2d031b774e805f4011cb7d92010cb866e3b892f5dfc5b42080973270  mcrcon-0.7.2.tar.gz&lt;br /&gt;
&lt;br /&gt;
Now let's unpack the ''.tar.gz'' archive and change into the directory it contains:&lt;br /&gt;
&lt;br /&gt;
 tar -xf mcrcon-0.7.2.tar.gz&lt;br /&gt;
 cd mcrcon-0.7.2/&lt;br /&gt;
&lt;br /&gt;
In this directory (check with &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;!) there should be some files, including a ''Makefile''. This allows us to now compile the source code and install the resulting binary:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' A Makefile instructs the &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; command on how to build a project that uses it. In this case, it also contains a ''install'' target, which copies the resulting binary into ''/usr/local/bin'' and its manual page into the local prefix for manual pages. Since only the superuser can write to these directories, we need to run the install target with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
If everything went well, we should now have the &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt; command available, as well as its manual page with &amp;lt;code&amp;gt;man mcrcon&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''For The Future:''' If you ever need to recompile &amp;lt;code&amp;gt;mcrcon&amp;lt;/code&amp;gt;, for example, after a major version distribution upgrade years down the line that gets rid of ''libc.so.6'', you can run:&lt;br /&gt;
&lt;br /&gt;
 sudo make uninstall&lt;br /&gt;
 make clean&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Making The Server Accessible From Outside Your Home Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain what a dynamic IP is, set up ddclient with DuckDNS, have a systemd timer for that.&lt;br /&gt;
# Explain what port forwarding is, why it's needed, and why this depends on your router. Warn not to forward port 22/tcp, only port 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Maintaining Your Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain how to start, stop, restart the Minecraft server with systemctl.&lt;br /&gt;
# Explain how to access server logs with journalctl.&lt;br /&gt;
# Explain how to keep PaperMC updated (including changing the symlink).&lt;br /&gt;
# Explain apt update and apt upgrade. Recommend unattended-upgrades.&lt;br /&gt;
# Explain Debian major releases and to keep an eye out for them.&lt;br /&gt;
# Recommend htop to see how CPU and RAM usage is looking.&lt;br /&gt;
# Recommend some backup solutions; rsync to flash drive, short mention of borg/borgmatic over the network.&lt;br /&gt;
# Explain how to transfer files to/from server: sftp, rsync, winscp, etc.}}&lt;br /&gt;
&lt;br /&gt;
== Security Advice ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
* Using SSH pubkey auth and disabling password login.&lt;br /&gt;
* On the dangers of Minecraft server mods/plugins.&lt;br /&gt;
* Do not rely on obscurity in the age of whole IPv4 scanning.&lt;br /&gt;
* Not using it anymore and can't be bothered to maintain it? Turn it off.&lt;br /&gt;
* On kernel updates and why they need a reboot here.&lt;br /&gt;
* Why not Docker: on software supply chains and understanding how to maintain your setup.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20684</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20684"/>
		<updated>2023-09-11T18:05:41Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
{{hint|'''For prospective editors:''' This guide was authored by [[User:CounterPillow]]. Please read the lengthy comment at the top of the article in the edit window before trying to contribute to it in any way.}}&lt;br /&gt;
&amp;lt;!--FOR EDITORS PLEASE READ AND RESPECT&lt;br /&gt;
This guide makes a lot of deliberately chosen recommendations, and does not suggest &amp;quot;alternatives&amp;quot;. This is on purpose. The author weighed the options against each other, and chose one they felt was the best fit for the situation to streamline the guide. This helps avoid needlessly bloating an already lengthy guide, and reducing user confusion. For this reason, the guide will remain in CounterPillow's user namespace.&lt;br /&gt;
&lt;br /&gt;
Please respect that this is the work of an individual and you should not tamper with their author voice. In particular:&lt;br /&gt;
- Do not suggest alternative ways of doing a thing, e.g. alternative disk formatting tools, alternative OS images, alternative firewall management systems, the blight upon humanity that is Docker, and so on.&lt;br /&gt;
- Do not alter the recommendations made, especially not in the Security Advice and Maintaining Your Server sections.&lt;br /&gt;
- Do not reorder sections or steps, the order they're done in is usually deliberately chosen to introduce new concepts as few at a time as possible.&lt;br /&gt;
What you may do is contribute fixes such as typo/grammar fixes, or illustrative diagrams for explained concepts or hardware configurations. If you think you have something to contribute beyond that, please discuss it with CounterPillow first.&lt;br /&gt;
&lt;br /&gt;
TL;DR: Don't shit up my guide. I put a lot of time into it, and it's opinionated for a reason.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
=== Permissions ===&lt;br /&gt;
&lt;br /&gt;
{{hint|'''TODO:''' Write a section explaining file ownership and permissions.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Network ==&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Fixed LAN IP Address ===&lt;br /&gt;
&lt;br /&gt;
By default, the Plebian images use NetworkManager to automatically configure the ethernet interface in such a way that it asks your router to assign it an IP address inside your local network with a protocol called DHCP. What happens is that the Quartz64 asks the router for an IP address, and the router hands it one from a pool of addresses for a limited span of time, a so-called &amp;quot;lease&amp;quot;. Dynamically configuring the IP address like this is great for quickly getting started, especially when in combination with mDNS, as everything just works automatically out of the box.&lt;br /&gt;
&lt;br /&gt;
However, a bit later on in this guide, we'll want the router to know exactly what IP address our Quartz64 Model B is going to respond to even across power cycles of either device. That's why at this point, we'll set it up to have a fixed local network address, with '''one''' of two methods.&lt;br /&gt;
&lt;br /&gt;
==== Method A: Using Reserved DHCP Leases ====&lt;br /&gt;
&lt;br /&gt;
With this method, we'll simply configure your router to always hand the same IP address out over DHCP for the hardware address (MAC) of your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
Many routers will have a web interface through which you can configure them. To find your router's IP address, type &amp;lt;code&amp;gt;ip route&amp;lt;/code&amp;gt; into your SSH session with the Quartz64 Model B and hit enter to run the command. It should output something like:&lt;br /&gt;
&lt;br /&gt;
 default via 192.168.0.1 dev end0 proto dhcp src 192.168.0.58 metric 100&lt;br /&gt;
 192.168.0.0/24 dev end0 proto kernel scope link src 192.168.0.58 metric 100&lt;br /&gt;
&lt;br /&gt;
In this case, we can see that our router is &amp;lt;code&amp;gt;192.168.0.1&amp;lt;/code&amp;gt;, as the ''default via'' route goes through it. Yours may be different.&lt;br /&gt;
&lt;br /&gt;
You can now type this router IP address into your web browser, and with any luck, you'll be greeted with a web login prompt. If you've never set a password on your router's management interface, check the bottom or sides of your device for a sticker that lists a default password.&lt;br /&gt;
&lt;br /&gt;
The precise management interface differs from router to router, so this guide can't give precise instructions. However, once logged in, there is usually a section labelled &amp;quot;DHCP&amp;quot;. In it, you may be able to configure reserved IP addresses for a specific MAC address. To find the MAC address of your Quartz64 Model B, run &amp;quot;ip link&amp;quot; on it, which will give you output like this:&lt;br /&gt;
&lt;br /&gt;
 1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
 2: end0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000&lt;br /&gt;
     link/ether 76:36:c7:c4:57:e2 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
&lt;br /&gt;
What we want here is the first colon separated address in the second link (end0), in this case &amp;lt;code&amp;gt;76:36:c7:c4:57:e2&amp;lt;/code&amp;gt;. Your router should let you enter this MAC address somewhere to reserve a specific address from the DHCP pool for it.&lt;br /&gt;
&lt;br /&gt;
==== Method B: Using A Fixed IP ====&lt;br /&gt;
&lt;br /&gt;
If Method A isn't available to you, this method should always work.&lt;br /&gt;
&lt;br /&gt;
Instead of using DHCP to request a lease for an IP address, our Quartz64 Model B can also simply assume it can communicate using a fixed IP address.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' Our fixed IP address should be ''outside'' the range of IP addresses our router hands out through DHCP, as otherwise collisions may occur! In the router web interface, look for a DHCP start address field and DHCP pool size field. An IP address either smaller than the start address (though above 0 and not colliding with the router's address) or larger than the start address plus the pool size (though below 255) will work; you may have to reduce the size of the DHCP pool if it's all maxed out though.&lt;br /&gt;
&lt;br /&gt;
For example, with a DHCP pool that starts at 192.168.0.40 and has a size of 215, we could use a fixed IP address like 192.168.0.10 without accidentally colliding with one the router hands out.&lt;br /&gt;
&lt;br /&gt;
Run the command&lt;br /&gt;
&lt;br /&gt;
 sudo nmtui&lt;br /&gt;
&lt;br /&gt;
which should open up an interactive connection editor. Use your cursor keys to highlight the entry &amp;quot;Wired connection 1&amp;quot;, and hit the right arrow key to navigate towards the &amp;quot;Edit&amp;quot; option, and hit enter.&lt;br /&gt;
&lt;br /&gt;
Navigate to &amp;quot;IPv4 CONFIGURATION&amp;quot; and hit enter on &amp;quot;&amp;amp;lt;Automatic&amp;amp;gt;&amp;quot;, then select &amp;quot;&amp;amp;lt;Manual&amp;amp;gt;&amp;quot;. Navigate to the right over the &amp;quot;&amp;amp;lt;Show&amp;amp;gt;&amp;quot;, and hit enter again. You should now be greeted by a whole host of options:&lt;br /&gt;
&lt;br /&gt;
# In &amp;quot;Addresses:&amp;quot;, hit &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and enter your chosen fixed IPv4 address followed by &amp;lt;code&amp;gt;/32&amp;lt;/code&amp;gt;, for example &amp;lt;code&amp;gt;192.168.0.21/32&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In &amp;quot;Gateway&amp;quot;, enter your router's IPv4 address.&lt;br /&gt;
# In DNS Servers, enter on &amp;quot;&amp;amp;lt;Add...&amp;amp;gt;&amp;quot; and add &amp;lt;code&amp;gt;1.1.1.1&amp;lt;/code&amp;gt;. Repeat the same process, but with &amp;lt;code&amp;gt;1.0.0.1&amp;lt;/code&amp;gt;. This will add Cloudflare's DNS servers, as we'll no longer be receiving the router's DNS servers with manual configuration.&lt;br /&gt;
# Check the box next to &amp;quot;Ignore automatically obtained DNS parameters&amp;quot; by navigating over it and hitting the space bar. This makes sure that if our router tries to give us some DNS servers anyway, we don't use them.&lt;br /&gt;
# Check &amp;quot;Require IPv4 addressing for this connection&amp;quot; in the same way.&lt;br /&gt;
# Just to be consistent, go to &amp;quot;IPv6 CONFIGURATION&amp;quot;, but this time leave it on Automatic. Hit &amp;quot;&amp;amp;lt;Show...&amp;amp;gt;&amp;quot; to expand it.&lt;br /&gt;
# Add the following two Cloudflare DNS servers: &amp;lt;code&amp;gt;2606:4700:4700::1111&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;2606:4700:4700::1001&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check &amp;quot;Ignore automatically obtained DNS parameters&amp;quot;.&lt;br /&gt;
# Navigate down to &amp;quot;&amp;amp;lt;OK&amp;amp;gt;&amp;quot; and hit enter&lt;br /&gt;
# Hit escape twice to quit nmtui&lt;br /&gt;
&lt;br /&gt;
The easiest way to make sure your new network connection settings are used is to reboot your board with&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
After logging back in, the command&lt;br /&gt;
&lt;br /&gt;
 ip addr&lt;br /&gt;
&lt;br /&gt;
should show your chosen IP under end0 after &amp;quot;inet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Configuring A Firewall ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to set up a persistent firewall that allows ports 22/tcp from LAN and 25565/tcp from anywhere.}}&lt;br /&gt;
&lt;br /&gt;
== Formatting The NVMe Drive ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to wipefs + fdisk + format the NVMe drive, make a mount point and put it in fstab.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Minecraft Java Edition Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Install build-essential and git, download https://github.com/Tiiffi/mcrcon and build and install it.&lt;br /&gt;
# Add a minecraft system user with a minecraft group that has write permissions to the minecraft directory on NVMe, add minecraft to supplemental groups for user.&lt;br /&gt;
# Install Java, download PaperMC to the Minecraft directory, symlink it to paper.jar, run it once, accept the EULA.&lt;br /&gt;
# Edit server.properties, enable rcon with a password, enable whitelist, edit motd and set difficulty.&lt;br /&gt;
# Add the systemd unit to /etc/systemd/system/, set it to auto-start, then start it.&lt;br /&gt;
# Add player to whitelist and ops through rcon.&lt;br /&gt;
# Connect to the server for the first time!}}&lt;br /&gt;
&lt;br /&gt;
== Making The Server Accessible From Outside Your Home Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain what a dynamic IP is, set up ddclient with DuckDNS, have a systemd timer for that.&lt;br /&gt;
# Explain what port forwarding is, why it's needed, and why this depends on your router. Warn not to forward port 22/tcp, only port 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Maintaining Your Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain how to start, stop, restart the Minecraft server with systemctl.&lt;br /&gt;
# Explain how to access server logs with journalctl.&lt;br /&gt;
# Explain how to keep PaperMC updated (including changing the symlink).&lt;br /&gt;
# Explain apt update and apt upgrade. Recommend unattended-upgrades.&lt;br /&gt;
# Explain Debian major releases and to keep an eye out for them.&lt;br /&gt;
# Recommend htop to see how CPU and RAM usage is looking.&lt;br /&gt;
# Recommend some backup solutions; rsync to flash drive, short mention of borg/borgmatic over the network.&lt;br /&gt;
# Explain how to transfer files to/from server: sftp, rsync, winscp, etc.}}&lt;br /&gt;
&lt;br /&gt;
== Security Advice ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
* Using SSH pubkey auth and disabling password login.&lt;br /&gt;
* On the dangers of Minecraft server mods/plugins.&lt;br /&gt;
* Do not rely on obscurity in the age of whole IPv4 scanning.&lt;br /&gt;
* Not using it anymore and can't be bothered to maintain it? Turn it off.&lt;br /&gt;
* On kernel updates and why they need a reboot here.&lt;br /&gt;
* Why not Docker: on software supply chains and understanding how to maintain your setup.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20683</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20683"/>
		<updated>2023-09-11T14:49:53Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to either use reserved DHCP leases or configure a static IP with NetworkManager, and how to set up a persistent firewall that allows ports 22/tcp and 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Formatting The NVMe Drive ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Explain how to wipefs + fdisk + format the NVMe drive, make a mountpoint and put it in fstab.}}&lt;br /&gt;
&lt;br /&gt;
== Setting Up The Minecraft Java Edition Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Install build-essential and git, download https://github.com/Tiiffi/mcrcon and build and install it.&lt;br /&gt;
# Add a minecraft system user with a minecraft group that has write permissions to the minecraft directory on NVMe, add minecraft to supplemental groups for user.&lt;br /&gt;
# Install Java, download PaperMC to the Minecraft directory, symlink it to paper.jar, run it once, accept the EULA.&lt;br /&gt;
# Edit server.properties, enable rcon with a password, enable whitelist, edit motd and set difficulty.&lt;br /&gt;
# Add the systemd unit to /etc/systemd/system/, set it to auto-start, then start it.&lt;br /&gt;
# Add player to whitelist and ops through rcon.&lt;br /&gt;
# Connect to the server for the first time!}}&lt;br /&gt;
&lt;br /&gt;
== Making The Server Accessible From Outside Your Home Network ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain what a dynamic IP is, set up ddclient with DuckDNS, have a systemd timer for that.&lt;br /&gt;
# Explain what port forwarding is, why it's needed, and why this depends on your router. Warn not to forward port 22/tcp, only port 25565/tcp.}}&lt;br /&gt;
&lt;br /&gt;
== Maintaining Your Server ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
# Explain how to start, stop, restart the Minecraft server with systemctl.&lt;br /&gt;
# Explain how to access server logs with journalctl.&lt;br /&gt;
# Explain how to keep PaperMC updated (including changing the symlink).&lt;br /&gt;
# Explain apt update and apt upgrade. Recommend unattended-upgrades.&lt;br /&gt;
# Explain Debian major releases and to keep an eye out for them.&lt;br /&gt;
# Recommend htop to see how CPU and RAM usage is looking.&lt;br /&gt;
# Recommend some backup solutions; rsync to flash drive, short mention of borg/borgmatic over the network.&lt;br /&gt;
# Explain how to transfer files to/from server: sftp, rsync, winscp, etc.}}&lt;br /&gt;
&lt;br /&gt;
== Security Advice ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:'''&lt;br /&gt;
* Using SSH pubkey auth and disabling password login.&lt;br /&gt;
* On the dangers of Minecraft server mods/plugins.&lt;br /&gt;
* Do not rely on obscurity in the age of whole IPv4 scanning.&lt;br /&gt;
* Not using it anymore and can't be bothered to maintain it? Turn it off.&lt;br /&gt;
* On kernel updates and why they need a reboot here.&lt;br /&gt;
* Why not Docker: on software supply chains and understanding how to maintain your setup.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20682</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20682"/>
		<updated>2023-09-11T13:04:27Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20681</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20681"/>
		<updated>2023-09-11T12:54:57Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' If you see a heartbeat pattern but the board never gets a DHCP lease, please follow the steps in [[#Is My Ethernet Broken?]].}}&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
To hook up UART serial debug, connect your Woodpecker, ideally with a decent USB extension cord, to your computer's USB port. Make sure the yellow jumper is set to 3.3V.&lt;br /&gt;
&lt;br /&gt;
Connect the GND pin of the Woodpecker to a GND pin of your Quartz64 Model B, which are coloured as black pins. A good one to use is pin number 6 (the one after the red pin 2 and pin 4), as it's right next to the other UART pins we'll need.&lt;br /&gt;
&lt;br /&gt;
Next, hook up the Woodpecker's RXD pin to the Quartz64 Model B's pin number 8, which is next to (lengthwise down the row of pins) the aforementioned pin number 6, coloured in green.&lt;br /&gt;
&lt;br /&gt;
Finally, hook up the Woodpecker's TXD pin to the QUartz64 Model B's pin number 10, which is down yet another pin in the same direction, also coloured in green.&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a diagram showing the connections here.}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Windows ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Add a guide on how to install, configure and use PuTTY}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On Linux ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here.}}&lt;br /&gt;
{{note|'''Warning:''' Some poorly written software, like &amp;lt;code&amp;gt;gpsd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;brltty&amp;lt;/code&amp;gt;, will randomly and happily claim and mess with any USB-to-serial adapters on the system, especially when you least want them to. Use &amp;lt;code&amp;gt;sudo lsof /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to determine whether this is the case for you if you run into any trouble with the following steps.}}&lt;br /&gt;
&lt;br /&gt;
First, list all the available USB-to-Serial adapters on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/ttyUSB*&lt;br /&gt;
&lt;br /&gt;
If you only have one plugged in, this should probably only return &amp;lt;code&amp;gt;/dev/ttyUSB0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Next, you have some choice of serial terminal to use: &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; (likely already installed), &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;picocom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For screen, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backspace (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
For minicom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 minicom -D /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000 -8&lt;br /&gt;
&lt;br /&gt;
You can quit minicom by hitting Ctrl+a, then hit q.&lt;br /&gt;
&lt;br /&gt;
For picocom, (replacing &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; with the number of your serial adapter) use:&lt;br /&gt;
&lt;br /&gt;
 picocom /dev/ttyUSB&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; -b 1500000&lt;br /&gt;
&lt;br /&gt;
You can quit picocom by hitting Ctrl+a, then hit Ctrl+q.&lt;br /&gt;
&lt;br /&gt;
==== Accessing The Serial Console On macOS ====&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate the serial settings here, and validate the device name.}}&lt;br /&gt;
&lt;br /&gt;
Open up a terminal, then list all the available serial devices on your system:&lt;br /&gt;
&lt;br /&gt;
 ls /dev/tty.*&lt;br /&gt;
&lt;br /&gt;
This will likely return something starting with &amp;lt;code&amp;gt;/dev/tty.usbserial-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now we can open this serial port with &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt; as follows, replacing &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; with the adapter name from the previous step:&lt;br /&gt;
&lt;br /&gt;
 screen /dev/tty.usbserial-&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; 1500000 cs8 -cstop&lt;br /&gt;
&lt;br /&gt;
You can quit screen by hitting Ctrl+a, then hit backspace (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) and confirm with y.&lt;br /&gt;
&lt;br /&gt;
==== Using The Serial Console ====&lt;br /&gt;
&lt;br /&gt;
If you just hooked it up to a running system, you're unlikely to see any output. You will only be able to see messages from the point on when you've opened up your serial communication program.&lt;br /&gt;
&lt;br /&gt;
If your board is doing the heartbeat pattern (i.e., it booted, but you're unable to log in over the network) you can hit Enter to (hopefully) make it show you a login prompt. If the login prompt is your first time communicating with the board, use username ''pleb'' and password ''pleb''. From then on, the serial terminal should work like any normal shell you'd have on the system, modulo some possible weirdness with special escape sequences making things a little more prone to drawing in broken ways.&lt;br /&gt;
&lt;br /&gt;
If your board is not doing the heartbeat pattern, hit the reset button (small white button on side of board, the one closer towards the antenna mount) and you should be getting serial output from a fresh boot.&lt;br /&gt;
&lt;br /&gt;
If you still don't get any output, make sure that you flashed the microSD card correctly, and make sure the TXD and RXD lines aren't the wrong way around. If you still don't get any output after that, your Quartz64 Model B may have defective level shifting transistors on the serial lines, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Is My Ethernet Broken? ===&lt;br /&gt;
&lt;br /&gt;
Pine Store has sold a number of boards where the ethernet PHY chip was seemingly broken. If your board exhibits the heartbeat LED pattern but never shows up on the network, either hook up a monitor and a keyboard or use your Woodpecker to hook up to serial (see [[#Connecting UART]]) and try to log in.&lt;br /&gt;
&lt;br /&gt;
After logging in, type:&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg | grep rk_gmac-dwmac&lt;br /&gt;
&lt;br /&gt;
If the output contains any lines like&lt;br /&gt;
&lt;br /&gt;
 rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Cannot attach to PHY (error: -22)&lt;br /&gt;
&lt;br /&gt;
then your hardware is defective, and you should open [https://support.pine64.org/ a ticket with Pine Store] immediately and ask for a replacement or refund.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20674</id>
		<title>Quartz64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20674"/>
		<updated>2023-09-10T06:38:55Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* No GPU Acceleration with Debian &amp;quot;Bullseye&amp;quot; Userland */ Bookworm is no longer Testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Quartz64modelb.png|400px|thumb|right|The Quartz64 Model B]]&lt;br /&gt;
&lt;br /&gt;
The '''Quartz64''' is the most recent Single Board Computer offering from PINE64, with Model A initially released in June of 2021 and Model B in May of 2022. It is powered by a Rockchip RK3566 Quad-Core ARM Cortex A55 64-Bit Processor with a MALI G-52 GPU.&lt;br /&gt;
&lt;br /&gt;
Key features include a PCIe x4 open ended slot (model A) or m.2 (model B) using one Gen2 lane electrically, and the use of LPDDR4 RAM.&lt;br /&gt;
&lt;br /&gt;
The Quartz64 has three LPDDR4 system memory options: 2GB, 4GB or 8GB. For booting, there is an eMMC module socket (supporting up to 128GB) and microSD slot, as well as a footprint to solder on an SPI flash chip. The board is equipped with HDMI, 1x USB 3.0 type A Host, 3x USB 2.0 Host, Gigabit Ethernet, SATA (model A), GPIO Bus, MiPi DSI interface, e-ink interface (model A), eDP interface (model A), touch Panel interface (model A), MiPi CSI interface, as well as many other device interfaces such as UART, SPI, I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C, for makers to integrate with sensors and other peripherals. Many different Operating Systems (OS) are freely available from the open source community, such as Linux (Ubuntu, Debian, Arch), BSD, and Android.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
Under [[Quartz64 Software Releases]] you will find a complete list of currently supported operating system images, which work with the Quartz64, as well as other related software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
=== Flashing the device ===&lt;br /&gt;
&lt;br /&gt;
Natively the board only supports booting the platform firmware from SPI, the eMMC or a microSD card, see [[#Boot order|boot order]]. The platform firmware loaded from there (U-Boot, EDK2, ...) may then allow loading kernels from additional storage mediums or even the network, and they will have their own boot order.&lt;br /&gt;
&lt;br /&gt;
The board can be booted by flashing your chosen operating system to a microSD card using another device and inserting the microSD card into the Quartz64, see the article [[Getting started]]. Flashing the eMMC is possible by booting an operating system from the microSD card and overwriting the eMMC from within the booted operating system, or by using [https://pine64.com/product/usb-adapter-for-emmc-module/ the USB eMMC adapter].&lt;br /&gt;
&lt;br /&gt;
=== Boot order ===&lt;br /&gt;
&lt;br /&gt;
The hardware boot order of the Quartz64 is:&lt;br /&gt;
&lt;br /&gt;
# SPI NOR flash&lt;br /&gt;
# SPI NAND flash&lt;br /&gt;
# eMMC&lt;br /&gt;
# microSD card&lt;br /&gt;
&lt;br /&gt;
== SoC and Memory Specifications ==&lt;br /&gt;
&lt;br /&gt;
[[File:RK3566_icon.png|right]]&lt;br /&gt;
&lt;br /&gt;
* Based on [https://www.rock-chips.com/a/en/products/RK35_Series/2021/0113/1274.html Rockchip RK3566]&lt;br /&gt;
&lt;br /&gt;
=== CPU Architecture ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/processors/cortex-a/cortex-a55 Quad-core ARM Cortex-A55@1.8GHz]&lt;br /&gt;
* AArch32 for full backwards compatibility with ARMv7&lt;br /&gt;
* ARM Neon Advanced SIMD (single instruction, multiple data) support for accelerated media and signal processing computation&lt;br /&gt;
* Includes VFP hardware to support single and double-precision operations&lt;br /&gt;
* ARMv8 Cryptography Extensions&lt;br /&gt;
* Integrated 32KB L1 instruction cache and 32KB L1 data cache per core&lt;br /&gt;
* 512KB unified system L3 cache&lt;br /&gt;
* [https://developer.arm.com/ip-products/security-ip/trustzone TrustZone] technology support&lt;br /&gt;
* [https://www.cnx-software.com/2020/12/01/rockchip-rk3568-processor-to-power-edge-computing-and-nvr-applications 22nm process, believed to be FD-SOI]&lt;br /&gt;
&lt;br /&gt;
=== GPU (Graphics Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/graphics-and-multimedia/mali-gpus/mali-g52-gpu Mali-G52 2EE Bifrost GPU@800MHz]&lt;br /&gt;
* 4x Multi-Sampling Anti-Aliasing (MSAA) with minimal performance drop &lt;br /&gt;
* 128KB L2 Cache configurations&lt;br /&gt;
* Supports OpenGL ES 1.1, 2.0, and 3.2&lt;br /&gt;
* Supports Vulkan 1.0 and 1.1&lt;br /&gt;
* Supports OpenCL 2.0 Full Profile&lt;br /&gt;
* Supports 1600 Mpix/s fill rate when at 800MHz clock frequency&lt;br /&gt;
* Supports 38.4 GLOP/s when at 800MHz clock frequency   &lt;br /&gt;
&lt;br /&gt;
=== NPU (Neural Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* Neural network acceleration engine with processing performance of up to 0.8 TOPS&lt;br /&gt;
* Supports integer 8 and integer 16 convolution operations&lt;br /&gt;
* Supports the following deep learning frameworks: TensorFlow, TF-lite, Pytorch, Caffe, ONNX, MXNet, Keras, Darknet&lt;br /&gt;
&lt;br /&gt;
=== System Memory ===&lt;br /&gt;
&lt;br /&gt;
* RAM Memory Variants: 2GB (SOQuartz only), 4GB, 8GB LPDDR4.&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
* 10/100/1000Mbps Ethernet&lt;br /&gt;
** Easily sustains &amp;gt;910 Mbit/s in a &amp;lt;code&amp;gt;--bidir&amp;lt;/code&amp;gt; (i.e. sending and receiving at the same time) iperf3 TCP test.&lt;br /&gt;
* Wi-Fi 802.11 b/g/n/ac with Bluetooth 5.0 (optional on model A, built in on model B)&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
&lt;br /&gt;
* microSD - bootable, supports SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB&lt;br /&gt;
** Model A: 2 USB 2.0 host ports, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
** Model B: 1 USB 2.0 host port, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
* one native SATA 3.0 6Gb/s Port (only on model A, shared with USB 3.0 host port) (removed in newer revisions due to electrical signalling issues it caused)&lt;br /&gt;
* optional eMMC module from 8GB up to 128GB&lt;br /&gt;
* 64 Mbit (8 MByte) SPI flash (Model B only), part number '''25Q64DWZPIG''' in the schematic&lt;br /&gt;
&lt;br /&gt;
==== eMMC Speeds ====&lt;br /&gt;
&lt;br /&gt;
On a 64 GB eMMC module:&lt;br /&gt;
&lt;br /&gt;
  $ sudo hdparm -tT /dev/mmcblk1 &lt;br /&gt;
  &lt;br /&gt;
  /dev/mmcblk1:&lt;br /&gt;
   Timing cached reads:   2368 MB in  2.00 seconds = 1184.46 MB/sec&lt;br /&gt;
   Timing buffered disk reads: 452 MB in  3.01 seconds = 149.98 MB/sec&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* HDMI&lt;br /&gt;
* eDP - 4 lanes of 2.7Gbps, up to 2560x1600@60Hz (only on model A)&lt;br /&gt;
* DSI - Display Serial Interface, 4 lanes MiPi, up to 1440P on model A, 2 lanes MiPi, up to 1080p on model B &lt;br /&gt;
* CSI - CMOS Camera Interface, 4 lanes MiPi up to 8 mega pixel on model A, 2 lanes MiPi up to 5 mega pixel on model B &lt;br /&gt;
* TP - Touch Panel Port, SPI with interrupt on model A&lt;br /&gt;
* RTC - Real Time Clock Battery Connector&lt;br /&gt;
* VBAT - Lithium Battery Connector with temperature sensor input on model A&lt;br /&gt;
* Wi-Fi/BT Module Header - SDIO 3.0 and UART on model A, built-in Wi-Fi/BT Module on model B&lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header on model B, 2x10 pins GPO header on model A&lt;br /&gt;
* PCIe x4 open ended slot on model A, m.2 slot on model B, one Gen2 lane due to SoC constraints&lt;br /&gt;
** On Model A, the slot provides 10W of power for the 3.3V supply and however much power your 12V input power supply provides on the 12V supply&lt;br /&gt;
&lt;br /&gt;
The PCIe implementation on the RK3566 is much more compatible with a wide range of devices compared to the one on the RK3399 used on the ROCKPro64. This means a lot more devices should work (excluding dGPUs due to a lack of cache snooping ability).&lt;br /&gt;
&lt;br /&gt;
==== Combo PHYs ====&lt;br /&gt;
&lt;br /&gt;
[[File:rk3566 phy.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Several of the I/O options on the RK3566 used in the Quartz64 are using the same I/O lines, meaning that they cannot be used at the same time. The above diagram illustrates how they are connected.&lt;br /&gt;
&lt;br /&gt;
In particular, USB 3.0 and the SATA connector on the board are mutually exclusive, and the PCI-e 2.0 lane can be reconfigured into a second SATA port, though an adapter cable needs to be fashioned for this to be useful.&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model A) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SDA_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SCL_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| CPU_REFCLK_OUT&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MOSI_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_TX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MISO_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_RX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CLK_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CS0_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| SPDIF_OUT &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;c&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 3.3V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;can be a PWM pin&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;pulled high to 3.3V through 2.2kOhm resistor&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;low-pass filtered with cutoff of 220 MHz&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: Page 28 of [[File:Quartz64_model-A_schematic_v1.0_20201215.pdf|the board schematics]].&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model B) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
Interesting alternate pin configurations are listed in [brackets].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SDA_M0]'' GPIO1_A0_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SCL_M0]'' GPIO1_A1_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_C4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CS0_M1]'' GPIO3_A1_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A3_3V3 ''[I2S3_SCLK_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_MCLK_M0]'' GPIO3_A2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B2_3V3 &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C5_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 21&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 22&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C1_3V3 ''[SPI1_MOSI_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 23&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 24&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_C6_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 25&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 26&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_D1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C4_SDA_M0&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 27&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 28&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| I2C4_SCL_M0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 29&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 30&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 31&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 32&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C2_3V3 ''[SPI1_MISO_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CLK_M1]'' GPIO3_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 33&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 34&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_LRCK_M0]'' GPIO3_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 35&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 36&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A7_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPDIF_TX_M0]'' GPIO1_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 37&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 38&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A6_3V3 ''[I2S3_SDI_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 39&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 40&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A5_3V3 ''[I2S3_SDO_M0]''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Source: Page 24 of [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf the board schematics].&lt;br /&gt;
&lt;br /&gt;
== Quartz64 Board Information, Schematics, and Certifications ==&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;A&amp;quot; Baseboard Dimensions: 133mm x 80mm x 19mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 12V @ 3A 5.5mmOD/2.1mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_schematic_v2.0_20210427.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic ver 2.0 20210427 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_V2.0_connector_placement.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
&lt;br /&gt;
Certifications:&lt;br /&gt;
&lt;br /&gt;
* Disclaimer: Please note that PINE64 SBC is not a &amp;quot;final&amp;quot; product and in general certification is not necessary. However, PINE64 still submit the SBC for FCC and CE certification and obtain the certificates to proof that SBC board is capable on passing the testing. Please note a final commercial product needs to performs its owns testing and obtains its owns certificates.&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20CE%20certification-S21051101701001.pdf Quartz64 model-A CE Certificate]&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20FCC%20certification-S21051101702001.pdf Quartz64 model-A FCC Certificate]&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;B&amp;quot; Baseboard Dimensions: 85mm x 56mm x 18.8mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 5V @ 3A 3.5mmOD/1.35mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic ver 1.3 20220124 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_PCB_Components_Placement-V1.2_20211014.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
* Please note that v1.2 and V1.3 schematic and component placement are identical, just some component value changed.&lt;br /&gt;
* Note: Model B uses a Molex PicoBlade compatible connector for the RTC battery. The Pine64 Backup Battery Holders come with a JST PH type connector. To use the Pine64 RTC Backup Battery Holder, the connector on the battery holder will need to be modified with a PicoBlade type connector.&lt;br /&gt;
&lt;br /&gt;
== Datasheets for Components and Peripherals ==&lt;br /&gt;
&lt;br /&gt;
Rockchip RK3566 SoC information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Rockchip%20RK3566%20Datasheet%20V1.0-20201210.pdf Rockchip RK3566 ver 1.0 datasheet, already got release permission from Rockchip]&lt;br /&gt;
* [https://opensource.rock-chips.com/images/2/26/Rockchip_RK3568_TRM_Part1_V1.3-20220930P.PDF Rockchip RK3566 and RK3568 TRM (Technical Reference Manual)]&lt;br /&gt;
&lt;br /&gt;
Rockchip PMU (Power Management Unit) Information:&lt;br /&gt;
* [https://www.rockchip.fr/RK817%20datasheet%20V1.01.pdf Rockchip RK817 ver 1.01 datasheet for Quartz64 model A]&lt;br /&gt;
* [https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf Rockchip RK809 ver 1.01 datasheet for Quartz64 model B and SOQuartz]&lt;br /&gt;
&lt;br /&gt;
LPDDR4 (200 Balls) SDRAM:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/SM512M32Z01MD2BNP(200BALL).pdf Micron LPDDR4 Mobile LPDDR4 Datasheet]&lt;br /&gt;
&lt;br /&gt;
eMMC information:&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/PINE64_eMMC_Module_20170719.pdf PINE64 eMMC module schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/usb%20emmc%20module%20adapter%20v2.pdf PINE64 USB adapter for eMMC module V2 schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/USB%20adapter%20for%20eMMC%20module%20PCB.tar PINE64 USB adapter for eMMC module PCB in JPEG]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/E-00517%20FORESEE_eMMC_NCEMAM8B-16G%20SPEC.pdf 16GB Foresee eMMC Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/SDINADF4-16-128GB-H%20data%20sheet%20v1.13.pdf 32GB/64GB/128GB SanDisk eMMC Datasheet]&lt;br /&gt;
&lt;br /&gt;
SPI NOR Flash information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/w25q128jv%20spi%20revc%2011162016.pdf WinBond 128Mb SPI Flash Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GD25Q128C-Rev2.5.pdf GigaDevice 128Mb SPI Flash Datasheet]&lt;br /&gt;
&lt;br /&gt;
E-ink Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-754-V3_ES103TC1%20Specification%20V3.0(Signed)-20190702.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Flex Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-828-V1_ED103TC2%20Formal%20Spec%20V1.0_20190514.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Glass Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/PineNote/TI%20PMU-TPS651851.pdf TPS65185x PMIC for E-Ink Enabled Electronic Paper Display Datasheet]&lt;br /&gt;
&lt;br /&gt;
LCD Touch Screen Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/FY07024DI26A30-D_feiyang_LCD_panel.pdf 7.0&amp;quot; 1024x600 TFT-LCD Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/HK70DR2459-PG-V01.pdf Touch Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GT911%20Capacitive%20Touch%20Controller%20Datasheet.pdf GOODiX GT911 5-Point Capacitive Touch Controller Datasheet]&lt;br /&gt;
&lt;br /&gt;
Ethernet PHY information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf Realtek RTL8211 10/100/1000M Ethernet Transceiver]&lt;br /&gt;
&lt;br /&gt;
Wi-Fi/BT module info:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/AW-CM256SM_DS_DF_V1.9_STD.pdf Azurewave CM256SM 11AC Wi-Fi + Bluetooth5.0 Datasheet]&lt;br /&gt;
&lt;br /&gt;
IR LED:&lt;br /&gt;
* [https://media.digikey.com/pdf/Data%20Sheets/Everlight%20PDFs/IRM-36xx_Series.pdf IRM-3638 Datasheet]&lt;br /&gt;
&lt;br /&gt;
Enclosure information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/playbox_enclosure_20160426.stp Playbox Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/ABS_enclosure_20160426.stp ABS Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/pine64%20Die%20Cast%20casing-final.jpg Outdoor Aluminum Cast Dust-proof IP67 Enclosure Drawing]&lt;br /&gt;
* [https://www.printables.com/model/269572-pine-quartz-64-a-full-case 3D Printable Enclosure for Model A]&lt;br /&gt;
* [https://www.printables.com/model/269575-pine-quartz-64-a-open-frame Open Frame for Model A]&lt;br /&gt;
&lt;br /&gt;
Connector information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/ePH.pdf 2.0mm PH Type connector specification use in Lithium Battery (VBAT) port (Model A)]&lt;br /&gt;
* [https://www.molex.com/pdm_docs/sd/533980271_sd.pdf 1.25mm Picoblade Type connector specification used in RTC Battery port (Model B)]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/0.5FPC%20Front%20Open%20Connector%20H=1.5.pdf 0.5mm Pitch cover type FPC connector specification use in DSI port, TP port and CSI port]&lt;br /&gt;
&lt;br /&gt;
== Development efforts ==&lt;br /&gt;
&lt;br /&gt;
{{SeeMainArticle|Quartz64 Development}}&lt;br /&gt;
&lt;br /&gt;
Information and resources of the ongoing development effort for the Quartz64 can be found on the [[Quartz64 Development]] page, where the current status of various board functions can be found, and whether they have landed in upstream.&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.com/pine64-org/quartz-bsp Quartz64 BSP Gitlab Page]&lt;br /&gt;
&lt;br /&gt;
== Enclosures ==&lt;br /&gt;
&lt;br /&gt;
Note: Please expand this section with more cases known to work.&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
All enclosures that fit the ROCKPro64 should fit the Quartz64 Model &amp;quot;A&amp;quot;, as the I/O has been laid out the same on purpose.&lt;br /&gt;
&lt;br /&gt;
* [[Model A Acrylic Open Enclosure]] - but see the troubleshooting section below.&lt;br /&gt;
* [[Quartz64 Premium Aluminium Case|RockPro64 Premium Aluminium Case]]&lt;br /&gt;
* [[ROCKPro64#3D printable ITX mounting brackets]] (Not an enclosure but allows to mount the board in an ATX/ITX case)&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* [[Model B Acrylic Open Enclosure]]&lt;br /&gt;
* the ROCK64 aluminium enclosure '''does not''' work, as the DC input jack is placed differently&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Stability/Boot Issues With Missing Battery Shunt ===&lt;br /&gt;
&lt;br /&gt;
If there is no battery plugged into the board, the jumper labelled &amp;quot;ON/OFF_BATT&amp;quot; must be in place. If this is set wrong, stability issues such as failures to boot will occur. '''This affects model A only'''&lt;br /&gt;
&lt;br /&gt;
=== No Ethernet Connectivity ===&lt;br /&gt;
&lt;br /&gt;
Make sure the kernel is built with &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. Building it as a module (&amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;) and then relying on module auto-loading is unlikely to work, because if the generic PHY driver is built in it will bind to the PHY first, unless you include the motorcomm module in your initramfs.&lt;br /&gt;
&lt;br /&gt;
Note: Starting with [https://salsa.debian.org/kernel-team/linux/-/merge_requests/551 Debian's &amp;lt;code&amp;gt;6.1~rc3-1~exp1&amp;lt;/code&amp;gt; kernel] the module is included, but set to &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; and I (Diederik) have verified that it gets included in the initramfs and '''works''' on Model-A and Model-B with the [[Quartz64#Plebian]] images.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Model A&amp;quot; Acrylic Case Doesn't Fit ===&lt;br /&gt;
&lt;br /&gt;
The Quartz64 does not really fit onto the bottom plate of the [[Model A Acrylic Open Enclosure]]. This is because the &amp;quot;Mic&amp;quot; connector at the bottom of the board interferes with one of the posts. A workaround is to find out which post that is (you have a 50% chance of guessing it right, accounting for rotating the board) and then filing away the corner of the post pointing inwards by a few millimeters.&lt;br /&gt;
&lt;br /&gt;
[[File:Quartz64-audio-jack-spacer-issue.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
An alternate solution may be to place plastic spacers with a smaller outer diameter in between the acrylic bottom plate posts and the SBC board.&lt;br /&gt;
&lt;br /&gt;
=== No GPU Acceleration with Debian &amp;quot;Bullseye&amp;quot; Userland ===&lt;br /&gt;
&lt;br /&gt;
Debian Bullseye ships a Mesa version that is too old to contain the required patches for the RK356x SoC's GPU. Upgrade to Bookworm.&lt;br /&gt;
&lt;br /&gt;
=== Wireless Connectivity Doesn't Work ===&lt;br /&gt;
&lt;br /&gt;
ROCKPro64 wireless module may have CYW43455 or CYW43456 chips on board (not sure if this is the same for Quartz64 model B). Both chips are supported by &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt; Wi-Fi driver and &amp;lt;code&amp;gt;btbcm&amp;lt;/code&amp;gt; Bluetooth driver. &lt;br /&gt;
&lt;br /&gt;
For CYW43455 drivers attempt to load &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43455-sdio.bin&amp;lt;/code&amp;gt; for Wi-Fi and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C0.hcd&amp;lt;/code&amp;gt; for Bluetooth. Corresponding firmware files for CYW43456 are &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43456-sdio.bin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C5.hcd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On Manjaro firmware files for both Bluetooth and Wi-Fi on CYW43456 on are provided by &amp;lt;code&amp;gt;ap6256-firmware&amp;lt;/code&amp;gt; package (&amp;lt;code&amp;gt;pacman -S ap6256-firmware&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
However for CYW43455 wi-fi firmware is in the &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package and bluetooth is in the &amp;lt;code&amp;gt;firmware-raspberrypi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;pacman -S linux-firmware firmware-raspberrypi&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package is missing device specific symlinks for quartz64-a. To create them execute:&lt;br /&gt;
&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.bin /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.bin&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.AW-CM256SM.txt /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt &lt;br /&gt;
&lt;br /&gt;
As of 2022-10-19 device tree in mainline kernel for Quartz64 model A has wrong configuration for the Bluetooth driver. [https://patchwork.kernel.org/project/linux-rockchip/patch/20220926125350.64783-1-leo@nabam.net/ Patch] is submitted to the LKML and accepted and included upstream in 6.1-rc7. It's possible to modify dtb file provided by the current kernel using device tree compiler to enable Bluetooth or perform &amp;lt;code&amp;gt;make dtbs&amp;lt;/code&amp;gt; in the patched kernel tree to get updated dtb file (&amp;lt;code&amp;gt;arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dtb&amp;lt;/code&amp;gt;). Issue manifests itself with following errors in `dmesg`:&lt;br /&gt;
&lt;br /&gt;
  command 0x0c03 tx timeout&lt;br /&gt;
  Bluetooth: hci0: BCM: Reset failed (-110)&lt;br /&gt;
&lt;br /&gt;
== How-To ==&lt;br /&gt;
&lt;br /&gt;
=== Connect Debug UART ===&lt;br /&gt;
&lt;br /&gt;
The easiest way to get debug output is to connect a 3.3V 1.5mbaud capable UART adapter to the board.&lt;br /&gt;
&lt;br /&gt;
To connect it, connect the ground lead to pin 6, and the RX/TX leads to pins 8 and 10 (consider swapping them if you get no output, things are often mislabeled). These pins are &amp;quot;UART2&amp;quot; in the above GPIO table.&lt;br /&gt;
&lt;br /&gt;
Open a serial terminal at 1500000 bauds, e.g.&lt;br /&gt;
&lt;br /&gt;
 $ picocom -b 1500000 /dev/ttyUSB0&lt;br /&gt;
&lt;br /&gt;
=== Disable Heartbeat LED (Linux) ===&lt;br /&gt;
&lt;br /&gt;
The flashing LED is called the &amp;quot;heartbeat LED&amp;quot;, it blinks in a heart rhythm like fashion once the kernel is running. To disable it, you can run&lt;br /&gt;
&lt;br /&gt;
 # echo none &amp;gt; /sys/class/leds/user-led/trigger&lt;br /&gt;
&lt;br /&gt;
On model A LED device is called &amp;quot;diy-led&amp;quot;, not &amp;quot;user-led&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On a system with systemd, you can do this as soon as the system is ready to be logged in with a systemd unit like this:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Turn off heartbeat LED&lt;br /&gt;
 Wants=multi-user.target&lt;br /&gt;
 After=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 ExecStart=sh -c 'echo none &amp;gt; /sys/class/leds/user-led/trigger'&lt;br /&gt;
&lt;br /&gt;
Place it in ''/etc/systemd/system/user-led.service'', and run&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable user-led.service&lt;br /&gt;
&lt;br /&gt;
Upon rebooting, you will now notice that the heartbeat LED will blink during boot-up, but stops blinking as soon as the multi-user target is reached (i.e. the user can log in).&lt;br /&gt;
&lt;br /&gt;
=== SATA on model A ===&lt;br /&gt;
&lt;br /&gt;
On model A USB 3.0 and SATA ports are using the same I/O line and can't be used simultaneously. By default USB 3.0 is enabled in Linux device tree and SATA is disabled. FDT modifications are required to turn SATA on. &lt;br /&gt;
&lt;br /&gt;
Following script is tested on Manjaro but should work on the other distributions with minimal changes. Device tree compiler package usually provides fdtput command (on Manjaro run: &amp;lt;code&amp;gt;pacman -S dtc&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 # cp /boot/dtbs/rockchip/rk3566-quartz64-a.dtb /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /usb@fd000000 status disabled&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /sata@fc400000 status okay&lt;br /&gt;
 # sed -i 's#^FDT /dtbs/rockchip/rk3566-quartz64-a.dtb$#FDT /dtbs/rockchip/rk3566-quartz64-a-sata.dtb#' /boot/extlinux/extlinux.conf&lt;br /&gt;
 # systemctl reboot&lt;br /&gt;
&lt;br /&gt;
=== Using a PCF8574 on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A using a PCF8574]].&lt;br /&gt;
&lt;br /&gt;
=== Using a battery on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A Using a battery]].&lt;br /&gt;
&lt;br /&gt;
=== Connecting a MIPI-DSI display ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 connecting a MIPI-DSI display]].&lt;br /&gt;
&lt;br /&gt;
=== Building Mainline U-Boot ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Building U-Boot]].&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== Do I Need A Fan/What Heatsink Do I Need? ===&lt;br /&gt;
&lt;br /&gt;
You don't need a fan. The [https://pine64.com/product/rockpro64-20mm-mid-profile-heatsink/ 20mm medium heatsink for Model A is plenty enough]. For Model B, the [https://pine64.com/product/small-fan-type-heatsink/ fan type heatsink] will do fine.&lt;br /&gt;
&lt;br /&gt;
=== Can This Run A Minecraft Server? ===&lt;br /&gt;
&lt;br /&gt;
Yes! Sort of. Testing on an 8GB Model A with PaperMC, [[User:CounterPillow]] was able to out-row world generation in a boat with just one player online, but aside from the slow world gen (which can be pre-generated) the server handled things like TNT explosions and mobs fine. It'll probably do okay with 1-3 players.&lt;br /&gt;
&lt;br /&gt;
=== Do I Need The 5A Power Supply For Model A? ===&lt;br /&gt;
&lt;br /&gt;
You only need the 5A power supply for Model A if you plan on connecting hard disk drives to the 12V header on the board.&lt;br /&gt;
&lt;br /&gt;
=== How Much Power Does It Consume? ===&lt;br /&gt;
&lt;br /&gt;
For Model B, it's &amp;lt;2W in idle (powertop tunables not set), and &amp;lt;5W under full CPU load (&amp;lt;code&amp;gt;stress-ng -c4&amp;lt;/code&amp;gt;). Model A will be similar as it's the same SoC.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20673</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20673"/>
		<updated>2023-09-10T05:40:33Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
* &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;: Download a file from the internet&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;wget https://plebian.org/img/plebian-logo-white.svg&amp;lt;/code&amp;gt; downloads Plebian's logo from its website.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Editing Text Files ===&lt;br /&gt;
&lt;br /&gt;
For the rest of the guide, we'll be spending significant amounts of time editing text files. That's why it's good to familiarise yourself with a terminal text editor. The simplest to use of these is &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 nano &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt&lt;br /&gt;
&lt;br /&gt;
opens up nano, writing to the file &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;.txt. We can save to the file with Ctrl+o, and quit nano with Ctrl+x.&lt;br /&gt;
&lt;br /&gt;
A more advanced option is &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt;. You can run a lengthy interactive guide to using vim with the command &amp;lt;code&amp;gt;vimtutor&amp;lt;/code&amp;gt;. Learning vim is a whole can of worms in of itself, so it's best to stick to nano if you're unsure.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Write this.}}&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20672</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20672"/>
		<updated>2023-09-10T05:26:02Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Getting Our Feet Wet ==&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
=== Where Are We? ===&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
=== Creating Directories ===&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Changing The Current Working Directory ===&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
=== Listing Directories ===&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Creating (Empty) Files ===&lt;br /&gt;
&lt;br /&gt;
To create empty files, we can use the &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new empty file named &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' What &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; actually does is update a file's last-modified time, and create the file if it doesn't already exist. Running &amp;lt;code&amp;gt;touch&amp;lt;/code&amp;gt; on an already existing time would only update its last-modified time, and not alter the file contents in any way.}}&lt;br /&gt;
&lt;br /&gt;
=== Deleting Things ===&lt;br /&gt;
&lt;br /&gt;
To delete an empty directory, we can use the &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 rmdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would remove the &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; directory, but only if it's empty.&lt;br /&gt;
&lt;br /&gt;
To remove a file, we can use the &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
 rm &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
This would create a file called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;, list the current working directory to show you that it's there, then remove the file, and then list the current working directory again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; can also remove things recursively, in this case it's able to remove directories. Be aware though that there is '''no undo''', if you &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; something near and dear to you, you better have had backups. In the following example, we'll create a directory, then create a file in it, then delete the directory recursively by passing &amp;lt;code&amp;gt;rm&amp;lt;/code&amp;gt; the &amp;lt;code&amp;gt;-r&amp;lt;/code&amp;gt; argument:&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 touch &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;bar&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 rm -r &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
=== More Useful Commands ===&lt;br /&gt;
&lt;br /&gt;
A short list of handy commands to know:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt;: Copy a file (or, when recursive, a whole directory)&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp foo bar&amp;lt;/code&amp;gt; copies file &amp;quot;foo&amp;quot; to &amp;quot;bar&amp;quot;.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;cp -R foo bar&amp;lt;/code&amp;gt; recursively copies the directory &amp;quot;foo&amp;quot; and its contents to &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;mv&amp;lt;/code&amp;gt;: Move/Rename a file or directory&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;mv foo bar&amp;lt;/code&amp;gt; moves a file or directory &amp;quot;foo&amp;quot; to its new name &amp;quot;bar&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt;: Show manual page for a command.&lt;br /&gt;
** '''Example:''' &amp;lt;code&amp;gt;man ls&amp;lt;/code&amp;gt; shows the manual page for the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command.&lt;br /&gt;
** Use this whenever you're not sure about a command's invocation. It'll be more accurate to your situation than what an internet search will tell you, and a lot less annoying to use.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Useful Reminder:''' You can tab-complete a lot of things! For example, if you don't want to type out a whole directory name, hit tab once to complete it as far as possible, and hit tab twice to show the remaining options with how far you've completed it so far. Try typing &amp;lt;code&amp;gt;ls /u&amp;lt;/code&amp;gt; and hitting tab, and you should have it complete to &amp;lt;code&amp;gt;ls /usr/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Write this.}}&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20671</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20671"/>
		<updated>2023-09-10T05:01:13Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
=== Getting Our Feet Wet ===&lt;br /&gt;
&lt;br /&gt;
If you are already familiar with basic Linux/Unix usage from the command line, you can skip this section. However, to ensure nobody is left behind, this will be a quick crash course into how to do very basic things.&lt;br /&gt;
&lt;br /&gt;
==== Where Are We? ====&lt;br /&gt;
&lt;br /&gt;
There is a concept of a &amp;quot;current working directory&amp;quot;. Any command we run assumes relative paths are relative to this working directory. We can show the current working directory with:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should currently show your home directory.&lt;br /&gt;
&lt;br /&gt;
==== Creating Directories ====&lt;br /&gt;
&lt;br /&gt;
Using the &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt; command, we can create a new directory.&lt;br /&gt;
&lt;br /&gt;
 mkdir &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would create a new directory called &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt; in our current working directory. That's because the argument we gave it is interpreted as a path relative to the current working directory, as it does not begin with a forward slash (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Changing The Current Working Directory ====&lt;br /&gt;
&lt;br /&gt;
With the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command, we can change our current working directory:&lt;br /&gt;
&lt;br /&gt;
 cd &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we should now be in the directory &amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;; we can verify this by running &amp;lt;code&amp;gt;pwd&amp;lt;/code&amp;gt; again:&lt;br /&gt;
&lt;br /&gt;
 pwd&lt;br /&gt;
&lt;br /&gt;
This should output &amp;lt;code&amp;gt;/home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;/&amp;lt;var&amp;gt;foo&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If we want to ascend the directory hierarchy by one level, we can change to the path &amp;quot;..&amp;quot; to do so; &amp;quot;..&amp;quot; has a special meaning to be the parent directory:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
&lt;br /&gt;
If you are ever in a hurry, you can run &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; without any arguments to return to your home directory.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Another special directory name is &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;: this refers to the current directory. For example, &amp;lt;code&amp;gt;cd .&amp;lt;/code&amp;gt; would do nothing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd foo/./bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd foo/bar&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cd foo/../bar&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd bar&amp;lt;/code&amp;gt; (into foo, up one level, into bar).&lt;br /&gt;
&lt;br /&gt;
Another path component with special meaning is &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;. Our shell expands this to our user's home folder. &amp;lt;code&amp;gt;cd ~&amp;lt;/code&amp;gt; would be equivalent to &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; with no arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We can also give &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; an absolute path. Absolute paths start with a forward slash, and the highest level directory is simply &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, the root level directory. We can change your working directory to &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;cd /&amp;lt;/code&amp;gt;, but be aware that we're not allowed to write any files or make any directories here.&lt;br /&gt;
&lt;br /&gt;
==== Listing Directories ====&lt;br /&gt;
&lt;br /&gt;
If we want to find out what's in our current directory, we can use the &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
 ls&lt;br /&gt;
&lt;br /&gt;
We can also give it a path as an argument to list the contents of that path instead:&lt;br /&gt;
&lt;br /&gt;
 ls /usr&lt;br /&gt;
&lt;br /&gt;
This would list the contents of the system ''usr'' directory.&lt;br /&gt;
&lt;br /&gt;
To get a more detailed list, including who owns the files and what their access rights are, we can use the &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt; argument to &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 ls -l&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; does not list files or directories starting with a dot (&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;). We can give it the &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; argument to list those as well, including the special &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (the folder itself being listed) and &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (its parent folder) directories:&lt;br /&gt;
&lt;br /&gt;
 ls -al&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Further Explanation:''' Note that we once again were able to combine the two single-letter short options into one argument. &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;ls -a -l&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ls -l -a&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Write this.}}&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20670</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20670"/>
		<updated>2023-09-10T04:30:32Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password.&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' What we just did was run the &amp;lt;code&amp;gt;hostnamectl&amp;lt;/code&amp;gt; command as the superuser with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. The superuser, or sometimes called the root user, is the ultimate administrator account on Unix-like systems such as Linux: it has access to everything, and should therefore be used with appropriate caution. By prefixing a command with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; like this, we ask for it to be run as the superuser. The user &amp;quot;pleb&amp;quot; is allowed to use sudo in this way because it is in the necessary supplementary group.}}&lt;br /&gt;
&lt;br /&gt;
After changing our hostname, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Don't try to use spaces in your name and don't start your new username with a number. For example, if we wanted to rename the user ''pleb'' to ''greg'', we would type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l greg -md /home/greg pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' The command &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; here is run with several arguments, each separated by space. The first argument, &amp;lt;code&amp;gt;-l&amp;lt;/code&amp;gt;, signals that the next argument will be the new user name. What follows next in our example is &amp;quot;greg&amp;quot;, which is the new username we chose.&lt;br /&gt;
&lt;br /&gt;
Next is the argument &amp;lt;code&amp;gt;-md&amp;lt;/code&amp;gt;. This is actually two arguments in one, and could be written instead as &amp;lt;code&amp;gt;-m -d&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;'s case, though this depends on the command. &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; tells the command to move our old home to our new home, and &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; tells it that the next argument is the path of the new home directory. In this case, we chose &amp;quot;/home/greg/&amp;quot;. This is the usual expected location for a home directory for a user called &amp;quot;greg&amp;quot;, though it's not a strict requirement.&lt;br /&gt;
&lt;br /&gt;
Finally, the last argument is a positional argument, which &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt; expects to be the current username you wish to operate on.}}&lt;br /&gt;
&lt;br /&gt;
Then, we should also rename the user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Explanation:''' Each user also has a &amp;quot;login group&amp;quot; they belong to, usually named the same as their username (though not necessarily so). To keep it consistent with your new username, we're renaming it with the &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt; command.}}&lt;br /&gt;
&lt;br /&gt;
Finally, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and the command &amp;lt;code&amp;gt;id -gn&amp;lt;/code&amp;gt; (no sudo!) should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''TODO:''' Write this.}}&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20669</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20669"/>
		<updated>2023-09-10T04:02:44Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
Unbox your Quartz64 Model B. Carefully attach the U.2 wireless antenna (the little grey wire with the sticker on the end) to the antenna connector that can be found near the Wi-Fi chipset (the shiny metal square). If you do not need Wi-Fi, you can skip attaching the antenna. Now is a good time to stick on the tiny aluminium heatsink; remove the protective film on its bottom and stick it onto the black chip in the centre labelled &amp;quot;Rockchip&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Take the baseplate from your Acrylic Open Enclosure, the small screws, and the brass nuts. Insert the screws from below the base plate (top side is the one with the acrylic standoffs) through the standoffs. Place your Quartz64 Model B board on the standoffs such that the screw threads poke through its mounting holes, oriented such that the board ends up in the middle of the base plate; the standoffs are not centred on purpose, so orientation matters. Now, secure the board by fastening the four brass nuts onto the exposed screw threads.&lt;br /&gt;
&lt;br /&gt;
Next, get the large screws and metal posts, as well as the top acrylic plate. Insert the large screws through the bigger outside holes of the base plate, and fasten the metal posts on the other side. Lay the top plate on the four metal posts, and fasten it down with the remaining four large screws.&lt;br /&gt;
&lt;br /&gt;
Connect the board with an ethernet cable to your network, but do not hook up power yet.&lt;br /&gt;
&lt;br /&gt;
Stick your microSD card into your SD card reader, then [https://plebian.org/flashing/q64b/ follow Plebian's official flashing instructions].&lt;br /&gt;
&lt;br /&gt;
Once it's flashed successfully, stick the microSD with the black bottom facing upwards into the underside of the board, below the metallic Wi-Fi chipset. This can be fiddly to get in with the board mounted to the acrylic base plate. If you're unsure of where exactly the microSD connector on the Quartz64 Model B is, peer through the transparent bottom of the acrylic base plate.&lt;br /&gt;
&lt;br /&gt;
Next, unbox the M.2 NVMe SSD, flip it around and stick it in right below where you mounted the SD card; it will awkwardly protrude from the side of the case, and the spring loading mechanism of the connector will push it against the acrylic bottom plate. As sketchy as this is, it should work, so long as you don't violently bump the protruding SSD.&lt;br /&gt;
&lt;br /&gt;
== First Contact ==&lt;br /&gt;
&lt;br /&gt;
After you hook up the power supply to the barrel connector (important: not the audio jack, that would be bad), your board's LEDs should light up. After a couple dozen seconds, one of the LEDs should begin rhythmically blinking in a &amp;quot;heartbeat&amp;quot; like fashion. If the heartbeat pattern does not appear even after a minute or so, try hitting the little white switch closest to the antenna mount to reset the board. If it still doesn't appear after another minute, go to [[#Connecting UART]].&lt;br /&gt;
&lt;br /&gt;
Once you see the heartbeat pattern, you may now connect to the board over the network, using SSH.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Windows ===&lt;br /&gt;
&lt;br /&gt;
Recent versions of Windows 10 and 11 have SSH as well as mDNS support built-in. Click on the start menu, search for the Command Prompt and open it.&lt;br /&gt;
&lt;br /&gt;
Into the command prompt, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use. If the Command Prompt says ssh is not a recognised command, look at [[#Installing OpenSSH On Windows]].&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on Linux or BSD ===&lt;br /&gt;
&lt;br /&gt;
Make sure the OpenSSH client is installed; how depends on your distribution. If your system is set up with an mDNS resolver such as Avahi or systemd-resolved with mDNS resolution enabled, you can open a terminal and type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH on macOS ===&lt;br /&gt;
&lt;br /&gt;
Open a terminal by clicking on the Launchpad icon in the Dock, typing Terminal in the search field and then clicking on Terminal.&lt;br /&gt;
&lt;br /&gt;
Into the newly opened terminal, type:&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@plebian-quartz64b.local&lt;br /&gt;
&lt;br /&gt;
if everything went well, it should prompt you with a host key question. Type &amp;quot;yes&amp;quot; to accept and remember the host key for future use.&lt;br /&gt;
&lt;br /&gt;
ssh will now ask you for a password for the user &amp;quot;pleb&amp;quot;. Type in &amp;quot;pleb&amp;quot; as the password. You will then be prompted to change your password; change it to [https://xkcd.com/936/ something secure], then log back in (with the same ssh command again, hit the up arrow to get the previous command from your history) with your new password.&lt;br /&gt;
&lt;br /&gt;
Congratulations, you are now logged into your Quartz64 Model B.&lt;br /&gt;
&lt;br /&gt;
== First Steps ==&lt;br /&gt;
&lt;br /&gt;
{{hint|'''TODO:''' Validate this.}}&lt;br /&gt;
&lt;br /&gt;
=== Changing The Hostname ===&lt;br /&gt;
&lt;br /&gt;
First up, you may want to change the hostname the board uses. We can do this quite easily; in your ssh session with the board, type&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl hostname &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to change the hostname to &amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;. You will be prompted for your password. After changing this, a reboot is usually a good idea; type&lt;br /&gt;
&lt;br /&gt;
 sudo reboot&lt;br /&gt;
&lt;br /&gt;
to reboot the board. To connect to it after doing this, you'll have to use the new hostname with the &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; top-level domain, for example&lt;br /&gt;
&lt;br /&gt;
 ssh pleb@mcserver.local&lt;br /&gt;
&lt;br /&gt;
if you set your hostname to &amp;quot;mcserver&amp;quot;. You will be prompted to accept the host key again, only this time, it should tell you that it already knows the host by a different name.&lt;br /&gt;
&lt;br /&gt;
=== Changing The Username ===&lt;br /&gt;
&lt;br /&gt;
Being called a pleb isn't very nice, so we'll change this as well. In your ssh session, type:&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -l &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; -md /home/&amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
to update your username and home folder to &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;. Then, also rename your user group:&lt;br /&gt;
&lt;br /&gt;
 sudo groupmod -n &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt; pleb&lt;br /&gt;
&lt;br /&gt;
Then, log out (by either typing &amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt; or hitting Ctrl+d, and start a new ssh session with:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;var&amp;gt;yourname&amp;lt;/var&amp;gt;@&amp;lt;var&amp;gt;yourhost&amp;lt;/var&amp;gt;.local&lt;br /&gt;
&lt;br /&gt;
Your prompt should now show you your new name, and &amp;lt;code&amp;gt;ls -al&amp;lt;/code&amp;gt; should show you that your group has been renamed as well.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section contains various subsections for helping you troubleshoot problems you may have while following this guide.&lt;br /&gt;
&lt;br /&gt;
=== Connecting UART ===&lt;br /&gt;
&lt;br /&gt;
{{hint|'''TODO:''' Write this.}}&lt;br /&gt;
&lt;br /&gt;
=== Installing OpenSSH On Windows ===&lt;br /&gt;
&lt;br /&gt;
On Windows 11, open the start menu, go to Settings &amp;gt; Apps &amp;gt; Optional features. If &amp;quot;OpenSSH Client&amp;quot; doesn't show up in your installed features, click on &amp;quot;View features&amp;quot; in &amp;quot;Add an optional feature&amp;quot; and search for &amp;quot;OpenSSH Client&amp;quot; and check it, then hit &amp;quot;Next&amp;quot; and &amp;quot;Install&amp;quot;.&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20668</id>
		<title>User:CounterPillow/Quartz64 Minecraft Server Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=User:CounterPillow/Quartz64_Minecraft_Server_Guide&amp;diff=20668"/>
		<updated>2023-09-10T01:54:42Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Created page with &amp;quot;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}  This guide details how to build and set up a small Minecraft (Java Edition) server on a Quartz64 Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.  {{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{warning|'''This article is a work-in-progress and incomplete, if you came here from a search engine, turn back.'''}}&lt;br /&gt;
&lt;br /&gt;
This guide details how to build and set up a small Minecraft (Java Edition) server on a [[Quartz64]] Model B single board computer. The guide is intended to cover the basics in detail so that inexperienced users can follow it.&lt;br /&gt;
&lt;br /&gt;
{{Info|If you have a 12+ year old child interested in computers and have some experience yourself, this could be a great guide to work through with them.}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Motivation ===&lt;br /&gt;
&lt;br /&gt;
You may ask yourself why one would want to host a Minecraft server themselves instead of renting one. That is a valid question, and one big consideration is running cost. Buying the hardware and running the software yourself from your own internet access means that you're only paying a one-time cost (ignoring the minuscule power draw), whereas renting a server would usually incur a monthly fee. Since it's your server, you also have complete control over the software you run. Lastly, it's a great and fun way to learn about Linux system administration.&lt;br /&gt;
&lt;br /&gt;
As for disadvantages, the server will only be as available as your home internet connection and electricity supply, and you yourself are responsible for keeping your system safe and up-to-date. The server is also not very high performance. It's best for a small group of friends, and not suitable for a public server that is likely to come under DDoS attacks.&lt;br /&gt;
&lt;br /&gt;
In the below table, you can see a comparison between paying Microsoft for a&lt;br /&gt;
realms server and self-hosting it according to this guide.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; |&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Minecraft Realms&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Self-Hosted&lt;br /&gt;
|-&lt;br /&gt;
! Setup Cost&lt;br /&gt;
| USD 0    || USD ~130&lt;br /&gt;
|-&lt;br /&gt;
! Monthly Cost&lt;br /&gt;
| USD 7.99 || USD 0&lt;br /&gt;
|-&lt;br /&gt;
! Modifications&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Players&lt;br /&gt;
| 10 || Uncapped&lt;br /&gt;
|-&lt;br /&gt;
! Availability&lt;br /&gt;
| Always || Depends on you&lt;br /&gt;
|-&lt;br /&gt;
! Security&lt;br /&gt;
| Provided by Microsoft || Your responsibility&lt;br /&gt;
|-&lt;br /&gt;
! Performance&lt;br /&gt;
| High || Low&lt;br /&gt;
|-&lt;br /&gt;
! Full Shell Access&lt;br /&gt;
| No || Yes&lt;br /&gt;
|-&lt;br /&gt;
! Teaches You Linux&lt;br /&gt;
| No || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ignoring all points other than cost and assuming a USD 0.30/kWh rate for power with an average power draw of 3W for the board, the Quartz64 Model B as it is set up in this guide will have paid for itself in less than 18 months.&lt;br /&gt;
&lt;br /&gt;
=== Game Plan ===&lt;br /&gt;
&lt;br /&gt;
Let's get a high-level overview of what will be set up in this guide.&lt;br /&gt;
&lt;br /&gt;
The goal is to have the base operating system (Debian Bookworm, using the Plebian images) installed on the microSD card. The Minecraft server itself will read and write its data from an NVMe M.2 SSD. The Minecraft server we'll use is PaperMC. We'll run it as a locked down systemd service. To make the server available to others on the internet, we'll use ddclient with DuckDNS to get ourselves a domain name for our (likely) dynamic IP, and forward the ports on the router.&lt;br /&gt;
&lt;br /&gt;
== Shopping List ==&lt;br /&gt;
&lt;br /&gt;
Total cost: Around USD 130 excluding shipping.&lt;br /&gt;
&lt;br /&gt;
=== From Pine Store ===&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' When choosing &amp;quot;Courier Shipping&amp;quot; on Pine Store, you may unfortunately be charged additional import duties once the package arrives. How high these are depends on your jurisdiction, the order value and the courier Pine Store chooses.}}&lt;br /&gt;
&lt;br /&gt;
* [https://pine64.com/product/quartz64-model-b-4gb-single-board-computer/ Quartz64 Model B 4GB] &amp;amp;mdash; USD 59.99&lt;br /&gt;
** Pine Store has been known to have sold Model B's with defective ethernet or defective debug serial. If either of those things don't work, file a ticket for a return as soon as possible as to not miss the 30 day warranty window.&lt;br /&gt;
* [https://pine64.com/product/small-fan-type-heatsink/ Small Fan Type Heatsink] &amp;amp;mdash; USD 0.50&lt;br /&gt;
* [https://pine64.com/product/serial-console-woodpecker-edition/ Serial Console &amp;quot;Woodpecker&amp;quot; Edition] &amp;amp;mdash; USD 1.99&lt;br /&gt;
** For debugging any boot problems that might occur.&lt;br /&gt;
* [https://pine64.com/product/model-b-acrylic-open-enclosure/ &amp;quot;Model B&amp;quot; Acrylic Open Enclosure] &amp;amp;mdash; USD 7.99&lt;br /&gt;
* [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-international-power-supply-with-au-eu-uk-us-plug/ 5V3A International Switching Power Supply] &amp;amp;mdash; USD 8.99&lt;br /&gt;
** Feel free to choose the [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-us-version/ US-only] or [https://pine64.com/product/rock64-pinebook-pro-pine-h64-5v-3a-switching-power-supply-eu-version/ EU-only] variant instead to save two bucks.&lt;br /&gt;
&lt;br /&gt;
=== From Elsewhere ===&lt;br /&gt;
&lt;br /&gt;
* A good 32GB microSD card for the operating system &amp;amp;mdash; USD ~15&lt;br /&gt;
** SanDisk Max Endurance is a decent brand, Samsung EVO is fine too.&lt;br /&gt;
** Even if the brand looks correct, buy from a reputable marketplace and seller: fakes are common! Double-check who's selling it to you on e.g. Amazon.&lt;br /&gt;
** Avoid no-name cards, like the ones from Pine Store, or cards that aren't intended for longevity but maximum speed.&lt;br /&gt;
* A TLC flash 500GB or higher capacity NVMe M.2 drive &amp;amp;mdash; USD ~35&lt;br /&gt;
** Look at [https://docs.google.com/spreadsheets/d/1B27_j9NDPU3cNlj2HKcrfpJKHkOf-Oi1DbuuQva2gT4/edit#gid=0 the SSD spreadsheet] and pick a cheap one with TLC, and either DRAM or HMB&lt;br /&gt;
** PCIe 3/4 doesn't matter, it'll run at one lane of PCIe 2 anyway&lt;br /&gt;
** Decent usually cheap options: Kioxia Exceria, Patriot P300, Lexar NM620, WD Blue SN570&lt;br /&gt;
** Avoid: Kingston NV1/NV2 (no cache, meaningfully slow here), anything with QLC flash (could be meaningfully slow here), anything SATA/AHCI (won't work), anything Aliexpress (fraud).&lt;br /&gt;
** Shop around for deals and used drives! Just look up the manufacturer and model in the spreadsheet to verify that it's both TLC and has either DRAM or HMB cache. Bandwidth will be severely limited by the Quartz64's one lane of PCIe 2 here so paying a lot is not worth it.&lt;br /&gt;
&lt;br /&gt;
=== Things You Hopefully Already Have ===&lt;br /&gt;
&lt;br /&gt;
* A microSD card reader (your laptop may have one built-in already), USB3 microSD card readers are cheap and useful.&lt;br /&gt;
* An ethernet Cat5e or Cat6 or Cat6a cable (though technically you could run it on Wi-Fi)&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20614</id>
		<title>Mainline Hardware Decoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20614"/>
		<updated>2023-09-05T08:49:54Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add gst-launch examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hint|This page is incomplete, you're welcome to improve it.}}&lt;br /&gt;
&lt;br /&gt;
'''Mainline Hardware Decoding''' refers to video decoding done using hardware accelerators on the mainline Linux kernel (i.e. what sits in Linus' tree).&lt;br /&gt;
&lt;br /&gt;
On most consumer-oriented SoCs, there is what is referred to as a VPU (Video Processing Unit). The VPU is responsible for power-efficient encoding and decoding of videos. Hardware-accelerated video decoding can be useful to get smoother video playback on your devices, lower power consumption, and lower CPU utilisation. Below is information regarding various hardware PINE64 uses and software that works with it.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Here's a table of the current support for different hardware. &amp;quot;In review&amp;quot; means the patch series to enable support has been posted to the mailing lists but is undergoing review, &amp;quot;linux-next&amp;quot; means it has been accepted and staged for the next Linux merge window.&lt;br /&gt;
&lt;br /&gt;
=== Supported Codecs By SoC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; {{Diagonal split header|Codec|SoC}}&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | A64&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3328&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3399&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3566&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3588&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | JPEG&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-2&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-4 Part 2/H.263&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP8&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.264/AVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.265/HEVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP9&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AVS2&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AV1&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;only Hantro, not rkvdec2, so with a maximum resolution of 1080p for now&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Used SoC By Device ===&lt;br /&gt;
&lt;br /&gt;
This table provides a quick reference to check which SoC is used in what Pine devices, for ease of navigating the previous table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! SoC&lt;br /&gt;
! Device(s)&lt;br /&gt;
|-&lt;br /&gt;
! Allwinner A64&lt;br /&gt;
| PinePhone, PineTab1, Pinebook, PINE A64, PINE A64-LTS, SOPINE&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3328&lt;br /&gt;
| ROCK64&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3399&lt;br /&gt;
| PinePhone Pro, Pinebook Pro, ROCKPro64&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3566&lt;br /&gt;
| Quartz64 Model A and B, SOQuartz, PineTab2&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3588&lt;br /&gt;
| QuartzPro64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cedrus ===&lt;br /&gt;
&lt;br /&gt;
In 2018, Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which came to be called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the [https://linux-sunxi.org/Sunxi-Cedrus#Codec_Support Sunxi wiki].&lt;br /&gt;
&lt;br /&gt;
=== Hantro ===&lt;br /&gt;
&lt;br /&gt;
The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it [https://www.cnx-software.com/2020/11/24/hantro-h1-hardware-accelerated-video-encoding-support-in-mainline-linux/ was announced] that Bootlin was working on encoding support for the driver.&lt;br /&gt;
&lt;br /&gt;
=== rkvdec ===&lt;br /&gt;
&lt;br /&gt;
rkvdec is the video decoding hardware that's developed by Rockchip presumably in house. It's what Rockchip uses for decoding 4K H.264/AVC, VP9 and H.265/HEVC content. The driver in mainline linux for the first generation rkvdec (used in RK3328 and RK3399) supports VP9 and H.264, [https://patchwork.kernel.org/project/linux-rockchip/list/?series=659401 patches for HEVC support] are also in the process of review.&lt;br /&gt;
&lt;br /&gt;
RK3566, RK3568 and likely RK3588 use a second generation of rkvdec called rkvdec2. No mainline driver for this exists yet. The rkvdec instance on RK3588 additionally supports the [https://en.wikipedia.org/wiki/Audio_Video_Standard AVS2 video codec].&lt;br /&gt;
&lt;br /&gt;
=== rkdjpeg ===&lt;br /&gt;
&lt;br /&gt;
rkdjpeg is Rockchip's in-house hardware accelerated JPEG decoder. It can be found on the RK3566 and RK3568 as well as the RK3588.&lt;br /&gt;
&lt;br /&gt;
No mainline driver exists for it so far.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== GStreamer ===&lt;br /&gt;
&lt;br /&gt;
H.264, H.265, MPEG-2, VP8, VP9 and AV1 video decoding is possible when using GStreamer's command line tools, or an application utilizing it such as [https://github.com/Rafostar/clapper Clapper] or [https://flathub.org/apps/details/org.sigxcpu.Livi µPlayer]. µPlayer includes a indicator of when hardware acceleration is properly working and in use.&lt;br /&gt;
&lt;br /&gt;
==== Using gst-launch ====&lt;br /&gt;
&lt;br /&gt;
To test out hardware decoding from the command line, &amp;lt;code&amp;gt;gst-launch-1.0&amp;lt;/code&amp;gt; may be used. An example pipeline to demux, hardware decode and display H.264 video in an MP4 container would be as follows:&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 filesrc location=yourfilehere.mp4 ! qtdemux ! v4l2slh264dec ! videoconvert ! autovideosink&lt;br /&gt;
&lt;br /&gt;
To do the same for a VP8 WebM file, one may use:&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 filesrc location=yourfilehere.webm ! matroskademux ! v4l2slvp8dec ! videoconvert ! autovideosink&lt;br /&gt;
&lt;br /&gt;
Depending on your GStreamer version and your GStreamer's build configuration, the following may be available as well: &amp;lt;code&amp;gt;v4l2slmpeg2dec&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;v4l2slav1dec&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;v4l2slvp9dec&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;v4l2slh265dec&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On platforms with a 2D accelerator (such as Rockchip's RGA) that is supported by v4l2, one may use &amp;lt;code&amp;gt;v4l2convert&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;videoconvert&amp;lt;/code&amp;gt; to also hardware accelerate the pixel format conversion.&lt;br /&gt;
&lt;br /&gt;
=== FFmpeg ===&lt;br /&gt;
&lt;br /&gt;
Mainline FFmpeg currently lacks the necessary patches to use the v4l2-requests based API, but [https://github.com/jernejsk/FFmpeg a fork that can utilise it exists]. Fedora users can install precompiled binaries from a [https://dl.kwizart.net/pub/ffmpeg-v4l2-request/ dedicated repository] by one of the Fedora maintainers.&lt;br /&gt;
&lt;br /&gt;
To build it, use something like&lt;br /&gt;
&lt;br /&gt;
 git clone -b v4l2-request-n6.0 https://github.com/jernejsk/FFmpeg.git&lt;br /&gt;
 cd FFmpeg&lt;br /&gt;
 ./configure --enable-v4l2-request --enable-libudev --enable-libdrm --enable-gnutls --prefix=/some/install/prefix/here&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
After compiling, you can install it into your specified prefix with&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
And then modify your PATH to include the prefix's bin directory.&lt;br /&gt;
&lt;br /&gt;
With the patched ffmpeg, you can utilise hardware decoding using the &amp;lt;code&amp;gt;-hwaccel drm&amp;lt;/code&amp;gt; parameter, e.g.:&lt;br /&gt;
&lt;br /&gt;
 ffmpeg -hwaccel drm -i input.mp4 -f null - -benchmark&lt;br /&gt;
&lt;br /&gt;
to measure how fast it decodes.&lt;br /&gt;
&lt;br /&gt;
=== mpv ===&lt;br /&gt;
&lt;br /&gt;
mpv v0.35 or later, built against the aforementioned FFmpeg fork, can be used to play back videos with hardware accelerated decoding. The hardware decoder path features interop with the GPU output, saving an expensive copyback operation. You can utilise the hardware decoding with e.g.:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm ''video''&lt;br /&gt;
&lt;br /&gt;
In mpv versions prior to 0.35, you can use the copyback hwdec with:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm-copy ''video''&lt;br /&gt;
&lt;br /&gt;
To build an mpv against the FFmpeg in your prefix, you can run&lt;br /&gt;
&lt;br /&gt;
  PKG_CONFIG_PATH=&amp;quot;/path/to/your/ffmpeg/prefix/lib/pkgconfig:$PKG_CONFIG_PATH&amp;quot; meson setup build&lt;br /&gt;
  ninja -C build&lt;br /&gt;
&lt;br /&gt;
== More Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://xnux.eu/devices/feature/cedrus-pp.html Megi's Cedrus Information]&lt;br /&gt;
* [https://briandaniels.me/2021/06/27/hardware-accelerated-video-playback-on-the-pinephone.html HW accelerated GStreamer playback on the PinePhone]&lt;br /&gt;
* [https://briandaniels.me/2021/07/06/hardware-accelerated-video-playback-on-the-pinephone-with-clapper.html HW accelerated Clapper video player on the PinePhone]&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Mainline Hardware Encoding]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:ROCKPro64]] [[Category:Rockchip RK3566]] [[Category:Rockchip RK3399]] [[Category:Pinebook Pro]] [[Category:PinePhone Pro]] [[Category:PineNote]] [[Category:Rockchip RK3588]] [[Category:Rockchip RK3328]] [[Category:ROCK64]] [[Category:Allwinner A64]] [[Category:PinePhone]] [[Category:PINE A64-LTS]] [[Category:SOPINE]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20613</id>
		<title>Mainline Hardware Decoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20613"/>
		<updated>2023-09-05T05:37:48Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add a SoC-to-devices table for ease of reference&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hint|This page is incomplete, you're welcome to improve it.}}&lt;br /&gt;
&lt;br /&gt;
'''Mainline Hardware Decoding''' refers to video decoding done using hardware accelerators on the mainline Linux kernel (i.e. what sits in Linus' tree).&lt;br /&gt;
&lt;br /&gt;
On most consumer-oriented SoCs, there is what is referred to as a VPU (Video Processing Unit). The VPU is responsible for power-efficient encoding and decoding of videos. Hardware-accelerated video decoding can be useful to get smoother video playback on your devices, lower power consumption, and lower CPU utilisation. Below is information regarding various hardware PINE64 uses and software that works with it.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Here's a table of the current support for different hardware. &amp;quot;In review&amp;quot; means the patch series to enable support has been posted to the mailing lists but is undergoing review, &amp;quot;linux-next&amp;quot; means it has been accepted and staged for the next Linux merge window.&lt;br /&gt;
&lt;br /&gt;
=== Supported Codecs By SoC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; {{Diagonal split header|Codec|SoC}}&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | A64&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3328&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3399&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3566&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3588&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | JPEG&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-2&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-4 Part 2/H.263&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP8&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.264/AVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.265/HEVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP9&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AVS2&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AV1&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;only Hantro, not rkvdec2, so with a maximum resolution of 1080p for now&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Used SoC By Device ===&lt;br /&gt;
&lt;br /&gt;
This table provides a quick reference to check which SoC is used in what Pine devices, for ease of navigating the previous table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! SoC&lt;br /&gt;
! Device(s)&lt;br /&gt;
|-&lt;br /&gt;
! Allwinner A64&lt;br /&gt;
| PinePhone, PineTab1, Pinebook, PINE A64, PINE A64-LTS, SOPINE&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3328&lt;br /&gt;
| ROCK64&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3399&lt;br /&gt;
| PinePhone Pro, Pinebook Pro, ROCKPro64&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3566&lt;br /&gt;
| Quartz64 Model A and B, SOQuartz, PineTab2&lt;br /&gt;
|-&lt;br /&gt;
! Rockchip RK3588&lt;br /&gt;
| QuartzPro64&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cedrus ===&lt;br /&gt;
&lt;br /&gt;
In 2018, Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which came to be called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the [https://linux-sunxi.org/Sunxi-Cedrus#Codec_Support Sunxi wiki].&lt;br /&gt;
&lt;br /&gt;
=== Hantro ===&lt;br /&gt;
&lt;br /&gt;
The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it [https://www.cnx-software.com/2020/11/24/hantro-h1-hardware-accelerated-video-encoding-support-in-mainline-linux/ was announced] that Bootlin was working on encoding support for the driver.&lt;br /&gt;
&lt;br /&gt;
=== rkvdec ===&lt;br /&gt;
&lt;br /&gt;
rkvdec is the video decoding hardware that's developed by Rockchip presumably in house. It's what Rockchip uses for decoding 4K H.264/AVC, VP9 and H.265/HEVC content. The driver in mainline linux for the first generation rkvdec (used in RK3328 and RK3399) supports VP9 and H.264, [https://patchwork.kernel.org/project/linux-rockchip/list/?series=659401 patches for HEVC support] are also in the process of review.&lt;br /&gt;
&lt;br /&gt;
RK3566, RK3568 and likely RK3588 use a second generation of rkvdec called rkvdec2. No mainline driver for this exists yet. The rkvdec instance on RK3588 additionally supports the [https://en.wikipedia.org/wiki/Audio_Video_Standard AVS2 video codec].&lt;br /&gt;
&lt;br /&gt;
=== rkdjpeg ===&lt;br /&gt;
&lt;br /&gt;
rkdjpeg is Rockchip's in-house hardware accelerated JPEG decoder. It can be found on the RK3566 and RK3568 as well as the RK3588.&lt;br /&gt;
&lt;br /&gt;
No mainline driver exists for it so far.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== GStreamer ===&lt;br /&gt;
H.264 video decoding is possible when using GStreamer built from source, or an application utilizing it such as [https://github.com/Rafostar/clapper Clapper] or [https://flathub.org/apps/details/org.sigxcpu.Livi µPlayer]. µPlayer includes a indicator of when hardware acceleration is properly working and in use.&lt;br /&gt;
&lt;br /&gt;
=== FFmpeg ===&lt;br /&gt;
&lt;br /&gt;
Mainline FFmpeg currently lacks the necessary patches to use the v4l2-requests based API, but [https://github.com/jernejsk/FFmpeg a fork that can utilise it exists]. Fedora users can install precompiled binaries from a [https://dl.kwizart.net/pub/ffmpeg-v4l2-request/ dedicated repository] by one of the Fedora maintainers.&lt;br /&gt;
&lt;br /&gt;
To build it, use something like&lt;br /&gt;
&lt;br /&gt;
 git clone -b v4l2-request-n6.0 https://github.com/jernejsk/FFmpeg.git&lt;br /&gt;
 cd FFmpeg&lt;br /&gt;
 ./configure --enable-v4l2-request --enable-libudev --enable-libdrm --enable-gnutls --prefix=/some/install/prefix/here&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
After compiling, you can install it into your specified prefix with&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
And then modify your PATH to include the prefix's bin directory.&lt;br /&gt;
&lt;br /&gt;
With the patched ffmpeg, you can utilise hardware decoding using the &amp;lt;code&amp;gt;-hwaccel drm&amp;lt;/code&amp;gt; parameter, e.g.:&lt;br /&gt;
&lt;br /&gt;
 ffmpeg -hwaccel drm -i input.mp4 -f null - -benchmark&lt;br /&gt;
&lt;br /&gt;
to measure how fast it decodes.&lt;br /&gt;
&lt;br /&gt;
=== mpv ===&lt;br /&gt;
&lt;br /&gt;
mpv v0.35 or later, built against the aforementioned FFmpeg fork, can be used to play back videos with hardware accelerated decoding. The hardware decoder path features interop with the GPU output, saving an expensive copyback operation. You can utilise the hardware decoding with e.g.:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm ''video''&lt;br /&gt;
&lt;br /&gt;
In mpv versions prior to 0.35, you can use the copyback hwdec with:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm-copy ''video''&lt;br /&gt;
&lt;br /&gt;
To build an mpv against the FFmpeg in your prefix, you can run&lt;br /&gt;
&lt;br /&gt;
  PKG_CONFIG_PATH=&amp;quot;/path/to/your/ffmpeg/prefix/lib/pkgconfig:$PKG_CONFIG_PATH&amp;quot; meson setup build&lt;br /&gt;
  ninja -C build&lt;br /&gt;
&lt;br /&gt;
== More Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://xnux.eu/devices/feature/cedrus-pp.html Megi's Cedrus Information]&lt;br /&gt;
* [https://briandaniels.me/2021/06/27/hardware-accelerated-video-playback-on-the-pinephone.html HW accelerated GStreamer playback on the PinePhone]&lt;br /&gt;
* [https://briandaniels.me/2021/07/06/hardware-accelerated-video-playback-on-the-pinephone-with-clapper.html HW accelerated Clapper video player on the PinePhone]&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Mainline Hardware Encoding]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:ROCKPro64]] [[Category:Rockchip RK3566]] [[Category:Rockchip RK3399]] [[Category:Pinebook Pro]] [[Category:PinePhone Pro]] [[Category:PineNote]] [[Category:Rockchip RK3588]] [[Category:Rockchip RK3328]] [[Category:ROCK64]] [[Category:Allwinner A64]] [[Category:PinePhone]] [[Category:PINE A64-LTS]] [[Category:SOPINE]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20612</id>
		<title>Mainline Hardware Decoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20612"/>
		<updated>2023-09-05T05:13:09Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Hardware */ Make column widths consistent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hint|This page is incomplete, you're welcome to improve it.}}&lt;br /&gt;
&lt;br /&gt;
'''Mainline Hardware Decoding''' refers to video decoding done using hardware accelerators on the mainline Linux kernel (i.e. what sits in Linus' tree).&lt;br /&gt;
&lt;br /&gt;
On most consumer-oriented SoCs, there is what is referred to as a VPU (Video Processing Unit). The VPU is responsible for power-efficient encoding and decoding of videos. Hardware-accelerated video decoding can be useful to get smoother video playback on your devices, lower power consumption, and lower CPU utilisation. Below is information regarding various hardware PINE64 uses and software that works with it.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Here's a table of the current support for different hardware. &amp;quot;In review&amp;quot; means the patch series to enable support has been posted to the mailing lists but is undergoing review, &amp;quot;linux-next&amp;quot; means it has been accepted and staged for the next Linux merge window.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; {{Diagonal split header|Codec|SoC}}&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | A64&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3328&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3399&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3566&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:6em&amp;quot; | RK3588&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | JPEG&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-2&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-4 Part 2/H.263&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP8&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.264/AVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.265/HEVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP9&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AVS2&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AV1&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;only Hantro, not rkvdec2, so with a maximum resolution of 1080p for now&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cedrus ===&lt;br /&gt;
&lt;br /&gt;
In 2018, Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which came to be called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the [https://linux-sunxi.org/Sunxi-Cedrus#Codec_Support Sunxi wiki].&lt;br /&gt;
&lt;br /&gt;
=== Hantro ===&lt;br /&gt;
&lt;br /&gt;
The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it [https://www.cnx-software.com/2020/11/24/hantro-h1-hardware-accelerated-video-encoding-support-in-mainline-linux/ was announced] that Bootlin was working on encoding support for the driver.&lt;br /&gt;
&lt;br /&gt;
=== rkvdec ===&lt;br /&gt;
&lt;br /&gt;
rkvdec is the video decoding hardware that's developed by Rockchip presumably in house. It's what Rockchip uses for decoding 4K H.264/AVC, VP9 and H.265/HEVC content. The driver in mainline linux for the first generation rkvdec (used in RK3328 and RK3399) supports VP9 and H.264, [https://patchwork.kernel.org/project/linux-rockchip/list/?series=659401 patches for HEVC support] are also in the process of review.&lt;br /&gt;
&lt;br /&gt;
RK3566, RK3568 and likely RK3588 use a second generation of rkvdec called rkvdec2. No mainline driver for this exists yet. The rkvdec instance on RK3588 additionally supports the [https://en.wikipedia.org/wiki/Audio_Video_Standard AVS2 video codec].&lt;br /&gt;
&lt;br /&gt;
=== rkdjpeg ===&lt;br /&gt;
&lt;br /&gt;
rkdjpeg is Rockchip's in-house hardware accelerated JPEG decoder. It can be found on the RK3566 and RK3568 as well as the RK3588.&lt;br /&gt;
&lt;br /&gt;
No mainline driver exists for it so far.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== GStreamer ===&lt;br /&gt;
H.264 video decoding is possible when using GStreamer built from source, or an application utilizing it such as [https://github.com/Rafostar/clapper Clapper] or [https://flathub.org/apps/details/org.sigxcpu.Livi µPlayer]. µPlayer includes a indicator of when hardware acceleration is properly working and in use.&lt;br /&gt;
&lt;br /&gt;
=== FFmpeg ===&lt;br /&gt;
&lt;br /&gt;
Mainline FFmpeg currently lacks the necessary patches to use the v4l2-requests based API, but [https://github.com/jernejsk/FFmpeg a fork that can utilise it exists]. Fedora users can install precompiled binaries from a [https://dl.kwizart.net/pub/ffmpeg-v4l2-request/ dedicated repository] by one of the Fedora maintainers.&lt;br /&gt;
&lt;br /&gt;
To build it, use something like&lt;br /&gt;
&lt;br /&gt;
 git clone -b v4l2-request-n6.0 https://github.com/jernejsk/FFmpeg.git&lt;br /&gt;
 cd FFmpeg&lt;br /&gt;
 ./configure --enable-v4l2-request --enable-libudev --enable-libdrm --enable-gnutls --prefix=/some/install/prefix/here&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
After compiling, you can install it into your specified prefix with&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
And then modify your PATH to include the prefix's bin directory.&lt;br /&gt;
&lt;br /&gt;
With the patched ffmpeg, you can utilise hardware decoding using the &amp;lt;code&amp;gt;-hwaccel drm&amp;lt;/code&amp;gt; parameter, e.g.:&lt;br /&gt;
&lt;br /&gt;
 ffmpeg -hwaccel drm -i input.mp4 -f null - -benchmark&lt;br /&gt;
&lt;br /&gt;
to measure how fast it decodes.&lt;br /&gt;
&lt;br /&gt;
=== mpv ===&lt;br /&gt;
&lt;br /&gt;
mpv v0.35 or later, built against the aforementioned FFmpeg fork, can be used to play back videos with hardware accelerated decoding. The hardware decoder path features interop with the GPU output, saving an expensive copyback operation. You can utilise the hardware decoding with e.g.:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm ''video''&lt;br /&gt;
&lt;br /&gt;
In mpv versions prior to 0.35, you can use the copyback hwdec with:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm-copy ''video''&lt;br /&gt;
&lt;br /&gt;
To build an mpv against the FFmpeg in your prefix, you can run&lt;br /&gt;
&lt;br /&gt;
  PKG_CONFIG_PATH=&amp;quot;/path/to/your/ffmpeg/prefix/lib/pkgconfig:$PKG_CONFIG_PATH&amp;quot; meson setup build&lt;br /&gt;
  ninja -C build&lt;br /&gt;
&lt;br /&gt;
== More Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://xnux.eu/devices/feature/cedrus-pp.html Megi's Cedrus Information]&lt;br /&gt;
* [https://briandaniels.me/2021/06/27/hardware-accelerated-video-playback-on-the-pinephone.html HW accelerated GStreamer playback on the PinePhone]&lt;br /&gt;
* [https://briandaniels.me/2021/07/06/hardware-accelerated-video-playback-on-the-pinephone-with-clapper.html HW accelerated Clapper video player on the PinePhone]&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Mainline Hardware Encoding]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:ROCKPro64]] [[Category:Rockchip RK3566]] [[Category:Rockchip RK3399]] [[Category:Pinebook Pro]] [[Category:PinePhone Pro]] [[Category:PineNote]] [[Category:Rockchip RK3588]] [[Category:Rockchip RK3328]] [[Category:ROCK64]] [[Category:Allwinner A64]] [[Category:PinePhone]] [[Category:PINE A64-LTS]] [[Category:SOPINE]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20611</id>
		<title>Mainline Hardware Decoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20611"/>
		<updated>2023-09-05T04:06:45Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* mpv */ used-&amp;gt;built&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hint|This page is incomplete, you're welcome to improve it.}}&lt;br /&gt;
&lt;br /&gt;
'''Mainline Hardware Decoding''' refers to video decoding done using hardware accelerators on the mainline Linux kernel (i.e. what sits in Linus' tree).&lt;br /&gt;
&lt;br /&gt;
On most consumer-oriented SoCs, there is what is referred to as a VPU (Video Processing Unit). The VPU is responsible for power-efficient encoding and decoding of videos. Hardware-accelerated video decoding can be useful to get smoother video playback on your devices, lower power consumption, and lower CPU utilisation. Below is information regarding various hardware PINE64 uses and software that works with it.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Here's a table of the current support for different hardware. &amp;quot;In review&amp;quot; means the patch series to enable support has been posted to the mailing lists but is undergoing review, &amp;quot;linux-next&amp;quot; means it has been accepted and staged for the next Linux merge window.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; {{Diagonal split header|Codec|SoC}}&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | A64&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3328&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3399&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3566&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3588&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | JPEG&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-2&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-4 Part 2/H.263&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP8&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.264/AVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.265/HEVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP9&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AVS2&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AV1&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;only Hantro, not rkvdec2, so with a maximum resolution of 1080p for now&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cedrus ===&lt;br /&gt;
&lt;br /&gt;
In 2018, Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which came to be called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the [https://linux-sunxi.org/Sunxi-Cedrus#Codec_Support Sunxi wiki].&lt;br /&gt;
&lt;br /&gt;
=== Hantro ===&lt;br /&gt;
&lt;br /&gt;
The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it [https://www.cnx-software.com/2020/11/24/hantro-h1-hardware-accelerated-video-encoding-support-in-mainline-linux/ was announced] that Bootlin was working on encoding support for the driver.&lt;br /&gt;
&lt;br /&gt;
=== rkvdec ===&lt;br /&gt;
&lt;br /&gt;
rkvdec is the video decoding hardware that's developed by Rockchip presumably in house. It's what Rockchip uses for decoding 4K H.264/AVC, VP9 and H.265/HEVC content. The driver in mainline linux for the first generation rkvdec (used in RK3328 and RK3399) supports VP9 and H.264, [https://patchwork.kernel.org/project/linux-rockchip/list/?series=659401 patches for HEVC support] are also in the process of review.&lt;br /&gt;
&lt;br /&gt;
RK3566, RK3568 and likely RK3588 use a second generation of rkvdec called rkvdec2. No mainline driver for this exists yet. The rkvdec instance on RK3588 additionally supports the [https://en.wikipedia.org/wiki/Audio_Video_Standard AVS2 video codec].&lt;br /&gt;
&lt;br /&gt;
=== rkdjpeg ===&lt;br /&gt;
&lt;br /&gt;
rkdjpeg is Rockchip's in-house hardware accelerated JPEG decoder. It can be found on the RK3566 and RK3568 as well as the RK3588.&lt;br /&gt;
&lt;br /&gt;
No mainline driver exists for it so far.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== GStreamer ===&lt;br /&gt;
H.264 video decoding is possible when using GStreamer built from source, or an application utilizing it such as [https://github.com/Rafostar/clapper Clapper] or [https://flathub.org/apps/details/org.sigxcpu.Livi µPlayer]. µPlayer includes a indicator of when hardware acceleration is properly working and in use.&lt;br /&gt;
&lt;br /&gt;
=== FFmpeg ===&lt;br /&gt;
&lt;br /&gt;
Mainline FFmpeg currently lacks the necessary patches to use the v4l2-requests based API, but [https://github.com/jernejsk/FFmpeg a fork that can utilise it exists]. Fedora users can install precompiled binaries from a [https://dl.kwizart.net/pub/ffmpeg-v4l2-request/ dedicated repository] by one of the Fedora maintainers.&lt;br /&gt;
&lt;br /&gt;
To build it, use something like&lt;br /&gt;
&lt;br /&gt;
 git clone -b v4l2-request-n6.0 https://github.com/jernejsk/FFmpeg.git&lt;br /&gt;
 cd FFmpeg&lt;br /&gt;
 ./configure --enable-v4l2-request --enable-libudev --enable-libdrm --enable-gnutls --prefix=/some/install/prefix/here&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
After compiling, you can install it into your specified prefix with&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
And then modify your PATH to include the prefix's bin directory.&lt;br /&gt;
&lt;br /&gt;
With the patched ffmpeg, you can utilise hardware decoding using the &amp;lt;code&amp;gt;-hwaccel drm&amp;lt;/code&amp;gt; parameter, e.g.:&lt;br /&gt;
&lt;br /&gt;
 ffmpeg -hwaccel drm -i input.mp4 -f null - -benchmark&lt;br /&gt;
&lt;br /&gt;
to measure how fast it decodes.&lt;br /&gt;
&lt;br /&gt;
=== mpv ===&lt;br /&gt;
&lt;br /&gt;
mpv v0.35 or later, built against the aforementioned FFmpeg fork, can be used to play back videos with hardware accelerated decoding. The hardware decoder path features interop with the GPU output, saving an expensive copyback operation. You can utilise the hardware decoding with e.g.:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm ''video''&lt;br /&gt;
&lt;br /&gt;
In mpv versions prior to 0.35, you can use the copyback hwdec with:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm-copy ''video''&lt;br /&gt;
&lt;br /&gt;
To build an mpv against the FFmpeg in your prefix, you can run&lt;br /&gt;
&lt;br /&gt;
  PKG_CONFIG_PATH=&amp;quot;/path/to/your/ffmpeg/prefix/lib/pkgconfig:$PKG_CONFIG_PATH&amp;quot; meson setup build&lt;br /&gt;
  ninja -C build&lt;br /&gt;
&lt;br /&gt;
== More Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://xnux.eu/devices/feature/cedrus-pp.html Megi's Cedrus Information]&lt;br /&gt;
* [https://briandaniels.me/2021/06/27/hardware-accelerated-video-playback-on-the-pinephone.html HW accelerated GStreamer playback on the PinePhone]&lt;br /&gt;
* [https://briandaniels.me/2021/07/06/hardware-accelerated-video-playback-on-the-pinephone-with-clapper.html HW accelerated Clapper video player on the PinePhone]&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Mainline Hardware Encoding]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:ROCKPro64]] [[Category:Rockchip RK3566]] [[Category:Rockchip RK3399]] [[Category:Pinebook Pro]] [[Category:PinePhone Pro]] [[Category:PineNote]] [[Category:Rockchip RK3588]] [[Category:Rockchip RK3328]] [[Category:ROCK64]] [[Category:Allwinner A64]] [[Category:PinePhone]] [[Category:PINE A64-LTS]] [[Category:SOPINE]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20610</id>
		<title>Mainline Hardware Decoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Mainline_Hardware_Decoding&amp;diff=20610"/>
		<updated>2023-09-05T04:04:28Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* mpv */ This isn't generally true, only when the ABI doesn't change, which isn't guaranteed, and mpv strongly recommends only running against the FFmpeg it was built with.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hint|This page is incomplete, you're welcome to improve it.}}&lt;br /&gt;
&lt;br /&gt;
'''Mainline Hardware Decoding''' refers to video decoding done using hardware accelerators on the mainline Linux kernel (i.e. what sits in Linus' tree).&lt;br /&gt;
&lt;br /&gt;
On most consumer-oriented SoCs, there is what is referred to as a VPU (Video Processing Unit). The VPU is responsible for power-efficient encoding and decoding of videos. Hardware-accelerated video decoding can be useful to get smoother video playback on your devices, lower power consumption, and lower CPU utilisation. Below is information regarding various hardware PINE64 uses and software that works with it.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Here's a table of the current support for different hardware. &amp;quot;In review&amp;quot; means the patch series to enable support has been posted to the mailing lists but is undergoing review, &amp;quot;linux-next&amp;quot; means it has been accepted and staged for the next Linux merge window.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; {{Diagonal split header|Codec|SoC}}&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | A64&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3328&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3399&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3566&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3588&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | JPEG&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-2&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | MPEG-4 Part 2/H.263&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP8&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.264/AVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.265/HEVC&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| In review&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP9&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AVS2&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | AV1&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;only Hantro, not rkvdec2, so with a maximum resolution of 1080p for now&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cedrus ===&lt;br /&gt;
&lt;br /&gt;
In 2018, Bootlin launched a crowdfunding campaign to bring a open source Allwinner VPU driver to mainline Linux, which came to be called Cedrus. The Cedrus media driver (For Allwinner SOCs such as A64) supported by mainline Linux supports H.264 and H.265 video decoding as of Linux 5.10, and with 5.11 came VP8 decoding support and a H.264 stateless video decoder interface. For more information refer to the [https://linux-sunxi.org/Sunxi-Cedrus#Codec_Support Sunxi wiki].&lt;br /&gt;
&lt;br /&gt;
=== Hantro ===&lt;br /&gt;
&lt;br /&gt;
The Hantro media driver supports Rockchip and NXP SoCs including the RK3399 used in the Pinebook Pro and RockPro64. In November 2020 it [https://www.cnx-software.com/2020/11/24/hantro-h1-hardware-accelerated-video-encoding-support-in-mainline-linux/ was announced] that Bootlin was working on encoding support for the driver.&lt;br /&gt;
&lt;br /&gt;
=== rkvdec ===&lt;br /&gt;
&lt;br /&gt;
rkvdec is the video decoding hardware that's developed by Rockchip presumably in house. It's what Rockchip uses for decoding 4K H.264/AVC, VP9 and H.265/HEVC content. The driver in mainline linux for the first generation rkvdec (used in RK3328 and RK3399) supports VP9 and H.264, [https://patchwork.kernel.org/project/linux-rockchip/list/?series=659401 patches for HEVC support] are also in the process of review.&lt;br /&gt;
&lt;br /&gt;
RK3566, RK3568 and likely RK3588 use a second generation of rkvdec called rkvdec2. No mainline driver for this exists yet. The rkvdec instance on RK3588 additionally supports the [https://en.wikipedia.org/wiki/Audio_Video_Standard AVS2 video codec].&lt;br /&gt;
&lt;br /&gt;
=== rkdjpeg ===&lt;br /&gt;
&lt;br /&gt;
rkdjpeg is Rockchip's in-house hardware accelerated JPEG decoder. It can be found on the RK3566 and RK3568 as well as the RK3588.&lt;br /&gt;
&lt;br /&gt;
No mainline driver exists for it so far.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== GStreamer ===&lt;br /&gt;
H.264 video decoding is possible when using GStreamer built from source, or an application utilizing it such as [https://github.com/Rafostar/clapper Clapper] or [https://flathub.org/apps/details/org.sigxcpu.Livi µPlayer]. µPlayer includes a indicator of when hardware acceleration is properly working and in use.&lt;br /&gt;
&lt;br /&gt;
=== FFmpeg ===&lt;br /&gt;
&lt;br /&gt;
Mainline FFmpeg currently lacks the necessary patches to use the v4l2-requests based API, but [https://github.com/jernejsk/FFmpeg a fork that can utilise it exists]. Fedora users can install precompiled binaries from a [https://dl.kwizart.net/pub/ffmpeg-v4l2-request/ dedicated repository] by one of the Fedora maintainers.&lt;br /&gt;
&lt;br /&gt;
To build it, use something like&lt;br /&gt;
&lt;br /&gt;
 git clone -b v4l2-request-n6.0 https://github.com/jernejsk/FFmpeg.git&lt;br /&gt;
 cd FFmpeg&lt;br /&gt;
 ./configure --enable-v4l2-request --enable-libudev --enable-libdrm --enable-gnutls --prefix=/some/install/prefix/here&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
After compiling, you can install it into your specified prefix with&lt;br /&gt;
&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
And then modify your PATH to include the prefix's bin directory.&lt;br /&gt;
&lt;br /&gt;
With the patched ffmpeg, you can utilise hardware decoding using the &amp;lt;code&amp;gt;-hwaccel drm&amp;lt;/code&amp;gt; parameter, e.g.:&lt;br /&gt;
&lt;br /&gt;
 ffmpeg -hwaccel drm -i input.mp4 -f null - -benchmark&lt;br /&gt;
&lt;br /&gt;
to measure how fast it decodes.&lt;br /&gt;
&lt;br /&gt;
=== mpv ===&lt;br /&gt;
&lt;br /&gt;
mpv v0.35 or later, used against the aforementioned FFmpeg fork, can be used to play back videos with hardware accelerated decoding. The hardware decoder path features interop with the GPU output, saving an expensive copyback operation. You can utilise the hardware decoding with e.g.:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm ''video''&lt;br /&gt;
&lt;br /&gt;
In mpv versions prior to 0.35, you can use the copyback hwdec with:&lt;br /&gt;
&lt;br /&gt;
  mpv --hwdec=drm-copy ''video''&lt;br /&gt;
&lt;br /&gt;
To build an mpv against the FFmpeg in your prefix, you can run&lt;br /&gt;
&lt;br /&gt;
  PKG_CONFIG_PATH=&amp;quot;/path/to/your/ffmpeg/prefix/lib/pkgconfig:$PKG_CONFIG_PATH&amp;quot; meson setup build&lt;br /&gt;
  ninja -C build&lt;br /&gt;
&lt;br /&gt;
== More Resources ==&lt;br /&gt;
&lt;br /&gt;
* [https://xnux.eu/devices/feature/cedrus-pp.html Megi's Cedrus Information]&lt;br /&gt;
* [https://briandaniels.me/2021/06/27/hardware-accelerated-video-playback-on-the-pinephone.html HW accelerated GStreamer playback on the PinePhone]&lt;br /&gt;
* [https://briandaniels.me/2021/07/06/hardware-accelerated-video-playback-on-the-pinephone-with-clapper.html HW accelerated Clapper video player on the PinePhone]&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Mainline Hardware Encoding]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:ROCKPro64]] [[Category:Rockchip RK3566]] [[Category:Rockchip RK3399]] [[Category:Pinebook Pro]] [[Category:PinePhone Pro]] [[Category:PineNote]] [[Category:Rockchip RK3588]] [[Category:Rockchip RK3328]] [[Category:ROCK64]] [[Category:Allwinner A64]] [[Category:PinePhone]] [[Category:PINE A64-LTS]] [[Category:SOPINE]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Mainline_Hardware_Encoding&amp;diff=20609</id>
		<title>Mainline Hardware Encoding</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Mainline_Hardware_Encoding&amp;diff=20609"/>
		<updated>2023-09-05T04:01:20Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Update, add notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Mainline Hardware Encoding''' of video can be achieved through the V4L2 user-space API, for which currently only GStreamer implements the required code.&lt;br /&gt;
&lt;br /&gt;
== SoC Support ==&lt;br /&gt;
&lt;br /&gt;
The following table shows the current supported codecs for encoding for each SoC. Support for decoding is separate.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; {{Diagonal split header|Codec|SoC}}&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3328&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3399&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3566&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | RK3588&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | JPEG&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;| Yes&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | VP8&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| RFC&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/20230309125651.23911-1-andrzej.p@collabora.com/T/]&amp;lt;/sup&amp;gt;&amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;| RFC&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/20230309125651.23911-1-andrzej.p@collabora.com/T/]&amp;lt;/sup&amp;gt;&amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.264/AVC&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | H.265/HEVC&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;| N/A&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;| No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;Userspace API [https://lore.kernel.org/linux-media/ZK2NiQd1KnraAr20@aptenodytes/ under discussion] as part of the V4L2 stateless encoder uAPI development, with experimental implementations being worked on.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Encoding With GStreamer ==&lt;br /&gt;
&lt;br /&gt;
With GStreamer, in general, any V4L2 control can be set using the &amp;lt;code&amp;gt;extra-controls=foo,name=value&amp;lt;/code&amp;gt; syntax after the encode pipeline stage identifier, where &amp;lt;code&amp;gt;foo&amp;lt;/code&amp;gt; is any name you wish which GStreamer will promptly ignore, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; is the name of the V4L2 control as shown by &amp;lt;code&amp;gt;v4l2-ctl --list-ctrls&amp;lt;/code&amp;gt; (make sure to pick the right device with &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;), and &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is whatever value you want to set it to.&lt;br /&gt;
&lt;br /&gt;
=== JPEG Encoding ===&lt;br /&gt;
&lt;br /&gt;
This example converts an input MP4 file to an output MJPEG-inside-MKV file at JPEG quality 95, without any audio.&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 filesrc location=input.mp4 ! qtdemux name=demux demux.video_0 ! decodebin ! videoconvert ! v4l2jpegenc extra-controls=s,compression_quality=95 ! matroskamux ! filesink location=output.mkv&lt;br /&gt;
&lt;br /&gt;
=== VP8 Encoding ===&lt;br /&gt;
&lt;br /&gt;
{{hint|'''Note:''' This requires a draft [https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3736 GStreamer merge request] and the RFC kernel patchset applied.}}&lt;br /&gt;
{{note|'''Note:''' Patchset no longer applies cleanly, as AV1 decode controls were introduced and conflict.}}&lt;br /&gt;
&lt;br /&gt;
This example converts an input MP4 file to an output VP8-inside-MKV file with a quantiser between 12 and 28, without any audio. The quantiser value goes from 0 (best quality, biggest filesize) to 63 (worst quality, smallest filesize).&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 filesrc location=input.mp4 ! qtdemux name=demux demux.video_0 ! decodebin ! videoconvert ! v4l2slvp8enc min-quality=12 max-quality=28 ! queue ! matroskamux ! filesink location=output.mkv&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can encode in variable bitrate mode with a target bitrate given in bits per second. Do note that Hantro doesn't seem to do target bitrates below 2 mbit/s. In this example, the file is transcoded at a target bitrate of 3 megabits per second.&lt;br /&gt;
&lt;br /&gt;
 gst-launch-1.0 filesrc location=input.mp4 ! qtdemux name=demux demux.video_0 ! decodebin ! videoconvert ! v4l2slvp8enc bitrate=3000000 ! queue ! matroskamux ! filesink location=output.mkv&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Mainline Hardware Decoding]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:ROCKPro64]] [[Category:Rockchip RK3566]] [[Category:Rockchip RK3399]] [[Category:Pinebook Pro]] [[Category:PinePhone Pro]] [[Category:PineNote]] [[Category:Rockchip RK3588]] [[Category:Rockchip RK3328]] [[Category:ROCK64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20597</id>
		<title>Quartz64 Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20597"/>
		<updated>2023-08-31T12:45:36Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Current Status */ DSI-&amp;gt;Confirmed working&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents the current status of software support for the [[Quartz64]] single-board computer, and provides links to resources to help prospective contributors get started. Information is kept current on a best-effort basis as various patches get accepted into the kernel.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== Upstreaming Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Status&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Component&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Notes&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Applies To&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Output&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchipdrm/VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
As of 5.19-rc1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/604be85547ce4d61b89292d2f9a78c721b778c16]&amp;lt;/sup&amp;gt;, Also featured in Phoronix Article&amp;lt;sup&amp;gt;[https://www.phoronix.com/scan.php?page=news_item&amp;amp;px=Rockchip-VOP2-Linux-5.19]&amp;lt;/sup&amp;gt;, 4k@30 support and other improvements in 6.4-rc1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/83b61f817f43ed67572d1e241c9f552e0a8bfff4]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-edpphy-naneng&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/blob/quartz64/drivers/phy/rockchip/phy-rockchip-naneng-edp.c] and [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/commit/d7ad116fb30d11d110aeb880754cf27f34c45c40#7e8e2ef87e479c54539dc519c0b92d6b31727f8d_671_681] Coordinate any porting with Rockchip first&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;dw-mipi-dsi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/e18d9b093006d8abd53e1ce13c0d5a8d0fcd5f64]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3D Acceleration &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Upstream Mesa&lt;br /&gt;
| &amp;lt;code&amp;gt;panfrost&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/810028668c6d9da25664195d6b906c98a8169f72]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Decode &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot; rowspan=&amp;quot;3&amp;quot;|GStreamer only, no ffmpeg&amp;lt;sup&amp;gt;[https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=2898]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;hantro&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU121 handling 1080p MPEG-2, VP8 and H.264. Mainline as of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/5f6bfab6da6531238e899fdf29efd6d0185adc3e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkvdec2&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU346 handling 4K H.265, H.264 and VP9&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkdjpeg&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU720 handling JPEG, [[User:CounterPillow]] is working on this&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;5&amp;quot; | [[Mainline Hardware Encoding|Video Encode]] &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;text-align:center; background:LightYellow;&amp;quot;|GStreamer only&lt;br /&gt;
| JPEG on VEPU121&lt;br /&gt;
| Hantro-based. Mainline as of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/6f1ae821a6c4aa9d5b8f437b27ec86fb569219fd]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| VP8 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.265 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Audio &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-i2s-tdm&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/43b058698f723e3c2087af7069c0da082a3ecbe1]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-spdif&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/dac825b6a6bdca41347e25f07354ad94fdc97445]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-codec&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0d6a04da9b25b9a7cf2cac5f5079e3296d3bee0f]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
| Quartz64 Model A/B&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Bootloader&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/16952]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TF-A&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|Merged&lt;br /&gt;
| &amp;lt;code&amp;gt;U-Boot&amp;lt;/code&amp;gt;&lt;br /&gt;
| [[#Mainline_U-Boot_Work|See below]]. Quartz64 and SOQuartz as of v2023.10-rc2&amp;lt;sup&amp;gt;[https://source.denx.de/u-boot/u-boot/-/commit/4e619e8d4fd68095bc665a78f2651d8e478a4534]&amp;lt;/sup&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In progress&amp;lt;sup&amp;gt;[https://github.com/jaredmcneill/quartz64_uefi]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;Tianocore EDK II&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;4&amp;quot; | Device Tree&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/b33a22a1e7c4248608e533fc4fa524258b3fae84]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c37415f55bdadffe5b4c0e7981e9fc7e8b96beea]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| SOQuartz&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c466828fb3ba8cb7f5c3bf28766da9b70bf9745e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| SOQuartz&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| PineNote&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d449121e5e8addcee654250cec298c887ecafb32]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| PineNote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot;| Gigabit Ethernet&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3566-gmac&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/3bb3d6b1c1957e88bfc5e77a4557f7e6ba761fe3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;yt8511-phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/48e8c6f1612b3d2dccaea2285231def830cc5b8e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | IOMMU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-iommu&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c55356c534aa651ccc3053ef2d5d8d810adacf5f]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | GPIO&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;gpio-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/936ee2675eee1faca0dcdfa79165c7990422e0fc]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | pinctrl&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Thermal Regulation&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-thermal&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/4b14c055a6f644cbeb1156ba24647e92fe51ec69]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | PCIe&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;pcie-dw-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0e898eb8df4e34c7b129452444eb7cef68a11f43]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Power Management&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-pm-domains&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/1782c87b44a0b1a527f01a6a184677c58ccbf9c7]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Voltage Control&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3568-pmu-io-voltage-domain&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/28b05a64e47cbceebb8a5f3f643033148d5c06c3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | SPI &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;spi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d74d99229f4d48f42d674f7a8a1137179efd67ac]&amp;lt;/sup&amp;gt;. Necessary device tree changes [https://patchwork.kernel.org/project/linux-rockchip/list/?series=586691 in review].&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Battery&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-charger&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/power/supply/rk817_charger.c?id=11cb8da0189b417392e2334ae967b0ba1f0d1be8]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A, Pinenote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Microphone&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-saradc&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7786da3b5ae167c17f35e22ba35e06006338c2f6]&amp;lt;/sup&amp;gt;. Headphone jack mic seems to connect to &amp;lt;code&amp;gt;SARADC_VIN2_HP_HOOK&amp;lt;/code&amp;gt;, so I'm pretty sure that the dtsi and driver changes are needed for that mic to work&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | USB 2.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-usb2phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.17&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/phy/rockchip?h=v5.17-rc1&amp;amp;id=42b559727a45d79c811f493515eb9b7e56016421]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | e-Ink&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review (RFC)&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/20220413221916.50995-1-samuel@sholland.org/T/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-ebc&amp;lt;/code&amp;gt;&lt;br /&gt;
| A DRM driver is available [https://github.com/smaeul/linux/commits/rk35/ebc-drm-v5 here]; also see [[RK3566 EBC Reverse-Engineering]]&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Combo PHY&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;naneng-combphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7160820d742a16313f7802e33c2956c19548e488]&amp;lt;/sup&amp;gt;. Still requires DTS changes&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | RGA&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|Linux Mainline; Could be improved&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rga&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.5[https://git.kernel.org/linus/0c3391f8bb06b744df521651534cd99e3d77e0a8]&amp;lt;/sup&amp;gt;. Note that there's still a '4GB' problem and it's implementations has room for improvements (to put it midly  &amp;lt;sup&amp;gt;[https://lore.kernel.org/all/20230522102953.GB23678@pengutronix.de/]&amp;lt;/sup&amp;gt; and &amp;lt;sup&amp;gt;[https://lore.kernel.org/all/b404dc20-c460-ac3f-6659-8be7a7d32bfe@arm.com/]&amp;lt;/sup&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Fan Controller&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;gp7101&amp;lt;/code&amp;gt;&lt;br /&gt;
| Someone should write a pwm driver for it so we can then use pwm-fan&lt;br /&gt;
| SOQuartz Blade&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | CSI Camera&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rkisp&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/media/platform/rockchip/isp]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-inno-csidphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/29c99fb085ad53e6d5504d1f8d32e6673b9b3a2c]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | NPU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &lt;br /&gt;
| Downstream version is a closed source SDK and [https://github.com/dieselnutjob/kernel-rk3566/tree/linux-4.19.210/drivers/rknpu open source kernel module rknpu]. Major undertaking to reimplement this as Linux does not (yet) appear to have a generic architecture for neural accelerators.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Crypto&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rk-crypto&amp;lt;/code&amp;gt; v2&lt;br /&gt;
| Downstream driver [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/crypto/rockchip] doesn't include a rk3568 compatible either, but the TRM shows that it seemingly matches.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | TRNG&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://patchwork.kernel.org/project/linux-rockchip/list/?series=699813&amp;amp;archive=both]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rng&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | Wi-Fi&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;bes2600&amp;lt;/code&amp;gt;&lt;br /&gt;
| A downstream driver is available but it makes use of some custom Rockchip interfaces and is designed for older kernels, plans are being made to port it to DKMS.&lt;br /&gt;
| PineTab 2&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
The following sections give an overview over the current status of different parts of the board. Some parts are waiting on a driver to be written or ported, others only need various adjustments.&lt;br /&gt;
&lt;br /&gt;
According to pgwipeout, I/O device performance is within expected ranges now.&lt;br /&gt;
&lt;br /&gt;
=== Working ===&lt;br /&gt;
&lt;br /&gt;
* eMMC&lt;br /&gt;
* SDMMC0 (SD cards)&lt;br /&gt;
* GMAC (Gigabit Ethernet)&lt;br /&gt;
* USB 2.0&lt;br /&gt;
* SATA 2&lt;br /&gt;
* SATA 3&lt;br /&gt;
* UART&lt;br /&gt;
** UART 0 (Pi-bus)&lt;br /&gt;
** UART 1 (Bluetooth)&lt;br /&gt;
** UART 2 (Pi-bus, debug)&lt;br /&gt;
* Video Decode&lt;br /&gt;
** VP8&lt;br /&gt;
** H.264&lt;br /&gt;
* Video Encode&lt;br /&gt;
** JPEG (it's pretty bad)&lt;br /&gt;
* Battery&lt;br /&gt;
* GPU&lt;br /&gt;
* Video Output&lt;br /&gt;
** HDMI&lt;br /&gt;
** DSI&lt;br /&gt;
* Audio&lt;br /&gt;
** Analog audio works&lt;br /&gt;
** SPDIF works&lt;br /&gt;
** HDMI works&lt;br /&gt;
* SPI &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
&lt;br /&gt;
=== Partially Working ===&lt;br /&gt;
&lt;br /&gt;
* PCI-Express Controller &amp;amp;mdash; everything but devices that need cache coherency (e.g. dGPUs) should work&lt;br /&gt;
** [[User:CounterPillow]] noticed some weirdness with NVMe devices disconnecting during heavy write operations, likely down due to power draw on one of the rails as the same sustained bandwidth could be achieved with a different PCIe device with no issue.&lt;br /&gt;
* SDMMC1 (Wi-Fi) &amp;amp;mdash; AP6256 working, BL602 needs some work to make it flash firmware&lt;br /&gt;
* [https://developer.arm.com/architectures/system-architectures/system-components/arm-generic-interrupt-controller GIC] &amp;amp;mdash; needs errata published by Rockchip to get upstream to add device-specific workarounds&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/CAMdYzYrQ5f-mv_VmTq_CRf9tR=j3mwRpKHNLmPFgCF9whsGFRw@mail.gmail.com/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Confirmed Broken ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;USB 3.0 (applies to Model A only) &amp;amp;mdash; only works with very short cables and depends on the device. This is due to a hardware design issue relating to the coupling capacitors needed for SATA, which shares the same lines as USB 3.0.&lt;br /&gt;
** Hardware design changes have been suggested to engineers, it's in their hands now.&amp;lt;/s&amp;gt;&lt;br /&gt;
** Fixed in newer revisions by leaving SATA unpopulated&lt;br /&gt;
* RGA &amp;amp;mdash; only works with memory &amp;amp;le; 4 GiB, because Rockchip didn't make the address registers larger. Oopsie.&lt;br /&gt;
&lt;br /&gt;
=== Needs Testing ===&lt;br /&gt;
&lt;br /&gt;
* E-Paper&lt;br /&gt;
* Microphone Input&lt;br /&gt;
* CSI &amp;amp;mdash; needs CIF driver&lt;br /&gt;
* eDP &amp;amp;mdash; needs PHY driver and controller driver&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
=== ebc-dev Reverse Engineering and Development ===&lt;br /&gt;
&lt;br /&gt;
The [https://gitlab.com/pine64-org/quartz-bsp/linux-next/-/tree/rk356x-ebc-dev driver for the eInk panel] needs to both be reverse engineered and then rewritten as C. In its current form, it is mostly an assembly dump produced by gcc with debug symbols. See [[RK3566 EBC Reverse-Engineering]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Investigate MCU ===&lt;br /&gt;
&lt;br /&gt;
The RK3566 comes with an integrated RISC-V microcontroller (MCU). It communicates with the A55 host through the Mailbox system driven by the rockchip-mailbox driver. Since this MCU would be quite useful for things such as low power standby mode, investigating how it can be turned on and have firmware flashed to it should greatly enhance the power saving features of the PineNote.&lt;br /&gt;
&lt;br /&gt;
I (liamur) [https://github.com/liamhays/rk3566-mcu did some investigation] into the MCU and found that it is disabled by TF-A on suspend, and doesn't reside in a low-power part of the RK3566 anyway. It does however have access to most of the chip and could be used as (for example) a real-time coprocessor.&lt;br /&gt;
&lt;br /&gt;
=== Mainline U-Boot Work ===&lt;br /&gt;
&lt;br /&gt;
We currently use the &amp;quot;downstream&amp;quot; Rockchip U-Boot, which is based on an old version of U-Boot and contains vendor specific patches that have not undergone the same level of code review as they'd have done had they been submitted upstream.&lt;br /&gt;
&lt;br /&gt;
While the lack of ATF sources means that using mainline U-Boot would still require the use of Rockchip provided binaries for the firmware, even with Rockchip blobs, a more modern version of U-Boot will be much nicer to use.&lt;br /&gt;
&lt;br /&gt;
Mainline U-Boot contains good enough support for the RK3566 SoC used on the Quartz64 as of v2023.07 and have support for Quartz64 and SOQuartz as of v2023.10-rc2. Drivers for [https://patchwork.ozlabs.org/cover/1817577/ ethernet GMAC] and [https://patchwork.ozlabs.org/patch/1817295/ Motorcomm PHY] have been submitted for review.&lt;br /&gt;
&lt;br /&gt;
==== Things that could be done ====&lt;br /&gt;
&lt;br /&gt;
This list is non-exhaustive as we don't exactly know how much is missing&lt;br /&gt;
&lt;br /&gt;
* Port a basic VOP2 driver to get a framebuffer from u-boot&lt;br /&gt;
&lt;br /&gt;
==== List of Useful Resources for this Task ====&lt;br /&gt;
* Downstream Rockchip U-Boot repository with Quartz64 specific patches: https://gitlab.com/pgwipeout/u-boot-rockchip/-/tree/quartz64&lt;br /&gt;
* Mainline Rockchip custodian U-Boot repository: https://source.denx.de/u-boot/custodians/u-boot-rockchip&lt;br /&gt;
* U-Boot Mailing List: https://lists.denx.de/listinfo/u-boot&lt;br /&gt;
&lt;br /&gt;
=== eDP Driver Porting ===&lt;br /&gt;
&lt;br /&gt;
The eDP PHY driver and controller driver needs to be ported, brought into shape and submitted with proper commit attribution to the Rockchip authors.&lt;br /&gt;
&lt;br /&gt;
[[User:CounterPillow]] has experimentally ported stuff, but it's currently not working.&lt;br /&gt;
&lt;br /&gt;
== Linux Kernel Config Options ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_I2S_TDM&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog and HDMI audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog audio on the Model A&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_STMMAC_ETH&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DWMAC_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model A, set this one to Y, m won't work out of the box if the generic PHY driver is y and binds first. Alternatively tell users in board-specific setup instructions to force including the &amp;lt;code&amp;gt;motorcomm&amp;lt;/code&amp;gt; module in initramfs if you set it to m.&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REALTEK_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model B&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_SDHCI_OF_DWCMSHC&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PCIE_ROCKCHIP_DW_HOST&amp;lt;/code&amp;gt;&lt;br /&gt;
** PCIe&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** PHY for PCIe/SATA/USB3&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DRM_PANFROST&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPU&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_SPDIF&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPDIF audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_DW_HDMI&amp;lt;/code&amp;gt;&lt;br /&gt;
** HDMI PHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI DSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
** Video output&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ARCH_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_USB2&amp;lt;/code&amp;gt;&lt;br /&gt;
** USB 2&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_RTC_DRV_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MFD_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Various things relating to the RK817 chip&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_CHARGER_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** RK817 charger&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REGULATOR_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Voltage regulators&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PM_DOMAINS&amp;lt;/code&amp;gt;&lt;br /&gt;
** Power management domains&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_GPIO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PINCTRL_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO and general SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PWM_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** PWM support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IOMMU&amp;lt;/code&amp;gt;&lt;br /&gt;
** IOMMU support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_MBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
** Mailbox support (for communication with MCU)&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_SARADC&amp;lt;/code&amp;gt;&lt;br /&gt;
** Analog-to-digital conversion support, for e.g. microphones&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_THERMAL&amp;lt;/code&amp;gt;&lt;br /&gt;
** Temperature sensor and thermal throttling support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SPI_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPI support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_VIDEO_HANTRO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Hardware video decoder support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IODOMAIN&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support so your I/O pins have the right voltage&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Common clock support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI CSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_I2C_RK3X&amp;lt;/code&amp;gt;&lt;br /&gt;
** I2C support&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
* pgwipeout's kernel tree&lt;br /&gt;
** https://gitlab.com/pgwipeout/linux-next/-/tree/quartz64-v5.15-rc1&lt;br /&gt;
* BSP based development effort for SPL/U-Boot and Linux&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp&lt;br /&gt;
* Image CI pipeline aimed at developers&lt;br /&gt;
** https://gitlab.com/pgwipeout/quartz64_ci/&lt;br /&gt;
* Rockchip U-Boot&lt;br /&gt;
** https://github.com/rockchip-linux/u-boot&lt;br /&gt;
* Downstream rockchip-linux kernel tree&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux&lt;br /&gt;
* Tianocore EDK II port for UEFI on Quartz64&lt;br /&gt;
** https://github.com/jaredmcneill/quartz64_uefi&lt;br /&gt;
* Mainline U-Boot Port by pgwipeout&lt;br /&gt;
** https://gitlab.com/pgwipeout/u-boot-quartz64&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* Rockchip-SoC Patchwork Page&lt;br /&gt;
** https://patchwork.kernel.org/project/linux-rockchip/list/&lt;br /&gt;
* Rockchip Kernel Mailing List Archive&lt;br /&gt;
** https://lore.kernel.org/linux-rockchip/&lt;br /&gt;
&lt;br /&gt;
== Board/SoC Documentation ==&lt;br /&gt;
=== Booting ===&lt;br /&gt;
==== Boot Order ====&lt;br /&gt;
The RK3566 boot ROM will search for a valid ID BLOCK in the following order on the support boot media:&lt;br /&gt;
&lt;br /&gt;
* SPI NOR flash&lt;br /&gt;
* SPI NAND flash&lt;br /&gt;
* eMMC&lt;br /&gt;
* SD-Card&lt;br /&gt;
&lt;br /&gt;
... if this fails, the boot ROM will initialize the USB0 port and wait for a connection from the Rockchip&lt;br /&gt;
flash/boot tools.&lt;br /&gt;
&lt;br /&gt;
==== Bootloader Flashing ====&lt;br /&gt;
&lt;br /&gt;
As per pgwipeout's [https://gitlab.com/pine64-org/quartz-bsp/u-boot/-/commit/12d102b86813378af08b086f3b9c13ed8010754c commit message]:&lt;br /&gt;
* Make a partition named &amp;lt;code&amp;gt;uboot&amp;lt;/code&amp;gt; as partition number 1 at 8 MiB to 16 MiB&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=idblock.bin of=/dev/''&amp;lt;mmc/sd&amp;gt;'' seek=64&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=uboot.img of=/dev/''&amp;lt;mmc/sd&amp;gt;''1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSP Image Layout ====&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]][[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20596</id>
		<title>Quartz64 Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20596"/>
		<updated>2023-08-31T12:44:06Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Confirmed Broken */ USB 3 update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents the current status of software support for the [[Quartz64]] single-board computer, and provides links to resources to help prospective contributors get started. Information is kept current on a best-effort basis as various patches get accepted into the kernel.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== Upstreaming Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Status&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Component&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Notes&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Applies To&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Output&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchipdrm/VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
As of 5.19-rc1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/604be85547ce4d61b89292d2f9a78c721b778c16]&amp;lt;/sup&amp;gt;, Also featured in Phoronix Article&amp;lt;sup&amp;gt;[https://www.phoronix.com/scan.php?page=news_item&amp;amp;px=Rockchip-VOP2-Linux-5.19]&amp;lt;/sup&amp;gt;, 4k@30 support and other improvements in 6.4-rc1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/83b61f817f43ed67572d1e241c9f552e0a8bfff4]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-edpphy-naneng&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/blob/quartz64/drivers/phy/rockchip/phy-rockchip-naneng-edp.c] and [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/commit/d7ad116fb30d11d110aeb880754cf27f34c45c40#7e8e2ef87e479c54539dc519c0b92d6b31727f8d_671_681] Coordinate any porting with Rockchip first&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;dw-mipi-dsi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/e18d9b093006d8abd53e1ce13c0d5a8d0fcd5f64]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3D Acceleration &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Upstream Mesa&lt;br /&gt;
| &amp;lt;code&amp;gt;panfrost&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/810028668c6d9da25664195d6b906c98a8169f72]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Decode &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot; rowspan=&amp;quot;3&amp;quot;|GStreamer only, no ffmpeg&amp;lt;sup&amp;gt;[https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=2898]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;hantro&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU121 handling 1080p MPEG-2, VP8 and H.264. Mainline as of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/5f6bfab6da6531238e899fdf29efd6d0185adc3e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkvdec2&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU346 handling 4K H.265, H.264 and VP9&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkdjpeg&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU720 handling JPEG, [[User:CounterPillow]] is working on this&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;5&amp;quot; | [[Mainline Hardware Encoding|Video Encode]] &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;text-align:center; background:LightYellow;&amp;quot;|GStreamer only&lt;br /&gt;
| JPEG on VEPU121&lt;br /&gt;
| Hantro-based. Mainline as of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/6f1ae821a6c4aa9d5b8f437b27ec86fb569219fd]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| VP8 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.265 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Audio &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-i2s-tdm&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/43b058698f723e3c2087af7069c0da082a3ecbe1]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-spdif&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/dac825b6a6bdca41347e25f07354ad94fdc97445]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-codec&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0d6a04da9b25b9a7cf2cac5f5079e3296d3bee0f]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
| Quartz64 Model A/B&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Bootloader&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/16952]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TF-A&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|Merged&lt;br /&gt;
| &amp;lt;code&amp;gt;U-Boot&amp;lt;/code&amp;gt;&lt;br /&gt;
| [[#Mainline_U-Boot_Work|See below]]. Quartz64 and SOQuartz as of v2023.10-rc2&amp;lt;sup&amp;gt;[https://source.denx.de/u-boot/u-boot/-/commit/4e619e8d4fd68095bc665a78f2651d8e478a4534]&amp;lt;/sup&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In progress&amp;lt;sup&amp;gt;[https://github.com/jaredmcneill/quartz64_uefi]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;Tianocore EDK II&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;4&amp;quot; | Device Tree&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/b33a22a1e7c4248608e533fc4fa524258b3fae84]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c37415f55bdadffe5b4c0e7981e9fc7e8b96beea]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| SOQuartz&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c466828fb3ba8cb7f5c3bf28766da9b70bf9745e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| SOQuartz&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| PineNote&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d449121e5e8addcee654250cec298c887ecafb32]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| PineNote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot;| Gigabit Ethernet&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3566-gmac&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/3bb3d6b1c1957e88bfc5e77a4557f7e6ba761fe3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;yt8511-phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/48e8c6f1612b3d2dccaea2285231def830cc5b8e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | IOMMU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-iommu&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c55356c534aa651ccc3053ef2d5d8d810adacf5f]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | GPIO&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;gpio-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/936ee2675eee1faca0dcdfa79165c7990422e0fc]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | pinctrl&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Thermal Regulation&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-thermal&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/4b14c055a6f644cbeb1156ba24647e92fe51ec69]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | PCIe&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;pcie-dw-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0e898eb8df4e34c7b129452444eb7cef68a11f43]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Power Management&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-pm-domains&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/1782c87b44a0b1a527f01a6a184677c58ccbf9c7]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Voltage Control&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3568-pmu-io-voltage-domain&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/28b05a64e47cbceebb8a5f3f643033148d5c06c3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | SPI &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;spi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d74d99229f4d48f42d674f7a8a1137179efd67ac]&amp;lt;/sup&amp;gt;. Necessary device tree changes [https://patchwork.kernel.org/project/linux-rockchip/list/?series=586691 in review].&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Battery&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-charger&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/power/supply/rk817_charger.c?id=11cb8da0189b417392e2334ae967b0ba1f0d1be8]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A, Pinenote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Microphone&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-saradc&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7786da3b5ae167c17f35e22ba35e06006338c2f6]&amp;lt;/sup&amp;gt;. Headphone jack mic seems to connect to &amp;lt;code&amp;gt;SARADC_VIN2_HP_HOOK&amp;lt;/code&amp;gt;, so I'm pretty sure that the dtsi and driver changes are needed for that mic to work&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | USB 2.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-usb2phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.17&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/phy/rockchip?h=v5.17-rc1&amp;amp;id=42b559727a45d79c811f493515eb9b7e56016421]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | e-Ink&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review (RFC)&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/20220413221916.50995-1-samuel@sholland.org/T/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-ebc&amp;lt;/code&amp;gt;&lt;br /&gt;
| A DRM driver is available [https://github.com/smaeul/linux/commits/rk35/ebc-drm-v5 here]; also see [[RK3566 EBC Reverse-Engineering]]&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Combo PHY&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;naneng-combphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7160820d742a16313f7802e33c2956c19548e488]&amp;lt;/sup&amp;gt;. Still requires DTS changes&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | RGA&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|Linux Mainline; Could be improved&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rga&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.5[https://git.kernel.org/linus/0c3391f8bb06b744df521651534cd99e3d77e0a8]&amp;lt;/sup&amp;gt;. Note that there's still a '4GB' problem and it's implementations has room for improvements (to put it midly  &amp;lt;sup&amp;gt;[https://lore.kernel.org/all/20230522102953.GB23678@pengutronix.de/]&amp;lt;/sup&amp;gt; and &amp;lt;sup&amp;gt;[https://lore.kernel.org/all/b404dc20-c460-ac3f-6659-8be7a7d32bfe@arm.com/]&amp;lt;/sup&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Fan Controller&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;gp7101&amp;lt;/code&amp;gt;&lt;br /&gt;
| Someone should write a pwm driver for it so we can then use pwm-fan&lt;br /&gt;
| SOQuartz Blade&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | CSI Camera&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rkisp&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/media/platform/rockchip/isp]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-inno-csidphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/29c99fb085ad53e6d5504d1f8d32e6673b9b3a2c]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | NPU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &lt;br /&gt;
| Downstream version is a closed source SDK and [https://github.com/dieselnutjob/kernel-rk3566/tree/linux-4.19.210/drivers/rknpu open source kernel module rknpu]. Major undertaking to reimplement this as Linux does not (yet) appear to have a generic architecture for neural accelerators.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Crypto&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rk-crypto&amp;lt;/code&amp;gt; v2&lt;br /&gt;
| Downstream driver [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/crypto/rockchip] doesn't include a rk3568 compatible either, but the TRM shows that it seemingly matches.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | TRNG&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://patchwork.kernel.org/project/linux-rockchip/list/?series=699813&amp;amp;archive=both]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rng&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | Wi-Fi&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;bes2600&amp;lt;/code&amp;gt;&lt;br /&gt;
| A downstream driver is available but it makes use of some custom Rockchip interfaces and is designed for older kernels, plans are being made to port it to DKMS.&lt;br /&gt;
| PineTab 2&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
The following sections give an overview over the current status of different parts of the board. Some parts are waiting on a driver to be written or ported, others only need various adjustments.&lt;br /&gt;
&lt;br /&gt;
According to pgwipeout, I/O device performance is within expected ranges now.&lt;br /&gt;
&lt;br /&gt;
=== Working ===&lt;br /&gt;
&lt;br /&gt;
* eMMC&lt;br /&gt;
* SDMMC0 (SD cards)&lt;br /&gt;
* GMAC (Gigabit Ethernet)&lt;br /&gt;
* USB 2.0&lt;br /&gt;
* SATA 2&lt;br /&gt;
* SATA 3&lt;br /&gt;
* UART&lt;br /&gt;
** UART 0 (Pi-bus)&lt;br /&gt;
** UART 1 (Bluetooth)&lt;br /&gt;
** UART 2 (Pi-bus, debug)&lt;br /&gt;
* Video Decode&lt;br /&gt;
** VP8&lt;br /&gt;
** H.264&lt;br /&gt;
* Video Encode&lt;br /&gt;
** JPEG (it's pretty bad)&lt;br /&gt;
* Battery&lt;br /&gt;
* GPU&lt;br /&gt;
* Audio&lt;br /&gt;
** Analog audio works&lt;br /&gt;
** SPDIF works&lt;br /&gt;
** HDMI works&lt;br /&gt;
* SPI &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
&lt;br /&gt;
=== Partially Working ===&lt;br /&gt;
&lt;br /&gt;
* PCI-Express Controller &amp;amp;mdash; everything but devices that need cache coherency (e.g. dGPUs) should work&lt;br /&gt;
** [[User:CounterPillow]] noticed some weirdness with NVMe devices disconnecting during heavy write operations, likely down due to power draw on one of the rails as the same sustained bandwidth could be achieved with a different PCIe device with no issue.&lt;br /&gt;
* SDMMC1 (Wi-Fi) &amp;amp;mdash; AP6256 working, BL602 needs some work to make it flash firmware&lt;br /&gt;
* [https://developer.arm.com/architectures/system-architectures/system-components/arm-generic-interrupt-controller GIC] &amp;amp;mdash; needs errata published by Rockchip to get upstream to add device-specific workarounds&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/CAMdYzYrQ5f-mv_VmTq_CRf9tR=j3mwRpKHNLmPFgCF9whsGFRw@mail.gmail.com/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Confirmed Broken ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;USB 3.0 (applies to Model A only) &amp;amp;mdash; only works with very short cables and depends on the device. This is due to a hardware design issue relating to the coupling capacitors needed for SATA, which shares the same lines as USB 3.0.&lt;br /&gt;
** Hardware design changes have been suggested to engineers, it's in their hands now.&amp;lt;/s&amp;gt;&lt;br /&gt;
** Fixed in newer revisions by leaving SATA unpopulated&lt;br /&gt;
* RGA &amp;amp;mdash; only works with memory &amp;amp;le; 4 GiB, because Rockchip didn't make the address registers larger. Oopsie.&lt;br /&gt;
&lt;br /&gt;
=== Needs Testing ===&lt;br /&gt;
&lt;br /&gt;
* E-Paper&lt;br /&gt;
* Microphone Input&lt;br /&gt;
* CSI &amp;amp;mdash; needs CIF driver&lt;br /&gt;
* eDP &amp;amp;mdash; needs PHY driver and controller driver&lt;br /&gt;
* DSI&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
=== ebc-dev Reverse Engineering and Development ===&lt;br /&gt;
&lt;br /&gt;
The [https://gitlab.com/pine64-org/quartz-bsp/linux-next/-/tree/rk356x-ebc-dev driver for the eInk panel] needs to both be reverse engineered and then rewritten as C. In its current form, it is mostly an assembly dump produced by gcc with debug symbols. See [[RK3566 EBC Reverse-Engineering]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Investigate MCU ===&lt;br /&gt;
&lt;br /&gt;
The RK3566 comes with an integrated RISC-V microcontroller (MCU). It communicates with the A55 host through the Mailbox system driven by the rockchip-mailbox driver. Since this MCU would be quite useful for things such as low power standby mode, investigating how it can be turned on and have firmware flashed to it should greatly enhance the power saving features of the PineNote.&lt;br /&gt;
&lt;br /&gt;
I (liamur) [https://github.com/liamhays/rk3566-mcu did some investigation] into the MCU and found that it is disabled by TF-A on suspend, and doesn't reside in a low-power part of the RK3566 anyway. It does however have access to most of the chip and could be used as (for example) a real-time coprocessor.&lt;br /&gt;
&lt;br /&gt;
=== Mainline U-Boot Work ===&lt;br /&gt;
&lt;br /&gt;
We currently use the &amp;quot;downstream&amp;quot; Rockchip U-Boot, which is based on an old version of U-Boot and contains vendor specific patches that have not undergone the same level of code review as they'd have done had they been submitted upstream.&lt;br /&gt;
&lt;br /&gt;
While the lack of ATF sources means that using mainline U-Boot would still require the use of Rockchip provided binaries for the firmware, even with Rockchip blobs, a more modern version of U-Boot will be much nicer to use.&lt;br /&gt;
&lt;br /&gt;
Mainline U-Boot contains good enough support for the RK3566 SoC used on the Quartz64 as of v2023.07 and have support for Quartz64 and SOQuartz as of v2023.10-rc2. Drivers for [https://patchwork.ozlabs.org/cover/1817577/ ethernet GMAC] and [https://patchwork.ozlabs.org/patch/1817295/ Motorcomm PHY] have been submitted for review.&lt;br /&gt;
&lt;br /&gt;
==== Things that could be done ====&lt;br /&gt;
&lt;br /&gt;
This list is non-exhaustive as we don't exactly know how much is missing&lt;br /&gt;
&lt;br /&gt;
* Port a basic VOP2 driver to get a framebuffer from u-boot&lt;br /&gt;
&lt;br /&gt;
==== List of Useful Resources for this Task ====&lt;br /&gt;
* Downstream Rockchip U-Boot repository with Quartz64 specific patches: https://gitlab.com/pgwipeout/u-boot-rockchip/-/tree/quartz64&lt;br /&gt;
* Mainline Rockchip custodian U-Boot repository: https://source.denx.de/u-boot/custodians/u-boot-rockchip&lt;br /&gt;
* U-Boot Mailing List: https://lists.denx.de/listinfo/u-boot&lt;br /&gt;
&lt;br /&gt;
=== eDP Driver Porting ===&lt;br /&gt;
&lt;br /&gt;
The eDP PHY driver and controller driver needs to be ported, brought into shape and submitted with proper commit attribution to the Rockchip authors.&lt;br /&gt;
&lt;br /&gt;
[[User:CounterPillow]] has experimentally ported stuff, but it's currently not working.&lt;br /&gt;
&lt;br /&gt;
== Linux Kernel Config Options ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_I2S_TDM&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog and HDMI audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog audio on the Model A&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_STMMAC_ETH&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DWMAC_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model A, set this one to Y, m won't work out of the box if the generic PHY driver is y and binds first. Alternatively tell users in board-specific setup instructions to force including the &amp;lt;code&amp;gt;motorcomm&amp;lt;/code&amp;gt; module in initramfs if you set it to m.&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REALTEK_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model B&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_SDHCI_OF_DWCMSHC&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PCIE_ROCKCHIP_DW_HOST&amp;lt;/code&amp;gt;&lt;br /&gt;
** PCIe&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** PHY for PCIe/SATA/USB3&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DRM_PANFROST&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPU&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_SPDIF&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPDIF audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_DW_HDMI&amp;lt;/code&amp;gt;&lt;br /&gt;
** HDMI PHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI DSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
** Video output&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ARCH_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_USB2&amp;lt;/code&amp;gt;&lt;br /&gt;
** USB 2&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_RTC_DRV_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MFD_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Various things relating to the RK817 chip&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_CHARGER_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** RK817 charger&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REGULATOR_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Voltage regulators&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PM_DOMAINS&amp;lt;/code&amp;gt;&lt;br /&gt;
** Power management domains&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_GPIO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PINCTRL_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO and general SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PWM_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** PWM support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IOMMU&amp;lt;/code&amp;gt;&lt;br /&gt;
** IOMMU support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_MBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
** Mailbox support (for communication with MCU)&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_SARADC&amp;lt;/code&amp;gt;&lt;br /&gt;
** Analog-to-digital conversion support, for e.g. microphones&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_THERMAL&amp;lt;/code&amp;gt;&lt;br /&gt;
** Temperature sensor and thermal throttling support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SPI_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPI support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_VIDEO_HANTRO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Hardware video decoder support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IODOMAIN&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support so your I/O pins have the right voltage&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Common clock support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI CSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_I2C_RK3X&amp;lt;/code&amp;gt;&lt;br /&gt;
** I2C support&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
* pgwipeout's kernel tree&lt;br /&gt;
** https://gitlab.com/pgwipeout/linux-next/-/tree/quartz64-v5.15-rc1&lt;br /&gt;
* BSP based development effort for SPL/U-Boot and Linux&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp&lt;br /&gt;
* Image CI pipeline aimed at developers&lt;br /&gt;
** https://gitlab.com/pgwipeout/quartz64_ci/&lt;br /&gt;
* Rockchip U-Boot&lt;br /&gt;
** https://github.com/rockchip-linux/u-boot&lt;br /&gt;
* Downstream rockchip-linux kernel tree&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux&lt;br /&gt;
* Tianocore EDK II port for UEFI on Quartz64&lt;br /&gt;
** https://github.com/jaredmcneill/quartz64_uefi&lt;br /&gt;
* Mainline U-Boot Port by pgwipeout&lt;br /&gt;
** https://gitlab.com/pgwipeout/u-boot-quartz64&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* Rockchip-SoC Patchwork Page&lt;br /&gt;
** https://patchwork.kernel.org/project/linux-rockchip/list/&lt;br /&gt;
* Rockchip Kernel Mailing List Archive&lt;br /&gt;
** https://lore.kernel.org/linux-rockchip/&lt;br /&gt;
&lt;br /&gt;
== Board/SoC Documentation ==&lt;br /&gt;
=== Booting ===&lt;br /&gt;
==== Boot Order ====&lt;br /&gt;
The RK3566 boot ROM will search for a valid ID BLOCK in the following order on the support boot media:&lt;br /&gt;
&lt;br /&gt;
* SPI NOR flash&lt;br /&gt;
* SPI NAND flash&lt;br /&gt;
* eMMC&lt;br /&gt;
* SD-Card&lt;br /&gt;
&lt;br /&gt;
... if this fails, the boot ROM will initialize the USB0 port and wait for a connection from the Rockchip&lt;br /&gt;
flash/boot tools.&lt;br /&gt;
&lt;br /&gt;
==== Bootloader Flashing ====&lt;br /&gt;
&lt;br /&gt;
As per pgwipeout's [https://gitlab.com/pine64-org/quartz-bsp/u-boot/-/commit/12d102b86813378af08b086f3b9c13ed8010754c commit message]:&lt;br /&gt;
* Make a partition named &amp;lt;code&amp;gt;uboot&amp;lt;/code&amp;gt; as partition number 1 at 8 MiB to 16 MiB&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=idblock.bin of=/dev/''&amp;lt;mmc/sd&amp;gt;'' seek=64&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=uboot.img of=/dev/''&amp;lt;mmc/sd&amp;gt;''1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSP Image Layout ====&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]][[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20595</id>
		<title>Quartz64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20595"/>
		<updated>2023-08-31T11:56:33Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Network */ Add information on performance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Quartz64modelb.png|400px|thumb|right|The Quartz64 Model B]]&lt;br /&gt;
&lt;br /&gt;
The '''Quartz64''' is the most recent Single Board Computer offering from PINE64, with Model A initially released in June of 2021 and Model B in May of 2022. It is powered by a Rockchip RK3566 Quad-Core ARM Cortex A55 64-Bit Processor with a MALI G-52 GPU.&lt;br /&gt;
&lt;br /&gt;
Key features include a PCIe x4 open ended slot (model A) or m.2 (model B) using one Gen2 lane electrically, and the use of LPDDR4 RAM.&lt;br /&gt;
&lt;br /&gt;
The Quartz64 has three LPDDR4 system memory options: 2GB, 4GB or 8GB. For booting, there is an eMMC module socket (supporting up to 128GB) and microSD slot, as well as a footprint to solder on an SPI flash chip. The board is equipped with HDMI, 1x USB 3.0 type A Host, 3x USB 2.0 Host, Gigabit Ethernet, SATA (model A), GPIO Bus, MiPi DSI interface, e-ink interface (model A), eDP interface (model A), touch Panel interface (model A), MiPi CSI interface, as well as many other device interfaces such as UART, SPI, I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C, for makers to integrate with sensors and other peripherals. Many different Operating Systems (OS) are freely available from the open source community, such as Linux (Ubuntu, Debian, Arch), BSD, and Android.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
Under [[Quartz64 Software Releases]] you will find a complete list of currently supported operating system images, which work with the Quartz64, as well as other related software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
=== Flashing the device ===&lt;br /&gt;
&lt;br /&gt;
Natively the board only supports booting the platform firmware from SPI, the eMMC or a microSD card, see [[#Boot order|boot order]]. The platform firmware loaded from there (U-Boot, EDK2, ...) may then allow loading kernels from additional storage mediums or even the network, and they will have their own boot order.&lt;br /&gt;
&lt;br /&gt;
The board can be booted by flashing your chosen operating system to a microSD card using another device and inserting the microSD card into the Quartz64, see the article [[Getting started]]. Flashing the eMMC is possible by booting an operating system from the microSD card and overwriting the eMMC from within the booted operating system, or by using [https://pine64.com/product/usb-adapter-for-emmc-module/ the USB eMMC adapter].&lt;br /&gt;
&lt;br /&gt;
=== Boot order ===&lt;br /&gt;
&lt;br /&gt;
The hardware boot order of the Quartz64 is:&lt;br /&gt;
&lt;br /&gt;
# SPI NOR flash&lt;br /&gt;
# SPI NAND flash&lt;br /&gt;
# eMMC&lt;br /&gt;
# microSD card&lt;br /&gt;
&lt;br /&gt;
== SoC and Memory Specifications ==&lt;br /&gt;
&lt;br /&gt;
[[File:RK3566_icon.png|right]]&lt;br /&gt;
&lt;br /&gt;
* Based on [https://www.rock-chips.com/a/en/products/RK35_Series/2021/0113/1274.html Rockchip RK3566]&lt;br /&gt;
&lt;br /&gt;
=== CPU Architecture ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/processors/cortex-a/cortex-a55 Quad-core ARM Cortex-A55@1.8GHz]&lt;br /&gt;
* AArch32 for full backwards compatibility with ARMv7&lt;br /&gt;
* ARM Neon Advanced SIMD (single instruction, multiple data) support for accelerated media and signal processing computation&lt;br /&gt;
* Includes VFP hardware to support single and double-precision operations&lt;br /&gt;
* ARMv8 Cryptography Extensions&lt;br /&gt;
* Integrated 32KB L1 instruction cache and 32KB L1 data cache per core&lt;br /&gt;
* 512KB unified system L3 cache&lt;br /&gt;
* [https://developer.arm.com/ip-products/security-ip/trustzone TrustZone] technology support&lt;br /&gt;
* [https://www.cnx-software.com/2020/12/01/rockchip-rk3568-processor-to-power-edge-computing-and-nvr-applications 22nm process, believed to be FD-SOI]&lt;br /&gt;
&lt;br /&gt;
=== GPU (Graphics Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/graphics-and-multimedia/mali-gpus/mali-g52-gpu Mali-G52 2EE Bifrost GPU@800MHz]&lt;br /&gt;
* 4x Multi-Sampling Anti-Aliasing (MSAA) with minimal performance drop &lt;br /&gt;
* 128KB L2 Cache configurations&lt;br /&gt;
* Supports OpenGL ES 1.1, 2.0, and 3.2&lt;br /&gt;
* Supports Vulkan 1.0 and 1.1&lt;br /&gt;
* Supports OpenCL 2.0 Full Profile&lt;br /&gt;
* Supports 1600 Mpix/s fill rate when at 800MHz clock frequency&lt;br /&gt;
* Supports 38.4 GLOP/s when at 800MHz clock frequency   &lt;br /&gt;
&lt;br /&gt;
=== NPU (Neural Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* Neural network acceleration engine with processing performance of up to 0.8 TOPS&lt;br /&gt;
* Supports integer 8 and integer 16 convolution operations&lt;br /&gt;
* Supports the following deep learning frameworks: TensorFlow, TF-lite, Pytorch, Caffe, ONNX, MXNet, Keras, Darknet&lt;br /&gt;
&lt;br /&gt;
=== System Memory ===&lt;br /&gt;
&lt;br /&gt;
* RAM Memory Variants: 2GB (SOQuartz only), 4GB, 8GB LPDDR4.&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
* 10/100/1000Mbps Ethernet&lt;br /&gt;
** Easily sustains &amp;gt;910 Mbit/s in a &amp;lt;code&amp;gt;--bidir&amp;lt;/code&amp;gt; (i.e. sending and receiving at the same time) iperf3 TCP test.&lt;br /&gt;
* Wi-Fi 802.11 b/g/n/ac with Bluetooth 5.0 (optional on model A, built in on model B)&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
&lt;br /&gt;
* microSD - bootable, supports SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB&lt;br /&gt;
** Model A: 2 USB 2.0 host ports, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
** Model B: 1 USB 2.0 host port, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
* one native SATA 3.0 6Gb/s Port (only on model A, shared with USB 3.0 host port) (removed in newer revisions due to electrical signalling issues it caused)&lt;br /&gt;
* optional eMMC module from 8GB up to 128GB&lt;br /&gt;
* 64 Mbit (8 MByte) SPI flash (Model B only), part number '''25Q64DWZPIG''' in the schematic&lt;br /&gt;
&lt;br /&gt;
==== eMMC Speeds ====&lt;br /&gt;
&lt;br /&gt;
On a 64 GB eMMC module:&lt;br /&gt;
&lt;br /&gt;
  $ sudo hdparm -tT /dev/mmcblk1 &lt;br /&gt;
  &lt;br /&gt;
  /dev/mmcblk1:&lt;br /&gt;
   Timing cached reads:   2368 MB in  2.00 seconds = 1184.46 MB/sec&lt;br /&gt;
   Timing buffered disk reads: 452 MB in  3.01 seconds = 149.98 MB/sec&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* HDMI&lt;br /&gt;
* eDP - 4 lanes of 2.7Gbps, up to 2560x1600@60Hz (only on model A)&lt;br /&gt;
* DSI - Display Serial Interface, 4 lanes MiPi, up to 1440P on model A, 2 lanes MiPi, up to 1080p on model B &lt;br /&gt;
* CSI - CMOS Camera Interface, 4 lanes MiPi up to 8 mega pixel on model A, 2 lanes MiPi up to 5 mega pixel on model B &lt;br /&gt;
* TP - Touch Panel Port, SPI with interrupt on model A&lt;br /&gt;
* RTC - Real Time Clock Battery Connector&lt;br /&gt;
* VBAT - Lithium Battery Connector with temperature sensor input on model A&lt;br /&gt;
* Wi-Fi/BT Module Header - SDIO 3.0 and UART on model A, built-in Wi-Fi/BT Module on model B&lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header on model B, 2x10 pins GPO header on model A&lt;br /&gt;
* PCIe x4 open ended slot on model A, m.2 slot on model B, one Gen2 lane due to SoC constraints&lt;br /&gt;
** On Model A, the slot provides 10W of power for the 3.3V supply and however much power your 12V input power supply provides on the 12V supply&lt;br /&gt;
&lt;br /&gt;
The PCIe implementation on the RK3566 is much more compatible with a wide range of devices compared to the one on the RK3399 used on the ROCKPro64. This means a lot more devices should work (excluding dGPUs due to a lack of cache snooping ability).&lt;br /&gt;
&lt;br /&gt;
==== Combo PHYs ====&lt;br /&gt;
&lt;br /&gt;
[[File:rk3566 phy.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Several of the I/O options on the RK3566 used in the Quartz64 are using the same I/O lines, meaning that they cannot be used at the same time. The above diagram illustrates how they are connected.&lt;br /&gt;
&lt;br /&gt;
In particular, USB 3.0 and the SATA connector on the board are mutually exclusive, and the PCI-e 2.0 lane can be reconfigured into a second SATA port, though an adapter cable needs to be fashioned for this to be useful.&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model A) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SDA_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SCL_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| CPU_REFCLK_OUT&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MOSI_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_TX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MISO_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_RX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CLK_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CS0_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| SPDIF_OUT &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;c&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 3.3V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;can be a PWM pin&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;pulled high to 3.3V through 2.2kOhm resistor&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;low-pass filtered with cutoff of 220 MHz&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: Page 28 of [[File:Quartz64_model-A_schematic_v1.0_20201215.pdf|the board schematics]].&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model B) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
Interesting alternate pin configurations are listed in [brackets].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SDA_M0]'' GPIO1_A0_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SCL_M0]'' GPIO1_A1_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_C4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CS0_M1]'' GPIO3_A1_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A3_3V3 ''[I2S3_SCLK_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_MCLK_M0]'' GPIO3_A2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B2_3V3 &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C5_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 21&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 22&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C1_3V3 ''[SPI1_MOSI_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 23&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 24&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_C6_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 25&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 26&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_D1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C4_SDA_M0&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 27&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 28&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| I2C4_SCL_M0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 29&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 30&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 31&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 32&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C2_3V3 ''[SPI1_MISO_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CLK_M1]'' GPIO3_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 33&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 34&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_LRCK_M0]'' GPIO3_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 35&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 36&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A7_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPDIF_TX_M0]'' GPIO1_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 37&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 38&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A6_3V3 ''[I2S3_SDI_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 39&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 40&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A5_3V3 ''[I2S3_SDO_M0]''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Source: Page 24 of [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf the board schematics].&lt;br /&gt;
&lt;br /&gt;
== Quartz64 Board Information, Schematics, and Certifications ==&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;A&amp;quot; Baseboard Dimensions: 133mm x 80mm x 19mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 12V @ 3A 5.5mmOD/2.1mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_schematic_v2.0_20210427.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic ver 2.0 20210427 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_V2.0_connector_placement.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
&lt;br /&gt;
Certifications:&lt;br /&gt;
&lt;br /&gt;
* Disclaimer: Please note that PINE64 SBC is not a &amp;quot;final&amp;quot; product and in general certification is not necessary. However, PINE64 still submit the SBC for FCC and CE certification and obtain the certificates to proof that SBC board is capable on passing the testing. Please note a final commercial product needs to performs its owns testing and obtains its owns certificates.&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20CE%20certification-S21051101701001.pdf Quartz64 model-A CE Certificate]&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20FCC%20certification-S21051101702001.pdf Quartz64 model-A FCC Certificate]&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;B&amp;quot; Baseboard Dimensions: 85mm x 56mm x 18.8mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 5V @ 3A 3.5mmOD/1.35mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic ver 1.3 20220124 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_PCB_Components_Placement-V1.2_20211014.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
* Please note that v1.2 and V1.3 schematic and component placement are identical, just some component value changed.&lt;br /&gt;
* Note: Model B uses a Molex PicoBlade compatible connector for the RTC battery. The Pine64 Backup Battery Holders come with a JST PH type connector. To use the Pine64 RTC Backup Battery Holder, the connector on the battery holder will need to be modified with a PicoBlade type connector.&lt;br /&gt;
&lt;br /&gt;
== Datasheets for Components and Peripherals ==&lt;br /&gt;
&lt;br /&gt;
Rockchip RK3566 SoC information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Rockchip%20RK3566%20Datasheet%20V1.0-20201210.pdf Rockchip RK3566 ver 1.0 datasheet, already got release permission from Rockchip]&lt;br /&gt;
* [https://opensource.rock-chips.com/images/2/26/Rockchip_RK3568_TRM_Part1_V1.3-20220930P.PDF Rockchip RK3566 and RK3568 TRM (Technical Reference Manual)]&lt;br /&gt;
&lt;br /&gt;
Rockchip PMU (Power Management Unit) Information:&lt;br /&gt;
* [https://www.rockchip.fr/RK817%20datasheet%20V1.01.pdf Rockchip RK817 ver 1.01 datasheet for Quartz64 model A]&lt;br /&gt;
* [https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf Rockchip RK809 ver 1.01 datasheet for Quartz64 model B and SOQuartz]&lt;br /&gt;
&lt;br /&gt;
LPDDR4 (200 Balls) SDRAM:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/SM512M32Z01MD2BNP(200BALL).pdf Micron LPDDR4 Mobile LPDDR4 Datasheet]&lt;br /&gt;
&lt;br /&gt;
eMMC information:&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/PINE64_eMMC_Module_20170719.pdf PINE64 eMMC module schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/usb%20emmc%20module%20adapter%20v2.pdf PINE64 USB adapter for eMMC module V2 schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/USB%20adapter%20for%20eMMC%20module%20PCB.tar PINE64 USB adapter for eMMC module PCB in JPEG]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/E-00517%20FORESEE_eMMC_NCEMAM8B-16G%20SPEC.pdf 16GB Foresee eMMC Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/SDINADF4-16-128GB-H%20data%20sheet%20v1.13.pdf 32GB/64GB/128GB SanDisk eMMC Datasheet]&lt;br /&gt;
&lt;br /&gt;
SPI NOR Flash information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/w25q128jv%20spi%20revc%2011162016.pdf WinBond 128Mb SPI Flash Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GD25Q128C-Rev2.5.pdf GigaDevice 128Mb SPI Flash Datasheet]&lt;br /&gt;
&lt;br /&gt;
E-ink Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-754-V3_ES103TC1%20Specification%20V3.0(Signed)-20190702.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Flex Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-828-V1_ED103TC2%20Formal%20Spec%20V1.0_20190514.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Glass Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/PineNote/TI%20PMU-TPS651851.pdf TPS65185x PMIC for E-Ink Enabled Electronic Paper Display Datasheet]&lt;br /&gt;
&lt;br /&gt;
LCD Touch Screen Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/FY07024DI26A30-D_feiyang_LCD_panel.pdf 7.0&amp;quot; 1024x600 TFT-LCD Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/HK70DR2459-PG-V01.pdf Touch Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GT911%20Capacitive%20Touch%20Controller%20Datasheet.pdf GOODiX GT911 5-Point Capacitive Touch Controller Datasheet]&lt;br /&gt;
&lt;br /&gt;
Ethernet PHY information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf Realtek RTL8211 10/100/1000M Ethernet Transceiver]&lt;br /&gt;
&lt;br /&gt;
Wi-Fi/BT module info:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/AW-CM256SM_DS_DF_V1.9_STD.pdf Azurewave CM256SM 11AC Wi-Fi + Bluetooth5.0 Datasheet]&lt;br /&gt;
&lt;br /&gt;
IR LED:&lt;br /&gt;
* [https://media.digikey.com/pdf/Data%20Sheets/Everlight%20PDFs/IRM-36xx_Series.pdf IRM-3638 Datasheet]&lt;br /&gt;
&lt;br /&gt;
Enclosure information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/playbox_enclosure_20160426.stp Playbox Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/ABS_enclosure_20160426.stp ABS Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/pine64%20Die%20Cast%20casing-final.jpg Outdoor Aluminum Cast Dust-proof IP67 Enclosure Drawing]&lt;br /&gt;
* [https://www.printables.com/model/269572-pine-quartz-64-a-full-case 3D Printable Enclosure for Model A]&lt;br /&gt;
* [https://www.printables.com/model/269575-pine-quartz-64-a-open-frame Open Frame for Model A]&lt;br /&gt;
&lt;br /&gt;
Connector information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/ePH.pdf 2.0mm PH Type connector specification use in Lithium Battery (VBAT) port (Model A)]&lt;br /&gt;
* [https://www.molex.com/pdm_docs/sd/533980271_sd.pdf 1.25mm Picoblade Type connector specification used in RTC Battery port (Model B)]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/0.5FPC%20Front%20Open%20Connector%20H=1.5.pdf 0.5mm Pitch cover type FPC connector specification use in DSI port, TP port and CSI port]&lt;br /&gt;
&lt;br /&gt;
== Development efforts ==&lt;br /&gt;
&lt;br /&gt;
{{SeeMainArticle|Quartz64 Development}}&lt;br /&gt;
&lt;br /&gt;
Information and resources of the ongoing development effort for the Quartz64 can be found on the [[Quartz64 Development]] page, where the current status of various board functions can be found, and whether they have landed in upstream.&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.com/pine64-org/quartz-bsp Quartz64 BSP Gitlab Page]&lt;br /&gt;
&lt;br /&gt;
== Enclosures ==&lt;br /&gt;
&lt;br /&gt;
Note: Please expand this section with more cases known to work.&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
All enclosures that fit the ROCKPro64 should fit the Quartz64 Model &amp;quot;A&amp;quot;, as the I/O has been laid out the same on purpose.&lt;br /&gt;
&lt;br /&gt;
* [[Model A Acrylic Open Enclosure]] - but see the troubleshooting section below.&lt;br /&gt;
* [[Quartz64 Premium Aluminium Case|RockPro64 Premium Aluminium Case]]&lt;br /&gt;
* [[ROCKPro64#3D printable ITX mounting brackets]] (Not an enclosure but allows to mount the board in an ATX/ITX case)&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* [[Model B Acrylic Open Enclosure]]&lt;br /&gt;
* the ROCK64 aluminium enclosure '''does not''' work, as the DC input jack is placed differently&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Stability/Boot Issues With Missing Battery Shunt ===&lt;br /&gt;
&lt;br /&gt;
If there is no battery plugged into the board, the jumper labelled &amp;quot;ON/OFF_BATT&amp;quot; must be in place. If this is set wrong, stability issues such as failures to boot will occur. '''This affects model A only'''&lt;br /&gt;
&lt;br /&gt;
=== No Ethernet Connectivity ===&lt;br /&gt;
&lt;br /&gt;
Make sure the kernel is built with &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. Building it as a module (&amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;) and then relying on module auto-loading is unlikely to work, because if the generic PHY driver is built in it will bind to the PHY first, unless you include the motorcomm module in your initramfs.&lt;br /&gt;
&lt;br /&gt;
Note: Starting with [https://salsa.debian.org/kernel-team/linux/-/merge_requests/551 Debian's &amp;lt;code&amp;gt;6.1~rc3-1~exp1&amp;lt;/code&amp;gt; kernel] the module is included, but set to &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; and I (Diederik) have verified that it gets included in the initramfs and '''works''' on Model-A and Model-B with the [[Quartz64#Plebian]] images.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Model A&amp;quot; Acrylic Case Doesn't Fit ===&lt;br /&gt;
&lt;br /&gt;
The Quartz64 does not really fit onto the bottom plate of the [[Model A Acrylic Open Enclosure]]. This is because the &amp;quot;Mic&amp;quot; connector at the bottom of the board interferes with one of the posts. A workaround is to find out which post that is (you have a 50% chance of guessing it right, accounting for rotating the board) and then filing away the corner of the post pointing inwards by a few millimeters.&lt;br /&gt;
&lt;br /&gt;
[[File:Quartz64-audio-jack-spacer-issue.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
An alternate solution may be to place plastic spacers with a smaller outer diameter in between the acrylic bottom plate posts and the SBC board.&lt;br /&gt;
&lt;br /&gt;
=== No GPU Acceleration with Debian &amp;quot;Bullseye&amp;quot; Userland ===&lt;br /&gt;
&lt;br /&gt;
Debian Bullseye ships a Mesa version that is too old to contain the required patches for the RK356x SoC's GPU. You can (at your own risk) [https://wiki.debian.org/DebianTesting use the current Debian Testing version ], called &amp;quot;Bookworm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Wireless Connectivity Doesn't Work ===&lt;br /&gt;
&lt;br /&gt;
ROCKPro64 wireless module may have CYW43455 or CYW43456 chips on board (not sure if this is the same for Quartz64 model B). Both chips are supported by &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt; Wi-Fi driver and &amp;lt;code&amp;gt;btbcm&amp;lt;/code&amp;gt; Bluetooth driver. &lt;br /&gt;
&lt;br /&gt;
For CYW43455 drivers attempt to load &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43455-sdio.bin&amp;lt;/code&amp;gt; for Wi-Fi and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C0.hcd&amp;lt;/code&amp;gt; for Bluetooth. Corresponding firmware files for CYW43456 are &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43456-sdio.bin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C5.hcd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On Manjaro firmware files for both Bluetooth and Wi-Fi on CYW43456 on are provided by &amp;lt;code&amp;gt;ap6256-firmware&amp;lt;/code&amp;gt; package (&amp;lt;code&amp;gt;pacman -S ap6256-firmware&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
However for CYW43455 wi-fi firmware is in the &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package and bluetooth is in the &amp;lt;code&amp;gt;firmware-raspberrypi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;pacman -S linux-firmware firmware-raspberrypi&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package is missing device specific symlinks for quartz64-a. To create them execute:&lt;br /&gt;
&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.bin /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.bin&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.AW-CM256SM.txt /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt &lt;br /&gt;
&lt;br /&gt;
As of 2022-10-19 device tree in mainline kernel for Quartz64 model A has wrong configuration for the Bluetooth driver. [https://patchwork.kernel.org/project/linux-rockchip/patch/20220926125350.64783-1-leo@nabam.net/ Patch] is submitted to the LKML and accepted and included upstream in 6.1-rc7. It's possible to modify dtb file provided by the current kernel using device tree compiler to enable Bluetooth or perform &amp;lt;code&amp;gt;make dtbs&amp;lt;/code&amp;gt; in the patched kernel tree to get updated dtb file (&amp;lt;code&amp;gt;arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dtb&amp;lt;/code&amp;gt;). Issue manifests itself with following errors in `dmesg`:&lt;br /&gt;
&lt;br /&gt;
  command 0x0c03 tx timeout&lt;br /&gt;
  Bluetooth: hci0: BCM: Reset failed (-110)&lt;br /&gt;
&lt;br /&gt;
== How-To ==&lt;br /&gt;
&lt;br /&gt;
=== Connect Debug UART ===&lt;br /&gt;
&lt;br /&gt;
The easiest way to get debug output is to connect a 3.3V 1.5mbaud capable UART adapter to the board.&lt;br /&gt;
&lt;br /&gt;
To connect it, connect the ground lead to pin 6, and the RX/TX leads to pins 8 and 10 (consider swapping them if you get no output, things are often mislabeled). These pins are &amp;quot;UART2&amp;quot; in the above GPIO table.&lt;br /&gt;
&lt;br /&gt;
Open a serial terminal at 1500000 bauds, e.g.&lt;br /&gt;
&lt;br /&gt;
 $ picocom -b 1500000 /dev/ttyUSB0&lt;br /&gt;
&lt;br /&gt;
=== Disable Heartbeat LED (Linux) ===&lt;br /&gt;
&lt;br /&gt;
The flashing LED is called the &amp;quot;heartbeat LED&amp;quot;, it blinks in a heart rhythm like fashion once the kernel is running. To disable it, you can run&lt;br /&gt;
&lt;br /&gt;
 # echo none &amp;gt; /sys/class/leds/user-led/trigger&lt;br /&gt;
&lt;br /&gt;
On model A LED device is called &amp;quot;diy-led&amp;quot;, not &amp;quot;user-led&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On a system with systemd, you can do this as soon as the system is ready to be logged in with a systemd unit like this:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Turn off heartbeat LED&lt;br /&gt;
 Wants=multi-user.target&lt;br /&gt;
 After=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 ExecStart=sh -c 'echo none &amp;gt; /sys/class/leds/user-led/trigger'&lt;br /&gt;
&lt;br /&gt;
Place it in ''/etc/systemd/system/user-led.service'', and run&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable user-led.service&lt;br /&gt;
&lt;br /&gt;
Upon rebooting, you will now notice that the heartbeat LED will blink during boot-up, but stops blinking as soon as the multi-user target is reached (i.e. the user can log in).&lt;br /&gt;
&lt;br /&gt;
=== SATA on model A ===&lt;br /&gt;
&lt;br /&gt;
On model A USB 3.0 and SATA ports are using the same I/O line and can't be used simultaneously. By default USB 3.0 is enabled in Linux device tree and SATA is disabled. FDT modifications are required to turn SATA on. &lt;br /&gt;
&lt;br /&gt;
Following script is tested on Manjaro but should work on the other distributions with minimal changes. Device tree compiler package usually provides fdtput command (on Manjaro run: &amp;lt;code&amp;gt;pacman -S dtc&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 # cp /boot/dtbs/rockchip/rk3566-quartz64-a.dtb /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /usb@fd000000 status disabled&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /sata@fc400000 status okay&lt;br /&gt;
 # sed -i 's#^FDT /dtbs/rockchip/rk3566-quartz64-a.dtb$#FDT /dtbs/rockchip/rk3566-quartz64-a-sata.dtb#' /boot/extlinux/extlinux.conf&lt;br /&gt;
 # systemctl reboot&lt;br /&gt;
&lt;br /&gt;
=== Using a PCF8574 on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A using a PCF8574]].&lt;br /&gt;
&lt;br /&gt;
=== Using a battery on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A Using a battery]].&lt;br /&gt;
&lt;br /&gt;
=== Connecting a MIPI-DSI display ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 connecting a MIPI-DSI display]].&lt;br /&gt;
&lt;br /&gt;
=== Building Mainline U-Boot ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Building U-Boot]].&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== Do I Need A Fan/What Heatsink Do I Need? ===&lt;br /&gt;
&lt;br /&gt;
You don't need a fan. The [https://pine64.com/product/rockpro64-20mm-mid-profile-heatsink/ 20mm medium heatsink for Model A is plenty enough]. For Model B, the [https://pine64.com/product/small-fan-type-heatsink/ fan type heatsink] will do fine.&lt;br /&gt;
&lt;br /&gt;
=== Can This Run A Minecraft Server? ===&lt;br /&gt;
&lt;br /&gt;
Yes! Sort of. Testing on an 8GB Model A with PaperMC, [[User:CounterPillow]] was able to out-row world generation in a boat with just one player online, but aside from the slow world gen (which can be pre-generated) the server handled things like TNT explosions and mobs fine. It'll probably do okay with 1-3 players.&lt;br /&gt;
&lt;br /&gt;
=== Do I Need The 5A Power Supply For Model A? ===&lt;br /&gt;
&lt;br /&gt;
You only need the 5A power supply for Model A if you plan on connecting hard disk drives to the 12V header on the board.&lt;br /&gt;
&lt;br /&gt;
=== How Much Power Does It Consume? ===&lt;br /&gt;
&lt;br /&gt;
For Model B, it's &amp;lt;2W in idle (powertop tunables not set), and &amp;lt;5W under full CPU load (&amp;lt;code&amp;gt;stress-ng -c4&amp;lt;/code&amp;gt;). Model A will be similar as it's the same SoC.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20594</id>
		<title>Quartz64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20594"/>
		<updated>2023-08-31T11:36:26Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Getting started */ reword, more info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Quartz64modelb.png|400px|thumb|right|The Quartz64 Model B]]&lt;br /&gt;
&lt;br /&gt;
The '''Quartz64''' is the most recent Single Board Computer offering from PINE64, with Model A initially released in June of 2021 and Model B in May of 2022. It is powered by a Rockchip RK3566 Quad-Core ARM Cortex A55 64-Bit Processor with a MALI G-52 GPU.&lt;br /&gt;
&lt;br /&gt;
Key features include a PCIe x4 open ended slot (model A) or m.2 (model B) using one Gen2 lane electrically, and the use of LPDDR4 RAM.&lt;br /&gt;
&lt;br /&gt;
The Quartz64 has three LPDDR4 system memory options: 2GB, 4GB or 8GB. For booting, there is an eMMC module socket (supporting up to 128GB) and microSD slot, as well as a footprint to solder on an SPI flash chip. The board is equipped with HDMI, 1x USB 3.0 type A Host, 3x USB 2.0 Host, Gigabit Ethernet, SATA (model A), GPIO Bus, MiPi DSI interface, e-ink interface (model A), eDP interface (model A), touch Panel interface (model A), MiPi CSI interface, as well as many other device interfaces such as UART, SPI, I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C, for makers to integrate with sensors and other peripherals. Many different Operating Systems (OS) are freely available from the open source community, such as Linux (Ubuntu, Debian, Arch), BSD, and Android.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
Under [[Quartz64 Software Releases]] you will find a complete list of currently supported operating system images, which work with the Quartz64, as well as other related software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
=== Flashing the device ===&lt;br /&gt;
&lt;br /&gt;
Natively the board only supports booting the platform firmware from SPI, the eMMC or a microSD card, see [[#Boot order|boot order]]. The platform firmware loaded from there (U-Boot, EDK2, ...) may then allow loading kernels from additional storage mediums or even the network, and they will have their own boot order.&lt;br /&gt;
&lt;br /&gt;
The board can be booted by flashing your chosen operating system to a microSD card using another device and inserting the microSD card into the Quartz64, see the article [[Getting started]]. Flashing the eMMC is possible by booting an operating system from the microSD card and overwriting the eMMC from within the booted operating system, or by using [https://pine64.com/product/usb-adapter-for-emmc-module/ the USB eMMC adapter].&lt;br /&gt;
&lt;br /&gt;
=== Boot order ===&lt;br /&gt;
&lt;br /&gt;
The hardware boot order of the Quartz64 is:&lt;br /&gt;
&lt;br /&gt;
# SPI NOR flash&lt;br /&gt;
# SPI NAND flash&lt;br /&gt;
# eMMC&lt;br /&gt;
# microSD card&lt;br /&gt;
&lt;br /&gt;
== SoC and Memory Specifications ==&lt;br /&gt;
&lt;br /&gt;
[[File:RK3566_icon.png|right]]&lt;br /&gt;
&lt;br /&gt;
* Based on [https://www.rock-chips.com/a/en/products/RK35_Series/2021/0113/1274.html Rockchip RK3566]&lt;br /&gt;
&lt;br /&gt;
=== CPU Architecture ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/processors/cortex-a/cortex-a55 Quad-core ARM Cortex-A55@1.8GHz]&lt;br /&gt;
* AArch32 for full backwards compatibility with ARMv7&lt;br /&gt;
* ARM Neon Advanced SIMD (single instruction, multiple data) support for accelerated media and signal processing computation&lt;br /&gt;
* Includes VFP hardware to support single and double-precision operations&lt;br /&gt;
* ARMv8 Cryptography Extensions&lt;br /&gt;
* Integrated 32KB L1 instruction cache and 32KB L1 data cache per core&lt;br /&gt;
* 512KB unified system L3 cache&lt;br /&gt;
* [https://developer.arm.com/ip-products/security-ip/trustzone TrustZone] technology support&lt;br /&gt;
* [https://www.cnx-software.com/2020/12/01/rockchip-rk3568-processor-to-power-edge-computing-and-nvr-applications 22nm process, believed to be FD-SOI]&lt;br /&gt;
&lt;br /&gt;
=== GPU (Graphics Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/graphics-and-multimedia/mali-gpus/mali-g52-gpu Mali-G52 2EE Bifrost GPU@800MHz]&lt;br /&gt;
* 4x Multi-Sampling Anti-Aliasing (MSAA) with minimal performance drop &lt;br /&gt;
* 128KB L2 Cache configurations&lt;br /&gt;
* Supports OpenGL ES 1.1, 2.0, and 3.2&lt;br /&gt;
* Supports Vulkan 1.0 and 1.1&lt;br /&gt;
* Supports OpenCL 2.0 Full Profile&lt;br /&gt;
* Supports 1600 Mpix/s fill rate when at 800MHz clock frequency&lt;br /&gt;
* Supports 38.4 GLOP/s when at 800MHz clock frequency   &lt;br /&gt;
&lt;br /&gt;
=== NPU (Neural Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* Neural network acceleration engine with processing performance of up to 0.8 TOPS&lt;br /&gt;
* Supports integer 8 and integer 16 convolution operations&lt;br /&gt;
* Supports the following deep learning frameworks: TensorFlow, TF-lite, Pytorch, Caffe, ONNX, MXNet, Keras, Darknet&lt;br /&gt;
&lt;br /&gt;
=== System Memory ===&lt;br /&gt;
&lt;br /&gt;
* RAM Memory Variants: 2GB (SOQuartz only), 4GB, 8GB LPDDR4.&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
* 10/100/1000Mbps Ethernet&lt;br /&gt;
* Wi-Fi 802.11 b/g/n/ac with Bluetooth 5.0 (optional on model A, built in on model B)&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
&lt;br /&gt;
* microSD - bootable, supports SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB&lt;br /&gt;
** Model A: 2 USB 2.0 host ports, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
** Model B: 1 USB 2.0 host port, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
* one native SATA 3.0 6Gb/s Port (only on model A, shared with USB 3.0 host port) (removed in newer revisions due to electrical signalling issues it caused)&lt;br /&gt;
* optional eMMC module from 8GB up to 128GB&lt;br /&gt;
* 64 Mbit (8 MByte) SPI flash (Model B only), part number '''25Q64DWZPIG''' in the schematic&lt;br /&gt;
&lt;br /&gt;
==== eMMC Speeds ====&lt;br /&gt;
&lt;br /&gt;
On a 64 GB eMMC module:&lt;br /&gt;
&lt;br /&gt;
  $ sudo hdparm -tT /dev/mmcblk1 &lt;br /&gt;
  &lt;br /&gt;
  /dev/mmcblk1:&lt;br /&gt;
   Timing cached reads:   2368 MB in  2.00 seconds = 1184.46 MB/sec&lt;br /&gt;
   Timing buffered disk reads: 452 MB in  3.01 seconds = 149.98 MB/sec&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* HDMI&lt;br /&gt;
* eDP - 4 lanes of 2.7Gbps, up to 2560x1600@60Hz (only on model A)&lt;br /&gt;
* DSI - Display Serial Interface, 4 lanes MiPi, up to 1440P on model A, 2 lanes MiPi, up to 1080p on model B &lt;br /&gt;
* CSI - CMOS Camera Interface, 4 lanes MiPi up to 8 mega pixel on model A, 2 lanes MiPi up to 5 mega pixel on model B &lt;br /&gt;
* TP - Touch Panel Port, SPI with interrupt on model A&lt;br /&gt;
* RTC - Real Time Clock Battery Connector&lt;br /&gt;
* VBAT - Lithium Battery Connector with temperature sensor input on model A&lt;br /&gt;
* Wi-Fi/BT Module Header - SDIO 3.0 and UART on model A, built-in Wi-Fi/BT Module on model B&lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header on model B, 2x10 pins GPO header on model A&lt;br /&gt;
* PCIe x4 open ended slot on model A, m.2 slot on model B, one Gen2 lane due to SoC constraints&lt;br /&gt;
** On Model A, the slot provides 10W of power for the 3.3V supply and however much power your 12V input power supply provides on the 12V supply&lt;br /&gt;
&lt;br /&gt;
The PCIe implementation on the RK3566 is much more compatible with a wide range of devices compared to the one on the RK3399 used on the ROCKPro64. This means a lot more devices should work (excluding dGPUs due to a lack of cache snooping ability).&lt;br /&gt;
&lt;br /&gt;
==== Combo PHYs ====&lt;br /&gt;
&lt;br /&gt;
[[File:rk3566 phy.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Several of the I/O options on the RK3566 used in the Quartz64 are using the same I/O lines, meaning that they cannot be used at the same time. The above diagram illustrates how they are connected.&lt;br /&gt;
&lt;br /&gt;
In particular, USB 3.0 and the SATA connector on the board are mutually exclusive, and the PCI-e 2.0 lane can be reconfigured into a second SATA port, though an adapter cable needs to be fashioned for this to be useful.&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model A) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SDA_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SCL_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| CPU_REFCLK_OUT&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MOSI_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_TX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MISO_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_RX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CLK_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CS0_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| SPDIF_OUT &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;c&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 3.3V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;can be a PWM pin&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;pulled high to 3.3V through 2.2kOhm resistor&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;low-pass filtered with cutoff of 220 MHz&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: Page 28 of [[File:Quartz64_model-A_schematic_v1.0_20201215.pdf|the board schematics]].&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model B) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
Interesting alternate pin configurations are listed in [brackets].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SDA_M0]'' GPIO1_A0_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SCL_M0]'' GPIO1_A1_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_C4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CS0_M1]'' GPIO3_A1_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A3_3V3 ''[I2S3_SCLK_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_MCLK_M0]'' GPIO3_A2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B2_3V3 &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C5_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 21&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 22&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C1_3V3 ''[SPI1_MOSI_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 23&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 24&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_C6_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 25&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 26&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_D1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C4_SDA_M0&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 27&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 28&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| I2C4_SCL_M0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 29&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 30&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 31&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 32&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C2_3V3 ''[SPI1_MISO_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CLK_M1]'' GPIO3_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 33&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 34&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_LRCK_M0]'' GPIO3_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 35&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 36&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A7_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPDIF_TX_M0]'' GPIO1_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 37&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 38&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A6_3V3 ''[I2S3_SDI_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 39&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 40&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A5_3V3 ''[I2S3_SDO_M0]''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Source: Page 24 of [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf the board schematics].&lt;br /&gt;
&lt;br /&gt;
== Quartz64 Board Information, Schematics, and Certifications ==&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;A&amp;quot; Baseboard Dimensions: 133mm x 80mm x 19mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 12V @ 3A 5.5mmOD/2.1mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_schematic_v2.0_20210427.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic ver 2.0 20210427 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_V2.0_connector_placement.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
&lt;br /&gt;
Certifications:&lt;br /&gt;
&lt;br /&gt;
* Disclaimer: Please note that PINE64 SBC is not a &amp;quot;final&amp;quot; product and in general certification is not necessary. However, PINE64 still submit the SBC for FCC and CE certification and obtain the certificates to proof that SBC board is capable on passing the testing. Please note a final commercial product needs to performs its owns testing and obtains its owns certificates.&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20CE%20certification-S21051101701001.pdf Quartz64 model-A CE Certificate]&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20FCC%20certification-S21051101702001.pdf Quartz64 model-A FCC Certificate]&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;B&amp;quot; Baseboard Dimensions: 85mm x 56mm x 18.8mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 5V @ 3A 3.5mmOD/1.35mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic ver 1.3 20220124 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_PCB_Components_Placement-V1.2_20211014.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
* Please note that v1.2 and V1.3 schematic and component placement are identical, just some component value changed.&lt;br /&gt;
* Note: Model B uses a Molex PicoBlade compatible connector for the RTC battery. The Pine64 Backup Battery Holders come with a JST PH type connector. To use the Pine64 RTC Backup Battery Holder, the connector on the battery holder will need to be modified with a PicoBlade type connector.&lt;br /&gt;
&lt;br /&gt;
== Datasheets for Components and Peripherals ==&lt;br /&gt;
&lt;br /&gt;
Rockchip RK3566 SoC information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Rockchip%20RK3566%20Datasheet%20V1.0-20201210.pdf Rockchip RK3566 ver 1.0 datasheet, already got release permission from Rockchip]&lt;br /&gt;
* [https://opensource.rock-chips.com/images/2/26/Rockchip_RK3568_TRM_Part1_V1.3-20220930P.PDF Rockchip RK3566 and RK3568 TRM (Technical Reference Manual)]&lt;br /&gt;
&lt;br /&gt;
Rockchip PMU (Power Management Unit) Information:&lt;br /&gt;
* [https://www.rockchip.fr/RK817%20datasheet%20V1.01.pdf Rockchip RK817 ver 1.01 datasheet for Quartz64 model A]&lt;br /&gt;
* [https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf Rockchip RK809 ver 1.01 datasheet for Quartz64 model B and SOQuartz]&lt;br /&gt;
&lt;br /&gt;
LPDDR4 (200 Balls) SDRAM:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/SM512M32Z01MD2BNP(200BALL).pdf Micron LPDDR4 Mobile LPDDR4 Datasheet]&lt;br /&gt;
&lt;br /&gt;
eMMC information:&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/PINE64_eMMC_Module_20170719.pdf PINE64 eMMC module schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/usb%20emmc%20module%20adapter%20v2.pdf PINE64 USB adapter for eMMC module V2 schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/USB%20adapter%20for%20eMMC%20module%20PCB.tar PINE64 USB adapter for eMMC module PCB in JPEG]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/E-00517%20FORESEE_eMMC_NCEMAM8B-16G%20SPEC.pdf 16GB Foresee eMMC Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/SDINADF4-16-128GB-H%20data%20sheet%20v1.13.pdf 32GB/64GB/128GB SanDisk eMMC Datasheet]&lt;br /&gt;
&lt;br /&gt;
SPI NOR Flash information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/w25q128jv%20spi%20revc%2011162016.pdf WinBond 128Mb SPI Flash Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GD25Q128C-Rev2.5.pdf GigaDevice 128Mb SPI Flash Datasheet]&lt;br /&gt;
&lt;br /&gt;
E-ink Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-754-V3_ES103TC1%20Specification%20V3.0(Signed)-20190702.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Flex Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-828-V1_ED103TC2%20Formal%20Spec%20V1.0_20190514.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Glass Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/PineNote/TI%20PMU-TPS651851.pdf TPS65185x PMIC for E-Ink Enabled Electronic Paper Display Datasheet]&lt;br /&gt;
&lt;br /&gt;
LCD Touch Screen Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/FY07024DI26A30-D_feiyang_LCD_panel.pdf 7.0&amp;quot; 1024x600 TFT-LCD Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/HK70DR2459-PG-V01.pdf Touch Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GT911%20Capacitive%20Touch%20Controller%20Datasheet.pdf GOODiX GT911 5-Point Capacitive Touch Controller Datasheet]&lt;br /&gt;
&lt;br /&gt;
Ethernet PHY information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf Realtek RTL8211 10/100/1000M Ethernet Transceiver]&lt;br /&gt;
&lt;br /&gt;
Wi-Fi/BT module info:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/AW-CM256SM_DS_DF_V1.9_STD.pdf Azurewave CM256SM 11AC Wi-Fi + Bluetooth5.0 Datasheet]&lt;br /&gt;
&lt;br /&gt;
IR LED:&lt;br /&gt;
* [https://media.digikey.com/pdf/Data%20Sheets/Everlight%20PDFs/IRM-36xx_Series.pdf IRM-3638 Datasheet]&lt;br /&gt;
&lt;br /&gt;
Enclosure information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/playbox_enclosure_20160426.stp Playbox Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/ABS_enclosure_20160426.stp ABS Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/pine64%20Die%20Cast%20casing-final.jpg Outdoor Aluminum Cast Dust-proof IP67 Enclosure Drawing]&lt;br /&gt;
* [https://www.printables.com/model/269572-pine-quartz-64-a-full-case 3D Printable Enclosure for Model A]&lt;br /&gt;
* [https://www.printables.com/model/269575-pine-quartz-64-a-open-frame Open Frame for Model A]&lt;br /&gt;
&lt;br /&gt;
Connector information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/ePH.pdf 2.0mm PH Type connector specification use in Lithium Battery (VBAT) port (Model A)]&lt;br /&gt;
* [https://www.molex.com/pdm_docs/sd/533980271_sd.pdf 1.25mm Picoblade Type connector specification used in RTC Battery port (Model B)]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/0.5FPC%20Front%20Open%20Connector%20H=1.5.pdf 0.5mm Pitch cover type FPC connector specification use in DSI port, TP port and CSI port]&lt;br /&gt;
&lt;br /&gt;
== Development efforts ==&lt;br /&gt;
&lt;br /&gt;
{{SeeMainArticle|Quartz64 Development}}&lt;br /&gt;
&lt;br /&gt;
Information and resources of the ongoing development effort for the Quartz64 can be found on the [[Quartz64 Development]] page, where the current status of various board functions can be found, and whether they have landed in upstream.&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.com/pine64-org/quartz-bsp Quartz64 BSP Gitlab Page]&lt;br /&gt;
&lt;br /&gt;
== Enclosures ==&lt;br /&gt;
&lt;br /&gt;
Note: Please expand this section with more cases known to work.&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
All enclosures that fit the ROCKPro64 should fit the Quartz64 Model &amp;quot;A&amp;quot;, as the I/O has been laid out the same on purpose.&lt;br /&gt;
&lt;br /&gt;
* [[Model A Acrylic Open Enclosure]] - but see the troubleshooting section below.&lt;br /&gt;
* [[Quartz64 Premium Aluminium Case|RockPro64 Premium Aluminium Case]]&lt;br /&gt;
* [[ROCKPro64#3D printable ITX mounting brackets]] (Not an enclosure but allows to mount the board in an ATX/ITX case)&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* [[Model B Acrylic Open Enclosure]]&lt;br /&gt;
* the ROCK64 aluminium enclosure '''does not''' work, as the DC input jack is placed differently&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Stability/Boot Issues With Missing Battery Shunt ===&lt;br /&gt;
&lt;br /&gt;
If there is no battery plugged into the board, the jumper labelled &amp;quot;ON/OFF_BATT&amp;quot; must be in place. If this is set wrong, stability issues such as failures to boot will occur. '''This affects model A only'''&lt;br /&gt;
&lt;br /&gt;
=== No Ethernet Connectivity ===&lt;br /&gt;
&lt;br /&gt;
Make sure the kernel is built with &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. Building it as a module (&amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;) and then relying on module auto-loading is unlikely to work, because if the generic PHY driver is built in it will bind to the PHY first, unless you include the motorcomm module in your initramfs.&lt;br /&gt;
&lt;br /&gt;
Note: Starting with [https://salsa.debian.org/kernel-team/linux/-/merge_requests/551 Debian's &amp;lt;code&amp;gt;6.1~rc3-1~exp1&amp;lt;/code&amp;gt; kernel] the module is included, but set to &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; and I (Diederik) have verified that it gets included in the initramfs and '''works''' on Model-A and Model-B with the [[Quartz64#Plebian]] images.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Model A&amp;quot; Acrylic Case Doesn't Fit ===&lt;br /&gt;
&lt;br /&gt;
The Quartz64 does not really fit onto the bottom plate of the [[Model A Acrylic Open Enclosure]]. This is because the &amp;quot;Mic&amp;quot; connector at the bottom of the board interferes with one of the posts. A workaround is to find out which post that is (you have a 50% chance of guessing it right, accounting for rotating the board) and then filing away the corner of the post pointing inwards by a few millimeters.&lt;br /&gt;
&lt;br /&gt;
[[File:Quartz64-audio-jack-spacer-issue.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
An alternate solution may be to place plastic spacers with a smaller outer diameter in between the acrylic bottom plate posts and the SBC board.&lt;br /&gt;
&lt;br /&gt;
=== No GPU Acceleration with Debian &amp;quot;Bullseye&amp;quot; Userland ===&lt;br /&gt;
&lt;br /&gt;
Debian Bullseye ships a Mesa version that is too old to contain the required patches for the RK356x SoC's GPU. You can (at your own risk) [https://wiki.debian.org/DebianTesting use the current Debian Testing version ], called &amp;quot;Bookworm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Wireless Connectivity Doesn't Work ===&lt;br /&gt;
&lt;br /&gt;
ROCKPro64 wireless module may have CYW43455 or CYW43456 chips on board (not sure if this is the same for Quartz64 model B). Both chips are supported by &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt; Wi-Fi driver and &amp;lt;code&amp;gt;btbcm&amp;lt;/code&amp;gt; Bluetooth driver. &lt;br /&gt;
&lt;br /&gt;
For CYW43455 drivers attempt to load &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43455-sdio.bin&amp;lt;/code&amp;gt; for Wi-Fi and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C0.hcd&amp;lt;/code&amp;gt; for Bluetooth. Corresponding firmware files for CYW43456 are &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43456-sdio.bin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C5.hcd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On Manjaro firmware files for both Bluetooth and Wi-Fi on CYW43456 on are provided by &amp;lt;code&amp;gt;ap6256-firmware&amp;lt;/code&amp;gt; package (&amp;lt;code&amp;gt;pacman -S ap6256-firmware&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
However for CYW43455 wi-fi firmware is in the &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package and bluetooth is in the &amp;lt;code&amp;gt;firmware-raspberrypi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;pacman -S linux-firmware firmware-raspberrypi&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package is missing device specific symlinks for quartz64-a. To create them execute:&lt;br /&gt;
&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.bin /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.bin&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.AW-CM256SM.txt /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt &lt;br /&gt;
&lt;br /&gt;
As of 2022-10-19 device tree in mainline kernel for Quartz64 model A has wrong configuration for the Bluetooth driver. [https://patchwork.kernel.org/project/linux-rockchip/patch/20220926125350.64783-1-leo@nabam.net/ Patch] is submitted to the LKML and accepted and included upstream in 6.1-rc7. It's possible to modify dtb file provided by the current kernel using device tree compiler to enable Bluetooth or perform &amp;lt;code&amp;gt;make dtbs&amp;lt;/code&amp;gt; in the patched kernel tree to get updated dtb file (&amp;lt;code&amp;gt;arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dtb&amp;lt;/code&amp;gt;). Issue manifests itself with following errors in `dmesg`:&lt;br /&gt;
&lt;br /&gt;
  command 0x0c03 tx timeout&lt;br /&gt;
  Bluetooth: hci0: BCM: Reset failed (-110)&lt;br /&gt;
&lt;br /&gt;
== How-To ==&lt;br /&gt;
&lt;br /&gt;
=== Connect Debug UART ===&lt;br /&gt;
&lt;br /&gt;
The easiest way to get debug output is to connect a 3.3V 1.5mbaud capable UART adapter to the board.&lt;br /&gt;
&lt;br /&gt;
To connect it, connect the ground lead to pin 6, and the RX/TX leads to pins 8 and 10 (consider swapping them if you get no output, things are often mislabeled). These pins are &amp;quot;UART2&amp;quot; in the above GPIO table.&lt;br /&gt;
&lt;br /&gt;
Open a serial terminal at 1500000 bauds, e.g.&lt;br /&gt;
&lt;br /&gt;
 $ picocom -b 1500000 /dev/ttyUSB0&lt;br /&gt;
&lt;br /&gt;
=== Disable Heartbeat LED (Linux) ===&lt;br /&gt;
&lt;br /&gt;
The flashing LED is called the &amp;quot;heartbeat LED&amp;quot;, it blinks in a heart rhythm like fashion once the kernel is running. To disable it, you can run&lt;br /&gt;
&lt;br /&gt;
 # echo none &amp;gt; /sys/class/leds/user-led/trigger&lt;br /&gt;
&lt;br /&gt;
On model A LED device is called &amp;quot;diy-led&amp;quot;, not &amp;quot;user-led&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On a system with systemd, you can do this as soon as the system is ready to be logged in with a systemd unit like this:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Turn off heartbeat LED&lt;br /&gt;
 Wants=multi-user.target&lt;br /&gt;
 After=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 ExecStart=sh -c 'echo none &amp;gt; /sys/class/leds/user-led/trigger'&lt;br /&gt;
&lt;br /&gt;
Place it in ''/etc/systemd/system/user-led.service'', and run&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable user-led.service&lt;br /&gt;
&lt;br /&gt;
Upon rebooting, you will now notice that the heartbeat LED will blink during boot-up, but stops blinking as soon as the multi-user target is reached (i.e. the user can log in).&lt;br /&gt;
&lt;br /&gt;
=== SATA on model A ===&lt;br /&gt;
&lt;br /&gt;
On model A USB 3.0 and SATA ports are using the same I/O line and can't be used simultaneously. By default USB 3.0 is enabled in Linux device tree and SATA is disabled. FDT modifications are required to turn SATA on. &lt;br /&gt;
&lt;br /&gt;
Following script is tested on Manjaro but should work on the other distributions with minimal changes. Device tree compiler package usually provides fdtput command (on Manjaro run: &amp;lt;code&amp;gt;pacman -S dtc&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 # cp /boot/dtbs/rockchip/rk3566-quartz64-a.dtb /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /usb@fd000000 status disabled&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /sata@fc400000 status okay&lt;br /&gt;
 # sed -i 's#^FDT /dtbs/rockchip/rk3566-quartz64-a.dtb$#FDT /dtbs/rockchip/rk3566-quartz64-a-sata.dtb#' /boot/extlinux/extlinux.conf&lt;br /&gt;
 # systemctl reboot&lt;br /&gt;
&lt;br /&gt;
=== Using a PCF8574 on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A using a PCF8574]].&lt;br /&gt;
&lt;br /&gt;
=== Using a battery on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A Using a battery]].&lt;br /&gt;
&lt;br /&gt;
=== Connecting a MIPI-DSI display ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 connecting a MIPI-DSI display]].&lt;br /&gt;
&lt;br /&gt;
=== Building Mainline U-Boot ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Building U-Boot]].&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== Do I Need A Fan/What Heatsink Do I Need? ===&lt;br /&gt;
&lt;br /&gt;
You don't need a fan. The [https://pine64.com/product/rockpro64-20mm-mid-profile-heatsink/ 20mm medium heatsink for Model A is plenty enough]. For Model B, the [https://pine64.com/product/small-fan-type-heatsink/ fan type heatsink] will do fine.&lt;br /&gt;
&lt;br /&gt;
=== Can This Run A Minecraft Server? ===&lt;br /&gt;
&lt;br /&gt;
Yes! Sort of. Testing on an 8GB Model A with PaperMC, [[User:CounterPillow]] was able to out-row world generation in a boat with just one player online, but aside from the slow world gen (which can be pre-generated) the server handled things like TNT explosions and mobs fine. It'll probably do okay with 1-3 players.&lt;br /&gt;
&lt;br /&gt;
=== Do I Need The 5A Power Supply For Model A? ===&lt;br /&gt;
&lt;br /&gt;
You only need the 5A power supply for Model A if you plan on connecting hard disk drives to the 12V header on the board.&lt;br /&gt;
&lt;br /&gt;
=== How Much Power Does It Consume? ===&lt;br /&gt;
&lt;br /&gt;
For Model B, it's &amp;lt;2W in idle (powertop tunables not set), and &amp;lt;5W under full CPU load (&amp;lt;code&amp;gt;stress-ng -c4&amp;lt;/code&amp;gt;). Model A will be similar as it's the same SoC.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20593</id>
		<title>SOQuartz Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20593"/>
		<updated>2023-08-31T11:27:56Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Restructure heading levels, add notice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[SOQuartz]].&lt;br /&gt;
&lt;br /&gt;
== Making Your Own ==&lt;br /&gt;
&lt;br /&gt;
Making your own image/installation of Linux for SOQuartz is relatively easy, as all major components are mainlined. You will need:&lt;br /&gt;
&lt;br /&gt;
* A build of mainline U-Boot &amp;amp;ge; v2023.10, see [[Quartz64 Building U-Boot]]. Flash this to sector 64 (sector size 512, so byte 32768) of your image for SD or eMMC. It's prudent to &amp;quot;protect&amp;quot; it by making a small (~16MiB) partition at this offset.&lt;br /&gt;
* A [https://www.kernel.org/ mainline Linux kernel] &amp;amp;ge; v6.2. See [[Quartz64 Development#Linux Kernel Config Options]] for the device specific kernel configuration options.&lt;br /&gt;
* The root filesystem of the distribution of your choice. This can be on the same filesystem as your kernel and device tree if using ''extlinux.conf''.&lt;br /&gt;
&lt;br /&gt;
You can either boot the kernel through U-Boot's EFI booting, in which case it gets its device tree from U-Boot, or mark the partition containing your kernel and device tree with the legacy bootable flag and [https://u-boot.readthedocs.io/en/latest/develop/distro.html#boot-configuration-files write an ''extlinux/extlinux.conf''].&lt;br /&gt;
&lt;br /&gt;
== Software Releases ==&lt;br /&gt;
{{note|'''Note:''' The images are provided by the PINE64 community, not by Pine Store Ltd. Most community projects currently aim at getting mainline Linux running on the board, not some vendor provided kernel that will never be receiving updates. A mainline-first approach allows for the boards to continue receiving important updates, such as security updates, for years to come, as well as have higher quality code in the kernel as it underwent independent review, but does mean that not all aspects of the hardware work right out of the gate.}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Add your own images below this section, please sort it alphabetically (don't try to be &amp;quot;first&amp;quot;), don't list one-off hacked together images found by the side of the road.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== DietPi support with Debian/Bullseye ===&lt;br /&gt;
&lt;br /&gt;
Info and downloads:  https://dietpi.com/docs/hardware/#pine64&lt;br /&gt;
&lt;br /&gt;
=== Manjaro ARM ===&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Manjaro ARM is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/manjaro-arm/soquartz-cm4-images/releases Images for SOQuartz on GitHub]&lt;br /&gt;
&lt;br /&gt;
WiFI, Bluetooth, Ethernet, HDMI USB etc. works, others are not tested. &lt;br /&gt;
&lt;br /&gt;
Currently the image is built for Raspberry Pi CM4 - IO board, so to get it working with other base board like pine64 Soquartz model A base board then follow this steps&lt;br /&gt;
*Flash the image to a SD card/ EMMC.&lt;br /&gt;
*Go to Boot partition.&lt;br /&gt;
*Then change the DTB listed in /boot/extlinux/extlinux.conf to -model-a.dtb instead of -cm4.dtb.&lt;br /&gt;
*Now put the SD card/ EMMC to the preferred base board and boot.&lt;br /&gt;
*First boot will take time as the user partition will resize to take whole storage size.&lt;br /&gt;
&lt;br /&gt;
For headless installation, simply enter &amp;quot;root&amp;quot; at the login: prompt and complete setup.&lt;br /&gt;
&lt;br /&gt;
=== Plebian ===&lt;br /&gt;
[[File:Plebian-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm. It supports both of PINE64's officially released SOQuartz base boards.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace &amp;lt;tt&amp;gt;/dev/sdX&amp;lt;/tt&amp;gt; with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Check [https://plebian.org/flashing/ Plebian's flashing instructions] for instructions on how to flash from e.g. Windows.&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
* '''Please flash the correct image for your SOQuartz baseboard!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SOQuartz]] [[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Software_Releases&amp;diff=20592</id>
		<title>Quartz64 Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Software_Releases&amp;diff=20592"/>
		<updated>2023-08-31T11:25:44Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Software releases */ wording of note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[Quartz64]] in alphabetical order, as well as links to other resources.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
{{warning|You are strongly encouraged to procure a 3.3V UART serial adapter capable of running at 1.5 mbauds, such as [https://pine64.com/product/serial-console-woodpecker-edition/ the Woodpecker] if you want to use a Quartz64, as some images' U-Boot may have no video output on this chip.}}&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' The images are provided by the PINE64 community, not by Pine Store Ltd. Most community projects currently aim at getting mainline Linux running on the board, not some vendor provided kernel that will never be receiving updates. A mainline-first approach allows for the boards to continue receiving important updates, such as security updates, for years to come, as well as have higher quality code in the kernel as it underwent independent review, but does mean that not all aspects of the hardware work right out of the gate.}}&lt;br /&gt;
&lt;br /&gt;
=== Armbian ===&lt;br /&gt;
[[File:armbian.png|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''Armbian''' is a base operating system platform for single board computers&lt;br /&gt;
&lt;br /&gt;
* Lightweight Debian or Ubuntu based Linux distribution specialized for ARM development boards&lt;br /&gt;
* Each system is compiled, assembled and optimized by [https://github.com/armbian/build Armbian Build Tools]&lt;br /&gt;
* It has powerful build and software development tools to make custom builds&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
{{Info|This image appears to have issues detecting more than 2GB of RAM.It is strongly recommended to use a different distribution.}}&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/armbian/build/releases/ latest, as fresh as possible, upon code change, images]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* Support on Armbian forums https://forum.armbian.com/forum/96-upcoming-hardware-wip/&lt;br /&gt;
&lt;br /&gt;
=== DietPi ===&lt;br /&gt;
[[File:dietpi.png|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''DietPi''' is a lightweight, yet easy to setup and feature-rich Linux distribution, based on ''Debian''. To find out more about DietPi, please visit the [https://dietpi.com/docs/ official documentation]. Discuss the Quartz64 build(s) on the [https://forum.pine64.org/showthread.php?tid=17601 PINE64 forum thread].&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* Quartz64 Model A: [https://dietpi.com/downloads/images/DietPi_Quartz64A-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
* Quartz64 Model B: [https://dietpi.com/downloads/images/DietPi_Quartz64B-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
* SOQuartz: [https://dietpi.com/downloads/images/DietPi_SOQuartz-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background: #a7d7f9;&amp;quot;| Default credentials&lt;br /&gt;
|-&lt;br /&gt;
! Root user&lt;br /&gt;
| &amp;lt;code&amp;gt;root/dietpi&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manjaro ARM ===&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''Manjaro ARM''' is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
&lt;br /&gt;
* Quartz64 Model A: [https://github.com/manjaro-arm/quartz64-a-images/releases Image on GitHub]&lt;br /&gt;
* Quartz64 Model B: [https://github.com/manjaro-arm/quartz64-b-images/releases Image on GitHub]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background: #a7d7f9;&amp;quot;| Default credentials&lt;br /&gt;
|-&lt;br /&gt;
! SSH&lt;br /&gt;
| &amp;lt;code&amp;gt;oem/oem&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
Most of the hardware support is already available in the mainline kernel. If some devices doesn't work it is possible to swap to the linux-quartz64 kernel &amp;lt;code&amp;gt;pacman -S linux-quartz64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Following desktop options available:&lt;br /&gt;
* Gnome&lt;br /&gt;
* KDE Plasma&lt;br /&gt;
* Mate&lt;br /&gt;
* Sway&lt;br /&gt;
* XFCE&lt;br /&gt;
as well as minimal image without desktop.&lt;br /&gt;
&lt;br /&gt;
=== NetBSD ===&lt;br /&gt;
&lt;br /&gt;
'''NetBSD''' is a free, fast, secure, and highly portable Unix-like Open Source operating system. It relies upon the UEFI support in Tianocore. Before NetBSD 10 is released, the latest version of NetBSD-current should be used.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/ NetBSD daily builds top level] from inside here, navigate to a date, and inside the images/ subdirectory are installable images. Use the one called &amp;quot;NetBSD-&amp;lt;version&amp;gt;-evbarm-aarch64-install.img.gz&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* This image can be written to a supported device, such as the eMMC interface, any USB storage device, NVMe, and PCIe AHCI SATA are all supported with builds after 2022-01-15.&lt;br /&gt;
* Currently this can not be shared with the EDK2 port, ie, microSD for EDK2 and some other media for NetBSD.&lt;br /&gt;
&lt;br /&gt;
=== Plebian ===&lt;br /&gt;
[[File:Plebian-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace ''/dev/sdX'' with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
&lt;br /&gt;
=== Tianocore EDK II port by jmcneill ===&lt;br /&gt;
&lt;br /&gt;
This (as of 2021-12-30) is a work in progress to enable UEFI enabled systems, and is able to bring up SD, eMMC, USB, PCIe with SATA and NVMe, HDMI, thermal sensors, TRNG, as well as general Cortex A-55 features.  Known to work with NetBSD -current, and the ESXi Arm fling version 1.8.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://github.com/jaredmcneill/quartz64_uefi jmcneill's Quartz64 UEFI Github]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* The microSD card image should be written to an microSD card and installed. Currently, using the same card for the operating system as well may be problematic.&lt;br /&gt;
&lt;br /&gt;
== BSP Linux SDK ==&lt;br /&gt;
&lt;br /&gt;
The '''BSP Linux SDK ver 4.19'' for the Quartz64 Model A.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_BSP%20Linux.tar.gz Direct download] from ''pine64.org'' (32.67GB, MD5 of the TAR-GZip file ''24554419aec29700add97167a3a4c9ed'')&lt;br /&gt;
&lt;br /&gt;
== Android SDK ==&lt;br /&gt;
&lt;br /&gt;
=== Android 11 SDK ===&lt;br /&gt;
&lt;br /&gt;
The '''Android 11 SDK''' for the Quartz64 Model A SBC.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64_SDK_android11.tar.gz Direct download] from ''pine64.org'' (79.00GB, MD5 of the TAR-GZip file ''77c2ff57ea3372fb04da7fb49e17d12b'')&lt;br /&gt;
* Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
=== Android 11 Production Test Builds  ===&lt;br /&gt;
&lt;br /&gt;
==== Android 11 Stock ====&lt;br /&gt;
The '''Android 11 Stock''' images for eMMC boot for the Quartz64 Model A. This is test build that was used during product testing.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-8GB.img.gz Stock image for the 8GB eMMC module] from ''pine64.org'' (819MB, MD5 of the Gzip file ''e4365753e584d9fce1b8f10f095eede6'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-16GB.img.gz Stock image for the 16GB eMMC module] from ''pine64.org'' (1.10GB, MD5 of the Gzip file ''491c5f7744b0ca0b74ae76e607051836'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-32GB.img.gz Stock image for the 32GB eMMC module] from ''pine64.org'' (846MB, MD5 of the Gzip file ''47a6f0cdac8bad06cb920743849a8894'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-64GB.img.gz Stock image for the 64GB eMMC module] from ''pine64.org'' (884MB, MD5 of the Gzip file ''4e2fed6f5db0d55afdc8a142fc0c4fe1'', build 20210604)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Write the disk images to the eMMC modules using the USB adapter, for example using &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Please allow 3-5 minutes boot up time on first time for initialization.&lt;br /&gt;
&lt;br /&gt;
==== Android 11 Production Test Build ====&lt;br /&gt;
The '''Android 11 Production Test Build''' for the Quartz64 model A for eMMC boot using ROCKChip tools method. This is a test build that was used during product testing.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_20210604_stock_android11_emmcboot.img.gz Direct download] from ''pine64.org'' (812MB, MD5 of the Gzip file ''800f867fdd0d1b2bd7822c156b6067e3'', build 20210604)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Please unzip first and then using [https://files.pine64.org/os/Quartz64/android/RKDevTool_Release_v2.84.zip Rockchip Android tool ver 2.84] to flash in&lt;br /&gt;
* For Windows OS environment please install the [https://files.pine64.org/os/Quartz64/android/DriverAssitant_v5.1.1.zip DriverAssistant v5.11] driver first &lt;br /&gt;
* The OTG port located at top USB 2.0 port on top of USB 3.0 port, needs USB type A to type A cable.&lt;br /&gt;
* Please allow 3-5 minutes boot up time on first time for initialization&lt;br /&gt;
&lt;br /&gt;
==== Android 11 eink SDK ====&lt;br /&gt;
This the '''Android 11 eink SDK''' build for 10.3&amp;quot; e-ink panels on the Quartz64 Model A. &lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_eink.android11_SDK.tar.gz Direct download] from ''pine64.org'' (72.88GB, MD5 of the TAR-GZip file ''293a550584298de4fb95ceae18103672'', build 20210604)&lt;br /&gt;
* Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Building_U-Boot&amp;diff=20591</id>
		<title>Quartz64 Building U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Building_U-Boot&amp;diff=20591"/>
		<updated>2023-08-31T11:09:30Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add Debian dependencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article guides you through compiling U-Boot for a [[Quartz64]] or [[SOQuartz]] device.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You will need either an x86 machine with an aarch64 cross-compiler installed, or an existing aarch64 system. You will also need the device tree compiler dtc, python3 (including setuptools and pyelftools), swig, GNU make and git.&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
On an x86_64 Arch Linux system, you can install the required dependencies with:&lt;br /&gt;
&lt;br /&gt;
 pacman -S --needed base-devel aarch64-linux-gnu-gcc aarch64-linux-gnu-binutils git dtc python-setuptools swig python-pyelftools&lt;br /&gt;
&lt;br /&gt;
=== Debian (or Derivates like Ubuntu) ===&lt;br /&gt;
&lt;br /&gt;
On an x86_64 Debian system, you can install the required dependencies with:&lt;br /&gt;
&lt;br /&gt;
 apt install device-tree-compiler build-essential gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu make python3 python3-dev libssl-dev python3-pyelftools python3-setuptools swig git&lt;br /&gt;
&lt;br /&gt;
== Fetching The Repositories ==&lt;br /&gt;
&lt;br /&gt;
Use git to clone the mainline U-Boot repository into the directory ''u-boot'':&lt;br /&gt;
&lt;br /&gt;
 git clone https://source.denx.de/u-boot/u-boot.git&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;git checkout &amp;lt;var&amp;gt;tagname&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; inside the ''u-boot'' directory to check out a specific git tag (release), you can list all of them with &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt; (but do keep in mind we only have device support since v2023.10).&lt;br /&gt;
&lt;br /&gt;
Then, also use git to clone the rockchip firmware binaries repository into the directory ''rkbin'':&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/rockchip-linux/rkbin.git&lt;br /&gt;
&lt;br /&gt;
== Setting Up Your Environment ==&lt;br /&gt;
&lt;br /&gt;
Next, we need to set two environment variables: &amp;lt;code&amp;gt;ROCKCHIP_TPL&amp;lt;/code&amp;gt; for the DRAM init binary, and &amp;lt;code&amp;gt;BL31&amp;lt;/code&amp;gt; for the ARM Trusted Firmware binary.&lt;br /&gt;
&lt;br /&gt;
 cd u-boot&lt;br /&gt;
 export ROCKCHIP_TPL=&amp;quot;$(ls ../rkbin/bin/rk35/rk3566_ddr_1056MHz_v*.bin | sort | tail -n1)&amp;quot;&lt;br /&gt;
 export BL31=&amp;quot;$(ls ../rkbin/bin/rk35/rk3568_bl31_v*.elf | sort | tail -n1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Configuring U-Boot ==&lt;br /&gt;
&lt;br /&gt;
First, we need to use the right default config for our device. Please choose &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt; from the following table depending on your device:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Board&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | defconfig&lt;br /&gt;
|-&lt;br /&gt;
| Quartz64 Model A || &amp;lt;code&amp;gt;quartz64-a-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Quartz64 Model B || &amp;lt;code&amp;gt;quartz64-b-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on Model A || &amp;lt;code&amp;gt;soquartz-model-a-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on Blade || &amp;lt;code&amp;gt;soquartz-blade-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on CM4 I/O Board || &amp;lt;code&amp;gt;soquartz-cm4-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the ''u-boot'' directory with your environment variables set, run:&lt;br /&gt;
&lt;br /&gt;
 make CROSS_COMPILE=aarch64-linux-gnu- &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt; being the value from the previous table.&lt;br /&gt;
&lt;br /&gt;
== Building U-Boot ==&lt;br /&gt;
&lt;br /&gt;
In the ''u-boot'' directory, after configuring, and with your environment variables set, run:&lt;br /&gt;
&lt;br /&gt;
 make CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
This will output a ''u-boot-rockchip.bin'', which is your freshly built SPL+U-Boot combined image.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:SOQuartz]] [[Category:Guide]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Software_Releases&amp;diff=20590</id>
		<title>Quartz64 Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Software_Releases&amp;diff=20590"/>
		<updated>2023-08-31T10:45:20Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add Plebian logo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[Quartz64]] in alphabetical order, as well as links to other resources.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
{{warning|You are strongly encouraged to procure a 3.3V UART serial adapter capable of running at 1.5 mbauds, such as [https://pine64.com/product/serial-console-woodpecker-edition/ the Woodpecker] if you want to use a Quartz64, as some images' U-Boot may have no video output on this chip.}}&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' The images are provided by the community, not by PINE64. Most community projects currently aim at getting mainline Linux running on the board, not some vendor provided kernel that will never be receiving updates. A mainline-first approach allows for the boards to continue receiving important updates, such as security updates, for years to come, as well as have higher quality code in the kernel as it underwent independent review, but does mean that not all aspects of the hardware work right out of the gate.}}&lt;br /&gt;
&lt;br /&gt;
=== Armbian ===&lt;br /&gt;
[[File:armbian.png|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''Armbian''' is a base operating system platform for single board computers&lt;br /&gt;
&lt;br /&gt;
* Lightweight Debian or Ubuntu based Linux distribution specialized for ARM development boards&lt;br /&gt;
* Each system is compiled, assembled and optimized by [https://github.com/armbian/build Armbian Build Tools]&lt;br /&gt;
* It has powerful build and software development tools to make custom builds&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
{{Info|This image appears to have issues detecting more than 2GB of RAM.It is strongly recommended to use a different distribution.}}&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/armbian/build/releases/ latest, as fresh as possible, upon code change, images]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* Support on Armbian forums https://forum.armbian.com/forum/96-upcoming-hardware-wip/&lt;br /&gt;
&lt;br /&gt;
=== DietPi ===&lt;br /&gt;
[[File:dietpi.png|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''DietPi''' is a lightweight, yet easy to setup and feature-rich Linux distribution, based on ''Debian''. To find out more about DietPi, please visit the [https://dietpi.com/docs/ official documentation]. Discuss the Quartz64 build(s) on the [https://forum.pine64.org/showthread.php?tid=17601 PINE64 forum thread].&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* Quartz64 Model A: [https://dietpi.com/downloads/images/DietPi_Quartz64A-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
* Quartz64 Model B: [https://dietpi.com/downloads/images/DietPi_Quartz64B-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
* SOQuartz: [https://dietpi.com/downloads/images/DietPi_SOQuartz-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background: #a7d7f9;&amp;quot;| Default credentials&lt;br /&gt;
|-&lt;br /&gt;
! Root user&lt;br /&gt;
| &amp;lt;code&amp;gt;root/dietpi&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manjaro ARM ===&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''Manjaro ARM''' is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
&lt;br /&gt;
* Quartz64 Model A: [https://github.com/manjaro-arm/quartz64-a-images/releases Image on GitHub]&lt;br /&gt;
* Quartz64 Model B: [https://github.com/manjaro-arm/quartz64-b-images/releases Image on GitHub]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background: #a7d7f9;&amp;quot;| Default credentials&lt;br /&gt;
|-&lt;br /&gt;
! SSH&lt;br /&gt;
| &amp;lt;code&amp;gt;oem/oem&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
Most of the hardware support is already available in the mainline kernel. If some devices doesn't work it is possible to swap to the linux-quartz64 kernel &amp;lt;code&amp;gt;pacman -S linux-quartz64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Following desktop options available:&lt;br /&gt;
* Gnome&lt;br /&gt;
* KDE Plasma&lt;br /&gt;
* Mate&lt;br /&gt;
* Sway&lt;br /&gt;
* XFCE&lt;br /&gt;
as well as minimal image without desktop.&lt;br /&gt;
&lt;br /&gt;
=== NetBSD ===&lt;br /&gt;
&lt;br /&gt;
'''NetBSD''' is a free, fast, secure, and highly portable Unix-like Open Source operating system. It relies upon the UEFI support in Tianocore. Before NetBSD 10 is released, the latest version of NetBSD-current should be used.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/ NetBSD daily builds top level] from inside here, navigate to a date, and inside the images/ subdirectory are installable images. Use the one called &amp;quot;NetBSD-&amp;lt;version&amp;gt;-evbarm-aarch64-install.img.gz&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* This image can be written to a supported device, such as the eMMC interface, any USB storage device, NVMe, and PCIe AHCI SATA are all supported with builds after 2022-01-15.&lt;br /&gt;
* Currently this can not be shared with the EDK2 port, ie, microSD for EDK2 and some other media for NetBSD.&lt;br /&gt;
&lt;br /&gt;
=== Plebian ===&lt;br /&gt;
[[File:Plebian-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace ''/dev/sdX'' with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
&lt;br /&gt;
=== Tianocore EDK II port by jmcneill ===&lt;br /&gt;
&lt;br /&gt;
This (as of 2021-12-30) is a work in progress to enable UEFI enabled systems, and is able to bring up SD, eMMC, USB, PCIe with SATA and NVMe, HDMI, thermal sensors, TRNG, as well as general Cortex A-55 features.  Known to work with NetBSD -current, and the ESXi Arm fling version 1.8.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://github.com/jaredmcneill/quartz64_uefi jmcneill's Quartz64 UEFI Github]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* The microSD card image should be written to an microSD card and installed. Currently, using the same card for the operating system as well may be problematic.&lt;br /&gt;
&lt;br /&gt;
== BSP Linux SDK ==&lt;br /&gt;
&lt;br /&gt;
The '''BSP Linux SDK ver 4.19'' for the Quartz64 Model A.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_BSP%20Linux.tar.gz Direct download] from ''pine64.org'' (32.67GB, MD5 of the TAR-GZip file ''24554419aec29700add97167a3a4c9ed'')&lt;br /&gt;
&lt;br /&gt;
== Android SDK ==&lt;br /&gt;
&lt;br /&gt;
=== Android 11 SDK ===&lt;br /&gt;
&lt;br /&gt;
The '''Android 11 SDK''' for the Quartz64 Model A SBC.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64_SDK_android11.tar.gz Direct download] from ''pine64.org'' (79.00GB, MD5 of the TAR-GZip file ''77c2ff57ea3372fb04da7fb49e17d12b'')&lt;br /&gt;
* Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
=== Android 11 Production Test Builds  ===&lt;br /&gt;
&lt;br /&gt;
==== Android 11 Stock ====&lt;br /&gt;
The '''Android 11 Stock''' images for eMMC boot for the Quartz64 Model A. This is test build that was used during product testing.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-8GB.img.gz Stock image for the 8GB eMMC module] from ''pine64.org'' (819MB, MD5 of the Gzip file ''e4365753e584d9fce1b8f10f095eede6'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-16GB.img.gz Stock image for the 16GB eMMC module] from ''pine64.org'' (1.10GB, MD5 of the Gzip file ''491c5f7744b0ca0b74ae76e607051836'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-32GB.img.gz Stock image for the 32GB eMMC module] from ''pine64.org'' (846MB, MD5 of the Gzip file ''47a6f0cdac8bad06cb920743849a8894'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-64GB.img.gz Stock image for the 64GB eMMC module] from ''pine64.org'' (884MB, MD5 of the Gzip file ''4e2fed6f5db0d55afdc8a142fc0c4fe1'', build 20210604)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Write the disk images to the eMMC modules using the USB adapter, for example using &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Please allow 3-5 minutes boot up time on first time for initialization.&lt;br /&gt;
&lt;br /&gt;
==== Android 11 Production Test Build ====&lt;br /&gt;
The '''Android 11 Production Test Build''' for the Quartz64 model A for eMMC boot using ROCKChip tools method. This is a test build that was used during product testing.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_20210604_stock_android11_emmcboot.img.gz Direct download] from ''pine64.org'' (812MB, MD5 of the Gzip file ''800f867fdd0d1b2bd7822c156b6067e3'', build 20210604)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Please unzip first and then using [https://files.pine64.org/os/Quartz64/android/RKDevTool_Release_v2.84.zip Rockchip Android tool ver 2.84] to flash in&lt;br /&gt;
* For Windows OS environment please install the [https://files.pine64.org/os/Quartz64/android/DriverAssitant_v5.1.1.zip DriverAssistant v5.11] driver first &lt;br /&gt;
* The OTG port located at top USB 2.0 port on top of USB 3.0 port, needs USB type A to type A cable.&lt;br /&gt;
* Please allow 3-5 minutes boot up time on first time for initialization&lt;br /&gt;
&lt;br /&gt;
==== Android 11 eink SDK ====&lt;br /&gt;
This the '''Android 11 eink SDK''' build for 10.3&amp;quot; e-ink panels on the Quartz64 Model A. &lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_eink.android11_SDK.tar.gz Direct download] from ''pine64.org'' (72.88GB, MD5 of the TAR-GZip file ''293a550584298de4fb95ceae18103672'', build 20210604)&lt;br /&gt;
* Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Software_Releases&amp;diff=20589</id>
		<title>Quartz64 Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Software_Releases&amp;diff=20589"/>
		<updated>2023-08-31T10:30:13Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Remove pgwipeout's CI as it's no longer being updated and hasn't been in a while&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[Quartz64]] in alphabetical order, as well as links to other resources.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
{{warning|You are strongly encouraged to procure a 3.3V UART serial adapter capable of running at 1.5 mbauds, such as [https://pine64.com/product/serial-console-woodpecker-edition/ the Woodpecker] if you want to use a Quartz64, as some images' U-Boot may have no video output on this chip.}}&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' The images are provided by the community, not by PINE64. Most community projects currently aim at getting mainline Linux running on the board, not some vendor provided kernel that will never be receiving updates. A mainline-first approach allows for the boards to continue receiving important updates, such as security updates, for years to come, as well as have higher quality code in the kernel as it underwent independent review, but does mean that not all aspects of the hardware work right out of the gate.}}&lt;br /&gt;
&lt;br /&gt;
=== Armbian ===&lt;br /&gt;
[[File:armbian.png|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''Armbian''' is a base operating system platform for single board computers&lt;br /&gt;
&lt;br /&gt;
* Lightweight Debian or Ubuntu based Linux distribution specialized for ARM development boards&lt;br /&gt;
* Each system is compiled, assembled and optimized by [https://github.com/armbian/build Armbian Build Tools]&lt;br /&gt;
* It has powerful build and software development tools to make custom builds&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
{{Info|This image appears to have issues detecting more than 2GB of RAM.It is strongly recommended to use a different distribution.}}&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/armbian/build/releases/ latest, as fresh as possible, upon code change, images]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* Support on Armbian forums https://forum.armbian.com/forum/96-upcoming-hardware-wip/&lt;br /&gt;
&lt;br /&gt;
=== DietPi ===&lt;br /&gt;
[[File:dietpi.png|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''DietPi''' is a lightweight, yet easy to setup and feature-rich Linux distribution, based on ''Debian''. To find out more about DietPi, please visit the [https://dietpi.com/docs/ official documentation]. Discuss the Quartz64 build(s) on the [https://forum.pine64.org/showthread.php?tid=17601 PINE64 forum thread].&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* Quartz64 Model A: [https://dietpi.com/downloads/images/DietPi_Quartz64A-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
* Quartz64 Model B: [https://dietpi.com/downloads/images/DietPi_Quartz64B-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
* SOQuartz: [https://dietpi.com/downloads/images/DietPi_SOQuartz-ARMv8-Bullseye.7z Direct download from dietpi.com]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background: #a7d7f9;&amp;quot;| Default credentials&lt;br /&gt;
|-&lt;br /&gt;
! Root user&lt;br /&gt;
| &amp;lt;code&amp;gt;root/dietpi&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Manjaro ARM ===&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
'''Manjaro ARM''' is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
&lt;br /&gt;
* Quartz64 Model A: [https://github.com/manjaro-arm/quartz64-a-images/releases Image on GitHub]&lt;br /&gt;
* Quartz64 Model B: [https://github.com/manjaro-arm/quartz64-b-images/releases Image on GitHub]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background: #a7d7f9;&amp;quot;| Default credentials&lt;br /&gt;
|-&lt;br /&gt;
! SSH&lt;br /&gt;
| &amp;lt;code&amp;gt;oem/oem&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
Most of the hardware support is already available in the mainline kernel. If some devices doesn't work it is possible to swap to the linux-quartz64 kernel &amp;lt;code&amp;gt;pacman -S linux-quartz64&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Following desktop options available:&lt;br /&gt;
* Gnome&lt;br /&gt;
* KDE Plasma&lt;br /&gt;
* Mate&lt;br /&gt;
* Sway&lt;br /&gt;
* XFCE&lt;br /&gt;
as well as minimal image without desktop.&lt;br /&gt;
&lt;br /&gt;
=== NetBSD ===&lt;br /&gt;
&lt;br /&gt;
'''NetBSD''' is a free, fast, secure, and highly portable Unix-like Open Source operating system. It relies upon the UEFI support in Tianocore. Before NetBSD 10 is released, the latest version of NetBSD-current should be used.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/ NetBSD daily builds top level] from inside here, navigate to a date, and inside the images/ subdirectory are installable images. Use the one called &amp;quot;NetBSD-&amp;lt;version&amp;gt;-evbarm-aarch64-install.img.gz&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* This image can be written to a supported device, such as the eMMC interface, any USB storage device, NVMe, and PCIe AHCI SATA are all supported with builds after 2022-01-15.&lt;br /&gt;
* Currently this can not be shared with the EDK2 port, ie, microSD for EDK2 and some other media for NetBSD.&lt;br /&gt;
&lt;br /&gt;
=== Plebian ===&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace ''/dev/sdX'' with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
&lt;br /&gt;
=== Tianocore EDK II port by jmcneill ===&lt;br /&gt;
&lt;br /&gt;
This (as of 2021-12-30) is a work in progress to enable UEFI enabled systems, and is able to bring up SD, eMMC, USB, PCIe with SATA and NVMe, HDMI, thermal sensors, TRNG, as well as general Cortex A-55 features.  Known to work with NetBSD -current, and the ESXi Arm fling version 1.8.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://github.com/jaredmcneill/quartz64_uefi jmcneill's Quartz64 UEFI Github]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* The microSD card image should be written to an microSD card and installed. Currently, using the same card for the operating system as well may be problematic.&lt;br /&gt;
&lt;br /&gt;
== BSP Linux SDK ==&lt;br /&gt;
&lt;br /&gt;
The '''BSP Linux SDK ver 4.19'' for the Quartz64 Model A.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_BSP%20Linux.tar.gz Direct download] from ''pine64.org'' (32.67GB, MD5 of the TAR-GZip file ''24554419aec29700add97167a3a4c9ed'')&lt;br /&gt;
&lt;br /&gt;
== Android SDK ==&lt;br /&gt;
&lt;br /&gt;
=== Android 11 SDK ===&lt;br /&gt;
&lt;br /&gt;
The '''Android 11 SDK''' for the Quartz64 Model A SBC.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64_SDK_android11.tar.gz Direct download] from ''pine64.org'' (79.00GB, MD5 of the TAR-GZip file ''77c2ff57ea3372fb04da7fb49e17d12b'')&lt;br /&gt;
* Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
=== Android 11 Production Test Builds  ===&lt;br /&gt;
&lt;br /&gt;
==== Android 11 Stock ====&lt;br /&gt;
The '''Android 11 Stock''' images for eMMC boot for the Quartz64 Model A. This is test build that was used during product testing.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-8GB.img.gz Stock image for the 8GB eMMC module] from ''pine64.org'' (819MB, MD5 of the Gzip file ''e4365753e584d9fce1b8f10f095eede6'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-16GB.img.gz Stock image for the 16GB eMMC module] from ''pine64.org'' (1.10GB, MD5 of the Gzip file ''491c5f7744b0ca0b74ae76e607051836'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-32GB.img.gz Stock image for the 32GB eMMC module] from ''pine64.org'' (846MB, MD5 of the Gzip file ''47a6f0cdac8bad06cb920743849a8894'', build 20210604)&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_dd_20210604_stock_android11_emmcboot-64GB.img.gz Stock image for the 64GB eMMC module] from ''pine64.org'' (884MB, MD5 of the Gzip file ''4e2fed6f5db0d55afdc8a142fc0c4fe1'', build 20210604)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Write the disk images to the eMMC modules using the USB adapter, for example using &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Please allow 3-5 minutes boot up time on first time for initialization.&lt;br /&gt;
&lt;br /&gt;
==== Android 11 Production Test Build ====&lt;br /&gt;
The '''Android 11 Production Test Build''' for the Quartz64 model A for eMMC boot using ROCKChip tools method. This is a test build that was used during product testing.&lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [https://files.pine64.org/os/Quartz64/android/Quartz64_model-A_20210604_stock_android11_emmcboot.img.gz Direct download] from ''pine64.org'' (812MB, MD5 of the Gzip file ''800f867fdd0d1b2bd7822c156b6067e3'', build 20210604)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Please unzip first and then using [https://files.pine64.org/os/Quartz64/android/RKDevTool_Release_v2.84.zip Rockchip Android tool ver 2.84] to flash in&lt;br /&gt;
* For Windows OS environment please install the [https://files.pine64.org/os/Quartz64/android/DriverAssitant_v5.1.1.zip DriverAssistant v5.11] driver first &lt;br /&gt;
* The OTG port located at top USB 2.0 port on top of USB 3.0 port, needs USB type A to type A cable.&lt;br /&gt;
* Please allow 3-5 minutes boot up time on first time for initialization&lt;br /&gt;
&lt;br /&gt;
==== Android 11 eink SDK ====&lt;br /&gt;
This the '''Android 11 eink SDK''' build for 10.3&amp;quot; e-ink panels on the Quartz64 Model A. &lt;br /&gt;
&lt;br /&gt;
Download:&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_eink.android11_SDK.tar.gz Direct download] from ''pine64.org'' (72.88GB, MD5 of the TAR-GZip file ''293a550584298de4fb95ceae18103672'', build 20210604)&lt;br /&gt;
* Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20588</id>
		<title>SOQuartz Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20588"/>
		<updated>2023-08-31T10:18:09Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add note about making your own images, remove irrelevant blogspam&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[SOQuartz]].&lt;br /&gt;
&lt;br /&gt;
== Making Your Own ==&lt;br /&gt;
&lt;br /&gt;
Making your own image/installation of Linux for SOQuartz is relatively easy, as all major components are mainlined. You will need:&lt;br /&gt;
&lt;br /&gt;
* A build of mainline U-Boot &amp;amp;ge; v2023.10, see [[Quartz64 Building U-Boot]]. Flash this to sector 64 (sector size 512, so byte 32768) of your image for SD or eMMC. It's prudent to &amp;quot;protect&amp;quot; it by making a small (~16MiB) partition at this offset.&lt;br /&gt;
* A [https://www.kernel.org/ mainline Linux kernel] &amp;amp;ge; v6.2. See [[Quartz64 Development#Linux Kernel Config Options]] for the device specific kernel configuration options.&lt;br /&gt;
* The root filesystem of the distribution of your choice. This can be on the same filesystem as your kernel and device tree if using ''extlinux.conf''.&lt;br /&gt;
&lt;br /&gt;
You can either boot the kernel through U-Boot's EFI booting, in which case it gets its device tree from U-Boot, or mark the partition containing your kernel and device tree with the legacy bootable flag and [https://u-boot.readthedocs.io/en/latest/develop/distro.html#boot-configuration-files write an ''extlinux/extlinux.conf''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Add your own images below this section, please sort it alphabetically (don't try to be &amp;quot;first&amp;quot;), don't list one-off hacked together images found by the side of the road.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== DietPi support with Debian/Bullseye ==&lt;br /&gt;
&lt;br /&gt;
Info and downloads:  https://dietpi.com/docs/hardware/#pine64&lt;br /&gt;
&lt;br /&gt;
== Manjaro ARM ==&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Manjaro ARM is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/manjaro-arm/soquartz-cm4-images/releases Images for SOQuartz on GitHub]&lt;br /&gt;
&lt;br /&gt;
WiFI, Bluetooth, Ethernet, HDMI USB etc. works, others are not tested. &lt;br /&gt;
&lt;br /&gt;
Currently the image is built for Raspberry Pi CM4 - IO board, so to get it working with other base board like pine64 Soquartz model A base board then follow this steps&lt;br /&gt;
*Flash the image to a SD card/ EMMC.&lt;br /&gt;
*Go to Boot partition.&lt;br /&gt;
*Then change the DTB listed in /boot/extlinux/extlinux.conf to -model-a.dtb instead of -cm4.dtb.&lt;br /&gt;
*Now put the SD card/ EMMC to the preferred base board and boot.&lt;br /&gt;
*First boot will take time as the user partition will resize to take whole storage size.&lt;br /&gt;
&lt;br /&gt;
For headless installation, simply enter &amp;quot;root&amp;quot; at the login: prompt and complete setup.&lt;br /&gt;
&lt;br /&gt;
== Plebian ==&lt;br /&gt;
[[File:Plebian-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm. It supports both of PINE64's officially released SOQuartz base boards.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace &amp;lt;tt&amp;gt;/dev/sdX&amp;lt;/tt&amp;gt; with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Check [https://plebian.org/flashing/ Plebian's flashing instructions] for instructions on how to flash from e.g. Windows.&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
* '''Please flash the correct image for your SOQuartz baseboard!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SOQuartz]] [[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20587</id>
		<title>SOQuartz Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20587"/>
		<updated>2023-08-31T09:52:23Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Plebian */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[SOQuartz]].&lt;br /&gt;
&lt;br /&gt;
== DietPi support with Debian/Bullseye ==&lt;br /&gt;
&lt;br /&gt;
Info and downloads:  https://dietpi.com/docs/hardware/#pine64&lt;br /&gt;
&lt;br /&gt;
James Chambers did a soquartz review, and recommends the Armbian build from above.&lt;br /&gt;
&lt;br /&gt;
* https://jamesachambers.com/pine64-soquartz-cm4-alternative-review/&lt;br /&gt;
&lt;br /&gt;
== Manjaro ARM ==&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Manjaro ARM is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/manjaro-arm/soquartz-cm4-images/releases Images for SOQuartz on GitHub]&lt;br /&gt;
&lt;br /&gt;
WiFI, Bluetooth, Ethernet, HDMI USB etc. works, others are not tested. &lt;br /&gt;
&lt;br /&gt;
Currently the image is built for Raspberry Pi CM4 - IO board, so to get it working with other base board like pine64 Soquartz model A base board then follow this steps&lt;br /&gt;
*Flash the image to a SD card/ EMMC.&lt;br /&gt;
*Go to Boot partition.&lt;br /&gt;
*Then change the DTB listed in /boot/extlinux/extlinux.conf to -model-a.dtb instead of -cm4.dtb.&lt;br /&gt;
*Now put the SD card/ EMMC to the preferred base board and boot.&lt;br /&gt;
*First boot will take time as the user partition will resize to take whole storage size.&lt;br /&gt;
&lt;br /&gt;
For headless installation, simply enter &amp;quot;root&amp;quot; at the login: prompt and complete setup.&lt;br /&gt;
&lt;br /&gt;
== Plebian ==&lt;br /&gt;
[[File:Plebian-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm. It supports both of PINE64's officially released SOQuartz base boards.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace &amp;lt;tt&amp;gt;/dev/sdX&amp;lt;/tt&amp;gt; with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Check [https://plebian.org/flashing/ Plebian's flashing instructions] for instructions on how to flash from e.g. Windows.&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
* '''Please flash the correct image for your SOQuartz baseboard!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SOQuartz]] [[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20586</id>
		<title>SOQuartz Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20586"/>
		<updated>2023-08-31T09:50:25Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add logo to Plebian listing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[SOQuartz]].&lt;br /&gt;
&lt;br /&gt;
== DietPi support with Debian/Bullseye ==&lt;br /&gt;
&lt;br /&gt;
Info and downloads:  https://dietpi.com/docs/hardware/#pine64&lt;br /&gt;
&lt;br /&gt;
James Chambers did a soquartz review, and recommends the Armbian build from above.&lt;br /&gt;
&lt;br /&gt;
* https://jamesachambers.com/pine64-soquartz-cm4-alternative-review/&lt;br /&gt;
&lt;br /&gt;
== Manjaro ARM ==&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Manjaro ARM is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/manjaro-arm/soquartz-cm4-images/releases Images for SOQuartz on GitHub]&lt;br /&gt;
&lt;br /&gt;
WiFI, Bluetooth, Ethernet, HDMI USB etc. works, others are not tested. &lt;br /&gt;
&lt;br /&gt;
Currently the image is built for Raspberry Pi CM4 - IO board, so to get it working with other base board like pine64 Soquartz model A base board then follow this steps&lt;br /&gt;
*Flash the image to a SD card/ EMMC.&lt;br /&gt;
*Go to Boot partition.&lt;br /&gt;
*Then change the DTB listed in /boot/extlinux/extlinux.conf to -model-a.dtb instead of -cm4.dtb.&lt;br /&gt;
*Now put the SD card/ EMMC to the preferred base board and boot.&lt;br /&gt;
*First boot will take time as the user partition will resize to take whole storage size.&lt;br /&gt;
&lt;br /&gt;
For headless installation, simply enter &amp;quot;root&amp;quot; at the login: prompt and complete setup.&lt;br /&gt;
&lt;br /&gt;
== Plebian ==&lt;br /&gt;
[[File:Plebian-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm. It supports both of PINE64's officially released SOQuartz base boards.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace &amp;lt;tt&amp;gt;/dev/sdX&amp;lt;/tt&amp;gt; with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
* '''Please flash the correct image for your SOQuartz baseboard!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SOQuartz]] [[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=File:Plebian-logo.svg&amp;diff=20585</id>
		<title>File:Plebian-logo.svg</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=File:Plebian-logo.svg&amp;diff=20585"/>
		<updated>2023-08-31T09:49:33Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Plebian logo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Plebian logo&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{cc-by-sa-4.0}}&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20584</id>
		<title>SOQuartz Software Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=SOQuartz_Software_Releases&amp;diff=20584"/>
		<updated>2023-08-31T09:46:18Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Remove broken stuff, no longer updated stuff, reorder alphabetically&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains a list of all available operating systems for the [[SOQuartz]].&lt;br /&gt;
&lt;br /&gt;
== DietPi support with Debian/Bullseye ==&lt;br /&gt;
&lt;br /&gt;
Info and downloads:  https://dietpi.com/docs/hardware/#pine64&lt;br /&gt;
&lt;br /&gt;
James Chambers did a soquartz review, and recommends the Armbian build from above.&lt;br /&gt;
&lt;br /&gt;
* https://jamesachambers.com/pine64-soquartz-cm4-alternative-review/&lt;br /&gt;
&lt;br /&gt;
== Manjaro ARM ==&lt;br /&gt;
[[File:Manjaro-logo.svg|right|100px]]&lt;br /&gt;
&lt;br /&gt;
Manjaro ARM is a user friendly rolling release distribution, based on Arch Linux ARM.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/manjaro-arm/soquartz-cm4-images/releases Images for SOQuartz on GitHub]&lt;br /&gt;
&lt;br /&gt;
WiFI, Bluetooth, Ethernet, HDMI USB etc. works, others are not tested. &lt;br /&gt;
&lt;br /&gt;
Currently the image is built for Raspberry Pi CM4 - IO board, so to get it working with other base board like pine64 Soquartz model A base board then follow this steps&lt;br /&gt;
*Flash the image to a SD card/ EMMC.&lt;br /&gt;
*Go to Boot partition.&lt;br /&gt;
*Then change the DTB listed in /boot/extlinux/extlinux.conf to -model-a.dtb instead of -cm4.dtb.&lt;br /&gt;
*Now put the SD card/ EMMC to the preferred base board and boot.&lt;br /&gt;
*First boot will take time as the user partition will resize to take whole storage size.&lt;br /&gt;
&lt;br /&gt;
For headless installation, simply enter &amp;quot;root&amp;quot; at the login: prompt and complete setup.&lt;br /&gt;
&lt;br /&gt;
== Plebian ==&lt;br /&gt;
&lt;br /&gt;
Plebian stands for '''P'''INE64 '''L'''ive D'''ebian''' and aims to be a fairly vanilla live Debian image for Quartz64 and SOQuartz devices, based on Debian Bookworm. It supports both of PINE64's officially released SOQuartz base boards.&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/releases Download Release Images]&lt;br /&gt;
* [https://github.com/Plebian-Linux/quartz64-images/blob/main/RUNNING.md Read The Instructions]&lt;br /&gt;
* [https://plebian.org/ Visit plebian.org to learn more]&lt;br /&gt;
&lt;br /&gt;
To flash, run (replace &amp;lt;tt&amp;gt;/dev/sdX&amp;lt;/tt&amp;gt; with your target block device):&lt;br /&gt;
&lt;br /&gt;
 $ xzcat imagename.img.xz | sudo dd of=/dev/sdX bs=4M oflag=dsync status=progress&lt;br /&gt;
&lt;br /&gt;
Some quick notes:&lt;br /&gt;
&lt;br /&gt;
* You will be asked to change your password on first login (for what the default login is, read the instructions!)&lt;br /&gt;
* Root file system is grown to take up the entire space of your boot device&lt;br /&gt;
* NetworkManager is used instead of Debian's interfaces config to be more flexible with what adapters are plugged in and working&lt;br /&gt;
* An sshd is started on port 22 with freshly generated keys&lt;br /&gt;
* '''Please flash the correct image for your SOQuartz baseboard!'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SOQuartz]] [[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=SOQuartz&amp;diff=20583</id>
		<title>SOQuartz</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=SOQuartz&amp;diff=20583"/>
		<updated>2023-08-31T09:33:27Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add troubleshooting section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:SOQuartz module-1s.jpg|400px|thumb|right|The SOQuartz]]&lt;br /&gt;
&lt;br /&gt;
The '''SOQuartz''' is a RK3566 based compute module and parts of Quartz64 series. &lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
The SOQuartz software releases can be found in the article [[SOQuartz Software Releases]].&lt;br /&gt;
&lt;br /&gt;
== SoC and Memory Specification ==&lt;br /&gt;
* Based on [https://www.rock-chips.com/a/en/products/RK35_Series/2021/0113/1274.html Rockchip RK3566]&lt;br /&gt;
[[File:RK3566_icon.png|right]]&lt;br /&gt;
&lt;br /&gt;
=== CPU Architecture ===&lt;br /&gt;
* [https://developer.arm.com/ip-products/processors/cortex-a/cortex-a55 Quad-core ARM Cortex-A55@1.8GHz]&lt;br /&gt;
* AArch32 for full backwards compatibility with ARMv7&lt;br /&gt;
* ARM Neon Advanced SIMD (single instruction, multiple data) support for accelerated media and signal processing computation&lt;br /&gt;
* Includes VFP hardware to support single and double-precision operations&lt;br /&gt;
* ARMv8 Cryptography Extensions&lt;br /&gt;
* Integrated 32KB L1 instruction cache and 32KB L1 data cache per core&lt;br /&gt;
* 512KB unified system L3 cache&lt;br /&gt;
&lt;br /&gt;
=== GPU (Graphics Processing Unit) Capabilities ===&lt;br /&gt;
* [https://developer.arm.com/ip-products/graphics-and-multimedia/mali-gpus/mali-g52-gpu Mali-G52 2EE Bifrost GPU@800MHz]&lt;br /&gt;
* 4x Multi-Sampling Anti-Aliasing (MSAA) with minimal performance drop &lt;br /&gt;
* 128KB L2 Cache configurations&lt;br /&gt;
* Supports OpenGL ES 1.1, 2.0, and 3.2&lt;br /&gt;
* Supports Vulkan 1.0 and 1.1&lt;br /&gt;
* Supports OpenCL 2.0 Full Profile&lt;br /&gt;
* Supports 1600 Mpix/s fill rate when at 800MHz clock frequency&lt;br /&gt;
* Supports 38.4 GLOP/s when at 800MHz clock frequency&lt;br /&gt;
&lt;br /&gt;
=== Neural Process Unit NPU Capability ===&lt;br /&gt;
* Neural network acceleration engine with processing performance of up to 0.8 TOPS&lt;br /&gt;
* Supports integer 8 and integer 16 convolution operations&lt;br /&gt;
* Supports the following deep learning frameworks: TensorFlow, TF-lite, Pytorch, Caffe, ONNX, MXNet, Keras, Darknet&lt;br /&gt;
&lt;br /&gt;
=== System Memory ===&lt;br /&gt;
* RAM Memory Variants: 2GB, 4GB, 8GB LPDDR4.&lt;br /&gt;
* Storage Memory: optional 128Mb SPI Flash and optional eMMC module from 8GB up to 128GB&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
* 10/100/1000Mbps Ethernet&lt;br /&gt;
* WiFi 802.11 b/g/n/ac with Bluetooth 5.0&lt;br /&gt;
&lt;br /&gt;
== SOQuartz exposed peripherals ==&lt;br /&gt;
&lt;br /&gt;
=== Displays / Cameras ===&lt;br /&gt;
&lt;br /&gt;
* 1x HDMI&lt;br /&gt;
* 2x DSI&lt;br /&gt;
* 1x eDP (Instead of HDMI1)&lt;br /&gt;
* 1x LVDS (not available when dual-mode DSI)&lt;br /&gt;
* 1x CSI 4-line&lt;br /&gt;
&lt;br /&gt;
=== Connectivity ===&lt;br /&gt;
&lt;br /&gt;
* 1x Ethernet (1Gbit)&lt;br /&gt;
* 1x USB 2.0 OTG&lt;br /&gt;
* 1x SD Card (SD)&lt;br /&gt;
* 1x PCIe 1-Line&lt;br /&gt;
* 28x GPIO (TBD)&lt;br /&gt;
&lt;br /&gt;
== Connector Pins Definition ==&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/SOQuartz%20Connector%20Pin%20Assignments%20ver%201.0.ods SOQuartz Module Connector Pins Definition ver 1.0]&lt;br /&gt;
&lt;br /&gt;
== SOQuartz Model-A Baseboard Features ==&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_model-A_baseboard.jpg |400px|thumb|SOQuartz Model-A Baseboard]]&lt;br /&gt;
* Model &amp;quot;A&amp;quot; Baseboard Dimensions: 133mm x 80mm x 19mm&lt;br /&gt;
* Input Power: DC 12V @ 3A 5.5OD/2.1ID (IEC 60130-10 Type A) Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
* microSD - bootable, support SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB -	2 USB2.0 Host port&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* MiPi-CSI - 1x 2 lanes, 1x 4 lanes &lt;br /&gt;
* MiPi-DSI - 1x 2 lanes, 1x 4 lanes &lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header&lt;br /&gt;
* PCIe 1x open ended slot&lt;br /&gt;
* 1x5 pin USB Expansion Header (J15)&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
Interesting alternate pin configurations are listed in [brackets].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C2_SDA_M1]'' GPIO4_B4_3V3 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C2_SCL_M1]'' GPIO4_B5_3V3 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[GPCLK0]'' GPIO4_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO0_D1_3V3 ''[UART2_TX_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO0_D0_3V3 ''[UART2_RX_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S1_MCLK_M1]'' GPIO3_C6_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C7_3V3 ''[I2S1_SCLK_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_A0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_A2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A3_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI3_MOSI_M0]'' GPIO4_B2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI3_MISO_M0]'' GPIO4_B0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 21&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 22&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_B1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI3_CLK_M0]'' GPIO4_B3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 23&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 24&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A6_3V3 ''[SPI3_CS0_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 25&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 26&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A7_3V3 ''[SPI3_CS1_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SDA_M0]'' GPIO1_A0_3V3 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 27&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 28&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO1_A1_3V3 ''[I2C3_SCL_M0]'' &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_A5_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 29&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 30&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_D4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 31&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 32&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D6_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_D7_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 33&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 34&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S1_LRCK_M1]'' GPIO3_D0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 35&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 36&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D5_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_D3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 37&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 38&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D2_3V3 ''[I2S1_SDI_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 39&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 40&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D1_3V3 ''[I2S1_SDO_M1]''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Notes====&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;pulled high to 3.3V through 2.2kOhm resistor&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: Page 11 of [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.pdf the board schematics].&lt;br /&gt;
=== USB Expansion Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; | USB2_HOST_5V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:center; | HOST_DM3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; | HOST_DP3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:center; | GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; | GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Source: Page 10 of [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.pdf the board schematics].&lt;br /&gt;
&lt;br /&gt;
== SOQuartz BLADE Baseboard Features ==&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_BLADE_Dimension.jpg |400px|thumb|SOQuartz BLADE Baseboard]]&lt;br /&gt;
* SOQuartz BLADE Baseboard Dimensions: 200mm x 40mm x 15mm&lt;br /&gt;
* Input Power:&lt;br /&gt;
** DC 5V @ 3A 3.5OD/1.35ID (IEC 60130-10 Type H) Barrel DC Jack connector&lt;br /&gt;
** PoE&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
* microSD - bootable, support SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB - USB2.0 Host port (with header for setting OTG ID pin)&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header&lt;br /&gt;
* M.2 slot&lt;br /&gt;
* PWM fan header&lt;br /&gt;
&lt;br /&gt;
=== Jumpers ===&lt;br /&gt;
* OTG ID jumper&lt;br /&gt;
* GPIO voltage, select 3.3V or 1.8V&lt;br /&gt;
* PoE Enable&lt;br /&gt;
&lt;br /&gt;
== SOQuartz Module and Baseboard Information, Schematics, and Certifications ==&lt;br /&gt;
&lt;br /&gt;
* SOQuartz Module Schematic:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz_SOM_schematic_v1.1_20210816.pdf SOQuartz Module ver 1.1 20210816 Schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-PCB-placement-v1.1.pdf SOQuartz Module ver 1.1 20210816 PCB Component Placement]&lt;br /&gt;
&lt;br /&gt;
* SOQuartz Model &amp;quot;A&amp;quot; Baseboard Schematic and PCB Board Resource:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.pdf SOQuartz Model-A baseboard 20220522 Schematic PDF file]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.DSN SOQuartz Model-A baseboard 20220522 Schematic DSN source file]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Component-Placement_top-20220522.pdf SOQuartz SOQuartz Model-A baseboard 20220522 PCB Top Component Placement]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz_Model_A_Baseboard_Component_Placement_bottom_20220522.pdf SOQuartz SOQuartz Model-A baseboard 20220522 PCB Bottom Component Placement]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-PCB-20220522.dsn SOQuartz Model-A baseboard 20220522 PCB DSN file]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-PCB-20220522.rar SOQuartz Model-A baseboard 20220522 PCB Gerber file]&lt;br /&gt;
&lt;br /&gt;
[[File:BLADE_1U_half_width_server_rack.jpg |400px|thumb|SOQuartz BLADE 3D Print 1U half width server rack]]&lt;br /&gt;
[[File:BLADE_1U_full_width_server_rack.jpg |400px|thumb|SOQuartz BLADE 3D Print 1U full width server rack]]&lt;br /&gt;
* SOQuartz Blade Baseboard Schematic and PCB Board Resource:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-BLADE-Baseboard-Schematic-20220522.pdf SOQuartz BLADE 20220522 Schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-BLADE-PCB-Placement-20220522.pdf SOQuartz BLADE 20220522 PCB component Placement]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/BLADE%201U%20Rack_3D.stp SOQuartz BLADE 1U Rack STP file]&lt;br /&gt;
[[File:BLADE_1U_rack_3D.jpg |400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SOQuartz module certifications:&lt;br /&gt;
* [https://files.pine64.org/doc/cert/SOQuartz%20FCC%20Certificate-S21101902401001.pdf SOQuartz module FCC Certificate]&lt;br /&gt;
* [https://files.pine64.org/doc/cert/SOQuartz%20CE%20Certificate-S21101902402001.pdf SOQuartz module CE EMC Certificate]&lt;br /&gt;
&lt;br /&gt;
== Datasheets for Components and Peripherals ==&lt;br /&gt;
* Rockchip RK3566 SoC information:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/Rockchip%20RK3566%20Datasheet%20V1.0-20201210.pdf Rockchip RK3566 ver 1.0 datasheet, already got release permission from Rockchip]&lt;br /&gt;
* Rockchip PMU (Power Management Unit) Information:&lt;br /&gt;
** [https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf Rockchip RK809 ver 1.01 datasheet for SOQuartz PMU]&lt;br /&gt;
* DDR4 information:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/rockpro64/SM512M32Z01MD2BNP(200BALL).pdf Micron LPDDR4 Mobile LPDDR4 Datasheet]&lt;br /&gt;
* eMMC information:&lt;br /&gt;
** [https://files.pine64.org/doc/rock64/PINE64_eMMC_Module_20170719.pdf PINE64 eMMC module schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/rock64/usb%20emmc%20module%20adapter%20v2.pdf PINE64 USB adapter for eMMC module V2 schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/rock64/USB%20adapter%20for%20eMMC%20module%20PCB.tar PINE64 USB adapter for eMMC module PCB in JPEG]&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/pine64/E-00517%20FORESEE_eMMC_NCEMAM8B-16G%20SPEC.pdf 16GB Foresee eMMC Datasheet]&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/pine64/SDINADF4-16-128GB-H%20data%20sheet%20v1.13.pdf 32GB/64GB/128GB SanDisk eMMC Datasheet]&lt;br /&gt;
* SPI NOR Flash information:&lt;br /&gt;
* Ethernet PHY information:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/pine64/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf Realtek RTL8211 10/100/1000M Ethernet Transceiver]&lt;br /&gt;
* WiFi/BT module info:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/rockpro64/AW-CM256SM_DS_DF_V1.9_STD.pdf Azurewave CM256SM 11AC WiFi + Bluetooth5.0 Datasheet]&lt;br /&gt;
* i2C to PWM Controller user in BLADE info:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/quartz64/GP7101_cn_V1_qsxn.pdf GP7101 i2c to PWM Controller Datasheet in Chinese]&lt;br /&gt;
** GP7101 i2c to PWM Controller Datasheet translated to English by neggles [[File:GP7101 cn V1 qsxn en.pdf]]&lt;br /&gt;
** I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C address is 0x58 despite what datasheet says&lt;br /&gt;
* PoE DC/DC Controller user in BLADE info:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/quartz64/SD4954B%20Datasheet.pdf Silan SD4954B PD and DC/DC Controller compatible with IEEE 802.3AF standard Datasheet]&lt;br /&gt;
&lt;br /&gt;
== SOQuartz Module with various CM4 carrier boards ==&lt;br /&gt;
&lt;br /&gt;
* For CM4 carrier board comprehensive list, please visit [https://pipci.jeffgeerling.com/boards_cm Jeff Geerling collection]&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_with_DF_Robot_carrier_board.jpg|400px|thumb|SOQuartz with DF Robot CM4 Carrier Board]]&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_with_Waveshare_carrier_board.jpg|400px|thumb|SOQuartz with Waveshare CM4 Carrier Board]]&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_with_Waveshare_PoE_carrier_board.jpg|400px|thumb|SOQuartz with Waveshare CM4 PoE Board]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BSP Linux SDK ==&lt;br /&gt;
&lt;br /&gt;
=== BSP Linux SDK ver 4.19 for Quartz64 model A SBC  ===&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_BSP%20Linux.tar.gz Direct Download from pine64.org]&lt;br /&gt;
** MD5 (TAR-GZip file): 24554419aec29700add97167a3a4c9ed&lt;br /&gt;
** File Size: 32.67.00GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Android SDK ==&lt;br /&gt;
&lt;br /&gt;
=== Android 11 SDK for Quartz64 model A SBC  ===&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64_SDK_android11.tar.gz Direct Download from pine64.org]&lt;br /&gt;
** MD5 (TAR-GZip file): 77c2ff57ea3372fb04da7fb49e17d12b&lt;br /&gt;
** File Size: 79.00GB&lt;br /&gt;
** Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
== How-To ==&lt;br /&gt;
&lt;br /&gt;
=== Building Mainline U-Boot ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Building U-Boot]].&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
This section provides information on troubleshooting various common issues you may encounter using the SOQuartz.&lt;br /&gt;
&lt;br /&gt;
=== Thermal Issues ===&lt;br /&gt;
&lt;br /&gt;
The SOQuartz SoM does not have a lot of copper to sink heat into. Therefore, it's recommended you use a heatsink such as the [https://www.waveshare.com/product/accessories/power-heat-sinks/heat-sinks/cm4-heatsink.htm Waveshare CM4 Heatsink], the [https://www.waveshare.com/product/accessories/power-heat-sinks/heat-sinks/cm4-heatsink-b.htm other Waveshare CM4 Heatsink], or the [https://pine64.com/product/small-fan-type-heatsink/ PINE64 Small Fan Type Heatsink]. Please be aware that the Waveshare heatsinks may interfere with any eMMC module, unless you use very thick (2-3mm?) thermal pads. (Note: a lot of local resellers will sell CM4 heatsinks or small stick-on heatsinks, no need to order them from abroad unless it's cheaper!)&lt;br /&gt;
&lt;br /&gt;
Alternatively, or in addition to this, a rectangle of 1mm thick thermal pad can be sandwiched between the SoM and the carrier board. This allows the SoM to more efficiently sink heat into the larger mass of the base board.&lt;br /&gt;
&lt;br /&gt;
[[Category:SOQuartz]] [[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20582</id>
		<title>Quartz64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20582"/>
		<updated>2023-08-31T09:20:59Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Storage */ note about SATA port&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Quartz64modelb.png|400px|thumb|right|The Quartz64 Model B]]&lt;br /&gt;
&lt;br /&gt;
The '''Quartz64''' is the most recent Single Board Computer offering from PINE64, with Model A initially released in June of 2021 and Model B in May of 2022. It is powered by a Rockchip RK3566 Quad-Core ARM Cortex A55 64-Bit Processor with a MALI G-52 GPU.&lt;br /&gt;
&lt;br /&gt;
Key features include a PCIe x4 open ended slot (model A) or m.2 (model B) using one Gen2 lane electrically, and the use of LPDDR4 RAM.&lt;br /&gt;
&lt;br /&gt;
The Quartz64 has three LPDDR4 system memory options: 2GB, 4GB or 8GB. For booting, there is an eMMC module socket (supporting up to 128GB) and microSD slot, as well as a footprint to solder on an SPI flash chip. The board is equipped with HDMI, 1x USB 3.0 type A Host, 3x USB 2.0 Host, Gigabit Ethernet, SATA (model A), GPIO Bus, MiPi DSI interface, e-ink interface (model A), eDP interface (model A), touch Panel interface (model A), MiPi CSI interface, as well as many other device interfaces such as UART, SPI, I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C, for makers to integrate with sensors and other peripherals. Many different Operating Systems (OS) are freely available from the open source community, such as Linux (Ubuntu, Debian, Arch), BSD, and Android.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
Under [[Quartz64 Software Releases]] you will find a complete list of currently supported operating system images, which work with the Quartz64, as well as other related software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
=== Flashing the device ===&lt;br /&gt;
&lt;br /&gt;
Natively the board only supports booting from the eMMC or microSD card, see [[#Boot order|boot order]]. There doesn't seem to be a way to boot from USB devices or SATA yet.&lt;br /&gt;
&lt;br /&gt;
The board can be booted by flashing your favorite operating system to a microSD card using another device and to insert the microSD card into the Quartz64, see the article [[Getting started]]. Flashing the eMMC is possible by booting an operating system from the microSD card and to overwrite the eMMC from within the booted operating system.&lt;br /&gt;
&lt;br /&gt;
=== Boot order ===&lt;br /&gt;
&lt;br /&gt;
The hardware boot order of the Quartz64 is:&lt;br /&gt;
&lt;br /&gt;
# SPI NOR flash&lt;br /&gt;
# SPI NAND flash&lt;br /&gt;
# eMMC&lt;br /&gt;
# microSD card&lt;br /&gt;
&lt;br /&gt;
== SoC and Memory Specifications ==&lt;br /&gt;
&lt;br /&gt;
[[File:RK3566_icon.png|right]]&lt;br /&gt;
&lt;br /&gt;
* Based on [https://www.rock-chips.com/a/en/products/RK35_Series/2021/0113/1274.html Rockchip RK3566]&lt;br /&gt;
&lt;br /&gt;
=== CPU Architecture ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/processors/cortex-a/cortex-a55 Quad-core ARM Cortex-A55@1.8GHz]&lt;br /&gt;
* AArch32 for full backwards compatibility with ARMv7&lt;br /&gt;
* ARM Neon Advanced SIMD (single instruction, multiple data) support for accelerated media and signal processing computation&lt;br /&gt;
* Includes VFP hardware to support single and double-precision operations&lt;br /&gt;
* ARMv8 Cryptography Extensions&lt;br /&gt;
* Integrated 32KB L1 instruction cache and 32KB L1 data cache per core&lt;br /&gt;
* 512KB unified system L3 cache&lt;br /&gt;
* [https://developer.arm.com/ip-products/security-ip/trustzone TrustZone] technology support&lt;br /&gt;
* [https://www.cnx-software.com/2020/12/01/rockchip-rk3568-processor-to-power-edge-computing-and-nvr-applications 22nm process, believed to be FD-SOI]&lt;br /&gt;
&lt;br /&gt;
=== GPU (Graphics Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/graphics-and-multimedia/mali-gpus/mali-g52-gpu Mali-G52 2EE Bifrost GPU@800MHz]&lt;br /&gt;
* 4x Multi-Sampling Anti-Aliasing (MSAA) with minimal performance drop &lt;br /&gt;
* 128KB L2 Cache configurations&lt;br /&gt;
* Supports OpenGL ES 1.1, 2.0, and 3.2&lt;br /&gt;
* Supports Vulkan 1.0 and 1.1&lt;br /&gt;
* Supports OpenCL 2.0 Full Profile&lt;br /&gt;
* Supports 1600 Mpix/s fill rate when at 800MHz clock frequency&lt;br /&gt;
* Supports 38.4 GLOP/s when at 800MHz clock frequency   &lt;br /&gt;
&lt;br /&gt;
=== NPU (Neural Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* Neural network acceleration engine with processing performance of up to 0.8 TOPS&lt;br /&gt;
* Supports integer 8 and integer 16 convolution operations&lt;br /&gt;
* Supports the following deep learning frameworks: TensorFlow, TF-lite, Pytorch, Caffe, ONNX, MXNet, Keras, Darknet&lt;br /&gt;
&lt;br /&gt;
=== System Memory ===&lt;br /&gt;
&lt;br /&gt;
* RAM Memory Variants: 2GB (SOQuartz only), 4GB, 8GB LPDDR4.&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
* 10/100/1000Mbps Ethernet&lt;br /&gt;
* Wi-Fi 802.11 b/g/n/ac with Bluetooth 5.0 (optional on model A, built in on model B)&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
&lt;br /&gt;
* microSD - bootable, supports SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB&lt;br /&gt;
** Model A: 2 USB 2.0 host ports, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
** Model B: 1 USB 2.0 host port, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
* one native SATA 3.0 6Gb/s Port (only on model A, shared with USB 3.0 host port) (removed in newer revisions due to electrical signalling issues it caused)&lt;br /&gt;
* optional eMMC module from 8GB up to 128GB&lt;br /&gt;
* 64 Mbit (8 MByte) SPI flash (Model B only), part number '''25Q64DWZPIG''' in the schematic&lt;br /&gt;
&lt;br /&gt;
==== eMMC Speeds ====&lt;br /&gt;
&lt;br /&gt;
On a 64 GB eMMC module:&lt;br /&gt;
&lt;br /&gt;
  $ sudo hdparm -tT /dev/mmcblk1 &lt;br /&gt;
  &lt;br /&gt;
  /dev/mmcblk1:&lt;br /&gt;
   Timing cached reads:   2368 MB in  2.00 seconds = 1184.46 MB/sec&lt;br /&gt;
   Timing buffered disk reads: 452 MB in  3.01 seconds = 149.98 MB/sec&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* HDMI&lt;br /&gt;
* eDP - 4 lanes of 2.7Gbps, up to 2560x1600@60Hz (only on model A)&lt;br /&gt;
* DSI - Display Serial Interface, 4 lanes MiPi, up to 1440P on model A, 2 lanes MiPi, up to 1080p on model B &lt;br /&gt;
* CSI - CMOS Camera Interface, 4 lanes MiPi up to 8 mega pixel on model A, 2 lanes MiPi up to 5 mega pixel on model B &lt;br /&gt;
* TP - Touch Panel Port, SPI with interrupt on model A&lt;br /&gt;
* RTC - Real Time Clock Battery Connector&lt;br /&gt;
* VBAT - Lithium Battery Connector with temperature sensor input on model A&lt;br /&gt;
* Wi-Fi/BT Module Header - SDIO 3.0 and UART on model A, built-in Wi-Fi/BT Module on model B&lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header on model B, 2x10 pins GPO header on model A&lt;br /&gt;
* PCIe x4 open ended slot on model A, m.2 slot on model B, one Gen2 lane due to SoC constraints&lt;br /&gt;
** On Model A, the slot provides 10W of power for the 3.3V supply and however much power your 12V input power supply provides on the 12V supply&lt;br /&gt;
&lt;br /&gt;
The PCIe implementation on the RK3566 is much more compatible with a wide range of devices compared to the one on the RK3399 used on the ROCKPro64. This means a lot more devices should work (excluding dGPUs due to a lack of cache snooping ability).&lt;br /&gt;
&lt;br /&gt;
==== Combo PHYs ====&lt;br /&gt;
&lt;br /&gt;
[[File:rk3566 phy.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Several of the I/O options on the RK3566 used in the Quartz64 are using the same I/O lines, meaning that they cannot be used at the same time. The above diagram illustrates how they are connected.&lt;br /&gt;
&lt;br /&gt;
In particular, USB 3.0 and the SATA connector on the board are mutually exclusive, and the PCI-e 2.0 lane can be reconfigured into a second SATA port, though an adapter cable needs to be fashioned for this to be useful.&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model A) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SDA_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SCL_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| CPU_REFCLK_OUT&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MOSI_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_TX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MISO_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_RX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CLK_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CS0_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| SPDIF_OUT &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;c&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 3.3V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;can be a PWM pin&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;pulled high to 3.3V through 2.2kOhm resistor&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;low-pass filtered with cutoff of 220 MHz&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: Page 28 of [[File:Quartz64_model-A_schematic_v1.0_20201215.pdf|the board schematics]].&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model B) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
Interesting alternate pin configurations are listed in [brackets].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SDA_M0]'' GPIO1_A0_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SCL_M0]'' GPIO1_A1_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_C4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CS0_M1]'' GPIO3_A1_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A3_3V3 ''[I2S3_SCLK_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_MCLK_M0]'' GPIO3_A2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B2_3V3 &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C5_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 21&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 22&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C1_3V3 ''[SPI1_MOSI_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 23&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 24&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_C6_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 25&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 26&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_D1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C4_SDA_M0&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 27&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 28&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| I2C4_SCL_M0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 29&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 30&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 31&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 32&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C2_3V3 ''[SPI1_MISO_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CLK_M1]'' GPIO3_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 33&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 34&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_LRCK_M0]'' GPIO3_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 35&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 36&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A7_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPDIF_TX_M0]'' GPIO1_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 37&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 38&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A6_3V3 ''[I2S3_SDI_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 39&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 40&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A5_3V3 ''[I2S3_SDO_M0]''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Source: Page 24 of [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf the board schematics].&lt;br /&gt;
&lt;br /&gt;
== Quartz64 Board Information, Schematics, and Certifications ==&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;A&amp;quot; Baseboard Dimensions: 133mm x 80mm x 19mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 12V @ 3A 5.5mmOD/2.1mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_schematic_v2.0_20210427.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic ver 2.0 20210427 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_V2.0_connector_placement.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
&lt;br /&gt;
Certifications:&lt;br /&gt;
&lt;br /&gt;
* Disclaimer: Please note that PINE64 SBC is not a &amp;quot;final&amp;quot; product and in general certification is not necessary. However, PINE64 still submit the SBC for FCC and CE certification and obtain the certificates to proof that SBC board is capable on passing the testing. Please note a final commercial product needs to performs its owns testing and obtains its owns certificates.&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20CE%20certification-S21051101701001.pdf Quartz64 model-A CE Certificate]&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20FCC%20certification-S21051101702001.pdf Quartz64 model-A FCC Certificate]&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;B&amp;quot; Baseboard Dimensions: 85mm x 56mm x 18.8mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 5V @ 3A 3.5mmOD/1.35mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic ver 1.3 20220124 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_PCB_Components_Placement-V1.2_20211014.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
* Please note that v1.2 and V1.3 schematic and component placement are identical, just some component value changed.&lt;br /&gt;
* Note: Model B uses a Molex PicoBlade compatible connector for the RTC battery. The Pine64 Backup Battery Holders come with a JST PH type connector. To use the Pine64 RTC Backup Battery Holder, the connector on the battery holder will need to be modified with a PicoBlade type connector.&lt;br /&gt;
&lt;br /&gt;
== Datasheets for Components and Peripherals ==&lt;br /&gt;
&lt;br /&gt;
Rockchip RK3566 SoC information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Rockchip%20RK3566%20Datasheet%20V1.0-20201210.pdf Rockchip RK3566 ver 1.0 datasheet, already got release permission from Rockchip]&lt;br /&gt;
* [https://opensource.rock-chips.com/images/2/26/Rockchip_RK3568_TRM_Part1_V1.3-20220930P.PDF Rockchip RK3566 and RK3568 TRM (Technical Reference Manual)]&lt;br /&gt;
&lt;br /&gt;
Rockchip PMU (Power Management Unit) Information:&lt;br /&gt;
* [https://www.rockchip.fr/RK817%20datasheet%20V1.01.pdf Rockchip RK817 ver 1.01 datasheet for Quartz64 model A]&lt;br /&gt;
* [https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf Rockchip RK809 ver 1.01 datasheet for Quartz64 model B and SOQuartz]&lt;br /&gt;
&lt;br /&gt;
LPDDR4 (200 Balls) SDRAM:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/SM512M32Z01MD2BNP(200BALL).pdf Micron LPDDR4 Mobile LPDDR4 Datasheet]&lt;br /&gt;
&lt;br /&gt;
eMMC information:&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/PINE64_eMMC_Module_20170719.pdf PINE64 eMMC module schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/usb%20emmc%20module%20adapter%20v2.pdf PINE64 USB adapter for eMMC module V2 schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/USB%20adapter%20for%20eMMC%20module%20PCB.tar PINE64 USB adapter for eMMC module PCB in JPEG]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/E-00517%20FORESEE_eMMC_NCEMAM8B-16G%20SPEC.pdf 16GB Foresee eMMC Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/SDINADF4-16-128GB-H%20data%20sheet%20v1.13.pdf 32GB/64GB/128GB SanDisk eMMC Datasheet]&lt;br /&gt;
&lt;br /&gt;
SPI NOR Flash information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/w25q128jv%20spi%20revc%2011162016.pdf WinBond 128Mb SPI Flash Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GD25Q128C-Rev2.5.pdf GigaDevice 128Mb SPI Flash Datasheet]&lt;br /&gt;
&lt;br /&gt;
E-ink Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-754-V3_ES103TC1%20Specification%20V3.0(Signed)-20190702.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Flex Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-828-V1_ED103TC2%20Formal%20Spec%20V1.0_20190514.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Glass Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/PineNote/TI%20PMU-TPS651851.pdf TPS65185x PMIC for E-Ink Enabled Electronic Paper Display Datasheet]&lt;br /&gt;
&lt;br /&gt;
LCD Touch Screen Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/FY07024DI26A30-D_feiyang_LCD_panel.pdf 7.0&amp;quot; 1024x600 TFT-LCD Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/HK70DR2459-PG-V01.pdf Touch Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GT911%20Capacitive%20Touch%20Controller%20Datasheet.pdf GOODiX GT911 5-Point Capacitive Touch Controller Datasheet]&lt;br /&gt;
&lt;br /&gt;
Ethernet PHY information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf Realtek RTL8211 10/100/1000M Ethernet Transceiver]&lt;br /&gt;
&lt;br /&gt;
Wi-Fi/BT module info:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/AW-CM256SM_DS_DF_V1.9_STD.pdf Azurewave CM256SM 11AC Wi-Fi + Bluetooth5.0 Datasheet]&lt;br /&gt;
&lt;br /&gt;
IR LED:&lt;br /&gt;
* [https://media.digikey.com/pdf/Data%20Sheets/Everlight%20PDFs/IRM-36xx_Series.pdf IRM-3638 Datasheet]&lt;br /&gt;
&lt;br /&gt;
Enclosure information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/playbox_enclosure_20160426.stp Playbox Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/ABS_enclosure_20160426.stp ABS Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/pine64%20Die%20Cast%20casing-final.jpg Outdoor Aluminum Cast Dust-proof IP67 Enclosure Drawing]&lt;br /&gt;
* [https://www.printables.com/model/269572-pine-quartz-64-a-full-case 3D Printable Enclosure for Model A]&lt;br /&gt;
* [https://www.printables.com/model/269575-pine-quartz-64-a-open-frame Open Frame for Model A]&lt;br /&gt;
&lt;br /&gt;
Connector information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/ePH.pdf 2.0mm PH Type connector specification use in Lithium Battery (VBAT) port (Model A)]&lt;br /&gt;
* [https://www.molex.com/pdm_docs/sd/533980271_sd.pdf 1.25mm Picoblade Type connector specification used in RTC Battery port (Model B)]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/0.5FPC%20Front%20Open%20Connector%20H=1.5.pdf 0.5mm Pitch cover type FPC connector specification use in DSI port, TP port and CSI port]&lt;br /&gt;
&lt;br /&gt;
== Development efforts ==&lt;br /&gt;
&lt;br /&gt;
{{SeeMainArticle|Quartz64 Development}}&lt;br /&gt;
&lt;br /&gt;
Information and resources of the ongoing development effort for the Quartz64 can be found on the [[Quartz64 Development]] page, where the current status of various board functions can be found, and whether they have landed in upstream.&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.com/pine64-org/quartz-bsp Quartz64 BSP Gitlab Page]&lt;br /&gt;
&lt;br /&gt;
== Enclosures ==&lt;br /&gt;
&lt;br /&gt;
Note: Please expand this section with more cases known to work.&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
All enclosures that fit the ROCKPro64 should fit the Quartz64 Model &amp;quot;A&amp;quot;, as the I/O has been laid out the same on purpose.&lt;br /&gt;
&lt;br /&gt;
* [[Model A Acrylic Open Enclosure]] - but see the troubleshooting section below.&lt;br /&gt;
* [[Quartz64 Premium Aluminium Case|RockPro64 Premium Aluminium Case]]&lt;br /&gt;
* [[ROCKPro64#3D printable ITX mounting brackets]] (Not an enclosure but allows to mount the board in an ATX/ITX case)&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* [[Model B Acrylic Open Enclosure]]&lt;br /&gt;
* the ROCK64 aluminium enclosure '''does not''' work, as the DC input jack is placed differently&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Stability/Boot Issues With Missing Battery Shunt ===&lt;br /&gt;
&lt;br /&gt;
If there is no battery plugged into the board, the jumper labelled &amp;quot;ON/OFF_BATT&amp;quot; must be in place. If this is set wrong, stability issues such as failures to boot will occur. '''This affects model A only'''&lt;br /&gt;
&lt;br /&gt;
=== No Ethernet Connectivity ===&lt;br /&gt;
&lt;br /&gt;
Make sure the kernel is built with &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. Building it as a module (&amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;) and then relying on module auto-loading is unlikely to work, because if the generic PHY driver is built in it will bind to the PHY first, unless you include the motorcomm module in your initramfs.&lt;br /&gt;
&lt;br /&gt;
Note: Starting with [https://salsa.debian.org/kernel-team/linux/-/merge_requests/551 Debian's &amp;lt;code&amp;gt;6.1~rc3-1~exp1&amp;lt;/code&amp;gt; kernel] the module is included, but set to &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; and I (Diederik) have verified that it gets included in the initramfs and '''works''' on Model-A and Model-B with the [[Quartz64#Plebian]] images.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Model A&amp;quot; Acrylic Case Doesn't Fit ===&lt;br /&gt;
&lt;br /&gt;
The Quartz64 does not really fit onto the bottom plate of the [[Model A Acrylic Open Enclosure]]. This is because the &amp;quot;Mic&amp;quot; connector at the bottom of the board interferes with one of the posts. A workaround is to find out which post that is (you have a 50% chance of guessing it right, accounting for rotating the board) and then filing away the corner of the post pointing inwards by a few millimeters.&lt;br /&gt;
&lt;br /&gt;
[[File:Quartz64-audio-jack-spacer-issue.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
An alternate solution may be to place plastic spacers with a smaller outer diameter in between the acrylic bottom plate posts and the SBC board.&lt;br /&gt;
&lt;br /&gt;
=== No GPU Acceleration with Debian &amp;quot;Bullseye&amp;quot; Userland ===&lt;br /&gt;
&lt;br /&gt;
Debian Bullseye ships a Mesa version that is too old to contain the required patches for the RK356x SoC's GPU. You can (at your own risk) [https://wiki.debian.org/DebianTesting use the current Debian Testing version ], called &amp;quot;Bookworm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Wireless Connectivity Doesn't Work ===&lt;br /&gt;
&lt;br /&gt;
ROCKPro64 wireless module may have CYW43455 or CYW43456 chips on board (not sure if this is the same for Quartz64 model B). Both chips are supported by &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt; Wi-Fi driver and &amp;lt;code&amp;gt;btbcm&amp;lt;/code&amp;gt; Bluetooth driver. &lt;br /&gt;
&lt;br /&gt;
For CYW43455 drivers attempt to load &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43455-sdio.bin&amp;lt;/code&amp;gt; for Wi-Fi and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C0.hcd&amp;lt;/code&amp;gt; for Bluetooth. Corresponding firmware files for CYW43456 are &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43456-sdio.bin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C5.hcd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On Manjaro firmware files for both Bluetooth and Wi-Fi on CYW43456 on are provided by &amp;lt;code&amp;gt;ap6256-firmware&amp;lt;/code&amp;gt; package (&amp;lt;code&amp;gt;pacman -S ap6256-firmware&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
However for CYW43455 wi-fi firmware is in the &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package and bluetooth is in the &amp;lt;code&amp;gt;firmware-raspberrypi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;pacman -S linux-firmware firmware-raspberrypi&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package is missing device specific symlinks for quartz64-a. To create them execute:&lt;br /&gt;
&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.bin /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.bin&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.AW-CM256SM.txt /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt &lt;br /&gt;
&lt;br /&gt;
As of 2022-10-19 device tree in mainline kernel for Quartz64 model A has wrong configuration for the Bluetooth driver. [https://patchwork.kernel.org/project/linux-rockchip/patch/20220926125350.64783-1-leo@nabam.net/ Patch] is submitted to the LKML and accepted and included upstream in 6.1-rc7. It's possible to modify dtb file provided by the current kernel using device tree compiler to enable Bluetooth or perform &amp;lt;code&amp;gt;make dtbs&amp;lt;/code&amp;gt; in the patched kernel tree to get updated dtb file (&amp;lt;code&amp;gt;arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dtb&amp;lt;/code&amp;gt;). Issue manifests itself with following errors in `dmesg`:&lt;br /&gt;
&lt;br /&gt;
  command 0x0c03 tx timeout&lt;br /&gt;
  Bluetooth: hci0: BCM: Reset failed (-110)&lt;br /&gt;
&lt;br /&gt;
== How-To ==&lt;br /&gt;
&lt;br /&gt;
=== Connect Debug UART ===&lt;br /&gt;
&lt;br /&gt;
The easiest way to get debug output is to connect a 3.3V 1.5mbaud capable UART adapter to the board.&lt;br /&gt;
&lt;br /&gt;
To connect it, connect the ground lead to pin 6, and the RX/TX leads to pins 8 and 10 (consider swapping them if you get no output, things are often mislabeled). These pins are &amp;quot;UART2&amp;quot; in the above GPIO table.&lt;br /&gt;
&lt;br /&gt;
Open a serial terminal at 1500000 bauds, e.g.&lt;br /&gt;
&lt;br /&gt;
 $ picocom -b 1500000 /dev/ttyUSB0&lt;br /&gt;
&lt;br /&gt;
=== Disable Heartbeat LED (Linux) ===&lt;br /&gt;
&lt;br /&gt;
The flashing LED is called the &amp;quot;heartbeat LED&amp;quot;, it blinks in a heart rhythm like fashion once the kernel is running. To disable it, you can run&lt;br /&gt;
&lt;br /&gt;
 # echo none &amp;gt; /sys/class/leds/user-led/trigger&lt;br /&gt;
&lt;br /&gt;
On model A LED device is called &amp;quot;diy-led&amp;quot;, not &amp;quot;user-led&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On a system with systemd, you can do this as soon as the system is ready to be logged in with a systemd unit like this:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Turn off heartbeat LED&lt;br /&gt;
 Wants=multi-user.target&lt;br /&gt;
 After=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 ExecStart=sh -c 'echo none &amp;gt; /sys/class/leds/user-led/trigger'&lt;br /&gt;
&lt;br /&gt;
Place it in ''/etc/systemd/system/user-led.service'', and run&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable user-led.service&lt;br /&gt;
&lt;br /&gt;
Upon rebooting, you will now notice that the heartbeat LED will blink during boot-up, but stops blinking as soon as the multi-user target is reached (i.e. the user can log in).&lt;br /&gt;
&lt;br /&gt;
=== SATA on model A ===&lt;br /&gt;
&lt;br /&gt;
On model A USB 3.0 and SATA ports are using the same I/O line and can't be used simultaneously. By default USB 3.0 is enabled in Linux device tree and SATA is disabled. FDT modifications are required to turn SATA on. &lt;br /&gt;
&lt;br /&gt;
Following script is tested on Manjaro but should work on the other distributions with minimal changes. Device tree compiler package usually provides fdtput command (on Manjaro run: &amp;lt;code&amp;gt;pacman -S dtc&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 # cp /boot/dtbs/rockchip/rk3566-quartz64-a.dtb /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /usb@fd000000 status disabled&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /sata@fc400000 status okay&lt;br /&gt;
 # sed -i 's#^FDT /dtbs/rockchip/rk3566-quartz64-a.dtb$#FDT /dtbs/rockchip/rk3566-quartz64-a-sata.dtb#' /boot/extlinux/extlinux.conf&lt;br /&gt;
 # systemctl reboot&lt;br /&gt;
&lt;br /&gt;
=== Using a PCF8574 on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A using a PCF8574]].&lt;br /&gt;
&lt;br /&gt;
=== Using a battery on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A Using a battery]].&lt;br /&gt;
&lt;br /&gt;
=== Connecting a MIPI-DSI display ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 connecting a MIPI-DSI display]].&lt;br /&gt;
&lt;br /&gt;
=== Building Mainline U-Boot ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Building U-Boot]].&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== Do I Need A Fan/What Heatsink Do I Need? ===&lt;br /&gt;
&lt;br /&gt;
You don't need a fan. The [https://pine64.com/product/rockpro64-20mm-mid-profile-heatsink/ 20mm medium heatsink for Model A is plenty enough]. For Model B, the [https://pine64.com/product/small-fan-type-heatsink/ fan type heatsink] will do fine.&lt;br /&gt;
&lt;br /&gt;
=== Can This Run A Minecraft Server? ===&lt;br /&gt;
&lt;br /&gt;
Yes! Sort of. Testing on an 8GB Model A with PaperMC, [[User:CounterPillow]] was able to out-row world generation in a boat with just one player online, but aside from the slow world gen (which can be pre-generated) the server handled things like TNT explosions and mobs fine. It'll probably do okay with 1-3 players.&lt;br /&gt;
&lt;br /&gt;
=== Do I Need The 5A Power Supply For Model A? ===&lt;br /&gt;
&lt;br /&gt;
You only need the 5A power supply for Model A if you plan on connecting hard disk drives to the 12V header on the board.&lt;br /&gt;
&lt;br /&gt;
=== How Much Power Does It Consume? ===&lt;br /&gt;
&lt;br /&gt;
For Model B, it's &amp;lt;2W in idle (powertop tunables not set), and &amp;lt;5W under full CPU load (&amp;lt;code&amp;gt;stress-ng -c4&amp;lt;/code&amp;gt;). Model A will be similar as it's the same SoC.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Building_U-Boot&amp;diff=20581</id>
		<title>Quartz64 Building U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Building_U-Boot&amp;diff=20581"/>
		<updated>2023-08-31T09:08:50Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: clarify cwd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article guides you through compiling U-Boot for a [[Quartz64]] or [[SOQuartz]] device.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You will need either an x86 machine with an aarch64 cross-compiler installed, or an existing aarch64 system. You will also need the device tree compiler dtc, python3 (including setuptools and pyelftools), swig, GNU make and git.&lt;br /&gt;
&lt;br /&gt;
On an x86_64 Arch Linux system, you can install the required dependencies with:&lt;br /&gt;
&lt;br /&gt;
 pacman -S --needed base-devel aarch64-linux-gnu-gcc aarch64-linux-gnu-binutils git dtc python-setuptools swig python-pyelftools&lt;br /&gt;
&lt;br /&gt;
== Fetching The Repositories ==&lt;br /&gt;
&lt;br /&gt;
Use git to clone the mainline U-Boot repository into the directory ''u-boot'':&lt;br /&gt;
&lt;br /&gt;
 git clone https://source.denx.de/u-boot/u-boot.git&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;git checkout &amp;lt;var&amp;gt;tagname&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; inside the ''u-boot'' directory to check out a specific git tag (release), you can list all of them with &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt; (but do keep in mind we only have device support since v2023.10).&lt;br /&gt;
&lt;br /&gt;
Then, also use git to clone the rockchip firmware binaries repository into the directory ''rkbin'':&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/rockchip-linux/rkbin.git&lt;br /&gt;
&lt;br /&gt;
== Setting Up Your Environment ==&lt;br /&gt;
&lt;br /&gt;
Next, we need to set two environment variables: &amp;lt;code&amp;gt;ROCKCHIP_TPL&amp;lt;/code&amp;gt; for the DRAM init binary, and &amp;lt;code&amp;gt;BL31&amp;lt;/code&amp;gt; for the ARM Trusted Firmware binary.&lt;br /&gt;
&lt;br /&gt;
 cd u-boot&lt;br /&gt;
 export ROCKCHIP_TPL=&amp;quot;$(ls ../rkbin/bin/rk35/rk3566_ddr_1056MHz_v*.bin | sort | tail -n1)&amp;quot;&lt;br /&gt;
 export BL31=&amp;quot;$(ls ../rkbin/bin/rk35/rk3568_bl31_v*.elf | sort | tail -n1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Configuring U-Boot ==&lt;br /&gt;
&lt;br /&gt;
First, we need to use the right default config for our device. Please choose &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt; from the following table depending on your device:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Board&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | defconfig&lt;br /&gt;
|-&lt;br /&gt;
| Quartz64 Model A || &amp;lt;code&amp;gt;quartz64-a-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Quartz64 Model B || &amp;lt;code&amp;gt;quartz64-b-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on Model A || &amp;lt;code&amp;gt;soquartz-model-a-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on Blade || &amp;lt;code&amp;gt;soquartz-blade-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on CM4 I/O Board || &amp;lt;code&amp;gt;soquartz-cm4-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the ''u-boot'' directory with your environment variables set, run:&lt;br /&gt;
&lt;br /&gt;
 make CROSS_COMPILE=aarch64-linux-gnu- &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt; being the value from the previous table.&lt;br /&gt;
&lt;br /&gt;
== Building U-Boot ==&lt;br /&gt;
&lt;br /&gt;
In the ''u-boot'' directory, after configuring, and with your environment variables set, run:&lt;br /&gt;
&lt;br /&gt;
 make CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
This will output a ''u-boot-rockchip.bin'', which is your freshly built SPL+U-Boot combined image.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:SOQuartz]] [[Category:Guide]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=SOQuartz&amp;diff=20580</id>
		<title>SOQuartz</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=SOQuartz&amp;diff=20580"/>
		<updated>2023-08-31T09:02:30Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Add How-To section with U-Boot building article linked&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:SOQuartz module-1s.jpg|400px|thumb|right|The SOQuartz]]&lt;br /&gt;
&lt;br /&gt;
The '''SOQuartz''' is a RK3566 based compute module and parts of Quartz64 series. &lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
The SOQuartz software releases can be found in the article [[SOQuartz Software Releases]].&lt;br /&gt;
&lt;br /&gt;
== SoC and Memory Specification ==&lt;br /&gt;
* Based on [https://www.rock-chips.com/a/en/products/RK35_Series/2021/0113/1274.html Rockchip RK3566]&lt;br /&gt;
[[File:RK3566_icon.png|right]]&lt;br /&gt;
&lt;br /&gt;
=== CPU Architecture ===&lt;br /&gt;
* [https://developer.arm.com/ip-products/processors/cortex-a/cortex-a55 Quad-core ARM Cortex-A55@1.8GHz]&lt;br /&gt;
* AArch32 for full backwards compatibility with ARMv7&lt;br /&gt;
* ARM Neon Advanced SIMD (single instruction, multiple data) support for accelerated media and signal processing computation&lt;br /&gt;
* Includes VFP hardware to support single and double-precision operations&lt;br /&gt;
* ARMv8 Cryptography Extensions&lt;br /&gt;
* Integrated 32KB L1 instruction cache and 32KB L1 data cache per core&lt;br /&gt;
* 512KB unified system L3 cache&lt;br /&gt;
&lt;br /&gt;
=== GPU (Graphics Processing Unit) Capabilities ===&lt;br /&gt;
* [https://developer.arm.com/ip-products/graphics-and-multimedia/mali-gpus/mali-g52-gpu Mali-G52 2EE Bifrost GPU@800MHz]&lt;br /&gt;
* 4x Multi-Sampling Anti-Aliasing (MSAA) with minimal performance drop &lt;br /&gt;
* 128KB L2 Cache configurations&lt;br /&gt;
* Supports OpenGL ES 1.1, 2.0, and 3.2&lt;br /&gt;
* Supports Vulkan 1.0 and 1.1&lt;br /&gt;
* Supports OpenCL 2.0 Full Profile&lt;br /&gt;
* Supports 1600 Mpix/s fill rate when at 800MHz clock frequency&lt;br /&gt;
* Supports 38.4 GLOP/s when at 800MHz clock frequency&lt;br /&gt;
&lt;br /&gt;
=== Neural Process Unit NPU Capability ===&lt;br /&gt;
* Neural network acceleration engine with processing performance of up to 0.8 TOPS&lt;br /&gt;
* Supports integer 8 and integer 16 convolution operations&lt;br /&gt;
* Supports the following deep learning frameworks: TensorFlow, TF-lite, Pytorch, Caffe, ONNX, MXNet, Keras, Darknet&lt;br /&gt;
&lt;br /&gt;
=== System Memory ===&lt;br /&gt;
* RAM Memory Variants: 2GB, 4GB, 8GB LPDDR4.&lt;br /&gt;
* Storage Memory: optional 128Mb SPI Flash and optional eMMC module from 8GB up to 128GB&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
* 10/100/1000Mbps Ethernet&lt;br /&gt;
* WiFi 802.11 b/g/n/ac with Bluetooth 5.0&lt;br /&gt;
&lt;br /&gt;
== SOQuartz exposed peripherals ==&lt;br /&gt;
&lt;br /&gt;
=== Displays / Cameras ===&lt;br /&gt;
&lt;br /&gt;
* 1x HDMI&lt;br /&gt;
* 2x DSI&lt;br /&gt;
* 1x eDP (Instead of HDMI1)&lt;br /&gt;
* 1x LVDS (not available when dual-mode DSI)&lt;br /&gt;
* 1x CSI 4-line&lt;br /&gt;
&lt;br /&gt;
=== Connectivity ===&lt;br /&gt;
&lt;br /&gt;
* 1x Ethernet (1Gbit)&lt;br /&gt;
* 1x USB 2.0 OTG&lt;br /&gt;
* 1x SD Card (SD)&lt;br /&gt;
* 1x PCIe 1-Line&lt;br /&gt;
* 28x GPIO (TBD)&lt;br /&gt;
&lt;br /&gt;
== Connector Pins Definition ==&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/SOQuartz%20Connector%20Pin%20Assignments%20ver%201.0.ods SOQuartz Module Connector Pins Definition ver 1.0]&lt;br /&gt;
&lt;br /&gt;
== SOQuartz Model-A Baseboard Features ==&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_model-A_baseboard.jpg |400px|thumb|SOQuartz Model-A Baseboard]]&lt;br /&gt;
* Model &amp;quot;A&amp;quot; Baseboard Dimensions: 133mm x 80mm x 19mm&lt;br /&gt;
* Input Power: DC 12V @ 3A 5.5OD/2.1ID (IEC 60130-10 Type A) Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
* microSD - bootable, support SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB -	2 USB2.0 Host port&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* MiPi-CSI - 1x 2 lanes, 1x 4 lanes &lt;br /&gt;
* MiPi-DSI - 1x 2 lanes, 1x 4 lanes &lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header&lt;br /&gt;
* PCIe 1x open ended slot&lt;br /&gt;
* 1x5 pin USB Expansion Header (J15)&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
Interesting alternate pin configurations are listed in [brackets].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C2_SDA_M1]'' GPIO4_B4_3V3 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C2_SCL_M1]'' GPIO4_B5_3V3 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[GPCLK0]'' GPIO4_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO0_D1_3V3 ''[UART2_TX_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO0_D0_3V3 ''[UART2_RX_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S1_MCLK_M1]'' GPIO3_C6_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C7_3V3 ''[I2S1_SCLK_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_A0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_A2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A3_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI3_MOSI_M0]'' GPIO4_B2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI3_MISO_M0]'' GPIO4_B0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 21&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 22&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_B1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI3_CLK_M0]'' GPIO4_B3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 23&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 24&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A6_3V3 ''[SPI3_CS0_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 25&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 26&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_A7_3V3 ''[SPI3_CS1_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SDA_M0]'' GPIO1_A0_3V3 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 27&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 28&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO1_A1_3V3 ''[I2C3_SCL_M0]'' &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_A5_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 29&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 30&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_D4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 31&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 32&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D6_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_D7_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 33&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 34&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S1_LRCK_M1]'' GPIO3_D0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 35&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 36&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D5_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_D3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 37&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 38&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D2_3V3 ''[I2S1_SDI_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 39&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 40&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_D1_3V3 ''[I2S1_SDO_M1]''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Notes====&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;pulled high to 3.3V through 2.2kOhm resistor&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: Page 11 of [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.pdf the board schematics].&lt;br /&gt;
=== USB Expansion Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; | USB2_HOST_5V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:center; | HOST_DM3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; | HOST_DP3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:center; | GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; | GND&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Source: Page 10 of [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.pdf the board schematics].&lt;br /&gt;
&lt;br /&gt;
== SOQuartz BLADE Baseboard Features ==&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_BLADE_Dimension.jpg |400px|thumb|SOQuartz BLADE Baseboard]]&lt;br /&gt;
* SOQuartz BLADE Baseboard Dimensions: 200mm x 40mm x 15mm&lt;br /&gt;
* Input Power:&lt;br /&gt;
** DC 5V @ 3A 3.5OD/1.35ID (IEC 60130-10 Type H) Barrel DC Jack connector&lt;br /&gt;
** PoE&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
* microSD - bootable, support SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB - USB2.0 Host port (with header for setting OTG ID pin)&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header&lt;br /&gt;
* M.2 slot&lt;br /&gt;
* PWM fan header&lt;br /&gt;
&lt;br /&gt;
=== Jumpers ===&lt;br /&gt;
* OTG ID jumper&lt;br /&gt;
* GPIO voltage, select 3.3V or 1.8V&lt;br /&gt;
* PoE Enable&lt;br /&gt;
&lt;br /&gt;
== SOQuartz Module and Baseboard Information, Schematics, and Certifications ==&lt;br /&gt;
&lt;br /&gt;
* SOQuartz Module Schematic:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz_SOM_schematic_v1.1_20210816.pdf SOQuartz Module ver 1.1 20210816 Schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-PCB-placement-v1.1.pdf SOQuartz Module ver 1.1 20210816 PCB Component Placement]&lt;br /&gt;
&lt;br /&gt;
* SOQuartz Model &amp;quot;A&amp;quot; Baseboard Schematic and PCB Board Resource:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.pdf SOQuartz Model-A baseboard 20220522 Schematic PDF file]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Schematic-20220522.DSN SOQuartz Model-A baseboard 20220522 Schematic DSN source file]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-Component-Placement_top-20220522.pdf SOQuartz SOQuartz Model-A baseboard 20220522 PCB Top Component Placement]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz_Model_A_Baseboard_Component_Placement_bottom_20220522.pdf SOQuartz SOQuartz Model-A baseboard 20220522 PCB Bottom Component Placement]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-PCB-20220522.dsn SOQuartz Model-A baseboard 20220522 PCB DSN file]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-Model-A-Baseboard-PCB-20220522.rar SOQuartz Model-A baseboard 20220522 PCB Gerber file]&lt;br /&gt;
&lt;br /&gt;
[[File:BLADE_1U_half_width_server_rack.jpg |400px|thumb|SOQuartz BLADE 3D Print 1U half width server rack]]&lt;br /&gt;
[[File:BLADE_1U_full_width_server_rack.jpg |400px|thumb|SOQuartz BLADE 3D Print 1U full width server rack]]&lt;br /&gt;
* SOQuartz Blade Baseboard Schematic and PCB Board Resource:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-BLADE-Baseboard-Schematic-20220522.pdf SOQuartz BLADE 20220522 Schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/SOQuartz-BLADE-PCB-Placement-20220522.pdf SOQuartz BLADE 20220522 PCB component Placement]&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/BLADE%201U%20Rack_3D.stp SOQuartz BLADE 1U Rack STP file]&lt;br /&gt;
[[File:BLADE_1U_rack_3D.jpg |400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SOQuartz module certifications:&lt;br /&gt;
* [https://files.pine64.org/doc/cert/SOQuartz%20FCC%20Certificate-S21101902401001.pdf SOQuartz module FCC Certificate]&lt;br /&gt;
* [https://files.pine64.org/doc/cert/SOQuartz%20CE%20Certificate-S21101902402001.pdf SOQuartz module CE EMC Certificate]&lt;br /&gt;
&lt;br /&gt;
== Datasheets for Components and Peripherals ==&lt;br /&gt;
* Rockchip RK3566 SoC information:&lt;br /&gt;
** [https://files.pine64.org/doc/quartz64/Rockchip%20RK3566%20Datasheet%20V1.0-20201210.pdf Rockchip RK3566 ver 1.0 datasheet, already got release permission from Rockchip]&lt;br /&gt;
* Rockchip PMU (Power Management Unit) Information:&lt;br /&gt;
** [https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf Rockchip RK809 ver 1.01 datasheet for SOQuartz PMU]&lt;br /&gt;
* DDR4 information:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/rockpro64/SM512M32Z01MD2BNP(200BALL).pdf Micron LPDDR4 Mobile LPDDR4 Datasheet]&lt;br /&gt;
* eMMC information:&lt;br /&gt;
** [https://files.pine64.org/doc/rock64/PINE64_eMMC_Module_20170719.pdf PINE64 eMMC module schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/rock64/usb%20emmc%20module%20adapter%20v2.pdf PINE64 USB adapter for eMMC module V2 schematic]&lt;br /&gt;
** [https://files.pine64.org/doc/rock64/USB%20adapter%20for%20eMMC%20module%20PCB.tar PINE64 USB adapter for eMMC module PCB in JPEG]&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/pine64/E-00517%20FORESEE_eMMC_NCEMAM8B-16G%20SPEC.pdf 16GB Foresee eMMC Datasheet]&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/pine64/SDINADF4-16-128GB-H%20data%20sheet%20v1.13.pdf 32GB/64GB/128GB SanDisk eMMC Datasheet]&lt;br /&gt;
* SPI NOR Flash information:&lt;br /&gt;
* Ethernet PHY information:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/pine64/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf Realtek RTL8211 10/100/1000M Ethernet Transceiver]&lt;br /&gt;
* WiFi/BT module info:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/rockpro64/AW-CM256SM_DS_DF_V1.9_STD.pdf Azurewave CM256SM 11AC WiFi + Bluetooth5.0 Datasheet]&lt;br /&gt;
* i2C to PWM Controller user in BLADE info:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/quartz64/GP7101_cn_V1_qsxn.pdf GP7101 i2c to PWM Controller Datasheet in Chinese]&lt;br /&gt;
** GP7101 i2c to PWM Controller Datasheet translated to English by neggles [[File:GP7101 cn V1 qsxn en.pdf]]&lt;br /&gt;
** I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C address is 0x58 despite what datasheet says&lt;br /&gt;
* PoE DC/DC Controller user in BLADE info:&lt;br /&gt;
** [https://files.pine64.org/doc/datasheet/quartz64/SD4954B%20Datasheet.pdf Silan SD4954B PD and DC/DC Controller compatible with IEEE 802.3AF standard Datasheet]&lt;br /&gt;
&lt;br /&gt;
== SOQuartz Module with various CM4 carrier boards ==&lt;br /&gt;
&lt;br /&gt;
* For CM4 carrier board comprehensive list, please visit [https://pipci.jeffgeerling.com/boards_cm Jeff Geerling collection]&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_with_DF_Robot_carrier_board.jpg|400px|thumb|SOQuartz with DF Robot CM4 Carrier Board]]&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_with_Waveshare_carrier_board.jpg|400px|thumb|SOQuartz with Waveshare CM4 Carrier Board]]&lt;br /&gt;
&lt;br /&gt;
[[File:SOQuartz_with_Waveshare_PoE_carrier_board.jpg|400px|thumb|SOQuartz with Waveshare CM4 PoE Board]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== BSP Linux SDK ==&lt;br /&gt;
&lt;br /&gt;
=== BSP Linux SDK ver 4.19 for Quartz64 model A SBC  ===&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64-model-A_BSP%20Linux.tar.gz Direct Download from pine64.org]&lt;br /&gt;
** MD5 (TAR-GZip file): 24554419aec29700add97167a3a4c9ed&lt;br /&gt;
** File Size: 32.67.00GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Android SDK ==&lt;br /&gt;
&lt;br /&gt;
=== Android 11 SDK for Quartz64 model A SBC  ===&lt;br /&gt;
* [http://files.pine64.org/SDK/Quartz64/QUARTZ64_SDK_android11.tar.gz Direct Download from pine64.org]&lt;br /&gt;
** MD5 (TAR-GZip file): 77c2ff57ea3372fb04da7fb49e17d12b&lt;br /&gt;
** File Size: 79.00GB&lt;br /&gt;
** Just the boot blobs (&amp;lt;1MB): [[File:Rk35-blobs.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
== How-To ==&lt;br /&gt;
&lt;br /&gt;
=== Building Mainline U-Boot ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Building U-Boot]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SOQuartz]] [[Category:Quartz64]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20579</id>
		<title>Quartz64</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64&amp;diff=20579"/>
		<updated>2023-08-31T09:00:11Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* How-To */ Add U-Boot building guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Quartz64modelb.png|400px|thumb|right|The Quartz64 Model B]]&lt;br /&gt;
&lt;br /&gt;
The '''Quartz64''' is the most recent Single Board Computer offering from PINE64, with Model A initially released in June of 2021 and Model B in May of 2022. It is powered by a Rockchip RK3566 Quad-Core ARM Cortex A55 64-Bit Processor with a MALI G-52 GPU.&lt;br /&gt;
&lt;br /&gt;
Key features include a PCIe x4 open ended slot (model A) or m.2 (model B) using one Gen2 lane electrically, and the use of LPDDR4 RAM.&lt;br /&gt;
&lt;br /&gt;
The Quartz64 has three LPDDR4 system memory options: 2GB, 4GB or 8GB. For booting, there is an eMMC module socket (supporting up to 128GB) and microSD slot, as well as a footprint to solder on an SPI flash chip. The board is equipped with HDMI, 1x USB 3.0 type A Host, 3x USB 2.0 Host, Gigabit Ethernet, SATA (model A), GPIO Bus, MiPi DSI interface, e-ink interface (model A), eDP interface (model A), touch Panel interface (model A), MiPi CSI interface, as well as many other device interfaces such as UART, SPI, I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C, for makers to integrate with sensors and other peripherals. Many different Operating Systems (OS) are freely available from the open source community, such as Linux (Ubuntu, Debian, Arch), BSD, and Android.&lt;br /&gt;
&lt;br /&gt;
== Software releases ==&lt;br /&gt;
&lt;br /&gt;
Under [[Quartz64 Software Releases]] you will find a complete list of currently supported operating system images, which work with the Quartz64, as well as other related software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&lt;br /&gt;
=== Flashing the device ===&lt;br /&gt;
&lt;br /&gt;
Natively the board only supports booting from the eMMC or microSD card, see [[#Boot order|boot order]]. There doesn't seem to be a way to boot from USB devices or SATA yet.&lt;br /&gt;
&lt;br /&gt;
The board can be booted by flashing your favorite operating system to a microSD card using another device and to insert the microSD card into the Quartz64, see the article [[Getting started]]. Flashing the eMMC is possible by booting an operating system from the microSD card and to overwrite the eMMC from within the booted operating system.&lt;br /&gt;
&lt;br /&gt;
=== Boot order ===&lt;br /&gt;
&lt;br /&gt;
The hardware boot order of the Quartz64 is:&lt;br /&gt;
&lt;br /&gt;
# SPI NOR flash&lt;br /&gt;
# SPI NAND flash&lt;br /&gt;
# eMMC&lt;br /&gt;
# microSD card&lt;br /&gt;
&lt;br /&gt;
== SoC and Memory Specifications ==&lt;br /&gt;
&lt;br /&gt;
[[File:RK3566_icon.png|right]]&lt;br /&gt;
&lt;br /&gt;
* Based on [https://www.rock-chips.com/a/en/products/RK35_Series/2021/0113/1274.html Rockchip RK3566]&lt;br /&gt;
&lt;br /&gt;
=== CPU Architecture ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/processors/cortex-a/cortex-a55 Quad-core ARM Cortex-A55@1.8GHz]&lt;br /&gt;
* AArch32 for full backwards compatibility with ARMv7&lt;br /&gt;
* ARM Neon Advanced SIMD (single instruction, multiple data) support for accelerated media and signal processing computation&lt;br /&gt;
* Includes VFP hardware to support single and double-precision operations&lt;br /&gt;
* ARMv8 Cryptography Extensions&lt;br /&gt;
* Integrated 32KB L1 instruction cache and 32KB L1 data cache per core&lt;br /&gt;
* 512KB unified system L3 cache&lt;br /&gt;
* [https://developer.arm.com/ip-products/security-ip/trustzone TrustZone] technology support&lt;br /&gt;
* [https://www.cnx-software.com/2020/12/01/rockchip-rk3568-processor-to-power-edge-computing-and-nvr-applications 22nm process, believed to be FD-SOI]&lt;br /&gt;
&lt;br /&gt;
=== GPU (Graphics Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* [https://developer.arm.com/ip-products/graphics-and-multimedia/mali-gpus/mali-g52-gpu Mali-G52 2EE Bifrost GPU@800MHz]&lt;br /&gt;
* 4x Multi-Sampling Anti-Aliasing (MSAA) with minimal performance drop &lt;br /&gt;
* 128KB L2 Cache configurations&lt;br /&gt;
* Supports OpenGL ES 1.1, 2.0, and 3.2&lt;br /&gt;
* Supports Vulkan 1.0 and 1.1&lt;br /&gt;
* Supports OpenCL 2.0 Full Profile&lt;br /&gt;
* Supports 1600 Mpix/s fill rate when at 800MHz clock frequency&lt;br /&gt;
* Supports 38.4 GLOP/s when at 800MHz clock frequency   &lt;br /&gt;
&lt;br /&gt;
=== NPU (Neural Processing Unit) Capabilities ===&lt;br /&gt;
&lt;br /&gt;
* Neural network acceleration engine with processing performance of up to 0.8 TOPS&lt;br /&gt;
* Supports integer 8 and integer 16 convolution operations&lt;br /&gt;
* Supports the following deep learning frameworks: TensorFlow, TF-lite, Pytorch, Caffe, ONNX, MXNet, Keras, Darknet&lt;br /&gt;
&lt;br /&gt;
=== System Memory ===&lt;br /&gt;
&lt;br /&gt;
* RAM Memory Variants: 2GB (SOQuartz only), 4GB, 8GB LPDDR4.&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
&lt;br /&gt;
* 10/100/1000Mbps Ethernet&lt;br /&gt;
* Wi-Fi 802.11 b/g/n/ac with Bluetooth 5.0 (optional on model A, built in on model B)&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
&lt;br /&gt;
* microSD - bootable, supports SDHC and SDXC, storage up to 2TB&lt;br /&gt;
* USB&lt;br /&gt;
** Model A: 2 USB 2.0 host ports, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
** Model B: 1 USB 2.0 host port, 1 USB 2.0 OTG port, 1 USB 3.0 host port&lt;br /&gt;
* one native SATA 3.0 6Gb/s Port (only on model A, shared with USB 3.0 host port)&lt;br /&gt;
* optional eMMC module from 8GB up to 128GB&lt;br /&gt;
* 64 Mbit (8 MByte) SPI flash (Model B only), part number '''25Q64DWZPIG''' in the schematic&lt;br /&gt;
&lt;br /&gt;
==== eMMC Speeds ====&lt;br /&gt;
&lt;br /&gt;
On a 64 GB eMMC module:&lt;br /&gt;
&lt;br /&gt;
  $ sudo hdparm -tT /dev/mmcblk1 &lt;br /&gt;
  &lt;br /&gt;
  /dev/mmcblk1:&lt;br /&gt;
   Timing cached reads:   2368 MB in  2.00 seconds = 1184.46 MB/sec&lt;br /&gt;
   Timing buffered disk reads: 452 MB in  3.01 seconds = 149.98 MB/sec&lt;br /&gt;
&lt;br /&gt;
=== Expansion Ports ===&lt;br /&gt;
* HDMI&lt;br /&gt;
* eDP - 4 lanes of 2.7Gbps, up to 2560x1600@60Hz (only on model A)&lt;br /&gt;
* DSI - Display Serial Interface, 4 lanes MiPi, up to 1440P on model A, 2 lanes MiPi, up to 1080p on model B &lt;br /&gt;
* CSI - CMOS Camera Interface, 4 lanes MiPi up to 8 mega pixel on model A, 2 lanes MiPi up to 5 mega pixel on model B &lt;br /&gt;
* TP - Touch Panel Port, SPI with interrupt on model A&lt;br /&gt;
* RTC - Real Time Clock Battery Connector&lt;br /&gt;
* VBAT - Lithium Battery Connector with temperature sensor input on model A&lt;br /&gt;
* Wi-Fi/BT Module Header - SDIO 3.0 and UART on model A, built-in Wi-Fi/BT Module on model B&lt;br /&gt;
* 2x20 pins &amp;quot;Pi2&amp;quot; GPIO Header on model B, 2x10 pins GPO header on model A&lt;br /&gt;
* PCIe x4 open ended slot on model A, m.2 slot on model B, one Gen2 lane due to SoC constraints&lt;br /&gt;
** On Model A, the slot provides 10W of power for the 3.3V supply and however much power your 12V input power supply provides on the 12V supply&lt;br /&gt;
&lt;br /&gt;
The PCIe implementation on the RK3566 is much more compatible with a wide range of devices compared to the one on the RK3399 used on the ROCKPro64. This means a lot more devices should work (excluding dGPUs due to a lack of cache snooping ability).&lt;br /&gt;
&lt;br /&gt;
==== Combo PHYs ====&lt;br /&gt;
&lt;br /&gt;
[[File:rk3566 phy.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Several of the I/O options on the RK3566 used in the Quartz64 are using the same I/O lines, meaning that they cannot be used at the same time. The above diagram illustrates how they are connected.&lt;br /&gt;
&lt;br /&gt;
In particular, USB 3.0 and the SATA connector on the board are mutually exclusive, and the PCI-e 2.0 lane can be reconfigured into a second SATA port, though an adapter cable needs to be fashioned for this to be useful.&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model A) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SDA_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C3_SCL_M0 &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a,b&amp;lt;/sup&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| CPU_REFCLK_OUT&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX_M0_DEBUG&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MOSI_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_TX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_MISO_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART0_RX &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CLK_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| SPI1_CS0_M1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| SPDIF_OUT &amp;lt;sup style=&amp;quot;font-style:italic;color:green&amp;quot;&amp;gt;c&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 3.3V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;can be a PWM pin&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;pulled high to 3.3V through 2.2kOhm resistor&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
  &amp;lt;li&amp;gt;low-pass filtered with cutoff of 220 MHz&amp;lt;/li&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source: Page 28 of [[File:Quartz64_model-A_schematic_v1.0_20201215.pdf|the board schematics]].&lt;br /&gt;
&lt;br /&gt;
=== GPIO Pins (Quartz64 Model B) ===&lt;br /&gt;
&lt;br /&gt;
Attention! GPIOs are 3.3V!&lt;br /&gt;
&lt;br /&gt;
Interesting alternate pin configurations are listed in [brackets].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Pin no.&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:20em;&amp;quot; | Assigned To&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3 V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 1&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 2&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SDA_M0]'' GPIO1_A0_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:red; color:gold; font-weight:bold;&amp;quot;| 4&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| 5 V&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2C3_SCL_M0]'' GPIO1_A1_3V3 &lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 5&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 6&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_C4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 7&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 8&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_TX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 9&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 10&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| UART2_RX&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CS0_M1]'' GPIO3_A1_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 11&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 12&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A3_3V3 ''[I2S3_SCLK_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_MCLK_M0]'' GPIO3_A2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 13&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 14&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B0_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 15&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 16&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| 3.3V&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:yellow; color:black; font-weight:bold;&amp;quot;| 17&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 18&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_B2_3V3 &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 19&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 20&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C5_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 21&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 22&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C1_3V3 ''[SPI1_MOSI_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO4_C2_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 23&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 24&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_C6_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 25&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 26&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO4_D1_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| I2C4_SDA_M0&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 27&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:blue; color:gold; font-weight:bold;&amp;quot;| 28&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| I2C4_SCL_M0&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 29&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 30&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GPIO3_B4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 31&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 32&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_C2_3V3 ''[SPI1_MISO_M1]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPI1_CLK_M1]'' GPIO3_C3_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 33&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 34&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GND&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[I2S3_LRCK_M0]'' GPIO3_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 35&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 36&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A7_3V3&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| ''[SPDIF_TX_M0]'' GPIO1_A4_3V3&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 37&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 38&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A6_3V3 ''[I2S3_SDI_M0]''&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot;| GND&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:black; color:gold; font-weight:bold;&amp;quot;| 39&lt;br /&gt;
| style=&amp;quot;text-align:center; background-color:green; color:gold; font-weight:bold;&amp;quot;| 40&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot;| GPIO3_A5_3V3 ''[I2S3_SDO_M0]''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Source: Page 24 of [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf the board schematics].&lt;br /&gt;
&lt;br /&gt;
== Quartz64 Board Information, Schematics, and Certifications ==&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;A&amp;quot; Baseboard Dimensions: 133mm x 80mm x 19mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 12V @ 3A 5.5mmOD/2.1mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_schematic_v2.0_20210427.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC Schematic ver 2.0 20210427 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-A_V2.0_connector_placement.pdf Quartz64 Model &amp;quot;A&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
&lt;br /&gt;
Certifications:&lt;br /&gt;
&lt;br /&gt;
* Disclaimer: Please note that PINE64 SBC is not a &amp;quot;final&amp;quot; product and in general certification is not necessary. However, PINE64 still submit the SBC for FCC and CE certification and obtain the certificates to proof that SBC board is capable on passing the testing. Please note a final commercial product needs to performs its owns testing and obtains its owns certificates.&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20CE%20certification-S21051101701001.pdf Quartz64 model-A CE Certificate]&lt;br /&gt;
* [https://files.pine64.org/doc/cert/Quartz64%20Model-A%20FCC%20certification-S21051101702001.pdf Quartz64 model-A FCC Certificate]&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Model &amp;quot;B&amp;quot; Baseboard Dimensions: 85mm x 56mm x 18.8mm&lt;br /&gt;
&lt;br /&gt;
Input Power: DC 5V @ 3A 3.5mmOD/1.35mmID center-positive Barrel DC Jack connector&lt;br /&gt;
&lt;br /&gt;
Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic and PCB Board Resource:&lt;br /&gt;
&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_Schematic-V1.3_20220124.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC Schematic ver 1.3 20220124 PDF file]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Quartz64_model-B_PCB_Components_Placement-V1.2_20211014.pdf Quartz64 Model &amp;quot;B&amp;quot; SBC PCB Connector placement PDF file]&lt;br /&gt;
* Please note that v1.2 and V1.3 schematic and component placement are identical, just some component value changed.&lt;br /&gt;
* Note: Model B uses a Molex PicoBlade compatible connector for the RTC battery. The Pine64 Backup Battery Holders come with a JST PH type connector. To use the Pine64 RTC Backup Battery Holder, the connector on the battery holder will need to be modified with a PicoBlade type connector.&lt;br /&gt;
&lt;br /&gt;
== Datasheets for Components and Peripherals ==&lt;br /&gt;
&lt;br /&gt;
Rockchip RK3566 SoC information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Rockchip%20RK3566%20Datasheet%20V1.0-20201210.pdf Rockchip RK3566 ver 1.0 datasheet, already got release permission from Rockchip]&lt;br /&gt;
* [https://opensource.rock-chips.com/images/2/26/Rockchip_RK3568_TRM_Part1_V1.3-20220930P.PDF Rockchip RK3566 and RK3568 TRM (Technical Reference Manual)]&lt;br /&gt;
&lt;br /&gt;
Rockchip PMU (Power Management Unit) Information:&lt;br /&gt;
* [https://www.rockchip.fr/RK817%20datasheet%20V1.01.pdf Rockchip RK817 ver 1.01 datasheet for Quartz64 model A]&lt;br /&gt;
* [https://www.rockchip.fr/RK809%20datasheet%20V1.01.pdf Rockchip RK809 ver 1.01 datasheet for Quartz64 model B and SOQuartz]&lt;br /&gt;
&lt;br /&gt;
LPDDR4 (200 Balls) SDRAM:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/SM512M32Z01MD2BNP(200BALL).pdf Micron LPDDR4 Mobile LPDDR4 Datasheet]&lt;br /&gt;
&lt;br /&gt;
eMMC information:&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/PINE64_eMMC_Module_20170719.pdf PINE64 eMMC module schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/usb%20emmc%20module%20adapter%20v2.pdf PINE64 USB adapter for eMMC module V2 schematic]&lt;br /&gt;
* [https://files.pine64.org/doc/rock64/USB%20adapter%20for%20eMMC%20module%20PCB.tar PINE64 USB adapter for eMMC module PCB in JPEG]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/E-00517%20FORESEE_eMMC_NCEMAM8B-16G%20SPEC.pdf 16GB Foresee eMMC Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/SDINADF4-16-128GB-H%20data%20sheet%20v1.13.pdf 32GB/64GB/128GB SanDisk eMMC Datasheet]&lt;br /&gt;
&lt;br /&gt;
SPI NOR Flash information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/w25q128jv%20spi%20revc%2011162016.pdf WinBond 128Mb SPI Flash Datasheet]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GD25Q128C-Rev2.5.pdf GigaDevice 128Mb SPI Flash Datasheet]&lt;br /&gt;
&lt;br /&gt;
E-ink Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-754-V3_ES103TC1%20Specification%20V3.0(Signed)-20190702.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Flex Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/quartz64/Eink%20P-511-828-V1_ED103TC2%20Formal%20Spec%20V1.0_20190514.pdf Eink 10.3&amp;quot; 1872x1404 ES103TC1 Glass Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/PineNote/TI%20PMU-TPS651851.pdf TPS65185x PMIC for E-Ink Enabled Electronic Paper Display Datasheet]&lt;br /&gt;
&lt;br /&gt;
LCD Touch Screen Panel information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/FY07024DI26A30-D_feiyang_LCD_panel.pdf 7.0&amp;quot; 1024x600 TFT-LCD Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/HK70DR2459-PG-V01.pdf Touch Panel Specification]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/GT911%20Capacitive%20Touch%20Controller%20Datasheet.pdf GOODiX GT911 5-Point Capacitive Touch Controller Datasheet]&lt;br /&gt;
&lt;br /&gt;
Ethernet PHY information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/rtl8211e(g)-vb(vl)-cg_datasheet_1.6.pdf Realtek RTL8211 10/100/1000M Ethernet Transceiver]&lt;br /&gt;
&lt;br /&gt;
Wi-Fi/BT module info:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/rockpro64/AW-CM256SM_DS_DF_V1.9_STD.pdf Azurewave CM256SM 11AC Wi-Fi + Bluetooth5.0 Datasheet]&lt;br /&gt;
&lt;br /&gt;
IR LED:&lt;br /&gt;
* [https://media.digikey.com/pdf/Data%20Sheets/Everlight%20PDFs/IRM-36xx_Series.pdf IRM-3638 Datasheet]&lt;br /&gt;
&lt;br /&gt;
Enclosure information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/playbox_enclosure_20160426.stp Playbox Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/ABS_enclosure_20160426.stp ABS Enclosure 3D file]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/case/pine64%20Die%20Cast%20casing-final.jpg Outdoor Aluminum Cast Dust-proof IP67 Enclosure Drawing]&lt;br /&gt;
* [https://www.printables.com/model/269572-pine-quartz-64-a-full-case 3D Printable Enclosure for Model A]&lt;br /&gt;
* [https://www.printables.com/model/269575-pine-quartz-64-a-open-frame Open Frame for Model A]&lt;br /&gt;
&lt;br /&gt;
Connector information:&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/ePH.pdf 2.0mm PH Type connector specification use in Lithium Battery (VBAT) port (Model A)]&lt;br /&gt;
* [https://www.molex.com/pdm_docs/sd/533980271_sd.pdf 1.25mm Picoblade Type connector specification used in RTC Battery port (Model B)]&lt;br /&gt;
* [https://files.pine64.org/doc/datasheet/pine64/0.5FPC%20Front%20Open%20Connector%20H=1.5.pdf 0.5mm Pitch cover type FPC connector specification use in DSI port, TP port and CSI port]&lt;br /&gt;
&lt;br /&gt;
== Development efforts ==&lt;br /&gt;
&lt;br /&gt;
{{SeeMainArticle|Quartz64 Development}}&lt;br /&gt;
&lt;br /&gt;
Information and resources of the ongoing development effort for the Quartz64 can be found on the [[Quartz64 Development]] page, where the current status of various board functions can be found, and whether they have landed in upstream.&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.com/pine64-org/quartz-bsp Quartz64 BSP Gitlab Page]&lt;br /&gt;
&lt;br /&gt;
== Enclosures ==&lt;br /&gt;
&lt;br /&gt;
Note: Please expand this section with more cases known to work.&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;A&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
All enclosures that fit the ROCKPro64 should fit the Quartz64 Model &amp;quot;A&amp;quot;, as the I/O has been laid out the same on purpose.&lt;br /&gt;
&lt;br /&gt;
* [[Model A Acrylic Open Enclosure]] - but see the troubleshooting section below.&lt;br /&gt;
* [[Quartz64 Premium Aluminium Case|RockPro64 Premium Aluminium Case]]&lt;br /&gt;
* [[ROCKPro64#3D printable ITX mounting brackets]] (Not an enclosure but allows to mount the board in an ATX/ITX case)&lt;br /&gt;
&lt;br /&gt;
=== Model &amp;quot;B&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* [[Model B Acrylic Open Enclosure]]&lt;br /&gt;
* the ROCK64 aluminium enclosure '''does not''' work, as the DC input jack is placed differently&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Stability/Boot Issues With Missing Battery Shunt ===&lt;br /&gt;
&lt;br /&gt;
If there is no battery plugged into the board, the jumper labelled &amp;quot;ON/OFF_BATT&amp;quot; must be in place. If this is set wrong, stability issues such as failures to boot will occur. '''This affects model A only'''&lt;br /&gt;
&lt;br /&gt;
=== No Ethernet Connectivity ===&lt;br /&gt;
&lt;br /&gt;
Make sure the kernel is built with &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt; set to &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;. Building it as a module (&amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;) and then relying on module auto-loading is unlikely to work, because if the generic PHY driver is built in it will bind to the PHY first, unless you include the motorcomm module in your initramfs.&lt;br /&gt;
&lt;br /&gt;
Note: Starting with [https://salsa.debian.org/kernel-team/linux/-/merge_requests/551 Debian's &amp;lt;code&amp;gt;6.1~rc3-1~exp1&amp;lt;/code&amp;gt; kernel] the module is included, but set to &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; and I (Diederik) have verified that it gets included in the initramfs and '''works''' on Model-A and Model-B with the [[Quartz64#Plebian]] images.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Model A&amp;quot; Acrylic Case Doesn't Fit ===&lt;br /&gt;
&lt;br /&gt;
The Quartz64 does not really fit onto the bottom plate of the [[Model A Acrylic Open Enclosure]]. This is because the &amp;quot;Mic&amp;quot; connector at the bottom of the board interferes with one of the posts. A workaround is to find out which post that is (you have a 50% chance of guessing it right, accounting for rotating the board) and then filing away the corner of the post pointing inwards by a few millimeters.&lt;br /&gt;
&lt;br /&gt;
[[File:Quartz64-audio-jack-spacer-issue.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
An alternate solution may be to place plastic spacers with a smaller outer diameter in between the acrylic bottom plate posts and the SBC board.&lt;br /&gt;
&lt;br /&gt;
=== No GPU Acceleration with Debian &amp;quot;Bullseye&amp;quot; Userland ===&lt;br /&gt;
&lt;br /&gt;
Debian Bullseye ships a Mesa version that is too old to contain the required patches for the RK356x SoC's GPU. You can (at your own risk) [https://wiki.debian.org/DebianTesting use the current Debian Testing version ], called &amp;quot;Bookworm&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Wireless Connectivity Doesn't Work ===&lt;br /&gt;
&lt;br /&gt;
ROCKPro64 wireless module may have CYW43455 or CYW43456 chips on board (not sure if this is the same for Quartz64 model B). Both chips are supported by &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt; Wi-Fi driver and &amp;lt;code&amp;gt;btbcm&amp;lt;/code&amp;gt; Bluetooth driver. &lt;br /&gt;
&lt;br /&gt;
For CYW43455 drivers attempt to load &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43455-sdio.bin&amp;lt;/code&amp;gt; for Wi-Fi and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C0.hcd&amp;lt;/code&amp;gt; for Bluetooth. Corresponding firmware files for CYW43456 are &amp;lt;code&amp;gt;/lib/firmware/brcm/brcmfmac43456-sdio.bin&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/lib/firmware/brcm/BCM4345C5.hcd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On Manjaro firmware files for both Bluetooth and Wi-Fi on CYW43456 on are provided by &amp;lt;code&amp;gt;ap6256-firmware&amp;lt;/code&amp;gt; package (&amp;lt;code&amp;gt;pacman -S ap6256-firmware&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
However for CYW43455 wi-fi firmware is in the &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package and bluetooth is in the &amp;lt;code&amp;gt;firmware-raspberrypi&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;pacman -S linux-firmware firmware-raspberrypi&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;linux-firmware&amp;lt;/code&amp;gt; package is missing device specific symlinks for quartz64-a. To create them execute:&lt;br /&gt;
&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.bin /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.bin&lt;br /&gt;
 # ln -s brcmfmac43455-sdio.AW-CM256SM.txt /lib/firmware/brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt &lt;br /&gt;
&lt;br /&gt;
As of 2022-10-19 device tree in mainline kernel for Quartz64 model A has wrong configuration for the Bluetooth driver. [https://patchwork.kernel.org/project/linux-rockchip/patch/20220926125350.64783-1-leo@nabam.net/ Patch] is submitted to the LKML and accepted and included upstream in 6.1-rc7. It's possible to modify dtb file provided by the current kernel using device tree compiler to enable Bluetooth or perform &amp;lt;code&amp;gt;make dtbs&amp;lt;/code&amp;gt; in the patched kernel tree to get updated dtb file (&amp;lt;code&amp;gt;arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dtb&amp;lt;/code&amp;gt;). Issue manifests itself with following errors in `dmesg`:&lt;br /&gt;
&lt;br /&gt;
  command 0x0c03 tx timeout&lt;br /&gt;
  Bluetooth: hci0: BCM: Reset failed (-110)&lt;br /&gt;
&lt;br /&gt;
== How-To ==&lt;br /&gt;
&lt;br /&gt;
=== Connect Debug UART ===&lt;br /&gt;
&lt;br /&gt;
The easiest way to get debug output is to connect a 3.3V 1.5mbaud capable UART adapter to the board.&lt;br /&gt;
&lt;br /&gt;
To connect it, connect the ground lead to pin 6, and the RX/TX leads to pins 8 and 10 (consider swapping them if you get no output, things are often mislabeled). These pins are &amp;quot;UART2&amp;quot; in the above GPIO table.&lt;br /&gt;
&lt;br /&gt;
Open a serial terminal at 1500000 bauds, e.g.&lt;br /&gt;
&lt;br /&gt;
 $ picocom -b 1500000 /dev/ttyUSB0&lt;br /&gt;
&lt;br /&gt;
=== Disable Heartbeat LED (Linux) ===&lt;br /&gt;
&lt;br /&gt;
The flashing LED is called the &amp;quot;heartbeat LED&amp;quot;, it blinks in a heart rhythm like fashion once the kernel is running. To disable it, you can run&lt;br /&gt;
&lt;br /&gt;
 # echo none &amp;gt; /sys/class/leds/user-led/trigger&lt;br /&gt;
&lt;br /&gt;
On model A LED device is called &amp;quot;diy-led&amp;quot;, not &amp;quot;user-led&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On a system with systemd, you can do this as soon as the system is ready to be logged in with a systemd unit like this:&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Turn off heartbeat LED&lt;br /&gt;
 Wants=multi-user.target&lt;br /&gt;
 After=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 ExecStart=sh -c 'echo none &amp;gt; /sys/class/leds/user-led/trigger'&lt;br /&gt;
&lt;br /&gt;
Place it in ''/etc/systemd/system/user-led.service'', and run&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable user-led.service&lt;br /&gt;
&lt;br /&gt;
Upon rebooting, you will now notice that the heartbeat LED will blink during boot-up, but stops blinking as soon as the multi-user target is reached (i.e. the user can log in).&lt;br /&gt;
&lt;br /&gt;
=== SATA on model A ===&lt;br /&gt;
&lt;br /&gt;
On model A USB 3.0 and SATA ports are using the same I/O line and can't be used simultaneously. By default USB 3.0 is enabled in Linux device tree and SATA is disabled. FDT modifications are required to turn SATA on. &lt;br /&gt;
&lt;br /&gt;
Following script is tested on Manjaro but should work on the other distributions with minimal changes. Device tree compiler package usually provides fdtput command (on Manjaro run: &amp;lt;code&amp;gt;pacman -S dtc&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
 # cp /boot/dtbs/rockchip/rk3566-quartz64-a.dtb /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /usb@fd000000 status disabled&lt;br /&gt;
 # fdtput -t s -v /boot/dtbs/rockchip/rk3566-quartz64-a-sata.dtb /sata@fc400000 status okay&lt;br /&gt;
 # sed -i 's#^FDT /dtbs/rockchip/rk3566-quartz64-a.dtb$#FDT /dtbs/rockchip/rk3566-quartz64-a-sata.dtb#' /boot/extlinux/extlinux.conf&lt;br /&gt;
 # systemctl reboot&lt;br /&gt;
&lt;br /&gt;
=== Using a PCF8574 on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A using a PCF8574]].&lt;br /&gt;
&lt;br /&gt;
=== Using a battery on Model A ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Model A Using a battery]].&lt;br /&gt;
&lt;br /&gt;
=== Connecting a MIPI-DSI display ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 connecting a MIPI-DSI display]].&lt;br /&gt;
&lt;br /&gt;
=== Building Mainline U-Boot ===&lt;br /&gt;
&lt;br /&gt;
See [[Quartz64 Building U-Boot]].&lt;br /&gt;
&lt;br /&gt;
== Frequently Asked Questions ==&lt;br /&gt;
&lt;br /&gt;
=== Do I Need A Fan/What Heatsink Do I Need? ===&lt;br /&gt;
&lt;br /&gt;
You don't need a fan. The [https://pine64.com/product/rockpro64-20mm-mid-profile-heatsink/ 20mm medium heatsink for Model A is plenty enough]. For Model B, the [https://pine64.com/product/small-fan-type-heatsink/ fan type heatsink] will do fine.&lt;br /&gt;
&lt;br /&gt;
=== Can This Run A Minecraft Server? ===&lt;br /&gt;
&lt;br /&gt;
Yes! Sort of. Testing on an 8GB Model A with PaperMC, [[User:CounterPillow]] was able to out-row world generation in a boat with just one player online, but aside from the slow world gen (which can be pre-generated) the server handled things like TNT explosions and mobs fine. It'll probably do okay with 1-3 players.&lt;br /&gt;
&lt;br /&gt;
=== Do I Need The 5A Power Supply For Model A? ===&lt;br /&gt;
&lt;br /&gt;
You only need the 5A power supply for Model A if you plan on connecting hard disk drives to the 12V header on the board.&lt;br /&gt;
&lt;br /&gt;
=== How Much Power Does It Consume? ===&lt;br /&gt;
&lt;br /&gt;
For Model B, it's &amp;lt;2W in idle (powertop tunables not set), and &amp;lt;5W under full CPU load (&amp;lt;code&amp;gt;stress-ng -c4&amp;lt;/code&amp;gt;). Model A will be similar as it's the same SoC.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Building_U-Boot&amp;diff=20578</id>
		<title>Quartz64 Building U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Building_U-Boot&amp;diff=20578"/>
		<updated>2023-08-31T08:58:33Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: Create a guide on how to compile mainline U-Boot for Quartz64/SOQuartz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article guides you through compiling U-Boot for a [[Quartz64]] or [[SOQuartz]] device.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You will need either an x86 machine with an aarch64 cross-compiler installed, or an existing aarch64 system. You will also need the device tree compiler dtc, python3 (including setuptools and pyelftools), swig, GNU make and git.&lt;br /&gt;
&lt;br /&gt;
On an x86_64 Arch Linux system, you can install the required dependencies with:&lt;br /&gt;
&lt;br /&gt;
 pacman -S --needed base-devel aarch64-linux-gnu-gcc aarch64-linux-gnu-binutils git dtc python-setuptools swig python-pyelftools&lt;br /&gt;
&lt;br /&gt;
== Fetching The Repositories ==&lt;br /&gt;
&lt;br /&gt;
Use git to clone the mainline U-Boot repository into the directory ''u-boot'':&lt;br /&gt;
&lt;br /&gt;
 git clone https://source.denx.de/u-boot/u-boot.git&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;git checkout &amp;lt;var&amp;gt;tagname&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; to check out a specific git tag (release), you can list all of them with &amp;lt;code&amp;gt;git tag -l&amp;lt;/code&amp;gt; (but do keep in mind we only have device support since v2023.10).&lt;br /&gt;
&lt;br /&gt;
Then, also use git to clone the rockchip firmware binaries repository into the directory ''rkbin'':&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/rockchip-linux/rkbin.git&lt;br /&gt;
&lt;br /&gt;
== Setting Up Your Environment ==&lt;br /&gt;
&lt;br /&gt;
Next, we need to set two environment variables: &amp;lt;code&amp;gt;ROCKCHIP_TPL&amp;lt;/code&amp;gt; for the DRAM init binary, and &amp;lt;code&amp;gt;BL31&amp;lt;/code&amp;gt; for the ARM Trusted Firmware binary.&lt;br /&gt;
&lt;br /&gt;
 cd u-boot&lt;br /&gt;
 export ROCKCHIP_TPL=&amp;quot;$(ls ../rkbin/bin/rk35/rk3566_ddr_1056MHz_v*.bin | sort | tail -n1)&amp;quot;&lt;br /&gt;
 export BL31=&amp;quot;$(ls ../rkbin/bin/rk35/rk3568_bl31_v*.elf | sort | tail -n1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Configuring U-Boot ==&lt;br /&gt;
&lt;br /&gt;
First, we need to use the right default config for our device. Please choose &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt; from the following table depending on your device:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Board&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | defconfig&lt;br /&gt;
|-&lt;br /&gt;
| Quartz64 Model A || &amp;lt;code&amp;gt;quartz64-a-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Quartz64 Model B || &amp;lt;code&amp;gt;quartz64-b-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on Model A || &amp;lt;code&amp;gt;soquartz-model-a-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on Blade || &amp;lt;code&amp;gt;soquartz-blade-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SOQuartz on CM4 I/O Board || &amp;lt;code&amp;gt;soquartz-cm4-rk3566_defconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In the ''u-boot'' directory with your environment variables set, run:&lt;br /&gt;
&lt;br /&gt;
 make CROSS_COMPILE=aarch64-linux-gnu- &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;var&amp;gt;defconfig&amp;lt;/var&amp;gt; being the value from the previous table.&lt;br /&gt;
&lt;br /&gt;
== Building U-Boot ==&lt;br /&gt;
&lt;br /&gt;
In the ''u-boot'' directory, after configuring, and with your environment variables set, run:&lt;br /&gt;
&lt;br /&gt;
 make CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
This will output a ''u-boot-rockchip.bin'', which is your freshly built SPL+U-Boot combined image.&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]] [[Category:SOQuartz]] [[Category:Guide]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20183</id>
		<title>Quartz64 UEFI with U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20183"/>
		<updated>2023-08-05T11:39:08Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Performing the Installation */ nvm this was correct&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|'''Note:''' This article is a work-in-progress}}&lt;br /&gt;
&lt;br /&gt;
This article is a guide to installing an [https://en.wikipedia.org/wiki/Das_U-Boot U-Boot] capable of booting generic aarch64 EFI images on a [[Quartz64]] or [[SOQuartz]] board.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' U-Boot on Quartz64 Model A currently doesn't appear to be able to always load things from USB mass storage devices depending on the device, you'll have to get creative with your installer medium.}}&lt;br /&gt;
&lt;br /&gt;
We need two to three storage mediums:&lt;br /&gt;
&lt;br /&gt;
* an SD card or eMMC module for U-Boot (advanced users may use the SPI flash on Model B)&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for our installed system&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for the installer&lt;br /&gt;
&lt;br /&gt;
In practice, you can usually combine some of these into one, e.g. if you start your partitions at 16MiB you can have u-boot and your installed system reside on the same storage medium.&lt;br /&gt;
&lt;br /&gt;
A good way to go about things is to put U-Boot on an SD card, and install the system on eMMC or NVMe, and boot the installer from an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
== Flashing U-Boot ==&lt;br /&gt;
&lt;br /&gt;
The first step is to flash U-Boot to our first device, either an SD card or an eMMC module. U-Boot here is the system's firmware, similar to the BIOS in an x86 PC.&lt;br /&gt;
&lt;br /&gt;
You'll need a Linux, *BSD or macOS computer (any CPU architecture is fine), and a GitHub account to download Kwiboo's u-boot-build pipeline outputs with.&lt;br /&gt;
&lt;br /&gt;
Download the U-Boot build for your specific device from the latest RK356x Actions run of [https://github.com/Kwiboo/u-boot-build/actions Kwiboo's u-boot-build workflow repository]. Make sure you are downloading the correct build for your device, e.g. '''don't''' use &amp;lt;code&amp;gt;rk3566-quartz64-a&amp;lt;/code&amp;gt; on a SOQuartz!&lt;br /&gt;
&lt;br /&gt;
Extract the &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; from the zip archive.&lt;br /&gt;
&lt;br /&gt;
Next, insert the microSD card into your microSD reader, or attach the eMMC module to your eMMC to USB adapter and plug it in. Identify which &amp;lt;code&amp;gt;/dev/&amp;lt;/code&amp;gt; device node it showed up at, and ideally wipe any filesystems and partitions on the device. From now on, we'll refer to it as &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To flash U-Boot, write &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; to byte 32768 of &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;. You can do this with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=u-boot-rockchip.bin of=&amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt; bs=32k seek=1 conv=fsync&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' Double-check you have the right device before doing this! You don't want to flash this to one of your computer's actual disks.}}&lt;br /&gt;
&lt;br /&gt;
== Flashing a Distro Installer ==&lt;br /&gt;
&lt;br /&gt;
Assuming you want to boot an installer rather than some image, you'll want to flash a distribution's aarch64 EFI installation ISO to e.g. an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
Some examples for installers that fit this criteria:&lt;br /&gt;
&lt;br /&gt;
* '''Fedora Server:''' https://fedoraproject.org/server/download/ (Choose ''For ARM® aarch64 systems, DVD ISO'')&lt;br /&gt;
* '''Fedora Workstation:''' https://fedoraproject.org/workstation/download/ (Choose ''For ARM® aarch64 systems, Live ISO'')&lt;br /&gt;
* '''openSUSE Tumbleweed:''' https://get.opensuse.org/tumbleweed/ (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
** Tested on 2023-07-28 by [[User:CounterPillow]] on a Quartz64 Model B, installer booted from USB3 thumb drive. Installer has about 1 minute of showing a black screen until things appear on HDMI.&lt;br /&gt;
** Note: Installer overwrites U-Boot if installing on the U-Boot medium even with offset! Flashing U-Boot again after installation works.&lt;br /&gt;
** Note: Some concerning panfrost clk errors in dmesg and KDE Plasma Desktop defaults to X11 for now, not a good user experience&lt;br /&gt;
* '''openSUSE MicroOS:''' https://get.opensuse.org/microos/#download (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
* '''Ubuntu Server:''' https://ubuntu.com/download/server/arm (Choose either the latest LTS or the latest non-LTS)&lt;br /&gt;
** Tested on 2023-07-29 by [[User:CounterPillow]] on a Quartz64 Model B, Ubuntu 22.04.2 LTS, installer booted from USB3 thumb drive. Only installer boot tested, no installation performed.&lt;br /&gt;
** Note: You '''need''' to choose the HWE kernel in GRUB over Serial Console for 22.04 LTS, otherwise the installer won't boot&lt;br /&gt;
** Note: Does not allow setting an offset for partitions, so can't use the same medium for both u-boot and root&lt;br /&gt;
** Note: Some concerning panfrost clk errors in dmesg while installer boots, unsure if GPU will be happy&lt;br /&gt;
&lt;br /&gt;
If you're going to use something else, then please make sure the distribution image you're going to use has a not too ancient kernel; check [[Quartz64 Development]] for which kernel versions bring which drivers. Also make sure the distribution's kernel has the right drivers enabled in its kernel configuration.&lt;br /&gt;
&lt;br /&gt;
To prepare the installation medium, simply use your preferred image flashing utility to write the ISO to e.g. a USB thumb drive. You can also use &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; for this.&lt;br /&gt;
&lt;br /&gt;
== Performing the Installation ==&lt;br /&gt;
&lt;br /&gt;
Attach your two to three storage mediums (U-Boot medium, installer medium and target drive) and attach power. If everything went well, you should be booted into the distribution's guided installer. If everything did not go well, use a serial adapter like the PINE64 Woodpecker to get serial output from U-Boot at 1500000 bauds.&lt;br /&gt;
&lt;br /&gt;
Complete the installation. If you want to use your U-Boot medium as your target drive here, make sure to manually partition and leave 16MiB or more space at the start of the drive (block 32768), so that U-Boot is not overwritten.&lt;br /&gt;
&lt;br /&gt;
After the installation completes, power off the board, remove the installer medium, and power it back on. You should now be booted into your freshly installed system.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guide]] [[Category:Quartz64]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20182</id>
		<title>Quartz64 UEFI with U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20182"/>
		<updated>2023-08-05T11:38:47Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Performing the Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|'''Note:''' This article is a work-in-progress}}&lt;br /&gt;
&lt;br /&gt;
This article is a guide to installing an [https://en.wikipedia.org/wiki/Das_U-Boot U-Boot] capable of booting generic aarch64 EFI images on a [[Quartz64]] or [[SOQuartz]] board.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' U-Boot on Quartz64 Model A currently doesn't appear to be able to always load things from USB mass storage devices depending on the device, you'll have to get creative with your installer medium.}}&lt;br /&gt;
&lt;br /&gt;
We need two to three storage mediums:&lt;br /&gt;
&lt;br /&gt;
* an SD card or eMMC module for U-Boot (advanced users may use the SPI flash on Model B)&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for our installed system&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for the installer&lt;br /&gt;
&lt;br /&gt;
In practice, you can usually combine some of these into one, e.g. if you start your partitions at 16MiB you can have u-boot and your installed system reside on the same storage medium.&lt;br /&gt;
&lt;br /&gt;
A good way to go about things is to put U-Boot on an SD card, and install the system on eMMC or NVMe, and boot the installer from an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
== Flashing U-Boot ==&lt;br /&gt;
&lt;br /&gt;
The first step is to flash U-Boot to our first device, either an SD card or an eMMC module. U-Boot here is the system's firmware, similar to the BIOS in an x86 PC.&lt;br /&gt;
&lt;br /&gt;
You'll need a Linux, *BSD or macOS computer (any CPU architecture is fine), and a GitHub account to download Kwiboo's u-boot-build pipeline outputs with.&lt;br /&gt;
&lt;br /&gt;
Download the U-Boot build for your specific device from the latest RK356x Actions run of [https://github.com/Kwiboo/u-boot-build/actions Kwiboo's u-boot-build workflow repository]. Make sure you are downloading the correct build for your device, e.g. '''don't''' use &amp;lt;code&amp;gt;rk3566-quartz64-a&amp;lt;/code&amp;gt; on a SOQuartz!&lt;br /&gt;
&lt;br /&gt;
Extract the &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; from the zip archive.&lt;br /&gt;
&lt;br /&gt;
Next, insert the microSD card into your microSD reader, or attach the eMMC module to your eMMC to USB adapter and plug it in. Identify which &amp;lt;code&amp;gt;/dev/&amp;lt;/code&amp;gt; device node it showed up at, and ideally wipe any filesystems and partitions on the device. From now on, we'll refer to it as &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To flash U-Boot, write &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; to byte 32768 of &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;. You can do this with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=u-boot-rockchip.bin of=&amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt; bs=32k seek=1 conv=fsync&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' Double-check you have the right device before doing this! You don't want to flash this to one of your computer's actual disks.}}&lt;br /&gt;
&lt;br /&gt;
== Flashing a Distro Installer ==&lt;br /&gt;
&lt;br /&gt;
Assuming you want to boot an installer rather than some image, you'll want to flash a distribution's aarch64 EFI installation ISO to e.g. an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
Some examples for installers that fit this criteria:&lt;br /&gt;
&lt;br /&gt;
* '''Fedora Server:''' https://fedoraproject.org/server/download/ (Choose ''For ARM® aarch64 systems, DVD ISO'')&lt;br /&gt;
* '''Fedora Workstation:''' https://fedoraproject.org/workstation/download/ (Choose ''For ARM® aarch64 systems, Live ISO'')&lt;br /&gt;
* '''openSUSE Tumbleweed:''' https://get.opensuse.org/tumbleweed/ (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
** Tested on 2023-07-28 by [[User:CounterPillow]] on a Quartz64 Model B, installer booted from USB3 thumb drive. Installer has about 1 minute of showing a black screen until things appear on HDMI.&lt;br /&gt;
** Note: Installer overwrites U-Boot if installing on the U-Boot medium even with offset! Flashing U-Boot again after installation works.&lt;br /&gt;
** Note: Some concerning panfrost clk errors in dmesg and KDE Plasma Desktop defaults to X11 for now, not a good user experience&lt;br /&gt;
* '''openSUSE MicroOS:''' https://get.opensuse.org/microos/#download (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
* '''Ubuntu Server:''' https://ubuntu.com/download/server/arm (Choose either the latest LTS or the latest non-LTS)&lt;br /&gt;
** Tested on 2023-07-29 by [[User:CounterPillow]] on a Quartz64 Model B, Ubuntu 22.04.2 LTS, installer booted from USB3 thumb drive. Only installer boot tested, no installation performed.&lt;br /&gt;
** Note: You '''need''' to choose the HWE kernel in GRUB over Serial Console for 22.04 LTS, otherwise the installer won't boot&lt;br /&gt;
** Note: Does not allow setting an offset for partitions, so can't use the same medium for both u-boot and root&lt;br /&gt;
** Note: Some concerning panfrost clk errors in dmesg while installer boots, unsure if GPU will be happy&lt;br /&gt;
&lt;br /&gt;
If you're going to use something else, then please make sure the distribution image you're going to use has a not too ancient kernel; check [[Quartz64 Development]] for which kernel versions bring which drivers. Also make sure the distribution's kernel has the right drivers enabled in its kernel configuration.&lt;br /&gt;
&lt;br /&gt;
To prepare the installation medium, simply use your preferred image flashing utility to write the ISO to e.g. a USB thumb drive. You can also use &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; for this.&lt;br /&gt;
&lt;br /&gt;
== Performing the Installation ==&lt;br /&gt;
&lt;br /&gt;
Attach your two to three storage mediums (U-Boot medium, installer medium and target drive) and attach power. If everything went well, you should be booted into the distribution's guided installer. If everything did not go well, use a serial adapter like the PINE64 Woodpecker to get serial output from U-Boot at 1500000 bauds.&lt;br /&gt;
&lt;br /&gt;
Complete the installation. If you want to use your U-Boot medium as your target drive here, make sure to manually partition and leave 16MiB or more space at the start of the drive (byte 32768), so that U-Boot is not overwritten.&lt;br /&gt;
&lt;br /&gt;
After the installation completes, power off the board, remove the installer medium, and power it back on. You should now be booted into your freshly installed system.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guide]] [[Category:Quartz64]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20164</id>
		<title>Quartz64 Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20164"/>
		<updated>2023-07-31T10:21:37Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Linux Kernel Config Options */ oops, was already on there&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents the current status of software support for the [[Quartz64]] single-board computer, and provides links to resources to help prospective contributors get started. Information is kept current on a best-effort basis as various patches get accepted into the kernel.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== Upstreaming Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Status&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Component&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Notes&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Applies To&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Output&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchipdrm/VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
As of 5.19-rc1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/604be85547ce4d61b89292d2f9a78c721b778c16]&amp;lt;/sup&amp;gt;, Also featured in Phoronix Article&amp;lt;sup&amp;gt;[https://www.phoronix.com/scan.php?page=news_item&amp;amp;px=Rockchip-VOP2-Linux-5.19]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-edpphy-naneng&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/blob/quartz64/drivers/phy/rockchip/phy-rockchip-naneng-edp.c] and [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/commit/d7ad116fb30d11d110aeb880754cf27f34c45c40#7e8e2ef87e479c54539dc519c0b92d6b31727f8d_671_681] Coordinate any porting with Rockchip first&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;dw-mipi-dsi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/e18d9b093006d8abd53e1ce13c0d5a8d0fcd5f64]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3D Acceleration &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Upstream Mesa&lt;br /&gt;
| &amp;lt;code&amp;gt;panfrost&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/810028668c6d9da25664195d6b906c98a8169f72]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Decode &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot; rowspan=&amp;quot;3&amp;quot;|GStreamer only, no ffmpeg&amp;lt;sup&amp;gt;[https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=2898]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;hantro&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU121 handling 1080p MPEG-2, VP8 and H.264. Mainline as of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/5f6bfab6da6531238e899fdf29efd6d0185adc3e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkvdec2&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU346 handling 4K H.265, H.264 and VP9&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkdjpeg&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU720 handling JPEG, [[User:CounterPillow]] is working on this&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;5&amp;quot; | [[Mainline Hardware Encoding|Video Encode]] &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;text-align:center; background:LightYellow;&amp;quot;|GStreamer only&lt;br /&gt;
| JPEG on VEPU121&lt;br /&gt;
| Hantro-based. Mainline as of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/6f1ae821a6c4aa9d5b8f437b27ec86fb569219fd]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| VP8 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.265 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Audio &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-i2s-tdm&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/43b058698f723e3c2087af7069c0da082a3ecbe1]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-spdif&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/dac825b6a6bdca41347e25f07354ad94fdc97445]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-codec&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0d6a04da9b25b9a7cf2cac5f5079e3296d3bee0f]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
| Quartz64 Model A/B&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Bootloader&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/16952]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TF-A&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://patchwork.ozlabs.org/project/uboot/list/?series=365266&amp;amp;state=*]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;U-Boot&amp;lt;/code&amp;gt;&lt;br /&gt;
| [[Quartz64_Development#Mainline_U-Boot_Work|See below]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In progress&amp;lt;sup&amp;gt;[https://github.com/jaredmcneill/quartz64_uefi]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;Tianocore EDK II&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;4&amp;quot; | Device Tree&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/b33a22a1e7c4248608e533fc4fa524258b3fae84]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c37415f55bdadffe5b4c0e7981e9fc7e8b96beea]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| SOQuartz&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c466828fb3ba8cb7f5c3bf28766da9b70bf9745e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| SOQuartz&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| PineNote&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d449121e5e8addcee654250cec298c887ecafb32]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| PineNote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot;| Gigabit Ethernet&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3566-gmac&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/3bb3d6b1c1957e88bfc5e77a4557f7e6ba761fe3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;yt8511-phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/48e8c6f1612b3d2dccaea2285231def830cc5b8e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | IOMMU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-iommu&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c55356c534aa651ccc3053ef2d5d8d810adacf5f]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | GPIO&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;gpio-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/936ee2675eee1faca0dcdfa79165c7990422e0fc]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | pinctrl&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Thermal Regulation&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-thermal&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/4b14c055a6f644cbeb1156ba24647e92fe51ec69]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | PCIe&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;pcie-dw-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0e898eb8df4e34c7b129452444eb7cef68a11f43]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Power Management&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-pm-domains&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/1782c87b44a0b1a527f01a6a184677c58ccbf9c7]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Voltage Control&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3568-pmu-io-voltage-domain&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/28b05a64e47cbceebb8a5f3f643033148d5c06c3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | SPI &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;spi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d74d99229f4d48f42d674f7a8a1137179efd67ac]&amp;lt;/sup&amp;gt;. Necessary device tree changes [https://patchwork.kernel.org/project/linux-rockchip/list/?series=586691 in review].&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Battery&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-charger&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/power/supply/rk817_charger.c?id=11cb8da0189b417392e2334ae967b0ba1f0d1be8]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A, Pinenote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Microphone&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-saradc&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7786da3b5ae167c17f35e22ba35e06006338c2f6]&amp;lt;/sup&amp;gt;. Headphone jack mic seems to connect to &amp;lt;code&amp;gt;SARADC_VIN2_HP_HOOK&amp;lt;/code&amp;gt;, so I'm pretty sure that the dtsi and driver changes are needed for that mic to work&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | USB 2.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-usb2phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.17&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/phy/rockchip?h=v5.17-rc1&amp;amp;id=42b559727a45d79c811f493515eb9b7e56016421]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | e-Ink&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review (RFC)&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/20220413221916.50995-1-samuel@sholland.org/T/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-ebc&amp;lt;/code&amp;gt;&lt;br /&gt;
| A DRM driver is available [https://github.com/smaeul/linux/commits/rk35/ebc-drm-v5 here]; also see [[RK3566 EBC Reverse-Engineering]]&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Combo PHY&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;naneng-combphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7160820d742a16313f7802e33c2956c19548e488]&amp;lt;/sup&amp;gt;. Still requires DTS changes&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | RGA&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs fixing&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rga&amp;lt;/code&amp;gt;&lt;br /&gt;
| [[User:CounterPillow]] experimentally enabled it&amp;lt;sup&amp;gt;[https://gist.github.com/CounterPillow/6bea809f15ada7ddd3a3d7a4994fdc4e]&amp;lt;/sup&amp;gt; in the device tree and ran gstreamer's v4l2convert through it to test, resulting in a completely garbled output.&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Fan Controller&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;gp7101&amp;lt;/code&amp;gt;&lt;br /&gt;
| Someone should write a pwm driver for it so we can then use pwm-fan&lt;br /&gt;
| SOQuartz Blade&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | CSI Camera&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rkisp&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/media/platform/rockchip/isp]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-inno-csidphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/29c99fb085ad53e6d5504d1f8d32e6673b9b3a2c]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | NPU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &lt;br /&gt;
| Downstream version is a closed source SDK and [https://github.com/dieselnutjob/kernel-rk3566/tree/linux-4.19.210/drivers/rknpu open source kernel module rknpu]. Major undertaking to reimplement this as Linux does not (yet) appear to have a generic architecture for neural accelerators.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Crypto&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rk-crypto&amp;lt;/code&amp;gt; v2&lt;br /&gt;
| Downstream driver [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/crypto/rockchip] doesn't include a rk3568 compatible either, but the TRM shows that it seemingly matches.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | TRNG&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://patchwork.kernel.org/project/linux-rockchip/list/?series=699813]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rng&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | Wi-Fi&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;bes2600&amp;lt;/code&amp;gt;&lt;br /&gt;
| A downstream driver is available but it makes use of some custom Rockchip interfaces and is designed for older kernels, plans are being made to port it to DKMS.&lt;br /&gt;
| PineTab 2&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
The following sections give an overview over the current status of different parts of the board. Some parts are waiting on a driver to be written or ported, others only need various adjustments.&lt;br /&gt;
&lt;br /&gt;
According to pgwipeout, I/O device performance is within expected ranges now.&lt;br /&gt;
&lt;br /&gt;
=== Working ===&lt;br /&gt;
&lt;br /&gt;
* eMMC&lt;br /&gt;
* SDMMC0 (SD cards)&lt;br /&gt;
* GMAC (Gigabit Ethernet)&lt;br /&gt;
* USB 2.0&lt;br /&gt;
* SATA 2&lt;br /&gt;
* SATA 3&lt;br /&gt;
* UART&lt;br /&gt;
** UART 0 (Pi-bus)&lt;br /&gt;
** UART 1 (Bluetooth)&lt;br /&gt;
** UART 2 (Pi-bus, debug)&lt;br /&gt;
* Video Decode&lt;br /&gt;
** VP8&lt;br /&gt;
** H.264&lt;br /&gt;
* Video Encode&lt;br /&gt;
** JPEG (it's pretty bad)&lt;br /&gt;
* Battery&lt;br /&gt;
* GPU&lt;br /&gt;
* Audio&lt;br /&gt;
** Analog audio works&lt;br /&gt;
** SPDIF works&lt;br /&gt;
** HDMI works&lt;br /&gt;
* SPI &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
&lt;br /&gt;
=== Partially Working ===&lt;br /&gt;
&lt;br /&gt;
* PCI-Express Controller &amp;amp;mdash; everything but devices that need cache coherency (e.g. dGPUs) should work&lt;br /&gt;
** [[User:CounterPillow]] noticed some weirdness with NVMe devices disconnecting during heavy write operations, likely down due to power draw on one of the rails as the same sustained bandwidth could be achieved with a different PCIe device with no issue.&lt;br /&gt;
* SDMMC1 (Wi-Fi) &amp;amp;mdash; AP6256 working, BL602 needs some work to make it flash firmware&lt;br /&gt;
* [https://developer.arm.com/architectures/system-architectures/system-components/arm-generic-interrupt-controller GIC] &amp;amp;mdash; needs errata published by Rockchip to get upstream to add device-specific workarounds&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/CAMdYzYrQ5f-mv_VmTq_CRf9tR=j3mwRpKHNLmPFgCF9whsGFRw@mail.gmail.com/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Video Output &amp;amp;mdash; only at 1920x1080p60 and nothing else, very buggy and rough around more than just the edges&lt;br /&gt;
&lt;br /&gt;
=== Confirmed Broken ===&lt;br /&gt;
&lt;br /&gt;
* USB 3.0 (applies to Model A only) &amp;amp;mdash; only works with very short cables and depends on the device. This is due to a hardware design issue relating to the coupling capacitors needed for SATA, which shares the same lines as USB 3.0.&lt;br /&gt;
** Hardware design changes have been suggested to engineers, it's in their hands now.&lt;br /&gt;
* RGA &amp;amp;mdash; only works with memory &amp;amp;le; 4 GiB, because Rockchip didn't make the address registers larger. Oopsie.&lt;br /&gt;
&lt;br /&gt;
=== Needs Testing ===&lt;br /&gt;
&lt;br /&gt;
* E-Paper&lt;br /&gt;
* Microphone Input&lt;br /&gt;
* CSI &amp;amp;mdash; needs CIF driver&lt;br /&gt;
* eDP &amp;amp;mdash; needs PHY driver and controller driver&lt;br /&gt;
* DSI&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
=== ebc-dev Reverse Engineering and Development ===&lt;br /&gt;
&lt;br /&gt;
The [https://gitlab.com/pine64-org/quartz-bsp/linux-next/-/tree/rk356x-ebc-dev driver for the eInk panel] needs to both be reverse engineered and then rewritten as C. In its current form, it is mostly an assembly dump produced by gcc with debug symbols. See [[RK3566 EBC Reverse-Engineering]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Investigate MCU ===&lt;br /&gt;
&lt;br /&gt;
The RK3566 comes with an integrated RISC-V microcontroller (MCU). It communicates with the A55 host through the Mailbox system driven by the rockchip-mailbox driver. Since this MCU would be quite useful for things such as low power standby mode, investigating how it can be turned on and have firmware flashed to it should greatly enhance the power saving features of the PineNote.&lt;br /&gt;
&lt;br /&gt;
=== Mainline U-Boot Work ===&lt;br /&gt;
&lt;br /&gt;
We currently use the &amp;quot;downstream&amp;quot; Rockchip U-Boot, which is based on an old version of U-Boot and contains vendor specific patches that have not undergone the same level of code review as they'd have done had they been submitted upstream.&lt;br /&gt;
&lt;br /&gt;
While the lack of ATF sources means that using mainline U-Boot would still require the use of Rockchip provided binaries for the firmware, even with Rockchip blobs, a more modern version of U-Boot will be much nicer to use.&lt;br /&gt;
&lt;br /&gt;
Mainline U-Boot contains good enough support for the RK3566 SoC used on the Quartz64 as of v2023.07, patches are still in review for e.g. PCIe/NVMe/AHCI support.&lt;br /&gt;
&lt;br /&gt;
Patches for adding Quartz64 and SOQuartz have been submitted and are now [https://patchwork.ozlabs.org/project/uboot/list/?series=365266&amp;amp;state=* in review]&lt;br /&gt;
&lt;br /&gt;
==== Things that could be done ====&lt;br /&gt;
&lt;br /&gt;
This list is non-exhaustive as we don't exactly know how much is missing&lt;br /&gt;
&lt;br /&gt;
* Port the DesignWare Ethernet QoS rockchip driver to u-boot for networking&lt;br /&gt;
* Port the Motorcomm PHY driver to u-boot for networking&lt;br /&gt;
** Only needed for Model A, RTL8211 on Model B is already supported in mainline u-boot&lt;br /&gt;
* Port a basic VOP2 driver to get a framebuffer from u-boot&lt;br /&gt;
&lt;br /&gt;
==== List of Useful Resources for this Task ====&lt;br /&gt;
* Downstream Rockchip U-Boot repository with Quartz64 specific patches: https://gitlab.com/pgwipeout/u-boot-rockchip/-/tree/quartz64&lt;br /&gt;
* Mainline Rockchip custodian U-Boot repository: https://source.denx.de/u-boot/custodians/u-boot-rockchip&lt;br /&gt;
* U-Boot Mailing List: https://lists.denx.de/listinfo/u-boot&lt;br /&gt;
&lt;br /&gt;
=== eDP Driver Porting ===&lt;br /&gt;
&lt;br /&gt;
The eDP PHY driver and controller driver needs to be ported, brought into shape and submitted with proper commit attribution to the Rockchip authors.&lt;br /&gt;
&lt;br /&gt;
[[User:CounterPillow]] has experimentally ported stuff, but it's currently not working.&lt;br /&gt;
&lt;br /&gt;
== Linux Kernel Config Options ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_I2S_TDM&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog and HDMI audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog audio on the Model A&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_STMMAC_ETH&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DWMAC_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model A, set this one to Y, m won't work out of the box if the generic PHY driver is y and binds first. Alternatively tell users in board-specific setup instructions to force including the &amp;lt;code&amp;gt;motorcomm&amp;lt;/code&amp;gt; module in initramfs if you set it to m.&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REALTEK_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model B&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_SDHCI_OF_DWCMSHC&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PCIE_ROCKCHIP_DW_HOST&amp;lt;/code&amp;gt;&lt;br /&gt;
** PCIe&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** PHY for PCIe/SATA/USB3&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DRM_PANFROST&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPU&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_SPDIF&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPDIF audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_DW_HDMI&amp;lt;/code&amp;gt;&lt;br /&gt;
** HDMI PHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI DSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
** Video output&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ARCH_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_USB2&amp;lt;/code&amp;gt;&lt;br /&gt;
** USB 2&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_RTC_DRV_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MFD_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Various things relating to the RK817 chip&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_CHARGER_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** RK817 charger&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REGULATOR_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Voltage regulators&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PM_DOMAINS&amp;lt;/code&amp;gt;&lt;br /&gt;
** Power management domains&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_GPIO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PINCTRL_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO and general SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PWM_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** PWM support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IOMMU&amp;lt;/code&amp;gt;&lt;br /&gt;
** IOMMU support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_MBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
** Mailbox support (for communication with MCU)&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_SARADC&amp;lt;/code&amp;gt;&lt;br /&gt;
** Analog-to-digital conversion support, for e.g. microphones&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_THERMAL&amp;lt;/code&amp;gt;&lt;br /&gt;
** Temperature sensor and thermal throttling support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SPI_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPI support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_VIDEO_HANTRO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Hardware video decoder support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IODOMAIN&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support so your I/O pins have the right voltage&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Common clock support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI CSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_I2C_RK3X&amp;lt;/code&amp;gt;&lt;br /&gt;
** I2C support&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
* pgwipeout's kernel tree&lt;br /&gt;
** https://gitlab.com/pgwipeout/linux-next/-/tree/quartz64-v5.15-rc1&lt;br /&gt;
* BSP based development effort for SPL/U-Boot and Linux&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp&lt;br /&gt;
* Image CI pipeline aimed at developers&lt;br /&gt;
** https://gitlab.com/pgwipeout/quartz64_ci/&lt;br /&gt;
* Rockchip U-Boot&lt;br /&gt;
** https://github.com/rockchip-linux/u-boot&lt;br /&gt;
* Downstream rockchip-linux kernel tree&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux&lt;br /&gt;
* Tianocore EDK II port for UEFI on Quartz64&lt;br /&gt;
** https://github.com/jaredmcneill/quartz64_uefi&lt;br /&gt;
* Mainline U-Boot Port by pgwipeout&lt;br /&gt;
** https://gitlab.com/pgwipeout/u-boot-quartz64&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* Rockchip-SoC Patchwork Page&lt;br /&gt;
** https://patchwork.kernel.org/project/linux-rockchip/list/&lt;br /&gt;
* Rockchip Kernel Mailing List Archive&lt;br /&gt;
** https://lore.kernel.org/linux-rockchip/&lt;br /&gt;
&lt;br /&gt;
== Board/SoC Documentation ==&lt;br /&gt;
=== Booting ===&lt;br /&gt;
==== Boot Order ====&lt;br /&gt;
The RK3566 boot ROM will search for a valid ID BLOCK in the following order on the support boot media:&lt;br /&gt;
&lt;br /&gt;
* SPI NOR flash&lt;br /&gt;
* SPI NAND flash&lt;br /&gt;
* eMMC&lt;br /&gt;
* SD-Card&lt;br /&gt;
&lt;br /&gt;
... if this fails, the boot ROM will initialize the USB0 port and wait for a connection from the Rockchip&lt;br /&gt;
flash/boot tools.&lt;br /&gt;
&lt;br /&gt;
==== Bootloader Flashing ====&lt;br /&gt;
&lt;br /&gt;
As per pgwipeout's [https://gitlab.com/pine64-org/quartz-bsp/u-boot/-/commit/12d102b86813378af08b086f3b9c13ed8010754c commit message]:&lt;br /&gt;
* Make a partition named &amp;lt;code&amp;gt;uboot&amp;lt;/code&amp;gt; as partition number 1 at 8 MiB to 16 MiB&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=idblock.bin of=/dev/''&amp;lt;mmc/sd&amp;gt;'' seek=64&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=uboot.img of=/dev/''&amp;lt;mmc/sd&amp;gt;''1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSP Image Layout ====&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]][[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20163</id>
		<title>Quartz64 Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_Development&amp;diff=20163"/>
		<updated>2023-07-31T10:21:04Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Linux Kernel Config Options */ Add Panfrost to kernel config options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents the current status of software support for the [[Quartz64]] single-board computer, and provides links to resources to help prospective contributors get started. Information is kept current on a best-effort basis as various patches get accepted into the kernel.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== Upstreaming Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable plainrowheaders&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; colspan=&amp;quot;2&amp;quot; | Status&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Component&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Notes&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Applies To&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Output&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchipdrm/VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
As of 5.19-rc1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/604be85547ce4d61b89292d2f9a78c721b778c16]&amp;lt;/sup&amp;gt;, Also featured in Phoronix Article&amp;lt;sup&amp;gt;[https://www.phoronix.com/scan.php?page=news_item&amp;amp;px=Rockchip-VOP2-Linux-5.19]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-edpphy-naneng&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/blob/quartz64/drivers/phy/rockchip/phy-rockchip-naneng-edp.c] and [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/commit/d7ad116fb30d11d110aeb880754cf27f34c45c40#7e8e2ef87e479c54539dc519c0b92d6b31727f8d_671_681] Coordinate any porting with Rockchip first&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;dw-mipi-dsi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/e18d9b093006d8abd53e1ce13c0d5a8d0fcd5f64]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3D Acceleration &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Upstream Mesa&lt;br /&gt;
| &amp;lt;code&amp;gt;panfrost&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/810028668c6d9da25664195d6b906c98a8169f72]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Video Decode &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;background:LightYellow; text-align:center;&amp;quot; rowspan=&amp;quot;3&amp;quot;|GStreamer only, no ffmpeg&amp;lt;sup&amp;gt;[https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=2898]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;hantro&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU121 handling 1080p MPEG-2, VP8 and H.264. Mainline as of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/5f6bfab6da6531238e899fdf29efd6d0185adc3e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkvdec2&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU346 handling 4K H.265, H.264 and VP9&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;rkdjpeg&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;v4l2-requests&amp;lt;/code&amp;gt;&lt;br /&gt;
| VDPU720 handling JPEG, [[User:CounterPillow]] is working on this&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;5&amp;quot; | [[Mainline Hardware Encoding|Video Encode]] &lt;br /&gt;
| style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| style=&amp;quot;text-align:center; background:LightYellow;&amp;quot;|GStreamer only&lt;br /&gt;
| JPEG on VEPU121&lt;br /&gt;
| Hantro-based. Mainline as of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/6f1ae821a6c4aa9d5b8f437b27ec86fb569219fd]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| VP8 on VEPU121&lt;br /&gt;
| Hantro-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.264 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot;|?&lt;br /&gt;
| H.265 on VEPU540&lt;br /&gt;
| rkvenc-based&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Audio &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-i2s-tdm&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/43b058698f723e3c2087af7069c0da082a3ecbe1]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-spdif&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/dac825b6a6bdca41347e25f07354ad94fdc97445]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-codec&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0d6a04da9b25b9a7cf2cac5f5079e3296d3bee0f]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
| Quartz64 Model A/B&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;3&amp;quot; | Bootloader&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/16952]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TF-A&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://patchwork.ozlabs.org/project/uboot/list/?series=365266&amp;amp;state=*]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;U-Boot&amp;lt;/code&amp;gt;&lt;br /&gt;
| [[Quartz64_Development#Mainline_U-Boot_Work|See below]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In progress&amp;lt;sup&amp;gt;[https://github.com/jaredmcneill/quartz64_uefi]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;Tianocore EDK II&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;4&amp;quot; | Device Tree&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
| As of 5.16&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/b33a22a1e7c4248608e533fc4fa524258b3fae84]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c37415f55bdadffe5b4c0e7981e9fc7e8b96beea]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| SOQuartz&lt;br /&gt;
| As of 5.19&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c466828fb3ba8cb7f5c3bf28766da9b70bf9745e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| SOQuartz&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| PineNote&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d449121e5e8addcee654250cec298c887ecafb32]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| PineNote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot;| Gigabit Ethernet&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3566-gmac&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/3bb3d6b1c1957e88bfc5e77a4557f7e6ba761fe3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;yt8511-phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/48e8c6f1612b3d2dccaea2285231def830cc5b8e]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | IOMMU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-iommu&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/c55356c534aa651ccc3053ef2d5d8d810adacf5f]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | GPIO&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;gpio-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/936ee2675eee1faca0dcdfa79165c7990422e0fc]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | pinctrl&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Thermal Regulation&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-thermal&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/4b14c055a6f644cbeb1156ba24647e92fe51ec69]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | PCIe&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;pcie-dw-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/0e898eb8df4e34c7b129452444eb7cef68a11f43]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Power Management&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-pm-domains&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/1782c87b44a0b1a527f01a6a184677c58ccbf9c7]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Voltage Control&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk3568-pmu-io-voltage-domain&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/28b05a64e47cbceebb8a5f3f643033148d5c06c3]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | SPI &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;  style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;spi-rockchip&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.14&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/d74d99229f4d48f42d674f7a8a1137179efd67ac]&amp;lt;/sup&amp;gt;. Necessary device tree changes [https://patchwork.kernel.org/project/linux-rockchip/list/?series=586691 in review].&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Battery&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rk817-charger&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/power/supply/rk817_charger.c?id=11cb8da0189b417392e2334ae967b0ba1f0d1be8]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| Quartz64 Model A, Pinenote&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Microphone&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-saradc&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.15&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7786da3b5ae167c17f35e22ba35e06006338c2f6]&amp;lt;/sup&amp;gt;. Headphone jack mic seems to connect to &amp;lt;code&amp;gt;SARADC_VIN2_HP_HOOK&amp;lt;/code&amp;gt;, so I'm pretty sure that the dtsi and driver changes are needed for that mic to work&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | USB 2.0&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-usb2phy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.17&amp;lt;sup&amp;gt;[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/phy/rockchip?h=v5.17-rc1&amp;amp;id=42b559727a45d79c811f493515eb9b7e56016421]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | e-Ink&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review (RFC)&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/20220413221916.50995-1-samuel@sholland.org/T/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-ebc&amp;lt;/code&amp;gt;&lt;br /&gt;
| A DRM driver is available [https://github.com/smaeul/linux/commits/rk35/ebc-drm-v5 here]; also see [[RK3566 EBC Reverse-Engineering]]&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Combo PHY&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;naneng-combphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 5.18&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/7160820d742a16313f7802e33c2956c19548e488]&amp;lt;/sup&amp;gt;. Still requires DTS changes&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | RGA&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs fixing&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rga&amp;lt;/code&amp;gt;&lt;br /&gt;
| [[User:CounterPillow]] experimentally enabled it&amp;lt;sup&amp;gt;[https://gist.github.com/CounterPillow/6bea809f15ada7ddd3a3d7a4994fdc4e]&amp;lt;/sup&amp;gt; in the device tree and ran gstreamer's v4l2convert through it to test, resulting in a completely garbled output.&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Fan Controller&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &amp;lt;code&amp;gt;gp7101&amp;lt;/code&amp;gt;&lt;br /&gt;
| Someone should write a pwm driver for it so we can then use pwm-fan&lt;br /&gt;
| SOQuartz Blade&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | CSI Camera&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rkisp&amp;lt;/code&amp;gt;&lt;br /&gt;
| Downstream: [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/media/platform/rockchip/isp]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-inno-csidphy&amp;lt;/code&amp;gt;&lt;br /&gt;
| As of 6.1&amp;lt;sup&amp;gt;[https://git.kernel.org/linus/29c99fb085ad53e6d5504d1f8d32e6673b9b3a2c]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | NPU&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs writing&lt;br /&gt;
| &lt;br /&gt;
| Downstream version is a closed source SDK and [https://github.com/dieselnutjob/kernel-rk3566/tree/linux-4.19.210/drivers/rknpu open source kernel module rknpu]. Major undertaking to reimplement this as Linux does not (yet) appear to have a generic architecture for neural accelerators.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | Crypto&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;rk-crypto&amp;lt;/code&amp;gt; v2&lt;br /&gt;
| Downstream driver [https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux/-/tree/quartz64/drivers/crypto/rockchip] doesn't include a rk3568 compatible either, but the TRM shows that it seemingly matches.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | TRNG&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:LightYellow; text-align:center;&amp;quot;|In review&amp;lt;sup&amp;gt;[https://patchwork.kernel.org/project/linux-rockchip/list/?series=699813]&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;rockchip-rng&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;2&amp;quot; | Wi-Fi&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#F99; text-align:center;&amp;quot;|Needs porting&lt;br /&gt;
| &amp;lt;code&amp;gt;bes2600&amp;lt;/code&amp;gt;&lt;br /&gt;
| A downstream driver is available but it makes use of some custom Rockchip interfaces and is designed for older kernels, plans are being made to port it to DKMS.&lt;br /&gt;
| PineTab 2&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:PaleGreen; text-align:center;&amp;quot;|Linux Mainline&lt;br /&gt;
| &amp;lt;code&amp;gt;brcmfmac&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| Quartz64 Model B&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
The following sections give an overview over the current status of different parts of the board. Some parts are waiting on a driver to be written or ported, others only need various adjustments.&lt;br /&gt;
&lt;br /&gt;
According to pgwipeout, I/O device performance is within expected ranges now.&lt;br /&gt;
&lt;br /&gt;
=== Working ===&lt;br /&gt;
&lt;br /&gt;
* eMMC&lt;br /&gt;
* SDMMC0 (SD cards)&lt;br /&gt;
* GMAC (Gigabit Ethernet)&lt;br /&gt;
* USB 2.0&lt;br /&gt;
* SATA 2&lt;br /&gt;
* SATA 3&lt;br /&gt;
* UART&lt;br /&gt;
** UART 0 (Pi-bus)&lt;br /&gt;
** UART 1 (Bluetooth)&lt;br /&gt;
** UART 2 (Pi-bus, debug)&lt;br /&gt;
* Video Decode&lt;br /&gt;
** VP8&lt;br /&gt;
** H.264&lt;br /&gt;
* Video Encode&lt;br /&gt;
** JPEG (it's pretty bad)&lt;br /&gt;
* Battery&lt;br /&gt;
* GPU&lt;br /&gt;
* Audio&lt;br /&gt;
** Analog audio works&lt;br /&gt;
** SPDIF works&lt;br /&gt;
** HDMI works&lt;br /&gt;
* SPI &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
* I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C &amp;amp;mdash; works, user needs to modify device tree to add devices&lt;br /&gt;
&lt;br /&gt;
=== Partially Working ===&lt;br /&gt;
&lt;br /&gt;
* PCI-Express Controller &amp;amp;mdash; everything but devices that need cache coherency (e.g. dGPUs) should work&lt;br /&gt;
** [[User:CounterPillow]] noticed some weirdness with NVMe devices disconnecting during heavy write operations, likely down due to power draw on one of the rails as the same sustained bandwidth could be achieved with a different PCIe device with no issue.&lt;br /&gt;
* SDMMC1 (Wi-Fi) &amp;amp;mdash; AP6256 working, BL602 needs some work to make it flash firmware&lt;br /&gt;
* [https://developer.arm.com/architectures/system-architectures/system-components/arm-generic-interrupt-controller GIC] &amp;amp;mdash; needs errata published by Rockchip to get upstream to add device-specific workarounds&amp;lt;sup&amp;gt;[https://lore.kernel.org/linux-rockchip/CAMdYzYrQ5f-mv_VmTq_CRf9tR=j3mwRpKHNLmPFgCF9whsGFRw@mail.gmail.com/]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* Video Output &amp;amp;mdash; only at 1920x1080p60 and nothing else, very buggy and rough around more than just the edges&lt;br /&gt;
&lt;br /&gt;
=== Confirmed Broken ===&lt;br /&gt;
&lt;br /&gt;
* USB 3.0 (applies to Model A only) &amp;amp;mdash; only works with very short cables and depends on the device. This is due to a hardware design issue relating to the coupling capacitors needed for SATA, which shares the same lines as USB 3.0.&lt;br /&gt;
** Hardware design changes have been suggested to engineers, it's in their hands now.&lt;br /&gt;
* RGA &amp;amp;mdash; only works with memory &amp;amp;le; 4 GiB, because Rockchip didn't make the address registers larger. Oopsie.&lt;br /&gt;
&lt;br /&gt;
=== Needs Testing ===&lt;br /&gt;
&lt;br /&gt;
* E-Paper&lt;br /&gt;
* Microphone Input&lt;br /&gt;
* CSI &amp;amp;mdash; needs CIF driver&lt;br /&gt;
* eDP &amp;amp;mdash; needs PHY driver and controller driver&lt;br /&gt;
* DSI&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
&lt;br /&gt;
=== ebc-dev Reverse Engineering and Development ===&lt;br /&gt;
&lt;br /&gt;
The [https://gitlab.com/pine64-org/quartz-bsp/linux-next/-/tree/rk356x-ebc-dev driver for the eInk panel] needs to both be reverse engineered and then rewritten as C. In its current form, it is mostly an assembly dump produced by gcc with debug symbols. See [[RK3566 EBC Reverse-Engineering]] for details.&lt;br /&gt;
&lt;br /&gt;
=== Investigate MCU ===&lt;br /&gt;
&lt;br /&gt;
The RK3566 comes with an integrated RISC-V microcontroller (MCU). It communicates with the A55 host through the Mailbox system driven by the rockchip-mailbox driver. Since this MCU would be quite useful for things such as low power standby mode, investigating how it can be turned on and have firmware flashed to it should greatly enhance the power saving features of the PineNote.&lt;br /&gt;
&lt;br /&gt;
=== Mainline U-Boot Work ===&lt;br /&gt;
&lt;br /&gt;
We currently use the &amp;quot;downstream&amp;quot; Rockchip U-Boot, which is based on an old version of U-Boot and contains vendor specific patches that have not undergone the same level of code review as they'd have done had they been submitted upstream.&lt;br /&gt;
&lt;br /&gt;
While the lack of ATF sources means that using mainline U-Boot would still require the use of Rockchip provided binaries for the firmware, even with Rockchip blobs, a more modern version of U-Boot will be much nicer to use.&lt;br /&gt;
&lt;br /&gt;
Mainline U-Boot contains good enough support for the RK3566 SoC used on the Quartz64 as of v2023.07, patches are still in review for e.g. PCIe/NVMe/AHCI support.&lt;br /&gt;
&lt;br /&gt;
Patches for adding Quartz64 and SOQuartz have been submitted and are now [https://patchwork.ozlabs.org/project/uboot/list/?series=365266&amp;amp;state=* in review]&lt;br /&gt;
&lt;br /&gt;
==== Things that could be done ====&lt;br /&gt;
&lt;br /&gt;
This list is non-exhaustive as we don't exactly know how much is missing&lt;br /&gt;
&lt;br /&gt;
* Port the DesignWare Ethernet QoS rockchip driver to u-boot for networking&lt;br /&gt;
* Port the Motorcomm PHY driver to u-boot for networking&lt;br /&gt;
** Only needed for Model A, RTL8211 on Model B is already supported in mainline u-boot&lt;br /&gt;
* Port a basic VOP2 driver to get a framebuffer from u-boot&lt;br /&gt;
&lt;br /&gt;
==== List of Useful Resources for this Task ====&lt;br /&gt;
* Downstream Rockchip U-Boot repository with Quartz64 specific patches: https://gitlab.com/pgwipeout/u-boot-rockchip/-/tree/quartz64&lt;br /&gt;
* Mainline Rockchip custodian U-Boot repository: https://source.denx.de/u-boot/custodians/u-boot-rockchip&lt;br /&gt;
* U-Boot Mailing List: https://lists.denx.de/listinfo/u-boot&lt;br /&gt;
&lt;br /&gt;
=== eDP Driver Porting ===&lt;br /&gt;
&lt;br /&gt;
The eDP PHY driver and controller driver needs to be ported, brought into shape and submitted with proper commit attribution to the Rockchip authors.&lt;br /&gt;
&lt;br /&gt;
[[User:CounterPillow]] has experimentally ported stuff, but it's currently not working.&lt;br /&gt;
&lt;br /&gt;
== Linux Kernel Config Options ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_I2S_TDM&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog and HDMI audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** for Analog audio on the Model A&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_STMMAC_ETH&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DWMAC_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MOTORCOMM_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model A, set this one to Y, m won't work out of the box if the generic PHY driver is y and binds first. Alternatively tell users in board-specific setup instructions to force including the &amp;lt;code&amp;gt;motorcomm&amp;lt;/code&amp;gt; module in initramfs if you set it to m.&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REALTEK_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** Ethernet PHY for Model B&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_DW_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MMC_SDHCI_OF_DWCMSHC&amp;lt;/code&amp;gt;&lt;br /&gt;
** MMC/SD&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PCIE_ROCKCHIP_DW_HOST&amp;lt;/code&amp;gt;&lt;br /&gt;
** PCIe&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** PHY for PCIe/SATA/USB3&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DRM_PANFROST&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPU&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SND_SOC_ROCKCHIP_SPDIF&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPDIF audio&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_DW_HDMI&amp;lt;/code&amp;gt;&lt;br /&gt;
** HDMI PHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI DSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_VOP2&amp;lt;/code&amp;gt;&lt;br /&gt;
** Video output&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ARCH_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_USB2&amp;lt;/code&amp;gt;&lt;br /&gt;
** USB 2&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_RTC_DRV_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Real-time Clock&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_MFD_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Various things relating to the RK817 chip&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_CHARGER_RK817&amp;lt;/code&amp;gt;&lt;br /&gt;
** RK817 charger&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_REGULATOR_RK808&amp;lt;/code&amp;gt;&lt;br /&gt;
** Voltage regulators&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_PM_DOMAINS&amp;lt;/code&amp;gt;&lt;br /&gt;
** Power management domains&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_GPIO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PINCTRL_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPIO and general SoC support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PWM_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** PWM support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IOMMU&amp;lt;/code&amp;gt;&lt;br /&gt;
** IOMMU support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_MBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
** Mailbox support (for communication with MCU)&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_SARADC&amp;lt;/code&amp;gt;&lt;br /&gt;
** Analog-to-digital conversion support, for e.g. microphones&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_THERMAL&amp;lt;/code&amp;gt;&lt;br /&gt;
** Temperature sensor and thermal throttling support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_SPI_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** SPI support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_VIDEO_HANTRO_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Hardware video decoder support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_ROCKCHIP_IODOMAIN&amp;lt;/code&amp;gt;&lt;br /&gt;
** General SoC support so your I/O pins have the right voltage&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_COMMON_CLK_ROCKCHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
** Common clock support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY&amp;lt;/code&amp;gt;&lt;br /&gt;
** MIPI CSI DPHY&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_I2C_RK3X&amp;lt;/code&amp;gt;&lt;br /&gt;
** I2C support&lt;br /&gt;
* &amp;lt;code&amp;gt;CONFIG_DRM_PANFROST&amp;lt;/code&amp;gt;&lt;br /&gt;
** GPU&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
* pgwipeout's kernel tree&lt;br /&gt;
** https://gitlab.com/pgwipeout/linux-next/-/tree/quartz64-v5.15-rc1&lt;br /&gt;
* BSP based development effort for SPL/U-Boot and Linux&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp&lt;br /&gt;
* Image CI pipeline aimed at developers&lt;br /&gt;
** https://gitlab.com/pgwipeout/quartz64_ci/&lt;br /&gt;
* Rockchip U-Boot&lt;br /&gt;
** https://github.com/rockchip-linux/u-boot&lt;br /&gt;
* Downstream rockchip-linux kernel tree&lt;br /&gt;
** https://gitlab.com/pine64-org/quartz-bsp/rockchip-linux&lt;br /&gt;
* Tianocore EDK II port for UEFI on Quartz64&lt;br /&gt;
** https://github.com/jaredmcneill/quartz64_uefi&lt;br /&gt;
* Mainline U-Boot Port by pgwipeout&lt;br /&gt;
** https://gitlab.com/pgwipeout/u-boot-quartz64&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
* Rockchip-SoC Patchwork Page&lt;br /&gt;
** https://patchwork.kernel.org/project/linux-rockchip/list/&lt;br /&gt;
* Rockchip Kernel Mailing List Archive&lt;br /&gt;
** https://lore.kernel.org/linux-rockchip/&lt;br /&gt;
&lt;br /&gt;
== Board/SoC Documentation ==&lt;br /&gt;
=== Booting ===&lt;br /&gt;
==== Boot Order ====&lt;br /&gt;
The RK3566 boot ROM will search for a valid ID BLOCK in the following order on the support boot media:&lt;br /&gt;
&lt;br /&gt;
* SPI NOR flash&lt;br /&gt;
* SPI NAND flash&lt;br /&gt;
* eMMC&lt;br /&gt;
* SD-Card&lt;br /&gt;
&lt;br /&gt;
... if this fails, the boot ROM will initialize the USB0 port and wait for a connection from the Rockchip&lt;br /&gt;
flash/boot tools.&lt;br /&gt;
&lt;br /&gt;
==== Bootloader Flashing ====&lt;br /&gt;
&lt;br /&gt;
As per pgwipeout's [https://gitlab.com/pine64-org/quartz-bsp/u-boot/-/commit/12d102b86813378af08b086f3b9c13ed8010754c commit message]:&lt;br /&gt;
* Make a partition named &amp;lt;code&amp;gt;uboot&amp;lt;/code&amp;gt; as partition number 1 at 8 MiB to 16 MiB&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=idblock.bin of=/dev/''&amp;lt;mmc/sd&amp;gt;'' seek=64&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;dd if=uboot.img of=/dev/''&amp;lt;mmc/sd&amp;gt;''1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== BSP Image Layout ====&lt;br /&gt;
&lt;br /&gt;
[[Category:Quartz64]][[Category:Rockchip RK3566]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20158</id>
		<title>Quartz64 UEFI with U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20158"/>
		<updated>2023-07-28T23:32:54Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Flashing a Distro Installer */ Add notes about Ubuntu-Server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|'''Note:''' This article is a work-in-progress}}&lt;br /&gt;
&lt;br /&gt;
This article is a guide to installing an [https://en.wikipedia.org/wiki/Das_U-Boot U-Boot] capable of booting generic aarch64 EFI images on a [[Quartz64]] or [[SOQuartz]] board.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' U-Boot on Quartz64 Model A currently doesn't appear to be able to always load things from USB mass storage devices depending on the device, you'll have to get creative with your installer medium.}}&lt;br /&gt;
&lt;br /&gt;
We need two to three storage mediums:&lt;br /&gt;
&lt;br /&gt;
* an SD card or eMMC module for U-Boot (advanced users may use the SPI flash on Model B)&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for our installed system&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for the installer&lt;br /&gt;
&lt;br /&gt;
In practice, you can usually combine some of these into one, e.g. if you start your partitions at 16MiB you can have u-boot and your installed system reside on the same storage medium.&lt;br /&gt;
&lt;br /&gt;
A good way to go about things is to put U-Boot on an SD card, and install the system on eMMC or NVMe, and boot the installer from an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
== Flashing U-Boot ==&lt;br /&gt;
&lt;br /&gt;
The first step is to flash U-Boot to our first device, either an SD card or an eMMC module. U-Boot here is the system's firmware, similar to the BIOS in an x86 PC.&lt;br /&gt;
&lt;br /&gt;
You'll need a Linux, *BSD or macOS computer (any CPU architecture is fine), and a GitHub account to download Kwiboo's u-boot-build pipeline outputs with.&lt;br /&gt;
&lt;br /&gt;
Download the U-Boot build for your specific device from the latest RK356x Actions run of [https://github.com/Kwiboo/u-boot-build/actions Kwiboo's u-boot-build workflow repository]. Make sure you are downloading the correct build for your device, e.g. '''don't''' use &amp;lt;code&amp;gt;rk3566-quartz64-a&amp;lt;/code&amp;gt; on a SOQuartz!&lt;br /&gt;
&lt;br /&gt;
Extract the &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; from the zip archive.&lt;br /&gt;
&lt;br /&gt;
Next, insert the microSD card into your microSD reader, or attach the eMMC module to your eMMC to USB adapter and plug it in. Identify which &amp;lt;code&amp;gt;/dev/&amp;lt;/code&amp;gt; device node it showed up at, and ideally wipe any filesystems and partitions on the device. From now on, we'll refer to it as &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To flash U-Boot, write &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; to byte 32768 of &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;. You can do this with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=u-boot-rockchip.bin of=&amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt; bs=32k seek=1 conv=fsync&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' Double-check you have the right device before doing this! You don't want to flash this to one of your computer's actual disks.}}&lt;br /&gt;
&lt;br /&gt;
== Flashing a Distro Installer ==&lt;br /&gt;
&lt;br /&gt;
Assuming you want to boot an installer rather than some image, you'll want to flash a distribution's aarch64 EFI installation ISO to e.g. an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
Some examples for installers that fit this criteria:&lt;br /&gt;
&lt;br /&gt;
* '''Fedora Server:''' https://fedoraproject.org/server/download/ (Choose ''For ARM® aarch64 systems, DVD ISO'')&lt;br /&gt;
* '''Fedora Workstation:''' https://fedoraproject.org/workstation/download/ (Choose ''For ARM® aarch64 systems, Live ISO'')&lt;br /&gt;
* '''openSUSE Tumbleweed:''' https://get.opensuse.org/tumbleweed/ (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
** Tested on 2023-07-28 by [[User:CounterPillow]] on a Quartz64 Model B, installer booted from USB3 thumb drive. Installer has about 1 minute of showing a black screen until things appear on HDMI.&lt;br /&gt;
** Note: Installer overwrites U-Boot if installing on the U-Boot medium even with offset! Flashing U-Boot again after installation works.&lt;br /&gt;
** Note: Some concerning panfrost clk errors in dmesg and KDE Plasma Desktop defaults to X11 for now, not a good user experience&lt;br /&gt;
* '''openSUSE MicroOS:''' https://get.opensuse.org/microos/#download (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
* '''Ubuntu Server:''' https://ubuntu.com/download/server/arm (Choose either the latest LTS or the latest non-LTS)&lt;br /&gt;
** Tested on 2023-07-29 by [[User:CounterPillow]] on a Quartz64 Model B, Ubuntu 22.04.2 LTS, installer booted from USB3 thumb drive. Only installer boot tested, no installation performed.&lt;br /&gt;
** Note: You '''need''' to choose the HWE kernel in GRUB over Serial Console for 22.04 LTS, otherwise the installer won't boot&lt;br /&gt;
** Note: Does not allow setting an offset for partitions, so can't use the same medium for both u-boot and root&lt;br /&gt;
** Note: Some concerning panfrost clk errors in dmesg while installer boots, unsure if GPU will be happy&lt;br /&gt;
&lt;br /&gt;
If you're going to use something else, then please make sure the distribution image you're going to use has a not too ancient kernel; check [[Quartz64 Development]] for which kernel versions bring which drivers. Also make sure the distribution's kernel has the right drivers enabled in its kernel configuration.&lt;br /&gt;
&lt;br /&gt;
To prepare the installation medium, simply use your preferred image flashing utility to write the ISO to e.g. a USB thumb drive. You can also use &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; for this.&lt;br /&gt;
&lt;br /&gt;
== Performing the Installation ==&lt;br /&gt;
&lt;br /&gt;
Attach your two to three storage mediums (U-Boot medium, installer medium and target drive) and attach power. If everything went well, you should be booted into the distribution's guided installer. If everything did not go well, use a serial adapter like the PINE64 Woodpecker to get serial output from U-Boot at 1500000 bauds.&lt;br /&gt;
&lt;br /&gt;
Complete the installation. If you want to use your U-Boot medium as your target drive here, make sure to manually partition and leave 16MiB or more space at the start of the drive (block 32768), so that U-Boot is not overwritten.&lt;br /&gt;
&lt;br /&gt;
After the installation completes, power off the board, remove the installer medium, and power it back on. You should now be booted into your freshly installed system.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guide]] [[Category:Quartz64]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20157</id>
		<title>Quartz64 UEFI with U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20157"/>
		<updated>2023-07-28T23:08:11Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Flashing a Distro Installer */ Add some openSUSE notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|'''Note:''' This article is a work-in-progress}}&lt;br /&gt;
&lt;br /&gt;
This article is a guide to installing an [https://en.wikipedia.org/wiki/Das_U-Boot U-Boot] capable of booting generic aarch64 EFI images on a [[Quartz64]] or [[SOQuartz]] board.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' U-Boot on Quartz64 Model A currently doesn't appear to be able to always load things from USB mass storage devices depending on the device, you'll have to get creative with your installer medium.}}&lt;br /&gt;
&lt;br /&gt;
We need two to three storage mediums:&lt;br /&gt;
&lt;br /&gt;
* an SD card or eMMC module for U-Boot (advanced users may use the SPI flash on Model B)&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for our installed system&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for the installer&lt;br /&gt;
&lt;br /&gt;
In practice, you can usually combine some of these into one, e.g. if you start your partitions at 16MiB you can have u-boot and your installed system reside on the same storage medium.&lt;br /&gt;
&lt;br /&gt;
A good way to go about things is to put U-Boot on an SD card, and install the system on eMMC or NVMe, and boot the installer from an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
== Flashing U-Boot ==&lt;br /&gt;
&lt;br /&gt;
The first step is to flash U-Boot to our first device, either an SD card or an eMMC module. U-Boot here is the system's firmware, similar to the BIOS in an x86 PC.&lt;br /&gt;
&lt;br /&gt;
You'll need a Linux, *BSD or macOS computer (any CPU architecture is fine), and a GitHub account to download Kwiboo's u-boot-build pipeline outputs with.&lt;br /&gt;
&lt;br /&gt;
Download the U-Boot build for your specific device from the latest RK356x Actions run of [https://github.com/Kwiboo/u-boot-build/actions Kwiboo's u-boot-build workflow repository]. Make sure you are downloading the correct build for your device, e.g. '''don't''' use &amp;lt;code&amp;gt;rk3566-quartz64-a&amp;lt;/code&amp;gt; on a SOQuartz!&lt;br /&gt;
&lt;br /&gt;
Extract the &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; from the zip archive.&lt;br /&gt;
&lt;br /&gt;
Next, insert the microSD card into your microSD reader, or attach the eMMC module to your eMMC to USB adapter and plug it in. Identify which &amp;lt;code&amp;gt;/dev/&amp;lt;/code&amp;gt; device node it showed up at, and ideally wipe any filesystems and partitions on the device. From now on, we'll refer to it as &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To flash U-Boot, write &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; to byte 32768 of &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;. You can do this with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=u-boot-rockchip.bin of=&amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt; bs=32k seek=1 conv=fsync&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' Double-check you have the right device before doing this! You don't want to flash this to one of your computer's actual disks.}}&lt;br /&gt;
&lt;br /&gt;
== Flashing a Distro Installer ==&lt;br /&gt;
&lt;br /&gt;
Assuming you want to boot an installer rather than some image, you'll want to flash a distribution's aarch64 EFI installation ISO to e.g. an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
Some examples for installers that fit this criteria:&lt;br /&gt;
&lt;br /&gt;
* '''Fedora Server:''' https://fedoraproject.org/server/download/ (Choose ''For ARM® aarch64 systems, DVD ISO'')&lt;br /&gt;
* '''Fedora Workstation:''' https://fedoraproject.org/workstation/download/ (Choose ''For ARM® aarch64 systems, Live ISO'')&lt;br /&gt;
* '''openSUSE Tumbleweed:''' https://get.opensuse.org/tumbleweed/ (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
** Tested on 2023-07-28 by [[User:CounterPillow]] on a Quartz64 Model B, installer booted from USB3 thumb drive. Installer has about 1 minute of showing a black screen until things appear on HDMI.&lt;br /&gt;
** Note: Installer overwrites U-Boot if installing on the U-Boot medium even with offset! Flashing U-Boot again after installation works.&lt;br /&gt;
** Note: Some concerning panfrost clk errors in dmesg and KDE Plasma Desktop defaults to X11 for now, not a good user experience&lt;br /&gt;
* '''openSUSE MicroOS:''' https://get.opensuse.org/microos/#download (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
* '''Ubuntu Server:''' https://ubuntu.com/download/server/arm (Choose either the latest LTS or the latest non-LTS)&lt;br /&gt;
&lt;br /&gt;
If you're going to use something else, then please make sure the distribution image you're going to use has a not too ancient kernel; check [[Quartz64 Development]] for which kernel versions bring which drivers. Also make sure the distribution's kernel has the right drivers enabled in its kernel configuration.&lt;br /&gt;
&lt;br /&gt;
To prepare the installation medium, simply use your preferred image flashing utility to write the ISO to e.g. a USB thumb drive. You can also use &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; for this.&lt;br /&gt;
&lt;br /&gt;
== Performing the Installation ==&lt;br /&gt;
&lt;br /&gt;
Attach your two to three storage mediums (U-Boot medium, installer medium and target drive) and attach power. If everything went well, you should be booted into the distribution's guided installer. If everything did not go well, use a serial adapter like the PINE64 Woodpecker to get serial output from U-Boot at 1500000 bauds.&lt;br /&gt;
&lt;br /&gt;
Complete the installation. If you want to use your U-Boot medium as your target drive here, make sure to manually partition and leave 16MiB or more space at the start of the drive (block 32768), so that U-Boot is not overwritten.&lt;br /&gt;
&lt;br /&gt;
After the installation completes, power off the board, remove the installer medium, and power it back on. You should now be booted into your freshly installed system.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guide]] [[Category:Quartz64]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20156</id>
		<title>Quartz64 UEFI with U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20156"/>
		<updated>2023-07-28T22:42:36Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: /* Flashing a Distro Installer */ Add which installer I've tested so far and how&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|'''Note:''' This article is a work-in-progress}}&lt;br /&gt;
&lt;br /&gt;
This article is a guide to installing an [https://en.wikipedia.org/wiki/Das_U-Boot U-Boot] capable of booting generic aarch64 EFI images on a [[Quartz64]] or [[SOQuartz]] board.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' U-Boot on Quartz64 Model A currently doesn't appear to be able to always load things from USB mass storage devices depending on the device, you'll have to get creative with your installer medium.}}&lt;br /&gt;
&lt;br /&gt;
We need two to three storage mediums:&lt;br /&gt;
&lt;br /&gt;
* an SD card or eMMC module for U-Boot (advanced users may use the SPI flash on Model B)&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for our installed system&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for the installer&lt;br /&gt;
&lt;br /&gt;
In practice, you can usually combine some of these into one, e.g. if you start your partitions at 16MiB you can have u-boot and your installed system reside on the same storage medium.&lt;br /&gt;
&lt;br /&gt;
A good way to go about things is to put U-Boot on an SD card, and install the system on eMMC or NVMe, and boot the installer from an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
== Flashing U-Boot ==&lt;br /&gt;
&lt;br /&gt;
The first step is to flash U-Boot to our first device, either an SD card or an eMMC module. U-Boot here is the system's firmware, similar to the BIOS in an x86 PC.&lt;br /&gt;
&lt;br /&gt;
You'll need a Linux, *BSD or macOS computer (any CPU architecture is fine), and a GitHub account to download Kwiboo's u-boot-build pipeline outputs with.&lt;br /&gt;
&lt;br /&gt;
Download the U-Boot build for your specific device from the latest RK356x Actions run of [https://github.com/Kwiboo/u-boot-build/actions Kwiboo's u-boot-build workflow repository]. Make sure you are downloading the correct build for your device, e.g. '''don't''' use &amp;lt;code&amp;gt;rk3566-quartz64-a&amp;lt;/code&amp;gt; on a SOQuartz!&lt;br /&gt;
&lt;br /&gt;
Extract the &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; from the zip archive.&lt;br /&gt;
&lt;br /&gt;
Next, insert the microSD card into your microSD reader, or attach the eMMC module to your eMMC to USB adapter and plug it in. Identify which &amp;lt;code&amp;gt;/dev/&amp;lt;/code&amp;gt; device node it showed up at, and ideally wipe any filesystems and partitions on the device. From now on, we'll refer to it as &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To flash U-Boot, write &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; to byte 32768 of &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;. You can do this with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=u-boot-rockchip.bin of=&amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt; bs=32k seek=1 conv=fsync&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' Double-check you have the right device before doing this! You don't want to flash this to one of your computer's actual disks.}}&lt;br /&gt;
&lt;br /&gt;
== Flashing a Distro Installer ==&lt;br /&gt;
&lt;br /&gt;
Assuming you want to boot an installer rather than some image, you'll want to flash a distribution's aarch64 EFI installation ISO to e.g. an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
Some examples for installers that fit this criteria:&lt;br /&gt;
&lt;br /&gt;
* '''Fedora Server:''' https://fedoraproject.org/server/download/ (Choose ''For ARM® aarch64 systems, DVD ISO'')&lt;br /&gt;
* '''Fedora Workstation:''' https://fedoraproject.org/workstation/download/ (Choose ''For ARM® aarch64 systems, Live ISO'')&lt;br /&gt;
* '''openSUSE Tumbleweed:''' https://get.opensuse.org/tumbleweed/ (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
** Tested on 2023-07-28 by [[User:CounterPillow]] on a Quartz64 Model B, installer booted from USB3 thumb drive. Installer has about 1 minute of showing a black screen until things appear on HDMI.&lt;br /&gt;
* '''openSUSE MicroOS:''' https://get.opensuse.org/microos/#download (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
* '''Ubuntu Server:''' https://ubuntu.com/download/server/arm (Choose either the latest LTS or the latest non-LTS)&lt;br /&gt;
&lt;br /&gt;
If you're going to use something else, then please make sure the distribution image you're going to use has a not too ancient kernel; check [[Quartz64 Development]] for which kernel versions bring which drivers. Also make sure the distribution's kernel has the right drivers enabled in its kernel configuration.&lt;br /&gt;
&lt;br /&gt;
To prepare the installation medium, simply use your preferred image flashing utility to write the ISO to e.g. a USB thumb drive. You can also use &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; for this.&lt;br /&gt;
&lt;br /&gt;
== Performing the Installation ==&lt;br /&gt;
&lt;br /&gt;
Attach your two to three storage mediums (U-Boot medium, installer medium and target drive) and attach power. If everything went well, you should be booted into the distribution's guided installer. If everything did not go well, use a serial adapter like the PINE64 Woodpecker to get serial output from U-Boot at 1500000 bauds.&lt;br /&gt;
&lt;br /&gt;
Complete the installation. If you want to use your U-Boot medium as your target drive here, make sure to manually partition and leave 16MiB or more space at the start of the drive (block 32768), so that U-Boot is not overwritten.&lt;br /&gt;
&lt;br /&gt;
After the installation completes, power off the board, remove the installer medium, and power it back on. You should now be booted into your freshly installed system.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guide]] [[Category:Quartz64]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
	<entry>
		<id>https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20155</id>
		<title>Quartz64 UEFI with U-Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.pine64.org/index.php?title=Quartz64_UEFI_with_U-Boot&amp;diff=20155"/>
		<updated>2023-07-28T22:37:43Z</updated>

		<summary type="html">&lt;p&gt;CounterPillow: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|'''Note:''' This article is a work-in-progress}}&lt;br /&gt;
&lt;br /&gt;
This article is a guide to installing an [https://en.wikipedia.org/wiki/Das_U-Boot U-Boot] capable of booting generic aarch64 EFI images on a [[Quartz64]] or [[SOQuartz]] board.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' U-Boot on Quartz64 Model A currently doesn't appear to be able to always load things from USB mass storage devices depending on the device, you'll have to get creative with your installer medium.}}&lt;br /&gt;
&lt;br /&gt;
We need two to three storage mediums:&lt;br /&gt;
&lt;br /&gt;
* an SD card or eMMC module for U-Boot (advanced users may use the SPI flash on Model B)&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for our installed system&lt;br /&gt;
* an SD card, eMMC module, USB thumb drive or NVMe drive for the installer&lt;br /&gt;
&lt;br /&gt;
In practice, you can usually combine some of these into one, e.g. if you start your partitions at 16MiB you can have u-boot and your installed system reside on the same storage medium.&lt;br /&gt;
&lt;br /&gt;
A good way to go about things is to put U-Boot on an SD card, and install the system on eMMC or NVMe, and boot the installer from an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
== Flashing U-Boot ==&lt;br /&gt;
&lt;br /&gt;
The first step is to flash U-Boot to our first device, either an SD card or an eMMC module. U-Boot here is the system's firmware, similar to the BIOS in an x86 PC.&lt;br /&gt;
&lt;br /&gt;
You'll need a Linux, *BSD or macOS computer (any CPU architecture is fine), and a GitHub account to download Kwiboo's u-boot-build pipeline outputs with.&lt;br /&gt;
&lt;br /&gt;
Download the U-Boot build for your specific device from the latest RK356x Actions run of [https://github.com/Kwiboo/u-boot-build/actions Kwiboo's u-boot-build workflow repository]. Make sure you are downloading the correct build for your device, e.g. '''don't''' use &amp;lt;code&amp;gt;rk3566-quartz64-a&amp;lt;/code&amp;gt; on a SOQuartz!&lt;br /&gt;
&lt;br /&gt;
Extract the &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; from the zip archive.&lt;br /&gt;
&lt;br /&gt;
Next, insert the microSD card into your microSD reader, or attach the eMMC module to your eMMC to USB adapter and plug it in. Identify which &amp;lt;code&amp;gt;/dev/&amp;lt;/code&amp;gt; device node it showed up at, and ideally wipe any filesystems and partitions on the device. From now on, we'll refer to it as &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To flash U-Boot, write &amp;lt;code&amp;gt;u-boot-rockchip.bin&amp;lt;/code&amp;gt; to byte 32768 of &amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt;. You can do this with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=u-boot-rockchip.bin of=&amp;lt;var&amp;gt;/dev/sdX&amp;lt;/var&amp;gt; bs=32k seek=1 conv=fsync&lt;br /&gt;
&lt;br /&gt;
{{note|'''Note:''' Double-check you have the right device before doing this! You don't want to flash this to one of your computer's actual disks.}}&lt;br /&gt;
&lt;br /&gt;
== Flashing a Distro Installer ==&lt;br /&gt;
&lt;br /&gt;
Assuming you want to boot an installer rather than some image, you'll want to flash a distribution's aarch64 EFI installation ISO to e.g. an USB thumb drive.&lt;br /&gt;
&lt;br /&gt;
Some examples for installers that fit this criteria:&lt;br /&gt;
&lt;br /&gt;
* '''Fedora Server:''' https://fedoraproject.org/server/download/ (Choose ''For ARM® aarch64 systems, DVD ISO'')&lt;br /&gt;
* '''Fedora Workstation:''' https://fedoraproject.org/workstation/download/ (Choose ''For ARM® aarch64 systems, Live ISO'')&lt;br /&gt;
* '''openSUSE Tumbleweed:''' https://get.opensuse.org/tumbleweed/ (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
* '''openSUSE MicroOS:''' https://get.opensuse.org/microos/#download (Choose ''UEFI Arm 64-bit servers, desktops, laptops and boards (aarch64)'')&lt;br /&gt;
* '''Ubuntu Server:''' https://ubuntu.com/download/server/arm (Choose either the latest LTS or the latest non-LTS)&lt;br /&gt;
&lt;br /&gt;
If you're going to use something else, then please make sure the distribution image you're going to use has a not too ancient kernel; check [[Quartz64 Development]] for which kernel versions bring which drivers. Also make sure the distribution's kernel has the right drivers enabled in its kernel configuration.&lt;br /&gt;
&lt;br /&gt;
To prepare the installation medium, simply use your preferred image flashing utility to write the ISO to e.g. a USB thumb drive. You can also use &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; for this.&lt;br /&gt;
&lt;br /&gt;
== Performing the Installation ==&lt;br /&gt;
&lt;br /&gt;
Attach your two to three storage mediums (U-Boot medium, installer medium and target drive) and attach power. If everything went well, you should be booted into the distribution's guided installer. If everything did not go well, use a serial adapter like the PINE64 Woodpecker to get serial output from U-Boot at 1500000 bauds.&lt;br /&gt;
&lt;br /&gt;
Complete the installation. If you want to use your U-Boot medium as your target drive here, make sure to manually partition and leave 16MiB or more space at the start of the drive (block 32768), so that U-Boot is not overwritten.&lt;br /&gt;
&lt;br /&gt;
After the installation completes, power off the board, remove the installer medium, and power it back on. You should now be booted into your freshly installed system.&lt;br /&gt;
&lt;br /&gt;
[[Category:Guide]] [[Category:Quartz64]] [[Category:Quartz64 Guides]]&lt;/div&gt;</summary>
		<author><name>CounterPillow</name></author>
	</entry>
</feed>