十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要介绍了树莓派4有线网卡驱动调试的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
成都创新互联2013年开创至今,先为梅县等服务建站,梅县等地企业,进行企业商务咨询服务。为梅县企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
从树莓派底层玩家的角度上来看,树莓派4算的上一款比较好的开发板。在树莓派4之前,有线网卡的驱动都是接在USB设备上,也就是说之前的树莓派都是必须启用了USB协议,然后再开启网卡,这样网速的差别以及网络处理效率上的差别也就不敢恭维了。博通bcm的网卡芯片还是不错的,这次为树莓派4适配和千兆以太网口,配上树莓派4的a72的4核的芯片,真的算是非常的良心的开发板了。学习网络编程,除了熟悉各种TCP,UDP的协议之外,如果能够了解底层驱动的工作原理,那也算是锦上添花的事情。本文主要针对树莓派4有线网卡的驱动模型,以及数据收发的方式,进行梳理总结,同时学习一些比较好的网卡设计模式。
对于树莓派4的有线网卡来说,网上的资料相当的匮乏,我只能通过零星的碎片化的资料去推测树莓派网卡的行为,结合uboot与Linux的代码,将其适配到rt-thread的lwip协议栈上,完成树莓派的联网功能。相关的代码可以参考
https://github.com/RT-Thread/rt-thread/blob/master/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c
树莓派4搭载的是Broadcom GENETv5
也就是博通第五代的genet,具体来说适配的是Broadcom® BCM54213PE单端口GRMII千兆以太网收发器,具体的芯片手册可以通过下面的地址进行下载
https://gitee.com/bigmagic/raspi_sd_fw/blob/master/doc/raspi4/BCM54213PE_datasheet.PDF
这是一款三速1000BASE-T / 100BASE-TX / 10BASE-T千兆以太网(GbE)收发器,集成在单个CMOS芯片中。BCM54213PE是一款高度集成的解决方案,集成了数字自适应均衡器,ADC,锁相环,线路驱动器,编码器,解码器,回声消除器,串扰消除器以及所有必需的支持电路。BCM54213PE基于Broadcom公认的数字信号处理器技术,完全符合RGMII标准,可与行业标准的以太网MAC和交换机控制器兼容。
在写任何代码实现的时候都应该有设计,设计的好坏直接决定最后成型的效果。而调试驱动也不要走一步看一步,应该用高屋建瓴的思维去看待问题的解决办法,先做什么,后做什么,两者之间的关联是什么,复杂模块的调试往往涉及到几个器件的耦合,而这些耦合的特性往往就是驱动调试的线索。和玩游戏一样,顺着一个一个的线索,终将解决驱动的通路。
而调试网卡驱动的时候,也必须注意两个东西一个是串行管理数据总线接口(MDIO),另外就是芯片与网卡的控制器寄存器。
MDIO接口是两根数据线,MDC和MDIO,通过这两根线,微控制器可以访问物理层芯片中介绍的寄存器组,这些寄存器组则决定了物理层的连接的相关信息,比如查询到的网口的速率,网口的状态等等。
第二个就是和芯片直接相关的数据处理寄存器,例如DMA控制,中断控制等等。
要想调通网卡数据,上面两点都是需要理解和掌握的。
在调试过程中,我发现网络网口是由路由器网络网口速度匹配的,所以需要由MDIO进行通信,查询网卡芯片的状态,从而判断当前连接的路由器是千兆网卡还是百兆网卡。如果不进行判断,那如果速率不匹配是无法进行上层数据通信的。
另外就是上电之后,有线以太网数据收发器内部是有收发计数的,而这个计数z值会与我后面的DMA链表直接关联,所以每次初始化之后,都需要清除计数,这个需要一点时间,需要延时一下,最好做个判断,直到清空为止。
上面是两个关键的细节,其他的流程倒也没什么特别需要注意的。接着就需要理解DMA数据链表的结构了。
在树莓派4上,管理网络数据收发是由DMA链表组成的结构体。每个收发链表共有256个DMA描述符,每个描述符分别记录着
1.高位地址(64位地址的高32位)
2.低位地址(64位地址的低32位)
3.接收的最大长度信息
关于接收的顺序,如果之前没有接受到任何数据,当一帧网络数据包到来时,DMA链表会从0偏移处的DMA链表开始取数据,然后将接收到的数据放到DMA描述符申明的地址处。
需要注意的是,对于接收的DMA描述符,每个描述符指向的应该都是一段非cache区的地址,因为往往cache的使用会引起内存一致性的问题,而通过cache数据的写回也可以解决这个问题。我们在分配内存的时候,可以分配一整段的空间,比如由256个描述符,假设每个接收包的最大长度为2K,则需要分配512K的连续的内存空间来进行数据的接收,每当一个包过来后,指针会自动指向下个dma描述符,这个是由硬件完成,与软件无关。另外一个指针则是判断当前读到了哪个dma描述符,随着数据量的不断累积,数据会一直存在下个描述符中,并不会由于处理速度跟不上而导致丢包情况的发生。
这种设计是很好的,避免了网络数据多而快导致的丢包问题的产生,同时通过指针的偏移又大大简化数据读出的模型。
而数据的发送则不用设计的如此复杂,当然硬件上也是有着这个描述符的,对于简单的应用,直接用一个描述符去填充需要发送的数据即可,交给DMA,然后等待发送中断的到来。
树莓派4上有着标准的GIC,对于中断的处理更加的通用化。
查询其数据手册,可以看到中断号为29,这里只是一个外设中断号而已,还要经过GIC的分发,所以按照GIC的路由规则
最后可以算出其中断号为160+29,有了这个中断号,然后配置bcm2711的有线以太网中断控制器,打开DMA接收完成和发送完成中断就可以产生相关的中断了。
感谢你能够认真阅读完这篇文章,希望小编分享的“树莓派4有线网卡驱动调试的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!