3c501.c驱动的理解流程

本文详细解析了3c501网络驱动的初始化过程,包括分配I/O端口、中断请求编号设置、中断探测与分配、设备注册等步骤。通过对el_probe系列函数的分析,阐述了驱动如何与硬件交互,特别是中断处理和设备状态的设置。同时,介绍了open、start_xmit、timeout和close等关键函数的功能,展示了驱动如何处理数据发送、接收和超时情况。
摘要由CSDN通过智能技术生成

计划,把这个3c501自己看完后,再看一下潘刚的文章, 应该可以对整个网络的流程有个更清晰的认识了. 周五前把这个代码看完,周五开始看潘刚

 

621

这个驱动是3c501芯片的驱动。 是作为模块插入的。

模块的开始在

init_module()开始 其中:

首先,net_device的结构 的中断请求编号irq赋值,这个值默认为5,可以在插入模块的时候指定;设定 i/o地址,默认为0x280,也可以在加入模块的时候指定。

其次,register_netdev&net_device)注册这个设备。这个函数做的事情就是调用net_device init定义的函数入口:el1_probe()

 

el1_probestruct net_device *dev)函数

       首先 设置为内核模块的设备。

              SET_MODULE_OWER(dev) ;//equal to dev->owner=THIS_MODULE;

       而后 根据设置的i/o地址范围  调用el1_probe1(dev,base_addr)

 

el1_probe1

      首先request_regionioaddr,16 ,dev->name 为设备请求一个从ioaddr开始,16个端口数目的I/O端口。

       而后 el1_dataptr写入0――5 端口地址el2_saprom 读取字节。保存在sataion_addr//这个是做什么呢?给不同的地址写入,然后看saprom的值?

       再根据station_addr的前3个参数来确定vender的值 。如果没有信息则 释放所占用的i/o端口  release_region(ioaddr,El1_IO_EXTENT);

      

       接下来 dev->irq进行判断,主要是考虑用户指定irq小于2的情况。

              Autoirq_setup(2)  自动设定中断探测

              InbRX_STATUS //程序中注释为清楚未决的中断 inb除了读出还有清空?

             InbTX_STATUS 读出i/o地址的信息?可是为什么没有保存给一个变量呢?

              然后给ax寄存器分别写入一些值,具体值的含义也许和芯片有关系吧,

              再调用autoirq_report(1) 表示1 jiffies之后 调用autoirq_setup返回irq数量。如              为零则表示无法分配中断号了,则释放先前申请的I/O地址

 

void autoirq_setup(int waittime); 该函数设置中断探测,在这里忽略了waittime参数。
int autoirq_report(int waittime);
该函数延迟给定的时间(以jiffies计算),然后返回自调用autoirq_setup以后产生的IRQ数量。 这些函数最初是在网络驱动程序的代码中使用,由于历史原因,它们现在用probe_irq_onprobe_irq_off实现。通常没有必要使用 autoirq_ 函数,而应该使用 probe_irq_

 

 如果dev->irq>2,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值