- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RT3070驱动框架分析
第三部分. RT3070驱动工作框架
概述:
项目使用芯片RT3070,USB接口,厂商Ralink Technology,是一家台湾的厂商很多台湾硬件厂商都貌似在用这个芯片,该家厂商在网上有提供芯片的驱动,让我们来初步分析一下这个驱动:
首先从usb_main_dev.c开始分析,其中有几个函数:
probe函数是最重要的,主要用于设备的探测以及所需内核资源的初始化。rt73_suspend和rt73_resume主要是电源管理相关,如收到suspend时以怎样的低功耗工作,以及resume时如何恢复等。usb_rtusb_disconnect是当usb设备从系统中移除之后会调用接口。
在usb_main_dev.c 的probe函数中,总体分了这么几个部分:
RtmpDevInit //模块结构体通用部分的初始化
USBDevInit //模块结构体中USB部分的初始化
NetDevInit //模块结构体中网络部分的初始化
内核相关机制的初始化
说明这个wifi模块在内核中不仅是一个网络设备,也是一个USB设备。驱动用面对对象的思想完成,其核心的结构体为RTMP_ADAPTER *pAd。从名字上可以看出它表示整个WIFI模块。
Probe函数具体代码分析:
static int rt2870_probe
-struct net_device *net_dev = NULL;//定义相关重要的结构体
-RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) NULL;
-PVOID handle;
-RTMP_OS_NETDEV_OP_HOOK netDevHook;
-handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); //
-USBDevConfigInit(usb_dev, intf, pAd) == FALSE;//usb 设备初始化,后面文章单独分析
-net_dev = RtmpPhyNetDevInit(pAd, netDevHook);//网络设备初始化,后面单独分析
-SET_NETDEV_DEV(net_dev, (usb_dev-dev));
-status = RtmpOSNetDevAttach(net_dev, netDevHook);//注册这个网络设备
-配置文件中有KTHREAD_SUPPORT,所以要初始化一些等待队列,以后应该用的着
-init_waitqueue_head(pAd-mlmeTask.kthread_q);// 等待队列初始化
……………………..
-*ppAd = pAd;//关键啊,把填充号的pAd返回给二级指针
-return 0;
//至此Probe结束
USB初始化函数分析:
传入三个参数: struct usb_device, struct usb_interface,RTMP_ADAPTER *pAd
总体作用:
根据usb设备结构体和usb接口结构体中的相关信息区初始化pAd结构体。
static BOOLEAN USBDevConfigInit()
-struct usb_host_interface *iface_desc;
- iface_desc = intf-cur_altsetting;//获得interface的host_interface
-pAd-NumberOfPipes = iface_desc-desc.bNumEndpoints;//由端点获得管道
-扫描每一个端点,判断端点的属性和地址,如果条件成立
-bmAttributes == USB_ENDPOINT_XFER_BULK;//判断端点属性
-bEndpointAddress USB_ENDPOINT_DIR_MASK) == USB_DIR_IN //判断传输方向,这里的方向为输入(IN)
-如果条件成立,表明是输入端点
-pAd-BulkInEpAddr = iface_desc-endpoint[i].desc.bEndpointAddress;//对pAd中端点地址进行赋值
-pAd-BulkInMaxPacketSize= le2cpu16(iface_desc-endpoint[i].desc.wMaxPacketSize);//对包的最大值进行赋值
-如果是输出端点(USB_ENDPOINT_DIR_MASK == USB_DIR_OUT//输出端点有6个,EP6优先级最高
-pAd-BulkOutEpAddr[BulkOutIdx++]= iface_desc-endpoint[i].desc.bE
您可能关注的文档
最近下载
- 翼状胬肉的护理查房-PPT.ppt
- 2022年应急管理工作应知应会知识竞赛题库(含答案).pdf
- 全民微信时代增进了VS减弱了人与人之间的交流辩论赛 正方辩词一辩、二辩、三辩、四辩发言稿.docx
- 超星网课尔雅《人人学点营销学》尔雅答案2022章节测试答案.docx
- 2019CSP-J NOIP普及组初赛C++试卷.pdf VIP
- 2024年《城镇燃气管理条例题库》考试题库(含答案).pdf VIP
- 必威体育精装版浙教版八年级上册劳动技术 项目三 任务二《打蛋器的制作》课件(课件).pptx
- 纪律意识方面存在不足及措施4篇.pdf
- 消防安全教育PPT课件.pptx VIP
- 《新中国成立75周年》全文课件.ppt VIP
文档评论(0)