引导加载器支持产品固件的现场更新。引导加载器可使用UART、I2C、SPI或USB等常见通信接口更新固件,而引导加载器主机和目标之间通常采用有线连接方式。在蓝牙到串行适配器的帮助下,这个引导加载操作能通过无线方式实现。如果目标所处的位置难以物理地访问,或者目标位于密封设备内,那么这种无线连接功能就会特别有用。
使用引导加载器的第一步就是配置产品,让引导加载器(而不是应用)去执行。一旦引导加载器运行,主机就会通过通信通道发送“start bootload”命令。如果引导加载器发出“OK”回应,那么就会开始引导加载。在引导加载期间,主机读取新应用文件,将其解析为闪存写入命令,并发送命令到引导加载器。在整个文件发送后,引导加载器会确认文件完整性,并发送控制到新应用。
采用蓝牙到串行适配器的无线引导加载过程可在任何支持UART引导加载器的目标上进行,无需使用蓝牙串行端口配置文件(SPP)对运行在目标设备上的主机或引导加载器固件进行任何修改。蓝牙配置文件是指定蓝牙设备一般行为的蓝牙核心规范上额外的协议,可用于支持蓝牙设备与其它具有相同配置文件的设备进行通信。
SPP基于仿真RS-232串行端口的射频通信(RFCOMM)协议,它定义了如何设置两个设备之间的虚拟串行端口,如何利用蓝牙互联。支持蓝牙功能的PC能连接到目标侧的蓝牙串行适配器,并进行引导加载操作。引导加载命令可通过发送串行命令到当前运行在目标器件上的应用而实现无线触发。
引导加载器
引导加载过程会通过标准通信接口更新嵌入式系统的固件。主机可以是带引导加载器主机应用工具的PC,也可以是另一个微控制器。引导加载器是加电启动或系统重设后将要执行的第一行代码。引导加载器会预编程到微控制器中,与主机通信,并获得新的应用镜像,将其写入微控制器的内部闪存。在引导加载操作成功后,微控制器会开始执行新的应用固件。如果没有从主机接收到新的应用,那么引导加载器会执行微控制器中现有的应用。
应用固件镜像的格式取决于使用的微控制器。举例来说,PSoC控制器使用.cyacd(应用代码和数据)作为引导加载应用的格式。如果采用标准的蓝牙到串行适配器,那么我们可在支持UART引导加载器的目标器件上无线执行同样的引导加载操作。
在利用蓝牙到串行适配器进行无线引导加载的情况下,基本的引导加载操作保持不变。不过,我们需要在主机和目标器件之间建立虚拟串行连接,通过蓝牙无线发送应用镜像。SPP定义了如何设置虚拟串行端口和两个蓝牙设备的互联,随后允许设备进行RS232(或类似的)串行线缆仿真。这种配置文件涵盖的情境能支持传统应用,这里蓝牙作为线缆连接的替代,使用虚拟串行端口抽象。利用SPP,互联设备发送和接收数据就像互联的RX和TX线路一样。
图1显示了SPP中使用的协议和实体。基带、LMP和L2CAP是OSI 中的第1层和第2层蓝牙协议。RFCOMM是蓝牙版GSM TS 07.10标准,GSM手机用它在一个物理串行线缆上多路复用多个流,为串行端口仿真提供通信协议。SDP是蓝牙服务发现协议,支持蓝牙设备发现其它蓝牙设备提供的服务和相关参数。
图1:配置文件协议栈包括SPP使用的不同协议和实体。
就使用SPP的无线引导加载而言,两侧运行的应用为PC上的引导加载器主机应用或主机微控制器上的UART接口以及目标系统上的UART引导加载器。
Bluefruit EZ-Link模块或JY-MCU模块等标准蓝牙到串行适配器能配对具备蓝牙功能的计算机,并显示为串行COM端口。将蓝牙模块和PC配对后,设备管理器中会列出两个串行COM端口。之所以会出现这种情况,是因为蓝牙串行端口是基于RFCOMM,与物理串行端口不同,它在建立蓝牙虚拟连接时同时需要服务器和客户端。
设备管理器中列出的一个端口是入站端口(服务器),另一个则是出站端口(客户端)。然而,用其中一个串行端口建立连接后,它就是双向的。如果PC发起与蓝牙模块的连接,则使用出站端口。如果蓝牙模块发起连接,则使用入站端口。对于目标系统的无线引导加载而言,必须使用出站端口,因为PC是主机,它必须发起与蓝牙模块的连接。
蓝牙模块必须连接到运行UART引导加载器的目标系统上的UART接口。举例来说,在关闭电路板的USB到串行部分以无线引导加载PSoC 4的情况下,蓝牙模块可连接到CY8CKIT-049 PSoC 4原型设计套件。PSoC 4原型设计板易于使用,成本较低,能在主板兼容报头上提供PSoC 4微控制器的所有I/O引脚,从而支持快速原型设计,而且配套提供预编程的UART引导加载器。
蓝牙模块的波特率应匹配目标系统上引导加载器配置的波特率。大多数蓝牙模块支持AT命令来配置模块的波特率,这需要用到USB-UART桥接器或配备UART接口的微控制器。PSoC 4原型设计板的USB-串行器件部分也可利用AT命令配置蓝牙模块的波特率。引导加载器主机应用工具则用蓝牙虚拟串行端口来无线执行引导加载操作。图2给出了主机和目标系统的系统级方框图。
图2:系统级方框图显示主机和目标系统的不同组件。
如果引导加载器主机是另一个微控制器,那么无线引导加载程序仍会在其它蓝牙到串行适配器(连接到主机微控制器UART接口)的帮助下进行。对于不支持蓝牙的PC而言,标准的USB蓝牙收发器可用来建立蓝牙模块连接。
成功引导加载后,目标系统会开始执行新的应用。如果需要引导加载另一个新应用,那么目标系统必须重启,以再次启动引导加载器。如果应用调用引导加载器,就能避免这一过程。引导加载的应用响应于某种外部事件,如按下按键或主机发出的具体数据命令,从而再次启动引导加载操作,在目标系统上载入新的应用。
此外,低功耗蓝牙(BLE)模块也可用于无线引导加载。与传统蓝牙不同的是,低功耗蓝牙不使用SPP。不过,对于低功耗蓝牙而言,所有配置文件和服务支持全部位于应用空间内。产品开发人员能在通用属性配置文件(GATT)基础上开发自己的串行端口服务,满足BLE模块需求,并将其用于无线引导加载。
引导加载器的设计考虑因素:
稳健可靠的引导加载器应当能够检测、报告并有效处理无线引导加载过程中出现的错误,如传输过程中的数据包丢失、数据损坏和闪存写入错误等。通过存储应用的校验和或循环冗余码(CRC),可以执行闪存错误校验。在引导加载操作开始后,位会被清空。如果应用成功下载并安装,就会更新。举例来说,如果在引导加载时断电,那么在重启时引导加载器应检测无效的校验位,而且不会让部分加载的应用获得控制权,而是等待主机启动新的引导加载操作。
一旦新应用实现引导加载,那么引导加载器必须确认引导加载镜像是否有效,并让新应用获得控制权。引导加载器还应当能检查闪存中的自身镜像,判断其是否有效。另一个重要考虑因素是避免应用覆盖引导加载器本身。如果引导加载器损坏或被应用覆盖,那么系统就无法工作,需要对系统的引导加载器进行重新编程。为了避免这种情况,闪存的引导加载器区域必须进行保护,避免引导加载器代码被意外覆盖。
引导加载器设计的另一个重要考虑因素就是何时开始与主机通信。在确认应用有效后,引导加载器可等待一定时间让主机开始新的引导加载操作。如果等待时间过短,主机可能还无法可靠启动通信。如果等待时间过长,产品的整体启动时间就会太长。与引导加载新应用时避免设备重启的解决方案类似,这个时序问题可通过让应用调用引导加载器进行解决。
为了确保目标系统无错误,我们可用多应用引导加载器在闪存中存储多个应用镜像。如果引导加载器检测到某个应用镜像被损坏,那么引导加载器能跳到另一个应用镜像。能够保存的应用数量取决于目标系统的闪存大小。
此外,引导加载器中还可包含简单的调试功能,可用UART接口和Tera Term等终端仿真程序实现,从而在PC上显示调试信息。调试信息还能用相同的蓝牙到串行调试器无线发送。
定制引导加载器主机工具:
不同微控制器可直接使用标准的引导加载器主机工具应用,无需对SPP的无线引导加载进行任何修改。然而,引导加载器主机工具可以进行定制,从而更好地满足无线引导加载需求,并嵌入终端仿真器窗口,以查看调试信息,甚至能通过SPP无线发送具体数据来从应用中调用引导加载器。图3显示了具有嵌入式终端仿真器窗口的定制引导加载器主机工具应用实例。为充分利用终端仿真器,引导加载到目标系统的任何新应用都必须包含UART接口,并能在主机向目标系统发送具体数据时调用引导加载器。UART接口可在引导加载器和应用之间共享。
图3:具有嵌入式终端仿真器窗口的定制引导加载器主机工具应用实例。
如果采用稍微复杂的多应用引导加载器设计,我们也能利用SPP从主机向目标系统无线发送不同消息,从而在闪存中切换存储的多个应用,这就能节约新应用引导加载所需的时间。