本帖最后由 おおおじ。 于 2023-1-13 15:31 编辑
前言
imx6ull的IO资源比较“紧张”,在nxp以及野火的imx6ull的底板上网口复位引脚以及其他一些外设的复位引脚都使用74LV595进行IO扩展,如图下图所示,但在实际项目中IO资源可能并不紧张,那么还使用74LV595进行IO扩展就显得十分多余!本文教大家如何使用其他IO对网口进行复位,并且在实际项目中也可能只用到一个网口,另一个网口的引脚作其他复用,本文也教大家如何实现单网口。
一、硬件说明 下图为野火imx6ull mini底板的扩展IO,实际项目中可以直接使用SNVS_TAMPER7以及SNVS_TAMPER8,也即GPIO5_7和GPIO5_8分别对两网口进行复位。
二、驱动移植 虚拟机环境:ubuntu18.04 开发板:实际项目中采用野火imx6ull核心板的开发板 开发板镜像:野火debian 2022_10_08镜像
搭建编译环境 sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop
获取内核源码
1、网口复位引脚修改 (无论是单网口还是双网口此处请先跟着修改) 如果是emmc核心板打开ebf_linux_kernel_6ull_depth1/arch/arm/boot/dts/imx6ull-mmc-npi.dts 如果是nand核心板打开ebf_linux_kernel_6ull_depth1/arch/arm/boot/dts/imx6ull-nand-npi.dts
两者修改方法一致,只是对应的文件不同,下面以emmc核心板为例
找到74hc595的节点,将pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; 以及cs-gpios = <&gpio5 7 0>; 进行注释,避免与后面配置冲突,修改完如下图所示
添加复位引脚 找到&fec1以及&fec2节点分别添加 phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>; // 复位引脚 phy-reset-duration = <200>; //复位时间
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; // 复位引脚 phy-reset-duration = <200>; //复位时间 修改完如下图所示
添加复位引脚属性配置 找到pinctrl_enet1以及pinctrl_enet2节点分别修改时钟的电气属性以及添加复位引脚配置 MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009 // 时钟 MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 // 复位引脚
MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009 // 时钟 MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 // 复位引脚 修改完如下图所示
重新编译设备树 在内核源码顶层目录输入: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs 如下下图所示
编译出来的设备树生成在 arch/arm/boot/dts/imx6ull-mmc-npi.dtb位置
替换开发板的设备树,设备树.dtb文件可以直接替换到板子的 /usr/lib/linux-image-4.19.35-imx6/ 目录下后重启 sudo cp -f imx6ull-mmc-npi.dtb /usr/lib/linux-image-4.19.35-imx6/ 执行完上面命令重启开发板即可
2、单网口修改 (1)单eth1网口 找到pinctrl_enet1以及pinctrl_enet2节点 在pinctrl_enet1节点下添加 MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0 MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0 在pinctrl_enet2下,将以下内容都注释掉 /* MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0 MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0 MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0 MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0 MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0 MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0 MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0 MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0 MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0 MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009 // 时钟 MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 // 复位引脚 */ 修改完如下图所示
重新编译设备树 在内核源码顶层目录输入: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs 如下下图所示
编译出来的设备树生成在 arch/arm/boot/dts/imx6ull-mmc-npi.dtb位置
替换开发板的设备树,设备树.dtb文件可以直接替换到板子的 /usr/lib/linux-image-4.19.35-imx6/ 目录下后重启 sudo cp -f imx6ull-mmc-npi.dtb /usr/lib/linux-image-4.19.35-imx6/ 执行完上面命令重启开发板即可
(2)单eth2网口 单eth2网口相对单eth1网口修改十分简单,只需将&fec1改为 disabled即可,修改为如下图所示
重新编译设备树 在内核源码顶层目录输入: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs 如下下图所示
编译出来的设备树生成在 arch/arm/boot/dts/imx6ull-mmc-npi.dtb位置
替换开发板的设备树,设备树.dtb文件可以直接替换到板子的 /usr/lib/linux-image-4.19.35-imx6/ 目录下后重启 sudo cp -f imx6ull-mmc-npi.dtb /usr/lib/linux-image-4.19.35-imx6/ 执行完上面命令重启开发板即可
三、其他型号的PHY芯片驱动 nxp和野火都使用KSZ8081RNB型号的PHY芯片,那么使用其他型号的PHY芯片驱动应该如何修改呢?
其实内核已经自带了通用的PHY驱动,理论上可以驱动任何的PHY芯片,并且这个驱动是开启了的 而PHY驱动的匹配规则是首先匹配我们指定的PHY驱动,例如KSZ8081RNB这个型号,是micrel公司生产的,我们配置好设备树和在内核开启了相应的驱动后,首先匹配的就是micrel的驱动
当驱动匹配不成功的时候就会匹配通用的PHY驱动,笔者这里测试过其他型号的PHY芯片,例如SR8201F型号的PHY芯片,这个芯片是SMSC公司生产的,如果要使用对应的驱动来驱动该PHY芯片,正常操作是开启对应驱动,修改设备树,参考下图
如果要使用通用的PHY驱动来驱动该PHY芯片,如上述所说当驱动匹配不成功的时候就会匹配通用的PHY驱动,所以你可以完全不修改内核配置和设备树(这里指没有修改过复位引脚,改了复位的话是要按之前所说的修改复位引脚)
四、PHY地址说明 PHY的地址是在硬件上确定的,然后软件上再根据硬件设计,例如野火底板,eth1的地址为0x02,eth2的地址为0x01
根据硬件设计,在设备树里面确定两网口的PHY地址,硬件地址和软件地址要对应
五、附件 提供eth1、eth2网口PHY地址分别为0x02、0x01的修改好复位引脚的emmc版本和nand版本的双网口、单网口的设备树源码以及编译好的文件
网口移植.zip
(71.5 KB, 下载次数: 40)
|