书接上回,在介绍dm9000_driver三条支线中的两条.driver 和.remove之后,接下来的两篇博文主要介绍.probe。不是吧,前面说什么还有朋友不知所云?请先看回本系列第一篇博文,熟悉这个网卡驱动程序的构成框架再说。(http://blog.csdn.net/jarvis_xian/archive/2011/06/10/6537446.aspx)
先贴出.probe函数如下
主要完成的任务是:探测设备获得并保存资源信息,根据这些信息申请内存和中断,最后调用register_netdev注册这个网络设备。
1) 首先定义了几个局部变量:
struct dm9000_plat_data *pdata = pdev->dev.platform_data;
struct board_info *db; /* Point a board information structure */
struct net_device *ndev;
2) 初始化一个网络设备。关键系统函数:alloc_etherdev()
3) 获得资源信息并将其保存在board_info变量db中。关键系统函数:netdev_priv(),
platform_get_resource()
4) 根据资源信息分配内存,申请中断等等, 并将申请后的资源信息也保存到db中,并且填充ndev中的参
数。 关键系统函数:request_mem_region(), ioremap()。 自定义函数:dm9000_set_io()
5) 完成了第4步以后,回顾一下db和ndev中都有了什么:
struct board_info *db:
addr_res -- 地址资源
data_res -- 数据资源
irq_res -- 中断资源
addr_req -- 分配的地址内存资源
io_addr -- 寄存器I/O基地址
data_req -- 分配的数据内存资源
io_data -- 数据I/O基地址
dumpblk -- IO模式
outblk -- IO模式
inblk -- IO模式
lock -- 自旋锁(已经被初始化)
addr_lock -- 互斥锁(已经被初始化)
struct net_device *ndev:
base_addr -- 设备IO地址
irq -- 设备IRQ号
6) 设备复位。硬件操作函数dm9000_reset()
7) 读一下生产商和制造商的ID,应该是0x9000 0A46。 关键函数:ior()
8) 读一下芯片类型。
========以上步骤结束后我们可以认为已经找到了DM9000========
9) 借助ether_setup()函数来部分初始化ndev。因为对以太网设备来讲,很多操作与属性是固定的,内
核可以帮助完成。
10) 手动初始化ndev的ops和db的mii部分。
11) (如果有的话)从EEPROM中读取节点地址。这里可以看到mini2440这个板子上没有为DM9000外
挂EEPROM,所以读取出来的全部是0xff。见函数dm9000_read_eeprom。 关于外挂EEPROM,
可以参考datasheet上的7.EEPROM Format一节。
12) 很显然ndev是我们在probe函数中定义的局部变量,如果我想在其他地方使用它怎么办呢? 这就需
要把它保存起来。内核提供了这个方法,使用函数platform_set_drvdata()可以将ndev保存成平台
总线设备的私有数据。以后再要使用它时只需调用platform_get_drvdata()就可以了。
13) 使用register_netdev()注册ndev。
(以上13点总结摘抄自ypoflyer大哥的文章)
注意到代码中最后两个重要的结构体dm9000_netdev_ops 和dm9000_ethtod_ops,将在之后的博文逐一介绍,时间关系,在此打住。
本系列课程链接地址
DM9000网卡驱动(1)http://blog.csdn.net/jarvis_xian/archive/2011/06/10/6537446.aspx
DM9000网卡驱动(2)http://blog.csdn.net/jarvis_xian/archive/2011/06/12/6539931.aspx
DM9000网卡驱动(3)http://blog.csdn.net/jarvis_xian/archive/2011/06/13/6542411.aspx
DM9000网卡驱动(4)http://blog.csdn.net/jarvis_xian/archive/2011/06/15/6545109.aspx
DM9000网卡驱动(5)http://blog.csdn.net/jarvis_xian/archive/2011/06/15/6547203.aspx