<?xml version="1.0"?>
<rss version="2.0"><channel><title>Reviews, Tutorials, Hardware hacks Latest Topics</title><link>https://forum.armbian.com/forum/40-reviews-tutorials-hardware-hacks/</link><description>Reviews, Tutorials, Hardware hacks Latest Topics</description><language>en</language><item><title>Repository for v4l2request hardware video decoding (rockchip, allwinner)</title><link>https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/</link><description><![CDATA[<p>
	Hello, this quick tutorial is to introduce an experimental Debian and Ubuntu APT repository to install <strong>ffmpeg</strong> compiled with <strong>v4l2request</strong> and <strong>v4l2drmprime</strong> patches developed by Linux kernel, LIbreELEC and Kodi folks to allow hardware video decoding on stateless decoders like those implemented in Rockchip and Allwinner SoCs for <strong>h.264</strong>, <strong>h.265</strong>, <strong>vp8</strong> and <strong>vp9</strong> codecs.
</p>

<p>
	 
</p>

<p>
	The repository introduces a new <strong>ffmpeg</strong> package that integrates and substitues the base ffmpeg package and its related packages.
</p>

<p>
	 
</p>

<p>
	<strong>Preconditions:</strong>
</p>

<ul>
	<li>
		Mainline kernel 6.1 or more recent
	</li>
	<li>
		<strong>armhf</strong> or <strong>arm64</strong> architecture
	</li>
	<li>
		Supported distributions:
		<ul>
			<li>
				<strong>Debian 12 - Bookworm </strong>
			</li>
			<li>
				<strong>Debian 13 - Trixie</strong>
			</li>
			<li>
				<strong>Ubuntu 22.04 - Jammy</strong>
			</li>
			<li>
				<strong>Ubuntu 24.04 - Noble</strong>
			</li>
		</ul>
	</li>
	<li>
		<strong>Rockchip </strong>and <strong>Allwinner</strong> have already been tested, but this should work on other platforms with stateless decoders supported in kernel
	</li>
</ul>

<p>
	 
</p>

<p>
	<strong>APT REPOSITORY SETUP</strong>
</p>

<p>
	To install the repository, just copy and paste the lines in a terminal:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="pln">$ sudo wget http</span><span class="pun">:</span><span class="com">//apt.undo.it:7242/apt.undo.it.asc -O /etc/apt/trusted.gpg.d/apt.undo.it.asc</span><span class="pln">
$ </span><span class="pun">.</span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">os</span><span class="pun">-</span><span class="pln">release </span><span class="pun">&amp;&amp;</span><span class="pln"> echo </span><span class="str">"deb http://apt.undo.it:7242 $VERSION_CODENAME main"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> sudo tee </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apt</span><span class="pun">/</span><span class="pln">sources</span><span class="pun">.</span><span class="typ">list</span><span class="pun">.</span><span class="pln">d</span><span class="pun">/</span><span class="pln">apt</span><span class="pun">.</span><span class="pln">undo</span><span class="pun">.</span><span class="pln">it</span><span class="pun">.</span><span class="typ">list</span><span class="pln">
$ echo </span><span class="pun">-</span><span class="pln">e </span><span class="str">"Package: *\nPin: release o=apt.undo.it\nPin-Priority: 600"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> sudo tee </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apt</span><span class="pun">/</span><span class="pln">preferences</span><span class="pun">.</span><span class="pln">d</span><span class="pun">/</span><span class="pln">apt</span><span class="pun">-</span><span class="pln">undo</span><span class="pun">-</span><span class="pln">it</span></pre>

<p>
	 
</p>

<p>
	<strong>INSTALL FFMPEG AND MPV PACKAGES</strong>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="pln">$ sudo apt update
$ sudo apt install ffmpeg mpv</span></pre>

<p>
	 
</p>

<p>
	<strong>SETUP MPV CONFIG FILE</strong>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="pln">$ sudo mkdir </span><span class="pun">-</span><span class="pln">p </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">mpv
$ echo </span><span class="pun">-</span><span class="pln">e </span><span class="str">"hwdec=drm\ndrm-drmprime-video-plane=primary\ndrm-draw-plane=overlay"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> sudo tee </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">mpv</span><span class="pun">/</span><span class="pln">mpv</span><span class="pun">.</span><span class="pln">conf</span></pre>

<p>
	 
</p>

<p>
	You can now play your videos using <strong>mpv</strong> and they should run with hardware decoding if supported, either in <strong>virtual terminals</strong> or in <strong>X11/Wayland windows</strong>!
</p>

<p>
	<strong>Enjoy!</strong>
</p>

<p>
	 
</p>

<p>
	<strong>Notes:</strong>
</p>

<ul>
	<li>
		your mileage may vary a lot: the more recent is the kernel version, the better is support (you may need <strong>edge</strong> kernel)
	</li>
	<li>
		<strong>bug:</strong> when rendered in X11/Wayland window, video may show scattered tiles during frames
	</li>
	<li>
		<strong>bug:</strong> Lima driver (Mali 400/450) shows a red/pink tint when video is played in X11/Wayland (see <a href="https://github.com/mpv-player/mpv/issues/12968" rel="external nofollow">https://github.com/mpv-player/mpv/issues/12968)</a> (workaround below: <a href="https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/?do=findComment&amp;comment=177968" rel="">https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/?do=findComment&amp;comment=177968</a>)
	</li>
	<li>
		you may want to add <strong>--<abbr title="Graphic processing unit (3D acceleration)"><abbr title="Graphic processing unit (3D acceleration)">gpu</abbr></abbr>-hwdec-interop=drmprime-overlay</strong> to the mpv command line if used in pure virtual terminal (no X, no Wayland) to use direct-to-overlay output
	</li>
	<li>
		<abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">Panfrost</abbr></abbr> driver should work flawlessy
	</li>
	<li>
		10 bit HEVC are generally supported on all Rockchip devices (rk322x, rk3288, rk33x8, rk3399), but Allwinner H3 have no hardware support for that
	</li>
</ul>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">32449</guid><pubDate>Sun, 10 Dec 2023 22:29:27 +0000</pubDate></item><item><title>Full root filesystem&#xA0;encryption&#xA0;on an Armbian system (NEW, replaces 2017 tutorial on this topic)</title><link>https://forum.armbian.com/topic/15618-full-root-filesystem%C2%A0encryption%C2%A0on-an-armbian-system-new-replaces-2017-tutorial-on-this-topic/</link><description><![CDATA[<p style="text-align:center;">
	<strong><span style="font-size:22px;">Full root filesystem encryption on an Armbian system</span></strong>
</p>

<p style="text-align:center;">
	<strong><span style="font-size:18px;"><span style="color:rgb(231,76,60);">(new, fully rewritten, replaces my <a href="https://forum.armbian.com/topic/4174-full-root-filesystem-encryption-on-an-armbianorange-pi-pc-2-system" rel="">earlier tutorial</a> on this topic)</span></span></strong>
</p>

<p style="text-align:center;">
	 
</p>

<p style="text-align:center;">
	<span style="font-size:14px;"><strong>MMGen (https://github.com/mmgen)</strong></span>
</p>

<p>
	 
</p>

<p>
	This tutorial provides detailed, step-by-step instructions for setting up full root filesystem encryption on an Armbian system.  The disk can be unlocked remotely via SSH or the serial console, permitting unattended bootup.
</p>

<p>
	 
</p>

<p>
	An automated script that performs the same steps, saving you much time and effort, can be found at <a href="https://github.com/mmgen/mmgen-geek-tools" rel="external nofollow">https://github.com/mmgen/mmgen-geek-tools</a>
</p>

<p>
	 
</p>

<p>
	Note that unlike my earlier tutorial <strong>all steps are performed within a running Armbian system.</strong>
</p>

<p>
	 
</p>

<p>
	The tutorial is known to work with the following board/image combinations (plus possibly others—follow the comments in this thread for additional info):
</p>

<p>
	 
</p>

<table align="left" border="1" cellpadding="1" cellspacing="1" style="width:500px;">
	<tbody>
		<tr>
			<td>
				 <span style="color:rgb(52,152,219);"><strong>Orange Pi PC2</strong></span>
			</td>
			<td>
				 Debian Buster mainline / Ubuntu Focal legacy
			</td>
		</tr>
		<tr>
			<td>
				 <span style="color:rgb(52,152,219);"><strong>RockPi 4</strong></span>
			</td>
			<td>
				 Debian Buster  mainline / Ubuntu Focal legacy
			</td>
		</tr>
		<tr>
			<td>
				 RockPro 64
			</td>
			<td>
				 Ubuntu Focal mainline
			</td>
		</tr>
		<tr>
			<td>
				 Odroid HC4
			</td>
			<td>
				 Debian Buster mainline / Ubuntu Focal mainline
			</td>
		</tr>
	</tbody>
</table>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<table border="1" cellpadding="1" cellspacing="1" style="width:500px;">
	<tbody>
		<tr>
			<td>
				Pinebook Pro
			</td>
			<td>
				Debian Bookworm current minimal
			</td>
		</tr>
		<tr>
			<td>
				Rock Pi 4A+
			</td>
			<td>
				Unknown
			</td>
		</tr>
		<tr>
			<td>
				Pine A64
			</td>
			<td>
				Unknown
			</td>
		</tr>
		<tr>
			<td>
				<span style="color:rgb(52,152,219);"><strong>Orange Pi 5</strong></span>
			</td>
			<td>
				Debian Bookworm mainline / Ubuntu Noble mainline minimal
			</td>
		</tr>
		<tr>
			<td>
				<span style="color:rgb(52,152,219);"><strong>Rock 5B</strong></span>
			</td>
			<td>
				Debian Trixie mainline
			</td>
		</tr>
	</tbody>
</table>

<table border="1" cellpadding="1" cellspacing="1" style="width:500px;">
	<tbody>
		<tr>
			<td>
				<span style="color:rgb(52,152,219);"><strong>Nano Pi M6</strong></span>
			</td>
			<td>
				Noble mainline minimal / Noble Gnome desktop vendor
			</td>
		</tr>
		<tr>
			<td>
				Raspberry Pi 5**
			</td>
			<td>
				Debian Trixie minimal <strong><span style="color:rgb(243,156,18);">(see note)</span></strong>
			</td>
		</tr>
	</tbody>
</table>

<table border="1" cellpadding="1" cellspacing="1" style="width:500px;">
	<tbody>
		<tr>
			<td>
				<span style="color:rgb(52,152,219);"><strong>Banana Pi F3</strong></span>
			</td>
			<td>
				Ubuntu Noble vendor minimal
			</td>
		</tr>
	</tbody>
</table>

<p>
	<em>* Boards/images in <span style="color:rgb(52,152,219);"><strong>bold blue</strong></span> type are personally tested by the author. Others may have issues or require additional steps provided by users below.</em>
</p>

<p>
	<em>** For instructions on how to adapt this tutorial for the <strong><span style="color:rgb(243,156,18);">Raspberry Pi</span>,</strong> see <a href="https://forum.armbian.com/topic/15618-full-root-filesystem%C2%A0encryption%C2%A0on-an-armbian-system-new-replaces-2017-tutorial-on-this-topic/#findComment-231744" rel="">here</a> (instructions are provided by a third party and are untested by the author).</em>
</p>

<p>
	 
</p>

<p>
	You may have success with other boards/images too. If so, please post the details below (or open an issue in the mmgen-geek-tools Github repository), and I’ll add your board to the list.
</p>

<p>
	 
</p>

<p>
	<strong>Requirements:</strong>
</p>

<ul>
	<li>
		A <abbr title="System On a Chip"><abbr title="System On a Chip">SoC</abbr></abbr> with a running, upgradeable and Internet-connected Armbian system
	</li>
	<li>
		A blank Micro-SD card and USB card reader, or, alternatively, an <abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr> installed on the board
	</li>
	<li>
		The ability to edit text files and do simple administrative tasks on the Linux command line
	</li>
</ul>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">Step 1 - Preliminaries</span></strong>
</p>

<p>
	 
</p>

<p>
	All steps in this tutorial are performed as root user on a running Armbian system (the “host”).
</p>

<p>
	 
</p>

<p>
	The encrypted system (the “target”) will be created on a blank micro-SD card (the “target device”).
</p>

<p>
	 
</p>

<p>
	If the board has an <abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr>, it may be used as the target device instead of an SD card. Depending on your platform, you may need to run “armbian-install” and select “Install/Update the bootloader on MTD Flash” (preferable) or “Install/Update the bootloader on <abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr>” to enable booting from the <abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr>.
</p>

<p>
	 
</p>

<p>
	Architecture of host and target (e.g. 64-bit or 32-bit ARM) must be the same.
</p>

<p>
	 
</p>

<p>
	For best results, the host and target hardware should also be identical or similar.  Building on a host with more memory than the target, for example, may lead to disk unlocking failure on the target.
</p>

<p>
	 
</p>

<p>
	If you’re building the target system for the currently running board and with the currently running image, which is the recommended approach, the two preceding points will be a non-issue.
</p>

<p>
	 
</p>

<p>
	Packages will be installed using APT, so the host machine must be Internet-connected and its clock correctly set.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">Step 2 - Upgrade your system and install the cryptsetup package</span></strong>
</p>

<p>
	 
</p>

<pre class="ipsCode"># apt update &amp;&amp; apt upgrade
# apt install cryptsetup</pre>

<p>
	 
</p>

<p>
	<span style="font-size:16px;"><strong>Step 3 - Get and unpack the latest Armbian image for your board</strong></span>
</p>

<p>
	 
</p>

<p>
	Create your build directory:
</p>

<pre class="ipsCode"># mkdir armbenc-build &amp;&amp; cd armbenc-build
</pre>

<p>
	 
</p>

<p>
	Download the Armbian image of your choice for your board, place it in this directory and unpack:
</p>

<pre class="ipsCode"># xz -dv *.img.xz</pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">Step 4 - Create mount directories and set up the loop mount</span></strong>
</p>

<p>
	 
</p>

<p>
	Create the mount directories:
</p>

<pre class="ipsCode"># mkdir -p mnt boot root</pre>

<p>
	 
</p>

<p>
	Determine your first free loop device:
</p>

<pre class="ipsCode"># losetup -f
</pre>

<p>
	 
</p>

<p>
	Associate the image file with the loop device name displayed by the previous command.  This will be '/dev/loop0' in most cases, but if your output was different, substitute that for '/dev/loop0' in the following steps.
</p>

<pre class="ipsCode"># losetup -P /dev/loop0 *.img</pre>

<p>
	 
</p>

<p>
	Examine the disk image using fdisk on the loop device:
</p>

<pre class="ipsCode"># fdisk -l /dev/loop0
</pre>

<p>
	 
</p>

<p>
	The output should look something like this:
</p>

<pre class="ipsCode">Device        Start      End  Sectors  Size Type
/dev/loop0p1  32768 61931519 61898752 29.5G Linux filesystem
</pre>

<p>
	 
</p>

<p>
	Make a note of the start sector (32768 in this case).  You’ll need this value in the steps below.
</p>

<p>
	 
</p>

<p>
	Now mount the loop device:
</p>

<pre class="ipsCode"># mount /dev/loop0p1 mnt
</pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">Step 5 - Copy the boot loader to the target device</span></strong>
</p>

<p>
	 
</p>

<p>
	If applicable, insert a blank micro-SD card and card reader into a USB port.
</p>

<p>
	 
</p>

<p>
	Determine the target device name using 'dmesg' or 'lsblk'.  We’ll assume it to be '/dev/sda', since that’s the most likely case.  If your device name is different, substitute it for '/dev/sda' in the the following steps.  For an <abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr>, the device name will be something like '/dev/mmcblk1'.
</p>

<p>
	 
</p>

<p>
	<strong><span style="color:rgb(231,76,60);">WARNING:</span></strong> if '/dev/sda' refers to some other storage device, running the following commands unchanged <strong>will destroy data on that device, </strong>so always remember to substitute the correct device name!!!  The best way to eliminate this danger is to disconnect all unused storage devices on the board before proceeding further.
</p>

<p>
	 
</p>

<p>
	Determine whether your image has a GPT partition table or a legacy MBR (i.e. DOS) one. This can be done by running <strong>fdisk -l</strong> on the image file and examining the “Disklabel type” entry. For GPT images, also make note of the value in the “Type” column. On ARM devices, it’s likely to be “Linux root (ARM-64)”, for example. You’ll need this information soon when partitioning the target device:
</p>

<pre class="ipsCode"># fdisk -l *.img</pre>

<p>
	 
</p>

<p>
	Copy the image’s boot loader to the target device. With MBR-partitioned images, we use the Start sector value from Step 4 as the argument for 'count', while with GPT ones we skip the first 64 sectors and correspondingly subtract 64 from 'count', reducing the number of copied sectors by 64:
</p>

<pre class="ipsCode">### MBR (DOS) images:
# dd if=$(echo *.img) of=/dev/sda bs=512 count=32768

### GPT images:
# dd if=$(echo *.img) of=/dev/sda bs=512 skip=64 seek=64 count=32704</pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<span style="font-size:16px;"><strong>Step 6 - Partition the target device</strong></span>
</p>

<p>
	 
</p>

<pre class="ipsCode"># fdisk /dev/sda
</pre>

<p>
	 
</p>

<p>
	At the <strong>fdisk</strong> prompt, create a new disk label with the <strong>'o' </strong>command (for MBR images) or <strong>'g' </strong>(for GPT images).  Use the <strong>'n' </strong>command to create a partition of size <strong>+400M</strong> beginning at the same Start sector as the disk image (for MBR images, select the “primary” partition type).  Type <strong>'p'</strong> to view the partition table, which should now look something like this:
</p>

<pre class="ipsCode">Device     Start       End   Sectors  Size Type
/dev/sda1  32768    851967    819200  400M Linux root (ARM-64)
</pre>

<p>
	 
</p>

<p>
	Use<strong> 'n'</strong> again to create another partition beginning one sector after the first partition’s end sector and filling the remainder of the device (for MBR, select “primary” again). Type <strong>'p'</strong> once more to view the partition table:
</p>

<pre class="ipsCode">Device     Start       End   Sectors  Size Type
/dev/sda1  32768    851967    819200  400M Linux root (ARM-64)
/dev/sda2 851968 120829951 119977984 57.2G Linux root (ARM-64)
</pre>

<p>
	 
</p>

<p>
	Ensure that the first partition’s Start sector matches that of the disk image (32768 in this example) and that the second partition’s Start sector is one greater than the End sector of the first (851967 and 851968, respectively, in this example).  If you’ve made a mistake, use <strong>'d'</strong> to delete a partition and start again.
</p>

<p>
	 
</p>

<p>
	With GPT images, you’ll need to change the partition type of your two partitions to match that of the image. Type <strong>'l'</strong> to list the known partition types and find the entry matching the value of the “Type” column you made note of above. Note the entry’s integer code and exit the pager with <strong>'q'</strong>. Using the <strong>'t'</strong> command, change the type of your two partitions using this code. Type <strong>'p'</strong> once again to view the partition table, which should now look something like this (depending on your platform):
</p>

<pre class="ipsCode">Device      Boot  Start      End  Sectors  Size Id Type
/dev/sda1         32768   442367   409600  200M 83 Linux root (ARM-64)
/dev/sda2        442368 30636031 30193664 14.4G 83 Linux root (ARM-64)
</pre>

<p>
	<br />
	Once everything looks correct, type <strong>'w'</strong> to write the partition table to disk.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<span style="font-size:16px;"><strong>Step 7 - Copy the system to the target device</strong></span>
</p>

<p>
	 
</p>

<p>
	The following commands will create a filesystem on the target device’s boot partition and copy the boot partition data from the image file to it.  Don’t forget to substitute the correct device name if necessary.  If you’re building the system on an <abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr>, the boot partition device will be something like '/dev/mmcblk1p1' instead of '/dev/sda1'.
</p>

<pre class="ipsCode"> # mkfs.ext4 /dev/sda1            # or '/dev/mmcblk1p1', for an eMMC target
 # e2label /dev/sda1 CRYPTO_BOOT
 # mount /dev/sda1 boot
 # cp -av mnt/boot/* boot
 # (cd boot; ln -s . boot)
</pre>

<p>
	 
</p>

<p>
	Create the encrypted root partition.  When prompted for a passphrase, it’s advisable to choose an easy one like 'abc' for now.  The passphrase can be changed later with the 'cryptsetup luksChangeKey' command (type 'man cryptsetup' for details) once your encrypted system is up and running.
</p>

<pre class="ipsCode"># cryptsetup luksFormat /dev/sda2 # or '/dev/mmcblk1p2', for an eMMC target</pre>

<p>
	 
</p>

<p>
	Activate the encrypted root partition and create a filesystem on it:
</p>

<pre class="ipsCode"># cryptsetup luksOpen /dev/sda2 rootfs  # enter your passphrase from above
# mkfs.ext4 /dev/mapper/rootfs
</pre>

<p>
	 
</p>

<p>
	Mount the encrypted root partition and copy the system to it:
</p>

<pre class="ipsCode"># mount /dev/mapper/rootfs root
# (cd mnt &amp;&amp; rsync -a --info=progress2 --exclude=boot * ../root)
# sync # be patient, this could take a while
# mkdir root/boot
# touch root/root/.no_rootfs_resize
</pre>

<p>
	 
</p>

<p>
	Unmount the boot partition and image and free the loop device:
</p>

<pre class="ipsCode"># umount mnt boot
# losetup -d /dev/loop0
</pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<span style="font-size:16px;"><strong>Step 8 - Prepare the target system chroot</strong></span>
</p>

<p>
	 
</p>

<pre class="ipsCode"># BOOT_PART=($(lsblk -l -o NAME,LABEL | grep CRYPTO_BOOT))
# ROOT_PART=${BOOT_PART%1}2
# ROOT_UUID="$(lsblk --nodeps --noheadings --output=UUID /dev/$ROOT_PART)"
# BOOT_UUID="$(lsblk --noheadings --output=UUID /dev/$BOOT_PART)"

# cd root
# mount /dev/$BOOT_PART boot
# mount -o rbind /dev dev
# mount -t proc proc proc
# mount -t sysfs sys sys
</pre>

<p>
	 
</p>

<p>
	Copy '/etc/resolv.conf' and '/etc/hosts' so you’ll have a working Internet connection within the chroot:
</p>

<pre class="ipsCode"># cat /etc/resolv.conf &gt; etc/resolv.conf
# cat /etc/hosts &gt; etc/hosts
</pre>

<p>
	 
</p>

<p>
	If you’re using non-default APT repositories, you may need to copy their configuration files as well so that 'apt update' and 'apt install' will use them inside the chroot.  Note that you can only do this if the host and target systems have the same distro/version.  If that’s not the case, you’ll have to edit the target files by hand.
</p>

<pre class="ipsCode"># cat /etc/apt/sources.list &gt; etc/apt/sources.list
# cat /etc/apt/sources.list.d/armbian.list &gt; etc/apt/sources.list.d/armbian.list
</pre>

<p>
	 
</p>

<p>
	If you’re using an apt proxy, then copy its configuration file too:
</p>

<pre class="ipsCode"># cp /etc/apt/apt.conf.d/*proxy etc/apt/apt.conf.d/
</pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<span style="font-size:16px;"><strong>Step 9 - Edit or create required configuration files in the target system</strong></span>
</p>

<p>
	 
</p>

<p>
	Perform the editing steps below using a text editor of your choice:
</p>

<ol>
	<li>
		<p>
			If the file 'boot/armbianEnv.txt' exists, edit it so that the 'rootdev', 'console' and 'bootlogo' lines read as follows.  If you’ll be unlocking the disk via the serial console, then use 'console=serial' instead of 'console=display'. Note that enabling the serial console will make it impossible to unlock the disk from the keyboard and monitor, though unlocking via SSH will still work:
		</p>

		<pre class="ipsCode">rootdev=/dev/mapper/rootfs
console=display
bootlogo=false
</pre>
	</li>
	<li>
		<p>
			If your image lacks an 'armbianEnv.txt' file, you’ll need to edit the file 'boot/extlinux/extlinux.conf' instead. All changes will be made to the line beginning with “append”. Alter the argument beginning with “root=” so that it reads “root=/dev/mapper/rootfs”. If you’ll be unlocking the disk via the serial console, remove the “console=tty1” argument. If not, remove the argument beginning with “console=ttyS...”. Replace the “splash plymouth...” argument with “splash=verbose”. Make sure to read the note about unlocking via serial console in the previous step.
		</p>
	</li>
	<li>
		<p>
			Edit 'etc/initramfs-tools/initramfs.conf'.  If your board will have a statically configured IP, add the following line to the end of the file, substituting the correct IP in place of 192.168.0.88:
		</p>

		<pre class="ipsCode">IP=192.168.0.88:::255.255.255.0::end0:off</pre>

		<p>
			If the board will be configured via DHCP, then edit the DEVICE line as follows:
		</p>

		<pre class="ipsCode">DEVICE=end0</pre>

		<p>
			If your default network device has a different name, say <strong>eth0</strong>, then use that instead of <strong>end0</strong>. The device name can be discovered by issuing the command <strong>ip link</strong> and looking for the device labelled <strong>link/ether</strong>.
		</p>
	</li>
	<li>
		If host and target systems are both Debian buster, you may wish add some key modules to the initramfs to avoid a blank display at bootup time.  The easiest way to do this is to add all currently loaded modules as follows:
		<pre class="ipsCode"># lsmod | cut -d ' ' -f1 | tail -n+2 &gt; etc/initramfs-tools/modules
</pre>
	</li>
	<li>
		<p>
			Retrieve the SSH public key from the remote unlocking host and copy it to the target:
		</p>

		<pre class="ipsCode"># mkdir -p etc/dropbear/initramfs
# rsync yourusername@remote_machine:.ssh/id_*.pub etc/dropbear/initramfs/authorized_keys
</pre>

		<p>
			If you want to unlock the disk from more than one host, then edit the authorized_keys file by hand, adding the required additional keys.
		</p>
	</li>
	<li>
		<p>
			Create 'etc/crypttab':
		</p>

		<pre class="ipsCode"># echo "rootfs UUID=$ROOT_UUID none initramfs,luks" &gt; etc/crypttab
</pre>
	</li>
	<li>
		<p>
			Create 'etc/fstab':
		</p>

		<pre class="ipsCode"># echo '/dev/mapper/rootfs / ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1' &gt; etc/fstab
# echo "UUID=$BOOT_UUID /boot ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 2" &gt;&gt; etc/fstab
# echo 'tmpfs /tmp tmpfs defaults,nosuid 0 0' &gt;&gt; etc/fstab
</pre>
	</li>
	<li>
		<p>
			Create the dropbear configuration file:
		</p>

		<pre class="ipsCode"># echo 'DROPBEAR_OPTIONS="-p 2222"' &gt; etc/dropbear/initramfs/dropbear.conf
# echo 'DROPBEAR=y' &gt;&gt; etc/dropbear/initramfs/dropbear.conf
</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			If the target is Ubuntu bionic, then a deprecated environment variable must be set as follows:
		</p>

		<pre class="ipsCode"># echo 'export CRYPTSETUP=y' &gt; etc/initramfs-tools/conf.d/cryptsetup</pre>

		<p>
			 
		</p>
	</li>
	<li>
		Set up automatic disk unlock prompt. Performing this optional step will cause the disk password prompt to appear automatically when you log in remotely via SSH to unlock the disk. Using your text editor, create the file 'etc/initramfs-tools/hooks/cryptroot-unlock.sh' with the following contents:
		<pre class="ipsCode">#!/bin/sh

if [ "$1" = 'prereqs' ]; then echo 'dropbear-initramfs'; exit 0; fi

. /usr/share/initramfs-tools/hook-functions

source='/tmp/cryptroot-unlock-profile'

root_home=$(echo $DESTDIR/root-*)
root_home=${root_home#$DESTDIR}

echo 'if [ "$SSH_CLIENT" ]; then /usr/bin/cryptroot-unlock; fi' &gt; $source

copy_file ssh_login_profile $source $root_home/.profile

exit 0
</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			Save the file and execute the command:
		</p>

		<pre class="ipsCode">chmod 755 'etc/initramfs-tools/hooks/cryptroot-unlock.sh'</pre>

		<p>
			 
		</p>
	</li>
</ol>

<p>
	 
</p>

<p>
	<span style="font-size:16px;"><strong>Step 10 - Chroot into the target system, install packages and configure</strong></span>
</p>

<p>
	 
</p>

<p>
	Now chroot into the encrypted system.  All remaining steps will be performed inside the chroot:
</p>

<pre class="ipsCode"># chroot .
</pre>

<p>
	 
</p>

<p>
	Install the cryptsetup package and the dropbear SSH server:
</p>

<pre class="ipsCode"># apt update
# echo 'force-confdef' &gt; /root/.dpkg.cfg
# apt --yes install cryptsetup-initramfs dropbear-initramfs # for a buster or focal image
# apt --yes install cryptsetup dropbear-initramfs           # for a bionic image
# rm /root/.dpkg.cfg
</pre>

<p>
	 
</p>

<p>
	Make sure everything was included in the initramfs (all three commands should produce output):
</p>

<pre class="ipsCode"># lsinitramfs /boot/initrd.img-* | grep 'usr.*cryptsetup'
# lsinitramfs /boot/initrd.img-* | grep dropbear
# lsinitramfs /boot/initrd.img-* | grep authorized_keys
</pre>

<p>
	 
</p>

<p>
	Now regenerate your SSH host keys:
</p>

<pre class="ipsCode"># ssh-keygen -A</pre>

<p>
	 
</p>

<p>
	Your work is finished! Exit the chroot and shut down the board:
</p>

<pre class="ipsCode"># exit
# halt -p
</pre>

<p>
	 
</p>

<p>
	Insert your freshly written SD card into the board’s main SD slot (or, if the target is an <abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr>, just remove the SD card from that slot) and reboot.
</p>

<p>
	<br />
	Unlock the disk by executing the following command on your remote unlocking machine, substituting the correct IP address if necessary:
</p>

<pre class="ipsCode">$ ssh -p 2222 root@192.168.0.88</pre>

<p>
	 
</p>

<p>
	If you performed step 9.10 above, the disk password prompt should appear automatically after login.  If not, you must enter the command 'cryptroot-unlock'.
</p>

<p>
	 
</p>

<p>
	You may also unlock the disk from the target board’s console if you wish.  Note, however, that certain disk images (RockPi 4 buster mainline, for example) might give you a blank display at startup, so you’ll have to enter your disk password “blindly”.  This bug will hopefully be fixed in the future.
</p>

<p>
	<br />
	If all went well, your root-filesystem encrypted Armbian system is now up and running!
</p>
]]></description><guid isPermaLink="false">15618</guid><pubDate>Sun, 18 Oct 2020 17:46:49 +0000</pubDate></item><item><title>Add Devicetree To Grub Automatically: Here's How</title><link>https://forum.armbian.com/topic/55266-add-devicetree-to-grub-automatically-heres-how/</link><description><![CDATA[<p>
	This will cause update-grub to add the following a devicetree line to all menu entries. This example is based on Debian Trixie's grub-efi.
</p>

<p>
	 
</p>

<p>
	This example will expect <abbr title="Device tree blob"><abbr title="Device tree blob">dtb</abbr></abbr> directories (or links) to be in the /boot directory, using the convention that I've seen Armbian use. Here is an example of a /boot directory listing for (pure) Debian Trixie with two kernels:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">-rw-r--r-- 1 root root   336036 Aug 27 04:10 config-6.12.43+deb13-arm64
-rw-r--r-- 1 root root   343394 Sep  6 12:48 config-6.16.3+deb13-arm64
lrwxrwxrwx 1 root root       42 Sep 20 16:17 dtb -&gt; ../usr/lib/linux-image-6.16.3+deb13-arm64/
lrwxrwxrwx 1 root root       43 Sep 20 16:17 dtb-6.12.43+deb13-arm64 -&gt; ../usr/lib/linux-image-6.12.43+deb13-arm64/
lrwxrwxrwx 1 root root       42 Sep 20 16:18 dtb-6.16.3+deb13-arm64 -&gt; ../usr/lib/linux-image-6.16.3+deb13-arm64/
drwxr-xr-x 3 root root     4096 Sep 20 15:13 efi
drwxr-xr-x 5 root root     4096 Sep 20 16:26 grub
lrwxrwxrwx 1 root root       29 Sep 15 21:30 initrd.img -&gt; initrd.img-6.16.3+deb13-arm64
-rw------- 1 root root 42521317 Sep 20 16:26 initrd.img-6.12.43+deb13-arm64
-rw------- 1 root root 43760872 Sep 20 16:25 initrd.img-6.16.3+deb13-arm64
lrwxrwxrwx 1 root root       30 Sep 15 20:38 initrd.img.old -&gt; initrd.img-6.12.43+deb13-arm64
-rw-r--r-- 1 root root       83 Aug 27 04:10 System.map-6.12.43+deb13-arm64
-rw-r--r-- 1 root root       92 Sep  6 12:48 System.map-6.16.3+deb13-arm64
lrwxrwxrwx 1 root root       26 Sep 15 21:30 vmlinuz -&gt; vmlinuz-6.16.3+deb13-arm64
-rw-r--r-- 1 root root 37449664 Aug 27 04:10 vmlinuz-6.12.43+deb13-arm64
-rw-r--r-- 1 root root 41507328 Sep  6 12:48 vmlinuz-6.16.3+deb13-arm64
lrwxrwxrwx 1 root root       27 Sep 15 20:38 vmlinuz.old -&gt; vmlinuz-6.12.43+deb13-arm64</span></pre>

<p>
	Note: The relative pathways of the <abbr title="Device tree blob"><abbr title="Device tree blob">dtb</abbr></abbr> links above assume that the /boot directory is part of the main OS partition, not on its own boot partition. Otherwise you'd need to copy those directories to /boot/ as Armbian does.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>For The Current Partition's OS Entries (each devicetree will be specific to the respective kernel)</strong>
</p>

<p>
	1. Open the file with a text/source editor (using sudo):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">/etc/grub.d/10_linux</span></pre>

<p>
	 
</p>

<p>
	2. Find every line that looks something like this (currently on my system, there is only one, and it's line 189)
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">linux	${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}</span></pre>

<p>
	 
</p>

<p>
	3. Just above it, add <u>your own system's version</u> of this line:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">devicetree ${rel_dirname}/dtb-${version}/[VENDOR SUB-DIRECTORY]/[SBC PRODUCT].dtb</span></pre>

<p>
	 
</p>

<p>
	Specific Example: OrangePI-5-Plus
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">devicetree ${rel_dirname}/dtb-${version}/rockchip/rk3588-orangepi-5-plus.dtb</span></pre>

<p>
	 
</p>

<p>
	Specific Example from the resulting grub.cfg, of the current trixie-backport kernel, again on the OrangePI-5-Plus:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">devicetree /boot/dtb-6.16.3+deb13-arm64/rockchip/rk3588-orangepi-5-plus.dtb</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>For Other Partitions' OS Entries, via os-prober (I'm unfamiliar with the variables in this so each devicetree will be the same generic path, regardless of kernel)</strong>
</p>

<p>
	1. Open the file with a text/source editor (using sudo):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"> /etc/grub.d/30_os-prober</span></pre>

<p>
	 
</p>

<p>
	2. Find every line that looks something like this (currently on my system, there are two, lines 277 and 297)
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">linux ${LKERNEL} ${LPARAMS}</span></pre>

<p>
	 
</p>

<p>
	3. Just above it, add <u>your own system's version</u> of this line:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">devicetree /boot/dtb/[VENDOR SUB-DIRECTORY]/[SBC PRODUCT].dtb</span></pre>

<p>
	 
</p>

<p>
	Specific Example: OrangePI-5-Plus
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">devicetree /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>Then run update-grub, and take a look at the resulting /boot/grub/grub.cfg</strong>
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">55266</guid><pubDate>Sat, 20 Sep 2025 21:45:06 +0000</pubDate></item><item><title>Installing rpi-monitor in Armbian for Orange Pi Zero 3</title><link>https://forum.armbian.com/topic/54048-installing-rpi-monitor-in-armbian-for-orange-pi-zero-3/</link><description><![CDATA[<p>
	this is posted to Gist:
</p>

<p>
	<a href="https://gist.github.com/ag88/65db5434158683e43d1cc77c337ebdb5" rel="external nofollow">https://gist.github.com/ag88/65db5434158683e43d1cc77c337ebdb5</a>
</p>

<ul>
	<li>
		Introduction
	</li>
</ul>

<p>
	<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">Rpi</abbr></abbr>-monitor<br />
	<a href="https://github.com/XavierBerger/RPi-Monitor" rel="external nofollow">https://github.com/XavierBerger/<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">RPi</abbr></abbr>-Monitor</a><br />
	is a very nice app for monitoring <abbr title="Single board computer"><abbr title="Single board computer">sbc</abbr></abbr> (single board computers/ actually bigger computers as well) like <abbr title="Raspberry Pi"><abbr title="Raspberry Pi">RPi</abbr></abbr> on a web.<br />
	it gives you a quick look at various system metrics cpu load, uptime, temperatures etc and more on a nice web page.<br />
	and on top, makes nice time series graphs for the same, practically a dashboard.
</p>

<p>
	 
</p>

<ul>
	<li>
		Installing in Armbian 25.8 for Orange Pi Zero 3
	</li>
</ul>

<p>
	<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">Rpi</abbr></abbr>-monitor is normally not found in the common Apt repositories and actually the binary is a little old.<br />
	I tried installing it based on the 'formal' docs but hit some invalid public keys errors, possibly expired certs.<br />
	<a href="https://xavierberger.github.io/RPi-Monitor-docs/11_installation.html" rel="external nofollow">https://xavierberger.github.io/<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">RPi</abbr></abbr>-Monitor-docs/11_installation.html</a>
</p>

<p>
	so here is a 'workaround'
</p>

<p>
	 
</p>

<ul>
	<li>
		 Deb packages for <abbr title="Raspberry Pi"><abbr title="Raspberry Pi">rpi</abbr></abbr>-monitor
	</li>
</ul>

<p>
	you can find the packages in this repository (note that this may not be permanant and may change)<br />
	<a href="https://github.com/XavierBerger/RPi-Monitor-deb" rel="external nofollow">https://github.com/XavierBerger/<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">RPi</abbr></abbr>-Monitor-deb</a>
</p>

<p>
	use the **rpimonitor_latest.deb** file<br />
	<a href="https://github.com/XavierBerger/RPi-Monitor-deb/tree/develop/packages" rel="external nofollow">https://github.com/XavierBerger/<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">RPi</abbr></abbr>-Monitor-deb/tree/develop/packages</a>
</p>

<p>
	 
</p>

<ul>
	<li>
		install rpimonitor_latest.deb in Armbian
	</li>
</ul>

<p>
	use apt to install *rpimonitor_latest.deb* as it has varous package dependencies. <br />
	e.g. download it to a folder and from there run
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo apt install ./rpimonitor_latest.deb </span></pre>

<p>
	<br />
	the prior step should install rpimonitor, and check that the service is running by going to  <a href="" rel="">http://your_sbc_ip_address:8888</a>
</p>

<p>
	 
</p>

<ul>
	<li>
		checking the setup
	</li>
	<li>
		 
	</li>
</ul>

<p>
	<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">rpi</abbr></abbr>-monitor is runa as a systemd (unit) service 
</p>

<p>
	if it is not running you can try 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl status rpimonitor.service</span></pre>

<p>
	<br />
	or <br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">journalctl -u rpimonitor.service</span></pre>

<p>
	<br />
	<br />
	to check what went wrong.
</p>

<p>
	to start / stop <abbr title="Raspberry Pi"><abbr title="Raspberry Pi">rpi</abbr></abbr>-monitor it is as per basic systemd services e.g.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl start rpimonitor.service</span></pre>

<p>
	 
</p>

<ul>
	<li>
		 temperature 'not displaying'
	</li>
</ul>

<p>
	apparently, it is affected by this issue:<br />
	<a href="https://github.com/XavierBerger/RPi-Monitor/issues/374" rel="external nofollow">https://github.com/XavierBerger/<abbr title="Raspberry Pi"><abbr title="Raspberry Pi">RPi</abbr></abbr>-Monitor/issues/374</a>
</p>

<p>
	accordingly the fix/'workaround' is edit <em><strong>/etc/rpimonitor/template/temperature.conf</strong></em><br />
	replace
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">#dynamic.1.postprocess=sprintf("%.2f", $1/1000)
dynamic.1.postprocess=$1/1000</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">54048</guid><pubDate>Thu, 24 Jul 2025 12:19:41 +0000</pubDate></item><item><title>NO_PUBKEY 93D6889F9F0E78D5 while using apt (e.g. apt update)</title><link>https://forum.armbian.com/topic/52860-no_pubkey-93d6889f9f0e78d5-while-using-apt-eg-apt-update/</link><description><![CDATA[<p>
	symptom:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">&gt; apt update
...
Err:8 https://github.armbian.com/configng stable InRelease               
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 93D6889F9F0E78D5
...
W: Failed to fetch https://github.armbian.com/configng/dists/stable/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 93D6889F9F0E78D5</span></pre>

<p>
	observed in Armbian image for Orange pi zero 3 Armbian_community_25.8.0-trunk.90_Orangepizero3_bookworm_current_6.12.30_minimal.img build date May 28, 2025
</p>

<p>
	 
</p>

<p>
	fix:
</p>

<p>
	<strong><em>- run this as root</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">&gt; su - 
^ login as root
&gt; wget -O - https://apt.armbian.com/armbian.key | gpg --dearmor -o /usr/share/keyrings/armbian.gpg</span></pre>

<p>
	 
</p>

<p>
	you should find a file <em><strong>/usr/share/keyrings/armbian.gpg</strong></em> about 2 KB in size
</p>

<p>
	 
</p>

<p>
	repeat apt update etc should have resolved the error
</p>
]]></description><guid isPermaLink="false">52860</guid><pubDate>Fri, 13 Jun 2025 10:50:19 +0000</pubDate></item><item><title>Adventures with Armbian (XFCE) on Pinebook Pro</title><link>https://forum.armbian.com/topic/50555-adventures-with-armbian-xfce-on-pinebook-pro/</link><description><![CDATA[<p>
	Hi
</p>

<p>
	Yesterday I spend the whole day to install Armbian Desktop (XFCE) on my Pinebook Pro.
</p>

<p>
	Why Armbian ?
</p>

<p>
	The PBP was delivered with Manjaro Arm on it. Everything worked fine until Manjaro stopped support for the Arm platform.
</p>

<p>
	For about one year there is no update on stable and the unstable branch couldn't establish a connection to Wifi.
</p>

<p>
	I used Manjaro Arm to install tow-boot to the SPI following this website:
</p>

<p>
	<a href="https://forum.pine64.org/showthread.php?tid=17529" rel="external nofollow">https://forum.pine64.org/showthread.php?tid=17529</a>
</p>

<p>
	 I downloaded the current Bookworm XFCE edition and wrote that to an SD card.
</p>

<p>
	Booting from the SD with tow-boot went fine. I installed armbian on the SD card and used armbian-config to install
</p>

<p>
	it on the internal <abbr title="embedded MultiMediaCard">eMMC</abbr>.
</p>

<p>
	That didn't work.
</p>

<p>
	fsarchiver to the rescue !
</p>

<p>
	I created a GPT partition table on the internal disk, created two partitions with the correct flags and restored
</p>

<p>
	both partitions from the SD saved with fsarchiver to the internal disk.
</p>

<p>
	Booting went fine from the internal disk after that.
</p>

<p>
	Now I am fighting with firefox ("Can't read configuration file - contact your systemadministrator") and the nextcloud client.
</p>

<p>
	I can't add a online account anywhere. The application starts up but there is no button execpt (Information about ...)
</p>

<p>
	which shows the supported clients a.o. Owncloud (which will work with nextcloud) but there is no way to add an account.
</p>

<p>
	I'll open other posts to track that.
</p>
]]></description><guid isPermaLink="false">50555</guid><pubDate>Mon, 17 Mar 2025 11:33:32 +0000</pubDate></item><item><title>Video : Armbian-gamingX86 / A tool to install Steam, PPSSPP, Retropie and Xonotic on Armbian Jammy/Noble X86</title><link>https://forum.armbian.com/topic/46646-video-armbian-gamingx86-a-tool-to-install-steam-ppsspp-retropie-and-xonotic-on-armbian-jammynoble-x86/</link><description><![CDATA[<p>
	 
</p>

<p>
	 
</p>

<p>
	Hi all. <br />
	In this video I show how to use armbian-gamingX86. A script to install Steam, PPSSPP, Retropie and Xonotic on Armbian Jammy/Noble X86.<br />
	 
</p>

<p>
	Here link to armbian-gamingX86 : <a href="https://github.com/NicoD-SBC/armbian-gamingX86" rel="external nofollow">https://github.com/NicoD-<abbr title="Single board computer">SBC</abbr>/armbian-gamingX86</a>
</p>

<p>
	 
</p>

<p>
	Here my video about it.
</p>

<p>
	Cheers, NicoD
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" title="armbian-gamingX86 / Install Steam, PPSSPP, Retropie and Xonotic on Armbian X86" width="200" data-embed-src="https://www.youtube-nocookie.com/embed/X4uKJhrAc50?feature=oembed"></iframe>
	</div>
</div>
]]></description><guid isPermaLink="false">46646</guid><pubDate>Wed, 23 Oct 2024 11:39:19 +0000</pubDate></item><item><title>Wifi AP (on Orange Pi zero 3)</title><link>https://forum.armbian.com/topic/45781-wifi-ap-on-orange-pi-zero-3/</link><description><![CDATA[<p>
	The original discussion thread is this 
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="206514" data-embedcontent="" data-embedid="embed6494856261" src="https://forum.armbian.com/topic/45629-orange-pi-zero-3-hotspotaccess-point-not-working/?do=embed" style="height:213px;max-width:502px;"></iframe>

<p>
	 
</p>

<p>
	Reposting this below just in case it may be useful 
</p>

<p>
	 
</p>

<p>
	----
</p>

<p>
	how i set it up
</p>

<p>
	<a href="https://gist.github.com/ag88/de02933ba65500376d1ff48e504b1bf3" rel="external nofollow">https://gist.github.com/ag88/de02933ba65500376d1ff48e504b1bf3</a>
</p>

<p>
	---
</p>

<p>
	 
</p>

<p>
	 Imho for WiFi purposes nmcli (network manager cli) is not very different from hostapd, just that hostapd possibly has more configuration options.
</p>

<p>
	 
</p>

<p>
	To setup an access point, there are quite a few pieces of network configuration that needs to be setup:
</p>

<ul>
	<li>
		The WiFi AP itself (e.g. using network manager or hostapd) if you are able to connect and verify that in the log, that is probably solved. e.g.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">journalctl -u NetworkManager
or for hostapd
journalctl -u hostapd</span></pre>

<p>
	hostapd tends to have log entries for every host that connects, I'm not sure about NetworkManager.
</p>

<ul>
	<li>
		DHCP (issuing IP address to connected hosts) this is particularly true for IPv4 hosts on dynamic IP.<br />
		DHCP would likely also need to distribute the DNS server, so configure that if it isn't done.<br />
		e.g. <a href="https://ubuntu.com/server/docs/how-to-install-and-configure-isc-dhcp-server" rel="external nofollow">https://ubuntu.com/server/docs/how-to-install-and-configure-isc-dhcp-server</a>
	</li>
	<li>
		For IPv6 you may need to setup radvd (router advertisement daemon)  https://en.wikipedia.org/wiki/Radvd so that the connected hosts can setup their own IPv6 address<br />
		quite often IPV6 requires its own /64 address range / network (* note below <strong>dnsmasq</strong> does this as well) e.g.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt install radvd</span></pre>

<p>
	<a href="https://wiki.archlinux.org/title/IPv6#For_gateways" rel="external nofollow">https://wiki.archlinux.org/title/IPv6#For_gateways</a>
</p>

<ul>
	<li>
		Configure the WiFi AP as a router or bridge.
	</li>
	<li>
		Router:
	</li>
	<li>
		<p>
			note that if you are using hostapd and not using a network bridge and there are no DHCP servers, you would need to configure the wlan0 interface with an ip address and network using say ip commands e.g.<br />
			(ref: <a href="https://wiki.debian.org/NetworkConfiguration" rel="external nofollow">https://wiki.debian.org/NetworkConfiguration</a>)
		</p>

		<p>
			<strong>/etc/network/interfaces</strong>
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">source /etc/network/interfaces.d/*
# Network is managed by Network manager
auto lo
iface lo inet loopback
# added the following
auto wlan0
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0</span></pre>
	</li>
</ul>

<p>
	 
</p>

<ul>
	<li>
		To run it as a router, you would need to do DHCP (and RADV) for your WiFi hosts as above<br />
		For such reasons, I tend to use isc-dhcp-daemon so that I can configure the dhcpd precisely as I needed. But I'd guess it may be possible with Network manager. (* note below <strong>dnsmasq</strong> does this as well) e.g.<br />
		<a href="https://ubuntu.com/server/docs/how-to-install-and-configure-isc-dhcp-server" rel="external nofollow">https://ubuntu.com/server/docs/how-to-install-and-configure-isc-dhcp-server</a>
	</li>
</ul>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt install isc-dhcp-server</span></pre>

<p>
	 
</p>

<ul>
	<li>
		Configure routing and/or IP NAT (e.g. IP masquerading). I've tried IP NAT and that sometimes it is easier as up stream normally only a single IP address is needed.<br />
		<br />
		Routing would need a subnet to be setup, that is normally ok but that you would need to configure your main gateway router as well for the overall network setup so that it knows where/how to forward packets. many consumer getway/routers simply used NAT, that is ok as well. But that your main gateway/router may need a static route to say that for that subnet, send it to your <abbr title="Orange Pi"><abbr title="Orange Pi">OPi</abbr></abbr> Zero 3 Wifi AP.
	</li>
</ul>

<p>
	 
</p>

<ul>
	<li>
		Bridging:
	</li>
	<li>
		To run it as a bridge you would need to setup the zero 3 WiFi AP as a bridge. This can be done using nmcli (network manager). In fact, this is my own personal preference for a small network.<br />
		e.g.  <br />
		<a href="https://www.cyberciti.biz/faq/how-to-add-network-bridge-with-nmcli-networkmanager-on-linux/" rel="external nofollow">https://www.cyberciti.biz/faq/how-to-add-network-bridge-with-nmcli-networkmanager-on-linux/</a><br />
		<a href="https://gist.github.com/ag88/de02933ba65500376d1ff48e504b1bf3" rel="external nofollow">https://gist.github.com/ag88/de02933ba65500376d1ff48e504b1bf3</a>
	</li>
	<li>
		DHCP (and RADV) can be done from the main gateway/router so long as the bridged packets reaches the WiFi hosts. Similarly, the DNS server likely needs to be distributed this way as well
	</li>
</ul>

<p>
	 
</p>

<p>
	I've not done it completely from within nmcli for this setup as I used hostapd for the WiFi AP. But that I used nmcli (network manager) for the bridge.
</p>

<p>
	But that those notes above remains similar whether you used network manager or hostapd.
</p>

<p>
	take note that with hostapd for WiFi AP, you probably need to un-manage the Wifi interface in Network Manager configs so that it doesn't conflict with hostapd.
</p>

<p>
	<a href="https://gist.github.com/ag88/de02933ba65500376d1ff48e504b1bf3" rel="external nofollow">https://gist.github.com/ag88/de02933ba65500376d1ff48e504b1bf3</a>
</p>

<p>
	oh and when messing with network interfaces use a debug usb-uart serial dongle or you may get 'locked out' from your zero 3
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" title="How to debug Armbian on your SBC with UART" width="200" data-embed-src="https://www.youtube-nocookie.com/embed/UpVMO7gbnYM?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>

<p>
	 
</p>

<p>
	Apparently, dnsmasq does all three: DNS, DHCP, RADV
</p>

<p>
	<a href="https://thekelleys.org.uk/dnsmasq/doc.html" rel="external nofollow">https://thekelleys.org.uk/dnsmasq/doc.html</a>
</p>

<p>
	but that there may be some configurations that are needed for it to work correctly
</p>

<p>
	<a href="https://docs.fedoraproject.org/en-US/fedora-server/administration/dnsmasq/" rel="external nofollow">https://docs.fedoraproject.org/en-US/fedora-server/administration/dnsmasq/</a>
</p>

<p>
	<a href="https://wiki.archlinux.org/title/Dnsmasq" rel="external nofollow">https://wiki.archlinux.org/title/Dnsmasq</a>
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">45781</guid><pubDate>Thu, 03 Oct 2024 06:18:20 +0000</pubDate></item><item><title>Banana Pi M3</title><link>https://forum.armbian.com/topic/474-banana-pi-m3/</link><description><![CDATA[<p>
	<span style="font-size:18px;"><strong>Overview</strong></span>
</p>

<p>
	 
</p>

<p>
	<em><span style="font-size:12px;">(Disclaimer: The following is for techies only that like to dig a bit deeper. And if you're not interested in energy-efficient servers then probably this is just a waste of time <img alt=":)" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" width="20"> ) </span></em>
</p>

<p>
	 
</p>

<p>
	<strong><em><span style="font-size:12px;">EDIT: Half a year after this poorly designed SBC has been released just one of the many design flaws has been fixed: Micro USB for DC-IN has been replaced by the barrel jack that was present on the pre-production batches. If you were unfortunate to get a Micro USB equipped M3 please have a look <a href="https://techcornerweb.wordpress.com" rel="external nofollow">here</a> how to fix this. Apart from that check the <a href="http://forum.banana-pi.org/latest" rel="external nofollow">Banana forums</a> what to expect regarding software/support first since this is your only source)</span></em></strong>
</p>

<p>
	 
</p>

<p>
	<img alt="BPi-M3-top-middle.jpg" src="http://kaiser-edv.de/tmp/eLJYkI/BPi-M3-top-middle.jpg"></p>

<p>
	 
</p>

<p>
	SinoVoip sent me a review sample of the recently shipped so called "Banana Pi M3" yesterday. It's a SBC sharing name and form factor of older "Banana Pi" models but is of course completely incompatible to them due to a different SoC, an <a href="http://linux-sunxi.org/A83T" rel="external nofollow">A83T (octa-core Cortex-A7 combined with a PowerVR SGX544 GPU)</a>. For detailed and up-to-date informations please always refer to the <a href="http://linux-sunxi.org/Banana_Pi_M3" rel="external nofollow">linux-sunxi wiki</a>.
</p>

<p>
	 
</p>

<p>
	This new model distinguishes itself from the <a href="http://linux-sunxi.org/Banana_Pi_M2" rel="external nofollow">Banana Pi M2</a> with twice as much CPU cores and DRAM (LPDDR3), 8 GB eMMC onboard and BT4.0. And compared to the "M1" (the original <a href="http://linux-sunxi.org/Banana_Pi" rel="external nofollow">Banana Pi</a>) it features also 802.11 b/g/n Wi-Fi. Unlike the M2 the M3 is advertised as being SATA capable. But that's not true, it's just an onboard GL830 USB-to-SATA bridge responsible for horribly slow disk access. Unfortunately the GL830 and both externally available USB ports are behind an internal USB hub therefore all ports have to share bandwidth this way and use just one single USB connection to the SoC.
</p>

<p>
	 
</p>

<p>
	Since my use cases for ARM boards are rather limited you won't find a single word about GPIO stuff (should work if pin mappings are defined correctly), GPU performance, BT, Wi-Fi or Android. Simply because I don't care  <img alt=":)" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" width="20"></p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Getting Started:</strong></span>
</p>

<p>
	 
</p>

<p>
	The board arrived without additional peripherals (no PSU) therefore you need an USB cable using a Micro-USB connector to power the board. Both DC-IN and USB-OTG feature an Micro-USB connector which is bad news since pre-production samples had a real DC-In connector (4.0mm/1.7mm barrel plug, centre positive like the M2). I suffered from several sudden shutdowns under slight load until I realized that I used a crappy cable. Many (most?) USB cables lead to voltage drops and when the board demands more power it gets in an undervoltage situation and the PMU shuts off.
</p>

<p>
	 
</p>

<p>
	Same will happen to you unless you can verify that you've a good cable. I did not succeed querying the M3's powermanagement unit (PMU) regarding available voltage (<em>/sys/devices/platform/axp81x_board/axp81x-supplyer.47/power_supply/ac/voltage_now</em> shows always 0). This was a lot easier with the older Banana Pi M1: Here you can watch <a href="http://forum.lemaker.org/forum.php?mod=viewthread&amp;tid=8312&amp;extra=page%3D1" rel="external nofollow">my cable being responsible for voltage drops under high load</a> (I accidentally used this again with the M3).
</p>

<p>
	 
</p>

<p>
	To avoid the crappy Micro-USB connector (limited to 1.8A maximum by specs and tiny contacts) you can desolder it and solder a cable or a barrel plug -- the PCB is already prepared for the latter. Or ask SinoVoip if they can fix this mistake with the next batch of PCBs. On the bottom side of the PCB there are also solder pads for a Li-Ion battery. It has to be confirmed whether the AXP813 PMU can also be fed with 5V through the Li-Ion connector since this is the preferred way to <a href="https://forum.armbian.com/index.php/topic/15-lamobo-r-1-sata-power/" rel="">fix the faulty power design other SinoVoip products show</a>.
</p>

<p>
	 
</p>

<p>
	One final word regarding power: It seems currently something's wrong with power initialisation in the early boot stages (u-boot). With a connected bus-powered USB disk the board won't start or immediately shut down when the disk is connected within the first 10 seconds. I didn't verify when exactly because if you've a look at <a href="https://github.com/BPI-SINOVOIP/BPI-M3-bsp/commits/master" rel="external nofollow">SinoVoip's commit log</a> it seems they began to fix many obvious bugs just right now after they already started shipping the board (we've seen that with the M2 also).
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>First Showstoppers:</strong></span>
</p>

<p>
	 
</p>

<p>
	Since the board came with an unpopulated eMMC (why the heck?) I had to try out the available OS images from the <a href="http://www.banana-pi.org/download.html" rel="external nofollow">banana-pi.org download site</a>. Unlike everyone else on this planet they don't provide MD5/SHA1 checksums to be able to check integrity of downloads and even if you tell them that they've uploaded corrupted images <a href="http://forum.banana-pi.org/t/banana-pi-m3-boot-issues/772" rel="external nofollow">they don't care</a>. From 4 OS images 3 are corrupted (according to unzip) and all failed soon after boot with kernel panics. I tried the Android image to verify <a href="http://linux-sunxi.org/Banana_Pi_M3#FEL_mode" rel="external nofollow">FEL mode</a> works.
</p>

<p>
	 
</p>

<p>
	But since Android is of zero use for me, I decided to build an own OS image from an Ubuntu distro running on the Orange Pi where I had the SD-card inserted. Since details are boring just <a href="http://linux-sunxi.org/User_talk:Tkaiser#Manufacturer.27s_OS_images" rel="external nofollow">as a reference</a>. From then on I used this Ubuntu image and exchanged only the freshly built stuff from <a href="https://github.com/BPI-SINOVOIP/BPI-M3-bsp" rel="external nofollow">SinoVoip's BSP Github repo</a> (3.4.39 kernel, modules, bootloader and also simple things like hardware initialisation since kernel/u-boot they prefer does <strong>NOT</strong> support script.bin)
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:18px;">First Impressions:</span></strong>
</p>

<p>
	 
</p>

<p>
	<strong>Heat (dissipation):</strong>
</p>

<p>
	 
</p>

<p>
	The A83T needs a heatsink otherwise you won't be able to benefit from its performance. Allwinner's 3.4.39 kernel provides 'budget cooling' using 2 techniques: thermal throttling and shutting down CPU cores. You can define this 'thermal configuration' in <a href="https://github.com/BPI-SINOVOIP/BPI-M3-bsp/blob/daaa78441b0d8b8d186dbef188dddc7b597d1d9c/sunxi-pack/chips/sun8iw6p1/configs/BPI_M3_1080P/sys_config.fex#L483-L513" rel="external nofollow">sysconfig.fex</a> and have to take care that you understand what you're doing since if throttling doesn't help your CPU cores will be deactivated and you <strike>have to</strike> can't bring them back online manually the usual way since Allwinner's kernel doesn't allow so:
</p>

<pre class="ipsCode prettyprint">
echo 1 &gt;/sys/devices/system/cpu/cpuX/online
</pre>

<p>
	Therefore it's better to stay with the thermal defaults to allow throttling and improve heat dissipation instead. I used a $0.5 heatsink that performs ok. Without heatsink when running CPU intensive jobs throttling limited clockspeed to 1.2 GHz but with the heatsink I was able to run most of the times at ~1.6Ghz under full load. With heatsink and an annoying fan I managed to let the SoC run constantly at 1.8GHz and achieved a 7-zip score close to 6000 and finished <em>"sysbench --test=cpu --cpu-max-prime=20000 run --num-threads=8"</em> in less than 53 seconds.
</p>

<p>
	 
</p>

<p>
	This is an example for wrong throttling values (too high) so that the kernel driver does not limit clockspeeds but starts to drop CPU cores instead:
</p>

<p>
	 
</p>

<p>
	<img alt="RPi-Monitor_showing_CPU_core_shutdown_at" src="http://kaiser-edv.de/tmp/lhxpob/RPi-Monitor_showing_CPU_core_shutdown_at_90_degrees.png"></p>

<p>
	 
</p>

<p>
	<strong>CPU performance:</strong>
</p>

<p>
	 
</p>

<p>
	Since the H3 (used on the more recent Orange Pis) and the A83T seem to use much of the same kernel sources (especially the 'thermal stuff') I did a few short tests. When running with identical clockspeed and the same amount of cores they perform identical (that means they're slower than older Cortex-A7 SoCs like eg. the A20 when running at identical clockspeed -- a bit strange). Obviously the difference between H3 and A83T is the process. Both already made in 28nm but the A83T as 'tablet SoC' in the more energy efficient <a href="http://www.tsmc.com/english/dedicatedFoundry/technology/28nm.htm" rel="external nofollow">HPC process</a> allowing less voltage and higher clockspeeds. According to sysconfig.fex the SoC should be able to clock above 2.1 GHz but since exceeding 1.6 Ghz already needs a fan this is pretty useless on a SBC (might be different inside a tablet where the back cover could be used as a large heatsink).
</p>

<p>
	 
</p>

<p>
	<strong>Network throughput:</strong>
</p>

<p>
	 
</p>

<p>
	I used my usual set of iperf testings and tried GBit Ethernet performance (with and without network tunables it remains the same -- reason below):
</p>

<p>
	 
</p>

<p>
	<em>BPi-M3 --&gt; Client:</em>
</p>

<div>
	<pre class="ipsCode prettyprint">
[  4]  0.0-10.0 sec   671 MBytes   563 Mbits/sec
[  4]  0.0-10.0 sec   673 MBytes   564 Mbits/sec
[  4]  0.0-10.0 sec   870 MBytes   729 Mbits/sec
[  4]  0.0-10.0 sec   672 MBytes   564 Mbits/sec
[  4]  0.0-10.0 sec   675 MBytes   566 Mbits/sec
</pre>
</div>

<div>
	<em>Client --&gt; BPi-M3:</em>
</div>

<div>
	<pre class="ipsCode prettyprint">
[  4]  0.0-10.0 sec   714 MBytes   599 Mbits/sec
[  5]  0.0-10.0 sec   876 MBytes   734 Mbits/sec
[  4]  0.0-10.0 sec   598 MBytes   501 Mbits/sec
[  5]  0.0-10.0 sec   690 MBytes   578 Mbits/sec
[  4]  0.0-10.0 sec   604 MBytes   506 Mbits/sec
</pre>

	<p>
		When I used longer test periods (-t 120) then the "Client --&gt; BPi-M3" performance increased up to the theoretical limit: 940 Mbits/s. Then a second iperf thread jumped in, both utilising a single CPU core fully. And that's the problem: Networking is CPU bound, a single client-server connection will not exceed 500-600 Mbits/sec as it was the case when I started with A20 based boards 2 years ago. Since all we have now with the A83T is an outdated 3.4.39 kernel and since I/O bandwidth on the M3 is so low, I stopped here since it's way too boring to try to improve network throughput and also useless (disk access is so slow that it simply doesn't matter when Ethernet is limited to half of the theoretical GBit Ethernet speed... at least for me <img alt=";)" height="20" src="https://forum.armbian.com/uploads/emoticons/default_wink.png" srcset="https://forum.armbian.com/uploads/emoticons/wink@2x.png 2x" width="20"> )
	</p>
</div>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Accessing disks:</strong></span>
</p>

<p>
	 
</p>

<p>
	Since there's a SATA connector on the board I gave it a try.
</p>

<p>
	 
</p>

<p>
	<strong>Important:</strong> the SATA-<em>power</em> connector uses the same polarity as older Banana Pis and Orange Pis (keep that in mind since combined SATA data/power cables from LinkSprite and Cubietech that share exactly the same connector use inverted polarity!).
</p>

<p>
	 
</p>

<p>
	I started with the Samsung EVO I always use for tests (but due to the old 3.4 kernel using ext4 instead of btrfs) and was shocked: 13.5/23 MB/s is the worst result I ever measured. I then realised that I limited maximum cpufreq to 480 MHz and tried with 1800 MHz again. A bit better but far away from acceptable:
</p>

<pre class="ipsCode prettyprint">
GL830 USB-to-SATA performance:

480 MHz:      kB  reclen    write  rewrite    read    reread
         4096000       4    13529    13466    22393    22516
         4096000    1024    13588    13411    22717    26115
         
1.8 GHz: 4096000       4    15090    15082    30968    30316
         4096000    1024    15174    15131    30858    29441
</pre>

<p>
	I disconnected the SSD from the 'SATA port' and put it in an enclosure with a JMicron JMS567 USB-to-SATA bridge and measured again<span style="color:rgb(0,0,0);font-family:sans-serif;font-size:13px;">: Now </span>sequential transfer speeds @ 1800 MHz exceeded 35/34 MB/s. The GL830 is responsible for low throughput -- especially writes are slow as hell.
</p>

<p>
	 
</p>

<p>
	I made then a RAID-1 through mdadm consisting of an external 3TB HDD (good news: the GL830 can deal with partitions larger than 2 TB) and the SSD. First test with the HDD connected to the M3's GL830 bridge <em>(GL)</em> and the SSD connected to the JMS567 <em>(JM)</em>. Then I disconnected the HDD from the GL830 and put it in another external enclosure with an ASMedia 1053 <em>(ASM)</em>. 
</p>

<p>
	 
</p>

<p>
	Obviously SinoVoip's decision to use an internal USB hub and only one host port of the SoC leads in both situations to limited (shared) bandwidth. But in case the internal USB-to-SATA bridge is involved performance is even worse:
</p>

<pre class="ipsCode prettyprint">
GL/JM:        kB  reclen    write  rewrite    read    reread
         4096000       4    17800    17140    14382    16807
         4096000    1024    17741    17258    14493    14368

JM/ASM:  4096000       4    19307    18458    22855    26241
         4096000    1024    19231    18518    21995    22362
</pre>

<p>
	If SinoVoip would've saved the GL830 USB-to-SATA bridge and wired both SoC's host ports to the 2 type-A USB ports directly without the internal hub in between overall performance would be twice as good. And obviously the M3's 'SATA port' is the worst choice to connect a disk to. Any dirt-cheap external USB enclosure will perform better.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>SD-card and eMMC:</strong></span>
</p>

<p>
	 
</p>

<p>
	Just a quick check with the <a href="http://linux-sunxi.org/USB/UAS#Testing_3_different_external_enclosures" rel="external nofollow">usual iozone settings</a> running @ 1.8 GHz:
</p>

<pre class="ipsCode prettyprint">
              kB  reclen    write  rewrite    read    reread 
eMMC:    4096000       4    26572    27014    59187    59239
         4096000    1024    25875    26614    56587    56667

SD-card: 4096000       4    20483    20855    22473    22892
         4096000    1024    20526    19948    22285    22660

</pre>

<p>
	LOL, eMMC twice as fast as 'SATA'. The performance numbers of the SD-card (SanDisk "Extreme Pro") are irrelevant since I can not provide performance numbers from a known fast reference implementation. But since I might be able to provide this the next few days, I decided to give it a try. On older Allwinner SoCs there's a hard limitation regarding SDIO/SD-card speed. Maybe this applies here too.
</p>

<p>
	 
</p>

<p>
	EDIT: Yes, it's a board/SoC limitation. When reading/writing the SD-card on a MacBook Pro I achieve ~80 MB/s. It seems SDIO on A83T is limited to ~20MB/s
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Other issues:</strong></span>
</p>

<p>
	 
</p>

<ul>
<li>
		If you want to try out the M3 you'll have to stay on the bleeding edge. Don't expect that any of the available OS images are close to useable. They just <a href="https://github.com/BPI-SINOVOIP/BPI-M3-bsp/commits/master" rel="external nofollow">recently started to fix a lot of essential bugs</a> in code and hardware initialisation. If you want to test the M3 be prepared to compile the BSP daily and exchange the bootloader/kernel/initialisation stuff on your SD-card/eMMC
	</li>
	<li>
		Currently average load is always 1 or above. When we started over 2 years ago with Cubieboards (and an outdated kernel 3.4.x) there was a similar issue. Maybe it's related. <a href="https://github.com/BPI-SINOVOIP/BPI-M3-bsp/issues/3" rel="external nofollow">I just opened a Github issue</a>
	</li>
	<li>
		Mainline kernel support in very early stage. Don't count on this that soon (situation with Banana Pi M2 was a bit different. All the OS images from SinoVoip based on kernel 3.3 weren't useable but the community provided working distros backed by the work of the linux-sunxi community and existing mainline kernel support for the M2's A31s)
	</li>
	<li>
		Always keep in mind that hardware without appropriate software is somewhat useless. SinoVoip has a long history of providing essential parts of software way too late or not at all (<a href="http://forum.banana-pi.org/c/bpi-m2" rel="external nofollow">still applies to the M2</a> -- before you buy any SinoVoip product better have a look into their forums to get the idea which level of support you can expect: zero). Even worse: For the M2 and its A31s SoC there exists mainline kernel support (everything developed by the community while the vendor held back necessary informations). This does not apply to the A83T used on the M3. At the moment you're somewhat lost since you've to rely on the manufacturer's OS images (all of them currently being broken)
	</li>
</ul>
<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Conclusion:</strong></span>
</p>

<p>
	 
</p>

<p>
	Still no idea what to do with such a device.
</p>

<p>
	 
</p>

<p>
	Integer performance is great when you use a heatsink and even greater with an annoying fan. But where's the use case? If I would use the M3 with Android then everything that's relevant for performance does <strong>not</strong> depend on CPU (but instead CedarX for HW accelerated video decoding and GPU for 2D/3D acceleration -- BTW: the A83T is said to contain only a single core SGX544MP1 but the <a href="https://github.com/BPI-SINOVOIP/BPI-M3-bsp/blob/daaa78441b0d8b8d186dbef188dddc7b597d1d9c/sunxi-pack/chips/sun8iw6p1/configs/BPI_M3_1080P/sys_config.fex#L1878-L1919" rel="external nofollow">fex file's contents let me believe it's a faster MP2 instead</a>).
</p>

<p>
	 
</p>

<p>
	Due to limited I/O and network bandwidth the integer performance is also irrelevant for nearly all kinds of server tasks. If it's just about 'SBC stuff' why wasting so much money? Triggering GPIO pins works also with cheap H3 based boards like Orange Pi PC or <a href="http://www.cnx-software.com/2015/11/26/raspberry-pi-zero-is-a-5-board-based-on-broadcom-bcm2835-processor/#comment-504411" rel="external nofollow">Orange Pi One</a> that also have 4 times more I/O bandwidth compared to the M3 (due to 4 available USB ports instead of one).
</p>

<p>
	 
</p>

<p>
	And if I would really need a performant ARM SoC then I would buy such a thing and not an outdated Cortex-A7 design. I still have no idea what the M3 is made for. Except of selling something under the "Banana" brand to clueless people. Don't know. For my use cases the Banana Pi M1 outperforms the M3 easily -- both regarding price and performance (sufficient CPU power, 3 x USB and real SATA not 'worst USB-to-SATA implementation ever'). As usual: YMMV  <img alt=":)" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" width="20"></p>

<p>
	 
</p>

<p>
	Maybe the worst design decision (next to choosing the crappy Micro-USB connector for DC-IN) on the M3 is the 'SATA port'. If they would've saved both internal USB hub and GL830 and instead use the two available USB host ports then achievable I/O bandwidth would be way higher. Now both USB ports and the 'SATA port' have to share the bandwidth of a single USB 2.0 connection. Almost as bad as with the Raspberry Pis.
</p>

<p>
	 
</p>

<p>
	But most importantly: Check software und support situation first and don't rely on 'hardware features'. Remember: SinoVoip shipped the M2 with OS images where not a single GPIO pin was defined and Ethernet worked only with 100Mb/s since they 'forgot' to define GMAC pins. They fixed that months later but still not for every OS image (the Android image they provide is corrupted since months but they don't care even if users complain several times). <a href="http://forum.banana-pi.org/latest" rel="external nofollow">Visit their forums first to get an idea what to expect</a>. It's important!
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Armbian support:</strong></span>
</p>

<p>
	 
</p>

<p>
	Not to be expected soon. It's worthless when having to rely on Allwinner's old 3.4.39 kernel. I combined <a href="http://www.orangepi.org/orangepibbsen/forum.php?mod=viewthread&amp;tid=342&amp;fromuid=29411" rel="external nofollow">loboris' H3 Debian image</a> with kernel/bootloader stuff for the A83T and it worked as expected (even my RPi-Monitor setup matched almost perfectly).
</p>

<p>
	 
</p>

<p>
	Unless the linux-sunxi community improves mainline support for the A83T this situation won't change. But maybe someone interested in M3 (definitely not me) teaches SinoVoip how to escape from u-boot/kernel without support for script.bin in the meantime. Would be a first step.
</p>
]]></description><guid isPermaLink="false">474</guid><pubDate>Tue, 01 Dec 2015 21:06:44 +0000</pubDate></item><item><title>[Info] FriendlyARM PCM5102A-Hat with NanoPi Neo under mainline  4.x.x and dev 5.x.x</title><link>https://forum.armbian.com/topic/9009-info-friendlyarm-pcm5102a-hat-with-nanopi-neo-under-mainline-4xx-and-dev-5xx/</link><description><![CDATA[<p>
	I did that on a NanoPi Neo with the FriendlyARM PCM5102A Hat
</p>

<p>
	( <a href="https://www.friendlyarm.com/index.php?route=product/product&amp;product_id=169" rel="external nofollow">https://www.friendlyarm.com/index.php?route=product/product&amp;amp;product_id=169</a> )<br />
	using kernel 4.14.87-sunxi and armbian 5.67 (or later would be only 5.65?)<br />
	(before that I did use legacy kernel 3.4.x with the PCM510A)
</p>

<p>
	<br />
	and the armbian-BuildSystem
</p>

<p>
	plus<strong> (THANKS to)</strong> informations in threads from  <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/1092-dony71/?do=hovercard" data-mentionid="1092" href="https://forum.armbian.com/profile/1092-dony71/" rel="">@dony71</a> , <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/2589-christos/?do=hovercard" data-mentionid="2589" href="https://forum.armbian.com/profile/2589-christos/" rel="">@Christos</a>, <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/6956-valery-rezvyakov/?do=hovercard" data-mentionid="6956" href="https://forum.armbian.com/profile/6956-valery-rezvyakov/" rel="">@Valery Rezvyakov</a><br />
	and the the Reference-Threads you could find above <img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20" />
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	BACKUP <abbr title="Device tree blob">DTB</abbr> (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	cp /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.<abbr title="Device tree blob">dtb</abbr> /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.dtb_org
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	CONVERT <abbr title="Device tree blob">dtb</abbr> to <abbr title="Device tree source">dts</abbr> (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	<abbr title="Device tree compiler">dtc</abbr> -I <abbr title="Device tree blob">dtb</abbr> -O <abbr title="Device tree source">dts</abbr> /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.<abbr title="Device tree blob">dtb</abbr> -o /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.<abbr title="Device tree source">dts</abbr>
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	EDIT </strong>/boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.<abbr title="Device tree source">dts</abbr><br />
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>

<p>
	nano /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.<abbr title="Device tree source">dts</abbr>
</p>

<p>
	 
</p>

<p>
	- change: status from "disabled" to "okay"
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	FROM</strong><br />
	 
</p>

<pre class="ipsCode">
                i2s@1c22000 {
                        #sound-dai-cells = &lt;0x0&gt;;
                        compatible = "allwinner,sun8i-h3-i2s";
                        reg = &lt;0x1c22000 0x400&gt;;
                        interrupts = &lt;0x0 0xd 0x4&gt;;
                        clocks = &lt;0x3 0x38 0x3 0x54&gt;;
                        clock-names = "apb", "mod";
                        dmas = &lt;0x13 0x3 0x13 0x3&gt;;
                        resets = &lt;0x3 0x2b&gt;;
                        dma-names = "rx", "tx";
                        status = "disabled";
                        phandle = &lt;0x4e&gt;;
                };</pre>

<p>
	 
</p>

<p>
	<br />
	<strong>TO</strong><br />
	 
</p>

<pre class="ipsCode">
                i2s@1c22000 {
                        #sound-dai-cells = &lt;0x0&gt;;
                        compatible = "allwinner,sun8i-h3-i2s";
                        reg = &lt;0x1c22000 0x400&gt;;
                        interrupts = &lt;0x0 0xd 0x4&gt;;
                        clocks = &lt;0x3 0x38 0x3 0x54&gt;;
                        clock-names = "apb", "mod";
                        dmas = &lt;0x13 0x3 0x13 0x3&gt;;
                        resets = &lt;0x3 0x2b&gt;;
                        dma-names = "rx", "tx";
                        status = "okay";
                        phandle = &lt;0x4e&gt;;
                };</pre>

<p>
	<br />
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	CONVERT (BACK) <abbr title="Device tree source">dts</abbr> to <abbr title="Device tree blob">dtb</abbr> (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	<abbr title="Device tree compiler">dtc</abbr> -I <abbr title="Device tree source">dts</abbr> -O <abbr title="Device tree blob">dtb</abbr> /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.<abbr title="Device tree source">dts</abbr> -o /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.dtb_I2S_okay
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	COPY new <abbr title="Device tree blob">dtb</abbr> over <abbr title="Device tree blob">dtb</abbr> (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	cp /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.dtb_I2S_okay /boot/<abbr title="Device tree blob">dtb</abbr>/sun8i-h3-nanopi-neo.<abbr title="Device tree blob">dtb</abbr><br />
	                <br />
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	COPY sun8i-h3-I2S-out.<abbr title="Device tree source">dts</abbr> to home (working directory on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	copy sun8i-h3-I2S-out.<abbr title="Device tree source">dts</abbr> --&gt;  /home/guido/
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	armbian-add-overlay (on NanoPi Neo)</strong>
</p>

<p>
	does only work if you got the kernel-headers installed for your actual kernel-version
</p>

<p>
	<strong>(at this time the lastest kernel-header are (via armbian-config -&gt; Software -&gt; Install Headers)</strong>
</p>

<p>
	<strong>Linux kernel headers for 4.14.84-sunxi on armhf - so NOT for kernel 4.19.y)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	root@npi-neo(192.168.6.24):/home/guido# armbian-add-overlay ./sun8i-h3-I2S-out.<abbr title="Device tree source">dts</abbr><br />
	Compiling the overlay<br />
	Copying the compiled overlay file to /boot/overlay-user/<br />
	Reboot is required to apply the changes
</p>

<p>
	<br />
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	dtbo is created (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	root@npi-neo(192.168.6.24):/home/guido# ls -l /boot/overlay-user/<br />
	insgesamt 4<br />
	-rw-r--r-- 1 root root 1323 Dez  7 19:34 sun8i-h3-I2S-out.dtbo
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	user-overlay is created in /boot/armbianEnv.txt (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>

<pre class="ipsCode">
verbosity=1
logo=disabled
console=both
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
overlays=usbhost1 usbhost2
rootdev=UUID=33ca90d6-130b-4d5f-a8f4-95b3b97ef5c0
rootfstype=ext4
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
user_overlays=sun8i-h3-I2S-out</pre>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	now REBOOT (on NanoPi Neo)</strong>
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>

<p>
	<strong>root@npi-neo(192.168.6.24):~# lsmod|grep i2s</strong>
</p>

<p>
	sun4i_i2s              16384  0<br />
	snd_soc_core          118784  2 sun4i_i2s,sun8i_codec_analog<br />
	snd_pcm                69632  3 sun4i_i2s,snd_pcm_dmaengine,snd_soc_core<br />
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	EDIT config-default.conf (on armbian-BuildSystem)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	cd /home/guido/build<br />
	nano ./config-default.conf
</p>

<p>
	replace content /home/guido/build/config-default.conf with attached<br />
	config-default.conf_nanopineo
</p>

<p>
	./compile
</p>

<p>
	-&gt; With this conf, script compilation will stop to overwrite kernel source to build patch<br />
	-&gt; At that time, overwrite original Kconfig with the one you modified above
</p>

<p>
	(at "Make changes to U-Boot" press ENTER to proceed)
</p>

<p>
	wait for<br />
	"Make your changes to /home/guido/build/cache/sources/linux-mainline/linux-4.14.y then press ENTER"<br />
	BUT DONT PRESS ENTER YET
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	EDIT/SAVE Kconfig in a 2nd shell-Window (on armbian-BuildSystem)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	nano /home/guido/build/cache/sources/linux-mainline/linux-4.14.y/sound/<abbr title="System On a Chip">soc</abbr>/codecs/Kconfig
</p>

<p>
	 
</p>

<p>
	<strong>the part FROM</strong><br />
	 
</p>

<pre class="ipsCode">
config SND_SOC_PCM5102A
    tristate
</pre>

<p>
	<strong>TO</strong><br />
	 
</p>

<pre class="ipsCode">
config SND_SOC_PCM5102A
    tristate "Texas Instruments PCM5102A CODEC - I2S"</pre>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	NOW PRESS ENTER in the 1st shell-Windows (.compile.sh) (on armbian-BuildSystem)</strong>
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>

<p>
	-&gt; Then script compilation will stop again to ask whether you want to add pcm5102a to compile<br />
	-&gt; Default is N, <strong>so you need to enter m for module compilation</strong><br />
	Texas Instruments PCM5102A CODEC - I2S (SND_SOC_PCM5102A) [N/m/?] (NEW)<strong> m = m for module compilation</strong><br />
	 
</p>

<p>
	After compile is complete<br />
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	copy (via SCP/FTP?) the .deb's from /home/guido/build/output/debs (on armbian-BuildSystem) <br />
	to /home/guido/ (on the NanoPi Neo)</strong>
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	<strong>INSTALL the .deb's (here only header and image - because it was already 5.67 (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	cd /home/guido <br />
	dpkg -i ./linux-headers-next-sunxi_5.67_armhf.deb<br />
	dpkg -i ./linux-image-next-sunxi_5.67_armhf.deb<br />
	(image did include the .ko module for the pcm5102a)
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>

<p>
	<strong>now REBOOT (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>

<p>
	<strong> </strong>
</p>

<p>
	<strong>=====================================================================================<br />
	=====================================================================================</strong><br />
	<span style="font-size:18px;"><strong><em>!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ATTENTION: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</em></strong></span><br />
	After reboot my NanoPi Neo show the following armbian-version:<br />
	ARMBIAN 5.65 stable Debian GNU/Linux 9 (stretch) 4.14.84-sunxi<br />
	and 2 upgrades for headers&amp;image (without the PCM5102A support)
</p>

<p>
	please keep in mind to freeze the kernel-updates in armbian-config<br />
	for not to loose the support (module) for the PCM5120A!<br />
	armbian-config -&gt; system -&gt; Freeze Disable kernel upgrades<br />
	<strong>=====================================================================================<br />
	=====================================================================================</strong>
</p>

<p>
	<br />
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	BE HAPPY about a successful i2s mapping in dmesg (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	root@npi-neo(192.168.6.24):~# dmesg|grep -i i2s<br />
	[    6.911751] asoc-simple-card sound_i2s: pcm5102a-hifi &lt;-&gt; 1c22000.i2s mapping ok
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	I enabled also ananlog-Codec (on NanoPi Neo)<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	root@npi-neo(192.168.6.24):/home/guido# aplay -l<br />
	**** Liste der Hardware-Geräte (PLAYBACK) ****<br />
	Karte 0: Codec [H3 Audio Codec], Gerät 0: CDC PCM Codec-0 []<br />
	  Sub-Geräte: 1/1<br />
	  Sub-Gerät #0: subdevice #0<br />
	Karte 1: I2Smaster [I2S-master], Gerät 0: 1c22000.i2s-pcm5102a-hifi pcm5102a-hifi-0 []<br />
	  Sub-Geräte: 1/1<br />
	  Sub-Gerät #0: subdevice #0
</p>

<p>
	<br />
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	/etc/asound.conf (on NanoPi Neo) - later I2S did switch automatically to card 0 <span><span><img alt=":(" data-emoticon="" data-ratio="100.00" height="20" src="https://forum.armbian.com/uploads/emoticons/default_sad.png" srcset="https://forum.armbian.com/uploads/emoticons/sad@2x.png 2x" title=":(" width="20" /></span></span><br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong><br />
	 
</p>

<pre class="ipsCode">
pcm.!default {
    type hw
    card 1
    device 0
}

ctl.!default {
    type hw
    card 1
}


</pre>

<p>
	 
</p>

<p>
	<strong><span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span><br />
	Reference-Threads<br />
	<span style="font-size:16px;">----------------------------------------------------------------------------------------------------------------------------------</span></strong>
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedcontent="" data-embedid="embed3992502848" scrolling="no" src="https://forum.armbian.com/topic/5643-h3-i2s0-dt-overlay/?do=embed" style="height:221px;max-width:502px;"></iframe><iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedcontent="" data-embedid="embed1438116885" scrolling="no" src="https://forum.armbian.com/topic/8740-pcm5102-dac-not-showing-on-armbian-565-solved?do=embed" style="height:339px;max-width:502px;"></iframe><iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedcontent="" data-embedid="embed3871895372" scrolling="no" src="https://forum.armbian.com/topic/3596-nanohat-pcm5102a-for-nano-pi-neo-air/?do=embed" style="height:341px;max-width:502px;"></iframe>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink" data-fileext="mod_nanopineo" data-fileid="3593" href="https://forum.armbian.com/applications/core/interface/file/attachment.php?id=3593" rel="">config-default.conf.mod_nanopineo</a>
</p>

<p>
	<a class="ipsAttachLink" data-fileext="dts" data-fileid="3594" href="https://forum.armbian.com/applications/core/interface/file/attachment.php?id=3594" rel="">sun8i-h3-I2S-out.<abbr title="Device tree source">dts</abbr></a>
</p>
]]></description><guid isPermaLink="false">9009</guid><pubDate>Sat, 08 Dec 2018 18:13:59 +0000</pubDate></item><item><title>armbian-gaming : A tool to install Box86, Box64 and Wine on Armbian Hirsute</title><link>https://forum.armbian.com/topic/18942-armbian-gaming-a-tool-to-install-box86-box64-and-wine-on-armbian-hirsute/</link><description><![CDATA[<p>
	Hi all.
</p>

<p>
	I've created a tool to install Box86, Box64 and Wine onto Armbian Hirsute 5.13
</p>

<p>
	<br />
	I've tested it on RK3399. Should work on any device with <abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr> drivers enabled.
</p>

<p>
	<br />
	Please let me know on what it works, or if it doesn't.
</p>

<p>
	 
</p>

<p>
	Here is the script.<br />
	<a href="https://github.com/NicoD-SBC/armbian-gaming" rel="external nofollow">https://github.com/NicoD-<abbr title="Single board computer">SBC</abbr>/armbian-gaming</a>
</p>

<p>
	 
</p>

<p>
	I also made a video where I show how to use it.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/_sxX9d26414?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18942</guid><pubDate>Tue, 14 Sep 2021 15:51:30 +0000</pubDate></item><item><title>Extensions  tutorial</title><link>https://forum.armbian.com/topic/44122-extensions-tutorial/</link><description><![CDATA[<p>
	I was working on blog article for our site about usage of Armbian extensions and I would be glad if it could be useful for the community
</p>

<p>
	 
</p>

<p>
	It is on <a href="https://github.com/pavlot-scriptec/scriptec-blog/blob/main/customize_armbian_image_using_extensions.md" rel="external nofollow">https://github.com/pavlot-scriptec/scriptec-blog/blob/main/customize_armbian_image_using_extensions.md</a>
</p>

<p>
	 
</p>

<p>
	Also I have created <a href="https://github.com/pavlot-scriptec/scriptec-armbian-ext-waveshare-35tft" rel="external nofollow">extension</a> to enable Waveshare 3.5 TFT displays for <abbr title="Raspberry Pi"><abbr title="Raspberry Pi">RPi</abbr></abbr> (and maybe other platforms).
</p>

<p>
	 
</p>

<p>
	Any feedback is wellcome
</p>
]]></description><guid isPermaLink="false">44122</guid><pubDate>Sat, 24 Aug 2024 16:25:03 +0000</pubDate></item><item><title>Using different desktop environments on Armbian</title><link>https://forum.armbian.com/topic/10526-using-different-desktop-environments-on-armbian/</link><description><![CDATA[<p>
	Hi all. I've done a lot of tests with different desktop environments on Armbian.
</p>

<p>
	I wanted an as light as possible desktop environment so I'd have enough ram left to do video rendering with the NanoPi M4(2GB)<br>
	I had to try a lot of things to get things working fine. So I wanted to save others that hassle.
</p>

<p>
	 
</p>

<p>
	<u><strong>Setting up Display Manager</strong></u>
</p>

<p>
	<br>
	First we need a Display Manager. NODM is installed by default. I tried lightdm but couldn't get it to work. So I went for LXDM. With NODM installed I had problems, so I also removed NODM.<br>
	To be sure lxdm is configured right, I also manually configure it.
</p>

<pre class="ipsCode">
sudo apt install lxdm
sudo apt remove nodm
sudo dpkg-reconfigure lxdm</pre>

<p>
	<u><strong>Install LXDE Desktop</strong></u>
</p>

<p>
	 
</p>

<p>
	Next step is to install the desktop environment you want. There is a problem with some Desktop Environments and LXDM what makes you can't login to some DE's out of the box. That we will resolve later. Easiest is to install lxdm first to be able to configure the others well. And reboot.
</p>

<pre class="ipsCode">
sudo apt install lxde
sudo reboot</pre>

<p>
	Once booted you should be greeted by the Login screen. Here you can choose your different Desktop Environment. Choose LXDE and login.<br>
	If you'd try xfce4, then you'd see it doesn't work. To fix this we need to change the file /usr/share/xsessions/xfce.desktop. Use your favorite text editor. I use geany.<br>
	 
</p>

<pre class="ipsCode">
sudo geany /usr/share/xsessions/xfce.desktop</pre>

<p>
	Somewhere at the top of the file you'll see "<strong>Name=Xfce Session</strong>". Replace that space with a hyphen to "<strong>Name=Xfce-Session</strong>" and save the file.<br>
	Now you can also login to the default XFCE4 Desktop.<br>
	With other desktops this can be the same. Go the the same directory and open the file with the desktop name that doesn't work. Again replace the space with a hyphen<br>
	 
</p>

<p>
	<strong><u>Installing different Desktop Environments. </u></strong>
</p>

<p>
	For the Mate desktop I also needed to install the applets, else I got errors at login because of these missing applets
</p>

<pre class="ipsCode">
sudo apt install mate-desktop-environment mate-applets</pre>

<p>
	For KDE-Plasma
</p>

<pre class="ipsCode">
sudo apt install kde-full</pre>

<p>
	For Gnome. Modify the file sudo geany /usr/share/xsessions/gnome...
</p>

<pre class="ipsCode">
sudo apt install gnome-session
sudo update-alternatives --config gdm3.css</pre>

<p>
	<br>
	I also tried LXQT. But this one didn't work. You can try others too.
</p>

<p>
	<br><u><strong>Remove Desktop Environment</strong></u>
</p>

<p>
	To remove a desktop environment you don't want anymore you do the remove instead of install.
</p>

<pre class="ipsCode">
sudo apt remove kde-full 
sudo apt remove mate-desktop-environment
.
.
.</pre>

<p>
	<br>
	Please let me know if there's mistakes made, or if you've got advice.<br>
	Source for changing the name to make them work <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/5018-igors/?do=hovercard" data-mentionid="5018" href="https://forum.armbian.com/profile/5018-igors/" rel="">@IgorS</a> :
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="5018" data-embedcontent="" data-embedid="embed2201158522" scrolling="no" src="https://forum.armbian.com/topic/3960-ubuntu-desktop-with-lxdm-display-manager-xfce4-mate-lxde-and-openbox-desktops/?do=embed" style="height:236px;max-width:502px;"></iframe>

<p>
	<br>
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">10526</guid><pubDate>Sun, 02 Jun 2019 17:44:53 +0000</pubDate></item><item><title>Docker on armbian!</title><link>https://forum.armbian.com/topic/490-docker-on-armbian/</link><description><![CDATA[<p>
	Hello everyone!
</p>

<p>
	 
</p>

<p>
	Is there anyone who tried to run Docker on armbian?
</p>

<p>
	 
</p>

<p>
	Ok, let's start from the beginning: I am from the Hypriot Team (we made Docker available on ARM) and recently saw some guys successfully playing with Docker on armbian. Meanwhile, we know, that our Docker runs at least on the Cubietrack and Lamobo R1/BananaPi R1 on top of armbian!
</p>

<p>
	 
</p>

<p>
	This is awesome because, you know, IoT is coming, and Docker on ARM helps get a grip on many challenges induced by IoT. However, we were only able to support Docker on Raspberry Pis so far...  Imagine if Docker would run on more than just a few ARM boards! Armbian seems an awesome platform to extend the family of Docker compatible boards.
</p>

<p>
	 
</p>

<p>
	So, I wonder if there is anyone who tried to run Docker on armbian?
</p>

<p>
	 
</p>

<p>
	If you are now curious about this topic and wanna get started, please see this blog post of how to install Docker on ARM within no time: <a href="http://blog.hypriot.com/post/family_arm_hardware_for_docker_more_children/" rel="external nofollow">http://blog.hypriot.com/post/family_arm_hardware_for_docker_more_children/</a>
</p>

<p>
	 
</p>

<p>
	Looking forward to get in touch with you guys!
</p>
]]></description><guid isPermaLink="false">490</guid><pubDate>Tue, 08 Dec 2015 23:48:40 +0000</pubDate></item><item><title>Upgrading Armbian from bullseye to bookworm</title><link>https://forum.armbian.com/topic/35402-upgrading-armbian-from-bullseye-to-bookworm/</link><description><![CDATA[<p>
	<u>Step 1 - Install the Armbian PGP key and update your APT sources</u>
</p>

<p>
	 
</p>

<ul>
	<li>
		Install <strong>armbian.gpg</strong> to <strong>/usr/share/keyrings/armbian.gpg  (mode 644)</strong>

		<ul>
			<li>
				You can use a copy from another one of your SBCs, or...
			</li>
			<li>
				... you can download and install like below (thanks <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/211203-brewninja/?do=hovercard" data-mentionid="211203" href="https://forum.armbian.com/profile/211203-brewninja/" rel="">@BrewNinja</a> for the example)
			</li>
		</ul>
	</li>
</ul>

<pre class="ipsCode">touch /usr/share/keyrings/armbian.gpg
chmod 644 /usr/share/keyrings/armbian.gpg
wget https://apt.armbian.com/armbian.key -O - | gpg --dearmor &gt;/usr/share/keyrings/armbian.gpg
</pre>

<p>
	 
</p>

<ul>
	<li>
		Edit <strong>/etc/apt/sources.list</strong>

		<ul>
			<li>
				Replace all instances of <strong>bullseye</strong> with <strong>bookworm</strong>
			</li>
		</ul>
	</li>
	<li>
		Edit <strong>/etc/apt/sources.list.d/armbian.list</strong>
		<ul>
			<li>
				<p>
					<strong>deb [signed-by=/usr/share/keyrings/armbian.gpg] <a href="http://apt.armbian.com" rel="external nofollow">http://apt.armbian.com</a> bookworm main bookworm-utils bookworm-desktop</strong>
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Edit any other files in <strong>/etc/apt/sources.list.d</strong> as appropriate, to replace <strong>bullseye</strong><strong> </strong>with <strong>bookworm</strong>
		</p>
	</li>
</ul>

<p>
	 
</p>

<p>
	<u>Step 2</u>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt update</span></pre>

<p>
	 
</p>

<p>
	<u>Step 3</u>
</p>

<p>
	 
</p>

<p>
	<strong>NOTE - WHEN RUNNING THE BELOW COMMANDS, DO NOT ACCEPT ANY INTERACTIVE PROMPTS FOR CHANGING </strong><u>/etc/initramfs-tools/initramfs.conf</u>
</p>

<ul>
	<li>
		<span style="font-family:'Open Sans', '-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">The default is not to accept the changes anyway - but I am noting this here to be extra careful</span>
	</li>
	<li>
		<span style="font-family:'Open Sans', '-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">I've checked - the changes may differ from what armbian has in the latest images</span>
	</li>
</ul>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">apt upgrade --no-new-pkgs
apt full-upgrade
apt dist-upgrade</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">35402</guid><pubDate>Fri, 01 Mar 2024 01:44:46 +0000</pubDate></item><item><title>Nethadone - An adaptive router to train users out of compulsive internet usage using an Opi R1Plus</title><link>https://forum.armbian.com/topic/42697-nethadone-an-adaptive-router-to-train-users-out-of-compulsive-internet-usage-using-an-opi-r1plus/</link><description><![CDATA[<p>
	Hi everyone, it's been a while since i've posted but I have a new project that i'd like to share and hopefully get feedback and ideas from the community.
</p>

<p>
	 
</p>

<p>
	Ever since the first 2 x gigabit ethernet devices came out, I've been thinking that there were a lot of potentially interesting networking use cases.
</p>

<p>
	 
</p>

<p>
	I happened to be re-configuring pihole on a new <abbr title="Orange Pi">opi</abbr> zero, and I had some hardware issues that caused my connection to be a bit flaky on a website that I "shouldn't" have been using. This gave me the inspiration to create a gateway that intentionally manipulates traffic in such a way that you train good usage habits of websites that can be addictive.
</p>

<p>
	 
</p>

<p>
	<strong>How does it work?</strong>
</p>

<p>
	 
</p>

<p>
	Nethadone leverages several eBPF programs to monitor and classify routed traffic as it passes through. Based on the configured policies, packets are slotted into a series of bandwidth classes.
</p>

<p>
	 
</p>

<p>
	For anyone not familiar with eBPF, it's a powerful capability of newer Linux kernels, that allows C and Rust code to be compiled and run in a sort of kernel-space sandbox and loaded in realtime. Due to the efficiency of JIT-optimized eBPF code running inside the kernel, features that were possible only with expensive networking equipment are now feasible on something like an Orange Pi R1Plus.
</p>

<p>
	 
</p>

<p>
	The flow of a packet through the moving parts of the system is here:
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://forum.armbian.com/uploads/monthly_2024_07/nethadone-overview.png.6315cf289929e6bb0d41cae52d48a60d.png" data-fileid="12768" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="12768" data-ratio="53.90" width="1000" alt="nethadone-overview.thumb.png.a3a9dac717500e296cc3f5359c0b13a7.png" src="https://forum.armbian.com/uploads/monthly_2024_07/nethadone-overview.thumb.png.a3a9dac717500e296cc3f5359c0b13a7.png" /></a>
</p>

<p>
	 
</p>

<p>
	There are three eBPF modules at work:
</p>

<ul>
	<li>
		A traffic monitor captures (saddr, daddr) pairs from clients on the network to external IPs, counting the bytes used. These counters are exposed by the webapp and collected in a local prometheus instance.
	</li>
	<li>
		A DNS sniffer captures DNS requests passing through the router, in order to cache the likely domain of a given IP address
	</li>
	<li>
		A throttler eBPF is dynamically recompiled based on traffic patterns, and classifies traffic based on a policy.
	</li>
</ul>

<p>
	 
</p>

<p>
	Packets classified into one of the slower bandwidth classes ends up passing through a <a href="https://www.man7.org/linux/man-pages/man8/tc-netem.8.html" rel="external nofollow">netem qdisc</a>, which simulates a slower network connection. As "bad" usage continues, the policy is changed until traffic is passing through the equivalent of a 56k modem. I think most people here would probably get the hint and stop scrolling if they were forced to use a telephone-based modem again <img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20" />
</p>

<p>
	 
</p>

<p>
	<strong>Deployment Example</strong>
</p>

<p>
	 
</p>

<p>
	This diagram shows how I've installed it at home - any device connected to the nethadone AP is subject to throttling:
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://forum.armbian.com/uploads/monthly_2024_07/nethadone-secondary-network.drawio.png.b5396c909350bc47cbce8f2f7b1449ad.png" data-fileid="12769" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="12769" data-ratio="59.40" width="1000" alt="nethadone-secondary-network.drawio.thumb.png.ea8a67cc9cc0441ec39bbeeecdfb4fee.png" src="https://forum.armbian.com/uploads/monthly_2024_07/nethadone-secondary-network.drawio.thumb.png.ea8a67cc9cc0441ec39bbeeecdfb4fee.png" /></a>
</p>

<p>
	 
</p>

<p>
	This setup was mainly to have an easy way to get back online if there were issues, but after a couple of weeks of general usage with both desktop and mobile clients, there have been no major issues, apart from the need to restart after 24h or so.
</p>

<p>
	 
</p>

<p>
	<strong>Armbian-related TODOs</strong>
</p>

<p>
	 
</p>

<p>
	While there are some things that could be better, the tool is working well enough that it has already had a positive impact on my and my wife's usage of a number of sites. My goal is to now make it as user-friendly to set up as possible.
</p>

<p>
	 
</p>

<p>
	One big issue is that Armbian understandably does not enable BTF in the images that ship. The <a href="https://github.com/daeuniverse/dae" rel="external nofollow">dae project</a> has been a life-saver, providing BTF-enabled kernel builds for a lot of devices for Armbian 23.08.
</p>

<p>
	 
</p>

<p>
	I tried to create a custom image with a BTF-enabled kernel, but had a lot of difficulty getting something bootable and set it aside. I also ran into some kernel configuration issues when attempting to make an older <abbr title="Orange Pi">OPI</abbr> R1 (not plus) work, even with the dae kernels.
</p>

<p>
	 
</p>

<p>
	My gratitude to everyone who helps maintain Armbian and helps on this forum. In the coming weeks as I try to work on making it easier to use this on other devices, I may seek out some advice from forum members on how to work through these issues.
</p>

<p>
	 
</p>

<p>
	For anyone interested in trying it out, or wants to find out more about how to use eBPF on an arm-based device, the code and documentation can be found here:
</p>

<p>
	<a href="https://github.com/atomic77/nethadone" rel="external nofollow">https://github.com/atomic77/nethadone</a>
</p>

<p>
	 
</p>

<p>
	<span class="ipsEmoji">👋</span>
</p>

<p>
	-Alex
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">42697</guid><pubDate>Sun, 21 Jul 2024 01:00:19 +0000</pubDate></item><item><title>Configuring MPD audio_output on Allwinner A20 (BananaPi M1)</title><link>https://forum.armbian.com/topic/17433-configuring-mpd-audio_output-on-allwinner-a20-bananapi-m1/</link><description><![CDATA[<p>
	MPD as installed by Armbian needs this audio_output configuration in /etc/mpd.conf in order to use the volume control of the on-board sound with Armbian mainline kernel 5.x on the BananaPi M1 (and maybe other A20 boards):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">audio_output {
    type        "alsa"
    name        "BananaPi BuiltIn"
    device        "hw:0,0"
    mixer_type      "hardware"
    mixer_device    "default"
    mixer_control    "Power Amplifier"
}</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">17433</guid><pubDate>Mon, 05 Apr 2021 21:13:39 +0000</pubDate></item><item><title>How to put 2 NVMe m.2 disk on a NanoPC-T6</title><link>https://forum.armbian.com/topic/41213-how-to-put-2-nvme-m2-disk-on-a-nanopc-t6/</link><description><![CDATA[<p>
	Hello,
</p>

<p>
	 
</p>

<p>
	I apologize in advance if I haven't put the topic in the right section.
</p>

<p>
	 
</p>

<p>
	I want to share my experience with NanoPC-T6 and two NVMe m.2 disk.<br />
	I use my NanoPC-T6 for a small server.<br />
	In the beginning I had 2 SSDs and an M.2 to 2 SATA adapter.<br />
	But I never found the right solution to power both the NanoPC-T6 and the SSDs from 1 place.<br />
	After some internet searching I was able to find a solution on how to put 2 NVMe drives on my NanoPC-T6
</p>

<p>
	As you know NanoPC-T6 has 1 M.2 M-Key connector with PCIe 3.0 x4<br />
	There is also one PCIe which is M.2 E-key connector with PCIe 2.1 x1<br />
	With this adapter:<br />
	<a href="https://www.aliexpress.com/item/1005004762924052.html" rel="external nofollow">https://www.aliexpress.com/item/1005004762924052.html</a><br />
	I am using M.2 E-key to M.2 M-Key.
</p>

<p>
	The version of the kernel I use is 6.1.43-vendor-rk35xx.
</p>

<p>
	The speed that the NVMe disk on the adapter board can reach is about 400MB per second, which is quite good for my needs.
</p>

<p>
	I am attaching some pictures.
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="12644" href="https://forum.armbian.com/uploads/monthly_2024_06/New_NVMe.jpg.32ece3f1b4a627de44462e9abb19e13c.jpg" rel=""><img alt="New_NVMe.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="12644" data-ratio="133.21" width="563" src="https://forum.armbian.com/uploads/monthly_2024_06/New_NVMe.thumb.jpg.8bbe960e6c16cc600cdb4ae4e4a2fbb8.jpg" /></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="12645" href="https://forum.armbian.com/uploads/monthly_2024_06/test_nvme_1.jpg.696213590e544213929d077581c6464b.jpg" rel=""><img alt="test_nvme_1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="12645" data-ratio="133.21" width="563" src="https://forum.armbian.com/uploads/monthly_2024_06/test_nvme_1.thumb.jpg.b5e6db8c7459f1084673fdf8824f4274.jpg" /></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="12646" href="https://forum.armbian.com/uploads/monthly_2024_06/test_nvme_2.jpg.3e3c9fbf4692dca58c02bf9985160e07.jpg" rel=""><img alt="test_nvme_2.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="12646" data-ratio="75" width="1000" src="https://forum.armbian.com/uploads/monthly_2024_06/test_nvme_2.thumb.jpg.10265655c44f6ada96c83d490dfb5c60.jpg" /></a>
</p>

<p>
	 
</p>

<p>
	I hope this is useful for you. If there are any questions, I'm at the meeting to answer them.
</p>

<p>
	Regards,
</p>
]]></description><guid isPermaLink="false">41213</guid><pubDate>Sat, 15 Jun 2024 05:19:54 +0000</pubDate></item><item><title>[How-To] Internet Source from WIFI To Ethernet [Bridge WiFi to Ethernet]</title><link>https://forum.armbian.com/topic/20516-how-to-internet-source-from-wifi-to-ethernet-bridge-wifi-to-ethernet/</link><description><![CDATA[<p>
	Hello im new and im Italian so i hope you will not hate me if i write not perfectly (Who said Google Translate?? No No No)
</p>

<p>
	 
</p>

<p>
	This Guide is for a "client to client" setup of the box, we will internally switch Wifi to Eth, so a working computer can access internet from its eth port even if the router signal source is wireless.
</p>

<p>
	 
</p>

<p style="text-align:center;">
	<span style="font-size:16px;"><strong>Router AP</strong> -----&gt; <strong>ARM BOX</strong> [<strong>WIFI</strong> internal or usb dongle] ===&gt;&gt; <strong>internal eth0</strong> ------&gt; ethernet <strong>cable</strong> --&gt; <strong>client eth</strong> port</span>
</p>

<p>
	 
</p>

<ul>
	<li>
		Make sure WiFi in arm box is connected using <strong>nmtui</strong> command

		<ul>
			<li>
				<span style="color:#e74c3c;">FROM NOW ON</span> <strong>&lt;WIFI CARD&gt;</strong> is the wifi adapter name <strong>es:</strong> replace "&lt;WIFI CARD&gt;" with<strong> "</strong>wlx0013eff301ee"
			</li>
		</ul>
	</li>
	<li>
		Execute: sudo apt-get update &amp;&amp; sudo apt-get install dnsmasq iptables iptables-persistent -y
		<ul>
			<li>
				say <strong>no</strong> to save actual iptables rules (we dont have any yet)
			</li>
		</ul>
	</li>
	<li>
		Edit /etc/network/interfaces
		<ul>
			<li>
				comment if exist the part of eth0 "iface eth0" to "#iface eth0"
			</li>
			<li>
				add those lines
			</li>
			<li>
				<pre class="ipsCode">allow-hotplug eth0
	iface eth0 inet static
		address 172.24.1.1
		netmask 255.255.255.0
		network 172.24.1.0
		broadcast 172.24.1.255
		dns-nameservers 1.1.1.1 1.0.0.1
	#########{Static}###########
	up ip addr add 172.24.0.1/24 dev eth0</pre>
			</li>
		</ul>
	</li>
	<li>
		execute those commands
		<ul>
			<li>
				REMEMBER TO REPLACE &lt;WIFI CARD&gt;
			</li>
			<li>
				<pre class="ipsCode">ip addr add 172.24.0.1/24 dev eth0
iptables -A FORWARD -o &lt;WIFI CARD&gt; -i eth0 -s 172.24.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o &lt;WIFI CARD&gt; -j MASQUERADE
sh -c "iptables-save &gt; /etc/iptables.ipv4.nat"
sh -c "echo 1 &gt; /proc/sys/net/ipv4/ip_forward"
/etc/init.d/dnsmasq stop
cp /etc/dnsmasq.conf /etc/dnsmasq.conf-backup</pre>
			</li>
		</ul>
	</li>
	<li>
		Edit /etc/dnsmasq.conf inserting
		<ul>
			<li>
				<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">interface=eth0
listen-address=172.24.1.1
bind-interfaces
server=1.1.1.1 
domain-needed
bogus-priv
dhcp-range=172.24.0.100,172.24.0.250,72h</span></pre>
			</li>
		</ul>
	</li>
	<li>
		Edit /etc/sysctl.conf inserting
		<ul>
			<li>
				<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">net.ipv4.conf.default.forwarding=1
net.ipv4.conf.all.forwarding=1</span></pre>
			</li>
		</ul>
	</li>
	<li>
		Edit /etc/<abbr title="Release candidate"><abbr title="Release candidate">rc</abbr></abbr>.local inserting before "exit 0"
		<ul>
			<li>
				<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">iptables-restore &lt; /etc/iptables.ipv4.nat</span></pre>
			</li>
		</ul>
	</li>
	<li>
		execute those commands
		<ul>
			<li>
				<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">systemctl enable dnsmasq
systemctl enable iptables</span></pre>
			</li>
		</ul>
	</li>
</ul>

<p>
	 
</p>

<p>
	 
</p>

<p>
	Explainations:
</p>

<p>
	 
</p>

<p>
	We set static net to eht0 then we set routing in iptables [forward and back] wlan&lt;-&gt;eth then we make this setup persistent so that will persist after reboot.<br />
	<br />
	Working on my RK3318 Armbian bullseye 5.15 minimal and USB3 dongle RTL8814AU (also tested with a 8812au)
</p>
]]></description><guid isPermaLink="false">20516</guid><pubDate>Fri, 29 Apr 2022 11:42:19 +0000</pubDate></item><item><title>pyGPIO - A 'more general' python GPIO library</title><link>https://forum.armbian.com/topic/5662-pygpio-a-more-general-python-gpio-library/</link><description><![CDATA[<p>
	 
</p>

<p>
	The pyA20 gpio library is quite famous when people start to play with gpios , spi or i2c on sunxi boards but mapping needs often adjustments to work on your own board. This situation is not really friendly for 'beginners'.  pyGPIO should help to make armbian a little bit more 'IoT friendly'. <img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20"></p>

<p>
	I didn't touch the 'backbone' of pyA20, so the syntax should be similar to its original (except pinname when using port instead of connector). 
</p>

<p>
	 
</p>

<p>
	<strong>How can I use this library:</strong>
</p>

<p>
	Cause all of this boards have (more or less) the same pinheader (sometimes other pins are deployed on the pinheader) pyGPIO tries to unify the mappings, so that code can be shared and deployed on all boards without touching the code. The mapping follows the pin naming of the RaspberryPi (it's not because I think their naming is perfect, but it should be the easiest way to port code from the 'RPi world' to Armbian.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="1943" href="https://forum.armbian.com/uploads/monthly_2017_11/mapping_small.png.90b121ff046ae26319cb83852b8ef000.png" rel=""><img alt="mapping_small.thumb.png.4b17fe118586840c19c212358a412f6a.png" class="ipsImage ipsImage_thumbnailed" data-fileid="1943" src="https://forum.armbian.com/uploads/monthly_2017_11/mapping_small.thumb.png.4b17fe118586840c19c212358a412f6a.png"></a>
</p>

<p>
	<strong>What is done:</strong>
</p>

<p>
	-Initial support for:
</p>

<ul><li>
		OrangePi Zero/PcPlus/Lite/Plus2E
	</li>
	<li>
		NanoPi Duo(with and without Minishield)/Neo
	</li>
	<li>
		Olimex Lime/Lime2/Micro (pins are not renamed PG10,PG11 etc. instead of GPIO2, GPIO3 etc. cause those boards doesn't have a 'RPi Pinheader'
	</li>
	<li>
		Templates for 24,26 and 40 'RPi compatible' pin header
	</li>
</ul><p>
	-Board detection (when using Armbian) to check if your board is supported
</p>

<p>
	-Manual assignment when your board is not supported (yet) or automatic board detection fails
</p>

<p>
	 
</p>

<p>
	<strong>What is not done:</strong>
</p>

<ul><li>
		Testing
	</li>
	<li>
		testing
	</li>
	<li>
		testing!
	</li>
	<li>
		Documentation
	</li>
	<li>
		Meaningful examples (still the originals from olimex which wouldn't work anymore)
	</li>
</ul><p>
	 
</p>

<p>
	<strong>What do you need to test the Library:</strong>
</p>

<p>
	You need python-dev and the Library which you'll find on my <a href="https://github.com/chwe17/pyGPIO" rel="external nofollow">GitHub</a> page. The installation should be easy, just follow the instructions...  <img alt=";)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_wink.png" srcset="https://forum.armbian.com/uploads/emoticons/wink@2x.png 2x" title=";)" width="20"></p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo apt-get install python-dev
git clone https://github.com/chwe17/pyGPIO.git
cd pyGPIO
sudo python setup.py install</span></pre>

<p>
	 
</p>

<p>
	Testing is the part where I need help. I don't have most of the boards which are supported (only OPi0 and OPi Pc Plus). I tested I2C and GPIO on the OPi0, for all the rest, I need you as testers, bug hunters, and feedback.
</p>

<p>
	 
</p>

<p>
	Here are two short python snippets which should do the exact same thing (once with connector, you have to run them as <strong>root</strong> or with <strong>sudo</strong> otherwise it would not work!):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">import os, sys

if not os.getegid() == 0:
	sys.exit('start script as root')
	
from pyGPIO.gpio import gpio, connector
from time import sleep

gpio.init()
gpio.setcfg(connector.GPIOp7, 1)  #pin 7 as output

n = 0
while n &lt; 5:
	gpio.output(connector.GPIOp7, 1)
	sleep(1)
	gpio.output(connector.GPIOp7, 0)
	sleep(1)
	n +=1

sys.exit('finished ;-)')</span></pre>

<p>
	and once with port:
</p>

<pre class="ipsCode prettyprint prettyprinted">
<span class="kwd">import</span><span class="pln"> os</span><span class="pun">,</span><span class="pln"> sys

</span><span class="kwd">if</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> os</span><span class="pun">.</span><span class="pln">getegid</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
	sys</span><span class="pun">.</span><span class="pln">exit</span><span class="pun">(</span><span class="str">'start script as root'</span><span class="pun">)</span><span class="pln">
	
</span><span class="kwd">from</span><span class="pln"> pyGPIO</span><span class="pun">.</span><span class="pln">gpio </span><span class="kwd">import</span><span class="pln"> gpio</span><span class="pun">,</span><span class="pln"> port
</span><span class="kwd">from</span><span class="pln"> time </span><span class="kwd">import</span><span class="pln"> sleep

gpio</span><span class="pun">.</span><span class="pln">init</span><span class="pun">()</span><span class="pln">
gpio</span><span class="pun">.</span><span class="pln">setcfg</span><span class="pun">(</span><span class="pln">port</span><span class="pun">.</span><span class="pln">GPIO4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">  </span><span class="com">#gpio4 as output</span><span class="pln">

n </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">:</span><span class="pln">
	gpio</span><span class="pun">.</span><span class="pln">output</span><span class="pun">(</span><span class="pln">port</span><span class="pun">.</span><span class="pln">GPIO4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
	sleep</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
	gpio</span><span class="pun">.</span><span class="pln">output</span><span class="pun">(</span><span class="pln">port</span><span class="pun">.</span><span class="pln">GPIO4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
	sleep</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
	n </span><span class="pun">+=</span><span class="lit">1</span><span class="pln">

sys</span><span class="pun">.</span><span class="pln">exit</span><span class="pun">(</span><span class="str">'finished ;-)'</span><span class="pun">)</span></pre>

<p>
	Annotation: When using NanoPi Duo you've to possibilities with or without Minishield. Pin name is the same on both possibilities but when using port but pin numbering when using connector:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">Minishield:

3.3V			|1·|	5V
GPIO2 	I2C0_SDA	|3·|	5V
GPIO3	I2C_SCL		|5·|	GND
GPIO4			|··|	GPIO14	UART1_TX
GND			|··|	GPIO15	UART1_RX
GPIO17	SPI1_MOSI	|··|	GPIO18	
GPIO27	SPI1_MISO	|··|	GND	
GPIO22	SPI1_CLK	|··|	GPIO23	SPI1_CS
3.3V			|··|	NC (on mini shield)

Without (e.g. connector.J1p7 or connector.J2p5) :
				J1			J2 
(UART0_RX)			|1| microUSB 		 |1|	5V	
(UART0_TX)			|2|	 		 |·|	5V						
GND				|3|	 		 |·|	3.3V
GPIO3 (TWI_SCL)			|4|			 |·|	GND	
GPIO2 (TWI_SDA)			|5|			 |·| 	GPIO4 (IR_RX)
GPIO23 (SPI1_CS)		|6|			 |·|	GPIO18 (IOG11)	
GPIO22 (SPI1_CLK)		|7|			 |·|	DM3 D-
GPIO27 (SPI1_MISO)		|·|			 |·|	DM3 D+
GPIO17 (SPI1_MOSI)		|·|			 |·|	DM2 D-	
GPIO15(UART1_RX)		|·|			 |·|	DM2 D+
GPIO14 (UART1_TX)		|·|			 |·|	RDN
(CVBS)				|·|			 |·|	RDP	
(LINEOUT_L)			|·|			 |·|	TXN
(LINEOUT_R)			|·|			 |·|	TXP
(MICP)				|·|			 |·|	LED-LINK
(MICN)				|·|	microSD	 	 |·|	LED-SPD</span></pre>

<p>
	Buttons (bigger orange pi boards) are mapped, but I didn't test if it works (mapping here, if somebody is interested in testing them, see mapping.h of your board):
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">{"BUTTON",
	{
		{   "BUTTON",  SUNXI_GPL(4),  1   },
		{
			{   0,  0,  0}
		},
	}
},</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">5662</guid><pubDate>Thu, 16 Nov 2017 05:58:39 +0000</pubDate></item><item><title>Video : Armbian Jammy KDE Neon on the Raspberry Pi 5</title><link>https://forum.armbian.com/topic/37172-video-armbian-jammy-kde-neon-on-the-raspberry-pi-5/</link><description><![CDATA[<p>
	Hi all.<br />
	I made a video about KDE Neon on the Raspberry Pi 5.<br />
	I love it, I'll be switching from ubuntu-desktop to this.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" title="Armbian Jammy KDE Neon on Raspberry Pi 5" width="200" data-embed-src="https://www.youtube-nocookie.com/embed/2ajBE3-J9dI?feature=oembed"></iframe>
	</div>
</div>

<p>
	<br />
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">37172</guid><pubDate>Thu, 04 Apr 2024 09:35:37 +0000</pubDate></item><item><title>ZFS "just works" now on Armbian (2 step instructions if you are thick like me)!</title><link>https://forum.armbian.com/topic/17337-zfs-just-works-now-on-armbian-2-step-instructions-if-you-are-thick-like-me/</link><description><![CDATA[<p>
	EDIT: Solution in next post (this started as a question; yeah maybe I should have split it, but whatever).
</p>

<p>
	 
</p>

<p>
	Apologies if this is dumb question.  I finally got my hands on some appropriate (64-bit) hardware, and ready to install software now.
</p>

<p>
	 
</p>

<p>
	I have read so many threads (in Kobol Club and elsewhere), Issues (at GitHub as well as Atlassian) and I <em>think</em> this is solved by now (on Armbian) but cannot confirm?
</p>

<p>
	 
</p>

<p>
	Official install instructions (on OpenZFS website) don't really seem applicable to Armbian (kernel headers will be different, etc.).
</p>

<p>
	 
</p>

<p>
	I guess what I am asking is, do I just do something like the following:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$ sudo apt install zfs-dkms zfsutils-linux</span></pre>

<p>
	 
</p>

<p>
	And it should "just work"?  Or is there more to it than that?
</p>

<p>
	 
</p>

<p>
	Looks like I should make sure backports are set up beforehand, as ZFS version is significantly newer there (2.0.3 vs 0.7.12).
</p>

<p>
	 
</p>

<p>
	Target device is ROCKPro64, on latest Armbian 21.02.3 Buster Current, which is kernel 5.10.21.
</p>
]]></description><guid isPermaLink="false">17337</guid><pubDate>Mon, 22 Mar 2021 19:51:31 +0000</pubDate></item><item><title>Building Armbian using Ubuntu (jammy) in a systemd-nspawn container</title><link>https://forum.armbian.com/topic/31889-building-armbian-using-ubuntu-jammy-in-a-systemd-nspawn-container/</link><description><![CDATA[<p>
	Building Armbian using Ubuntu (jammy) in a systemd-nspawn container
</p>

<p>
	<a href="https://gist.github.com/ag88/05245121cce37cb8f029424a20752e35" rel="external nofollow">https://gist.github.com/ag88/05245121cce37cb8f029424a20752e35</a>
</p>

<p>
	 
</p>

<p>
	Special thanks goes to<br />
	<a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/207925-gunjan-gupta/?do=hovercard" data-mentionid="207925" href="https://forum.armbian.com/profile/207925-gunjan-gupta/" rel="">@Gunjan Gupta</a>
</p>

<p>
	 for the tip on <em><strong>PREFER_DOCKER=no</strong></em>
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="207925" data-embedcontent="" data-embedid="embed9320724201" src="https://forum.armbian.com/topic/31815-temporary-failure-resolving-securityubuntucom-archiveubuntucom-etc/?do=embed&amp;comment=175631&amp;embedComment=175631&amp;embedDo=findComment" style="height:357px;max-width:502px;"></iframe>

<p>
	 
</p>
]]></description><guid isPermaLink="false">31889</guid><pubDate>Wed, 22 Nov 2023 19:31:17 +0000</pubDate></item><item><title>Share your Raspberry pi4b wifi through ethernet  - turns your rp4b into wifi dongle for all your boards through eth0</title><link>https://forum.armbian.com/topic/33156-share-your-raspberry-pi4b-wifi-through-ethernet-turns-your-rp4b-into-wifi-dongle-for-all-your-boards-through-eth0/</link><description><![CDATA[<p>
	Sharing is caring. 
</p>

<p>
	 
</p>

<p>
	Did finally manage to get this working.   So lets make it simple clever.
</p>

<p>
	 
</p>

<p>
	Actually i did this on a 64bit raspian light kernel 6.1 but it must be the same on Armbian 
</p>

<p>
	 
</p>

<p>
	10 jan 24
</p>

<p>
	 
</p>

<p>
	    Sharing the Raspberry Pi's WiFi over the ethernet port
</p>

<p>
	sudo apt get update &amp;&amp; sudo apt install dnsmasq iptables iptables-persistent dhcpcd5<br />
	sudo vim /etc/dhcpcd.conf<br />
	    interface eth0<br />
	    static ip_address=192.168.4.1/24<br />
	-------<br />
	sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bk<br />
	sudo nano /etc/dnsmasq.conf -<br />
	 interface=eth0
</p>

<p>
	dhcp-range=192.168.4.8,192.168.4.250,255.255.255.0,12h
</p>

<p>
	server=8.8.8.8
</p>

<p>
	bogus-priv<br />
	------
</p>

<p>
	sudo systemctl restart dnsmasq.service
</p>

<p>
	------<br />
	sudo vim /etc/sysctl.conf<br />
	    net.ipv4.ip_forward=1<br />
	-------<br />
	sudo systemctl start dnsmasq<br />
	-------<br />
	sudo sh -c "echo 1 &gt; /proc/sys/net/ipv4/ip_forward"<br />
	-------
</p>

<p>
	sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE<br />
	sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
	sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT<br />
	-------<br />
	sudo iptables -L -n -v<br />
	----------<br />
	sudo sh -c "iptables-save &gt; /etc/iptables.ipv4.nat"<br />
	---------<br />
	sudo vim /etc/<abbr title="Release candidate"><abbr title="Release candidate">rc</abbr></abbr>.local<br />
	    iptables-restore &lt; /etc/iptables.ipv4.nat<br />
	exit0<br />
	---------<br />
	sudo reboot<br />
	--------
</p>

<p>
	Did get a perfect internet connection on odroid n2+ through eth0 - so the rpi4b is now supplying wifi for that board and providing petitboot with netbooting images through netboot_default after exit to shell.
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">33156</guid><pubDate>Wed, 10 Jan 2024 13:25:31 +0000</pubDate></item><item><title>How to enable RDP (xrdp) with Armbian so you can login from a Windows PC</title><link>https://forum.armbian.com/topic/13740-how-to-enable-rdp-xrdp-with-armbian-so-you-can-login-from-a-windows-pc/</link><description><![CDATA[<p>
	Hi,
</p>

<p>
	 
</p>

<p>
	There's been a few guides around on how to get RDP working with Armbian so you can login from your Windows or other PC. Some solutions mentioned in various threads here were:
</p>

<p>
	 
</p>

<ul><li>
		Install tightvncserver instead + x2go bloat (i.e. use VNC)
	</li>
	<li>
		Only login as root - didn't seem to make any difference for me
	</li>
	<li>
		Change some permissions of a log file in your home directory.
	</li>
</ul><p>
	 
</p>

<p>
	Well, this is what I did on my Orange PI PC running Buster desktop with Kernel 5.4, as of April 2020.
</p>

<p>
	 
</p>

<pre class="ipsCode">
sudo apt install xrdp xorgxrdp
sudo systemctl enable xrdp
sudo reboot</pre>

<p>
	... and that was it. The missing piece of the puzzel appeared to be the install of xorgxrdp, this isn't installed automatically by 'xrdp' package, and it's <a href="https://github.com/neutrinolabs/xorgxrdp" rel="external nofollow">useless without it</a>.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="6399" href="https://forum.armbian.com/uploads/monthly_2020_04/Desktop.png.420b9c7012a810723a44e57fc050811f.png" rel=""><img alt="Desktop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="6399" data-ratio="62.1" width="1000" src="https://forum.armbian.com/uploads/monthly_2020_04/Desktop.thumb.png.38d032bffe739bf5d66b3c491ae73400.png"></a>
</p>

<p>
	 
</p>

<p>
	Update June 2020: Also works with RetroOrangePi 4.3 super quickly (given this is based on Armbian Bionic 18.04). Can RDP in and use Armbian Desktop whilst Kodi plays a 4k movie on the TV from the same device... Awesome!
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://forum.armbian.com/uploads/monthly_2020_06/retro.jpg.3b6cf48605a66e9d9201406098defc59.jpg" data-fileid="6663" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="6663" data-ratio="53.50" width="1000" alt="retro.thumb.jpg.4d306c3d29a62b54f9e1468c8f984ea9.jpg" src="https://forum.armbian.com/uploads/monthly_2020_06/retro.thumb.jpg.4d306c3d29a62b54f9e1468c8f984ea9.jpg"></a>
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">13740</guid><pubDate>Tue, 14 Apr 2020 18:13:09 +0000</pubDate></item><item><title>Video : Orange Pi 5 Plus review with Armbian</title><link>https://forum.armbian.com/topic/32523-video-orange-pi-5-plus-review-with-armbian/</link><description><![CDATA[<p>
	Hi all.<br />
	Here my review of the Orange Pi 5 Plus with Armbian Jammy.<br />
	I show tips for better desktop experience, show how to build your own images, how to run games, and tons of info about the board.<br />
	Here's the video <span>:</span>
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/vui4cpcDH4A?feature=oembed" title="Orange Pi 5 Plus review with Armbian" width="200"></iframe>
	</div>
</div>

<p>
	<br />
	For those who rather read, here's my gathered data : <br />
	<a href="https://docs.lane-fu.com/s/5IxGlf4gn" rel="external nofollow">https://docs.lane-fu.com/s/5IxGlf4gn</a><br />
	<br />
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">32523</guid><pubDate>Wed, 13 Dec 2023 22:04:32 +0000</pubDate></item><item><title>Testing hardware video decoding (rockchip, allwinner?)</title><link>https://forum.armbian.com/topic/19258-testing-hardware-video-decoding-rockchip-allwinner/</link><description><![CDATA[<p>
	<strong>!! DEPRECATED</strong> !!
</p>

<p>
	<strong>Instructions in this thread are oudated and superseded by the new experimental APT repository for hardware video decoding ffmpeg. </strong>
</p>

<p>
	<strong>Please refer to <a href="https://forum.armbian.com/topic/32449-repository-for-v4l2request-hardware-video-decoding-rockchip-allwinner/" rel="">this thread</a> from now on!</strong>
</p>

<p>
	 
</p>

<p>
	Hello, recent upgrades to armbian are regarding kernel 5.15.
</p>

<p>
	I noticed that many v4l2 fixes and enhancements went into this release, so I decided to compile ffmpeg using LibreELEC patched version and mpv over it.
</p>

<p>
	mpv turns out to be statically linked with ffmpeg, so I propose it here for people who is interested in cutting edge kernel and wants to do some tests.
</p>

<p>
	 
</p>

<p>
	This has been tested on Debian Bullseye and Ubuntu Hirsute on following platforms:
</p>

<ul>
	<li>
		Rockchip RK3228/9 (kernel 5.10, 5.14)
	</li>
	<li>
		Rockchip RK3288 (kernel 5.14)
	</li>
	<li>
		Rockchip RK3318/28 (kernel 5.15)
	</li>
</ul>

<p>
	 
</p>

<p>
	It should work on allwinner platforms too, but I didn't test it there.
</p>

<p>
	Binaries are built by me on developing boards.
</p>

<p>
	 
</p>

<p>
	The binary for armhf is available <a href="https://users.armbian.com/jock/misc/mpv-focal/mpv-armhf" rel="external nofollow">here</a>
</p>

<p>
	The binary for arm64 is available <a href="https://users.armbian.com/jock/misc/mpv-focal/mpv-arm64" rel="external nofollow">here</a>
</p>

<p>
	 
</p>

<p>
	Copy the binary into<strong> /usr/local/bin</strong> directory of your system (<strong>mpv-armhf</strong> for 32 bit systems, <strong>mpv-arm64</strong> for 64 bit systems):
</p>

<pre class="ipsCode">sudo cp mpv-armhf /usr/local/bin/mpv</pre>

<p>
	 
</p>

<p>
	Install dependencies for Debian Bullseye and Ubuntu Hirsute:
</p>

<pre class="ipsCode">apt install libass9 libbluray2 librubberband2 libsdl2-2.0-0 libva-drm2 libva-wayland2 libva-x11-2 libva2 libvdpau1 libx264-160 libx265-192 libxss1 libxv1 libfdk-aac2</pre>

<p>
	 
</p>

<p>
	I have had issues with dependencies on Debian Buster/Ubuntu Focal, in particular libx264-160 and libx265-192 are not available there.
</p>

<p>
	I Solved the issue downloading the packages from Debian Bullseye web page and manually installing them.
</p>

<p>
	There may be the need for some other dependency depending upon your actual installation.
</p>

<p>
	 
</p>

<p>
	Run mpv in a virtual terminal (videos up to 4K) with this CLI:
</p>

<pre class="ipsCode">mpv --vo=gpu --hwdec=drm --gpu-hwdec-interop=drmprime-drm --drm-draw-plane=overlay --drm-drmprime-video-plane=primary &lt;video.mp4&gt;</pre>

<p>
	 
</p>

<p>
	Mpv can be run in X11 with this other CLI, but due to buffer copying it requires a good CPU - rk3228 and rk3328 won't even play 720p, rk3288 do 720p fine:
</p>

<pre class="ipsCode"> mpv --vo=gpu --hwdec=auto-copy --gpu-context=x11egl --gpu-hwdec-interop=drmprime-drm &lt;video.mp4&gt;</pre>

<p>
	 
</p>

<p>
	This is an experiment and your mileage may vary a lot:
</p>

<ul>
	<li>
		H.264 codec should be well supported around the boards;
	</li>
	<li>
		H.265 has more limited support
	</li>
	<li>
		VP8 should be generally supported
	</li>
	<li>
		VP9 seems to still require some work.
	</li>
</ul>
]]></description><guid isPermaLink="false">19258</guid><pubDate>Wed, 10 Nov 2021 22:19:56 +0000</pubDate></item><item><title>Canon printer drivers (cnijfilter)</title><link>https://forum.armbian.com/topic/18020-canon-printer-drivers-cnijfilter/</link><description><![CDATA[<p>
	Canon provides source code for cups driver, but with some proprietary binary libs.
</p>

<p>
	This libs available only for x86. No way for direct compiling cnijfilter for ARM (and other architectures). <img alt=":(" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_sad.png" srcset="https://forum.armbian.com/uploads/emoticons/sad@2x.png 2x" title=":(" width="20" />
</p>

<p>
	 
</p>

<p>
	But we have qemu! We can transparently run x86 executables on any other host architectures.
</p>

<p>
	 
</p>

<p>
	Easy steps to run cnijfilter on ARM (or any other arch):<br />
	- Build https://github.com/endlessm/cnijfilter-common for x86
</p>

<p>
	- Copy all needed x86 libs using recursive ldd. And copy it to <strong>/usr/lib/bjlib/</strong>
</p>

<p>
	- Patch all executables: set interpreter to <strong>/usr/lib/bjlib/x86/ld-linux.so.2</strong> and rpath to <strong>/usr/lib/bjlib/</strong>
</p>

<p>
	- Install these patched packages to ARM system
</p>

<p>
	- Install <strong>qemu-user</strong> and <strong>qemu-user-binfmt</strong> (or <strong>qemu-arm-static</strong>)
</p>

<p>
	 
</p>

<p>
	You do not need to do this manually. I have implemented an automated build system: <a href="https://github.com/Azq2/cnijfilter-arm-build" rel="external nofollow">https://github.com/Azq2/cnijfilter-arm-build</a>
</p>

<p>
	 
</p>

<p>
	All you need is any x86 machine to do the build.
</p>

<p>
	 
</p>

<p>
	<strong>How to use</strong>
</p>

<p>
	1. On any x86 machine:
</p>

<p>
	 
</p>

<pre class="ipsCode">
# Install dependencies
sudo apt install debootstrap git util-linux

# Get build system
git clone https://github.com/Azq2/cnijfilter-arm-build

# Start building
cd cnijfilter-arm-build
sudo ./build.sh build

# Get .deb packages
ls -lah ./result/full
ls -lah ./result/light</pre>

<p>
	 
</p>

<p>
	After build we have two variants of packages: <strong>full</strong> and <strong>light</strong>
</p>

<p>
	 
</p>

<table border="1" cellpadding="1" cellspacing="1" style="width:500px;">
	<thead>
		<tr>
			<th scope="col">
				Item
			</th>
			<th scope="col">
				Full
			</th>
			<th scope="col">
				Light
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				<p>
					PPD files
				</p>
			</td>
			<td>
				+
			</td>
			<td>
				+
			</td>
		</tr>
		<tr>
			<td>
				<p>
					CUPS filters
				</p>
			</td>
			<td>
				+
			</td>
			<td>
				+
			</td>
		</tr>
		<tr>
			<td>
				<p>
					CUPS backends
				</p>
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				lgmon
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				<p>
					canon-maintenance
				</p>
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				cngpij
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				cngpijmnt
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				cnijlgmon2
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				cnijnetprn
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				cnijnpr
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
		<tr>
			<td>
				docs
			</td>
			<td>
				+
			</td>
			<td>
				-
			</td>
		</tr>
	</tbody>
</table>

<p>
	 
</p>

<p>
	In most cases, a light package is <strong>completely</strong> sufficient:
</p>

<p>
	- We don't need canon usb backend, because cups have builtin USB support
</p>

<p>
	- We don't need canon network backend, because cups have builtin BJNP support (package <strong>cups-backend-bjnp</strong>)
</p>

<p>
	- Other canon maintenance utils are useless (in my opinion)
</p>

<p>
	 
</p>

<p>
	2. Copy <strong>.deb</strong> from <strong>result/light</strong> or <strong>result/full</strong> to your ARM machine.
</p>

<p>
	 
</p>

<p>
	3. On your ARM machine:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln"># Install dependencies
sudo apt install qemu-user qemu-user-binfmt # or sudo apt install qemu-user-static

# Install common for all printers package
sudo dpkg -i cnijfilter-common.deb

# Install printer-specific package
# Choose right package for your printer! e400series only for reference!
sudo dpkg -i cnijfilter-e400series.deb</span></pre>

<p>
	 
</p>

<p>
	4. Done. You can now configure CUPS.
</p>

<p>
	 
</p>

<p>
	<strong>Security with apparmor (optional)</strong>
</p>

<p>
	 
</p>

<p>
	CUPS filters don't need any specific permissions.
</p>

<p>
	 
</p>

<p>
	Create file <strong>/etc/apparmor.d/cnijfilter-filters</strong> with contents:
</p>

<p>
	 
</p>

<pre class="ipsCode">
#include &lt;tunables/global&gt;

/usr/bin/bjfilter* {
	#include &lt;abstractions/base&gt;
	@{PROC}/sys/vm/mmap_min_addr r,
}

/usr/bin/cif[a-z]*[0-9d]* {
	#include &lt;abstractions/base&gt;
	@{PROC}/sys/vm/mmap_min_addr r,
}

/usr/lib/cups/filter/{cmdtocanonij,pstocanonbj,pstocanonij} {
	#include &lt;abstractions/base&gt;
	@{PROC}/sys/vm/mmap_min_addr r,
}</pre>

<p>
	 
</p>

<p>
	Then restart apparmor:
</p>

<p>
	 
</p>

<pre class="ipsCode">
sudo systemctl reload apparmor
sudo aa-enforce cnijfilter-filters</pre>

<p>
	 
</p>

<p>
	<strong>Note:</strong> this minimal file full coverage all executables in <strong>light</strong> package. For <strong>full</strong> package you need write additional rules by yourself.
</p>
]]></description><guid isPermaLink="false">18020</guid><pubDate>Tue, 04 May 2021 23:57:09 +0000</pubDate></item><item><title>Video : How to build your own Armbian images</title><link>https://forum.armbian.com/topic/29933-video-how-to-build-your-own-armbian-images/</link><description><![CDATA[<p>
	Hi all.<br />
	I made a new video on how to build Armbian images.<br />
	These days you can use your ARM64 <abbr title="Single board computer">SBC</abbr> to do this.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/kQcEFsXEJEE?feature=oembed" title="Build your own Armbian images" width="200"></iframe>
	</div>
</div>

<p>
	<br />
	For Windows users there's WSL2 you can use. Here my video about that.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/ha-YtbUC-Wk?feature=oembed" title="How To Build Armbian images with Windows / WSL2" width="200"></iframe>
	</div>
</div>

<p>
	<br />
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">29933</guid><pubDate>Thu, 31 Aug 2023 15:02:40 +0000</pubDate></item><item><title>(Serial) console access via 'USB-UART/Gadget mode' on Linux/Windows/OSX</title><link>https://forum.armbian.com/topic/8237-serial-console-access-via-usb-uartgadget-mode-on-linuxwindowsosx/</link><description><![CDATA[<p>
	Access to a console can be mandatory when you SBC doesn't work as expected (e.g Network or HDMI output doesn't work). When SSH/Display access isn't possible access to console via UART is the best way to get a clue where your SBC hangs. This short tutorial should give you an introduction how this works. For some boards, armbian implements an USB gadget mode (a 'fake' serial console over microUSB) describen below. As a reminder an <strong>USB-UART bridge is always prefered over USB gadget mode</strong> whenever possible (UART get's initialized before the gadget driver and also before HDMI, means even if you don't get a proper output from HDMI or gadget mode console,<a href="https://forum.armbian.com/topic/7278-single-user-mode/" rel=""> it is possible that UART</a> will give you the needed information).
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:22px;">Prerequisites:</span></strong>
</p>

<p>
	We need an Terminal program to access the console. If you use Linux on your host system I prefer picocom (something like minicom will also do the job) which can be installed:
</p>

<p>
	on <strong>debian</strong> a like systems:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo apt-get install picocom</span></pre>

<p>
	from <span><strong>arch</strong> community repo</span>:
</p>

<p>
	<a href="https://www.archlinux.org/packages/community/x86_64/picocom/" rel="external nofollow">https://www.archlinux.org/packages/community/x86_64/picocom/</a>
</p>

<p>
	 
</p>

<p>
	on <strong>fedora</strong> systems:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">yum install picocom</span></pre>

<p>
	on <strong><a href="http://macappstore.org/picocom/" rel="external nofollow">Mac OS X</a>:</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">brew install picocom</span></pre>

<p>
	on <strong>Widows</strong> we use PuTTY:
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img alt="PuTTY_Ubuntu.png" class="ipsImage" height="479" src="https://upload.wikimedia.org/wikipedia/commons/b/b6/PuTTY_Ubuntu.png" width="1000"></p>

		<p>
			(source: <a href="https://de.wikipedia.org/wiki/PuTTY#/media/File:PuTTY_Ubuntu.png" rel="external nofollow">https://de.wikipedia.org/wiki/PuTTY#/media/File:PuTTY_Ubuntu.png</a> --&gt; putty on ubuntu)
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	<a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html" rel="external nofollow">https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html</a>
</p>

<p>
	 
</p>

<p>
	<span style="font-size:22px;"><b>UART USB Adapter:</b></span>
</p>

<p>
	There are various USB-UART bridges e.g FT232 (and fakes of them, cause FDTI is expensive <img alt=":lol:" data-emoticon="" src="https://forum.armbian.com/uploads/emoticons/default_laugh.png" title=":lol:">), CH340/1,PL2303 or CP2102
</p>

<p>
	Normally it doesn't matter which one you use. I prefer the (probably fake) FDTI on the right side, but the CH341 does also a good job:
</p>

<p>
	<img alt="DSC_1113.JPG.d78b046a0dbc2b0a9929814cdb58f046.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="3262" src="https://forum.armbian.com/uploads/monthly_2018_09/DSC_1113.JPG.d78b046a0dbc2b0a9929814cdb58f046.JPG"></p>

<p>
	The only thing which is needed is that the signal-level matches with your SBCs needs (this is mostly 3.3V expect some Odroids e.g <strong>HC1 which has only 1.8V</strong>!).  Most of these USB-UART bridges have jumpers for 5V and 3.3V, make sure that you use the 3.3V. <span><img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20"> </span>
</p>

<p>
	<span>You've to figure out which pins on your SBC are debug UART (they've mostly a own 3 pin header, sometimes it's on the large pin header e.g. Tinkerboard) and then connect:</span>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">GND --&gt; GND
RX  --&gt; TX
TX  --&gt; RX</span></pre>

<p>
	You've to check dmesg (linux) or run devmgmt.msc (windows) to know which device you use. 
</p>

<p>
	<strong>Linux</strong>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">[256597.311207] usb 3-2: Product: USB2.0-Serial
[256597.402283] usbcore: registered new interface driver ch341
[256597.402341] usbserial: USB Serial support registered for ch341-uart
[256597.402392] ch341 3-2:1.0: ch341-uart converter detected
[256597.404012] usb 3-2: ch341-uart converter now attached to ttyUSB0</span></pre>

<p>
	--&gt; Device will be /dev/ttyUSB0
</p>

<p>
	<strong>Windows</strong>:
</p>

<p>
	for windows 10 (<a href="https://www.google.ch/search?client=opera&amp;q=find+arduino+port+windows+10&amp;sourceid=opera&amp;ie=UTF-8&amp;oe=UTF-8" rel="external nofollow">https://www.google.ch/search?client=opera&amp;amp;q=find+arduino+port+windows+10&amp;amp;sourceid=opera&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8</a>)
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents">
		<p>
			Open the Device Manager window by right-clicking the Windows 10start button in the lower left of the screen and then selecting Device Manager on the menu that pops up. In Device Manager, expandPorts (COM &amp; LPT) and you should see a COM port which will be your Arduino as shown in the image below.
		</p>
	</div>
</blockquote>

<p>
	Something like the picture in USB Gadget Mode part of the tutorial should show up)
</p>

<p>
	 
</p>

<p>
	Armbians default settings are (expect some RK devices):
</p>

<p>
	For <strong>Picocom</strong>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">picocom -b 115200 -r -l /dev/ttyUSB0</span></pre>

<p>
	and for some RK devices:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">picocom -b 1500000 -r -l /dev/ttyUSB0</span></pre>

<p>
	For <strong>PuTTY</strong>:
</p>

<p>
	You've to set configuration in 'Serial'. COM11 is just an example and needs to be checked first, Speed (baud) needs to be changed when you deal with the few RK boards which need 1500000.
</p>

<p>
	<img alt="putty.jpg.f5c6eacbf2f234512539a27d52c7ebde.jpg" class="ipsImage ipsImage_thumbnailed" data-extension="core_Attachment" data-fileid="2811" src="https://forum.armbian.com/uploads/monthly_2018_05/putty.jpg.f5c6eacbf2f234512539a27d52c7ebde.jpg"></p>

<p>
	 
</p>

<p>
	<strong>OS X</strong>:
</p>

<p>
	TBD
</p>

<p>
	should be similar to Linux whereas the naming differs a bit. See: <a href="https://forum.odroid.com/viewtopic.php?f=53&amp;t=841" rel="external nofollow">https://forum.odroid.com/viewtopic.php?f=53&amp;amp;t=841</a> as an example with minicom.
</p>

<p>
	 
</p>

<p>
	Normally you connect the USB-UART bridge to your host computer (and the SBC) and start picocom/putty<strong> before you power</strong> the board to ensure you get the full bootlog and not only parts of it. 
</p>

<p>
	 
</p>

<p>
	<span style="font-size:22px;"><strong>USB Gadget Mode</strong></span>
</p>

<p>
	Several board (see list) for which official armbian images exist (or csc images can be built) have no HDMI display. On those boards there's USB gadget mode driver activated so that you can have console access to them via USB connection. The following short tutorial describes how you can access to console from Linux <s>(don't have a windows machine here at the moment, I may check it later)</s>:
</p>

<p>
	 
</p>

<ul><li>
		install picocom
	</li>
	<li>
		connect your board via USB to your host computer (it should be one which is able to power an SBC via its USB port)
	</li>
	<li>
		check dmesg for the device showing up: 
		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">[184372.603816] usb 3-2: Product: Gadget Serial v2.4
[184372.603818] usb 3-2: Manufacturer: Linux 4.14.65-sunxi with musb-hdrc
[184372.660041] cdc_acm 3-2:2.0: ttyACM0: USB ACM device
[184372.660402] usbcore: registered new interface driver cdc_acm
[184372.660403] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		connect to it via picocom (in this case <em>'picocom /dev/ttyACM0'</em>): 
		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">chwe@chwe-acer:~$ picocom /dev/ttyACM0
picocom v2.2

port is        : /dev/ttyACM0
flowcontrol    : none
baudrate is    : 9600
parity is      : none
databits are   : 8
stopbits are   : 1
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv -E
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,

Type [C-a] [C-h] to see available commands

Terminal ready
Debian GNU/Linux 9 orangepizero ttyGS0

orangepizero login: root
Password: 
You are required to change your password immediately (root enforced)
Changing password for root.
(current) UNIX password: </span></pre>

		<p>
			 
		</p>
	</li>
</ul><p>
	<s>I assume if you use the same settings in something like putty on windows and you check which 'serial' device shows up in *where windows shows connected devices - I forgot it* you should be able to access it from windows (someone motivated may confirm this).</s> <span><img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20"> </span>
</p>

<p>
	<span>For Windows:</span>
</p>

<p>
	<span>run </span>devmgmt.msc and search for the serial device (in this case COM3) and connect to it via PuTTY (thanks to <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/8684-hjc/?do=hovercard" data-mentionid="8684" href="https://forum.armbian.com/profile/8684-hjc/" rel="">@hjc</a>):
</p>

<p>
	<span><img alt="image.png" class="ipsImage" data-fileid="3259" height="412" src="https://forum.armbian.com/uploads/monthly_2018_09/image.thumb.png.7d0ad8ce71fa062afb245378e23393f1.png" width="1000"></span>
</p>

<p>
	for windows 10 (<a href="https://www.google.ch/search?client=opera&amp;q=find+arduino+port+windows+10&amp;sourceid=opera&amp;ie=UTF-8&amp;oe=UTF-8" rel="external nofollow">https://www.google.ch/search?client=opera&amp;amp;q=find+arduino+port+windows+10&amp;amp;sourceid=opera&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8</a>):
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents">
		<p>
			Open the Device Manager window by right-clicking the Windows 10start button in the lower left of the screen and then selecting Device Manager on the menu that pops up. In Device Manager, expandPorts (COM &amp; LPT) and you should see a COM port which will be your Arduino as shown in the image below.
		</p>
	</div>
</blockquote>

<p>
	(even the tutorial is for arduinos, it should be similar for every 'COM device')
</p>

<p>
	 
</p>

<p>
	<span>Currently boards with USB gadget mode:</span>
</p>

<ul><li>
		<span>bananapim2plus</span>
	</li>
	<li>
		<span>bananapim2zero</span>
	</li>
	<li>
		<span>nanopifire3</span>
	</li>
	<li>
		<span>nanopim3</span>
	</li>
	<li>
		<span>nanopineo2</span>
	</li>
	<li>
		<span>nanopineocore2</span>
	</li>
	<li>
		<span>nanopineoplus2</span>
	</li>
	<li>
		<span>orangepizeroplus</span>
	</li>
	<li>
		nanopiair
	</li>
	<li>
		nanopiduo
	</li>
	<li>
		nanopineo
	</li>
	<li>
		olimex-som204-a20
	</li>
	<li>
		orangepilite
	</li>
	<li>
		orangepi-r1
	</li>
	<li>
		orangepizero
	</li>
	<li>
		orangepizeroplus2-h3
	</li>
	<li>
		orangepizeroplus2-h5
	</li>
	<li>
		tritium-h3
	</li>
</ul><p>
	 
</p>

<p>
	<strong><span style="font-size:22px;">The silly approach</span></strong>
</p>

<p>
	For those, who want to save 1$ for an USB-UART bridge, you can spend 10$ for an OrangePi Zero and use its spare UARTs to log into an other SBC... <img alt=":lol:" data-emoticon="" src="https://forum.armbian.com/uploads/emoticons/default_laugh.png" title=":lol:"> SSH --&gt; opi, ttl --&gt; Tinkerboard
</p>

<p>
	For those loving text more than videos:
</p>

<ul><li>
		SSH to your SBC
	</li>
	<li>
		sudo armbian-config --&gt; system --&gt; hardware  to activate an spare UART (in this case it was UART2, will give you ttyS2)
	</li>
	<li>
		reboot
	</li>
	<li>
		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">picocom -b 115200 -r -l /dev/ttyS2</span></pre>

		<p>
			 
		</p>
	</li>
</ul><p>
	 
</p>

<p>
	<img alt="DSC_1115.png.034c5ca44927425c69044e1b0b703be2.png" class="ipsImage ipsImage_thumbnailed" data-extension="core_Attachment" data-fileid="3283" src="https://forum.armbian.com/uploads/monthly_2018_09/DSC_1115.png.034c5ca44927425c69044e1b0b703be2.png"></p>

<p>
	See:  <a href="https://asciinema.org/a/B87EOGhc0gx9oikMAGEG94lXR" rel="external nofollow">https://asciinema.org/a/B87EOGhc0gx9oikM</a><a href="https://asciinema.org/a/B87EOGhc0gx9oikMAGEG94lXR" rel="external nofollow">AGEG94lXR</a>
</p>

<p>
	<a href="https://asciinema.org/a/B87EOGhc0gx9oikMAGEG94lXR" rel="external nofollow"><img alt="B87EOGhc0gx9oikMAGEG94lXR.png" class="ipsImage" height="671" src="https://asciinema.org/a/B87EOGhc0gx9oikMAGEG94lXR.png" width="1000"></a>
</p>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			also works with circles... 
		</p>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-extension="core_Attachment" data-fileid="3284" href="https://forum.armbian.com/uploads/monthly_2018_09/IMG_20180925_214716.JPG.a1a8bf02c69dd39262b8ef12db12f6d7.JPG" rel=""><img alt="IMG_20180925_214716.thumb.JPG.a1ed82ba6a68c82828c3ca965fd4a658.JPG" class="ipsImage ipsImage_thumbnailed" data-extension="core_Attachment" data-fileid="3284" src="https://forum.armbian.com/uploads/monthly_2018_09/IMG_20180925_214716.thumb.JPG.a1ed82ba6a68c82828c3ca965fd4a658.JPG"></a>
		</p>

		<p>
			 
		</p>

		<p>
			see: <a href="https://asciinema.org/a/bII8nLIfmUnGHXKaylIqoLzXW" rel="external nofollow">https://asciinema.org/a/bII8nLIfmUnGHXKaylIqoLzXW</a> <img alt=":lol:" data-emoticon="" src="https://forum.armbian.com/uploads/emoticons/default_laugh.png" title=":lol:"></p>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">8237</guid><pubDate>Wed, 19 Sep 2018 12:13:04 +0000</pubDate></item><item><title>Video : Armbian on the Khadas VIM 3</title><link>https://forum.armbian.com/topic/29547-video-armbian-on-the-khadas-vim-3/</link><description><![CDATA[<p>
	Hi all.<br />
	I made a new video about Armbian on the Khadas VIM3.<br />
	Both standard Armbian and Monka his Widevine and Gaming image.<br />
	Here it is <span>:</span>
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/uJsW3GGEtjs?feature=oembed" title="Armbian on the Khadas VIM3" width="200"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">29547</guid><pubDate>Fri, 04 Aug 2023 10:40:22 +0000</pubDate></item><item><title>Video : Review of the Mixtile Blade 3 / Stackable cluster ARM SBC</title><link>https://forum.armbian.com/topic/29372-video-review-of-the-mixtile-blade-3-stackable-cluster-arm-sbc/</link><description><![CDATA[<p>
	Hi all.<br />
	Here my review video about the Mixtile Blade 3.<br />
	<br />
	An RK3588 ARM <abbr title="Single board computer">SBC</abbr> with a special connector to make it possible to connect multiple of these boards in a cluster.<br />
	But it can also be used well as desktop or server device.<br />
	It has all the bells and whistle's an RK3588 can have like dual 2.5GbE, m-PCIe, NVMe, HDMI-out + 2 x DP on USB-C and HMDI-in, ...<br />
	Here is my video : 
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/qPuRH8V6aEY?feature=oembed" title="Mixtile Blade 3 - Review / My new favorite RK3588 ARM desktop SBC ! ! !" width="200"></iframe>
	</div>
</div>

<p>
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">29372</guid><pubDate>Mon, 24 Jul 2023 11:59:48 +0000</pubDate></item><item><title>Overlay for NanoPi Neo with ILI9341; Shared SPI with two CS; Allwinner H3</title><link>https://forum.armbian.com/topic/27968-overlay-for-nanopi-neo-with-ili9341-shared-spi-with-two-cs-allwinner-h3/</link><description><![CDATA[<p>
	Hi,
</p>

<p>
	 
</p>

<p>
	after having a hard time getting the ILI9341 touchscreen working with the NanoPi Neo (Allwinner H3)  it seems to work now.
</p>

<p>
	 
</p>

<p>
	To have more GPIOs available for other stuff the touch and display need to share SPI0
</p>

<p>
	 
</p>

<p>
	I would like to upload it to github because there is basically nothing out of the box available but I'm a total noob with NanoPi, Armbian and overlays so maybe someone could look at it.
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">root@nanopineo:~# uname -a
Linux nanopineo 5.15.93-sunxi #23.02.2 SMP Fri Feb 17 00:00:00 UTC 2023 armv7l armv7l armv7l GNU/Linux</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	This is the wiring between ILI9341 and NanoPi Neo:
</p>

<p>
	 
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">/*
   3.3v &lt;--&gt;  VCC &amp; LED
   GND  &lt;--&gt;  GND
   PC2  &lt;--&gt;  SCK       &amp; T_CLK
   PC1  &lt;--&gt;  SDO</span><span class="tag">&lt;MISO&gt;</span><span class="pln"> &amp; T_DO
   PC0  &lt;--&gt;  SDI</span><span class="tag">&lt;MOSI&gt;</span><span class="pln"> &amp; T_DIN
   PA1  &lt;--&gt;  DC
   PG8  &lt;--&gt;  RESET
   PC3  &lt;--&gt;  CS
   PA3  &lt;--&gt;  T_CS
   PG9  &lt;--&gt;  T_IRG
 */</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	This is the overlay:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun8i-h3";

	fragment@0 {
		target = &lt;&amp;pio&gt;;
		__overlay__ {
			spi0_cs1: spi0_cs1 {
				pins = "PC3"; 
				function = "gpio_out";
				output-high;
			};

			spi1_cs1: spi1_cs1 {
				pins = "PA3"; 
				function = "gpio_out";
				output-high;
			};

			opiz_display_pins: opiz_display_pins {
                pins = "PA1", "PG8", "PA6";
                function = "gpio_out";
            };

            ads7846_pins: ads7846_pins {
                pins = "PG9";
                function = "irq";
            };


		};
	};

	fragment@1 {
		target = &lt;&amp;spi1&gt;;
		__overlay__ {
			pinctrl-names = "default", "default";
			pinctrl-1 = &lt;&amp;spi1_cs1&gt;;
			cs-gpios = &lt;0&gt;, &lt;&amp;pio 0 3 0&gt;; /* PA3 */
		};
	};

	fragment@2 {
		target = &lt;&amp;spi0&gt;;
		__overlay__ {
			#address-cells = &lt;1&gt;;
			#size-cells = &lt;0&gt;;
			status = "okay";

			pinctrl-names = "default", "default";
			cs-gpios= &lt;&amp;pio 2 3 0&gt;, &lt;&amp;pio 0 3 1&gt;;

			opizdisplay: opiz-display@0 {
			    pinctrl-1 = &lt;&amp;spi0_cs1&gt;;
				reg = &lt;0&gt;; /* Chip Select 0 */
                compatible = "ilitek,ili9341";
				spi-max-frequency = &lt;1000000&gt;;
				status = "okay";
                pinctrl-names = "default";
                pinctrl-0 = &lt;&amp;opiz_display_pins&gt;;
                rotate = &lt;90&gt;;
                bgr = &lt;0&gt;;
                fps = &lt;33&gt;;
                buswidth = &lt;8&gt;;
                dc-gpios = &lt;&amp;pio 0 1 0&gt;;      /* PIN_22  GPIOA1 &gt; */
                reset-gpios = &lt;&amp;pio 6 8 1 &gt;; /*    GPIOG8&gt; */
                /*led-gpios=&lt;&amp;pio 0 6 0&gt;;        PIN_12  GPIOA6 &gt; */
                debug=&lt;4&gt;;                        
			};

			ads7846: ads7846@1 {
				reg = &lt;1&gt;; /* Chip Select 1 */
				compatible = "ti,ads7846";
				spi-max-frequency = &lt;1000000&gt;;
				status = "okay";
                pinctrl-2=&lt;&amp;spi1_cs1 &amp;spi1_cs1&gt;;
                pinctrl-names = "default";
                pinctrl-3 = &lt;&amp;ads7846_pins&gt;;
                interrupt-parent = &lt;&amp;pio&gt;;
                interrupts = &lt;6 9 2&gt;; /* PG9 IRQ_TYPE_EDGE_FALLING */
                pendown-gpio = &lt;&amp;pio 6 9 0&gt;; /* PG9 */
                /* driver defaults, optional */
                ti,x-min = /bits/ 16 &lt;0&gt;;
                ti,y-min = /bits/ 16 &lt;0&gt;;
                ti,x-max = /bits/ 16 &lt;0x0FFF&gt;;
                ti,y-max = /bits/ 16 &lt;0x0FFF&gt;;
                ti,pressure-min = /bits/ 16 &lt;0&gt;;
                ti,pressure-max = /bits/ 16 &lt;0xFFFF&gt;;
                ti,x-plate-ohms = /bits/ 16 &lt;400&gt;;
			};

		};

	};

};</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	This is the /boot/armbianEnv.txt
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">verbosity=1
bootlogo=false
console=serial
disp_mode=1920x1080p60
overlay_prefix=sun8i-h3
overlays=usbhost1 usbhost2 spi0
param_spidev_spi_bus=0
param_spidev_spi_cs=1
param_spidev_spi_cs=0
rootdev=UUID=XYZ-LONG-UUID-IS-LONG
rootfstype=ext4
user_overlays=ili-touch-spi
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	After connecting via ssh and starting evtest it shows this when touched ( not sure if it shows the correct coordinates yet )
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Event: time 1682020476.763295, -------------- SYN_REPORT ------------
Event: time 1682020476.775286, type 3 (EV_ABS), code 0 (ABS_X), value 535
Event: time 1682020476.775286, type 3 (EV_ABS), code 1 (ABS_Y), value 3553
Event: time 1682020476.775286, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 65169</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	So it looks like everything is working but to be on the safe side I would like to wait until some pro reviewed the overlay.
</p>

<p>
	 
</p>

<p>
	Thanks.
</p>
]]></description><guid isPermaLink="false">27968</guid><pubDate>Thu, 20 Apr 2023 20:21:34 +0000</pubDate></item><item><title>OctoPrint on armbian</title><link>https://forum.armbian.com/topic/14429-octoprint-on-armbian/</link><description><![CDATA[<p>
	Hi, 
</p>

<p>
	  I've been running Octoprint on armbian for several months with good results of a couple of printers with good performance no relevant problems. Installation process is not complex but I decided to build a simple a plug&amp;play meta-distribution like OctoPi for Rpi boards but based on armbian so it can be used potentially in any of the supported boards.  I started with the popular Opi Zero as it is really cheap and the four cores of the H2+ processor handle perfectly a 3d printer load and is 3 times cheaper than a typical RPI3B that octoPi requires.
</p>

<p>
	 
</p>

<p>
	You can find it here: <a href="https://github.com/ludiazv/octocitrico" rel="external nofollow">https://github.com/ludiazv/octocitrico</a>
</p>

<p>
	 
</p>

<p>
	Built-in features are:
</p>

<p>
	<u>Core (installed and enabled):</u>
</p>

<ul><li>
		Optimized armbian Debian buster.
	</li>
	<li>
		Latest stable octoprint version.
	</li>
	<li>
		Selection of top octoprint plugins.
	</li>
	<li>
		HAProxy with self signed keys for ssl access.
	</li>
	<li>
		Avahi service: Bonjur addvertisement (this enable to acces with host-name.local via ssh or http/s)
	</li>
	<li>
		 SSH console access.
	</li>
	<li>
		USB OTG console access (if available in the board)
	</li>
	<li>
		Enabled i2c-dev,spidev (if available on the board)
	</li>
</ul><p>
	 
</p>

<p>
	<u>3D printer related software (installed but disabled):</u>
</p>

<ul><li>
		Klipper
	</li>
	<li>
		PlatformIo core for building 3D printer firmware.
	</li>
	<li>
		Marlin 1.1.x &amp; Marlin 2.x.x firmware (bugfix versions)
	</li>
</ul><p>
	 
</p>

<p>
	<u>Extras (installed but disabled):</u>
</p>

<ul><li>
		MPGStreamer USB camera support (experimental)
	</li>
	<li>
		SMB shares to remote edit configuration files from a remote PC.
	</li>
</ul><p>
	 
</p>

<p>
	 
</p>

<p>
	Feedback and contributions are welcome.
</p>

<p>
	 
</p>

<p>
	Thanks armbian guys for the awesome work you do.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">14429</guid><pubDate>Tue, 16 Jun 2020 23:06:55 +0000</pubDate></item><item><title>Video : NicoD's full setup on Monka's Armbian Gnome for RK3588</title><link>https://forum.armbian.com/topic/28481-video-nicods-full-setup-on-monkas-armbian-gnome-for-rk3588/</link><description><![CDATA[<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/TJRMWlFzZHc?feature=oembed" title="My full setup of Monka's Armbian Gnome on RK3588" width="200"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">28481</guid><pubDate>Fri, 26 May 2023 10:46:56 +0000</pubDate></item><item><title>Video : Build Armbian on Windows with WSL2</title><link>https://forum.armbian.com/topic/28326-video-build-armbian-on-windows-with-wsl2/</link><description><![CDATA[<p>
	Hi all.<br />
	I just made a video where I show how to build your own Armbian images on Windows.<br />
	It used to be that you needed a virtualMachine running Linux but these days you can use WSL2.<br />
	Here the video <span>:</span>
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/ha-YtbUC-Wk?feature=oembed" title="How To Build Armbian images with Windows / WSL2" width="200"></iframe>
	</div>
</div>

<p>
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">28326</guid><pubDate>Wed, 17 May 2023 17:00:59 +0000</pubDate></item><item><title>Video : Comparing RK3588 SBCs / NanoPi R6S - Khadas Edge2 - Radxa Rock5B - Mekotronics R58 mini + R58X-4G - Orange Pi 5</title><link>https://forum.armbian.com/topic/26398-video-comparing-rk3588-sbcs-nanopi-r6s-khadas-edge2-radxa-rock5b-mekotronics-r58-mini-r58x-4g-orange-pi-5/</link><description><![CDATA[<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/b0sbfJq2s3s?feature=oembed" title="Comparing RK3588 SBCs - Khadas Edge2 - Radxa Rock5B - NanoPi R6S - Mekotronics R58 Mini / R58X-4G" width="200"></iframe>
	</div>
</div>

<p>
	<br />
	<br />
	My gathered info <span>: </span><br />
	 
</p>

<pre class="ipsCode">RK3588(S) comparison
--------------------
RK3588(S) 8nm LP process
4 x A55 @ 1.8Ghz + 4 x A76 @ 2.4Ghz (Not the same for all boards, between 2.2Ghz and 2.4Ghz)
Mali-G610 MP4 "Odin"
6TOPs NPU
Up to 32GB memory theoretically (haven't seen any 32GB yet)
                              RK3588                            RK3588S 
PCIE3.0 	                  2x2 Lanes PCIe3.0 	            N/A 	
PCIe2.0/SATA3.0/USB3.0 MUX 	  3x1 Lane PCIE2.0 	                2x1 Lane PCIE2.0 	
                              3x SATA 3.0 	                    2x SATA 3.0 	
                              1x USB3.0 (refer USB section) 	1x USB3.0 (refer USB section) 


     Board                 SoC                   Memory                       eMMC        SD-Reader     NVMe/PCIe/SATA       Network               USB2    USB3         USB-C (dp)      HDMI-out          HDMI-in          DP         Active cooling                Powered with 
1.   Khadas Edge 2 Pro     Rockchip RK3588S      16 GB LPDDR4X 2112 MHz       64 GB       xxx           xxx                  xxx                   1 x     1 x          1 x DP          1 x               xxx              xxx        xxx (Case not out yet)        USB-C PD
2.   NanoPi R6S            Rockchip RK3588S      8 GB LPDDR4X 2133 MHz        32 GB       yes           xxx                  2 x 2.5GbE + 1GbE     1 x     1 x          xxx             1 x               xxx              xxx        Metal case                    USB-C PD 
3.   Radxa Rock5B          Rockchip RK3588       16 GB LPDDR4X 2112 MHz       Module      yes           2 x M.2 NVMe         2.5GbE                2 x     2 x          xxx             2 x               1 x micro-HDMI   xxx        XU4 heatsink no sufficient    USB-C PD (Issue with PD, I'm using 5V 4A PSU)
4.   Mekotronics R58 Mini  Rockchip RK3588       16 GB LPDDR4X                64 GB       xxx           SATA ribbon          1GbE                  2 x     1 x          1 x (no DP)     2 x               1 x full size    1 x        Big heatsink sufficient ***   12V barrel jack                                *** Case could also be used to cool with a thermal pad
5.   Mekotronics R58X-4G   Rockchip RK3588       8 GB LPDDR4X                 64 GB       xxx           SATA/NVMe/mini-PCIe  1GbE                  2 x     1 x          1 x DP          1 x               1 x full size    1 x        Big heatsink sufficient ***   12V barrel jack 
6.   Orange Pi 5           Rockchip RK3588S      4/8 GB LPDDR4(x)             xxx         yes           NVMe                 1GbE                  1 x     2 x          1 x DP          1 x               xxx              xxx        No                            USB-C 5V 

Other specs
Khadas Edge 2 Pro also has 3 x CSI + 2 x DSI, and can have an I/O board for SD-card and uart
Radxa Rock5B has 1 x CSI + 1 x DSI 
OPi5 has 2 x DSI + 3 x Camera port 


Benchmarks 
----------
Board              | OS                            | Kernel         | Clockspeeds             | 7z b all cores     | 7z b core small core    | 7z b big core   | NicoD Blender    | Supertuxkart        | SBC-Bench
Radxa Rock 5B        Armbian Jammy cinnamon          5.10.110         1.8Ghz A55/2.4Ghz A76     15996                1533 (core 0)             2651 (core 7)     3m25s              65fps (panfork)       http://ix.io/4jOb
Radxa Rock 5B        Radxa Bullseye xfce4            5.10.66-27       1.8Ghz A55/2.4Ghz A76     16138                1522 (core 0)             2649 (core 4/7)   4m35s V2.83.5      xxx                   
Khadas Edge2         Ubuntu 22.04 Gnome              5.10.66          1.8Ghz A55/2.35Ghz* A76   16901                1766 (core 0)             2930 (core 7)     3m25s              110fps (wayland)      http://ix.io/4e8w ****SBC-Bench broken big cores at 408Mhz
NanoPi R6S           Ubuntu 22.04 Gnome Headless     5.10.110         1.8Ghz A55/2.3Ghz * A76   16385                1449 (core 0)             2493 (core 7)     3m27s              110fps (wayland)      http://ix.io/4gSl
Mekotronics R58      Debian Bullseye wayland         5.10.110         1.8Ghz A53/2.2Ghz A76     16803                1777 (core 0)             2879 (core 1)     4m35s              110fps (wayland)      http://ix.io/4j40
Mekotronics R58      Ubuntu 20.04 x11                5.10.66          1.8Ghz A53/2.2Ghz A76     16477                1765 (core 0)             2897 (core 1)     5m53s V2.82        4fps (llvmpipe)
Mekotronics R58X-G4  Armbian Jammy Gnome             5.10.110         1.8Ghz A53/2.4Ghz A76     16421                1767 (core 0)             2852 (core 1)     3m28s              75fps (panfork)       SBC-bench broken 


Pros+++
-------
Khadas Edge2 Pro           Small and USB-C PD powered, so great for my trips but needs a metal case for that. Having the extra USB-C is great. It is either a 2nd fast access to the SoC, and can be used for 2nd HDMI display. OOWOW is great to install new software, no need for RKDevTool. The Khadas software is pretty good. Khadas has a great team that's active on their forum.
NanoPi R6S                 Metal case makes it awesome. It is limited, but for what I wanted it's doing the job better than expected(fast NAS and even watching video). USB-C PD powered, so if I don't find a case for Edge2 I can also use the R6S on my trips. SD-Reader is great for booting and installing software.
Mekotronics R58 mini       Full sized ports. For home use it's good to have a device that's not tiny. Great to have the display ports on back and side and USB on the front. Case is nice, but not used for cooling. Great for digital signage with 2x HDMI + 1 x DP. 
Mekotronics R58X-4G        mini-PCIe, NVMe and SATA. Full sized ports. USB-C with DP. Nice case, can be used to cool the board with a thermal pad but not needed. 
Rock5B                     Armbian support. Has dual M.2 sockets. SD-card reader and eMMC socket. Full sized HDMI-out ports. 2.5GbE.

Cons---
-------
Khadas Edge2 Pro           No metal case yet(March). Missing SD-card, IO board can add that but then doesn't fit in the case. Seems designed for use in a small kiosk/digital signage, so all small special connectors for additional devices like displays and camera's. 
NanoPi R6S                 Designed for networking and so missing a lot of other features(NVMe, PCIe, extra USB-C with DP, multiple USB3 ports...).  
Mekotronics R58 mini       Not the best I/O. No sd-reader what makes the use of RKDevTool needed. Expensive. Wouldn't be as good for me if I didn't know great Armbian devs(MonkaBlyat). 
Mekotronics R58X-4G        No sd-reader what makes the use of RKDevTool needed. Expensive. Wouldn't be as good for me if I didn't know great Armbian devs(MonkaBlyat). 
Rock5B                     Software not ready for my daily needs, seems the worst supported board. USB-C PD has issue's. No good cooling sollution comes with the board. 


My opinion on available software 
--------------------------------
1.   Khadas Edge2           Ubuntu 22.04 works great with panfork. You can also use the blob GPU driver if you start with the Gnome image. Almost everything works as it should. 
2.   Mekotronics R58(X-4G)  Armbian Jammy Gnome works great with panfork. The Mekotronics images aren't perfect. Works well for desktop/video/gaming. 
3.   NanoPi R6S             Ubuntu 22.04 gnome works well, but panfork doesn't work with it. It's very stable, did my desktop tasks as a champ. But I'm missing gaming on it with x11. 
4.   Radxa Rock5B           Armbian Jammy Gnome is buggy as hell. Only Armbian runs ok on it. The Debian image from Radxa is a mess, Android is unusable. DTB file seems badly hacked together.


My favorite ranking for now
---------------------------
1. Mekotronics R58X-4G            It has it all. Good cooling, nice it's not tiny, NVMe and SATA and mini-PCIe. 1 less full sized HDMI vs R58 but USB-C DP works too. Armbian thanks to MonkaBlyat brings this on top.
2. NanoPi R6S                     Limited but works well for what I wanted from it. The case is a big plus. Panfork not working. But the Ubuntu 22.04 Gnome image is great for desktop tasks. Stable, great video playback. Performs well as NAS too. Love that it has an SD-reader. I do not need dual 2.5GbE, so could have been better having NVMe instead of 2nd 2.5GbE port.
3. Khadas Edge 2                  Missing of a metal case brings this down, waiting for the case to be released. The software from Khadas is the best of all. No SD-card is also a big minor. Best board for travel laptop.
4. Mekotronics R58X               Works well. But has a lot less I/O than R58X-4G. Then again has 2 x full sized HDMI-out vs 1 x on R58X-4G. 
5. Radxa Rock5B                   Bit dissapointed by the software. It does have all the bells and whistles I want. But it isn't ready for daily use yet. Armbian is the only ok-working image for it. And that is a lot more buggy than all the others. 
 
***Don't have the OPi5*** </pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">26398</guid><pubDate>Wed, 01 Feb 2023 16:46:04 +0000</pubDate></item><item><title>Java UIO</title><link>https://forum.armbian.com/topic/19485-java-uio/</link><description><![CDATA[<p>
	<a href="https://github.com/sgjava/javauio" rel="external nofollow">Java UIO</a> provides high performance Java interfaces for Linux Userspace IO. Java UIO was built from the ground up to use modern kernel APIs, libraries and code generation techniques to provide a best of breed cross platform approach. It does not make sense to recreate the wheel like so many other IO libraries. JDK 17 <abbr title="Long term support"><abbr title="Long term support">LTS</abbr></abbr> is supported out of the box.
</p>

<p>
	 
</p>

<p>
	I've been committing code to <a href="https://github.com/olikraus/u8g2" rel="external nofollow">U8g2</a> that utilizes the same userspace code at the C level and dramatically improved the performance of HW/SW SPI and I2C in the <a href="https://github.com/olikraus/u8g2/tree/master/sys/arm-linux" rel="external nofollow">arm-linux</a> port. I also made the arm-linux port thread safe and multi display capable (you can use this in C as well obviously). It made sense to add modularization to the Java Periphery IO library since I can take advantage of the same code generation techniques. I will continue to wrap optimized C libraries moving forward in the same modular fashion.
</p>

<p>
	 
</p>

<p>
	So now you can develop against IO and small displays with one code base in Java.
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="8563" href="https://forum.armbian.com/uploads/monthly_2021_12/IMG_20211118_133140.jpg.88ee08696458bc73d3a343a411890047.jpg" rel=""><img alt="IMG_20211118_133140.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="8563" data-ratio="133.21" width="563" src="https://forum.armbian.com/uploads/monthly_2021_12/IMG_20211118_133140.thumb.jpg.e7ee33a35ba85957c5dfa17d50a6050a.jpg" /></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="8567" href="https://forum.armbian.com/uploads/monthly_2021_12/periphery.png.4f5c536d99feb5396fbe80f2b1536776.png" rel=""><img alt="periphery.png" class="ipsImage ipsImage_thumbnailed" data-fileid="8567" data-ratio="149.11" width="503" src="https://forum.armbian.com/uploads/monthly_2021_12/periphery.thumb.png.7062181c572da1232fb1c65fe79f12d1.png" /></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="8569" href="https://forum.armbian.com/uploads/monthly_2021_12/java.png.668717739bfc217d93488be586fbb45e.png" rel=""><img alt="java.png" class="ipsImage ipsImage_thumbnailed" data-fileid="8569" data-ratio="105.54" width="632" src="https://forum.armbian.com/uploads/monthly_2021_12/java.png.668717739bfc217d93488be586fbb45e.png" /></a>
</p>
]]></description><guid isPermaLink="false">19485</guid><pubDate>Sat, 11 Dec 2021 13:52:12 +0000</pubDate></item><item><title>Video : Review of the Mekotronics R58-Mini and R58X-4G</title><link>https://forum.armbian.com/topic/27487-video-review-of-the-mekotronics-r58-mini-and-r58x-4g/</link><description><![CDATA[<p>
	Hi all.<br />
	Here my review of the Mekotronics R58-Mini and R58X-4G.<br />
	These are my favorite RK3588 devices. Easiest to work with on a desk. Been my main-desktop for the last months.<br />
	I've been using MonkaBlyat his Armbian images.<br />
	It is stable, fun to work with, has <abbr title="Graphic processing unit (3D acceleration)"><abbr title="Graphic processing unit (3D acceleration)">GPU</abbr></abbr> drivers and <abbr title="Video processing unit (encoding/decoding)"><abbr title="Video processing unit (encoding/decoding)">VPU</abbr></abbr>. But it is using the dirty rockchip kernel.<br />
	<br />
	So once armbian can be build for these devices, and mainline has matured these should be the best RK3588 devices for me at home. For on the road I've got the Kadas Edge2Pro.<br />
	Here's my video.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/z27p2btjCjs?feature=oembed" title="Mekotronics R58-Mini and R58X-4G Linux Review" width="200"></iframe>
	</div>
</div>

<p>
	 
</p>

<p>
	Mekotronics download page :<br />
	<a href="https://www.mekotronics.com/h-msgBoard.html" rel="external nofollow">https://www.mekotronics.com/h-msgBoard.html</a>
</p>

<p>
	Armbian from MonkaBlyat for R58-Mini :<br />
	<a href="https://monka.systemonachip.net/r58-mini/Armbian_23.05.0-trunk_r58-mini_jammy_legacy_5.10.110.AFM.img.xz" rel="external nofollow">https://monka.systemonachip.net/r58-mini/Armbian_23.05.0-trunk_r58-mini_jammy_legacy_5.10.110.AFM.img.xz</a>
</p>

<p>
	Armbian from MonkaBlyat for R58X (4G/Pro) :<br />
	<a href="https://monka.systemonachip.net/r58x/Armbian_23.05.0-trunk_r58x_jammy_legacy_5.10.110.AFM.img.xz" rel="external nofollow">https://monka.systemonachip.net/r58x/Armbian_23.05.0-trunk_r58x_jammy_legacy_5.10.110.AFM.img.xz</a>
</p>

<p>
	RKDevTool and SPI boot loader for Armbian :<br />
	<a href="https://drive.google.com/file/d/1Gg9So9nuVax_AC82UQJOq1mHBea3sQ4q/view?usp=share_link" rel="external nofollow">https://drive.google.com/file/d/1Gg9So9nuVax_AC82UQJOq1mHBea3sQ4q/view?usp=share_link</a>
</p>

<p>
	<br />
	Here all my gathered info <span>: </span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode">Mekotronics R58X-4G

Armbian Jammy Gnome kernel 5.10.110-rockchip

Video flow

    Intro
    Open devices
    Go over specs
    Show how to install new image
    Benchmarks
    Termperatures
    Transfer rates
    remarks
    pros/cons
    closing

Benchmarks
7z decompression all cores : 16854
7z decompression small core : 1768 (core 0)
7z decompression big core : 2986 (core 1)

NicoD blender benchmark pro : 3m23s
NicoD blender benchmark 4G : 3m28s

Temperatures
R58-mini
Idle : 45C
Maxed out : 81C

R58X-4G
Idle : 41C
Maxed out : 65C

R58X-Pro
Idle : 47C
Maxed out : 80C

Transfer rates
eMMC 64GB read R58X-4G : 272.9 MB/s
eMMC 64GB write R58X-4G : 80-140 MB/s

eMMC 64GB read R58X-Pro/Mini : 325.8 MB/s
eMMC 64GB write R58X-Pro : 280-240 MB/s
eMMC 64GB write R58-Mini write : 320-280 MB/s

4G Samsung 980 NVMe read : 3.1 GB/s
4G Samsung 980 NVMe write : 623.2 MB/s

Pro Samsung 970 QVO USB3 -&gt; SSD read : 395.5 MB/s
Pro Samsung 970 QVO USB3 -&gt; SSD write : 374.9 MB/s

Pro USB-C with hub -&gt; USB3 to SSD read : 391.3 MB/s
Pro USB-C with hub -&gt; USB3 to SSD write : 375.6 MB/s

Mini SATA with ribbon read : 468.8 MB/s
Mini SATA with ribbon write : 521.3 MB/s

Power consumption

Remarks
!!! Core 0 is small, 1 - 4 big and 5 - 7 small | Other RK3588 devices have 0 - 3 small and 4 - 7 big
!!! HDMI ports can be buggy when waking up the device. Then need to replug the connector. The same switching with my HDMI switch. Using Armbian Jammy on R58X-4G
!!! External sound device needs to be selected every boot/reboot. Armbian Jammy R58X-4G

Instructions
Start with Armbian Jammy CLI/server
To install the wayland blob GPU driver
wget https://github.com/numbqq/mali-debs/blob/master/jammy/arm64/Edge2/wayland/linux-gpu-mali-wayland_1.0-g610-20220510_arm64.deb
and install it into the system with the command :
sudo dpkg -i --force-overwrite linux-gpu-mali-wayland_1.0-g610-20220510_arm64.deb

For panfork and VPU
sudo add-apt-repository ppa:liujianfeng1994/panfork-mesa
sudo add-apt-repository ppa:liujianfeng1994/rockchip-multimedia
sudo apt update
sudo apt dist-upgrade
sudo apt install mali-g610-firmware rockchip-multimedia-config libv4l-rkmpp

Install Gnome desktop
sudo apt install ubuntu-desktop

And additional packages from multimedia repo : https://forum.radxa.com/t/introduction-to-rockchip-multimedia-ppa-for-ubuntu-jammy/14537
sudo apt install chromium-browser gstreamer1.0-rockchip clapper ffmpeg kodi moonlight-embedded moonlight-qt obs-gstreamer obs-studio

Build Box86/64, install Wine/PPSSPP and build Xonotic
https://github.com/NicoD-SBC/armbian-gaming

Pros/Cons
+++ My favorite RK3588 devices by far. Easy to work with. I love the layout and metal case.
+++ 4G has good I/O with fast NVMe + SATA + 2 x USB3(USB3+USB-C)
+++ Armbian progress is going well. Will be in armbian-build to build your own images. Pro it’s new devices will take some time. 10GbE doesn’t work yet.
+++ Has GPU and VPU drivers
— Still in development. Not yet for a novice Linux user.
— Only GbE. The Pro comes with 10GbE but uses the M.2 slot, so it’s a choice in having fast NVMe or 10GbE
— Has to use dirty Rockchip kernel
— No forum or good wiki

Board              | OS                            | Kernel         | Clockspeeds             | 7z b all cores     | 7z b core small core    | 7z b big core   | NicoD Blender    | Supertuxkart 
Khadas VIM2          Ubuntu 20.04 Gnome              5.18.0           1.4Ghz A53/1Ghz A53       7728                 900 (core 7)              1235 (core 0)     18m26s 2.79b       5fps    
Khadas VIM2          Armbian Kinetic server          6.1.0-meson64    1.4Ghz A53/1Ghz A53       7867                                           1252 (core 0) 
Khadas VIM3          Ubuntu 20.04 Gnome              5.18.0           1.8Ghz A53/2.2Ghz A73     10300                1636 (core 0)             2417 (core 5)     9m38s  2.79b       19fps   
Khadas VIM4          Ubuntu 22.04 Gnome              5.4.125          2.2Ghz A73/2Ghz A53       14138                1775 (core 7)             2299 (core 0)     5m46s              52fps     
Khadas VIM4          Debian 10 xfce4                 5.4.125          2.2Ghz A73/2Ghz A53       15113                1830 (core 7)             2334 (core 0)     7m15s  2.79b                                  
Station P1           Armbian Jammy xfce4             5.18.19          1.4Ghz A53/1.8Ghz A72     7607                 1248 (core 0)             1843 (core 5)     10m10s             7fps       
Odroid N2+           Armbian Jammy xfce4             5.10.139         2Ghz A53/2.4Ghz A73       11755                1761 (core 0)             2518 (core 5)     5m53s              18fps    
Odroid N2+           Armbian Kinetic server          6.1.0-meson64    2Ghz A53/2.4Ghz A73       11807                1764 (core 0)             2520 (core 5)     xxx                18fps
Odroid C2            Armbian kinetic server          6.1.0-meson64    1.5Ghz                    5173                 1320 (core 0)                           
Khadas Edge2         Ubuntu 22.04 Gnome              5.10.66          1.8Ghz A55/2.35Ghz*** A76 16901                1766 (core 0)             2930 (core 7)     3m25s              110fps (wayland)                             
NanoPi R6S           Ubuntu 22.04 Gnome Headless     5.10.110         1.8Ghz A55/2.3Ghz *** A76 16385                1449 (core 0)             2493 (core 7)     3m27s              110fps (wayland)                  
Mekotronics R58 mini Debian Bullseye x11 xfce4       5.10.110         1.8Ghz A55/2.2Ghz A76     16241                1758 (core 0)             2839 (core 1)     4m50s V2.83.5
Mekotronics R58 mini Debian Bullseye wayland         5.10.110         1.8Ghz A55/2.2Ghz A76     16803                1777 (core 0)             2879 (core 1)     4m35s              110fps (wayland) 
Mekotronics R58 mini Ubuntu 20.04 x11                5.10.66          1.8Ghz A55/2.2Ghz A76     16477                1765 (core 0)             2897 (core 1)     5m53s V2.82        4fps (llvmpipe)
Mekotronics R58 mini Manjaro Gnome                   5.10.66-28rk     1.8Ghz A55/2.2Ghz A76     16153                1572 (core 0)             2568 (core 1)
Mekotronics R58X-Pro Armbian Jammy Gnome             5.10.110-rk      1.8Ghz A55/2.3Ghz A76     16854                1768 (core 0)             2986 (core 1)     3m23s              110fps (wayland)
Mekotronics R58X-4G  Armbian Jammy Gnome             5.10.110-rk      1.8Ghz A55/2.2Ghz A76     16497                1767 (core 0)             2874 (core 1)     3m28s              79fps (panfork) 
</pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">27487</guid><pubDate>Wed, 22 Mar 2023 16:15:10 +0000</pubDate></item><item><title>Complete headless Armbian and Orange Pi installation tutorial connecting via Windows Remote Desktop (xrdp).</title><link>https://forum.armbian.com/topic/27407-complete-headless-armbian-and-orange-pi-installation-tutorial-connecting-via-windows-remote-desktop-xrdp/</link><description><![CDATA[<p>
	If you want to do a complete headless install of Armbian OS on an Orange Pi 5, and connect with Windows Remote Desktop, I put together what has worked for me.<br />
	I pieced this tutorial together using an Orange Pi 5, installing Armbian 23.02 Jammy Gnome Desktop, and connecting via a Windows 11 PC using Windows Remote Desktop client. Keep in mind, your Orange Pi OS needs to be a full Desktop edition, otherwise, if you're using CLI editions, you will not have a Graphical User Interface installed, which Windows Remote Desktop needs to connect.<br />
	<br />
	<a href="" rel="">ArmbianOS Download Link</a><br />
	<a href="" rel="">Putty Download Link</a><br />
	 
</p>

<p>
	Start PUTTY and enter your Orange Pi's IP address or host name (orangepi5) into PUTTY's Host Name field, hit enter.
</p>

<p>
	Accept any certificate popup screens.
</p>

<p>
	Login with Armbian's default user and pass.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">USER(logon): root
PASSWORD: 1234</span></pre>

<p>
	<br />
	You'll be prompted with your Orange Pi's IP address. Take note of that, you might want to use it to remote connect, though you can also use the Orange Pi default hostname (orangepi5).<br />
	Next, you'll be prompted to complete the following...create a root password, select bash or zsh, create a user and user password, enter real name, select timezone, and select locale.<br />
	<em><strong>Take note of the User Name and Password you created since you will use that to logon with the Windows Remote Desktop Client.</strong></em><br />
	After completing account setup, you should be at a blank command prompt.<br />
	 
</p>

<p>
	<em><strong>DO NOT RUN ANY <u>UPDATE</u> COMMANDS</strong></em><br />
	 
</p>

<p>
	enter the following commands...
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo apt install xrdp xorgxrdp
sudo systemctl enable xrdp
sudo systemctl status xrdp</span></pre>

<p>
	<br />
	After entering the <em><strong>systemctl status xrdp</strong></em> command , you should see a listing showing "Active: active (running)". If Active shows "failed" then you will not be capable of connecting via Remote Desktop. **See below to try and resolve this issue.
</p>

<p>
	If you get a successful status list then, press the Ctrl key and C key simultaneously to get back to the command prompt.
</p>

<p>
	Reboot your Orange Pi by entering
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo reboot</span></pre>

<p>
	<br />
	You should now be capable of accessing your OrangePi remotely by using Windows Remote Desktop.
</p>

<p>
	Open your Windows Remote Desktop client.
</p>

<p>
	You can adjust the size of the Remote Desktop screen session by clicking the "Show Options" located at the lower left corner of the Remote Desktop logon windows, then click the "Display" tab to set your preferred screen size, among other options.
</p>

<p>
	In the Computer field, enter your Orange Pi's IP address or host name (orangepi5), hit Connect.
</p>

<p>
	You should now be prompted with an XRDP logon screen. Enter the username and password you created when setting up Armbian during the PUTYY session.
</p>

<p>
	<br />
	<strong>**INSTRUCTION TO ATTEMPT TO RESOLVE A FAILED SYSTEMCTL STATUS.</strong>
</p>

<p>
	If you haven't rebooted, and need to get back to the command prompt, then press the Ctrl key and C key simultaneously to get back to the command prompt.
</p>

<p>
	Enter the following commands to uninstall xrdp...
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo apt remove xrdp
sudo apt purge xrdp</span></pre>

<p>
	Reinstall xrdp by following the same instructions at the start of this tutorial. Check the status again by entering the following command...
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">sudo systemctl status xrdp</span></pre>

<p>
	Hopefully, this time it will show as "Active: active (running)".
</p>

<p>
	 
</p>

<p>
	Hope this helps.
</p>
]]></description><guid isPermaLink="false">27407</guid><pubDate>Mon, 20 Mar 2023 08:54:10 +0000</pubDate></item><item><title>BananaPi Pro 7" TouchLCD with Debian Buster and Mainline-Kernel 5.XX.XX</title><link>https://forum.armbian.com/topic/7233-bananapi-pro-7-touchlcd-with-debian-buster-and-mainline-kernel-5xxxx/</link><description><![CDATA[<p>
	<strong>EDIT: 04.01.2020 - Fixed patches to work with latest armbian sources. (references have changed)</strong>
</p>

<p>
	 
</p>

<p>
	Hi everybody,
</p>

<p>
	 
</p>

<p>
	Here is a tutorial to enable the Lemaker 7" Touchscreen on BananaPi Pro with Debian Buster and Mainline-Kernel 5.<strong>XX</strong>.<strong>XX</strong>.
</p>

<p>
	 
</p>

<p>
	Kernel: Mainline 5.<strong>4</strong>.<strong>6</strong> / Buster<br>
	Board: BananaPi Pro
</p>

<p>
	 
</p>

<p>
	WebLinks:
</p>

<p>
	    • <a href="https://forum.armbian.com/topic/1905-enabling-lcd-in-u-boot-kernel-472/" rel="">https://forum.armbian.com/topic/1905-enabling-lcd-in-u-boot-kernel-472/</a><br>
	    • <a href="https://forum.armbian.com/topic/1849-touch-driver-banana-pi/" rel="">https://forum.armbian.com/topic/1849-touch-driver-banana-pi/</a><br>
	    • <a href="http://www.atakansarioglu.com/getting-started-bananapi-linux/" rel="external nofollow">http://www.atakansarioglu.com/getting-started-bananapi-linux/</a><br>
	    • <a href="http://forum.lemaker.org/thread-15482-1-1.html" rel="external nofollow">http://forum.lemaker.org/thread-15482-1-1.html</a><br>
	    • <a href="http://linux-sunxi.org/LCD" rel="external nofollow">http://linux-sunxi.org/LCD</a>
</p>

<p>
	 
</p>

<p>
	To make the 7"LCD and the Touchscreen working with BananaPi Pro we need to patch some files and change the kernel config to build the driver for the touchscreen.<br>
	To do this we need a working setup of the Armbian build tool chain (<a href="https://docs.armbian.com/Developer-Guide_Build-Preparation/" rel="external nofollow">https://docs.armbian.com/Developer-Guide_Build-Preparation/</a>)
</p>

<p>
	 
</p>

<p>
	/home/&lt;USER&gt;/build/cache/sources/u-boot/v201<strong>X</strong>.<strong>XX</strong>/configs/Bananapro_defconfig<br>
	/home/&lt;USER&gt;/build/cache/sources/u-boot/v201<strong>X</strong>.<strong>XX</strong>/arch/arm/dts/sun7i-a20-bananapro.dts<br>
	/home/&lt;USER&gt;/build/cache/sources/linux-mainline/linux-4.<strong>XX</strong>.y/arch/arm/boot/dts/sun7i-a20-bananapro.dts
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;"><strong>1. U-Boot ( u-boot version that supports the LCD - must be compiled)</strong></span>
</p>

<p>
	 
</p>

<p>
	<strong>Start the build process with ./compile.sh CREATE_PATCHES=yes</strong>
</p>

<p>
	 
</p>

<p>
	When asked for:<br>
	[ warn ] Applying existing u-boot patch [ /home/[USER]/build/output/patch/u-boot-sunxi-current.patch ]<br>
	[ warn ] Make your changes in this directory: [ /home/[USER]/build/cache/sources/u-boot/v201<strong>X</strong>.<strong>XX</strong> ]<br>
	[ warn ] Press &lt;Enter&gt; after you are done [ waiting ]
</p>

<p>
	 
</p>

<p>
	<strong>a) edit /home/&lt;USER&gt;/build/cache/sources/u-boot/v201<span style="color:#3498db;">X</span>.<span style="color:#3498db;">XX</span>/configs/Bananapro_defconfig</strong>
</p>

<p>
	 
</p>

<p>
	add the following:
</p>

<pre class="ipsCode">
#7" LVDS LCD
CONFIG_VIDEO_LCD_MODE="x:1024,y:600,depth:24,pclk_khz:55000,le:100,ri:170,up:10,lo:15,hs:50,vs:10,sync:3,vmode:0"
CONFIG_VIDEO_LCD_PANEL_LVDS=y
CONFIG_VIDEO_LCD_POWER="PH12"
CONFIG_VIDEO_LCD_BL_EN="PH8"
CONFIG_VIDEO_LCD_BL_PWM="PB2"</pre>

<p>
	 
</p>

<p>
	<strong>b) edit /home/&lt;user&gt;/build/cache/sources/u-boot/v201<span style="color:#3498db;">X</span>.<span style="color:#3498db;">XX</span>/arch/arm/dts/sun7i-a20-bananapro.dts</strong>
</p>

<p>
	 
</p>

<p>
	<span> </span>add after:
</p>

<p>
	 
</p>

<p>
	<strong>&amp;i2c2 {<br>
	    ...<br>
	};</strong>
</p>

<p>
	 
</p>

<p>
	the following:
</p>

<pre class="ipsCode">
&amp;i2c3 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = &lt;&amp;i2c3_pins&gt;;
	edt: edt-ft5x06@38 {
		compatible = "edt,edt-ft5x06", "edt,edt-ft5206";
		reg = &lt;0x38&gt;;
		pinctrl-names = "default";
		pinctrl-0 = &lt;&amp;edt_ft5x06_pins_a &amp;edt_ft5x06_pins_b&gt;;
		interrupt-parent = &lt;&amp;pio&gt;;
		interrupts = &lt;7 9 IRQ_TYPE_EDGE_FALLING&gt;;
		touchscreen-size-x = &lt;1024&gt;;
		touchscreen-size-y = &lt;600&gt;;
	};
};</pre>

<p>
	 
</p>

<p>
	Add these two new sections to the end of the file:
</p>

<pre class="ipsCode prettyprint lang-swift prettyprinted">
<span class="pun">&amp;</span><span class="pln">pio </span><span class="pun">{</span><span class="pln">
    edt</span><span class="pun">_</span><span class="pln">ft</span><span class="lit">5</span><span class="pln">x</span><span class="lit">06_</span><span class="pln">pins</span><span class="pun">_</span><span class="pln">a</span><span class="pun">:</span><span class="pln"> ft</span><span class="lit">5</span><span class="pun">@</span><span class="lit">0</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        pins </span><span class="pun">=</span><span class="pln"> </span><span class="str">"PH9"</span><span class="pun">;</span><span class="pln">
        function </span><span class="pun">=</span><span class="pln"> </span><span class="str">"irq"</span><span class="pun">;</span><span class="pln">
        drive</span><span class="pun">-</span><span class="pln">strength </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;</span><span class="lit">20</span><span class="pun">&gt;;</span><span class="pln">
        bias</span><span class="pun">-</span><span class="pln">pull</span><span class="pun">-</span><span class="pln">up</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
    edt</span><span class="pun">_</span><span class="pln">ft</span><span class="lit">5</span><span class="pln">x</span><span class="lit">06_</span><span class="pln">pins</span><span class="pun">_</span><span class="pln">b</span><span class="pun">:</span><span class="pln"> ft</span><span class="lit">5</span><span class="pun">@</span><span class="lit">1</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        pins </span><span class="pun">=</span><span class="pln"> </span><span class="str">"PH7"</span><span class="pun">;</span><span class="pln">
        function </span><span class="pun">=</span><span class="pln"> </span><span class="str">"gpio_out"</span><span class="pun">;</span><span class="pln">
        drive</span><span class="pun">-</span><span class="pln">strength </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;</span><span class="lit">20</span><span class="pun">&gt;;</span><span class="pln">
        bias</span><span class="pun">-</span><span class="pln">pull</span><span class="pun">-</span><span class="pln">up</span><span class="pun">;</span><span class="pln">
        output</span><span class="pun">-</span><span class="pln">high</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="pun">&amp;</span><span class="pln">pwm </span><span class="pun">{</span><span class="pln">
      pinctrl</span><span class="pun">-</span><span class="pln">names </span><span class="pun">=</span><span class="pln"> </span><span class="str">"default"</span><span class="pun">;</span><span class="pln">
      pinctrl</span><span class="lit">-0</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;&amp;</span><span class="pln">pwm</span><span class="lit">0_</span><span class="pln">pin</span><span class="pun">&gt;,</span><span class="pln"> </span><span class="pun">&lt;&amp;</span><span class="pln">pwm</span><span class="lit">1_</span><span class="pln">pin</span><span class="pun">&gt;;</span><span class="pln">
      status </span><span class="pun">=</span><span class="pln"> </span><span class="str">"okay"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	 
</p>

<p>
	Then save and press &lt;Enter&gt; to continue.
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:20px;">2. Kernel patches - DTB (Device Tree Blob) file that fits to your Kernel and supports pwm</span></strong>
</p>

<p>
	 
</p>

<p>
	When asked for:<br>
	[ warn ] Applying existing kernel patch [ /home/&lt;USER&gt;/build/output/patch/kernel-sunxi-current.patch ]<br>
	[ warn ] Make your changes in this directory: [ /home/&lt;USER&gt;/build/cache/sources/linux-mainline/orange-pi-5.<strong><span>XX</span></strong> ]<br>
	[ warn ] Press &lt;Enter&gt; after you are done [ waiting ]
</p>

<p>
	 
</p>

<p>
	<strong>c) edit /home/&lt;USER&gt;/build/cache/sources/linux-mainline/orange-pi-5.<span style="color:#3498db;">XX</span>/arch/arm/boot/dts/sun7i-a20-bananapro.dts</strong>
</p>

<p>
	 
</p>

<p>
	<strong><span style="color:#c0392b;">add the same lines like section b)</span></strong>
</p>

<p>
	 
</p>

<p>
	Then save and press &lt;Enter&gt; to continue.
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:20px;">3. Compile Touchdriver</span></strong>
</p>

<p>
	 
</p>

<p>
	menuconfig &gt; Device Drivers &gt; Input Device Support &gt; Touchscreens &gt; EDT FocalTech FT5x06 I2C Touchscreen support
</p>

<p>
	 
</p>

<p>
	<img alt="grafik.png.75a03d1a3b2332b9aaf10e31edfb6198.png" class="ipsImage ipsImage_thumbnailed" data-fileid="2757" src="https://forum.armbian.com/uploads/monthly_2018_05/grafik.png.75a03d1a3b2332b9aaf10e31edfb6198.png"></p>

<p>
	 
</p>

<p>
	Exit and save the Kernel configuration.
</p>

<p>
	 
</p>

<p>
	This is the outcome. You probably have a newer version than 19.11.4:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="5690" href="https://forum.armbian.com/uploads/monthly_2020_01/2020-01-04_18h35_16.png.29a290e94829d68abe59e6ac2eda8680.png" rel=""><img alt="2020-01-04_18h35_16.thumb.png.3a14d78e4e914cdb8a82cf2423e60d93.png" class="ipsImage ipsImage_thumbnailed" data-fileid="5690" data-ratio="10.60" width="1000" src="https://forum.armbian.com/uploads/monthly_2020_01/2020-01-04_18h35_16.thumb.png.3a14d78e4e914cdb8a82cf2423e60d93.png"></a>
</p>

<p>
	 
</p>

<p>
	<br>
	Now you can flash the image to a SD-Card or you have to install the new DEBs.
</p>

<p>
	 
</p>

<p>
	<img alt="2020-01-04_18h38_18.png.6633f8519e653fc1eeee3602a7364c4c.png" class="ipsImage ipsImage_thumbnailed" data-fileid="5691" data-ratio="34.55" width="437" src="https://forum.armbian.com/uploads/monthly_2020_01/2020-01-04_18h38_18.png.6633f8519e653fc1eeee3602a7364c4c.png"></p>

<p>
	 
</p>

<p>
	<strong>dpkg -i linux-u-boot-current-bananapipro_19.11.4_armhf.deb<br>
	dpkg -i linux-dtb-current-sunxi_19.11.4_armhf.deb<br>
	dpkg -i linux-image-current-sunxi_19.11.4_armhf.deb</strong>
</p>

<p>
	 
</p>

<p>
	reboot
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;"><strong>The result:</strong></span>
</p>

<p>
	 
</p>

<p>
	The LCD and the touchscreen are working. <img alt=":D" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_biggrin.png" srcset="https://forum.armbian.com/uploads/emoticons/biggrin@2x.png 2x" title=":D" width="20"></p>

<p>
	 
</p>

<p>
	<span style="color:#e74c3c;"><strong>Attention!</strong></span><br>
	There is still the problem with the shutdown.<br>
	When the patches were made for the LCD, the board did not shut down completely during a shutdown (LCD still had voltage and the red LED on the board did not go out).<br>
	 
</p>

<p>
	<strong>Workaround:</strong>
</p>

<p>
	 
</p>

<p>
	We need to disable the LCD before the shutdown is finished.
</p>

<p>
	Therfore we have to create a script in the folder<strong> /lib/systemd/system-shutdown</strong>
</p>

<p>
	 
</p>

<p>
	e.g. (as root)
</p>

<p>
	 
</p>

<p>
	touch /lib/systemd/system-shutdown/lcd_off.sh
</p>

<p>
	chmod +x /lib/systemd/system-shutdown/lcd_off.sh
</p>

<p>
	nano /lib/systemd/system-shutdown/lcd_off.sh
</p>

<p>
	 
</p>

<p>
	add these lines:
</p>

<p>
	 
</p>

<pre class="ipsCode">
#!/bin/bash

# LCD Power			PH12	H=8		(8-1)*32+12		= 236
# Backlight enable	PH8		H=8		(8-1)*32+8		= 232
# Backlight PWM		PB2		B=2		(2-1)*32+2		= 34

if [ ! -d "/sys/class/gpio/gpio34" ] 
then
    sudo sh -c 'echo "34" &gt; /sys/class/gpio/export'
	sudo sh -c 'echo "out" &gt; /sys/class/gpio/gpio34/direction'
	sudo sh -c 'echo "1" &gt; /sys/class/gpio/gpio34/value'
fi
if [ ! -d "/sys/class/gpio/gpio232" ] 
then
    sudo sh -c 'echo "232" &gt; /sys/class/gpio/export'
	sudo sh -c 'echo "out" &gt; /sys/class/gpio/gpio232/direction'
	sudo sh -c 'echo "1" &gt; /sys/class/gpio/gpio232/value'
fi
if [ ! -d "/sys/class/gpio/gpio236" ] 
then
    sudo sh -c 'echo "236" &gt; /sys/class/gpio/export'
	sudo sh -c 'echo "out" &gt; /sys/class/gpio/gpio236/direction'
	sudo sh -c 'echo "1" &gt; /sys/class/gpio/gpio236/value'
fi

# LCD on/off
sudo sh -c 'echo "0" &gt; /sys/class/gpio/gpio34/value'
sudo sh -c 'echo "0" &gt; /sys/class/gpio/gpio232/value'
sudo sh -c 'echo "0" &gt; /sys/class/gpio/gpio236/value'</pre>

<p>
	 
</p>

<p>
	The script will be executed right before the board powers off.
</p>

<p>
	 
</p>

<p>
	<u><strong>Measured power consumption:</strong></u>
</p>

<p>
	 
</p>

<p>
	PowerON (booting / lcd still off) = 0.4A - 0.5A
</p>

<p>
	LCD turns on (still booting) = 0.85A - 1.05A
</p>

<p>
	Boot process ended (LCD on) = 0.75A
</p>

<p>
	Board on, LCD off = 0.35A - 0.45A ( -&gt; LCD needs around 0.4A power )
</p>

<p>
	shutdown -h now = 0.00A <img alt=":D" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_biggrin.png" srcset="https://forum.armbian.com/uploads/emoticons/biggrin@2x.png 2x" title=":D" width="20"></p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;"><strong>4. Control the Power of the Backlight:</strong></span>
</p>

<p>
	 
</p>

<p>
	The backlight PWM is on PIN CON2 PB2.
</p>

<p>
	 
</p>

<p>
	Following the instructions on
</p>

<p>
	<a href="http://linux-sunxi.org/GPIO#Accessing_the_GPIO_pins_through_sysfs_with_mainline_kernel" rel="external nofollow">http://linux-sunxi.org/GPIO#Accessing_the_GPIO_pins_through_sysfs_with_mainline_kernel</a>
</p>

<p>
	<a href="http://forum.lemaker.org/thread-10852-1-1.html" rel="external nofollow">http://forum.lemaker.org/thread-10852-1-1.html</a>
</p>

<p>
	we have to export GPIO-PIN 34.
</p>

<p>
	 
</p>

<p>
	(position of letter in alphabet - 1) * 32 + pin number
</p>

<p>
	position of letter in alphabet: B = 2<br>
	pin number: 2
</p>

<p>
	 
</p>

<p>
	( 2 - 1 ) * 32 + 2 = 34
</p>

<p>
	 
</p>

<p>
	<span style="color:#e74c3c;">echo 34 &gt; /sys/class/gpio/export<br>
	echo "out" &gt; /sys/class/gpio/gpio34/direction</span>
</p>

<p>
	 
</p>

<p>
	<strong>Power on the Backlight:</strong><br><span style="color:#e74c3c;">echo "1" &gt; /sys/class/gpio/gpio34/value</span>
</p>

<p>
	 
</p>

<p>
	<strong>Power off the Backlight:</strong><br><span style="color:#e74c3c;">echo "0" &gt; /sys/class/gpio/gpio34/value</span>
</p>

<p>
	 
</p>

<p>
	Now we could use a switch connected to a GPIO-IN to control the backlight.
</p>

<p>
	 
</p>

<p>
	Steffen
</p>
]]></description><guid isPermaLink="false">7233</guid><pubDate>Tue, 15 May 2018 19:19:51 +0000</pubDate></item><item><title>Video : Interview with Igor about Armbian 23.04 Quoll and the new armbian-next build framework</title><link>https://forum.armbian.com/topic/26822-video-interview-with-igor-about-armbian-2304-quoll-and-the-new-armbian-next-build-framework/</link><description><![CDATA[<p>
	Hi all. I've done an interview with Igor from Armbian.<br />
	We talked about the new release that's coming this weekend. And about armbian-next, the new updated build framework.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/DzzDzQ3hCdI?feature=oembed" title="Interview with Igor from Armbian / Armbian 23.02 Quoll + Armbian-next" width="200"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">26822</guid><pubDate>Wed, 22 Feb 2023 19:39:01 +0000</pubDate></item><item><title>CH340-fan-control - USB fan control script</title><link>https://forum.armbian.com/topic/18368-ch340-fan-control-usb-fan-control-script/</link><description><![CDATA[<p>
	I own a few Android TV boxes that have poor thermal designs that are prone to overheating when under sustained load. This can either cause your device to significantly slow down or shut down entirely. This can be fixed by cutting a hole in the bottom on your TV box above the <abbr title="System On a Chip">SoC</abbr> and sticking a small USB fan on it. In my case I am using a AC Infinity 40mm x 20mm USB Fan that cost me £10.
</p>

<p>
	 
</p>

<p>
	CH340-fan-control is a python script to only activate my TV boxes USB fan when required by using a USB relay module. I'd expect somebody (or several somebodies) have already wrote a similar script for the same device but I failed to find it so here is my effort at fixing this common TV box issue. Hopefully someone else will find it useful.<br />
	<br />
	<a href="https://github.com/danboid/CH340-fan-control" rel="external nofollow">https://github.com/danboid/CH340-fan-control</a><br />
	<br />
	 
</p>

<p><a href="https://forum.armbian.com/uploads/monthly_2021_06/1930255147_CH340fan.jpg.a21d61d373da025de2c74353fba686bf.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="8106" src="https://forum.armbian.com/uploads/monthly_2021_06/72271410_CH340fan.thumb.jpg.bda5482f24b18c0c00169c77be853dda.jpg" data-ratio="69.3" width="1000" class="ipsImage ipsImage_thumbnailed" alt="CH340+fan.jpg"></a></p>
<p><a href="https://forum.armbian.com/uploads/monthly_2021_06/568550593_X96-Airfan.jpg.e9ca87510aead7a99f2cea5ba5624add.jpg" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="8107" src="https://forum.armbian.com/uploads/monthly_2021_06/1500915401_X96-Airfan.thumb.jpg.12dcbf6f584396cf3df857e7cdfe98dd.jpg" data-ratio="64.2" width="1000" class="ipsImage ipsImage_thumbnailed" alt="X96-Air+fan.jpg"></a></p>]]></description><guid isPermaLink="false">18368</guid><pubDate>Wed, 09 Jun 2021 10:19:03 +0000</pubDate></item><item><title>Video : Gaming Benchmarks with panfrost/panfork on RK3399, S922x and RK3588</title><link>https://forum.armbian.com/topic/24935-video-gaming-benchmarks-with-panfrostpanfork-on-rk3399-s922x-and-rk3588/</link><description><![CDATA[<p>
	<abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">Panfrost</abbr></abbr> Gaming benchma<abbr title="Rockchip"><abbr title="Rockchip">rk</abbr></abbr>s with <abbr title="Rockchip"><abbr title="Rockchip">RK</abbr></abbr>3399, Amlogic S922x and <abbr title="Rockchip"><abbr title="Rockchip">RK</abbr></abbr>3588.<br />
	Testing native supertuxkart, box64 Xonotic and wine32/box86 Viper Racing.<br />
	<abbr title="Rockchip"><abbr title="Rockchip">RK</abbr></abbr>3399 and AMLS922X done on Armbian Jammy, <abbr title="Rockchip"><abbr title="Rockchip">RK</abbr></abbr>3588 Ubuntu Jammy (22.04)
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/yEoB2fnv4oE?feature=oembed" title="Panfrost game benchmarks on RK3399 / AML S922x and RK3588" width="200"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">24935</guid><pubDate>Sat, 10 Dec 2022 01:18:03 +0000</pubDate></item><item><title>Video : Linux Review of the Khadas Edge2 / RK3588S</title><link>https://forum.armbian.com/topic/24903-video-linux-review-of-the-khadas-edge2-rk3588s/</link><description><![CDATA[<p>
	Hi all.<br />
	I've just finished making my review video about the Khadas Edge2. No Armbian on it(yet).<br />
	It is an awesome board, and I'm very happy to have it. I'm still waiting on my Rock5B to arrive, so this helped me ove<abbr title="Release candidate">rc</abbr>ome this period.<br />
	But it does have its limits. For some goals it is perfect, some others not so much.<br />
	Here my video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/uYYHWLfX1VM?feature=oembed" title="Khadas Edge2 Linux Review / Rockchip RK3588S" width="200"></iframe>
	</div>
</div>

<p>
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">24903</guid><pubDate>Wed, 07 Dec 2022 16:11:12 +0000</pubDate></item><item><title>Video : Review of the MangoPi MQ-Pro RISC-V with Armbian</title><link>https://forum.armbian.com/topic/23785-video-review-of-the-mangopi-mq-pro-risc-v-with-armbian/</link><description><![CDATA[<p>
	Hi all.<br />
	Here my video about the MangoPi MQ-Pro.<br />
	It's not powerful, not cheap and not great at anything. But it is nice to see it works.<br />
	Everybody started out as a baby. So it now needs to grow.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/Cem9l3ZvQsY?feature=oembed" title="MangoPi MQ Pro Review - A cute little RISC-V SBC" width="200"></iframe>
	</div>
</div>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="1215" data-embedcontent="" data-embedid="embed8012218805" src="https://forum.armbian.com/topic/21465-armbian-image-and-build-support-for-risc-v/?do=embed" style="height:237px;max-width:500px;"></iframe>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode">MangoPi MQ-Pro 1GB
------------------
https://bret.dk/armbian-on-the-mangopi-mq-pro/


Armbian Jammy xfce4 5.19
------------------------
Idle temp           57C
Max temp            63C
Blender NicoD       8h34m
7z b                573


Armbian Jammy 5.19 headless without display or usb connected with wifi 
----------------------------------------------------------------------
Idle temp           47C
Max temp            50C
Blender NicoD       7h44m
7z b                602
sbc-bench           http://ix.io/4cil

Power consumption idle no USB/Display 1080p        0.2A
Power consumption maxed out no USB/Display 1080p   0.3A


Armbian Sid 5.19 server with display
------------------------------------
Idle temp           60C
No blender
7z b                566

Armbian Sid 5.19 server headless
--------------------------------
Idle temp           46C
No blender
7z b                575

Power consumption idle no USB/Display 1080p        0.15A
Power consumption maxed out no USB/Display 1080p   0.24A



sd-read          12 MB/s          sd-write         10.3 MB/s       access time     1.07 msec 
USB read         21.8 MB/s        USB write        7.6 MB/s        access time     1.08 msec

***SID can't log in with display. Works headless.
***Unstable USB. Doesn't always recognize devices. Must plug multiple times until it works.
***Desktop unstable. Sometimes logs out and restarts a new desktop.
***No browser in Armbian apts
***Doesn't shut down fully




The CPU integrated is the 64-bit XuanTie C906 RICS-V (up to 1GHz)
Furthermore, there is a HiFi4 DSP, a VPU(4K H.265/H264) and 2D graphics acceleration to improve its computing performance.
https://linuxgizmos.com/mangopi-mq-pro-a-possible-20-substitute-to-the-raspberry-pi-zero-w/

https://www.allwinnertech.com/uploads/pdf/2021070515231402.pdf

    Processor System:
        ‧SoC  Allwinner D1 XuanTie C906 RISC-V processor (up to 1GHz) 
        HiFi4 DSP
        G2D 2D graphics accelerator
    Memory/storage:
        512MB (model MPi-MQ1PL)/1GB DDR3 (model MPi-MQ1PH)
    Networking: 
        2.4Ghz 802.11b/g/n Wi-Fi 4
        Bluetooth 4.2 via RTL8723DS module + u.FL antenna connector
        Ethernet via expansion board connected to 24-pin connector
    Display/Audio:
        1x mini HDMI 1.4 port (up to 1080p60 or 4Kp30)
        20x Pin DSI/CTP/LVDS FPC connector
        24x Pin DVP/RGMII connector
        Audio out pads
    Other I/O:
        1x USB OTG Type-C port
        1x USB host Type-C port
    Expansion:
        40x pins Raspberry Pi compatible GPIO header
    Power:
         5V – USB Type-C port
    Dimensions:
        65 x 30 mm

 Additionally, the specifications for the Allwinner D1 processor are listed below:

    CPU Architecture:
        XuanTie C906 64bit RISC-V core (32 KB I-cache + 32 KB D-cache)
    DSP Architecture: 
        HiFi4 DSP 600MH (32 KB I-cache + 32 KB D-cache, 64 KB I-ram + 64KB D-ram)
    Memory/Storage:
        2GB DDR2/DDR3(533MHz for DDR2/800MHz for DDR3)
        SD 3.0, eMMC 5.0, SPI Nor/NAND Flash
    Networking: 
        10/100/1000M EMAC with RMII and RGMII interfaces
    Video Engine:
        Video decoding
            H.265 up to 4K@30fps/1080p@60fps
            H.264 up to 4K@24fps/1080p@60fps
            MPEG-1/2/4, JPEG, VC1 up to 1080p@60fps
            MJPEG up to 1080p@30fps
        Video encoding
            JPEG/MJPEG up to 1080p@60fps
            Supports input picture scaler up/down
    Video OUT:
        RGB LCD interface with DE/SYNC mode up to 1920 x 1080@60fps
        Dual link LVDS interface up to 1920 x 1080@60fps
        Single link LVDS interface up to 1366 x 768@60fps
        4-lane MIPI DSI interface up to 1920 x 1080@60fps
        HDMI 1.4b output interface up to 4K x 2K video format
        CVBS OUT interface, supports NTSC/PAL format; 10 bits DAC output
    Video IN:
        8-bit parallel CSI digital camera interface
        CVBS IN interface, supports NTSC/PAL format; 10-bit ADCs
    Audio:
        2x DACs (16-bit and 20-bit sample resolution)
        8KHz to 192KHz DAC sample rate
        3x ADCs (16-bit and 20-bit sample resolution)
        8KHz to 48KHz ADC sample rate
        Analog audio interfaces
            MICIN1P/N, MICIN2P/N, MICIN3P/N, FMINL/R, LINEINL/R,
            LINEOUTLP/N, LINEOUTRP/N, HPOUTL/R
        Digital audio interfaces
            I2S/PCM, DMIC, One Wire Audio IN/OUT
    Other I/O:
        USB2.0 OTG
        USB2.0 Host
        SDIO 3.0
        2x SPI
        6x UART
        4x Two Wire Interface
    Misc:
        PWM (8-ch)
        GPADC (2-ch)
        LRADC (1-ch)
        TPADC (4-ch)
        IR TX/RX
    Package:
        LFBGA 337 Pins (13mm x 13mm) 


Price : 40euro with shipping 
https://nl.aliexpress.com/item/1005004157984532.html?gatewayAdapt=4itemAdapt</pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">23785</guid><pubDate>Sat, 08 Oct 2022 00:38:40 +0000</pubDate></item><item><title>Review of the PineBook Pro with Armbian</title><link>https://forum.armbian.com/topic/18522-review-of-the-pinebook-pro-with-armbian/</link><description><![CDATA[<p>
	Hi al.
</p>

<p>
	I've finished my review of the PineBook Pro. I just love this thing. Runs great with Armbian.
</p>

<p>
	Here my video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/TDGKDuRHyf0?feature=oembed"></iframe>
	</div>
</div>

<p>
	Here all my gathered information:
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode">Version                   Frequency        NicoD Belnder CLI    7-zip a/c      7-zip s/c     7-zip b/c     CPUMiner     SBC-Bench
-------                   ---------        -----------------    ---------      ---------     ---------     --------     ---------
Armbian Focal Mate 5.10   2Ghz/1.5Ghz      13m29s               8422           1347          2062          10.8         http://ix.io/3qsC
Armbian Focal Mate 5.10   1.8Ghz/1.4Ghz    14m20s               7906           1267          1855          10.3         http://ix.io/3qt9  
TwOS Armbian Focal 5.10   1.8Ghz/1.4Ghz    14m40s               
Armbian Buster xfce4 5.10 1.8Ghz/1.4Ghz    15m00s               8074           1303          1843          10.2         http://ix.io/3rdx
Armbian Hirsute cinamon 5.12 1.8/1.4Ghz    14m39s               7907           1264          1854          10.1         http://ix.io/3rjc   
Armbian Focal xfce4 5.10  1.8Ghz/1.4Ghz    14m52s               7764           1242          1843          10.1         http://ix.io/3rjx

Odroid N2+ Bionic 4.9     2Ghz/2.4Ghz       9m01s              11702           1756          2504          14

Transfer rates                                    access time
--------------                                    -----------
SD-card 128GB Sandisk Extreme read 68.8 MB/s      0.42 msec
                             write 58.2 MB/s
eMMC 64GB read                     187 MB/s       0.23 msec
eMMC 64GB write                    145 MB/s
NVMe 256GB read                    802 MB/s       0.03 msec
NVMe 256GB write                   423 MB/s                       #starts at 850 MB/s then goes down to 260 MB/s
SSD over USB3 read                 406 MB/s       0.21 msec
SSD over USB3 write                244 MB/s                       #starts at 220
SSD over USB2 read                 35.3 MB/s      0.51 msec
SSD over USB2 write                32.3 MB/s      

Temperatures 
------------
1.8Ghz/1.4Ghz
Idle          45C
Maxed out     75C on desk
              80C with back raised 
   
2Ghz/1.5Ghz
Idle          47C
Maxed out     86C (light throttling at 85C)

Power consumption
-----------------
Charging while on   2.6A  (max with 60 000mAh power bank, most PSU's don't go over 2A)
Charging while off  2.5A

Browsing and video playback
---------------------------
Vivaldi runs gpu accelerated browsing and perfect video playback up to 1080p30fps or 720p60fps
         download Vivaldi snapshot arm64
                 sudo apt install fonts-liberation
                 sudo dpkg -i vivaldi-snapshot..._arm64.deb
Firefox runs a bit smoother for browsing, but video playback isn't fully accelerated 
                
For video files kodi runs well
         sudo apt install kodi

+++
You can disable Microphone, wifi and camera with key combinations. Pine64 Logo + F10, F11 and F12
Can be powered with either barrel jack or USB type-C 5V !!!Not with both at the same time!!!
USB-C can be used for external display with USB-C to HDMI adapter
---
It can deplete the battery while being charged in heavy use and full brightness, cetainly when using an NVMe
USB-c hub not working
Delete key is backspace with function key
Very low volume in TwisterOS
Too many screws to open


Conclusion
----------
Awesome hardware. I love to have an ARM SoC in a laptop. The RK3399 is the best supported SoC software wise.
Tho a laptop with Amlogic S922x would have been great too. It is more powerful while consuming less.
I would not easily recommend it to people who are not used using ARM. But for me it is near perfect.
It looks great, and the keyboard feels good. 

TwisterOS upgrade problem fix from PtitSeb
sudo mv /usr/share/doc/linux-libc-dev/changelog.Debian.gz /usr/share/doc/linux-libc-dev/changelog.Debian.gz.old 
    to "solve" the conflict, and than the --fix-broken worked
    
Armbian Focal Mate 5.10 has some issue's with battery monitor applet. And power management isn't working as it should.
Armbian Focal xfce4 5.10 Doesn't always boot, black display.
TwisterOS Armbian Focal 5.10 power led only goes on after a while when default os. Speakers are very quiet.
Armbian Buster xfce4 5.10 Doesn't always boot. Black display. 
</pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18522</guid><pubDate>Wed, 30 Jun 2021 09:28:58 +0000</pubDate></item><item><title>Armbian Ubuntu 22.04 Jammy with ZFS 2.1.1 for Odroid HC4</title><link>https://forum.armbian.com/topic/19336-armbian-ubuntu-2204-jammy-with-zfs-211-for-odroid-hc4/</link><description><![CDATA[<p>
	<img alt="screenshothc4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="8518" data-ratio="71.64" data-unique="u6o5fedqj" width="610" src="https://forum.armbian.com/uploads/monthly_2021_11/screenshothc4.png.1ce55b03a0065fb75b734265333cd8e0.png"><img alt="nand-sata.png" class="ipsImage ipsImage_thumbnailed" data-fileid="8516" data-ratio="71.64" data-unique="8ipkjul25" width="610" src="https://forum.armbian.com/uploads/monthly_2021_11/nand-sata.png.bc92515b14bcb1256c4cbfadc8da51e8.png">
</p>

<p>
	 
</p>

<ul>
	<li>
		mainline based u-boot 2021.07
	</li>
	<li>
		Ubuntu 22.04 Jammy <abbr title="Long term support"><abbr title="Long term support">LTS</abbr></abbr> based (upcoming release, could have issues, currently in testing phase)
	</li>
	<li>
		kernel 5.10.y <abbr title="Long term support"><abbr title="Long term support">LTS</abbr></abbr> or 5.15.y <abbr title="Long term support"><abbr title="Long term support">LTS</abbr></abbr>
	</li>
	<li>
		ZSH with <a href="https://ohmyz.sh/" rel="external nofollow">OhMyZSH addon</a> or classic BASH
	</li>
	<li>
		ZFS 2.1.y support
	</li>
	<li>
		Wireguard
	</li>
	<li>
		fan and LCD support
	</li>
	<li>
		boot from SPI / HDD / USB
	</li>
</ul>

<p>
	 
</p>

<p>
	Tested on image (which comes with preinstalled headers, stable kernel):<br>
	<br>
	<a href="https://redirect.armbian.com/odroidhc4/Jammy_current" ipsnoembed="true" rel="external nofollow">https://redirect.armbian.com/odroidhc4/Jammy_current</a>
</p>

<p>
	<a href="https://redirect.armbian.com/odroidhc4/Jammy_current.torrent" ipsnoembed="true" rel="external nofollow">https://redirect.armbian.com/odroidhc4/Jammy_current.torrent</a>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5761_9" style=""><span class="pln">apt update and upgrade</span></pre>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents ipsClearfix" data-gramm="false">
		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5442_5" style=""><span class="pln">odroidhc4:igorp:# apt update 
Get:1 http://ports.ubuntu.com jammy InRelease [270 kB]
Hit:2 http://ports.ubuntu.com jammy-security InRelease                            
Hit:3 http://ports.ubuntu.com jammy-updates InRelease
Hit:4 http://ports.ubuntu.com jammy-backports InRelease
Get:6 http://ports.ubuntu.com jammy/universe arm64 Packages [16.7 MB]
Hit:5 https://stpete-mirror.armbian.com/apt jammy InRelease
Get:7 http://ports.ubuntu.com jammy/main armhf Packages [1,732 kB]
Get:8 http://ports.ubuntu.com jammy/main arm64 Packages [1,757 kB]
Get:9 http://ports.ubuntu.com jammy/universe armhf Packages [16.4 MB]
Fetched 36.9 MB in 3s (11.0 MB/s)                           
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
59 packages can be upgraded. Run 'apt list --upgradable' to see them.
odroidhc4:igorp:# apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  apt apt-utils automake binutils binutils-aarch64-linux-gnu binutils-common busybox-initramfs console-setup console-setup-linux
  cpp-11 ethtool g++-11 gcc-11 gcc-11-base keyboard-configuration libapt-pkg6.0 libasan6 libatomic1 libbinutils libbluetooth3
  libboost-iostreams1.74.0 libcc1-0 libctf-nobfd0 libctf0 libdw1 libelf1 libgcc-11-dev libgcc-s1 libgomp1 libhwasan0 libitm1
  liblsan0 libmm-glib0 libncurses6 libncursesw6 libnftnl11 libpcre2-8-0 libpython3.9 libpython3.9-minimal libpython3.9-stdlib
  libsasl2-2 libsasl2-modules-db libstdc++-11-dev libstdc++6 libtinfo6 libtsan0 libubsan1 ncurses-base ncurses-bin ncurses-term
  python3-distutils python3-launchpadlib python3-lib2to3 python3-software-properties python3-yaml python3.9 python3.9-minimal
  rsyslog software-properties-common
59 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 71.7 MB of archives.
After this operation, 385 MB disk space will be freed.
Do you want to continue? [Y/n] 
Get:1 http://ports.ubuntu.com jammy/main arm64 libncurses6 arm64 6.3-1 [108 kB]
Get:2 http://ports.ubuntu.com jammy/main arm64 libncursesw6 arm64 6.3-1 [142 kB]
Get:3 http://ports.ubuntu.com jammy/main arm64 libtinfo6 arm64 6.3-1 [104 kB]
Get:4 http://ports.ubuntu.com jammy/main arm64 ncurses-bin arm64 6.3-1 [183 kB]
Get:5 http://ports.ubuntu.com jammy/main arm64 ncurses-base all 6.3-1 [19.9 kB]
Get:6 http://ports.ubuntu.com jammy/main arm64 libcc1-0 arm64 11.2.0-12ubuntu1 [54.1 kB]
Get:7 http://ports.ubuntu.com jammy/main arm64 gcc-11-base arm64 11.2.0-12ubuntu1 [20.7 kB]
Get:8 http://ports.ubuntu.com jammy/main arm64 libgcc-s1 arm64 11.2.0-12ubuntu1 [39.3 kB]
Get:9 http://ports.ubuntu.com jammy/main arm64 libgomp1 arm64 11.2.0-12ubuntu1 [115 kB]
Get:10 http://ports.ubuntu.com jammy/main arm64 libitm1 arm64 11.2.0-12ubuntu1 [28.4 kB]
Get:11 http://ports.ubuntu.com jammy/main arm64 libatomic1 arm64 11.2.0-12ubuntu1 [10.8 kB]
Get:12 http://ports.ubuntu.com jammy/main arm64 libasan6 arm64 11.2.0-12ubuntu1 [2,228 kB]
Get:13 http://ports.ubuntu.com jammy/main arm64 liblsan0 arm64 11.2.0-12ubuntu1 [942 kB]
Get:14 http://ports.ubuntu.com jammy/main arm64 libtsan0 arm64 11.2.0-12ubuntu1 [2,232 kB]
Get:15 http://ports.ubuntu.com jammy/main arm64 libubsan1 arm64 11.2.0-12ubuntu1 [908 kB]
Get:16 http://ports.ubuntu.com jammy/main arm64 libhwasan0 arm64 11.2.0-12ubuntu1 [1,010 kB]
Get:17 http://ports.ubuntu.com jammy/main arm64 g++-11 arm64 11.2.0-12ubuntu1 [11.1 MB]
Get:18 http://ports.ubuntu.com jammy/main arm64 libstdc++-11-dev arm64 11.2.0-12ubuntu1 [2,099 kB]
Get:19 http://ports.ubuntu.com jammy/main arm64 libgcc-11-dev arm64 11.2.0-12ubuntu1 [1,150 kB]
Get:20 http://ports.ubuntu.com jammy/main arm64 gcc-11 arm64 11.2.0-12ubuntu1 [19.4 MB]
Get:21 http://ports.ubuntu.com jammy/main arm64 cpp-11 arm64 11.2.0-12ubuntu1 [9,734 kB]
Get:22 http://ports.ubuntu.com jammy/main arm64 libstdc++6 arm64 11.2.0-12ubuntu1 [623 kB]
Get:23 http://ports.ubuntu.com jammy/main arm64 libctf0 arm64 2.37-10ubuntu1 [102 kB]
Get:24 http://ports.ubuntu.com jammy/main arm64 libctf-nobfd0 arm64 2.37-10ubuntu1 [106 kB]
Get:25 http://ports.ubuntu.com jammy/main arm64 libbinutils arm64 2.37-10ubuntu1 [733 kB]
Get:26 http://ports.ubuntu.com jammy/main arm64 binutils-common arm64 2.37-10ubuntu1 [213 kB]
Get:27 http://ports.ubuntu.com jammy/main arm64 binutils arm64 2.37-10ubuntu1 [3,160 B]
Get:28 http://ports.ubuntu.com jammy/main arm64 binutils-aarch64-linux-gnu arm64 2.37-10ubuntu1 [3,214 kB]
Get:29 http://ports.ubuntu.com jammy/main arm64 libapt-pkg6.0 arm64 2.3.12 [864 kB]
Get:30 http://ports.ubuntu.com jammy/main arm64 apt arm64 2.3.12 [1,353 kB]
Get:31 http://ports.ubuntu.com jammy/main arm64 apt-utils arm64 2.3.12 [205 kB]
Get:32 http://ports.ubuntu.com jammy/main arm64 console-setup-linux all 1.205ubuntu3 [1,871 kB]
Get:33 http://ports.ubuntu.com jammy/main arm64 console-setup all 1.205ubuntu3 [110 kB]
Get:34 http://ports.ubuntu.com jammy/main arm64 keyboard-configuration all 1.205ubuntu3 [206 kB]
Get:35 http://ports.ubuntu.com jammy/main arm64 libpython3.9 arm64 3.9.9-1 [1,848 kB]
Get:36 http://ports.ubuntu.com jammy/main arm64 python3.9 arm64 3.9.9-1 [437 kB]
Get:37 http://ports.ubuntu.com jammy/main arm64 libpython3.9-stdlib arm64 3.9.9-1 [1,803 kB]
Get:38 http://ports.ubuntu.com jammy/main arm64 python3.9-minimal arm64 3.9.9-1 [2,121 kB]
Get:39 http://ports.ubuntu.com jammy/main arm64 libpython3.9-minimal arm64 3.9.9-1 [781 kB]
Get:40 http://ports.ubuntu.com jammy/main arm64 libpcre2-8-0 arm64 10.39-3 [201 kB]
Get:41 http://ports.ubuntu.com jammy/main arm64 libdw1 arm64 0.186-1 [246 kB]
Get:42 http://ports.ubuntu.com jammy/main arm64 libelf1 arm64 0.186-1 [51.1 kB]                                                    
Get:43 http://ports.ubuntu.com jammy/main arm64 python3-yaml arm64 5.4.1-1 [159 kB]                                                
Get:44 http://ports.ubuntu.com jammy/main arm64 rsyslog arm64 8.2110.0-3ubuntu1 [496 kB]                                           
Get:45 http://ports.ubuntu.com jammy/main arm64 libnftnl11 arm64 1.2.1-1 [64.4 kB]                                                 
Get:46 http://ports.ubuntu.com jammy/main arm64 automake all 1:1.16.5-1.1 [558 kB]                                                 
Get:47 http://ports.ubuntu.com jammy/main arm64 busybox-initramfs arm64 1:1.30.1-7ubuntu1 [176 kB]                                 
Get:48 http://ports.ubuntu.com jammy/main arm64 ethtool arm64 1:5.15-1 [206 kB]                                                    
Get:49 http://ports.ubuntu.com jammy/main arm64 libbluetooth3 arm64 5.62-0ubuntu2 [89.3 kB]                                        
Get:50 http://ports.ubuntu.com jammy/main arm64 libboost-iostreams1.74.0 arm64 1.74.0-13ubuntu1 [243 kB]                           
Get:51 http://ports.ubuntu.com jammy/main arm64 libmm-glib0 arm64 1.18.2-0ubuntu1 [230 kB]                                         
Get:52 http://ports.ubuntu.com jammy/main arm64 libsasl2-modules-db arm64 2.1.27+dfsg2-2 [21.2 kB]                                 
Get:53 http://ports.ubuntu.com jammy/main arm64 libsasl2-2 arm64 2.1.27+dfsg2-2 [55.6 kB]                                          
Get:54 http://ports.ubuntu.com jammy/main arm64 ncurses-term all 6.3-1 [268 kB]                                                    
Get:55 http://ports.ubuntu.com jammy/main arm64 python3-distutils all 3.9.9-2 [144 kB]                                             
Get:56 http://ports.ubuntu.com jammy/main arm64 python3-lib2to3 all 3.9.9-2 [77.8 kB]                                              
Get:57 http://ports.ubuntu.com jammy/main arm64 python3-launchpadlib all 1.10.15.1-1 [119 kB]                                      
Get:58 http://ports.ubuntu.com jammy/main arm64 software-properties-common all 0.99.16 [14.3 kB]                                   
Get:59 http://ports.ubuntu.com jammy/main arm64 python3-software-properties all 0.99.16 [32.2 kB]                                  
Fetched 71.7 MB in 6s (11.3 MB/s)                                                                                                  
Extracting templates from packages: 100%
Preconfiguring packages ...
(Reading database ... 67209 files and directories currently installed.)
Preparing to unpack .../libncurses6_6.3-1_arm64.deb ...
Unpacking libncurses6:arm64 (6.3-1) over (6.2+20201114-2build2) ...
Preparing to unpack .../libncursesw6_6.3-1_arm64.deb ...
Unpacking libncursesw6:arm64 (6.3-1) over (6.2+20201114-2build2) ...
Preparing to unpack .../libtinfo6_6.3-1_arm64.deb ...
Unpacking libtinfo6:arm64 (6.3-1) over (6.2+20201114-2build2) ...
Setting up libtinfo6:arm64 (6.3-1) ...
(Reading database ... 67209 files and directories currently installed.)
Preparing to unpack .../ncurses-bin_6.3-1_arm64.deb ...
Unpacking ncurses-bin (6.3-1) over (6.2+20201114-2build2) ...
Setting up ncurses-bin (6.3-1) ...
(Reading database ... 67209 files and directories currently installed.)
Preparing to unpack .../ncurses-base_6.3-1_all.deb ...
Unpacking ncurses-base (6.3-1) over (6.2+20201114-2build2) ...
Setting up ncurses-base (6.3-1) ...
(Reading database ... 67209 files and directories currently installed.)
Preparing to unpack .../libcc1-0_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libcc1-0:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../gcc-11-base_11.2.0-12ubuntu1_arm64.deb ...
Unpacking gcc-11-base:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Setting up gcc-11-base:arm64 (11.2.0-12ubuntu1) ...
(Reading database ... 67209 files and directories currently installed.)
Preparing to unpack .../libgcc-s1_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libgcc-s1:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Setting up libgcc-s1:arm64 (11.2.0-12ubuntu1) ...
(Reading database ... 67209 files and directories currently installed.)
Preparing to unpack .../00-libgomp1_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libgomp1:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../01-libitm1_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libitm1:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../02-libatomic1_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libatomic1:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../03-libasan6_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libasan6:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../04-liblsan0_11.2.0-12ubuntu1_arm64.deb ...
Unpacking liblsan0:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../05-libtsan0_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libtsan0:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../06-libubsan1_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libubsan1:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../07-libhwasan0_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libhwasan0:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../08-g++-11_11.2.0-12ubuntu1_arm64.deb ...
Unpacking g++-11 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../09-libstdc++-11-dev_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libstdc++-11-dev:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../10-libgcc-11-dev_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libgcc-11-dev:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../11-gcc-11_11.2.0-12ubuntu1_arm64.deb ...
Unpacking gcc-11 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../12-cpp-11_11.2.0-12ubuntu1_arm64.deb ...
Unpacking cpp-11 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Preparing to unpack .../13-libstdc++6_11.2.0-12ubuntu1_arm64.deb ...
Unpacking libstdc++6:arm64 (11.2.0-12ubuntu1) over (11.2.0-10ubuntu1) ...
Setting up libstdc++6:arm64 (11.2.0-12ubuntu1) ...
(Reading database ... 67211 files and directories currently installed.)
Preparing to unpack .../0-libctf0_2.37-10ubuntu1_arm64.deb ...
Unpacking libctf0:arm64 (2.37-10ubuntu1) over (2.37-9ubuntu1) ...
Preparing to unpack .../1-libctf-nobfd0_2.37-10ubuntu1_arm64.deb ...
Unpacking libctf-nobfd0:arm64 (2.37-10ubuntu1) over (2.37-9ubuntu1) ...
Preparing to unpack .../2-libbinutils_2.37-10ubuntu1_arm64.deb ...
Unpacking libbinutils:arm64 (2.37-10ubuntu1) over (2.37-9ubuntu1) ...
Preparing to unpack .../3-binutils-common_2.37-10ubuntu1_arm64.deb ...
Unpacking binutils-common:arm64 (2.37-10ubuntu1) over (2.37-9ubuntu1) ...
Preparing to unpack .../4-binutils_2.37-10ubuntu1_arm64.deb ...
Unpacking binutils (2.37-10ubuntu1) over (2.37-9ubuntu1) ...
Preparing to unpack .../5-binutils-aarch64-linux-gnu_2.37-10ubuntu1_arm64.deb ...
Unpacking binutils-aarch64-linux-gnu (2.37-10ubuntu1) over (2.37-9ubuntu1) ...
Preparing to unpack .../6-libapt-pkg6.0_2.3.12_arm64.deb ...
Unpacking libapt-pkg6.0:arm64 (2.3.12) over (2.3.11) ...
Setting up libapt-pkg6.0:arm64 (2.3.12) ...
(Reading database ... 67211 files and directories currently installed.)
Preparing to unpack .../archives/apt_2.3.12_arm64.deb ...
Unpacking apt (2.3.12) over (2.3.11) ...
Setting up apt (2.3.12) ...
Installing new version of config file /etc/cron.daily/apt-compat ...
(Reading database ... 67211 files and directories currently installed.)
Preparing to unpack .../0-apt-utils_2.3.12_arm64.deb ...
Unpacking apt-utils (2.3.12) over (2.3.11) ...
Preparing to unpack .../1-console-setup-linux_1.205ubuntu3_all.deb ...
Unpacking console-setup-linux (1.205ubuntu3) over (1.205ubuntu1) ...
Preparing to unpack .../2-console-setup_1.205ubuntu3_all.deb ...
Unpacking console-setup (1.205ubuntu3) over (1.205ubuntu1) ...
Preparing to unpack .../3-keyboard-configuration_1.205ubuntu3_all.deb ...
Unpacking keyboard-configuration (1.205ubuntu3) over (1.205ubuntu1) ...
Preparing to unpack .../4-libpython3.9_3.9.9-1_arm64.deb ...
Unpacking libpython3.9:arm64 (3.9.9-1) over (3.9.8-2) ...
Preparing to unpack .../5-python3.9_3.9.9-1_arm64.deb ...
Unpacking python3.9 (3.9.9-1) over (3.9.8-2) ...
Preparing to unpack .../6-libpython3.9-stdlib_3.9.9-1_arm64.deb ...
Unpacking libpython3.9-stdlib:arm64 (3.9.9-1) over (3.9.8-2) ...
Preparing to unpack .../7-python3.9-minimal_3.9.9-1_arm64.deb ...
Unpacking python3.9-minimal (3.9.9-1) over (3.9.8-2) ...
Preparing to unpack .../8-libpython3.9-minimal_3.9.9-1_arm64.deb ...
Unpacking libpython3.9-minimal:arm64 (3.9.9-1) over (3.9.8-2) ...
Preparing to unpack .../9-libpcre2-8-0_10.39-3_arm64.deb ...
Unpacking libpcre2-8-0:arm64 (10.39-3) over (10.37-0ubuntu2) ...
Setting up libpcre2-8-0:arm64 (10.39-3) ...
(Reading database ... 67211 files and directories currently installed.)
Preparing to unpack .../00-libdw1_0.186-1_arm64.deb ...
Unpacking libdw1:arm64 (0.186-1) over (0.185-2) ...
Preparing to unpack .../01-libelf1_0.186-1_arm64.deb ...
Unpacking libelf1:arm64 (0.186-1) over (0.185-2) ...
Preparing to unpack .../02-python3-yaml_5.4.1-1_arm64.deb ...
Unpacking python3-yaml (5.4.1-1) over (5.3.1-5) ...
Preparing to unpack .../03-rsyslog_8.2110.0-3ubuntu1_arm64.deb ...
Unpacking rsyslog (8.2110.0-3ubuntu1) over (8.2102.0-2ubuntu2) ...
Preparing to unpack .../04-libnftnl11_1.2.1-1_arm64.deb ...
Unpacking libnftnl11:arm64 (1.2.1-1) over (1.2.0-1) ...
Preparing to unpack .../05-automake_1%3a1.16.5-1.1_all.deb ...
Unpacking automake (1:1.16.5-1.1) over (1:1.16.5-1ubuntu1) ...
Preparing to unpack .../06-busybox-initramfs_1%3a1.30.1-7ubuntu1_arm64.deb ...
Unpacking busybox-initramfs (1:1.30.1-7ubuntu1) over (1:1.30.1-6ubuntu3) ...
Preparing to unpack .../07-ethtool_1%3a5.15-1_arm64.deb ...
Unpacking ethtool (1:5.15-1) over (1:5.9-1build1) ...
Preparing to unpack .../08-libbluetooth3_5.62-0ubuntu2_arm64.deb ...
Unpacking libbluetooth3:arm64 (5.62-0ubuntu2) over (5.62-0ubuntu1) ...
Preparing to unpack .../09-libboost-iostreams1.74.0_1.74.0-13ubuntu1_arm64.deb ...
Unpacking libboost-iostreams1.74.0:arm64 (1.74.0-13ubuntu1) over (1.74.0-8ubuntu9) ...
Preparing to unpack .../10-libmm-glib0_1.18.2-0ubuntu1_arm64.deb ...
Unpacking libmm-glib0:arm64 (1.18.2-0ubuntu1) over (1.16.6-2ubuntu1) ...
Preparing to unpack .../11-libsasl2-modules-db_2.1.27+dfsg2-2_arm64.deb ...
Unpacking libsasl2-modules-db:arm64 (2.1.27+dfsg2-2) over (2.1.27+dfsg-2.3) ...
Preparing to unpack .../12-libsasl2-2_2.1.27+dfsg2-2_arm64.deb ...
Unpacking libsasl2-2:arm64 (2.1.27+dfsg2-2) over (2.1.27+dfsg-2.3) ...
Preparing to unpack .../13-ncurses-term_6.3-1_all.deb ...
Unpacking ncurses-term (6.3-1) over (6.2+20201114-2build2) ...
Preparing to unpack .../14-python3-distutils_3.9.9-2_all.deb ...
Unpacking python3-distutils (3.9.9-2) over (3.9.8-1) ...
Preparing to unpack .../15-python3-lib2to3_3.9.9-2_all.deb ...
Unpacking python3-lib2to3 (3.9.9-2) over (3.9.8-1) ...
Preparing to unpack .../16-python3-launchpadlib_1.10.15.1-1_all.deb ...
Unpacking python3-launchpadlib (1.10.15.1-1) over (1.10.14-1) ...
Preparing to unpack .../17-software-properties-common_0.99.16_all.deb ...
Unpacking software-properties-common (0.99.16) over (0.99.15) ...
Preparing to unpack .../18-python3-software-properties_0.99.16_all.deb ...
Unpacking python3-software-properties (0.99.16) over (0.99.15) ...
Setting up automake (1:1.16.5-1.1) ...
Setting up cpp-11 (11.2.0-12ubuntu1) ...
Setting up apt-utils (2.3.12) ...
Setting up libpython3.9-minimal:arm64 (3.9.9-1) ...
Setting up libboost-iostreams1.74.0:arm64 (1.74.0-13ubuntu1) ...
Setting up python3-launchpadlib (1.10.15.1-1) ...
Setting up rsyslog (8.2110.0-3ubuntu1) ...
The user `syslog' is already a member of `adm'.
/usr/bin/which: this version of `which' is deprecated; use `command -v' in scripts instead.
/usr/bin/which: this version of `which' is deprecated; use `command -v' in scripts instead.
/usr/bin/which: this version of `which' is deprecated; use `command -v' in scripts instead.
Removing obsolete conffile /etc/init.d/rsyslog ...
Setting up binutils-common:arm64 (2.37-10ubuntu1) ...
Setting up libctf-nobfd0:arm64 (2.37-10ubuntu1) ...
Setting up python3-yaml (5.4.1-1) ...
Setting up libnftnl11:arm64 (1.2.1-1) ...
Setting up libgomp1:arm64 (11.2.0-12ubuntu1) ...
Setting up libasan6:arm64 (11.2.0-12ubuntu1) ...
Setting up libsasl2-modules-db:arm64 (2.1.27+dfsg2-2) ...
Setting up python3-software-properties (0.99.16) ...
Setting up libncurses6:arm64 (6.3-1) ...
Setting up libatomic1:arm64 (11.2.0-12ubuntu1) ...
Setting up libncursesw6:arm64 (6.3-1) ...
Setting up busybox-initramfs (1:1.30.1-7ubuntu1) ...
Setting up libsasl2-2:arm64 (2.1.27+dfsg2-2) ...
Setting up libubsan1:arm64 (11.2.0-12ubuntu1) ...
Setting up libmm-glib0:arm64 (1.18.2-0ubuntu1) ...
Setting up libhwasan0:arm64 (11.2.0-12ubuntu1) ...
Setting up libbluetooth3:arm64 (5.62-0ubuntu2) ...
Setting up keyboard-configuration (1.205ubuntu3) ...
Your console font configuration will be updated the next time your system
boots. If you want to update it now, run 'setupcon' from a virtual console.
update-initramfs: deferring update (trigger activated)
Setting up python3.9-minimal (3.9.9-1) ...
Setting up libbinutils:arm64 (2.37-10ubuntu1) ...
Setting up python3-lib2to3 (3.9.9-2) ...
Setting up libelf1:arm64 (0.186-1) ...
Setting up libcc1-0:arm64 (11.2.0-12ubuntu1) ...
Setting up liblsan0:arm64 (11.2.0-12ubuntu1) ...
Setting up libitm1:arm64 (11.2.0-12ubuntu1) ...
Setting up libpython3.9-stdlib:arm64 (3.9.9-1) ...
Setting up ethtool (1:5.15-1) ...
Setting up ncurses-term (6.3-1) ...
Setting up libtsan0:arm64 (11.2.0-12ubuntu1) ...
Setting up libctf0:arm64 (2.37-10ubuntu1) ...
Setting up python3-distutils (3.9.9-2) ...
Setting up libdw1:arm64 (0.186-1) ...
Setting up binutils-aarch64-linux-gnu (2.37-10ubuntu1) ...
Setting up binutils (2.37-10ubuntu1) ...
Setting up software-properties-common (0.99.16) ...
Setting up libpython3.9:arm64 (3.9.9-1) ...
Setting up libgcc-11-dev:arm64 (11.2.0-12ubuntu1) ...
Setting up gcc-11 (11.2.0-12ubuntu1) ...
Setting up console-setup-linux (1.205ubuntu3) ...
Setting up python3.9 (3.9.9-1) ...
Setting up console-setup (1.205ubuntu3) ...
update-initramfs: deferring update (trigger activated)
Setting up libstdc++-11-dev:arm64 (11.2.0-12ubuntu1) ...
Setting up g++-11 (11.2.0-12ubuntu1) ...
Processing triggers for man-db (2.9.4-2build1) ...
Processing triggers for dbus (1.12.20-2ubuntu2) ...
Processing triggers for libc-bin (2.34-0ubuntu3) ...
Processing triggers for initramfs-tools (0.140ubuntu8) ...
update-initramfs: Generating /boot/initrd.img-5.10.81-meson64
update-initramfs: Converting to u-boot format
odroidhc4:igorp:#</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4566_5" style=""><span class="pln">sudo apt install zfs-dkms zfsutils-linux</span></pre>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents ipsClearfix" data-gramm="false">
		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5761_5" style=""><span class="pln">odroidhc4:~:% sudo apt install zfs-dkms
[sudo] password for igorp: 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Suggested packages:
  debhelper
Recommended packages:
  zfs-zed zfsutils-linux
The following NEW packages will be installed:
  zfs-dkms
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,282 kB of archives.
After this operation, 17.8 MB of additional disk space will be used.
Get:1 http://apt.armbian.com jammy/jammy-utils arm64 zfs-dkms all 2.1.1-0york0~21.04 [2,282 kB]
Fetched 2,282 kB in 1s (1,847 kB/s)
Preconfiguring packages ...
Selecting previously unselected package zfs-dkms.
(Reading database ... 67248 files and directories currently installed.)
Preparing to unpack .../zfs-dkms_2.1.1-0york0~21.04_all.deb ...
Unpacking zfs-dkms (2.1.1-0york0~21.04) ...
Setting up zfs-dkms (2.1.1-0york0~21.04) ...
Loading new zfs-2.1.1 DKMS files...
Building for 5.10.81-meson64
Building initial module for 5.10.81-meson64
Done.

zavl.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

znvpair.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

zunicode.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

zcommon.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

zfs.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

icp.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

zlua.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

spl.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

zzstd.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.10.81-meson64/updates/dkms/

depmod......
Processing triggers for initramfs-tools (0.140ubuntu8) ...
update-initramfs: Generating /boot/initrd.img-5.10.81-meson64
update-initramfs: Converting to u-boot format

odroidhc4:~:% modinfo zfs
filename:       /lib/modules/5.10.81-meson64/updates/dkms/zfs.ko
version:        2.1.1-0york0~21.04
license:        CDDL
author:         OpenZFS
description:    ZFS
alias:          devname:zfs
alias:          char-major-10-249
srcversion:     01ED8BF0BDE5F9A75644B3B
depends:        spl,znvpair,icp,zlua,zzstd,zunicode,zcommon,zavl
name:           zfs
vermagic:       5.10.81-meson64 SMP preempt mod_unload aarch64
parm:           zvol_inhibit_dev:Do not create zvol device nodes (uint)
parm:           zvol_major:Major number for zvol device (uint)
parm:           zvol_threads:Max number of threads to handle I/O requests (uint)
parm:           zvol_request_sync:Synchronously handle bio requests (uint)
parm:           zvol_max_discard_blocks:Max number of blocks to discard (ulong)
parm:           zvol_prefetch_bytes:Prefetch N bytes at zvol start+end (uint)
parm:           zvol_volmode:Default volmode property value (uint)
parm:           zfs_fallocate_reserve_percent:Percentage of length to use for the available capacity check (uint)
parm:           zfs_key_max_salt_uses:Max number of times a salt value can be used for generating encryption keys before it is rotated (ulong)
parm:           zfs_object_mutex_size:Size of znode hold array (uint)
parm:           zfs_unlink_suspend_progress:Set to prevent async unlinks (debug - leaks space into the unlinked set) (int)
parm:           zfs_delete_blocks:Delete files larger than N blocks async (ulong)
parm:           zfs_dbgmsg_enable:Enable ZFS debug message log (int)
parm:           zfs_dbgmsg_maxsize:Maximum ZFS debug log size (int)
parm:           zfs_admin_snapshot:Enable mkdir/rmdir/mv in .zfs/snapshot (int)
parm:           zfs_expire_snapshot:Seconds to expire .zfs/snapshot (int)
parm:           vdev_file_logical_ashift:Logical ashift for file-based devices (ulong)
parm:           vdev_file_physical_ashift:Physical ashift for file-based devices (ulong)
parm:           zfs_vdev_scheduler:I/O scheduler
parm:           zfs_arc_shrinker_limit:Limit on number of pages that ARC shrinker can reclaim at once (int)
parm:           zfs_abd_scatter_enabled:Toggle whether ABD allocations must be linear. (int)
parm:           zfs_abd_scatter_min_size:Minimum size of scatter allocations. (int)
parm:           zfs_abd_scatter_max_order:Maximum order allocation used for a scatter ABD. (uint)
parm:           zio_slow_io_ms:Max I/O completion time (milliseconds) before marking it as slow (int)
parm:           zio_requeue_io_start_cut_in_line:Prioritize requeued I/O (int)
parm:           zfs_sync_pass_deferred_free:Defer frees starting in this pass (int)
parm:           zfs_sync_pass_dont_compress:Don't compress starting in this pass (int)
parm:           zfs_sync_pass_rewrite:Rewrite new bps starting in this pass (int)
parm:           zio_dva_throttle_enabled:Throttle block allocations in the ZIO pipeline (int)
parm:           zio_deadman_log_all:Log all slow ZIOs, not just those with vdevs (int)
parm:           zfs_commit_timeout_pct:ZIL block open timeout percentage (int)
parm:           zil_replay_disable:Disable intent logging replay (int)
parm:           zil_nocacheflush:Disable ZIL cache flushes (int)
parm:           zil_slog_bulk:Limit in bytes slog sync writes per commit (ulong)
parm:           zil_maxblocksize:Limit in bytes of ZIL log block size (int)
parm:           zfs_vnops_read_chunk_size:Bytes to read per chunk (ulong)
parm:           zfs_immediate_write_sz:Largest data block to write to zil (long)
parm:           zfs_max_nvlist_src_size:Maximum size in bytes allowed for src nvlist passed with ZFS ioctls (ulong)
parm:           zfs_history_output_max:Maximum size in bytes of ZFS ioctl output that will be logged (ulong)
parm:           zfs_zevent_retain_max:Maximum recent zevents records to retain for duplicate checking (uint)
parm:           zfs_zevent_retain_expire_secs:Expiration time for recent zevents records (uint)
parm:           zfs_lua_max_instrlimit:Max instruction limit that can be specified for a channel program (ulong)
parm:           zfs_lua_max_memlimit:Max memory limit that can be specified for a channel program (ulong)
parm:           zap_iterate_prefetch:When iterating ZAP object, prefetch it (int)
parm:           zfs_trim_extent_bytes_max:Max size of TRIM commands, larger will be split (uint)
parm:           zfs_trim_extent_bytes_min:Min size of TRIM commands, smaller will be skipped (uint)
parm:           zfs_trim_metaslab_skip:Skip metaslabs which have never been initialized (uint)
parm:           zfs_trim_txg_batch:Min number of txgs to aggregate frees before issuing TRIM (uint)
parm:           zfs_trim_queue_limit:Max queued TRIMs outstanding per leaf vdev (uint)
parm:           zfs_removal_ignore_errors:Ignore hard IO errors when removing device (int)
parm:           zfs_remove_max_segment:Largest contiguous segment to allocate when removing device (int)
parm:           vdev_removal_max_span:Largest span of free chunks a remap segment can span (int)
parm:           zfs_removal_suspend_progress:Pause device removal after this many bytes are copied (debug use only - causes removal to hang) (int)
parm:           zfs_rebuild_max_segment:Max segment size in bytes of rebuild reads (ulong)
parm:           zfs_rebuild_vdev_limit:Max bytes in flight per leaf vdev for sequential resilvers (ulong)
parm:           zfs_rebuild_scrub_enabled:Automatically scrub after sequential resilver completes (int)
parm:           zfs_vdev_raidz_impl:Select raidz implementation.
parm:           zfs_vdev_aggregation_limit:Max vdev I/O aggregation size (int)
parm:           zfs_vdev_aggregation_limit_non_rotating:Max vdev I/O aggregation size for non-rotating media (int)
parm:           zfs_vdev_aggregate_trim:Allow TRIM I/O to be aggregated (int)
parm:           zfs_vdev_read_gap_limit:Aggregate read I/O over gap (int)
parm:           zfs_vdev_write_gap_limit:Aggregate write I/O over gap (int)
parm:           zfs_vdev_max_active:Maximum number of active I/Os per vdev (int)
parm:           zfs_vdev_async_write_active_max_dirty_percent:Async write concurrency max threshold (int)
parm:           zfs_vdev_async_write_active_min_dirty_percent:Async write concurrency min threshold (int)
parm:           zfs_vdev_async_read_max_active:Max active async read I/Os per vdev (int)
parm:           zfs_vdev_async_read_min_active:Min active async read I/Os per vdev (int)
parm:           zfs_vdev_async_write_max_active:Max active async write I/Os per vdev (int)
parm:           zfs_vdev_async_write_min_active:Min active async write I/Os per vdev (int)
parm:           zfs_vdev_initializing_max_active:Max active initializing I/Os per vdev (int)
parm:           zfs_vdev_initializing_min_active:Min active initializing I/Os per vdev (int)
parm:           zfs_vdev_removal_max_active:Max active removal I/Os per vdev (int)
parm:           zfs_vdev_removal_min_active:Min active removal I/Os per vdev (int)
parm:           zfs_vdev_scrub_max_active:Max active scrub I/Os per vdev (int)
parm:           zfs_vdev_scrub_min_active:Min active scrub I/Os per vdev (int)
parm:           zfs_vdev_sync_read_max_active:Max active sync read I/Os per vdev (int)
parm:           zfs_vdev_sync_read_min_active:Min active sync read I/Os per vdev (int)
parm:           zfs_vdev_sync_write_max_active:Max active sync write I/Os per vdev (int)
parm:           zfs_vdev_sync_write_min_active:Min active sync write I/Os per vdev (int)
parm:           zfs_vdev_trim_max_active:Max active trim/discard I/Os per vdev (int)
parm:           zfs_vdev_trim_min_active:Min active trim/discard I/Os per vdev (int)
parm:           zfs_vdev_rebuild_max_active:Max active rebuild I/Os per vdev (int)
parm:           zfs_vdev_rebuild_min_active:Min active rebuild I/Os per vdev (int)
parm:           zfs_vdev_nia_credit:Number of non-interactive I/Os to allow in sequence (int)
parm:           zfs_vdev_nia_delay:Number of non-interactive I/Os before _max_active (int)
parm:           zfs_vdev_queue_depth_pct:Queue depth percentage for each top-level vdev (int)
parm:           zfs_vdev_mirror_rotating_inc:Rotating media load increment for non-seeking I/O's (int)
parm:           zfs_vdev_mirror_rotating_seek_inc:Rotating media load increment for seeking I/O's (int)
parm:           zfs_vdev_mirror_rotating_seek_offset:Offset in bytes from the last I/O which triggers a reduced rotating media seek increment (int)
parm:           zfs_vdev_mirror_non_rotating_inc:Non-rotating media load increment for non-seeking I/O's (int)
parm:           zfs_vdev_mirror_non_rotating_seek_inc:Non-rotating media load increment for seeking I/O's (int)
parm:           zfs_initialize_value:Value written during zpool initialize (ulong)
parm:           zfs_initialize_chunk_size:Size in bytes of writes by zpool initialize (ulong)
parm:           zfs_condense_indirect_vdevs_enable:Whether to attempt condensing indirect vdev mappings (int)
parm:           zfs_condense_indirect_obsolete_pct:Minimum obsolete percent of bytes in the mapping to attempt condensing (int)
parm:           zfs_condense_min_mapping_bytes:Don't bother condensing if the mapping uses less than this amount of memory (ulong)
parm:           zfs_condense_max_obsolete_bytes:Minimum size obsolete spacemap to attempt condensing (ulong)
parm:           zfs_condense_indirect_commit_entry_delay_ms:Used by tests to ensure certain actions happen in the middle of a condense. A maximum value of 1 should be sufficient. (int)
parm:           zfs_reconstruct_indirect_combinations_max:Maximum number of combinations when reconstructing split segments (int)
parm:           zfs_vdev_cache_max:Inflate reads small than max (int)
parm:           zfs_vdev_cache_size:Total size of the per-disk cache (int)
parm:           zfs_vdev_cache_bshift:Shift size to inflate reads too (int)
parm:           zfs_vdev_default_ms_count:Target number of metaslabs per top-level vdev (int)
parm:           zfs_vdev_default_ms_shift:Default limit for metaslab size (int)
parm:           zfs_vdev_min_ms_count:Minimum number of metaslabs per top-level vdev (int)
parm:           zfs_vdev_ms_count_limit:Practical upper limit of total metaslabs per top-level vdev (int)
parm:           zfs_slow_io_events_per_second:Rate limit slow IO (delay) events to this many per second (uint)
parm:           zfs_checksum_events_per_second:Rate limit checksum events to this many checksum errors per second (do not set below zed threshold). (uint)
parm:           zfs_scan_ignore_errors:Ignore errors during resilver/scrub (int)
parm:           vdev_validate_skip:Bypass vdev_validate() (int)
parm:           zfs_nocacheflush:Disable cache flushes (int)
parm:           zfs_embedded_slog_min_ms:Minimum number of metaslabs required to dedicate one for log blocks (int)
parm:           zfs_vdev_min_auto_ashift:Minimum ashift used when creating new top-level vdevs
parm:           zfs_vdev_max_auto_ashift:Maximum ashift used when optimizing for logical -&gt; physical sector size on new top-level vdevs
parm:           zfs_txg_timeout:Max seconds worth of delta per txg (int)
parm:           zfs_read_history:Historical statistics for the last N reads (int)
parm:           zfs_read_history_hits:Include cache hits in read history (int)
parm:           zfs_txg_history:Historical statistics for the last N txgs (int)
parm:           zfs_multihost_history:Historical statistics for last N multihost writes (int)
parm:           zfs_flags:Set additional debugging flags (uint)
parm:           zfs_recover:Set to attempt to recover from fatal errors (int)
parm:           zfs_free_leak_on_eio:Set to ignore IO errors during free and permanently leak the space (int)
parm:           zfs_deadman_checktime_ms:Dead I/O check interval in milliseconds (ulong)
parm:           zfs_deadman_enabled:Enable deadman timer (int)
parm:           spa_asize_inflation:SPA size estimate multiplication factor (int)
parm:           zfs_ddt_data_is_special:Place DDT data into the special class (int)
parm:           zfs_user_indirect_is_special:Place user data indirect blocks into the special class (int)
parm:           zfs_deadman_failmode:Failmode for deadman timer
parm:           zfs_deadman_synctime_ms:Pool sync expiration time in milliseconds
parm:           zfs_deadman_ziotime_ms:IO expiration time in milliseconds
parm:           zfs_special_class_metadata_reserve_pct:Small file blocks in special vdevs depends on this much free space available (int)
parm:           spa_slop_shift:Reserved free space in pool
parm:           zfs_unflushed_max_mem_amt:Specific hard-limit in memory that ZFS allows to be used for unflushed changes (ulong)
parm:           zfs_unflushed_max_mem_ppm:Percentage of the overall system memory that ZFS allows to be used for unflushed changes (value is calculated over 1000000 for finer granularity) (ulong)
parm:           zfs_unflushed_log_block_max:Hard limit (upper-bound) in the size of the space map log in terms of blocks. (ulong)
parm:           zfs_unflushed_log_block_min:Lower-bound limit for the maximum amount of blocks allowed in log spacemap (see zfs_unflushed_log_block_max) (ulong)
parm:           zfs_unflushed_log_block_pct:Tunable used to determine the number of blocks that can be used for the spacemap log, expressed as a percentage of the total number of metaslabs in the pool (e.g. 400 means the number of log blocks is capped at 4 times the number of metaslabs) (ulong)
parm:           zfs_max_log_walking:The number of past TXGs that the flushing algorithm of the log spacemap feature uses to estimate incoming log blocks (ulong)
parm:           zfs_max_logsm_summary_length:Maximum number of rows allowed in the summary of the spacemap log (ulong)
parm:           zfs_min_metaslabs_to_flush:Minimum number of metaslabs to flush per dirty TXG (ulong)
parm:           zfs_keep_log_spacemaps_at_export:Prevent the log spacemaps from being flushed and destroyed during pool export/destroy (int)
parm:           spa_config_path:SPA config file (/etc/zfs/zpool.cache) (charp)
parm:           zfs_autoimport_disable:Disable pool import at module load (int)
parm:           zfs_spa_discard_memory_limit:Limit for memory used in prefetching the checkpoint space map done on each vdev while discarding the checkpoint (ulong)
parm:           spa_load_verify_shift:log2 fraction of arc that can be used by inflight I/Os when verifying pool during import (int)
parm:           spa_load_verify_metadata:Set to traverse metadata on pool import (int)
parm:           spa_load_verify_data:Set to traverse data on pool import (int)
parm:           spa_load_print_vdev_tree:Print vdev tree to zfs_dbgmsg during pool import (int)
parm:           zio_taskq_batch_pct:Percentage of CPUs to run an IO worker thread (uint)
parm:           zio_taskq_batch_tpq:Number of threads per IO worker taskqueue (uint)
parm:           zfs_max_missing_tvds:Allow importing pool with up to this number of missing top-level vdevs (in read-only mode) (ulong)
parm:           zfs_livelist_condense_zthr_pause:Set the livelist condense zthr to pause (int)
parm:           zfs_livelist_condense_sync_pause:Set the livelist condense synctask to pause (int)
parm:           zfs_livelist_condense_sync_cancel:Whether livelist condensing was canceled in the synctask (int)
parm:           zfs_livelist_condense_zthr_cancel:Whether livelist condensing was canceled in the zthr function (int)
parm:           zfs_livelist_condense_new_alloc:Whether extra ALLOC blkptrs were added to a livelist entry while it was being condensed (int)
parm:           zfs_multilist_num_sublists:Number of sublists used in each multilist (int)
parm:           zfs_multihost_interval:Milliseconds between mmp writes to each leaf
parm:           zfs_multihost_fail_intervals:Max allowed period without a successful mmp write (uint)
parm:           zfs_multihost_import_intervals:Number of zfs_multihost_interval periods to wait for activity (uint)
parm:           metaslab_aliquot:Allocation granularity (a.k.a. stripe size) (ulong)
parm:           metaslab_debug_load:Load all metaslabs when pool is first opened (int)
parm:           metaslab_debug_unload:Prevent metaslabs from being unloaded (int)
parm:           metaslab_preload_enabled:Preload potential metaslabs during reassessment (int)
parm:           metaslab_unload_delay:Delay in txgs after metaslab was last used before unloading (int)
parm:           metaslab_unload_delay_ms:Delay in milliseconds after metaslab was last used before unloading (int)
parm:           zfs_mg_noalloc_threshold:Percentage of metaslab group size that should be free to make it eligible for allocation (int)
parm:           zfs_mg_fragmentation_threshold:Percentage of metaslab group size that should be considered eligible for allocations unless all metaslab groups within the metaslab class have also crossed this threshold (int)
parm:           zfs_metaslab_fragmentation_threshold:Fragmentation for metaslab to allow allocation (int)
parm:           metaslab_fragmentation_factor_enabled:Use the fragmentation metric to prefer less fragmented metaslabs (int)
parm:           metaslab_lba_weighting_enabled:Prefer metaslabs with lower LBAs (int)
parm:           metaslab_bias_enabled:Enable metaslab group biasing (int)
parm:           zfs_metaslab_segment_weight_enabled:Enable segment-based metaslab selection (int)
parm:           zfs_metaslab_switch_threshold:Segment-based metaslab selection maximum buckets before switching (int)
parm:           metaslab_force_ganging:Blocks larger than this size are forced to be gang blocks (ulong)
parm:           metaslab_df_max_search:Max distance (bytes) to search forward before using size tree (int)
parm:           metaslab_df_use_largest_segment:When looking in size tree, use largest segment instead of exact fit (int)
parm:           zfs_metaslab_max_size_cache_sec:How long to trust the cached max chunk size of a metaslab (ulong)
parm:           zfs_metaslab_mem_limit:Percentage of memory that can be used to store metaslab range trees (int)
parm:           zfs_metaslab_try_hard_before_gang:Try hard to allocate before ganging (int)
parm:           zfs_metaslab_find_max_tries:Normally only consider this many of the best metaslabs in each vdev (int)
parm:           zfs_zevent_len_max:Max event queue length (int)
parm:           zfs_scan_vdev_limit:Max bytes in flight per leaf vdev for scrubs and resilvers (ulong)
parm:           zfs_scrub_min_time_ms:Min millisecs to scrub per txg (int)
parm:           zfs_obsolete_min_time_ms:Min millisecs to obsolete per txg (int)
parm:           zfs_free_min_time_ms:Min millisecs to free per txg (int)
parm:           zfs_resilver_min_time_ms:Min millisecs to resilver per txg (int)
parm:           zfs_scan_suspend_progress:Set to prevent scans from progressing (int)
parm:           zfs_no_scrub_io:Set to disable scrub I/O (int)
parm:           zfs_no_scrub_prefetch:Set to disable scrub prefetching (int)
parm:           zfs_async_block_max_blocks:Max number of blocks freed in one txg (ulong)
parm:           zfs_max_async_dedup_frees:Max number of dedup blocks freed in one txg (ulong)
parm:           zfs_free_bpobj_enabled:Enable processing of the free_bpobj (int)
parm:           zfs_scan_mem_lim_fact:Fraction of RAM for scan hard limit (int)
parm:           zfs_scan_issue_strategy:IO issuing strategy during scrubbing. 0 = default, 1 = LBA, 2 = size (int)
parm:           zfs_scan_legacy:Scrub using legacy non-sequential method (int)
parm:           zfs_scan_checkpoint_intval:Scan progress on-disk checkpointing interval (int)
parm:           zfs_scan_max_ext_gap:Max gap in bytes between sequential scrub / resilver I/Os (ulong)
parm:           zfs_scan_mem_lim_soft_fact:Fraction of hard limit used as soft limit (int)
parm:           zfs_scan_strict_mem_lim:Tunable to attempt to reduce lock contention (int)
parm:           zfs_scan_fill_weight:Tunable to adjust bias towards more filled segments during scans (int)
parm:           zfs_resilver_disable_defer:Process all resilvers immediately (int)
parm:           zfs_dirty_data_max_percent:Max percent of RAM allowed to be dirty (int)
parm:           zfs_dirty_data_max_max_percent:zfs_dirty_data_max upper bound as % of RAM (int)
parm:           zfs_delay_min_dirty_percent:Transaction delay threshold (int)
parm:           zfs_dirty_data_max:Determines the dirty space limit (ulong)
parm:           zfs_dirty_data_max_max:zfs_dirty_data_max upper bound in bytes (ulong)
parm:           zfs_dirty_data_sync_percent:Dirty data txg sync threshold as a percentage of zfs_dirty_data_max (int)
parm:           zfs_delay_scale:How quickly delay approaches infinity (ulong)
parm:           zfs_sync_taskq_batch_pct:Max percent of CPUs that are used to sync dirty data (int)
parm:           zfs_zil_clean_taskq_nthr_pct:Max percent of CPUs that are used per dp_sync_taskq (int)
parm:           zfs_zil_clean_taskq_minalloc:Number of taskq entries that are pre-populated (int)
parm:           zfs_zil_clean_taskq_maxalloc:Max number of taskq entries that are cached (int)
parm:           zfs_livelist_max_entries:Size to start the next sub-livelist in a livelist (ulong)
parm:           zfs_livelist_min_percent_shared:Threshold at which livelist is disabled (int)
parm:           zfs_max_recordsize:Max allowed record size (int)
parm:           zfs_allow_redacted_dataset_mount:Allow mounting of redacted datasets (int)
parm:           zfs_disable_ivset_guid_check:Set to allow raw receives without IVset guids (int)
parm:           zfs_prefetch_disable:Disable all ZFS prefetching (int)
parm:           zfetch_max_streams:Max number of streams per zfetch (uint)
parm:           zfetch_min_sec_reap:Min time before stream reclaim (uint)
parm:           zfetch_max_distance:Max bytes to prefetch per stream (uint)
parm:           zfetch_max_idistance:Max bytes to prefetch indirects for per stream (uint)
parm:           zfetch_array_rd_sz:Number of bytes in a array_read (ulong)
parm:           zfs_pd_bytes_max:Max number of bytes to prefetch (int)
parm:           zfs_traverse_indirect_prefetch_limit:Traverse prefetch number of blocks pointed by indirect block (int)
parm:           ignore_hole_birth:Alias for send_holes_without_birth_time (int)
parm:           send_holes_without_birth_time:Ignore hole_birth txg for zfs send (int)
parm:           zfs_send_corrupt_data:Allow sending corrupt data (int)
parm:           zfs_send_queue_length:Maximum send queue length (int)
parm:           zfs_send_unmodified_spill_blocks:Send unmodified spill blocks (int)
parm:           zfs_send_no_prefetch_queue_length:Maximum send queue length for non-prefetch queues (int)
parm:           zfs_send_queue_ff:Send queue fill fraction (int)
parm:           zfs_send_no_prefetch_queue_ff:Send queue fill fraction for non-prefetch queues (int)
parm:           zfs_override_estimate_recordsize:Override block size estimate with fixed size (int)
parm:           zfs_recv_queue_length:Maximum receive queue length (int)
parm:           zfs_recv_queue_ff:Receive queue fill fraction (int)
parm:           zfs_recv_write_batch_size:Maximum amount of writes to batch into one transaction (int)
parm:           dmu_object_alloc_chunk_shift:CPU-specific allocator grabs 2^N objects at once (int)
parm:           zfs_nopwrite_enabled:Enable NOP writes (int)
parm:           zfs_per_txg_dirty_frees_percent:Percentage of dirtied blocks from frees in one TXG (ulong)
parm:           zfs_dmu_offset_next_sync:Enable forcing txg sync to find holes (int)
parm:           dmu_prefetch_max:Limit one prefetch call to this size (int)
parm:           zfs_dedup_prefetch:Enable prefetching dedup-ed blks (int)
parm:           zfs_dbuf_state_index:Calculate arc header index (int)
parm:           dbuf_cache_max_bytes:Maximum size in bytes of the dbuf cache. (ulong)
parm:           dbuf_cache_hiwater_pct:Percentage over dbuf_cache_max_bytes when dbufs must be evicted directly. (uint)
parm:           dbuf_cache_lowater_pct:Percentage below dbuf_cache_max_bytes when the evict thread stops evicting dbufs. (uint)
parm:           dbuf_metadata_cache_max_bytes:Maximum size in bytes of the dbuf metadata cache. (ulong)
parm:           dbuf_cache_shift:Set the size of the dbuf cache to a log2 fraction of arc size. (int)
parm:           dbuf_metadata_cache_shift:Set the size of the dbuf metadata cache to a log2 fraction of arc size. (int)
parm:           zfs_arc_min:Min arc size
parm:           zfs_arc_max:Max arc size
parm:           zfs_arc_meta_limit:Metadata limit for arc size
parm:           zfs_arc_meta_limit_percent:Percent of arc size for arc meta limit
parm:           zfs_arc_meta_min:Min arc metadata
parm:           zfs_arc_meta_prune:Meta objects to scan for prune (int)
parm:           zfs_arc_meta_adjust_restarts:Limit number of restarts in arc_evict_meta (int)
parm:           zfs_arc_meta_strategy:Meta reclaim strategy (int)
parm:           zfs_arc_grow_retry:Seconds before growing arc size
parm:           zfs_arc_p_dampener_disable:Disable arc_p adapt dampener (int)
parm:           zfs_arc_shrink_shift:log2(fraction of arc to reclaim)
parm:           zfs_arc_pc_percent:Percent of pagecache to reclaim arc to (uint)
parm:           zfs_arc_p_min_shift:arc_c shift to calc min/max arc_p
parm:           zfs_arc_average_blocksize:Target average block size (int)
parm:           zfs_compressed_arc_enabled:Disable compressed arc buffers (int)
parm:           zfs_arc_min_prefetch_ms:Min life of prefetch block in ms
parm:           zfs_arc_min_prescient_prefetch_ms:Min life of prescient prefetched block in ms
parm:           l2arc_write_max:Max write bytes per interval (ulong)
parm:           l2arc_write_boost:Extra write bytes during device warmup (ulong)
parm:           l2arc_headroom:Number of max device writes to precache (ulong)
parm:           l2arc_headroom_boost:Compressed l2arc_headroom multiplier (ulong)
parm:           l2arc_trim_ahead:TRIM ahead L2ARC write size multiplier (ulong)
parm:           l2arc_feed_secs:Seconds between L2ARC writing (ulong)
parm:           l2arc_feed_min_ms:Min feed interval in milliseconds (ulong)
parm:           l2arc_noprefetch:Skip caching prefetched buffers (int)
parm:           l2arc_feed_again:Turbo L2ARC warmup (int)
parm:           l2arc_norw:No reads during writes (int)
parm:           l2arc_meta_percent:Percent of ARC size allowed for L2ARC-only headers (int)
parm:           l2arc_rebuild_enabled:Rebuild the L2ARC when importing a pool (int)
parm:           l2arc_rebuild_blocks_min_l2size:Min size in bytes to write rebuild log blocks in L2ARC (ulong)
parm:           l2arc_mfuonly:Cache only MFU data from ARC into L2ARC (int)
parm:           zfs_arc_lotsfree_percent:System free memory I/O throttle in bytes
parm:           zfs_arc_sys_free:System free memory target size in bytes
parm:           zfs_arc_dnode_limit:Minimum bytes of dnodes in arc
parm:           zfs_arc_dnode_limit_percent:Percent of ARC meta buffers for dnodes
parm:           zfs_arc_dnode_reduce_percent:Percentage of excess dnodes to try to unpin (ulong)
parm:           zfs_arc_eviction_pct:When full, ARC allocation waits for eviction of this % of alloc size (int)
parm:           zfs_arc_evict_batch_limit:The number of headers to evict per sublist before moving to the next (int)





odroidhc4:igorp:# apt install zfsutils-linux
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libnvpair3linux libuutil3linux libzfs4linux libzpool5linux
Suggested packages:
  nfs-kernel-server samba-common-bin zfs-initramfs | zfs-dracut
Recommended packages:
  zfs-zed
The following NEW packages will be installed:
  libnvpair3linux libuutil3linux libzfs4linux libzpool5linux zfsutils-linux
0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,931 kB of archives.
After this operation, 6,091 kB of additional disk space will be used.
Do you want to continue? [Y/n] 
Get:1 http://apt.armbian.com jammy/jammy-utils arm64 libnvpair3linux arm64 2.1.1-0york0~21.04 [60.3 kB]
Get:2 http://apt.armbian.com jammy/jammy-utils arm64 libuutil3linux arm64 2.1.1-0york0~21.04 [55.4 kB]
Get:3 http://apt.armbian.com jammy/jammy-utils arm64 libzfs4linux arm64 2.1.1-0york0~21.04 [218 kB]                      
Get:4 http://apt.armbian.com jammy/jammy-utils arm64 libzpool5linux arm64 2.1.1-0york0~21.04 [1,110 kB]
Get:5 http://apt.armbian.com jammy/jammy-utils arm64 zfsutils-linux arm64 2.1.1-0york0~21.04 [486 kB]
Fetched 1,931 kB in 1s (1,391 kB/s)                         
Selecting previously unselected package libnvpair3linux.
(Reading database ... 69123 files and directories currently installed.)
Preparing to unpack .../libnvpair3linux_2.1.1-0york0~21.04_arm64.deb ...
Unpacking libnvpair3linux (2.1.1-0york0~21.04) ...
Selecting previously unselected package libuutil3linux.
Preparing to unpack .../libuutil3linux_2.1.1-0york0~21.04_arm64.deb ...
Unpacking libuutil3linux (2.1.1-0york0~21.04) ...
Selecting previously unselected package libzfs4linux.
Preparing to unpack .../libzfs4linux_2.1.1-0york0~21.04_arm64.deb ...
Unpacking libzfs4linux (2.1.1-0york0~21.04) ...
Selecting previously unselected package libzpool5linux.
Preparing to unpack .../libzpool5linux_2.1.1-0york0~21.04_arm64.deb ...
Unpacking libzpool5linux (2.1.1-0york0~21.04) ...
Selecting previously unselected package zfsutils-linux.
Preparing to unpack .../zfsutils-linux_2.1.1-0york0~21.04_arm64.deb ...
Unpacking zfsutils-linux (2.1.1-0york0~21.04) ...
Setting up libnvpair3linux (2.1.1-0york0~21.04) ...
Setting up libuutil3linux (2.1.1-0york0~21.04) ...
Setting up libzfs4linux (2.1.1-0york0~21.04) ...
Setting up libzpool5linux (2.1.1-0york0~21.04) ...
Setting up zfsutils-linux (2.1.1-0york0~21.04) ...
insmod /lib/modules/5.10.81-meson64/updates/dkms/spl.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/icp.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/zavl.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/znvpair.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/zcommon.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/zlua.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/zzstd.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/zunicode.ko 
insmod /lib/modules/5.10.81-meson64/updates/dkms/zfs.ko 
Created symlink /etc/systemd/system/zfs-import.target.wants/zfs-import-cache.service → /lib/systemd/system/zfs-import-cache.service.
Created symlink /etc/systemd/system/zfs.target.wants/zfs-import.target → /lib/systemd/system/zfs-import.target.
Created symlink /etc/systemd/system/zfs-mount.service.wants/zfs-load-module.service → /lib/systemd/system/zfs-load-module.service.
Created symlink /etc/systemd/system/zfs.target.wants/zfs-load-module.service → /lib/systemd/system/zfs-load-module.service.
Created symlink /etc/systemd/system/zfs.target.wants/zfs-mount.service → /lib/systemd/system/zfs-mount.service.
Created symlink /etc/systemd/system/zfs.target.wants/zfs-share.service → /lib/systemd/system/zfs-share.service.
Created symlink /etc/systemd/system/zfs-volumes.target.wants/zfs-volume-wait.service → /lib/systemd/system/zfs-volume-wait.service.
Created symlink /etc/systemd/system/zfs.target.wants/zfs-volumes.target → /lib/systemd/system/zfs-volumes.target.
Created symlink /etc/systemd/system/multi-user.target.wants/zfs.target → /lib/systemd/system/zfs.target.
zfs-import-scan.service is a disabled or a static unit, not starting it.
zfs-import-scan.service is a disabled or a static unit, not starting it.
Processing triggers for man-db (2.9.4-2build1) ...
Processing triggers for libc-bin (2.34-0ubuntu3) ...</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	 
</p>

<p>
	Checking for ZFS pool status after drive pool import:<br>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents ipsClearfix" data-gramm="false">
		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5970_5" style=""><span class="pln">odroidhc4:~:% zpool status           
  pool: pool
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	pool        ONLINE       0     0     0
	  sda1      ONLINE       0     0     0
	  sda2      ONLINE       0     0     0
	  sda3      ONLINE       0     0     0

errors: No known data errors

odroidhc4:~:% df
Filesystem     1K-blocks    Used Available Use% Mounted on
tmpfs             390776    5908    384868   2% /run
/dev/mmcblk0p1  30371612 1616872  28407488   6% /
tmpfs            1953872       0   1953872   0% /dev/shm
tmpfs               5120       4      5116   1% /run/lock
tmpfs            1953872       0   1953872   0% /tmp
/dev/zram1         47960    2056     42320   5% /var/log
tmpfs             390772       0    390772   0% /run/user/1000
pool            27934208  524416  27409792   2% /pool</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br>
	Enable LCD:
</p>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents ipsClearfix" data-gramm="false">
		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9256_5" style=""><span class="pln">odroidhc4:~:% git clone https://github.com/rpardini/sys-oled-hc4.git
Cloning into 'sys-oled-hc4'...
remote: Enumerating objects: 99, done.
remote: Counting objects: 100% (2/2), done.
remote: Total 99 (delta 1), reused 1 (delta 1), pack-reused 97
Receiving objects: 100% (99/99), 54.83 KiB | 1.61 MiB/s, done.
Resolving deltas: 100% (33/33), done.
odroidhc4:~:% cd sys-oled-hc4
odroidhc4:sys-oled-hc4:% sudo ./install.sh                                                                                 </span><span class="tag">&lt;master&gt;</span><span class="pln">
Installing Dependencies
Hit:1 http://ports.ubuntu.com jammy InRelease
Hit:2 http://ports.ubuntu.com jammy-security InRelease
Hit:3 http://ports.ubuntu.com jammy-updates InRelease
Hit:4 http://ports.ubuntu.com jammy-backports InRelease
Hit:5 http://armbian.16z.eu/apt jammy InRelease   
Reading package lists... Done
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
build-essential is already the newest version (12.9ubuntu2).
The following additional packages will be installed:
  libbrotli-dev libexpat1-dev libfreetype-dev libfreetype6 libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev libjs-jquery
  libjs-sphinxdoc libjs-underscore libpng-dev libpython3-dev libpython3.9-dev python-pip-whl python3.9-dev zlib1g-dev
Suggested packages:
  freetype2-doc python-psutil-doc python-setuptools-doc
Recommended packages:
  javascript-common libpng-tools
The following NEW packages will be installed:
  libbrotli-dev libexpat1-dev libfreetype-dev libfreetype6 libfreetype6-dev libjpeg-dev libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8
  libjpeg8-dev libjs-jquery libjs-sphinxdoc libjs-underscore libpng-dev libpython3-dev libpython3.9-dev python-pip-whl python3-dev
  python3-pip python3-psutil python3-setuptools python3-wheel python3.9-dev zlib1g-dev
0 upgraded, 24 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.7 MB of archives.
After this operation, 34.7 MB of additional disk space will be used.
Get:1 http://ports.ubuntu.com jammy/main arm64 libbrotli-dev arm64 1.0.9-2build4 [336 kB]
Get:2 http://ports.ubuntu.com jammy/main arm64 libexpat1-dev arm64 2.4.1-3 [131 kB]
Get:3 http://ports.ubuntu.com jammy/main arm64 libfreetype6 arm64 2.11.0+dfsg-1 [382 kB]
Get:4 http://ports.ubuntu.com jammy/main arm64 zlib1g-dev arm64 1:1.2.11.dfsg-2ubuntu7 [163 kB]
Get:5 http://ports.ubuntu.com jammy/main arm64 libpng-dev arm64 1.6.37-3build4 [194 kB]
Get:6 http://ports.ubuntu.com jammy/main arm64 libfreetype-dev arm64 2.11.0+dfsg-1 [555 kB]
Get:7 http://ports.ubuntu.com jammy/main arm64 libfreetype6-dev arm64 2.11.0+dfsg-1 [8,340 B]
Get:8 http://ports.ubuntu.com jammy/main arm64 libjpeg-turbo8 arm64 2.1.1-0ubuntu1 [129 kB]
Get:9 http://ports.ubuntu.com jammy/main arm64 libjpeg-turbo8-dev arm64 2.1.1-0ubuntu1 [246 kB]
Get:10 http://ports.ubuntu.com jammy/main arm64 libjpeg8 arm64 8c-2ubuntu8 [2,198 B]
Get:11 http://ports.ubuntu.com jammy/main arm64 libjpeg8-dev arm64 8c-2ubuntu8 [1,550 B]
Get:12 http://ports.ubuntu.com jammy/main arm64 libjpeg-dev arm64 8c-2ubuntu8 [1,546 B]
Get:13 http://ports.ubuntu.com jammy/main arm64 libjs-jquery all 3.5.1+dfsg+~3.5.5-7 [314 kB]
Get:14 http://ports.ubuntu.com jammy/main arm64 libjs-underscore all 1.9.1~dfsg-4 [103 kB]
Get:15 http://ports.ubuntu.com jammy/main arm64 libjs-sphinxdoc all 4.2.0-5 [137 kB]
Get:16 http://ports.ubuntu.com jammy/main arm64 libpython3.9-dev arm64 3.9.9-1 [4,798 kB]
Get:17 http://ports.ubuntu.com jammy/main arm64 libpython3-dev arm64 3.9.4-1build1 [7,402 B]
Get:18 http://ports.ubuntu.com jammy/universe arm64 python-pip-whl all 20.3.4-4 [1,897 kB]
Get:19 http://ports.ubuntu.com jammy/main arm64 python3.9-dev arm64 3.9.9-1 [508 kB]
Get:20 http://ports.ubuntu.com jammy/main arm64 python3-dev arm64 3.9.4-1build1 [25.5 kB]
Get:21 http://ports.ubuntu.com jammy/main arm64 python3-setuptools all 58.2.0-1 [336 kB]
Get:22 http://ports.ubuntu.com jammy/universe arm64 python3-wheel all 0.34.2-1 [23.8 kB]
Get:23 http://ports.ubuntu.com jammy/universe arm64 python3-pip all 20.3.4-4 [283 kB]
Get:24 http://ports.ubuntu.com jammy/main arm64 python3-psutil arm64 5.8.0-2 [157 kB]
Fetched 10.7 MB in 2s (6,051 kB/s)        
Selecting previously unselected package libbrotli-dev:arm64.
(Reading database ... 68180 files and directories currently installed.)
Preparing to unpack .../00-libbrotli-dev_1.0.9-2build4_arm64.deb ...
Unpacking libbrotli-dev:arm64 (1.0.9-2build4) ...
Selecting previously unselected package libexpat1-dev:arm64.
Preparing to unpack .../01-libexpat1-dev_2.4.1-3_arm64.deb ...
Unpacking libexpat1-dev:arm64 (2.4.1-3) ...
Selecting previously unselected package libfreetype6:arm64.
Preparing to unpack .../02-libfreetype6_2.11.0+dfsg-1_arm64.deb ...
Unpacking libfreetype6:arm64 (2.11.0+dfsg-1) ...
Selecting previously unselected package zlib1g-dev:arm64.
Preparing to unpack .../03-zlib1g-dev_1%3a1.2.11.dfsg-2ubuntu7_arm64.deb ...
Unpacking zlib1g-dev:arm64 (1:1.2.11.dfsg-2ubuntu7) ...
Selecting previously unselected package libpng-dev:arm64.
Preparing to unpack .../04-libpng-dev_1.6.37-3build4_arm64.deb ...
Unpacking libpng-dev:arm64 (1.6.37-3build4) ...
Selecting previously unselected package libfreetype-dev:arm64.
Preparing to unpack .../05-libfreetype-dev_2.11.0+dfsg-1_arm64.deb ...
Unpacking libfreetype-dev:arm64 (2.11.0+dfsg-1) ...
Selecting previously unselected package libfreetype6-dev:arm64.
Preparing to unpack .../06-libfreetype6-dev_2.11.0+dfsg-1_arm64.deb ...
Unpacking libfreetype6-dev:arm64 (2.11.0+dfsg-1) ...
Selecting previously unselected package libjpeg-turbo8:arm64.
Preparing to unpack .../07-libjpeg-turbo8_2.1.1-0ubuntu1_arm64.deb ...
Unpacking libjpeg-turbo8:arm64 (2.1.1-0ubuntu1) ...
Selecting previously unselected package libjpeg-turbo8-dev:arm64.
Preparing to unpack .../08-libjpeg-turbo8-dev_2.1.1-0ubuntu1_arm64.deb ...
Unpacking libjpeg-turbo8-dev:arm64 (2.1.1-0ubuntu1) ...
Selecting previously unselected package libjpeg8:arm64.
Preparing to unpack .../09-libjpeg8_8c-2ubuntu8_arm64.deb ...
Unpacking libjpeg8:arm64 (8c-2ubuntu8) ...
Selecting previously unselected package libjpeg8-dev:arm64.
Preparing to unpack .../10-libjpeg8-dev_8c-2ubuntu8_arm64.deb ...
Unpacking libjpeg8-dev:arm64 (8c-2ubuntu8) ...
Selecting previously unselected package libjpeg-dev:arm64.
Preparing to unpack .../11-libjpeg-dev_8c-2ubuntu8_arm64.deb ...
Unpacking libjpeg-dev:arm64 (8c-2ubuntu8) ...
Selecting previously unselected package libjs-jquery.
Preparing to unpack .../12-libjs-jquery_3.5.1+dfsg+~3.5.5-7_all.deb ...
Unpacking libjs-jquery (3.5.1+dfsg+~3.5.5-7) ...
Selecting previously unselected package libjs-underscore.
Preparing to unpack .../13-libjs-underscore_1.9.1~dfsg-4_all.deb ...
Unpacking libjs-underscore (1.9.1~dfsg-4) ...
Selecting previously unselected package libjs-sphinxdoc.
Preparing to unpack .../14-libjs-sphinxdoc_4.2.0-5_all.deb ...
Unpacking libjs-sphinxdoc (4.2.0-5) ...
Selecting previously unselected package libpython3.9-dev:arm64.
Preparing to unpack .../15-libpython3.9-dev_3.9.9-1_arm64.deb ...
Unpacking libpython3.9-dev:arm64 (3.9.9-1) ...
Selecting previously unselected package libpython3-dev:arm64.
Preparing to unpack .../16-libpython3-dev_3.9.4-1build1_arm64.deb ...
Unpacking libpython3-dev:arm64 (3.9.4-1build1) ...
Selecting previously unselected package python-pip-whl.
Preparing to unpack .../17-python-pip-whl_20.3.4-4_all.deb ...
Unpacking python-pip-whl (20.3.4-4) ...
Selecting previously unselected package python3.9-dev.
Preparing to unpack .../18-python3.9-dev_3.9.9-1_arm64.deb ...
Unpacking python3.9-dev (3.9.9-1) ...
Selecting previously unselected package python3-dev.
Preparing to unpack .../19-python3-dev_3.9.4-1build1_arm64.deb ...
Unpacking python3-dev (3.9.4-1build1) ...
Selecting previously unselected package python3-setuptools.
Preparing to unpack .../20-python3-setuptools_58.2.0-1_all.deb ...
Unpacking python3-setuptools (58.2.0-1) ...
Selecting previously unselected package python3-wheel.
Preparing to unpack .../21-python3-wheel_0.34.2-1_all.deb ...
Unpacking python3-wheel (0.34.2-1) ...
Selecting previously unselected package python3-pip.
Preparing to unpack .../22-python3-pip_20.3.4-4_all.deb ...
Unpacking python3-pip (20.3.4-4) ...
Selecting previously unselected package python3-psutil.
Preparing to unpack .../23-python3-psutil_5.8.0-2_arm64.deb ...
Unpacking python3-psutil (5.8.0-2) ...
Setting up python3-setuptools (58.2.0-1) ...
Setting up python3-wheel (0.34.2-1) ...
Setting up python3-psutil (5.8.0-2) ...
Setting up libexpat1-dev:arm64 (2.4.1-3) ...
Setting up libfreetype6:arm64 (2.11.0+dfsg-1) ...
Setting up libjpeg-turbo8:arm64 (2.1.1-0ubuntu1) ...
Setting up zlib1g-dev:arm64 (1:1.2.11.dfsg-2ubuntu7) ...
Setting up python-pip-whl (20.3.4-4) ...
Setting up libjs-jquery (3.5.1+dfsg+~3.5.5-7) ...
Setting up libbrotli-dev:arm64 (1.0.9-2build4) ...
Setting up libjs-underscore (1.9.1~dfsg-4) ...
Setting up libjpeg8:arm64 (8c-2ubuntu8) ...
Setting up libjpeg-turbo8-dev:arm64 (2.1.1-0ubuntu1) ...
Setting up libpng-dev:arm64 (1.6.37-3build4) ...
Setting up libpython3.9-dev:arm64 (3.9.9-1) ...
Setting up libfreetype-dev:arm64 (2.11.0+dfsg-1) ...
Setting up python3-pip (20.3.4-4) ...
Setting up libjs-sphinxdoc (4.2.0-5) ...
Setting up python3.9-dev (3.9.9-1) ...
Setting up libjpeg8-dev:arm64 (8c-2ubuntu8) ...
Setting up libpython3-dev:arm64 (3.9.4-1build1) ...
Setting up libjpeg-dev:arm64 (8c-2ubuntu8) ...
Setting up libfreetype6-dev:arm64 (2.11.0+dfsg-1) ...
Setting up python3-dev (3.9.4-1build1) ...
Processing triggers for man-db (2.9.4-2build1) ...
Processing triggers for libc-bin (2.34-0ubuntu3) ...
Installing GPIO library dependency in pip...
Collecting RPi.GPIO==0.7.1a4
  Downloading RPi.GPIO-0.7.1a4.tar.gz (29 kB)
Building wheels for collected packages: RPi.GPIO
  Building wheel for RPi.GPIO (setup.py) ... done
  Created wheel for RPi.GPIO: filename=RPi.GPIO-0.7.1a4-cp39-cp39-linux_aarch64.whl size=71613 sha256=53dfde6f104ca9f3546d35832487870d397234ea8122f28d67bfb595e1aa40e4
  Stored in directory: /root/.cache/pip/wheels/6f/1c/5c/113894ea5785c8856518ad0d88803c2ec7cbc6cb88e47f2e04
Successfully built RPi.GPIO
Installing collected packages: RPi.GPIO
Successfully installed RPi.GPIO-0.7.1a4
Installing luma.oled library
Collecting luma.oled
  Downloading luma.oled-3.8.1-py2.py3-none-any.whl (32 kB)
Collecting luma.core&gt;=2.0.0
  Downloading luma.core-2.3.1-py2.py3-none-any.whl (71 kB)
     |████████████████████████████████| 71 kB 3.6 MB/s 
Collecting pillow&gt;=4.0.0
  Downloading Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.0 MB)
     |████████████████████████████████| 3.0 MB 16.0 MB/s 
Collecting deprecated
  Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)
Collecting spidev
  Downloading spidev-3.5.tar.gz (10 kB)
Collecting cbor2
  Downloading cbor2-5.4.2.tar.gz (85 kB)
     |████████████████████████████████| 85 kB 2.4 MB/s 
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... done
Requirement already satisfied: RPI.GPIO in /usr/local/lib/python3.9/dist-packages (from luma.core&gt;=2.0.0-&gt;luma.oled) (0.7.1a4)
Collecting pyftdi
  Downloading pyftdi-0.53.3-py3-none-any.whl (141 kB)
     |████████████████████████████████| 141 kB 15.4 MB/s 
Collecting smbus2
  Downloading smbus2-0.4.1-py2.py3-none-any.whl (11 kB)
Collecting wrapt&lt;2,&gt;=1.10
  Downloading wrapt-1.13.3.tar.gz (48 kB)
     |████████████████████████████████| 48 kB 2.6 MB/s 
Collecting pyusb!=1.2.0,&gt;=1.0.0
  Downloading pyusb-1.2.1-py3-none-any.whl (58 kB)
     |████████████████████████████████| 58 kB 2.9 MB/s 
Collecting pyserial&gt;=3.0
  Downloading pyserial-3.5-py2.py3-none-any.whl (90 kB)
     |████████████████████████████████| 90 kB 4.7 MB/s 
Building wheels for collected packages: cbor2, wrapt, spidev
  Building wheel for cbor2 (PEP 517) ... done
  Created wheel for cbor2: filename=cbor2-5.4.2-cp39-cp39-linux_aarch64.whl size=165153 sha256=7cc7110c2bf4bf36ad78c8e2c3e8f48f3ecebb9b012bcac8254d6605e7ff5934
  Stored in directory: /root/.cache/pip/wheels/8f/73/f0/a47bd572f51ce2006f0df606036923f3c437f8b33e735472e2
  Building wheel for wrapt (setup.py) ... done
  Created wheel for wrapt: filename=wrapt-1.13.3-cp39-cp39-linux_aarch64.whl size=74011 sha256=0f76a47d495cfc1bdccae8d188476519326772a392e8517e6e91a452aeb3a296
  Stored in directory: /root/.cache/pip/wheels/f9/6e/ed/b9a64c8281ff2ee42402497ff3c67f4abd39f552efecc309a9
  Building wheel for spidev (setup.py) ... done
  Created wheel for spidev: filename=spidev-3.5-cp39-cp39-linux_aarch64.whl size=41256 sha256=56d77998f647774b49eaa3fbd10f58e1a0389c199cb27d3164021cc03ab107fc
  Stored in directory: /root/.cache/pip/wheels/af/4b/86/7f9af5f0c9fbcca1aa3279380b64bf55f323ba022485d9a041
Successfully built cbor2 wrapt spidev
Installing collected packages: wrapt, pyusb, pyserial, spidev, smbus2, pyftdi, pillow, deprecated, cbor2, luma.core, luma.oled
Successfully installed cbor2-5.4.2 deprecated-1.2.13 luma.core-2.3.1 luma.oled-3.8.1 pillow-8.4.0 pyftdi-0.53.3 pyserial-3.5 pyusb-1.2.1 smbus2-0.4.1 spidev-3.5 wrapt-1.13.3
Installing sys-oled files
'etc/sys-oled.conf' -&gt; '/etc/sys-oled.conf'
'bin/sys-oled' -&gt; '/usr/local/bin/sys-oled'
'share/sys-oled' -&gt; '/usr/local/share/sys-oled'
'share/sys-oled/C&amp;C Red Alert [INET].ttf' -&gt; '/usr/local/share/sys-oled/C&amp;C Red Alert [INET].ttf'
'share/sys-oled/helios4_logo.png' -&gt; '/usr/local/share/sys-oled/helios4_logo.png'
'system/sys-oled.service' -&gt; '/etc/systemd/system/sys-oled.service'
Enabling sys-oled at startup
Created symlink /etc/systemd/system/multi-user.target.wants/sys-oled.service → /etc/systemd/system/sys-oled.service.
Starting service...
odroidhc4:sys-oled-hc4:%</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	Enable FAN:
</p>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents ipsClearfix" data-gramm="false">
		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9256_9" style=""><span class="pln"># create file /etc/fancontrol with the following content

INTERVAL=10
DEVPATH=hwmon0=devices/virtual/thermal/thermal_zone0 hwmon2=devices/platform/pwm-fan
DEVNAME=hwmon0=cpu_thermal hwmon2=pwmfan
FCTEMPS=hwmon2/pwm1=hwmon0/temp1_input
FCFANS= hwmon2/pwm1=hwmon2/fan1_input
MINTEMP=hwmon2/pwm1=50
MAXTEMP=hwmon2/pwm1=60
MINSTART=hwmon2/pwm1=20
MINSTOP=hwmon2/pwm1=28
MINPWM=hwmon2/pwm1=0
MAXPWM=hwmon2/pwm1=255</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9256_11" style=""><span class="pln">sudo systemctl restart fancontrol</span></pre>

<p>
	 
</p>

<p>
	Build from sources (build host must be Ubuntu Hirsute or Jammy):<br>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4639_5" style=""><span class="pln">apt-get -y install git
git clone https://github.com/armbian/build
cd build
sed "s/^#DOCKER_FLAGS+=(--privileged)/DOCKER_FLAGS+=(--privileged)/" -i config/templates/config-docker.conf
touch .ignore_changes
./compile.sh \
docker \
EXPERT="yes" \
BOARD="odroidhc4" \
BRANCH="current" \
RELEASE="jammy" \
KERNEL_ONLY="no" \
KERNEL_CONFIGURE="no" \
BUILD_DESKTOP="no" \
BUILD_MINIMAL="no"</span></pre>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19336</guid><pubDate>Wed, 24 Nov 2021 12:56:46 +0000</pubDate></item><item><title>Sabrent NT-SS5G Wired 5 Gigabit Ethernet USB3 Adapter Test and Benchmark</title><link>https://forum.armbian.com/topic/22498-sabrent-nt-ss5g-wired-5-gigabit-ethernet-usb3-adapter-test-and-benchmark/</link><description><![CDATA[<p>
	I have a Sabrent NT-SS5G Wired 5 Gigabit Ethernet Adapter (USB3) and a network that can do 2.5 and 5 Gbe so thought I'd see if it works with Armbian on a Nanopi M4V2.
</p>

<p>
	 
</p>

<p>
	Using this distro:
</p>

<p>
	 
</p>

<p>
	<a href="https://www.armbian.com/dl/nanopim4v2/archive/Armbian_22.05.4_Nanopim4v2_jammy_current_5.15.48_xfce_desktop.img.xz.torrent" rel="external nofollow">Armbian_22.05.4_Nanopim4v2_jammy_current_5.15.48_xfce_desktop</a>
</p>

<p>
	 
</p>

<p>
	Baseline using built-in 1 Gigabit ethernet port on Nanopi M4V2 board:
</p>

<p>
	 
</p>

<p>
	iperf3 -t 60 -c faststore (1 stream)
</p>

<p>
	 
</p>

<p>
	[ ID] Interval           Transfer     Bitrate         Retr<br />
	[  5]   0.00-60.00  sec  6.63 GBytes   949 Mbits/sec    0             sender<br />
	[  5]   0.00-60.00  sec  6.63 GBytes   949 Mbits/sec                  receiver
</p>

<p>
	 
</p>

<p>
	iperf3 -t 60 -P4 -c faststore (4 streams)
</p>

<p>
	 
</p>

<p>
	[SUM]   0.00-60.00  sec  6.63 GBytes   950 Mbits/sec  176             sender<br />
	[SUM]   0.00-60.00  sec  6.62 GBytes   948 Mbits/sec                  receiver
</p>

<p>
	 
</p>

<p>
	<strong>Sabrent NT-SS5G</strong> attached to <strong>2.5 Gbe port</strong>:
</p>

<p>
	 
</p>

<p>
	iperf3 -t 60 -c faststore (1 stream)
</p>

<p>
	 
</p>

<p>
	[ ID] Interval           Transfer     Bitrate         Retr<br />
	[  5]   0.00-60.00  sec  16.5 GBytes  2.36 Gbits/sec    0             sender<br />
	[  5]   0.00-60.01  sec  16.5 GBytes  2.36 Gbits/sec                  receiver
</p>

<p>
	 
</p>

<p>
	iperf3 -t 60 -P4 -c faststore  (4 streams)
</p>

<p>
	 
</p>

<p>
	[SUM]   0.00-60.00  sec  16.5 GBytes  2.36 Gbits/sec    0             sender<br />
	[SUM]   0.00-60.05  sec  16.5 GBytes  2.36 Gbits/sec                  receiver
</p>

<p>
	 
</p>

<p>
	2.36 Gbits/sec is about the best I ever see using the 2.5 Gbe port on this server from other machines, so this is quite good.
</p>

<p>
	 
</p>

<p>
	<strong>Note</strong>: as pointed out in several reviews of this Sabrent NT-SS5G, the <strong>USB 3 port (5 Gb max) limits the ethernet bandwidth to a lot less than 5 Gbe max</strong>.
</p>

<p>
	 
</p>

<p>
	<strong>Sabrent NT-SS5G</strong> attached to <strong>5 Gbe port</strong>:
</p>

<p>
	 
</p>

<p>
	iperf3 -t 60 -c faststore (1 stream)
</p>

<p>
	 
</p>

<p>
	[ ID] Interval           Transfer     Bitrate         Retr<br />
	[  5]   0.00-60.00  sec  17.3 GBytes  2.47 Gbits/sec    0             sender<br />
	[  5]   0.00-60.01  sec  17.3 GBytes  2.47 Gbits/sec                  receiver
</p>

<p>
	 
</p>

<p>
	iperf3 -t 60 -P4 -c faststore  (4 streams)
</p>

<p>
	 
</p>

<p>
	[SUM]   0.00-60.00  sec  17.7 GBytes  2.53 Gbits/sec    0             sender<br />
	[SUM]   0.00-60.03  sec  17.7 GBytes  2.53 Gbits/sec                  receiver<br />
	 
</p>

<p>
	This is as expected, the USB3 (5 Gb max) interface of the Sabrent NT-SS5G limits the throughput.  It is better than when connected to a 2.5 Gbe port, but not by much.
</p>

<p>
	 
</p>

<p>
	It does seem to be pretty stable though.  And the drivers were already included, I just plugged the device into a USB3 port and it autoconfigured, connection information showed 2.5 or 5 Gbe based on the speed of the port it was plugged into.
</p>

<p>
	 
</p>

<p>
	Since this only gives a marginal improvement over the 2.5 Gbe USB adapters, probably save your money and buy a USB3 to 2.5 Gbe adapter, there are several on the market.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">22498</guid><pubDate>Wed, 20 Jul 2022 21:31:54 +0000</pubDate></item><item><title>Armbian on Odroid HC4 without erase Petitboot</title><link>https://forum.armbian.com/topic/21487-armbian-on-odroid-hc4-without-erase-petitboot/</link><description><![CDATA[<p>
	Hi all,
</p>

<p>
	we have developed a script to create an SD image for Odroid HC4. With this method you can use Armbian without erase Petitboot partition.
</p>

<p>
	 
</p>

<p>
	<a href="https://github.com/TheLillo/generate-image-hc4-armbian" rel="external nofollow">https://github.com/TheLillo/generate-image-hc4-armbian</a>
</p>
]]></description><guid isPermaLink="false">21487</guid><pubDate>Tue, 14 Jun 2022 15:31:25 +0000</pubDate></item><item><title>Running Armbian on a ZFS, BTRFS, or XFS root filesystem</title><link>https://forum.armbian.com/topic/19091-running-armbian-on-a-zfs-btrfs-or-xfs-root-filesystem/</link><description><![CDATA[<p>
	I have written a shell script that can make your Armbian installation run on a ZFS root. It has not been tested enough for my liking. Use at your own risk. Before running this script, please make a full backup of all your mission-critical files.
</p>

<p>
	 
</p>

<p>
	URL: https://www.dropbox.com/s/ya3expllg1bqgfg/fructify.20211011.sh.gz
</p>

<p>
	 
</p>

<p>
	To install the script, please run these commands:-
</p>

<p>
	# sudo wget <a href="https://www.dropbox.com/s/ya3expllg1bqgfg/fructify.20211011.sh.gz" rel="external nofollow">https://www.dropbox.com/s/ya3expllg1bqgfg/fructify.20211011.sh.gz</a> -O /usr/local/bin/fructify.sh.gz
</p>

<p>
	# sudo gunzip /usr/local/bin/fructify.sh.gz
</p>

<p>
	# sudo chmod +x /usr/local/bin/fructify.sh
</p>

<p>
	 
</p>

<p>
	Oh, and <a href="https://forum.armbian.com/topic/17337-zfs-just-works-now-on-armbian-2-step-instructions-if-you-are-thick-like-me/" rel="">install ZFS</a> on your own OS installation.
</p>

<p>
	 
</p>

<p>
	To use the script, either download an existing Armbian image or use your own system as the basis for the new installation. Next, please make sure (i) there is a blank micro-SD card in an adapter, (ii) the adapter is plugged into a USB port, and (iii) you know which /dev entry refers to that adapter’s USB port. It will probably be /dev/sda; please do not assume so. In the below commands, replace sdX with sda (or whatever).
</p>

<p>
	 
</p>

<p>
	Method 1: Download and use an existing Armbian image
</p>

<p>
	# wget <a href="https://mirrors.netix.net/armbian/dl/nanopineo3/archive/Armbian_21.08.1_Nanopineo3_focal_current_5.10.60.img.xz" rel="external nofollow">https://mirrors.netix.net/armbian/dl/nanopineo3/archive/Armbian_21.08.1_Nanopineo3_focal_current_5.10.60.img.xz</a> -O /root/npneo3_focal.img.xz
</p>

<p>
	# xz -d /root/npneo3_focal.img.xz
</p>

<p>
	# fructify.sh /root/npneo3_focal.img.xz zfs /root/out.img
</p>

<p>
	# dd status=progress bs=1024k if=/root/out.img of=/dev/sdX
</p>

<p>
	 
</p>

<p>
	Method 2: Use your existing filesystem as the basis
</p>

<p>
	# fructify.sh / zfs /dev/sdX
</p>

<p>
	 
</p>

<p>
	In either case, please take care not to write the image to the wrong device.
</p>

<p>
	 
</p>

<p>
	This script can also work with btrfs, ext4, or xfs.
</p>

<p>
	 
</p>

<p>
	The script assumes that you have only one partition on your boot drive. That drive is usually /dev/mmcblk0; the boot/root partition is expected to be /dev/mmcblk0p1. It may be that the script also works if the boot drive is /dev/mmcblk1 and the boot/root partition is /dev/mmcblk1p1; I do not know. In any case, the script shrinks partition #1 (for boot) and allocates approximately 4GB to a newly created partition #2 (for root).
</p>

<p>
	 
</p>

<p>
	If you create a ready-to-install Armbian image and boot it on a micro-SD card, the OS will expand partition #2 to fill the remainder of the micro-SD card. If you create a ZFS-ified (or whatever) copy of your existing installation, the SD card’s second partition will already have been expanded by the script itself.
</p>

<p>
	 
</p>

<p>
	All feedback is welcome. I am new at this. Thank you.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19091</guid><pubDate>Mon, 11 Oct 2021 15:45:13 +0000</pubDate></item><item><title>Video : Armbian Desktop for beginners</title><link>https://forum.armbian.com/topic/20302-video-armbian-desktop-for-beginners/</link><description><![CDATA[<p>
	Hi all.<br />
	I made a new video where I explain all the basics of working with Armbian xfce4.<br />
	This for the absolute beginners that come from Windows. But a more advanced user can maybe also learn a few things from it.<br />
	Here is the video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/SY-JE3jtGDs?feature=oembed" width="200"></iframe>
	</div>
</div>

<p>
	Greetings,<br />
	NicoD
</p>
]]></description><guid isPermaLink="false">20302</guid><pubDate>Wed, 20 Apr 2022 16:54:00 +0000</pubDate></item><item><title><![CDATA[Video : Comparing Odroid HC4 & N2+ / Raspberry Pi 400 / NanoPi M4 / Radxa Zero]]></title><link>https://forum.armbian.com/topic/20231-video-comparing-odroid-hc4-n2-raspberry-pi-400-nanopi-m4-radxa-zero/</link><description><![CDATA[<p>
	Hi all.<br />
	In my latest video I compare the Odroids HC4 and N2+, RPi400, NanoPi M4 and Radxa Zero with each other.<br />
	I make a "NicoD opinion benchmark" where I give my thought on what each board is best for. And of course benchmarks...
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/d89ygbgA-aY?feature=oembed" width="200"></iframe>
	</div>
</div>

<p>
	Greetings, NicoD<br />
	<br />
	For those interested, here are all my benchmarks of the last weeks.
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode">
Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender      | Max temp         
Radxa Zero               http://ix.io/3PlT        Radxa Buster xfce4 5.10              1.8Ghz                6348            1641                              6.75          26m31s                 66c
Radxa Zero               http://ix.io             Manjaro XFCE 5.16.9  22.02.04        1.8Ghz                6303            1631                                            15m39s                 69C
Radxa Zero               http://ix.io/3PMy        Armbian Jammy xfce 5.15              1.8Ghz                6296            1646                                            15m52s                 70c
Radxa Zero               http://ix.io/3TX3        Armbian Jammy xfce4 5.15             1.8Ghz                6014            1634                                            16m05s                 70c

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender      | Max temp      
NanoPi M4 2GB            http://ix.io/3xnJ        Armbian Hirsute xfce4 5.13.12        1.4Ghz/1.8Ghz         7760            1267              1857            10.05         14m41s                 78C    
NanoPi M4 2GB            http://ix.io/3xv3        Armbian Hirsute xfce4 5.13.12        1.5Ghz/2Ghz           8288            1348              2070            10.95         13m21s                        
NanoPi M4 2GB            http://ix.io/3xs3        Armbian Hirsute cinnamon 5.13.12     1.4Ghz/1.8Ghz         7766            1267              1851            10            14m33s                 78C      
NanoPi M4 2GB            http://ix.io/3xt0        Armbian Hirsute budgie 5.13.12       1.4Ghz/1.8Ghz         7941            1272              1863            10.05         14m24s/14m18s          78C      
NanoPi M4 2GB            http://ix.io/3xtR        Armbian Buster xfce4 4.4.213         1.5Ghz/2Ghz           8383            1359              1982            10.8          14m17s                         
NanoPi M4 2GB            http://ix.io/3xuf        Armbian Buster xfce4 4.4.213         1.4Ghz/1.8Ghz         7879            1278              1807            10            15m20s                                  
NanoPi M4 2GB            http://ix.io/3xux        Armbian Focal xfce4 5.10.60          1.4Ghz/1.8Ghz         8028            1286              1859            10.27         13m29s                        
NanoPi M4 2GB            http://ix.io/3xuL        Armbian Focal xfce4 5.10.60          1.5Ghz/2Ghz           8427            1351              2076            11.2          12m53s                         
NanoPi M4 2GB            http://ix.io/3EDB        Ubuntu Xenial armhf 4.4 xfce4        1.4Ghz/1.8Ghz         7069            1140              1695                                                              
NanoPi M4 2GB            http://ix.io/3TXE        Armbian Jammy xfce4 5.15             1.4Ghz/1.8Ghz         7749            1317              1929                          9m50s                   69c

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
Odroid C4/HC4            http://ix.io/2LaP        Ubuntu Mate 4.9                      1.91Ghz               7000            1769                              7.2 kH/s                                         
Odroid C4/HC4            http://ix.io/3F6z        Armbian Buster 5.9                   2.10Ghz               7971            2030                              7.9           23m02s                              
Odroid HC4                                        Armbian Jammy xfce4 5.16             2.10Ghz               7342            1929                                            17m08s                  69C
Odroid HC4               http://ix.io/3TVX        Armbian Jammy xfce4 5.10             2.10Ghz               7350            2008                                            16m35s                  70C

Khadas VIM3                                       Armbian Hirsute cinnamon 5.13.12                                                                                           12m55s

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
Raspberry Pi4            http://ix.io/3F6o        Armbian Jammy 5.13                   2Ghz                  8047                              2070             Didn't work  Blender doens't work                
Raspberry Pi4            http://ix.io/3F6K        Armbian Jammy 5.13                   1.5Ghz                6239                              1572                                                                   
Raspberry Pi4                                     Armbian Hirsute edge xfce4 5.11      1.5Ghz                5832                              1534                          18m11s                   60C
Raspberry Pi4            http://ix.io/3Euw        Armbian Hirsute edge xfce4 5.11      2Ghz                  7747                              2037             9.8          14m26s                   68C       
Raspberry Pi4            http://ix.io/3FbW        Armbian Hirsute 5.11 OC GPU+CPU      2.1Ghz                8168                              2147                          Blender crash                       
Raspberry Pi4            http://ix.io/3EU7        Armbian Impish edge headless 5.13    1.5Ghz                6251                              1584                          15m39s                              
Raspberry Pi4            http://ix.io/3Ewi        Armbian Impish edge headless 5.13    2Ghz                  8171                              2093                          12m41s                              
Raspberry Pi4            http://ix.io/3EPQ        Armbian Bullseye edge headless 5.13  1.5Ghz                6328                              1594             7.3          Blender doesn't work              
Raspberry Pi4            http://ix.io/3EK9        Armbian Bullseye edge headless 5.13  2Ghz                  8242                              2096             9.7          Blender doesn't work            
Raspberry Pi4            http://ix.io/3ECd        Raspberry Pi OS Bullseye 32-bit      1.5Ghz                7577                              1933                          21m09s                              
Raspberry Pi4            http://ix.io/3ECt        Raspberry Pi OS Bullseye 32-bit      2Ghz                  9746                              2533                          17m05s                            
Raspberry Pi4            http://ix.io/3EIe        Raspberry Pi OS Bullseye 64-bit      1.5Ghz                6174                              1567             7.2          17m01s                             
Raspberry Pi4            http://ix.io/3EJs        Raspberry Pi OS Bullseye 64-bit      2Ghz                  8026                              2053             9.65         Blender unstable at 2Ghz            
Raspberry Pi4            http://ix.io/3EGZ        Ubuntu 21.10 (Impish) 5.13 arm64     1.5Ghz                6160                              1563                          16m50s                            
Raspberry Pi4            http://ix.io/3EHA        Ubuntu 21.10 (Impish) 5.13 arm64     2Ghz                  7965                              2038             Didn't work  Blender unstable at 2Ghz          

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
RPi400                   http://ix.io/3HLw        Armbian Jammy Edge 5.15.7 cinnamon   2Ghz o.v. 6           7913                              2085                          19m34s                  69C        
RPi400                   http://ix.io/3HSI        Armbian Impish current 5.13.0 cin    2Ghz o.v. 6           7869                              2104                          14m20s                  63C       
RPi400                   http://ix.io/3HTx        Armbian Impish current 5.13.0 cin    2.1Ghz + 700GPU o.v.6 6930                              2069                          13m27s                  65C        
RPi400                   http://ix.io/3HTR        Armbian Impish current 5.13.0 cin    2.1Ghz o.v.6          8188                              2205                          14m03s                  65C      
RPi400                   http://ix.io/3HMm        RPiOS bullseye armhf 5.10.63         1.8Ghz                8705                              2350                          18m46s                  55C       
RPi400                   http://ix.io/3HRl        RPiOS bullseye armhf 5.10.63         2Ghz o.v. 4           9834                              2601                          17m07s                  61C       
RPi400                                            Manjaro KDE 5.10                     1.8Ghz                7426                              1886                          14m28s                  58C
RPi400                   http://ix.io/3IgG        Manjaro KDE 5.10                     2Ghz                  8156                              2092                          13m16s                  65C        
RPi400                   http://ix.io/3U13 ***    Armbian Jammy xfce4 5.15             1.8Ghz                7166                              1882                          13m15s

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
Odroid N2+               http://ix.io/3EwQ        Armbian Impish xfce4 5.14            2Ghz/2.4Ghz           11714           1765              2517                           8m51s                            
Odroid N2+               http://ix.io/3TDQ        Armbian Impish xfce4 5.10            2Ghz/2.4Ghz           11743           1817              2626                           8m43s                  60C
Odroid N2+               http://ix.io/3TEq        Armbian Jammy xfce4 5.10             2Ghz/2.4Ghz           11801           1818              2646                           5m54s * Blender 3.0.1

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
I5 2500K OC              http://ix.io/3SkY        Armbian Focal 5.15                   4Ghz                  16029                             4059            50            3m31s                   95C ++Throttle with CPUMiner
I5 2500K PowerSaving                              Armbian Focal 5.15                   3.4Ghz                13544                             3691                          4m10s                   69C 200W</pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br />
	 
</p>
]]></description><guid isPermaLink="false">20231</guid><pubDate>Thu, 07 Apr 2022 11:45:54 +0000</pubDate></item><item><title>Video : Armbian Hirsute XFCE4 - What's new, fixes, tips and benchmarks</title><link>https://forum.armbian.com/topic/18878-video-armbian-hirsute-xfce4-whats-new-fixes-tips-and-benchmarks/</link><description><![CDATA[<p>
	Hi all. I've just finished a new video about Armbian Hirsute XFCE4.
</p>

<p>
	I show what's new. Mostly the feel and look are a bit more modern.<br />
	Here is my video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/7z0_WQX3KpE?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>

<p>
	Some other notes I've got <span>:</span><br />
	<br />
	 
</p>

<pre class="ipsCode">Memory usage
buster &lt; focal &lt; hirsute
xfce4 &lt; budgie &lt; cinnamon

CPU performance
buster &lt; hirsute &lt; focal
xfce4 &lt; cinnamon &lt; budgie</pre>

<p>
	So Buster xfce uses the least memory. And is also the slowest.
</p>

<p>
	Hirsute is quite a bit slower than Focal, and uses more memory. I do find the newer looks worth the price.
</p>

<p>
	 
</p>

<p>
	Here my benchmarks <span>:</span>
</p>

<pre class="ipsCode">Fix missing network 
sudo apt install gvfs-backends

Download SBC-Bench
	wget https://raw.githubusercontent.com/ThomasKaiser/sbc-bench/master/sbc-bench.sh
Execute SBC-Bench
	sudo /bin/bash ./sbc-bench.sh -c
7zip all cores
	7z b
7zip small core
	taskset -c 0 7z b
7zip big core 
	taskset -c 5 7z b
NicoD Blender
	blender -b NicoD.xx.blend -f 0
SuperTuxKart	
	1080p full screen, show fps, choose soccer game with tux and grassfield. Average frames.
Max temp
	Maximum temperature during blender NicoD render


Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender     | SuperTuxKart   | Memory used at boot  | Max temp
NanoPi M4 2GB            http://ix.io/3xnJ        Armbian Hirsute xfce4 5.13.12        1.4Ghz/1.8Ghz         7760            1267              1857            10.05         14m41s              8fps             693MB                  78C    ***
NanoPi M4 2GB            http://ix.io/3xv3        Armbian Hirsute xfce4 5.13.12        1.5Ghz/2Ghz           8288            1348              2070            10.95         13m21s              8fps             693MB                         ***
NanoPi M4 2GB            http://ix.io/3xs3        Armbian Hirsute cinnamon 5.13.12     1.4Ghz/1.8Ghz         7766            1267              1851            10            14m33s              8fps             809MB                  78C
NanoPi M4 2GB            http://ix.io/3xt0        Armbian Hirsute budgie 5.13.12       1.4Ghz/1.8Ghz         7941            1272              1863            10.05         14m24s/14m18s       8fps             757MB                  78C
NanoPi M4 2GB            http://ix.io/3xtR        Armbian Buster xfce4 4.4.213         1.5Ghz/2Ghz           8383            1359              1982            10.8          14m17s                               530MB     
NanoPi M4 2GB            http://ix.io/3xuf        Armbian Buster xfce4 4.4.213         1.4Ghz/1.8Ghz         7879            1278              1807            10            15m20s                               530MB                                    
NanoPi M4 2GB            http://ix.io/3xux        Armbian Focal xfce4 5.10.60          1.4Ghz/1.8Ghz         8028            1286              1859            10.27         13m29s              8fps             586MB                         ***
NanoPi M4 2GB            http://ix.io/3xuL        Armbian Focal xfce4 5.10.60          1.5Ghz/2Ghz           8427            1351              2076            11.2          12m53s              8fps             638MB                         ***
</pre>

<p>
	<br />
	 
</p>
]]></description><guid isPermaLink="false">18878</guid><pubDate>Tue, 31 Aug 2021 21:20:23 +0000</pubDate></item><item><title>Video : Making an X86 Armbian build server + setting up an Odroid HC4 as NAS with plain Armbian and Samba</title><link>https://forum.armbian.com/topic/20125-video-making-an-x86-armbian-build-server-setting-up-an-odroid-hc4-as-nas-with-plain-armbian-and-samba/</link><description><![CDATA[<p>
	Hi all.<br />
	In my latest video I make an Armbian Build server out of my old x86 PC. And I set up an extra Odroid HC4 as NAS with the old hard drives from my PC.<br />
	I hope you'll like it, greetings.
</p>

<p>
	NicoD
</p>

<p>
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/IBZ3-bEsqkA?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">20125</guid><pubDate>Tue, 22 Mar 2022 09:41:45 +0000</pubDate></item><item><title>Orange Pi Zero NTP Stratum 1 PPS GPS Server with Armbian OS, Hardware and Software Tutorial</title><link>https://forum.armbian.com/topic/9857-orange-pi-zero-ntp-stratum-1-pps-gps-server-with-armbian-os-hardware-and-software-tutorial/</link><description><![CDATA[<p>
	<strong>Orange Pi Zero NTP Stratum 1 PPS GPS Server with Armbian OS.</strong><br><strong><a href="http://schwartzel.eu3.org/ntp-stratum1.html" rel="external nofollow">Link to the Tutorial - http://schwartzel.eu3.org/ntp-stratum1.html</a></strong><br><br>
	This tutorial uses a 3.3V capable GPS module with PPS output - TOPGNSS GN-701 (u-blox 7) but other similar modules should work.<br><img alt="image002.jpg.79e8f2fe5963fd0e45a8aefd73412d37.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4258" src="https://forum.armbian.com/uploads/monthly_2019_03/image002.jpg.79e8f2fe5963fd0e45a8aefd73412d37.jpg"><br>
	 
</p>

<p>
	This tutorial is for the Orange Pi Zero, but will probably work for other boards.
</p>

<p>
	<img alt="image001.jpg.f5c7634b6c994d1ab806873d1513c664.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="4259" src="https://forum.armbian.com/uploads/monthly_2019_03/image001.jpg.f5c7634b6c994d1ab806873d1513c664.jpg"><br>
	 
</p>

<p>
	<br>
	I couldn't easily do a comprehensive hardware and software tutorial on this forum, so I've published it on my web server and linked from here and attached a PDF.<br><strong><a href="http://schwartzel.eu3.org/ntp-stratum1.html" rel="external nofollow">Link to the Tutorial - http://schwartzel.eu3.org/ntp-stratum1.html</a></strong><br><br>
	Tutorial PDF<br><a class="ipsAttachLink" href="https://forum.armbian.com/applications/core/interface/file/attachment.php?id=4527" data-fileid="4527" rel="">ntp-stratum1.pdf</a><br><br>
	If you spot any typo's or errors please let me know.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">9857</guid><pubDate>Thu, 14 Mar 2019 03:07:16 +0000</pubDate></item><item><title>Some experiences with Odroid-N2+ on Debian Bullseye</title><link>https://forum.armbian.com/topic/19579-some-experiences-with-odroid-n2-on-debian-bullseye/</link><description><![CDATA[<p>
	I first used Kingston endurance SD card with Armbian Buster image. This failed due some incompability with Odroid N2 UHS implementation, but Sandisk extreme SD card worked with same image.
</p>

<p>
	After successful boot runned <abbr title="A type of flash memory"><abbr title="A type of flash memory">nand</abbr></abbr>-sata-install to ADATA SP 550NS38 SSD connected using VL817 SATA Adaptor (2109:0715).<br />
	Upgraded the Debian to Bullseye and installed Mesa 21.2.0 packages from experimental repositories, arm64 firefox-esr and armhf Chromium via multiarch to use widevine extracted from ChromeOS images (local err.ee web broadcasts some programs with widevine encryption). This was in the end of august. It mostly worked, but had 3 weird problems that I think to have solved now having some free time.
</p>

<p>
	 
</p>

<ol>
	<li>
		The USB boot hanged up about half of times after kernel detected the SATA drive. Turns out that UAS is culprit, disabling UAS with usb-storage.quirks=2109:0715:u made it now boot every time without problems (modified /boot/boot.ini).
	</li>
	<li>
		About 2-3 minutes after boot the compositor froze (no matter which - tried Xorg compton, wayland Weston and Wayfire (self compiled). Turns out armbian has /etc/udev/rules.d/hdmi.rules which runs /usr/local/bin/hdmi-hotplug. For some reason the hdmi-hotplug script stalls on my Odroid installation and when systemd finally killed it, something went wrong and the compositors froze. Diverting the hdmi.rules fixed it.
	</li>
	<li>
		This was/is weirdest - when TV connected via HDMI was off and turned on, then sometimes the board would shutdown. Found from auth log "auth.log.1:Dec 25 19:04:59 piix systemd-logind[1641]: Power key pressed." Like WTF, i don't have any "power key" and why it gets invoked when TV is turned on. Set the *Key=ignore in /etc/systemd/logind.conf and it seems fine now, no idea what went wrong there. The kernel even don't have CEC enabled (CONFIG_CEC_MESON_AO and CONFIG_CEC_MESON_G12A_AO are not set for some reason in the armbian kernels).
	</li>
</ol>

<p>
	 
</p>

<p>
	A bit later I also saw 5.15.8-meson64 kernel OOPS "Unable to handle kernel execute from non-executable memory" at regmap_update_bits_base+0x74/0x98, meson_clk_cpu_dyndiv_set_rate+0xf4/0x118. As I hadn't seen this before, downgraded to 5.13.12-meson64. I plan to report the OOPS with full kernel dmesg output, when I'll have a bit more time (probably the <a href="https://bugzilla.kernel.org/" rel="external nofollow">https://bugzilla.kernel.org/</a> would be right place?).
</p>

<p>
	 
</p>

<p>
	Currently it seems to work fine, with the 5.13.12-meson64 kernel and mesa/<abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr> 21.2.1-2 (from snapshot.debian.org). Weston is used as Wayland compositor. It is important to note that I have 1080p TV, and all video decoding is done on CPU without using the Amlogic <abbr title="Video processing unit (encoding/decoding)"><abbr title="Video processing unit (encoding/decoding)">VPU</abbr></abbr> acceleration, as the <abbr title="Video processing unit (encoding/decoding)"><abbr title="Video processing unit (encoding/decoding)">VPU</abbr></abbr> driver is currently both broken in the kernel and unsupported in unpatched userspace. I expected this when choosing the board. Fortunately the 4xA73@2.4GHz is fast enough for decoding most 1080p videos and <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr> is fine for doing the video output after decoding. AFAIK playing 4K videos is currently not possible on Odroid N2 with mainline kernel and the vendors proprietary <abbr title="Video processing unit (encoding/decoding)"><abbr title="Video processing unit (encoding/decoding)">VPU</abbr></abbr> decoder isn't supported by any software in open source distributions like Debian. Interesting is that Firefox seems to handle the video decoding pathway better for Youtube in this configuration,<br />
	while Chromium occasionally stutters on some Youtube videos, these seem to be fine with Firefox. Luckily this seems to not affect the site where I needed widevine (that works only with Chromium in practice). In september widevine upgraded to version needing patched libc. I got patched armhf libc6 package from apt.xbian.org repository.
</p>

<p>
	 
</p>

<p>
	The ALSA configuration is weird, amixer scontrols | wc gives 50 controls, and if misconfigured, then the thing doesn't give any audio output. I found the following script from somewhere that "fixes" it into working state:
</p>

<p>
	 
</p>

<pre class="ipsCode">amixer sset 'FRDDR_A SINK 1 SEL' 'OUT 1'
amixer sset 'FRDDR_A SRC 1 EN' 'on'
amixer sset 'TDMOUT_B SRC SEL' 'IN 0'
amixer sset 'TOHDMITX I2S SRC' 'I2S B'
amixer sset 'TOHDMITX' 'on'
amixer sset 'FRDDR_B SINK 1 SEL' 'OUT 2'
amixer sset 'FRDDR_B SRC 1 EN' 'on'
amixer sset 'TDMOUT_C SRC SEL' 'IN 1'
amixer sset 'TOACODEC SRC' 'I2S C'
amixer sset 'TOACODEC OUT EN' 'on'
amixer sset 'TOACODEC Lane Select' '0'
amixer sset 'ACODEC' '255'
amixer sset 'FRDDR_C SINK 1 SEL' 'OUT 3'
amixer sset 'FRDDR_C SRC 1 EN' 'on'
amixer sset 'SPDIFOUT SRC SEL' 'IN 2'</pre>

<p>
	 
</p>

<p>
	After that ALSA pcm "hw:0,1" output works. I configured dmixed and removed pulseaudio, as it seemed to complicate things with no benefit when mpc and browser run as different users.
</p>

<p>
	 
</p>

<p>
	Armbian is great (couldn't have the board working so well without armbian) and merry holidays for you <img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20" />
</p>

<p>
	Hoping this helps others having Odroid N2(+) board.
</p>
]]></description><guid isPermaLink="false">19579</guid><pubDate>Wed, 29 Dec 2021 16:25:04 +0000</pubDate></item><item><title>Video : Testing the new 22.02 images on M4/V2 / RK3399</title><link>https://forum.armbian.com/topic/19986-video-testing-the-new-2202-images-on-m4v2-rk3399/</link><description><![CDATA[<p>
	Hi all.<br />
	In my latest video I test the new Armbian 22.02 images on RK3399.<br />
	I use the NanoPi M4. But it should be about the same for other RK3399 devices.
</p>

<p>
	 
</p>

<p>
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/QB6JmYW5HiY?feature=oembed"></iframe>
	</div>
</div>

<p>
	<br />
	Long story short.<br />
	Jammy xfce 5.16 performs better. And has the better performing browser.<br />
	Focal xfce 5.15 firefox is not HW-acc. Chromium is, but performs badly. Also bad blender result. Not all cores are used to the max. I've never seen this behaviour.<br />
	<br />
	So I would use the Jammy xfce 5.16 image. But I'm still using an older image that work. So I'm not upgrading.<br />
	Greetings, NicoD
</p>
]]></description><guid isPermaLink="false">19986</guid><pubDate>Thu, 03 Mar 2022 14:13:16 +0000</pubDate></item><item><title>So, you want to run a file server (aka NAS)?</title><link>https://forum.armbian.com/topic/19978-so-you-want-to-run-a-file-server-aka-nas/</link><description><![CDATA[<p>
	This is not so much a 'Tutorial' as it is an overview (and/or starting point for further research) of some things to consider when setting up a file server, some in general and then some more particular to <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr>.
</p>

<p>
	 
</p>

<p>
	In the simplest case, you could attach almost any drive to almost any board, by any number of ways, and you have yourself 'a file server.'  However with even a small amount of effort, there are so many better ways to do things nowadays.  We have a lot more interesting hardware choices, advanced filesystems, etc. and so those are mostly what I want to talk about.
</p>

<p>
	 
</p>

<p>
	But first, some context.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Dedicated distros vs simple directory sharing</span>
</p>

<p>
	 
</p>

<p>
	Personally I am not a fan of dedicated distros like FreeNAS, OMV, etc. as I consider them to be too 'heavy weight' and single solution specific.  I mean, if you need some/all of those features, or you like them or whatever, then great, use them.
</p>

<p>
	 
</p>

<p>
	However, a 'file server' is one of the simplest use cases of a 'server' and I am sure one which almost everyone buying a <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr> will do at some point.  IMO, all one needs to do is simply share some folder(s) via either NFS (if your network is mostly GNU/Linux machines) or Samba/SMB (if your network is mostly Windows machines).  And that's it, you're done!  Simple, lightweight, and using standard protocols (well, a little less 'standard' in case of Windows, but I digress <img alt=";)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_wink.png" srcset="https://forum.armbian.com/uploads/emoticons/wink@2x.png 2x" title=";)" width="20" /> ).
</p>

<p>
	 
</p>

<p>
	You could also add any of the software included in the 'all in one' solutions in first paragraph on a 'piece by piece' basis, if/when you need them.  Personally I am more of a fan of starting small (vanilla Armbian base) and then adding things you need one by one.  But you are of course free to do whatever you want.
</p>

<p>
	 
</p>

<p>
	Setting any of that up, or debating about it, is considered off-topic for this thread, as there are tons of resources already around the Internet about those things.  So I want to focus on other, (IMO) more interesting, aspects.  You are welcome to make your own thread with a different focus, of course.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Important note about hardware RAID</span>
</p>

<p>
	 
</p>

<p>
	<a href="https://en.wikipedia.org/wiki/RAID" rel="external nofollow">RAID</a>, in case you were unaware, means "Redundant Array of Independent Disks.<b>"</b>
</p>

<p>
	 
</p>

<p>
	For a looooooong time, I (and I think many others with SOHO NAS perspective) thought that 'hardware RAID was the only proper way to do it' but in the course of researching ZFS I eventually became convinced otherwise.  In fact, apparently, historically 'big-iron' filesystems (Solaris, others) were always run with <em>software</em> RAID in the enterprise as there are a lot of advantages to that.
</p>

<p>
	 
</p>

<p>
	Just think about it.  If your hardware RAID card dies, you need to replace it with exactly the same model, before you can even begin to recover your data.  With software RAID, you just re-connect drives and you are back in business (with ZFS, you can even connect them in any random order, amazing!).
</p>

<p>
	 
</p>

<p>
	In particular if you are using ZFS, <a href="https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Hardware.html#controllers" rel="external nofollow">hardware RAID controllers are not recommended</a>.  I am not sure how much this applies to other similar software RAID systems, but it would stand to reason that it does (IMO).
</p>

<p>
	 
</p>

<p>
	Hardware controllers are also typically very expensive and proprietary.  Where software RAID uses readily available and inexpensive commodity hardware (while actually increasing reliability).  All of which is why I have become such a big fan of it, whether we are talking about ZFS (which I like) or some other software RAID solution you may prefer instead.
</p>

<p>
	 
</p>

<p>
	Now, with that out of the way, onward!
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Filesystem</span>
</p>

<p>
	 
</p>

<p>
	Assuming you came to similar conclusions as I did in previous section already, this is where our decision making process really begins in earnest IMO.  As the way I see it, choice of file system will dictate topology, which will in turn dictate choice of hardware (which <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr> to buy).
</p>

<p>
	 
</p>

<p>
	Of course if you already bought some <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr>, you are in a different boat (and working backwards, from my point of view <img alt=";)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_wink.png" srcset="https://forum.armbian.com/uploads/emoticons/wink@2x.png 2x" title=";)" width="20" />).  Anyway, you will have to adapt accordingly (and/or buy different hardware).  However, if you are already there, go to 'Historical Overview' section, and maybe you can find some solution there which will work with the hardware you already have.
</p>

<p>
	 
</p>

<p>
	Now, back on track, we are really lucky nowadays, thanks to F/LOSS, to have some industrial grade, software based filesystems available to us mere mortals!  <span><img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20" /></span>
</p>

<p>
	 
</p>

<p>
	I like ZFS, but certainly, opinions will differ.  Some people like btrfs, in fact I got into <a href="https://forum.armbian.com/topic/16285-why-i-prefer-zfs-over-btrfs" rel="">a lengthy (but IMO informative) debate</a> with <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/7-tkaiser/?do=hovercard" data-mentionid="7" href="https://forum.armbian.com/profile/7-tkaiser/" rel="">@tkaiser</a> about that.
</p>

<p>
	 
</p>

<p>
	Then there are other distributed things like Ceph (and others) which I will admit to knowing less about.  If you do, kindly add your thoughts to the thread when you have a moment.
</p>

<p>
	 
</p>

<p>
	Point being, hardware setup for someone like me (using ZFS) or even someone using btrfs will be perhaps quite different than someone using something distributed like Ceph.  Just keep that in mind.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Historical Overview (<abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr> Hardware)</span>
</p>

<p>
	 
</p>

<p>
	I want to cover some of things which came before, as I think they are relevant to understanding where we are today.
</p>

<p>
	 
</p>

<p>
	In the beginning, there was darkness.  Wait, let me fast forward a bit.  <span><img alt=":D" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_biggrin.png" srcset="https://forum.armbian.com/uploads/emoticons/biggrin@2x.png 2x" title=":D" width="20" /></span>
</p>

<p>
	 
</p>

<p>
	I will start with the creation of Armbian.  Which happened, in fact, because <a href="https://www.youtube.com/watch?v=VAfCTwizTGY" rel="external nofollow">Igor was trying to set up a file server on a cubietruck</a>.  True story (and like I said, you are not alone, this is a common use-case)!  <span><img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20" />  Anyway, many of us bought (A20 based) cubietruck back then, because they sold a small </span>power adapter board which made this easy and they also <span>had a SATA connector right on the board</span>.  I think they were one of first to do this in fact (I could be wrong).
</p>

<p>
	 
</p>

<p>
	After that, a lot of us used (more powerful Samsung Exynos5 based octo-core) <a href="https://www.armbian.com/odroid-xu4/" rel="external nofollow">ODROID-XU4</a>, along with a <a href="https://pine64.com/product/rock64-usb-3-0-to-sata-iii-hard-drive-adapter-cable-converter-with-uasp/" rel="external nofollow">good quality USB to SATA adapter with UASP</a>.  That one in particular was <a href="https://forum.armbian.com/topic/5098-mini-review-rock64-sata-cable/" rel="">recommended by tkaiser</a> a long time ago, however -- as of time of writing this post -- PINE64 still sell it in their store(!).  And it may be an 'okay' solution if you have some (especially, USB3 capable) board laying around that you just want to use.  Some people are still using this today.  But we have a lot better options now.
</p>

<p>
	 
</p>

<p>
	Then RK3399 came on the scene.  Which was very exciting, because these support not only PCIe, but they are also 64-bit (which is required for ZFS).  Unfortunately, it took literally years for these to become really stable.  Lucky for you, this is all in the past by now.  And so, currently, many people will probably recommend RK3399 as a file (or other) server.
</p>

<p>
	 
</p>

<p>
	There are a lot of other boards out there, which I do not have as much experience with.  But I also try to note only historically significant developments here (at least the way I see them).  If you have any to add, please comment below or contact me somehow (PM or IRC) and I will edit this post and add them.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Usage (other than file server)</span>
</p>

<p>
	 
</p>

<p>
	As I already stated, almost any cheap board can be a (minimal) 'file server.'  From that point of view, more powerful boards (like RK3399, or others) are overkill.  However maybe you want better throughput.  Or more disks.  Or, like me, you want to run advanced filesystem like ZFS (also with more disks).
</p>

<p>
	 
</p>

<p>
	Another thing which happens is that, once you handle the simple case of serving files, before you know it you will probably want to start doing more than that.  You may already have some more demanding requirements in mind beforehand.
</p>

<p>
	 
</p>

<p>
	For all these reasons, a slightly more powerful (and more expensive) board may be a better choice, as you will not be limited in the future.  But if you are very sure about your needs and wants, and have perhaps other boards on your network to handle processing intensive tasks, this may not apply to you.  Just something to consider.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Hardware Recommendations (RK3399 based)</span><span> </span>
</p>

<p>
	 
</p>

<p>
	For reasons mentioned at end of 'Historical Overview' section, many of us are fans of RK3399 based devices nowadays.
</p>

<p>
	 
</p>

<p>
	Within this subset, you will get a lot of opinions.  <span><span><img alt=":D" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_biggrin.png" srcset="https://forum.armbian.com/uploads/emoticons/biggrin@2x.png 2x" title=":D" width="20" />  I know because I spent literally years asking people (including developers), while I was waiting for RK3399 to mature.  Some developers think certain vendors make crappy hardware (and maybe they are right).  Or they prefer the boards they know and develop on (naturally, IMO).  Some vendors support the project a lot more than others (PINE64, notably, do not support Armbian at all to my knowledge).</span></span>  So you will have to do some amount of your own research, and form your own opinion here.
</p>

<p>
	 
</p>

<p>
	I don't want to discount any of the above criteria too much.  However, in the end, at least for me, one criteria bubbled to the top.  And that was direct PCIe (or SATA) support.  Since we are talking about RK3399 here, this means PCIe support.  Which of course is in the <abbr title="System On a Chip"><abbr title="System On a Chip">SoC</abbr></abbr>, but that is not what I am talking about.  I am talking about putting a standard PCIe physical interface directly on the board.
</p>

<p>
	 
</p>

<p>
	This way, you can buy any standard cheap/dumb PCIe to SATA adapter card.  You can keep spares.  You will be able to obtain them for the foreseeable future.
</p>

<p>
	 
</p>

<p>
	By contrast, you can certainly rig up your own adapters, cables, etc. from <abbr title="General purpose input/output"><abbr title="General purpose input/output">GPIO</abbr></abbr>.  But personally, I find that fiddly and it doesn't strike me as the most reliable.  I know some people are doing this just fine though.
</p>

<p>
	 
</p>

<p>
	Another way, is that many vendors sell some sort of HAT, which provides SATA connectivity.  However I find this short-sighted and -- quite frankly -- self-serving.  What if they are out of stock, or stop making them?  You are out of luck.  Or you would need to revert to the above option (rigging up cables and adapters).  It's good for them selling add-on hardware though I guess -- hence my 'self-serving' comment -- but maybe not the best <em>for you and me</em> in terms of keeping our important data available and up and running, on a long term basis.
</p>

<p>
	 
</p>

<p>
	Therefore I say, skip all of that and go with a board that has a standard physical PCIe right on the board.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;">ROCKPro64</span>
</p>

<p>
	 
</p>

<p>
	And AFAIK, there is only one (standalone <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr>) RK3399 that meets that description, which is <a href="https://www.armbian.com/rockpro64/" rel="external nofollow">ROCKPro64</a>.  Of course, I am not the first to come to same conclusion, in fact there is a whole thread where myself and some other like-minded folks discuss <a href="https://forum.armbian.com/topic/14826-rockpro64-as-nas" rel="">using ROCKPro64 as NAS</a>.
</p>

<p>
	 
</p>

<p>
	I say 'standalone <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr>', because I almost forgot...
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;">Helios 64</span>
</p>

<p>
	 
</p>

<p>
	These of course are no longer made, and Kobol, our once partners, have unfortunately <a href="https://blog.kobol.io/2021/08/25/we-are-pulling-the-plug/" rel="external nofollow">closed up shop</a>.  However they still come up for sale on the forums from time to time (usually in <s><a href="https://forum.armbian.com/clubs/5-kobol-forum/" rel="">Kobol Club</a></s> (subforum is no more) but could be anywhere).
</p>

<p>
	 
</p>

<p>
	Here you would be getting a more integrated solution, often including a nice case, for perhaps a bit more money.
</p>

<p>
	 
</p>

<p>
	<s>Some people have had problems with stability though, which I am not sure were ever fully worked out.</s>  As of <a href="https://forum.armbian.com/topic/30074-helios64-armbian-2308-bookworm-issues-solved/?do=findComment&amp;comment=191029" rel="">mid-2024</a>, it seems the community have finally got this device stable.  Which I personally find pretty remarkable, given the circumstances.
</p>

<p>
	 
</p>

<p>
	Having said that, I am sure these devices are only getting harder and harder to come by, especially now.  Not only that, but keeping it that way is always going to require ongoing maintenance, as the Linux kernel (and other parts of the OS) never stop moving forward.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Hardware Recommendations (not RK3399 based)</span>
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;">ODROID HC4</span>
</p>

<p>
	 
</p>

<p>
	<a href="https://www.armbian.com/odroid-hc4/" rel="external nofollow">ODROID HC4</a> was also brought up today, when this subject came up in IRC, by <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/17288-rpardini/?do=hovercard" data-mentionid="17288" href="https://forum.armbian.com/profile/17288-rpardini/" rel="">@rpardini</a> as that is what he uses.  This is an interesting alternative to the above, except Amlogic (S905X3) based (like a lot of <a href="https://forum.armbian.com/clubs/1-tv-boxes/" rel="">TV boxes</a>).  Which to me means two things:
</p>

<p>
	 
</p>

<p>
	1. It almost certainly requires blobs.
</p>

<p>
	2. It's probably cheaper than RK3399.
</p>

<p>
	 
</p>

<p>
	Well in fairness ROCKPro64 probably requires some blobs, too.  But somehow I get the impression that Amlogic are really obnoxious with their blobs, and I am not a fan of them as a company because of this.  Surely a developer will need to correct me here.  <span><img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20" /></span>
</p>

<p>
	 
</p>

<p>
	Anyway, I am not sure how it compares in processing power.  I suspect less than RK3399(?).  However for media transcoding, it may actually be better (perhaps hardware decoders(?), speculation on my part).
</p>

<p>
	 
</p>

<p>
	Also for simple 'file server' use-case, in particular with Ceph or something like that, it becomes more interesting IMO.  Again, quoting rpardini from IRC today: "scale out, not up."
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Future</span>
</p>

<p>
	 
</p>

<p>
	There are newer SoCs, like RK3566 and others.  At this time, they are a lot like RK3399 was early on.  Very exciting, but not able to realize their full potential due to lack of (software/Linux) development.
</p>

<p>
	 
</p>

<p>
	The consensus among developers seems to be that RK3566 development should go faster/easier than RK3399 development, because of all the ground work that was laid in the course of the latter.  Maybe that's true, but we are still talking about some time.  Maybe less years, but still significant time.
</p>

<p>
	 
</p>

<p>
	If/when this changes, I will try and remember to update the post.  Feel free to ping me by posting, I should get notified.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:20px;">Others?</span>
</p>

<p>
	 
</p>

<p>
	Possibly anything in <a href="https://www.armbian.com/download/?tx_category=nas" rel="external nofollow">NAS</a> category.  Which I mostly covered already (above, in more detail) but can always change in future.
</p>

<p>
	 
</p>

<p>
	Certainly I forgot (or don't know about) some others.  I have shared what I learned from my research the last several years while looking for solution for myself.  However I do want to make this a more general resource that we can all point to, so please discuss, and I will be happy to edit this post later on and add relevant info.
</p>

<p>
	 
</p>

<p>
	To clarify, I am not talking about 'any <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr> which can be made into a file server' which is almost any of them, but rather particular hardware which is interesting for some specific reason(s), especially currently (or perhaps historically, which I would add to that section).
</p>

<p>
	 
</p>

<p>
	Cheers!
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19978</guid><pubDate>Wed, 02 Mar 2022 21:33:42 +0000</pubDate></item><item><title>Video : How to install OMV on Armbian Buster and set up a SMB share with it</title><link>https://forum.armbian.com/topic/16799-video-how-to-install-omv-on-armbian-buster-and-set-up-a-smb-share-with-it/</link><description><![CDATA[<p>
	Hi all. In this video I show how to install Open Media Vault on your <abbr title="Single board computer">SBC</abbr> with Armbian Buster.<br />
	I've used the Odroid HC4, this is the same for any board you'd like to use. <br />
	Here my video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/-XW0p3O2dJ8?feature=oembed"></iframe>
	</div>
</div>

<p>
	Greetings.<br />
	NicoD
</p>
]]></description><guid isPermaLink="false">16799</guid><pubDate>Sun, 17 Jan 2021 12:47:57 +0000</pubDate></item><item><title>Video : Testing KDE Plasma desktop on Armbian / RK3399</title><link>https://forum.armbian.com/topic/19618-video-testing-kde-plasma-desktop-on-armbian-rk3399/</link><description><![CDATA[<p>
	Hi all.<br />
	In this video I test the KDE Plasma desktop on Armbian Jammy.
</p>

<p>
	It ain't perfect. It needs some fixes to be workable. I show what to do to install and fix.<br />
	Here's the video. Greetings.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/s3Jk-dfnP-M?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19618</guid><pubDate>Sat, 08 Jan 2022 14:11:03 +0000</pubDate></item><item><title>MMDVM PI-STAR</title><link>https://forum.armbian.com/topic/19755-mmdvm-pi-star/</link><description><![CDATA[<p>
	boa tarde, meu e Alfredo, comprei uma placa MMDVM para montar um hotspot, mas nao consigo encontrar compatiblidade , pois estou usando ARMBIAN OS
</p>

<p>
	alguem pode me ajudar.
</p>
]]></description><guid isPermaLink="false">19755</guid><pubDate>Fri, 28 Jan 2022 21:10:35 +0000</pubDate></item><item><title>Orange Pi and USB Sound Card</title><link>https://forum.armbian.com/topic/19750-orange-pi-and-usb-sound-card/</link><description><![CDATA[<p>
	Hi all. In this topic I will show, how to make work USB sound card with  Orange Pi. I did not found similar information, so I decided to put this info into a forum.
</p>

<p>
	 
</p>

<p>
	At the moment, I have working mocp from root user, which able to play mp3 and online radio.
</p>

<p>
	 
</p>

<p>
	I am not sure if all steps are necessary. So if You know a shorter version of this, please post a reply.
</p>

<p>
	 
</p>

<p>
	Lets begin.
</p>

<p>
	 
</p>

<p>
	1. Insert USB sound card, Boot Orange Pi, and login via SSH.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents">
		<p>
			 
		</p>

		<p>
			mocp output:
		</p>

		<p>
			Running the server...<br />
			Trying JACK...<br />
			Trying ALSA...<br />
			Trying OSS...
		</p>

		<p>
			FATAL_ERROR: No valid sound driver!
		</p>

		<p>
			<br />
			FATAL_ERROR: Server exited!
		</p>

		<p>
			 
		</p>
	</div>
</blockquote>

<p>
	<br />
	alsamixer not work without arguments ( It may print something like: cannot open mixer: No such file or directory ). But this works: alsamixer -c 1
</p>

<p>
	 
</p>

<p>
	2. I am not sure if this step is necessary, but I installed<br />
	apt install pulseaudio ( <a href="https://wiki.debian.org/PulseAudio" rel="external nofollow">https://wiki.debian.org/PulseAudio</a> )
</p>

<p>
	 
</p>

<p>
	3. amixer able to find usb sound card
</p>

<p>
	 
</p>

<p>
	4. lsmod | grep snd_usb_audio ( just making sure that snd_usb_audio is loaded )
</p>

<p>
	 
</p>

<p>
	5. We need to add our user ( root and other if You want ) to audio group
</p>

<pre class="ipsCode">usermod -a -G audio root</pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	6. Setting the default device
</p>

<p>
	 
</p>

<p>
	<a href="https://www.alsa-project.org/wiki/Setting_the_default_device" rel="external nofollow">https://www.alsa-project.org/wiki/Setting_the_default_device</a>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents">
		<p>
			 
		</p>

		<p>
			Find your desired card with:
		</p>

		<p>
			   cat /proc/asound/cards
		</p>

		<p>
			and then create /etc/asound.conf with following:
		</p>

		<p>
			   defaults.pcm.card 1<br />
			   defaults.ctl.card 1
		</p>

		<p>
			Replace "1" with number of your card determined above.
		</p>

		<p>
			 
		</p>
	</div>
</blockquote>

<p>
	and reboot the system. Then login again via SSH.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	7. Type in console
</p>

<pre class="ipsCode">modprobe snd-pcm-oss</pre>

<p>
	<br />
	Then add to  /etc/modules ( from new line ) snd-pcm-oss<br />
	or to /etc/<abbr title="Release candidate"><abbr title="Release candidate">rc</abbr></abbr>.local
</p>

<pre class="ipsCode">modprobe snd-pcm-oss</pre>

<p>
	<br />
	8. At this moment You should have /dev/dsp or /dev/dsp1<br />
	You can type
</p>

<pre class="ipsCode">ln -s /dev/dsp1 /dev/dsp</pre>

<p>
	 
</p>

<p>
	to make available sound card for cmus<br />
	 ( otherwise cmus answer with error: opening audio device: No such device  ) You can also, if You want, add to /etc/<abbr title="Release candidate"><abbr title="Release candidate">rc</abbr></abbr>.local ln -s /dev/dsp1 /dev/dsp<br />
	by doing this, it will add a link from /dev/dsp1 to /dev/dsp during boot process
</p>

<p>
	At this moment, your mocp should play.
</p>

<p>
	 
</p>

<p>
	9. Next step is copy config from /usr/share/doc/moc/examples/config.example<br />
	to ~./.moc/config<br />
	and then edit this file to this proposed setting:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents">
		<p>
			OSSDevice = /dev/dsp1 ( or whatever it is, it can be also a /dev/dsp )<br />
			InputBuffer = 1024<br />
			OutputBuffer = 1024<br />
			Prebuffering = 170
		</p>
	</div>
</blockquote>

<p>
	 
</p>

<p>
	Save and close the file.
</p>

<p>
	 
</p>

<p>
	Now you can run mocp and play some file or radio.<br />
	Also, from this moment alsamixer works without arguments.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19750</guid><pubDate>Fri, 28 Jan 2022 08:24:34 +0000</pubDate></item><item><title>Waveshare e-Paper on Orange Pi Zero LTS</title><link>https://forum.armbian.com/topic/13444-waveshare-e-paper-on-orange-pi-zero-lts/</link><description><![CDATA[
<div class="ipsMargin_top">
    
    
    
</div><p>
	I am trying to use a Waveshare e-Paper (2.9") with an Orange Pi Zero LTS. To enable the SPI interface, I have added this to /boot/armbianEnv.txt:
</p>

<pre class="ipsCode">
overlays=spi-add-cs1 spi-spidev
param_spidev_spi_bus=1
param_spidev_max_freq=10000000</pre>

<p>
	and installed WiringPI from <a href="https://github.com/orangepi-xunlong/WiringOP" rel="external nofollow">Github</a>. The e-Paper module is connected to the following GPIO pins:
</p>

<pre class="ipsCode">
VCC: 3.3V
GND: GND
DIN: 19(phys)/11(wPi)
CLK: 23(phys)/14(wPi)
CS: 24(phys)/15(wPi)
DC: 22(phys)/13(wPi)
RST: 3(phys)/0(wPi)
BUSY: 5(phys)/1(wPi)</pre>

<p>
	I have checked the connections by using the gpio command line tool to set all 6 ports above to low and to high, and verifying the output with a multimeter.
</p>

<p>
	 
</p>

<p>
	Then I downloaded the e-Paper software from <a href="https://github.com/waveshare/e-Paper/tree/master/RaspberryPi%26JetsonNano/c" rel="external nofollow">Github</a>, and made it compatible with the Orange Pi via the following changes to lib/Config/DEV_Config.c:
</p>

<pre class="ipsCode">
1. In DEV_Equipment_Testing(void), comment out the code that checks if the file /etc/issue contains the string "Raspian"
2. Set EPD_RST_PIN=0, EPD_DC_PIN=13, EPD_CS_PIN=15, EPD_BUSY_PIN=1.
3. Uncomment "if(wiringPiSetup() &lt; 0)", add a curly open brace, and comment out the line after.
4. Change "wiringPiSPISetup(0,10000000);" into "wiringPiSPISetup(1,10000000);" to use spidev1.0</pre>

<p>
	When I run this e-Paper example, nothing happens on the e-Paper display, although I can detect voltage changes on the GPIO ports with a multimeter. The same software works on a Raspberry Pi without problems. Any hints are appreciated!
</p>
]]></description><guid isPermaLink="false">13444</guid><pubDate>Mon, 23 Mar 2020 21:50:23 +0000</pubDate></item><item><title>Video : Review of the Raspberry Pi 400</title><link>https://forum.armbian.com/topic/19538-video-review-of-the-raspberry-pi-400/</link><description><![CDATA[<p>
	Hi all.<br />
	I've just made a review video about the RPi400.<br />
	I tested RPiOS, Manjaro and Armbian.<br />
	All my gathered info under the video.
</p>

<p>
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/LfooXwG8zXk?feature=oembed"></iframe>
	</div>
</div>

<p>
	Benchmarks
</p>

<pre class="ipsCode">Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender      | Max temp      | C copy backwards      
NanoPi M4 2GB            http://ix.io/3xnJ        Armbian Hirsute xfce4 5.13.12        1.4Ghz/1.8Ghz         7760            1267              1857            10.05         14m41s                 78C    ***    1782.9 MB/s
NanoPi M4 2GB            http://ix.io/3xv3        Armbian Hirsute xfce4 5.13.12        1.5Ghz/2Ghz           8288            1348              2070            10.95         13m21s                        ***    1806.7 MB/s
NanoPi M4 2GB            http://ix.io/3xs3        Armbian Hirsute cinnamon 5.13.12     1.4Ghz/1.8Ghz         7766            1267              1851            10            14m33s                 78C           1742.6 MB/s
NanoPi M4 2GB            http://ix.io/3xt0        Armbian Hirsute budgie 5.13.12       1.4Ghz/1.8Ghz         7941            1272              1863            10.05         14m24s/14m18s          78C           1738.3 MB/s
NanoPi M4 2GB            http://ix.io/3xtR        Armbian Buster xfce4 4.4.213         1.5Ghz/2Ghz           8383            1359              1982            10.8          14m17s                               1377.3 MB/s
NanoPi M4 2GB            http://ix.io/3xuf        Armbian Buster xfce4 4.4.213         1.4Ghz/1.8Ghz         7879            1278              1807            10            15m20s                               1392.3 MB/s           
NanoPi M4 2GB            http://ix.io/3xux        Armbian Focal xfce4 5.10.60          1.4Ghz/1.8Ghz         8028            1286              1859            10.27         13m29s                         ***   1765.3 MB/s
NanoPi M4 2GB            http://ix.io/3xuL        Armbian Focal xfce4 5.10.60          1.5Ghz/2Ghz           8427            1351              2076            11.2          12m53s                         ***   1759.9 MB/s
NanoPi M4 2GB            http://ix.io/3EDB        Ubuntu Xenial armhf 4.4 xfce4        1.4Ghz/1.8Ghz         7069            1140              1695                                                               1387.1 MB/s

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
Odroid C4/HC4            http://ix.io/2LaP        Ubuntu Mate 4.9                      1.91Ghz               7000            1769                              7.2 kH/s                                           2087.5 MB/s
Odroid C4/HC4            http://ix.io/3F6z        Armbian Buster 5.9                   2.10Ghz               7971            2030                              7.9           23m02s                               2020.0 MB/s
Khadas VIM3                                       Armbian Hirsute cinnamon 5.13.12                                                                                           12m55s

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
Raspberry Pi4            http://ix.io/3F6o        Armbian Jammy 5.13                   2Ghz                  8047                              2070             Didn't work  Blender doens't work                 2054.3 MB/s
Raspberry Pi4            http://ix.io/3F6K        Armbian Jammy 5.13                   1.5Ghz                6239                              1572                                                               2556.8 MB/s      
Raspberry Pi4                                     Armbian Hirsute edge xfce4 5.11      1.5Ghz                5832                              1534                          18m11s                   60C
Raspberry Pi4            http://ix.io/3Euw        Armbian Hirsute edge xfce4 5.11      2Ghz                  7747                              2037             9.8          14m26s                   68C         2382.2 MB/s
Raspberry Pi4            http://ix.io/3FbW        Armbian Hirsute 5.11 OC GPU+CPU      2.1Ghz                8168                              2147                          Blender crash                        2445.0 MB/s  
Raspberry Pi4            http://ix.io/3EU7        Armbian Impish edge headless 5.13    1.5Ghz                6251                              1584                          15m39s                               2618.0 MB/s
Raspberry Pi4            http://ix.io/3Ewi        Armbian Impish edge headless 5.13    2Ghz                  8171                              2093                          12m41s                               2713.7 MB/s
Raspberry Pi4            http://ix.io/3EPQ        Armbian Bullseye edge headless 5.13  1.5Ghz                6328                              1594             7.3          Blender doesn't work                 2680.5 MB/s
Raspberry Pi4            http://ix.io/3EK9        Armbian Bullseye edge headless 5.13  2Ghz                  8242                              2096             9.7          Blender doesn't work                 2505.4 MB/s
Raspberry Pi4            http://ix.io/3ECd        Raspberry Pi OS Bullseye 32-bit      1.5Ghz                7577                              1933                          21m09s                               2511.7 MB/s
Raspberry Pi4            http://ix.io/3ECt        Raspberry Pi OS Bullseye 32-bit      2Ghz                  9746                              2533                          17m05s                               2263.0 MB/s
Raspberry Pi4            http://ix.io/3EIe        Raspberry Pi OS Bullseye 64-bit      1.5Ghz                6174                              1567             7.2          17m01s                               2463.5 MB/s
Raspberry Pi4            http://ix.io/3EJs        Raspberry Pi OS Bullseye 64-bit      2Ghz                  8026                              2053             9.65         Blender unstable at 2Ghz             2326.1 MB/s
Raspberry Pi4            http://ix.io/3EGZ        Ubuntu 21.10 (Impish) 5.13 arm64     1.5Ghz                6160                              1563                          16m50s                               2421.2 MB/s
Raspberry Pi4            http://ix.io/3EHA        Ubuntu 21.10 (Impish) 5.13 arm64     2Ghz                  7965                              2038             Didn't work  Blender unstable at 2Ghz             2501.9 MB/s

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
RPi400                   http://ix.io/3HLw        Armbian Jammy Edge 5.15.7 cinnamon   2Ghz o.v. 6           7913                              2085                          19m34s                  69C          2224.5 MB/s 
RPi400                   http://ix.io/3HSI        Armbian Impish current 5.13.0 cin    2Ghz o.v. 6           7869                              2104                          14m20s                  63C          2443.5 MB/s 
RPi400                   http://ix.io/3HTx        Armbian Impish current 5.13.0 cin    2.1Ghz + 700GPU o.v.6 6930                              2069                          13m27s                  65C          1500.0 MB/s
RPi400                   http://ix.io/3HTR        Armbian Impish current 5.13.0 cin    2.1Ghz o.v.6          8188                              2205                          14m03s                  65C          2450.4 MB/s
RPi400                   http://ix.io/3HMm        RPiOS bullseye armhf 5.10.63         1.8Ghz                8705                              2350                          18m46s                  55C          2390.5 MB/s 
RPi400                   http://ix.io/3HRl        RPiOS bullseye armhf 5.10.63         2Ghz o.v. 4           9834                              2601                          17m07s                  61C          2455.0 MB/s 
RPi400                                            Manjaro KDE 5.10                     1.8Ghz                7426                              1886                          14m28s                  58C
RPi400                   http://ix.io/3IgG        Manjaro KDE 5.10                     2Ghz                  8156                              2092                          13m16s                  65C          2473.3 MB/s

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
Odroid N2+               http://ix.io/3EwQ        Armbian Impish xfce4 5.14            2Ghz/2.4Ghz           11714           1765              2517                           8m51s                               2053.0 MB/s
</pre>

<p>
	<br />
	Additional info
</p>

<pre class="ipsCode">Power consumption
-----------------
No wifi/on-board sd-card reader idle               0.45A
Wifi-on-board sd-card reader idle 2Ghz ov 6        0.5A
Wifi-on-board sd-card reader maxed out 2Ghz ov 6   1.3A
Wifi-USB3SD idle 2Ghz ov 6                         0.75A-0.9A
Wifi-USB3SD idle 1.8Ghz                            0.75A-0.9A
Wifi-on-board sd-card reader idle 1.8Ghz           0.5A
Wifi-on-board sd-card reader maxed out 1.8Ghz      1.1A
Wifi-USB3SD maxed out 1.8Ghz                       1.3A 

 
Official Armbian Jammy Nightly 5.15 has no GPU acceleration
Images from RPardini do have GPU acceleration, but no sound

Manjaro KDE is nice. Works well, except video playback in browser. Max 720p.

++ Good cooling solution, doesn't overheat even at high overclocks
++ the Pi 400 is the first in the line of Raspberry Pi products to have an on/off power button
   This is done by pressing Fn+F10. To restore power, you press the pair of buttons for two seconds
++ Default clock of 1.8Ghz vs 1.5Ghz on RPi4 performs 20% better. OC to 2Ghz 30% more performance than 1.5Ghz

-- Bad keyboard
-- Bad arrangement of the cursor keys
-- SD-card reader still rather slow with max 45MB/s. Better to use a sd-&gt;USB3 adapter for fast sd-cards
-- Still the undervoltage problem as with all other RPi devices when using a normal PSU. PSU's that deliver 5.3V perform best.

*** GPU overclock makes it perform worse
*** SD-card slot isn't very fast 45MB/s vs 90MB/s with the same card in sd-&gt;USB3 adapter</pre>

<p>
	<br />
	<br />
	<br />
	<br />
	 
</p>
]]></description><guid isPermaLink="false">19538</guid><pubDate>Sun, 19 Dec 2021 15:10:31 +0000</pubDate></item><item><title>Guide to adjust armbian configuration</title><link>https://forum.armbian.com/topic/19588-guide-to-adjust-armbian-configuration/</link><description><![CDATA[<p>
	Hello Everyone
</p>

<p>
	 
</p>

<p>
	This is my first topic here. To help myself in the future I did a guide to adjust armbian configuration and settings. This guide contains topics like:
</p>

<ul>
	<li>
		Maintaining the board updated
	</li>
	<li>
		Adjusting personal settings (keyboard, timezone, locale)
	</li>
	<li>
		Setting the sound output (default sound output to HDMI)
	</li>
	<li>
		Disable the desktop environment
	</li>
	<li>
		Setting the numlock to "ON" at start up
	</li>
	<li>
		Dealing with 4k video resolution
	</li>
</ul>

<p>
	 
</p>

<p>
	It was based on my experience dealing with Orangepi PC (H3), but many things could be reused to others boards.
</p>

<p>
	 
</p>

<p>
	I hope this guide may be helpful: <a href="https://github.com/lbmendes/armbian-settings/blob/main/README.md" rel="external nofollow">https://github.com/lbmendes/armbian-settings/blob/main/README.md</a>
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19588</guid><pubDate>Sat, 01 Jan 2022 22:30:13 +0000</pubDate></item><item><title>Video : Armbian on x86/AMD64 - Radxa Rock Pi X</title><link>https://forum.armbian.com/topic/19580-video-armbian-on-x86amd64-radxa-rock-pi-x/</link><description><![CDATA[<p>
	Hi all.<br />
	In my latest video I test an Armbian image for X86/AMD64.<br />
	I try it on the Rock Pi X.<br />
	This also works on any other x86 pc.<br />
	This is just a preview of what is possible. It is not an official release in any way.<br />
	Armbian is only supported on ARM single board computer.<br />
	But hell it is nice to use it on this too.<br />
	Big thanks to all the Armbian developers.<br />
	Greetings, NicoD
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/HoPfAm5_pjw?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19580</guid><pubDate>Thu, 30 Dec 2021 17:11:07 +0000</pubDate></item><item><title>Video : Armbian North-America and the work Lanufu does for it</title><link>https://forum.armbian.com/topic/19193-video-armbian-north-america-and-the-work-lanufu-does-for-it/</link><description><![CDATA[<p>
	Hi all.
</p>

<p>
	In this episode <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/1231-lanefu/?do=hovercard" data-mentionid="1231" href="https://forum.armbian.com/profile/1231-lanefu/" rel="">@lanefu</a> explains what he does for Armbian, what gear he uses, and why. It is a must see video.<br />
	Enjoy
</p>

<p>
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/PyUzbWWPq2Y?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19193</guid><pubDate>Tue, 02 Nov 2021 11:00:53 +0000</pubDate></item><item><title>Video : Armbian for the Raspberry Pi 4 ! ! ! Preview ! ! !</title><link>https://forum.armbian.com/topic/19305-video-armbian-for-the-raspberry-pi-4-preview/</link><description><![CDATA[<p>
	Hi all.<br />
	You might have already heard. Armbian is aiming to support the Raspberry Pi4. <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/17288-rpardini/?do=hovercard" data-mentionid="17288" href="https://forum.armbian.com/profile/17288-rpardini/" rel="">@rpardini</a> already made well working images for it.<br />
	In this video I talk about why we would want Armbian for the RPi4, and I show you around in Armbian Jammy 5.13 for the RPi4.<br />
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/E0IWKRiiYVU?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>

<p>
	We do need to find someone who wants to take the task on him/her to be maintainer for RaspberryPi4 at Armbian.<br />
	For this you need one spare board that can be used for testing when new release are made.<br />
	Here some info I gathered.<br />
	<br />
	 
</p>

<pre class="ipsCode">Raspberry Pi 4 cooled with big heatsink on SoC and fan on-top

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender      | Max temp      | C copy backwards      
NanoPi M4 2GB            http://ix.io/3xnJ        Armbian Hirsute xfce4 5.13.12        1.4Ghz/1.8Ghz         7760            1267              1857            10.05         14m41s                 78C    ***    1782.9 MB/s
NanoPi M4 2GB            http://ix.io/3xv3        Armbian Hirsute xfce4 5.13.12        1.5Ghz/2Ghz           8288            1348              2070            10.95         13m21s                        ***    1806.7 MB/s
NanoPi M4 2GB            http://ix.io/3xs3        Armbian Hirsute cinnamon 5.13.12     1.4Ghz/1.8Ghz         7766            1267              1851            10            14m33s                 78C           1742.6 MB/s
NanoPi M4 2GB            http://ix.io/3xt0        Armbian Hirsute budgie 5.13.12       1.4Ghz/1.8Ghz         7941            1272              1863            10.05         14m24s/14m18s          78C           1738.3 MB/s
NanoPi M4 2GB            http://ix.io/3xtR        Armbian Buster xfce4 4.4.213         1.5Ghz/2Ghz           8383            1359              1982            10.8          14m17s                               1377.3 MB/s
NanoPi M4 2GB            http://ix.io/3xuf        Armbian Buster xfce4 4.4.213         1.4Ghz/1.8Ghz         7879            1278              1807            10            15m20s                               1392.3 MB/s           
NanoPi M4 2GB            http://ix.io/3xux        Armbian Focal xfce4 5.10.60          1.4Ghz/1.8Ghz         8028            1286              1859            10.27         13m29s                         ***   1765.3 MB/s
NanoPi M4 2GB            http://ix.io/3xuL        Armbian Focal xfce4 5.10.60          1.5Ghz/2Ghz           8427            1351              2076            11.2          12m53s                         ***   1759.9 MB/s
NanoPi M4 2GB            http://ix.io/3EDB        Ubuntu Xenial armhf 4.4 xfce4        1.4Ghz/1.8Ghz         7069            1140              1695                                                               1387.1 MB/s

Board                  | SBC-Bench              | Distro                             | Clockspeeds         | 7z all cores  | 7z small core   | 7z big core   | CPU-Miner   | NicoD-Blender         | Max temp
Odroid C4/HC4            http://ix.io/2LaP        Ubuntu Mate 4.9                      1.91Ghz               7000            1769                              7.2 kH/s                                           2087.5 MB/s
Odroid C4/HC4            http://ix.io/3F6z        Armbian Buster 5.9                   2.10Ghz               7971            2030                              7.9           23m02s                               2020.0 MB/s
Khadas VIM3                                       Armbian Hirsute cinnamon 5.13.12                                                                                           12m55s

Raspberry Pi4            http://ix.io/3F6o        Armbian Jammy 5.13                   2Ghz                  8047                              2070             Didn't work  Blender doens't work                 2054.3 MB/s
Raspberry Pi4            http://ix.io/3F6K        Armbian Jammy 5.13                   1.5Ghz                6239                              1572                                                               2556.8 MB/s      
Raspberry Pi4                                     Armbian Hirsute edge xfce4 5.11      1.5Ghz                5832                              1534                          18m11s                   60C
Raspberry Pi4            http://ix.io/3Euw        Armbian Hirsute edge xfce4 5.11      2Ghz                  7747                              2037             9.8          14m26s                   68C         2382.2 MB/s
Raspberry Pi4            http://ix.io/3FbW        Armbian Hirsute 5.11 OC GPU+CPU      2.1Ghz                8168                              2147                          Blender crash                        2445.0 MB/s  
Raspberry Pi4            http://ix.io/3EU7        Armbian Impish edge headless 5.13    1.5Ghz                6251                              1584                          15m39s                               2618.0 MB/s
Raspberry Pi4            http://ix.io/3Ewi        Armbian Impish edge headless 5.13    2Ghz                  8171                              2093                          12m41s                               2713.7 MB/s
Raspberry Pi4            http://ix.io/3EPQ        Armbian Bullseye edge headless 5.13  1.5Ghz                6328                              1594             7.3          Blender doesn't work                 2680.5 MB/s
Raspberry Pi4            http://ix.io/3EK9        Armbian Bullseye edge headless 5.13  2Ghz                  8242                              2096             9.7          Blender doesn't work                 2505.4 MB/s
Raspberry Pi4            http://ix.io/3ECd        Raspberry Pi OS Bullseye 32-bit      1.5Ghz                7577                              1933                          21m09s                               2511.7 MB/s
Raspberry Pi4            http://ix.io/3ECt        Raspberry Pi OS Bullseye 32-bit      2Ghz                  9746                              2533                          17m05s                               2263.0 MB/s
Raspberry Pi4            http://ix.io/3EIe        Raspberry Pi OS Bullseye 64-bit      1.5Ghz                6174                              1567             7.2          17m01s                               2463.5 MB/s
Raspberry Pi4            http://ix.io/3EJs        Raspberry Pi OS Bullseye 64-bit      2Ghz                  8026                              2053             9.65         Blender unstable at 2Ghz             2326.1 MB/s
Raspberry Pi4            http://ix.io/3EGZ        Ubuntu 21.10 (Impish) 5.13 arm64     1.5Ghz                6160                              1563                          16m50s                               2421.2 MB/s
Raspberry Pi4            http://ix.io/3EHA        Ubuntu 21.10 (Impish) 5.13 arm64     2Ghz                  7965                              2038             Didn't work  Blender unstable at 2Ghz             2501.9 MB/s

Odroid N2+               http://ix.io/3EwQ        Armbian Impish xfce4 5.14            2Ghz/2.4Ghz           11714           1765              2517                           8m51s                               2053.0 MB/s

Raspberry Pi4 SD-&gt;USB3 with SandDisk Extreme                           89.7 MB/s read     
              SD with on-board sd-card reader Sandisk Extreme          45.4 MB/s read (rather slow compared to 70MB/s for M4)

RPi4 fastest memory, then N2+, then M4(lpddr3)

Armbian Impish                                 2.93.5
Raspberry Pi OS Bulsseye 32-bit/64-bit blender 2.83.5
Ubuntu 21.10 Blender                           2.93.3
Armbian Jammy Blender goesn't work / bug 

*** Ubuntu 21.10 unstable when installing ubuntu-mate-desktop, Unity very slow

Armbian on RPi4 pro's
+ Having the same platform for RPi and other Armbian supported boards
+ Reliability/ stable
+ ARM64 vs armhf of RaspberryPiOS/Ubuntu unstable at high clocks and a lot of bugs and hangs
+ Ubuntu and Debian images and all their versions
+ Great for server tasks
+ Customizable
+ You can build your own RPi4 images with whatever modules you need

Armbian on RPi4 con's
- Not great for desktop use (yet)
- No VPU drivers, video playback firefox ok up to 720p
- Audio glitchy, no audio on some images like Jammy 
 
*** For audio install pavucontrol
*** On-board wifi and dongles don't work with the Armbian Impish and Bullseye images. Dongles work on Hirsute. I guess kernel issue 5.13 -&gt; 5.11
*** Armbian Bullseye 5.13 USB not always working

Install desktops
sudo apt install xfce4 (ubuntu-mate-desktop, kubuntu-desktop, lubuntu-desktop, ubuntu-desktop, ...)
sudo apt install lightdm
sudo apt install lightdm-gtk-greeter
sudo apt install pavucontrol
sudo apt install xinit

Power draw at 5.3V headless 
1.5Ghz with fan maxed out        0.95A 
2Ghz with fan maxed out          1.10A

To do 
- M4 Impish
- Gather the info I've got from other boards and my pc's
</pre>

<p>
	<br />
	And for those who don't like watching a video, here a short text of what I talk about.<br />
	<br />
	 
</p>

<pre class="ipsCode">What is Armbian? What is the Armbian build framework which is one of the valued pro's compared to RPiOS?
Why Armbian for RPi4? For software compatibillity with other Armbian supported SBCs, Reliabillity, ARM64, Ubuntu and Debian and their versions, great for server tasks... 
Accentuate this is only a preview, not full release or supported
Show Armbian download page
Show the NanoPi M4 and Odroid N2+, talk about their specs(short)
Difference between other SBCs and RPi/ThreadX - Under Voltage problems/eMMC and NVMe possible on others(better I/O)
What doesn't work yet on Armbian for RPi4. Wifi, BT and HDMI sound
Show Armbian Impish, show htop, install desktops, 
Benchmarks between different OS's. Explain they aren't worth much since, different versions of software, different architecture armhf vs arm64, 7zip multicore doesn't play well on different sized clusters, and doesn't always give exact the same result...
!!!Test the performance of the software you use to know if this is the correct tool for you!!!
Show different desktop environments installed on Armbian - Not the Armbian default desktops - mate doesn't work great, xfce4 works ok, kde works but is slow(newer version should improve that soon)Change openGL2-&gt;OpenGL3, ...
Performance of I/O. Better to use a good but cheap usb3 sd-card reader than on-board sd-card reader. ssd/NVMe-&gt;USB3 even better.
???Would you like to become RPi4 Armbian maintainer??? Or for another board???
Conclusion. Good for RPi community to have even more choice. Good for Armbian community to be able to use the same software on their RPi devices as on their others. Good for Armbian to reach more people and have more awareness about other boards. Having a good build environment to build your own images/kernels/patches for the RPi4.</pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19305</guid><pubDate>Thu, 18 Nov 2021 08:49:53 +0000</pubDate></item><item><title>fbtft with device tree overlay on mainline</title><link>https://forum.armbian.com/topic/13221-fbtft-with-device-tree-overlay-on-mainline/</link><description><![CDATA[<p>
	Finally I got my lcd (some of them) to work with armbian on mainline kernel (5.4) using device tree overlay. It should be working on 4.19 kernel too.
</p>

<p>
	I test mine on orange pi zero. The one I am able to get working is ili9341 and st7735 based lcd.
</p>

<p>
	I'll add more detail later but for now I'd like to get this out.
</p>

<p>
	 
</p>

<p>
	<strong>edit 1 </strong><span><strong>:</strong><br>
	Adding ssd1306 and nokia 5110 overlay to the repo</span>
</p>

<p>
	 
</p>

<p>
	<a href="https://github.com/nuhamind2/fbtft-dt-overlay" rel="external nofollow">device tree overlay</a>
</p>
]]></description><guid isPermaLink="false">13221</guid><pubDate>Sun, 01 Mar 2020 03:03:21 +0000</pubDate></item><item><title>Playing With a Fan on an NanoPi M4V2</title><link>https://forum.armbian.com/topic/19050-playing-with-a-fan-on-an-nanopi-m4v2/</link><description><![CDATA[<p>
	I think this qualifies as a hardware hack? Certainly amuses me. Hopefully others enjoy it as well.
</p>

<p>
	 
</p>

<p>
	So never quite got my 3.5 mm audio jack working properly on my M4V2 (though others reportedly did). But did find a way to get audible tones from the PWM fan control by playing with the PWM period, so decided to see if I could get music out of my M4V2 in another way ...
</p>

<p>
	 
</p>

<p>
	What follows is interesting exploration of:
</p>

<ul>
	<li>
		Finding interesting ways to repurpose <a href="https://www.androidpimp.com/embedded/nanopi-m4-metal-case/" rel="external nofollow">NanoPi M4 Cases</a>
	</li>
	<li>
		Loading <a href="https://pypi.org/project/MIDIFile/" rel="external nofollow">MIDI</a> files in python3
	</li>
	<li>
		Brushing up on <a href="https://pages.mtu.edu/~suits/notefreqs.html" rel="external nofollow">music theory</a>
	</li>
	<li>
		Finding some free and appropriate <a href="https://midisfree.com/download/bach-johann-sebastian-toccata-and-fugue-bwv-565-mid/" rel="external nofollow">Halloween Music</a>
	</li>
</ul>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$ sudo install pip3
$ sudo pip3 install MIDIFile
$ sudo ./fanplay.py Bach.\ Johann\ Sebastian\ -\ Toccata\ And\ Fugue\ \(Bwv\ 565\)___WWW.MIDISFREE.COM.mid</span></pre>

<p>
	 
</p>

<p>
	This little diversion brought to you by:
</p>

<ul>
	<li>
		Armbian
	</li>
	<li>
		FriendlyElec
	</li>
	<li>
		Python
	</li>
	<li>
		A few spare hours on a weekend
	</li>
</ul>

<p>
	 
</p>

<p>
	Might try to play around with this a bit more at some point. Notably does not play Backstreet Boys (was asked to try). But does more or less work, at least on this one track.
</p>

<p>
	 
</p>

<p>
	Enjoy
</p>
<p>
<a class="ipsAttachLink" href="https://forum.armbian.com/applications/core/interface/file/attachment.php?id=8331&amp;key=cf37c846e044d7e0c04eb3b69e1c8327" data-fileExt='py' data-fileid='8331' data-filekey='cf37c846e044d7e0c04eb3b69e1c8327'>fanplay.py</a></p>]]></description><guid isPermaLink="false">19050</guid><pubDate>Mon, 04 Oct 2021 21:43:15 +0000</pubDate></item><item><title>Intelligent access control based on ESP32 and LCD</title><link>https://forum.armbian.com/topic/19020-intelligent-access-control-based-on-esp32-and-lcd/</link><description><![CDATA[<p>
	<strong>Required materials</strong>
</p>

<p>
	 
</p>

<ul>
	<li>
		<a href="https://www.espressif.com/en/products/socs/esp32" rel="external nofollow">ESP32</a>
	</li>
	<li>
		KOB electronic lock
	</li>
	<li>
		Relay
	</li>
	<li>
		<a href="https://www.stoneitech.com/" rel="external nofollow">STONE STWI070WT-01 display</a>
	</li>
	<li>
		<a href="https://www.amazon.com/SunFounder-Mifare-Reader-Arduino-Raspberry/dp/B07KGBJ9VG" rel="external nofollow">MFRC522 module</a>
	</li>
</ul>

<p>
	 
</p>

<p>
	<strong>Realized function</strong><br />
	<br />
	1. card registration.<br />
	2. username and password registration.<br />
	3. card swipe to unlock the electronic lock.<br />
	4. User name and password to unlock the electronic lock.<br />
	<br />
	<strong>Connection diagram</strong>
</p>

<p>
	 
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="8316" data-ratio="51.40" width="500" alt="connection.jpg.bfe4b883c447eb26d891e3b31532d24c.jpg" src="https://forum.armbian.com/uploads/monthly_2021_09/connection.jpg.bfe4b883c447eb26d891e3b31532d24c.jpg" />
</p>

<p>
	 
</p>

<p>
	<strong>GUI design</strong>
</p>

<p>
	 
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="8317" data-ratio="54.20" width="500" alt="1035898903_GUIdesign.png.738bbcd94b574f5c67a6ea20fa6952e2.png" src="https://forum.armbian.com/uploads/monthly_2021_09/1035898903_GUIdesign.png.738bbcd94b574f5c67a6ea20fa6952e2.png" />
</p>

<p>
	 
</p>

<p>
	<strong>Code sharing</strong>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint prettyprinted"><span class="kwd">import</span><span class="pln"> mfrc522
</span><span class="kwd">import</span><span class="pln"> time
</span><span class="kwd">import</span><span class="pln"> _thread
</span><span class="kwd">from</span><span class="pln"> os </span><span class="kwd">import</span><span class="pln"> uname
</span><span class="kwd">from</span><span class="pln"> machine </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Pin</span><span class="pun">,</span><span class="pln"> UART
</span><span class="com">#from pyb import UART</span><span class="pln">
</span><span class="com">#import machine</span><span class="pln">

suos </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Pin</span><span class="pun">(</span><span class="lit">32</span><span class="pun">,</span><span class="typ">Pin</span><span class="pun">.</span><span class="pln">OUT</span><span class="pun">)</span><span class="pln">
uart2 </span><span class="pun">=</span><span class="pln"> UART</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> baudrate</span><span class="pun">=</span><span class="lit">115200</span><span class="pun">,</span><span class="pln"> rx</span><span class="pun">=</span><span class="lit">16</span><span class="pun">,</span><span class="pln">tx</span><span class="pun">=</span><span class="lit">17</span><span class="pun">,</span><span class="pln">timeout</span><span class="pun">=</span><span class="lit">10</span><span class="pun">)</span><span class="pln">

ESP32_HSPI_CLOCK </span><span class="pun">=</span><span class="pln"> </span><span class="lit">14</span><span class="pln">
ESP32_HSPI_SLAVE_SELECT </span><span class="pun">=</span><span class="pln"> </span><span class="lit">15</span><span class="pln">
ESP32_HSPI_MISO </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pln">
ESP32_HSPI_MOSI </span><span class="pun">=</span><span class="pln"> </span><span class="lit">13</span><span class="pln">
ESP32_MFRC522_RST </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln">

rx3 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
rx_name </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
user_id_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
password_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
temp_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
temp_mima </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
personnel_id </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">'zbw'</span><span class="pun">:[</span><span class="lit">236</span><span class="pun">,</span><span class="lit">230</span><span class="pun">,</span><span class="lit">169</span><span class="pun">,</span><span class="lit">47</span><span class="pun">],</span><span class="str">'lbw'</span><span class="pun">:[</span><span class="lit">19</span><span class="pun">,</span><span class="lit">165</span><span class="pun">,</span><span class="lit">93</span><span class="pun">,</span><span class="lit">4</span><span class="pun">]}</span><span class="pln">
personnel_ps </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">'zbw'</span><span class="pun">:</span><span class="str">'zbw3366'</span><span class="pun">,</span><span class="str">'lbw'</span><span class="pun">:</span><span class="str">'lbwnb'</span><span class="pun">}</span><span class="pln">
admin_password </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="str">'yyds'</span><span class="pun">)</span><span class="pln">
button_cmd </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">16</span><span class="pun">,</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
edit1_cmd </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">16</span><span class="pun">,</span><span class="lit">112</span><span class="pun">]</span><span class="pln">
edit2_cmd </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">16</span><span class="pun">,</span><span class="lit">113</span><span class="pun">]</span><span class="pln">
edit3_cmd </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">16</span><span class="pun">,</span><span class="lit">114</span><span class="pun">]</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> uname</span><span class="pun">()[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'esp32'</span><span class="pun">:</span><span class="pln">
	rdr </span><span class="pun">=</span><span class="pln"> mfrc522</span><span class="pun">.</span><span class="pln">MFRC522</span><span class="pun">(</span><span class="pln">ESP32_HSPI_CLOCK</span><span class="pun">,</span><span class="pln"> ESP32_HSPI_MOSI</span><span class="pun">,</span><span class="pln"> ESP32_HSPI_MISO</span><span class="pun">,</span><span class="pln"> ESP32_MFRC522_RST</span><span class="pun">,</span><span class="pln"> ESP32_HSPI_SLAVE_SELECT</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> do_write</span><span class="pun">():</span><span class="pln">
	</span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
		</span><span class="pun">(</span><span class="pln">stat</span><span class="pun">,</span><span class="pln"> tag_type</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">request</span><span class="pun">(</span><span class="pln">rdr</span><span class="pun">.</span><span class="pln">REQIDL</span><span class="pun">)</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> stat </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
			</span><span class="pun">(</span><span class="pln">stat</span><span class="pun">,</span><span class="pln"> raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">anticoll</span><span class="pun">()</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> stat </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"New card detected"</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"  - tag type: 0x%02x"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> tag_type</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"  - uid : 0x%02x%02x%02x%02x"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]))</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="str">""</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">select_tag</span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
					key </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">]</span><span class="pln">
					</span><span class="kwd">if</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">auth</span><span class="pun">(</span><span class="pln">rdr</span><span class="pun">.</span><span class="pln">AUTHENT1A</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> key</span><span class="pun">,</span><span class="pln"> raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
						stat </span><span class="pun">=</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> b</span><span class="str">"\x00\x53\x00\x54\x00\x4F\x00\x4E\x00\x45\x0a\x0b\x0c\x0d\x0e\x0f"</span><span class="pun">)</span><span class="pln">
						rdr</span><span class="pun">.</span><span class="pln">stop_crypto1</span><span class="pun">()</span><span class="pln">
						</span><span class="kwd">if</span><span class="pln"> stat </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
							</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Data written to card"</span><span class="pun">)</span><span class="pln">
						</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
							</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Failed to write data to card"</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
						</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Authentication error"</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Failed to select tag"</span><span class="pun">)</span><span class="pln">

	</span><span class="kwd">except</span><span class="pln"> </span><span class="typ">KeyboardInterrupt</span><span class="pun">:</span><span class="pln">
		</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"write error"</span><span class="pun">)</span><span class="pln">


</span><span class="kwd">def</span><span class="pln"> do_read</span><span class="pun">():</span><span class="pln">
	</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
		</span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
			</span><span class="pun">(</span><span class="pln">stat</span><span class="pun">,</span><span class="pln"> tag_type</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">request</span><span class="pun">(</span><span class="pln">rdr</span><span class="pun">.</span><span class="pln">REQIDL</span><span class="pun">)</span><span class="pln">

			</span><span class="kwd">if</span><span class="pln"> stat </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
				</span><span class="pun">(</span><span class="pln">stat</span><span class="pun">,</span><span class="pln"> raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">anticoll</span><span class="pun">()</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> stat </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"New card detected"</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"  - tag type: 0x%02x"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> tag_type</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"  - uid   : 0x%02x%02x%02x%02x"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]))</span><span class="pln">
					</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">3</span><span class="pun">])</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">""</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">if</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">select_tag</span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln"> 
						key </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">]</span><span class="pln">
						</span><span class="kwd">if</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">auth</span><span class="pun">(</span><span class="pln">rdr</span><span class="pun">.</span><span class="pln">AUTHENT1A</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> key</span><span class="pun">,</span><span class="pln"> raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
							</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Address 8 data: %s"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">8</span><span class="pun">))</span><span class="pln">
							</span><span class="kwd">for</span><span class="pln"> ps </span><span class="kwd">in</span><span class="pln"> personnel_id</span><span class="pun">:</span><span class="pln">
								</span><span class="kwd">if</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">:</span><span class="lit">4</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> personnel_id</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">ps</span><span class="pun">):</span><span class="pln">
									suos</span><span class="pun">.</span><span class="pln">value</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
									</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">ps</span><span class="pun">)</span><span class="pln">
									uart_write</span><span class="pun">(</span><span class="pln">ps</span><span class="pun">,</span><span class="pln"> </span><span class="pun">*</span><span class="pln">raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">:</span><span class="lit">4</span><span class="pun">:</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
									time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
									uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">
									</span><span class="kwd">break</span><span class="pln">
							rdr</span><span class="pun">.</span><span class="pln">stop_crypto1</span><span class="pun">()</span><span class="pln">
							time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
							suos</span><span class="pun">.</span><span class="pln">value</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">
						</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
							</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Authentication error"</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
						</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Failed to select tag"</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">any</span><span class="pun">()&gt;</span><span class="lit">1</span><span class="pun">:</span><span class="pln">
				rx2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
				data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
				bin_data </span><span class="pun">=</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">40</span><span class="pun">)</span><span class="pln">
				uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">
				rx1 </span><span class="pun">=</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">bin_data</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">for</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> rx1</span><span class="pun">:</span><span class="pln">
					rx2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">chr</span><span class="pun">(</span><span class="pln">item</span><span class="pun">))</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">rx2</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">3</span><span class="pun">:</span><span class="lit">5</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> button_cmd</span><span class="pun">:</span><span class="pln">
					data_name_len </span><span class="pun">=</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
					data_name </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">7</span><span class="pun">:</span><span class="pln">data_name_len</span><span class="pun">+</span><span class="lit">7</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
					data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_name</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_name2</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">if</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'back3'</span><span class="pun">:</span><span class="pln">
						</span><span class="kwd">return</span><span class="pln">
		</span><span class="kwd">except</span><span class="pln"> </span><span class="typ">KeyboardInterrupt</span><span class="pun">:</span><span class="pln">
			</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"read error"</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> do_read2 </span><span class="pun">(</span><span class="pln">idd</span><span class="pun">):</span><span class="pln">
	</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">idd</span><span class="pun">)</span><span class="pln">
	</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
		</span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
			</span><span class="pun">(</span><span class="pln">stat</span><span class="pun">,</span><span class="pln"> tag_type</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">request</span><span class="pun">(</span><span class="pln">rdr</span><span class="pun">.</span><span class="pln">REQIDL</span><span class="pun">)</span><span class="pln">

			</span><span class="kwd">if</span><span class="pln"> stat </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
				</span><span class="pun">(</span><span class="pln">stat</span><span class="pun">,</span><span class="pln"> raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">anticoll</span><span class="pun">()</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> stat </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"New card detected"</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"  - tag type: 0x%02x"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> tag_type</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"  - uid   : 0x%02x%02x%02x%02x"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]))</span><span class="pln">
					</span><span class="kwd">print</span><span class="pln"> </span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">1</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">2</span><span class="pun">],</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">3</span><span class="pun">])</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="str">""</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">if</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">select_tag</span><span class="pun">(</span><span class="pln">raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln"> 
						key </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xFF</span><span class="pun">]</span><span class="pln">
						</span><span class="kwd">if</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">auth</span><span class="pun">(</span><span class="pln">rdr</span><span class="pun">.</span><span class="pln">AUTHENT1A</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> key</span><span class="pun">,</span><span class="pln"> raw_uid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">OK</span><span class="pun">:</span><span class="pln">
							</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Address 8 data: %s"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> rdr</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">8</span><span class="pun">))</span><span class="pln">
							personnel_id</span><span class="pun">[</span><span class="pln">idd</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">:</span><span class="lit">4</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
							uart_write3</span><span class="pun">(*</span><span class="pln">raw_uid</span><span class="pun">[</span><span class="lit">0</span><span class="pun">:</span><span class="lit">4</span><span class="pun">:</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
							rdr</span><span class="pun">.</span><span class="pln">stop_crypto1</span><span class="pun">()</span><span class="pln">
						</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
							</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Authentication error"</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
						</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Failed to select tag"</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">any</span><span class="pun">()&gt;</span><span class="lit">1</span><span class="pun">:</span><span class="pln">
				rx2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
				data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
				bin_data </span><span class="pun">=</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">40</span><span class="pun">)</span><span class="pln">
				uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">
				rx1 </span><span class="pun">=</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">bin_data</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">for</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> rx1</span><span class="pun">:</span><span class="pln">
					rx2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">chr</span><span class="pun">(</span><span class="pln">item</span><span class="pun">))</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">3</span><span class="pun">:</span><span class="lit">5</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> button_cmd</span><span class="pun">:</span><span class="pln">
					data_name_len </span><span class="pun">=</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
					data_name </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">7</span><span class="pun">:</span><span class="pln">data_name_len</span><span class="pun">+</span><span class="lit">7</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
					data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_name</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_name2</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'back1'</span><span class="pun">:</span><span class="pln">
					</span><span class="kwd">return</span><span class="pln">

		</span><span class="kwd">except</span><span class="pln"> </span><span class="typ">KeyboardInterrupt</span><span class="pun">:</span><span class="pln">
			</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"read error"</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> uart_write</span><span class="pun">(</span><span class="pln">text</span><span class="pun">,</span><span class="pln"> </span><span class="pun">*</span><span class="pln">ids</span><span class="pun">):</span><span class="pln">
</span><span class="com">#	print(text, *ids)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardname1","text":"'</span><span class="pun">+</span><span class="pln">str</span><span class="pun">(</span><span class="pln">text</span><span class="pun">)+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid1","text":"'</span><span class="pun">+</span><span class="pln">str</span><span class="pun">(</span><span class="pln">ids</span><span class="pun">)+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_visible","type":"widget","widget":"lock1","visible":true}&gt;ET'</span><span class="pun">)</span><span class="pln">
	time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardname1","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid1","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_visible","type":"widget","widget":"lock1","visible":false}&gt;ET'</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> uart_write2</span><span class="pun">(</span><span class="pln">text</span><span class="pun">,</span><span class="pln">text2</span><span class="pun">):</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'</span><span class="pun">+</span><span class="pln">text</span><span class="pun">+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'</span><span class="pun">+</span><span class="pln">text2</span><span class="pun">+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"edit2","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> uart_write3</span><span class="pun">(*</span><span class="pln">id2</span><span class="pun">):</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'</span><span class="pun">+</span><span class="pln">str</span><span class="pun">(</span><span class="pln">id2</span><span class="pun">)+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> uart_write4</span><span class="pun">(</span><span class="pln">text</span><span class="pun">,</span><span class="pln">text2</span><span class="pun">):</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"login","text":"'</span><span class="pun">+</span><span class="pln">text</span><span class="pun">+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"login","text":"'</span><span class="pun">+</span><span class="pln">text2</span><span class="pun">+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"edit3","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"edit4","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"edit7","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> uart_write5</span><span class="pun">():</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'</span><span class="pun">+</span><span class="pln">str</span><span class="pun">(</span><span class="pln">id2</span><span class="pun">)+</span><span class="str">'"}&gt;ET'</span><span class="pun">)</span><span class="pln">
	time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
	uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"cardid","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> card_zhuce</span><span class="pun">():</span><span class="pln">
	</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">any</span><span class="pun">():</span><span class="pln">
			user_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
			password </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
			rx2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
			rx_num </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
			bin_data </span><span class="pun">=</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">40</span><span class="pun">)</span><span class="pln">
			uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">
			rx1 </span><span class="pun">=</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">bin_data</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">for</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> rx1</span><span class="pun">:</span><span class="pln">
				rx2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">chr</span><span class="pun">(</span><span class="pln">item</span><span class="pun">))</span><span class="pln">
				rx_num </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
			data_end </span><span class="pun">=</span><span class="pln"> rx_num</span><span class="pun">-</span><span class="lit">5</span><span class="pln">
			data_id_st </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">8</span><span class="pun">:</span><span class="lit">13</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
			data_id_st2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st2</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> data_id_st2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'edit1'</span><span class="pun">:</span><span class="pln">
				data_id_st3 </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">15</span><span class="pun">:</span><span class="pln">data_end</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_id_st4 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st3</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st4</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> data_id_st4 </span><span class="pun">!=</span><span class="pln"> </span><span class="str">''</span><span class="pun">:</span><span class="pln">
					name </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
			</span><span class="kwd">elif</span><span class="pln"> data_id_st2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'edit2'</span><span class="pun">:</span><span class="pln">
				data_id_st5 </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">15</span><span class="pun">:</span><span class="pln">data_end</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_id_st6 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st5</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> data_id_st6 </span><span class="pun">==</span><span class="pln"> admin_password</span><span class="pun">:</span><span class="pln">
					admin </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
					uart_write2</span><span class="pun">(</span><span class="str">'Verification passed!'</span><span class="pun">,</span><span class="str">'Please place the card!'</span><span class="pun">)</span><span class="pln">
					do_read2</span><span class="pun">(</span><span class="pln">data_id_st4</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">return</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> mima_zuce</span><span class="pun">():</span><span class="pln">
	temp_id3 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
	temp_mima3 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
	</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">any</span><span class="pun">():</span><span class="pln">
			user_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
			password </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
			rx2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
			rx_num </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="com">#			data_end = 0</span><span class="pln">
			bin_data </span><span class="pun">=</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">40</span><span class="pun">)</span><span class="pln">
			uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">
			rx1 </span><span class="pun">=</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">bin_data</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">for</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> rx1</span><span class="pun">:</span><span class="pln">
				rx2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">chr</span><span class="pun">(</span><span class="pln">item</span><span class="pun">))</span><span class="pln">
				rx_num </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="com">#				if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '&gt;'):</span><span class="pln">
</span><span class="com">#					break</span><span class="pln">
			data_end </span><span class="pun">=</span><span class="pln"> rx_num</span><span class="pun">-</span><span class="lit">5</span><span class="pln">
			data_id_st </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">8</span><span class="pun">:</span><span class="lit">13</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
			data_id_st2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st2</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">3</span><span class="pun">:</span><span class="lit">5</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> button_cmd</span><span class="pun">:</span><span class="pln">
				data_name_len </span><span class="pun">=</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
				data_name </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">7</span><span class="pun">:</span><span class="pln">data_name_len</span><span class="pun">+</span><span class="lit">7</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_name</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_name2</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'back2'</span><span class="pun">:</span><span class="pln">
					</span><span class="kwd">return</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> data_id_st2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'edit3'</span><span class="pun">:</span><span class="pln">
				data_id_st3 </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">15</span><span class="pun">:</span><span class="pln">data_end</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_id_st4 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st3</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st4</span><span class="pun">)</span><span class="pln">
				user_id_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
				temp_id3 </span><span class="pun">=</span><span class="pln"> data_id_st4
</span><span class="com">#				personnel_ps[temp_id] = raw_uid[0:4:1]</span><span class="pln">
			</span><span class="kwd">elif</span><span class="pln"> data_id_st2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'edit4'</span><span class="pun">:</span><span class="pln">
				data_id_st5 </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">15</span><span class="pun">:</span><span class="pln">data_end</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_id_st6 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st5</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st6</span><span class="pun">)</span><span class="pln">
</span><span class="com">#				if personnel_ps.get(temp_id) == data_id_st6:</span><span class="pln">
				password_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
				temp_mima3 </span><span class="pun">=</span><span class="pln"> data_id_st6
</span><span class="com">#					personnel_ps[temp_id] = password_flag</span><span class="pln">

</span><span class="com">#			print(rx2,user_id_flag,password_flag)</span><span class="pln">

			</span><span class="kwd">elif</span><span class="pln"> data_id_st2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'edit7'</span><span class="pun">:</span><span class="pln">
				data_id_st5 </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">15</span><span class="pun">:</span><span class="pln">data_end</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_id_st6 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st5</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">data_id_st6 </span><span class="pun">==</span><span class="pln"> admin_password</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="pun">(</span><span class="pln">password_flag </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="pun">(</span><span class="pln">user_id_flag </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">):</span><span class="pln">
					admin </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
					personnel_ps</span><span class="pun">[</span><span class="pln">temp_id3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> temp_mima3
					password_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
					user_id_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
					uart_write4</span><span class="pun">(</span><span class="str">'Verification passed!'</span><span class="pun">,</span><span class="str">'login was successful!'</span><span class="pun">)</span><span class="pln">


</span><span class="kwd">def</span><span class="pln"> password_loin</span><span class="pun">():</span><span class="pln">
	temp_id2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
	temp_mima </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
	</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">any</span><span class="pun">():</span><span class="pln">
			user_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
			password </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
			rx2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
			rx_num </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="com">#			data_end = 0</span><span class="pln">
			bin_data </span><span class="pun">=</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">40</span><span class="pun">)</span><span class="pln">
			uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">
			rx1 </span><span class="pun">=</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">bin_data</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">for</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> rx1</span><span class="pun">:</span><span class="pln">
				rx2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">chr</span><span class="pun">(</span><span class="pln">item</span><span class="pun">))</span><span class="pln">
				rx_num </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="com">#				if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '&gt;'):</span><span class="pln">
</span><span class="com">#					break</span><span class="pln">
			data_end </span><span class="pun">=</span><span class="pln"> rx_num</span><span class="pun">-</span><span class="lit">5</span><span class="pln">
			data_id_st </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">8</span><span class="pun">:</span><span class="lit">13</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
			data_id_st2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st2</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">3</span><span class="pun">:</span><span class="lit">5</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> button_cmd</span><span class="pun">:</span><span class="pln">
				data_name_len </span><span class="pun">=</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
				data_name </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">7</span><span class="pun">:</span><span class="pln">data_name_len</span><span class="pun">+</span><span class="lit">7</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_name</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_name2</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'back4'</span><span class="pun">:</span><span class="pln">
					</span><span class="kwd">return</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> data_id_st2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'edit5'</span><span class="pun">:</span><span class="pln">
				data_id_st3 </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">15</span><span class="pun">:</span><span class="pln">data_end</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_id_st4 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st3</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st4</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> data_id_st4 </span><span class="kwd">in</span><span class="pln"> personnel_ps</span><span class="pun">:</span><span class="pln">
					user_id_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
					temp_id2 </span><span class="pun">=</span><span class="pln"> data_id_st4
			</span><span class="kwd">elif</span><span class="pln"> data_id_st2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'edit6'</span><span class="pun">:</span><span class="pln">
				data_id_st5 </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">15</span><span class="pun">:</span><span class="pln">data_end</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
				data_id_st6 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_id_st5</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_id_st6</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">temp_id2</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">personnel_ps</span><span class="pun">)</span><span class="pln">
				</span><span class="kwd">if</span><span class="pln"> personnel_ps</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">temp_id2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> data_id_st6</span><span class="pun">:</span><span class="pln">
					password_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">

</span><span class="com">#			print(rx2,user_id_flag,password_flag)</span><span class="pln">
					</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">user_id_flag</span><span class="pun">,</span><span class="pln">password_flag</span><span class="pun">)</span><span class="pln">
					</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">password_flag </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="pun">(</span><span class="pln">user_id_flag </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">):</span><span class="pln">
						uart_write</span><span class="pun">(</span><span class="pln">temp_id2</span><span class="pun">,</span><span class="pln">temp_id2</span><span class="pun">)</span><span class="pln">
						password_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
						user_id_flag </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
						suos</span><span class="pun">.</span><span class="pln">value</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
						uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_visible","type":"widget","widget":"lock2","visible":true}&gt;ET'</span><span class="pun">)</span><span class="pln">
						uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"edit5","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">
						uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_text","type":"label","widget":"edit6","text":"''"}&gt;ET'</span><span class="pun">)</span><span class="pln">
						time</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
</span><span class="com">#						uart_write('student','')</span><span class="pln">
						suos</span><span class="pun">.</span><span class="pln">value</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">
						uart2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="str">'ST&lt;{"cmd_code":"set_visible","type":"widget","widget":"lock2","visible":false}&gt;ET'</span><span class="pun">)</span><span class="pln">
						uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">

</span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln">
	</span><span class="kwd">if</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">any</span><span class="pun">()&gt;</span><span class="lit">1</span><span class="pun">:</span><span class="pln">
		rx2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
		data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pln">
		bin_data </span><span class="pun">=</span><span class="pln"> uart2</span><span class="pun">.</span><span class="pln">read</span><span class="pun">(</span><span class="lit">40</span><span class="pun">)</span><span class="pln">
</span><span class="com">#		time.sleep(1)</span><span class="pln">
		uart2</span><span class="pun">.</span><span class="pln">sendbreak</span><span class="pun">()</span><span class="pln">
</span><span class="com">#		time.sleep(1)</span><span class="pln">
		rx1 </span><span class="pun">=</span><span class="pln"> list</span><span class="pun">(</span><span class="pln">bin_data</span><span class="pun">)</span><span class="pln">
		</span><span class="kwd">for</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> rx1</span><span class="pun">:</span><span class="pln">
			rx2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">chr</span><span class="pun">(</span><span class="pln">item</span><span class="pun">))</span><span class="pln">
		</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">rx2</span><span class="pun">)</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">3</span><span class="pun">:</span><span class="lit">5</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> button_cmd</span><span class="pun">:</span><span class="pln">
			data_name_len </span><span class="pun">=</span><span class="pln"> rx1</span><span class="pun">[</span><span class="lit">6</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
			data_name </span><span class="pun">=</span><span class="pln"> rx2</span><span class="pun">[</span><span class="lit">7</span><span class="pun">:</span><span class="pln">data_name_len</span><span class="pun">+</span><span class="lit">7</span><span class="pun">:</span><span class="lit">1</span><span class="pun">]</span><span class="pln">
			data_name2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_name</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">data_name2</span><span class="pun">)</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'card1'</span><span class="pun">:</span><span class="pln">
				card_zhuce</span><span class="pun">()</span><span class="pln">
			</span><span class="kwd">elif</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'password1'</span><span class="pun">:</span><span class="pln">
				mima_zuce</span><span class="pun">()</span><span class="pln">
			</span><span class="kwd">elif</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'card2'</span><span class="pun">:</span><span class="pln">
				do_read</span><span class="pun">()</span><span class="pln">
			</span><span class="kwd">elif</span><span class="pln"> data_name2 </span><span class="pun">==</span><span class="pln"> </span><span class="str">'password2'</span><span class="pun">:</span><span class="pln">
				password_loin</span><span class="pun">()</span></pre>

<p>
	 
</p>

<p>
	<strong>Video demo</strong>
</p>

<p>
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/Gl-Nofxb6I4?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">19020</guid><pubDate>Tue, 28 Sep 2021 09:33:35 +0000</pubDate></item><item><title><![CDATA[armbian-desktop: LibreOffice screen artifact fix & additional tips]]></title><link>https://forum.armbian.com/topic/18971-armbian-desktop-libreoffice-screen-artifact-fix-additional-tips/</link><description><![CDATA[<p>
	Hi all,
</p>

<p>
	 
</p>

<p>
	First afore, allow me to express my gratitude to all developers working on Armbian tirelessly.
</p>

<p>
	It is amazing how much I can achieve nowadays on these little Arm-based boxes, either <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr> or repurposed Android TV box.
</p>

<p>
	 
</p>

<p>
	This in my first tutorial submitted on Armbian forum, as I would like to contribute something back.
</p>

<p>
	I will update this post further when I am getting more familiar w/ Armbian &amp; running LibreOffice on it.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	===========
</p>

<p>
	Platform running:
</p>

<p>
	 
</p>

<p>
	<abbr title="System On a Chip"><abbr title="System On a Chip">SOC</abbr></abbr>:         Allwinner H6
</p>

<p>
	Device:      Tanix TX6 compatible TV box - UPDATE Apr 2022
</p>

<p>
	                  ( Please check out the Allwinner H6 build by <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/194592-awawa/?do=hovercard" data-mentionid="194592" href="https://forum.armbian.com/profile/194592-awawa/" rel="">@awawa</a> )
</p>

<p>
	                    <a href="https://www.hyperhdr.eu/2022/02/tv-box-mania-ii-part-tanix-tx6.html" rel="external nofollow">https://www.hyperhdr.eu/2022/02/tv-box-mania-ii-part-tanix-tx6.html</a> )
</p>

<p>
	 
</p>

<p>
	See also discussion:
</p>

<p>
	 
</p>

<p>
	 
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="194592" data-embedcontent="" data-embedid="embed1941998022" scrolling="no" src="https://forum.armbian.com/topic/16859-allwinner-h6/?do=embed&amp;comment=136532&amp;embedComment=136532&amp;embedDo=findComment" style="height:357px;max-width:502px;"></iframe>

<p>
	 
</p>

<p>
	                  Ubuntu Hirsute XFCE Desktop 22.02.00 trunk build for Tanix TX6     
</p>

<p>
	                  ( No End-user support ) 
</p>

<p>
	 
</p>

<p>
	===========
</p>

<p>
	 
</p>

<p>
	With the <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">Panfrost</abbr></abbr> <abbr title="Graphic processing unit (3D acceleration)"><abbr title="Graphic processing unit (3D acceleration)">GPU</abbr></abbr> driver getting mainlined &amp; become more and more mature ( eg, see this <a href="https://www.collabora.com/news-and-blog/blog/2021/01/13/desktop-opengl-3-1-on-mali-gpus-with-panfrost/" rel="external nofollow">Collabora blog</a> ),  my interest in using Armbian as my daily desktop driver has increased.   
</p>

<p>
	 
</p>

<p>
	So I would like to use this thread to post some tips I found related to desktop use on Armbian.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	1.  Checking opensource <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr> driver is loaded:
</p>

<p>
	See:  <a href="http://docs.linuxfactory.or.kr/guides/gpu_panfrost.html" rel="external nofollow">http://docs.linuxfactory.or.kr/guides/gpu_panfrost.html</a>
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	lsmod | grep <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr>
</p>

<p>
	 
</p>

<p>
	<abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr>               69632  3<br />
	gpu_sched          32768  1 <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr><br />
	 
</p>

<p>
	 
</p>

<p>
	If you see "<abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr>" as in above, then the opensource <abbr title="Graphic processing unit (3D acceleration)"><abbr title="Graphic processing unit (3D acceleration)">GPU</abbr></abbr> driver is already loaded
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	2. LibreOffice screen artifact &amp; fix
</p>

<p>
	 
</p>

<p>
	I discovered that on default setting:  LibreOffice on Armbian would exhibit screen overlay artifact, for instance, when another display window was in front of LibreOffice UI window (for example: a Terminal window displaying  htop ).  
</p>

<p>
	 
</p>

<p>
	Solution:    Enable Skia rendering support in LibreOffice
</p>

<p>
	 
</p>

<p>
	Tools &gt; Options  ||  LibreOffice &gt; View
</p>

<p>
	      Check the box "Use Skia for all rendering".   
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	Click OK and relaunch LibreOffice.   Now all screen overlay artifact on LibreOffice would disappear.  This always makes LibreOffice usable under RDP connection [ see point 3 below ]
</p>

<p>
	 
</p>

<p>
	PS:   This tip probably would work on multiple <abbr title="System On a Chip"><abbr title="System On a Chip">SOC</abbr></abbr> using <strong>Mali <abbr title="Graphic processing unit (3D acceleration)"><abbr title="Graphic processing unit (3D acceleration)">GPU</abbr></abbr> chipset</strong>
</p>

<p>
	         (See <abbr title="Graphic processing unit (3D acceleration)"><abbr title="Graphic processing unit (3D acceleration)">GPU</abbr></abbr> with <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">Panfrost</abbr></abbr> support:  <a href="https://docs.mesa3d.org/drivers/panfrost.html" rel="external nofollow">https://docs.mesa3d.org/drivers/<abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr>.html</a> )
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	3.  You can use <strong>armbian-config</strong> to enable RDP access from Windows or another Linux PC (running XRDP client).
</p>

<p>
	      Just select
</p>

<p>
	 
</p>

<p>
	      Software &gt; RDP
</p>

<p>
	             (Enable remote desktop access from Windows)
</p>

<p>
	 
</p>

<p>
	     See more from this discussion thread:
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="1936" data-embedcontent="" data-embedid="embed2203358625" scrolling="no" src="https://forum.armbian.com/topic/13740-how-to-enable-rdp-xrdp-with-armbian-so-you-can-login-from-a-windows-pc/?do=embed" style="height:420px;max-width:502px;"></iframe>

<p>
	 
</p>

<p>
	    
</p>

<p>
	 
</p>

<p>
	I will update this post further if I find any additional tips, while playing with LibreOffice on Armbian.
</p>

<p>
	Any advice and feedback is appreciated.
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18971</guid><pubDate>Sun, 19 Sep 2021 17:05:02 +0000</pubDate></item><item><title>Videos : What it takes to maintain Armbian</title><link>https://forum.armbian.com/topic/18903-videos-what-it-takes-to-maintain-armbian/</link><description><![CDATA[<p>
	Hi all.<br />
	I've done a collaboration with <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/1-igor/?do=hovercard" data-mentionid="1" href="https://forum.armbian.com/profile/1-igor/" rel="">@Igor</a>, the creator of Armbian.<br />
	He shows and talks about the hardware that is used to maintain the project. Servers, boards, other electronics, ...<br />
	Enjoy!<br />
	<br />
	More videos to come.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/s_ODdKO0YW0?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18903</guid><pubDate>Sun, 05 Sep 2021 11:59:01 +0000</pubDate></item><item><title>orangepi H3 and wiringPi (OP) with interrupts</title><link>https://forum.armbian.com/topic/18875-orangepi-h3-and-wiringpi-op-with-interrupts/</link><description><![CDATA[
<div class="ipsMargin_top">
    
    
    
</div><p>
	Recently I tried to use CC1101 Radio-boards to access with spidev0.0; this works after some research:
</p>

<p>
	1. activate spidev in the /boot/armbianEnv.txt (important)
</p>

<p>
	2. in armbian-config hardware activate spidev
</p>

<p>
	in the downloaded test routines the speed of the spi is set too high (8000000)
</p>

<p>
	3. set this down to 4000000
</p>

<p>
	 
</p>

<p>
	In addition: I need the interurpt functions of GDO0 and GDO2 in the next test program.
</p>

<p>
	As Interrupts on wiringOP seems to work not on all <abbr title="General purpose input/output">GPIO</abbr>-Pins you have to select PAxx for example
</p>

<p>
	After the change of the code for this PA21 wPI-Pin 11, it works as expected
</p>

<p>
	 
</p>

<p>
	Michael
</p>
]]></description><guid isPermaLink="false">18875</guid><pubDate>Tue, 31 Aug 2021 16:06:02 +0000</pubDate></item><item><title>Pandrost for the Odroid N2 / N2+ and Khadas VIM3</title><link>https://forum.armbian.com/topic/18555-pandrost-for-the-odroid-n2-n2-and-khadas-vim3/</link><description><![CDATA[<p>
	Hi all.<br />
	The <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">Panfrost</abbr></abbr> <abbr title="Graphic processing unit (3D acceleration)"><abbr title="Graphic processing unit (3D acceleration)">GPU</abbr></abbr> driver is finally starting to mature for Mali G52 on the Odroid N2/N2+ and Khadas VIM3.<br />
	It doesn't perform great yet. But this will improve with time. In this video I show how to activate the <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr> driver on Armbian mainline.
</p>

<p>
	 
</p>

<p>
	To activate <abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr> <span>: </span>
</p>

<pre class="ipsCode"> sudo add-apt-repository ppa:oibaf/graphics-drivers  
 sudo apt update
 sudo apt upgrade
 sudo reboot</pre>

<p>
	Khadas VIM3 support is in the making. This also works on any other mainline image.<br />
	Greetings.<br />
	 
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/rU2n-9z9QCI?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18555</guid><pubDate>Fri, 02 Jul 2021 17:53:44 +0000</pubDate></item><item><title>my ordeal with rockpi4 and Penta Sata Hat + Tower</title><link>https://forum.armbian.com/topic/18214-my-ordeal-with-rockpi4-and-penta-sata-hat-tower/</link><description><![CDATA[<p>
	I had bought <a href="https://shop.allnetchina.cn/products/penta-sata-kit-for-rock-pi-4-in-production-now?_pos=4&amp;_sid=60850d98f&amp;_ss=r" rel="external nofollow">the kit</a> because I got attracted by its compact size. I had problems with my old media pc so good opportunity to tackle something new.
</p>

<p>
	I thought, my requirements for a media server would be quite low/easy to fulfill:
</p>

<ul>
	<li>
		smooth playback of 1080p movies
	</li>
	<li>
		clean multichannel sound
	</li>
	<li>
		access to firefox
	</li>
</ul>

<p>
	 
</p>

<p>
	After testing all avaliable images on the rockpi, it was clear, that actually only LE offers exciting movie enjoyment. I had to realize, that my ideas are quite demanding after all.
</p>

<p>
	So it was clear, I had to get the driver from radxa working on LE.
</p>

<p>
	 
</p>

<p>
	<strong>Why?</strong>
</p>

<p>
	well, hardware design of rockpi4 with extension HATs is somehow stupid. The flat cable needs to go from plugged board below systemboard to HAT above system board, so sdcard could not be changed any more.
</p>

<p>
	<span></span><span></span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img class="ipsImage ipsImage_thumbnailed" data-fileid="8045" data-ratio="86.38" width="800" alt="SDcard-weird01.JPG.699fd7fb1a628971c2e9934151def512.JPG" src="https://forum.armbian.com/uploads/monthly_2021_05/SDcard-weird01.JPG.699fd7fb1a628971c2e9934151def512.JPG" />
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	and as shown here:
</p>

<p>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<a class="ipsAttachLink ipsAttachLink_image" href="https://forum.armbian.com/uploads/monthly_2021_05/SDcard-weird02.JPG.6b05f0720318fd9aea73c0af9a54fc50.JPG" data-fileid="8046" data-fileext="JPG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="8046" data-ratio="99.47" width="754" alt="SDcard-weird02.thumb.JPG.dcb8181034ad778b1e877b48982fd3ba.JPG" src="https://forum.armbian.com/uploads/monthly_2021_05/SDcard-weird02.thumb.JPG.dcb8181034ad778b1e877b48982fd3ba.JPG" /></a>
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	sd-card cannot be used together with the tower. Only <abbr title="embedded MultiMediaCard">emmc</abbr>-support for boot. But <abbr title="embedded MultiMediaCard">emmc</abbr> module is not exchangeable.
</p>

<p>
	That is why I had to start this odyssey.
</p>

<p>
	 
</p>

<p>
	I tested the driver with officially supported images:
</p>

<ul>
	<li>
		on debian (linaro) the driver could be installed and the fan runs. Neither button nor display works.
	</li>
	<li>
		on ubuntu driver install scripts tells, that nothing has to be done, but nothing works ootb. No fan, no button, no display
	</li>
	<li>
		on armbian or LE the install script reffers to the git archive.
	</li>
</ul>

<p>
	 
</p>

<p>
	I started with self compiled LE, but I'm not skilled to port lowlevel libraries to unknown system. Quite hard going
</p>

<p>
	 
</p>

<p>
	Then I discovered posting of <a href="https://forum.armbian.com/topic/15341-rock-pi4-pwm-control-no-overlay/" rel="">PetrozPL</a> and <a href="https://forum.armbian.com/topic/11086-pwm-fan-on-nanopi-m4/?do=findComment&amp;comment=110117" rel="">JackR</a>. Both scripts worked on armbian - well, I had some problems, getting into it, but ...
</p>

<p>
	anyway: trying the scripts on LE showed - no way. LE has no bash and busybox does not support arrays ...
</p>

<p>
	 
</p>

<p>
	So I researched, how I could drive the fan using only tools avaliable at LE. Unfortunately LE has no reasonable interpreter for scripting. Only python <span>:(</span>
</p>

<p>
	<span>I never wrote a line in python before!</span>
</p>

<p>
	 
</p>

<p>
	<span>I first had to check, whether the kernel of LE supports fan control. LE has no <abbr title="Device tree blob">dtb</abbr>-overlay support for rockpi. So had to change <abbr title="Device tree blob">dtb</abbr> manually like this:</span>
</p>

<ul>
	<li>
		<span>copy <abbr title="Device tree blob">dtb</abbr>-file to writable location</span>
	</li>
	<li>
		<span>decompile with <strong><abbr title="Device tree compiler">dtc</abbr> -I <abbr title="Device tree blob">dtb</abbr> -O <abbr title="Device tree source">dts</abbr> -o rk3399-rock-pi-4a.<abbr title="Device tree blob">dtb</abbr> rk3399-rock-pi-4a.<abbr title="Device tree source">dts</abbr></strong></span>
	</li>
	<li>
		<span>find sections named <em>pwm@ff420000</em> and <em>pwm@ff420010</em></span>
	</li>
	<li>
		<span>change status "<em>disabled</em>" into status = "<em>okay</em>"</span>
	</li>
	<li>
		<span>recompile <abbr title="Device tree source">dts</abbr> with <strong><abbr title="Device tree compiler">dtc</abbr> -O <abbr title="Device tree blob">dtb</abbr> -o rk3399-rock-pi-4a.<abbr title="Device tree blob">dtb</abbr> -b O -@ rk3399-rock-pi-4a.<abbr title="Device tree source">dts</abbr></strong></span>
	</li>
	<li>
		<span>copy <abbr title="Device tree blob">dtb</abbr> file back to original location (/flash)</span>
	</li>
</ul>

<p>
	 
</p>

<p>
	<span>After reboot, fan works as with armbian - so I could write <a href="https://github.com/movinator/LibreELEC.tv/tree/PentaSataTower" rel="external nofollow">my fan-driver</a>. Now system was ready to assemble the tower.</span>
</p>

<p>
	<span>I tested the driver with all other test images. Had to change code to work with older python releases and had some troubles with the button. But now driver runs stable and - as far as I can judge so far, where my driver does not run, other drivers will fail too.</span>
</p>

<p>
	 
</p>

<p>
	Well, my work with LE had the background, that I could get multiboot into play. But that seems pretty impossible.
</p>

<p>
	So I startet again researching, what could fulfill my ideas.
</p>

<ul>
	<li>
		Multimedia legacy - kodi works, movies are enjoyable. But no button support
	</li>
	<li>
		armbian current - no kodi, vlc works fine. Fan control works with button support
	</li>
	<li>
		debian/ubuntu - Fancontrol works with button support, but video playback is disgusting
	</li>
	<li>
		twisterOS - kodi works, movies are enjoyable, but no fan, no button
	</li>
</ul>

<p>
	 
</p>

<p>
	I like twisterOS and the gimmick with the circles, but the text was unreadable for me. So I tweaked the gimmick and now I have it usable on my desktop as well on plain armbian. Using armbian instead of twisterOS has the benefit, that I don't have to flood the boot media with rubbish I never use (like openoffice and all that gaming stuff)
</p>

<p>
	 
</p>

<p>
	Actually my armbian current looks like this:
</p>

<p>
	<span></span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img class="ipsImage ipsImage_thumbnailed" data-fileid="8047" data-ratio="56.25" width="800" alt="armbian-desktop01.jpg.06830600a1bd342d39cdb6d28bcbdad0.jpg" src="https://forum.armbian.com/uploads/monthly_2021_05/armbian-desktop01.jpg.06830600a1bd342d39cdb6d28bcbdad0.jpg" />
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	or a bit busy with firefox:
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img class="ipsImage ipsImage_thumbnailed" data-fileid="8048" data-ratio="56.25" width="800" alt="armbian-desktop02.jpg.1f22908bbddea28b162eca59455aa633.jpg" src="https://forum.armbian.com/uploads/monthly_2021_05/armbian-desktop02.jpg.1f22908bbddea28b162eca59455aa633.jpg" />
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	So the open jobs (next steps) are:
</p>

<ul>
	<li>
		get multiboot into play (then I could use LE together with armbian)
	</li>
	<li>
		get another kernel on twisteros, that supports pwm - then I could use twisteros
	</li>
	<li>
		get a recent kodi on current armbian, then I could forget about all others
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18214</guid><pubDate>Mon, 24 May 2021 10:21:06 +0000</pubDate></item><item><title>How to: Automatically start armbianmonitor on serial terminal</title><link>https://forum.armbian.com/topic/18471-how-to-automatically-start-armbianmonitor-on-serial-terminal/</link><description><![CDATA[<p>
	Hi,
</p>

<p>
	To enable the armbianmonitor to show information on the running system on the serial console, I used to have a custom startup script, called from /etc/<abbr title="Release candidate"><abbr title="Release candidate">rc</abbr></abbr>.local. After some time, I thought it was more neat to have this automatically started (and stopped) for login sessions that are started on serial consoles/terminals.
</p>

<p>
	 
</p>

<p>
	This lead (led?) me to the following systemd unit file:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">[Unit]
Description=armbianmonitor on ttyS2
Requires=serial-getty@ttyS2.service
After=serial-getty@ttyS2.service 
After=getty.target
BindsTo=serial-getty@ttyS2.service 

[Service]
Type=idle
ExecStartPre=-/bin/sleep 10
ExecStart=/usr/bin/armbianmonitor -m
TTYPath=/dev/ttyS2
StandardInput=null
StandardOutput=tty
StandardError=syslog
KillSignal=SIGKILL
SendSIGHUP=yes

[Install]
WantedBy=serial-getty@ttyS2.service</span></pre>

<p>
	 
</p>

<p>
	File goes into /usr/lib/systemd/system/armbianmonitor@ttyS2.service. To 'activate' it, perform the following after creating the file at the specified location:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo systemctl daemon-reload
sudo systemctl enable armbianmonitor@ttyS2
sudo systemctl stop armbianmonitor@ttyS2
sudo systemctl start armbianmonitor@ttyS2</span></pre>

<p>
	 
</p>

<p>
	This is currently working for me on OrangePi Zero, NanoPi R2S, Helios4 (@ttyS0) and Helios64.
</p>

<p>
	 
</p>

<p>
	If you do not have serial-getty services started on ttyS2 - like in the example unit file - you will need to modify the 'ttyS2' with the serial console matching your situation.
</p>

<p>
	 
</p>

<p>
	Note that the new armbianmonitor@ttyX service will auto-start when seial-getty@ttyX is started and it will also stop when serial-getty@ttyX is stopped. This is to prevent orphaned armbianmonitors. Fun thing to try is to stop and start serial-getty@ttyX and also see the armbianmonitor service for that tty stop/start in tandem.
</p>

<p>
	 
</p>

<p>
	Hope this helps anyone out there, it's always nice to have serial output available in case things happen (and they always happen unexpectedly).
</p>

<p>
	 
</p>

<p>
	Groetjes,
</p>

<p>
	 
</p>

<p>
	p.s. See below spoiler for auto-adding these unit files based on your currently enabled serial-getty services.
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-html prettyprinted">

<span class="pln">#!/bin/bash

systemctl list-units --type=service --state=active,inactive --full --no-pager --no-legend --plain "serial-getty@*" |
    while read _UNIT _DONTCARE
    do
        _DEVICE="${_UNIT%.service}"
        _DEVICE="${_DEVICE##*@}"
        _FILE="/lib/systemd/system/armbianmonitor@${_DEVICE:?}.service"
        
        {
            cat &lt;&lt; EOF
[Unit]
Description=armbianmonitor on ${_DEVICE:?}
Requires=${_UNIT:?}
After=${_UNIT:?} 
After=getty.target
BindsTo=${_UNIT:?} 

[Service]
Type=idle
ExecStartPre=-/bin/sleep 10
ExecStart=/usr/bin/armbianmonitor -m
TTYPath=/dev/${_DEVICE:?}
StandardInput=null
StandardOutput=tty
StandardError=syslog
KillSignal=SIGKILL
SendSIGHUP=yes

[Install]
WantedBy=${_UNIT:?}
EOF
        } | sudo tee "${_FILE:?}" &gt; /dev/null

        sudo chown root:root "${_FILE:?}"
        sudo chmod 0644 "${_FILE:?}"
        sudo systemctl daemon-reload
    done
    
# EOF</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18471</guid><pubDate>Thu, 24 Jun 2021 02:36:30 +0000</pubDate></item><item><title>Videos : Armbian instructions for beginners - Install, Network access, What is Armbian...</title><link>https://forum.armbian.com/topic/15501-videos-armbian-instructions-for-beginners-install-network-access-what-is-armbian/</link><description><![CDATA[<p>
	Hi all.
</p>

<p>
	<span><a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/9032-werner/?do=hovercard" data-mentionid="9032" href="https://forum.armbian.com/profile/9032-werner/" rel="">@Werner</a> </span>and I have been working on an instruction video on how to install Armbian headless on your <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr>.<br />
	Here it is.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="270" width="480" data-embed-src="https://www.youtube.com/embed/hFrdyLc4g50?feature=oembed"></iframe>
	</div>
</div>

<p>
	Greetings,<br />
	NicoD
</p>
]]></description><guid isPermaLink="false">15501</guid><pubDate>Sun, 11 Oct 2020 20:05:08 +0000</pubDate></item><item><title>new conky theme: conky.arcs</title><link>https://forum.armbian.com/topic/18331-new-conky-theme-conkyarcs/</link><description><![CDATA[<p>
	Hi,
</p>

<p>
	 
</p>

<p>
	I startet with conky-grapes from TwisterOS, which I wanted to tweak to show cpu frequency for every core.
</p>

<p>
	But that showed, that conky is not able to do consistent text formatting, so I startet to write my <a href="https://github.com/movinator/conky.arcs" rel="external nofollow">own theme</a>.
</p>

<p>
	 
</p>

<p>
	As I like the armbian title font, I asked for the font, but it turned out, that it did not look as good as expected. So I discarded that variant and stayed with the previous selected fonts.
</p>

<p>
	Main purpose is to use that monitor in home cinema, therefore I used bigger fonts, which are readable from distance.
</p>

<p>
	 
</p>

<p>
	Feedback is welcome.
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">18331</guid><pubDate>Sun, 06 Jun 2021 14:27:58 +0000</pubDate></item><item><title>AMD Threadripper 3990X Armbian Build Server Review</title><link>https://forum.armbian.com/topic/16050-amd-threadripper-3990x-armbian-build-server-review/</link><description><![CDATA[<p>
	Hi all. <br />
	I again had the pleasure of working with an amazing server. This time the AMD Threadripper 3990X, 64-cores and 128 threads.<br />
	After last week working on a 32-core ARM server I thought I had seen performance.<br />
	<br />
	This is again not comparable with anything before.
</p>

<p>
	 
</p>

<p>
	I again got private SSH access. So I opened 3 terminals. One with HTop, another to check sensors. And the 3th to execute my benchmarks.<br />
	First thing I saw were the 128-threads. Being used to seeing 6, this was almost unbelievable.
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="7242" href="https://forum.armbian.com/uploads/monthly_2020_11/image.png.f6f77860861a5e954d70492ff49bd390.png" rel=""><img alt="image.thumb.png.e8954d0c7e4d525a6a747c16b932ccfa.png" class="ipsImage ipsImage_thumbnailed" data-fileid="7242" data-ratio="52.90" width="1000" src="https://forum.armbian.com/uploads/monthly_2020_11/image.thumb.png.e8954d0c7e4d525a6a747c16b932ccfa.png" /></a><a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="7243" href="https://forum.armbian.com/uploads/monthly_2020_11/image.png.acf8181e0b37c5cb0504cbbce25172d1.png" rel=""><img alt="image.thumb.png.7f75430b384c568856ee88891d063a5e.png" class="ipsImage ipsImage_thumbnailed" data-fileid="7243" data-ratio="52.80" width="1000" src="https://forum.armbian.com/uploads/monthly_2020_11/image.thumb.png.7f75430b384c568856ee88891d063a5e.png" /></a>
		</p>
	</div>
</div>

<p>
	<br />
	With light loads it turbo's up to 4.3Ghz. All cores maxed out @ 3Ghz while consuming 400W.<br />
	Reaching a single core 7zip decompression score of 4545MIPS @ 4.3Ghz.<br />
	The Ampere 32-core ARM server at 3.3Ghz reached 2763.<br />
	This again shows the Ampere server doesn't use high performance cores. It doesn't perform great per clock.<br />
	<br />
	Coming soon is a benchmark of an AWS server. This uses high performance cores based on the ARM N1 cores. A derivative of the A76.<br />
	This reaches 3393. This clocked at only 2.5Ghz. So this does perform better per clock. Do know this is comparing peers with bananas(don't want to confuse with apples).<br />
	<br />
	And scoring 391809MIPS with 7zip multi-core decompression with default settings.<br />
	<br />
	Then with an overclock to 3.9Ghz all cores it consumed +600W. With a 7zip decompression score of 433702MIPS
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode">








7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,128 CPUs AMD Ryzen Threadripper 3990X 64-Core Processor  (830F10),ASM,AES-NI)

AMD Ryzen Threadripper 3990X 64-Core Processor  (830F10)
CPU Freq: - 64000000 64000000 - - - - - -

RAM size:  257677 MB,  # CPU hardware threads: 128
RAM usage:  28240 MB,  # Benchmark threads:    128

                       Compressing  |                  Decompressing
Dict     Speed Usage    R/U Rating  |      Speed Usage    R/U Rating
         KiB/s     %   MIPS   MIPS  |      KiB/s     %   MIPS   MIPS

22:     272228 11672   2269 264824  |    5112130 12467   3499 435912
23:     165008 11150   1508 168123  |    5086525 12595   3496 440122
24:     121378 11578   1128 130506  |    4972483 12594   3467 436364
25:     103873 11805   1005 118599  |    4746979 12362   3419 422410
----------------------------------  | ------------------------------
Avr:           11551   1478 170513  |            12505   3470 433702
Tot:           12028   2474 302107</pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	This is again so many levels better than the Ampere 32-core ARM server which got 85975MIPS. 32-cores of the AWS graviton2 does 110628.<br />
	So this AMD server is up to 5 x more powerful when overclocked, than the Ampere 32-core server. Consuming 6 x as much. <br />
	With normal configuration they both perform almost as well in performance/watt.
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode">








7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,32 CPUs LE)
Ampere 32-core ARM Server
LE
CPU Freq: - - - - - - - - -

RAM size:  128285 MB,  # CPU hardware threads:  32
RAM usage:   7060 MB,  # Benchmark threads:     32

                       Compressing  |                  Decompressing
Dict     Speed Usage    R/U Rating  |      Speed Usage    R/U Rating
         KiB/s     %   MIPS   MIPS  |      KiB/s     %   MIPS   MIPS

22:      58550  2735   2082  56958  |    1027823  3151   2782  87652
23:      56799  2761   2096  57872  |    1002539  3141   2762  86751
24:      54973  2821   2096  59107  |     976406  3142   2728  85702
25:      52913  2838   2129  60414  |     941588  3120   2685  83795
----------------------------------  | ------------------------------
Avr:            2789   2101  58588  |             3139   2739  85975
Tot:            2964   2420  72281</pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br />
	In idle the Threadripper sonsumed 100W, what is a lot for doing nothing.<br />
	The 32-core ARM server only consumed a bit more than 100W maxed out. And about 20W in idle.<br />
	<br />
	The BMW Blender benchmark, which takes 29m23s on the fastest ARM <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr> the Odroid N2+. The Ampere ARM server did it in 8m27s.
</p>

<p>
	For the Threadripper this was a way too light load, it did it in 30s. <br />
	<br />
	Even when doing this render 10 x after each other it didn't raise the temperatures much. The maximum I've seen was 50C.<br />
	<br />
	To try a heavier load I downloaded the Barber Shop Blender render. This was 6912 tiles to render. But again the Threadripper wasn't impressed by this load. 2m18s79. The AWS with 32-cores (of 64) done this in 8m28s. So this ARM server does compete well per clock for a floating point task with TR.<br />
	<br />
	ARM may be great, but AMD is mighty. Intel does not have anything to compete with this. Certainly not performance/watt. <br />
	It was a pleasure benchmarking this server. <br />
	I learned a lot, like that I need to find better tools for these amazing machines.  
</p>

<p>
	 
</p>

<p>
	The specs of this monster <span>:</span><br />
	 
</p>

<ul>
	<li>
		ASRock Rack TRX40D8-2N2T
	</li>
	<li>
		AMD Ryzen Threadripper 3990x
	</li>
	<li>
		256GB memory (8 x 32Gb) ECC
	</li>
	<li>
		2 x 1TB PCI 4.0 Nvme SSD
	</li>
	<li>
		Water Cooling
	</li>
</ul>

<p>
	 
</p>

<p>
	The specs of the Threadripper 3990x
</p>

<p>
	 
</p>

<ul>
	<li>
		64-cores 128-threads AMD64
	</li>
	<li>
		Zen2 Matisse
	</li>
	<li>
		2.9Ghz - 4.3Ghz
	</li>
	<li>
		4-channel DDR4-3200 MHz
	</li>
	<li>
		256GB RAM
	</li>
	<li>
		88 lanes PCIe4
	</li>
	<li>
		TSMC's 7nm process node
	</li>
	<li>
		280W - +400W
	</li>
	<li>
		32 KB L1 per core (64x)
	</li>
	<li>
		64 x 512 KB L2
	</li>
	<li>
		256 MB L3 cache shared
	</li>
</ul>

<p>
	<br />
	You can see my full review video here, greetings.<br />
	NicoD
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="270" width="480" data-embed-src="https://www.youtube.com/embed/zwUb1nt51J0?feature=oembed"></iframe>
	</div>
</div>

<p>
	<br />
	 
</p>
]]></description><guid isPermaLink="false">16050</guid><pubDate>Fri, 20 Nov 2020 10:46:43 +0000</pubDate></item><item><title>Video : Running Debian Buster on the Odroid Go Super and review of the hardware</title><link>https://forum.armbian.com/topic/17437-video-running-debian-buster-on-the-odroid-go-super-and-review-of-the-hardware/</link><description><![CDATA[<p>
	Hi all.<br />
	I recently bought the Odroid Go Super. It is a great handheld for emulation gaming. But that isn't the main reason why I bought it.<br />
	It can also run Linux, tho not Armbian.<br />
	In this video I show how I use Debian Buster from Meveric on the Odroid Go Super and I also review the hardware. Greetings.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/tXtgeuRV684?feature=oembed"></iframe>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">17437</guid><pubDate>Tue, 06 Apr 2021 17:24:07 +0000</pubDate></item><item><title>cryptsetup - supporting no_read_workqueue/no_write_workqueue on SSDs</title><link>https://forum.armbian.com/topic/17272-cryptsetup-supporting-no_read_workqueueno_write_workqueue-on-ssds/</link><description><![CDATA[<p>
	Dear Armbian community,
</p>

<p>
	 
</p>

<p>
	although I'm using Armbian a lot, I never had to submit anything to this forum (fortunately, because it works so well :-)),
</p>

<p>
	 
</p>

<p>
	On my PC I've experienced lags on heavy IO operations. After a short dig into available information,
</p>

<p>
	I found a useful Cloudflare article on Kernel queues together with dm-crypt.
</p>

<p>
	 
</p>

<p>
	A good &amp; short summary on possible actions for users can be found here:
</p>

<p>
	 
</p>

<p>
	<a href="https://wiki.archlinux.org/index.php/Dm-crypt/Specialties#Disable_workqueue_for_increased_solid_state_drive_(SSD)_performance" ipsnoembed="false" rel="external nofollow">https://wiki.archlinux.org/index.php/Dm-crypt/Specialties#Disable_workqueue_for_increased_solid_state_drive_(SSD)_performance</a>
</p>

<p>
	 
</p>

<p>
	Enabling the no-read-workqueue &amp; no-write-workqueue options helped a lot!
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	As I'm using a RockPi4 with the NVMe SSD with encryption, I thought this should apply to my <abbr title="Single board computer"><abbr title="Single board computer">SBC</abbr></abbr> as well.
</p>

<p>
	 
</p>

<p>
	Unfortunately, Armbian/Debian Buster uses <strong>cryptsetup v2.1.0</strong>
</p>

<p>
	 
</p>

<p>
	which does NOT support these options.
</p>

<p>
	According to the changelog, this option was introduced in <strong>v2.3.4</strong>:
</p>

<p>
	<a href="https://gitlab.com/cryptsetup/cryptsetup/-/blob/master/docs/v2.3.4-ReleaseNotes" ipsnoembed="false" rel="external nofollow">https://gitlab.com/cryptsetup/cryptsetup/-/blob/master/docs/v2.3.4-ReleaseNotes</a>
</p>

<p>
	 
</p>

<p>
	As Armbian uses a kernel &gt; 5.9, the kernel infrastructure should be available.
</p>

<p>
	 
</p>

<p>
	Fortunately, crypsetup v2.3.4 exists in the buster-backports repo:
</p>

<p>
	<a href="https://packages.debian.org/buster-backports/cryptsetup" ipsnoembed="false" rel="external nofollow">https://packages.debian.org/buster-backports/cryptsetup</a>
</p>

<p>
	 
</p>

<p>
	Solution:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln"># sudo apt install cryptsetup/buster-backports</span></pre>

<p>
	<br>
	 
</p>
]]></description><guid isPermaLink="false">17272</guid><pubDate>Sun, 14 Mar 2021 10:25:16 +0000</pubDate></item><item><title>Review videos : NVIDIA Jetson Nano</title><link>https://forum.armbian.com/topic/12342-review-videos-nvidia-jetson-nano/</link><description><![CDATA[<p>
	Hi all. I've finished my review video about the NVIDIA Jetson Nano.<br>
	I kept it simple, more videos to come on gameplay and neural network self learning. <br>
	Here's the review video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="270" width="480" data-embed-src="https://www.youtube.com/embed/W03DWvqxUeM?feature=oembed"></iframe>
	</div>
</div>

<p>
	I like it a lot. Does Blender great, and works well as light desktop. Loving the graphics drivers and hoping soon the other SBC's can have simular good drivers. <br>
	It is close to being my favorite. If only the cpu had more power...<br>
	Here my gathered data.<br>
	 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode">

Check power mode        : sudo nvpmodel -q
Set 5W mode             : sudo nvpmodel -m1
Set 10W mode            : sudo nvpmodel -m0
config file             : sudo nano /etc/nvpmodel.conf

5W Mode clocks to 921Mhz and disables 2 cores 

Show clocks mode        : sudo jetson_clocks --show
Set everything to max   : sudo jetson_clocks          (turns back to normal after reboot)

Youtube Playback
----------------
All browsers up to 1080p. Some 1440p.

Video Playback
--------------
No 4K GUI player/Even not KODI in 4k - 1440p ok
4K in terminal : nvgstplayer -i &lt;video-filename&gt; 

Blender NicoD GPU render
------------------------
23m42s  1440p
17m14s  1080p    
17m00s   720p
CPU
---
17m22s   10W
35m24s @1.43Ghz   5W   1080p gpu 27m53s
19m for both CPU and GPU render

Blender NicoD Armbian Bionic CPU 
25m45s



SBC-Bench default 10W    : http://ix.io/22sS
SBC-Bench default 5W     : http://ix.io/22uy
SBC-Bench armbian Bionic : http://ix.io/22uc

USB3 Camera
-----------
git clone https://github.com/ksv1986/luvcview
cd luvcview
sudo apt-get install libsdl2-dev
sudo make

Check options           : ./luvcview -h
Preview 1920x1080@30fps : ./luvcview -d /dev/video0 -i 30 -s 1920x1080
                          ./luvcview -d /dev/video0 -i 30 -s 1920x1080 -o testVideo.mp4

Install PPSSPP
--------------
sudo add-apt-repository ppa:ppsspp/stable
sudo apt-get update
sudo apt install ppsspp
su   (if no superuser password has created yet, first make one with sudo passwd)
ppsspp

Storage Speeds
--------------
SD-card reader read   : 88 MB/s       0.42 ms
               write  : 70 MB/s
USB3-SSD       read   : 410 MB/s      0.26 ms
               write  : 380 MB/s               
ZRAM           read   : 1.7GB/s       0.01 ms      

Temperatures
------------
max No fan   : 78C
max 3V fan   : 43.5C

Problems
--------
USB seems unreliable. Not all USB3 devices are mounted as USB3 but as USB2. Problems with USB2 devices not being recognized at all.</pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>
]]></description><guid isPermaLink="false">12342</guid><pubDate>Mon, 02 Dec 2019 22:34:39 +0000</pubDate></item><item><title>Crude NAS with local caching</title><link>https://forum.armbian.com/topic/17157-crude-nas-with-local-caching/</link><description><![CDATA[<p>
	You all know the problem: You have a spare <abbr title="Single board computer">SBC</abbr> (with USB3) laying around catching dust, a spare SSD or other hard drive and for whatever reason some (terabyte?) space in whatever cloud on the planet and have no idea what to do with it.
</p>

<p>
	 
</p>

<p>
	Well here is what I came up with to solve this struggle <span><img alt=":)" data-emoticon="true" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20"></span>
</p>

<p>
	 
</p>

<p>
	<a href="https://zuckerbude.org/cloud-nas-with-local-cache/" ipsnoembed="true" rel="external nofollow">https://zuckerbude.org/cloud-nas-with-local-cache/</a>
</p>
]]></description><guid isPermaLink="false">17157</guid><pubDate>Sun, 28 Feb 2021 15:35:13 +0000</pubDate></item><item><title>Quick review of NanoPi Fire3</title><link>https://forum.armbian.com/topic/7260-quick-review-of-nanopi-fire3/</link><description><![CDATA[<p>
	<img alt="nanopifire3.png" class="ipsImage" height="562" src="https://www.armbian.com/wp-content/uploads/2018/01/nanopifire3.png" width="1000"></p>

<p>
	This little and inexpensive ($35) board is fully compatible to discontinued <a href="https://forum.armbian.com/topic/1285-nanopi-m3-cheap-8-core-35/" rel="">NanoPi M3</a>. From a software point of view both boards are identical (though Wi-Fi is missing on the Fire3) and as such identical OS images can be used for both boards. The good news: compared to the last time I looked at the M3 kernel support has improved a lot. Back then we had to run a smelly 3.4.39 (32-bit only) while we can now run mainline on it.
</p>

<p>
	 
</p>

<p>
	I gave it a try using our <a href="https://www.armbian.com/nanopi-fire3/" rel="external nofollow">Armbian Stretch nightly</a> running with 4.14.40 (<a href="http://ix.io/1aHi" rel="external nofollow">full armbianmonitor -u output</a>) and did a couple of tests. The Samsung/Nexell S5P6818 SoC consists of 8 A53 cores running at up to 1.4GHz with default settings (can be slightly overclocked up to 1.6 GHz according to Willy Tarreau -- <a href="http://www.friendlyarm.com/index.php?route=product/product&amp;path=69&amp;product_id=206" rel="external nofollow">see the reviews at the product page</a>). All cores behave like one big cluster (so adjusting /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq affects all 8 CPU cores at once, this is no artificial pseudo big.LITTLE as Amlogic does it with their S912).
</p>

<p>
	 
</p>

<p>
	Now with a recent 64-bit kernel with the CPU cores brought up in ARMv8 mode we can also make use of ARMv8 Crypto Extensions making the S5P6818 to one of the most powerful boards when it's about AES crypto and stuff can run on all 8 cores in parallel (<a href="https://forum.armbian.com/topic/4583-rock64/?do=findComment&amp;comment=37829" rel="">33 times faster than a RPi 3 and still 28 times faster than a RPi 3+</a>). While the octa-core config sounds interesting for CPU intensive workloads one should keep in mind that this board has only 1 GB DRAM which is simply not enough for many such workloads (or you would need to make massive use of zram instead <a href="https://forum.armbian.com/topic/5565-zram-vs-swap/?do=findComment&amp;comment=54487" rel="">which performs better than swap on slow storage but of course bottlenecks a lot</a>).
</p>

<p>
	 
</p>

<p>
	Talking about a somewhat powerful CPU we also have to talk about temperatures and consumption. The board is always part of a kit so FriendlyELEC sells it together with a heatsink and a high quality Micro USB cable that solves a lot of the Micro USB related powering problems. In idle I measured 2.6W with Armbian (PSU included at the wall) while Willy Tarreau reported 'It consumes 400mA/5V in idle, and 1.2A/5V under openssl RSA with 8 cores at 1.6 GHz' (most probably using FriendlyELEC's OS image). So I tested for consumption with worst case workloads and used cpuburn-a53 for this. Since I knew from last time when I tested that the board deadlocks when starting cpuburn-a53 at 1.4 GHz I increased max cpufreq in steps (consumption always with PSU included):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">1000 MHz: 9.3W
1100 MHz: 10.7W
1200 MHz: 12.2W
1300 MHz: 13.8W
1400 MHz: 14.7W</span></pre>

<p>
	After a short time with cpuburn-a53 running at 1.4 GHz the board deadlocked again which is not a surprise since my PSU is rated for 2A (10W) and Micro USB itself is only rated for 1.8A (9W). As usual with FriendlyELEC boards there's a 4 pin header for serial debug console that can also be used to power the board more reliably so even demanding tasks that increase consumption to 15W are possible when powering through the header.
</p>

<p>
	 
</p>

<p>
	Talking about temperatures: After applying the heatsink I did a simple compile test (Arm Compute Library) with -j8 and after a minute the board did an emergency shutdown since CPU temperature reached 100°C. So all following tests were done with a huge fan blowing air over the heatsink laterally. IMO for demanding tasks improved airflow / heat dissipation is a must and the small heatsink simply not sufficient.
</p>

<p>
	 
</p>

<p>
	What other hardware is there? The usual 40 pin GPIO header, Gigabit Ethernet (with Armbian's settings and mainline kernel we're talking about iperf3 numbers of ~925 Mbits/sec in both directions), a mini HDMI port (most probably supported by Armbian), a camera and a LCD port (both not supported by Armbian as far as I know), the Micro USB OTG port and a single USB2 type A port. USB Attached SCSI (UAS) is yet not available with mainline kernel so storage performance is a little lower as it could be. This is a Samsung EVO840 in an ASM1153 enclosure connected to the USB2 port:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">                                                              random    random
              kB  reclen    write  rewrite    read    reread    read     write
          102400       4     7544     9889    10098    10117     7996     9770
          102400      16    16143    20165    20365    20260    19858    20172
          102400     512    33138    33659    33120    33373    33417    33321
          102400    1024    33511    33663    33429    34020    34119    33521
          102400   16384    32731    34012    36483    36750    36674    34291</span></pre>

<p>
	I also did a quick test as NAS and got numbers as expected: everything a little bit slower compared to those USB2 platforms that can make use of UAS -- so if NAS is the use case some of the cheaper Allwinner boards with Gigabit Ethernet are a better idea.
</p>

<p>
	 
</p>

<p>
	As usual FriendlyELEC did a great job documenting the board: <a href="http://wiki.friendlyarm.com/wiki/index.php/NanoPi_Fire3" rel="external nofollow">http://wiki.friendlyarm.com/wiki/index.php/NanoPi_Fire3</a> -- they also provide OS images that make full use of all hardware features (camera, LCD displays auto-detected by u-boot, GPU/VPU acceleration, HDMI resolution switching in Linux sounds a bit like PITA though).
</p>

<p>
	 
</p>

<p>
	Still not sure for which use cases this board applies. The octa-core CPU would better be accompanied by more DRAM (though then you need to get the <a href="http://www.friendlyarm.com/index.php?route=product/product&amp;path=69&amp;product_id=210" rel="external nofollow">NanoPC-T3 Plus</a> -- same SoC but 2 GB DRAM) and I fear making use of the processor power almost always requires a fan blowing in addition to the heatsink (without a fan I measured in idle always +60°C after a few minutes)
</p>
]]></description><guid isPermaLink="false">7260</guid><pubDate>Fri, 18 May 2018 09:18:53 +0000</pubDate></item><item><title>Automatic Kernel Control of NanoPi M4 / M4V2 Metal Case Fan</title><link>https://forum.armbian.com/topic/17022-automatic-kernel-control-of-nanopi-m4-m4v2-metal-case-fan/</link><description><![CDATA[<p>
	So, I was doing some reading on how to control PWM fans under Linux. The lm-sensors package has a fancontrol script, but pwmconfig doesn't recognize the PWM devices on my NanoPi M4V2. There's also <a href="https://github.com/cgomesu/nanopim4-satahat-fan" rel="external nofollow">this repository</a> which has a pwm-fan service, which might be the same one that Friendly Desktop uses (referenced in <a href="https://forum.armbian.com/topic/11086-pwm-fan-on-nanopi-m4/" rel="">this post</a>).
</p>

<p>
	 
</p>

<p>
	But then I found this rather interesting link from the Kobol guys: <a href="https://wiki.kobol.io/helios4/pwm/" rel="external nofollow">https://wiki.kobol.io/helios4/pwm/</a>. Apparently the Linux kernel has built-in thermal control and user space scripting isn't even required, just editing the Device Tree.
</p>

<p>
	 
</p>

<p>
	But as we have easy user overlays for the RK3399, let's go ...
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">tparys@m4v2:~$ sudo armbian-add-overlay nanopi-m4-fan.dts 
Compiling the overlay
Copying the compiled overlay file to /boot/overlay-user/
Reboot is required to apply the changes</span></pre>

<p>
	 
</p>

<p>
	... or manually compile via <abbr title="Device tree compiler">DTC</abbr> and copy to /boot/overlay-user, update /boot/armbianEnv.txt. Whichever makes you happy.
</p>

<p>
	 
</p>

<p>
	Seems to work well with the metal case I have for my M4V2 and NVME hat. Don't have a SATA hat, but if uses the same PWM pins, it should work there as well. No separate userspace package or SystemD service, and it should even kick in if the system gets stuck in boot (SystemD emergency mode).
</p>

<p>
	 
	</p><p>
		Probably several improvements that could be made:
	</p>


<ol>
	<li>
		Fan is currently triggered only by CPU temperature, not <abbr title="Graphic processing unit (3D acceleration)">GPU</abbr>.
	</li>
	<li>
		The fan replaces the first CPU trip point, which looks like it scales back the two big CPU cores. Not sure if this still needed.
	</li>
	<li>
		PWM frequency (40000) is a total guess. Better period to use?
	</li>
	<li>
		I don't see a much fan speed difference between cooling states 1-3. They should be 25, 50, and 100%, but all sound the same. Might have missed something.
	</li>
</ol>

<p>
	 
</p>

<p>
	Would be interested to hear any thoughts/feedback or if it's useful to anyone else.
</p>

<p>
	 
</p>
<p>
<a class="ipsAttachLink" href="https://forum.armbian.com/applications/core/interface/file/attachment.php?id=7586" data-fileExt='dts' data-fileid='7586'>nanopi-m4-fan.dts</a></p>]]></description><guid isPermaLink="false">17022</guid><pubDate>Fri, 12 Feb 2021 02:44:29 +0000</pubDate></item><item><title>Enabling Infrared IR Receiver on NanoPI NEO</title><link>https://forum.armbian.com/topic/17007-enabling-infrared-ir-receiver-on-nanopi-neo/</link><description><![CDATA[<p>
	TL;DR *Works* with a minor amendment to the <abbr title="Device tree source">DTS</abbr> overlay pin reference.
</p>

<p>
	 
</p>

<pre class="ipsCode">
$ uname -a
Linux nanopineo 5.10.13-sunxi #trunk SMP Mon Feb 8 21:56:43 CET 2021 armv7l armv7l armv7l GNU/Linux

$ dmesg | grep Machine
[    0.000000] OF: fdt: Machine model: FriendlyARM NanoPi NEO

# Baked current kernel. Configuration ... CIR module appears to NOT be enabled by default for NanoPI NEO.
$ grep -iE  "^CONFIG_IR_.*(CIR|SUN)" /boot/config-5.10.13-sunxi
CONFIG_IR_GPIO_CIR=m
CONFIG_IR_SUNXI=m

# Connected Vishay TSOP4838 IR Receiver to 3V3 (via 100R, with C100nF to GND), GND, OUT -&gt; PL11
#              +----------+
# 1 --- OUT ---!     /--\ !
# 2 --- GND ---!     |  | !
# 3 --- 3V3 ---!     \__/ !
#              +----------+

# Get DTS and install as user overlay (commit 0ff3217)
$ wget -O sun8i-h3-cir.dts https://raw.githubusercontent.com/armbian/sunxi-DT-overlays/master/sun8i-h3/sun8i-h3-cir.dts
# Fix pin reference
# from     ir_pins_a             (from DTS file)
#   to               r_ir_rx_pin (from dtc -I fs -O dts /proc/device-tree)
$ sed -e "s/ir_pins_a/r_ir_rx_pin/" sun8i-h3-cir.dts &gt; sun8i-h3-cir-nanopineo.dts

$ cat sun8i-h3-cir-nanopineo.dts
/dts-v1/;
/plugin/;

/ {
        compatible = "allwinner,sun8i-h3";

        fragment@0 {
                target = &lt;&amp;ir&gt;;
                __overlay__ {
                        pinctrl-names = "default";
                        pinctrl-0 = &lt;&amp;r_ir_rx_pin&gt;;
                        status = "okay";
                };
        };
};

$ armbian-add-overlay sun8i-h3-cir-nanopineo.dts
Compiling the overlay
Copying the compiled overlay file to /boot/overlay-user/
Reboot is required to apply the changes

$ shutdown -r now

$ dmesg | grep sunxi-ir
[   10.653323] rc rc0: sunxi-ir as /devices/platform/soc/1f02000.ir/rc/rc0
[   10.653692] rc rc0: lirc_dev: driver sunxi-ir registered at minor = 0, raw IR receiver, no transmitter
[   10.653883] input: sunxi-ir as /devices/platform/soc/1f02000.ir/rc/rc0/input3
[   10.665297] sunxi-ir 1f02000.ir: initialized sunXi IR driver

# Protocols file is there == driver present and overlay loaded OK.
$ cat /sys/class/rc/rc0/protocols
rc-5 nec rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon rc-mm [lirc]

# Enable "nec" protocol.
# I tried them all to find out what encoding is used by the remote that I happened to have here.
# There may be a smarter way where the IR subsystem tells you what encoding an incoming signal has.
$ echo "+nec" &gt; /sys/class/rc/rc0/protocols

# The bracketed items appear to be [enabled]
$ cat /sys/class/rc/rc0/protocols
rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon rc-mm [lirc]

# Test:
$ apt-get install ir-keytable

$ ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-empty
        Input device: /dev/input/event3
        LIRC device: /dev/lirc0
        Attached BPF protocols: Operation not supported
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc nec
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms

$  ir-keytable -t
Testing events. Please, press CTRL-C to abort.
147.355171: lirc protocol(necx): scancode = 0xe31947
147.355225: event type EV_MSC(0x04): scancode = 0xe31947
147.355225: event type EV_SYN(0x00).
^C


# Test using event system (adjust Input device, cf. above):
$ evtest /dev/input/event3
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "sunxi-ir"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 152 (KEY_SCREENLOCK)
  Event type 2 (EV_REL)
    Event code 0 (REL_X)
    Event code 1 (REL_Y)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Key repeat handling:
  Repeat type 20 (EV_REP)
    Repeat code 0 (REP_DELAY)
      Value    500
    Repeat code 1 (REP_PERIOD)
      Value    125
Properties:
  Property type 5 (INPUT_PROP_POINTING_STICK)
Testing ... (interrupt to exit)
Event: time 1612923728.916182, type 4 (EV_MSC), code 4 (MSC_SCAN), value e31948
Event: time 1612923728.916182, -------------- SYN_REPORT ------------
Event: time 1612923728.967737, type 4 (EV_MSC), code 4 (MSC_SCAN), value e31948
Event: time 1612923728.967737, -------------- SYN_REPORT ------------
^C

# From here on, use LIRC and/or adjust /etc/rc_maps.cfg et al. to map scan
# codes to key codes. This makes the IR receiver compatible with media player
# software. For the IoT device that I am building currently the scan codes
# suffice, so I won't describe this here.
</pre>

<p>
	<br />
	(I am not really sure if that name change is a bug in the <abbr title="Device tree source">DTS</abbr> repository, or if that name "ir_pins_a" refers to an older kernel, or if one is supposed to have another DT fragment somewhere that maps "ir_pins_a" to "r_ir_rx_pin", please comment if above is not the _right solution_.)
</p>
]]></description><guid isPermaLink="false">17007</guid><pubDate>Wed, 10 Feb 2021 02:38:14 +0000</pubDate></item><item><title>Guide: How to use Touchscreen + LCD on H3 devices</title><link>https://forum.armbian.com/topic/4837-guide-how-to-use-touchscreen-lcd-on-h3-devices/</link><description><![CDATA[<p>
	First of all, credits goes to <a href="https://4pda.ru/forum/lofiversion/index.php?t750921-2560.html" rel="external nofollow">https://4pda.ru/forum/lofiversion/index.php?t750921-2560.html</a>
</p>

<p>
	Device that I used for this guide: <a href="https://www.aliexpress.com/item/3-5-Inch-TFT-LCD-Moudle-For-Raspberry-Pi-2-Model-B-RPI-B-raspberry-pi/32707058182.html" rel="external nofollow">https://www.aliexpress.com/item/3-5-Inch-TFT-LCD-Moudle-For-Raspberry-Pi-2-Model-B-RPI-B-raspberry-pi/32707058182.html</a>
</p>

<p>
	Pinout: <a href="http://www.waveshare.com/3.5inch-rpi-lcd-a.htm" rel="external nofollow">http://www.waveshare.com/3.5inch-rpi-lcd-a.htm</a> (Yes, the device is a waveshare knockoff)
</p>

<p>
	How to place the device? For Orange pi lite/one it is reversed. For the rest, it should be normal.
</p>

<p>
	Refer to <a href="https://forum.armbian.com/index.php?/topic/724-quick-review-of-orange-pi-one/" rel="">https://forum.armbian.com/index.php?/topic/724-quick-review-of-orange-pi-one/</a> for more info.
</p>

<p>
	 
</p>

<p>
	There are two sections to this guide.
</p>

<p>
	<u><strong>Legacy / Mainline</strong></u>
</p>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> </a><strong><a rel="">Legacy Kernel [You can only </a><u><a rel="">EITHER</a></u><a rel=""> use touch or LCD due to issues with spi chip select]</a></strong><a rel=""> </a>
</p>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> </a><u><a rel="">LCD</a></u><a rel=""> </a>
</p>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 1) Load fbtft and fbtft_device on boot </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo nano /etc/modules-load.d/fbtft.conf 
fbtft
fbtft_device</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 2) Load fbtft_device options </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">nano /etc/modprobe.d/fbtft.conf 
options fbtft_device rotate=90 name=piscreen speed=16000000 gpios=reset:2,dc:71 txbuflen=32768 fps=25</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 3) Make sure X11 loads to the correct framebuffer (fb8 for legacy) </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">nano /etc/X11/xorg.conf.d/50-fbturbo.conf
find fb0 and change to fb8</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 4) Reboot your device (sudo reboot) and you screen should be lit up </a>
</p>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> </a>
</p>

<p>
	<u></u>============================================
</p>

<p>
	<u><a rel="">TOUCH</a></u><a rel=""> </a>
</p>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 1) Download ads7846 touch driver (compatible with xpt2046) </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">mkdir ds7846 
cd ds7846 
wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.6.y/drivers/input/touchscreen/ads7846.c</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 2) Create a makefile (Take note that it is TABS instead of spaces before the $(MAKE)) </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">nano Makefile
Insert the below in without the -----
--------------------------------
obj-m := ads7846.o 
KDIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 
all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules 
clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean 
install:
	$(MAKE) -C $(KDIR) M=$(PWD) modules_install
--------------------------------</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 3) Exit nano and run the following </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo make
sudo make install
sudo depmod</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 4) Download and compile and install ads7846_device </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">cd .. 
git clone https://github.com/notro/fbtft_tools/
cd fbtft_tools/ads7846_device 
make 
sudo make install 
sudo depmod </span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 5) Load ads7846 and ads7846_device on boot </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo nano /etc/modules-load.d/ads7846.conf 
ads7846 
ads7846_device</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 6) Load ads7846_device options </a>
</p>

<p>
	<a rel=""> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">nano /etc/modprobe.d/ads7846_device.conf 
options ads7846_device model=7846 cs=0 gpio_pendown=1 keep_vref_on=1 swap_xy=1 pressure_max=255 x_plate_ohms=60 x_min=200 x_max=3900 y_min=200 y_max=3900</span></pre>

<p>
	<a rel=""> </a>
</p>

<p>
	<a rel=""> 7) Reboot your device and run evtest</a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo reboot
sudo evtest</span></pre>

<p>
	Find your touch device and happy touching. Every touch should generate an event.
</p>
]]></description><guid isPermaLink="false">4837</guid><pubDate>Mon, 31 Jul 2017 12:03:58 +0000</pubDate></item><item><title>Review of Station M1: a perfect home server!</title><link>https://forum.armbian.com/topic/16893-review-of-station-m1-a-perfect-home-server/</link><description><![CDATA[<p>
	Station M1 is based on a firefly board quite similar to roc-rk3328-cc. However, the M1 has a different layout with all ports on the left or on the right, and it is enclosed in a metal case used also as a heat sink. The device tree is also different (rk3328-roc-pc instead of rk3328-roc-cc) and by default a smooth android 10 system is installed on <abbr title="embedded MultiMediaCard">emmc</abbr>. Additionally, the powering of this board is ensured by a 5V USB-C port instead of a micro-usb for the roc-cc. You can find official pictures and specifications <a href="https://www.stationpc.com/portal.php?mod=topic&amp;topicid=7" rel="external nofollow">here</a>.
</p>

<p>
	 
</p>

<p>
	My M1 has 2GB ram and 16GB <abbr title="embedded MultiMediaCard">emmc</abbr> but variants with 4GB ram and more <abbr title="embedded MultiMediaCard">emmc</abbr> storage can be bought. Currently, an armbian <abbr title="Community supported Chip - no official support">CSC</abbr> image can be downloaded (bullseye or focal) or built using armbian buiding system.
</p>

<p>
	I tried several images and all boots fine with almost everything working out of the box for a server use case. Here is the log of armbianmonitor with a buster build from the end of january 2021 with kernel 5.10.9: <a href="http://ix.io/2Nol" rel="external nofollow">http://ix.io/2Nol</a>
</p>

<p>
	 
</p>

<p>
	Idle the temperature goes under 40°C in a room where the temperature is about 21°C and the metal case is not warm. Running <abbr title="Single board computer">sbc</abbr>-bench in this context produces these results: <a href="http://ix.io/2NoL" rel="external nofollow">http://ix.io/2NoL</a>
</p>

<p>
	The temperature never goes over 61°C without any throttling. Compared to some other rk3328 SBCs, the M1 is cooler and this is mainly due to its metal case.
</p>

<p>
	 
</p>

<p>
	After general configuration with armbian-config, installing openmediavault and docker were as easy as possible, since they are also available through armbian-config in the softy menu.
</p>

<p>
	After connecting an usb3 drive, I got an efficient nas system for a personal use. It can also be considered as a home-server while running several additional services thanks to docker (home-assistant, zigbee2mqtt, pyload, etc.). With this use case, the 4 A53 cores and 2 GB of ram are more than enough and all is running smoothly.
</p>

<p>
	 
</p>

<p>
	I also use other similar arm boards and here is my comparison:
</p>

<p>
	- an amlogic S912 TV box with 3GB ram and GBit ethernet using armbianTV: 2GB is enough in my case and rk3328 is better supported than s912. Moreover, s912 is not officially supported by armbian, and latest armbianTV images are not compatible. The USB3 port on M1 is also a great improvement over USB2 for s912. TV boxes may also have unrecognized wifi chips whereas M1 has working wifi (and bluetooth ? not tested).
</p>

<p>
	- Librecomputer lafrite 1GB: it is officially supported by armbian and it works well. Its main drawbacks compared to M1 is only 1GB, USB2 and only 100MBits ethernet, but it is much cheaper.
</p>

<p>
	- Pine64 Pineh64 model B: IMO it is the real competitor to the M1. It has similar features with USB3 and GBE. It is officially supported by armbian and it has a more powerful <abbr title="System On a Chip">SoC</abbr> (Allwinner H6: 1.8Ghz 4xA53 with mali 720 <abbr title="Graphic processing unit (3D acceleration)">gpu</abbr>). However, this board is much warmer than M1 since in the same room its temperature is greater than 60°C while idle and throttling may occur on moderate to heavy loads. For moderate use case M1 is enough.
</p>

<p>
	 
</p>

<p>
	What to expect in the future:
</p>

<p>
	- We can hope that this <abbr title="Single board computer">SBC</abbr> becomes quickly officially supported, since the <abbr title="Community supported Chip - no official support">CSC</abbr> release is already very mature (in my opinion).
</p>

<p>
	- The main element that can be missing with mainline kernel for some use cases is the <abbr title="Graphic processing unit (3D acceleration)">GPU</abbr> (for desktop use) and <abbr title="Video processing unit (encoding/decoding)">VPU</abbr>, but they are available on 4.4 kernel.
</p>

<p>
	 
</p>

<p>
	Another review of the M1 (using also armbian): <a href="https://www.thanassis.space/stationm1.html" rel="external nofollow">https://www.thanassis.space/stationm1.html</a>
</p>

<p>
	Official forum: <a href="https://www.stationpc.com/forum-60-1.html" rel="external nofollow">https://www.stationpc.com/forum-60-1.html</a>
</p>
]]></description><guid isPermaLink="false">16893</guid><pubDate>Tue, 26 Jan 2021 16:12:43 +0000</pubDate></item><item><title>The Pinebook Pro</title><link>https://forum.armbian.com/topic/16868-the-pinebook-pro/</link><description><![CDATA[<p>
	<a href="https://zuckerbude.org/the-pinebook-pro/" ipsnoembed="true" rel="external nofollow">https://zuckerbude.org/the-pinebook-pro/</a>
</p>
]]></description><guid isPermaLink="false">16868</guid><pubDate>Sun, 24 Jan 2021 09:59:12 +0000</pubDate></item><item><title>sbc-bench</title><link>https://forum.armbian.com/topic/7819-sbc-bench/</link><description><![CDATA[<p>
	Hi all,
</p>

<p>
	 
</p>

<p>
	<abbr title="Single board computer">sbc</abbr>-bench is now on Github: <a href="https://github.com/ThomasKaiser/sbc-bench" rel="external nofollow">https://github.com/ThomasKaiser/<abbr title="Single board computer">sbc</abbr>-bench</a>
</p>

<p>
	 
</p>

<p>
	I'll link from the README there to this thread for further discussion about the tool and proper benchmark methodology.
</p>
]]></description><guid isPermaLink="false">7819</guid><pubDate>Sat, 28 Jul 2018 14:35:46 +0000</pubDate></item><item><title>Build Armbian with Panfrost (outdated)</title><link>https://forum.armbian.com/topic/11334-build-armbian-with-panfrost-outdated/</link><description><![CDATA[<p>
	<span style="font-size:18px;"><u><strong><abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">Panfrost</abbr></abbr> instructions Armbian</strong></u></span><br />
	 
</p>

<ul>
	<li>
		<u><em><strong>!!!! I made a script that does all this, check a few posts later for the script !!!!!</strong></em></u>
	</li>
</ul>

<p>
	 
</p>

<p>
	This tutorial explains how to build an Armbian image with <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr>. And what else you need to make it work.
</p>

<p>
	These are early drivers. Many things don't work yet. Only OpenGL 2.1 works now.
</p>

<p>
	 
</p>

<p>
	You need to build an image with kernel 5.2 or later.<br />
	For this you need an x86 pc with Ubuntu 18.04 or a virtual Ubuntu 18.04 x86 image.
</p>

<p>
	<br />
	First install git, then clone the build folder from Armbian, and enter the build directory.
</p>

<p>
	 
</p>

<pre class="ipsCode">
apt-get -y -qq install git
git clone --depth 1 https://github.com/armbian/build
cd build</pre>

<p>
	Now run the script with EXPERT=yes so you can choose to build a dev image.
</p>

<pre class="ipsCode">
sudo ./compile EXPERT=yes</pre>

<ul>
	<li>
		Choose "Full OS image for flashing"
	</li>
	<li>
		Then "Show a kernel configuration menu before compilation"
	</li>
	<li>
		Choose your board. If it's not in the regular list, look in "Show SCS/<abbr title="Work in progress"><abbr title="Work in progress">WIP</abbr></abbr>/<abbr title="End of support"><abbr title="End of support">EOS</abbr></abbr>/TVB".
	</li>
	<li>
		Choose Development version
	</li>
	<li>
		kernel configuration -&gt; device drivers -&gt; graphic drivers -&gt; <abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">panfrost</abbr></abbr>
	</li>
</ul>

<p>
	 
</p>

<p>
	Let it run until it's finished. The image will be in the /build/output/images
</p>

<p>
	Burn it to an SD-card/<abbr title="embedded MultiMediaCard"><abbr title="embedded MultiMediaCard">eMMC</abbr></abbr>/...
</p>

<p>
	 
</p>

<p>
	Now we need to install all the needed software
</p>

<pre class="ipsCode">
sudo apt install flex bison python3-mako libwayland-egl-backend-dev libxcb-dri3-dev libxcb-dri2-0-dev libxcb-glx0-dev libx11-xcb-dev libxcb-present-dev libxcb-sync-dev libxxf86vm-dev libxshmfence-dev libxrandr-dev libwayland-dev libxdamage-dev libxext-dev libxfixes-dev x11proto-dri2-dev x11proto-dri3-dev x11proto-present-dev x11proto-gl-dev x11proto-xf86vidmode-dev libexpat1-dev libudev-dev gettext glmark2 glmark2-es2 mesa-utils xutils-dev libpthread-stubs0-dev ninja-build bc python-pip flex bison cmake git valgrind llvm llvm-8-dev python3-pip  pkg-config zlib1g-dev wayland-protocols</pre>

<p>
	Download and install meson
</p>

<pre class="ipsCode">
wget http://ftp.de.debian.org/debian/pool/main/m/meson/meson_0.55.3-1_all.deb
sudo dpkg -i meson_0.55.3-1_all.deb</pre>

<p>
	Download and install mesa DRM
</p>

<pre class="ipsCode">
git clone git://anongit.freedesktop.org/mesa/drm
cd drm
meson build --prefix=/usr
ninja -C build
sudo -E ninja -C build install
cd ..</pre>

<p>
	Download and install mesa graphics
</p>

<pre class="ipsCode">
git clone git://anongit.freedesktop.org/mesa/mesa
cd mesa
meson -Ddri-drivers= -Dvulkan-drivers= -Dgallium-drivers=panfrost,kmsro -Dlibunwind=false -Dprefix=/usr build/
ninja -C build/
sudo ninja -C build/ install</pre>

<p>
	<strong>REBOOT</strong>
</p>

<p>
	 
</p>

<p>
	Optionally, update sdl (recommended)
</p>

<pre class="ipsCode">
git clone https://github.com/SDL-mirror/SDL.git
cd SDL
mkdir build
cd build
cmake ../  
make -j6
sudo make install</pre>

<p>
	<strong>REBOOT</strong>
</p>

<p>
	 
</p>

<p>
	Only thing that works ok with it is supertuxkart, to install it.
</p>

<p>
	sudo apt install supertuxkart
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong><u><abbr title="driver for Mali Midgard and Bifrost GPUs"><abbr title="driver for Mali Midgard and Bifrost GPUs">Panfrost</abbr></abbr> - Linux games working from repo</u></strong></span><br />
	SuperTuxKart - Works well<br />
	ExtremeTuxRacer - lots of glitches<br />
	AssaultCube - lots of glitches
</p>

<p>
	 
</p>

<p>
	Instructions by Salvador Liébana &amp; NicoD
</p>
]]></description><guid isPermaLink="false">11334</guid><pubDate>Tue, 20 Aug 2019 19:23:58 +0000</pubDate></item><item><title>Video : New at Armbian! Build your own Armbian image on your ARM SBC!</title><link>https://forum.armbian.com/topic/16582-video-new-at-armbian-build-your-own-armbian-image-on-your-arm-sbc/</link><description><![CDATA[<p>
	Hi all.<br />
	I've just finished a new video where I show how to build Armbian images on your ARM <abbr title="Single board computer">SBC</abbr>. <br />
	Here is the video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="113" width="200" data-embed-src="https://www.youtube.com/embed/G418Bpo9Ypc?feature=oembed"></iframe>
	</div>
</div>

<p>
	<br />
	All have a jolly good Christmas or other holiday or normal day. 
</p>
]]></description><guid isPermaLink="false">16582</guid><pubDate>Thu, 24 Dec 2020 15:13:23 +0000</pubDate></item><item><title>Remote Desktop Fun with Armbian</title><link>https://forum.armbian.com/topic/1044-remote-desktop-fun-with-armbian/</link><description><![CDATA[<p>
	Is OPI ONE a toy or a toy ? Yes and yes and a fun one too ! The following experiment shows the OPI ONE in use as a <strong>Virtual Desktop Server</strong> AND <strong>Virtual Desktop Client</strong>.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<u><strong>Setup as Virtual Desktop Server ( remotely access headless OPI ONE desktop )</strong></u>
</p>

<p>
	 
</p>

<p>
	OPI ONE  : install xrdp and tightvncserver
</p>

<p>
	&lt;clients&gt;  : install and configure remote desktop  ( rdesktop on linux, aRDP on android - not yet tested on OS-X or WIN )
</p>

<p>
	 
</p>

<p>
	<u><strong>Setup as Virtual Desktop Client ( OPI ONE securely accesses a remote linux desktop )</strong></u>
</p>

<p>
	 
</p>

<p>
	OPI ONE  : install x2goclient
</p>

<p>
	&lt;server&gt;  : install x2goserver on linux server ( physical or virtual ) of choice
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	This document explains the experiment ( <img alt=":(" height="20" src="https://forum.armbian.com/uploads/emoticons/default_sad.png" srcset="https://forum.armbian.com/uploads/emoticons/sad@2x.png 2x" width="20"> you have to click/enlarge pictures in your browser .. sorry )
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="231" href="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-88867900-1461320938.png" rel=""><img alt="post-898-0-88867900-1461320938_thumb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="231" src="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-88867900-1461320938_thumb.png"></a>
</p>

<p>
	 
</p>

<p>
	And here is a screenshot of the actual session :
</p>

<p>
	 
</p>

<p>
	Red : Linux server desktop connecting to OPI ONE via rdesktop / xrdp
</p>

<p>
	Orange : OPI ONE desktop connecting to UK virtual server via x2goclient/x2goserver
</p>

<p>
	Purple : virtual server (UK) desktop running libreoffice
</p>

<p>
	White : actual document being edited ( incl. drawings ! ) in window
</p>

<p>
	 
</p>

<p>
	( Headline : Italian guy in Switzerland abuses OPI ONE to edit nerd stuff in the UK )
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="229" href="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-43502100-1461320061.jpg" rel=""><img alt="post-898-0-43502100-1461320061_thumb.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="229" src="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-43502100-1461320061_thumb.jpg"></a>
</p>

<p>
	 
</p>

<p>
	Remote desktop access from smartphone ( cheap Wiko Lenny 2 ) for touch-fumbling nano-fingers
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="227" href="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-31168300-1461320056.jpg" rel=""><img alt="post-898-0-31168300-1461320056_thumb.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="227" src="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-31168300-1461320056_thumb.jpg"></a>
</p>

<p>
	 
</p>

<p>
	Remote desktop access from tablet ( Galaxy Note 8.0  ) using pen
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="228" href="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-36923500-1461320059.jpg" rel=""><img alt="post-898-0-36923500-1461320059_thumb.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="228" src="https://forum.armbian.com/uploads/monthly_04_2016/post-898-0-36923500-1461320059_thumb.jpg"></a>
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	There are numerous use cases covered with the simple techniques employed.Thanks to the Armbian team and the forum buddies for their excellent job in making OPI ONE usable.
</p>

<p>
	 
</p>

<p>
	Have fun !
</p>
]]></description><guid isPermaLink="false">1044</guid><pubDate>Fri, 22 Apr 2016 10:32:40 +0000</pubDate></item><item><title>Novusun CNC Controller Review</title><link>https://forum.armbian.com/topic/16590-novusun-cnc-controller-review/</link><description><![CDATA[<p>
	Hey guys i recently read Reviews of  Novusun CNC from <a href="https://theedgecutter.com/novusun-cnc-controller-review/" rel="external nofollow">this guide</a> and found quiet good therefore think to share with you guys. Many of us might need top-notch external CNC controller and Novusun  is a good option. 
</p>

<p>
	I loved EC500 MACH3 Ethernet port 6 axis Motion Controller as it can support 16 optical-isolated digital output ports along with 18 optical-isolated digital input ports. It has a 24-36v dc power input for its IO power supply offering efficient anti-interference ability. Also, the latest EMC design makes it easy to work with the CNC motion controller. 
</p>
]]></description><guid isPermaLink="false">16590</guid><pubDate>Fri, 25 Dec 2020 20:23:50 +0000</pubDate></item><item><title>Video : Review of an AWS Graviton2 ARM server</title><link>https://forum.armbian.com/topic/16154-video-review-of-an-aws-graviton2-arm-server/</link><description><![CDATA[<p>
	Hi all.<br />
	I've just finished a new video where I review an Amazon AWS Graviton2 arm64 server.<br />
	This is a monster with 64 high-performance N1 cores.<br />
	It isn't clocked that high at 2.5Ghz, but it performs amazing for that clockspeed.<br />
	Here is my video.
</p>

<div class="ipsEmbeddedVideo">
	<div>
		<iframe allowfullscreen="" frameborder="0" height="270" width="480" data-embed-src="https://www.youtube.com/embed/hZMnSBV1qJk?feature=oembed"></iframe>
	</div>
</div>

<p>
	<br />
	Here all the info I've gathered.<br />
	 
</p>

<pre class="ipsCode">
AWS Server 32-cores 128GB
-------------------------

NEOVERSE N1 64-core AWS Graviton2
ARMv8.2 aarch64
Arm’s Neoverse N1 cores -&gt; based on A76 -&gt; almost identical to Arm’s 64-core reference N1 platform -&gt; CPU cores are clocked a bit lower 2.5GHz and only 32MB instead of 64MB of L3 cache
Max speed 2500Mhz
8-channel DDR-3200
128GB ram
64 PCIe4 lanes
TSMC’s 7nm process node
~1W per core at the 2.5GHz frequency
between 80W as a low estimate to around 110W estimation. This info is not disclosed by AWS

7z single core
Ampere 32-core     : 2763
AWS 32-core        : 3393
Threadripper 3990x : 4545


7z quad core   :  
Raspberry Pi 4 @ 1.5Ghz :  6307
Odroid N2+ 4xA73@2.4Ghz :  9900
Ampere 32-core          : 11145
AWS 32-core             : 13733
Threadripper 3990x      : 18060

7z all cores   : 
Ampere 32-core     :  85975
AWS 32-core        : 110628
Threadripper 3990x : 391809   433702 OC



Blender BMW CPU
Odroid N2+         : 30m
Ampere 32-core     :  8m27s
AWS Server 32-core :  2m08s
ThreadRipper 3990x :    30s

Blender Barber shop CPU 
AWS Server 32-core : 8m28s
Threadripper 3990x : 2m18s79

CPU Miner
Odroid N2+         :   14
Ampere 32-core     :   87
AWS Server 32-core :  154.20
ThreadRipper 3990x : 1310

SBC bench : http://ix.io/2FrG

Internet speed test between 1500 Mbit/s and 2000 Mbit/s both up- and download (up to 250MB/s)

I had 32-cores of the 64-cores. It is expected to perform a bit worse per core with 64-cores vs 32-cores since less cache available per core.

There's a newer Ampere 80-core N1 at 3Ghz SoC.  

https://www.anandtech.com/show/15578/cloud-clash-amazon-graviton2-arm-against-intel-and-amd/6</pre>

<p>
	Thank you to <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/1231-lanefu/?do=hovercard" data-mentionid="1231" href="https://forum.armbian.com/profile/1231-lanefu/" rel="">@lanefu</a> for giving me access to this.
</p>
]]></description><guid isPermaLink="false">16154</guid><pubDate>Fri, 27 Nov 2020 19:11:25 +0000</pubDate></item><item><title>Run Htop on Web Browser</title><link>https://forum.armbian.com/topic/16110-run-htop-on-web-browser/</link><description><![CDATA[<p>
	Here are the instructions to run <strong>Htop</strong> remotely using a web browser.
</p>

<p>
	I often use Htop to monitor the health of my boards and servers (amd64). It is a good tool for the sys admin to monitor the servers in <span style="color:#c0392b;"><strong>real-time </strong></span>without much resources and it is not very intrusive.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>Recipe</strong>
</p>

<p>
	 
</p>

<p>
	<strong>1 - Clone shellinabox</strong>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">root@cubieboard2:~# git clone https://github.com/shellinabox/shellinabox
Cloning into 'shellinabox'...
remote: Enumerating objects: 3073, done.
remote: Total 3073 (delta 0), reused 0 (delta 0), pack-reused 3073
Receiving objects: 100% (3073/3073), 4.31 MiB | 1.89 MiB/s, done.
Resolving deltas: 100% (2418/2418), done.
root@cubieboard2:~# cd shellinabox/</span></pre>

<p>
	<br />
	 
</p>

<p>
	<strong>2 - Build and install shellinabox</strong>
</p>

<p>
	 
</p>

<p>
	shellinabox makefile is outdated for OpenSSL 1.1.y, so we need to bypass the linking process and do it manually.
</p>

<p>
	During the config process you get some errors, bypass the error by doing like so:
</p>

<p>
	<br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">root@cubieboard2:~/shellinabox# apt-get install libtool

root@cubieboard2:~/shellinabox# autoreconf -i
root@cubieboard2:~/shellinabox# autoconf
root@cubieboard2:~/shellinabox# autoreconf -i

root@cubieboard2:~/shellinabox# ./configure

root@cubieboard2:~/shellinabox# make


</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>3 - Bypass the linking error</strong>
</p>

<p>
	 
</p>

<p>
	During the link process you get a missing openssl 1.1 lib, we then manually link shellinabox:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">root@cubieboard2:~/shellinabox#  gcc -g -std=gnu99 -Wall -Os -o shellinaboxd shellinabox/shellinaboxd.o shellinabox/externalfile.o shellinabox/launcher.o shellinabox/privileges.o shellinabox/service.o shellinabox/session.o shellinabox/usercss.o  ./.libs/liblogging.a ./.libs/libhttp.a -ldl -lutil -lssl -lcrypto</span></pre>

<p>
	 
</p>

<p>
	<strong>4 - Running Htop on the Browser</strong>
</p>

<p>
	 
</p>

<p>
	I choose not to install shellinabox, just run a service to be able to run and make Htop available on the Browser.
</p>

<p>
	Tested on Google Chromium and FireFox (linux).
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">root@cubieboard2:~/shellinabox# ./shellinaboxd -t -b -p 8888 --no-beep -s '/htop_app/:alex:alex:/:htop -d 10'</span></pre>

<p>
	 
</p>

<p>
	where <strong>8888</strong> is the port.
</p>

<p>
	<strong>alex:alex</strong> is the user:group to run Htop with. Use yours [user] and [group].
</p>

<p>
	 
</p>

<p>
	<strong>Note: </strong>for security reason if you run with <strong>nobody:nogroup</strong> you wont be able to <u>add</u> or <u>change</u> any config on the Htop.
</p>

<p>
	 
</p>

<p>
	Now fire the browser at <strong>http://ip_address:8888/htop_app/</strong> and that's it, enjoy.
</p>

<p>
	 
</p>

<p>
	<strong>5 - Credits</strong>
</p>

<p>
	 
</p>

<p>
	stackverflow, user ofstudio.
</p>

<p>
	 
</p>

<p>
	Screenshot:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://forum.armbian.com/uploads/monthly_2020_11/chromium.png.7a49f1ca54c7b5e16e136ee954291efe.png" data-fileid="7262" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="7262" data-ratio="56.30" width="1000" alt="chromium.thumb.png.696b82421900e4186f16d09dcef80ea4.png" src="https://forum.armbian.com/uploads/monthly_2020_11/chromium.thumb.png.696b82421900e4186f16d09dcef80ea4.png" /></a>
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://forum.armbian.com/uploads/monthly_2020_11/firefox.png.96c08566015c763d70d7787733720318.png" data-fileid="7260" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="7260" data-ratio="56.30" width="1000" alt="firefox.thumb.png.8c2d515a0b311faf384cd0da2c43a409.png" src="https://forum.armbian.com/uploads/monthly_2020_11/firefox.thumb.png.8c2d515a0b311faf384cd0da2c43a409.png" /></a>
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">16110</guid><pubDate>Wed, 25 Nov 2020 20:39:08 +0000</pubDate></item><item><title>Self-contained Tensorflow object detector on Orange pi lite + GC2035</title><link>https://forum.armbian.com/topic/16058-self-contained-tensorflow-object-detector-on-orange-pi-lite-gc2035/</link><description><![CDATA[<p>
	I got my hands on a "Set 9" Orange Pi Lite + GC2035 camera a while back and I've finally been able to put together a self-contained object detection device using Tensorflow, without sending any image data outside for processing.
</p>

<p>
	<br>
	Basically, its a python Flask application that captures frames from the camera using a GStreamer pipeline. It runs them through a Tensorflow object detection model and spits out the same frame with extra metadata about objects it found, and renders a box around them. Using all four cores of the H2 it can do about 2-3 fps. The app keeps track of the count of all object types it has seen and exposes the metrics in prometheus format, for easy creation of graphs of what it sees over time with Grafana <img alt=":)" data-emoticon="" height="20" src="https://forum.armbian.com/uploads/emoticons/default_smile.png" srcset="https://forum.armbian.com/uploads/emoticons/smile@2x.png 2x" title=":)" width="20">
</p>

<p>
	 
</p>

<p>
	<img alt="grafana-dashboard.png" class="ipsImage" data-ratio="75.08" height="565" width="1000" src="https://raw.githubusercontent.com/atomic77/opilite-object-detect/master/img/grafana-dashboard.png">
</p>

<p>
	<br>
	I'll explain some of the more interesting aspects of how I got this to work here in case anyone else wants to try to get some use out of this very inexpensive hardware, and I am grateful to the many posts on this forum that helped me along the way!
</p>

<p>
	<br>
	<u>Use a 3.4 kernel with custom GC2035 driver</u>
</p>

<p>
	<br>
	Don't bother with anything new - the GC2035 was hopeless on any newer builds of Armbian I tried. The driver available at <a href="https://github.com/avafinger/gc2035.git" rel="external nofollow">https://github.com/avafinger/gc2035.git</a> provided far better image quality. After installing the updated GC2035, I run the following to get the camera up and running:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">sudo sunxi-pio -m "PG11&lt;1&gt;&lt;0&gt;&lt;1&gt;&lt;1&gt;"
sudo modprobe gc2035 hres=1
sudo modprobe vfe_v4l2</span></pre>

<p>
	 
</p>

<p>
	<u>Install Tensorflow lite runtime</u>
</p>

<p>
	 
</p>

<p>
	Google provides a tensorflow runtime as a binary wheel built for python 3.5 armv7. When pip installing, expect it to take 20 minutes or so as it will need to compile numpy (the apt repo version isn't recent enough)
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">wget https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp35-cp35m-linux_armv7l.whl
sudo -H pip3 install tflite_runtime-2.5.0-cp35-cp35m-linux_armv7l.whl</span></pre>

<p>
	 
</p>

<p>
	<br>
	<u>Build opencv for python 3.5 bindings</u>
</p>

<p>
	<br>
	This was something I tried everything I could to avoid, but I just could not get the colour conversion from the YUV format of the GC2035 to an RGB image using anything else I found online, so I was dependent on a single color-conversion utility function.
</p>

<p>
	 
</p>

<p>
	To build the <a href="https://github.com/opencv/opencv/archive/3.4.12.tar.gz" rel="external nofollow">3.4.12 version</a> for use with python (grab lunch - takes about 1.5 hours <span><span>:-O </span></span>)
</p>

<p>
	<br>
	 
</p>

<pre class="ipsCode">
cmake -DCMAKE_INSTALL_PREFIX=/home/atomic/local -DSOFTFP=ON \
    -DBUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_opencv_python2=0 \
    -D BUILD_opencv_python3=1 -D WITH_GSTREAMER=ON \
    -D PYTHON3_INCLUDE_PATH=/usr/include/python3.5  ..
make -j 4
make install

# Check that ~/local/lib/python3.5/dist-packages should now have the cv2 shlib
export PYTHONPATH=/home/atomic/local/lib/python3.5/dist-packages</pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<u>Build gstreamer plugin for Cedar H264 encoder</u>
</p>

<p>
	 
</p>

<p>
	This is required to get a working gstreamer pipeline for the video feed:
</p>

<pre class="ipsCode">
git clone https://github.com/gtalusan/gst-plugin-cedar
./autogen.sh
sudo make install
# When trying against a pipc I had to copy into .local to get gstreamer to recognise it
cp /usr/local/lib/gstreamer-1.0/libgst* ~/.local/share/gstreamer-1.0/plugins/
# Confirm that plugin is installed:
gst-inspect-1.0 cedar_h264enc
</pre>

<p>
	 
</p>

<p>
	<u>Processing images</u>
</p>

<p>
	 
</p>

<p>
	The full app source is on github, but the more interesting parts that took me some time to figure out were about getting python to cooperate with gstreamer:
</p>

<p>
	 
</p>

<p>
	Frames from the camera arrive to python at the end of the pipeline as an appsink. The Gstreamer pipeline I configured via python was:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint prettyprinted">
<span class="pln">    src </span><span class="pun">=</span><span class="pln">  </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"v4l2src"</span><span class="pun">)</span><span class="pln">
    src</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">"device"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/dev/video0"</span><span class="pun">)</span><span class="pln">
    src</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">"do-timestamp"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
    filt </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"capsfilter"</span><span class="pun">)</span><span class="pln">
    filt</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">"caps"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="pln">caps_from_string</span><span class="pun">(</span><span class="str">"video/x-raw,format=NV12,width=800,height=600,framerate=12/1"</span><span class="pun">))</span><span class="pln">
    p1 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"cedar_h264enc"</span><span class="pun">)</span><span class="pln">
    p2 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"h264parse"</span><span class="pun">)</span><span class="pln">
    p3 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"rtph264pay"</span><span class="pun">)</span><span class="pln">
    p3</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">"config-interval"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
    p3</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">"pt"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">96</span><span class="pun">)</span><span class="pln">
    p4 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"rtph264depay"</span><span class="pun">)</span><span class="pln">
    p5 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"avdec_h264"</span><span class="pun">)</span><span class="pln">
    sink </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">ElementFactory</span><span class="pun">.</span><span class="pln">make</span><span class="pun">(</span><span class="str">"appsink"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"sink"</span><span class="pun">)</span><span class="pln">
    pipeline_elements </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">src</span><span class="pun">,</span><span class="pln"> filt</span><span class="pun">,</span><span class="pln"> p1</span><span class="pun">,</span><span class="pln"> p2</span><span class="pun">,</span><span class="pln"> p3</span><span class="pun">,</span><span class="pln"> p4</span><span class="pun">,</span><span class="pln"> p5</span><span class="pun">,</span><span class="pln"> sink</span><span class="pun">]</span><span class="pln">

    sink</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">"max-buffers"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln">
    sink</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">'emit-signals'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
    sink</span><span class="pun">.</span><span class="pln">set_property</span><span class="pun">(</span><span class="str">'sync'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">False</span><span class="pun">)</span><span class="pln">
    sink</span><span class="pun">.</span><span class="pln">connect</span><span class="pun">(</span><span class="str">"new-sample"</span><span class="pun">,</span><span class="pln"> on_buffer</span><span class="pun">,</span><span class="pln"> sink</span><span class="pun">)</span></pre>

<p>
	<br>
	This pipeline definition causes a callback <em>on_buffer </em>to be called every time a frame is emitted from the camera:
</p>

<p>
	<br>
	 
</p>

<pre class="ipsCode prettyprint prettyprinted">
<span class="kwd">def</span><span class="pln"> on_buffer</span><span class="pun">(</span><span class="pln">sink</span><span class="pun">:</span><span class="pln"> </span><span class="typ">GstApp</span><span class="pun">.</span><span class="typ">AppSink</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">:</span><span class="pln"> typing</span><span class="pun">.</span><span class="typ">Any</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-&gt;</span><span class="pln"> </span><span class="typ">Gst</span><span class="pun">.</span><span class="typ">FlowReturn</span><span class="pun">:</span><span class="pln">
    </span><span class="com"># Sample will be a 800x900 byte array in a very frustrating YUV420 format</span><span class="pln">
    sample </span><span class="pun">=</span><span class="pln"> sink</span><span class="pun">.</span><span class="pln">emit</span><span class="pun">(</span><span class="str">"pull-sample"</span><span class="pun">)</span><span class="pln">  </span><span class="com"># Gst.Sample</span><span class="pln">
    </span><span class="pun">...</span><span class="pln"> conversion to numpy array
    </span><span class="com"># rgb is now in a format that Pillow can easily work with</span><span class="pln">
    </span><span class="com"># These two calls are what you compiled opencv for 1.5 hours for :-D</span><span class="pln">
    rgb </span><span class="pun">=</span><span class="pln"> cv2</span><span class="pun">.</span><span class="pln">cvtColor</span><span class="pun">(</span><span class="pln">img_arr</span><span class="pun">,</span><span class="pln"> cv2</span><span class="pun">.</span><span class="pln">COLOR_YUV2BGR_I420</span><span class="pun">)</span><span class="pln">
    rgb </span><span class="pun">=</span><span class="pln"> cv2</span><span class="pun">.</span><span class="pln">cvtColor</span><span class="pun">(</span><span class="pln">rgb</span><span class="pun">,</span><span class="pln"> cv2</span><span class="pun">.</span><span class="pln">COLOR_BGR2RGB</span><span class="pun">)</span></pre>

<p>
	<br>
	Once you have a nice pillow RGB image, it's easy to pass this into a Tensorflow model, and there is tons of material on the web for how you can do things like that. For fast but not so accurate detection, I used the ssdlite_mobilenet_v2_coco pretrained model, which can handle about 0.5 frames per second per core of the H2 Allwinner CPU.
</p>

<p>
	 
</p>

<p>
	There are some problems I still have to work out. Occasionally the video stream stalls and I haven't figured out how to recover from this without restarting the app completely. The way frame data is passed around tensorflow worker processes is probably not ideal and needs to be cleaned up, but it does allow me to get much better throughput using all four cores.
</p>

<p>
	 
</p>

<p>
	For more details, including a detailed build script, the full source is here:
</p>

<p>
	<a href="https://github.com/atomic77/opilite-object-detect" rel="external nofollow">https://github.com/atomic77/opilite-object-detect</a>
</p>
]]></description><guid isPermaLink="false">16058</guid><pubDate>Sat, 21 Nov 2020 03:36:06 +0000</pubDate></item><item><title>Emby Server with hardware transcoding in XU4/HC1/HC2 Armbian Stretch</title><link>https://forum.armbian.com/topic/8451-emby-server-with-hardware-transcoding-in-xu4hc1hc2-armbian-stretch/</link><description><![CDATA[<p>
	As a result of all the work that Armbian developers put into the upgrade to kernel 4.14 for the XU4 board family, now we can enjoy many new features. One of them is the access to the <abbr title="System On a Chip">SoC</abbr> video encoding capabilities.
</p>

<p>
	 
</p>

<p>
	Emby Media Server can take advantage of the Exynos 5422 MFC video engine for transcoding. That means lower CPU usage, lower temperatures, and the possibility of encoding in real time higher resolutions or more simultaneous streams. In my tests, I've been able to transcode one HEVC 1080p and one 480p at the same time, or five 480p (though it will depend on the bitrate of the source material).
</p>

<p>
	 
</p>

<p>
	However, the ffmpeg version shipped with official Emby is quite unstable when using this feature. For that reason, I compiled a better and more stable version from <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forum.armbian.com/profile/6493-memeka/?do=hovercard" data-mentionid="6493" href="https://forum.armbian.com/profile/6493-memeka/" rel="">@memeka</a>'s repo. I've been using it for over a month without a single crash.
</p>

<p>
	 
</p>

<p>
	So this is a step-by step guide on how to make everything work:
</p>

<p>
	 
</p>

<p>
	<strong>0. [PREREQUISITE]: You must be running an Armbian Strech XU4 "Next" image, <a href="https://dl.armbian.com/odroidxu4/Debian_stretch_next.7z" rel="external nofollow">like the one you can download here</a>.</strong>
</p>

<p>
	 
</p>

<ol>
	<li>
		<strong><a href="https://mega.nz/#!4rpT2C6K!sVwHMqMqqkzrvjee_KxVvXvQBRfrHgQj7icIHOpZW6M" rel="external nofollow"><span style="color:#c0392b;">&gt;&gt; DOWNLOAD the emby and ffmpeg packages from this link &lt;&lt;</span></a></strong>
	</li>
	<li>
		Install them (Note: this will install Emby Server version 3.5.3, which is the last at the writing of this tutorial. It has been tested to work with this version, and may or may not work with any other):
		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$ tar xvf emby-server-stretch-xu4_1.0.tar.xz
$ sudo dpkg -i ffmpeg/*.deb
$ sudo dpkg -i emby-server/*.deb
$ sudo apt -f install</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			Hold the ffmpeg packages, so they don't get upgraded:  
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$ sudo apt-mark hold ffmpeg-doc ffmpeg libavcodec-dev libavcodec-extra libavdevice-dev libavfilter-dev libavfilter-extra libavformat-dev libavresample-dev libavutil-dev libmysofa-dev libmysofa-utils libmysofa0 libpostproc-dev libswresample-dev libswscale-dev</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		Add the user "emby" to the video group, so it can have access to the transcoding engine:
		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$ sudo usermod -aG video emby</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		Modify the emby executable, to use our custom ffmpeg (Note: you will need to repeat this step every time you update the emby deb package):
		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$ sudo nano /opt/emby-server/bin/emby-server

# Change the following line:

ffmpeg $APP_DIR/bin/ffmpeg \

# to:

ffmpeg /usr/bin/ffmpeg \</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			Restart the service:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$ sudo service emby-server restart</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			Now, you can open the web browser, point to your Emby server (e.g. <a href="http://odroidxu4.local:8096" rel="external nofollow">http://odroidxu4.local:8096</a>), and configure it as described in the official tutorial (<a href="https://github.com/MediaBrowser/Wiki/wiki/Installation" rel="external nofollow">https://github.com/MediaBrowser/Wiki/wiki/Installation</a>).
		</p>
	</li>
	<li>
		<p>
			For last, you need to enable Hardware video transcoding in the web interface. The option is under the "Transcoding" submenu. Don't forget to click on "Save" when you are done:<a class="ipsAttachLink ipsAttachLink_image" data-fileid="3364" href="https://forum.armbian.com/uploads/monthly_2018_10/1384117742_2018-08-2917_32_32-Transcoding.png.5f077519c2dc6b335af052a3117422c9.png" rel="" data-fileext="png"><img alt="743001677_2018-08-2917_32_32-Transcoding.thumb.png.4ff3b4db527d9b0a318b327e9afca184.png" class="ipsImage ipsImage_thumbnailed" data-fileid="3364" src="https://forum.armbian.com/uploads/monthly_2018_10/743001677_2018-08-2917_32_32-Transcoding.thumb.png.4ff3b4db527d9b0a318b327e9afca184.png"></a>
		</p>
	</li>
</ol>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="3365" href="https://forum.armbian.com/uploads/monthly_2018_10/1473550951_2018-08-2917_32_45-Transcoding.png.6af458373af16b8cb4990883febbe554.png" rel="" data-fileext="png"><img alt="1122350758_2018-08-2917_32_45-Transcoding.thumb.png.3fe655aadc8dcc6ea6af274e33860545.png" class="ipsImage ipsImage_thumbnailed" data-fileid="3365" src="https://forum.armbian.com/uploads/monthly_2018_10/1122350758_2018-08-2917_32_45-Transcoding.thumb.png.3fe655aadc8dcc6ea6af274e33860545.png"></a>
</p>

<p>
	 
</p>

<p>
	And that's it!
</p>

<p>
	 
</p>

<p>
	As an additional tip, I recommend disabling UPnP in Emby, because it causes the program to crash frequently when enabled (this is just a general recommendation, it has nothing to do with hardware encoding).
</p>

<p>
	 
</p>

<p>
	Enjoy! And please, share your experiences and comments here.
</p>
]]></description><guid isPermaLink="false">8451</guid><pubDate>Fri, 12 Oct 2018 08:58:02 +0000</pubDate></item></channel></rss>
