dm9000网卡驱动分析

news/2025/2/7 3:19:11/

一、dm9000_probe函数为网卡初始化函数,在加载驱动模块时执行,完成设备初始化及网络设备注册到系统
dm9000_probe:
 ndev = alloc_etherdev(sizeof(struct board_info));   //net_device分配与初始化
 db = netdev_priv(ndev);          //网卡硬件信息初始化

 db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//地址资源获取
 db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 db->irq_res  = platform_get_resource(pdev, IORESOURCE_IRQ, 0);//中断号获取与初始化

 db->addr_req = request_mem_region(db->addr_res->start, iosize, pdev->name);//向内核申请物理资源
 db->io_addr = ioremap(db->addr_res->start, iosize); //网卡中指令缓存(基地址)映射为虚拟地址

 db->data_req = request_mem_region(db->data_res->start, iosize, pdev->name);
 db->io_data = ioremap(db->data_res->start, iosize); //网卡中数据缓存(网卡接收和发送暂存)映射为虚拟地址

 ndev->netdev_ops    = &dm9000_netdev_ops; //初始化 如 ndo_open、ndo_stop、ndo_start_xmit= dm9000_start_xmit
 register_netdevice            //注册网络设备驱动

二、dm9000_open函数开启网卡 ifconfig eth0 up最终会执行此函数
dm9000_open:
  request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev)  //注册中断处理函数
  netif_start_queue(dev);   //使能上层(协议栈)调用设备hard_start_xmit功能  ip层dev_queue_xmit调用dm9000_start_xmit

三、dm9000_start_xmit是网卡设备发送函数
dm9000_start_xmit:
  /* Move data to DM9000 TX RAM */
  writeb(DM9000_MWCMD, db->io_addr);                  //写入指令到io_addr
  (db->outblk)(db->io_data, skb->data, skb->len);     //发送data到io_data
  dm9000_send_packet
    iow(dm, DM9000_TXPLL, pkt_len);            //writeb(reg, db->io_addr); writeb(value, db->io_data); 设置发送大小低位
    iow(dm, DM9000_TXPLH, pkt_len >> 8);  //设置发送大小高位
    /* Issue TX polling command */
    iow(dm, DM9000_TCR, TCR_TXREQ);    //发送及清除

四、dm9000_interrupt   //接收中断处理函数 ,数据到来触发中断,cpu执行此函数
dm9000_interrupt
   dm9000_rx(dev)
     dev_alloc_skb  //分配sk_buff套接字缓冲区
     rdptr = (u8 *) skb_put(skb, RxLen - 4)
     (db->inblk)(db->io_data, rdptr, RxLen)//写入缓存 dm9000_inblk_16bit
     netif_rx(skb)   //传送到协议栈
        __skb_queue_tail(&queue->input_pkt_queue, skb);//softnet_data队列,是数据链路层中的数据结构,它是一个Per-CPU变量,每个CPU都有一个
        local_irq_restore(flags);  //恢复本地cpu中断
        napi_schedule(&queue->backlog);           //对软中断进行调度
          __raise_softirq_irqoff(NET_RX_SOFTIRQ); //主动唤起一个软中断


http://www.ppmy.cn/news/743731.html

相关文章

【Python爬虫与数据分析】爬虫Json数据解析

目录 一、Json文件数据解析 二、Json数据包解析获取图片资源 三、Json数据包解析获取视频资源 一、Json文件数据解析 json字符串:通常类似python数据类型中的列表和字典的结合,也可能是单独的列表或者字典格式,通常可以通过json模块的函数…

Tsi721芯片驱动代码使用说明

驱动程序下载路径: https://download.csdn.net/download/luky_zhou123/20087673 欢迎共同探讨SRIO相关问题 文件说明: rio.c、rio-driver.c、rio-access.c、rio-sysfs.c:srio总线驱动代码文件 /devices/tsi721.c、/devices/tsi721_dma.c…

mini2440 dm9000 网卡驱动详解 1

虽然Linux驱动程序应该是和具体的硬件平台分离的,但是为了更好的理解DM9000的驱动程序,这里还是结合一下Mini2440开发板,这样也可以更好的体会如何实现驱动和平台分离。 本文分成以下几个部分: 一、Mini2440开发板上DM9000的电气…

Dell EMC PowerEdge R740 服务器的驱动程序和固件更新

前期准备: 一、如何下载Server Update Utility SUU特定于操作系统,因此,为成功更新驱动程序,请选择与您的操作系统匹配的版本。可以在您的支持产品页面的“Drivers and Downloads”页面找到 SUU 的最新版本。 导航至dell.com/s…

linux[armbian]环境安装nginx

文章目录 linux[armbian]环境安装常用命令遇到的问题和解决方法问题一:conf/koi-win复制错误解决方法问题二:缺少相关的日志目录解决方法 linux[armbian]环境安装 下载Nginx: 访问[Nginx官方网站](https://nginx.org/)&#xff0c…

026、SQL语句之表的DDL

创建、删除表 CREATE TABLE [IF NOT EXISTS] table_name …表创建后,它们的定义保存在: information_schema.tables丢弃⼀张表: DROP TABLE [IF EXISTS] table_name;删除表内所有数据: TRUNCATE TABLE table_name; 删除普通表和临时表的⽤法如下: DRO…

智能井盖:用科技破解井盖“吞人”问题

井盖分布在街道和小巷中。一旦被盗或损坏,如果不及时处理,很容易造成事故,从车辆轮胎受伤或爆胎到“吞人”。由于井盖分布广、数量大,如果丢失或损坏,窨井盖的日常维护和检查依赖于人工巡查,耗费人力物力&a…

音响分频器有什么作用

由于现在的音箱几乎都采用多单元分频段重放的设计方式,所以必须有一种装置,能够将功放送来的全频带音乐信号按需要划分为高音、低音输出或者高音、中音、低音输出,才能跟相应的喇叭单元连接,分频器就是这样的装置。 音箱 如果把…