Programmer sur microcontrôleur CH55x avec SDCC sous Linux

Mes notes succinctes à ce sujet :

Installation

Récupérer la bibliothèque ch554_sdcc : https://github.com/Blinkinlabs/ch554_sdcc (copie ci dessous si disparition du repo)

Récupérer l’outil de programmation ch552_tool : https://github.com/MarsTechHAN/ch552tool (copie ci dessous si disparition du repo)

Installer sdcc

$ apt-get install sdcc

Copier un exemple et l’utiliser comme base (le Makefile pointe vers un Makefile.include qui contient le nécessaire pour compiler vers le MCU cible).

Flasher le code

Le MCU contient un bootloader USB, activé en connectant D+ au +5V à travers une résistance de 10kohms à la mise sous tension.

Utilisation de ch552tool :

$ sudo python3 ch55xtool/ch55xtool.py -f FIRMWARE.bin -r

Execution en root nécessaire. Crash après la programmation si l’option « -r » (reset avec flash) est utilisée, à cause de la déconnexion du device cible.

Acer Aspire R13 : Faire fonctionner l’entrée micro jack

Ajouter la ligne suivante à la fin du fichier /etc/modprobe.d/alsa-base.conf

options snd-hda-intel model=auto,dell-headset-multi

Réparation d’un « boitier à chaine » STILE RF

Le « boitier à chaine » STILE RF est un appareil permettant l’ouverture / fermeture d’une fenêtre battante à l’aide d’une télécommande.

Photo du STILE RF
Boitier à chaine STILE RF

L’exemplaire en ma possession refuse totalement de fonctionner, et ne donne aucun signe de vie. Voyons si il est possible de le réparer.

Lire la suite

Kit E-Paper pour Beolink 5000

Ma Beolink 5000, après le remplacement de son écran défaillant par un afficheur E-Paper

Produite entre 1991 et 1996 par le fabricant danois Bang & Olufsen, la Beolink 5000 est une télécommande permettant de contrôler les différents appareils de la marque, ainsi que de monitorer leur état grâce à l’écran LCD translucide présent à son extrémité. Ce modèle représentait en son temps l’état de l’art dans le domaine des télécommandes multimédia.

Malheureusement, bon nombre de ces télécommandes ont maintenant 30 ans d’age, et si certains composants vieillissants sont facilement remplacés ( notamment les condensateurs électrochimiques assurant la stabilité de la communication infrarouge ), les adhésifs chargés de maintenir en place l’écran et sa nappe montrent eux aussi des signes de faiblesse, avec pour conséquence un détachement partiel ou complet de la nappe de l’écran, ce dernier perdant de ce fait ses capacités d’affichage. La grande majorité des télécommandes encore existantes sont affectées par cette maladie. Certaines fonctions qui requièrent un écran fonctionnel, telles que le paramétrage de la télécommande, ou des équipements associés, deviennent alors inutilisables.

L’exemplaire en ma possession présentait un état encore plus dramatique, l’écran complètement séparé de la télécommande, la nappe le raccordant à son électronique de contrôle s’étant déchirée sous son poids. J’ai décidé de consacré une partie de mon temps libre de l’année dernière à la conception d’un remplacement.

Lire la suite

MacPro 1,1 : Installer Linux Mint avec amorçage EFI

J’avais déjà il y a quelques temps publié un article décrivant comment installer Linux sur un MacPro 1.1 sans carte graphique ni EFI. Cet article proposait une méthode d’installation utilisant le mode de démarrage en mode « compatibilité BIOS », qui a pour principaux inconvénient de nécessiter un passage par un CD d’amorçage pour l’installation, et, une fois l’installation terminée, implique des temps de démarrage de plus d’une minute. Ayant depuis mis la main sur une carte graphique avec le firmware Apple adéquat, cet article décrit l’installation de Linux Mint avec amorçage EFI.

La méthode décrite dans cet article nécessite une carte graphique Apple fonctionnelle afin de pouvoir afficher le menu d’amorçage !

Création de la clé USB d’installation

Utiliser GParted pour créer une nouvelle table de partition GPT sur la clé USB.

Créer 2 partitions sur la clé USB :

  • Une partition « EFI », de type FAT32, de taille 200Mo, avec le fanion « boot »
  • Une partition de type ext4 occupant le reste de la clé.

Copier l’intégralité des fichiers de l’ISO d’installation sur la partition ext4.

Sur la partition EFI, créer le dossier /efi/boot, et y copier le fichier bootia32.efi. (source).

Créer également le dossier /boot/grub, et y copier les fichiers vmlinuz et initrd.lz obtenus dans le dossier casper de l’ISO d’installation. Y copier également le fichier grub.cfg obtenu dans /boot/grub.

Editer le fichier grub.cfg, y insérer le contenu suivant ( avant la première entrée de menu ) :

menuentry "Install Mint MacPro" --class linuxmint {
linux /boot/grub/vmlinuz live-media-path=/casper/ ignore_uuid root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX boot=casper nosplash noefi --
initrd /boot/grub/initrd.lz
}

en remplaçant PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX par l’identifiant de la partition où l’on a copié les fichiers de l’ISO d’installation, obtenu à l’aide de la commande blkid.

Démarrage sur la clé USB d’installation

Immédiatement après avoir appuyé sur le bouton de mise sous tension du MacPro, maintenir appuyer la touche Alt du clavier, jusqu’à l’apparition d’un menu de sélection du périphérique d’amorçage. (Cela devrait prendre environ 5 secondes après le gong sonore de démarrage ) .

Le menu de sélection du périphérique d’amorçage

Appuyer une fois sur la flèche de droite pour sélectionner le périphérique USB EFI Bootpuis appuyer sur entrée.

Le lanceur grub démarre. Appuyer sur entrée pour procéder à la sélection de la première entrée, intitulée Install Mint MacPro.

Le démarrage de l’image d’installation prend jusqu’à 5 minutes, sans que rien ne s’affiche à l’écran, cela semble normal, et est vraisemblablement due à la faible vitesse d’accès USB de l’implémentation EFI sur ces machines.

Procéder à l’installation de manière usuelle.

A la fin de l’installation, ne pas redémarrer !

Procéder au montage de la partition du disque sur lequel l’installation a été effectuée, et éditer le fichier /boot/grub/grub.cfg, et rechercher la ligne contenant les arguments noyaux pour le démarrage par défaut (Il doit s’agit de la 1ere ligne commençant par la commande linux). Y ajouter l’arguement noefisi il n’y figure pas. ( Cette modification est nécessaire pour permettre un bon démarrage du noyau ).

linux	/boot/vmlinuz-5.8.0-48-generic root=UUID=dabdd8d7-32f0-46a3-9c20-ba8cf5c342aa ro quiet splash noefi

Une fois la modification effectuée (et enregistrée), redémarrer la machine.

Après l’installation

Editer le fichier /etc/default/grub pour y faire figurer la modification précédemment effectuée :

GRUB_CMDLINE_LINUX="noefi"

Si l’on souhaite par la suite utiliser une carte graphique ne possédant pas le firmware Apple, y apporter également la modification suivante, sans laquelle ma machine (dotée d’une carte graphique AMD R9 380) se fige à l’extinction lorsque plusieurs écrans y sont raccordés.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nosplash"

Regénérer les fichiers de configuration de grub incorporant ces modifications, à l’aide de la commande suivante :

# update-grub

Conclusion

La machine démarre maintenant en 40 secondes montre en main, ce qui représente une nette amélioration du temps de démarrage précédemment obtenu avec la compatibilité BIOS, qui était supérieure a la minute, sans présenter d’autre inconvénient que de nécessiter une carte graphique Apple pour procéder à l’installation. (j’ai tenté par la suite de reproduire la procédure « à l’aveugle », sans résultat).

Il ne reste plus qu’à baillonner l’interruption gpe11, et optimiser le refroidissement de la carte graphique.

Cependant, l’argument noefi étant nécessaire au bon démarrage du noyau, mon ambition de pouvoir enfin editer la variable EFI assurant le réglage du volume du gong de démarrage est tombée à l’eau. Je me contenterai du temps de démarrage raccourci !

Sources :

https://forums.linuxmint.com/viewtopic.php?t=333755

https://help.ubuntu.com/community/MacPro

Notes :

Contrairement à l’installation effectuée en mode BIOS, le paramètre noyaux amdgpu.dc=0 n’est plus nécessaire pour obtenir un affichage avec ma carte graphique AMD.

Pour résoudre le problème rencontré à l’extinction de la machine, les arguments noyau suivant ont été essayés, sans résultat : amdgpu.runpm=0, reboot=pci, acpi=noirq et irq=off

Linux Mint : Installation avec BTRFS + Chiffrement Disque

Cet article décrit la procédure pour installer Linux Mint avec un système de fichier BTRFS (permettant notamment de bénéficier de « snapshots » offrants une possibilité de restaurer le système à un état antérieur en cas de problème), tout en activant le chiffrement complet du disque dur.

L’installation débute comme une installation standard, puis :

1. A l’écran « Type d’installation« , choisir « Autre chose » :

2. Si nécessaire, créer une table de partition en cliquant sur le bouton « Nouvelle table de partition ». Attention, cette opération détruira la table de partition courante, et provoquera la perte des partitions actuellement sur le disque !

3. Créer une partition de type « Partition Système EFI », de taille 1024 Mo (c’est un peu excessif, mais cela évite de devoir la redimensionner plus tard). Pour cela, sélectionner l' »espace libre » en fin de disque, et cliquer sur le bouton « + ».

4. Créer une partition de type « Système de fichier ext2 », avec point de montage « /boot« , également de taille 1024 Mo.

5. Créer une partition de type « volume physique pour le chiffrement », occupant tout l’espace restant. Saisir la clé de sécurité qui sera demandée au démarrage de l’ordinateur pour déchiffrer le disque dur.

6. Un disque virtuel, contenant une seule partition de type ext4 , apparait alors, sous le nom /dev/mapper/xxx_crypt.

7. Choisir Btrfs comme système de fichier à la place de ext4, avec le point de montage « / ». Pour cela, sélectionner la partition, puis cliquer sur le bouton « modifier ».

8. Les différentes partition de votre système doivent correspondre à la capture d’écran ci-dessous. Cliquer alors sur « installer maintenant », et procéder à la suite de l’installation. Dans le cas d’une erreur, il est plus sage de redémarrer et de recommencer l’installation, l’installateur pouvant avoir un comportement erratique si l’on recommence l’installation après avoir déjà créé une partition chiffrée.

9. C’est terminé ! A chaque démarrage, l’écran suivant demandera le mot de passe permettant le déchiffrement du disque dur :

Cette procédure laisse par contre l’utilisateur sans espace d’échange (swap) configuré. Je n’ai pas encore expérimenté sur le sujet, mais la mise en place d’un fichier de swap (swapfile) sur une partition btrfs est assez bien documentée ( par exemple, ou encore ) , je me pencherai sans doute dessus à l’avenir.

Compiler Marlin en ligne de commande

Cet article résume le process nécessaire pour compiler Marlin en ligne de commande sous Linux avec PlatformIO Core.

1. Installer PlatformIO Core.

2. Ajouter PlatformIO au PATH local :

export PATH=$PATH:~/.platformio/penv/bin

3. Récupérer le code source de Marlin.

4. Si on récupère le code source officiel (et pas une version déjà customisée pour une machine spécifique ), récupérer les fichiers de configuration dans le dépot git MarlinFirmware/Configurations, et copier les fichiers de configuration adéquat dans le dossier Marlin / Marlin /

5. Se placer dans le dossier Marlin ( contenant platformio.ini ).

6. Identifier la valeur de MOTHERBOARD, en gras dans l’exemple ci dessous, à partir du fichier Configuration.h. ( pour une carte BTT SKR E3 MINI V2.0 )

$ cat Marlin/Configuration.h | grep MOTHERBOARD
#ifndef MOTHERBOARD
#define MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V2_0
If not defined the default pin for the selected MOTHERBOAR

7. Identifier les environnements PlatformIO compatibles à partir du fichier pins.h ( attention à supprimer le BOARD dans la valeur de MOTHERBOARD ):

$ cat Marlin/src/pins/pins.h | grep BTT_SKR_MINI_E3_V2_0
elif MB(BTT_SKR_MINI_E3_V2_0)
#include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h" // STM32F1
env:STM32F103RC_btt env:STM32F103RC_btt_512K
env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB

8. Compiler avec l’environnement adapté ( dans mon cas gestion de l’USB mais pas 512K de ROM ) :

$ platformio run -e STM32F103RC_btt_USB

9. Récupérer le fichier firmware.bin à l’emplacement suivant :

.pio/build/STM32F103RC_btt_USB/firmware.bin

10. Le copier sur une carte SD ( sans altérer son nom ), et la mise à jour s’effectue à la mise sous tension de l’imprimante. Le fichier sera alors renommé en FIRMWARE (sans extension).

11. Si présence d’un fichier EEPROM.DAT sur la carte SD lors de la mise à jour firmware, le contenu de l’EEPROM (calibration, réglages) sera écrasé.

ABetterXinputCalibrator : un outil pour faciliter la calibration d’écran tactiles sous X11

Il s’agit d’un petit logiciel que j’ai développé sous Qt, facilitant la calibration d’un écran tactile / tablette graphique, notamment quand l’écran en question est un écran secondaire

Screenshot :

https://gitlab.com/Pilatomic/abetterxinputcalibrator/-/raw/master/doc/Screenshot.png

Dépot gitlab :

https://gitlab.com/Pilatomic/abetterxinputcalibrator

MacPro 1,1 : Optimiser le refroidissement d’un GPU AMD sous Linux

Sur ces machines, la ventilation est réalisée en 3 canaux séparés

  • Canal 1 : CPU & RAM : 2 ventilateurs, 1 en façade et 1 à l’arrière en extraction, dont la vitesse est régulée en fonction de la température CPU
  • Canal 2 : GPU et cartes d’extensions : 1 ventilateur en façade
  • Canal 3 : Alimentation & lecteurs optiques.

Sur mon système, si les canaux 1 et 3 sont gérés correctement par le SMC ( le chip chargé de la gestion du système ), le ventilateur du canal 2 a sa vitesse fixe à 500 tr/min. J’imagine que la cause est à trouver dans mon utilisation peut habituelle de cette machine : un GPU non officiel (AMD R9 380) sous un OS non officiel (Linux).

Pour pallier à ce problème, et effectivement piloter ce ventilateur en fonction de la demande en refroidissement du GPU, j’ai écrit un script bash, qui contrôle ce ventilateur en fonction de la commande PWM du ventilateur du GPU ( attention, à ma connaissance cette information n’est disponible que sur le pilote graphique libre AMD ) :

$ cat /opt/IO_fan_control.sh
#!/bin/bash

BASE_FAN="/sys/devices/platform/applesmc.768/fan2"
GPU_PWM_FILE="/sys/class/drm/card0/device/hwmon/hwmon0/pwm1"
GPU_PWM_MIN=75
GPU_PWM_MAX=250

function setfancontrolmanual()
{
        echo $1 > $BASE_FAN"_manual"
        if (( $? == 0 ))
        then
                if (( $1 == 0 ))
        then
                        echo "Returning fan control to SMC"
                else
                        echo "Taking control of fan from SMC"
                fi
        else
                if (( $1 == 0 ))
        then
                        echo "Failed to return fan control to SMC"
                        exit 1
                else
                        echo "Failed to take control of fan from SMC"
                        exit 1
                fi
        fi
}

function abort()
{
        setfancontrolmanual 0
        exit
}

function checkforroot()
{
        if(( $(id -u)  != 0 ));
        then
                echo "Need to be run as root";
                exit
        fi
}

checkforroot
if [ "$1" == "release" ]; then
        setfancontrolmanual 0
        exit
fi

trap abort SIGINT
setfancontrolmanual 1

while true
do
        INPUT_RPM=$(<$BASE_FAN'_input')
        MAX_RPM=$(<$BASE_FAN'_max')
        MIN_RPM=$(<$BASE_FAN'_min')
        GPU_PWM=$(<$GPU_PWM_FILE)

        #compute MAC fan RPM from GPU fan PWM
        if (( $GPU_PWM >= $GPU_PWM_MAX )); then
                TARGET_RPM=$MAX_RPM
        elif (( $GPU_PWM <= $GPU_PWM_MIN )); then
                TARGET_RPM=$MIN_RPM
        else
                TARGET_RPM=$(( ($MAX_RPM - $MIN_RPM) * ( $GPU_PWM - $GPU_PWM_MIN ) / ($GPU_PWM_MAX - $GPU_PWM_MIN) + $MIN_RPM))
        fi

        #clamp value between MIN_RPM and MAX_RPM
        if (( $TARGET_RPM < $MIN_RPM )); then
                OUTPUT_RPM=$MIN_RPM
        elif (( $TARGET_RPM > $MAX_RPM )); then
                OUTPUT_RPM=$MAX_RPM
        else
                OUTPUT_RPM=$TARGET_RPM
        fi

        echo $OUTPUT_RPM > $BASE_FAN'_output'

        echo 'INPUT_RPM: '$INPUT_RPM' MAX_RPM: '$MAX_RPM' MIN_RPM: '$MIN_RPM' GPU_PWM: '$GPU_PWM' TARGET_RPM: '$TARGET_RPM' OUTPUT_RPM: '$OUTPUT_RPM

        sleep 2
done

Les variables GPU_PWM_MIN et GPU_PWM_MAX correspondent respectivement aux 2 valeur PWM à laquelle le ventilateur du canal 2 sera commandé à sa vitesse minimum, et celle où il sera commandé à sa vitesse maximum.

Ce script est exécuté automatiquement au démarrage grâce à systemd

$ cat /etc/systemd/system/system_mac-io-fan-control.service
[Unit]
Description=MacPro IO fan control from GPU temperature
After=systemd-udevd.service

[Service]
ExecStart=/opt/IO_fan_control.sh
Restart=always
StartLimitIntervalSec=10
ExecStopPost=/opt/IO_fan_control.sh release

[Install]
WantedBy=multi-user.target

Il ne reste plus qu’à activer l’unité systemd créé :

$ sudo systemctl enable system_mac-io-fan-control.service
$ sudo systemctl start system_mac-io-fan-control.service

La vitesse du ventilateur du canal 2 est maintenant asservie à celle du GPU, facilitant le refroidissement de ce dernier, et réduisant le niveau sonore de la machine.

MacPro 1,1 : Linux trucs & astuces

Installation réalisée sous Linux Mint 20 avec un kernel 5.4

Boot avec PlopKexec.

Une distro 64bit fonctionne parfaitement. Se référer à mon précédent article https://pila.fr/wordpress/?p=1078

Obtenir un affichage avec un GPU AMD

Les cartes graphiques AMD exploitant le nouveau code d’affichage « DC » provoquent un kernel panic. Il faut ajouter la commande suivante dans le fichier /etc/default/grub pour utiliser l’ancian code :

amdgpu.dc = 0

Ne pas oublier d’appliquer les changements :

$ sudo update-grub 

Bâillonner l’interruption gpe11

Sur cette machine, le taux d’occupation CPU restait important même au repos. Il s’avère que l’IRQ 9 est déclenchée à une fréquence très élevée (indiqué par le compteur du fichier /proc/interrupts), et monopolise à elle seule un des coeurs CPU. Les compteurs lisibles dans les différents fichiers à l’emplacement /sys/firmware/acpi/interrupts nous permettent de déterminer la source de cette IRQ : gpe11. Un service systemd nous permet de la désactiver, en créant le fichier /etc/systemd/system/disableGPE11.service avec le contenu suivant :

[Unit]
Description=Disables GPE 11 going crazy on this MacPro
[Service]
ExecStart=/bin/bash -c 'echo "disable" > /sys/firmware/acpi/interrupts/gpe11'
[Install]
WantedBy=multi-user.target

Ce service est rendu actif par la commande suivante :

$ sudo systemctl enable disableGPE11.service