- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在Linux驱动程序中采用中断方式访问外设需做到以下几点: (1) 向系统申请中断。Linux提供了函数request_irq()来实现申请中断。申请成功与否的关键在于此函数的一个参数irq,它是希望申请的中断号。如果外设可以发中断2,那该参数就填2。不过还有一点需要考虑的是如果想申请的中断号己被别的设备占用,那就需要想办法协调这两个设备了。可以使用命令cat/proc/interrupts来查看操作系统中现有中断号的使用情况。当然是否申请成功,也可以通过这条命令查看。 (2) 释放中断。函数free_irq()可以实现这个功能。 (3) 实现中断函数。申请完中断号以后,希望系统响应该中断后做些什么全依赖此函数。 数据包的发送 网络设备发送过程比较简单,其数据发送是按以下步骤进行的: (1)它调用dev-hard_start_xmit方法,将套接字缓冲区发送到硬件设备。它具有传输层的头,接口不需要修改被发送的数据。 (2)判断从协议层传过来的数据包长度是否合法以及网络设备的状态是否可用。如果一切正常,则继续执行。否则返回错误码。 (3)通过对控制寄存器的操作来执行设备接口发送数据包的程序代码。 (4)当发送结束时,返回。 数据包的接收 从网络中接收数据比发送要复杂,因为必须要分配一个sk_buff ,并从一个中断处理程序中将其递交给高层。接收包最好的方法是通过中断,除非接口是纯软件的或者绕回接口。 8.7.5 网络设备驱动程序的加载 (1)网络设备驱动程序的内核启动加载 Dev_base链表中的第一个节点是环回设备(loopback_dev),即通常所说的环回接口,用于检测系统是否支持网络通信。链表中的下一个网络设备给出配置的Linux内核而有所不同,通常由宏NEXT_DEV指定。所有支持的网络设备都通过这个宏存放在dev_base链表中。其中,以太网检测设备在函数ethif_probe中通过调用probe_list函数来实现。内核启动方式下整个函数调用如图8-5所示。 图8-4 内核启动方式的函数调用流程 (2)网络设备驱动程序模块的加载 通过模块驱动的方法是Linux中使用模块设计的一种方案。Linux的内核是将所有的支持编译在一起的。如果对Linux内核增加一项功能,就把它的实现直接放在内核代码中。为了让Linux的内核体积不致过于庞大,采用了编译成内核的方式。在需要用到这个模块的时候,用insmod命令将该模块插入到内核的运行空间;如果不需要,用rmmod命令将该模块卸载。 图8-6 模块加载方式启动网络设备的流程图 1. DM9000网卡芯片介绍 2. DM9000网卡驱动程序 8.7.6 DM9000网卡驱动程序分析 1. DM9000网卡芯片介绍 DM9000是一款集成的廉价快速以太网芯片,它带有一个通用处理器接口,一个10/100M物理接口和一个双字节的SRAM 。DM9000还提供了一个MII接口,用于连接HPNA设备或其他支持MII的收发器。DM9000物理协议层接口完全支持使用10MBps下3类、4类、5类非屏蔽双绞线和100MBps下5类非屏蔽双绞线。它的自动协调功能将自动完成配置以最大限度地适合其线路带宽。DM9000网卡芯片的结构图如图8-7所示。 图8-7 DM9000网卡芯片结构图 DM9000网卡芯片的特点如下: 以 字节/ 字/ 双字的I/O指令读写内部存储器的数据 集成10/100M自适应收发器 支持MII/RMII接口 支持半双工流量控制模式 IEEE802.3x流量控制的全双工模式 支持唤醒帧,链路状态改变和远程的唤醒 4K双字SRAM 支持自动加载EEPROM里面生产商ID和产品ID 支持4个通用输入输出口 超低功耗模式 电源故障模式 可选择1:1或5:4变压比例的变压器降低格外功率 兼容3.3v和5.0v输入输出电压 100脚CMOS LQFP封装工艺 2. DM9000网卡驱动程序 Linux2.6中已经带了DM9000的网卡芯片驱动,源文件为drivers/net/dm9000.c。它既可以编译进内核,也可以编译为一个模块,入口函数都是dm9000_init,代码如下: static int_init dm9000_init(void) { printk(KERN_INFO “%s Ethernet Driver\n”, CARDNAME); return platform_driver_register(dm9000_driver); } 驱动程序的部分关键函数代码如下: static void dm9000_reset(board_info_t*db
文档评论(0)