黄学达,杨俊杰,侯志鹏,黄俞霖,章世博
(重庆邮电大学 自动化学院,重庆 400065)
传统USB Mass Storage类的设备俗称U盘,是即插即用装置,使用现有的“标准”设备驱动程序,无须安装任何设备驱动即可用于所有系统运行。当操作系统检查到USB装置插入时,就会自动询问该装置相关参数以了解其能力和要求,并自动将适合的驱动程序加载到操作系统中,用户就可以正常使用该设备。当该设备从USB接口拔出时,操作系统就会自动停止该设备的使用并卸载其驱动程序。USB装置与其内部存储的软件(固件)一起销售,用于控制该装置(即下位机)的运行,其一般采用通用的标准驱动程序,只对PC端(上位机)下发的读取、写入、擦除等相关标准命令作出响应。
USB接口在PC及消费电子等领域普及率高,因此该种传输方式应用范围很广泛。但也存在以下缺点:传统USB Mass Storage类设备只能满足简单的数据传输需求,不能支持其他扩展命令(如嵌入式调试设备常用的调试命令)传输等功能;在数据传输过程中如果出现意外中断(如U盘意外复位、断电等情况),数据传输命令在U盘重新连接后无法继续执行。
4G、5G手机和相关终端模块以及Cat1、eMTC、NB-IoT等通信终端在出厂前必须要对射频参数进行校准、综测,射频参数的校准、综测指标主要有APC(自动功率控制)、AGC(自动增益控制)、AFC(自动频率控制)等,耗时大约2~3 min。通信终端校准、综测的硬件接口一般采用USB接口,使用夹具顶针的方式去接触电路板上的测试点,从而完成信号的连通。在实际的工厂校准、综测过程中若存在通信终端设备异常断电或者USB松动,就会导致校准、综测失败。为了提高效率,需要在USB接口重新插好后继续从上次中断的地方进行射频参数的校准和综测。
本文研究的主要目的是:针对下位机在未执行上位机命令而掉电的情况,提供一种在下次上电时使其继续执行未完成操作的方案。
USB Mass Storage设备采用FLASH进行数据存储,FLASH具有在掉电后数据不会丢失的特点。通过上位机在USB Mass Storage设备中划分出命令交互区等,供异常断电恢复后去判断是否需要继续执行上次未执行完的操作。
本方案的主要思想是采用先存储命令(含命令所需数据)然后再执行命令的方式。具体实施方案由在PC侧运行的上位机软件部分和与之通过USB口连接且以Mass Storage类枚举到PC的下位机完成。在U盘中设置特定的命令和数据交互区(A区和B区),如图1(基本型)和图2(扩展模式)所示,上位机发送给下位机的所有命令,包括标准的USB读写命令以及扩展命令,都使用标准USB写命令数据包发送到A区,实际的命令作为数据封装到USB标准数据包中;USB设备将接收到的包含命令的数据包写入A区指定地址,并定时查询A区数据,如果查询到A区中存在命令,解析命令并执行,完成后将A区中的命令改写为命令响应。
图1 上下位机的命令和数据交互区分布图(基本型)
图2 上下位机的命令和数据交互区分布图(扩展型)
USB设备上电枚举成功后,上位机读取A区中的数据,如果是响应包,则发送新命令;如果不是响应包,则等待USB设备执行A区中的命令。将上位机给下位机的命令写入命令交互区的格式如图3所示,而当命令执行完成后下位机写入命令交互区的格式如图4所示,各个“保留区间”作为数据保护及今后功能扩展使用;数据区格式如图5所示。根据上述方式扩展而来的衍生型多个命令/响应包组合写入、响应方式如图6、图7所示,对应多个命令/响应包的数据区格式如图8所示。
图3 命令交互区(A区)的命令包格式(基本型)
图4 命令交互区(A区)的响应包格式(基本型)
图5 数据区格式(基本型)
图6 命令交互区(A区)的命令包格式(扩展型)
图7 命令交互区(A区)的响应包格式(扩展型)
图8 数据区格式(扩展型)
完成整个功能时,将用户下发的各种操作转换为下位机支持的对应命令或命令集,同时对用户的操作对象(一般是各种数据)进行拆包、分段等预处理操作;
(3)命令包、数据包打包组装单元:以规定方式将命令执行码、命令执行起始地址、命令执行长度及数据文件分别打包成有效的命令包、数据包;
(4)响应包及响应数据解析处理单元:将获取到的响应
由于普通的Mass Storage类设备只能对上位机(PC)的读取、写入、擦除等操作命令进行对应命令响应,无法满足对U盘约定偏移地址的命令交互区参数及数据交互区数据的读/写操作要求,因此下位机需要额外使用本方案的功能支持模块(软件或硬件方式)来实现上述功能;同样上位机需要运行一个额外的软件或软/硬件模块来支持该功能。如图9所示为添加了上下位机功能支持模块的结构框图。新增模块的内部各功能单元结构框图如图10所示。
图9 本方案功能支持模块的上下位机结构框图
图10 上下位机功能支持模块的内部子模块框图
1.2.1 上位机功能支持模块
上位机功能支持模块的功能如下:
(1)界面显示、用户操作响应单元:对用户执行的各种操作进行响应,以及对命令执行进度、结果进行显示,同时也为各种设置选项提供输入接口;
(2)用户操作命令或命令集转换单元:当单个命令无法信息按规定方式拆包、解析,判断命令执行的响应结果,提取响应数据,并在需要的情况下对响应数据重新组包、恢复成超大数据包传回给上位机;
(5)命令数据缓存及执行结果记录单元:记录当前USB设备的ID号及其在命令执行时缓存本条命令的命令包、数据包信息,并随时记录该命令的执行情况,以便当本条命令执行失败时,上位机能够重新下发该命令或完成上次操作未完成的响应数据获取工作;
(6)A/B区数据读写单元:完成对指定偏移地址的A/B区数据的读写功能;
(7)命令执行流程维护单元:对以上单元的功能执行情况进行判断维护,判断当前命令是否执行失败、是否重新执行当前命令、是否需要提示用户干预操作以及通过USB的ID判断当前USB设备是否有上次未完成的操作等。
1.2.2 下位机功能支持模块
下位机功能支持模块的功能如下:
(1)A/B区数据读写单元:完成对指定偏移地址的A/B区数据的读(获取命令包)/写(写入响应包)功能,特别是以固定时间间隔轮询A区数据,以便随时获取上位机下发的命令;
(2)命令包、数据包解析及有效性判断单元:以规定方式将命令包、数据包进行解析,并判断其有效性及是否支持该命令等;
(3)命令执行单元:将命令包里的命令执行码转换为对应的一系列下位机操作过程,并使用数据包里的数据来具体执行该操作;
(4)响应包及响应数据组装单元:将由命令执行单元执行后的结果以执行响应码及响应数据的方式分别打包成命令执行响应包及响应数据包以便向A/B区写入。
上位机和下位机的具体实现以基本型命令执行过程为例进行详细描述。
上位机下发命令执行流程如图11所示,上位机在下发新命令之前会先通过USB的ID号判断USB设备是否有上次未执行完的操作,如果没有,则按照正常流程分别根据用户的操作情况生成命令执行码及对应数据,再按照规定组装成命令包、数据包,并经过上位机缓存记录后分别写入对应的A/B区,即完成本条命令的下发过程。在命令下发后,上位机就不停地查询A区数据,以判断是否有下位机执行完成的响应包写回;在规定时间内获取响应包及响应数据后,上位机就进行解包及命令执行结果判断等工作。至此本条命令交互流程就完成了,上位机可以进入下一条命令的下发交互流程。如果以上任意流程执行失败或下位机写回响应包超时,该条命令将会标记为执行失败,可以根据设置情况重新下发命令、暂停命令执行流程或要求用户干预。
图11 上位机下发命令执行流程
如果当前USB设备的上次命令未执行完成,上位机会读取下位机A区的数据,并判断其是否为上次命令的正常响应包,如果是,就将该响应包及响应数据获取回来,以便完成上次遗留的命令交互过程,然后再进行新命令的下发操作;如果不是响应包而是命令包,说明上次命令的响应包还未被下位机写入,在判断A/B区数据与缓存数据一致的情况下,上位机在等待下位机将该命令执行完并写入响应包、响应数据包后,再获取响应数据,以便完成上次未完成的命令,然后再发新命令。如果上位机发现A/B区数据与缓存数据不一致,将重写A/B区以便上次的命令能够正确执行,再进行上述操作。
下位机模块对于本方案的基本型命令执行流程如图12所示。下位机均为以一定时间间隔轮询A、B区的信息,以便及时判断上位机是否有新命令下发。在获取到上位机写入的命令包后,确认命令包及数据包有效的情况下就会加载数据并执行该命令执行码对应的操作,再把执行结果(响应包及响应数据)写入指定地址中,从而完成一个命令码的执行过程。
图12 下位机接收命令并执行的流程
如果下位机检查到A/B区数据不是合法的命令/数据包,可能为上次命令执行后写入的正常响应包,或被破坏的命令/数据包,就不会执行任何操作,会等待一定时间再查询A/B区数据,以便让上位机读取响应数据或在上位机重新下发正确的命令和数据包后才继续命令执行过程。
按照上述方式,即使在下位机出现异常掉电、干扰等复位情况,也会在上电完成PC的枚举识别后,先检查A区是否存在有效的命令包,如果存在,则说明上次断电前该命令未执行完成,下位机就会重新执行该命令,并会用执行完成后的响应包及数据覆盖写入到对应的A区、B区,以标志该命令执行完成。因此,本套机制对于异常掉电后的上电状态仍旧适用。
本方案扩展型的命令执行过程与基本型的基本原理一致,只不过上位机可以一次性下发多个命令及对应数据,而下位机则可以依次执行对应命令并写回对应命令的命令执行响应包及响应数据包执行结果。根据实际使用需求可以每执行完成一步就写回该步的执行结果,或整个命令集执行完成后再统一把每步的响应写入对应位置,确保了需要多次命令操作才能够执行完成某一功能的命令集合在掉电、异常重启等情况下的执行有效性。
对于标准命令,将其含有命令、数据、校验等信息的整个标准命令包作为数据包发送到B区,然后发送一条扩展命令到A区,标示该B区的数据为标准命令包,USB设备解析到该扩展命令后,即可从B区完整地取出该标准命令包,再按原有的标准命令执行功能执行该命令。
本文实现了一种确保下位机在未执行上位机命令而掉电后,仍旧能够在下次上电继续执行未完成操作的方案。设计方案覆盖了基本型和扩展型两种操作方式,对命令包格式和响应包格式进行了相应的描述。本方案可以确保Mass Storage类下位机对各类命令执行的可靠性,即使在掉电或受异常干扰中断命令执行后也能够在下次上电继续执行未完成命令,特别适合数据操作要求高、传输量大、USB连接不可靠的场合。
在国内某手机芯片厂家的Cat1模块实际生产射频参数的校准、综测中,采用了本文的技术方案后,因夹具或者工人操作导致的USB Mass Storage类设备异常断电并重新上电后,可以继续在上次中断的地方进行校准、综测,而不用重新开始,大大节约了继续校准、综测的时间,提高工作效率。
本文的技术方案不但可以用于通信终端的射频参数校准、综测环节,还可以运用于任何有如下要求的Mass Storage类设备:当遇到异常断电并重新上电后需要继续执行上次中断地方的程序。