没有合适的资源?快使用搜索试试~ 我知道了~
千兆网口Freescale_ETSEC_+_Marvell_88E1111_uboot_Linux_驱动分析
需积分: 4 11 下载量 6 浏览量
2014-11-25
11:21:11
上传
评论
收藏 228KB DOC 举报
温馨提示
试读
19页
千兆网口Freescale_ETSEC_+_Marvell_88E1111_uboot_Linux_驱动分析
资源推荐
资源详情
资源评论
在连续两个平台的 uboot 和 Linux 系统移植过程中,在千兆网口调试这块都
遇到了很大的麻烦。由于寄存器数量庞大,千兆网口 MAC 和 PHY 内部结构复
杂,MAC 和 PHY 接口种类多,千兆以太网驱动的调试成了系统移植过程中最
让人烦心的一个环节。就像火箭队,每次都让球迷无比揪心,不是输的窝囊,
就是伤兵满营,现在新赛季又两连败了,打的比勇士还勇士,后场两个比我还
瘦的家伙,怎么防守。算了,不扯这么多了,今天要说的是网口 MAC+PHY 的
一些原理和代码分析。(以 Freescale 的 ETSEC 和 Marvell 的 88E1111 为
例。)
1千兆以太网的物理层
千兆以太网的物理层分为物理编码子层 PCS(Physical Coding
Sublayer)、物理介质连接子层 PMA(Physical Medium Attachment)和物理
介质相关子层 PMD(Physical Medium Dependent)三层,如下图所示:
其中 PCS 子层负责 8b10b 编码,它可以把从 GMII 口接收到的 8 位并行的
数据转换成 10 位并行的数据输出。因为 10 比特的数据能有效地减小直流分量,
降低误码率,另外采用 8b10b 编码便于在数据中提取时钟和进行首发同步。可
以把 PCS 两头看成 GMII 接口和 TBI 接口。
PMA 子层进一步将 PCS 子层的编码结果向各种物理媒体传送,主要是负责
完成串并转换。PCS 层以 125M 的速率并行传送 10 位代码到 PMA 层,由 PMA
层转换为 1.25Gbps 的串行数据流进行发送,以便实际能得到 1Gbps 的千兆以
太网传送速率。可以把 PMA 子层的两头分别看做 TBI 接口和 SGMII 接口。
PMD 子层将对各种实际的物理媒体完成接口,完成真正的物理连接。由于
1000BASE-X 支持多种物理媒介,如光纤和屏蔽双绞线,它们的物理接口显然
不会相同。有的要进行光电转换,有的要完成从不平衡到平衡的转换。PMD 层
将对这些具体的连接器作出规定。
2 Freescale的 ETSEC 与 PHY 之间的接口
Freescale 的 MPC8314 和 P2020 都自带了三速以太网控制器 ETSEC,可
以提供 10M,100M,1000M 三种速率的接口。当作为以太网时,需要外部的
PHY 芯片或者 Serdes 设备与其相连接。每个 ETSEC 都支持多标准的 MII 接口,
总体结构如下图所示,可以提供 GMII,RGMII,MII,RMII,RTBI,SGMII六
种接口,下图为从 MPC8314 datasheet 中截取的 ETSEC 的结构图。
如果 CPU 与 PHY 之间是 GMII 接口或 RGMII 接口,那么 PHY 将提供完整
的 PCS,PMA,PMD 三层工作;如果 CPU 与 PHY 之间是 RTBI 接口,那么
PCS 层的工作在 ETSEC 中已经做完了,ETSEC 中的 TBI 模块可以做 PCS 层
的工作,PHY 只需要做 PMA 和 PMD 的工作即可;如果 CPU 与 PHY 之间是
SGMII 接口,那么 PHY 只需要完成 PMD 的工作,ETSEC 中的 PCS 由 TBI 完
成,而 PMA 由 CPU 自带的 Serdes 模块完成。
3 BD 表结构
在千兆以太网的驱动中,现在一般都使用一个叫 BD 表的东西来管理 MAC
层发送和接收的内存区域,如下图所示:
在 IMMR 映射的寄存器空间中有两组寄存器 TBASEn 和 RBASEn,分别为
TxBD Ringn和RxBD Ringn 的指针。MPC8314 的 ETSEC 允许有 8 个
TxBD Ring 和 8 个 RxBD Ring,他们都存放在内存的某个区域中。每个
Buer Descriptor都是有 8 个字节构成,两个字节的状态,两个字节的数据
长度和四个字节的数据指针,这个指针指向内存的另一块地方,这才是真正存
储发送接收数据的地方。Buer Descriptor 必须在网口初始化的时候初始化,
并将自己的地址赋给 TBASEn 和 RBASEn。
在网口驱动程序中可以看到,每个 BD Ring 中的 BD 数量是可变的(我们
设为 64),而他们之间并没有指针连接,只是一段连续的空间,顺序下来的,
所谓的环只是一个虚拟的概念,在最后一个 BD 时,需要将 BD 状态位中的 W
位(Wrap)置一,表示这是最后一个 BD,他的下一个 BD 就是第一个 BD。
如下图所示:
下面一节将结合 uboot 源码分析一下网口初始化以及 PHY 配置的过程,再
下一节会分析内核中的驱动。为什么先说 uboot,因为在我看来,驱动程序就是
分为两个部分,1按照 Datasheet 的说明去配置寄存器,2添加符合操作系统规
范去融入操作系统。在 uboot 下系统很简单,代码一目了然,所以我们应该在
boot 下先把寄存器配置好,再去分析复杂的多的内核代码。
这节分析 uboot 中的网口驱动代码。
1网口驱动函数列表
函数名 函数用途
tsec_initialize()
网口初始化函数
tsec_init()
网口启动函数
tsec_local_mdio_write()
MDIO 口写函数
tsec_local_mdio_read()
MDIO 口读函数
tsec_send()
网口发送函数
tsec_recv()
网口接收函数
tsec_configure_serdes(
)
配置 TBI PHY 的函数
fsl_serdes_init()
Serdes 模块初始化函数
init_phy()
PHY 初始化函数
adjust_link()
根据 PHY 状态配置 MAC 的函数
剩余18页未读,继续阅读
资源评论
baidu_23909299
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功