前期针对我的机器改了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 = <ðphy0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_rgmii1_default>;
};
&mac1 {
status = "okay";
phy-mode = "rgmii-rxid";
phy-handle = <ðphy1>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_rgmii2_default>;
};
*/
&mac2 {
status = "okay";
phy-mode = "rgmii";
//phy-handle = <ðphy2>;
phy-handle = <ðphy1>;//修改成ðphy1
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_rgmii3_default>;
};
&mac3 {
status = "okay";
//phy-mode = "rgmii";
//phy-handle = <ðphy3>;
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地址,如下图所示