在 i.MX7s 上使用 Buildroot 20.20 NVMEM_IMX_OCOTP 读取 MAC

在 i.MX7s 上使用 Buildroot 20.20 NVMEM_IMX_OCOTP 读取 MAC

我们正在从 Buildroot 2018.02.9 (linux-4.14.85) 迁移到 Buildroot 2020.02.2 (linux-5.4.40),并发现我们无法再读取 I.MX7s SoC 上的 MAC 地址。下图说明了原因:

https://community.nxp.com/t5/i-MX-Processors/IMX6UL-sys-fsl-otp-HW-OCOTP-LOCK-is-not-found-in-5-4-kernel/mp/1079342

不幸的是,OTP 驱动程序不再受支持,它已移至 NVMEM 框架。 imx-ocotp.c\nvmem\drivers - linux-imx - i.MX Linux 内核 

IE。https://source.codeaurora.org/external/imx/linux-imx/tree/drivers/nvmem/imx-ocotp.c?h=imx_5.4.24_2.1.0

我们正在尝试使用标准 Linux DTS 和设备驱动程序方法来读取 MAC 地址,即无需编写额外的代码。目的是让以太网驱动程序读取 MAC。

我们的 Buildroot 20.20“DSM1_kernel_defconfig”包括:

CONFIG_NVMEM_IMX_OCOTP=y
CONFIG_NVMEM_IMX_IIM=y

ocotp 的 DTS 条目由 2 个文件组成:

  • linux-5.4.40/arch/arm/boot/dts/imx7s.dtsi :
            ocotp: ocotp-ctrl@30350000 {
                #address-cells = <1>;
                #size-cells = <1>;
                compatible = "fsl,imx7d-ocotp", "syscon";
                reg = <0x30350000 0x10000>;
                clocks = <&clks IMX7D_OCOTP_CLK>;

                tempmon_calib: calib@3c {
                    reg = <0x3c 0x4>;
                };

                tempmon_temp_grade: temp-grade@10 {
                    reg = <0x10 0x4>;
                };

                cpu_speed_grade: speed-grade@10 {
                    reg = <0x10 0x4>;
                };
            };

  • 我们的本地文件“device-tree/DSM1.dts”包含与此问题相关的两个部分:

a) 按照 @alexandre-belloni 的建议,将 nvmem-cells 和 nvmem-cell-names 添加到 &fec1:

&fec1 {

    nvmem-cells = <&MAC0>;
    // nvmem-consumer.yaml:
    nvmem-cell-names = "mac-address";

    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>;
    phy-mode = "rgmii";
    status = "okay";
    fixed-link {
        speed = <1000>;
        full-duplex;
    };
};

b) 以下“&ocotp”条目:

    &ocotp {    
        // Subnodes:
        MAC0:mac_add0@640{
            reg=<0x640 0x4>;
        };
    
        MAC1:mac_add1@650{
            reg=<0x650 0x4>;
        };
    
        MAC2:mac_add2@660{
            reg=<0x660 0x4>;
        };
    };

以上评论链接:

从控制台:

[    0.547384] fuse: init (API version 7.31)

[    1.706205] fec 30be0000.ethernet: Invalid MAC address: 00:00:00:00:00:00
[    1.713049] fec 30be0000.ethernet: Using random MAC address: 3e:ba:4a:d6:f9:60
[    1.756676] libphy: fec_enet_mii_bus: probed
[    1.763270] fec 30be0000.ethernet eth0: registered PHC device 0

[    2.534219] imx_ocotp 30350000.efuse: can't request region for resource [mem 0x30350000-0x3035ffff]
[    2.543780] imx_ocotp: probe of 30350000.efuse failed with error -16

[    1.706205] fec 30be0000.ethernet: Invalid MAC address: 00:00:00:00:00:00
[    1.713049] fec 30be0000.ethernet: Using random MAC address: 3e:ba:4a:d6:f9:60

KSZ8794 VLAN configuration complete
OK
Reading MAC address fuses...
MAC Address fuses not found
Starting network: [    6.976948] Generic PHY fixed-0:00: attached PHY driver [Generic PHY] (mii_bus:phy_addr=fixed-0:00, irq=POLL)
[    7.007287] fec 30be0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off

该板上的 MAC 当前未设置。我们想证明在继续使用以太网驱动程序中的 MAC 之前可以成功读取未设置的零值。最终我们将在生产过程中设置 MAC。

在设备树中进行挖掘未能找到任何我们认为是未设置的零 MAC 的内容:

ls -l /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@30350000

total 0
-r--r--r--    1 root     root             4 Oct  5 16:39 #address-cells
-r--r--r--    1 root     root             4 Oct  5 16:39 #size-cells
drwxr-xr-x    2 root     root             0 Oct  5 16:39 calib@3c
-r--r--r--    1 root     root             8 Oct  5 16:39 clocks
-r--r--r--    1 root     root            23 Oct  5 16:39 compatible
drwxr-xr-x    2 root     root             0 Oct  5 16:39 mac_add0@640
drwxr-xr-x    2 root     root             0 Oct  5 16:39 mac_add1@650
drwxr-xr-x    2 root     root             0 Oct  5 16:39 mac_add2@660
-r--r--r--    1 root     root            11 Oct  5 16:39 name
-r--r--r--    1 root     root            18 Oct  5 16:39 nvmem-cell-names
-r--r--r--    1 root     root             4 Oct  5 16:39 nvmem-cells
-r--r--r--    1 root     root            12 Oct  5 16:39 nvmem-cells-names
-r--r--r--    1 root     root             8 Oct  5 16:39 reg
drwxr-xr-x    2 root     root             0 Oct  5 16:39 speed-grade@10
drwxr-xr-x    2 root     root             0 Oct  5 16:39 temp-grade@10

子节点:

MAC0: ls -la /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@30350000 /mac_add0@640/

total 0
drwxr-xr-x    2 root     root             0 Oct  6 08:01 .
drwxr-xr-x    8 root     root             0 Oct  6 08:00 ..
-r--r--r--    1 root     root             9 Oct  6 08:01 name
-r--r--r--    1 root     root             4 Oct  6 08:01 phandle
-r--r--r--    1 root     root             8 Oct  6 08:01 reg

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/mac_add0@640/名称

0000000 616d 5f63 6461 3064 0000
0000009

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/mac_add0@640/phandle

0000000 0000 2000
0000004

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/mac_add0@640/reg

0000000 0000 4006 0000 0400
0000008

MAC1: ls -la /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@30350000 /mac_add1@650/

total 0
drwxr-xr-x    2 root     root             0 Oct  6 08:01 .
drwxr-xr-x    8 root     root             0 Oct  6 08:00 ..
-r--r--r--    1 root     root             9 Oct  6 08:01 name
-r--r--r--    1 root     root             8 Oct  6 08:01 reg

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/mac_add1@650/名称

0000000 616d 5f63 6461 3164 0000
0000009

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/mac_add1@650/reg

0000000 0000 5006 0000 0400
0000008

MAC2:

ls -la /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@30350000 /mac_add2@660/

total 0
drwxr-xr-x    2 root     root             0 Oct  6 08:01 .
drwxr-xr-x    8 root     root             0 Oct  6 08:00 ..
-r--r--r--    1 root     root             9 Oct  6 08:01 name
-r--r--r--    1 root     root             8 Oct  6 08:01 reg

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/mac_add2@660/名称

0000000 616d 5f63 6461 3264 0000
0000009

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/mac_add2@660/reg

0000000 0000 6006 0000 0400
0000008

特性:

  • 预移动到 fec1:

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/nvmem-cells

0000000 0000 2000
0000004

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/nvmem-cells-names

0000000 616d 2d63 6461 7264 7365 0073
000000c

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30000000/ocotp-ctrl@3035000 0/nvmem-cell-names

0000000 6f6c 6163 2d6c 616d 2d63 6461 7264 7365
0000010 0073
0000012
  • 移动到 fec1 后:

编辑:按照 @alexandre-belloni 的建议进行 nvmem-cells 和 nvmem-cell-names 编辑:

查找/sys-名称“NVME“ -打印

/sys/devices/platform/soc/30800000.aips-bus/30a20000.i2c/i2c-0/0-0068/ds1307_nvram0/nvmem
/sys/devices/platform/soc/30000000.aips-bus/30350000.ocotp-ctrl/imx-ocotp0/nvmem
/sys/firmware/devicetree/base/soc/aips-bus@30800000/ethernet@30be0000/nvmem-cells
/sys/firmware/devicetree/base/soc/aips-bus@30800000/ethernet@30be0000/nvmem-cell-names
/sys/firmware/devicetree/base/cpus/cpu@0/nvmem-cells
/sys/firmware/devicetree/base/cpus/cpu@0/nvmem-cell-names
/sys/firmware/devicetree/base/tempmon/nvmem-cells
/sys/firmware/devicetree/base/tempmon/nvmem-cell-names
/sys/bus/nvmem

hexdump /sys/devices/platform/soc/30800000.aips-bus/30a20000.i2c/i2c-0/0-0068/ds1307_nvram0/nvmem

0000000 9000 b1ae 02e1 4e10 1078 5a12 6444 c5a4
0000010 9a02 e488 c851 69a8 9902 22d3 1e2c 78a8
0000020 21ed ce14 c649 4422 22a9 0360 2b55 c93a
0000030 088a 4234 0ca4 8c88
0000038

hexdump /sys/devices/platform/soc/30000000.aips-bus/30350000.ocotp-ctrl/imx-ocotp0/nvmem

hexdump: /sys/devices/platform/soc/30000000.aips-bus/30350000.ocotp-ctrl/imx-ocotp0/nvmem: Invalid argument
0000000 0103 a003 886a 8ebf 0297 0000
000000c

ls -l /sys/firmware/devicetree/base/soc/aips-bus@30800000/ethernet@30be0000/nvmem-cells

-r--r--r--    1 root     root             4 Oct  6 14:18 /sys/firmware/devicetree/base/soc/aips-bus@30800000/ethernet@30be0000/nvmem-cells

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30800000/ethernet@30be0000/nvmem-cells

0000000 0000 4600
0000004

hexdump /sys/firmware/devicetree/base/soc/aips-bus@30800000/ethernet@30be0000/nvmem-cell-names

0000000 616d 2d63 6461 7264 7365 0073
000000c

hexdump /sys/firmware/devicetree/base/cpus/cpu@0/nvmem-cells

0000000 0000 0400
0000004

hexdump /sys/firmware/devicetree/base/cpus/cpu@0/nvmem-cell-names

0000000 7073 6565 5f64 7267 6461 0065
000000c

hexdump /sys/firmware/devicetree/base/tempmon/nvmem-cells

0000000 0000 0c00 0000 0d00
0000008

hexdump /sys/firmware/devicetree/base/tempmon/nvmem-cell-names

0000000 6163 696c 0062 6574 706d 675f 6172 6564
0000010 0000
0000011

那么,我们显然做错了什么,有什么想法吗?非常感谢所有建议。

答案1

nvmem-cells并且nvmem-cell-names是为了消费者节点,即以太网节点。你把它们放在提供者节点。只需将这些属性移动到fec1节点即可

相关内容