IMX6ULL PHY 芯片驱动

news2024/12/23 4:13:30

前言

之前使用 IMX6ULL 开发板时遇到过 nfs 挂载不上的问题,当时是通过更换官方新版 kernel 解决的,参考《挂载 nfs 文件系统》。
今天,使用自己编译的 kernel 又遇到了该问题,第二次遇到了,该正面解决了。

NFS 挂载失败

kernel 启动 log

Starting kernel ...

Booting Linux on physical CPU 0x0
Linux version 4.1.15 (liyongjun@Box) (gcc version 4.9.4 (Linaro GCC 4.9-2017.01) ) #15 SMP PREEMPT Tue Jun 6 02:03:54 CST 2023
CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine model: Freescale i.MX6 ULL 14x14 EVK Board
...
CAN device driver interface
flexcan 2090000.can: device registered (reg_base=a09e8000, irq=27)
flexcan 2094000.can: device registered (reg_base=a09f0000, irq=28)
20b4000.ethernet supply phy not found, using dummy regulator
pps pps0: new PPS source ptp0
libphy: fec_enet_mii_bus: probed
fec 20b4000.ethernet eth0: registered PHC device 0
2188000.ethernet supply phy not found, using dummy regulator
pps pps1: new PPS source ptp1
fec 2188000.ethernet eth1: registered PHC device 1
PPP generic driver version 2.4.2
PPP BSD Compression module registered
PPP Deflate Compression module registered
PPP MPPE Compression module registered
NET: Registered protocol family 24
...
lib80211: common routines for IEEE802.11 drivers
Key type dns_resolver registered
mmc1: MAN_BKOPS_EN bit is not set
Registering SWP/SWPB emulation handler
mmc1: new DDR MMC card at address 0001
mmcblk1: mmc1:0001 8GTF4R 7.28 GiB
snvs_rtc 20cc000.snvs:snvs-rtc-lp: setting system clock to 2023-06-05 18:05:19 UTC (1685988319)
mmcblk1boot0: mmc1:0001 8GTF4R partition 1 4.00 MiB
mmcblk1boot1: mmc1:0001 8GTF4R partition 2 4.00 MiB
mmcblk1rpmb: mmc1:0001 8GTF4R partition 3 512 KiB
usb 1-1.1: new full-speed USB device number 3 using ci_hdrc
IP-Config: Failed to open eth0
IP-Config: Device `eth0' not found

问题定位

从启动 log 看到,没有找到 eth0,说明要么网卡硬件出问题了,要么网卡驱动出问题了。开发板硬件应该没什么问题,大概率是驱动出了点问题。
以太网硬件设施包括两部分:MAC 芯片 + PYH 芯片。
IMX6ULL 这颗 SOC 集成了 MAC 芯片,芯片外接了一颗 LAN8720 PHY 芯片。
MAC 是 SOC 内部的,内核代码又是 NXP 厂家提供的,所以 MAC 芯片及其驱动应该没什么问题,大概率是 PHY 芯片驱动的问题

资料收集

PHY 硬件原理图(LAN8720A)
在这里插入图片描述
软件引脚配置

		pinctrl_enet2: enet2grp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO07__ENET2_MDC		0x1b0b0
				MX6UL_PAD_GPIO1_IO06__ENET2_MDIO	0x1b0b0
				MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN	0x1b0b0
				MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01	0x1b0b0
				MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN	0x1b0b0
				MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00	0x1b0b0
				MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01	0x1b0b0
				MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2	0x4001b031
			>;
		};

来个一一对应
在这里插入图片描述
可以看到,原理图中芯片使用到的引脚,除了 ENET2_INT_TREE#ENET2_RST,在 DTS pinctrl 中都有配置,那就重点看下这两个不在 pinctrl 中的引脚有没有正确使用。
ENET2_INT_TREE# 为中断引脚,从下面 DTS 配置可以看出该引脚是有在使用的。

			fec2: ethernet@020b4000 {
				compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";
				reg = <0x020b4000 0x4000>;
				interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,	// ENET2 interrupt IRQ=152
					     <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
				clocks = <&clks IMX6UL_CLK_ENET>,
					 <&clks IMX6UL_CLK_ENET_AHB>,
					 <&clks IMX6UL_CLK_ENET_PTP>,
					 <&clks IMX6UL_CLK_ENET2_REF_125M>,
					 <&clks IMX6UL_CLK_ENET2_REF_125M>;
				clock-names = "ipg", "ahb", "ptp",
					      "enet_clk_ref", "enet_out";
				stop-mode = <&gpr 0x10 4>;
				fsl,num-tx-queues=<1>;
				fsl,num-rx-queues=<1>;
				fsl,magic-packet;
				fsl,wakeup_irq = <0>;
				status = "disabled";
			};

再来看下 ENET2_RST,在 DTS 中找了半天,也没看到该引脚的配置。

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@2 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <2>;
		};

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <1>;
		};
	};
};

会不会不需要该引脚呢,上电后没必要 reset?
先不管,先看看代码中有没有使用该引脚吧。

驱动源码

在驱动 probe() 函数中发现了 fec_reset_phy() 函数,

static int
fec_probe(struct platform_device *pdev)
{
...
	fec_reset_phy(pdev);
...
}
static void fec_reset_phy(struct platform_device *pdev)
{
	int err, phy_reset;
	int msec = 1;
	struct device_node *np = pdev->dev.of_node;

	if (!np)
		return;

	err = of_property_read_u32(np, "phy-reset-duration", &msec);
	/* A sane reset duration should not be longer than 1s */
	if (!err && msec > 1000)
		msec = 1;

	phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0); // 从设备树中获取 "phy-reset-gpios" 引脚
	if (!gpio_is_valid(phy_reset))
		return;

	err = devm_gpio_request_one(&pdev->dev, phy_reset,
				    GPIOF_OUT_INIT_LOW, "phy-reset");
	if (err) {
		dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err);
		return;
	}
	msleep(msec);
	gpio_set_value(phy_reset, 1);
}

在该函数的实现中,赫然看到 of_get_named_gpio(np, "phy-reset-gpios", 0);,该 of 函数想要从设备树中获取 “phy-reset-gpios” 引脚,很显然这里是获取不到的,因为设备树中没有配置。

尝试修复

在 DTS 中添加 reset 引脚的配置

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;	// add: GPIO5 IO08 低电平复位
    phy-reset-duration = <200>;						// add: 低电平保持时间
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@2 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <2>;
		};

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <1>;
		};
	};
};

编译设备树,烧录,验证

snvs_rtc 20cc000.snvs:snvs-rtc-lp: setting system clock to 2023-06-06 12:50:53 UTC (1686055853)
fec 20b4000.ethernet eth0: Freescale FEC PHY driver [SMSC LAN8710/LAN8720] (mii_bus:phy_addr=20b4000.ethernet:01, irq=-1)
IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
fec 20b4000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
IP-Config: Complete:
     device=eth0, hwaddr=00:04:9f:04:d2:35, ipaddr=192.168.31.224, mask=255.255.255.0, gw=192.168.31.1
     host=192.168.31.224, domain=, nis-domain=(none)
     bootserver=192.168.31.223, rootserver=192.168.31.223, rootpath=
gpio_dvfs: disabling
can-3v3: disabling
ALSA device list:
  #0: wm8960-audio
VFS: Mounted root (nfs filesystem) on device 0:14.
devtmpfs: mounted
Freeing unused kernel memory: 424K (809a4000 - 80a0e000)
INIT: version 2.88 booting
/etc/rcS.d/S00psplash.sh: line 28: /usr/bin/psplash: No such file or directory
Starting udev
random: nonblocking pool is initialized
udev: Not using udev cache because of changes detected in the following files:
udev:     /proc/version /proc/cmdline /proc/devices
udev:     lib/udev/rules.d/* etc/udev/rules.d/*
udev: The udev cache will be regenerated. To identify the detected changes,
udev: compare the cached sysconf at   /etc/udev/cache.data
udev: against the current sysconf at  /dev/shm/udev.cache
udevd[94]: starting version 3.1.5
kjournald starting.  Commit interval 5 seconds
EXT3-fs (mmcblk1p2): using internal journal
EXT3-fs (mmcblk1p2): recovery complete
EXT3-fs (mmcblk1p2): mounted filesystem with ordered data mode
FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
mmc0: Timeout waiting for hardware interrupt.
mmcblk0: error -84 sending status command, retrying
mmcblk0: error -110 sending stop command, original cmd response 0x0, card status 0x900
mmcblk0: error -110 transferring data, sector 15564672, nr 8, cmd response 0x0, card status 0x0
mmc0: tried to reset card
kjournald starting.  Commit interval 5 seconds
EXT3-fs (mmcblk0p2): using internal journal
EXT3-fs (mmcblk0p2): recovery complete
EXT3-fs (mmcblk0p2): mounted filesystem with ordered data mode
FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
bootlogd: cannot allocate pseudo tty: No such file or directory
Populating dev cache
ALSA: Restoring mixer settings...
/usr/sbin/alsactl: set_control:1461: Cannot write control '2:0:0:Playback Volume:0' : Input/output error
/usr/sbin/alsactl: set_control:1461: Cannot write control '2:0:0:Speaker Playback Volume:0' : Input/output error
INIT: Entering runlevel: 5
Configuring network interfaces... ifup skipped for nfsroot interface eth0
run-parts: /etc/network/if-pre-up.d/nfsroot: exit status 1
Starting system message bus: Starting Xserver
dbus.
Starting Connection Manager
Starting Dropbear SSH server: dropbear.
Starting rpcbind daemon...done.
Starting watchdog: [  OK  ]
starting statd: done
Starting advanced power management daemon: No APM support in kernel
(failed.)
Starting atd: OK
exportfs: can't open /etc/exports for reading
NFS daemon support not enabled in kernel
Starting system log daemon...0
Starting kernel log daemon...0
 * Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon                       [ ok ]
Starting Telephony daemon
Starting Linux NFC daemon
* starting FTP Server: vsftpd... done.
Starting crond: OK
Starting nginx: nginx.
Running local boot scripts (/etc/rc.local).

root@ATK-IMX6U:~# ^C
root@ATK-IMX6U:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:04:9f:04:d2:35
          inet addr:192.168.31.224  Bcast:192.168.31.255  Mask:255.255.255.0
          inet6 addr: fe80::204:9fff:fe04:d235/64 Scope:Link
          inet6 addr: 240e:3a6:1806:55f0:204:9fff:fe04:d235/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21428 errors:0 dropped:50 overruns:0 frame:0
          TX packets:17993 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:21492516 (20.4 MiB)  TX bytes:2510506 (2.3 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:140 (140.0 B)  TX bytes:140 (140.0 B)

LAN8720 驱动成功,eth0 link ready,nfs 挂载成功,系统引导成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

18JS09——作用域

作用域 一、作用域1、作用域 二、变量的作用域1、变量作用域的分类2、全局变量3、局部变量4、全局变量和局部变量区别 三、作用域链 目标&#xff1a; 1、作用域 2、变量的作用域 3、作用域链 一、作用域 1、作用域 通常来说&#xff0c;一段程序代码中所用到的名字并不总是有…

python基础----06-----文件读写追加操作

一 文件编码概念 思考&#xff1a;计算机只能识别: 0和1&#xff0c;那么我们丰富的文本文件是如何被计算机识别&#xff0c;并存储在硬盘中呢? 答案&#xff1a;使用编码技术(密码本)将内容翻译成0和1存入。 常见编码有UTF8&#xff0c;gbk等等。不同的编码&#xff0c;将内…

vulnhub靶场之DC-3渗透教程(Joomla CMS)

目录 0x01靶机概述 0x02靶场环境搭建 0x03主机发现 0x04靶场渗透过程 ​ 0x05靶机提权 0x06渗透实验总结 0x01靶机概述 靶机基本信息&#xff1a; 靶机下载链接https://download.vulnhub.com/dc/DC-3-2.zip作者DCAU发布日期2020年4月25日难度中等 0x02靶场环…

【Flink】DataStream API使用之输出算子(Sink)

输出算子&#xff08;Sink&#xff09; Flink作为数据处理框架&#xff0c;最终还是需要把计算处理的结果写入到外部存储&#xff0c;为外部应用提供支持。Flink提供了很多方式输出到外部系统。 1. 连接外部系统 在Flink中我们可以在各种Fuction中处理输出到外部系统&#xf…

C#读写参数到APP.Config

C#读写参数到APP.Config 介绍程序Demo常见错误 介绍 系统在开发时&#xff0c;可能需要设置默认参数&#xff0c;比如数据库的链接参数&#xff0c;某个参数的默认数据等等。对于这些数据&#xff0c;可直接在app.config中读取。 在读写时&#xff0c;需要先了解configuratio…

echo命令在Unix中的作用以及其常见用法

在Unix系统中&#xff0c;"echo"是一个常用的命令&#xff0c;用于在终端或脚本中输出文本。它可以将指定的字符串或变量的值打印到标准输出&#xff0c;从而向用户提供信息或进行调试。 本文将详细介绍"echo"命令在Unix中的作用以及其常见用法。 基本语法…

Keras-3-实例1-二分类问题

1. 二分类问题 1.1 IMDB 数据集加载 IMDB 包含5w条严重两极分化的评论&#xff0c;数据集被分为 2.5w 训练数据 和 2.5w 测试数据&#xff0c;训练集和测试集中的正面和负面评论占比都是50% from keras.datasets import imdb(train_data, train_labels), (test_data, test_l…

UE5 Chaos破碎系统学习1

在UE5中&#xff0c;Chaos破碎系统被直接进行了整合&#xff0c;本篇文章就来讲讲chaos的基础使用。 1.基础破碎 1.首先选中需要进行破碎的模型&#xff0c;例如这里选择一个Box&#xff0c;然后切换至Fracture Mode&#xff08;破碎模式&#xff09;&#xff1a; 2.点击右侧…

JAVA实现打字练习软件

转眼已经学了一学期的java了&#xff0c;老师让我们根据所学知识点写一个打字练习软件的综合练习。一开始我也不是很有思路&#xff0c;我找了一下发现csdn上关于这个小项目的代码也不算很多&#xff0c;所以我最后自己在csdn查了一些资料&#xff0c;写了这么一个简略版本的打…

【C++】——list的介绍及模拟实现

文章目录 1. 前言2. list的介绍3. list的常用接口3.1 list的构造函数3.2 iterator的使用3.3 list的空间管理3.4 list的结点访问3.5 list的增删查改 4. list迭代器失效的问题5. list模拟实现6. list与vector的对比7. 结尾 1. 前言 我们之前已经学习了string和vector&#xff0c…

Remix IDE已支持Sui Move在线开发

网页版Remix IDE与WELLDONE Code插件结合&#xff0c;让您无需本地设置或安装即可开始构建Sui应用程序。 不熟悉Sui的构建者可能想在正式配置开发环境之前&#xff0c;浅尝一下构建Sui应用程序。Remix IDE与WELLDONE Code插件组合&#xff0c;即可帮助构建者实现从浏览器窗口开…

JavaScript函数的增强知识

函数属性和arguments以及剩余参数 函数属性name与length ◼ 我们知道JavaScript中函数也是一个对象&#xff0c;那么对象中就可以有属性和方法。 ◼ 属性name&#xff1a;一个函数的名词我们可以通过name来访问&#xff1b; // 自定义属性foo.message "Hello Foo"…

Nginx 之 Tomcat 负载均衡、动静分离

一.详细安装及操作实例&#xff08;Nginx 七层代理&#xff09; 首先至少准备三台服务器 Nginx 服务器&#xff1a;192.168.247.131:80 Tomcat服务器1&#xff1a;192.168.247.133:80 Tomcat服务器2&#xff1a;192.168.247.134:8080 192.168.247.134:80811.部署Nginx 负载均…

微信自动回复怎么设置呢?

友友们 你们是否有以下这些烦恼 1、每天要手动点击“添加”按钮多次以通过大量好友? 2、你是否经常需要在多个微信帐号之间来回切换&#xff1f; 3、你的回复速度慢&#xff0c;导致客户流失率高&#xff1f; 4、为了及时回复&#xff0c;你总是需要带着多部手机出门&…

二十一、C++11(中)

文章目录 一、左值&右值&#xff08;一&#xff09;基本概念1.左值是什么2.右值是什么 &#xff08;二&#xff09;左值引用和右值引用1.左值引用2.右值引用 二、右值引用使用场景和意义&#xff08;一&#xff09;引入&#xff08;二&#xff09;左值引用的使用场景&#…

Linux编译器(gcc/g++)调试器gdb项目自动化构建工具(make/Makefile)版本管理git

Linux编译器-gcc/g&&调试器gdb&&项目自动化构建工具-make/Makefile&&版本管理git &#x1f506;gcc/g的使用可执行文件的"生产"过程gcc如何完成预处理编译汇编链接 函数库函数库一般分为静态库和动态库两种静态C/C库的安装 gcc选项gcc选项记…

WPF 学习:如何照着MaterialDesign的Demo学习

文章目录 往期回顾对应视频资源如何照着wpf项目学习找到你想要抄的页面查找对应源码演示示例如何认清页面元素抄袭实战 项目地址总结 往期回顾 WPF Debug运行是 实时可视化树无效&#xff0c;无法查看代码 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github …

【Java】线程池的概念及使用、ThreadPoolExecutor的构造方法

什么是线程池为什么用线程池JDK提供的线程池工厂模式如何使用 自定义线程池ThreadPoolExecutor类的构造方法工作原理拒绝策略 线程池的使用 什么是线程池 在之前JDBC编程中&#xff0c;通过DataSource获取Connection的时候就已经用到了池的概念。这里的池指的是数据库连接池。…

Vue电商项目--uuid游客身份获取购物车数据

uuid游客身份获取购物车数据 获取购物车列表 请求地址 /api/cart/cartList 请求方式 GET 参数类型 参数名称 类型 是否必选 描述 无 无 无 无 返回示例 成功&#xff1a; { "code": 200, "message": "成功", "…

马尔萨斯 ( Malthus)人口指数增长模型Logistic 模型

3.要求与任务 从 1790 — 1990 年间美国每隔 10 年的人口记录如下表所示&#xff1a; 用以上数据检验马尔萨斯 ( Malthus)人口指数增长模型&#xff0c;根据检验结果进一步讨论马尔萨斯 人口模型的改进&#xff0c;并利用至少两种模型来预测美国2010 年的人口数量。 提示 1 &…