Jadi Anda ingin menjalankan Windows 10 pada kalkulator? Baiklah


HP Prime G2 di bawah Windows 10 IoT

Seseorang hanya bisa bermimpi memulai Windows pada kalkulator standar sebelum munculnya HP Prime G2. Kalkulator pada perangkat keras sekuat itu tidak pernah masuk pasar. Dan yang lebih penting, HP telah memilih prosesor ARMv7-A! Artikel ini membahas cara menginstal UEFI dan ACPI pada perangkat.


Spesifikasi SoC pada HP Prime G2. SoC NXP i.MX 6ULL โ€‹โ€‹(Ultra Lite) memiliki prosesor single-core Cortex A7

Pekerjaan sebelumnya


Teman saya Wenqin Zhang (Zephray) melakukan pekerjaan dasar rekayasa balik spesifikasi GPIO dan kalkulator. Selain itu, ia berhasil port bekerja U-Boot dan Linux ke kalkulator.

Menurut TI-Planet , kalkulator menyediakan sejumlah besar pin uji, termasuk SD / MMC, JTAG dan UART.

Sarah (winocm) mempelajari kemungkinan menjalankan Windows RT pada platform Qemu . Pada 2019, sesuatu telah berubah, tetapi artikel tersebut belum kehilangan nilainya.

Microsoft telah menandatangani perjanjian NXP untuk menyediakan dukungan untuk Windows 10 IoT pada chip iMX SoC. Jadi, secara teknis, Windows 10 IoT harus bekerja pada kalkulator ini (juga Windows pada ARM).

Perbaiki persyaratan sistem Windows


Persyaratan sistem untuk menjalankan keluarga sistem operasi Windows 10 terdaftar di situs web Microsoft Documents . Bahkan persyaratan paling minimal lebih dari Linux: sistem membutuhkan prosesor x86 / x64 / ARMv7 / AArch64, setidaknya 256 MB memori dan 2 GB ruang disk. Diperlukan firmware UEFI fungsional, tabel ACPI dan SMBIOS lengkap.

Dalam kasus kami, tidak ada cukup ruang pada perangkat (dan Windows juga tidak mendukung Raw SLC NAND), tetapi Anda dapat menghubungkan perangkat boot melalui USB ke kalkulator.

Sarah mendaftar persyaratan arsitektur untuk ARMv7 untuk menjalankan Windows. Selama bertahun-tahun, persyaratannya sedikit berubah, seperti inilah tampilannya saat ini:

  Prosesor sistem: ARMv7-A prosesor yang kompatibel dengan VFPv3 + VFP HalfPrec, VFPv4 juga cocok
 Memori: setidaknya 256 MB RAM (mungkin kurang)
 Periferal:
     - Pengatur waktu sistem (baik oleh arsitektur atau oleh vendor)
     - ARM Generic Interrupt Controller (GIC) atau Broadcom Interrupt Controller pada BCM2835 / 2836/2837, CPU dan Antarmuka Distributor.  Jika GIC hadir dan dideklarasikan dalam sistem, GICv2 ke atas diperlukan.
     - framebuffer
     - Dukungan untuk UART, atau NS16550, BCM283x, atau dari vendor (dalam kasus Qualcomm dan NXP)
     - Firmware: UEFI 2.3 atau lebih tinggi 

Kalkulator kami memenuhi persyaratan ketat ini. Namun, SoC default berjalan pada 396 MHz, yang kurang dari level dasar 400 MHz / 1 GHz. Memori sistem 250 MB juga dilaporkan, sedangkan persyaratan minimum untuk sistem dengan UI adalah 512 MB. Tapi itu sedang memuat!


Menurut cpuinfo dari WinDbg, SoC beroperasi pada 396 MHz

Saya pikir Anda dapat mengurangi persyaratan lebih lanjut. Jika saya ingat dengan benar, Windows Server Nano memiliki sekitar 150 MB memori untuk boot pada sistem amd64.

UEFI dan ACPI


Saya telah menulis beberapa kali tentang implementasi UEFI , jadi tidak ada yang baru di sini. Pada dasarnya, UEFI terdiri dari satu set driver perangkat dan komponen kernel TianoCore . Tabel ACPI disalin dari repositori Windows IoT iMX Project Mu dan dipangkas.

UEFI melakukan booting dari U-Boot . iMX secara default tidak memungkinkan akses ke memori yang tidak selaras, dan ini menyebabkan banyak masalah pada tahap UEFI DXE dan BDS, jadi Anda harus mengaktifkannya sesegera mungkin.

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

Kompiler dengan dukungan perangkat keras untuk float mempercepat bootloader dari sekitar 30 hingga 4 detik. Pada platform ARMv7, Windows mengklaim dukungan untuk VFPv3 +.

Inisialisasi layar, serta beberapa tugas I / O mux, dilakukan di U-Boot. Sekarang U-Boot tidak mendukung antarmuka LCD Serial RGB 24 / 32bpp, jadi saya menambahkan dukungan Serial RGB melalui penerapan framebuffer iMX di kernel Linux. Kode ini belum ada di wizard, tetapi saya akan meneruskannya nanti.



LCD sepertinya berfungsi. Seluruh prosedur:

  1. Jalankan uboot.
  2. Temukan pin untuk lampu latar layar.
  3. Temukan pin untuk urutan inisialisasi SPI dan LCD.
  4. Temukan pin I2C dan konfigurasikan PMIC melalui I2C untuk mendapatkan tegangan yang benar.


Demonstrasi Antarmuka LCD Serial RGB di U-Boot

UEFI hanya mengambil framebuffer yang dialokasikan oleh U-Boot dan mendaftarkan Graphics Output Protocol. Sayangnya, resolusi layar tidak memenuhi persyaratan minimum konsol 80 * 25, jadi saya mengubah komponen DXE Konsol dengan menambahkan mode 40 * 12 baru.


Komponen EDK2 mengklaim bahwa resolusi layar tidak memenuhi persyaratan minimum konsol 80 * 25

Sebelum meretas komponen konsol, saya melakukan sedikit trik, memperbaiki resolusi 640 * 480 ke protokol UEFI GOP. Caranya juga membantu mendapatkan informasi diagnostik dari Windows Boot Manager, karena resolusi 320 * 240 tidak cukup untuk menampilkan kode kesalahan. Saya secara berkala menjalankan transfer blok (BLT) dari framebuffer ke sistem file dan menyimpan file BMP ke drive USB.


Hack membuat tersedia mode 80 * 25 dengan beberapa artefak grafis

Setelah menghubungkan mode baru, kualitas gambar sangat meningkat.


40 * 12 mode


40 * 12 mode

Beginilah pesan Windows Boot Manager terlihat pada resolusi 320 * 240:



Upaya pertama gagal pada tahap layanan boot UEFI. Kode kesalahan tidak terlihat karena layar kecil.


Block-transfer (BLT) dari framebuffer memungkinkan Anda untuk menyimpan pesan ke file gambar dan membacanya

Mengenai dukungan USB. Untungnya, USB di iMX6 sepenuhnya sesuai, dan dukungan disertakan dalam versi Windows terbaru. Oleh karena itu, segera setelah saya mengonfigurasi pengontrol OTG dalam mode host dan memindahkan area MMIO ke UEFI dan Windows, ia secara ajaib berfungsi tanpa masalah. Tetapi kami tidak menemukan VBus pada port OTG (kami berasumsi bahwa ada semacam rangkaian DC-DC yang dikendalikan oleh SoC atau PMIC, tetapi ini hanya hipotesis yang tidak diverifikasi), oleh karena itu, untuk operasi yang benar, port harus diberdayakan melalui beberapa sumber eksternal.

SMBIOS


Pastikan Anda menginformasikan ukuran memori dan area alamat dengan benar di SMBIOS, atau Windows akan mulai melakukan hal-hal yang sangat aneh (tm).


Windows debugger tidak dapat membaca memori karena konfigurasi SMBIOS salah

Timer dan Ekstensi HAL


Kami tampaknya dapat menangani konfigurasi memori (LPAE), tetapi mungkin akan ada beberapa masalah lain. Oh ya ...



Jadi, memuat Windows sejauh ini hanya mencapai tahap ini.


Jika timer sistem yang cocok tidak ditemukan, Windows merujuk ke beberapa alamat memori yang dianggap dan tidak valid

Windows tidak akan boot jika pengontrol interupsi atau timer sistem tidak ditemukan. Waktu sistem dapat didaftarkan menggunakan tabel GTDT (tabel arsitektur ARM) atau ekstensi HAL melalui tabel CSRT.

iMX6ULL hadir dengan tiga timer: iMX GPT (Generic Purpose Timer), EPIT (Enhanced Periodic Timer) dan ARM Architectural Timer. Yang terakhir hanya muncul di iMX6UL / ULL, sedangkan sistem SoC iMX6 sebelumnya bekerja pada kernel yang lebih tua seperti Cortex A15 tanpa dukungan timer arsitektur. Microsoft menerapkan ekstensi HIT EPIT untuk pengatur waktu sistem, tetapi pada awalnya tidak memuat karena ketidakcocokan antara pengidentifikasi perangkat keras dalam tabel CSRT dan gambar sistem (saya mengunduh FFU sebelumnya untuk iMX6 Solo). Oleh karena itu, ketika penghitung waktu tidak tersedia, Windows akan mati-matian untuk menginisialisasi penghitung waktu yang dimaksudkan, dan sistem akan macet karena akses memori yang tidak valid.

Dokumentasi iMX6ULL menyebutkan pewaktu arsitektur, tetapi tanpa detail tentang prosedur inisialisasi. Penghitung waktu dapat diinisialisasi dengan EDK2, tetapi GIC PPI (Per Processor Interrupt) tidak akan berfungsi dengan benar. Namun, Windows berhasil menginisialisasi dan menggunakan timer melalui tabel GTDT.

UEFI saat ini menggunakan timer EPIT dan menonaktifkannya saat mentransfer ke Windows. Pada gilirannya, Windows menginisialisasi timer GPT. Di beberapa titik kemudian, UEFI juga dapat beralih ke GPT dengan prosedur inisialisasi yang tepat.

Beberapa periferal memerlukan ekstensi HAL untuk pengontrol Smart DMA (SDMA), tidak terlalu sulit untuk diunduh.

Tunjukkan padaku cara kerjanya!


  [Keamanan] Gambar pihak ke-3 [0] dapat dimuat setelah 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.
  InstalProtocolInterface: 5B1B31A1-9562-11D2-8E3F-00A0C969723B 8F257028
  ConvertPages: gagal menemukan kisaran 10000000 - 100EEFFF
  Memuat driver di 0x0008E9D6000 EntryPoint = 0x0008E9E7511 bootmgfw.efi
  InstalProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 8F28EB10
  ProtectUefiImageCommon - 0x8F257028
  0x000000008E9D6000 - 0x00000000000EF000
  InstalProtocolInterface: 752F3136-4E16-4FDC-A22A-E5F46812F4CA 8FBFF88C
  ConvertPages: gagal menemukan kisaran 102000 - 102FFF
  Menonaktifkan timer EPIT pada ExitBootServicesEventSetUefiImageMemoryAttributes - 0x000000008F78A000 - 0x0000000000003000 (0x000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F787000 - 0x000000000000003000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F784000 - 0x000000000000003000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F77F000 - 0x0000000000005000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F77C000 - 0x000000000000003000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F779000 - 0x000000000000003000 (0x000000000000000000008) 

Jika Anda bertanya-tanya seberapa lambat itu dimuat, maka sekitar tiga setengah menit.

Video dengan kecepatan akselerasi 2x:


Di mana Secure Boot dan TPM?


Ini sebenarnya opsional. Tetapi karena OP-TEE mendukung iMX6 / 7/8, Anda dapat menjalankan Secure Monitor di TrustZone (TZ) dan mengimplementasikan layanan ini melalui panggilan (Secure Monitor Calls) dari EL1 / PL1.

Sebenarnya, implementasi resmi iMX Windows IoT hadir dengan OP-TEE, tapi saya mengabaikannya demi menghemat memori.

Bagaimana dengan pengemudi?


Repositori Windows 10 IoT BSP berisi banyak driver untuk iMX6 / 7/8. Driver USB berfungsi di luar kotak, seperti yang telah disebutkan. Untuk kalkulator, Anda juga memerlukan driver dan keyboard layar sentuh.

Mereka tersedia di pohon kernel Linux, jadi seharusnya tidak terlalu sulit untuk port mereka ke Windows.

Bisakah saya mengunduh Windows RT 8.1?


Mungkin Pembaruan: Windows RT 8.1 tidak akan bisa boot, hanya versi yang lebih baru. Windows PE tidak akan bisa boot dalam mode ramdisk karena memori 256 MB tidak cukup. Saya tidak dapat memulai mode boot datar, setelah daftar perangkat (termasuk drive USB) itu masuk ke dalam semacam siklus tanpa inisialisasi lebih lanjut.


HP Prime G2 memuat Windows, yang meluncurkan aplikasi kalkulator


Notepad pada kalkulator


Notepad pada kalkulator sedang mencoba mengirim teks untuk dicetak.

Tetapi saya juga ingin mem-boot Linux!


Ada dua opsi:

  • Cukup gunakan U-Boot untuk mem-boot zImage, bagan perangkat dan initrd.
  • Pindahkan area memori FD, MpPark, dan FrameBuffer ke atas memori sistem, meninggalkan 128 MB gratis di area memori yang lebih rendah.

Unduh Linux melalui GRUB atau langsung dari EFISTUB. Semuanya memuat secara normal, ini adalah bagian dari log:

  Rintisan EFI: Keluar dari layanan boot dan menginstal peta alamat virtual ...
  Menonaktifkan timer EPIT pada ExitBootServicesEventSetUefiImageMemoryAttributes - 0x000000008F97B000 - 0x0000000000003000 (0x000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F978000 - 0x000000000000003000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F973000 - 0x0000000000005000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F970000 - 0x000000000000003000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F96D000 - 0x000000000000003000 (0x000000000000000000008)
  SetUefiImageMemoryAttributes - 0x000000008F96A000 - 0x000000000000003000 (0x000000000000000000008)
  Booting Linux pada CPU fisik 0x0
  Linux versi 4.14.98-g371433a62906-dirty (imbushuo @ bc-macbookpro) (versi gcc 7.4.1 20181213 [linaro-7.4-2019.02 revisi 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] (Linaro GCC 7.4-2019.02): 29 EST 2019
  CPU: Prosesor ARMv7 [410fc075] revisi 5 (ARMv7), cr = 10c53c7d
  CPU: instruksi div tersedia: menambal kode divisi
  CPU: PIPT / VIPT cache data nonaliasing, VIPT alias cache instruksi
  OF: fdt: Model mesin: HP Prime G2 Calculator
  Kebijakan memori: Dataeback cache data
  efi: Mendapatkan parameter EFI dari FDT:
  efi: EFI v2.70 oleh EDK II
  efi: ACPI 2.0 = 0x8f49b000 SMBIOS = 0x8f9a8000 SMBIOS 3.0 = 0x8f9a6000
  OF: reserved mem: gagal mengalokasikan memori untuk node 'linux, cma'
  CPU: Semua CPU dimulai dalam mode SVC.
  Dibangun 1 zonis, pengelompokan mobilitas.  Total halaman: 64516
  Baris perintah kernel: zImage.efi root = / dev / ram0 rw initrd = / rootfs.cpio.gz dtb = / imx6ull-14x14-prime.dtb 

Jika Anda menggunakan konfigurasi NXP Linux, kernel ini akan lumpuh karena ia membaca alamat memori initrd dari bagan perangkat atau beberapa parameter konfigurasi yang telah ditentukan, dan, tentu saja, initrd dimuat di tempat lain di UEFI. Penting untuk menghapus parameter ini dan membuat konfigurasi lebih universal.

Tapi mengapa?


Orang-orang berbicara tentang menjalankan Windows pada perangkat yang berbeda, jadi saya ingin mengendalikannya sebelum akhir tahun.

Bagaimana dengan proyek lain? Apa selanjutnya


Pekerjaan akan berlanjut. Anda juga perlu mengimplementasikan beberapa driver, mencapai boot UEFI dengan NAND bawaan, mengimplementasikan antarmuka boot UEFI yang ramah pengguna untuk kalkulator, dan mempelajari kemungkinan memuat sistem operasi stok HP PPL dari UEFI saya.

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


All Articles