基于linux-3.14.16
首先要搞清楚总线的位置,即硬件上的位置
如上图,mdio总线是mac和phy之间的连接方式,主要用于配置配置phy的寄存器,所以phy应该是器的一类物理设备,mdio总线驱动和总线设备都是围绕phy工作的。
一、总线注册
常规操作,定义一个bus_type调用bus_register接口注册一个总线。
二、mido总线设备
1、platform总线
设备树有节点fec
2、平台总线probe
fec_enet_mii_init即将会添加一个mdio总线设备
分配一个mii_bus,这个mii_bus内部有一个device,实际是一个mido总线设备(????)。
1)注册mii_bus
初始化mii_bus
最后注册mii_bus,我们看看是怎么注册的
扫描phy,每次添加新的mii_bus都会去扫描mido总线,如果有读到phy id,就会创建一个phy_device并注册。
这里是根据phy_mask的标记去决定要不要遍历,应该是有添加了就不会去扫描这个地址了。
看看是怎么扫描的,mdiobus_scan
2)创建并注册phy_device
看看mdiobus_scan的工作
总的来说,是扫描硬件,发现mido总线上有phy就创建一个phy_device,然后作为mido总线设备注册。
看看get_phy_device干了什么
get_phy_id会在mdio总线上发命令去读phy id,是硬件操作
有phy硬件就会创建phy_device
看看是怎么创建phy_device的,phy_device_create
这里看到,原来phy_device才是作为mdio的总线设备。
phy_device_register注册
硬件初始化
device_add就是注册设备的底层操作,Linux设备驱动模型(二)有说明
至此就是mdio总线设备的添加过程。
三、mido总线驱动
就是phy_driver
一般是具体phy芯片生产商提供
下面作简要分析
这是个数组,这里只截图了一个
匹配后会执行,应该会执行驱动的probe,但这里没有给probe,发现是注册驱动的时候给了默认的,不用驱动自己实现
1、phy_drivers_register
这里看出是mdio的总线驱动了,并紫萼初始化了驱动的probe
2、phy_probe
好像没干什么,跳过
至此mido总线的注册,mdio总线设备,mdio总线驱动的添加都分析完了。
关于这个mii_bus,还是没有分析清楚了,现在可以知道的是,phy驱动在需要操作寄存器的时候,会使用mii_bus的一些回调函数,
真正操作硬件的是mii_bus。
还有一点,mdio_bus_type的probe哪去了???
没有的话,也会直接执行驱动的probe了
四、mdio设备怎么被操作
待续…