uboot 网络驱动模型
原文:https://blog.csdn.net/zhouxinlin2009/article/details/45390065
UBOOT的PHYCHIP配置
PHYCHIP的配置位于 include/configs/XXX_config.h中
#define CONFIG_YYY_ETH
#define CONFIG_YYY_ETH_SPI_BUS 0
#define CONFIG_YYY_ETH_SPI_CS 0
代码流程
Uboot下PHYCHIP的驱动代码由一些函数构成,这些函数包含在文件PHYCHIP.c中,位于drivers/net/目录下,具体包含的函数以及含义如下:
eth_init()
eth_send() //链路层数据包发送
eth_rx() //链路层数据包接收
eth_halt()
encReceiverReset()
encReceiverResetCallbask()
encPoll()
encRx()
encInit()
encPhyRead()
encPhyWrite()
PHYCHIP编程
要对PHYCHIP进行编程,首先要熟悉PHYCHIP内部寄存器的功能及配置。
PHYCHIP内部寄存器
PHYCHIP有三种类别的静态RAM,控制寄存器(Control Register)、网络缓存(Ethernet Buffer)、PHY寄存器(PHY Register)。
Ethernet Buffer共8K字节,分为独立的发送缓存和接收缓存,发送和接收缓存的位置和大小可以完全由host通过spi接口控制。DMA通道课直接读写Ethernet Buffer。
PHY Register提供PHY模块的控制和配置以及PHY模块的操作状态,PHY Register共有32个寄存器,只有9个是可操作的。不像ETH、MAC、MII控制寄存器或者Buffer缓存,PHY Register不是通过SPI接口直接访问的,而是通过MII寄存器MIREGADR访问。
读取PHY寄存器的步骤:
1、写想读取的PHY寄存器地址到MIREGADR寄存器
2、设置MICMD.MIIRD bit
3、等待10.24uS,轮训poll MISTAT.BUSY bit来确认操作已经完成,若busy不能启动任何MIISCAN操作或写MIWRH寄存器。当MAC获取到了寄存器内容,BUSY bit自动清空
4、清空MICMD.MIIRD bit
5、从MIRDL和MIRDH寄存器读取想要读取的数据。
写PHY寄存器的步骤:
1、写想修改的PHY寄存器地址到MIREGADR寄存器
2、写低8位数据到MIWRL
3、写高8位数据到MIWRH,MISTAT.BUSY bit被置位,需等待10.24uS。
scan PHY寄存器的步骤:
1、写想修改的PHY寄存器地址到MIREGADR寄存器
2、设置MICMD.MIISCAN bit,scan操作开始了,MISTAT.BUSY bit被置位,第一个读取操作在10.24uS之后完成,然后会以相同的间隔执行连续的操作,直到操作被取消,MISTAT.NVALID bit会被轮训poll来决定何时第一个操作完成。
3、设置了MIISCAN之后,MIRDL和MIRDH会每10.24uS自动更新。
MII控制寄存器有:MICON、MICMD、MISTAT。
PHYCHIP的命令格式
PHYCHIP的工作方式完全依赖于host通过spi接口送过来的命令。通过这些命令进入PHYCHIP的控制内存(control memory)和(ethernet buffer空间)。
命令格式如下:
3bit操作码+5bit参数(指定寄存器地址或数据常量)[+数据]
本PHYCHIP共使用7个命令:
RCR(读取PHY的控制寄存器)、RBM(读取PHY的缓存空间)、WCR(写PHY的控制寄存器)、WBM(写PHY的缓存空间)、BFS(Bit域设置)、BFC(Bit域清空)、SC(软件复位)
1、RCR命令
RCR命令允许host以任意顺序读取ETH、MAC和MII寄存器,其中PHY寄存器的读取通过一个特殊的MII寄存器接口。
2、RBM命令
RBM命令允许host从8K字节的接收缓存读取字节。
3、WCR命令
RCR命令允许host以任意顺序修改ETH、MAC和MII寄存器
4、WBM命令
WBM命令允许host向8K字节的发送缓存写入数据。
5、BFS命令
6、BFC命令
7、SC系统命令
以太网概观
Ethernet Packet Format:目的MAC、源MAC、类型/长度域、数据负载、可选的PAD域、CRC。
PHYCHIP初始化步骤
1、初始化接收缓存
2、初始化发送缓存
3、收包滤波器
4、等待复位完成
5、MAC初始化配置(MACON2.MARST清空使MAC脱离复位状态,MACON1.MARXEN置1使能MAC接收frame,配置MACON3.PADCFG/TXCRCEN/FRMLNEN/FULDPX、MACON4使用默认、MAMXFL限制最大fram长度、MABBIPG背to背、MAIPGL非背to背、MAADR0:MAADR5配置本地MAC地址)
6、PHY初始化配置(根据应用必须配置三个PHY寄存器,PHCON1.PDPXMD控制设备的半双工/全双工,PHCON1.PDPXMD与MACON3.FULDPX必须匹配,PHCON2.HDLDIS用来阻止半双工时原子的自环,PHLCON用于配置输出的LEDA和LEDB)
发送和接收数据包
发送数据包:
PHYCHIP的MAC会自动产生帧头,另外若配置了MAC可以产生PAD和CRC。
host必须产生和写入其他的frame域到buffer。
PHYCHIP需要一个单独的每个数据包的控制byte,防止packet之前。
发送packet步骤:
1、适当编程ETXST指针指向内存中一个不用的区域;
2、使用WBM命令写每个packet的控制byte、目的MAC、源MAC、Type/Len、数据负载;
3、适当编程EXTND指针;
4、清除EIR.TXIF、EIE.TXIE,设置EIE.INTIE来使能一个中断;
5、设置ECON1.TXRTS开始传输。
若DMA正在执行,则等待DMA完成之后再开启发送;
发送完成之后,ECON1.TXRTS清空,7个字节的发送状态矢量被填写到相应位置,ETXST、ETXND被修改。
要检查发送是否正常完成,ESTAT.TXABRT能显示。
接收数据包:
使能收包
假定接收缓冲已经初始化、MAC被正确配置、接收滤波器已经配置,要接收网络数据包,host需要:
1、如果接收到数据包时需要产生一个中断,设置EIE.PKTIE和EIE.INTIE;
2、如果在接收缓冲满时丢弃数据包时需要产生一个中断,清除EIR.RXERIF,设置EIE.RXERIE、EIE.INTIE。
3、设置ECON1.RXEN来使能接收。
为了阻止不需要的数据包,建议在修改接收滤波器配置ERXFCON和MAC地址之前,将RXEN清空。
接收使能之后,未被滤掉的数据包会被写入到唤醒接收缓冲区,EPKTCNT会增加,EIR.PKTIF被设置,产生一个中断,硬件写指针ERXWRPT会自动增加。
读取接收的数据包
利用RBM命令
释放接收缓存
当出现异常时,采用Next Packet Pointer
获取接收缓存的剩余空间
下表列出了PHYCHIP内部重要寄存器的功能及偏移地址。
ECON 网络控制寄存器
ESTAT 网络状态寄存器
发送控制寄存器
发送状态寄存器
MAC地址寄存器(共6个)
制造商ID号
产品ID号
内部SRAM数据读指令,内部地址不增加
内部SRAM数据读指令,内部地址增加
发送数据包长度低字节寄存器
发送数据包长度高字节寄存器
uboot 网络驱动模型的更多相关文章
- uboot的驱动模型理解
uboot的驱动模型,简称dm, 具体细节建议参考./doc/driver-model/README.txt 关于dm的三个概念: uclass:一组同类型的devices,uclass为同一个gro ...
- u-boot器件驱动模型(Device&Drivers)之uclass (转)
一.剧情回顾 在上一篇链接器的秘密里面我们讲到我们用一些特殊的宏让链接器帮我们把一些初始化好的结构体列好队并安排在程序的某一个段里面,这里我例举出了三个和我们主题相关段的分布情况,它们大概如下图所示: ...
- [uboot] (番外篇)uboot 驱动模型(转)重要
[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...
- Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)
catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...
- Linux网络设备驱动(一) _驱动模型
Linux素来以其强大的网络功能著名,同时, 网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对网络设备贯彻其"一切皆 ...
- Linux网络设备驱动 _驱动模型
Linux素来以其强大的网络功能著名,同时, 网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对网络设备贯彻其"一切皆 ...
- u-boot下的DM驱动模型 阶梯状 (转)
U-boot 下DM驱动模型的相关笔记要注意的关键两点: DM驱动模型的一般流程bind->ofdata_to_platdata(可选)->probe 启动,bind操作时单独完成的 ...
- Xilinx Uboot网卡驱动分析
1.MAC控制器.网卡.PHY.MDIO.mii.gmii.rgmii概念扫盲 网卡在功能上包含OSI模型的两个层,数据链路层和物理层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准 ...
- 【tornado】系列项目(一)之基于领域驱动模型架构设计的京东用户管理后台
本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”. 一.预备知识: 1.接口: python中并没有类似java等其它语言中的接口类型,但是python中 ...
随机推荐
- Linux 虚拟串口及 Qt 串口通信实例
Linux 虚拟串口及 Qt 串口通信实例 2011-06-22 17:49 佚名 互联网 字号:T | T Linux 虚拟串口及 Qt 串口通信实例是本文所要介绍的内容,在实现过程中,打开了两个伪 ...
- PDB、PD、PMP、RTB哪个更好?为品牌主解锁程序化购买的选择技巧
PDB.PD.PMP.RTB哪个更好?为品牌主解锁程序化购买的选择技巧 https://baijiahao.baidu.com/s?id=1620277114893208111&wfr=spi ...
- pip或easy_install安装库报错:SSL: CERTIFICATE_VERIFY_FAILED
使用pip和easy_install安装那个lxml.pyspider这些库或者框架一直提示以下错误: Collecting pyspider Could not fetch URL https:// ...
- LoadRunner-迭代和并发设置
迭代:指运行一次脚本时某段代码块(action)循环执行的次数,串行执行 并发:指同时运行脚本的次数,并行执行(多个用户同时跑) 以下是用例和对应的相关设置 Iterations是在Vuser Gen ...
- js_加入收藏夹功能
<script type="text/javascript">function addToFavorite(obj) { var url = "http ...
- PHP移动互联网开发笔记(6)——MySQL数据库基础回想
近期看了一些架构方面的资料.可是发现基础知识都不怎么坚固,接下来的一段时间.我会定期总结基础知识. 一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 很小的整 ...
- Linux发展历史图
Linux发展历史图 http://futurist.se/gldt/wp-content/uploads/12.10/gldt1210.svg
- Mysql中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
看看Left Join 与Right Join 与 Inner Join 与 Full Join对表进行操作后得到的结果. 在数据库中新建两张表,并插入要测试的数据. 新建表: USE [Test] ...
- Java-mybatis-一次执行多条SQL语句
mysql数据库 1.修改数据库连接参数加上allowMultiQueries=true,如: hikariConfig.security.jdbcUrl=jdbc:mysql://xx.xx.xx: ...
- mysql外键使用和事物使用
mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...