Linux 网络驱动

1. linux 里面驱动三巨头:字符设备驱动、块设备驱动、网络设备驱动。

2.嵌入式网络硬件分为两部分: MAC 和 PHY。

如果一款芯片数据手册说自己支持网络,一般都是说的这款 SOC 内置 MAC, MAC 类似 I2C 控制器、SPI 控制器一样的外设。但是光有 MAC还不能直接驱动网络,还需要另外一个芯片: PHY,因此对于内置 MAC 的 SOC,其外部必须搭配一个 PHY 芯片

3.一般这种外置的网络芯片都是 MAC+PHY 一体的。

比如三星 linux 开发板里面用的最多的 DM9000,因为三星的芯片基本没有内部 MAC(比如 S3C2440、 S5PV210, 4412 等),所以三星的开发板都是通过外置的 DM9000 来完成有线网络功能的, DM9000 对 SOC 提供了一个 SRAM 接口, SOC 会以 SRAM 的方式操作 DM9000。

4.一般常见的通用 SOC 都会集成网络 MAC 外设,比如 STM32F4/F7/H7 系列、 NXP 的 I.MX

系列,内部集成网络 MAC 的优点如下:

①、内部 MAC 外设会有专用的加速模块,比如专用的 DMA,加速网速数据的处理。

②、网速快,可以支持 10/100/1000M 网速。

③、外接 PHY 可选择性多,成本低。

内部的 MAC 外设会通过 MII 或者 RMII 接口来连接外部的 PHY 芯片, MII/RMII 接口用来

传输网络数据。另外主控需要配置或读取 PHY 芯片,也就是读写 PHY 的内部寄存器,所以还

需要一个控制接口,叫做 MIDO, MDIO 很类似 IIC,也是两根线,一根数据线叫做 MDIO,一

根时钟线叫做 MDC。(与音频的也有点类似,i2s传输音频数据;i2c控制通信)

5 I.MX6ULL 就有两个 10M/100M 的网络 MAC 外设,板载了一颗 PHY 芯片,型号为 LAN8723。

6 MII/RMII 接口

内部 MAC 通过 MII/RMII 接口来与外部的 PHY 芯片连接,完成网络数据。

6.1 MII 全称是 Media Independent Interface,直译过来就是介质独立接口,它是 IEEE-802.3 定义的以太网标准接口, MII 接口用于以太网 MAC 连接 PHY 芯片。

MII 接口一共有 16 根信号线,含义如下:

TX_CLK: 发送时钟,如果网速为 100M 的话时钟频率为 25MHz, 10M 网速的话时钟频率

为 2.5MHz,此时钟由 PHY 产生并发送给 MAC。

TX_EN: 发送使能信号。

TX_ER: 发送错误信号,高电平有效,表示 TX_ER 有效期内传输的数据无效。 10Mpbs 网

速下 TX_ER 不起作用。

TXD[3:0]:发送数据信号线,一共 4 根。

RXD[3:0]: 接收数据信号线,一共 4 根。

RX_CLK: 接收时钟信号,如果网速为 100M 的话时钟频率为 25MHz, 10M 网速的话时钟

频率为 2.5MHz, RX_CLK 也是由 PHY 产生的。

RX_ER: 接收错误信号,高电平有效,表示 RX_ER 有效期内传输的数据无效。 10Mpbs 网

速下 RX_ER 不起作用。

RX_DV: 接收数据有效,作用类似 TX_EN。

CRS: 载波侦听信号。

COL: 冲突检测信号。

6.2 RMII 接口

RMII 全称是 Reduced Media Independent Interface,翻译过来就是精简的介质独立接口,也就是 MII 接口的精简版本。 RMII 接口只需要 7 根数据线,相比 MII 直接减少了 9 根,极大的方便了板子布线, RMII 接口连接 PHY 芯片的示意图

TX_EN: 发送使能信号。

TXD[1:0]: 发送数据信号线,一共 2 根。

RXD[1:0]:接收数据信号线,一共 2 根。

CRS_DV: 相当于 MII 接口中的 RX_DV 和 CRS 这两个信号的混合。

REF_CLK: 参考时钟,由外部时钟源提供, 频率为 50MHz。这里与 MII 不同, MII 的接收和发送时钟是独立分开的,而且都是由 PHY 芯片提供的。

7.MDIO 接口

MDIO 全称是 Management Data Input/Output,直译过来就是管理数据输入输出接口,是一个简单的两线串行接口,一根 MDIO 数据线,一根 MDC 时钟线。驱动程序可以通过 MDIO 和MDC 这两根线访问 PHY 芯片的任意一个寄存器。 MDIO 接口支持多达 32 个 PHY。 同一时刻内只能对一个 PHY 进行操作,那么如何区分这 32 个 PHY 芯片呢?和 IIC 一样,使用器件地址即可。同一 MDIO 接口下的所有 PHY 芯片,其器件地址不能冲突,必须保证唯一,具体器件地址值要查阅相应的 PHY 数据手册。

8.RJ45 接口

网络设备是通过网线连接起来的,插入网线的叫做 RJ45 座。

RJ45 座要与 PHY 芯片连接在一起,但是中间需要一个网络变压器,网络变压器用于隔离以及滤波等,网络变压器也是一个芯片。

RJ45 座子上一般有两个灯,一个黄色(橙色),一个绿色,绿色亮的话表示网络连接正常黄色闪烁的话说明当前正在进行网络通信

内部 MAC+外部 PHY+RJ45 座(内置网络变压器)就组成了一个完整的嵌入式网络接口硬件。

9.设备树

/{
fec1: ethernet@02188000 {
                compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";                
         
                reg = <0x02188000 0x4000>;     /* SOC 网络外设寄存器地址范围 */
                
                interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* 网络中断 */
                             <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
                
                /* 时钟相关 */
                clocks = <&clks IMX6UL_CLK_ENET>,
                     <&clks IMX6UL_CLK_ENET_AHB>,
                     <&clks IMX6UL_CLK_ENET_PTP>,
                     <&clks IMX6UL_CLK_ENET_REF>,
                     <&clks IMX6UL_CLK_ENET_REF>;
                clock-names = "ipg", "ahb", "ptp",
                          "enet_clk_ref", "enet_out";
                          
                stop-mode = <&gpr 0x10 3>; /* 如果此属性存在的话表明 SOC 需要设置 GPR 位来请求停止模式。 */
                fsl,num-tx-queues=<1>;     /* 此属性指定发送队列的数量 */
                fsl,num-rx-queues=<1>;     /* 此属性指定接收队列的数量 */
                fsl,magic-packet;          /* 此属性不用设置具体的值,直接将此属性名字写到设备树里面即可,表示支持硬件魔术帧唤醒。 */
                fsl,wakeup_irq = <0>;      /* 此属性设置唤醒中断索引。 */
                status = "disabled";
              };

};

&fec1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>;
    
    phy-mode = "rmii";       /* 网络所使用的 PHY 接口模式,是 MII 还是 RMII。 */
    phy-handle = <&ethphy0>; /* 连接到此网络设备的 PHY 芯片句柄。 */
    phy-reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <26>;
    status = "okay";
};

10 DHCP 功能配置

通过 udhcpc 命令来实现从路由器动态申请 IP 地址, udhcpc 命令已经集成到了 busybox 中,所以不需要我们另外移植。

ifconfig eth1 up //打开 eth1 网卡

udhcpc -i eth1 //为 eth1 网卡申请 IP 地址

ifconfig -a //查看所有网卡

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值