- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
ARM-Linux驱动--DM9000网卡驱动分析(二)
下面开始分析具体的代码,这里由于使DM9000驱动更容易理解,在不影响基本的功能的前提下,这里将尽可能的简化该驱动(如:去掉该驱动中支持电源管理的功能)
分析该驱动
1、首先看一下该驱动的平台设备驱动的结构体定义
[cpp]? \o view plain view plain \o copy copy
/*平台设备驱动的结构体定义?
*在该结构体中可以定义有关Power?Management的管理函数?
*该驱动中将其省略,侧重分析dm9000的基本原理?
*/??
static?struct?platform_driver?dm9000_driver?=?{??
????.driver?=?{??
????????.name????=?dm9000,/*?该名称和系统初始化中,平台设备的名称一致?*/??
????????.owner???=?THIS_MODULE,??
????},??
????.probe???=?dm9000_probe,/*?资源探测函数?*/??
????.remove??=?__devexit_p(dm9000_drv_remove),/*?设备移除函数?*/??
};??
在执行insmod后内核自动那个执行下面的函数
[cpp]? \o view plain view plain \o copy copy
static?int?__init??
dm9000_init(void)??
{??
????printk(KERN_INFO?%s?Ethernet?Driver,?V%s\n,?CARDNAME,?DRV_VERSION);??
??
????return?platform_driver_register(dm9000_driver);??
}??
调用函数platform_driver_register()函数注册驱动。
3、自动执行驱动的probe函数,进行资源的探测和申请资源。
其中BWSCON为总线宽度 等待控制寄存器
其中第[19:18]位的作用如下
下面函数中将两位设置为11,也就是WAIT使能,bank4使用UB/LB。
alloc_etherdev()函数分配一个网络设备的结构体,原型在include/linux/etherdevice.h
原型如下:
[cpp]? \o view plain view plain \o copy copy
extern?struct?net_device?*alloc_etherdev_mq(int?sizeof_priv,?unsigned?int?queue_count);??
#define?alloc_etherdev(sizeof_priv)?alloc_etherdev_mq(sizeof_priv,?1)??
该函数中需要将获得的资源信息存储在一个结构体中,定义如下:
[cpp]? \o view plain view plain \o copy copy
/*?Structure/enum?declaration?-------------------------------?*/??
typedef?struct?board_info?{??
??
????void?__iomem????*io_addr;???/*?Register?I/O?base?address?*/??
????void?__iomem????*io_data;???/*?Data?I/O?address?*/??
????u16??????irq;???????/*?IRQ?*/??
??
????u16?????tx_pkt_cnt;??
????u16?????queue_pkt_len;??
????u16?????queue_start_addr;??
????u16?????queue_ip_summed;??
????u16?????dbug_cnt;??
????u8??????io_mode;????????/*?0:word,?2:byte?*/??
????u8??????phy_addr;??
????u8??????imr_all;??
??
????unsigned?int????flags;??
????unsigned?int????in_suspend?:1;??
????unsigned?int????wake_supported?:1;??
????int?????debug_level;??
??
????enum?dm9000_type?type;??
??
????void?(*inblk)(void?__iomem
文档评论(0)