Catégorie : Hardware

Lenovo

L’audio ne fonctionnait à nouveau plus correctement , malgré shutdown , reboot , et plus d’une minute avec bouton power enfoncé .

sudo /usr/local/bin//speaker.sh
[sudo] Mot de passe de stefan :  
Configuring amp at address 0x38 on i2c-17
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Done configuring amp at 0x38
Configuring amp at address 0x3e on i2c-17
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Done configuring amp at 0x3e

~ 6s
❯ cat  /usr/local/bin//speaker.sh
#!/bin/bash

i2c_bus=17
amp_addresses=(0x38 0x3e)

for i2c_addr in "${amp_addresses[@]}"; do
 echo "Configuring amp at address $i2c_addr on i2c-$i2c_bus"

 i2cset -f -y $i2c_bus $i2c_addr 0x00 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x7f 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x01 0x01
 i2cset -f -y $i2c_bus $i2c_addr 0x0e 0xc4
 i2cset -f -y $i2c_bus $i2c_addr 0x0f 0x40
 i2cset -f -y $i2c_bus $i2c_addr 0x5c 0xd9
 i2cset -f -y $i2c_bus $i2c_addr 0x60 0x10
 i2cset -f -y $i2c_bus $i2c_addr 0x0a 0x2e
 i2cset -f -y $i2c_bus $i2c_addr 0x0d 0x01
 i2cset -f -y $i2c_bus $i2c_addr 0x16 0x40

 i2cset -f -y $i2c_bus $i2c_addr 0x00 0x01
 i2cset -f -y $i2c_bus $i2c_addr 0x17 0xc8

 i2cset -f -y $i2c_bus $i2c_addr 0x00 0x04
 i2cset -f -y $i2c_bus $i2c_addr 0x30 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x31 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x32 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x33 0x01

 i2cset -f -y $i2c_bus $i2c_addr 0x00 0x08
 i2cset -f -y $i2c_bus $i2c_addr 0x18 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x19 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x1a 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x1b 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x28 0x40
 i2cset -f -y $i2c_bus $i2c_addr 0x29 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x2a 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x2b 0x00

 i2cset -f -y $i2c_bus $i2c_addr 0x00 0x0a
 i2cset -f -y $i2c_bus $i2c_addr 0x48 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x49 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x4a 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x4b 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x58 0x40
 i2cset -f -y $i2c_bus $i2c_addr 0x59 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x5a 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x5b 0x00

 i2cset -f -y $i2c_bus $i2c_addr 0x00 0x00
 i2cset -f -y $i2c_bus $i2c_addr 0x02 0x00

 echo "Done configuring amp at $i2c_addr"
done
lspci -nn | grep -i audio
00:1f.3 Multimedia audio controller [0401]: Intel Corporation Meteor Lake-P HD Audio Controller [8086:7e28] (rev 20)

~
❯ lspci -nnk | grep -iA 3 0403


La déconnexion de la batterie a permis une réinitialisation profonde du contrôleur intégré (EC) et des circuits de gestion d’alimentation de l’ordinateur portable. Sur des modèles comme le Lenovo Yoga Pro 9i, les amplificateurs audio (tels que TAS2781 ou similaires, intégrés au codec ALC287) peuvent entrer dans un état « bloqué » ou de basse puissance en raison de bogues firmware, d’interactions avec le noyau, ou de problèmes de gestion d’alimentation sous Linux. Cet état empêche les écritures I2C réussies (entraînant les erreurs « Write failed » dans le script), même si les périphériques sont physiquement présents. La réinitialisation efface cet état, restaurant une communication normale sans nécessairement modifier l’énumération des périphériques dans les outils comme lspci ou i2cdetect (qui sonde les accusés de réception I2C).
Pourquoi la détection reste identique : i2cdetect repose sur les réponses des périphériques avec un accusé de réception (ACK) lors d’une sonde. Si les amplificateurs étaient dans un mode de défaillance partielle, ils pouvaient ne pas répondre, entraînant un scan vide. Cependant, après la réinitialisation, ils peuvent maintenant accepter les écritures de votre script, permettant une configuration appropriée et une sortie audio complète (incluant les basses). Ce comportement est connu dans les configurations audio Linux pour les appareils Lenovo, où la visibilité et la fonctionnalité peuvent se dissocier en raison des particularités de gestion d’alimentation.

Compilation du kernel :

Thème : Superposition par Kaira. CopyLerft 2025