嗨嘍,大家好,我是程序猿老王,程序猿老王就是我。
今天給大家講一講如何將u-boot網(wǎng)絡(luò)部分的移植和調(diào)試。
一、前章回顧
上一章,已經(jīng)講過如何講uboot.2022.10版本移植到我們自己的imx6ull開發(fā)板上,但是最后編譯下載后網(wǎng)絡(luò)部分未能正確識(shí)別,今天我們就來講一講網(wǎng)絡(luò)部分的調(diào)試。
上一篇uboot編譯后,上電啟動(dòng),串口打印如下:
U-Boot 2022.10-gaef9f25a-dirty (Apr 05 2023 - 17:49:18 +0800)
CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 26C
Reset cause: POR
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM: 512 MiB
Core: 65 devices, 17 uclasses, devicetree: separate
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In: serial
Out: serial
Err: serial
Net: Could not get PHY for FEC1: addr 1
Could not get PHY for FEC1: addr 1
Get shared mii bus on ethernet@2188000
Could not get PHY for FEC1: addr 2
Get shared mii bus on ethernet@2188000
Could not get PHY for FEC1: addr 2
No ethernet found.
Hit any key to stop autoboot:
= >
通過打印信息,我們可以發(fā)現(xiàn)連phy都沒有正確識(shí)別到。首先來回顧一下,上一篇我們采用的是NXP官方默認(rèn)imx6ull開發(fā)板的配置參數(shù),任何參數(shù)都未做修改,現(xiàn)在使用默認(rèn)配置網(wǎng)絡(luò)未能正確識(shí)別,說明我們的硬件設(shè)計(jì)與官方的設(shè)計(jì)有偏差。因此,首先需要查看原理圖,確認(rèn)默認(rèn)NXP imx6ull的網(wǎng)絡(luò)管腳與我們自己硬件原理圖上是否一致。
二、硬件原理圖檢查
1.確認(rèn)硬件原理圖的fec對(duì)應(yīng)的phy地址
從imx6ull開發(fā)板硬件原理圖上可以得到,ENET1對(duì)應(yīng)的phy addr為:0x0,ENET2對(duì)應(yīng)的phy addr為:0x1。
2.修改網(wǎng)卡fec1的phy地址
imx6ull對(duì)應(yīng)的設(shè)備樹文件imx6ull-14x14-evk.dtsi,從設(shè)備樹文件中可以得到,imx6ull FEC1對(duì)應(yīng)為 ethphy0 ,而ethphy0對(duì)應(yīng)的phy地址默認(rèn)為 2 ,這與我們開發(fā)板硬件給的phy地址不符合,因此修改設(shè)備樹中FEC1對(duì)應(yīng)的phy地址為0
&fec1 {
pinctrl-names = "default";
pinctrl-0 = < &pinctrl_enet1 >;
phy-mode = "rmii";
phy-handle = < ðphy0 >;
phy-supply = < ®_peri_3v3 >;
status = "okay";
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = < &pinctrl_enet2 >;
phy-mode = "rmii";
phy-handle = < ðphy1 >;
phy-supply = < ®_peri_3v3 >;
status = "okay";
mdio {
#address-cells = < 1 >;
#size-cells = < 0 >;
ethphy0: ethernet-phy@2 {
compatible = "ethernet-phy-id0022.1560";
reg = < 2 >;
...
};
ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-id0022.1560";
reg = < 1 >;
...
};
};
};
修改FEC1節(jié)點(diǎn)對(duì)應(yīng)的phy地址為0x0,如下;
mdio {
#address-cells = < 1 >;
#size-cells = < 0 >;
ethphy0: ethernet-phy@0 {
compatible = "ethernet-phy-id0022.1560";
reg = < 0 >;
micrel,led-mode = < 1 >;
clocks = < &clks IMX6UL_CLK_ENET_REF >;
clock-names = "rmii-ref";
};
...
}
重新編譯,燒寫驗(yàn)證,還是報(bào)錯(cuò)。
3.網(wǎng)絡(luò)初始化檢查
接下來就只有從網(wǎng)絡(luò)初始化入口initr_net函數(shù)開始,查看網(wǎng)絡(luò)初始化哪里有問題。
在board_r文件中的init_sequence_r調(diào)用
可以看到initr_net函數(shù)其實(shí)就兩個(gè)作用,一是調(diào)用eth_initialize進(jìn)行網(wǎng)絡(luò)初始化,二是調(diào)用reset_phy對(duì)phy進(jìn)行復(fù)位,具體實(shí)現(xiàn),如下;
static int initr_net(void)
{
puts("Net: ");
eth_initialize();
#if defined(CONFIG_RESET_PHY_R)
debug("Reset Ethernet PHYn");
reset_phy();
#endif
return 0;
}
繼續(xù)往下,我們可以看到,phy_init初始化函數(shù)中只調(diào)用了phy_micrel_ksz8xxx_init對(duì)Micrel公司生產(chǎn)的ksz8系列的phy進(jìn)行了初始化,如下;
int phy_init(void)
{
...
#ifdef CONFIG_PHY_MICREL_KSZ8XXX
phy_micrel_ksz8xxx_init();
#endif
#ifdef CONFIG_PHY_MICREL_KSZ90X1
phy_micrel_ksz90x1_init();
#endif
...
#ifdef CONFIG_PHY_SMSC
phy_smsc_init();
#endif
...
genphy_init();
return 0;
}
而我們的硬件fec1和fec2都是使用SMSC公司生產(chǎn)的 LAN8720A ,因此修改為調(diào)用phy_smsc_init初始化phy芯片LAN8720A。
具體修改為在mx6ull_toto_defconfig文件添加宏定義CONFIG_PHY_SMSC=y;然后屏蔽CONFIG_PHY_MICREL=y和CONFIG_PHY_MICREL_KSZ8XXX=y,如下;
4.fec部分管腳確認(rèn)
繼續(xù)往下,在fecmxc_probe函數(shù)中發(fā)現(xiàn)調(diào)用了fec_gpio_reset()函數(shù)復(fù)位fec網(wǎng)卡,但是設(shè)備樹文件中沒有配置復(fù)位管腳
fecmxc_of_to_plat函數(shù)會(huì)對(duì)設(shè)備中的phy的這三個(gè)定義進(jìn)行解析。因此在設(shè)備中添加如下三個(gè)定義:
在硬件原理圖中找到eth1、eth2phy復(fù)位管腳對(duì)應(yīng)imx6ull芯片的管腳
設(shè)備樹文件imx6ul-14x14-evk.dtsi中,具體配置如下:
5.檢查是否存在多設(shè)備管腳復(fù)用
下面要做的就是查看在設(shè)備樹文件中查看一下,剛剛添加的兩個(gè)GPIO管腳在其他設(shè)備中是否存在該管腳復(fù)用情況
查找結(jié)果如上,spi4接口中使用了GPIO5的7和8兩個(gè)管腳,并且該設(shè)備status狀態(tài)為“okay”激活,解決方法如下,disable掉spi4接口。
還有一種方法就是刪除使用gpio5兩個(gè)管腳的兩行定義,這里就不演示了。
編譯驗(yàn)證如下
uboot下只會(huì)使用一個(gè)網(wǎng)口,因此屏蔽一個(gè)
6.使用默認(rèn)ENET2
使用uboot中imx6ull默認(rèn)的 網(wǎng)卡ENET2默認(rèn)網(wǎng)卡 ,宏定義 CONFIG_FEC_ENENT_DEV ,路徑:/include/configs/mx6ull_toto.h
#ifdef CONFIG_CMD_NET
#define CONFIG_FEC_ENET_DEV 1
#endif
在設(shè)備樹文件中將FEC1節(jié)點(diǎn)的status設(shè)置為disabled
&fec1 {
pinctrl-names = "default";
pinctrl-0 = < &pinctrl_enet1 >;
phy-mode = "rmii";
phy-handle = < ðphy0 >;
phy-supply = < ®_peri_3v3 >;
phy-reset-gpios = < &gpio5 7 GPIO_ACTIVE_LOW >; // 復(fù)位引腳
phy-reset-duration = < 100 >;
phy-reset-post-delay = < 100 >;
status = "disabled"; //禁用
};
三、編譯燒寫,下載驗(yàn)證
SecureCRT 輸出結(jié)果如下:
U-Boot 2022.10-g8d3c4ea8-dirty (May 20 2023 - 11:49:18 +0800)
CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 34C
Reset cause: POR
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM: 512 MiB
Core: 61 devices, 17 uclasses, devicetree: separate
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In: serial
Out: serial
Err: serial
Net:
Error: ethernet@20b4000 address not set.
Error: ethernet@20b4000 address not set.
No ethernet found.
Hit any key to stop autoboot: 0
= >
= >
提示:
Error: ethernet@20b4000 address not set.
Error: ethernet@20b4000 address not set.
No ethernet found.
這是因?yàn)闆]有設(shè)置網(wǎng)絡(luò)環(huán)境變量
- 手動(dòng)設(shè)置
- 系統(tǒng)配置,默認(rèn)生成
1.設(shè)置網(wǎng)絡(luò)環(huán)境變量
setenv ethaddr 32:34:46:78:9A:DC //設(shè)置開發(fā)板網(wǎng)卡1 MAC地址
setenv eth1addr 32:34:46:78:9A:DD //設(shè)置開發(fā)板網(wǎng)卡2 MAC地址
setenv serverip 192.168.0.106 //設(shè)置服務(wù)器地址,一般是windows或Ubuntu地址
setenv ipaddr 192.168.0.123 //設(shè)置開發(fā)板IP地址
setenv gatewayip 192.168.0.1 //設(shè)置開發(fā)板默認(rèn)網(wǎng)關(guān)
setenv netmask 255.255.255.0 //設(shè)置開發(fā)板子網(wǎng)掩碼
setenv bootdelay 5 //設(shè)置啟動(dòng)延時(shí)實(shí)際
saveenv //將改變覆蓋到MMC
注意:u-boot的環(huán)境變量是設(shè)置在MMC中的,不會(huì)隨著UBoot重新編譯而清除,如果修改亂了可以使用如下命令恢復(fù)默認(rèn):
env default -a // 恢復(fù)默認(rèn)設(shè)置
saveenv // 將改變覆蓋到MMC
2.使用軟件配置,默認(rèn)生成
configs/mx6ull_toto_defconfig 文件,使能隨機(jī)生成MAC地址
CONFIG_NET_RANDOM_ETHADDR=y
重啟開發(fā)板,打印信息如下;
U-Boot 2022.10-g8d3c4ea8-dirty (May 20 2023 - 11:49:18 +0800)
CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 45C
Reset cause: WDOG
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM: 512 MiB
Core: 61 devices, 17 uclasses, devicetree: separate
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In: serial
Out: serial
Err: serial
Net: eth1: ethernet@20b4000 [PRIME]
Hit any key to stop autoboot: 0
= ?>
= ?>
3.驗(yàn)證網(wǎng)絡(luò)是否連通
使用ping命令,驗(yàn)證網(wǎng)絡(luò)是否可以正常工作
= > ping 192.168.0.106
Using ethernet@20b4000 device
ARP Retry count exceeded; starting again
ping failed; host 192.168.0.106 is not alive
= >
ping測(cè)試失敗
- 原因1:可能是windows的防火墻沒有關(guān),
- 原因2:LAN8720初始化需要復(fù)位,修改SMSC驅(qū)動(dòng)。
我這邊的原因就是ubootLAN8720初始化沒有進(jìn)行復(fù)位,在 drivers/net/phy/phy.c 文件中修改:
int genphy_config_aneg(struct phy_device *phydev)
{
int result;
/* SOFT RESET */
phy_reset(phydev);
if (phydev- >autoneg != AUTONEG_ENABLE)
return genphy_setup_forced(phydev);
result = genphy_config_advert(phydev);
...
...
}
再次編譯重啟開發(fā)板,Ping成功。
= > ping 192.168.0.106
Using ethernet@20b4000 device
host 192.168.0.106 is alive
= >
四、FEC1網(wǎng)卡1調(diào)試
使用 ENET1 網(wǎng)卡的話就稍微復(fù)雜一點(diǎn)了,不是簡(jiǎn)單的將 fec2 節(jié)點(diǎn)下的 status 改為“disabled”,需要對(duì)在設(shè)備樹arch/arm/dts/imx6ul-14x14-evk.dtsi文件進(jìn)行修改和添加。
1.屏蔽或刪除掉 fec2 節(jié)點(diǎn)內(nèi)容
/*
&fec2 {
pinctrl-names = "default";
pinctrl-0 = < &pinctrl_enet2 >;
phy-mode = "rmii";
phy-handle = < ðphy1 >;
phy-supply = < ®_peri_3v3 >;
phy-reset-gpios = < &gpio5 8 GPIO_ACTIVE_LOW >;
phy-reset-duration = < 200 >;
phy-reset-post-delay = < 100 >;
status = "okay";
mdio {
#address-cells = < 1 >;
#size-cells = < 0 >;
ethphy0: ethernet-phy@0 {
compatible = "ethernet-phy-id0022.1560";
reg = < 0 >;
micrel,led-mode = < 1 >;
clocks = < &clks IMX6UL_CLK_ENET_REF >;
clock-names = "rmii-ref";
};
ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-id0022.1560";
reg = < 1 >;
micrel,led-mode = < 1 >;
clocks = < &clks IMX6UL_CLK_ENET2_REF >;
clock-names = "rmii-ref";
};
};
};
*/
2.在fec1 節(jié)點(diǎn)下添加 mdio 子節(jié)點(diǎn)
&fec1 {
pinctrl-names = "default";
pinctrl-0 = < &pinctrl_enet1 >;
phy-mode = "rmii";
phy-handle = < ðphy0 >;
phy-supply = < ®_peri_3v3 >;
phy-reset-gpios = < &gpio5 7 GPIO_ACTIVE_LOW >;
phy-reset-duration = < 100 >;
phy-reset-post-delay = < 100 >;
status = "okay";
mdio {
#address-cells = < 1 >;
#size-cells = < 0 >;
ethphy0: ethernet-phy@0 {
compatible = "ethernet-phy-id0022.1560";
reg = < 0 >;
micrel,led-mode = < 1 >;
clocks = < &clks IMX6UL_CLK_ENET_REF >;
clock-names = "rmii-ref";
};
};
};
3.添加MDIO和MDC引腳配置
在 ENET1 網(wǎng)卡對(duì)應(yīng)的 pinctrl 節(jié)點(diǎn)中添加 MDIO 和 MDC 引腳配置
- 將 GPIO1_IO07 復(fù)用為 ENET1_MDC 引腳
- 將 GPIO1_IO06 復(fù)用為 ENET1_MDIO 引腳
pinctrl_enet1: enet1grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO07__ENET1_MDC 0x1b0b0
MX6UL_PAD_GPIO1_IO06__ENET1_MDIO 0x1b0b0
...
MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b031
?>;
};
4.修改ENET設(shè)備為enet0
在include/configs/mu6ull_toto.h中修改宏CONFIG_FEC_ENET_DEV為0,使用enet0
#ifdef CONFIG_CMD_NET
#define CONFIG_FEC_ENET_DEV 0
#endif
編譯下載重啟開發(fā)板,打印信息如下;
U-Boot 2022.10-g8d3c4ea8-dirty (May 20 2023 - 14:19:23 +0800)
CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 40C
Reset cause: WDOG
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL TOTO
DRAM: 512 MiB
Core: 60 devices, 17 uclasses, devicetree: separate
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In: serial
Out: serial
Err: serial
Net: eth0: ethernet@2188000
Hit any key to stop autoboot: 0
= >
= > ping 192.168.0.106
Using ethernet@2188000 device
host 192.168.0.106 is alive
= >
至此,imx6ull在uboot下FEC1和FEC2均可單獨(dú)使用,感興趣的朋友可以試一試uboot如何讓fec1和fec2兩個(gè)網(wǎng)卡同時(shí)工作。
imx6ll開發(fā)板u-boot下網(wǎng)絡(luò)部分就講到此處,后續(xù)有時(shí)間將對(duì)u-boot的啟動(dòng)流程進(jìn)行詳細(xì)梳理與講解,關(guān)注我,后期文章及時(shí)觀看!
本期的內(nèi)容到這就結(jié)束了,如果覺得文章不錯(cuò),可以點(diǎn)贊、收藏和關(guān)注哦,謝謝大家收看,下期再見!
評(píng)論
查看更多