OpenBMC笔记3:内核的PHY芯片适配

文章介绍了如何修改u-boot和内核的设备树以适配PHY芯片,确保BMC在u-boot和内核下都能获取IP地址。作者首先使用devtool提取内核代码,然后修改aspeed-ast2600-evb.dts,注释掉未使用的MAC和MDIO节点,保留与BMC相关的MAC2和MAC3。经过编译和测试,BMC成功识别PHY芯片并获取IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前期针对我的机器改了u-boot dts的PHY配置后,u-boot下是可以获取到IP地址了,在u-boot下可以通过tftp进行BMC的镜像升级。然而,进入内核后,是无法获取到IP地址的,也就是只改u-boot的dts是不够的,还需要修改内核的dts,本文就是写一下针对内核的PHY芯片适配,有写的不对的地方,还请各位读者指正。

1.提取内核代码

使用devtool工具提取Linux的内核代码,具体命令如下:

devtool modify linux-aspeed

具体执行命令的结果如下图所示

2.修改内核设备树

在编译生成镜像的目录里面,通过dtb文件(如下图)初步确认dts文件是aspeed-ast2600-evb.dts。使用vscode工具打开内核代码,在/build/workspace/sources/linux-aspeed目录下。设备树aspeed-ast2600-evb.dts文件在内核代码的arch/arm/boot/dts目录下。

 (1) 梳理硬件设计

在《OpenBMC笔记1:u-boot的PHY芯片适配》文章中介绍到,我的机器使用的是MAC2和MAC3控制器,MAC2用于BMC的专口,需要配置PHY。MAC2通过MDIO2连接到PHY芯片。MAC3用于BMC的共享口。

(2) 具体DTS的修改

在aspeed-ast2600-evb.dts文件中,默认将BMC的4个MAC驱动和4个MDIO驱动都使能了,因为我们的机器只用到了MAC2、MAC3、MDIO2,所以我们需要注释掉MAC0、MAC1、MDIO1、MDIO3、MDIO4的使能。下面是ast2600-evb.dts具体的代码修改。

在aspeed-ast2600-evb.dts文件中,修改mdio节点

/*
&mdio0 {
	status = "okay";

	ethphy0: ethernet-phy@0 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0>;
	};
};
*/
//只保留mdio1,通过aspeed-g6.dtsi文件和aspeed-g6-pinctrl.dtsi文件,知道mdio1对应MDIO2
&mdio1 {
	status = "okay";

	ethphy1: ethernet-phy@0 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0>;
	};
};
/*
&mdio2 {
	status = "okay";

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

&mdio3 {
	status = "okay";

	ethphy3: ethernet-phy@0 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0>;
	};
};
*/

在aspeed-g6.dtsi文件中的mdio节点,这里不需要修改,只是对应上面代码的关系

mdio1: mdio@1e650008 {
	compatible = "aspeed,ast2600-mdio";
	reg = <0x1e650008 0x8>;
	#address-cells = <1>;
	#size-cells = <0>;
	status = "disabled";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_mdio2_default>;//在aspeed-g6-pinctrl.dtsi文件中找到定义
	resets = <&syscon ASPEED_RESET_MII>;
};

在aspeed-g6-pinctrl.dtsi文件中pinctrl_mdio2_default的定义,这里不需要修改,只是对应上面代码的关系

pinctrl_mdio2_default: mdio2_default {
	function = "MDIO2";
	groups = "MDIO2";
};

在aspeed-ast2600-evb.dts文件中,修改mac节点,注释掉mac0和mac1,修改mac2和mac3的配置

/*
&mac0 {
	status = "okay";

	phy-mode = "rgmii-rxid";
	phy-handle = <&ethphy0>;

	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_rgmii1_default>;
};


&mac1 {
	status = "okay";

	phy-mode = "rgmii-rxid";
	phy-handle = <&ethphy1>;

	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_rgmii2_default>;
};
*/
&mac2 {
	status = "okay";

	phy-mode = "rgmii";
	//phy-handle = <&ethphy2>;
	phy-handle = <&ethphy1>;//修改成&ethphy1

	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_rgmii3_default>;
};

&mac3 {
	status = "okay";

	//phy-mode = "rgmii";
	//phy-handle = <&ethphy3>;
	phy-mode = "rmii";//修改成rmii
	use-ncsi;//新添加

	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_rgmii4_default>;
};

3.编译代码

bitbake obmc-phosphor-image

编译报错:No space left on device or exceeds fs.inotify.max_user_watches?

从网上搜索了一下,发现超过fs.inotify.max_user_watches系统默认参数,可能的原因是打开的文件过多导致。这时候,我发现我用vscode同时打开了u-boot和内核代码,还用另外一个集成环境打开了一套代码,猜测是因为开的环境太多导致,所以关闭了vscode,再次进行编译,发现没有再次报错,编译成功,如下图所示

4.测试验证

将编译成功的OpenBMC镜像,通过u-boot使用tftp的方式,刷到flash中,然后reset,重启BMC。可以在OpenBMC的启动日志中看到内核识别到了PHY芯片,型号:RTL8211F,如下图所示

在串口调试下,登录OpenBMC,用户名:root,密码:0penBmc。注意:密码第一个字符是数字0。登录OpenBMC后,输入ifconfig命令,可以看到BMC成功获取到了IP地址,如下图所示

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值