qemu: lumia550.dts, pbl_stub WIP, build-emmc.sh, launch-wsl.sh dry-run

This commit is contained in:
SashegDev
2026-09-07 07:22:44 +00:00
parent c71733042e
commit 165df8adb9
4 changed files with 172 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
# Сборка emmc.img = Boot1 + Boot2 + RPMB + User. WIP без orig FFU.
set -e
BOOT_MB=${BOOT_MB:-4}
RPMB_MB=${RPMB_MB:-4}
USER_MB=${USER_MB:-7456}
OUT=${1:-images/emmc.img}
FW_DIR=fw
usage() { echo "usage: $0 [--help] [out.img]"; echo " Нужны fw/orig.ffu или fw/dump.bin. Без них — нулевой WIP-образ для проверки геометрии."; }
if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then usage; exit 0; fi
mkdir -p "$(dirname "$OUT")"
# WIP: пока нет orig FFU (2GB не влезет в 4.1G на сервере) — строим нулевой образ верной геометрии
# Boot1/Boot2 кратно 128K, одинаковые. User кратно 512B.
echo "[build-emmc] WIP: orig FFU не найден в $FW_DIR — строю нулевой образ геометрии"
echo "[build-emmc] Положи в fw/orig.ffu и перезапусти для реальной GPT40"
echo "[build-emmc] Boot=${BOOT_MB}M RPMB=${RPMB_MB}M User=${USER_MB}M -> $OUT"
BOOT_KB=$((BOOT_MB*1024)); RPMB_KB=$((RPMB_MB*1024)); USER_KB=$((USER_MB*1024))
TOTAL_KB=$((BOOT_KB*2+RPMB_KB+USER_KB))
dd if=/dev/zero of="$OUT" bs=1K count=1024 status=none
truncate -s "${TOTAL_KB}K" "$OUT"
echo "[build-emmc] OK: $OUT ($(du -h "$OUT" | cut -f1)) — НУЛЕВОЙ, не шить в прод!"
echo "[build-emmc] TODO: mkemmc.sh + ffureader GPT + CID Samsung + EXT_CSD REV5"
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
# Запуск эмулятора под linux/amd64 (WSL). WIP: проверяет окружение, показывает команду.
set -e
if [ "$1" == "--help" ] || [ "$1" == "-h" ] || [ $# -eq 0 ]; then
cat <<'EOF'
usage: ./qemu/launch-wsl.sh [--check|--dry-run]
--check проверить qemu-system-arm, WSLg, образ
--dry-run показать команду запуска (по умолчанию)
Мобильное окно: portrait 720x1280, mouse=touch absolute, GTK.
thor2/WDRT только из Windows-хоста через usbip (см. compat/).
EOF
exit 0
fi
IMG=images/emmc.img
echo "[launch] WIP dry-run:"
echo "qemu-system-arm -M none -cpu cortex-a7 -m 1024 \\"
echo " -kernel qemu/pbl_stub.py \\"
echo " -drive file=$IMG,if=none,format=raw,id=emmc \\"
echo " -device sdhci-pci -device sd-card,drive=emmc \\"
echo " -serial stdio -display gtk,window-close=off"
echo "[launch] ВНИМАНИЕ: -M none/saimaa еще нет, sdhci-pci временный (нужен platform 0x07824000)."
echo "[launch] Видео WIP: ramfb 0x83000000, без virtio-gpu (палится)."
if [ "$1" == "--check" ]; then ../lumia-emu/tools/check-env.sh 2>/dev/null || ./tools/check-env.sh; fi
+100
View File
@@ -0,0 +1,100 @@
/dts-v1/;
/ {
model = "Microsoft Lumia 550 Saimaa RM-1127";
compatible = "microsoft,saimaa", "qcom,msm8909";
qcom,msm-id = <245 0>;
qcom,board-id = <0 0>;
#address-cells = <1>;
#size-cells = <1>;
chosen {
stdout-path = "serial0:115200n8";
bootargs = "earlycon console=ttyMSM0,115200n8";
};
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x40000000>; /* 1GB, верх обрезан HLOS */
};
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
qseecom@87a00000 { reg = <0x87a00000 0x200000>; no-map; };
modem_adsp@88000000 { reg = <0x88000000 0x5500000>; no-map; }; /* WIP: stub */
peripheral@8d500000 { reg = <0x8d500000 0x500000>; no-map; };
splash@83000000 { reg = <0x83000000 0xc00000>; no-map; };
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 { compatible = "arm,cortex-a7"; reg = <0>; };
cpu@1 { compatible = "arm,cortex-a7"; reg = <1>; };
cpu@2 { compatible = "arm,cortex-a7"; reg = <2>; };
cpu@3 { compatible = "arm,cortex-a7"; reg = <3>; };
};
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges = <0 0 0 0xffffffff>;
tlmm: pinctrl@1000000 {
compatible = "qcom,msm8909-tlmm";
reg = <0x1000000 0x300000>;
};
imem@8600000 {
compatible = "qcom,msm-imem";
reg = <0x08600000 0x1000>;
};
sdhc_1: sdhci@7824000 {
compatible = "qcom,sdhci-msm";
reg = <0x07824900 0x11c>, <0x07824000 0x800>;
qcom,bus-width = <8>;
non-removable;
status = "okay"; /* eMMC User, Boot1/2 нули WIP */
};
sdhc_2: sdhci@7864000 {
compatible = "qcom,sdhci-msm";
reg = <0x07864900 0x11c>, <0x07864000 0x800>;
qcom,bus-width = <4>;
status = "okay"; /* microSD */
};
serial0: serial@78af000 {
compatible = "qcom,msm-uartdm-v1.4";
reg = <0x78af000 0x200>;
status = "okay";
};
usb@78d9000 {
compatible = "qcom,hsusb-otg";
reg = <0x78d9000 0x400>;
qcom,hsusb-otg-mode = <1>;
status = "okay"; /* 05C6:9008 / 045E:9006 см. compat/ */
};
spmi@200f000 {
compatible = "qcom,spmi-pmic-arb";
reg = <0x200f000 0x1000>;
status = "okay"; /* PM8909 WIP-stub */
};
};
gpio-keys {
compatible = "gpio-keys";
vol-up { label = "Volume Up"; gpios = <&tlmm 90 1>; linux,code = <115>; };
cam-focus { label = "Camera Focus"; gpios = <&tlmm 91 1>; linux,code = <528>; };
cam-snap { label = "Camera Snapshot"; gpios = <&tlmm 92 1>; linux,code = <766>; };
/* PWR/VolDown через pm8909_pon: 116/114 */
};
};
+23
View File
@@ -0,0 +1,23 @@
#!/usr/bin/env python3
"""PBL-stub WIP: имитирует PBL MSM8909 для эмуляции.
Оригинал ROM 0x00100000 сверяет SBL1 по PK_HASH и уходит в EDL при ошибке.
Стуб: читает SBL1 из emmc User LBA 32768, кладет в IMEM-макет, прыгает.
EDL cookie 0x193D100 bit0 -> Sahara-Hello заглушка.
WIP: SecureBoot скипнут! Для 1:1 нужен QFPROM/PK_HASH из живого дампа.
"""
import struct, sys
PBL_ADDR = 0x00100000
IMEM_ADDR = 0x08600000
SBL1_LBA = 32768
EDL_COOKIE_ADDR = 0x193D100
def main(img="images/emmc.img"):
print(f"[pbl-stub] PBL @0x{PBL_ADDR:08X} (WIP, SecureBoot SKIPPED)")
print(f"[pbl-stub] check EDL cookie @0x{EDL_COOKIE_ADDR:08X} ... 0 (boot normal)")
print(f"[pbl-stub] would load SBL1 from User LBA {SBL1_LBA} -> IMEM 0x{IMEM_ADDR:08X}")
print("[pbl-stub] WIP: нужен fw/SBL1.bin из ffureader. Пока только лог.")
print("[pbl-stub] Sahara-Hello stub: 05C6:9008 ready (см. compat/)")
if __name__ == "__main__":
main(sys.argv[1] if len(sys.argv) > 1 else "images/emmc.img")