iTOP_RK3568的PCIe2.0节点设备树使能并配置i210网卡探索的过程和踩坑
本文记录个人学习使能iTOP_RK3568设备树里PCIe2.0节点的探索过程。主要复用SATA的硬盘挂载节点为PCIe2.0节点。
调查原理图
我们要使能开发板上的PCIe2.0接口来连接网卡,但是默认情况下该节点是关闭状态下,并且可知和SATA硬盘的节点是复用关系,所以要关掉SATA的节点
首先在原理图中搜到了PCIe2,首先找到了和SATA的复用关系:

原来涉及到了这些引脚,主要是一些差分信号的发送接收线路
接下来是我们要用的PCIe的x1 solt,就是我们要用到的。

但是往下一看,居然还有一个pcie2.0,讲什么4g模块,不会还有什么复用关系吧?

仔细观察引脚图可知,这是USB引脚连接的移远4g模块,没有用到PCIe的引脚
从设备树文件topeet-rk3568-linux.dts可知:

有一个供电使能的节点,我们关注一下供电节点:


原理图上显示,都是直接由系统供电电路供电的,然后下面各自有一个的电流控制电路的框,标注NC,就是不焊接的意思。而默认是没用焊接的。这一部分负责控制的正是设备树里的GPIO2_C5引脚。
那么问题就来了,为什么明明是直连还要有这么一个节点呢?
根据厂商解释,这个控制节点没焊接就没用。如果焊接了就有用了。
为了以防万一,检查了一下GPIO2_C5在原理图中还有没有其他用途,经过搜索,是没有的,只出现在这两个NC的电路里。
调查PCIe驱动用到的节点
PCIe除了供电,还有很多可选的辅助引脚,例如clkreq / wake/supply/reset-gpios/pinctrl/max-link/num-lanes,但是我们不知道哪些实际用到了,没用到就不必在设备树里设置。
找到PCIe2.0的驱动源码:rk356x_linux/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c
分别搜索:clkreq / wake/supply/reset-gpios/pinctrl/max-link/num-lanes结果是,只涉及, PERST 。num-lanes
CLKREQ/WAKE 之类的辅助引脚找不到应用的地方,所以就用不到了,所以不需要在设备树里配置了。
而没supply的事,这说明驱动是不在意供电的影响的。也不用在设备树里管这些。
num-lanes这个属性标记了PCIe控制器用了几条lane,(这里是x1就是1条),而看代码可知这个参数被驱动读了出来,如果不找就直接报错返回了,所以是必填的。
ret = of_property_read_u32(np, "num-lanes", &lanes);
if (ret)
lanes = 0;
...
default:
dev_err(dev, "num-lanes %u: invalid value\n", lanes);
return;
在设备树中找,到看到,基节点里已经有了num-lanes = <1>,所以并不需要我们去自己写了。
reset引脚,有用到,所以要配置一下
原理图上找到reset对应的引脚:找到是直连GPIO 0 c1.

关闭SATA节点使能
他们的复用关系是由Combo PHY控制器控制的,不需要做什么,只需要关闭SATA的节点使能,就能自动给由控制器实现复用,无需修改pinctrl或者pinmux之类的。
修改SATA2为:
&sata2 { status = "disabled"; },
使能需要的引脚
增加一个PCIe2x1的节点:
&pcie2x1 {
status = "okay";
reset-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>;
};
配置i210网卡驱动
进入图形界面打开驱动
cd /home/aya/ayalinux/rk356x_linux/kernel
export ARCH=arm64
export CROSS_COMPILE=/home/aya/ayalinux/rk356x_linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
make rockchip_linux_defconfig
make menuconfig
搜索IGB打开驱动




进行内核编译并烧录,就可以安装驱动。
坑:废弃驱动占用端口
烧录并上电后,发现网口并没有起来
查看内核日志:
dmesg | grep -iE 'rk-pcie'
结果是:
rk-pcie 3c0000000.pcie: invalid reset-gpios property in node
rk-pcie 3c0000000.pcie: resource init failed
控制器直接没初始化,所以 lspci 空、没有 igb 网口
怎么会失败呢?这个invalid是一个很广泛的说法不是很具体,不过提到了是gpio的问题,那就去gpio子系统看看
GPIO0_C1是一个宏定义,点进去看到代表的是gpio17,于是就在子系统中搜索gpio17:
cat /sys/kernel/debug/gpio | grep -E 'gpio-17'
输出:
gpio-17 ( |vcc_camera ) out hi
可以看到 gpio-17 已经被一个叫 vcc_camera 的消费者占用,并输出高电平
回到设备树文件检查,搜索RK_PC1果然找到:
rk3568-evb1-ddr4-v10.dtsi:89: gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
...
rk3568-evb1-ddr4-v10.dtsi:411: reset-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>;
原因是默认设置 &gpio0 RK_PC1 被摄像头驱动占用,所以需要去关掉设备树里的摄像头节点(本来也没接摄像头)
所以就没有消费者,白白占着节点。
解决方法:直接去设备树文件rk3568-evb1-ddr4-v10.dtsi把相机节点删了。

浙公网安备 33010602011771号