<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>memcpy.io</title><link>https://memcpy.io/</link><description></description><lastBuildDate>Mon, 03 Jul 2023 19:32:00 +0200</lastBuildDate><item><title>Git pull request fetching &amp; searching</title><link>https://memcpy.io/git-pull-request-fetching-searching.html</link><description>&lt;p&gt;&lt;a href="https://gitlab.freedesktop.org/ajax"&gt;Adam Jackson&lt;/a&gt; created the script &lt;a href="https://gitlab.freedesktop.org/xorg/util/modular/-/raw/master/add-gitlab-merge-requests.sh?inline=false"&gt;add-gitlab-merge-requests.sh&lt;/a&gt; which is the basis of this workflow.&lt;/p&gt;
&lt;h2&gt;git pr&lt;/h2&gt;
&lt;p&gt;The idea is to provide local access to all of the PRs that exist upstream. This both provides a better general overview of which PRs that have been pulled into the branch you're working on, but also enables you to search the contents of all PRs.&lt;/p&gt;
&lt;p&gt;This function automagically detects if your remote is hosted on GitHub or GitLab and makes the necessary adjustments to work on either platform.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;mr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;pr&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;pr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;!f() { &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;REMOTES=$(git remote); &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;REMOTE=\&amp;quot;origin\&amp;quot;; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;case \&amp;quot;$REMOTES\&amp;quot; in &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;*upstream*) &lt;/span&gt;\
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;REMOTE=\&amp;quot;upstream\&amp;quot;; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;;; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;esac; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;ORIGIN=${1:-${REMOTE}}; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;URL=$(git remote get-url ${ORIGIN}); &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;case \&amp;quot;$URL\&amp;quot; in &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;*gitlab*) &lt;/span&gt;\
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;FORGE_EXT=&amp;quot;mr&amp;quot; &lt;/span&gt;\
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;FORGE_PATH=&amp;quot;merge-requests&amp;quot; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;;; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;*github*) &lt;/span&gt;\
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;FORGE_EXT=&amp;quot;pr&amp;quot; &lt;/span&gt;\
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;FORGE_PATH=&amp;quot;pull&amp;quot; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;;; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;esac; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;ORIGIN_NAME …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 03 Jul 2023 19:32:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2023-07-03:/git-pull-request-fetching-searching.html</guid><category>git</category><category>shell</category><category>git</category><category>alias</category><category>pr</category><category>mr</category><category>pull</category><category>merge</category><category>request</category><category>gitlab</category><category>github</category><category>gitconfig</category></item><item><title>Setting up a Linux userspace graphics dev environment</title><link>https://memcpy.io/setting-up-a-linux-userspace-graphics-dev-environment.html</link><description>&lt;h2&gt;Set up alternative install location&lt;/h2&gt;
&lt;p&gt;These build instructions are based on the &lt;a href="https://wayland.freedesktop.org/building.html"&gt;Wayland instructions&lt;/a&gt;
from freedesktop.org.&lt;/p&gt;
&lt;p&gt;You probably don't want to install experimental builds of software among the usual
software of your operating system, so let's define a prefix for where to install
our builds.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Change ALT_LOCAL to any location you like&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;WORK_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;feature_x&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PROJECT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$WORK_DIR/$PROJECT_NAME&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ALT_LOCAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$PROJECT_PATH/local&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$ALT_LOCAL/lib&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$ALT_LOCAL/lib/pkgconfig/:$ALT_LOCAL/share/pkgconfig/&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$ALT_LOCAL/bin:$PATH&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ACLOCAL_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$ALT_LOCAL/share/aclocal&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ACLOCAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;aclocal -I $ACLOCAL_PATH&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Needed by autotools&lt;/span&gt;
&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$ALT_LOCAL/share/aclocal&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$ALT_LOCAL/xdg&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;XDG_CONFIG_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$ALT_LOCAL/home&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MESA_LOADER_DRIVER_OVERRIDE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;zink&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Installing dependencies&lt;/h2&gt;
&lt;p&gt;Start by installing the build dependencies of mesa, weston and …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 26 Apr 2023 10:32:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2023-04-26:/setting-up-a-linux-userspace-graphics-dev-environment.html</guid><category>graphics</category><category>xwayland</category><category>wayland</category><category>mesa</category><category>graphics</category><category>userspace</category></item><item><title>Configuring Linux VLANs</title><link>https://memcpy.io/configuring-linux-vlans.html</link><description>&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;vlan
Device&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;provided

&lt;span class="w"&gt;    &lt;/span&gt;vlan&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$DEV&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$VLAN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$SUBNET&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;vlan&lt;span class="w"&gt; &lt;/span&gt;eth0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.31.155.1/27
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is a achieved by pasting the below function into your &lt;code&gt;.bashrc&lt;/code&gt; / &lt;code&gt;.zshrc&lt;/code&gt; and issuing a &lt;code&gt;source .bashrc&lt;/code&gt; or &lt;code&gt;source .zshrc&lt;/code&gt; correspondingly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vlan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;DEV&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;VLAN&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;ADDR&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;HELP&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="s"&gt;    vlan \$DEV \$VLAN \$SUBNET&lt;/span&gt;

&lt;span class="s"&gt;    vlan eth0 42 10.31.155.1/27&lt;/span&gt;
&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$DEV&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Device not provided&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$HELP&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;fi&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;grep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;${DEV}: &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\&amp;quot;$DEV\&amp;quot; is not a valid device&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$HELP&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;fi&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$VLAN&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;VLAN not provided&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$HELP&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;fi&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;REGEX&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt;$&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nx"&gt;VLAN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nx"&gt;REGEX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;\&amp;quot;$VLAN\&amp;quot; is not a number&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1 …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 20 Jul 2022 10:48:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2022-07-20:/configuring-linux-vlans.html</guid><category>networking</category><category>linux</category><category>network</category><category>vlan</category><category>interface</category><category>configure</category><category>nic</category></item><item><title>Git Alias function syntax</title><link>https://memcpy.io/git-alias-function-syntax.html</link><description>&lt;p&gt;A basic example of the git alias function syntax looks like this.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;shortcut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;!f() &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;\
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;echo Hello world!; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;}; f&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This syntax defines a function &lt;code&gt;f&lt;/code&gt; and then calls it. These aliases are executed in a &lt;code&gt;sh&lt;/code&gt; shell,
which means there's no access to Bash / Zsh specific functionality.&lt;/p&gt;
&lt;p&gt;Every command is ended with a &lt;code&gt;;&lt;/code&gt; and each line ended with a &lt;code&gt;\&lt;/code&gt;. This is easy enough
to grok. But when we try to clean up the above snippet and add some quotes to
&lt;code&gt;"Hello world!"&lt;/code&gt;, we hit this obtuse error message.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;}&lt;span class="c1"&gt;; f: 1: Syntax error: end of file unexpected (expecting &amp;quot;}&amp;quot;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This syntax error is caused by quotes needing to be escaped. The reason for this
comes down to how git tokenizes and executes these functions. If you're curious …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 04 Nov 2021 20:10:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2021-11-04:/git-alias-function-syntax.html</guid><category>linux</category><category>linux</category><category>shell</category><category>git</category><category>alias</category><category>b4</category><category>gitconfig</category><category>mbox</category><category>am</category><category>kernel</category><category>mailing</category><category>list</category><category>mailinglists</category></item><item><title>Applying mailing list patches with 'git b4'</title><link>https://memcpy.io/applying-mailing-list-patches-with-git-b4.html</link><description>&lt;p&gt;It was created by
&lt;a href="https://people.kernel.org/monsieuricon/introducing-b4-and-patch-attestation"&gt;Konstantin Ryabitsev&lt;/a&gt;
and has become a very frequently used tool for me.&lt;/p&gt;
&lt;p&gt;It supports a lot of different ways for interacting with the Linux Kernel mailing lists.
Of these the &lt;code&gt;b4 am&lt;/code&gt; subcommand is what I primarily use. This subcommand downloads all of
the patches belonging to a patch series and drops them into a &lt;code&gt;.mbox&lt;/code&gt; file. But! It doesn't
apply them to the repository we're currently in, and herein lies the itch that I would like
to scratch.&lt;/p&gt;
&lt;p&gt;The inspiration for this post is the
&lt;a href="https://twitter.com/widawsky/status/1365378004914905088"&gt;script&lt;/a&gt; that
&lt;a href="https://twitter.com/stellarhopper"&gt;@stellarhopper&lt;/a&gt; authored and
&lt;a href="https://twitter.com/widawsky"&gt;@widawsky&lt;/a&gt;
pointed out to me.&lt;/p&gt;
&lt;h2&gt;The Good, the Bad &amp;amp; the Ugly&lt;/h2&gt;
&lt;p&gt;After first publishing this post, people on the twittersphere suggested some alternative approaches,
and it would seem that there …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 08 Mar 2021 12:23:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2021-03-08:/applying-mailing-list-patches-with-git-b4.html</guid><category>linux</category><category>linux</category><category>kernel</category><category>development</category><category>shell</category><category>git</category><category>alias</category><category>b4</category><category>gitconfig</category><category>mbox</category><category>am</category><category>mailing</category><category>list</category></item><item><title>Upstream camera support for Qualcomm platforms</title><link>https://memcpy.io/upstream-camera-support-for-qualcomm-platforms.html</link><description>&lt;p&gt;&lt;a href="https://www.linaro.org/"&gt;Linaro&lt;/a&gt; has been working together with Qualcomm to enable camera support on
their platformssince 2017. The Open Source CAMSS driver was written to support the ISP IP-block with
the same name that is present on Qualcomm SoCs coming from the smartphone space.&lt;/p&gt;
&lt;p&gt;The first development board targeted by this work was the DragonBoard 410C, which was followed in 2018 by
DragonBoard 820C support. Recently support for the Snapdragon 660 SoC was added to the driver,
which will be part of the v5.11 Linux Kernel release. These SoCs all contain the CAMSS
(Camera SubSystem) version of the ISP architecture.&lt;/p&gt;
&lt;p&gt;Currently, support for the ISP found in the Snapdragon 845 SoC and the DragonBoard 845C is in
the process of being upstreamed to the mailinglists. Having …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 23 Feb 2021 14:54:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2021-02-23:/upstream-camera-support-for-qualcomm-platforms.html</guid><category>kernel</category><category>linux</category><category>kernel</category><category>camera</category><category>v4l2</category><category>qualcomm</category><category>camss</category><category>sdm845</category><category>yocto</category><category>open embedded</category><category>db845c</category></item><item><title>Speed up `git log --graph` 18x times</title><link>https://memcpy.io/speed-up-git-log-graph-18x-times.html</link><description>&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lg
git&lt;span class="w"&gt; &lt;/span&gt;lg&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;.34s&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.87s&lt;span class="w"&gt; &lt;/span&gt;system&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;84&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;cpu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;.845&lt;span class="w"&gt; &lt;/span&gt;total

&lt;span class="c1"&gt;# True by default as of git v2.24&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;core.commitGraph&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;gc.writeCommitGraph&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c1"&gt;# Added in git v2.29, pre-compute file paths, so that git log commands&lt;/span&gt;
&lt;span class="c1"&gt;# that are scoped to files also benefit from this cache.&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;commit-graph&lt;span class="w"&gt; &lt;/span&gt;write&lt;span class="w"&gt; &lt;/span&gt;--reachable&lt;span class="w"&gt; &lt;/span&gt;--changed-paths

$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lg
git&lt;span class="w"&gt; &lt;/span&gt;lg&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.72s&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.14s&lt;span class="w"&gt; &lt;/span&gt;system&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;74&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;cpu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.154&lt;span class="w"&gt; &lt;/span&gt;total
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is a speed up of ~18x, compared to the older versions.&lt;/p&gt;
&lt;p&gt;The way this works is that the &lt;a href="https://git-scm.com/docs/commit-graph"&gt;commit-graph&lt;/a&gt;
file stores the commit graph structure along with some extra metadata to
speed up graph in the &lt;code&gt;.git/objects/info&lt;/code&gt; directory.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 07 Apr 2020 15:06:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2020-04-07:/speed-up-git-log-graph-18x-times.html</guid><category>developer</category><category>git</category><category>lg</category><category>log</category><category>format</category><category>pretty</category><category>slow</category><category>speed up</category><category>commit</category><category>graph</category></item><item><title>Panfrost: Liberating ARM GPUs @ Linux Conf Au</title><link>https://memcpy.io/panfrost-liberating-arm-gpus-linux-conf-au.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/files/2020-01-15/title.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2020-01-15/2020_lca_panfrost_robertfoss.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2020-01-15/2020_lca_panfrost_robertfoss.odp"&gt;ODP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Diagrams&lt;/h2&gt;
&lt;h4&gt;Overview&lt;/h4&gt;
&lt;p&gt;&lt;a href="/files/2020-01-15/diagram_overview.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_overview.svg"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h4&gt;Kernel&lt;/h4&gt;
&lt;p&gt;&lt;a href="/files/2020-01-15/diagram_kernel_1.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_kernel_1.svg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/files/2020-01-15/diagram_kernel_2.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_kernel_2.svg"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h4&gt;Userspace&lt;/h4&gt;
&lt;p&gt;&lt;a href="/files/2020-01-15/diagram_userspace_1.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_userspace_1.svg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/files/2020-01-15/diagram_userspace_2.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_userspace_2.svg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/files/2020-01-15/diagram_userspace_3.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_userspace_3.svg"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h4&gt;Mesa overview&lt;/h4&gt;
&lt;p&gt;&lt;a href="/files/2020-01-15/diagram_mesa_overview.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_overview.svg"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h4&gt;Mesa Gallium&lt;/h4&gt;
&lt;p&gt;&lt;a href="/files/2020-01-15/diagram_mesa_gallium_1.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_gallium_1.svg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/files/2020-01-15/diagram_mesa_gallium_2.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_gallium_2.svg"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h4&gt;Mesa Winsys&lt;/h4&gt;
&lt;p&gt;&lt;a href="/files/2020-01-15/diagram_mesa_winsys_1.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_winsys_1.svg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/files/2020-01-15/diagram_mesa_winsys_2.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_winsys_2.svg"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h4&gt;Mesa Compiler&lt;/h4&gt;
&lt;p&gt;&lt;a href="/files/2020-01-15/diagram_mesa_compiler_1.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_compiler_1.svg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/files/2020-01-15/diagram_mesa_compiler_2.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_compiler_2.svg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/files/2020-01-15/diagram_mesa_compiler_3.svg"&gt;&lt;img alt="" src="/files/2020-01-15/diagram_mesa_compiler_3.svg"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;All of the material you can find on this page is licensed under the
&lt;a href="https://opensource.org/licenses/MIT"&gt;MIT&lt;/a&gt; license, and you are free to use,
modify and re-distribute these materials however you like.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://linux.conf.au/"&gt;Linux Conf Au&lt;/a&gt; for hosting the event.
This was my first LCA, and I think it may be the best Linux conference out of all of them.&lt;/p&gt;
&lt;p&gt;I would also like to thank the organizers for paying for my flights,
without it I would not have been able to give this talk.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 15 Jan 2020 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2020-01-15:/panfrost-liberating-arm-gpus-linux-conf-au.html</guid><category>talks</category><category>talks</category><category>slides</category><category>linux</category><category>conf</category><category>au</category><category>lca</category><category>graphics</category><category>open source</category><category>drivers</category></item><item><title>Panfrost the Open Source Arm GPU Driver @ ELC NA</title><link>https://memcpy.io/panfrost-the-open-source-arm-gpu-driver-elc-na.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/images/2019-08-22_panfrost_gpu_driver_elc_na.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2019-08-22/2019_panfrost_elc-na.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2019-08-22/2019_panfrost_elc-na.odp"&gt;ODP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://events.linuxfoundation.org/events/elc-north-america-2019/"&gt;ELC NA&lt;/a&gt; for hosting the event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sun, 22 Sep 2019 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2019-09-22:/panfrost-the-open-source-arm-gpu-driver-elc-na.html</guid><category>talks</category><category>talks</category><category>slides</category><category>embedded</category><category>linux</category><category>elc</category><category>graphics</category><category>open source</category><category>drivers</category></item><item><title>Status of the Embedded GPU Space @ ELC NA</title><link>https://memcpy.io/status-of-the-embedded-gpu-space-elc-na.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/images/2019-08-21_embedded_gpu_elc_na.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2019-08-21/2019_embedded-gfx_embedded-world.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2019-08-21/2019_embedded-gfx_embedded-world.odp"&gt;ODP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://events.linuxfoundation.org/events/elc-north-america-2019/"&gt;ELC NA&lt;/a&gt; for hosting the event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sat, 21 Sep 2019 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2019-09-21:/status-of-the-embedded-gpu-space-elc-na.html</guid><category>talks</category><category>talks</category><category>slides</category><category>embedded</category><category>linux</category><category>elc</category><category>graphics</category><category>open source</category><category>drivers</category></item><item><title>Running Android and Wayland on Embedded Devices</title><link>https://memcpy.io/running-android-and-wayland-on-embedded-devices.html</link><description>&lt;p&gt;&lt;a href="/running-android-next-to-wayland.html"&gt;A previous post&lt;/a&gt; introduced the &lt;a href="https://gitlab.collabora.com/spurv/device_freedesktop/blob/master/spurv/"&gt;SPURV&lt;/a&gt;
Android compatibility layer for Wayland based Linux environment.&lt;br&gt;
In this post we're going to dig into how you can run an Android application
on the very common i.MX6 based &lt;a href="https://boundarydevices.com/product/nitrogen6max/"&gt;Nitrogen6_MAX&lt;/a&gt;
board from &lt;a href="https://boundarydevices.com/"&gt;Boundary Devices&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Install dependencies&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;bmap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;certificates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;gnupg2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;qemu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;kvm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Set up Docker container for building&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Install Docker&lt;/span&gt;
&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fsSL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gpg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ce&lt;/span&gt;

&lt;span class="c1"&gt;# Set up privileges for Docker&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usermod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;su&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch Docker image …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 03 May 2019 10:39:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2019-05-03:/running-android-and-wayland-on-embedded-devices.html</guid><category>android</category><category>linux</category><category>open source</category><category>graphics</category><category>wayland</category><category>android</category><category>3d</category><category>acceleration</category><category>imx6</category><category>nitrogen6</category></item><item><title>Running Android next to Wayland</title><link>https://memcpy.io/running-android-next-to-wayland.html</link><description>&lt;p&gt;Running Android has some advantages compared to native Linux applications,
for example with regard to the availability of applications and application
developers.&lt;/p&gt;
&lt;p&gt;For current non-Android systems, this work enables a path forward to running
Android applications in the same graphical environment as traditional non-Android
applications are run.&lt;/p&gt;
&lt;div style#"text-align:center;"&gt;
&lt;iframe width="830" height="460" src="https://www.youtube.com/embed/594fIHWQSj4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h2&gt;What is SPURV?&lt;/h2&gt;
&lt;p&gt;SPURV is our experimental containerized Android environment, and
this is a quick overview of what it is.&lt;/p&gt;
&lt;p&gt;It's aptly named after the &lt;a href="https://en.wikipedia.org/wiki/SPURV"&gt;first robotic fish&lt;/a&gt;
since a common Android naming scheme is fish-themed names. Much like its spiritual
ancestor Goldfish, the Android emulator.&lt;/p&gt;
&lt;h3&gt;Other Android Compatibility Layers&lt;/h3&gt;
&lt;p&gt;This means that Anbox which is LXC based, is different from SPURV in terms of
how hardware is accessed. The hardware access that Anbox provides in indirect,
and …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 01 Apr 2019 18:07:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2019-04-01:/running-android-next-to-wayland.html</guid><category>android</category><category>linux</category><category>open source</category><category>graphics</category><category>wayland</category><category>android</category><category>3d</category><category>acceleration</category></item><item><title>An Overview of the Panfrost driver</title><link>https://memcpy.io/an-overview-of-the-panfrost-driver.html</link><description>&lt;p&gt;&lt;img alt="Arm driver timeline" src="/images/2019-03-13_arm_driver_timeline.png"&gt;&lt;/p&gt;
&lt;p&gt;The process of reverse engineering Arm GPUs has been going on for a long time,
starting with &lt;a href="https://github.com/libv"&gt;Luc Verhaegens&lt;/a&gt; work on the low-end Mali 2/3/400 series of GPUs based
on the Arm Utgard family of GPUs.&lt;br&gt;
This driver has recently seen a lot new attention and is itself progressing quickly,
which means it will likely be accepted into the kernel soon.&lt;br&gt;
A piece of trivia is that this GPU architecture was what Arm received when they
purchased the Norwegian GPU IP vendor Falanx Microsystems.&lt;/p&gt;
&lt;p&gt;The Mali T and G-series of GPUs are based on the Midgard and Bifrost architectures
respectively, both of which are quite different from the 2/3/400 series.
However the T and G-series are somewhat similar at least when …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 13 Mar 2019 16:25:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2019-03-13:/an-overview-of-the-panfrost-driver.html</guid><category>graphics</category><category>linux</category><category>open source</category><category>gpu</category><category>driver</category><category>arm</category><category>mali</category><category>panfrost</category></item><item><title>Status of the Embedded GPU Space @ Embedded World</title><link>https://memcpy.io/status-of-the-embedded-gpu-space-embedded-world.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/images/2019-02-27_embedded_world.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2019-02-27/2019_embedded-gfx_embedded-world.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2019-02-27/2019_embedded-gfx_embedded-world.odp"&gt;ODP&lt;/a&gt; and of course the &lt;a href="files/2019-02-27/2019_embedded-world_embedded-gpu-space.pdf"&gt;whitepaper&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://www.embedded-world.de/en"&gt;Embedded World&lt;/a&gt; for hosting a great event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 27 Feb 2019 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2019-02-27:/status-of-the-embedded-gpu-space-embedded-world.html</guid><category>talks</category><category>talks</category><category>slides</category><category>embedded</category><category>world</category><category>graphics</category><category>open source</category><category>drivers</category><category>linux</category></item><item><title>Running Docker privileged inside of LXC / LXD</title><link>https://memcpy.io/running-docker-privileged-inside-of-lxc-lxd.html</link><description>&lt;p&gt;The architecture is a bit of container matroska, but what we're trying to
achieve is running Docker privileged inside of a LXC container on a baremetal
host.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2018-12-03_docker.png"&gt;&lt;img alt="Alt text" src="/images/2018-12-03_docker.png" title="Docker running inside of LXC"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Setup container on LXC Host&lt;/h2&gt;
&lt;p&gt;In order to give Docker in the guest privileges, the guest container
itself has to be given privileges.&lt;/p&gt;
&lt;p&gt;There is no simple switch for doing this in LXC unfortunately, but a few
config options will do the trick.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lxc launch images:ubuntu/bionic container

lxc config set container security.nesting true
lxc config set container security.privileged true
cat &amp;lt;&amp;lt;EOT | lxc config set container raw.lxc -
lxc.cgroup.devices.allow = a
lxc.cap.drop =
EOT

lxc restart container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Setup docker on container&lt;/h2&gt;
&lt;p&gt;Just to verify that this works, start a privileged Docker container …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 03 Dec 2018 19:00:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-12-03:/running-docker-privileged-inside-of-lxc-lxd.html</guid><category>linux</category><category>linux</category><category>virtualization</category><category>lxc</category><category>lxd</category><category>docker</category><category>privileged</category></item><item><title>Android on Mainline Graphics @ All Systems Go</title><link>https://memcpy.io/android-on-mainline-graphics-all-systems-go.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/images/2018-09-29_all_systems_go.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2018-09-29/2018_running_android_on_mainline_gfx_all_systems_go.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2018-09-29/2018_running_android_on_mainline_gfx_all_systems_go.odp"&gt;ODP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://all-systems-go.io/"&gt;All Systems Go!&lt;/a&gt;, the &lt;a href="https://twitter.com/ASGConf"&gt;@ASGConf&lt;/a&gt; for hosting a great event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sat, 29 Sep 2018 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-09-29:/android-on-mainline-graphics-all-systems-go.html</guid><category>talks</category><category>talks</category><category>slides</category><category>all systems go</category><category>linux</category><category>graphics</category><category>drivers</category></item><item><title>Status of the Open Source GPU Ecosystem @ OSSummit NA</title><link>https://memcpy.io/status-of-the-open-source-gpu-ecosystem-ossummit-na.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/images/2018-08-31_ossummit.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2018-08-31/2018_gfx_status_ossummit_na.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2018-08-31/2018_gfx_status_ossummit_na.odp"&gt;ODP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://events.linuxfoundation.org/events/open-source-summit-north-america-2018/"&gt;OSSummit NA&lt;/a&gt;, the &lt;a href="https://www.linuxfoundation.org/"&gt;Linux Foundation&lt;/a&gt; for hosting a great event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 31 Aug 2018 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-08-31:/status-of-the-open-source-gpu-ecosystem-ossummit-na.html</guid><category>talks</category><category>talks</category><category>slides</category><category>ossummit</category><category>open</category><category>source summit</category><category>linux</category><category>graphics</category><category>drivers</category></item><item><title>git reset upstream</title><link>https://memcpy.io/git-reset-upstream.html</link><description>&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;robertfoss&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;xps9570&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;libdrm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ru&lt;/span&gt;
&lt;span class="nl"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Counting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nl"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Compressing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;233&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;233&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nl"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;234&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;177&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reused&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Receiving&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;234&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;234&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;53.20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KiB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;939.00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KiB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Resolving&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deltas&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;177&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;177&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//anongit.freedesktop.org/mesa/drm&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;cb592ac8166e&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="n"&gt;bcb9d976cd91&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;upstream&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;libdrm&lt;/span&gt;&lt;span class="mf"&gt;-2.4.93&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;libdrm&lt;/span&gt;&lt;span class="mf"&gt;-2.4.93&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="n"&gt;libdrm&lt;/span&gt;&lt;span class="mf"&gt;-2.4.94&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;libdrm&lt;/span&gt;&lt;span class="mf"&gt;-2.4.94&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The idea here is that we by issuing a single short command can fetch the
latest master branch from the upstream repository of the codebase we're
working on and set our local master branch to point to the most recent
upstream/master one …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 24 Aug 2018 12:32:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-08-24:/git-reset-upstream.html</guid><category>git</category><category>collabora</category><category>git</category><category>reset</category><category>upstream</category><category>pull</category><category>synchronize</category></item><item><title>kms_swrast: A hardware-backed graphics driver</title><link>https://memcpy.io/kms_swrast-a-hardware-backed-graphics-driver.html</link><description>&lt;h2&gt;Stack overview&lt;/h2&gt;
&lt;p&gt;Let's start with having a look at a high level overview of what the
graphics stack looks like.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2018-07-31_kms_swrast_overview.svg"&gt;&lt;img alt="Alt text" src="/images/2018-07-31_kms_swrast_overview.svg" title="Linux graphics stack"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before digging too much further into this, lets cover some terminology.&lt;/p&gt;
&lt;p&gt;DRM - Direct Rendering Manager - is the Linux kernel graphics subsystem,
which contains all of the graphics drivers and does all of the interfacing with
hardware.&lt;br&gt;
The DRM subsystem implements the KMS - kernel mode setting - API.&lt;/p&gt;
&lt;p&gt;Mode setting is essentially configuring output settings like resolution
for the displays that are being used. And doing it using the kernel means that
userspace doesn't need access to setting these things directly.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2018-07-31_kms_swrast_mesa.svg"&gt;&lt;img alt="Alt text" src="/images/2018-07-31_kms_swrast_mesa.svg" title="Mesa internals"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The DRM subsystem talks to the hardware and Mesa is used by applications through
the APIs it implements. APIs like OpenGL, OpenGL ES, Vulkan, etc.
All …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 31 Jul 2018 09:14:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-07-31:/kms_swrast-a-hardware-backed-graphics-driver.html</guid><category>graphics</category><category>collabora</category><category>kms_swrast</category><category>drm</category><category>kms</category><category>swrast</category><category>dumb</category><category>buffer</category><category>driver</category><category>gpu</category></item><item><title>Configuring QNAP LXC containers for VPNs using TUN</title><link>https://memcpy.io/configuring-qnap-lxc-containers-for-vpns-using-tun.html</link><description>&lt;p&gt;&lt;a href="/images/2018-06-24_lxc_config.png"&gt;&lt;img alt="Alt text" src="/images/2018-06-24_lxc_config.png" title="QNAP Container Station LXC Config"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Configuring the QNAP device&lt;/h3&gt;
&lt;p&gt;The first step is to SSH into your QNAP device using the &lt;em&gt;admin&lt;/em&gt; account.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;admin&lt;/span&gt;&lt;span class="nv"&gt;@NAS_IP&lt;/span&gt;
&lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;station&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lxc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;span class="n"&gt;lxc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cgroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rwm&lt;/span&gt;
&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Configuring the container guest&lt;/h3&gt;
&lt;p&gt;The second step is open the QNAP web-ui, open the Container Station
application and enter the console of your container.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;sed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/exit 0/d&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;rc&lt;/span&gt;.&lt;span class="nv"&gt;local&lt;/span&gt;
&lt;span class="nv"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;rc&lt;/span&gt;.&lt;span class="nv"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;EOF&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;net&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;tun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;]&lt;span class="c1"&gt;; then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;net&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;mknod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;666&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;net&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;tun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="nv"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="nv"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Lastly the container needs to be restarted, and then your VPN application
should be able to access TUN devices and work normally.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sun, 24 Jun 2018 22:16:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-06-24:/configuring-qnap-lxc-containers-for-vpns-using-tun.html</guid><category>sysadmin</category><category>qnap</category><category>container</category><category>station</category><category>lxc</category><category>lxd</category><category>vpn</category><category>tun</category><category>tap</category></item><item><title>Twistyplexing: A Charlieplexing variety</title><link>https://memcpy.io/twistyplexing-a-charlieplexing-variety.html</link><description>&lt;p&gt;&lt;a href="/images/2018-06-22_twistyplexing.png"&gt;&lt;img alt="Alt text" src="/images/2018-06-22_twistyplexing.png" title="A 42 LED, N == 7 Twistyplexing layout"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The above layout has N = 7, yielding 42 LEDs.&lt;/p&gt;
&lt;p&gt;Apart from the symmetry being visually pleasing compared to the normal
row &amp;amp; column Charlieplexing layouts, it's relatively easy to spot errors
in the schematic.&lt;/p&gt;
&lt;h2&gt;Avoiding lookup tables&lt;/h2&gt;
&lt;p&gt;The major advantage of twistyplexing is the ability to avoid lookup tables
and replace them with some relatively straight forward arithmetic.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;row = led_number / (N - 1)
column = led_number % (N - 1)
anode = (row + column + 1) % N
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Of course the cathode still has to be controlled, but its pin id already
defined by the &lt;strong&gt;row&lt;/strong&gt; variable above.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;The Twistyplexing concept was created by Tom Yu, and defined in &lt;a href="https://argonblue.wordpress.com/2012/06/30/twistyplexing-a-new-topology-for-led-multiplexing/"&gt;this&lt;/a&gt; blog post.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 22 Jun 2018 12:26:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-06-22:/twistyplexing-a-charlieplexing-variety.html</guid><category>leds</category><category>twistyplexing</category><category>charlieplexing</category><category>multiplexing</category><category>led</category><category>leds</category></item><item><title>APA102 1515 LEDs</title><link>https://memcpy.io/apa102-1515-leds.html</link><description>&lt;p&gt;The quiescent current of the APA102 2020 LEDs is about 0.7-1.0mA. Which is rather
high for some usecases. But recently some new option have been made available.&lt;/p&gt;
&lt;p&gt;The APA102 1515 and the APA104 1515, both of which come in a 1.5x1.5mm package.
Additionally the APA104 1515 IC has a quiescent current of 0.3mA, which is good
step in the right direction.&lt;/p&gt;
&lt;p&gt;&lt;a href="/files/2018-06-04/apa102-1515.pdf"&gt;APA102 1515 datasheet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/files/2018-06-04/apa104-1515.pdf"&gt;APA104 1515 datasheet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately only the APA104 datasheet specifies quiescent current, so the
quiescent current of the APA102 15155 is still an unknown.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 04 Jun 2018 22:26:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-06-04:/apa102-1515-leds.html</guid><category>apa102</category><category>apa102</category><category>apa104</category><category>apa</category><category>102</category><category>104</category><category>2020</category><category>1515</category><category>led</category><category>power</category><category>usage</category><category>current</category><category>quiescent</category></item><item><title>Status of the Open Source Graphics Ecosystem @ OpenTechSummit</title><link>https://memcpy.io/status-of-the-open-source-graphics-ecosystem-opentechsummit.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/images/2018-05-10_opentechsummit.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2018-05-10/2018_opentechsummit.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2018-05-10/2018_opentechsummit.odp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://opentechsummit.net/"&gt;OpenTechSummit&lt;/a&gt;, specifically &lt;a href="https://twitter.com/hpdang"&gt;@hpdang&lt;/a&gt; and &lt;a href="https://twitter.com/mariobehling"&gt;@mariobehling&lt;/a&gt;
for hosting a great event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 10 May 2018 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-05-10:/status-of-the-open-source-graphics-ecosystem-opentechsummit.html</guid><category>talks</category><category>talks</category><category>slides</category><category>graphics</category><category>linux</category><category>drivers</category><category>open</category><category>tech</category><category>summit</category><category>opentechsummit</category><category>source</category></item><item><title>Running Android on the Mainline Graphics Stack @ FossNorth</title><link>https://memcpy.io/running-android-on-the-mainline-graphics-stack-fossnorth.html</link><description>&lt;p&gt;&lt;img alt="Intro slide" src="/images/2018-04-23_intro.png"&gt;&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2018-04-23/2018_fossnorth_running_android_on_mainline_gfx.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2018-04-23/2018_fossnorth_running_android_on_mainline_gfx.otp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="http://foss-north.se/2018/schedule.html"&gt;FossNorth&lt;/a&gt;, specifically &lt;a href="https://twitter.com/e8johan"&gt;@e8johan&lt;/a&gt;
for hosting a great event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 23 Apr 2018 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-04-23:/running-android-on-the-mainline-graphics-stack-fossnorth.html</guid><category>talks</category><category>talks</category><category>slides</category><category>fossnorth</category><category>foss</category><category>north</category><category>aosp</category><category>android</category><category>open</category><category>source</category></item><item><title>Upstream Linux support for the new NXP i.MX 8M</title><link>https://memcpy.io/upstream-linux-support-for-the-new-nxp-imx-8m.html</link><description>&lt;p&gt;&lt;a href="/images/2018-04-13_dart_imx8m.png"&gt;&lt;img alt="Dart iMX 8M" src="/images/2018-04-13_dart_imx8m.png"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The i.MX6 platform has for the past few years enjoyed a large effort to add
upstream support to Linux and surrounding projects. Now it is at the point
where nothing is really missing any more. Improvements are still being made,
to the graphics driver for i.MX 6, but functionally it is complete.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2018-04-13_timeline_vivante_kernel_and_mesa.svg"&gt;&lt;img alt="Etnaviv driver development timeline" src="/images/2018-04-13_timeline_vivante_kernel_and_mesa.svg"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The i.MX8 is a different story. The newly introduced platform, with hardware still difficult to get access to, is seeing lots of work being done, but much
still remains to be done.&lt;/p&gt;
&lt;p&gt;That being said, initial support for the GPU, the Vivante GC7000, is in place
and is able to successfully run Wayland/Weston, glmark, etc.
This should also mean that running Android ontop of the currently not-quite-upstream stack is …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 13 Apr 2018 11:39:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-04-13:/upstream-linux-support-for-the-new-nxp-imx-8m.html</guid><category>imx</category><category>imx</category><category>i.mx</category><category>nxp</category><category>imx6</category><category>imx8</category><category>imx8m</category><category>8m</category></item><item><title>Status of the Embedded GPU Space @ Embedded Linux Conference NA</title><link>https://memcpy.io/status-of-the-embedded-gpu-space-embedded-linux-conference-na.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2018-03-12_elc_na.png" title="Speaking @ ELC NA"&gt;&lt;/p&gt;
&lt;p&gt;A recording of the talk is available  &lt;a href="https://www.youtube.com/watch?v=Ag8BGMY8MOs"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2018-03-12/2018_elc_na_gpu_ecosystem_status.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2018-03-12/2018_elc_na_gpu_ecosystem_status.otp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://events.linuxfoundation.org/events/elc-openiot-north-america-2018/program/schedule/"&gt;Embedded Linux Conference NA&lt;/a&gt;,
for hosting a great event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 12 Mar 2018 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-03-12:/status-of-the-embedded-gpu-space-embedded-linux-conference-na.html</guid><category>talks</category><category>talks</category><category>slides</category><category>embedded linux conference</category><category>elc</category><category>na</category><category>portland</category><category>embedded</category><category>gpu</category><category>linux</category><category>driver</category><category>open</category><category>source</category></item><item><title>APA102 LED Current Usage</title><link>https://memcpy.io/apa102-led-current-usage.html</link><description>&lt;p&gt;&lt;a href="/images/2018-02-20_apa102_2020_quiescent_current.png"&gt;&lt;img alt="Alt text" src="/images/2018-02-20_apa102_2020_quiescent_current.png" title="APA102 LED Quiescent Current Diagram"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What we're seeing here is a the LED being fully off (albeit with floating clock and data inputs), drawing somewhere between 0.7-1 mA.&lt;/p&gt;
&lt;p&gt;I was quite surprised to see such a high quiescent current.&lt;/p&gt;
&lt;p&gt;For the APA102 2020 which has a 20x20mm footprint this is somewhat disappointing, not because it is worse than the normal 50x50 APA102 variants, but rather because the small footprint begs for the IC to be used in wearables and other power consumption sensitive applications.&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;So this is the very simple setup I was using. It's nothing fancy; a multimeter
set to the mA range, connected between the power supply and the APA102 breakout board I happened to have laying around.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2018-02-20_setup.jpg"&gt;&lt;img alt="Alt text" src="/images/2018-02-20_setup.jpg" title="APA102 LED Quiescent Current Diagram"&gt;
&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 20 Feb 2018 22:26:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-02-20:/apa102-led-current-usage.html</guid><category>apa102</category><category>apa102</category><category>2020</category><category>led</category><category>power</category><category>usage</category><category>current</category><category>quiescent</category></item><item><title>Virtualizing GPU Access</title><link>https://memcpy.io/virtualizing-gpu-access.html</link><description>&lt;p&gt;For the past few years a clear trend of containerization of applications
and services has emerged. Having processes containerized is beneficial
in a number of ways. It both improves portability and strengthens security,
and if done properly the performance penalty can be low.&lt;/p&gt;
&lt;p&gt;In order to further improve security containers are commonly run in
virtualized environments. This provides some new challenges in terms
of supporting the accelerated graphics usecase.&lt;/p&gt;
&lt;h3&gt;OpenGL ES implementation&lt;/h3&gt;
&lt;p&gt;Currently Collabora and Google are implementing OpenGL ES 2.0
support. OpenGL ES 2.0 is the lowest common denominator for many mobile
platforms and as such is a requirement for Virgil3D to be viable on
the those platforms.&lt;/p&gt;
&lt;p&gt;That is is the motivation for making Virgil3D work on OpenGL ES hosts.&lt;/p&gt;
&lt;h2&gt;How …&lt;/h2&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 09 Feb 2018 11:17:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-02-09:/virtualizing-gpu-access.html</guid><category>graphics</category><category>linux</category><category>gpu</category><category>virtualization</category><category>virgl</category><category>virglrenderer</category><category>opengl</category><category>vulkan</category><category>gles</category><category>collabora</category></item><item><title>Android on Mainline Graphics @ FOSDEM</title><link>https://memcpy.io/android-on-mainline-graphics-fosdem.html</link><description>&lt;p&gt;&lt;a href="https://fosdem.org"&gt;&lt;img alt="Alt text" src="/images/2018-02-04_fosdem.png" title="FOSDEM"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A recording of the talk can be found &lt;a href="https://fosdem.org/2018/schedule/event/android_graphics/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2018-02-04/2018_fosdem_running_android_on_mainline_gfx.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2018-02-04/2018_fosdem_running_android_on_mainline_gfx.otp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers and volunteers of &lt;a href="https://fosdem.org/"&gt;FOSDEM&lt;/a&gt;, for hosting a great community event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sun, 04 Feb 2018 00:00:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2018-02-04:/android-on-mainline-graphics-fosdem.html</guid><category>talks</category><category>fosdem</category><category>2018</category><category>brussels</category><category>android</category><category>aosp</category><category>talk</category><category>slides</category><category>conference</category></item><item><title>Building ChromiumOS for Qemu</title><link>https://memcpy.io/building-chromiumos-for-qemu.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2017-11-28_chromeos_qemu.png" title="ChromiumOS running on Qemu"&gt;&lt;/p&gt;
&lt;p&gt;So let's start off by covering how ChromiumOS relates to ChromeOS. The
ChromiumOS project is essentially ChromeOS minus branding and some
packages for things like the media digital restrictions management.&lt;/p&gt;
&lt;p&gt;But on the whole, almost everything is there, and the pieces that aren't,
you don't &lt;em&gt;need&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;ChromiumOS&lt;/h2&gt;
&lt;h3&gt;Depot tools&lt;/h3&gt;
&lt;p&gt;In order to check out ChromiumOS and other large Google projects,
you'll need depot tools.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;googlesource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;depot_tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PWD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;depot_tools&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Maybe you'd want to add the PATH export to your .bashrc.&lt;/p&gt;
&lt;h3&gt;Building ChromiumOS&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chromiumos&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chromiumos&lt;/span&gt;
&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;googlesource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;chromiumos&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;googlesource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;external&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;minilayout&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j75&lt;/span&gt;
&lt;span class="n"&gt;cros_sdk&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BOARD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;generic …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 28 Nov 2017 11:32:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-11-28:/building-chromiumos-for-qemu.html</guid><category>kernel</category><category>linux</category><category>kernel</category><category>chromeos</category><category>chromiumos</category><category>chromium</category><category>qemu</category><category>ssh</category><category>collabora</category></item><item><title>Fixing bluetooth on the XPS 15 9550 on Ubuntu</title><link>https://memcpy.io/fixing-bluetooth-on-the-xps-15-9550-on-ubuntu.html</link><description>&lt;h2&gt;Why doesn't this work automatically?&lt;/h2&gt;
&lt;p&gt;The firmware blob that is needed by Broadcom devices is not supplied by default, and it has to be supplied manually.&lt;/p&gt;
&lt;h2&gt;How To&lt;/h2&gt;
&lt;p&gt;Download &lt;a href="/files/2017-10-28/BCM-0a5c-6410.hcd"&gt;BCM-0a5c-6410.hcd&lt;/a&gt; and copy it into &lt;code&gt;/lib/firmware/brcm/&lt;/code&gt; and then reboot your device.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget https://memcpy.io/files/2017-10-28/BCM-0a5c-6410.hcd
sudo cp BCM-0a5c-6410.hcd /lib/firmware/brcm/
sudo chmod 0644 /lib/firmware/brcm/BCM-0a5c-6410.hcd
sudo reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sat, 28 Oct 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-10-28:/fixing-bluetooth-on-the-xps-15-9550-on-ubuntu.html</guid><category>hack</category><category>desktop</category><category>debian</category><category>ubuntu</category><category>broadcom</category><category>brcm</category><category>bluetooth</category><category>connecting</category><category>pairing</category><category>driver</category></item><item><title>Android on Mainline Graphics @ Embedded Linux Conference EU</title><link>https://memcpy.io/android-on-mainline-graphics-embedded-linux-conference-eu.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2017-10-25_speaking_photo.jpg" title="Speaking @ ELC EU"&gt;&lt;/p&gt;
&lt;p&gt;A recording of the talk can be found &lt;a href="https://www.youtube.com/watch?v=D9OUcQs0TnQ"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2017-10-25/2017_elc_running_android_on_mainline_gfx.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2017-10-25/2017_elc_running_android_on_mainline_gfx.otp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://osseu17.sched.com/"&gt;Embedded Linux Conference EU&lt;/a&gt;,
for hosting a great community event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 25 Oct 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-10-25:/android-on-mainline-graphics-embedded-linux-conference-eu.html</guid><category>talks</category><category>android</category><category>aosp</category><category>talks</category><category>slides</category><category>embedded linux conference</category><category>elc</category><category>eu</category><category>prague</category></item><item><title>drm_hwcomposer: A brief update @ XDC 20117</title><link>https://memcpy.io/drm_hwcomposer-a-brief-update-xdc-20117.html</link><description>&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curios about the slides, you can download the &lt;a href="/files/2017-09-22/xdc_drm_hwcomposer.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2017-09-22/xdc_drm_hwcomposer.otp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://www.x.org/wiki/Events/XDC2017/"&gt;XDC&lt;/a&gt;,
and Google for hosting a great community event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 22 Sep 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-09-22:/drm_hwcomposer-a-brief-update-xdc-20117.html</guid><category>talks</category><category>android</category><category>aosp</category><category>talks</category><category>slides</category><category>xdc</category><category>x developers conference</category></item><item><title>Android on Mainline Graphics @ Open Source Summit NA</title><link>https://memcpy.io/android-on-mainline-graphics-open-source-summit-na.html</link><description>&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curious about the slides, you can download the &lt;a href="/files/2017-09-11/oss_na_2017_android_oss_graphics.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2017-09-11/oss_na_2017_android_oss_graphics.otp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;This post has been a part of work undertaken by my employer &lt;a href="http://www.collabora.com"&gt;Collabora&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to thank the wonderful organizers of &lt;a href="https://ossna2017.sched.com/"&gt;Open Source Summit NA&lt;/a&gt;,
for hosting a great community event.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 11 Sep 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-09-11:/android-on-mainline-graphics-open-source-summit-na.html</guid><category>talks</category><category>android</category><category>aosp</category><category>talks</category><category>slides</category><category>open source summit</category><category>north america</category><category>oss na</category><category>ossna</category></item><item><title>Android on Mainline Graphics @ GDG Berlin Android</title><link>https://memcpy.io/android-on-mainline-graphics-gdg-berlin-android.html</link><description>&lt;p&gt;I would like to thank the wonderful organizers, &lt;a href="https://www.meetup.com/GDG-Berlin-Android"&gt;GDG Berlin Android&lt;/a&gt;,
for hosting a great community event.&lt;/p&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;
&lt;p&gt;If you're curios about the slides, you can download the &lt;a href="/files/2017-09-01/gdg_2017_android_oss_graphics.pdf"&gt;PDF&lt;/a&gt; or
the &lt;a href="/files/2017-09-01/gdg_2017_android_oss_graphics.otp"&gt;OTP&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 01 Sep 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-09-01:/android-on-mainline-graphics-gdg-berlin-android.html</guid><category>talks</category><category>android</category><category>aosp</category><category>imx6</category><category>talks</category><category>slides</category><category>GDG Berlin Android</category></item><item><title>Android: NXP i.MX6 on Etnaviv Update</title><link>https://memcpy.io/android-nxp-imx6-on-etnaviv-update.html</link><description>&lt;p&gt;Since the last post a lot work has gone into upstreaming and stabilizing the
etnaviv on Android ecosystem. This has involved Android, kernel and Mesa
changes. Many of which are available upstream now. A How-To for getting you
up and running on an iMX6 dev board is available &lt;a href="../android-getting-up-and-running-on-the-imx6.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Improvements&lt;/h2&gt;
&lt;h4&gt;Modifiers support&lt;/h4&gt;
&lt;p&gt;Modifiers support has been accepted into Mesa, GBM and gbm_gralloc.
Modifiers were mentioned in a &lt;a href="../android-nxp-imx6-buffer-modifier-support.html"&gt;previous post&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Etnaviv driver support for Android&lt;/h4&gt;
&lt;p&gt;Patches enabling the etnaviv Mesa driver being built for Android have now
landed upstream.&lt;/p&gt;
&lt;h4&gt;Stability on Android&lt;/h4&gt;
&lt;p&gt;A number for small stability issues present while running Android on i.MX6
hardware have now been fixed, and the platform is now relatively stable.&lt;/p&gt;
&lt;h4&gt;Performance diagnostics&lt;/h4&gt;
&lt;p&gt;We have a decent understanding that the …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 21 Jul 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-07-21:/android-nxp-imx6-on-etnaviv-update.html</guid><category>aosp</category><category>android</category><category>aosp</category><category>imx6</category><category>sabre</category><category>vivante</category><category>etnaviv</category><category>linux</category><category>collabora</category></item><item><title>GALLIUM_HUD: Debug Mesa Graphics Performance</title><link>https://memcpy.io/gallium_hud-debug-mesa-graphics-performance.html</link><description>&lt;h2&gt;GALLIUM_HUD&lt;/h2&gt;
&lt;p&gt;GALLIUM_HUD is a feature that adds performance graphs to applications that describe
various aspects like FPS, CPU usage, etc in realtime.&lt;/p&gt;
&lt;p&gt;It is enabled using an environment variable, GALLIUM_HUD, that can be set for GL/EGL/etc
applications. It only works for Mesa drivers that are Gallium based, which means that
the most drivers (with the notable exception of some Intel drivers) support GALLIUM_HUD.&lt;/p&gt;
&lt;p&gt;See GALLIUM_HUD options:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GALLIUM_HUD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;
&lt;span class="n"&gt;glxgears&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Android&lt;/h3&gt;
&lt;p&gt;If you're building Android, you can supply system-wide environment values by doing an
export in the init.rc file of the device you are using, like 
&lt;a href="https://customer-git.collabora.com/cgit/android-etnaviv/android-device-linaro-generic.git/commit/?h=android-etnaviv&amp;amp;id=48755378c388707260a8bb50e0fb62a309ded986"&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Go to android source code checkout&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;android&lt;/span&gt;

&lt;span class="c1"&gt;# Add export to init.rc (linaro/generic is the device I use)&lt;/span&gt;
&lt;span class="n"&gt;nano&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linaro&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;init …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 28 Jun 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-06-28:/gallium_hud-debug-mesa-graphics-performance.html</guid><category>mesa</category><category>android</category><category>aosp</category><category>linux</category><category>mesa</category><category>gallium</category><category>hud</category><category>peformance</category><category>diagnostics</category><category>debug</category><category>collabora</category></item><item><title>Android: NXP i.MX6 Buffer Modifier Support</title><link>https://memcpy.io/android-nxp-imx6-buffer-modifier-support.html</link><description>&lt;iframe width="100%" height="380" src="https://www.youtube.com/embed/Dn7hOa9WiYk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;With modifier support added to Mesa and gbm_gralloc, it is now possible to boot Android on iMX6
platforms using no proprietary blobs at all.
This makes iMX6 one of the very few embedded SOCs that needs no blobs at all to run a full graphics stack.&lt;/p&gt;
&lt;p&gt;Not only is that a great win for Open Source in general, but it also makes the iMX6 more attractive as a platform.
A further positive point is that this lays the groundwork for the iMX8 platform, and supporting it will come much easier.&lt;/p&gt;
&lt;h2&gt;What are modifiers used for?&lt;/h2&gt;
&lt;p&gt;Modifiers are used to represent different properties of buffers. These properties can cover a range of
different information about a buffer, for example compression and &lt;a href="https://github.com/laanwj/etna_viv/blob/master/doc/hardware.md#texture-tiling"&gt;tiling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the case of …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 02 Jun 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-06-02:/android-nxp-imx6-buffer-modifier-support.html</guid><category>aosp</category><category>android</category><category>aosp</category><category>imx6</category><category>vivante</category><category>etnaviv</category><category>linux</category><category>mesa</category><category>tiling</category><category>modifier</category><category>collabora</category></item><item><title>Android: Getting up and running on the iMX6</title><link>https://memcpy.io/android-getting-up-and-running-on-the-imx6.html</link><description>&lt;p&gt;Since the hardware very much matters this is going to be divided into a few parts, the common steps and the hardware specific ones.&lt;/p&gt;
&lt;p&gt;This post is a bit of a living document and will be changed over time, and if you have any questions about it, please reach out through email (robert.foss at collabora.com) or irc (tomeu or robertfoss on #dri-devel on freenode).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nl"&gt;Changelog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build_android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setup_sdcard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nl"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Added&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build_android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;setup_sdcard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;
&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build_android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nl"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Don&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;write&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SD&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;without&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;option&lt;/span&gt;
&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Switch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;
&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;compiler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;installation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;
&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Re&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;some&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;
&lt;span class="mi"&gt;2017 …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 27 Apr 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-04-27:/android-getting-up-and-running-on-the-imx6.html</guid><category>aosp</category><category>android</category><category>aosp</category><category>imx6</category><category>sabre</category><category>rdu2</category><category>vivante</category><category>etnaviv</category><category>linux</category><category>collabora</category></item><item><title>Android: Changing the bootanimation</title><link>https://memcpy.io/android-changing-the-bootanimation.html</link><description>&lt;p&gt;There exists &lt;a href="https://android.googlesource.com/platform/frameworks/base/+/master/cmds/bootanimation/FORMAT.md"&gt;official documentation&lt;/a&gt;
for how to create a custom boot animation, but unfortunately it is lacking
in actual examples.&lt;/p&gt;
&lt;p&gt;So this guide is a bit more hands on.&lt;/p&gt;
&lt;h2&gt;Structure of bootanimation.zip&lt;/h2&gt;
&lt;p&gt;Without covering too much of the same gound as the documentation,
let's have a quick look at what is in a simple bootanimation.zip.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bootanimation&lt;/span&gt;
&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;
&lt;span class="n"&gt;drwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;drwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;span class="n"&gt;drwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;part0&lt;/span&gt;
&lt;span class="n"&gt;drwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hottuna&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;part1&lt;/span&gt;

&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bootanimation&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 20 Apr 2017 00:00:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-04-20:/android-changing-the-bootanimation.html</guid><category>aosp</category><category>android</category><category>aosp</category><category>bootanimation</category><category>boot</category><category>animation</category><category>collabora</category></item><item><title>Audio editing images</title><link>https://memcpy.io/audio-editing-images.html</link><description>&lt;p&gt;&lt;a href="https://github.com/robertfoss/audio_shop/"&gt;Audio Shop&lt;/a&gt; is a simple script
that I cobbled together that gets you started with mangling image data as
if it was audio data.&lt;/p&gt;
&lt;p&gt;The script wraps 3 individually excellent tools; &lt;a href="https://ffmpeg.org/"&gt;ffmpeg&lt;/a&gt;,
&lt;a href="https://www.imagemagick.org/script/index.php"&gt;ImageMagick&lt;/a&gt; and
&lt;a href="http://sox.sourceforge.net/"&gt;SoX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2017-04-09_eiffel_tower_bass.jpg"&gt;&lt;img alt="Alt text" src="/images/2017-04-09_eiffel_tower_bass.jpg" title="Eiffel tower bass effect"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The way it works is by first converting an image to a raw format like rgb
or yuv. This is done to prevent the audio editor from destroying the structure
of (relatively) complex formats like jpg, png or gif.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2017-04-09_eiffel_tower_echo.jpg"&gt;&lt;img alt="Alt text" src="/images/2017-04-09_eiffel_tower_echo.jpg" title="Eiffel tower echo effect"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If converting to a raw format is the first step, the second step is
importing the raw image data into the audio editor. To do this
in way you can expect good results from, the raw format should use
a bit-depth that your image editor can use. For example RGB, where …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sun, 09 Apr 2017 21:35:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-04-09:/audio-editing-images.html</guid><category>art</category><category>audio</category><category>art</category><category>images</category><category>data</category><category>bending</category><category>databending</category></item><item><title>Android: Enabling mainline graphics</title><link>https://memcpy.io/android-enabling-mainline-graphics.html</link><description>&lt;p&gt;The  &lt;a href="https://source.android.com/devices/graphics/implement-hwc.html"&gt;HWC&lt;/a&gt; 
(Hardware Composer) API is used by SurfaceFlinger for compositing layers to the screen.
The HWC abstracts objects such as overlays and 2D blitters and helps offload some work
that would normally be done with OpenGL.
SurfaceFlinger on the other hand accepts buffers from multiple sources, composites them,
and sends them to the display.&lt;/p&gt;
&lt;p&gt;&lt;a href="/images/2017-03-28_android_graphics_stack.png"&gt;&lt;img alt="Alt text" src="/images/2017-03-28_android_graphics_stack.png" title="Android Graphics Stack"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The above graphic depicts the traditional Android graphics stack.&lt;/p&gt;
&lt;p&gt;This is where drm_hwcomposer comes into play. Since the mainline kernel graphics stack
doesn't offer the HWC API, drm_hwcomposer is introduced to interface with the mainline
graphics stack through mesa and libdrm. Before this work drm_hwcomposer only offered the
HWC1 API.
Since Android 7.0 version 2 of the HWC API is used by SurfaceFlinger. HWC2 differs in a few
ways …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 28 Mar 2017 15:18:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-03-28:/android-enabling-mainline-graphics.html</guid><category>aosp</category><category>android</category><category>aosp</category><category>graphics</category><category>drm</category><category>drm_hwcomposer</category><category>hwcomposer</category><category>hwc2</category><category>collabora</category></item><item><title>Removing the Chromebook Write-Protect screw</title><link>https://memcpy.io/removing-the-chromebook-write-protect-screw.html</link><description>&lt;p&gt;This post will look specifically at removing the WP screw from a Chell 
(HP Chromebook 13 G1) device, and verifying that it has been successfully
removed.&lt;/p&gt;
&lt;p&gt;To actually flash firmware to Chromebook machines, a device called a &lt;a href="http://dev.chromium.org/developers/how-tos/install-depot-tools"&gt;Servo&lt;/a&gt;
is needed. While these devices aren't available publicly, they can
be produced freely or possibly requested from Google if you are contributing
code to the ChromiumOS project.&lt;/p&gt;
&lt;h2&gt;Removing the Write-Protect screw&lt;/h2&gt;
&lt;p&gt;&lt;a href="/images/2017-02-27_wp_screw.jpg"&gt;&lt;img alt="Alt text" src="/images/2017-02-27_wp_screw.jpg" title="WP screw on Chell Chromebook"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So this is what the WP screw looks like on a Chell Chromebook. This may or may
not be what you will find in other devices. But if you take a close look,
you will notice that the copper pad that the the screw attaches against is
split into parts that are bridged by a screw …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 27 Feb 2017 16:55:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-02-27:/removing-the-chromebook-write-protect-screw.html</guid><category>chromium</category><category>chromium</category><category>chromebook</category><category>chell</category><category>wp screw</category><category>wp-screw</category><category>collabora</category></item><item><title>Precompiling APK files during Android AOSP build</title><link>https://memcpy.io/precompiling-apk-files-during-android-aosp-build.html</link><description>&lt;h2&gt;Enable precompilation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;aosp_checkout&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="nv"&gt;find&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;huawei&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;angler&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mini&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;emulator&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;arm64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mini&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;emulator&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mini&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;emulator&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;armv7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;neon&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mips&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mips64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mini&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;emulator&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;arm64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mini&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;emulator&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;mips&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;armv7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;neon&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;mini&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;emulator&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;mips64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;lge&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;bullhead&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro_x86_64_only&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro_arm64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro_arm64_only&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro_x86_64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;linaro&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;generic&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;BoardConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mk&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nv"&gt;device …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 22 Feb 2017 16:55:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-02-22:/precompiling-apk-files-during-android-aosp-build.html</guid><category>android</category><category>aosp</category><category>apk</category><category>dex2oat</category><category>android</category><category>collabora</category></item><item><title>Setting up a ChromiumOS dev environment</title><link>https://memcpy.io/setting-up-a-chromiumos-dev-environment.html</link><description>&lt;h2&gt;Set up environment&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DEV_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEV_DIR&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CHROMIUM_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$DEV_DIR/chromiumos&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;CHROMIUM_DIR&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$DEV_DIR/depot_tools:$PATH&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# The BOARD variable used here is specific for the Chromebook that is&lt;/span&gt;
&lt;span class="c1"&gt;# being targeted, a more generic target like &amp;quot;amd64-generic&amp;quot; could&lt;/span&gt;
&lt;span class="c1"&gt;# be more useful for you needs.&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BOARD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;chell&lt;/span&gt;

&lt;span class="c1"&gt;# The USB_DEVICE variable refers to the USB device that will be used&lt;/span&gt;
&lt;span class="c1"&gt;# for flashing ChromiumOS onto a Chromebook.&lt;/span&gt;
&lt;span class="c1"&gt;# Make sure that this device does not contain anything important!&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USB_DEVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/sda&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Install dependencies&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gitk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gui&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;subversion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;DEV_DIR&lt;/span&gt;
&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;googlesource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;chromium&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;depot_tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Get ChromiumOS source&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CHROMIUM_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
repo&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;https://chromium.googlesource.com/chromiumos/manifest.git
repo&lt;span class="w"&gt; &lt;/span&gt;sync&lt;span class="w"&gt; &lt;/span&gt;-j25 …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 16 Feb 2017 10:31:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2017-02-16:/setting-up-a-chromiumos-dev-environment.html</guid><category>chromiumos</category><category>linux</category><category>chromiumos</category><category>chromebook</category><category>collabora</category></item><item><title>Running an Android Unit Test</title><link>https://memcpy.io/running-an-android-unit-test.html</link><description>&lt;p&gt;A similar approach can be used for any Android module.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd aosp
bash
source build/envsetup.sh &amp;amp;&amp;amp; \
lunch linaro_arm64-userdebug &amp;amp;&amp;amp; \
mmm system/core/libsync/tests &amp;amp;&amp;amp; \
adb root &amp;amp;&amp;amp; \
adb remount &amp;amp;&amp;amp; \
adb sync &amp;amp;&amp;amp; \
adb shell /data/nativetest64/sync-unit-tests/sync-unit-tests
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Wed, 07 Dec 2016 20:23:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-12-07:/running-an-android-unit-test.html</guid><category>android</category><category>linux</category><category>kernel</category><category>android</category><category>aosp</category><category>adb</category></item><item><title>XDC 2016</title><link>https://memcpy.io/xdc-2016.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2016-09-23_xdc_2016.jpg" title="XDC 2016"&gt;&lt;/p&gt;
&lt;p&gt;XDC 2016 was hosted in Helsinki at Haaga-Helia.
The full &lt;a href="https://www.x.org/wiki/Events/XDC2016/Program/"&gt;program&lt;/a&gt; was filmed and is archived &lt;a href="https://www.youtube.com/channel/UCXlH5v1PkEhjzLFTUTm_U7g/videos"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;[&lt;a href="files/2016-09-23/xdc-2016-fast_ui_draw.pdf"&gt;Slides&lt;/a&gt;] FastUIDraw - High Performance 2D renderer for GPUs&lt;/h2&gt;
&lt;p&gt;Kevin Rogovin gave an excellent talk about FastUIDraw, which is a highly optimiser 2d renderer for GPUs.&lt;/p&gt;
&lt;p&gt;By agressively targetting GPUs only and limiting the feature set to what is required by a browser FastUIDraw performs &amp;gt;9.3x faster than Cairo-CPU and &amp;gt;4.8x times the previous GPU state of the art SKIA-GL.&lt;/p&gt;
&lt;p&gt;Hopefully FastUIDraw can be incorporated into upstream of ChromiumOS and Android.&lt;/p&gt;
&lt;h2&gt;[&lt;a href="files/2016-09-23/xdc-2016_2d_perf.pdf"&gt;Slides&lt;/a&gt;] 2D Performance&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://phd.mupuf.org/"&gt;Martin Perez&lt;/a&gt; gave a talk about 2D performance and power consumption of the Xserver.&lt;/p&gt;
&lt;p&gt;The xf86-video-intel driver showed quite mixed performance numbers of 1.51-32.6x times the CPU performance.
The FPS/Watt …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 23 Sep 2016 20:20:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-09-23:/xdc-2016.html</guid><category>linux</category><category>linux</category><category>graphics</category><category>kernel</category><category>collabora</category></item><item><title>Building Android for Qemu with Mesa and Virgil3D</title><link>https://memcpy.io/building-android-for-qemu-with-mesa-and-virgil3d.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2016-08-30_android_qemu.png" title="Android running on Qemu"&gt;&lt;/p&gt;
&lt;p&gt;Developing Linux for Android on Qemu allows you to do some things that are
not necessarily possible using the stock emulator.
For my purposes I need access to a GPU and be able to modify the driver, which
is where Virgilrenderer and Qemu comes in handy.&lt;/p&gt;
&lt;p&gt;The guide below helps you compile Android and run it on top of Qemu with
Mesa/Virgilrenderer supplying a virtual GPU.
Because of this, the following guide is aimed at Linux hosts.&lt;/p&gt;
&lt;p&gt;This guide is based on Rob Herrings &lt;a href="https://github.com/robherring/generic_device/wiki/KConfig-based-Multi-platform-Android-Device-(and-Mesa-graphics)"&gt;fantastic guide&lt;/a&gt;, but has
been slightly streamlined and had physical hardware support stripped out.&lt;/p&gt;
&lt;h2&gt;Install dependencies&lt;/h2&gt;
&lt;p&gt;These dependencies were available on Ubuntu 16.04, some alternative packages
might be needed for other distributions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;autoconf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 30 Aug 2016 15:22:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-08-30:/building-android-for-qemu-with-mesa-and-virgil3d.html</guid><category>kernel</category><category>linux</category><category>kernel</category><category>android</category><category>qemu</category><category>collabora</category></item><item><title>Ethernet device stress testing</title><link>https://memcpy.io/ethernet-device-stress-testing.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2016-08-25_ethernet_device_testing.png" title="Screenshot of python script"&gt;&lt;/p&gt;
&lt;p&gt;During testing of power management patches for usb ethernet dongles, a script
was needed to stress test connecting/disconnecting/reconnecting these devices.&lt;/p&gt;
&lt;p&gt;Luckily a script like that already exists as a part of the chromiumos project,
and can be found &lt;a href="https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/client/site_tests/network_EthernetStressPlug/network_EthernetStressPlug.py"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That script does however not run standalone and requires a remote device
(chromebook) to execute on. So I took the liberty of changing it to support
local testing. The modified version can be found &lt;a href="files/2016-08-25/network_EthernetStressPlug.py"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This might come in handy for someone, if not, the script will at least be
archived on this site.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pip2.7&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;autotest
$&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;link
&lt;span class="m"&gt;1&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;lo:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;mtu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65536&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;qdisc&lt;span class="w"&gt; &lt;/span&gt;noqueue&lt;span class="w"&gt; &lt;/span&gt;state&lt;span class="w"&gt; &lt;/span&gt;UNKNOWN&lt;span class="w"&gt; &lt;/span&gt;mode&lt;span class="w"&gt; &lt;/span&gt;DEFAULT&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;qlen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;link/loopback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00 …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 25 Aug 2016 13:05:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-08-25:/ethernet-device-stress-testing.html</guid><category>kernel</category><category>linux</category><category>kernel</category><category>script</category><category>collabora</category><category>chromiumos</category></item><item><title>Linux kernel development shell scripts</title><link>https://memcpy.io/linux-kernel-development-shell-scripts.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2016-07-26_linux_development_helper_script.png" title="Terminal screenshot of scripts in use"&gt;&lt;/p&gt;
&lt;p&gt;While upstreaming kernel patches scripts/checkpatch.pl and scripts/get_maintainer.pl
often come in handy.
But to me the interface they provide is slightly bulky and rely
on using patch files instead of git commits, which to me is a bit inconvenient.&lt;/p&gt;
&lt;p&gt;These scripts are all meant to be included in &lt;strong&gt;.bashrc&lt;/strong&gt; or &lt;strong&gt;.zshrc&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;scripts/checkpatch.pl helper&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;checkpatch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-z&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="p"&gt;+x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;scripts/checkpatch.pl&lt;span class="w"&gt; &lt;/span&gt;--no-signoff&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="s2"&gt;&amp;quot;cache&amp;quot;&lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;--cached&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;scripts/checkpatch.pl&lt;span class="w"&gt; &lt;/span&gt;--no-signoff&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;NUM_COMMITS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;diff&lt;span class="w"&gt; &lt;/span&gt;HEAD~&lt;span class="nv"&gt;$NUM_COMMITS&lt;/span&gt;..HEAD&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;scripts/checkpatch.pl&lt;span class="w"&gt; &lt;/span&gt;--no-signoff&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The checkpatch script simply wraps the patch creation process and allows …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Tue, 26 Jul 2016 10:32:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-07-26:/linux-kernel-development-shell-scripts.html</guid><category>kernel</category><category>linux</category><category>kernel</category><category>script</category><category>collabora</category></item><item><title>Running Weston on a Raspbian</title><link>https://memcpy.io/running-weston-on-a-raspbian.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2016-06-03_weston.png" title="Weston running on a RPi2."&gt;&lt;/p&gt;
&lt;p&gt;Progress in the VC4 graphics camp and the Wayland camp now enables us to run
Weston on top of the drm backend for VC4 platforms. Previously software acceleration
using pixman was needed, but this is no longer the case.&lt;/p&gt;
&lt;p&gt;Additionally the rpi backend for weston is now being removed since it has been
obsoleted by the improved drm layer.&lt;/p&gt;
&lt;p&gt;Let's explore running hardware accelerated Weston on the Raspberry Pi.&lt;/p&gt;
&lt;h2&gt;Building Linux kernel&lt;/h2&gt;
&lt;p&gt;A comprehensive guide for building a recent Linux kernel for Raspberry Pi boards has
been written by the Raspberry Pi foundation and is available &lt;a href="https://www.raspberrypi.org/documentation/linux/kernel/building.md"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As of this writing the guide helps you build a v4.4 kernel which is good enough for our purposes.&lt;/p&gt;
&lt;h2&gt;Set up alternative install location&lt;/h2&gt;
&lt;p&gt;These build instructions …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Fri, 03 Jun 2016 10:32:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-06-03:/running-weston-on-a-raspbian.html</guid><category>wayland</category><category>wayland</category><category>weston</category><category>rpi</category><category>rpi2</category><category>kernel</category></item><item><title>Coverpage template</title><link>https://memcpy.io/coverpage-template.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="https://github.com/robertfoss/coverpage/raw/media/screenshot.png" title="coverpage screenshot"&gt;&lt;/p&gt;
&lt;p&gt;Coverpage is a single-page landing page built to showcase an idea or a product. To allow interested parties to get notified of updates, the template has mailchimp subscription integration.&lt;/p&gt;
&lt;p&gt;A live version of the site can be found at &lt;a href="http://coverpage.memcpy.io"&gt;coverpage.memcpy.io&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/robertfoss/coverpage.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;GitHub hosting&lt;/h2&gt;
&lt;p&gt;This template was built with the explicit intention of having it be hosted at GitHub in a gh-pages branch.
Therefore it includes a Makefile for pushing copy of the current design to a gh-pages branch.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sun, 27 Mar 2016 00:34:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-03-27:/coverpage-template.html</guid><category>coverpage</category><category>coverpage</category><category>html</category><category>template</category></item><item><title>ESP8266 APA102 Bulb</title><link>https://memcpy.io/esp8266-apa102-bulb.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="https://github.com/robertfoss/esp8266_apa102_bulb/raw/media/v2_running.jpg" title="v2: Assembled and running over WiFi"&gt;&lt;/p&gt;
&lt;p&gt;The product of this project is a WiFi connected LED bulb. Every LED on this bulb is individually programmable over the WiFi, by simply sending UDP packets to the bulb.&lt;/p&gt;
&lt;h2&gt;Software and hardware sources&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/robertfoss/esp8266_apa102_bulb.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/robertfoss/esp8266_apa102_bulb"&gt;This project&lt;/a&gt; consists of 3 parts: the software running on the led bulb, the software running on some host computer and the hardware.&lt;/p&gt;
&lt;h3&gt;Firmware&lt;/h3&gt;
&lt;p&gt;The firmare is based on the &lt;a href="https://github.com/nodemcu/nodemcu-firmware"&gt;NodeMCU&lt;/a&gt; firwmare for the ESP8266. It's running the APA102 LED driver and the enduser setup module, which I've written about &lt;a href="../user-friendly-setup-of-esp8266-gadgets.html"&gt;previously&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally it's running 3 lua scripts that deal with different aspects.&lt;/p&gt;
&lt;p&gt;There's init.lua which makes sure we're connected to a WiFi.&lt;/p&gt;
&lt;p&gt;udp_listener.lua receives UDP packets and then sends forwards that …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sun, 07 Feb 2016 22:46:00 +0100</pubDate><guid isPermaLink="false">tag:memcpy.io,2016-02-07:/esp8266-apa102-bulb.html</guid><category>ESP8266</category><category>ESP8266</category><category>APA102</category><category>LED</category><category>WIFI</category></item><item><title>WS2812 LED Matrix</title><link>https://memcpy.io/ws2812-led-matrix.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2015-10-12_led_matrix_running.jpg" title="LED Matrix Running"&gt;&lt;/p&gt;
&lt;p&gt;The LED Matrix is constructed out of a WS2812B 8x8 panel, a 3D printed case, an ESP8266, a LiPo battery and some software.&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/robertfoss/esp8266_ws2812_matrix.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The software is divided into two parts. The receiving end is run on the ESP8266 that has been flashed with &lt;a href="https://github.com/nodemcu/nodemcu-firmware"&gt;NodeMCU&lt;/a&gt; and is a simple lua script that receives UDP packets and forwards them to the excellent WS2812 module created by the the equally excellent &lt;a href="https://github.com/kbeckmann"&gt;Konrad Beckmann&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The second part is run on a host pc. It's a simple python script that generates a framebuffer from a sinusoidal animation and transmits it over UDP to the IP of the ESP8266.
This relies on the host pc being able to connect to the ESP8266 …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Mon, 12 Oct 2015 16:51:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2015-10-12:/ws2812-led-matrix.html</guid><category>ESP8266</category><category>ESP8266</category><category>ESP</category><category>WS2812</category><category>WS2812B</category><category>3D Printing</category><category>CAD</category></item><item><title>WS2812 Welding Goggles</title><link>https://memcpy.io/ws2812-welding-goggles.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2015-10-11_goggles.png" title="WS2812 Welding Goggles"&gt;&lt;/p&gt;
&lt;p&gt;The goggles were built using an AtTiny85 module and a WS2812B strip and some bits and bobs that were laying around. A more complete BOM can be found below.&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/robertfoss/digispark_ws2812_waves.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The animation is built ontop of the excellent &lt;a href="https://github.com/cpldcpu/light_ws2812/tree/master/light_ws2812_Arduino"&gt;light_ws2812&lt;/a&gt; library. It supports the AtTiny85 better than other competing libraries like FastLED.&lt;/p&gt;
&lt;p&gt;The animation is built around an non-float sin function and a HSV function that generates the actual colors.&lt;/p&gt;
&lt;h2&gt;Video&lt;/h2&gt;
&lt;video controls&gt;
  &lt;source src="videos/2015-10-11_goggles.mp4" type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;

&lt;h2&gt;Bill of materials&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;6€ &lt;a href="https://www.weldorado.de/"&gt;Weldorado STROOF DIN4 Welding Goggles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2$ &lt;a href="http://www.aliexpress.com/item/Free-shipping-GY-Digispark-Kickstarter-Mini-Development-board-TINY85-module-for-Ard-usb/32312040804.html?ws_ab_test=201407_4,201444_5,201409_4"&gt;Digispark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;23$ &lt;a href="http://www.aliexpress.com/item/1M-WS2812B-WS2811-IC-Chip-built-in-Black-PCB-144-leds-m-Digital-5050-RGB-LED/1838594646.html?ws_ab_test=201407_4,201444_5,201409_4"&gt;WS2812B Strip 144 LEDs/m&lt;/a&gt; - Only about a 5th of the length needed.&lt;/li&gt;
&lt;li&gt;2x$4 &lt;a href="http://www.aliexpress.com/item/Eachine-3D-X4-RC-Quadcopter-Spare-Parts-3-7V-300Mah-Battery/32335487012.html?ws_ab_test=201407_4,201444_5,201409_4"&gt;LiPo 3.7V 300mAh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;$3 &lt;a href="http://www.aliexpress.com/item/F14786-4-in-1-3-7V-Lipo-Battery-Charger-USB-Interface-4-Ports-For-Hubsan-X4/32394891091.html?ws_ab_test=201407_4,201444_5,201409_4"&gt;LiPo USB Charger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;$6 &lt;a href="http://www.aliexpress.com/item/10-pairs-of-battery-plug-connector-1S-2-Pins-Mirco-model-battery-connector/32305697134.html"&gt;Battery connector cable …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Sun, 11 Oct 2015 13:16:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2015-10-11:/ws2812-welding-goggles.html</guid><category>WS2812</category><category>AtTiny85</category><category>Digispark</category><category>WS2812</category><category>WS2812B</category><category>goggles</category></item><item><title>User friendly setup of ESP8266 gadgets</title><link>https://memcpy.io/user-friendly-setup-of-esp8266-gadgets.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2015-07-30_screenshot.png" title="Screenshot"&gt;&lt;/p&gt;
&lt;p&gt;The ESP8266 lacks a simple end-user compatible way to be configured with the login details of the local WiFi. Running the ESP8266 in a 'captive portal' mode where every http request is hijacked and replaced with form allows the end user to submit the credentials of the local WiFi hotspot by simply connecting to an ESP8266 hosted access point.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/robertfoss/esp8266_nodemcu_wifi_setup"&gt;esp8266_nodemcu_wifi_setup&lt;/a&gt; is designed to provide a simple interface for users to configure their ESP8266/NodeMCU based devices through.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start ESP.&lt;/li&gt;
&lt;li&gt;Connect to the "SetupGadget" WiFi through your internet enabled thing of choice.&lt;/li&gt;
&lt;li&gt;Submit credentials of your local WiFi.&lt;/li&gt;
&lt;li&gt;The ESP reboots and connects to your local WiFi.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What is this magic! How could a mere mortal like me summon features like this?!&lt;/h2&gt;
&lt;p&gt;Let me tell you …&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 30 Jul 2015 15:10:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2015-07-30:/user-friendly-setup-of-esp8266-gadgets.html</guid><category>ESP8266</category><category>NodeMCU</category><category>ESP8266</category><category>Setup</category></item><item><title>Building NodeMCU for the ESP8266</title><link>https://memcpy.io/building-nodemcu-for-the-esp8266.html</link><description>&lt;p&gt;&lt;img alt="Alt text" src="/images/2015-05-14_esp8266.jpg" title="ESP8266"&gt;&lt;/p&gt;
&lt;p&gt;This is a simple step-by-step guide to building and flashing NodeMCU for the ESP8266.&lt;/p&gt;
&lt;h3&gt;Build ESP8266 SDK&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unrar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;autoconf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;automake&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;libtool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gperf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bison&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;texinfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gawk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ncurses&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;libexpat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sed&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;
&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pfalcon&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;esp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sdk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;esp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sdk&lt;/span&gt;
&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;submodule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sync&lt;/span&gt;
&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;submodule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;
&lt;span class="n"&gt;make&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;esp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sdk&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xtensa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lx106&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;elf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Build NodeMCU&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/nodemcu/nodemcu-firmware.git
cd nodemcu-firmware
&lt;span class="gh"&gt;#&lt;/span&gt; Switch to dev branch, since it&amp;#39;s the most up to date
git checkout --track origin/dev
&lt;span class="gh"&gt;#&lt;/span&gt; Make INTEGER version, since it uses less memory/space
make EXTRA_CCFLAGS=&amp;quot;-DLUA_NUMBER_INTEGRAL&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Flash NodeMCU&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;COMPORT=/dev/ttyUSB0 make flash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Modifying NodeMCU to fit …&lt;/h3&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Robert Foss</dc:creator><pubDate>Thu, 14 May 2015 11:31:00 +0200</pubDate><guid isPermaLink="false">tag:memcpy.io,2015-05-14:/building-nodemcu-for-the-esp8266.html</guid><category>ESP8266</category><category>NodeMCU</category><category>ESP8266</category></item></channel></rss>