zoukankan      html  css  js  c++  java
  • [国嵌攻略][136][DM9000网卡驱动深度分析]

    网卡初始化

    1.分配描述结构,alloc_etherdev

    2.获取平台资源,platform_get_resource

    2.1.在s3c_dm9k_resource中有相关的资源

    2.2.add地址由CS4和ADD2决定,是20000000

    2.3.dat地址由CS4和ADD2决定,是20000004

    2.4.中断资源是EINT7

    3.虚拟地址映射,ioremap

    4.读取芯片类型

    5.设置操作函数集

    6.读取MAC地址

    7.注册网卡驱动,register_netdev

    8.启动发送队列,netif_start_queue

    网卡打开操作

    在使用ifconfig eth 192.168.1.100配置网卡IP,或者使用ifconfig eth up打开网卡时会调用网卡驱动操作集合里的open函数。在open函数中做网卡硬件初始化化相关工作。

    1.注册网卡中断处理函数,request_irq

    2.初始化相关寄存器

    3.使能发送和接收中断,来开启DM9000

    网卡发送过程

    1.通知协议栈暂停向驱动传送数据,netif_stop_queue

    2.写入发送数据长度

    3.写入发送数据

    4.通知协议栈开始向驱动传输数据,netif_wake_queue

    5.释放skb,dev_kfree_skb

    网卡接收过程

    接收在中断中完成,使用dm9000_rx函数处理

    1.空读数据

    2.读取接收状态

    3.读取状态和长度

    4.分配skb,使用dev_alloc_skb函数。分配长度是读取长度时获取的长度加4。4表示空读一个字节,状态一个字节,长度2个字节,剩下的部分才是真正读到的数据。

    5.向后移动skb的data指针2个字节,使IP包满足4字节对齐。因为以太网包中的源地址6个字节,目的地址6个字节,类型2个字节,在头部移动2个字节,使IP包从16字节开始4字节对齐开始存放。使用skb_reserve(skb, 2)函数。

    6.向前移动skb的tail指针4个字节,减去4个字节的CFS检验码,剩下的才是有效数据。使用skb_put(skb, RxLen - 4)。

    7.读取数据到skb包中,注意读取时还是包含了4字节的CFS校验码。

    8.提交数据到协议栈,使用netif_rx(skb)。

  • 相关阅读:
    C#获取根目录的方法集合
    C# 获取文件MD5值的方法
    VS2015 搭建 Asp.net core 开发环境
    【Networking】容器网络大观 && SDN 资料汇总
    【Networking】flannel,pipework,weave,udp,vxlan,ovs等资料
    【K8s】Kubernetes 最近正在看的资料
    【GoLang】go 微服务框架 && Web框架学习资料
    【Eclipse】eclipse che 协作开发
    【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
    【SpringBoot】SpringBoot 入门示例
  • 原文地址:https://www.cnblogs.com/d442130165/p/5268178.html
Copyright © 2011-2022 走看看