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개의 파일로 구성됩니다.
- 리눅스-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을 계속 사용하기 전에 설정되지 않은 0 값을 성공적으로 읽을 수 있음을 보여주고 싶습니다. 결국 생산 중에 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-cells
그리고nvmem-cell-names
소비자노드, 즉 이더넷 노드입니다. 당신은 그것을 넣어공급자마디. 이 속성을 fec1
노드 로 이동하면 됩니다.