{"id":5769,"date":"2019-12-20T07:00:00","date_gmt":"2019-12-20T06:00:00","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=5769"},"modified":"2022-01-24T17:47:19","modified_gmt":"2022-01-24T16:47:19","slug":"un-port-ethernet-supplementaire-sur-raspberry-pi","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2019\/12\/20\/un-port-ethernet-supplementaire-sur-raspberry-pi\/","title":{"rendered":"Un port Ethernet suppl\u00e9mentaire sur Raspberry Pi"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"alignright is-resized\"><a href=\"https:\/\/www.blaess.fr\/christophe\/2019\/12\/16\/un-port-ethernet-supplementaire-sur-raspberry-pi\/img_20191217_083035\/\"><img decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083035.jpg\" alt=\"Wiznet w5500\" class=\"wp-image-5776\" width=\"250\"\/><\/a><\/figure><\/div>\n\n\n\n<p>J&rsquo;ai eu l&rsquo;occasion, pour le projet d&rsquo;un client, de tester un petit circuit permettant de disposer d&rsquo;un port Ethernet sur bus SPI. Je me suis amus\u00e9 \u00e0 l&rsquo;installer sur un Raspberry Pi 3, cela fonctionne assez facilement. Peut-\u00eatre serez-vous \u00e9galement tent\u00e9s d&rsquo;ajouter un port Ethernet \u00e0 votre Pi&nbsp;? Cela peut aussi \u00eatre une bonne solution pour ajouter la connectivit\u00e9 Ethernet \u00e0 un <em><a href=\"https:\/\/www.blaess.fr\/christophe\/2019\/02\/01\/un-raspberry-pi-en-production\/\">Compute Module 3<\/a><\/em> ou tout autre module du m\u00eame style.<\/p>\n\n\n\n<!--more-->\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Configuration mat\u00e9rielle<\/h1>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft is-resized\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083116.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083116.jpg\" alt=\"Contr\u00f4leur w5500\" class=\"wp-image-5781\" width=\"154\" height=\"150\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083116.jpg 308w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083116-300x292.jpg 300w\" sizes=\"auto, (max-width: 154px) 100vw, 154px\" \/><\/a><figcaption>Contr\u00f4leur w5500<\/figcaption><\/figure><\/div>\n\n\n\n<p>Le circuit en question est construit autour d&rsquo;un contr\u00f4leur <strong><a rel=\"noreferrer noopener\" aria-label=\"Wiznet w550 (s\u2019ouvre dans un nouvel onglet)\" href=\"http:\/\/shop.wiznet.eu\/w5500.html\" target=\"_blank\">Wiznet <em>w5500<\/em><\/a><\/strong> relativement courant. Il existe plusieurs versions de ce module, disponibles aupr\u00e8s de nombreux fournisseurs. Il est adapt\u00e9 pour fonctionner avec des signaux de tension 3.3V comme le Raspberry Pi ou 5V comme l&rsquo;Arduino.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Douze broches sont expos\u00e9es sur le mod\u00e8le que mon client m&rsquo;a envoy\u00e9, mais seules sept d&rsquo;entre-elles nous serviront&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083137.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083137.jpg\" alt=\"Module Wiznet w5500\" class=\"wp-image-5778\" width=\"300\" height=\"228\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083137.jpg 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_083137-300x228.jpg 300w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption>Brochage du module pour w5500<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><em><strong>Vcc<\/strong><\/em> (broche 4) et <em><strong>Gnd<\/strong><\/em> (broche 2) seront reli\u00e9es \u00e0 des <a href=\"https:\/\/www.blaess.fr\/christophe\/files\/article-2014-08-07\/Connecteur_P1.pdf\">sorties d&rsquo;alimentation du Raspberry Pi<\/a>. D&rsquo;apr\u00e8s mes essais, la consommation du <em>w5500<\/em> est suffisamment faible pour qu&rsquo;on l&rsquo;alimente directement depuis les broches 1 (<em>+3.3V<\/em>) et 6 (<em>Gnd)<\/em> du Raspberry Pi. Si on souhaite l&rsquo;int\u00e9grer sur une carte porteuse, on pr\u00e9f\u00e9rera probablement une alimentation externe.<\/li><li><em><strong>Mi<\/strong><\/em> (broche 12) et <em><strong>Mo<\/strong><\/em> (broche 5) seront reli\u00e9es respectivement aux broches <em><strong>Miso<\/strong><\/em> (<em>Master In Slave Out<\/em> &#8211; broche 21) et <em><strong>Mosi<\/strong><\/em> (<em>Master Out Slave In<\/em> &#8211; broche 19) du Raspberry Pi.<\/li><li><em><strong>Sck<\/strong><\/em> (broche 7) sera connect\u00e9e sur la sortie <em><strong>SPI Clock<\/strong><\/em> (broche 23) et <em><strong>Cs<\/strong><\/em> (<em>Chip Select<\/em> &#8211; broche 9) sur la sortie <em><strong>SPI Enable 0<\/strong><\/em> ( broche 24) du Raspberry Pi. Le contr\u00f4leur sera donc accessible sur le bus <em>SPI 0.0<\/em>. Si vous pr\u00e9f\u00e9rez utiliser <em>SPI 0.1<\/em>, il vous faudra utiliser la broche 26 et modifier l\u00e9g\u00e8rement le fichier du <em>Device Tree.<\/em><\/li><li>Enfin <strong><em>Int<\/em><\/strong> (broche 11) sera reli\u00e9e \u00e0 une entr\u00e9e GPIO du Raspberry Pi pour le notifier, par une interruption, de la r\u00e9ception de donn\u00e9es. J&rsquo;ai choisi la <em><strong>GPIO 25<\/strong><\/em> (broche 22), car elle se trouve juste \u00e0 c\u00f4t\u00e9 des broches SPI du connecteur d&rsquo;extension du Raspberry Pi.<\/li><li>Je n&rsquo;ai pas connect\u00e9 la broche <em><strong>Rst<\/strong><\/em> (<em>Reset<\/em> 10). Il me semble que cela n&rsquo;est pas n\u00e9cessaire, je suppose qu&rsquo;une r\u00e9sistance de <em>pulldown<\/em> interne au circuit nous dispense de la piloter. Si des probl\u00e8mes se posent, nous pourrons toujours utiliser une autre GPIO, par exemple <em>GPIO 24<\/em> (broche 18).<\/li><\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>La connexion n&rsquo;est donc pas tr\u00e8s compliqu\u00e9e, je l&rsquo;ai r\u00e9alis\u00e9e sur une plaquette d&rsquo;essai utilis\u00e9e en <a href=\"https:\/\/www.logilin.fr\/formations\/\">session de formation<\/a>. Bien s\u00fbr, pour une utilisation plus avanc\u00e9e on \u00e9vitera les fils volants&nbsp;!<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/www.blaess.fr\/christophe\/2019\/12\/16\/un-port-ethernet-supplementaire-sur-raspberry-pi\/img_20191217_085340\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"783\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_085340-1024x783.jpg\" alt=\"Module w5500 et Raspberry Pi 3\" class=\"wp-image-5780\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_085340-1024x783.jpg 1024w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_085340-300x229.jpg 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/12\/IMG_20191217_085340-768x587.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Connexion du module au Raspberry Pi 3<\/figcaption><\/figure><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Configuration logicielle<\/h1>\n\n\n\n<p>Le noyau Linux dispose d&rsquo;un <em>driver<\/em> nomm\u00e9 <a rel=\"noreferrer noopener\" aria-label=\"w5100-spi (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/elixir.bootlin.com\/linux\/v5.4\/source\/drivers\/net\/ethernet\/wiznet\" target=\"_blank\"><code>w5100-spi<\/code><\/a> capable de piloter les contr\u00f4leurs <em>w5100<\/em>, <em>w5200<\/em> et <em>w5500<\/em>. Ce driver peut \u00eatre g\u00e9n\u00e9ralement compil\u00e9 sous forme de module que nous pourrions charger dynamiquement. Malheureusement, il n&rsquo;est pas disponible sur la distribution <em>Raspbian<\/em> <em>Buster Full<\/em> du 26 septembre 2019 sur laquelle j&rsquo;ai commenc\u00e9 mon test.<\/p>\n\n\n\n<p>Nous avons alors deux possibilit\u00e9s&nbsp;: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>recompiler le noyau Linux sur le Raspberry Pi en ajoutant le driver n\u00e9cessaire, ce n&rsquo;est pas tr\u00e8s compliqu\u00e9 mais cela prend un temps de compilation assez long,<\/li><li>cross-compiler une image sp\u00e9cifique depuis un PC en utilisant Buildroot par exemple. Cette solution est rapide (une petite heure) et simple, c&rsquo;est celle que j&rsquo;utilise tout d&rsquo;abord.<\/li><\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Charger le <em>driver<\/em> n&rsquo;est pas suffisant. Nous devons \u00e9galement indiquer au noyau que le p\u00e9riph\u00e9rique est bien pr\u00e9sent, comment l&rsquo;activer (le num\u00e9ro de <em>Chip Enable<\/em>) et sur quelle broche GPIO il nous notifiera des r\u00e9ceptions de paquets. Indiquer au noyau la pr\u00e9sence des p\u00e9riph\u00e9riques qu&rsquo;il ne peut pas d\u00e9tecter automatiquement (et lui indiquer \u00e9galement la configuration mat\u00e9rielle sur laquelle il s&rsquo;ex\u00e9cute) est le r\u00f4le du <em><strong>device tree<\/strong><\/em>.<\/p>\n\n\n\n<p>Nous allons utiliser un petit fichier d&rsquo;<em><strong>overlay<\/strong><\/em> pour le <em>device tree<\/em> qui viendra le compl\u00e9ter (indiquer la pr\u00e9sence du <em>w5500<\/em> et la GPIO \u00e0 utiliser) et le surcharger (pour interdire l&rsquo;utilisation du bus <em>Spi 0.0<\/em> par le module <code>spidev<\/code> par exemple). Je me suis inspir\u00e9 de l&rsquo;<em>overlay<\/em> pour le module QCA7000 qui se trouve dans les sources du noyau.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><em>Device Tree Overlay<\/em><\/h2>\n\n\n\n<p><strong>Le fichier d&rsquo;<em>overlay<\/em> complet <a href=\"https:\/\/www.blaess.fr\/christophe\/files\/article-2019-12-20\/w5500.dts\">est disponible ici<\/a><\/strong>. Il contient trois parties (trois <em>fragments<\/em>) qui agiront \u00e0 diff\u00e9rents endroits du <em>device tree<\/em>. Il commence par l&rsquo;ent\u00eate <code>plugin<\/code> indiquant qu&rsquo;il s&rsquo;agit d&rsquo;un <em>overlay<\/em> et que certaines r\u00e9f\u00e9rences resteront irr\u00e9solues \u00e0 l&rsquo;issue de la compilation sans que cela soit une erreur.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/dts-v1\/;\n\/plugin\/;<\/pre>\n\n\n\n<p>Ensuite commence l&rsquo;<em>overlay<\/em> proprement dit, qui indique d&rsquo;abord sur quel <em>device tree<\/em> il peut s&rsquo;appliquer&nbsp;: celui du Raspberry Pi. Suivi de trois <em>fragments<\/em> que nous analyserons ensuite.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/ {\n    compatible = \"brcm,bcm2708\";\n    fragment@0 {\n        ...\n    };\n\n    fragment@1 {\n        ...\n    };\n\n    fragment@2 {\n        ...\n    };\n}<\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Le premier <em>fragment<\/em> s&rsquo;applique sur le bus <em>Spi 0<\/em>, et ajoute un p\u00e9riph\u00e9rique nomm\u00e9 <code>eth1<\/code>.  Le type de contr\u00f4leur est indiqu\u00e9, suivi du num\u00e9ro de registre (0). C&rsquo;est ce qui permet de choisir entre les bus <em>Spi 0.0<\/em> et <em>Spi 0.1<\/em> correspondant aux sorties <em>Chip Select 0<\/em> (broche 24 du Raspberry Pi) et <em>Chip Select 1<\/em> (broche 26). <\/p>\n\n\n\n<p>Le type d&rsquo;interruption utilis\u00e9 par le contr\u00f4leur (GPIO) ainsi que son num\u00e9ro  (25) et le type de front (2 pour <em>falling edge<\/em>, la <a rel=\"noreferrer noopener\" aria-label=\"documentation du w5500 (s\u2019ouvre dans un nouvel onglet)\" href=\"http:\/\/wizwiki.net\/wiki\/lib\/exe\/fetch.php\/products:w5500:w5500_ds_v109e.pdf\" target=\"_blank\">documentation du <em>w5500<\/em><\/a> indiquant que cette broche est active \u00e0 l&rsquo;\u00e9tat bas) sont suivis de la fr\u00e9quence SPI maximale (31,25 MHz) d\u00e9termin\u00e9e un peu arbitrairement.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">fragment@0 {\n    target = &lt;&amp;spi0&gt;;\n    __overlay__ {\n        #address-cells = &lt;1&gt;;\n        #size-cells = &lt;0&gt;;\n        status = \"okay\";\n\n        eth1: w5500@0 {\n            compatible = \"wiznet,w5500\";\n            reg = &lt;0&gt;;\n            pinctrl-names = \"default\";\n            pinctrl-0 = &lt;&amp;eth1_pins&gt;;\n            interrupt-parent = &lt;&amp;gpio&gt;;\n            interrupts = &lt;25 2&gt;;\n            spi-max-frequency = &lt;31250000&gt;;\n            status = \"okay\";\n        };\n    };\n};<\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Le deuxi\u00e8me <em>fragment<\/em> d&rsquo;<em>overlay<\/em> sert \u00e0 d\u00e9sactiver l&rsquo;acc\u00e8s par le module <code>spidev<\/code> au bus <em>Spi 0.0<\/em> pour \u00e9viter toute collision avec le driver <code>w5100-spi<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">fragment@1 {\n    target = &lt;&amp;spidev0&gt;;\n    __overlay__ {\n        status = \"disabled\";\n    };\n};<\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Le dernier fragment, enfin, r\u00e9serve la GPIO que nous utilisons dans le driver (25). Son \u00e9ventuelle fonction et la r\u00e9sistance de <em>pulldown<\/em> interne sont d\u00e9sactiv\u00e9es.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">fragment@2 {\n    target = &lt;&amp;gpio&gt;;\n    __overlay__ {\n        eth1_pins: eth1_interrupt {\n            brcm,pins = &lt;25&gt;;\n            brcm,function = &lt;0&gt;;\n            brcm,pull = &lt;0&gt;;\n        };\n    };\n};<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Compilation de l&rsquo;<em>overlay<\/em><\/h2>\n\n\n\n<p>La version du <em>Device Tree Compiler<\/em> <code>dtc<\/code>, dont je dispose sur mon PC Ubuntu est trop ancienne pour arriver \u00e0 compiler correctement cet <em>overlay<\/em>. Elle \u00e9choue avec l&rsquo;erreur suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>dtc -I dts -O dtb &lt; w5500.dts &gt; w5500.dtbo<\/strong> \n&lt;stdout&gt; : Warning (unit_address_vs_reg): Node \/fragment@0 has a unit name, but no reg property\n&lt;stdout&gt; : Warning (unit_address_vs_reg): Node \/fragment@1 has a unit name, but no reg property\n&lt;stdout&gt; : Warning (unit_address_vs_reg): Node \/fragment@2 has a unit name, but no reg property\ndtc: livetree.c:521: get_node_by_phandle: Assertion `(phandle != 0) &amp;&amp; (phandle != -1)' failed.\nAbandon<\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>J&rsquo;ai donc compil\u00e9 une version plus r\u00e9cente de <code>dtc<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>git clone https:\/\/github.com\/dgibson\/dtc<\/strong>\nClonage dans 'dtc'\u2026\nremote: Enumerating objects: 294, done.\nremote: Counting objects: 100% (294\/294), done.\nremote: Compressing objects: 100% (220\/220), done.\nremote: Total 5173 (delta 131), reused 143 (delta 74), pack-reused 4879\nR\u00e9ception d'objets: 100% (5173\/5173), 1.53 MiB | 2.89 MiB\/s, fait.\nR\u00e9solution des deltas: 100% (3784\/3784), fait.\n\n$ <strong>cd dtc\/<\/strong>\n\n$ <strong>make<\/strong>\n  [...]\n  AR libfdt\/libfdt.a\n Skipping pylibfdt (install python dev and swig to build)\n\n$ <strong>cd ..<\/strong>\n\n$ <strong>dtc\/dtc -@ -I dts -O dtb &lt; external-tree-pi3-w5500\/dts\/w5500.dts &gt; external-tree-pi3-w5500\/dts\/w5500.dtbo<\/strong> \n\n$<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Installation de l&rsquo;<em>overlay<\/em><\/h2>\n\n\n\n<p>\u00c0 pr\u00e9sent que nous pouvons compiler notre fichier <em>overlay<\/em>, il est temps de le tester sur une image. Pour cela nous g\u00e9n\u00e9rons une image minimale standard pour Raspberry Pi 3 avec Buildroot. Commen\u00e7ons par en t\u00e9l\u00e9charger la derni\u00e8re version disponible au moment de la r\u00e9daction de ces lignes&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>wget https:\/\/buildroot.org\/downloads\/buildroot-2019.11.tar.bz2<\/strong>\n  [...]\n$ <strong>tar xf buildroot-2019.11.tar.bz2<\/strong>\n\n$ <strong>cd buildroot-2019.11.tar.bz2<\/strong><\/pre>\n\n\n\n<p>Je pr\u00e9pare une configuration standard pour Raspberry Pi 3, mais cela peut s&rsquo;adapter avec n&rsquo;importe quel mod\u00e8le (appeler <code>make list-defconfigs<\/code> pour voir les configurations pr\u00e9d\u00e9finies existantes). J&rsquo;utilise l&rsquo;option <code>O=...<\/code> (la lettre 0 majuscule, pas un z\u00e9ro) pour cr\u00e9er un r\u00e9pertoire de travail et ne pas polluer les sources de Buildroot.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>make O=..\/build-pi3  raspberrypi3_defconfig<\/strong>\n  [...]\n$ <strong>cd ..\/build-pi3<\/strong><\/pre>\n\n\n\n<p>Par d\u00e9faut, le <em>driver<\/em> pour <em>w5100<\/em>\/<em>w5200<\/em>\/<em>w5500<\/em> n&rsquo;est pas compil\u00e9 avec le noyau pour Raspberry Pi 3. Ajustons donc sa configuration&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>make linux-menuconfig<\/strong><\/pre>\n\n\n\n<p>Cette \u00e9tape prend du temps avant de nous afficher le menu de configuration du noyau, car Buildroot g\u00e9n\u00e8re d&rsquo;abord sa cha\u00eene de compilation.<\/p>\n\n\n\n<p>Lorsque le menu s&rsquo;affiche, activons les options<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Device Drivers ---&gt;\n  [*] Network device support ---&gt;\n    [*] Ethernet driver support ---&gt;\n       [*] WIZnet devices\n          &lt;<strong>M<\/strong>&gt; WIZnet W5100 Ethernet support\n          &lt;<strong>M<\/strong>&gt; WIZnet W5100\/W5200\/W5500 Ethernet support for SPI mode<\/pre>\n\n\n\n<p>J&rsquo;ai choisi dans un premier temps de compiler les <em>drivers<\/em> sous forme de modules (<code>&lt;M&gt;<\/code> plut\u00f4t que <code>&lt;*&gt;<\/code>) afin de ma\u00eetriser leurs insertions et retraits du noyau.<\/p>\n\n\n\n<p>On termine la compilation de l&rsquo;image avec&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>make<\/strong>\n [...]\n INFO: hdimage(sdcard.img): writing MBR\n$<\/pre>\n\n\n\n<p>Je vais transf\u00e9rer l&rsquo;image sur une carte micro-SD que j&rsquo;ins\u00e8re sur mon PC <em>via<\/em> un adaptateur USB &#8211; micro-SD. Elle est reconnue comme p\u00e9riph\u00e9rique <code>\/dev\/sdb<\/code> et ses deux pr\u00e9c\u00e9dentes partitions sont automatiquement mont\u00e9es, comme je le vois avec la commande <code>lsblk<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>lsblk<\/strong>\nNAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT\n sda              8:0    0 465,8G  0 disk  \n \u251c\u2500sda1           8:1    0   400G  0 part  \/home\/testing\n \u2514\u2500sda2           8:2    0     8G  0 part  [SWAP]\n<strong> sdb              8:16   1   1,9G  0 disk  \n \u251c\u2500sdb1           8:17   1    32M  0 part  \/media\/cpb\/82FE-5A11\n \u2514\u2500sdb2           8:18   1   120M  0 part  \/media\/cpb\/747675ea-<\/strong>\n nvme0n1        259:0    0 232,9G  0 disk  \n \u251c\u2500nvme0n1p1    259:1    0   512M  0 part  \/boot\/efi\n \u251c\u2500nvme0n1p2    259:2    0 224,6G  0 part  \/\n \u2514\u2500nvme0n1p3    259:3    0   7,8G  0 part  \n   \u2514\u2500cryptswap1 253:0    0   7,8G  0 crypt <\/pre>\n\n\n\n<p>Je commence par d\u00e9monter les deux partitions, puis je copie l&rsquo;image fournie par Buildroot en \u00e9crasant l&rsquo;ensemble de la carte.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>umount \/dev\/sdb?<\/strong>\n\n$ <strong>sudo  cp  images\/sdcard.img  \/dev\/sdb<\/strong><\/pre>\n\n\n\n<p>Apr\u00e8s une bonne vingtaine de secondes de copie, ma carte est pr\u00eate. Toutefois, je veux ajouter l&rsquo;<em>overlay<\/em> compil\u00e9 plus haut sur sa partition de <em>boot<\/em>. J&rsquo;extrais et r\u00e9ins\u00e8re ma carte \u00e0 nouveau pour qu&rsquo;elle soit auto-mont\u00e9e et je v\u00e9rifie le r\u00e9pertoire de montage de la premi\u00e8re partition <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>lsblk<\/strong>\n [...]\nsdb              8:16   1   1,9G  0 disk  \n<strong> \u251c\u2500sdb1           8:17   1    32M  0 part  \/media\/cpb\/0B53-B858\n<\/strong> \u2514\u2500sdb2           8:18   1   120M  0 part  \/media\/cpb\/d396131c-\n[...]<\/pre>\n\n\n\n<p>Je copie mon <em>overlay<\/em> dans le sous-r\u00e9pertoire <code>overlays\/<\/code> de la partition de <em>boot<\/em> :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>cp ..\/w5500.dtbo \/media\/cpb\/0B53-B858\/overlays<\/strong><\/pre>\n\n\n\n<p>Puis j&rsquo;\u00e9dite le fichier de configuration du <em>bootloader<\/em> afin de lui demander de fournir l&rsquo;<em>overlay<\/em> au noyau&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>nano \/media\/cpb\/0B53-B858\/config.txt<\/strong><\/pre>\n\n\n\n<p>J&rsquo;ajoute \u00e0 la fin du fichier la ligne<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">dtoverlay=w5500<\/pre>\n\n\n\n<p>Puis je d\u00e9monte ma carte SD et l&rsquo;ins\u00e8re dans le Raspberry Pi 3<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>umount \/dev\/sdb?<\/strong><\/pre>\n\n\n\n<p>Le noyau d\u00e9marre normalement. A priori l&rsquo;<em>overlay<\/em> est appliqu\u00e9, mais le mat\u00e9riel n&rsquo;est pas pris en compte car ni le <em>driver<\/em> SPI ni le <em>driver<\/em> pour le <em>w5500<\/em> ne sont charg\u00e9s.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># <strong>ip link<\/strong>\n 1: lo:  mtu 65536 qdisc noqueue qlen 1000\n     link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n 2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000\n     link\/ether b8:27:eb:e9:e1:11 brd ff:ff:ff:ff:ff:ff<\/pre>\n\n\n\n<p>Ins\u00e9rons le <em>driver<\/em> pour le bus SPI du Raspberry Pi<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># <strong>modprobe spi-bcm2835<\/strong><\/pre>\n\n\n\n<p>Puis le <em>driver<\/em> pour le module WIZnet&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># <strong>modprobe w5100-spi<\/strong><\/pre>\n\n\n\n<p>V\u00e9rifions les interfaces r\u00e9seau&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># <strong>ip link<\/strong>\n 1: lo:  mtu 65536 qdisc noqueue qlen 1000\n     link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n 2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000\n     link\/ether b8:27:eb:e9:e1:11 brd ff:ff:ff:ff:ff:ff\n 3: eth1:  mtu 1500 qdisc noop qlen 1000\n     link\/ether 2e:93:f5:80:c7:60 brd ff:ff:ff:ff:ff:ff<\/pre>\n\n\n\n<p>Bonne nouvelle&nbsp;! Une nouvelle interface <code>eth1<\/code> est apparue. Je la connecte au r\u00e9seau du bureau, dont le routeur assure le r\u00f4le de serveur DHCP.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># <strong>ip addr show  eth1<\/strong>\n 3: eth1:  mtu 1500 qdisc noop qlen 1000\n     link\/ether 2e:93:f5:80:c7:60 brd ff:ff:ff:ff:ff:ff<\/pre>\n\n\n\n<p>L&rsquo;interface n&rsquo;a pas encore d&rsquo;adresse IP, je dois lancer manuellement le client DHCP &#8211; de Busybox &#8211; en lui indiquant l&rsquo;interface \u00e0 param\u00e9trer&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>#<\/code> <strong>udhcpc -i eth1<\/strong>\n udhcpc: started, v1.31.1\n udhcpc: sending discover\n udhcpc: sending select for 192.168.0.114\n udhcpc: lease of 192.168.0.114 obtained, lease time 7200\n deleting routers\n adding dns 8.8.8.8\n adding dns 8.8.4.4\n\n# <strong>ping www.kernel.org<\/strong>\n PING www.kernel.org (136.144.49.103): 56 data bytes\n 64 bytes from 136.144.49.103: seq=0 ttl=47 time=15.202 ms\n 64 bytes from 136.144.49.103: seq=1 ttl=47 time=14.456 ms\n 64 bytes from 136.144.49.103: seq=2 ttl=47 time=14.432 ms\n ^C\n --- www.kernel.org ping statistics ---\n 3 packets transmitted, 3 packets received, 0% packet loss\n round-trip min\/avg\/max = 14.432\/14.696\/15.202 ms<\/pre>\n\n\n\n<p>Cette interface Ethernet est la seule connect\u00e9e, la communication avec Internet passe donc bien par elle.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Compilation statique des drivers<\/h2>\n\n\n\n<p>La compilation des <em>drivers<\/em> sous forme de modules ext\u00e9rieurs au noyau est pratique pour la mise au point, et leur chargement peut se faire facilement \u00e0 l&rsquo;aide d&rsquo;un script de d\u00e9marrage. Nous voyons les modules n\u00e9cessaires&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># <strong>lsmod<\/strong>\n Module                  Size  Used by    Not tainted\n w5100_spi              16384  0 \n w5100                  20480  1 w5100_spi\n spi_bcm2835            20480  0 \n ipv6                  458752 16 [permanent]<\/pre>\n\n\n\n<p>Toutefois, il peut s&rsquo;av\u00e9rer int\u00e9ressant de compiler les <em>drivers<\/em> statiquement dans l&rsquo;image de noyau. J&rsquo;ai donc relanc\u00e9 sur mon PC un nouveau&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>make linux-menuconfig<\/strong><\/pre>\n\n\n\n<p>et j&rsquo;ai activ\u00e9 la compilation statique des options&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Device Drivers ----&gt;\n  [*] Network device support ----&gt;\n    [*] Ethernet driver support ---&gt;\n      [*] WIZnet devices\n        &lt;<strong>*<\/strong>&gt; WIZnet w5100 Ethernet support\n        &lt;<strong>*<\/strong>&gt; WIZnet w5100\/w5200\/w5500 Ethernet support for SPI mode\n  [*] SPI support ----&gt;\n    &lt;<strong>*<\/strong>&gt; BCM2835 SPI controller<\/pre>\n\n\n\n<p>Et reg\u00e9n\u00e9r\u00e9 une image avec<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ <strong>make<\/strong><\/pre>\n\n\n\n<p>Au <em>reboot<\/em> du syst\u00e8me, l&rsquo;interface a bien \u00e9t\u00e9 automatiquement d\u00e9tect\u00e9e. Une petite surprise&nbsp;: comme l&rsquo;initialisation du contr\u00f4leur SPI est sensiblement plus rapide que celle du contr\u00f4leur USB pilotant l&rsquo;interface r\u00e9seau habituelle, notre nouveau connecteur Ethernet se retrouve nomm\u00e9 <code>eth0<\/code> et l&rsquo;ancien connecteur <code>eth1<\/code> ! D&rsquo;ailleurs le client DHCP a \u00e9t\u00e9 automatiquement lanc\u00e9 au d\u00e9marrage et notre interface dispose d\u00e9j\u00e0 d&rsquo;une adresse IP.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># <strong>ip addr show<\/strong>\n 1: lo:  mtu 65536 qdisc noqueue qlen 1000\n     link\/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n     inet 127.0.0.1\/8 scope host lo\n        valid_lft forever preferred_lft forever\n     inet6 ::1\/128 scope host \n        valid_lft forever preferred_lft forever\n 2: <strong>eth0<\/strong>:  mtu 1500 qdisc pfifo_fast qlen 1000\n     link\/ether 3e:ff:4b:58:f9:9d brd ff:ff:ff:ff:ff:ff\n     inet <strong>192.168.0.115<\/strong>\/24 brd 192.168.0.255 scope global eth0\n        valid_lft forever preferred_lft forever\n     inet6 fe80::3cff:4bff:fe58:f99d\/64 scope link \n        valid_lft forever preferred_lft forever\n 3: eth1:  mtu 1500 qdisc noop qlen 1000\n     link\/ether b8:27:eb:e9:e1:11 brd ff:ff:ff:ff:ff:ff<\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>L&rsquo;interface fonctionne tr\u00e8s bien, toutefois le d\u00e9bit n&rsquo;est pas excellent, de l&rsquo;ordre de 15 \u00e0 20 Mbits\/sec. d&rsquo;apr\u00e8s mes premi\u00e8res mesures. Je suppose que l&rsquo;on pourrait optimiser le param\u00e9trage SPI (fr\u00e9quence, mode, etc.)<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Pour le projet de mon client, nous n&rsquo;utiliserons pas un Raspberry Pi, et je peux esp\u00e9rer que la d\u00e9bit SPI soit am\u00e9lior\u00e9. \u00c0 cette occasion, la configuration de Buildroot sera industrialis\u00e9e, en employant une arborescence externe pour int\u00e9grer l&rsquo;<em>overlay<\/em> du <em>device tree<\/em>, la configuration du noyau et le param\u00e9trage du <em>bootloader<\/em>.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai eu l&rsquo;occasion, pour le projet d&rsquo;un client, de tester un petit circuit permettant de disposer d&rsquo;un port Ethernet sur bus SPI. Je me suis amus&eacute; &agrave; l&rsquo;installer sur un Raspberry Pi 3, cela fonctionne assez facilement. Peut-&ecirc;tre serez-vous &eacute;galement tent&eacute;s d&rsquo;ajouter un port Ethernet &agrave; votre Pi&nbsp;? Cela peut aussi &ecirc;tre une bonne solution [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,19,8,11],"tags":[],"class_list":["post-5769","post","type-post","status-publish","format-standard","hentry","category-embarque","category-kernel","category-linux-2","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=5769"}],"version-history":[{"count":61,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5769\/revisions"}],"predecessor-version":[{"id":5849,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5769\/revisions\/5849"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=5769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=5769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=5769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}