基于Linux的USB设备驱动分析与.ppt_第1页
基于Linux的USB设备驱动分析与.ppt_第2页
基于Linux的USB设备驱动分析与.ppt_第3页
基于Linux的USB设备驱动分析与.ppt_第4页
基于Linux的USB设备驱动分析与.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Linux的USB设备驱动分析与实现 中国科技大学软件学院2008 05 07 CompanyLogo 项目背景 USB做为目前一种广泛应用的计算机外围串行通信标准 支持热插拔以及多个设备的同时工作 USB CompanyLogo 项目开发环境 CompanyLogo 无线网卡驱动程序的体系结构 CompanyLogo 802 11链路层 链路层以上五层在有线和无线中是一样的 链路层逻辑链路控制 LLC 子层 LLC子层沿用了802 系列其他网络协议的逻辑链路协议802 2这样的优点就是在LLC层之上就可以兼容其它IEEE802 网络的逻辑链路方法 很容易就可以实现WLAN和有线网络的兼容 结合与扩展 媒介访问控制 MAC 子层 两种控制方法CSMA CA 载波侦听多路访问 碰撞退避 由数据发送方使用 检测媒介载波 并在空闲时发送数据 RTS CTS 控制分组握手对话 由数据接收方使用 建立虚拟的碰撞退避检测和流量控制方法 CompanyLogo 802 11MAC层 CSMA CA协议的工作流程送出数据前 监听媒体状态 等没有人使用媒体 维持一段时间后 再等待一段随机的时间后依然没有人使用 才送出数据 由于每个设备采用的随机时间不同 所以可以减少冲突的机会 送出数据前 先送一段小的请求传送报文RTS RequesttoSend 给目标端 等待目标端回应CTS CleartoSend 报文后 才开始传送 由於RTS CTS封包都很小 让传送的无效开销变小 由于要检测冲突 设备必须能够一边接受数据信号一边传送数据信号 而这在无线系统中是无法办到的 所以没有采用CSMA CD 载波侦听多路访问 冲突检测 协议 CompanyLogo 802 11物理层 物理层把数字的数据信号调制成模拟的RF RadioFrequency 信号 然后通过跳频或相移等技术实现频谱的增扩 最后通过RF芯片和天线发送出去 而不是像有线网络那样把数字信号编码为二进制的0和1 然后控制电路的高低电平进行传输 PLCP 物理层会聚协议 子层选择调制解调协议 并且把数据转换成相应的RF信号集PMD 物理介质关联层接口 子层负责把信号转换成最终的RF无线电波 并辐射到WM媒介中去 CompanyLogo 802 11两种模式 802 11无线网络有两种组建模式Infrastructure 基础架构模式 在这种模式下 有线和无线通过某一接入点进行相互间的通讯 即无线网络通过接入点桥接到有线网络中 Ad Hoc 点对点模式 无线配备的计算机彼此之间直接进行通讯 不需要接入点 适合相对较小的网络 两者之间的取舍依赖于无线网络是否需要与有线网络共享数据或外设 CompanyLogo 802 11帧结构 802 11帧分为三个部分 帧头 帧实体 FCS域帧头是帧的控制部分 由 帧控制域 持续时间域 关联识别码 地址 顺序控制信息 组成 USHORTVer 2 协议版本0USHORTType 2 类型管理帧 是用来进行网络链路层服务管理的特殊帧 0控制帧 用来进行数据传输和网络节点状态的控制 1数据帧 用来承载数据荷载 传送数据 2USHORTSubType 4 子类型 包含有无应答 请求发送 竞争等 USHORTTods 1 输入DS BSS区域范围外使用 有线地址 USHORTFrds 1 输出DS BSS区域范围外使用 有线地址 USHORTMoreFrag 1 分段标志 2312字节 USHORTRetry 1 重传标志USHORTPwrMgmt 1 功率管理 节能状态 USHORTMoreData 1 更多数据 更多数据需要发送 USHORTWep 1 WEP加密 是否加密 USHORTOrder 1 顺序 按照严格序列要求 CompanyLogo 802 11帧结构 USHORTDuration 持续时间域 关联STA 关联竞争 MACADDRAddr1 通常指目的地址MACADDRAddr2 通常指源地址MACADDRAddr3 BSSIDMAC地址 关联AP 在Infrastruct模式中 源地址是Addr3在AD HOC模式中 源地址是Addr2USHORTFrag 4 分片标志USHORTSeq 12 序列号 确认对方帧顺序 帧实体 是帧的独立数据荷载部分 这部分是可变长的 记录了相关子类型的特定数据 FCS FrameCheckSequence 帧校验序列长度固定为32位 包含整个帧的CRC校验码 CompanyLogo WLAN原理 STA STATION WLAN的基本连接单位 是一个最基础的包含802 11的MAC和PHY层功能的设备实体 WLAN中的任何设备 都将首先表现为一个STA 包括台式机 笔记本 掌上电脑 AP STA提供的Service 站点服务 SS 提供数据交付 鉴权 取消鉴权 加密 每个STA都提供 发布系统服务 DSS 提供关联 重新关联 取消关联 转发等 如果一个STA也提供DSS 它即实现了一个AP的功能 不是每个STA都提供 基本服务集 BSS 有多个STA在BSS区域中 一个WLAN形成一个自然的BSS 独立的基本服务集 IBSS 没有提供DSS的STA 也就是没有AP 即点对点通信 AD HOC模式 扩展服务集 ESS 可以理解为moreBSS 在ESS中可以包含若干个BSS和其他任意类型的网络 CompanyLogo WLAN原理 如何连接到其他的网络DSS提供一种服务 他的一端连接了一个BSS 另一端连接到其他网络端点 发布系统服务媒介 DSM 它包含了VM和其他网络媒介 VM只支持BSS ESS网络特性BSS可能部分或者完全重叠各个BSS之间可能不连接 但DSS保证STA在BSS之间转移 一个或多个iBSS或ESS网络可以重叠出现在同一物理空间上 STA在逻辑上属于哪个网络将由ESSID决定 同一ESS之内 STA在若干个BSS之间可以透明的移动或切换 也就是说可以随机的决定由哪个AP接入ESS CompanyLogo USB无线网卡驱动程序结构 RalinkRT73嵌入式MMU的角度首先看到的是USB总线 然后才是网卡芯片 所以USB驱动要先于网卡驱动实现 设备驱动对上层提供无线协议栈的接口 对下层则是处理无线网卡设备 使用USB总线驱动提供的API访问总线 操作设备上的寄存器空间和设备内存空间 在系统内存和设备之间传递数据 CompanyLogo USB驱动程序框架 USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口 而不必考虑系统当前存在的各种不同类型的USB硬件控制器 Linux内核中的USB代码通过一个称为urb USB请求块 的东西和所有的USB设备进行通信 urb结构体中包含usb device指针 dev usb submit urb urb t urb 来传送urb实现数据间交换 CompanyLogo 程序设计 无线适配器结构体struct RTMP ADAPTER一个描述自身特性的数据结构 在此数据结构中定义了配置无线网卡所需要的参数和与USBcore数据交换的接口方式 主要的参数如USB设备通用数据结构 网络数据结构 802 11协议帧数据结构 硬件buffer缓存区的描述 网卡MAC地址数据结构 互斥信号量与等待队列等驱动程序不像其他C语言程序那样 都有一个main 入口函数 而是通过注册加载时执行的函数和注册卸载时执行的函数来执行程序的 module init usb rtusb init 注册USBmodule exit usb rtusb exit 卸载USB CompanyLogo 接口设置和初始化 USBdriver数据结构structusb driverrtusb driver name rt73 probe usb rtusb probe 指向usb探测函数的指针 disconnect usb rtusb disconnect id table rtusb usb id 不同类型的该驱动程序支持的USB设备 不同厂商的 通过id table中的idVendor USB制造商ID 和idProduct 产品ID 来判断硬件设备是否已经插入总线 USBcore就会调用probe方法来检测被传递进来的信息 以确定无线网卡设备是不是和驱动程序匹配 同时填充structnet device完成对该网络设备的初始化 当无线网卡被拔出时 USBcore就会调用disconnect方法来完成卸载 CompanyLogo 无线网络接口的实现 无线网卡驱动程序作为网络驱动程序 同样遵循通用的接口 通过net device数据结构 实现无线网络数据的收发 对net device关键域的初始化如下 netdev open usb rtusb open 设定open函数netdev hard start xmit RTMPSendPackets 设定发送函数netdev stop usb rtusb close 设定close函数netdev priv pAd 设定私有数据为RTMP ADAPTERnetdev get stats rt73 get ether stats 设定状态统计函数对于无线网卡芯片的初始化 配置 设置参数与关闭 其实现方法是通过相应函数对寄存器赋值 比如对MAC寄存器的写操作由函数RTUSBWriteMACRegister实现 而对寄存器的读操作函数通过RTUSBReadMACRegister实现 RTUSBWriteMACRegister和RTUSBReadMACRegister都是通过调用RTUSB VendorRequest来实现读写寄存器的 只不过传递给函数的类型一个是读类型 一个是写类型 RTUSB VendorRequest是通过调用usb control msg函数根据类别进行判断是发送还是接受数据 CompanyLogo 主要方法 open方法由函数staticintusb rtusb open structnet device net dev 实现 首先鉴别probe函数返回值以确定设备是否存在 对各种可能出现的错误进行判断 然后初始化相关数据结构 注册所有的系统资源 还有就是对可能发送来的数据进行判断 它到底是单播 多播还是广播 hard start xmit方法由RTMPSendPackets函数实现 记录发送缓冲区状态 判断其工作模式 Infrastructure或者AD HOC 将帧结构放入发送队列 然后发送网络数据包 rt73 get ether stats方法主要实现RTMP ADAPTER中的stats方法 统计数据发送和接收情况 包括总的接受字节 总的发送字节等 CompanyLogo Open方法流程图 CompanyLogo 开发环境搭建 嵌入式系统开发一般采用宿主机 目标机开发模式 即利用宿主机 PC 上丰富的软硬件资源以及良好的开发环境和调试工具来开发目标板上的软件 然后通过交叉编译环境生成目标代码和可执行文件 通过串口 USB 以太网等方式下载到目标板上 利用交叉调试器在监控程序运行 实时分析 最后将程序下载固化到目标机上 完成整个开发过程 本开发环境如下 宿主机为装有RedHat9 0的LinuxPC 内核版本2 4 20 目标板为S3C2410开发板 宿主机和目标机之间采用串口和以太网连接 便于调试应用程序 USB无线网卡驱动的开发和设计基于以上的开发环境 CompanyLogo 无线网卡驱动编译 Linux设备驱动属于内核的一部分 可以以两种方式编译和加载进Linux内核 一种是直接编译进内核 随同Linux启动时加载 另外一种是将设备驱动程序编译为一个可以动态加载和删除的模块 使用insmod加载 rmmod删除 这种方式控制了内核的大小 而模块一旦被插入内核 它就和内核其他部分一样了 我们的无线网卡驱动编译采用的是第二种方式 CompanyLogo 无线网卡驱动编译 1 首先在宿主机上对内核进行配置 将内核中不必要的功能去掉 2 在设备驱动选项里 增加对WLAN的支持 增加对RT73芯片的支持 3 修改Makefile 主要是修改编译器路径 并将内核文件夹选项重新定位在开发板内核下4 编译 生成rt73 o无线网卡驱动模块 5 将rt73 o驱动模块下载至开发板 由于Linux支持模块的动态加载 所以可以很方便的将此模块用 insmod 加载至内核 通过 lsmod 查看加载的模块 可以得知rt73模块是否已经被成功加载 CompanyLogo 遇到的问题 在宿主机Linux下能够编译成功生成rt73 o驱动模块 并且能够成功加载 驱动网卡正常运行 但是交叉编译时会出现如下错误

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论