dm9000网卡驱动分析
一、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); //主动唤起一个软中断
dm9000网卡驱动分析相关推荐
- arm平台linux的ethtool配置,ARM-Linux驱动--DM9000网卡驱动分析(四)
原标题:ARM-Linux驱动--DM9000网卡驱动分析(四) 硬件平台:FL2440 (S3C2440) 内核版本:2.6.35 主机平台:Ubuntu 11.04 内核版本:2.6.39 交叉编 ...
- linux 网卡驱动分析,LINUX_网卡驱动分析
LINUX_网卡驱动分析 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Linux DM9000网卡驱动程序完全分析说明仁 本文分 ...
- 以太网卡驱动程序移植linux,基于S3C2440的DM9000网卡驱动的移植
摘 要: 主要研究了基于Linux内核的网卡驱动的移植.Linux网络设备驱动程序的体系结构可以分为4层,首先分析了各层的具体功能实现,并在此基础上充分利用S3C2440开发板完成DM9000网卡驱 ...
- Linux PCI网卡驱动分析
http://www.uplinux.com/shizi/wenxian/4429.html Linux网卡驱动分析 学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难 ...
- linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx
Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...
- linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx
linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...
- 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通 最近有个学生毕业设计需要实现基于ARM的DM9000网卡通信,但是linux2.6.30.4内核已经把DM9000网卡 ...
- Linux网卡驱动分析之RTL8139(五)
Linux网卡驱动分析之RTL8139(五) deliver_skb(dev.c) // 该函数就是调用个协议的接收函数处理该skb 包,进入第三层网络层处理 static __inline__ in ...
- linux x86 网卡 驱动 bd sbk dma,一支使用了DMA的网卡驱动分析
一支使用了DMA的网卡驱动分析: 1.初始化 x540_priv->start_rx_ptr =(unsigned long)&x540_priv->rx_desc[0]; x54 ...
- 从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)
这里我们肯定不是要从零开始编写网卡驱动的. 因为编写网卡驱动时,需要网络基础知识,特别是网络底层的知识,目前还没学. 将来我可能选择在,网络,图像视屏,或USB这个三个方向,选择一个深入钻研. 这里主 ...
最新文章
- Visual studio 2005如何实现源码管理
- Java:取得当前日期一周之前/之后的日期,或者是一月之前/之后的日期
- move_uploaded_file()
- 删除远程桌面登陆痕迹
- leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
- 【小白学云计算】xmpp开源服务器的配置和安装图文详解
- PRML 模式识别与机器学习 1.绪论
- 谷歌地图api根据经纬度查询地名php,在线查询经纬度 google map查询地名返回经纬度 geocode geocoder的完整实例 代码下载...
- 通过httpurlconnection发带图片的文件
- 滑动鼠标滚轮后浏览器页面抖动
- html svg标签中插入img image标签不显示的问题
- gl.glenable()介绍
- 深度之眼(十七)——Python标准库
- 基于Redis+MySQL+MongoDB存储架构应用
- 解决Unity3D使用VRTK时,VR眼镜连接不上的问题
- 网页背景 css 黑色,这段让网页背景变成纯黑色的浏览器插件如何优化?
- python常识系列07-->python利用xlwt写入excel文件
- 用友U8案例教程采购报表
- 如何使用虚拟机改ip地址?
- 使用Diskpart磁盘管理中的clean命令,误删除了移动硬盘分区后,找回分区并恢复数据方法。(U盘启动盘)
热门文章
- c语言对整形indexing,C语言运算符另类分类法
- threejs 三面体_Three.js基础探寻五——正二十面体、圆环面等
- 10.16作业 如鹏
- 修改屏幕分辨率比例,4*3拼接屏 21:9 比例,大屏项目拼接适配屏解决方案
- 5款常用的数据可视化工具推荐!
- 解决启动eureka报错Unable to start web ... nested exception is org.springframework.boot.web.server.WebS
- 康佳电视软件测试工程师,康佳电视怎么样之康佳55吋曲面人工智能电视试用测评...
- 123页6万字XX市新型智慧城市顶层设计方案
- Java-幸运抽奖系统(综合练习)
- “头号电脑黑客” 凯文.米特尼克 与 中国台湾的”电脑鬼才“陈盈豪