基于335X平台Linux交换芯片驱动开发

本文档详细介绍了基于335X平台Linux系统中,针对MARVELL 88E6321交换芯片的驱动开发过程,包括DTS文件的修改、网络接口pinmux配置、网口驱动架构及流程分析。通过修改设备树以适应RMII模式,并实现PHY设备与驱动的匹配和初始化,最终构建交换芯片的驱动,确保网络传输的正常运行。
摘要由CSDN通过智能技术生成

基于335X平台Linux交换芯片驱动开发

一、软硬件平台资料

1、开发板:创龙AM3359核心板,网口采用RMII形式。

2、Kernel版本:4.4.12,采用FDT

3、交换芯片MARVELL的88E6321.

二、移植准备工作

1、熟悉88E6321的datasheet及Functional_Specification_Rev.0.05

2、熟悉设备树相关理论和用法

3、熟悉Linux网络驱动MDIO、PHY部分的软件流程

三、DTS文件修改

本工程的DTS文件以am335x-icev2.dts为基础进行修改

1、修改网络接口MODE

我们板子上使用的是335X的RMII接口与SW相连,使用SW的RMII接口提供的50M时钟信号。根据硬件连接关系,335X的RMII接口与SW的PORT5相连,根据SW使用单芯片模式,根据SW的访问机制,这里设置phy_id为0x15.所以对设备树相关接口模式部分做如下修改

-  &cpsw_emac0 {

-   phy_id = <&davinci_mdio>, <0>;

-   phy-mode = "rgmii";

-  };

+ &cpsw_emac0 {

+  phy_id = <&davinci_mdio>, <0x15>;

+  phy-mode = "rmii";

+ };

2、修改网络接口pinmux

将原有cpsw_default、cpsw_sleep部分的pinmux改为RMII模式相对应的pinmux配置,如下:

cpsw_default: cpsw_default {

       pinctrl-single,pins = <

           /* Slave 1, RMII mode */

               AM33XX_IOPAD(0x914, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txen.rmii1_txen */

               AM33XX_IOPAD(0x924, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txd1.rmii1_td1 */

               AM33XX_IOPAD(0x928, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txd0.rmii1_td0 */   

               AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE1)  /* mii1_rxd1.rmii1_rd1 */

               AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE1)  /* mii1_rxd0.rmii1_rd0 */

               AM33XX_IOPAD(0x944, PIN_INPUT_PULLDOWN | MUX_MODE0)  /* RMII1_REF_CLK.rmii1_refclk*/

               AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE1)  /* MII1_RX_ER. rmii1_rxerr*/

               AM33XX_IOPAD(0x90c, PIN_INPUT_PULLDOWN | MUX_MODE1)  /* MII1_CRS. rmii1_crs_dv*/

       >;

    };

    cpsw_sleep: cpsw_sleep {

       pinctrl-single,pins = <

           /* Slave 1 reset value */

            AM33XX_IOPAD(0x914, PIN_INPUT_PULLDOWN | MUX_MODE7)

            AM33XX_IOPAD(0x924, PIN_INPUT_PULLDOWN | MUX_MODE7)

            AM33XX_IOPAD(0x928, PIN_INPUT_PULLDOWN | MUX_MODE7)

            AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE7)

            AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE7)

            AM33XX_IOPAD(0x944, PIN_INPUT_PULLDOWN | MUX_MODE7)

            AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE7)

            AM33XX_IOPAD(0x90c, PIN_INPUT_PULLDOWN | MUX_MODE7)

       >;

    };

四、网口驱动架构及流程分析

网口驱动架构见文档:基于335X的Linux网口驱动分析

4.1.网口底层驱动启动及加载过程大致如下:

1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23

--> kernel相关启动及初始化
  --> phy_init
  --> mdio_bus_init
  --> phy_driver_register
  --> davinci_mdio_probe
  --> cpsw_probe
  --> cpsw_ndo_open
  --> cpsw_slave_open
  --> phy_probe
  --> PHY_READY->PHY_UP
  --> phy_state_machine状态机函数
  --> phy_start_aneg
      --> genphy_config_aneg
          --> genphy_config_advert
          --> genphy_restart_aneg
      --> PHY_AN
  --> PHY_AN->HY_RUNNING
  --> _cpsw_adjust_link
      --> phy_print_status
          --> "Link is Up -   xxxx"
  --> PHY_RUNNING->PHY_CHANGELINK->PHY_RUNNING(循环)

4.2.网口底层驱动关键过程分析

4.2.1.phy_driver初始化

     在phy_device.c中,函数phy_init进行相关phy设备驱动的加载注册,具体过程为:

     phy_init()

     ->mdio_bus_init

     ->phy_drivers_register

phy_init函数主要完成了mdio_bus的初始化工作,注册了mdio_bus_class,注册了mdio_bus_type,其中mdio_bus_type中的mdio_bus_match成员函数规定了phy_device和phy_driver的匹配方式。

4.2.2. davinci_mdio设备及驱动

在davinci_mdio.c文件中会进行davinci_mdio_driver的注册,davinci_mdio_driver中的davinci_mdio_of_mtable有compatible字符。

在系统启动时,会进行设备树文件的解析,将设备树中的设备节点转换为设备结构体,会转换出davinci_mdio相关的设备。davinci_mdio设备及驱动都属于platform_bus。通过比较设备树文件中davinci_mdio节点的compatible属性以及davinci_mdio_driver中的davinci_mdio_of_mtable包含的compatible内容。如果匹配,就会执行davinci_mdio_probe函数。

4.2.3 davinci_mdio_probe函数分析

最主要的工作是进行mdio_bus的相关对象内容的填充及mdio_bus_class总线类型的设置。主要是完成MDIO读、写、复位函数的关联。之后通过__mdiobus_register函数中的bus->reset(bus)对CPSW的alive寄存器进行读取,其值标识这MDIO总线检测到“活着”的phy设备。再通过mdiobus_scan对检测到的phy设备进行通过phydev->bus->phy_map[phydev->addr]对其进行管理。并对其分别注册。

在注册PHY设备时,就会进行与4.2.1小节中进行注册的phy_driver进行匹配,若匹配成功,则执行phy_probe函数。注意,这里可能会检测到多个PHY,也可能会有多个PHY和多个phy_driver的匹配,最终具体使用哪个PHY及phy_driver。在cpsw_probe中连接PHY设备时才会选择,这里只是对“活着”的PHY设备进行驱动的匹配。

4.2.4 cpsw设备及驱动的匹配

与davinci_mdio设备类似,cpsw设备及驱动也是属于platform_bus,系统启动时将设备树中的设备节点转换为设备结构体,会转换出cpsw相关的设备。也是使用compatible属性和cpsw_driver进行匹配,匹配成功后就会执行cpsw_probe函数。

4.2.5 cpsw_probe函数分

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值