HP Prime G2 bajo Windows 10 IoTUno solo podría soñar con iniciar Windows en una calculadora estándar antes del advenimiento del HP Prime G2. Una calculadora en un hardware tan poderoso nunca ha entrado en el mercado. Y lo más importante, ¡HP ha elegido el procesador ARMv7-A! Este artículo describe cómo instalar UEFI y ACPI en un dispositivo.
Especificaciones de SoC en el HP Prime G2. SoC NXP i.MX 6ULL (Ultra Lite) tiene un procesador Cortex A7 de un solo núcleoTrabajo previo
Mi amigo
Wenqin Zhang (Zephray) hizo el
trabajo fundamental de ingeniería inversa de las especificaciones de GPIO y calculadora. Además,
logró portar U-Boot y
Linux a la calculadora.
Según
TI-Planet , la calculadora proporciona una gran cantidad de pines de prueba, incluidos SD / MMC, JTAG y UART.
Sarah (winocm) estudió la posibilidad de ejecutar Windows RT en la plataforma
Qemu . Para 2019, algo ha cambiado, pero el artículo no ha perdido su valor.
Microsoft ha firmado un acuerdo de NXP para proporcionar soporte para Windows 10 IoT en chips iMX SoC. Por lo tanto, técnicamente, Windows 10 IoT debería funcionar en esta calculadora (así como Windows en ARM).
Refinar los requisitos del sistema de Windows
Los requisitos del sistema para ejecutar la familia de sistemas operativos Windows 10
se enumeran en el sitio web de Microsoft Docs . Incluso los requisitos más mínimos son más que Linux: el sistema necesita un procesador x86 / x64 / ARMv7 / AArch64, al menos 256 MB de memoria y 2 GB de espacio en disco. Se requieren firmware UEFI funcional, tablas ACPI y SMBIOS completas.
En nuestro caso, no hay suficiente espacio en el dispositivo (y Windows tampoco es compatible con Raw SLC NAND), pero puede conectar el dispositivo de arranque a través de USB a la calculadora.
Sarah enumera los requisitos arquitectónicos para ARMv7 para ejecutar Windows. Con los años, los requisitos han cambiado un poco, así es como se ven en este momento:
Procesador del sistema: procesador compatible ARMv7-A con VFPv3 + VFP HalfPrec, VFPv4 también es adecuado
Memoria: al menos 256 MB de RAM (probablemente menos)
Periféricos:
- Temporizador del sistema (ya sea por arquitectura o por proveedor)
- Controlador de interrupción genérico ARM (GIC) o controlador de interrupción Broadcom en BCM2835 / 2836/2837, CPU e interfaz de distribuidor. Si GIC está presente y declarado en el sistema, se requiere GICv2 y superior.
- framebuffer
- Soporte para UART, o NS16550, BCM283x, o del proveedor (en el caso de Qualcomm y NXP)
- Firmware: UEFI 2.3 o superior
Nuestra calculadora cumple con estos estrictos requisitos. Sin embargo, el SoC predeterminado se ejecuta a 396 MHz, que es inferior al nivel base de 400 MHz / 1 GHz. También se informan 250 MB de memoria del sistema, mientras que el requisito mínimo para un sistema con una interfaz de usuario es 512 MB. ¡Pero se está cargando!
Según cpuinfo de WinDbg, SoC se ejecuta a 396 MHzCreo que puede reducir aún más los requisitos. Si no recuerdo mal, Windows Server Nano tiene aproximadamente 150 MB de memoria para arrancar en sistemas amd64.
UEFI y ACPI
He escrito varias veces sobre
implementaciones de UEFI , por lo que no hay nada nuevo aquí. Básicamente, UEFI consiste en un conjunto de controladores de dispositivo y
componentes del núcleo
TianoCore . Las tablas ACPI se copian del repositorio de
Windows IoT iMX Project Mu y se recortan.
Botas UEFI de
U-Boot . iMX por defecto no permite el acceso a la memoria no alineada, y esto causa muchos problemas en las etapas UEFI DXE y BDS, por lo que debe habilitarlo lo antes posible.
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, # 2
mcr p15, 0, r0, c1, c0, 0
Un compilador con soporte de hardware para flotante acelera el gestor de arranque de aproximadamente 30 a 4 segundos. En plataformas ARMv7, Windows reclama soporte para VFPv3 +.
La inicialización de la pantalla, así como algunas asignaciones de mux de E / S, se realizan en U-Boot. Ahora U-Boot no es compatible con la interfaz LCD Serial RGB de 24/32 ppp, por lo que agregué el soporte Serial RGB a través de la implementación del framebuffer iMX en el kernel de Linux. El código aún no está en el asistente, pero lo pasaré allí más tarde.

La pantalla LCD parece funcionar. Todo el procedimiento:
- Ejecute uboot.
- Encuentra un pin para la luz de fondo de la pantalla.
- Encuentre el pin para la secuencia de inicialización de SPI y LCD.
- Encuentre el pin I2C y configure el PMIC a través de I2C para el voltaje correcto.
Demostración de interfaz LCD serie RGB en U-BootUEFI simplemente toma el framebuffer asignado por U-Boot y registra el Protocolo de salida de gráficos. Desafortunadamente, la resolución de la pantalla no cumple con los requisitos mínimos de la consola 80 * 25, por lo que cambié los componentes de la consola DXE agregando un nuevo modo 40 * 12.
El componente EDK2 afirma que la resolución de la pantalla no cumple con los requisitos mínimos de la consola 80 * 25Antes de hackear los componentes de la consola, hice un pequeño truco, arreglando la resolución de 640 * 480 en el protocolo UEFI GOP. El truco también ayudó a obtener información de diagnóstico del Administrador de arranque de Windows, porque la resolución 320 * 240 no es suficiente para mostrar el código de error. Periódicamente ejecuto la transferencia de bloques (BLT) desde el framebuffer al sistema de archivos y guardo los archivos BMP en una unidad USB.
Hack pone a disposición el modo 80 * 25 con algunos artefactos gráficosDespués de conectar un nuevo modo, la calidad de imagen mejora considerablemente.
Modo 40 * 12
Modo 40 * 12Así es como se ve el mensaje del Administrador de arranque de Windows con una resolución de 320 * 240:

El primer intento falla en la etapa de servicios de arranque UEFI. El código de error no es visible debido a la pequeña pantalla.
La transferencia en bloque (BLT) del framebuffer le permite guardar el mensaje en un archivo de imagen y leerloEn cuanto a soporte USB. Afortunadamente, el USB en el iMX6 es totalmente compatible y se incluye soporte en versiones recientes de Windows. Por lo tanto, tan pronto como configuré el controlador OTG en modo host y transferí el área MMIO a UEFI y Windows, funciona mágicamente sin problemas. Pero no encontramos VBus en el puerto OTG (suponemos que hay algún tipo de circuito DC-DC controlado por SoC o PMIC, pero esto es solo una hipótesis no verificada), por lo tanto, para la operación correcta, el puerto debe ser alimentado a través de alguna fuente externa.
SMBIOS
Asegúrese de informar correctamente el tamaño de la memoria y las áreas de dirección en SMBIOS, o Windows comenzará a hacer cosas increíblemente extrañas (tm).
El depurador de Windows no puede leer la memoria debido a una configuración SMBIOS incorrectaTemporizador y Extensiones HAL
Parece que podemos manejar la configuración de memoria (LPAE), pero probablemente habrá algún otro problema. Oh si ...

Entonces, cargar Windows hasta ahora solo alcanza esta etapa.
Si no se encuentra un temporizador de sistema adecuado, Windows hace referencia a alguna dirección de memoria supuesta e inválidaWindows no se iniciará si no se encuentra un controlador de interrupción o un temporizador del sistema. La hora del sistema se puede registrar utilizando la tabla GTDT (tabla de arquitectura ARM) o las extensiones HAL a través de la tabla CSRT.
iMX6ULL viene con tres temporizadores: iMX GPT (temporizador de propósito genérico), EPIT (temporizador periódico mejorado) y temporizador arquitectónico ARM. Este último apareció solo en iMX6UL / ULL, mientras que los sistemas SoC iMX6 anteriores funcionaban en núcleos más antiguos como el Cortex A15 sin el soporte de un temporizador arquitectónico. Microsoft implementó la extensión EPIT HAL para el temporizador del sistema, pero no se cargó al principio debido a una falta de coincidencia entre el identificador de hardware en la tabla CSRT y la imagen del sistema (descargué el FFU anterior para iMX6 Solo). Por lo tanto, cuando el temporizador no está disponible, Windows intentará desesperadamente inicializar el temporizador previsto y el sistema se bloqueará debido a un acceso no válido a la memoria.
La documentación de iMX6ULL menciona un temporizador arquitectónico, pero sin detalles sobre el procedimiento de inicialización. El contador del temporizador se puede inicializar con EDK2, pero el GIC PPI (por interrupción del procesador) no funcionará correctamente. Sin embargo, Windows se inicializa con éxito y utiliza un temporizador a través de la tabla GTDT.
UEFI actualmente usa el temporizador EPIT y lo deshabilita cuando se transfiere a Windows. A su vez, Windows inicializa el temporizador GPT. En algún momento posterior, UEFI también puede cambiar a GPT con el procedimiento de inicialización adecuado.
Algunos periféricos requieren la extensión HAL para el controlador Smart DMA (SDMA); no es demasiado difícil de descargar.
¡Muéstrame cómo funciona!
[Seguridad] La imagen de terceros [0] se puede cargar después de 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: error al encontrar el rango 10000000 - 100EEFFF
Carga del controlador en 0x0008E9D6000 EntryPoint = 0x0008E9E7511 bootmgfw.efi
InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 8F28EB10
ProtectUefiImageCommon - 0x8F257028
0x000000008E9D6000 - 0x00000000000EF000
InstallProtocolInterface: 752F3136-4E16-4FDC-A22A-E5F46812F4CA 8FBFF88C
ConvertPages: error al encontrar el rango 102000 - 102FFF
Deshabilitar el temporizador EPIT en 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 te preguntas qué tan lento se carga, entonces unos tres minutos y medio.
Video a velocidad acelerada 2x:
¿Dónde está Secure Boot y TPM?
Esto es realmente opcional. Pero dado que OP-TEE es compatible con iMX6 / 7/8, puede ejecutar Secure Monitor en TrustZone (TZ) e implementar estos servicios a través de llamadas (Secure Monitor Calls) desde EL1 / PL1.
De hecho, la implementación oficial de iMX Windows IoT viene con OP-TEE, pero lo ignoré por ahorrar memoria.
¿Qué pasa con los conductores?
El repositorio de
Windows 10 IoT BSP contiene muchos controladores para iMX6 / 7/8. El controlador USB funciona de fábrica, como ya se mencionó. Para la calculadora, también necesita teclados y controladores de pantalla táctil.
Están disponibles en el árbol de kernel de Linux, por lo que no debería ser demasiado difícil portarlos a Windows.
¿Puedo descargar Windows RT 8.1?
Posiblemente Actualización: Windows RT 8.1 no arrancará, solo versiones posteriores. Windows PE no arrancará en modo ramdisk porque 256 MB de memoria no es suficiente. No pude iniciar el modo de inicio plano, después de enumerar los dispositivos (incluida la unidad USB) entra en algún tipo de ciclo sin una mayor inicialización.
HP Prime G2 cargó Windows, que lanzó una aplicación de calculadora
Bloc de notas en calculadora
El bloc de notas de la calculadora está intentando enviar texto para imprimir.¡Pero también quiero arrancar Linux!
Hay dos opciones:
- Simplemente use U-Boot para arrancar zImage, el árbol de dispositivos e initrd.
- Mueva las áreas de memoria FD, MpPark y FrameBuffer a la parte superior de la memoria del sistema, dejando 128 MB libres en el área de memoria inferior.
Descargue Linux a través de GRUB o directamente desde EFISTUB. Todo se carga normalmente, aquí hay un fragmento del registro:
EFI stub: salir de los servicios de arranque e instalar el mapa de direcciones virtuales ...
Deshabilitar el temporizador EPIT en ExitBootServicesEventSetUefiImageMemoryAttributes - 0x000000008F97B000 - 0x0000000000003000 (0x0000000000000008)
SetUefiImageMemoryAttributes - 0x000000008F978000 - 0x0000000000003000 (0x0000000000000008)
SetUefiImageMemoryAttributes - 0x000000008F973000 - 0x0000000000005000 (0x0000000000000008)
SetUefiImageMemoryAttributes - 0x000000008F970000 - 0x0000000000003000 (0x0000000000000008)
SetUefiImageMemoryAttributes - 0x000000008F96D000 - 0x0000000000003000 (0x0000000000000008)
SetUefiImageMemoryAttributes - 0x000000008F96A000 - 0x0000000000003000 (0x0000000000000008)
Arranque de Linux en CPU física 0x0
Linux versión 4.14.98-g371433a62906-dirty (imbushuo @ bc-macbookpro) (gcc versión 7.4.1 20181213 [linaro-7.4-2019.02 revisión 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] (Linaro GCC 7.4-2019.02): # 2 29 EST 2019
CPU: procesador ARMv7 [410fc075] revisión 5 (ARMv7), cr = 10c53c7d
CPU: instrucciones div disponibles: parchear el código de división
CPU: caché de datos sin alias PIPT / VIPT, caché de instrucciones de alias VIPT
OF: fdt: Modelo de máquina: Calculadora HP Prime G2
Política de memoria: reescritura de caché de datos
efi: Obtener parámetros EFI de FDT:
efi: EFI v2.70 por EDK II
efi: ACPI 2.0 = 0x8f49b000 SMBIOS = 0x8f9a8000 SMBIOS 3.0 = 0x8f9a6000
OF: mem reservado: no se pudo asignar memoria para el nodo 'linux, cma'
CPU: todas las CPU se iniciaron en modo SVC.
Construido 1 zonelists, agrupación de movilidad en. Páginas totales: 64516
Línea de comando del núcleo: zImage.efi root = / dev / ram0 rw initrd = / rootfs.cpio.gz dtb = / imx6ull-14x14-prime.dtb
Si usa la configuración NXP Linux, esto bloqueará el núcleo porque lee la dirección de memoria initrd del árbol de dispositivos o algunos parámetros de configuración predefinidos, y, por supuesto, initrd se carga en otro lugar en UEFI. Es necesario eliminar estos parámetros y hacer que la configuración sea más universal.
Pero por que?
La gente habla de ejecutar Windows en diferentes dispositivos, por lo que quiero troll antes de fin de año.
¿Qué hay de otros proyectos? Que sigue
El trabajo continuará. También debe implementar algunos controladores, lograr el arranque UEFI con NAND incorporado, implementar la interfaz amigable de arranque UEFI para la calculadora y estudiar la posibilidad de cargar el sistema operativo de stock HP PPL desde mi UEFI.