Si votre S19 Pro ne crache plus ses 110 TH/s et que l'interface web vous affiche un gros 0 au lieu des 76 puces (ou une chaîne coupée net), direction le banc de diagnostic. Dans 90 % des cas, le coupable est classique : un die décollé par surchauffe, un régulateur LDO en court-circuit ou une microfissure sur le PCB.
Architecture de la hashboard S19 Pro : comprendre les domaines et le bus de signaux
La hashboard d'un Antminer S19 Pro embarque 76 puces BM1398, réparties en 19 domaines d'alimentation en série (soit 4 puces par domaine). La tension globale du bus (entre 12.5V et 15V selon le firmware) se divise entre ces domaines. Chaque domaine récupère ainsi environ 0.7V à 0.8V, tandis que le cœur de chaque ASIC tourne à une tension VCORE située entre 0.32V et 0.42V.
Les signaux transitent en série de puce en puce, de la 1ère (côté connecteur de la control board) jusqu'à la 76ème :
- CLK (25 MHz) : L'horloge principale. Si le signal saute sur la 30ème puce, toutes celles qui suivent tombent dans le noir.
- CO (Command Output) : Le bus d'instructions envoyé par la control board.
- RI (Return Input) : La ligne de retour des données vers la control board. Elle remonte à contre-courant, de la 76ème vers la 1ère puce.
- RST (Reset) : La ligne de remise à zéro. Un passage à l'état bas force le reset hard de la puce.
- BO (Busy Output) : Le signal d'occupation de la ligne.
Diagnostic pas à pas : décoder les logs avant de sortir le multimètre
Première étape : ouvrir le Kernel Log via l'interface web ou votre firmware custom (VNish, HiveOS). On cherche l'endroit exact où la chaîne décroche.
Les symptômes typiques dans les logs :
- Chain 1: found 0 asics — Aucun retour sur la ligne RI. Direction la puce N°1, son alim LDO ou la nappe de signal pour vérifier la continuité.
- Chain 2: only 42 asics found — Le signal bloque net au niveau de la puce 42 ou 43. Allez inspecter directement cette zone.
- Read temp sensor failed — Capteur TMP75 flingué. Sur le S19 Pro, ils sont répartis sur plusieurs domaines. Un capteur HS déclenche la sécurité et verrouille le boot de la carte.
Prise de mesures sur les points de test (Test Points)
Alimentez la carte via une alim de labo ou un testeur dédié (sans balancer la puissance sur le bus) et basculez votre multimètre en mode diode (pointe rouge à la masse GND).
[Puce 42] ---> (CO / CLK / RST) ---> [Puce 43]
[Puce 42] <--- (RI / BO) <--- [Puce 43]Par rapport à la masse, la chute de tension sur les lignes de signal doit rester cohérente d'un point de test à l'autre sur toute la carte :
- CLK, CO, RI, RST : On cherche une valeur comprise entre 450 et 600 mV (ou ohms selon le mode).
Si au niveau de la puce 43 le point CLK bipe en court-circuit à 0 Ω ou affiche une boucle ouverte (infini), la puce est bonne pour la poubelle.
Alimentations LDO
Chaque domaine a besoin de tensions secondaires pour faire tourner la logique interne des ASIC. Ce sont de petits régulateurs LDO qui s'en chargent :
- VDD 1.8V : Alimente la logique d'E/S des signaux.
- VDD 0.8V : Alimente le cœur logique (core) de la puce.
Si une puce reçoit bien son 1.8V mais que le 0.8V manque à l'appel, elle sera incapable de répéter le signal CLK vers sa voisine : la chaîne sera coupée net à cet endroit.
Pourquoi l'oscilloscope est obligatoire (et comment l'exploiter)
Un multimètre ne donne qu'une valeur moyenne en continu (DC). C'est parfait pour les tensions, mais totalement aveugle face à un signal bruité, écrasé ou déformé. Le multimètre peut vous afficher une tension propre alors que le signal est détruit ; l'oscilloscope, lui, ne ment pas.
Prévoyez un scope d'au moins 100 MHz de bande passante avec une sonde réglée en 10X.
Test du signal CLK (Horloge à 25 MHz) :
Posez la pointe sur le point de test CLK. Vous devez observer une sinusoïde propre ou un signal carré d'une amplitude d'environ 1.8V pic-à-pic. Si vous obtenez une dent de scie écrasée à 0.4V, le buffer de sortie du chip est grillé et n'a plus la pêche pour piloter la suite.
Analyse des salves CO/RI :
Au démarrage, la carte balance de courtes salves de données. À l'écran, cela se traduit par des paquets d'impulsions très rapides (bursts). Si le paquet arrive bien sur l'entrée de la puce 43 mais que rien ne sort, le chip est mort ou maintenu à zéro par la ligne RST.
Mesure du bruit d'alim (Ripple) :
Basculez l'entrée du scope en couplage AC et mesurez directement aux bornes des condensateurs sous le ventre de la puce. Un ripple supérieur à 30–40 mV indique que la céramique autour du chip a cuit à force de prendre la chaleur.
Abaque des points de test (Antminer S19 Pro / BM1398)
| Ligne | Tension DC typique | Signal à l'oscilloscope | Valeur à la masse (GND) | Symptôme en cas de coupure |
|---|---|---|---|---|
| CLK | 0.8–0.9V | Sinusoïde 25 MHz, ~1.8Vpp | 500–600 mV | La chaîne s'arrête net sur la puce HS |
| CO | 0–0.2V | Salves d'impulsions 1.8V au boot | 500–600 mV | L'énumération des puces stoppe |
| RI | 1.7–1.8V | Salves de données lors de la réponse | 500–600 mV | Affiche 0 ASIC ou tronque la fin de carte |
| RST | 1.8V | Niveau logique haut stable | 500–650 mV | Les puces restent bloquées en reset |
| VDD 1.8V | 1.8V | Ligne propre (bruit AC < 20 mV) | 1–3 kΩ | I/O buffers HS, transmission KO |
| VDD 0.8V | 0.8V | Ligne propre (bruit AC < 15 mV) | 100–300 Ω | Cœur logique de la puce inactif |
Changement de puce BM1398 : la méthode propre au fer et à l'air chaud
Le PCB en aluminium du S19 Pro agit comme un dissipateur géant. Attaquer une puce au pistolet à air chaud par le dessus sans préchauffage, c'est le meilleur moyen de cramer le substrate et d'arracher les pastilles.
Le matos indispensable :
- Preheater / Préchauffeur de PCB (profil thermique entre 160 et 180°C).
- Station à air chaud (avec buse adaptée à la taille de la puce).
- Flux BGA no-clean de qualité (NC-559, Martin ou RMA-223).
- Billes plombées 0.35 mm ou pâte à braser Sn63/Pb37 (fusion à 183°C, bien plus docile que l'alliage sans plomb d'usine).
Procédure pas à pas :
- Posez la board sur le préchauffeur et montez progressivement à 150–160°C. Si vous chauffez trop vite, le différentiel de dilatation entre l'époxy et l'aluminium va tordre la carte en banane.
- Injectez une goutte de flux sous la puce.
- Attaquez par le haut à l'air chaud (environ 340–360°C en sortie de buse, flux d'air moyen) en effectuant des mouvements circulaires.
- Pincez délicatement le chip : dès qu'il "flotte" sur ses billes en fusion, le soulever bien verticalement.
- Nettoyez les pads sur le PCB à la tresse à dessouder chargée en colophane, puis nettoyez les résidus à l'alcool isopropylique (IPA).
- Billez la puce neuve au pochoir avec votre pâte plombée ou vos billes 0.35 mm.
- Alignez la puce selon le repère (le détrompeur sur le chip doit coller à la sérigraphie du PCB).
- Laissez monter le préchauffeur et donnez le coup de pouce à l'air chaud par le dessus. Sous l'effet de la tension superficielle de l'étain liquide, la puce va se centrer toute seule sur ses empreintes.
Script Python d'analyse de logs pour aller plus vite
Pour éviter d'éplucher des Mo de Kernel Log à la main, voici un petit outil d'analyse automatique. Passez-lui le fichier log du miner : il repère la chaîne qui flanche et pointe directement la puce à tester.
#!/usr/bin/env python3
import re
import sys
EXPECTED_ASICS = 76
def parse_asic_log(filepath):
chain_pattern = re.compile(
r"Chain\[(\d+)\]:\s*found\s*(\d+)\s*asics",
re.IGNORECASE
)
sensor_pattern = re.compile(
r"sensor[\[\s]*(\d+)[\]\s]*.*temp.*error",
re.IGNORECASE
)
issues_found = False
problem_chains = []
reported_sensors = set()
print(f"[*] Analyse du log : {filepath}\n")
try:
with open(filepath, "r", errors="ignore") as f:
for num, line in enumerate(f, 1):
# Vérification du nombre d'ASIC dans la chaîne
c_match = chain_pattern.search(line)
if c_match:
chain_id = int(c_match.group(1))
found = int(c_match.group(2))
if found < EXPECTED_ASICS:
issues_found = True
problem_chains.append(
(chain_id, found, EXPECTED_ASICS)
)
print(
f"[!] Chaîne {chain_id} : "
f"{found} puces détectées sur {EXPECTED_ASICS}."
)
if found == 0:
print(
" -> Première puce de la chaîne non détectée."
)
print(
" -> Vérifier l'alim de la board, RI, "
"RST, BOOT et le signal horloge."
)
else:
print(
f" -> Inspecter la sortie (CLK/CO) "
f"de la puce #{found}"
)
print(
f" -> Inspecter l'entrée (RI) et "
f"l'alim LDO de la puce #{found + 1}"
)
print()
# Vérification des capteurs de température
s_match = sensor_pattern.search(line)
if s_match:
sensor_id = int(s_match.group(1))
if sensor_id not in reported_sensors:
issues_found = True
reported_sensors.add(sensor_id)
print(
f"[!] Erreur capteur de température "
f"#{sensor_id} (ligne {num})."
)
print(
" -> Contrôler le TMP75, son alim "
"et les lignes I2C."
)
print()
# Rapport final
print("=" * 60)
print("RÉCAPITULATIF DES ERREURS")
print("=" * 60)
if not issues_found:
print("[+] Aucune anomalie détectée d'après les motifs.")
return False
if problem_chains:
print("\nChaînes défectueuses :")
for chain_id, found, expected in problem_chains:
print(
f" - Chain {chain_id}: "
f"{found}/{expected} ASIC"
)
if reported_sensors:
print("\nCapteurs de température en erreur :")
for sensor_id in sorted(reported_sensors):
print(f" - Capteur {sensor_id}")
print()
return True
except FileNotFoundError:
print(f"[-] Fichier introuvable : {filepath}")
return True
except Exception as e:
print(f"[-] Erreur lors du traitement du fichier : {e}")
return True
if __name__ == "__main__":
if len(sys.argv) < 2:
print(
f"Usage : {sys.argv[0]} <chemin_du_log.txt> "
f"[expected_asics]"
)
sys.exit(1)
if len(sys.argv) >= 3:
try:
EXPECTED_ASICS = int(sys.argv[2])
except ValueError:
print("[-] expected_asics doit être un entier.")
sys.exit(1)
has_issues = parse_asic_log(sys.argv[1])
sys.exit(1 if has_issues else 0)Exemples d'utilisation :
python diag.py kernel.log
Pour une carte avec une densité de puces différente :
- python diag.py kernel.log 63
- python diag.py kernel.log 72
- python diag.py kernel.log 80
Checklist de contrôle avant rembobinage dans le chassis
- Résistance du bus VCORE : Valider l'absence de court-circuit direct (0 Ω) entre le bus d'alimentation et la masse.
- Valider les LDO à vide : Injecter la tension via l'alim de bench et valider la présence du 1.8V et du 0.8V au niveau de la puce remplacée.
- Contrôle du signal d'horloge : S'assurer à l'oscilloscope que le 25 MHz traverse proprement le composant neuf et ressort vers l'étage suivant.
- Banc d'essai en charge : Remonter la carte dans le châssis avec ses ventilateurs d'origine, puis lancer un burn-in de 2 à 3 heures sur le firmware stock pour surveiller le taux d'erreurs HW sur la ligne réparée.