Recuperer un Xiaomi Mi 9 SE hard-bricke avec Qualcomm EDL
Un Xiaomi Mi 9 SE qui ne demarre plus du tout, ecran noir, sans fastboot ni recovery, donne vite l’impression d’etre definitivement mort.
Dans mon cas, il restait pourtant une derniere porte d’entree : le mode Qualcomm EDL 9008.
Ce mode m’a permis de reprendre la main sur l’appareil, de charger un Firehose adapte, de contourner le blocage EDL Xiaomi, puis de reflasher assez de firmware officiel pour faire revivre le telephone. Une fois le recovery correctement reinstalle, je n’ai meme pas garde MIUI longtemps : j’ai directement installe /e/OS.
Le telephone au depart
Le telephone etait un Xiaomi Mi 9 SE, nom de code grus, equipe d’un Snapdragon 712 et d’un stockage UFS.
Il ne demarrait plus du tout :
Pas de MIUI
Pas de recovery
Pas de fastboot
Ecran noir
En le branchant sous Linux, il apparaissait tout de meme avec lsusb :
05c6:9008 Qualcomm, Inc. Gobi Wireless Modem (QDL mode)
C’etait le signe important : le telephone etait en mode Qualcomm Emergency Download, aussi appele EDL ou 9008.
Le systeme Android etait mort, mais le BootROM Qualcomm repondait encore.
Comprendre la chaine EDL
Sur une plateforme Qualcomm, le principe ressemble a ca :
PC Linux
|
| USB 05c6:9008
v
Qualcomm BootROM
|
| Sahara
v
Firehose programmer
|
| Commandes Firehose
v
Stockage UFS
Sahara sert a dialoguer avec le BootROM et a envoyer un petit programme appele Firehose. Une fois lance, le Firehose permet d’acceder au stockage du telephone.
Sans Firehose compatible, impossible de reparer proprement l’appareil.
Premier essai avec bkerler/edl
Sous Linux, j’ai utilise bkerler/edl.
Avec le telephone connecte en 9008, la commande suivante permettait deja de confirmer que Sahara repondait :
python edl.py printgpt --memory=ufs --debugmode
L’outil detectait bien le mode Sahara et affichait les informations materielles du telephone, notamment le HWID, le MSM ID et le PK_HASH.
Dans mon cas, edl affichait aussi :
Unknown CPU
Ce n’etait pas vraiment inquietant : le MSM ID du Snapdragon 712 n’etait simplement pas associe a un nom dans la table interne de l’outil.
Le mauvais Firehose automatique
Sans loader precise, edl essayait de choisir automatiquement un Firehose compatible.
Il trouvait plusieurs fichiers correspondant au meme debut de PK_HASH, notamment un loader destine au Poco F1.
Le probleme est evident :
Poco F1 : Snapdragon 845
Mi 9 SE : Snapdragon 712
Meme si les appareils partagent une chaine de signature compatible, leurs Firehose ne sont pas interchangeables.
Lors du chargement du mauvais Firehose, le telephone disparaissait du bus USB, puis revenait quelques secondes plus tard en 9008.
Le PK_HASH ne suffit donc pas a choisir un Firehose. Il faut utiliser un programmer prevu pour la plateforme concernee.
Firehose officiel Xiaomi : bon appareil, mais EDL Auth
J’ai ensuite recupere la ROM Fastboot officielle du Mi 9 SE :
grus_global_images_V12.5.1.0.RFBMIXM
Elle contient le Firehose officiel :
images/prog_ufs_firehose_sdm710_ddr.elf
Le nom sdm710 peut sembler etrange puisque le Mi 9 SE utilise un Snapdragon 712, mais c’est bien le programmer fourni dans la ROM officielle grus.
En le forcant explicitement :
python edl.py printgpt \
--memory=ufs \
--loader=/chemin/prog_ufs_firehose_sdm710_ddr.elf \
--debugmode
le Firehose demarrait enfin correctement.
Mais Xiaomi ajoutait un verrou :
firehose - Xiaomi EDL Auth detected.
firehose - Error on EDL Authentification
A ce stade, Qualcomm EDL fonctionnait, Sahara fonctionnait, le Firehose se lancait, mais Xiaomi bloquait les commandes utiles.
Trouver un Firehose no-auth pour le Mi 9 SE
La solution a ete de trouver un Firehose compatible Mi 9 SE capable de passer l’authentification Xiaomi.
J’ai utilise l’index public Firehose Loaders de Temblast, qui reference notamment une entree pour :
Xiaomi/Auth Skip, Auth Bypass/MI 9 SE
Le fichier provenait du depot Iqinix/Qualcomm-firehoses.
Apres verification, c’etait bien un ELF 64-bit ARM aarch64. Une fois utilise avec edl :
python edl.py printgpt \
--memory=ufs \
--loader=/root/mi9se_noauth.elf \
--debugmode
la sortie changeait enfin :
firehose - Xiaomi EDL Auth detected.
firehose - EDL Authenticated successfully.
Le verrou principal etait franchi.
Le piege MaxDigestTableSizeInBytes
Meme apres ca, tout ne fonctionnait pas encore.
Le Firehose renvoyait :
ERROR: NAK: Host wants to send a Hash table 2048 larger than supported 0
Le probleme venait de edlclient/Library/firehose.py.
edl envoyait :
MaxDigestTableSizeInBytes="2048"
alors que ce Firehose annoncait une valeur supportee de :
0
J’ai donc modifie la valeur de 2048 a 0.
Apres cette correction, la configuration Firehose passait enfin :
firehose - Xiaomi EDL Auth detected.
firehose - EDL Authenticated successfully.
firehose - INFO: Calling handler for configure
firehose - INFO: Storage type set to value UFS
A partir de la, l’acces au stockage UFS etait reellement fonctionnel.
Un detail sous Linux : qcserial
Sous Linux, le peripherique Qualcomm 9008 est souvent automatiquement pris en charge par le driver qcserial et apparait comme /dev/ttyUSB0.
Dans mon cas, la communication etait plus fiable en laissant edl utiliser directement libusb.
J’ai donc detache le driver :
echo "1-3:1.0" > /sys/bus/usb/drivers/qcserial/unbind
ou, pour les tests :
modprobe -r qcserial usb_wwan
Puis lsusb -t permettait de verifier :
Class=Vendor Specific Class, Driver=[none]
C’est dans cette configuration que les echanges Sahara/Firehose etaient les plus propres.
Flash de la ROM officielle
J’ai ensuite utilise les fichiers de la ROM Fastboot officielle Xiaomi, notamment :
rawprogram0.xml
rawprogram1.xml
rawprogram2.xml
rawprogram3.xml
rawprogram4.xml
rawprogram5.xml
patch0.xml
patch1.xml
patch2.xml
patch3.xml
patch4.xml
patch5.xml
Ces fichiers decrivent les partitions et les images a ecrire.
Pendant le flash, edl ecrivait les differents composants necessaires au demarrage :
xbl_config.elf
xbl.elf
qupv3fw.elf
devcfg.mbn
aop.mbn
cmnlib.mbn
cmnlib64.mbn
abl.elf
tz.mbn
hyp.mbn
boot.img
vbmeta.img
system.img
vendor.img
...
Une ecriture reussie se reconnaissait facilement :
Writing ...
Progress: 100%
Wrote ...
Le retour a la vie
Apres la restauration du firmware officiel, le Mi 9 SE a enfin quitte son etat de hard brick.
MIUI a redemarre.
Fastboot etait de nouveau accessible :
fastboot devices
Puis :
fastboot oem device-info
confirmait que le bootloader etait toujours deverrouille :
Device unlocked: true
Device critical unlocked: true
Le telephone etait donc recupere.
Installation directe de /e/OS
Une fois le telephone revenu dans un etat sain, j’ai reflashe correctement le recovery.
Et des que le recovery a ete fonctionnel, je n’ai pas attendu : j’ai directement installe /e/OS.
L’objectif n’etait pas specialement de revenir durablement sur MIUI. MIUI m’a surtout servi a confirmer que le telephone etait bien restaure, que les partitions critiques etaient a nouveau coherentes, et que fastboot/recovery etaient recuperables.
Une fois cette base remise en place, /e/OS etait la suite logique.
Resume
Le chemin complet a ete :
Xiaomi Mi 9 SE hard-bricke
|
v
Mode Qualcomm EDL 9008
|
v
Sahara OK
|
v
Mauvais Firehose automatique
|
v
Firehose officiel grus
|
v
Blocage Xiaomi EDL Auth
|
v
Firehose Mi 9 SE no-auth
|
v
Correction MaxDigestTableSizeInBytes
|
v
Acces UFS
|
v
Flash firmware officiel
|
v
MIUI redemarre
|
v
Recovery reflashe correctement
|
v
Installation directe de /e/OS
Conclusion
Ce Mi 9 SE semblait totalement mort.
En realite, tant que le mode Qualcomm EDL 9008 repondait encore, il restait une possibilite de reparation.
Les trois points critiques ont ete :
trouver le bon Firehose
contourner l'authentification EDL Xiaomi
adapter la configuration Firehose utilisee par edl
Une fois ces obstacles passes, le flash de la ROM officielle a permis de restaurer le telephone.