USB设备枚举检测方法和系统及固件升级方法和系统
技术领域
本发明涉及通信技术领域,尤其涉及一种USB设备枚举检测方法和系统及固件升级方法和系统。
背景技术
USB(Universal Serial BUS)接口是目前电脑中的标准扩展接口。USB接口由于具有可以热插拔、标准统一、可以连接多个设备等特点,在现代电子系统中有了广泛的应用。目前,USB设备可以用来传输音频、视频、传感器信息、以及进行设备升级等功能。
USB设备实现传输数据功能的前提是设备枚举成功,只有设备枚举成功了,PC才知道如何加载设备驱动。因此,USB设备的成功枚举是实现其他功能的前提条件。但是目前的USB设备与PC机连接后,并未进行枚举检测,严重影响USB设备的稳定性。
发明内容
本发明提供了一种USB设备枚举检测方法,在不增加外围电路的情况下实现USB设备的枚举检测,提高了USB设备的稳定性。
为解决上述技术问题,本发明采用下述技术方案予以实现:
一种USB设备枚举检测方法,包括下述步骤:
(1)进入bootloader区域;
(2)在bootloader区域内检测失败标志位是否小于设定值;
若否,则执行步骤(3):进入updater区域,对app区域升级固件;
若是,则执行步骤(4):进入app区域,检测接收到的设置配置请求的配置值是否非0;
若否,则执行步骤(5):判定枚举失败,将失败标志位加1,返回步骤(1);
若是,则执行步骤(6):判定枚举成功,将失败标志位清零。
进一步的,在步骤(3)中,还包括下述步骤:对app区域升级固件成功后,将失败标志位清零,复位设备,返回步骤(1)。
又进一步的,在步骤(4)中,在检测接收到的设置配置请求的配置值是否非0之前,所述方法还包括下述步骤:检测是否接收到设置配置请求;若否,则执行步骤(5);若是,则检测接收到的设置配置请求的配置值是否非0。
更进一步的,所述设定值为2~4。
一种USB设备枚举检测系统,包括:失败标志位判断模块,用于在bootloader区域内检测失败标志位是否小于设定值;升级模块,用于在检测到失败标志位不小于设定值时,进入updater区域,对app区域升级固件;设置配置请求判断模块,用于在检测到失败标志位小于设定值时,进入app区域,检测接收到的设置配置请求的配置值是否非0;累加模块,用于在配置值为0时,判定枚举失败,将失败标志位加1;枚举成功判定模块,用于在配置值非0时,判定枚举成功,将失败标志位清零。
进一步的,所述升级模块还用于:对app区域升级固件成功后,将失败标志位清零,复位设备。
又进一步的,所述设置配置请求判断模块,具体包括设置配置请求判断单元和配置值判断单元;所述设置配置请求判断单元,用于在检测到失败标志位小于设定值时,进入app区域,检测是否接收到设置配置请求;所述配置值判断单元,用于在接收到设置配置请求时,检测接收到的设置配置请求的配置值是否非0;所述累加模块,还用于在没有接收到设置配置请求时,判定枚举失败,将失败标志位加1。
更进一步的,所述设定值为2~4。
一种基于上述USB设备枚举检测方法的固件升级方法,所述固件升级方法包括:在装置利用USB设备进行固件升级之前,首先采用所述的USB设备枚举检测方法来检测USB设备是否枚举成功;若枚举成功,则利用USB设备对装置进行固件升级。
一种基于上述的USB设备枚举检测系统的固件升级系统,所述固件升级系统包括:所述的USB设备枚举检测系统,用于在装置利用USB设备进行固件升级之前,检测USB设备是否枚举成功;USB固件升级模块,用于在USB设备枚举成功后,利用USB设备对装置进行固件升级。
与现有技术相比,本发明的优点和积极效果是:本发明的USB设备枚举检测方法和系统及固件升级方法和系统,通过在bootloader区域内检测失败标志位是否小于设定值,在不小于设定值时进入updater区域,对app区域升级固件;在小于设定值时进入app区域,检测接收到的设置配置请求的配置值是否非0;若为0,则判定枚举失败,将失败标志位加1,重新进入bootloader区域;若非0,则判定枚举成功,将失败标志位清零;因此,本发明可以在不增加外围电路的情况下,实现USB设备的枚举检测,USB设备可以自测是否枚举成功,从而有效提高了USB设备的稳定性,避免USB设备连接到主机上后出现无USB功能的情况。
结合附图阅读本发明的具体实施方式后,本发明的其他特点和优点将变得更加清楚。
附图说明
图1是本发明提出的USB设备枚举检测方法的一个实施例的流程图;
图2是本发明提出的USB设备枚举检测方法的另一个实施例的流程图;
图3是本发明提出的USB设备枚举检测系统的一个实施例的结构示意图;
图4是本发明提出的固件升级方法的一个实施例的流程图;
图5是本发明提出的固件升级系统的一个实施例的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下将结合附图和实施例,对本发明作进一步详细说明。
USB设备连接到主机(如PC)上,主机一旦获悉有设备连接,主机就会发送一系列的请求给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道。然后主机以控制传输的方式,通过端点0对设备发送各种请求,设备收到主机发来的请求后回复相应的信息,进行枚举操作。所有的USB设备必须支持标准的USB控制请求。
枚举就是主机从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。任何USB设备在连接到USB接口后,主机检测到有新设备接入,会利用不同的请求命令(Request)查询该设备的属性,设备通过不同的描述符向主机报告自己的情况,包括设备的种类,设备的功能,设备具有的端点数量以及其他工作属性等等。在了解这些信息之后,主机就可以根据需要分配USB工作带宽以及设备驱动。
标准的USB设备枚举过程需要经过以下几种状态的转换:连接—上电—默认—地址—配置。在USB设备正常工作以前,设备必须被正确配置。从设备的角度来看,配置包括一个将非零值写入设备配置寄存器的操作。主机通过发送Set_Configuration请求来正式确定选择设备的哪个配置(Configuration)作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态(Configured),说明设备枚举成功,可以进行下一步工作。
Set_Configuration请求的格式如下所示:
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
00000000B |
SET_CONFIGURATION |
Configuration Value |
Zero |
Zero |
None |
其中,bRequest=0x09,wValue的第一个字节为配置值,当该配置值与USB设备的某个配置描述符中的配置编号一致时,表示选中该配置,该配置值通常为1,因为大多数USB设备只有一种配置,配置编号为1;如果该配置值为0,则会让设备退出配置状态。设备只有在收到非0的配置值,才能说明枚举成功。
下面,通过一个具体的实施例,对本实施例的USB设备枚举检测方法进行具体说明。
本实施例的USB设备枚举检测方法,主要包括下述步骤,参见图1所示。
步骤S1:进入bootloader区域。
在USB设备的FLASH中,包括三个区域:bootloader区域、updater区域、app区域。在bootloader区域内放置有bootloader程序,用于开机引导;在updater区域内放置有updater程序,用于升级;在app区域内放置有app程序,用于实现USB设备的功能。
步骤S2:在bootloader区域内检测失败标志位是否小于设定值。
USB设备连接主机后,进入bootloader区域,在该区域检测失败标志位是否小于设定值。
若否,说明失败标志位≥设定值,即枚举失败次数≥设定值,则执行步骤S3:进入updater区域,对app区域升级固件。在本实施例中,对app区域升级固件成功后,将失败标志位清零,复位USB设备,返回步骤S1,再次进行枚举检测,以提高USB设备的枚举检测成功率。
若是,说明失败标志位<设定值,则执行步骤S4:进入app区域。
步骤S5:在app区域内,检测接收到的设置配置请求的配置值是否非0。
USB设备进入app区域后,在app区域内检测主机发送的设置配置请求(Set_Configuration请求)的配置值(wValue的第一个字节)是否非0。
若否,说明配置值为0,则执行步骤S6:判定枚举失败,将失败标志位加1,复位USB设备,返回步骤S1。
若是,说明配置值非0,则执行步骤S7:判定枚举成功,将成功标志位设置为1,将失败标志位清零。
失败标志位和成功标志位均保存在USB设备的RAM中。枚举成功后,USB设备可以继续执行其他功能。
本实施例的USB设备枚举检测方法,通过在bootloader区域内检测失败标志位是否小于设定值,在不小于设定值时进入updater区域,对app区域升级固件;在小于设定值时进入app区域,检测接收到的设置配置请求的配置值是否非0;若为0,则判定枚举失败,将失败标志位加1,重新进入bootloader区域;若非0,则判定枚举成功,将失败标志位清零;因此,本实施例的USB设备枚举检测方法,可以在不增加外围电路的情况下,实现USB设备的枚举检测,USB设备可以自测是否枚举成功,从而有效提高了USB设备的稳定性,避免USB设备连接到主机上后出现无USB功能的情况。
作为本实施例的另一种优选设计方案,在执行步骤S5之前,所述方法还包括下述步骤,参见图2所示。
S51:检测是否接收到设置配置请求。
USB设备进入app区域后,在app区域内检测是否接收到主机发送的设置配置请求。
若否,说明USB设备没有接收到主机发送的设置配置请求,则直接执行步骤S6:判定枚举失败,将失败标志位加1,复位设备,返回步骤S1。
若是,则执行S5:在app区域内,检测接收到的设置配置请求的配置值是否非0。
通过设计上述S51,在没有接收到主机发送的设置配置请求时,直接执行步骤S6,以缩短检测时间,只有在接收到设置配置请求时,才步骤执行S5。
在本实施例中,设定值为2~4。通过选择上述范围,既避免取值过小导致USB设备频繁进入updater区域,影响USB设备的正常运行;又避免取值过大导致USB设备不易进入updater区域,无法升级固件。在本实施例中,设定值优选为3。即,若失败标志位≥3,则进入updater区域,对app区域升级固件;若失败标志位<3,则进入app区域,检测配置值是否非0。
本实施例的USB设备枚举检测方法,通过检测USB标准请求指令交互(设置配置请求指令),从而建立一种判断USB设备是否枚举成功的方法,该方法可以在不增加外围电路的情况下有效的提高USB设备的稳定性,即:当设备自测到枚举失败次数大于等于设定值时,自动进行升级。
本实施例的USB设备枚举检测方法,针对基于标准的USB协议实现的设备,提出一种可以快速检测USB设备是否枚举成功的方法。即通过检测主机与USB设备之间的usb指令交互,从而判断设备是否枚举成功。如果设备枚举成功,在RAM中写一成功标志位,如果设备枚举失败,再复位设备进入bootloader区域并在RAM中写以失败标志位,设备重新进行枚举,若是枚举了设定值(如3次)均失败,设备进入升级模式,重新进行升级固件。
本实施例的USB设备枚举检测方法,适用于标准的USB设备,包括UAC设备、CDC设备、HID设备、UVC设备、USB 耳机、USB音响、PC VR等,这些设备基于标准的USB协议实现。
基于上述USB设备枚举检测方法的设计,本实施例还提出了一种USB设备枚举检测系统,参见图3所示,USB设备枚举检测系统包括:
失败标志位判断模块,用于在bootloader区域内检测失败标志位是否小于设定值;
升级模块,用于在检测到失败标志位不小于设定值时,进入updater区域,对app区域升级固件;
设置配置请求判断模块,用于在检测到失败标志位小于设定值时,进入app区域,检测接收到的设置配置请求的配置值是否非0;
累加模块,用于在配置值为0时,判定枚举失败,将失败标志位加1;
枚举成功判定模块,用于在配置值非0时,判定枚举成功,将失败标志位清零。
在本实施例中,所述升级模块还用于:对app区域升级固件成功后,将失败标志位清零,复位设备。
在本实施例中,所述设置配置请求判断模块,具体包括设置配置请求判断单元和配置值判断单元;具体来说:
所述设置配置请求判断单元,用于在检测到失败标志位小于设定值时,进入app区域,检测是否接收到设置配置请求;
所述配置值判断单元,用于在接收到设置配置请求时,检测接收到的设置配置请求的配置值是否非0;
所述累加模块,还用于在没有接收到设置配置请求时,判定枚举失败,将失败标志位加1。
在本实施例中,所述设定值为2~4。
具体的USB设备枚举检测系统的工作过程,已经在上述USB设备枚举检测方法中详述,此处不予赘述。
本实施例的USB设备枚举检测系统,通过在bootloader区域内检测失败标志位是否小于设定值,在不小于设定值时进入updater区域,对app区域升级固件;在小于设定值时进入app区域,检测接收到的设置配置请求的配置值是否非0;若为0,则判定枚举失败,将失败标志位加1,重新进入bootloader区域;若非0,则判定枚举成功,将失败标志位清零;因此,本实施例的USB设备枚举检测系统,可以在不增加外围电路的情况下,实现USB设备的枚举检测,USB设备可以自测是否枚举成功,从而有效提高了USB设备的稳定性,避免USB设备连接到主机上后出现无USB功能的情况。
基于上述USB设备枚举检测方法的设计,本实施例还提出了一种固件升级方法,包括下述步骤,参见图4所示。
步骤S21:采用所述的USB设备枚举检测方法来检测USB设备是否枚举成功。
若是,说明USB设备枚举成功,则执行步骤S22:利用USB设备对装置进行固件升级。
若否,则提示USB设备枚举失败,不对装置进行固件升级。
因此,本实施例的固件升级方法,在装置连接上USB设备之后、利用USB设备进行固件升级之前,首先采用所述的USB设备枚举检测方法来检测USB设备是否枚举成功;若枚举成功,则利用USB设备对装置进行固件升级,以提高固件升级的成功率和可靠性。
因为USB设备枚举成功是装置固件升级的前提条件,因此,加入USB设备枚举检测可以提高装置固件升级的成功率。
基于上述固件升级方法和USB设备枚举检测系统,本实施例提出了一种固件升级系统,参见图5所示,所述固件升级系统包括:
所述的USB设备枚举检测系统,用于在装置利用USB设备进行固件升级之前,检测USB设备是否枚举成功;
USB固件升级模块,用于在USB设备枚举成功后,利用USB设备对装置进行固件升级。
本实施例的固件升级系统,在装置利用USB设备进行固件升级之前,采用所述的USB设备枚举检测系统来检测USB设备是否枚举成功;若枚举成功,则利用USB设备对装置进行固件升级,以提高固件升级的成功率和可靠性。
以上实施例仅用以说明本发明的技术方案,而非对其进行限制;尽管参照前述实施例对本发明进行了详细的说明,对于本领域的普通技术人员来说,依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本发明所要求保护的技术方案的精神和范围。