欢迎来到天天文库
浏览记录
ID:51436886
大小:65.50 KB
页数:13页
时间:2020-03-24
《CS8900A网卡设备驱动程序分析基于ARM平台.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、CS8900A网卡设备驱动程序分析基于ARM平台(上)推荐给好友打印加入收藏更新于2009-04-2918:17:14ARMdevice 网络驱动程序主要完成系统的初始化、数据包的发送和接收。在以前的内核版本中,网络设备的初始化主要由net_device数据结构中的init函数指针所指向的初始化函数来完成。在现在较新的2.6内核中,网络设备的初始化主要由device_driver数据结构中的probe函数指针所指向的函数来完成。数据包的发送和接收是实现Linux网络驱动程序中两个最关键的过程,对这两个过程处理的好坏将直接影响到驱动程序的整体运行质量。首先来分析CS8900A
2、网卡设备驱动的初始化。1初始化CS8900A网卡设备驱动的初始化主要由device_driver数据结构中的probe函数指针所指向的初始化函数来完成,当内核启动或加载网络驱动模块的时候,就会调用这个初始化函数。该模块加载函数实现如下:1staticint__initcirrus_init(void)2{3returndriver_register(&cirrus_driver);4}模块加载函数cirrus_init通过调用内核函数driver_register来注册CS8900A网卡设备驱动,driver_register函数的实现在内核3、>文件中。对设备驱动程序进行注册和初始化是两件不同的事情。设备驱动程序应当尽快被注册,以便用户应用程序通过相应的设备文件使用它。通常设备驱动程序在最后可能的时刻才被初始化。事实上,初始化驱动程序意味着分配系统宝贵的资源,这些被分配的资源因此就对其他驱动程序不能用。关于注册的网络设备驱动结构cirrus_driver的定义如下:1staticstructdevice_drivercirrus_driver={2.name="cirrus-cs89x0",3.bus=&platform_bus_type,4.probe=cirrus_drv_probe,5.remove=cirrus_re4、move,6.suspend=cirrus_suspend,7.resume=cirrus_resume,8};第1行,定义变量cirrus_driver为device_driver结构类型,关于device_driver结构的定义在文件中。第2行,定义设备驱动名称为cirrus-cs89x0。第3行,定义bus类型为platform_bus_type。第4行,定义probe函数为cirrus_drv_probe,也就是说该网络设备的初始化是由cirrus_drv_probe函数来完成的,下面会具体讲述这个函数。第5行,定义remove函5、数为cirrus_remove,该函数主要完成网络设备的退出功能。第6行,定义suspend函数为cirrus_suspend,用来实现设备驱动的挂起操作,一般不用实现。第7行,定义resume函数为cirrus_resume,该函数用来实现从挂起状态返回到继续执行状态,一般也不用实现。现在来分析一下初始化函数cirrus_drv_probe的具体实现。在初始化函数中通过检测物理设备的硬件特征来侦测网络物理设备是否存在,然后再对设备进行资源配置,以及内存映射,接下来构造设备的net_device数据结构,并用检测到的数据对net_device中的变量初始化,最后向Linux内核注册该设6、备并申请内存空间。1int__initcirrus_drv_probe(structdevice*dev)2{3structplatform_device*pdev=to_platform_device(dev);4structresource*res;5unsignedint*addr;6intret;78res=platform_get_resource(pdev,IORESOURCE_MEM,0);9if(!res){10ret=-ENODEV;11gotoout;12}1314/*Requesttheregions.*/15if(!request_mem_region(res-7、>start,16,"cirrus-cs89x0")){16ret=-EBUSY;17gotoout;18}1920/*remapit.*/21addr=ioremap(res->start,res->end-res->start);22if(!addr){23ret=-ENOMEM;24gotorelease_1;25}2627ndev=alloc_etherdev(sizeof(cirrus_t));28if(!ndev){29printk
3、>文件中。对设备驱动程序进行注册和初始化是两件不同的事情。设备驱动程序应当尽快被注册,以便用户应用程序通过相应的设备文件使用它。通常设备驱动程序在最后可能的时刻才被初始化。事实上,初始化驱动程序意味着分配系统宝贵的资源,这些被分配的资源因此就对其他驱动程序不能用。关于注册的网络设备驱动结构cirrus_driver的定义如下:1staticstructdevice_drivercirrus_driver={2.name="cirrus-cs89x0",3.bus=&platform_bus_type,4.probe=cirrus_drv_probe,5.remove=cirrus_re
4、move,6.suspend=cirrus_suspend,7.resume=cirrus_resume,8};第1行,定义变量cirrus_driver为device_driver结构类型,关于device_driver结构的定义在文件中。第2行,定义设备驱动名称为cirrus-cs89x0。第3行,定义bus类型为platform_bus_type。第4行,定义probe函数为cirrus_drv_probe,也就是说该网络设备的初始化是由cirrus_drv_probe函数来完成的,下面会具体讲述这个函数。第5行,定义remove函
5、数为cirrus_remove,该函数主要完成网络设备的退出功能。第6行,定义suspend函数为cirrus_suspend,用来实现设备驱动的挂起操作,一般不用实现。第7行,定义resume函数为cirrus_resume,该函数用来实现从挂起状态返回到继续执行状态,一般也不用实现。现在来分析一下初始化函数cirrus_drv_probe的具体实现。在初始化函数中通过检测物理设备的硬件特征来侦测网络物理设备是否存在,然后再对设备进行资源配置,以及内存映射,接下来构造设备的net_device数据结构,并用检测到的数据对net_device中的变量初始化,最后向Linux内核注册该设
6、备并申请内存空间。1int__initcirrus_drv_probe(structdevice*dev)2{3structplatform_device*pdev=to_platform_device(dev);4structresource*res;5unsignedint*addr;6intret;78res=platform_get_resource(pdev,IORESOURCE_MEM,0);9if(!res){10ret=-ENODEV;11gotoout;12}1314/*Requesttheregions.*/15if(!request_mem_region(res-
7、>start,16,"cirrus-cs89x0")){16ret=-EBUSY;17gotoout;18}1920/*remapit.*/21addr=ioremap(res->start,res->end-res->start);22if(!addr){23ret=-ENOMEM;24gotorelease_1;25}2627ndev=alloc_etherdev(sizeof(cirrus_t));28if(!ndev){29printk
此文档下载收益归作者所有