基于335X平台的UBOOT中交换芯片驱动移植
一、软硬件平台资料
1、开发板:创龙AM3359核心板,网口采用RMII形式。
2、UBOOT版本:U-Boot-2016.05,采用FDT和DM。
3、交换芯片MARVELL的88E6321.
4、参考文章:本博客基于335X的UBOOT网口驱动分析。
二、移植主要步骤
1、准备工作:
(1)、必须熟悉U-Boot-2016.05中的网口驱动构架,熟悉其中各个网口设备结构体的意义,网口初始化流程。重点详细分析常规基于phydev的驱动初始化的过程。大多数switch的访问和PHY类似,但是寄存器功能较PHY更为复杂,也是两类设备,我们这里只是基于UBOOT中原有MII-PHY的方式,基于现有PHY架构的驱动模型,添加SW的相关驱动.
(2)、熟悉switch的相关内容,参见相关datasheet,主要熟悉寄存器的寻址方式。
2、主要需要实现的步骤:
(1)、在 /driver/net/phy/目录下,添加mv88e6321.c和mv88e6321.h文件,构造一个类PHY的SW设备,及所需所有驱动接口。
(2)/driver/net/phy/目录下,修改Makefile,增加obj-$(CONFIG_MV88E6321_SWITCH) += mv88e6321.o
(3)、在 /driver/net/phy/目录下的phy.c文件中的create_phy_by_mask函数中添加相关内容。实现查询到相关SW驱动及设备的功能。
三、具体代码分析
3.1.新建文件
根据/driver/net/phy/目录下的mv88e61xx以及mv88e6352的相关内容,建立我们需要的mv88e6321.c和mv88e6321.h文件。
3.2 mv88e6321.h文件内容
3.2.1.寄存器定义
主要为相关PORT寄存器,PHY寄存器,以及PORT寄存器中的状态寄存器中的MODE定义。主要定义如下:
#define MV88E6321_CPU_PORT 0x12
#define MV88E6321_PHY_TIMEOUT 100000
/* port dev-addr (= port + 0x10) */
#define MV88E6321_PRT_OFST 0x10
/* port registers */
#define MV88E6321_Port_Status_REG 0x0
#define MV88E6321_Physical_Control_REG 0x1
#define MV88E6321_Jamming_Control_REG 0x2
#define MV88E6321_Product_Identifier_REG 0x3
#define MV88E6321_Port_Control_REG 0x4
#define MV88E6321_Port_Control_1_REG 0x5
#define MV88E6321_Port_Based_VLAN_REG 0x6
#define MV88E6321_Port_VLAN_ID_REG 0x7
#define MV88E6321_LED_Control_REG 0x16
#define MV88E6321_internal_phy3_addr 0x03
#define MV88E6321_internal_phy4_addr 0x04
#define MV88E6321_internal_serdes0_addr 0x0c
#define MV88E6321_internal_serdes1_addr 0x0d
#define MV88E6321_internal_phyid1_REG 0x02
#define MV88E6321_internal_phyid2_REG 0x03
/* global 1 registers dev-addr */
#define MV88E6321_GLBREG_DEVADR 0x1B
/*