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 カーネル 

つまり。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」には、この問題に関連する2つのセクションが含まれています。

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を設定します。

デバイスツリーを調べてみると、設定されていない0 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/name

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/name

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/name

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に移動した後:

編集:nvmem-cellsとnvmem-cell-namesの編集に関する@alexandre-belloniの提案に従って:

/sys-nameを探す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-cellsnvmem-cell-namesそして消費者ノード、つまりイーサネットノードです。あなたはそれを置くプロバイダー節。この属性をfec1ノードに移動するだけです。

おすすめ記事