ARM-Linux驱动--DM9000网卡驱动分析(三)

<style type="text/css"> <!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } PRE.cjk { font-family: "AR PL UMing HK", monospace } A:link { so-language: zxx } --> </style>

硬件平台:FL2440(s3c2440)

内核版本:2.6.35

主机平台:Ubuntu11.04

内核版本:2.6.39

交叉编译器:arm-linuc-gcc4.3.2

原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/6615027

本文接上文

ARM-Linux驱动--DM9000网卡驱动分析(一)

ARM-Linux驱动--DM9000网卡驱动分析(二)

下面开始看网卡设备的打开、关闭函数和操作函数

1DM9000的打开函数

由于在函数alloc_netdev_mq()中分配net_device和网卡的私有数据是一起分配的,详见函数的实现

    所以使用函数netdev_priv()函数返回的是网卡的私有数据的地址,函数的实现如下:

    这样两者会同时生存和消失。

dm9000_open()函数


    2、网卡关闭函数



    下面是调用的dm9000_shutdown(ndev)函数,该函数的功能是复位phy,配置寄存器GPR01,关闭dm9000电源,配置寄存器IMR71disable中断,配置寄存器RCRdisable接收

函数如下:



    3、接下来了解一下数据的发送函数dm9000_start_xmit

ARM-Linux驱动--DM9000网卡驱动分析(三)

上图可以看出DM9000SRAM中地址0x00000x0BFFTXBuffer,从0x0C000x3FFFRXBuffer,包的有效数据必须提前放到TXBuffer缓冲区,使用端口命令来选择MWCMD寄存器。最后设置TXCR寄存器的bit[0]TXREQ来自动发送包。
发送包的步骤如下:

1)检查存储器宽度,通过读取ISRbit[7:6]来确定位数
2)写数据到TXSRAM
3)写传输长度到TXPLLTXPLH寄存器
4)设置TXCRbit[0]TXREQ来发送包

    上面函数调用下面的函数dm9000_send_packet来发送数据

    5、下面看一下当一个数据包发送完成后的中断处理函数dm9000_tx_done

    更多查看
    ARM-Linux驱动--DM9000网卡驱动分析(四)



你可能感兴趣的:(linux)