专题8-网卡搭建新通道
一.网络模型
1.OSI(开放式系统互联模型)
从上往下依次是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
2.Linux四层模型:从上往下依次是应用层,传输层,IP层,网络接口层。基于TCP/IP协议栈的模型。
二.DM9000物理结构
1.原理图
工作实质就是MAC通过MII控制PHY的过程。
2.网卡和网络模型的映射关系
MAC对应的是数据链路层,PHY对应的是物理层
3.MAC的工作原理
当网络协议栈的IP包送到网卡的时候,先要到达MAC,MAC就根据数据链路层的协议对接收到的数据进行封装,将IP包封装成以太网包,完成数据帧的构建。当然它还具备数据纠错以及传送控制等功能。
4.关于PHY
PHY是物理接口收发器。主要和实际的传输硬件打交道。他接收到来自MAC的以太网包,先加上校检码。然后按照物理层的规则进行数据编码,然后传输到物理介质,接受过程则与之相反。
5.MII即媒体独立接口。表明在MAC一定情况下,更换PHY是不会影响系统的工作的。因为他们最后都要遵循MII接口。故MII起到了MAC和PHY之间通信的桥梁作用。
三.DM9000的编程接口
1.DM9000的接口不是绝对开放的,不能像访问nand控制器那样直接按照地址去访问相关寄存器。
2.但是他提供了两个可以供CPU访问的接口,一个是index另一个是数据端口。
3.index的地址在mini2440上是0x20000300.原因是
(1)mini2440的原理图中
dm9000的片选信号AEN就是接到nLAN_CS片选。再看CPU原理图
我们可以看到nLAN_CS实质接在nGCS4上。再看datasheet
可以看到nGCS4对应的片选信号是0x20000000开头的,在0x20000000-0x28000000之间。所以index的地址开头是0x2********。即片选地址
(2)再看DM9000的datasheet
再看DM9000的TXD【2:0】的引脚接线情况
发现都是0,所以I/O base的地址是300H。即相对片选地址的位置。(相对地址,片选地址相当于基地址)。
(3)不管是index端口还是数据端口都是用SD0-SD15来传递数据。所以要区分具体某一时刻,这些数据到底是给那一个接口用。于是利用CMD引脚来区别。当CMD引脚是高电平的时候,SD上的数据是给数据接口用的,当CMD是低电平的时候,是给index接口用的。index接口是用来传递偏移量的。可以看到CMD接到CPU的ADDR2,当他为1的时候,就是为数据接口传送数据,即地址是0x20000304.当ADDR2为0的时候,SD是为index接口传送偏移量,即ADDR2为0,即地址是0x20000300.故我们找到了,片选地址,I/O base地址,以及数据接口地址。
四.DM9000初始化
1.片选信息设置
(1)数据宽度(BWSCON)
(2)时序信号填写(BANKCON4)
2.中断初始化
(1)从原理图找到DM9000使用的中断源
(2)配置相应的中断引脚
(3)设置中断触发方式(高电平,EXTINT0)
(4)使能中断,设置中断屏蔽寄存器(INTMSK,EINTMSK)
(5)清除中断标志(SRCPND,INTPND,EINTPND)
3.复位设备
(1)实现往DM9000读写数据的函数
(2)设置I/O为输出模式
(3)通过对GPIO0写0为内部的PHY提供电源
(4)软件复位(自动清0),MAC内部回环模式
(5)对(4)中的寄存器全部写入0
(6)重复(4)(5)
4.捕获网卡
(1)读取厂家ID
(2)读取product的ID
(3)将两个ID组合与之前预定义的网卡ID进行对比
5.MAC初始化
参照u-boot设置MAC
6.填充MAC地址
利用循环分别填写六个寄存器,对应MAC地址的6个段
7.激活DM9000
参照u-boot设置相关寄存器即可。
8.初始化代码
五.发送函数(有两个参数,待发送数据和发送长度)
1.禁止中断,避免干扰
(1)DM9000的IMR寄存器。
2.写入发送数据的长度
将长度分两次写入寄存器
3.写入待发送的数据
(1)将MWCMD赋值给地址端口,做好准备,MWCMD会自动将数据送到TX SRAM中。
(2)利用循环,将数据写入数据端口
4.启动发送
往TCR寄存器中写入命令,请求开始发送
5.等待发送结束
当发送结束的时候,TCR的0位会自动清0,所以去等待他变0即可。
6.判断发送结果是否正确,清除发送状态
往NSR寄存器中写入0x2C即可
7.打开中断,等待接收数据
将IMR的中断打开即可。(设置最后一位为1即可)
六.接收函数
接收是中断处理的,接收到一个包就会产生中断。在中断处理的时候调用接收函数。
1.判断是否产生中断,是就继续,否则退出接收函数
读取ISR寄存器第0位即可。
2.清除中断
ISR寄存器第0位写1即可。
3.空读
读取MRCMDX寄存器
4.读取包的状态和长度
读取MRCMD寄存器得到状态,此时地址端口的数据就是对应MRCMD的偏移量,所以可以直接读取此时数据寄存器的值,不用再重新指定偏移量,就可以得到长度。在长度后面会自动送入有效的数据,所以后面可以页直接读数据寄存器得到有效数据。
5.读取包的数据
在读取数据之前应该对读到的长度进行检查,看是否小于以太网包的最大长度。然后利用for循环读取数据,注意数据的组合方式。
七.中断处理函数
1.调用接收函数存放接收到的数据
2.清除中断标志(SRCPND,INTPND,EINTPND)。
3.中断文件的关键代码
3.关于ARP函数的实现请看下文
八.ARP协议实现
1.以太网通讯格式
在计算机网络中,根据不同层的协议对要传输的数据进行封装,最重要实现的协议通常是以太网协议,即数据链路层协议。以太网包格式。
2.ARP功能简介
在计算机网络中,MAC地址是物理层的地址,是计算机唯一的身份标识。两台计算机要实现通信,必须知道彼此的MAC地址,但是一般情况用户只知道目标机的IP地址,这个时候,就可以用ARP(地址解析协议)来向局域网中的所有计算机发送ARP请求包,当然这个请求包有目标机的IP地址,符合条件的目标机接收到请求包以后,会作出应答,不符合条件的忽略该请求包。在应答包中目标机会将自己的MAC地址反馈给用户。所以ARP是一种通过IP地址获取MAC地址的协议。
3.ARP包格式
4.代码实现
(1)发送ARP请求包
--》构造请求包
--》ARP帧类型是0806
--》当未知MAC地址的时候,设置为全F
--》硬件类型是指硬件地址对应的类型,即以太网类型,编号为1
--》协议类型是指协议地址对应的类型,在这里协议地址是IP地址,IP类型的编号是0800
--》硬件地址长度即以太网地址长度,6个字节
--》协议地址长度即Ip地址长度4个字节
--》op为1表示请求,为0表示应答
--》发送端以太网地址就是以太网源地址,事先制定的,6个字节
--》发送端Ip地址是事先制定的,4个字节,注意:要和PC在同一网段
--》目的以太网地址,暂时不填,要获取的就是该数据
--》目的Ip地址就是PC的Ip实际地址。
--》调用DM9000发送函数发送包
--》可以讲上述构建的ARp请求包的地址赋值给u8 的指针,让该数组指向该请求包
--》然后发送长度为:(以太网)14 + (ARP真正请求部分)28.
--》头文件对数据结构进行创建
那些extern变量在dm9000.c里定义,根据自己PC的IP来决定host_ip_addr
[img]https://app.yinxiang.com/shard/s38/res/4e062e5d-7eff-4632-9470-6597d79287c8.png?resizeSmall&width=1553[/img]
(2)在网络中默认主机是大端格式的,涉及到网络字节序。所以在发送端存储数据的时候要按照大端格式存储。所以整个包都要征对象的修改,地址可以不用改,但是数据要改。只针对由两个字节构成的数据,一个字节长度的不用改。涉及到地址都会用到memcpy函数。
[img]https://app.yinxiang.com/shard/s38/res/62c51be5-9fcd-4a2d-826c-376263a93865.png?resizeSmall&width=1553[/img]
(3)解析ARP应答包,提取目标机MAC地址。
--》返回类型为u8
--》打印信息时候注意格式控制
[img]https://app.yinxiang.com/shard/s38/res/aeca6a94-3440-4f66-97c1-fe648aec6629.png?resizeSmall&width=1553[/img]
(4)抓包效果
--》我的PC的参数
[img]https://app.yinxiang.com/shard/s38/res/77690ae6-f4fd-4df6-841e-857338f57d6e.png?resizeSmall&width=1553[/img]
--》Wireshark的效果
[img]https://app.yinxiang.com/shard/s38/res/f918cd73-a385-4ea6-906f-3016b04dbb20.png?resizeSmall&width=1553[/img]
表明发送请求成功
--》看串口输出信息
[img]https://app.yinxiang.com/shard/s38/res/66edd583-193c-45e9-86d4-13dfb412955e.png?resizeSmall&width=1553[/img]
表明解析成功。所以网卡驱动以及ARP协议都实现了。
注意:抓包的时候,必须让PC和开发板连接到用一个路由器。而且这个路由器最好不要联通外网,否则抓包效果不明显,因为很可能一旦接通外网,有很多计算机和你会在同一网段,你会接受到来自其他计算机的广播,不一定是ARP广播。

浙公网安备 33010602011771号