使用rockchip sdk提供的uboot调通网络

目录

[一,rockchip uboot为啥不调通网络](#一,rockchip uboot为啥不调通网络)

二,uboot关闭快起模式

三,修改uboot的dts使uboot支持网络正常使用

1,修改ethernet@ff290000

2,修改上层dts的gmac

3,电源管理适配

4,修改config

四,关闭uboot的快启模式,使uboot支持bootz启动kernel


一,rockchip uboot为啥不调通网络

厂商提供的sdk一般都是buildroot包含uboot和kernel整体编译,或者使用shell脚本小白式的告诉你操作手册编译方法和烧录方法直接进入rootfs,中间采用快起模式,省略了很多uboot功能,所以没有考虑uboot支持net或tftp等功能

二,uboot关闭快起模式

rockchip uboot的快启模式,直接在uboot加载kernel的dts,所以需要整体打包,updateimg如果不烧录kernel,uboot启动会有一堆错误打印而且ethnet探测失败显示网络异常,所以如果想通过tftp形式加载kernel,提高开发速度,需要关闭快启模式,使uboot支持net网卡。

如图,如果updateimg不携带kernel包,会打印read kernel dtb失败,no ethnet found等等错误。

按照正常理解以为uboot出问题了,其实是打包的问题。

三,修改uboot的dts使uboot支持网络正常使用

1,修改ethernet@ff290000

修改u-boot/arch/arm/dts/rk3288.dtsi

ethernet@ff290000 {

rgmii_pins: rgmii-pins {

rockchip,pins = <3 RK_PD6 3 &pcfg_pull_none>,

<3 RK_PD7 3 &pcfg_pull_none>,

<3 RK_PD2 3 &pcfg_pull_none>,

<3 RK_PD3 3 &pcfg_pull_none>,

<3 RK_PD4 3 &pcfg_pull_none>,

<3 RK_PD5 3 &pcfg_pull_none>,

<3 RK_PD0 3 &pcfg_pull_none>,

<3 RK_PD1 3 &pcfg_pull_none>,

<4 RK_PA0 3 &pcfg_pull_none>,

<4 RK_PA5 3 &pcfg_pull_none>,

<4 RK_PA6 3 &pcfg_pull_none>,

<4 RK_PB1 3 &pcfg_pull_none>,

<4 RK_PA4 3 &pcfg_pull_none>,

<4 RK_PA1 3 &pcfg_pull_none>,

<4 RK_PA3 3 &pcfg_pull_none>;

};

phy_int: phy-int {

rockchip,pins = <0 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>;

};

phy_pmeb: phy-pmeb {

rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>;

};

phy_rst: phy-rst {

rockchip,pins = <4 RK_PB0 RK_FUNC_GPIO &pcfg_output_high>;

};

};

删除掉了rmii,直接使用rgmii,两者的主要区别是:

RMII和RGMII的核心区别在于传输速率、数据位宽、时钟机制和应用场景:RMII仅支持10/100Mbps,采用2位数据位宽和50MHz单时钟,适用于低成本嵌入式设备;RGMII支持10/100/1000Mbps,采用4位数据位宽和125MHz双沿采样时钟,适用于高速网络设备。

rgmii的配置直接采用了kernel的配置,三个pin脚的配置也是从kernel的dts移植过来的,既然kernel的dts配置网络是通的,直接使用即可。

2,修改上层dts的gmac

&gmac {

compatible = "rockchip,rk3288-gmac";

reg = <0xff290000 0x10000>;

interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;

interrupt-names = "macirq";

rockchip,grf = <&grf>;

clocks = <&cru SCLK_MAC>,

<&cru SCLK_MAC_RX>, <&cru SCLK_MAC_TX>,

<&cru SCLK_MACREF>, <&cru SCLK_MACREF_OUT>,

<&cru ACLK_GMAC>, <&cru PCLK_GMAC>;

clock-names = "stmmaceth",

"mac_clk_rx", "mac_clk_tx",

"clk_mac_ref", "clk_mac_refout",

"aclk_mac", "pclk_mac";

assigned-clocks = <&cru SCLK_MAC>;

assigned-clock-parents = <&ext_gmac>;

clock_in_out = "input";

pinctrl-names = "default";

pinctrl-0 = <&rgmii_pins>, <&phy_rst>, <&phy_pmeb>, <&phy_int>;

phy-supply = <&vcc_lan>;

phy-mode = "rgmii";

snps,reset-active-low;

snps,reset-delays-us = <0 10000 1000000>;

snps,reset-gpio = <&gpio4 RK_PB0 GPIO_ACTIVE_LOW>;

tx_delay = <0x1d>;

rx_delay = <0x16>;

status = "okay";

};

这个是从kernel linux6.0.8版本的dts抠出来的,因为有大佬在博客上测通了这个版本适配rk3288的网络,直接用的。

3,电源管理适配

vcc_lan: REG8 {

regulator-name = "vcc_lan";

regulator-min-microvolt = <3300000>;

regulator-max-microvolt = <3300000>;

regulator-always-on;

};

uboot的vcc_lan要打开regulator-always-on,默认是不开的。这个地方我就踩坑了,最后只因为多看了一眼。

4,修改config

config需要开启这几个配置

CONFIG_ETH_DESIGNWARE=y

CONFIG_GMAC_ROCKCHIP=y

CONFIG_DM_ETH=y

四,关闭uboot的快启模式,使uboot支持bootz启动kernel

跟踪日志发现uboot使用的android镜像格式,且会初始化kernel dtb,所以不带kernel就会出问题,修改uboot如下:

再次烧录之后,uboot显示正常

相关推荐
无人生还别怕1 小时前
如何制作一个linux标准iso镜像
linux·iso·opencloudos·openanolisos
Yana.nice9 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
andxe11 小时前
安科士 AndXe 技术博客:400G QSFP112 SR4 光模块|AI 算力与超算短距互联最优方案
网络·人工智能·光模块·光通信
shiyi.十一12 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
DFT计算杂谈12 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
水境传感 李兆栋12 小时前
GNSS 位移监测站 :毫米级感知,筑牢安全监测防线
网络
sramdram13 小时前
MCU微控制器OA打印机方案
单片机·嵌入式硬件·mcu·mcu微控制器
Zhang~Ling14 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind14 小时前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock
天天爱吃肉821814 小时前
【电源拆解:跟着问答逐一认识开关适配器PCB元器件】
大数据·人工智能·python·功能测试·嵌入式硬件·汽车