• Linux内核移植之网络驱动更改说明一


    一.  简介

    本文学习 NXP官方Linux内核移植网络驱动的更改。

    为了方便后面 Linux驱动的开发调试,所以,必须要把网络驱动调试好。

    如果在做 Linux驱动开发时,写了一个 app或驱动,就需要将系统全部文件(即 uboot,kernel,.dtb文件,filesystem文件系统)烧写到开发板上,这个烧写过程是很慢的,filesystem根文件系统是很大的。

    网络调试的话,可以将所有文件存放在 ubuntu系统下,开发板系统启动后,将 ubuntu系统下的 某个文件目录挂载在开发板上。如果更新了某个程序或文件,可以将其直接拷贝到该文件目录下,开发板就可以直接运行调试。这样调试十分方便。

    二.   Linux内核移植之网络驱动更改

    在学习 uboot 移植的时候就已经说过了,正点原子开发板的网络和 NXP(恩智浦) 官方的网络硬件上 不同,网络 PHY 芯片由 KSZ8081 换为了 LAN8720A ,两个网络 PHY 芯片的复位 IO 也不同。 所以, NXP官方的 Linux 内核自带的网络驱动是驱动不起来 I.MX6U-ALPHA 开发板上的网络的,需要做修 改。

    网络驱动的更改大体有五个方面更改。下面具体说明更改点。

    1.  修改 LAN8720 的复位引脚驱动 与 网络时钟引脚驱动

    (1) 删除 LAN8720(PHY芯片)的复位引脚做别的功能

    结合IMX6ULL参考手册与网络硬件原理图可以知道,网络 ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL SNVS_TAMPER7 这个引脚上。网络ENET2 的复位引脚 ENET2_RST 连接在 I.MX6ULL SNVS_TAMPER8 上。

    这里我所使用的开发板是 nand-Flash版,对应的设备树配置文件为 imx6ull-alientek-nand.dts(之前添加ALPHA开发板添加的)。因为 imx6ull-alientek-nand.dts调用了imx6ull-14x14-evk.dts文件。

    打开设备树文件 imx6ull-14x14-evk.dts,如下代码:

    1. pinctrl_spi4: spi4grp {
    2. fsl,pins = <
    3. MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
    4. MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
    5. /* MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1 */
    6. /* MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000 */
    7. >;
    8. };
    5 行和 第 6 行,就是初始化 SNVS_TAMPER7 SNVS_TAMPER8 这两个 引脚的,这里是作为了 SPI4 IO ,这不是我们想要的,所以将第5行 第6行 代码 删除掉!

    继续在 imx6ull-14x14-evk.dts 文件中,找到如下代码:

    1. spi4 {
    2. compatible = "spi-gpio";
    3. ....................................
    4. /* pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; */
    5. status = "okay";
    6. gpio-sck = <&gpio5 11 0>;
    7. gpio-mosi = <&gpio5 10 0>;
    8. /* cs-gpios = <&gpio5 7 0>; */
    9. num-chipselects = <1>;
    10. ...................................
    11. }

    如上所示:4 行,设置 GPIO5_IO08 SPI4 的一个功能引脚(我也不清楚具体作为什么功能用)GPIO5_IO08 就是 SNVS_TAMPER8 GPIO 功能引脚。

    8 行,设置 GPIO5_IO07 作为 SPI4 的片选引脚,而 GPIO5_IO07 就是 SNVS_TAMPER7 GPIO 功能引脚。
    现在我们需要 GPIO5_IO07 GPIO5_IO08 分别作为 ENET1 ENET2 的复位引脚,而不 SPI4 的功能引脚,因此,上面第 4 行与第 8行 处的代码删除掉!! 否则会干扰到网络复位引脚!

    (2) 添加网络复位引脚,配置网络时钟

    在 imx6ull-14x14-evk.dts 文件中找到名为 “ iomuxc_snvs ” 的节点 ,然后在 此节点下添加网络复位引脚信息,添加完成以后的 “ iomuxc_snvs ” 的节点内容如下:
    1. &iomuxc_snvs {
    2. pinctrl-names = "default_snvs";
    3. pinctrl-0 = <&pinctrl_hog_2>;
    4. imx6ul-evk {
    5. ...............................
    6. /*enet1 reset zuozhongkai*/
    7. pinctrl_enet1_reset: enet1resetgrp {
    8. fsl,pins = <
    9. /* used for enet1 reset */
    10. MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
    11. >;
    12. };
    13. /*enet2 reset zuozhongkai*/
    14. pinctrl_enet2_reset: enet2resetgrp {
    15. fsl,pins = <
    16. /* used for enet2 reset */
    17. MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
    18. >;
    19. };
    20. };
    21. };

    2.  修改 fec1 和 fec2 节点的 pinctrl-0 属性

    在 imx6ull-14x14-evk.dts 文件中,找到名为 “ fec1 ” 和 “ fec2 ” 的这两个节点,修改其中的 “ pinctrl-0 ”属性值,修改以后如下所示:
    1. &fec1 {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&pinctrl_enet1
    4. &pinctrl_enet1_reset>;
    5. phy-mode = "rmii";
    6. ............................
    7. phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    8. phy-reset-duration = <200>;
    9. status = "okay";
    10. };
    11. &fec2 {
    12. pinctrl-names = "default";
    13. pinctrl-0 = <&pinctrl_enet2
    14. &pinctrl_enet2_reset>;
    15. ...........................
    16. phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    17. phy-reset-duration = <200>;
    18. status = "okay";
    19. };

    3~4 行,修改后的 fec1 节点“ pinctrl-0 ”属性值。
    14~15 行,修改后的 fec2 节点“ pinctrl-0 ”属性值。

    3. 修改 LAN8720A 的 PHY 地址

    4. 修改 fec_main.c 文件

    5. 修改 smsc.c 文件

    6. 配置 Linux 内核,使能 LAN8720 驱动

  • 相关阅读:
    分类算法(Classification Algorithm)需求记录
    Python期末复习题库(上)——“Python”
    为XDR扩展威胁检测响应提供响应解决方案
    js 给对象写 JSON.stringify 的方法
    mybatis 或 mybatis-plus 执行 sql 的三种方式
    Pikachu靶场通关秘籍(持续更新)
    中断(全网最细!)
    MTK平台Metadata的加载(3)——其他Static和Request加载
    Postman抓包网页请求
    使用react-router-dom在新标签页打开链接,而不是本页跳转
  • 原文地址:https://blog.csdn.net/wojiaxiaohuang2014/article/details/134313628