Outils pour utilisateurs

Outils du site


buildroot

Buildroot sur NanoPi NEO/NEO2 et Raspbery Pi 3

OS images

Objectif

  • Créer un mini lecteur audio réseau basé sur une Linux minimaliste (kernel + busybox + upmpdcli/mpd [ou squeezelite] + shairport-sync) avec sortie audio par USB vers une interface XMOS.
    • UPnP/OpenHome player, Apple AirPlay et Web Radio fonctionnent dès le premier démarrage.
    • Qobuz/Tidal/GoogleMusic a besoin d'un abonnement et de configurer (soit dans upmpdcli, soit dans BubbleUPnP).
    • Squeezelite est installé mais pas utilisé. Un script de démarrage est dans le répertoire /root/, on le trouve aussi ici.
    • Shairport-sync : Si on ne l'utilise pas :
      mv /etc/init.d/S99shairport-sync /root/
      reboot
    • :!: Upmpdcli : Il est installé mais je ne l'utilise pas. Pour le désactiver :
      mv /etc/init.d/S99upmpdcli /root/
      reboot 

      J'utilise Upmpdcli sur le serveur Odroid-HC1. Cela permet d'alléger encore un peu plus le système sur NanoPi NEO|NEO2. Un aperçu du charge système lors de la lecture d'un fichier 24/96 :
      (NanoPi NEO2)
      (NanoPi NEO)

      • Note : Pour NanoPi NEO2, on voit 7 tasks/process, mais en usage normal seulement init, mpd et udhcpc sont nécessaires. Lorsque tout marche bien, on peut faire
        mv /etc/init.d/S01syslogd /root/
        mv /etc/init.d/S02klogd /root/
        reboot
        
        [se connecter sur NanoPi et puis arrêter le service dropbear :]
        /etc/init.d/S50dropbear stop
        exit
        [Il faut redémarrer NanoPi pour avoir à nouveau le service dropbear]
  • Roon Bridge : Je n'utilise pas Roon. Roon propose un “free 14 day trial”, j'en ai profité pour tester et intégrer Roon Bridge dans ma config.
    • Un aperçu du charge système lors de la lecture d'un fichier 24/96 :
      (NanoPi NEO2)
      (NanoPi NEO)
  • iperf3 : Un test avec iperf3. Sur le player NanoPi NEO2
    # iperf3 -s

    et ensuite sur le NAS Odroid-HC1

    root@odroidxu4:~# iperf3 -c 192.168.0.16

    192.168.0.16 est l'adresse IP de NanoPi NEO2. Voici les sorties après ces deux commandes :

    root@odroidxu4:~# iperf3 -c 192.168.0.16
    Connecting to host 192.168.0.16, port 5201
    [  4] local 192.168.0.23 port 47226 connected to 192.168.0.16 port 5201
    [ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
    [  4]   0.00-1.00   sec   108 MBytes   905 Mbits/sec    0    372 KBytes       
    [  4]   1.00-2.00   sec   110 MBytes   924 Mbits/sec    0    392 KBytes       
    [  4]   2.00-3.00   sec   110 MBytes   924 Mbits/sec    0    392 KBytes       
    [  4]   3.00-4.00   sec   110 MBytes   924 Mbits/sec    0    392 KBytes       
    [  4]   4.00-5.00   sec   110 MBytes   924 Mbits/sec    0    392 KBytes       
    [  4]   5.00-6.00   sec   110 MBytes   924 Mbits/sec    0    392 KBytes       
    [  4]   6.00-7.00   sec   110 MBytes   924 Mbits/sec    0    411 KBytes       
    [  4]   7.00-8.00   sec   110 MBytes   924 Mbits/sec    0    431 KBytes       
    [  4]   8.00-9.00   sec   110 MBytes   924 Mbits/sec    0    431 KBytes       
    [  4]   9.00-10.00  sec   110 MBytes   926 Mbits/sec    0    536 KBytes       
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth       Retr
    [  4]   0.00-10.00  sec  1.07 GBytes   922 Mbits/sec    0             sender
    [  4]   0.00-10.00  sec  1.07 GBytes   921 Mbits/sec                  receiver
    
    iperf Done.

    et

    # iperf3 -s
    warning: this system does not seem to support IPv6 - trying IPv4
    -----------------------------------------------------------
    Server listening on 5201
    -----------------------------------------------------------
    Accepted connection from 192.168.0.23, port 47224
    [  5] local 192.168.0.16 port 5201 connected to 192.168.0.23 port 47226
    [ ID] Interval           Transfer     Bandwidth
    [  5]   0.00-1.00   sec   102 MBytes   860 Mbits/sec                  
    [  5]   1.00-2.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   2.00-3.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   3.00-4.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   4.00-5.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   5.00-6.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   6.00-7.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   7.00-8.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   8.00-9.00   sec   110 MBytes   924 Mbits/sec                  
    [  5]   9.00-10.00  sec   110 MBytes   924 Mbits/sec                  
    [  5]  10.00-10.04  sec  4.72 MBytes   921 Mbits/sec                  
    - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ID] Interval           Transfer     Bandwidth
    [  5]   0.00-10.04  sec  0.00 Bytes  0.00 bits/sec                  sender
    [  5]   0.00-10.04  sec  1.07 GBytes   917 Mbits/sec                  receiver
    -----------------------------------------------------------
    Server listening on 5201
    -----------------------------------------------------------

NanoPi NEO/NEO2

Créer une image système

  • Avec mes fichiers de config : https://github.com/bz31/NanoPi_NEO-NEO2_Buildroot et sur un ordinateur Linux (Debian Stretch) :
    # apt-get install libncurses-dev build-essential gettext-base
    
    $ git clone https://github.com/bz31/NanoPi_NEO-NEO2_Buildroot.git br
    $ cd br
    $ git clone -b 2019.02.x --single-branch git://git.buildroot.net/buildroot buildroot-2019.02.x
      
    $ mkdir nanopineo2-output  (mkdir nanopineo-output)
    $ cd nanopineo2-output     (cd nanopineo-output)
    $ make O=$PWD -C ../buildroot-2019.02.x defconfig BR2_DEFCONFIG=../configs/nanopi-neo2_buildroot-2019.02.x_linux-4.19.x_defconfig
     (make O=$PWD -C ../buildroot-2019.02.x defconfig BR2_DEFCONFIG=../configs/nanopi-neo_buildroot-2019.02.x_linux-4.19.x_defconfig)
    [$ make busybox-menuconfig] (dans "Linux System Utilities", sélectionner"taskset" et éventuellement simplifier un peu. Copier "build/busybox-1.29.3/.config" vers "../configs/busybox.config") 
    [$ make menuconfig]
    [$ make savedefconfig]
    [$ make linux-menuconfig]
    $ make
  • Note :
    • L'organisation de ces fichiers :
      $ tree -d -L 1 br/
      br/
      ├── board  <-- mes configs pour la création de l'image et patches
      ├── buildroot-2019.02.x  <-- source Buildroot
      ├── configs  <-- mes "defconfig" pour Buildroot (sauvegardées)
      ├── dl  <-- les packages téléchargés par Buildroot pendant la compilation, conservés pour accélérer une compilation ultérieure
      ├── linux-configs  <-- mes configs pour kernel
      ├── nanopineo2-output <-- "output" en externe de buildroot-2019.02.x pour ne pas modifier ce dernier
      └── nanopineo-output
    • Etape “make menuconfig” : les options modifiées/complétées par rapport à la config par défaut de Buildroot :
      Build options  --->
        (../configs/nanopi-neo2_buildroot-2019.02.x_linux-4.19.x_defconfig) Location to save buildroot config
        ($(TOPDIR)/../dl) Download dir
        ($(TOPDIR)/../board/nanopi-neo2/patches) global patch directories
      Toolchain  --->
      [Toolchain choix 1 : pour réduire grandement le temps de compilation :]
        Toolchain type (External toolchain)  --->
        *** Toolchain External Options ***
        Toolchain (Arm AArch64 2018.11)  --->
        Toolchain origin (Toolchain to be downloaded and installed) 
      [Toolchain choix 2 // choix 3] 
        Toolchain type (Buildroot toolchain)  --->
        *** Toolchain Buildroot Options ***
        C library (uClibc-ng) // C library (glibc)
        Kernel Headers (Linux 4.19.x kernel headers)
        [*] Enable WCHAR support  [si utiliser uClibc-ng]
        [*] Enable C++ support
      System configuration  --->
        (nanopi-neo2) System hostname
        (Welcome to Buildroot for the NanoPi NEO2) System banner
        /dev management (Dynamic using devtmpfs only)
        [*] Enable root login with password
        (root) Root password
        [ ] Run a getty (login prompt) after boot
        (eth0) Network interface to configure through DHCP
        ($(TOPDIR)/../board/nanopi-neo2/post-build.sh) Custom scripts to run before creating filesystem images
        (support/scripts/genimage.sh) Custom scripts to run after creating filesystem images
        (-c $(TOPDIR)/../board/nanopi-neo2/genimage.cfg) Extra arguments passed to custom scripts
      Kernel  --->
        Kernel version (Latest version (4.19))
        Kernel configuration (Using a custom (def)config file)  --->
        ($(TOPDIR)/../linux-configs/nanopi-neo2_linux-4.19.x_usb-audio.config) Configuration file path
      Target packages  --->
        -*- BusyBox
        (../configs/busybox.config) BusyBox configuration file to use?
        Audio and video applications  --->
          [*] alsa-utils
            [*]   aplay/arecord
          [*] mpd  --->
            [*]   dsd
            [*]   faad2
            [*]   ffmpeg
            [*]   flac
            [*]   mad
            [*]   curl
            [*]   alsa
            [*]   tcp sockets
          [*] squeezelite
            [*]   Enable WMA and ALAC decoding
            [*]   Enable DSD decoding
          [*] upmpdcli   (note : pas besoin si utiliser upmpdcli sur le serveur odroid-hc1)
        Hardware handling  --->
          [*] hwloc
        Interpreter languages and scripting  --->
          [*] python     (note : seulement nécessaire si installer upmpdcli)
                core python modules  --->
                  [*] xml module
                  [*] hashlib module
              External python modules  --->
                [*] python-requests
                [*] python-urllib3
        Networking applications  --->
          [*] dhcpcd  (ceci est optionnel, le choisir seulement si problème de connexion dhcp) 
          [*] dropbear
          [*] iperf3
          [*] ntp
            [ ]   ntpd
            [*]   ntpdate
          [*] shairport-sync
        System tools  --->
          [*] htop
        Text editors and viewers  --->
          [*] nano    (note : optionnel pour ceux qui n'aiment pas vi)
            [*]   optimize for size
      Filesystem images  --->
        (128M) exact size
        (0)   exact number of inodes (leave at 0 for auto calculation)
      Bootloaders  --->
        [*] U-Boot
          U-Boot Version (2018.09)  --->
        [*]   U-Boot needs pylibfdt
        [*]   Generate a U-Boot boot script
        ($(TOPDIR)/../board/nanopi-neo2/boot.cmd) U-Boot boot script source
      • Le support pour webradios dans Upmpdcli a besoin de python 2.x (et le module xml). Et le support pour Qobuz a besoin de ses modules hashlib module, python-requests et python-urllib3.
      • Le répertoire $(TOPDIR)/../board/nanopi-neo2/patches contient des patches pour certains packages.
      • Deux sources kernel au choix : * megous-linux-orange-pi-4.9 pour tester cpufreq et thermal. * Les patches pour NanoPi NEO : * sun8i-emac-thermal-cpufreq.patch (linux) * h3-Fix-PLL1-setup-to-never-use-dividers.patch (uboot) * linux-4.9.x suffit pour mon usage : * Les patches pour NanoPi NEO2 : * Driver pour ethernet : v4-01-10-ethernet-add-sun8i-emac-driver.patch, v4-04-10-ARM-dts-sun8i-h3-Add-dt-node-for-the-syscon-control-module.patch, v4-05-10-ARM-dts-sun8i-h3-add-sun8i-emac-ethernet-driver.patch * enable-sun8i-emac-on-the-nanopi-neo.patch (NanoPi NEO)
      • U-Boot pour NanoPi NEO : Selon ma lecture Voltage_regulators et DRAM, CPU_clock_speed_limit et uboot-board-sunxi-Kconfig (actuellement https://github.com/u-boot/u-boot/blob/v2018.01/arch/arm/mach-sunxi/Kconfig), uboot configure par défaut SYS_CLK_FREQ à 1008Mhz. Je la diminue à 816MHz avec un patch (Remarque : uboot configure RAM en 408Mhz CONFIG_DRAM_CLK=408). Voir cette discussion.
      • U-Boot pour NanoPi NEO2 : Avec la version v2018.01 de uboot, la fréquence CPU est configurée à 816MHz, exactement ce que je veux. Voir config SYS_CLK_FREQ. Et CONFIG_DRAM_CLK=672 qui est le défaut config DRAM_CLK, on passe à 408Mhz, Lower the default DRAM frequency of NanoPi NEO2 to 408MHz.
      • CPU Isolation :
        • La topologie du système :
          lstopo
        • Utiliser les CPU cores 0 et 1 pour le système. Isoler les deux autres cores 2 et 3 pour MPD. Pour cela, ajouter l'option isolcpus=2,3 dans boot.cmd (avant de compiler l'image), et utiliser un script /etc/init.d/S99taskset pour lancer taskset. Pour vérifier
          # cat /sys/devices/system/cpu/possible 
          0-3
          # cat /sys/devices/system/cpu/isolated 
          2-3
          # taskset -p $(pidof mpd)
          pid 128's current affinity mask: c

          Pour comprendre le mask c, voir système hexadécimal. Pour vérifier “Cpus_allowed_list”

          # cat /proc/$(pidof mpd)/status
          Name:	mpd
          Umask:	0022
          State:	S (sleeping)
          Tgid:	127
          Ngid:	0
          Pid:	127
          PPid:	1
          TracerPid:	0
          Uid:	0	0	0	0
          Gid:	0	0	0	0
          FDSize:	64
          Groups:	 
          NStgid:	127
          NSpid:	127
          NSpgid:	127
          NSsid:	127
          VmPeak:	  397824 kB
          VmSize:	  331776 kB
          VmLck:	       0 kB
          VmPin:	       0 kB
          VmHWM:	   17232 kB
          VmRSS:	   12580 kB
          RssAnon:	    3064 kB
          RssFile:	    9516 kB
          RssShmem:	       0 kB
          VmData:	   47660 kB
          VmStk:	     132 kB
          VmExe:	     548 kB
          VmLib:	   19624 kB
          VmPTE:	     140 kB
          VmSwap:	       0 kB
          CoreDumping:	0
          Threads:	5
          SigQ:	0/1956
          SigPnd:	0000000000000000
          ShdPnd:	0000000000000000
          SigBlk:	0000000000004003
          SigIgn:	0000000000001000
          SigCgt:	0000000180000000
          CapInh:	0000000000000000
          CapPrm:	0000003fffffffff
          CapEff:	0000003fffffffff
          CapBnd:	0000003fffffffff
          CapAmb:	0000000000000000
          NoNewPrivs:	0
          Seccomp:	0
          Cpus_allowed:	c
          Cpus_allowed_list:	2-3
          voluntary_ctxt_switches:	211171
          nonvoluntary_ctxt_switches:	142313

          MPD ouvre 4 threads, par exemple

          # cat /proc/$(($(pidof mpd)+4))/status
          Name:	output:Interfac
          Umask:	0022
          State:	S (sleeping)
          Tgid:	127
          Ngid:	0
          Pid:	131
          PPid:	1
          TracerPid:	0
          Uid:	0	0	0	0
          Gid:	0	0	0	0
          FDSize:	64
          Groups:	 
          NStgid:	127
          NSpid:	131
          NSpgid:	127
          NSsid:	127
          VmPeak:	  397824 kB
          VmSize:	  331776 kB
          VmLck:	       0 kB
          VmPin:	       0 kB
          VmHWM:	   17232 kB
          VmRSS:	   12580 kB
          RssAnon:	    3064 kB
          RssFile:	    9516 kB
          RssShmem:	       0 kB
          VmData:	   47660 kB
          VmStk:	     132 kB
          VmExe:	     548 kB
          VmLib:	   19624 kB
          VmPTE:	     140 kB
          VmSwap:	       0 kB
          CoreDumping:	0
          Threads:	5
          SigQ:	0/1956
          SigPnd:	0000000000000000
          ShdPnd:	0000000000000000
          SigBlk:	0000000000004003
          SigIgn:	0000000000001000
          SigCgt:	0000000180000000
          CapInh:	0000000000000000
          CapPrm:	0000003fffffffff
          CapEff:	0000003fffffffff
          CapBnd:	0000003fffffffff
          CapAmb:	0000000000000000
          NoNewPrivs:	0
          Seccomp:	0
          Cpus_allowed:	c
          Cpus_allowed_list:	      * <del>**Deux sources kernel au choix :**
                  * [[https://github.com/megous/linux/tree/orange-pi-4.9|megous-linux-orange-pi-4.9]] pour tester cpufreq et thermal.
                    * Les patches [[http://download.tuxfamily.org/bz31notes/buildroot/board/nanopi-neo/patches|pour NanoPi NEO]] :
                      * sun8i-emac-thermal-cpufreq.patch (linux)
                      * h3-Fix-PLL1-setup-to-never-use-dividers.patch (uboot)
                  * [[https://www.kernel.org/|linux-4.9.x]] suffit pour mon usage :
                    *  Les patches [[http://download.tuxfamily.org/bz31notes/buildroot/board/nanopi-neo2/patches/linux/|pour NanoPi NEO2]] :
                      * Driver pour ethernet : v4-01-10-ethernet-add-sun8i-emac-driver.patch, v4-04-10-ARM-dts-sun8i-h3-Add-dt-node-for-the-syscon-control-module.patch, v4-05-10-ARM-dts-sun8i-h3-add-sun8i-emac-ethernet-driver.patch
                      * enable-sun8i-emac-on-the-nanopi-neo.patch (NanoPi NEO)</del>2-3
          voluntary_ctxt_switches:	190
          nonvoluntary_ctxt_switches:	0

Installation et configuration

  • Copier l'image compilée sur une carte micro SD, par exemple
    # dd bs=4M if=images/sdcard.img of=/dev/sdb
    # sync
  • Optionnellement adapter les trois lignes “friendlyname, ohproductroom, radiolist” dans /etc/upmpdcli.conf. Pour utiliser Qobuz, remplir les trois options “qobuzuser, qobuzpass, qobuzformatid”.
  • Adresse MAC : Elle est variable. Optionnellement, pour fixer une adresse MAC (ifconfig en montre une) qui permet au routeur d'attribuer un IP fixe, ajouter une ligne après “iface”
    iface eth0 inet dhcp
      hwaddress ether xx:xx:xx:xx:xx:xx

    dans /etc/network/interfaces.

  • Un aperçu du système sur NanoPi NEO :
    • # cat /proc/asound/cards 
       0 [U20F1          ]: USB-Audio - USB Audio 2.0(F1)
                            Singxer USB Audio 2.0(F1) at usb-1c1d000.usb-1, high speed
    • Lecture d'un fichier 24/96 avec cpu réglé à 816MHz (le mediaserver pour Qobuz tourne aussi)
      nanopi_neo-play24-96.png Voir Real-Time Scheduling.
      # chrt -p 164
      pid 164's current scheduling policy: SCHED_FIFO
      pid 164's current scheduling priority: 50

      (Ceci est configuré dans les sources de MPD : https://github.com/MusicPlayerDaemon/MPD/blob/master/src/thread/Util.cxx )

      • Le système 64-bit sur NEO2 consomme 2 fois plus de RAM
    • # cat /etc/fstab 
      # <file system>	<mount pt>	<type>	<options>	<dump>	<pass>
      /dev/root	/		ext2	rw,noauto	0	1
      proc		/proc		proc	defaults	0	0
      devpts		/dev/pts	devpts	defaults,gid=5,mode=620,ptmxmode=0666	0	0
      tmpfs		/dev/shm	tmpfs	mode=0777	0	0
      tmpfs		/tmp		tmpfs	mode=1777	0	0
      tmpfs		/run		tmpfs	mode=0755,nosuid,nodev	0	0
      sysfs		/sys		sysfs	defaults	0	0
    • La config par défaut de tmpfs peut prendre la moitié de RAM
      # df -h
      Filesystem                Size      Used Available Use% Mounted on
      /dev/root               120.0M     43.0M     68.0M  39% /
      devtmpfs                250.4M         0    250.4M   0% /dev
      tmpfs                   250.9M         0    250.9M   0% /dev/shm
      tmpfs                   250.9M     28.0K    250.9M   0% /tmp
      tmpfs                   250.9M     32.0K    250.9M   0% /run
    • Buildroot évite l'accès à la carte microSD, c'est un très bon point
      # ls -l /var/
      total 2
      lrwxrwxrwx    1 root     root             6 Mar  4 21:28 cache -> ../tmp
      drwxr-xr-x    3 root     root          1024 Mar 24 15:03 lib
      lrwxrwxrwx    1 root     root             6 Mar  4 21:28 lock -> ../tmp
      lrwxrwxrwx    1 root     root             6 Mar  4 21:28 log -> ../tmp
      lrwxrwxrwx    1 root     root             6 Mar  4 21:28 run -> ../run
      lrwxrwxrwx    1 root     root             6 Mar  4 21:28 spool -> ../tmp
      lrwxrwxrwx    1 root     root             6 Mar  4 21:28 tmp -> ../tmp
      drwxr-xr-x    2 www-data www-data      1024 Mar 24 17:37 www
    • Température (avec megous-linux-orange-pi source) (température ambiant ~ 20°C) rapportée par le système (pendant la lecture de fichiers 24/96)
      # cat /sys/class/thermal/thermal_zone0/temp 
      33673
    • CPU (avec megous-linux-orange-pi source):
      # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 
      userspace
      # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq 
      8160000
      # cat /sys/devices/system/cpu/cpufreq/policy0/stats/time_in_state 
      120000 0
      240000 0
      312000 0
      480000 0
      624000 0
      816000 450744
      1008000 0
      1200000 0

Raspberry Pi 3

Créer une image système

  • On change de méthode pour voir la procédure “normale” de compilation : Sur un ordinateur Linux, installer d'abord les packages libncurses-dev build-essential gettext-base. Ensuite compiler et installer la dernière version stable, par exemple
    $ wget https://buildroot.org/downloads/buildroot-2019.05.tar.gz
    $ tar zxvf buildroot-2019.05.tar.gz
    $ cd buildroot-2019.05
    $ make raspberrypi3_64_defconfig
    [Ou bien utiliser une autre config : ]
    [$ make defconfig BR2_DEFCONFIG=(chemin jusqu'à un fichier de config)]
    $ make busybox-menuconfig (Pour isoler deux Cores CPU pour MPD/Squeezelite, on a besoin de "taskset" dans "Linux System Utilities")
    $ make menuconfig    ([1] voir plus bas pour les options choisies/modifiées)
    [$ make savedefconfig] (sauvegarder ma config, elle remplece "configs/raspberrypi3_64_defconfig") 
    [$ make linux-menuconfig] (pour modifier la config kernel) 
    $ make
    # dd if=output/images/sdcard.img of=/dev/*** (adapter le nom ***) (ou bien utiliser Etcher)
    • [1] Dans cette étape, les options modifiées/complétées :
      Build options  --->
        $(TOPDIR)/../configs/raspberrypi3_64_defconfig
        $(TOPDIR)/../dl
      Toolchain  --->
        Toolchain type (External toolchain)  --->
        *** Toolchain External Options ***
        Toolchain (Arm AArch64 2018.11)  --->
      System configuration
        /dev management (Dynamic using devtmpfs + mdev)
        [*] Enable root login with password
        (root) Root password
        [ ] Run a getty (login prompt) after boot  ----
      Target packages
        Audio and video applications  --->
          [*] alsa-utils
          [*] mpd  --->
            [*]   faad2
            [*]   ffmpeg
            [*]   flac
            [*]   mad
            [*]   curl
            [*]   alsa
            [*]   tcp sockets
          [*] squeezelite
            [ ]   Enable WMA and ALAC decoding
          [*] upmpdcli
        Hardware handling  --->
          [*] hwloc
        Interpreter languages and scripting  --->
          [*] python
                core python modules  --->
                  [*] xml module
                  [*] hashlib module
              External python modules  --->
                [*] python-requests
                [*] python-urllib3
        Networking applications  --->
          [*] dropbear
          [*] iperf3
          [*] ntp
            [ ]   ntpd
            [*]   ntpdate
          [*] shairport-sync
        System tools  --->
          [*] htop
        Text editors and viewers  --->
          [*] nano
            [*]   optimize for size
      Filesystem images  --->
        (256M) exact size
      • Note : Le support pour webradios dans Upmpdcli a besoin de python 2.x (et le module xml). Et le support pour Qobuz a besoin de ses modules hashlib module, python-requests et python-urllib3.
    • WIFI : Si on veut utiliser le wifi, les options supplémentaires suivantes sont à modifier/compléter :
      Target packages
        Hardware handling  --->
          Firmware  --->
            [*] linux-firmware
                WiFi firmware  --->
                  [*] Broadcom BRCM bcm43xxx
        Networking applications  --->
          [*] crda
          [*] wireless tools
          [*] wpa_supplicant
            [*]   Enable nl80211 support
            [*]   Install wpa_cli binary
            [*]   Install wpa_client shared library
            [*]   Install wpa_passphrase binary

Configuration

  • Wifi : Deux façons de configurer le WiFi. Soit avec une connexion Ethernet via ssh, soit faire les modifications directement sur la carte SD sans avoir besoin de passer par Ethernet.
    # cd /lib/firmware/brcm/
    # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/brcmfmac43430-sdio.txt
    
    # cd /etc/network/
    # mv interfaces interfaces.orig
    # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/interfaces
    
    # cd /etc/
    # mv wpa_supplicant.conf wpa_supplicant.conf.orig
    # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/wpa_supplicant.conf
    # vi wpa_supplicant.conf (mettre ssid/passwd pour le wifi)
  • Audio player : Plusieurs choix possibles
    • Upmpdcli/MPD :
      # cd /etc/
      # mv mpd.conf mpd.conf.orig
      # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/mpd.conf
      # /etc/init.d/S95mpd restart
      
      # mv upmpdcli.conf upmpdcli.conf.orig
      # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/upmpdcli_radiolist
      # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/upmpdcli.conf
      # /etc/init.d/S99upmpdcli restart
    • Squeezelite : installé, mais non utilisé. un exemple de script de démarrage ici
    • Uniquement pour shairport-sync :
      # cat /proc/asound/cards
       0 [U20X1          ]: USB-Audio - USB Audio 2.0(X1)
                            Singxer USB Audio 2.0(X1) at usb-3f980000.usb-1.3, high speed
                           
      # cd /etc/
      # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/asound.conf
      # /etc/init.d/S99shairport-sync restart
      • Si on ne l'utilise pas, on peut le désactiver
        # mv /etc/init.d/S99shairport-sync /root/
    • Roon Bridge : installation
      # cd /opt/
      # wget http://download.roonlabs.com/builds/RoonBridge_linuxarmv8.tar.bz2
      # bunzip2 RoonBridge_linuxarmv8.tar.bz2
      # tar xvf RoonBridge_linuxarmv8.tar
      # rm RoonBridge_linuxarmv8.tar
      • Un script de démarrage si on veut l'utiliser.
        # cd /etc/init.d/
        # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/S95roonbridge
        # chmod +x S95roonbridge
        # ./S95roonbridge start
  • Date et heure : Utiliser ntpdate pour régler la date et l'heure au démarrage
    # cd /etc/init.d/
    # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/S45ntpdate
    # chmod +x S45ntpdate
  • CPU Isolation : Voir plus haut NanoPi NEO2 pour explication.
    # mount /dev/mmcblk0p1 /mnt
    # vi /mnt/cmdline.txt
    [modifier la ligne en :  root=/dev/mmcblk0p2 rootwait isolcpus=2,3 ]
    # cd /etc/init.d/
    # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/S99taskset
    # chmod +x S99taskset
    # reboot

    Vérification

    # cat /proc/$(pidof mpd)/status
    Name:	mpd
    ...
    Cpus_allowed:	c
    Cpus_allowed_list:	2-3
  • Fréquence CPU :
    # cd /etc/init.d/
    # wget http://download.tuxfamily.org/bz31notes/buildroot/board/raspberrypi3/S60cpufreq
    # chmod +x S60cpufreq
    # reboot
    
    # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
    600000 1200000 
    # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq
    600000
    # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
    ondemand
buildroot.txt · Dernière modification: 2019/11/04 20:12 par bz31