三个仿真平台都不认识这颗芯片,那还能做什么?
先从最简单的一步开始:证明这颗内核本身是可移植的。如果连 QEMU 的通用 virt 平台都跑不起来,那后面自建模型就是空谈。
改之前:它只认 AT91 那套
翻 BSP 内核的 .config,几个关键项是这样的:
CONFIG_SERIAL_ATMEL=y # CONFIG_SERIAL_8250 is not set CONFIG_MICROCHIP_CLOCKSOURCE_PIT64B=y # CONFIG_ARCH_VIRT is not set
【06_01_缺什么】
串口只有 AT91 USART,时钟源只有 PIT64B,平台层面根本没开 virt。这四行决定了它在 virt 上不可能有任何输出。
加 10 个配置项
meta-atmel 的 linux.inc 里,do_configure 会自动合并 ${WORKDIR}/*.cfg。利用这个机制,在本地层加一个片段:
CONFIG_ARCH_VIRT=y CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_ARM_ARCH_TIMER=y CONFIG_ARM_PSCI_FW=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MMIO=y CONFIG_VIRTIO_BLK=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y
再用 bbappend 把它挂进 SRC_URI。重编内核 140 秒。
内核源码一行没改。
第一次启动:零输出
改完编出来,直接跑:
qemu-system-arm -M virt -cpu cortex-a7 -m 512 \\ -kernel zImage -initrd initramfs -append "console=ttyAMA0 rdinit=/init" \\ -nographic
屏幕上什么都没有。
这种情况最容易误判成内核崩了。我用 -d guest_errors 抓 QEMU 内部日志,结果干干净净——没有任何异常,说明内核没崩,是根本没走到串口初始化。
那问题就不在内核,在别处。回头看启动参数,我多传了一个自己 dumpdtb 导出的 virt.dtb,跟 QEMU 实际生成的机器不匹配。去掉 -dtb,让 QEMU 自己生成,就通了。
通了之后
150 行日志一路跑到底:
OF: fdt: Machine model: linux,dummy-virt Kernel command line: console=ttyAMA0 rdinit=/init arch_timer: cp15 timer(s) running at 62.50MHz (virt). 9000000.pl011: ttyAMA0 at MMIO 0x9000000 (irq = 20) is a PL011 rev1 printk: console [ttyAMA0] enabled ... Run /bin/sh as init process
【06_02_virt启动】
clocksource: arch_sys_counter 和 ttyAMA0 这两行,正好印证了新增的 arch timer 和 PL011 配置都生效了。
uname -a 出来是 6.6.64-linux4microchip+sama7d65-2025.02 ... armv7l GNU/Linux,MemTotal 506628 kB。
这一步的意义
它把问题切开了。
之前的状态是"BSP 内核在 QEMU 上跑不了",你分不清是内核配置问题、工具链问题,还是缺机器模型。现在 virt 上跑通了,说明内核、工具链、rootfs、启动参数这一整条链都是好的,剩下的问题就只有一条:没有 SAMA7D65 的机器模型。
【06_03_证明与未证明】
但边界也要说清楚。virt 证明的是"环境行不行",证明不了"这颗芯片行不行"——它没有 GMAC、没有 CAN、没有显示,串口和时钟也不是芯片上那两个。
所以下一步是把这个模型自己写出来。
我要赚赏金
