🛠 Override du device tree : OTG en gadget, UART2, et l'Euler bus oublié
Objectifs
Le device tree mainline de la PINE A64 (sun50i-a64-pine64.dts, compatible pine64,pine64) fait des choix pragmatiques que l'on peut contester : le port OTG est figé en hôte (usb_otg dr_mode = "host"), l'UART2 du connecteur Pi-2 est désactivé, et le bus Euler 2×17 — la vraie originalité de la carte, avec UARTs supplémentaires, SPI, SPDIF et CAN — n'est exploité par aucune image par défaut. Ce tuto avancé : comprendre la structure du DTS, écrire un overlay, et réclamer à son compte les périphériques silencieux de la carte.
Matériel
- 1 × PINE A64/A64+ sous Armbian mainline (
apt install device-tree-compiler - Câble micro-USB vers un PC hôte (test gadget)
- Le PDF officiel « Pine A64 Pin Assignment » sous la main pour le pinnage Pi-2/Euler
- Éventuellement le module Wi-Fi/BT RTL8723BS sur son connecteur SDIO 3.0
Code complet
/* pine64-otg-peripheral.dts — overlay : rendre l'OTG périphérique */
/dts-v1/;
/plugin/;
&usb_otg {
dr_mode = "peripheral"; /* le mainline impose "host" */
status = "okay";
};
&uart2 {
status = "okay"; /* PB0/PB1 = broches UART2 du connecteur Pi-2 */
};
# Compiler l'overlay :
dtc -@ -I dts -O dtb -o pine64-otg-peripheral.dtbo pine64-otg-peripheral.dts
sudo cp pine64-otg-peripheral.dtbo /boot/dtb/allwinner/overlay/
# Déclarer l'overlay (Armbian : /boot/armbianEnv.txt, ligne : overlays=...)
# reboot, puis vérifier côté PC hôte : lsusb voit apparaître la carte (gadget).
# Inventaire des contrôleurs présents mais désactivés :
ls /sys/firmware/devicetree/base/soc/ | head -40
grep -rl '"disabled"' /sys/firmware/devicetree/base/ 2>/dev/null | head
# Les banques GPIO exposées (PB..PH) et leur numérotation bank*32+pin :
# PD16 -> 112 PH2 -> 226 (pinctrl-sun50i-a64.c)
gpioinfo gpiochip0 | grep -E 'PD|PH'
Vérification attendue
Après reboot avec l'overlay, le port micro-USB OTG est vu comme périphérique depuis le PC hôte (lsusb côté PC, dmesg | grep -i gadget côté carte) — preuve que le dr_mode du DTS mainline était bien le verrou. L'UART2 activé apparaît (ls /dev/ttyS* ou ttySN selon l'ordre d'numérotation) sur les broches PB0/PB1 du connecteur Pi-2. Pour l'Euler bus (2×17 broches : UARTs supplémentaires, SPI, SPDIF, CAN), le chemin est le même : activer les contrôleurs concernés dans un overlay et câbler selon le PDF officiel de pinnage — la carte offre plus de connecteurs que son image par défaut n'en active.
Erreurs fréquentes
- Éditer le .dtb compilé au lieu d'un overlay : les images Armbian supportent les overlays (
/boot/armbianEnv.txt) — un .dtb édité à la main se fait écraser à la prochaine mise à jour du paquet noyau. - Oublier que changer le mode OTG casse le boot par FEL une fois le noyau lancé : le FEL vit dans le BROM avant le noyau, mais un port en mode gadget surprend quand on veut y brancher une clé USB — documenter le retour à l'état mainline.
- Pinner l'UART2 « comme sur un RPi » : PB0/PB1 correspondent aux broches physiques 11/12 du connecteur Pi-2 (commentaire « On Pi-2 connector » du DTS) — pas aux broches UART du Raspberry Pi. >
- Activer un contrôleur dont les broches sont en conflit : les groupes pinctrl se partagent (PB, PC, PD, PE, PF, PG, PH) — un CAN et un UART peuvent viser la même broche ; vérifier le PDF de pinnage avant.
- Attendre le Bluetooth du RTL8723BS sans précaution : le support BT mainline du module SDIO est largement rapporté comme chancelant. >
- Confondre offsets GPIO et broches physiques : on parle en offsets bank×32+pin (PH2 = 226) dans les outils, jamais en rang de connecteur.
Autres tutoriels pour cette carte
- Premier boot d'Armbian sur la PINE A64 (microSD, console série, rootfs)
- PINE A64 ou PINE A64+ ? Le pièg du réseau gigabit dès le premier regard
- Faire clignoter une LED avec libgpiod (numérotation GPIO du A64 : PB0 = 32)
- Benchmark Ethernet iperf3 : mesurer le piège 10/100 vs gigabit
- Lire un capteur I²C (BME280) sur le bus i2c-1 du connecteur Pi-2
- Un serveur maison qui consomme 2,5 W : Docker léger sur la PINE A64
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash