<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lekernel's scrapbook &#187; Howto&#8217;s</title>
	<atom:link href="http://lekernel.net/blog/category/howtos/feed/" rel="self" type="application/rss+xml" />
	<link>http://lekernel.net/blog</link>
	<description>News and small projects of mine. See http://lekernel.net for my main webpage.</description>
	<lastBuildDate>Tue, 11 Dec 2012 12:24:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Observing internal FPGA signals</title>
		<link>http://lekernel.net/blog/2011/11/observing-internal-fpga-signals/</link>
		<comments>http://lekernel.net/blog/2011/11/observing-internal-fpga-signals/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 15:33:40 +0000</pubDate>
		<dc:creator>lekernel</dc:creator>
				<category><![CDATA[Howto's]]></category>
		<category><![CDATA[Milkymist]]></category>

		<guid isPermaLink="false">http://lekernel.net/blog/?p=1613</guid>
		<description><![CDATA[By Werner Almesberger Sometimes, when debugging some firmware or hardware, it is necessary to see how the internal state of a chip changes in response to external signals. With microcontrollers, this can be accomplished by adding code that toggles some pin that is then used for debugging, and watching that pin with an oscilloscope. Such [...]]]></description>
			<content:encoded><![CDATA[<p><i>By <a href="http://www.almesberger.net">Werner Almesberger</a></i></p>
<p>Sometimes, when debugging some firmware or hardware, it is necessary to see how the internal state of a chip changes in response to external signals.</p>
<p>With microcontrollers, this can be accomplished by adding code that toggles some pin that is then used for debugging, and watching that pin with an oscilloscope. Such a pin can also serve as  sophisticated trigger, e.g., to capture some input signal only when an error is detected.</p>
<p>With M1, we can do the same, e.g., make LM32 or Navre toggle an I/O under software control. But we can do better: we can also route &#8220;hardware&#8221; signals directly, without involving software.</p>
<p>Here are three ways to do this:</p>
<ol>
<li>Change the Verilog to properly route the signal to the output pad. This is nice and clean but has the following disadvantages:
<ul>
<li>need to run the full build process for each change of taps,</li>
<li>need to edit the sources (and remember to undo all the changes once the problem is fixed),</li>
<li>the signals need to be propagated step by step up the module hierarchy (*), which means a lot of small changes in many files,
<p>(*) Verilog should support also direct references that   &#8220;jump&#8221; the hierarchy, but this doesn&#8217;t seem to be  properly implemented in the Xilinx tools.</li>
</ul>
</li>
<li>The pros just <a href="http://www.youtube.com/watch?v=wwkGmDaa4oM">edit the FPGA with a WYSIWYG editor</a> (Part three shows how to route signals to a pad). What I don&#8217;t like about this is that it&#8217;s not script-friendly. I&#8217;d also suspect that the changes are lost or at least in danger when re-synthesizing.</li>
<li>Like above, but edit non-interactively. This is an experimental hack I&#8217;ve now implemented.</li>
</ol>
<p>Read the rest from the <a href="http://lists.milkymist.org/pipermail/devel-milkymist.org/2011-November/002238.html">Milkymist mailing list</a>&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://lekernel.net/blog/2011/11/observing-internal-fpga-signals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Milkymist One software updates</title>
		<link>http://lekernel.net/blog/2011/11/milkymist-one-software-updates/</link>
		<comments>http://lekernel.net/blog/2011/11/milkymist-one-software-updates/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 20:00:08 +0000</pubDate>
		<dc:creator>lekernel</dc:creator>
				<category><![CDATA[Howto's]]></category>
		<category><![CDATA[Milkymist]]></category>

		<guid isPermaLink="false">http://lekernel.net/blog/?p=1598</guid>
		<description><![CDATA[Software updates are available for the Milkymist One. This update mainly fixes a number of bugs &#8211; if you experience freezes or other issues, install the update, and let us know if you still have problems (devel at lists dot milkymist dot org). Updating is easy &#8211; just connect the M1 to the Internet (booting [...]]]></description>
			<content:encoded><![CDATA[<p>Software updates are available for the Milkymist One. This update mainly fixes a number of bugs &#8211; if you experience freezes or other issues, install the update, and let us know if you still have problems (devel at lists dot milkymist dot org).</p>
<p>Updating is easy &#8211; just connect the M1 to the Internet (booting it with the Ethernet cable connected to a network with DHCP should do, or use the system settings to configure the network) and then press the first push button (labeled L) for a few seconds. It should display this:<br />
<div id="attachment_1599" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/11/webupdating.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/11/webupdating-300x225.png" alt="" title="webupdating" width="300" height="225" class="size-medium wp-image-1599" /></a><p class="wp-caption-text">Update in progress</p></div></p>
<p>Then, power off and on again your M1. The &#8220;About&#8221; dialog box will display the new versions (Flickernoise 1.0 + SoC 1.0.1):<br />
<div id="attachment_1600" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/11/new-versions.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/11/new-versions-300x225.png" alt="" title="new-versions" width="300" height="225" class="size-medium wp-image-1600" /></a><p class="wp-caption-text">New versions</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://lekernel.net/blog/2011/11/milkymist-one-software-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SoC Milkymist: le développement logiciel en pratique</title>
		<link>http://lekernel.net/blog/2011/10/soc-milkymist-le-developpement-logiciel-en-pratique/</link>
		<comments>http://lekernel.net/blog/2011/10/soc-milkymist-le-developpement-logiciel-en-pratique/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 11:27:02 +0000</pubDate>
		<dc:creator>lekernel</dc:creator>
				<category><![CDATA[Howto's]]></category>
		<category><![CDATA[Milkymist]]></category>

		<guid isPermaLink="false">http://lekernel.net/blog/?p=1565</guid>
		<description><![CDATA[Cet article a été publié dans Linux Magazine 130 (septembre 2010) et est disponible sous licence CC-BY-NC-ND. Depuis, la situation a évolué. Il existe un portage OpenWrt automatisant de nombreuses manipulations décrites dans l&#8217;article. Une partie du chargeur d&#8217;exécutable et de nombreux bugs Linux ont été corrigés. QEMU ne nécessite plus de patch et la [...]]]></description>
			<content:encoded><![CDATA[<p><i>Cet article a été publié dans <a href="http://www.ed-diamond.com/produit.php?ref=lmag130">Linux Magazine 130</a> (septembre 2010) et est disponible sous licence CC-BY-NC-ND. Depuis, la situation a évolué. Il existe un <a href="https://github.com/milkymist/openwrt-milkymist">portage OpenWrt</a> automatisant de nombreuses manipulations décrites dans l&#8217;article. Une partie du chargeur d&#8217;exécutable et de nombreux bugs Linux ont été corrigés. QEMU ne nécessite plus de patch et la version 0.15 <a href="http://wiki.qemu.org/ChangeLog/0.15#LM32">supporte directement Milkymist</a>. Enfin, les Milkymist One sont <a href="http://www.milkymist.org/buy.html">disponibles à la vente</a> et viennent avec une version bien plus aboutie de Flickernoise ainsi que tout un &#8220;packaging&#8221;.</i></p>
<p>Le numéro 124 de février vous a donné une présentation générale et assez théorique du System-on-Chip (SoC) libre Milkymist. Maintenant, nous allons nous orienter vers la pratique en détaillant les différentes opérations nécessaires au développement de logiciels fonctionannt sur cette plate-forme: installation des outils de compilation, construction d&#8217;un noyau Linux compatible, compilation d&#8217;applications et utilisation de l&#8217;émulateur QEMU, pour finir avec la configuration d&#8217;une carte de développement FPGA permettant de prototyper le SoC et le déploiement du logiciel sur cette dernière.</p>
<p><span id="more-1565"></span></p>
<p><b>1. Introduction</b><br />
En plus de disposer de coeurs d&#8217;accélération graphique destinés à l&#8217;application prévue de rendu d&#8217;effets vidéo en direct, le SoC Milkymist comprend un ordinateur embarqué intégré sur la puce, lui permettant d&#8217;exécuter des logiciels complexes avec des performances tout à fait honorables dans le domaine de l&#8217;embarqué. Des tests réalisés avec MiBench montrent que Milkymist est plus rapide que son concurrent propriétaire Microblaze, en affichant une réduction du temps d&#8217;exécution des programmes de test (benchmarks) variant entre 15% et 35% selon le benchmark. Bien que Milkymist ne dispose pas encore de MMU, il est néanmoins capable de faire fonctionner une version un peu allégée du noyau Linux (souvent connue sous le nom de uClinux), et nous allons voir en détail comment la mettre en oeuvre.</p>
<p>Bien que le SoC Milkymist soit assez stable à l&#8217;heure d&#8217;aujourd&#8217;hui, il n&#8217;en est pas de même pour son portage de GCC et de l&#8217;environnement Linux. Ceci est en partie à attribuer au manque voir à l&#8217;absence totale de documentation au sujet de certains aspects de GCC, ainsi qu&#8217;à une politique assez obscure de la FSF entourant son fonctionnement interne et un code particulièrement sale de la part de cette dernière. Ainsi, entre d&#8217;autres problèmes, il n&#8217;est pas rare de voir GCC planter avec un &#8220;internal compiler error&#8221; voire de générer du code corrompu qui détruira aléatoirement la pile lors de son exécution. Toutefois, avec le nombre croissant d&#8217;utilisateurs de l&#8217;architecture LatticeMico32 (sur laquelle se base Milkymist), les bugs de GCC commencent à être lentement corrigés. Et il est tout à fait possible de lancer dès maintenant un petit système Linux sur Milkymist et de compiler ses propres applications. Ce mois-ci, atelier bricolage!</p>
<p><b>2. Installation des outils de compilation</b><br />
<b>2.1. Installation à partir des sources</b><br />
<b>2.1.1. Binutils</b><br />
L&#8217;installation de Binutils se déroule sans remarque particulière. Le support de LatticeMico32 est inclus dans les versions récentes.</p>
<p><tt>export INSTDIR=/usr/mico32<br />
mkdir -p $INSTDIR<br />
export PATH=$PATH:$INSTDIR/bin<br />
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2<br />
tar xvjf binutils-2.20.1.tar.bz2<br />
mkdir binutils-build<br />
cd binutils-build<br />
../binutils-2.20.1/configure --target=lm32-elf --prefix=$INSTDIR<br />
make<br />
make install</tt></p>
<p><b>2.1.2 GCC</b><br />
Bien que l&#8217;architecture LatticeMico32 soit désormais incluse en standard dans GCC 4.5, cette inclusion s&#8217;est faite avec l&#8217;adjonction de bugs qui rendent impossible la compilation d&#8217;un noyau Linux. Ces derniers devraient être assez rapidement corrigés: le Bugzilla de GCC en répertorie la majorité, et plusieurs solutions sont connues. Cependant, pour simplifier les choses, nous resterons avec un GCC 4.4 patché. Récupérez le patch sur http://github.com/lekernel/milkymist-packaging (dossiers gcc-lm32-4.4.1, puis debian et patches).
</p>
<p><tt>wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.4.1/gcc-core-4.4.1.tar.bz2<br />
tar xvjf gcc-core-4.4.1.tar.bz2<br />
cd gcc-4.4.1<br />
patch -p1 &lt; lm32-jbeniston-200812+debian4.4.1.patch<br />
cd ..<br />
mkdir gcc-build<br />
cd gcc-build<br />
../gcc-4.4.1/configure --target=lm32-elf --prefix=$INSTDIR --enable-languages="c" --disable-libssp<br />
make<br />
make install</tt></p>
<p>Si le processus se déroule sans problème, vos outils de compilation LatticeMico32 sont à présent prêts.</p>
<p><b>2.2. Installation à partir des binaires</b><br />
Pour plus de simplicité, vous pouvez également installer les outils de compilation à partir de binaires pré-compilés, au lieu de compiler les sources vous-même. Ils devraient fonctionner avec la majorité des distributions Linux.</p>
<p><b>2.2.1. Paquets Debian/Ubuntu</b><br />
Il vous suffit d&#8217;ajouter la ligne suivante dans votre /etc/apt/sources.list:</p>
<p><tt>deb http://www.milkymist.org/debian/ ./</tt></p>
<p>Et de lancer ensuite:</p>
<p><tt>apt-get update<br />
apt-get install gcc-lm32<br />
</tt></p>
<p>Ces paquets fonctionnent avec plusieurs versions de Debian et Ubuntu.</p>
<p><b>2.2.2. Tarball</b><br />
Si votre distribution n&#8217;est pas basée sur les paquets au format DEB, vous pouvez récupérer l&#8217;archive de binaires au format TAR sur ttp://www.milkymist.org/3rdparty/micotoolchain44.tar.bz2. Il vous suffira ensuite de la décompresser et d&#8217;ajouter dans votre PATH le répertoire contenant les binaires.</p>
<p><tt>wget http://www.milkymist.org/3rdparty/micotoolchain44.tar.bz2<br />
tar xvjf micotoolchain44.tar.bz2<br />
export PATH=$PATH:`pwd`/mico32/bin</tt></p>
<p><b>3. Compilation du noyau Linux</b><br />
Une fois les outils de compilations (toolchain) installés par l&#8217;une ou l&#8217;autre des méthodes (binaires ou sources), vous êtes prêt pour compiler le portage du noyau Linux. Le portage en est au stade expérimental et souffre encore de problèmes de stabilité, de pilotes manquants ou mal codés et surtout, ainsi que nous allons le voir plus loin, d&#8217;un chargeur d&#8217;exécutables peu orthodoxe (la politesse m&#8217;interdisant d&#8217;employer un terme plus exact). Il ne sera donc pas inclus avant un certain temps dans les archives distribuées sur kernel.org et nous récupèrerons par conséquent la branche de développement du projet Milkymist, hébergée sur Github et maintenue par Takeshi Matsuya. Elle est basée sur le portage effectué par Theobroma Systems pour le système LatticeMico32 original, dans lequel nous avons notamment corrigé de nombreux bugs et redéveloppé les pilotes de périphériques (pour correspondre aux périphériques présents sur le SoC Milkymist, qui sont totalement différents de ceux de Lattice).</p>
<p><tt>git clone git://github.com/tmatsuya/linux-2.6.git<br />
cd linux-2.6<br />
ARCH=lm32 make ml401_vga_defconfig<br />
ARCH=lm32 CROSS_COMPILE=lm32-elf- make vmlinux</tt></p>
<p>Si tout se passe bien, vous devriez obtenir un fichier nommé vmlinux, qui est l&#8217;image du noyau au format ELF. Vous pouvez également utiliser la commande ARCH=lm32 make menuconfig afin de choisir les options à inclure dans le noyau. Cependant, je vous conseille d&#8217;utiliser la configuration par défaut pour commencer, d&#8217;autant plus que certaines options (heureusement assez rares) provoquent des plantages de GCC.</p>
<div id="attachment_1575" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/kernelconfig.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/kernelconfig-300x195.png" alt="" title="kernelconfig" width="300" height="195" class="size-medium wp-image-1575" /></a><p class="wp-caption-text">Ecran de configuration du noyau Linux pour Milkymist.</p></div>
<p><b>4. Test dans l&#8217;émulateur QEMU</b><br />
On ne présente plus l&#8217;excellent émulateur QEMU, dont une version modifiée permet d&#8217;émuler le System-on-Chip Milkymist. Cette contribution de Michael Walle est assez stable et complète, et il y a de fortes chances pour qu&#8217;elle rejoigne prochainement les versions officielles de QEMU. La compilation et l&#8217;installation sont relativement simples:</p>
<p><tt>git clone http://git.serverraum.org/git/mw/qemu-lm32.git<br />
cd qemu-lm32<br />
git branch --track milkymist origin/milkymist<br />
git checkout milkymist<br />
./configure --target-list=lm32-softmmu<br />
make<br />
make install</tt></p>
<p>A noter que QEMU permet d&#8217;émuler rapidement l&#8217;accélération graphique présente sur le SoC Milkymist grâce à la bibliothèque OpenGL. Pour le moment, le noyau Linux ne tire pas parti de l&#8217;accélération graphique de Milkymist mais si vous envisagez d&#8217;autres développements logiciels l&#8217;utilisant, assurez vous que les en-têtes de développement OpenGL sont présents sur votre système avant de compiler QEMU. Par ailleurs, nous avons besoin des en-têtes SDL afin de pouvoir lancer QEMU en mode graphique, ce qui est nécessaire dans notre cas car le noyau Linux utilise le framebuffer.</p>
<p>Il existe également des paquets RPM de QEMU supportant Milkymist, qui sont maintenus par Gerard Braad. Vous les trouverez à l&#8217;adresse http://files.gbraad.nl/qemu-lm32/.</p>
<p>Une fois QEMU installé, vous pouvez booter votre noyau Linux fraîchement compilé grâce à la commande suivante:</p>
<p><tt>qemu-system-lm32 -M milkymist -kernel vmlinux</tt></p>
<p>Vous devriez voir le noyau démarrer dans la fenêtre de QEMU&#8230; et ne pas aller bien loin! En effet, nous ne disposons pas, pour le moment, d&#8217;un système de fichiers racine et encore moins d&#8217;applications utilisateur telles que /sbin/init qui est le premier programme que le noyau cherche à démarrer lors du boot d&#8217;un système. Nous allons résoudre ces problèmes dans la section suivante.</p>
<div id="attachment_1577" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/qemukernel.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/qemukernel-300x235.png" alt="" title="qemukernel" width="300" height="235" class="size-medium wp-image-1577" /></a><p class="wp-caption-text">Lancement du noyau Linux dans QEMU.</p></div>
<p><b>5. Compilation d&#8217;applications utilisateur</b><br />
<b>5.1. Outils de compilation et bibliothèque C</b><br />
Afin de pouvoir compiler des applications Linux, il nous faut une bibliothèque C (uClibc) et des outils de compilation utilisant cette bibliothèque et &#8220;configurant&#8221; correctement les exécutables générés. Malheureusement, la toolchain lm32-elf précédemment installée ne convient pas. La compilation de uClibc et d&#8217;une toolchain lm32-linux adéquate étant assez pénible, je vous conseille d&#8217;utiliser les binaires. Pour construire vous-même vos outils de compilation pour Linux et uClibc pour LatticeMico32, vous pouvez vous baser sur les sources modifiées publiées par Theobroma Systems. Si vous vous lancez dans cette aventure, n&#8217;hésitez pas à la documenter sur le wiki du projet Milkymist et à demander de l&#8217;aide sur la liste de diffusion &#8220;<a href="http://lists.milkymist.org">milkymist-devel</a>&#8221; si vous rencontrez des difficultés.</p>
<p><tt>wget http://www.theobroma-systems.com/assets/downloads/mico32/lm32linux-20080206toolchains_linux.tar.gz<br />
tar xvzf lm32linux-20080206toolchains_linux.tar.gz<br />
export PATH=$PATH:`pwd`/lm32linux-20080206toolchains_linux/toolchains/installdir/bin</tt></p>
<p><b>5.2. Système de fichiers</b><br />
Nous allons maintenant créer l&#8217;image de système de fichiers EXT2 qui sera utilisée comme racine par le système, et la monter sur notre machine de développement à l&#8217;aide de la fonctionnalité &#8220;loopback&#8221; de Linux. Cela se fait de la façon habituelle:<br />
<tt>mkdir -p /mnt/milkymist<br />
dd if=/dev/zero of=mmroot.img bs=1M count=8<br />
mkfs.ext2 mmroot.img<br />
mount -t ext2 -o loop mmroot.img /mnt/milkymist</tt></p>
<p><b>5.3. Busybox</b><br />
Busybox, &#8220;couteau suisse&#8221; du Linux embarqué, est un outil bien connu qui comprend toutes les fonctions nécessaires pour réaliser un système Linux de base. Parmi d&#8217;autres avantages, il est très facilement portable y compris sur LatticeMico32, ce qui n&#8217;est pas le cas de la plupart des outils GNU utilisant Autoconf (comme le résume si bien Andrew S. Tanenbaum: <i>[on uncommon platforms,] you type ./configure and it never works!</i>). C&#8217;est donc Busybox que nous allons utiliser pour construire notre système utilisateur minimal.</p>
<p>Obtenons une copie des sources de Busybox et exécutons leur outil de configuration:<br />
<tt>wget http://www.busybox.net/downloads/busybox-1.16.1.tar.bz2<br />
tar xvjf busybox-1.16.1.tar.bz2<br />
cd busybox-1.16.1<br />
make menuconfig</tt></p>
<p>Allez dans le menu <i>Busybox Settings</i> puis sélectionnez <i>Build Options</i>. Cochez <i>Build BusyBox as a static binary</i> et <i>Force NOMMU build</i>. Dans <i>Cross Compiler prefix</i>, entrez <i>lm32-linux-</i>, et dans <i>Additional CFLAGS</i>, entrez <i>-mmultiply-enabled -mdivide-enabled -mbarrel-shift-enabled -msign-extend-enabled</i>.</p>
<div id="attachment_1578" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/busyboxbuild.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/busyboxbuild-300x136.png" alt="" title="busyboxbuild" width="300" height="136" class="size-medium wp-image-1578" /></a><p class="wp-caption-text">Menu &quot;Build Options&quot; de Busybox.</p></div>
<p>Sélectionnez <i>Exit</i> pour retourner sur l&#8217;écran <i>Busybox Settings</i>. Dans le menu <i>Installation Options</i>, saisissez <i>/mnt/milkymist</i> dans <i>BusyBox installation prefix</i>.</p>
<p>Retournez au menu principal, et dans le menu <i>Miscellaneous Utilities</i>, désactivez la construction de tous les outils en rapport avec MTD (dont le nom commence par <i>flash</i>). Désactivez également <i>readahead</i> et <i>taskset</i>. Finalement, retournez au menu principal, sélectionnez <i>Linux System Utilities</i> et désactivez <i>swaponoff</i>.</p>
<p>Vous pouvez maintenant lancer la compilation avec:</p>
<p><tt>make LDFLAGS="-Wl,-q"</tt></p>
<p>La compilation devrait réussir à produire un fichier exécutable final. L&#8217;option <i>-Wl,-q</i> permet d&#8217;assurer la compatibilité avec le chargeur d&#8217;exécutable chaotique évoqué plus haut, en ajoutant des informations de relocation dans l&#8217;exécutable. Après l&#8217;installation, nous devrons lancer manuellement <i>strip</i> avec les options &#8220;adéquates&#8221; pour que ces informations de relocation ne soient pas effacées du binaire final.</p>
<p>Installez ensuite Busybox sur l&#8217;image EXT2 et lancez <i>strip</i>:</p>
<p><tt>make install LDFLAGS="-Wl,-q"<br />
lm32-linux-strip --strip-unneeded --strip-debug --remove-section=.note \<br />
--remove-section=.comment busybox_unstripped<br />
cp busybox_unstripped /mnt/milkymist/bin/busybox<br />
</tt></p>
<p>Enfin, vérifiez que tout s&#8217;est bien passé à l&#8217;aide de la commande suivante:</p>
<p><tt>lm32-linux-readelf --relocs /mnt/milkymist/bin/busybox</tt></p>
<p>Vous devriez obtenir quelque chose comme:</p>
<p><tt>Relocation section '.rela.init' at offset 0x1eea4d4 contains 2 entries:<br />
 Offset     Info    Type            Sym.Value  Sym. Name + Addend<br />
00000008  00000207 R_LM32_CALL       0000001c   .text + d0<br />
0000000c  00000207 R_LM32_CALL       0000001c   .text + e24c0</p>
<p>Relocation section '.rela.text' at offset 0x1eea4ec contains 38719 entries:<br />
 Offset     Info    Type            Sym.Value  Sym. Name + Addend<br />
00000080  00000904 R_LM32_HI16       00146568   .bss + 0<br />
00000084  00000905 R_LM32_LO16       00146568   .bss + 0<br />
00000090  00000804 R_LM32_HI16       00145f58   .data + 10<br />
00000094  00000805 R_LM32_LO16       00145f58   .data + 10<br />
...<br />
</tt></p>
<p>Si la commande affiche à la place <i>There are no relocations in this file</i>, le binaire ne pourra pas fonctionner.</p>
<p>Toute contribution visant à réparer le chargeur d&#8217;exécutable et l&#8217;éditeur de liens (originellement développés par Theobroma Systems pour Lattice) afin d&#8217;éviter ces bricolages sera plus que bienvenue.</p>
<p><b>5.4. Essai dans QEMU</b><br />
Avant de lancer l&#8217;émulateur, n&#8217;oublions pas de créer un point de montage pour <i>/proc</i> et de démonter notre image EXT2:</p>
<p><tt>mkdir /mnt/milkymist/proc<br />
umount /mnt/milkymist</tt></p>
<p>Nous pouvons ensuite utiliser l&#8217;image comme ramdisk:</p>
<p><tt>qemu-system-lm32 -M milkymist -kernel vmlinux -append "root=/dev/ram init=/bin/hush" -initrd mmroot.img</tt></p>
<p>Cette fois, le système démarre correctement et lance un shell, depuis lequel vous pouvez monter <i>/proc</i> (<i>mount -t proc none /proc</i>), lancer les commandes Unix habituelles, etc.</p>
<div id="attachment_1579" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/qemusystem.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/qemusystem-300x235.png" alt="" title="qemusystem" width="300" height="235" class="size-medium wp-image-1579" /></a><p class="wp-caption-text">Lancement du système Linux minimal dans QEMU.</p></div>
<p>Un système complet aurait toutes les fonctionnalités présentes dans les distributions (scripts de démarrage, login, gestionnaire de paquets, etc.). Pour le moment, aucune distribution embarquée ne supporte l&#8217;architecture LatticeMico32. Bien que cela ne soit pas particulièrement difficile à faire, nous n&#8217;avons pas eu le temps de nous en occuper. Cela pourrait être une contribution intéressante.</p>
<p><b>6. Exécution sur carte de développement FPGA</b><br />
<b>6.1. Matériel requis</b><br />
Pour pouvoir lancer votre système Linux sur une implémentation FPGA du SoC Milkymist, vous aurez besoin d&#8217;une carte Xilinx ML401, d&#8217;un câble JTAG Xilinx Platform Cable USB, d&#8217;un câble null-modem RS232 et d&#8217;un port série.</p>
<p>Le design est très portable, cependant certaines parties un peu spéciales sont délicates à adapter d&#8217;un FPGA à l&#8217;autre (voire simplement d&#8217;une carte à l&#8217;autre), notamment au niveau de l&#8217;interface avec la DDR SDRAM. Si vous n&#8217;êtes pas familier avec le développement FPGA bas niveau, je vous conseille donc d&#8217;essayer de trouver une ML401.</p>
<p><b>6.2. Construction et programmation du bitstream</b><br />
Le &#8220;bitstream&#8221;, dans le jargon, signifie le fichier (binaire) de programmation qui définit le circuit à charger dans le FPGA. Nous allons donc générer un bitstream correspondant au system-on-chip Milkymist.</p>
<p>La seule étape délicate consiste à se procurer et installer les logiciels. En plus de Xilinx ISE, vous aurez besoin du synthétiseur Synplify. En effet, un bug dans la synthèse Xst pour Virtex-4 provoque une corruption assez subtile des caches du coeur du microprocesseur, qui se manifeste plus ou moins aléatoirement lors de l&#8217;exécution de logiciels complexes tels qu&#8217;un système Linux complet. Le problème a été rapporté à Xilinx il y a plusieurs mois, mais n&#8217;a toujours pas été corrigé. Une fois toutes les installations effectuées, il suffit d&#8217;exécuter les commandes suivantes pour construire et écrire (dans la Platform Flash) le bitstream. La construction du bitstream peut prendre une bonne quinzaine de minutes sur une machine rapide.</p>
<p><tt>wget http://www.milkymist.org/dist/milkymist-0.5.1.tar.bz2<br />
tar xvjf milkymist-0.5.1.tar.bz2<br />
cd milkymist<br />
SYNTOOL=synplify ./build_bitstream.sh<br />
SYNTOOL=synplify ./flash_bitstream.sh</tt></p>
<p>On ne peut que déplorer l&#8217;absence de toute solution libre permettant de programmer des FPGAs. Certaines personnes justifient cela en se lamentant sur le fait que le format du bitstream est fermé. Ces personnes ne font que manifester leur méconnaissance des FPGAs et leur manque de motivation. Premièrement, l&#8217;ingénierie inverse du format du bitstream, sans être facile, n&#8217;est pas non plus une tâche extrêmement difficile. Deuxièmement, la partie la plus complexe est probablement d&#8217;écrire le programme qui transformera le code VHDL ou Verilog en une &#8220;netlist&#8221; (suite de cellules FPGA connectées entre elles) optimisée. Pour cette partie, la documentation est largement disponible. Ce programme pourrait même être utilisable (et testé) immédiatement, sans avoir déjà tous les outils libres, en s&#8217;interfaçant (facilement) avec les outils propriétaires des fabricants de FPGAs.</p>
<p><b>6.3. Compilation et programmation du BIOS</b><br />
Le BIOS est exécuté au démarrage du système, alors que la SDRAM n&#8217;est pas encore opérationnelle. Il doit être placé dans la flash NOR de la carte, qui autorise facilement des accès aléatoires, ce qui permet l&#8217;exécution à la volée du code présent dans la flash sans copie préalable dans une RAM. En effet, avant le démarrage du contrôleur de SDRAM &#8211; ce qui est à la charge du BIOS &#8211; ce dernier ne dispose pour toute mémoire réinscriptible que des registres du processeur, qui ne représentent qu&#8217;une centaine d&#8217;octets!</p>
<p>Vous devez donc tout d&#8217;abord installer l&#8217;outil <i>ml401-flasher</i> permettant d&#8217;écrire dans la flash NOR de la carte à travers le port JTAG. Cet outil se compose de deux parties: un bitstream ajoutant une commande JTAG au FPGA permettant un accès relativement rapide à la flash (vous aurez donc besoin de Xilinx ISE pour le produire), et d&#8217;un outil basé sur <i>libusb</i> permettant d&#8217;écrire un binaire dans cette flash. Ce dernier n&#8217;est compatible qu&#8217;avec le câble Xilinx Platform Cable USB communément utilisé avec la ML401. Bien que Xilinx ait refusé de documenter publiquement le protocole de ce câble, un travail d&#8217;ingénierie inverse par un contributeur de l&#8217;outil libre UrJTAG a permis de le connaître.  C&#8217;est cette contribution qui a été réutilisée pour développer <i>ml401-flasher</i>.</p>
<p>L&#8217;installation de l&#8217;outil est très simple:</p>
<p><tt>git clone git://github.com/lekernel/ml401-flasher.git<br />
cd ml401-flasher<br />
make<br />
make install</tt></p>
<p>Retournez ensuite dans le dossier <i>milkymist</i> et entrez (vous aurez notamment besoin des outils de compilation <i>lm32-elf</i>):</p>
<p><tt>./build_bios.sh<br />
./flash_bios.sh</tt></p>
<p>L&#8217;écriture du BIOS dans la flash prend quelques dizaines de secondes.</p>
<p>Une fois toutes ces opérations effectuées, connectez un terminal série sur la carte et paramétrez-le en 115200bps 8-N-1. Vérifiez que tous les interrupteurs de droite de la ML401 sont positionnés vers le bas. Chargez le FPGA depuis la Platform Flash (en plaçant les trois interrupteurs MODE de la ML401 vers le bas et en appuyant ensuite sur son bouton PROG). Vous devriez voir ceci apparaître sur le terminal:</p>
<p><tt>libHPDMC SDRAM initialization runtime<br />
(c) Copyright 2010 Sebastien Bourdeauducq, released under GNU LGPL version 3.<br />
Version 0.5.1</p>
<p>Initialization sequence completed.<br />
Autocalibration OK, testing memory...<br />
All SDRAM initialization completed, boot continuing.</p>
<p>MILKYMIST(tm) v0.5.1 BIOS       http://www.milkymist.org<br />
(c) Copyright 2007, 2008, 2009, 2010 Sebastien Bourdeauducq</p>
<p>This program is free software: you can redistribute it and/or modify<br />
it under the terms of the GNU General Public License as published by<br />
the Free Software Foundation, version 3 of the License.</p>
<p>I: BIOS CRC passed (4fba232e)<br />
I: Running on Xilinx ML401 development board<br />
I: SystemACE : Yes<br />
I: AC'97     : Yes<br />
I: PFPU      : Yes<br />
I: TMU       : Yes<br />
I: PS/2 Kbd  : Yes<br />
I: PS/2 Mouse: Yes<br />
I: Ethernet  : Yes<br />
I: FML Meter : Yes<br />
I: Displaying splash screen...OK<br />
I: Press Q to abort boot<br />
I: Attempting serial firmware loading<br />
sL5DdSMmkekro<br />
E: Timeout<br />
I: Booting from network...<br />
I: MAC      : f8:71:fe:01:02:03<br />
I: Local IP : 192.168.0.42<br />
I: Remote IP: 192.168.0.14<br />
E: Timeout<br />
I: Booting from CF card...<br />
E: Unable to initialize CF card driver<br />
E: Unable to initialize filesystem<br />
E: No boot medium found<br />
BIOS></tt></p>
<p>Félicitations, votre système fonctionne! A noter, si vous souhaitez essayer le synthétiseur d&#8217;effets MilkDrop à partir de là, il vous suffit de lancer <i>./build_demo.sh</i> (vous aurez notamment besoin d&#8217;installer Scilab, Lemon et RE2C), de copier le fichier <i>software/demo/boot.bin</i> ainsi que tout le contenu du dossier <i>patches</i> sur une carte Compact Flash et finalement de taper <i>cardboot</i> sur le terminal série. Connectez un microphone sur votre ML401 pour l&#8217;entrée son.</p>
<p><b>6.4. Boot</b><br />
Le BIOS ne permettant pas (encore) de charger des binaires ELF, convertissez tout d&#8217;abord votre noyau Linux en binaire brut:</p>
<p><tt>lm32-elf-objcopy -O binary vmlinux vmlinux.bin</tt></p>
<p>Vous pourrez ensuite le charger par l&#8217;une des trois méthodes supportées: via le réseau par TFTP (Trivial File Transfer Protocol), via une carte Compact Flash ou via le port série. Le BIOS essaye automatiquement ces trois méthodes lors du démarrage, et vous pouvez ensuite les relancer avec les commandes <i>netboot</i>, <i>cardboot</i> et <i>serialboot</i>, respectivement.</p>
<p>Une fois le noyau chargé, il utilisera la sortie VGA de la carte pour l&#8217;affichage, et un clavier PS/2 branché sur le port prévu à cet effet pour entrer les commandes.</p>
<p><b>6.4.1. En utilisant le réseau (netboot)</b><br />
C&#8217;est certainement la meilleure méthode, car elle offre rapidité (les images chargées sont assez volumineuses) et flexibilité. Il vous suffit de connecter votre ML401 sur le réseau Ethernet, installer un serveur TFTP sur votre machine et configurer cette dernière pour utiliser l&#8217;adresse IP <i>192.168.0.14</i>. La carte utilisera l&#8217;IP <i>192.168.0.42</i>.</p>
<p>Placez à la racine du serveur TFTP votre image du noyau (au format brut) nommée <i>boot.bin</i>, votre image EXT2 nommée <i>initrd.bin</i> et un fichier <i>cmdline.txt</i> contenant le texte:</p>
<p><tt>root=/dev/ram init=/bin/hush</tt></p>
<p>Le BIOS devrait alors télécharger ces trois fichiers, et lancer votre système Linux.</p>
<p><b>6.4.2. En utilisant une carte Compact Flash (cardboot)</b><br />
De la même façon que pour le boot par le réseau, vous pouvez placer les trois mêmes fichiers à la racine d&#8217;une carte Compact Flash. Celle-ci devra être formatée en FAT16.</p>
<p><b>6.4.3. En utilisant le port série (serialboot)</b><br />
Cette méthode est déconseillée, car assez lente à cause de la taille volumineuse des images à envoyer.</p>
<p>Si vous souhaitez tout de même l&#8217;utiliser, vous aurez besoin de l&#8217;outil de chargement <i>flterm</i>. Celui-ci se trouve dans le sous-dossier <i>tools</i> du dossier <i>milkymist</i>. Si vous avez configuré le dépôt Debian Milkymist, vous pouvez également l&#8217;installer d&#8217;un simple:</p>
<p><tt>apt-get install flterm</tt></p>
<p>Lancez ensuite l&#8217;outil grâce à la commande suivante, et redémarrez la carte FPGA (ou tapez <i>serialboot</i> dans <i>flterm</i>, ce dernier faisant également office de terminal série).</p>
<p><tt>flterm --port /dev/ttyUSB0 --kernel boot.bin --initrd initrd.bin \<br />
--cmdline "root=/dev/ram init=/bin/hush"</tt></p>
<p><b>7. En guise de conclusion&#8230;</b><br />
Cet article a montré les aspects pratiques de la compilation de Linux et d&#8217;applications pour Milkymist. Comme il a été dit, l&#8217;environnement Linux souffre encore de plusieurs problèmes liés au logiciel (chargeur d&#8217;exécutable problématique, plantages de GCC, code &#8220;sale&#8221;, pilotes instables ou manquants &#8211; pour l&#8217;accélération graphique notamment). S&#8217;ils ne sont pas insurmontables, ils prendront néanmoins un temps important à corriger, d&#8217;autant plus qu&#8217;il faut régulièrement plonger dans les arcanes obscures et non documentées (mais libres!) de la toolchain GNU ou du noyau, ce qui est parfois assez décourageant. En partie pour cette raison, au moins les premières versions de la station VJ interactive Milkymist One seront basées sur le système d&#8217;exploitation POSIX temps réel RTEMS et non Linux. RTEMS dispose d&#8217;une communauté plus réactive et accueillante vis-à-vis de l&#8217;architecture LatticeMico32, est moins &#8220;lourd&#8221; que Linux et son code plus simple provoque moins de problèmes liés à GCC. Le portage de RTEMS vers Milkymist est développé par Yann Sionneau à l&#8217;occasion du Google Summer of Code 2010.</p>
<div id="attachment_1580" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/flickernoise.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/flickernoise-300x225.png" alt="" title="flickernoise" width="300" height="225" class="size-medium wp-image-1580" /></a><p class="wp-caption-text">Copie d&#039;écran de Flickernoise (image CC-BY-SA).</p></div>
<div id="attachment_1581" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/mmone.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/mmone-300x244.png" alt="" title="mmone" width="300" height="244" class="size-medium wp-image-1581" /></a><p class="wp-caption-text">Composants matériels présents sur Milkymist One (image CC-BY-SA).</p></div>
<p>Le projet Milkymist ne développe pas uniquement un system-on-chip libre, même si c&#8217;est ce qui le distingue des autres projets de &#8220;matériel libre&#8221;. Le projet consiste en une solution libre <i>la plus complète possible</i> pour réaliser des effets visuels en direct, composée non seulement de Milkymist SoC, mais aussi de Flickernoise (logiciel de VJ) et de Milkymist One (station VJ interactive &#8220;clefs en main&#8221; utilisant les composants précédents). La station Milkymist One est réalisée en collaboration avec l&#8217;entreprise Sharism at Work Ltd., connue pour le Ben Nanonote (mini ordinateur portable sous Creative Commons). A l&#8217;heure où ces lignes sont écrites, une poignée de cartes pour les premiers prototypes Milkymist One (sans logiciel, qui mettra encore un certain temps à développer) ont été produites, et sont actuellement testées et utilisées par les développeurs FPGA et logiciel&#8230;</p>
<div id="attachment_1582" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/nanonote.jpg"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/nanonote-300x200.jpg" alt="" title="nanonote" width="300" height="200" class="size-medium wp-image-1582" /></a><p class="wp-caption-text">Ben Nanonote (image CC-BY-SA, Sharism).</p></div>
<div id="attachment_1583" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/mmonephoto.jpg"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/mmonephoto-300x159.jpg" alt="" title="mmonephoto" width="300" height="159" class="size-medium wp-image-1583" /></a><p class="wp-caption-text">Prototype Milkymist One (image CC-BY-SA).</p></div>
]]></content:encoded>
			<wfw:commentRss>http://lekernel.net/blog/2011/10/soc-milkymist-le-developpement-logiciel-en-pratique/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M1 with MIDI</title>
		<link>http://lekernel.net/blog/2011/10/m1-with-midi/</link>
		<comments>http://lekernel.net/blog/2011/10/m1-with-midi/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 10:12:35 +0000</pubDate>
		<dc:creator>lekernel</dc:creator>
				<category><![CDATA[Howto's]]></category>
		<category><![CDATA[Milkymist]]></category>

		<guid isPermaLink="false">http://lekernel.net/blog/?p=1556</guid>
		<description><![CDATA[By Werner Almesberger You haven&#8217;t really seen what the Milkymist One (M1) really can do if you haven&#8217;t used it with some MIDI controls. Here&#8217;s how it&#8217;s done: first, you need some MIDI controller. For now, it has to be one that has the old-style MIDI connectors, not USB-MIDI. I used a Korg Kaossilator Pro. [...]]]></description>
			<content:encoded><![CDATA[<p><i>By <a href="http://www.almesberger.net">Werner Almesberger</a></i></p>
<p>You haven&#8217;t really seen what the <a href="http://www.milkymist.org">Milkymist One</a> (M1) really can do if you haven&#8217;t used it with some MIDI controls.</p>
<p>Here&#8217;s how it&#8217;s done:</p>
<ul>
<li>first, you need some MIDI controller. For now, it has to be one that has the old-style MIDI connectors, not USB-MIDI. I used a Korg Kaossilator Pro.</li>
<li>next, you need to define which of the controller functions you want to map to variables for your patch. This is done in the M1&#8242;s control panel, Interfaces > MIDI > Controller mapping.
<p>&#8220;midi1&#8243; through &#8220;midi8&#8243; are the variables you can set. The value on the right side is the controller number. E.g., for my  Kaossilator, I assigned:<br />
<table>
<tr>
<td>midi1</td>
<td>12</td>
<td>touch pad, X axis</td>
</tr>
<tr>
<td>midi2</td>
<td>13</td>
<td>touch pad, Y axis</td>
</tr>
<tr>
<td>midi3</td>
<td>91</td>
<td>gate arpeggiator slider</td>
</tr>
<tr>
<td>midi4</td>
<td>94</td>
<td>program volume knob</td>
</tr>
</table>
<p>This is for using the Kaossilator both as an instrument and as a MIDI controller. If I had switched it to be only a controller, I would have had more controls to play with and some of the numbers would have changed.</li>
<li>you can now use Patches > Variable monitor to see how the controls affect the midi1 &#8230; midi4 variables. Each gets assigned a value between 0 to 1, corresponding to the setting of the control. (MIDI transmits values from 0 to 127.)</li>
<li>finally, you need to modify a patch to use the MIDI variables. I took a simple one, &#8220;Geiss &#8211; Tornado&#8221;, and made the following tweaks:
<ol>
<li>per_frame=t=time+midi2*100;
<p>and then changed all the wave_<br />
<color> settings to use &#8220;t&#8221; instead of &#8220;time&#8221;. This way, I can modulate the color by moving along the Y axis on the pad.</li>
<li>per_frame=rot=midi1*2;
<p>I put this after the last assignment to &#8220;rot&#8221;, effectively overriding it. Now rotation is entirely under my control, with no rotation when touching the pad on the left edge, and rapid spinning on the right edge.</li>
<li>per_frame=move_x=0.5+midi3/5;
<p>This controls the distance of the point being drawn from the center. With rotation, this becomes the radius at which things appear. I assigned it to the slider.</li>
<li>per_frame=zoom=0.9+midi4/5;
<p>This controls how quickly we &#8220;travel into&#8221; the image. I assigned it to the volume knob.</li>
</ol>
</li>
<li>these settings are lost when powering down or restarting the M1. To keep them, save with Performance > Save and, after booting, load with Performance > Load. Be careful to save under the directory /ssd/, not the root directory. The latter is also lost when booting.</li>
</ul>
<p><span id="more-1556"></span><br />
Here is a video:</p>
<p><center><video src="http://en.qi-hardware.com/w/images/3/3a/Werner_M1_MIDI.ogv" controls width="450" height="600"></video></center></p>
<p>In this case, I didn&#8217;t use the Kaossilator&#8217;s sound. Also, some of the controls aren&#8217;t very nicely mapped for the effects I was trying to make. That&#8217;s why I often had a hard time getting from an all-green screen to something more interesting.</p>
]]></content:encoded>
			<wfw:commentRss>http://lekernel.net/blog/2011/10/m1-with-midi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://en.qi-hardware.com/w/images/3/3a/Werner_M1_MIDI.ogv" length="52556251" type="video/ogg" />
		</item>
		<item>
		<title>How to make conductive silver ink for ballpoint pens</title>
		<link>http://lekernel.net/blog/2011/10/how-to-make-conductive-silver-ink-for-ballpoint-pens/</link>
		<comments>http://lekernel.net/blog/2011/10/how-to-make-conductive-silver-ink-for-ballpoint-pens/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 12:01:37 +0000</pubDate>
		<dc:creator>lekernel</dc:creator>
				<category><![CDATA[Howto's]]></category>
		<category><![CDATA[Web discoveries]]></category>

		<guid isPermaLink="false">http://lekernel.net/blog/?p=1547</guid>
		<description><![CDATA[&#8220;Materials researchers at the University of Illinois, Urbana-Champaign have developed a highly conductive silver ink. In this video, Analisa Russo, a graduate student in the research group of Professor Jennifer Lewis shows exactly how to make this amazing ink, which could be used for a wide variety of hobby projects and in advanced electronics hardware.&#8221;]]></description>
			<content:encoded><![CDATA[<p>&#8220;Materials researchers at the University of Illinois, Urbana-Champaign have developed a highly conductive silver ink. In this video, Analisa Russo, a graduate student in the research group of Professor Jennifer Lewis shows exactly how to make this amazing ink, which could be used for a wide variety of hobby projects and in advanced electronics hardware.&#8221;</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/dfNByi-rrO4?rel=0" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://lekernel.net/blog/2011/10/how-to-make-conductive-silver-ink-for-ballpoint-pens/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Testing the DIY triode from PWL</title>
		<link>http://lekernel.net/blog/2011/10/testing-the-diy-triode-from-pwl/</link>
		<comments>http://lekernel.net/blog/2011/10/testing-the-diy-triode-from-pwl/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 19:12:31 +0000</pubDate>
		<dc:creator>lekernel</dc:creator>
				<category><![CDATA[Howto's]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://lekernel.net/blog/?p=1514</guid>
		<description><![CDATA[I was curious to see how well the PWL triode performed. So I made a little test to measure cathode emission and amplification. The first step was to build a variable high voltage power supply, since I&#8217;m under-equipped enough not to have one laying around. So I used a 20V power supply transformer connected to [...]]]></description>
			<content:encoded><![CDATA[<p>I was curious to see how well the <a href="http://lekernel.net/blog/2011/09/prywatna-wytwornia-lamp-where-diy-meets-vacuum-electron-devices/">PWL triode</a> performed. So I made a little test to measure cathode emission and amplification.</p>
<p>The first step was to build a variable high voltage power supply, since I&#8217;m under-equipped enough not to have one laying around. So I used a 20V power supply transformer connected to a 120V variable autotransformer scavenged from a 70&#8242;s American-built X-ray machine that happened to have a permanent tap within the first turns, allowing it to step-up the voltage to a nice 180V. For turning it into DC, I simply took the switching power supply PCB from a discarded fax machine, cut it right after the filtering capacitor, and hooked it to the variac. There are easier options, but I did with what I found in my pile of junk <img src='http://lekernel.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>The grid voltage is provided by a 9V battery and a potentiometer, and the filament voltage by my (single!) lab power supply. I then used cheap DMMs to measure anode voltage, anode current and grid voltage.</p>
<p>This resulted in this little kludge:<br />
<div id="attachment_1520" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/triode_test.jpg"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/triode_test-300x159.jpg" alt="" title="S/W Ver: A0.03.16R" width="300" height="159" class="size-medium wp-image-1520" /></a><p class="wp-caption-text">Experimental setup</p></div><br />
<div id="attachment_1522" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/triodetest.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/triodetest-300x191.png" alt="" title="triodetest" width="300" height="191" class="size-medium wp-image-1522" /></a><p class="wp-caption-text">Schematics of the above little mess</p></div></p>
<p><b>Emission tests</b><br />
The first test was to see how many electrons the hot filament is capable of sending into the tube. I  connected together the anode and the grid and brought them to a 176V potential, while I varied the filament voltage.<br />
This led to this plot:<br />
<div id="attachment_1526" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/emission.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/emission-300x154.png" alt="" title="emission" width="300" height="154" class="size-medium wp-image-1526" /></a><p class="wp-caption-text">Cathode emission versus filament voltage</p></div><br />
Clearly, the tungsten cathode only begins to work at very high temperatures! Wikipedia lists an <a href="http://en.wikipedia.org/wiki/Hot_cathode#Transmitting_tube_hot_cathode_characteristics">efficiency of 5mA/W</a> for a tungsten cathode (oxide-coated cathodes, used in commercial tubes, are 100 times better). At 4V, the filament current is 280mA, which represents a power of 1.1W. The emission, however, is only 2.2mA. Perhaps it works better with more filament voltage, but I did not dare cranking it up for fear of damaging the filament.</p>
<p>The second test was to see how much the anode potential influenced the anode current. I set the grid to the ground potential, and varied the anode voltage. The plot shows a quite linear dependence:<br />
<div id="attachment_1538" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/tuberes.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/tuberes-300x160.png" alt="" title="tuberes" width="300" height="160" class="size-medium wp-image-1538" /></a><p class="wp-caption-text">Anode current versus anode voltage</p></div></p>
<p><b>Amplification test</b><br />
Now, let&#8217;s see how good this triode is at doing its job: amplifying signals! With the anode potential set to 176V and a filament voltage of 4V, I sweeped the grid voltage and plotted the anode current:<br />
<div id="attachment_1532" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2011/10/triodeamp.png"><img src="http://lekernel.net/blog/wp-content/uploads/2011/10/triodeamp-300x153.png" alt="" title="triodeamp" width="300" height="153" class="size-medium wp-image-1532" /></a><p class="wp-caption-text">Anode current versus grid voltage</p></div><br />
Clearly, the tube is working! It is not the best triode in the world, as the grid apparently struggles to stop all electrons (and because of the low emission efficiency of the tungsten cathode). But it definitely does some amplification and it certainly is a usable tube. Impressive work!</p>
]]></content:encoded>
			<wfw:commentRss>http://lekernel.net/blog/2011/10/testing-the-diy-triode-from-pwl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Upgrading from Flickernoise 0.1 without a JTAG cable</title>
		<link>http://lekernel.net/blog/2010/12/upgrading-from-flickernoise-0-1-without-a-jtag-cable/</link>
		<comments>http://lekernel.net/blog/2010/12/upgrading-from-flickernoise-0-1-without-a-jtag-cable/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 22:12:52 +0000</pubDate>
		<dc:creator>lekernel</dc:creator>
				<category><![CDATA[Howto's]]></category>
		<category><![CDATA[Milkymist]]></category>

		<guid isPermaLink="false">http://lekernel.net/blog/?p=1339</guid>
		<description><![CDATA[Since Flickernoise 0.1 does not support software flashing, the procedure is a little more complex than normal. The trick is to boot a newer version of Flickernoise (>= 0.2) from the network, and use that one to reflash the board. STEP 1: Install a TFTP server Install the TFTP server package for your distribution, and [...]]]></description>
			<content:encoded><![CDATA[<p>Since Flickernoise 0.1 does not support software flashing, the procedure is a little more complex than <a href="http://www.milkymist.org/wiki/index.php?title=Flashing_the_Milkymist_One">normal</a>. The trick is to boot a newer version of Flickernoise (>= 0.2) from the network, and use that one to reflash the board.</p>
<p><b>STEP 1: Install a TFTP server</b><br />
Install the <a href="http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol">TFTP</a> server package for your distribution, and configure it.</p>
<p><b>STEP 2: Prepare the boot image</b><br />
Take the Flickernoise FBI (Flash Boot Image) file from the MSD archive, and remove its FBI header.<br />
<tt>$ dd if=flickernoise.fbi of=boot.bin bs=1 skip=8</tt><br />
Then, move it to the TFTP server directory:<br />
<tt>$ mv boot.bin /var/lib/tftpboot</tt></p>
<p><b>STEP 3: Boot the board from the network</b><br />
Set up your computer to have the IP address 192.168.0.14, and connect it to the board. Boot the board (press the middle pushbutton) with a USB keyboard connected to it, and when you see the BIOS splash screen, press the F8 key to boot from the network.<br />
<div id="attachment_1342" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2010/12/splash.png"><img src="http://lekernel.net/blog/wp-content/uploads/2010/12/splash-300x225.png" alt="" title="splash" width="300" height="225" class="size-medium wp-image-1342" /></a><p class="wp-caption-text">BIOS splash screen</p></div></p>
<p><b>STEP 4: Erase the old flash filesystem</b><br />
Flickernoise 0.1 uses a read-only FAT filesystem on the flash, while Flickernoise 0.2 introduced full <a href="http://www.yaffs.net">YAFFS2</a> support. You will therefore need to format (erase) the flash disk partition.</p>
<p>For this, you will need to obtain a shell on the board. This can be simply done by enabling the telnet server and connecting to it. You need to set up a login and password to enable telnet access. Click the &#8220;Settings&#8221; button at the bottom of the control panel, and enter a login and password in the dialog box.<br />
<div id="attachment_1345" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2010/12/sysettings.png"><img src="http://lekernel.net/blog/wp-content/uploads/2010/12/sysettings-300x225.png" alt="" title="sysettings" width="300" height="225" class="size-medium wp-image-1345" /></a><p class="wp-caption-text">System settings dialog box</p></div></p>
<p>Once this is done, you can use telnet to connect to the board:<br />
<tt>telnet 192.168.0.42</tt><br />
Enter the following commands at the RTEMS shell prompt:<br />
<tt># unmount /flash<br />
# erase /dev/flash5<br />
# mount -t yaffs /dev/flash5 /flash</tt><br />
<div id="attachment_1349" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2010/12/telnet.png"><img src="http://lekernel.net/blog/wp-content/uploads/2010/12/telnet-300x257.png" alt="" title="telnet" width="300" height="257" class="size-medium wp-image-1349" /></a><p class="wp-caption-text">Telnet session</p></div></p>
<p><b>STEP 5: Transfer the new flash images to the board</b><br />
Simply use an FTP client to connect to the board (192.168.0.42), and upload the contents of the MSD archive, e.g. in the /ramdisk folder. Use the login and password you just set up to authenticate to the FTP server.</p>
<p><b>STEP 6: Flash</b><br />
In the control panel, click &#8220;About&#8221;, then &#8220;Flash&#8221;. Select the images you have just uploaded, and click the &#8220;Program flash&#8221; button.<br />
<div id="attachment_1351" class="wp-caption aligncenter" style="width: 310px"><a href="http://lekernel.net/blog/wp-content/uploads/2010/12/flash.png"><img src="http://lekernel.net/blog/wp-content/uploads/2010/12/flash-300x225.png" alt="" title="flash" width="300" height="225" class="size-medium wp-image-1351" /></a><p class="wp-caption-text">Flickernoise flash programmer</p></div></p>
<p>You&#8217;re done! If you have upgraded the bitstream, you need to select &#8220;Shutdown&#8221; (in the control panel), then &#8220;Power off&#8221; and then power the board on again. Since a disk cache is used by the RTEMS operating system, always use &#8220;Shutdown&#8221; to turn off the board to prevent data loss.</p>
<p>And while you have the FTP connection open, you can also use it to upload the <a href="https://github.com/lekernel/flickernoise/tree/master/patches">default Flickernoise patches</a> to the flash&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://lekernel.net/blog/2010/12/upgrading-from-flickernoise-0-1-without-a-jtag-cable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
