背景:
由于公司开发的新项目中设备需要联网,使用了MZ391的4G模块,并通过rmii接口和phy芯片ip101gr链接。
主控平台rv1108通过rmii接口和phy芯片lan8720相连接。
ip101gr和lan8720通过类似于以太网的双绞线:tx+,tx-,rx+,rx-,相连接。之所以mac和phy要分开,是因为mac属于数字电路部分,主要处理的信号是属于数字信号,将上层ip层等数据通过rmii接口发送给phy,或者将phy发送过来的数据在发送给上层等。phy属于模拟电路部分,主要处理魔力电路信号,就是将从rmii接收到的数据转换成可以通过网线传输的差分模拟信号,或者是将网线上接收到的差分模拟信号转换为可以通过rmii发送的数字信号。
硬件链接:https://blog.csdn.net/u010299133/article/details/87716700
驱动介绍(主要对比以下两个文件):
dts文件加上mac的配置
lan8720a的驱动代码:drivers/net/phy/smsc.c
ip101gr的驱动代码:drivers/net/phy/icplus.c
在内核中需要sudo make menuconfig中选择好相应的驱动,在编译的时候能够编译进入内核。
当然如果想要phy芯片能够正常工作,还必须在menuconfig中选择好mac驱动,由于以太网传输数据量大,所以在芯片的mac和我们这里介绍的phy芯片之间都需要使用到dma:
驱动的注册和注销:
在内核加载完成后,会执行相应的驱动的插入函数中的phy驱动的注册。
其中比较重要的参数:phy_driver结构体
phy_id:the result of reading the UID register of this phy type,and them with the phy_id_mask。this driver only work for phys with id which match this field
name:the friendly name of the phy type
phy_id_mask:the defines the important bits of the phy_id
features:a list of feature(speed,duplex,etc) supported by the phy
flag:A bit field defining certain other feature this phy support
struct phy_driver {
u32 phy_id;
char *name;
unsigned int phy_id_mask;
u32 features;
u32 flags;
/*
* Called to initialize the PHY,
* including after a reset
*/
int (*config_init)(struct phy_device *phydev);
/*
* Called during discovery. Used to set
* up device-specific structures, if any
*/
int (*probe)(struct phy_device *phydev);
/* PHY Power Management */
int (*suspend)(struct phy_device *phydev);
int (*resume)(struct phy_device *phydev);
/*
* Configures the advertisement and resets
* autonegotiation if phydev->autoneg is on,