qemu: lumia550.dts, pbl_stub WIP, build-emmc.sh, launch-wsl.sh dry-run
This commit is contained in:
Executable
+26
@@ -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"
|
||||||
Executable
+23
@@ -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
|
||||||
@@ -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 */
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -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")
|
||||||
Reference in New Issue
Block a user