前面两个part,tiny内核基本ok了,能看到串口输出,part 3将创建一个rootfs,并拉起相关的外设子系统。
由于mtd还没有拉起来,因此先使用initramfs作为rootfs。开启相关内核选项。
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_XZ=y
启动报错:Failed to execute /init (error -2)
发现是内核没有开启Binary format脚本支持,甚至ELF都还没开。需要打开,否则无法运行任何程序。
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_SCRIPT=y
开启后,发现init运行了,但是报错,错误也打印到串口了,如果串口没有任何错误输出,那就是没有运行,如上面一样。
/bin/sh: error while loading shared libraries: libm.so.6: cannot open shared object file: No such file or directory
rootfs里面是有c库的,怀疑是ld的搜索路径是/lib64。创建一个符号链接后,ok了。
$ ln -s lib lib64
启动后,发现proc sys dev都无法挂载,发现是相关配置没开:
+CONFIG_DEVTMPFS=y
+CONFIG_PROC_FS=y
+CONFIG_SYSFS=y
开启后rootfs ok了:
Run /init as init process
with arguments:
/init
with environment:
HOME=/
TERM=linux
firmware=0
mtd=ubi
uart_en=1
mount: mounting debugfs on /sys/kernel/debug failed: No such file or directory
start /etc/rc.d/S01mount failed, boot halt
Please press Enter to activate this console.
root@(none):~#
root@(none):~#
root@(none):~# ls
bin etc lib mnt ram root sbin tmp web
dev init lib64 proc rom run sys usr
开启相关的配置项:
+CONFIG_MTD=y
+CONFIG_MTD_SPI_NAND=y
+CONFIG_SPI=y
开启后,系统检测到了spi,但是崩溃了:
Internal error: synchronous external abort: 0000000096000210 [#1] SMP
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.6.31+ #20
Hardware name: Xiaomi Mi Router WR30U (stock layout) (DT)
pstate: 40400005 (nZcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : readl+0x0/0x18
lr : mtk_spi_set_cs+0x2c/0x6c
sp : ffffff8000037a40
x29: ffffff8000037a40 x28: 0000000000000000 x27: ffffffc08024009c
x26: ffffffc08022eb56 x25: ffffffc08022eb4d x24: ffffff800ff6a1d8
x23: 0000000000000000 x22: 0000000000000000 x21: 0000000000000000
x20: 0000000000000000 x19: ffffff80002a5c00 x18: 000000000000000a
x17: 0000000000000006 x16: 0000000100000000 x15: ffffff8000037868
x14: 0000000000000000 x13: ffffffffffffffff x12: ffffffffffffffff
x11: 0000000000000000 x10: ffffff80003640df x9 : ffffff80003640de
x8 : 000000000000002e x7 : ffffffc08022e970 x6 : 00000000000f4240
x5 : 0000000000000000 x4 : 0000000000000001 x3 : ffffff8000161440
x2 : ffffffc080174ca0 x1 : ffffff8000161000 x0 : ffffffc0803c7018
Call trace:
readl+0x0/0x18
spi_set_cs+0xdc/0x128
spi_setup+0x1c8/0x21c
__spi_add_device+0xd0/0x138
spi_add_device+0x28/0x44
spi_register_controller+0x804/0x82c
devm_spi_register_controller+0x48/0x88
mtk_spi_probe+0x4c8/0x4f0
platform_probe+0x48/0x80
really_probe+0x138/0x270
__driver_probe_device+0xb0/0xc8
driver_probe_device+0x3c/0xbc
__driver_attach+0xe8/0xf8
bus_for_each_dev+0x6c/0xa0
driver_attach+0x20/0x28
bus_add_driver+0xb4/0x1ac
driver_register+0xb4/0xf0
__platform_driver_register+0x24/0x2c
mtk_spi_driver_init+0x18/0x20
do_one_initcall+0x68/0x10c
kernel_init_freeable+0x1f4/0x1f8
kernel_init+0x20/0x11c
ret_from_fork+0x10/0x20
Code: 1a9f17e0 d65f03c0 52800000 17fffffe (b9400000)
---[ end trace 0000000000000000 ]---
在readl读取spi controller寄存器的时候,崩溃了,看驱动代码,有启动电源:
pm_runtime_enable(dev);
在这个函数加打印,发现没有打印,原来是配置没开,开启后,spi正常了。
+CONFIG_PM=y
spi-nand spi0.0: unknown raw ID 6400bfbfbf
spi-nand: probe of spi0.0 failed with error -524
经过一顿分析,合入openwrt的几个patch后,就ok了。
431-drivers-spi-mt65xx-Move-chip_config-to-driver-s-priv.patch
432-drivers-spi-Add-support-for-dynamic-calibration.patch
433-drivers-spi-mem-Add-spi-calibration-hook.patch
434-drivers-spi-mt65xx-Add-controller-s-calibration-para.patch
435-drivers-mtd-spinand-Add-calibration-support-for-spin.patch
436-drivers-mtd-spi-nor-Add-calibration-support-for-spi-.patch
spi-nand spi0.0: ESMT SPI NAND was found.
spi-nand spi0.0: 128 MiB, block size: 128 KiB, page size: 2048, OOB size: 64
10 fixed-partitions partitions found on MTD device spi0.0
Creating 10 MTD partitions on "spi0.0":
0x000000000000-0x000000100000 : "BL2"
0x000000100000-0x000000140000 : "Nvram"
0x000000140000-0x000000180000 : "Bdata"
0x000000180000-0x000000380000 : "Factory"
0x000000380000-0x000000580000 : "FIP"
0x000000580000-0x0000005c0000 : "crash"
0x0000005c0000-0x000000600000 : "crash_log"
0x000007600000-0x000007640000 : "KF"
0x000000600000-0x000002800000 : "ubi_kernel"
Freeing initrd memory: 5684K
0x000002800000-0x000007600000 : "ubi"
开启TCP&IP相关内核选项
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_PACKET_DIAG=y
+CONFIG_UNIX=y
+CONFIG_UNIX_DIAG=y
+CONFIG_INET=y
+CONFIG_INET_UDP_DIAG=y
+CONFIG_INET_RAW_DIAG=y
+# CONFIG_IPV6_SIT is not set
+# CONFIG_WIRELESS is not set
开启mtk ethernet driver
+CONFIG_NET_DSA=y
+CONFIG_NETDEVICES=y
+CONFIG_NET_DSA_MT7530=y
+CONFIG_NET_VENDOR_MEDIATEK=y
+CONFIG_NET_MEDIATEK_SOC=y
开启后,可以显示有线接口
开启相关配置:
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
-# CONFIG_WIRELESS is not set
+CONFIG_CFG80211=m
+CONFIG_MAC80211=m
+CONFIG_CFG80211=m
+CONFIG_MAC80211=m
+CONFIG_PCI=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEASPM_PERFORMANCE=y
+CONFIG_PCI_DEBUG=y
+CONFIG_PCIE_MEDIATEK_GEN3=y
-# CONFIG_WLAN is not set
+CONFIG_MT7915E=m
+CONFIG_MT798X_WMAC=y
probe函数没有调用,在
drivers/base/core.c
drivers/base/dd.c
的最前面,加上
#define DEBUG
开启调试就可以了。
[ 11.070850] bus: 'platform': __driver_probe_device: matched device 18000000.wifi with driver mt798x-wmac
[ 11.080359] platform 18000000.wifi: error -517: wait for supplier /soc/spi@1100a000/flash@0/partitions/partition@180000/nvmem-layout/eeprom@0
是nvmem没开启。开启不好使,把dts里面的注释掉:
&wifi {
status = "okay";
+#if 0
nvmem-cells = <&eeprom_factory_0>;
nvmem-cell-names = "eeprom";
+#endif
};
[ 3.073714] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[ 3.094546] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[ 3.101042] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
[ 3.108447] platform regulatory.0: Direct firmware load for regulatory.db.p7s failed with error -2
[ 3.117431] cfg80211: loaded regulatory.db is malformed or signature is missing/invalid
[ 3.955177] mt798x-wmac 18000000.wifi: HW/SW Version: 0x8a108a10, Build Time: 20240823161240a
[ 3.955177]
[ 3.977038] mt798x-wmac 18000000.wifi: WM Firmware Version: ____000000, Build Time: 20240823161304
[ 4.017557] mt798x-wmac 18000000.wifi: WA Firmware Version: DEV_000000, Build Time: 20240823161841
[ 4.114619] mt798x-wmac 18000000.wifi: eeprom load fail, use default bin
# ls /sys/class/ieee80211/
phy0 phy
参考:
https://unix.stackexchange.com/questions/708779/linux-kernel-boot-failed-to-execute-init-error-2