平台:rockchip瑞芯微rv1126
当我们拿到一块新板子后,为了方便调试,除了最常用的串口,紧随其后就是以太网了。串口基本上不需要额外的配置,通过usb-ttl接上TX/RX/GND,按照对应的波特率去启动串口,上电后就能对板子进行命令行操作了。
而以太网的话,由于板子上的PHY芯片五花八门,而sdk中uboot源码设备树配置大概率不会恰好匹配板子的硬件设计,所以我们需要进行适配。接下来我教大家如何完成适配,实现uboot状态下板子与上位机的以太网通信功能。
一、设备树
首先找到这块板子对应的设备树dts文件,该文件存放在sdk/u-boot/arch/arm/dts/路径下,通过执行“ll rv1126*”命令可以看到以下打印信息:
会看到有2种后缀名,dts和dtsi,其中dts文件是设备树的主文件,描述了一个【具体】设备或板子的硬件配置。每个具体的硬件设备都会有一个对应的dts文件,它是系统用来解析设备硬件结构的主要输入。
dtsi文件是设备树的包含文件,通常是一个【共享】的硬件描述片段,供多个dts文件引用。dtsi文件中定义的是通用或模块化的硬件配置,目的是实现代码复用。
所以我们如果要适配以太网驱动,就是去修改dts文件,而到底是rv1126-evb.dts还是rv1126-bat-evb.dts呢?我们可以在sdk根目录下执行./build.sh uboot编译一次uboot,执行完后再在sdk/u-boot/arch/arm/dts/路径下查看rv1126多了哪个dtb,其对应的dts文件就是我们uboot默认编译的设备树源文件了,打开它你会发现dts文件里内容很少,并没有关于以太网的内容,其实这些内容并不是没有,而是放在了rv1126-u-boot.dtsi和rv1126-pinctrl.dtsi里,
首先看rv1126-u-boot.dtsi:
从上往下,一个一个解释下,第216行“&gmac”意为其后括号内的内容是对gmac定义的补充,
第217行“u-boot,dm-pre-reloc;”意为gmac是在uboot重定位前就需要使用的设备,
背景知识:(u-boot中设备的初始化分为两个阶段:重定位之前 (pre-relocation) 和 重定位之后 (post-relocation)。大部分设备驱动都在重定位之后进行初始化。而部分关键的设备驱动如串口、I2C等,需要在重定位之前就进行初始化,这样在重定位阶段就能使用这些设备驱动提供的功能。)
第219行“phy-mode = "rgmii";”意为PHY支持RGMII接口,
第220行“clock_in_out = "input";”意为主控SOC的时钟方向为输入,
第222-225行即phy复位脚与复位时间的描述,其中第222-223行“snps,reset-gpio = <&gpio3 RK_PA0 GPIO_ACTIVE_LOW>;snps,reset-active-low;”意为芯片复位脚为3_A0且低电平有效,
第225行“snps,reset-delays-us = <0 20000 100000>;”意为复位时先拉低20ms再拉高100ms,
第227-229行即时钟源选择与频率设定,其中第227行“assigned-clocks = <&cru CLK_GMAC_SRC>, <&cru CLK_GMAC_TX_RX>, <&cru CLK_GMAC_ETHERNET_OUT>;”意为MAC的时钟源,
第228行“assigned-clock-parents = <&cru CLK_GMAC_SRC_M1>, <&cru RGMII_MODE_CLK>;”意为MAC的父时钟由cru CLK_GMAC_SRC_M1及cru RGMII_MODE_CLK提供,
第229行“assigned-clock-rates = <125000000>, <0>, <25000000>;”意为第227行CLK_GMAC_SRC时钟频率为125000000即125MHz,CLK_GMAC_TX_RX时钟频率为0Hz,CLK_GMAC_ETHERNET_OUT时钟频率为25000000即25MHz,
第231-232行“pinctrl-names = "default";pinctrl-0 = <&rgmiim1_pins &clk_out_ethernetm1_pins>;”意为该引脚配置项名为default且按照rgmiim1_pins及clk_out_ethernetm1_pins节点的内容来,这2个节点在哪呢?在rv1126-pinctrl.dtsi文件里,
第234-235行“tx_delay = <0x2a>;rx_delay = <0x1a>;”意为发送延迟为"0x2a"对应42,接收延迟为"0x1a"对应26,这表示发送延迟被设定为42单位时间,接收延迟被设定为26单位时间,
第237行“phy-handle = <&phy>;”意为连接到此网络设备的PHY芯片句柄为phy节点,
第238行“status = "okay";”意为使用该gmac节点。
我们需要根据自身情况更改为下面这样:
二、驱动
设备树配完了,接下来是驱动,切换到sdk/u-boot/路径下并执行make rv1126_defconfig,意为将configs/rv1126_defconfig文件内容导入.config文件中,再执行make menuconfig就能在配置界面中获取到defconfig当前的配置情况,我们在其基础上进行配置:这部分工作不多,由于我们使用的是REALTEK的以太网芯片,将CONFIG_PHY_REALTEK配置项使能即可,记得退出后执行make savedefconfig将.config转换成defconfig,并执行cp defconfig configs/rv1126_defconfig将新配置表对原表进行覆盖更新。
三、烧写验证
在sdk根目录下执行./build.sh uboot,编译完成后将rockdev/uboot.img烧到板子里去,完成烧录后长按ctrl+c上电进入到uboot控制台,输入“setenv ipaddr 192.168.0.50;setenv netmask 255.255.255.0;setenv serverip 192.168.0.123;ping 192.168.0.151”,会发现ping不通并提示如下内容:
经过后面查找相关资料我发现,rk官方对uboot做了改造,uboot不仅引用了自身的dtb信息,还引用了kernel的dtb信息,U-Boot初始化时先⽤U-Boot DTB完成存储、打印串口初始化,然后从存储上加载Kernel DTB 并转而使⽤
这份DTB继续初始化其余外设。所以我们需要将uboot的gmac设备树挪到kernel的设备树中,编一版boot.img烧录进去,这样就能在uboot状态下正常使用以太网功能了。
如果觉得本文对您有帮助,欢迎点赞+收藏+关注哈!谢谢大家!