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

来源:互联网 发布:怎么查询淘宝客订单 编辑:程序博客网 时间:2024/06/07 01:51


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






原创粉丝点击