RT3070驱动框架分析.doc

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

文档评论(0)

153****9595 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档