网站大量收购独家精品文档,联系QQ:2885784924

ARM-Linux驱动--DM9000网卡驱动分析(二).doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档