• Linux 网络驱动实验


    本文章对Linux 网络驱动实验中的设备树进行介绍,Linux网络驱动程序比较复杂,只要学会应用。

    1、I.MX6ULL 网络外设设备树

            I.MX6ULL 有两个 10/100M 的网络 MAC 外设,因此 I.MX6ULL 网络驱动主要就是这两个网络 MAC 外设的驱动。
            fec1 fec2 分别对应 I.MX6ULL ENET1 ENET2
    1. 示例代码 69.4.1.2 网络引脚 pinctrl 信息
    2. pinctrl_enet1: enet1grp {
    3. fsl,pins = <
    4. MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
    5. MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
    6. MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
    7. MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
    8. MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
    9. MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
    10. MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
    11. MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
    12. >;
    13. };
    14. pinctrl_enet2: enet2grp {
    15. fsl,pins = <
    16. MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0
    17. MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0
    18. MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0
    19. MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0
    20. MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0
    21. MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0
    22. MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0
    23. MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0
    24. MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0
    25. MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009
    26. >;
    27. };
    28. /*enet1 reset zuozhongkai*/
    29. pinctrl_enet1_reset: enet1resetgrp {
    30. fsl,pins = <
    31. /* used for enet1 reset */
    32. MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
    33. >;
    34. };
    35. /*enet2 reset zuozhongkai*/
    36. pinctrl_enet2_reset: enet2resetgrp {
    37. fsl,pins = <
    38. /* used for enet2 reset */
    39. MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
    40. >;
    41. };
    42. &fec1 {
    43. pinctrl-names = "default";
    44. pinctrl-0 = <&pinctrl_enet1
    45. &pinctrl_enet1_reset>;
    46. phy-mode = "rmii";
    47. phy-handle = <&ethphy0>;
    48. phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    49. phy-reset-duration = <200>;
    50. status = "okay";
    51. };
    52. &fec2 {
    53. pinctrl-names = "default";
    54. pinctrl-0 = <&pinctrl_enet2
    55. &pinctrl_enet2_reset>;
    56. phy-mode = "rmii";
    57. phy-handle = <&ethphy1>;
    58. phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    59. phy-reset-duration = <200>;
    60. status = "okay";
    61. mdio {
    62. #address-cells = <1>;
    63. #size-cells = <0>;
    64. ethphy0: ethernet-phy@0 {
    65. compatible = "ethernet-phy-ieee802.3-c22";
    66. reg = <0>;
    67. };
    68. ethphy1: ethernet-phy@1 {
    69. compatible = "ethernet-phy-ieee802.3-c22";
    70. reg = <1>;
    71. };
    72. };
    73. };

            ENET1 网口的节点属性,设置 ENET1 所使用的引脚 pinctrl 节点信息,设置网络对应的 PHY 芯片接口为 RMII,这个要根据实际的硬件来设置。设置 PHY 芯片的句柄为 ethphy0MDIO 节点会设置 PHY 信息。其他的属性信息就很好理解了,基本已经在上面讲解绑定文档的时候说过了。

            ENET2 网口的节点属性,基本和 ENET1 网口一致,区别就是多了第 mdio 子节点,前面讲解绑定文档的时候说了,mido 子节点用于描述 MIDO 总线,在此子节点内会包含 PHY 节点信息。这里一共有两个 PHY 子节点:ethphy0 ethphy1,分别对应ENET1 ENET2 PHY 芯片。比如ethphy0: ethernet-phy@0”就是 ENET1 PHY节点名字,“@”后面的 0 就是此 PHY 芯片的芯片地址,reg 属性也是描述 PHY 芯片地址的,这点和 IIC 设备节点很像。其他地方就没什么好多的了,绑定文档已经讲解的很清楚了。

    单网卡使用

    1、只使用 ENET2 网卡

    1. &fec1 {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&pinctrl_enet1
    4. &pinctrl_enet1_reset>;
    5. phy-mode = "rmii";
    6. phy-handle = <&ethphy0>;
    7. phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    8. phy-reset-duration = <200>;
    9. status = "disabled";
    10. };

    status 改为“disabled”。

    ifconfig -a //查看所有网卡

    2、只使用 ENET1

    (1)屏蔽或删除掉 fec2 节点内容网卡

    (2)修改 ENET1 对应的 fec1 节点信息。

    1. &fec1 {
    2. pinctrl-names = "default";
    3. pinctrl-0 = <&pinctrl_enet1
    4. &pinctrl_enet1_reset>;
    5. phy-mode = "rmii";
    6. phy-handle = <&ethphy0>;
    7. phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    8. phy-reset-duration = <200>;
    9. status = "okay";
    10. mdio {
    11. #address-cells = <1>;
    12. #size-cells = <0>;
    13. ethphy0: ethernet-phy@0 {
    14. compatible = "ethernet-phy-ieee802.3-c22";
    15. reg = <0>;
    16. };
    17. };
    18. };

    重点是在 fec1 中添加第 11~19 行的 mdio 子节点,而且仅仅留下 ENET1 对应的 PHY 子节点。

    (3)屏蔽或删除掉 ENET2 对应的 pinctrl 节点

    (4)ENET1 网卡对应的 pinctrl 节点中添加 MDIO MDC 引脚配置

    1. pinctrl_enet1: enet1grp {
    2. fsl,pins = <
    3. MX6UL_PAD_GPIO1_IO07__ENET1_MDC 0x1b0b0
    4. MX6UL_PAD_GPIO1_IO06__ENET1_MDIO 0x1b0b0
    5. MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
    6. MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
    7. MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
    8. MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
    9. MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
    10. MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
    11. MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
    12. MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
    13. >;
    14. };

    GPIO1_IO07 复用为 ENET1_MDC 引脚。

    GPIO1_IO06 复用为 ENET1_MDIO 引脚。

    至此,设备树修改完成,重新编译设备树,然后用新的设备树启动系统。

  • 相关阅读:
    基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的智慧养老管理系统
    LeetCode:2304. 网格中的最小路径代价(C++)
    LeetCode每日一题(2380. Time Needed to Rearrange a Binary String)
    基于支持向量机的试剂条图像识别,基于SVM的图像识别,SVM的详细原理,Libsvm工具箱使用注意事项
    【Java 进阶篇】JavaScript DOM Document对象详解
    基于springboot的药品管理
    【计算机毕设选题推荐】产品管理系统SpringBoot+SSM+Vue
    Vue2+Vue3笔记(尚硅谷张天禹老师)day03
    线路中边桩任意里4800
    从零自制docker-14-【实现 mydocker commit 打包容器成镜像】
  • 原文地址:https://blog.csdn.net/m0_51144400/article/details/133716382