微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > RTEMS管理机制与USB驱动程序设计

RTEMS管理机制与USB驱动程序设计

时间:08-22 来源:21IC 点击:
3.2 硬件抽象层

硬件抽象层对USB设备控制器进行操作,实现以下功能:设备状态管理、端点状态管理和中断管理。

3.2.1 设备状态管理

每一个USB设备在正常工作前必须完成主机对它的配置过程,即总线枚举。USB设备在总线上共有6种状态:接入态、加电态、默认态、地址态、配置态和挂起态。
硬件抽象层提供USB_Init、USB_Attach、USB_Disat-tach、USB_Connect、USB_Disconnect、USB_SetAddress、USB_ResetAddress、USB_SetConfiguration和USB_ResetConfiguration九个函数对设备的状态进行管理。一般来说,设备在总线上的状态变化都会由中断通知设备,中断服务程序根据中断类型和当前状态通过提供的功能接口对没备进行相应的操作,确保设备能够完成枚举过程÷顺利进入配置态。设备在硬件抽象层函数控制下的在总线上的状态机如图3所示。由于挂起与恢复无需软件干预,因此没有在状态机中描述这一状态。


3.2.2 端点状态管理

USB设备与主机的通信可以通过对USB端点状态的控制来完成。USB设备端点可以定义3个不同状态:空闲(Idle)状态、停止(Halt)状态和读/写(W/R)状态。USB硬件抽象层提供USB_ConfigureEndpoint、USB_Write、USB_Read、USB_EndOfTransfer、USB_Stall、USB_HaIt和USB_ClearHalt七个功能函数对设备的状态进行管理,端点的状态转换过程如图4所示。
USB_ConfiguIreEndpoint负责配置端点的最大包长度和传输方向,并将端点状态设置为空闲状态。端点进入空闲状态,如果上层调用USB_Write进行数据发送,将发送缓冲区指向要发送的数据,设置端点状态为写状态,等待USB主机接收数据(真正的数据传输在中断服务程序中进行)。写完成后,端点回到空闲状态。

数据接收与发送类似。如果设备出现某种错误,主机会向设备发送Set_Feature命令,设备接收到Set_Feature命令,执行USB_Halt进入停止状态。端点处于停止状态时,如果接收到Clear_Feature,则执行USB-ClearHalt清除Halt标志,进入Idle状态;如果USB设备由于某种原因无法对当前命令进行处理(如不能识别命令,或者没有准备好进行数据传输),则执行USB_Stall通知主机发生错误,但端点的状态不变。

3.2.3 中断管理

在USB设备端,存在以下几类中断:帧起始中断、设备恢复中断、设备挂起中断和端点中断。硬件抽象层的中断服务例程对各类中断进行响应,判断中断类型。如果是与设备状态相关的中断,则需要调整设备到相应的状态,同时调用上层提供的相应回调函数;如果是端点中断,则按照图5的流程处理。


3.3 USB设备类驱动

USB设备类驱动包含两个功能:对标准命令的处理和对基于设备类的命令的处理。USB类驱动根据硬件抽象层提供的接口,与中断服务程序协同管理USB设备和端点的状态。通过为硬件抽象层的中断服务程序提供相应的回调函数,完成特定设备类要求的操作;同时根据RTEMS系统的设备管理机制,为应用程序提供设备驱动的入口点。

3.3.1 标准命令处理

为了更好地协调USB主机与设备之间的数据通信,USB规范定义了一套命令,用于完成主机对总线上的USB设备的控制。USB设备必须对来自于主机的控制命令做出响应。一般来说,命令都是通过设备的默认管道传递到设备的。USB协议定义了11个标准命令,用于配置设备、获得设备的信息等操作。USB设备必须支持这些标准命令。
3.3.2 基于设备类的命令处理

除了标准命令以外,USB每种设备类的协议又定义了自己的类命令。设备厂商为了使设备实现某种特殊的功能,还可以定义厂商专有的命令。

所有的命令虽然有不同的内容和使用目的,但也有一些共同的特点:所有命令的结构是一样的;USB命令是在控制传输的设置阶段从USB主机发往设备的;如果除命令本身外,主机还打算向设备发送与命令相关的信息,那么这些信息将由紧跟在设置阶段的数据阶段发出;如果命令要求设备返回信息,这些信息会在控制传输的数据阶段从设备端发出;当命令完成时,设备会在握手阶段返回ACK;设备可以返回Stall,表明不支持当前命令或无法完成命令要求的操作。

3.3.3 命令的处理流程

当设备接收到新的命令时,硬件抽象层的中断处理函数会调用USB设备类驱动层提供的回调函数;在回调函数中,判断命令的类型,如果是标准命令,则交给标准命令处理函数处理;否则,交给基于设备类的命令处理函数处理。因此,要实现对某种标准USB设备类型或非标准USB设备类型的命令的支持,只需要在USB设备类驱动层添加对该标准设备类型命令或者自定义命令的处理函数,这样使得程序易于扩展。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top