**************************************************************************************************************************************
*到此为止总结下prob究竟做了些什么事,那些结构里面多了什么
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、获得dm9k所使用的平台资源并将其保存在board_info变量db中。关键系统函数:netdev_priv(), platform_get_resource()
4、根据资源信息分配内存,申请中断等等, 并将申请后的资源信息也保存到db中,并且填充ndev中的参数。 关键系统函数:request_mem_region(), ioremap()。
resource_size(),自定义函数:dm9000_set_io(db, iosize);
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号
***************************************************************************************************************************************/
return 0;
/*****************************************************************************************************************************************
6、 读一下生产商和制造商的ID,应该是0x9000 0A46。 关键函数:ior()
7、 读一下芯片类型。
========以上步骤结束后我们可以认为已经找到了DM9000========
8、借助ether_setup()函数来部分初始化ndev。因为对以太网设备来讲,很多操作与属性是固定的,内核可以帮助完成。
9、手动初始化ndev的ops和db的mii部分。
10、(如果有的话)从EEPROM中读取节点地址。这里可以看到mini2440这个板子上没有为DM9000外挂EEPROM,所以读取出来的全部是0xff。见函数dm9000_read_eeprom。 关于外挂EEPROM,可以参考datasheet上的7.EEPROM Format一节。
11、很显然ndev是我们在probe函数中定义的局部变量,如果我想在其他地方使用它怎么办呢? 这就需要把它保存起来。内核提供了这个方法,使用函数platform_set_drvdata()可以将ndev保存成平台总线设备的私有数据。以后再要使用它时只需调用platform_get_drvdata()就可以了。
12、使用register_netdev()注册ndev。