首页 理论教育 Linux驱动开发:DM9000A驱动程序分析

Linux驱动开发:DM9000A驱动程序分析

时间:2023-10-19 理论教育 版权反馈
【摘要】:S3C6410X没有专门的MAC控制器,通过SROM控制器访问DM9000A网卡芯片。图13-5是DM9000A与S3C6410X的电路原理。图13-5 DM9000A与S3C6410X的电路原理本节通过分析Linux内核中的DM9000A驱动程序来介绍网络设备驱动程序的基本开发流程。第一个是发送函数dm9000_start_xmit。DM9000A的TX SRAM中可以按照顺序同时存储两个发送包,分别为Ⅰ包和Ⅱ包。包发送完毕将引起中断,并调用dm9000_tx_done函数完成后处理。dm9000_rx函数的处理过程如下:至此DM9000A的收发过程介绍完毕。

Linux驱动开发:DM9000A驱动程序分析

S3C6410X没有专门的MAC控制器,通过SROM控制器访问DM9000A网卡芯片。图13-5是DM9000A与S3C6410X的电路原理。

978-7-111-56706-6-Chapter13-26.jpg

图13-5 DM9000A与S3C6410X的电路原理

本节通过分析Linux内核中的DM9000A驱动程序来介绍网络设备驱动程序的基本开发流程。首先定义并注册平台设备:

978-7-111-56706-6-Chapter13-27.jpg

在设备的检测函数dm9000_probe中主要完成网络设备初始化,并获取网络设备的平台资源信息,根据这些信息申请中断、映射存储器地址等。地址映射完毕,dm9000_probe会对DM9000的版本进行识别,并进行相应的参数设置,最后使用register_netdev函数注册DM9000网络设备驱动。dm9000_probe代码如下:

978-7-111-56706-6-Chapter13-28.jpg

978-7-111-56706-6-Chapter13-29.jpg

978-7-111-56706-6-Chapter13-30.jpg

978-7-111-56706-6-Chapter13-31.jpg

978-7-111-56706-6-Chapter13-32.jpg

978-7-111-56706-6-Chapter13-33.jpg

DM9000A的网络设备操作接口定义下:

978-7-111-56706-6-Chapter13-34.jpg

dm9000_open函数中申请了中断处理:(www.xing528.com)

if(request_irq(dev->irq,dm9000_interrupt,IRQF_SHARED,dev->name,dev))

return-EAGAIN;

这里分析两个最重要的函数。第一个是发送函数dm9000_start_xmit。发送时先将数据写入TX SRAM中,然后将包长写入TX包长度寄存器,最后将TX控制寄存器的0位设置为1,请求发送。复位后发送起始地址是00H,当前的包是Ⅰ包。DM9000A的TX SRAM中可以按照顺序同时存储两个发送包,分别为Ⅰ包和Ⅱ包。Ⅰ包发完后继续发Ⅱ包。

978-7-111-56706-6-Chapter13-35.jpg

978-7-111-56706-6-Chapter13-36.jpg

包发送完毕将引起中断,并调用dm9000_tx_done函数完成后处理。

第二个重要的函数是中断处理函数dm9000_interrupt:

978-7-111-56706-6-Chapter13-37.jpg

978-7-111-56706-6-Chapter13-38.jpg

DM9000A的接收缓冲(RX SRAM)是一个环形的数据结构。系统复位后RX SRAM的开始地址是0x0C00。每个接收到的数据包包含一个4B的包头、包数据以及CRC校验值。4B的头数据包括01h、状态、字节长度低位、字节长度高位。注意每个包的开始地址必须按照操作模式(如8位、16位、32位)对齐。dm9000_rx函数的处理过程如下:

978-7-111-56706-6-Chapter13-39.jpg

978-7-111-56706-6-Chapter13-40.jpg

978-7-111-56706-6-Chapter13-41.jpg

至此DM9000A的收发过程介绍完毕。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈