一. 简介
前面文章了解到,Linux内核是有提供 PHY通用驱动的。
本文来简单了解一下ALPHA开发板上的 PHY网络芯片LAN8720的驱动。是 LAN8720芯片的公司提供的 PHY驱动。
二. ALPHA开发板上的PHY芯片驱动:LAN8720驱动
-> Device Drivers -> Network device support -> PHY Device support and infrastructure -> Drivers for SMSC PHYs
永久保存新配置:选中 "Drivers for SMSC PHYs"选项后,再选中上面Linux内核配置界面上的 "<Save>" 选项,可以保存到我创建自己开发板的内核配置文件 imx_v7_alientek_nand_defconfig文件中(之前移植实验):
上面输入 配置文件的路径,选中"OK" 选项即可实现永久保存新配置。可以通过查看 配置文件 imx_v7_alientek_nand_defconfig文件内容确认。
2. LAN8720驱动
static struct phy_driver smsc_phy_driver[] = {
{.phy_id = 0x0007c0a0, /* OUI=0x00800f, Model#=0x0a */.phy_id_mask = 0xfffffff0,.name = "SMSC LAN83C185",
....................
}, {.phy_id = 0x0007c0b0, /* OUI=0x00800f, Model#=0x0b */.phy_id_mask = 0xfffffff0,.name = "SMSC LAN8187",
....................
}, {.phy_id = 0x0007c0c0, /* OUI=0x00800f, Model#=0x0c */.phy_id_mask = 0xfffffff0,.name = "SMSC LAN8700",
....................
}, {.phy_id = 0x0007c0d0, /* OUI=0x00800f, Model#=0x0d */.phy_id_mask = 0xfffffff0,.name = "SMSC LAN911x Internal PHY",
....................
}, {.phy_id = 0x0007c0f0, /* OUI=0x00800f, Model#=0x0f */.phy_id_mask = 0xfffffff0,.name = "SMSC LAN8710/LAN8720",.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause| SUPPORTED_Asym_Pause),.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,/* basic functions */.config_aneg = genphy_config_aneg,.read_status = lan87xx_read_status,.config_init = smsc_phy_config_init,.soft_reset = smsc_phy_reset,/* IRQ related */.ack_interrupt = smsc_phy_ack_interrupt,.config_intr = smsc_phy_config_intr,.suspend = genphy_suspend,.resume = genphy_resume,.driver = { .owner = THIS_MODULE, }
} };module_phy_driver(smsc_phy_driver);
第 23 行,PHY ID 为 0X0007C0F0。
第 24 行,PHY 的 ID 掩码为 0XFFFFFFF0,也就是前 28 位有效,在进行匹配的时候只需要比较前 28 位,第 4 位不用比较。
第 25 行,驱动名字为“SMSC LAN8710/LAN8720”,系统启动以后,打开网卡就会提示当前 PHY 驱动名字为“SMSC LAN8710/LAN8720”。
第 47 行,使用 module_phy_driver(本质是一个宏)来完成 smsc_phy_driver 的注册。
此驱动里面的成员函数有一些是 SMSC 自己编写的,有一些是直接用的通用 PHY 驱动的, 比如,第 32 行的 genphy_config_aneg、第 41 行的 genphy_suspend 等。
关于ALPHA开发板上的 PHY网络芯片LAN8720的驱动,简单 了解到这里。