我们正在从 Buildroot 2018.02.9 (linux-4.14.85) 迁移到 Buildroot 2020.02.2 (linux-5.4.40),并发现我们无法再读取 I.MX7s SoC 上的 MAC 地址。下图说明了原因:
不幸的是,OTP 驱动程序不再受支持,它已移至 NVMEM 框架。 imx-ocotp.c\nvmem\drivers - linux-imx - i.MX Linux 内核
我们正在尝试使用标准 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>;
};
};
以上评论链接:
- https://www.kernel.org/doc/Documentation/devicetree/bindings/net/ethernet-controller.yaml
- http://devicetree.org/schemas/nvmem/nvmem-consumer.yaml(或者现在https://mjmwired.net/kernel/Documentation/devicetree/bindings/nvmem/nvmem-consumer.yaml)。
从控制台:
[ 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
节点即可