分析网卡通过i2c总线从e2prom中读取mac地址过程

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:15   1262   0


平台:loongson3A系列CPU+loongson2H桥片的开发板.

每个网卡都有一个独一无二的mac地址,一般这个地址就存放在一个e2prom中,这里就是分析一个网卡初始化过程中,怎么从这个e2prom中读取mac地址。

首先这里的e2prom和cpu的i2c控制器相连接,也就是说最后访问这个设备时,使用的是i2c总线的驱动。
i2c总线的时序这里就不介绍了,大家可以看一个i2c设备的手册,其中时序部分讲解的就很详细了。

源码在龙芯开源社区:http://www.loongnix.org/cgit。

网卡的源码:drivers/net/ethernet/stmicro/stmmac
stmmac_open->stmmac_check_ether_addr->stmmac_eep_get_mac_addr->i2c_transfer


这里是网卡初始化过程中函数调用关系,在最后去取mac地址时调用到函数i2c_transfer,这就是i2c驱动中的代码,下面看这个函数的调用关系:

i2c驱动源码:drivers/i2c/busses/i2c-ls2h.c

i2c_transfer-->__i2c_transfer-->adap->algo->master_xfer-->ls2h_i2c_xfer-->ls2h_i2c_doxfer-->ls2h_i2c_start-->ls2h_i2c_read

这里说明一下,adap->algo->master_xfer是一个函数指针,这是在i2c驱动的probe函数初始化的。

ls2h_i2c_probe
{
 ...
 adap->algo = &ls2h_i2c_algo;
 ...
}

static const struct i2c_algorithm ls2h_i2c_algo = {
 .master_xfer = ls2h_i2c_xfer,
 .functionality = ls2h_i2c_func,
};

最后一部分函数的调用
ls2h_i2c_doxfer-->ls2h_i2c_start-->ls2h_i2c_read
其实就是模拟i2c时序来和设备进行通信,最后读取出来设备中存储的mac地址。






分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP