ILD

port latest linux 6.6 to mediatek mt7981b soc from scratch, part 3
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2024-12-1 站点:Inside Linux Development

前面两个part,tiny内核基本ok了,能看到串口输出,part 3将创建一个rootfs,并拉起相关的外设子系统。

1 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


2 mtd & spi nand flash

开启相关的配置项:

+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"


4 ethernet

开启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


开启后,可以显示有线接口

5 wifi6

开启相关配置:

+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


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.