rock3a uboot Net网络功能恢复
之前跟着正点原子的Linux驱动教程学的时候发现手上的rock 3a uboot找不到网络设备。
教程中虽然有uboot网络驱动的适配方法,但是并没有涉及设备树,而rk3568的uboot已经用上设备树了,这使得教程几乎没有参考价值。
最后自己摸索着学习了uboot的驱动架构,试着修改了代码,终于成功在uboot里启用了网络功能。
(由于并没有完全弄懂架构,修改可能有不合理的地方,比较暴力,仅供参考)
-
首先仿照rock3a内核设备树修改uboot设备树。在u-boot/arch/arm/dts/rk3568-u-boot.dtsi中:
第237行,根据引脚图修改gmac1内phy口的复位引脚:snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;第253-257行,调整delay(具体原因不明),并且启用gmac1设备:
tx_delay = <0x42>; rx_delay = <0x28>; phy-handle = <&rgmii_phy1>; status = "okay"; -
修改makefile配置文件,在u-boot/configs/rock-3a-rk3568_defconfig中:
第28行,修改启动等待时间,留时间让自己按Ctrl+C卡在uboot控制台:
CONFIG_BOOTDELAY=3第87行,注释掉这一行(为什么默认会屏蔽这些属性呢)
CONFIG_OF_SPL_REMOVE_PROPS="clock-names assigned-clocks assigned-clock-rates assigned-clock-parents"第397行,跟着gpio2增加gpio3的引用:
&gpio3 { u-boot,dm-pre-reloc; }; -
修改dwc_eth_qos驱动,u-boot/drivers/net/dwc_eth_qos.c:
第1854行,修改时钟名,与设备树中gmac节点的clock names对应:
ret = clk_get_by_name(dev, "mac_clk_rx", &eqos->clk_rx);第1858行,修改时钟名:
ret = clk_get_by_name(dev, "mac_clk_tx", &eqos->clk_tx); -
修改pmic驱动,u-boot/drivers/power/pmic/rk8xx.c:
取消前面配置文件中的属性屏蔽字后,pmic驱动会报错并提前终止pmic初始化流程,导致内核无法正常启动。直接注释掉相关语句,让剩余初始化继续进行:
修改377行,注释掉378-390行:
u32 val; // Line 377 /* phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA); if (phandle == -ENODATA) { printf("Read 'interrupt-parent' failed, ret=%d\n", phandle); return phandle; } ret = dev_read_u32_array(dev, "interrupts", &interrupt, 1); if (ret) { printf("Read 'interrupts' failed, ret=%d\n", ret); return ret; } */ //Line 390 -
重新编译并刷写uboot
-
测试
在uboot控制台中输入:
=> setenv ipaddr 192.168.3.2 => ping 192.168.3.1 ethernet@fe010000 Waiting for PHY auto negotiation to complete. done Using ethernet@fe010000 device host 192.168.3.1 is alive
成功啦~

浙公网安备 33010602011771号