Vous souhaitez donc exécuter Windows 10 sur une calculatrice? Ok


HP Prime G2 sous Windows 10 IoT

On ne pouvait que rêver de démarrer Windows sur une calculatrice standard avant l'avènement du HP Prime G2. Une calculatrice sur un matériel aussi puissant n'est jamais entrée sur le marché. Et surtout, HP a choisi le processeur ARMv7-A! Cet article explique comment installer UEFI et ACPI sur un périphérique.


Spécifications SoC sur le HP Prime G2. SoC NXP i.MX 6ULL ​​(Ultra Lite) dispose d'un processeur Cortex A7 monocœur

Travaux antérieurs


Mon ami Wenqin Zhang (Zephray) a fait le travail fondamental d'ingénierie inverse des spécifications GPIO et calculatrice. De plus, il a réussi à porter U-Boot et Linux fonctionnant sur la calculatrice.

Selon TI-Planet , la calculatrice fournit un grand nombre de broches de test, notamment SD / MMC, JTAG et UART.

Sarah (winocm) a étudié la possibilité d'exécuter Windows RT sur la plate-forme Qemu . En 2019, quelque chose a changé, mais l'article n'a pas perdu sa valeur.

Microsoft a conclu un accord NXP pour prendre en charge Windows 10 IoT sur les puces iMX SoC. Ainsi, techniquement, Windows 10 IoT devrait fonctionner sur cette calculatrice (ainsi que Windows sur ARM).

Affiner la configuration système requise pour Windows


La configuration système requise pour exécuter la famille de systèmes d'exploitation Windows 10 est répertoriée sur le site Web de Microsoft Docs . Même les exigences les plus minimales sont plus que Linux: le système a besoin d'un processeur x86 / x64 / ARMv7 / AArch64, au moins 256 Mo de mémoire et 2 Go d'espace disque. Un firmware UEFI fonctionnel, des tableaux ACPI et SMBIOS complets sont requis.

Dans notre cas, il n'y a pas assez d'espace sur l'appareil (et Windows ne prend pas non plus en charge Raw SLC NAND), mais vous pouvez connecter le périphérique de démarrage via USB à la calculatrice.

Sarah répertorie les exigences architecturales pour ARMv7 pour exécuter Windows. Au fil des ans, les exigences ont un peu changé, voici à quoi elles ressemblent en ce moment:

  Processeur système: processeur compatible ARMv7-A avec VFPv3 + VFP HalfPrec, VFPv4 convient également
 Mémoire: au moins 256 Mo de RAM (probablement moins)
 Périphériques:
     - Minuterie système (par architecture ou par fournisseur)
     - ARM Generic Interrupt Controller (GIC) ou Broadcom Interrupt Controller sur BCM2835 / 2836/2837, CPU et interface de distribution.  Si GIC est présent et déclaré dans le système, GICv2 et supérieur sont requis.
     - framebuffer
     - Prise en charge de UART, ou NS16550, BCM283x, ou du fournisseur (dans le cas de Qualcomm et NXP)
     - Firmware: UEFI 2.3 ou supérieur 

Notre calculatrice répond à ces exigences strictes. Cependant, le SoC par défaut fonctionne à 396 MHz, ce qui est inférieur au niveau de base de 400 MHz / 1 GHz. 250 Mo de mémoire système sont également signalés, tandis que la configuration minimale requise pour un système avec une interface utilisateur est de 512 Mo. Mais ça se charge!


Selon cpuinfo de WinDbg, SoC fonctionne à 396 MHz

Je pense que vous pouvez réduire davantage les exigences. Si je me souviens bien, Windows Server Nano dispose d'environ 150 Mo de mémoire pour démarrer sur les systèmes amd64.

UEFI et ACPI


J'ai écrit plusieurs fois sur les implémentations UEFI , il n'y a donc rien de nouveau ici. Fondamentalement, UEFI se compose d'un ensemble de pilotes de périphériques et de composants du noyau TianoCore . Les tables ACPI sont copiées à partir du référentiel Windows IoT iMX Project Mu et découpées.

Bottes UEFI de U-Boot . iMX par défaut ne permet pas d'accéder à la mémoire non alignée, ce qui provoque beaucoup de problèmes aux étapes UEFI DXE et BDS, vous devez donc l'activer dès que possible.

  mrc p15, 0, r0, c1, c0, 0
  bic r0, r0, # 2
  mcr p15, 0, r0, c1, c0, 0 

Un compilateur avec prise en charge matérielle de float accélère le chargeur de démarrage d'environ 30 à 4 secondes. Sur les plates-formes ARMv7, Windows revendique la prise en charge de VFPv3 +.

L'initialisation de l'écran, ainsi que certaines affectations de multiplexage d'E / S, sont effectuées dans U-Boot. Maintenant U-Boot ne prend pas en charge l'interface LCD RVB série 24 / 32bpp, j'ai donc ajouté la prise en charge Serial RGB via l'implémentation du framebuffer iMX dans le noyau Linux. Le code n'est pas encore dans l'assistant, mais je le transmettrai plus tard.



L'écran LCD semble fonctionner. L'ensemble de la procédure:

  1. Exécutez uboot.
  2. Trouvez une épingle pour le rétroéclairage de l'écran.
  3. Trouvez la broche pour la séquence d'initialisation SPI et LCD.
  4. Trouvez la broche I2C et configurez le PMIC via I2C pour la tension correcte.


Démonstration de l'interface LCD RVB série en U-Boot

UEFI prend simplement le framebuffer alloué par U-Boot et enregistre le Graphics Output Protocol. Malheureusement, la résolution d'écran ne répond pas aux exigences minimales de la console 80 * 25, j'ai donc changé les composants de la console DXE en ajoutant un nouveau mode 40 * 12.


Le composant EDK2 prétend que la résolution d'écran ne répond pas aux exigences minimales de la console 80 * 25

Avant de pirater les composants de la console, j'ai fait un petit tour, en fixant la résolution de 640 * 480 dans le protocole UEFI GOP. L'astuce a également aidé à obtenir des informations de diagnostic à partir du Gestionnaire de démarrage Windows, car la résolution 320 * 240 n'est pas suffisante pour afficher le code d'erreur. J'exécute périodiquement le transfert de blocs (BLT) du framebuffer vers le système de fichiers et enregistre les fichiers BMP sur une clé USB.


Hack rend disponible le mode 80 * 25 avec quelques artefacts graphiques

Après avoir connecté un nouveau mode, la qualité d'image est considérablement améliorée.


Mode 40 * 12


Mode 40 * 12

Voici à quoi ressemble le message du Gestionnaire de démarrage Windows avec une résolution de 320 * 240:



La première tentative échoue à l'étape des services de démarrage UEFI. Le code d'erreur n'est pas visible en raison du petit écran.


Le transfert de bloc (BLT) à partir du tampon de cadre vous permet d'enregistrer le message dans un fichier image et de le lire

Concernant le support USB. Heureusement, l'USB de l'iMX6 est entièrement compatible et la prise en charge est incluse dans les versions récentes de Windows. Par conséquent, dès que j'ai configuré le contrôleur OTG en mode hôte et transféré la zone MMIO vers UEFI et Windows, cela fonctionne comme par magie sans problème. Mais nous n'avons pas trouvé de VBus sur le port OTG (nous supposons qu'il existe une sorte de circuit DC-DC contrôlé par SoC ou PMIC, mais ce n'est qu'une hypothèse non vérifiée), par conséquent, pour le bon fonctionnement, le port doit être alimenté par une source externe.

SMBIOS


Assurez-vous que vous informez correctement la taille de la mémoire et les zones d'adresse dans SMBIOS, sinon Windows commencera à faire des choses incroyablement étranges (tm).


Le débogueur Windows ne peut pas lire la mémoire en raison d'une configuration SMBIOS incorrecte

Extensions Timer et HAL


Nous semblons être capables de gérer la configuration de la mémoire (LPAE), mais il y aura probablement un autre problème. Oh ouais ...



Ainsi, le chargement de Windows jusqu'à présent n'atteint que cette étape.


Si aucun temporisateur système approprié n'est trouvé, Windows fait référence à une adresse mémoire supposée et non valide

Windows ne démarre pas si aucun contrôleur d'interruption ou minuterie système n'est trouvé. L'heure système peut être enregistrée à l'aide de la table GTDT (table d'architecture ARM) ou des extensions HAL via la table CSRT.

iMX6ULL est livré avec trois temporisateurs: iMX GPT (Generic Purpose Timer), EPIT (Enhanced Periodic Timer) et ARM Architectural Timer. Ce dernier n'apparaissait que dans iMX6UL / ULL, alors que les systèmes SoC iMX6 précédents fonctionnaient sur des noyaux plus anciens comme le Cortex A15 sans le support d'une minuterie architecturale. Microsoft a implémenté l'extension EPIT HAL pour le minuteur du système, mais elle ne s'est pas chargée au début en raison d'un décalage entre l'identifiant matériel dans la table CSRT et l'image système (j'ai téléchargé la FFU précédente pour iMX6 Solo). Par conséquent, lorsque le minuteur n'est pas disponible, Windows tentera désespérément d'initialiser le minuteur prévu et le système se bloquera en raison d'un accès à la mémoire non valide.

La documentation iMX6ULL mentionne un temporisateur architectural, mais sans détails sur la procédure d'initialisation. Le compteur de minuterie peut être initialisé avec EDK2, mais le GIC PPI (Per Processor Interrupt) ne fonctionnera pas correctement. Cependant, Windows initialise avec succès et utilise un minuteur via la table GTDT.

UEFI utilise actuellement le temporisateur EPIT et le désactive lors du transfert vers Windows. À son tour, Windows initialise le minuteur GPT. À un moment ultérieur, UEFI peut également basculer vers GPT avec la procédure d'initialisation appropriée.

Certains périphériques nécessitent l'extension HAL pour le contrôleur Smart DMA (SDMA); ce n'est pas trop difficile à télécharger.

Montrez-moi comment ça marche!


  [Sécurité] L'image tierce [0] peut être chargée après EndOfDxe: VenHw (0D51905B-B77E-452A-A2C0-ECA0CC8D514A, 004118020000000000) / USB (0x0.0x0) / USB (0x2.0x0) / HD (1, GPT, F9ADAEA9-E8DE-4291-B191-5DABA6DC1215.0x800.0x100000) / \ efi \ boot \ bootarm.efi.
  InstallProtocolInterface: 5B1B31A1-9562-11D2-8E3F-00A0C969723B 8F257028
  ConvertPages: impossible de trouver la plage 10000000 - 100EEFFF
  Chargement du pilote à 0x0008E9D6000 EntryPoint = 0x0008E9E7511 bootmgfw.efi
  InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 8F28EB10
  ProtectUefiImageCommon - 0x8F257028
  0x000000008E9D6000 - 0x00000000000EF000
  InstallProtocolInterface: 752F3136-4E16-4FDC-A22A-E5F46812F4CA 8FBFF88C
  ConvertPages: impossible de trouver la plage 102000 - 102FFF
  Désactivation du temporisateur EPIT sur ExitBootServicesEventSetUefiImageMemoryAttributes - 0x000000008F78A000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F787000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F784000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F77F000 - 0x0000000000005000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F77C000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F779000 - 0x0000000000003000 (0x0000000000000008) 

Si vous vous demandez à quel point il se charge lentement, alors environ trois minutes et demie.

Vidéo à vitesse accélérée 2x:


Où sont Secure Boot et TPM?


C'est en fait facultatif. Mais comme OP-TEE prend en charge iMX6 / 7/8, vous pouvez exécuter Secure Monitor dans TrustZone (TZ) et implémenter ces services via des appels (appels Secure Monitor) depuis EL1 / PL1.

En fait, l'implémentation officielle d'iMX Windows IoT est livrée avec OP-TEE, mais je l'ai ignoré pour économiser de la mémoire.

Et les chauffeurs?


Le référentiel Windows 10 IoT BSP contient de nombreux pilotes pour iMX6 / 7/8. Le pilote USB fonctionne immédiatement, comme déjà mentionné. Pour la calculatrice, vous avez également besoin de pilotes d'écran tactile et de claviers.

Ils sont disponibles dans l'arborescence du noyau Linux, il ne devrait donc pas être trop difficile de les porter sur Windows.

Puis-je télécharger Windows RT 8.1?


C'est possible . Mise à jour: Windows RT 8.1 ne démarre pas, uniquement les versions ultérieures. Windows PE ne démarre pas en mode disque virtuel car 256 Mo de mémoire ne suffisent pas. Je n'ai pas pu démarrer le mode de démarrage à plat, après avoir répertorié les périphériques (y compris la clé USB), il entre dans une sorte de cycle sans autre initialisation.


HP Prime G2 a chargé Windows, qui a lancé une application de calculatrice


Bloc-notes sur la calculatrice


Le bloc-notes de la calculatrice tente d'envoyer du texte à imprimer.

Mais je veux aussi démarrer Linux!


Il y a deux options:

  • Utilisez simplement U-Boot pour démarrer zImage, l'arborescence des périphériques et initrd.
  • Déplacez les zones de mémoire FD, MpPark et FrameBuffer vers le haut de la mémoire système, en laissant 128 Mo d'espace libre dans la zone de mémoire inférieure.

Téléchargez Linux via GRUB ou directement depuis EFISTUB. Tout se charge normalement, voici un fragment du journal:

  Stub EFI: fermeture des services de démarrage et installation de la carte d'adresses virtuelle ...
  Désactivation du temporisateur EPIT sur ExitBootServicesEventSetUefiImageMemoryAttributes - 0x000000008F97B000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F978000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F973000 - 0x0000000000005000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F970000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F96D000 - 0x0000000000003000 (0x0000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F96A000 - 0x0000000000003000 (0x0000000000000008)
  Démarrer Linux sur le CPU physique 0x0
  Linux version 4.14.98-g371433a62906-dirty (imbushuo @ bc-macbookpro) (gcc version 7.4.1 20181213 [linaro-7.4-2019.02 révision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] (Linaro GCC 7.4-2019.02): # 2 PREEM 29 EST 2019
  CPU: Processeur ARMv7 [410fc075] révision 5 (ARMv7), cr = 10c53c7d
  CPU: instructions div disponibles: correction du code de division
  CPU: cache de données sans aliasing PIPT / VIPT, cache d'instructions d'aliasing VIPT
  DE: fdt: Modèle de machine: Calculatrice HP Prime G2
  Politique de mémoire: réécriture du cache de données
  efi: Obtention des paramètres EFI de FDT:
  efi: EFI v2.70 par EDK II
  efi: ACPI 2.0 = 0x8f49b000 SMBIOS = 0x8f9a8000 SMBIOS 3.0 = 0x8f9a6000
  OF: mem réservé: échec d'allocation de mémoire pour le noeud 'linux, cma'
  CPU: Tous les CPU ont démarré en mode SVC.
  Construit 1 zonelists, groupement de mobilité sur.  Nombre total de pages: 64516
  Ligne de commande du noyau: zImage.efi root = / dev / ram0 rw initrd = / rootfs.cpio.gz dtb = / imx6ull-14x14-prime.dtb 

Si vous utilisez la configuration NXP Linux, cela fera planter le noyau car il lit l'adresse mémoire initrd dans l'arborescence des périphériques ou certains paramètres de configuration prédéfinis, et, bien sûr, initrd est chargé ailleurs dans UEFI. Il est nécessaire de supprimer ces paramètres et de rendre la configuration plus universelle.

Mais pourquoi?


Les gens parlent de l'exécution de Windows sur différents appareils, donc je veux les contrôler avant la fin de l'année.

Et les autres projets? Et ensuite?


Le travail se poursuivra. Vous devez également implémenter certains pilotes, réaliser le chargement UEFI avec la NAND intégrée, implémenter une interface conviviale de chargement UEFI pour la calculatrice et étudier la possibilité de charger le système d'exploitation stock HP PPL depuis mon UEFI.

Source: https://habr.com/ru/post/fr477250/


All Articles