在ST解码器方案中,用了Marvell的PHY芯片88e3019。在SDK中并没有该芯片的驱动,只有一个88e1111的驱动。看了两天源代码,发现只要加个phy_driver结构体就行了。具体代码如下:
/* 88e3019 phy_driver */
{
.phy_id = 0x01410e20, // from datasheet page 42
.phy_id_mask = 0xfffffff0,
.name = "Marvell 88E3019", // 3019
.features = PHY_BASIC_FEATURES, // basic R/T
.flags = PHY_HAS_INTERRUPT,
//.config_init = &m88e1111_config_init,
.config_aneg = &marvell_config_aneg,
.read_status = &genphy_read_status,
.ack_interrupt = &marvell_ack_interrupt,
.config_intr = &marvell_config_intr,
.driver = {.owner = THIS_MODULE,},
}
.phy_id = 0x01410e20, // from datasheet page 42
.phy_id_mask = 0xfffffff0,
.name = "Marvell 88E3019", // 3019
.features = PHY_BASIC_FEATURES, // basic R/T
.flags = PHY_HAS_INTERRUPT,
//.config_init = &m88e1111_config_init,
.config_aneg = &marvell_config_aneg,
.read_status = &genphy_read_status,
.ack_interrupt = &marvell_ack_interrupt,
.config_intr = &marvell_config_intr,
.driver = {.owner = THIS_MODULE,},
}
这两天都在看phy芯片驱动的整体架构。 发现还是挺复杂的,关系到了好多个源代码。
几个重要的源代码介绍如下:
1. phy_device.c
查询和配置phy架构,包含了phy通用的驱动。
里面有个函数:
int genphy_config_aneg(struct phy_device *phydev)
作用:restart auto-negotiation or write BMCR
2. phy.c
读写和配置PHY设备。
有两个重要函数
int phy_read(struct phy_device *phydev, u16 regnum)
读取phy reg。
int phy_write(struct phy_device *phydev, u16 regnum, u16 val)
写phy reg。
3. driver.c
设备驱动管理中心。
4. bus.c
总线驱动管理
5. mdio_bus.c
mdio总线驱动。有个重要的结构体
struct bus_type mdio_bus_type = {
.name = "mdio_bus",
.match = mdio_bus_match,
.suspend = mdio_bus_suspend,
.resume = mdio_bus_resume,
};
.name = "mdio_bus",
.match = mdio_bus_match,
.suspend = mdio_bus_suspend,
.resume = mdio_bus_resume,
};
6. MII.h 和 MII.c
这是MII协议。里面有MII协议的PHY寄存器地址,及MII通信接口库。
marvell 88e1111驱动源代码:
marvell 88e1111驱动源代码: