{"id":5473,"date":"2019-02-01T08:00:22","date_gmt":"2019-02-01T07:00:22","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=5473"},"modified":"2019-02-01T09:15:57","modified_gmt":"2019-02-01T08:15:57","slug":"un-raspberry-pi-en-production","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2019\/02\/01\/un-raspberry-pi-en-production\/","title":{"rendered":"Un Raspberry Pi en production&nbsp;?"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">(ou \u00ab\u00a0<em>Jouons avec un Compute Module 3+, Raspbian, Buildroot et Yocto<\/em>\u00ab\u00a0)<\/h3>\n\n\n\n<p> <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright is-resized\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/02\/IMG_20190130_144707.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/02\/IMG_20190130_144707-1024x819.png\" alt=\"\" class=\"wp-image-5559\" width=\"250\" height=\"200\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/02\/IMG_20190130_144707-1024x819.png 1024w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/02\/IMG_20190130_144707-300x240.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/02\/IMG_20190130_144707-768x615.png 768w\" sizes=\"auto, (max-width: 250px) 100vw, 250px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Je r\u00e9alise des prestations de conseil et de formation aupr\u00e8s d&rsquo;entreprises qui souhaitent utiliser Linux pour produire un syst\u00e8me embarqu\u00e9. La plupart de ces projets commencent par un prototype sur <strong>Raspberry Pi<\/strong>.<\/p>\n\n\n\n<p>Lorsqu&rsquo;elles me consultent sur le choix d&rsquo;une plate-forme pour l&rsquo;industrialisation de leur produit, je leur conseille de laisser de c\u00f4t\u00e9 le Raspberry Pi et de se tourner vers une carte plus adapt\u00e9e \u00e0 la production en s\u00e9rie.<\/p>\n\n\n\n<p style=\"text-align:center\">Mais cette r\u00e9ponse pourrait bien \u00e9voluer&#8230;<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\"><em>System-On-Chip<\/em>, <em>Single-Board-Computer<\/em> et <em>System-On-Module<\/em><\/h2>\n\n\n\n<p>Pour commencer, quelques rappels sur le vocabulaire des syst\u00e8mes embarqu\u00e9s&nbsp;; la plupart d&rsquo;entre-eux sont construits autour d&rsquo;un <em><strong>System-On-Chip<\/strong><\/em> (S.O.C.) c&rsquo;est-\u00e0-dire une \u00ab\u00a0puce\u00a0\u00bb comprenant un processeur, des circuits \u00e9lectroniques (diviseurs d&rsquo;horloge, logique de <em>reset<\/em>, etc.), des contr\u00f4leurs d&rsquo;entr\u00e9es-sorties, de la m\u00e9moire&#8230; Le S.O.C. utilis\u00e9 par le Raspberry Pi (3B+) est le BCM2837B0 de Broadcom.<\/p>\n\n\n\n<p>Le Raspberry Pi associe ce S.O.C. avec un peu de m\u00e9moire, un contr\u00f4leur USB\/Ethernet et ajoute des fonctions \u00e9lectroniques (alimentation, amplification des signaux, etc.). Il suffit d&rsquo;ajouter une carte micro-SD contenant le syst\u00e8me d&rsquo;exploitation et d&rsquo;alimenter le Raspberry Pi pour qu&rsquo;il soit op\u00e9rationnel. On lui connecte, au choix, un \u00e9cran, un clavier, un c\u00e2ble Ethernet, des p\u00e9riph\u00e9riques s\u00e9rie, SPI, i\u00b2c, etc. C&rsquo;est ce que l&rsquo;on nomme un <em><strong>Single-Board-Computer<\/strong><\/em> (S.B.C.)<\/p>\n\n\n\n<p>Un S.B.C. est tr\u00e8s adapt\u00e9 pour le prototypage, les projets personnels (<em>media center<\/em>, <em>retro-gaming<\/em>, station m\u00e9t\u00e9o, serveur domotique&#8230;) ou la production de mini-s\u00e9ries de quelques exemplaires. D\u00e8s que l&rsquo;on souhaite d\u00e9passer quelques dizaines d&rsquo;unit\u00e9s \u00e0 produire, l&rsquo;utilisation d&rsquo;un S.B.C. devient peu souhaitable.<\/p>\n\n\n\n<p>Il est tr\u00e8s rare qu&rsquo;un produit ne n\u00e9cessite pas d&rsquo;autres composants \u00e9lectroniques externes (capteurs, actionneurs, leds, boutons, interrupteurs, etc.). Il faut alors d\u00e9velopper une carte \u00e9lectronique d\u00e9di\u00e9e pour supporter ces \u00e9l\u00e9ments sp\u00e9cifiques au projet. Cette carte \u00ab\u00a0m\u00e9tier\u00a0\u00bb et le S.B.C. doivent \u00eatre reli\u00e9s par l&rsquo;interm\u00e9diaire de c\u00e2bles, de connecteurs, et probablement solidaris\u00e9s physiquement par le biais d&rsquo;entretoises, de boulons, etc. Tout ceci ajoute de la complexit\u00e9 dans la production et des points de dysfonctionnements potentiels du syst\u00e8me.<\/p>\n\n\n\n<p>Dans le cas du Raspberry Pi, on peut d\u00e9velopper une carte venant se brancher sur le connecteur d&rsquo;entr\u00e9e-sortie \u00e0 la mani\u00e8re des <em>hats<\/em> propos\u00e9s pour cette carte (par exemple le <em><a rel=\"noreferrer noopener\" aria-label=\"P.O.E-hat (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.raspberrypi.org\/blog\/poe-hat-revision\/\" target=\"_blank\">P.O.E. hat<\/a><\/em> ou le <em><a rel=\"noreferrer noopener\" aria-label=\"Pi TV hat (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.raspberrypi.org\/blog\/raspberry-pi-tv-hat\/\" target=\"_blank\">Pi TV hat<\/a><\/em>) mais ce n&rsquo;est pas toujours possible pour des raisons pratiques. Pour un projet r\u00e9cent, mon client \u00e9tait limit\u00e9 \u00e0 une \u00e9lectronique ne d\u00e9passant pas 17 mm d&rsquo;\u00e9paisseur, soit \u00e0 peine plus que les connecteurs USB\/Ethernet. Impossible donc de se brancher sur le connecteur d&rsquo;extension sauf en soudant directement sur les broches \u00e0 mi-hauteur. Autrement dit, parfaitement r\u00e9alisable pour un prototype mais totalement irr\u00e9aliste pour une production en nombre.<\/p>\n\n\n\n<p>L&rsquo;id\u00e9al est de regrouper toute l&rsquo;\u00e9lectronique m\u00e9tier sur une seule carte qui inclue \u00e9galement le S.O.C. Toutefois ceci n\u00e9cessite un investissement en d\u00e9veloppement \u00e9lectronique cons\u00e9quent, que l&rsquo;on ne consid\u00e8re en g\u00e9n\u00e9ral pas rentable en de\u00e7\u00e0 de  plusieurs milliers d&rsquo;unit\u00e9s \u00e0 produire.<\/p>\n\n\n\n<p>La solution consiste \u00e0 utiliser un <em><strong>System-On-Module<\/strong><\/em> (S.O.M.) c&rsquo;est \u00e0 dire une petite carte contenant toute l&rsquo;\u00e9lectronique complexe du S.B.C. avec un seul connecteur sp\u00e9cifique, par exemple une rang\u00e9e de mini broches \u00e0 la mani\u00e8re des barrettes de m\u00e9moires <em>SO-DIMM<\/em>. Il suffit alors d&rsquo;ajouter sur la carte m\u00e9tier un support d&rsquo;insertion accueillant le S.O.M. pour qu&rsquo;il puisse communiquer avec les p\u00e9riph\u00e9riques. L&rsquo;int\u00e9gration d&rsquo;un S.O.M. dans la conception d&rsquo;une carte \u00e9lectronique m\u00e9tier est une op\u00e9ration relativement simple pour un bureau d&rsquo;\u00e9tude, l&rsquo;interface \u00e9lectronique et logique \u00e9tant bien document\u00e9e par le fournisseur de module.<\/p>\n\n\n\n<p>Pour les projets de mes clients, j&rsquo;ai eu \u00e0 utiliser plusieurs modules \u00e0 vocation industrielle, je citerais par exemple les <a rel=\"noreferrer noopener\" aria-label=\"OposSOM d'Armadeus (s\u2019ouvre dans un nouvel onglet)\" href=\"http:\/\/www.opossom.com\/\" target=\"_blank\">OposSOM d&rsquo;Armadeus<\/a>, les <a rel=\"noreferrer noopener\" aria-label=\"Phycore de Phytec (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.phytec.fr\/produits\/nxp\/imx-6ulull\/\" target=\"_blank\">Phycore de Phytec<\/a> ou les <a rel=\"noreferrer noopener\" aria-label=\"A20-SOM d'Olimex (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.olimex.com\/Products\/SOM\/A20\/A20-SOM\/\" target=\"_blank\">A20-SOM d&rsquo;Olimex<\/a>.<\/p>\n\n\n\n<p style=\"text-align:center\">Mais le Raspberry Pi dans tout \u00e7a&nbsp;?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Raspberry Pi Compute Module<\/h2>\n\n\n\n<p>La <em><a rel=\"noreferrer noopener\" aria-label=\"Raspberry Pi Fundation (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.raspberrypi.org\/about\/\" target=\"_blank\">Raspberry Pi Fundation<\/a><\/em> avait compris depuis longtemps l&rsquo;int\u00e9r\u00eat pour le d\u00e9veloppeur d&rsquo;un produit industriel de disposer d&rsquo;un module regroupant toutes les fonctionnalit\u00e9s du Raspberry Pi, sur lequel il puisse faire fonctionner l&rsquo;application prototyp\u00e9e et mise au point sur un S.B.C. classique. Elle a propos\u00e9 le mod\u00e8le <em>Raspberry Pi Compute Module CM1<\/em> qui dans un premier temps \u00e9tait \u00e9quivalent au Raspberry Pi 1 B+, puis le CM3 \u00e9quivalent au Raspberry Pi 3. Toutefois la disponibilit\u00e9 de ces modules laissait \u00e0 d\u00e9sirer et la p\u00e9rennit\u00e9 de leur production n&rsquo;\u00e9tait pas garantie.<\/p>\n\n\n\n<p>Le nouveau <em>Raspberry Pi Compute Module 3+<\/em> disponible depuis le 29 janvier 2019 franchit une \u00e9tape en garantissant une disponibilit\u00e9 du module jusqu&rsquo;au d\u00e9but 2026.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_091906.png\" alt=\"\" class=\"wp-image-5530\" width=\"450\" height=\"450\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_091906.png 600w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_091906-150x150.png 150w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_091906-300x300.png 300w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><figcaption>Raspberry Pi Compute Module 3<\/figcaption><\/figure><\/div>\n\n\n\n<p>Il est \u00e9galement disponible en plusieurs versions suivant la taille de la m\u00e9moire <em>eMMC<\/em> d\u00e9sir\u00e9e. En effet, il est difficilement envisageable dans un produit industriel que tout le logiciel du syst\u00e8me soit install\u00e9 sur une simple carte micro-SD, avec tous les risques que cela comporte&nbsp;: extraction involontaire, mauvais contacts par vibrations, duplication et <em>reverse ingeniering<\/em> du code applicatif (piratage), etc. Le <em>Raspberry Pi Compute Module<\/em> contient donc une m\u00e9moire flash <em>eMMC<\/em> que l&rsquo;on programme avec l&rsquo;O.S. d\u00e9sir\u00e9 (une distribution <a rel=\"noreferrer noopener\" aria-label=\"Raspbian (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/raspbian.org\/\" target=\"_blank\">Raspbian<\/a> par exemple, ou une image personnalis\u00e9e obtenue avec <a rel=\"noreferrer noopener\" aria-label=\"Yocto (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.yoctoproject.org\/\" target=\"_blank\">Yocto<\/a> ou <a href=\"https:\/\/buildroot.org\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">Buildroot<\/a>).<\/p>\n\n\n\n<p>Pour programmer le module, il est n\u00e9cessaire de disposer d&rsquo;un petit kit de d\u00e9veloppement d\u00e9di\u00e9, qui permet d&rsquo;ins\u00e9rer le S.O.M. et de disposer de la connectique \u00e9quivalente au S.B.C. initial. Cette carte s&rsquo;appelle un <em>Compute Module I\/O Board<\/em> (<em>CMIO board<\/em>). Il en existe deux versions, la premi\u00e8re v.1.2 date de 2014 environ, lors de la sortie du premier Compute Module, la seconde v.3 date de 2017. La documentation indique que la CMIO board v1.2 ne fonctionne pas avec le CM3+, pourtant c&rsquo;est celle que j&rsquo;ai utilis\u00e9e avec succ\u00e8s. Il est possible que certaines fonctionnalit\u00e9s ne soient pas support\u00e9es, mais pour la programmation de base, pas de souci.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092023.png\" alt=\"\" class=\"wp-image-5531\" width=\"400\" height=\"350\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092023.png 800w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092023-300x263.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092023-768x672.png 768w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><figcaption>Kit de d\u00e9veloppement <em>CMIO board v.1.2<\/em> &amp; Raspberry Pi CM3<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Raspbian sur CM3+<\/h2>\n\n\n\n<p>Le premi\u00e8re exp\u00e9rience \u00e0 tenter est de flasher une distribution <a rel=\"noreferrer noopener\" aria-label=\"Raspbian (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/raspbian.org\/\" target=\"_blank\">Raspbian<\/a> standard dans la m\u00e9moire eMMC du Compute Module 3+. Pour cela, il existe un <a rel=\"noreferrer noopener\" aria-label=\"tutoriel (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.raspberrypi.org\/documentation\/hardware\/computemodule\/cm-emmc-flashing.md\" target=\"_blank\">tutoriel<\/a> tr\u00e8s bien fait sur le site de la <em>Raspberry Pi Fundation<\/em>, aussi vais-je simplement lister les op\u00e9rations que je r\u00e9alise sans trop les d\u00e9tailler. Je d\u00e9crirai plus pr\u00e9cis\u00e9ment l&rsquo;utilisation de Buildroot et Yocto.<\/p>\n\n\n\n<p>J&rsquo;ai t\u00e9l\u00e9charg\u00e9 sur mon PC l&rsquo;image 2018-11-13 de Raspbian. Sur ce m\u00eame PC, je compile l&rsquo;utilitaire <code>usbboot<\/code> qui nous servira \u00e0 pr\u00e9parer le CM3+  \u00e0 l&rsquo;installation de l&rsquo;image. Pour cela je dois d&rsquo;abord installer une version de d\u00e9veloppement de la biblioth\u00e8que <code>libusb<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[~]$ <strong>sudo  apt  install  -y  libusb-1.0.0-dev<\/strong><br>[~]$ <strong>git  clone  --depth=1  https:\/\/github.com\/raspberrypi\/usbboot<\/strong><br>[~]$ <strong>cd usbboot<\/strong><br>[usbboot]$ <strong>make<\/strong><\/pre>\n\n\n\n<p>Une fois la compilation achev\u00e9e, je regarde la liste des partitions pr\u00e9sentes sur ce PC, avant de lancer l&rsquo;utilitaire de programmation du module.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[usbboot]$ <strong>lsblk<\/strong><br>NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT<br> loop0    7:0    0 140,7M  1 loop \/snap\/gnome-3-26-1604\/74<br> [...]<br> sda      8:0    0   1,8T  0 disk<br> \u251c\u2500sda1   8:1    0   1,8T  0 part \/<br> \u251c\u2500sda2   8:2    0     1K  0 part<br> \u2514\u2500sda5   8:5    0     3G  0 part [SWAP]<br> sr0     11:0    1  1024M  0 rom<br>[usbboot]$ <strong>sudo  .\/rpiboo<\/strong>t<br> Waiting for BCM2835\/6\/7<\/pre>\n\n\n\n<p>J&rsquo;ai ins\u00e9r\u00e9 le module CM3+ dans la carte CMIO. Je connecte son port \u00ab\u00a0<em>USB Slave<\/em>\u00a0\u00bb \u00e0 un port USB de mon PC. Le jumper J4 \u00ab\u00a0<em>USB Slave Boot<\/em>\u00a0\u00bb est sur la position \u00ab\u00a0<em>Enable<\/em>\u00ab\u00a0.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092217.png\" alt=\"\" class=\"wp-image-5533\" width=\"375\" height=\"600\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092217.png 500w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092217-188x300.png 188w\" sizes=\"auto, (max-width: 375px) 100vw, 375px\" \/><figcaption>Programmation du <em>CM3+<\/em> avec la <em>CMIO board v.1.2<\/em><\/figcaption><\/figure><\/div>\n\n\n\n<p> Je branche l&rsquo;alimentation de la<em> CMIO boar<\/em>d. L&rsquo;utilitaire <code>rpiboot<\/code> la d\u00e9tecte&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Sending bootcode.bin<br>Successful read 4 bytes<br>Waiting for BCM2835\/6\/7<br>Second stage boot server<br>File read: start.elf<br>Second stage boot server done<br>[usbboot]$<\/pre>\n\n\n\n<p>Je v\u00e9rifie \u00e0 nouveau la liste des partitions, un nouveau p\u00e9riph\u00e9rique bloc est pr\u00e9sent, qui repr\u00e9sente la m\u00e9moire <em>eMMC<\/em> du module CM3+.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[usbboot]$ <strong>lsblk<\/strong><br>NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT<br> loop0    7:0    0 140,7M  1 loop \/snap\/gnome-3-26-1604\/74<br> [...]<br> sda      8:0    0   1,8T  0 disk<br> \u251c\u2500sda1   8:1    0   1,8T  0 part \/<br> \u251c\u2500sda2   8:2    0     1K  0 part<br> \u2514\u2500sda5   8:5    0     3G  0 part [SWAP]<br> <strong>sdb      8:16   1   3,7G  0 disk<\/strong><br> sr0     11:0    1  1024M  0 rom<\/pre>\n\n\n\n<p>On peut alors copier directement l&rsquo;image de la distribution sur ce p\u00e9riph\u00e9rique.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[usbboot]$ <strong>sudo  cp  ..\/2018-11-13-raspbian-stretch.img  \/dev\/sdb<\/strong><\/pre>\n\n\n\n<p>La copie dure plusieurs minutes. Vous pouvez \u00e9galement utiliser la commande <code>dd<\/code> dont la syntaxe est l\u00e9g\u00e8rement plus compliqu\u00e9e, mais qui sera un peu plus rapide. Une fois la copie termin\u00e9e, je d\u00e9branche le c\u00e2ble USB qui reliait la <em>CMIO board<\/em> \u00e0 mon PC et je le rebranche. Deux nouvelles partitions format\u00e9es apparaissent et sont automatiquement mont\u00e9es.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[usbboot]$ <strong>lsblk<\/strong><br> NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT<br> loop0    7:0    0 140,7M  1 loop \/snap\/gnome-3-26-1604\/74<br> [...]<br> sda      8:0    0   1,8T  0 disk<br> \u251c\u2500sda1   8:1    0   1,8T  0 part \/<br> \u251c\u2500sda2   8:2    0     1K  0 part<br> \u2514\u2500sda5   8:5    0     3G  0 part [SWAP]<br> sdb      8:16   1   7,3G  0 disk<br><strong> \u251c\u2500sdb1   8:17   1  43,9M  0 part \/media\/cpb\/boot<br> \u2514\u2500sdb2   8:18   1   3,1G  0 part \/media\/cpb\/rootfs<br><\/strong> sr0     11:0    1  1024M  0 rom<\/pre>\n\n\n\n<p>Comme je souhaite utiliser le port s\u00e9rie pour me connecter sur mon Compute Module, j&rsquo;\u00e9dite le fichier <code>\/media\/cpb\/boot\/config.txt<\/code> pour y ajouter cette ligne&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">enable_uart=1<\/pre>\n\n\n\n<p>Je d\u00e9monte consciencieusement les deux partitions et je fais d\u00e9marrer la <em>CMIO board<\/em> apr\u00e8s avoir plac\u00e9 le cavalier \u00ab\u00a0<em>USB Slave Boot<\/em>\u00a0\u00bb en position \u00ab\u00a0<em>Disable\u00a0\u00bb<\/em>. <\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092904.png\" alt=\"\" class=\"wp-image-5536\" width=\"500\" height=\"450\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092904.png 1000w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092904-300x270.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_092904-768x691.png 768w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption>Boot normal du module <em>CM3+<\/em><\/figcaption><\/figure>\n\n\n\n<p>Voici quelques traces de ma connexion sur le port s\u00e9rie.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Raspbian GNU\/Linux 9 raspberrypi ttyAMA0<br> raspberrypi login: <strong>pi<\/strong><br> Password: <strong>(raspberry)<\/strong><br> Last login: Tue Nov 13 14:13:35 GMT 2018 on ttyAMA0<br> Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l<br> [...]<br>pi@raspberrypi:~$ <strong>cat  \/sys\/firmware\/devicetree\/base\/model<\/strong><br> Raspberry Pi Compute Module 3 Plus Rev 1.<\/pre>\n\n\n\n<p>Le mod\u00e8le est bien reconnu, v\u00e9rifions son processeur et sa m\u00e9moire RAM (1 Go).<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pi@raspberrypi:~$ <strong>lscpu<\/strong><br> Architecture:          armv7l<br> Byte Order:            Little Endian<br> CPU(s):                4<br> On-line CPU(s) list:   0-3<br> Thread(s) per core:    1<br> Core(s) per socket:    4<br> Socket(s):             1<br> Model:                 4<br> Model name:            ARMv7 Processor rev 4 (v7l)<br> CPU max MHz:           1200.0000<br> CPU min MHz:           600.0000<br> BogoMIPS:              38.40<br> Flags:                 half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32<br>pi@raspberrypi:~$ <strong>free<\/strong><br>               total        used        free      shared  buff\/cache   available<br> Mem:         <strong>949452<\/strong>       69364      730168       14012      149920      816484<br> Swap:        102396           0      102396<\/pre>\n\n\n\n<p>Le mod\u00e8le que j&rsquo;ai choisi est celui avec 8 Go de m\u00e9moire eMMC, je peux le v\u00e9rifier \u00e9galement.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pi@raspberrypi:~$ <strong>df<\/strong><br> Filesystem     1K-blocks    Used Available Use% Mounted on<br> \/dev\/root        <strong>7400936<\/strong> 2657104   4382080  38% \/<br> devtmpfs          470116       0    470116   0% \/dev<br> tmpfs             474724       0    474724   0% \/dev\/shm<br> tmpfs             474724   12216    462508   3% \/run<br> tmpfs               5120       4      5116   1% \/run\/lock<br> tmpfs             474724       0    474724   0% \/sys\/fs\/cgroup<br> \/dev\/mmcblk0p1     44220   22540     21681  51% \/boot<br> tmpfs              94944       0     94944   0% \/run\/user\/1000<br><\/pre>\n\n\n\n<p>J&rsquo;avais par ailleurs connect\u00e9 un petit \u00e9cran sur le port HDMI de la <em>CMIO board<\/em>, on peut voir que l&rsquo;IHM de la distribution Raspbian fonctionne parfaitement.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"686\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_102040.png\" alt=\"\" class=\"wp-image-5539\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_102040.png 600w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2019\/01\/IMG_20190131_102040-262x300.png 262w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><figcaption><em>Raspbian 2018.11<\/em> sur <em>CM3+<\/em><\/figcaption><\/figure>\n\n\n\n<p>La distribution Raspbian est donc bien support\u00e9e par ce nouveau module. Toutefois, pour les syst\u00e8mes embarqu\u00e9s industriels, on utilise rarement de distribution compl\u00e8te, on pr\u00e9f\u00e8re construire une image personnalis\u00e9e ne contenant que le strict n\u00e9cessaire. Pour cela on utilise un <em>build system<\/em> comme Buildroot ou Yocto. Commen\u00e7ons par tester notre module avec Buildroot.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Raspberry Pi CM3+ et Buildroot<\/h2>\n\n\n\n<p>J&rsquo;ai d\u00e9j\u00e0 d\u00e9crit la production compl\u00e8te d&rsquo;un syst\u00e8me embarqu\u00e9 avec Buildroot dans <a href=\"https:\/\/www.blaess.fr\/christophe\/2015\/12\/08\/creation-dun-systeme-complet-avec-buildroot\/\">cet article<\/a>. Nous ne verrons ici que les op\u00e9rations de base pour s&rsquo;assurer du fonctionnement minimal.<\/p>\n\n\n\n<p>Je t\u00e9l\u00e9charge la derni\u00e8re version stable de Buildroot, j&rsquo;extrais les sources, je pr\u00e9pare une configuration pour l&rsquo;ensemble des mod\u00e8les compatibles avec le Raspberry Pi 3, et je lance la compilation.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[~]$ <strong>wget  https:\/\/buildroot.org\/downloads\/buildroot-2018.11.2.tar.bz2<\/strong><br>[~]$ <strong>tar  xf  buildroot-2018.11.2.tar.bz2<\/strong><br>[~]$ <strong>cd  buildroot-2018.11.2\/<\/strong><br>[buildroot-2018.11.2]$ <strong>make  raspberrypi3_defconfig<\/strong><br>[buildroot-2018.11.2]$ <strong>make<\/strong><\/pre>\n\n\n\n<p>La compilation initiale prend une demi-heure environ. Ensuite je replace le cavalier \u00ab\u00a0<em>USB Slave Boot<\/em>\u00a0\u00bb de la <em>CMIO board<\/em> sur \u00ab\u00a0<em>Enable<\/em>\u00a0\u00bb et je red\u00e9marre la carte, en lan\u00e7ant sur mon PC&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[buildroot-2018.11.2]$ <strong>cd&nbsp; ..\/usbboot\/<\/strong><br>[usbboot]$ <strong>sudo  .\/rpiboot<\/strong><br>Waiting for BCM2835\/6\/7<br>Sending bootcode.bin<br>Successful read 4 bytes<br>Waiting for BCM2835\/6\/7<br>Second stage boot server<br>File read: start.elf<br>Second stage boot server done<br><br>[usbboot]$ <strong>umount  \/media\/cpb\/*<\/strong><br>[usbboot]$ <strong>sudo  cp  ..\/buildroot-2018.11.2\/output\/images\/sdcard.img  \/dev\/sdb<\/strong><\/pre>\n\n\n\n<p>Apr\u00e8s copie et re-positionnement du cavalier sur \u00ab\u00a0<em>Disable<\/em>\u00ab\u00a0, j&rsquo;observe les traces de <em>boot<\/em> suivantes&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[    0.000000] Booting Linux on physical CPU 0x0                                                                <br>[    0.000000] Linux version 4.14.74-v7 (cpb@why-cpb) (gcc version 7.3.0 (Buildroot 2018.11.2)) #1 SMP Thu Jan 31 08:10:44 CET 2019<br>[    0.000000] CPU: ARMv7 Processor [410fd034] revision 4 (ARMv7), cr=10c5383d<br>[...]<br>[    2.089583] devtmpfs: mounted<br>[    2.097822] Freeing unused kernel memory: 1024K<br>[    2.186441] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered<br>Starting logging: OK<br>Initializing random number generator\u2026<br>[    2.261917] random: dd: uninitialized urandom read (512 bytes read)<br>done.<br>Starting network:<br>[    2.447091] NET: Registered protocol family 10<br>[    2.455052] Segment Routing with IPv6<br>Waiting for interface eth0 to appear\u2026\u2026\u2026\u2026\u2026 timeout!<br>run-parts: \/etc\/network\/if-pre-up.d\/wait_iface: exit status 1<br>FAIL<br>Welcome to Buildroot<br>buildroot login: <\/pre>\n\n\n\n<p>L&rsquo;erreur en fin de <em>boot<\/em> est normale, le <em>Compute Module<\/em> n&rsquo;a pas d&rsquo;interface Ethernet (sur le Raspberry Pi classique, cette interface est fournie par un convertisseur USB \/ Ethernet LAN9512), le script de configuration par <em>DHCP<\/em> \u00e9choue donc au bout de quelques secondes. Ceci ne nous emp\u00eache pas de nous connecter et de passer quelques commandes.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Welcome to Buildroot<br>buildroot login: <strong>root<\/strong><br># <strong>uname  -a<\/strong><br>Linux buildroot 4.14.74-v7 #1 SMP Thu Jan 31 08:10:44 CET 2019 armv7l GNU\/Linux<br># <strong>cat  \/sys\/firmware\/devicetree\/base\/model<\/strong><br>Raspberry Pi Compute Module 3 Plus Rev 1.0<\/pre>\n\n\n\n<p>Notre <em>Compute Module<\/em> est bien reconnu et utilisable avec la derni\u00e8re version stable de Buildroot. Comme j&rsquo;en avais parl\u00e9 dans <a href=\"https:\/\/www.blaess.fr\/christophe\/2015\/12\/08\/creation-dun-systeme-complet-avec-buildroot\/\">cet article<\/a>, il est possible de configurer \u00e0 loisir la composition du syst\u00e8me et de le rendre tr\u00e8s robuste.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Raspberry Pi CM3+ et Yocto Project<\/h2>\n\n\n\n<p>Le projet <em>Yocto<\/em>, \u00e0 l&rsquo;instar de son confr\u00e8re <em>Buildroot<\/em>, permet de construire une image personnalis\u00e9e pour un syst\u00e8me embarqu\u00e9 en le limitant au strict n\u00e9cessaire. Nous allons l&rsquo;utiliser pour produire une image pour le Raspberry Pi Compute Module 3+.<\/p>\n\n\n\n<p>Tout d&rsquo;abord t\u00e9l\u00e9chargeons la derni\u00e8re version de Yocto. D\u00e9but 2019, il s&rsquo;agit de la branche \u00ab\u00a0Thud\u00a0\u00bb.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[~]$ <strong>mkdir  CM3lab<\/strong><br>[~]$ <strong>cd  CM3lab<\/strong><br>[CM3lab]$ <strong>git  clone git:\/\/git.yoctoproject.org\/poky.git  -b  thud<\/strong><\/pre>\n\n\n\n<p>T\u00e9l\u00e9chargeons \u00e9galement le <em>layer<\/em> pour Raspberry Pi, il s&rsquo;agit d&rsquo;un r\u00e9pertoire pr\u00e9fix\u00e9 par <code>meta<\/code> contenant les <em>recipes<\/em> &#8211; les recettes n\u00e9cessaires pour g\u00e9n\u00e9rer les composants du syst\u00e8me &#8211; d\u00e9di\u00e9es \u00e0 cette plateforme.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[CM3lab]$ <strong>git  clone git:\/\/git.yoctoproject.org\/meta-raspberrypi  -b  thud<\/strong><\/pre>\n\n\n\n<p>Appelons le script <code>oe-build-env<\/code> pour cr\u00e9er un r\u00e9pertoire de travail et pr\u00e9parons la configuration de la compilation.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[CM3lab]$ <strong>source  poky\/oe-init-build-env  build-cm3+<\/strong><br>[build-cm3+]$<\/pre>\n\n\n\n<p>On remarque que le script nous a plac\u00e9 dans le r\u00e9pertoire de travail nouvellement cr\u00e9\u00e9. Ajoutons le <em>layer<\/em> du Raspberry Pi pour notre compilation.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[build-cm3+] $ <strong>bitbake-layers   add-layer   ..\/meta-raspberrypi<\/strong><\/pre>\n\n\n\n<p>\u00c9ditons le fichier de configuration de Yocto, et modifions le type de machine ainsi&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[build-cm3+]$ <strong>nano  conf\/local.conf<\/strong><br>    [...]<br>    MACHINE = \"raspberrypi-cm3\"<br>    [...]<br><\/pre>\n\n\n\n<p>Nous pouvons maintenant lancer la compilation&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[build-cm3+]$ <strong>bitbake  rpi-basic-image<\/strong><\/pre>\n\n\n\n<p>La dur\u00e9e de compilation varie sensiblement en fonction de la puissance processeur disponible et du d\u00e9bit de la connexion Internet, mais elle est de l&rsquo;ordre de deux heures environ.<\/p>\n\n\n\n<p>Le fichier \u00e0 copier sur la partition eMMC (\u00e0 partir du r\u00e9pertoire courant) est le suivant&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tmp\/deploy\/images\/raspberrypi-cm3\/rpi-basic-image-raspberrypi-cm3.rpi-sdimg<br><\/pre>\n\n\n\n<p>Si on veut utiliser la connexion par port s\u00e9rie, il faut ajouter deux op\u00e9rations. Une fois le fichier copi\u00e9, il faut d\u00e9connecter puis reconnecter le c\u00e2ble <em>USB Slave<\/em> afin de voir appara\u00eetre sur le PC les deux partitions. On \u00e9dite le fichier <code>config.txt<\/code> se trouvant sur la premi\u00e8re pour, comme avec la distribution Raspbian, ajouter la ligne suivante.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">enable_uart=1<\/pre>\n\n\n\n<p>En outre, il faut \u00e9diter le fichier <code>\/etc\/inittab<\/code> se trouvant sur la seconde partition et remplacer la ligne<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">S0:12345:respawn:\/bin\/start_getty 115200 <strong>ttyS0<\/strong> vt102<\/pre>\n\n\n\n<p>par<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">S0:12345:respawn:\/bin\/start_getty 115200 <strong>ttyAMA0<\/strong> vt102<\/pre>\n\n\n\n<p>Comme avec les images pr\u00e9c\u00e9dentes, nous pouvons v\u00e9rifier le <em>boot<\/em> du syst\u00e8me&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Poky (Yocto Project Reference Distro) 2.6.1 raspberrypi-cm3 \/dev\/ttyAMA0<br> raspberrypi-cm3 login: <strong>root<\/strong><br> root@raspberrypi-cm3:~# <strong>uname  -a<\/strong><br> Linux raspberrypi-cm3 4.14.87 #1 SMP Thu Jan 31 09:49:20 UTC 2019 armv7l GNU\/Linux<br> root@raspberrypi-cm3:~# <strong>cat \/sys\/firmware\/devicetree\/base\/model<\/strong> <br> Raspberry Pi Compute Module 3 Plus Rev 1.0<br><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Nous voyons que le nouveau <em>Raspberry Pi Compute Module 3+<\/em> fonctionne avec la m\u00eame configuration que le CM3 pr\u00e9c\u00e9dent, tant avec une distribution compl\u00e8te comme <em>Raspbian<\/em>, qu&rsquo;avec des images minimales et customis\u00e9es produites par <em>Buildroot<\/em> ou <em>Yocto<\/em>. La gamme de choix \u00e9tendue en ce qui concerne la m\u00e9moire eMMC, la disponibilit\u00e9 prolong\u00e9e sur six ans, et le prix raisonnable en font une solution int\u00e9ressante pour industrialiser un produit prototyp\u00e9 sur le Raspberry Pi classique.<\/p>\n\n\n\n<p>Pour pouvoir ensuite utiliser le module ainsi programm\u00e9 sur une carte m\u00e9tier, on trouvera <a href=\"https:\/\/www.raspberrypi.org\/documentation\/hardware\/computemodule\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (s\u2019ouvre dans un nouvel onglet)\">la documentation de r\u00e9f\u00e9rence<\/a> sur le site de la <em>Raspberry Pi Fundation<\/em>, mais aussi des sites ind\u00e9pendants comme <a rel=\"noreferrer noopener\" aria-label=\"ce projet Instructables de Manolis Agkopplan (s\u2019ouvre dans un nouvel onglet)\" href=\"https:\/\/www.instructables.com\/id\/Design-Your-Own-Raspberry-Pi-Compute-Module-PCB\/\" target=\"_blank\">ce projet Instructables de Manolis Agkopplan<\/a> (merci \u00e0 Fran\u00e7ois Mocq pour le lien).<\/p>","protected":false},"excerpt":{"rendered":"<p>(ou &laquo;&nbsp;Jouons avec un Compute Module 3+, Raspbian, Buildroot et Yocto&laquo;&nbsp;) Je r&eacute;alise des prestations de conseil et de formation aupr&egrave;s d&rsquo;entreprises qui souhaitent utiliser Linux pour produire un syst&egrave;me embarqu&eacute;. La plupart de ces projets commencent par un prototype sur Raspberry Pi. Lorsqu&rsquo;elles me consultent sur le choix d&rsquo;une plate-forme pour l&rsquo;industrialisation de leur [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,10,11],"tags":[],"class_list":["post-5473","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-microprocesseur","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5473","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=5473"}],"version-history":[{"count":49,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5473\/revisions"}],"predecessor-version":[{"id":5570,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5473\/revisions\/5570"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=5473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=5473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=5473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}