Merge pull request 'Valider iPhone OS 2.1.1 et rendre les tests Safari reproductibles' (#3) from agent/validation-iphoneos21 into ipod_touch_2g

This commit was merged in pull request #3.
This commit is contained in:
Mahtan committed 2026-10-01 09:47:59 +02:00
commit 6fc3f004cc
3 files changed
+130 -4

No files matched your search

+31 -2
View File
@@ -13,6 +13,35 @@ Voir [RTC.md](RTC.md) pour le protocole, les preuves et les limites.
Le raccordement GPIO est aussi borné aux cinq IRQ définies, pour éviter
l'accès hors limites révélé à la recompilation.
## Validation du 1er octobre 2026 — iPhone OS 2.1.1
- Image distincte `5F138-validation-20261001`, créée depuis la base 5F138 conservée,
avec agent v12, TouchProbe et HelloEmu. Session : `work/validation-20261001/`.
`system-version.plist` confirme 2.1.1 / 5F138 ; démarrage déverrouillé en 28 s.
- Calibration : sept points exacts de `(20,40)` à `(300,460)` dans
`calibration-complete.log`, après attente du marqueur `TouchProbe ready`.
Les ordonnées du journal sont relatives à la vue, située à y=20.
- Six cycles alternant Power/Home et Power/Power passent, sans perte du tactile.
- Safari : clavier virtuel QWERTY, formulaire envoyé avec `texte=bonjour`,
défilement jusqu'au lien final et requête `/fin` reçue par le serveur HTTP local.
Journal : `http/requests.jsonl`. Une version réutilisable de la page et du serveur
est fournie dans `tests/http-fixture.py` ; aucun site extérieur n'est requis.
- Calculatrice : `7 × 8 = 56`, capture `calculatrice-56.png`.
- Notes : note « Bonjour » créée par le clavier virtuel puis sauvegardée.
Les lignes de `Note` et `note_bodies` sont identiques dans `notes-avant.db` et
`notes-apres.db`, et la note réapparaît dans l'interface après redémarrage.
- Nouvelle app `HelloEmu21.app` (bundle-id `com.ioslegacy.hello21`) installée via
`push-app`, cache reconstruit, redémarrage sans réinitialiser la NAND en 50 s,
lancement au premier plan et journal HelloEmu validés. Captures :
`hello21-apres-push.png` et `note-apres-reboot.png`.
- Synthèse locale : `validation.json`. Session et serveur HTTP de test arrêtés.
Aucun défaut `Killing device`, `Fatal Exception` ou `MACH Reboot` relevé dans
la console finale. Les images et NAND d'origine sont conservées.
- Particularités : l'image 5F138 conserve ses réglages de langue et de fuseau
d'origine ; les captures sont en anglais. Le lancement `--url` d'un Safari
déjà ouvert n'a pas changé la page pendant le test : passer par les liens ou
relancer le navigateur. Le RTC est depuis implémenté (voir ci-dessus) ; la veille profonde reste à faire.
## Historique — fiabilisation GPIO/SPI et agent v12
Les sections de diagnostic plus anciennes ci-dessous décrivent les étapes précédentes.
@@ -37,8 +66,8 @@ puis HelloEmu se lance au premier plan avec son journal. Diagnostics locaux :
Les sessions de validation sont arrêtées.
Les fichiers générés, images et diagnostics restent hors du dépôt. Les images
5H11a et les NAND d'origine sont conservées ; le RTC, le Wi-Fi matériel, l'audio
et la veille profonde restent à implémenter. Les nouveaux correctifs ne sont
pas encore validés sur 5F138.
et la veille profonde restent à implémenter. Les nouveaux correctifs n’étaient
pas encore validés sur 5F138 à cette étape.
## Objectif
+40 -2
View File
@@ -131,8 +131,7 @@ La vitesse verticale utilise `y`, les vitesses conservent leur signe et sont
bornées à 16 bits. `apps/TouchProbe` permet de mesurer la calibration : compiler
avec son Makefile, lancer avec `--log`, puis comparer les gestes QMP au marqueur
bleu et aux coordonnées du journal (ajouter 20 pixels à l'ordonnée locale de la vue).
La calibration a été vérifiée sur 5H11a, sur sept points de `(20,40)` à `(300,460)`.
Les modifications n'ont pas encore été validées sur 5F138.
La calibration a été vérifiée sur 5H11a et 5F138, sur sept points de `(20,40)` à `(300,460)`.
Agent **v12** : `put` et `get` utilisent des blocs de 64 Kio au lieu d'allouer
le fichier entier dans l'iPod. Un upload incomplet supprime son temporaire et
@@ -148,6 +147,45 @@ contrib/ipod-emu/tests/run-multitouch # build QEMU arm existant, Ninja, compi
python3 contrib/ipod-emu/tests/test-transfers.py # Python et compilateur C, sockets locales
```
## Validation sous iPhone OS 2.1.1
Le firmware 5F138 a été vérifié avec l'agent v12 et les mêmes corrections QEMU.
Conserver l'image 5F138 d'origine et produire une image dérivée avec un nom absent :
```bash
ipod-mkimage -b 5F138 -o 5F138-agent-v12 agent/overlay apps/TouchProbe/TouchProbe.app apps/HelloEmu/HelloEmu.app
```
Utiliser ensuite un environnement `IPOD_EMU_HOME` indépendant pour démarrer cette
image ; un changement de firmware remplace la NAND de la session choisie.
`SystemVersion.plist` confirme iPhone OS 2.1.1 / 5F138. Les sept points de
calibration sont exacts et six cycles de veille/réveil alternant Home et Power
passent, sans désactivation du tactile.
Pour tester Safari sans dépendre d'un site extérieur, depuis le dépôt :
```bash
python3 contrib/ipod-emu/tests/http-fixture.py --output /chemin/diagnostic-http
```
Ouvrir l'URL `http://10.0.2.2:<port>/` affichée dans Safari invité. Le serveur
écoute uniquement sur la boucle locale de l'hôte ; il conserve le port et les
requêtes dans le dossier choisi. Saisir `bonjour` avec le clavier virtuel et
soumettre : le journal doit contenir `/submit?texte=bonjour`. Suivre le lien de
défilement, glisser jusqu'au bas, attendre la fin de l'inertie et toucher le lien
final : `/fin` doit apparaître. Arrêter le serveur avec Ctrl-C après le test.
Attendre l'affichage réel d'une application avant d'envoyer des gestes. Pour
TouchProbe, attendre `TouchProbe ready` dans le journal ; une réponse de lancement
ne garantit pas que la vue soit déjà prête. Sous 2.1.1, lancer Safari avec `--url`
alors qu'il est déjà ouvert n'a pas changé la page lors du test ; utiliser les
liens de la page ou relancer Safari pour ouvrir une autre URL.
Notes et la calculatrice complètent ce contrôle : saisir une note, la sauvegarder,
puis comparer son texte dans `Library/Notes/notes.db` avant et après redémarrage ;
vérifier visuellement `7 × 8 = 56` dans la calculatrice. Les diagnostics et le
résultat détaillé de la validation du 1er octobre sont décrits dans `HANDOFF.md`.
## Limites
- **Persistance NAND** : les pages et métadonnées écrites par iOS, ainsi que les effacements de blocs, sont conservés
+59
View File
@@ -0,0 +1,59 @@
#!/usr/bin/env python3
"""Page HTTP compatible Safari mobile 3 pour valider saisie et défilement.
Lancer sur l'hôte avec --output DOSSIER ; ouvrir l'URL 10.0.2.2 affichée dans
Safari invité. Le port et les requêtes reçues sont enregistrés dans ce dossier.
Arrêter avec Ctrl-C après le test. Aucun accès Internet n'est nécessaire.
"""
import argparse
from datetime import datetime, timezone
from html import escape
from http.server import BaseHTTPRequestHandler, HTTPServer
import json
from pathlib import Path
from urllib.parse import parse_qs, urlparse
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--output', type=Path, required=True)
args = parser.parse_args()
args.output.mkdir(parents=True, exist_ok=True)
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
with (args.output / 'requests.jsonl').open('a', encoding='utf-8') as log:
log.write(json.dumps({'utc': datetime.now(timezone.utc).isoformat(),
'path': self.path}, ensure_ascii=False) + '\n')
url = urlparse(self.path)
if url.path == '/submit':
content = 'Recu : ' + escape(parse_qs(url.query).get('texte', [''])[0])
elif url.path == '/scroll':
content = '<h1>Debut</h1>' + ''.join(
'<p style="height:60px">Ligne %02d</p>' % i for i in range(24))
content += '<a href="/fin">Fin du defilement</a>'
elif url.path == '/fin':
content = '<h1>Defilement OK</h1>'
else:
content = ('<h1>Validation HTTP</h1><form action="/submit" method="get">'
'<input type="text" name="texte"><input type="submit" value="Envoyer">'
'</form><p><a href="/scroll">Test de defilement</a></p>')
body = ('<html><head><meta name="viewport" content="width=device-width">'
'<title>Test iPhone OS</title></head><body>' + content + '</body></html>').encode('utf-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html; charset=utf-8')
self.send_header('Content-Length', str(len(body)))
self.end_headers()
self.wfile.write(body)
with HTTPServer(('127.0.0.1', 0), Handler) as server:
(args.output / 'port').write_text(str(server.server_port) + '\n', encoding='utf-8')
print(f'URL depuis l’iPod : http://10.0.2.2:{server.server_port}/', flush=True)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
if __name__ == '__main__':
main()