平台: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地址。
|