基于S12G CAN总线通信的独立NVM驱动安全bootloader设计
摘要:本文针对传统汽车ECU CAN总线通信bootloader将NVM驱动放置在MCU片上Flash, 存在程序跑飞进入NVM驱动时造成NVM数据丢失,从而出现ECU功能丢失或工作异常的问题,提出一种独立NVM驱动的安全bootloader设计,并在NXP的S12G128上实现。
本文引用地址:http://www.amcfsurvey.com/article/201607/294705.htm引言
CAN总线因其良好的差分通信抗干扰能力而被广泛应用于汽车ECU通信。bootloader是MCU上电或复位之后最先运行的一段永久驻留于MCU 片上NVM (Non-Volatile Memory,非易失性存储器) 中的一段极小的程序,完成与PC上位机通信,下载、解析并存储应用程序到ECU的非易失性存储器,从而完成应用程序的在线升级[1]。以往的bootloader设计将NVM的驱动程序放在片上Flash中,当程序跑飞进入NVM驱动时就会造成NVM数据丢失,导致ECU功能丢失或工作异常。如果将NVM驱动程序编译到MCU RAM中,形成S19文件,与应用程序一起由CAN总线下载到RAM中运行而不将其储存在片上,则可以避免此类情况发生。
1 S12G128片上NVM资源及其独立驱动程序开发
S12G128片上NVM资源包括片上的4KB EEPROM和128KB P-Flash。由于S12内核中SP和PC寄存器都是16位宽,因此,其最大线性寻址范围为64KB。为了高效地访问大于64KB的P-Flash存储空间,Freescale提出了存储器分页访问机制,即通过0x8000~0xBFFF的16KB Flash窗口以存储器映射的方式对分页的Flash空间进行访问[2-3]。
1.1 S12G128片上NVM资源
S12G128的128KB P-Flash包括了从全局地址0x20000开始的8个连续16KB Flash页,其支持1/2/4/8/16KB的区域 (region) 保护 (Protection) 和 整个P-Flash的加密 (Secure) 。所谓保护是指不能被应用程序擦除和改写,这一功能在bootloader开发中常被用于保护bootloader程序自身不被应用程序修改。加密是针对BDM调试接口的,当S12G加密之后,外部调试器能够执行的唯一BDM命令就是整片擦除,要想解密,就得执行整片擦除命令将整个P-Flash上的数据清空或者输入8个字节的正确后门密钥 (backdoor key,位于局部地址0xFF00~0xFF07,全局地址0x3FF00~0x3FF07)。 从而有效的保护用户的软件知识产权[2]。
S12G128的片上4KB EEPROM,地址空间为0x400~0x13FF,位于CPU可以直接访问的局部地址[3]中,所有无需分页访问。其包含1024个4Byte的最小擦除和编程扇区(sector)并支持灵活的保护功能。S12G 128 的NVM都支持硬件ECC,能够自动纠正NVM数据的单比特错误和多比特检错。
1.2 S12G128 独立NVM驱动开发
NXP提供的S12系列MCU的标准软件驱动 (SSD—Standard Software Driver),包含运行时独立的源代码、S19文件,C数组以及静态库等形式的NVM驱动[5]。
本设计中使用标准软件驱动开发独立NVM驱动:首先,根据实际MCU型号配置SSD,make生成C数组形式的NVM驱动,将其整理在一个C文件中与SSD头文件一起添加到CodeWarrior工程中编译,并将各个NVM驱动函数地址放在位于地址0x3F80的数组中作为NVM驱动函数地址表。因为所有的NVM驱动函数数组和NVM驱动函数地址表都由C语言关键词const修饰,是数组常量,默认放在ROM_VAR段中,修改工程PRM链接文件,将ROM_VAR段放置在NVM_RAM段中即可将其编译到0x3000开始的RAM地址,得到S19文件,从中即可分离得到NVM驱动及其函数地址表的S19格式文件。具体的NVM驱动函数映射地址表及PRM链接文件如图1所示。
使用时,先将其加载在对应的RAM地址,然后用函数指针调用。
2 基于CAN总线的bootloader设计
基于CAN总线的bootloader设计包括运行在PC上的上位机软件和运行在目标MCU中的bootloader软件两部分。
2.1 PC上位机软件及通信协议设计
运行在PC上的上位机软件主要功能是读取目标MCU的应用程序S19文件,并调用USB转CAN总线适配器(Adapter),将其逐行下载到目标MCU,其软件设计软件设计流程图如图2所示。
本设计中,采用Visual C++调用WFC和武汉吉阳光电的-GY8507 USB转CAN适配器驱动,编写上位机软件。
上位机下载应用程序S19文件的CAN消息是ID为0x64的标准数据帧,而bootloader host程序应答上位机的CAN消息帧是ID为0xC8的标准数据帧,通信速率设置为500Kbit/s。因此在S12G初始化时将MSCAN模块的接收ID滤波器设置为只接收ID为0x64的标准帧,以避免总线上其他ECU的干扰。具体的CAN消息命令定义如表1所示。
2.2 bootloader软件设计
bootloader软件设计流程如图3所示。
MCU复位之后,进行系统初始化,配置系统时钟和MSCAN,使能CPU全局中断,然后等待上位机boot命令并检查是否超时:如果在规定的500ms内接收到了上位机请求进入boot的命令,则建立通信接收并解析得到行地址和字对齐的数据,接着判断S19行地址空间,若是Flash地址且是第一次收到Flash数据,则将除bootloader程序之外的所有片上Flash擦除;若为EEPROM地址且是第一次收到EEPROM数据,则将全部EEPROM擦除;若是RAM地址,则不可擦除。对Flash地址的数据,在编程到Flash之前,还须将解析结果中的逻辑地址转换为Flash驱动所需的线性连续物理地址,并将数据进行4字对齐,以提高编程效率。依次逐行接收,解析并将结果烧写到相应地址的片上Flash/EEPROM/RAM中,直至整个应用程序S19文件结束,最后复位外设、清除NVM驱动所在的RAM、关闭CPU全局中断,结束bootloader跳转至应用程序;如果在规定的500ms内未收到上位机通过CAN发来的进入boot命令,则直接关闭CPU全局中断,结束bootloader跳转至应用程序。
2.3 应用程序软件设计
应用程序设计时,需要保留bootloader所在的Flash空间并在系统初始化时设置IVOR=0xEF,将应用程序中断向量表偏移至0xEF80,使其与MCU复位后默认的中断向量表分开,从而执行不同的外设中断服务函数。
另外,需要将COP看门狗使能,在应用程序主循环中正常喂狗,而在MSCAN接收中断中对接收到的CAN消息ID进行判断,若接收到Boot ID,则不喂狗,让其溢出复位,从而进入bootloader。典型的应用程序软件设计流程图如图4所示。
3 bootloader和应用程序内存分配及处理器专家配置
在bootloader工程中使用CodeWarrior 5.1 IDE自带的内核和外设图形化配置和自动代码生成工具--处理器专家(Processor Expert)配置外部8MHz晶振作为PLL参考时钟,配置PLL倍频输出50MHz作为CPU运行时钟,其二分配得到的25MHz作为总线时钟频率;MSCAN通信速率为500Kbit/s,使能接收中断。配置0xF000~0xFEFF的3.8KB Flash作为bootloader存储空间,堆栈大小为256B,保留0x3000到0x3FFF的4KB空间作为NVM驱动代码的存储和运行空间并将其初始化为0。系统RAM空间为0x2000到0x2FFF。
在应用程序工程中,需要保留bootloader所在的Flash最后4KB空间,其余Flash空间全部可被应用程序使用;对于RAM空间,则全部8KB都可以被用户使用。而且必须保证其入口函数Entry_Point () 与bootloader中定义的应用程序入口地址相同 (因为使用处理器专家生成的工程中,默认从0xC000开始放置默认中断服务函数Cpu_Interrupt () 和汇编软件延迟函数Cpu_Delay100US (), 其分别占2个字节和12个字节,然后才放置MCU复位中断服务函数_EntryPoint () ,如果在处理器专家的CPU组件中未使能汇编软件延迟函数,则应将bootloader和应用程序中的应用程序入口地址由0xC00E改为0xC002 。
bootloader和应用程序的内存分配如图5所示。
使用处理器专家CPU组件的编译选项能够非常方便的完成上述内存分配并生成prm链接文件, bootloader内存分配处理器专家配置结果如图6所示。
生成相应的链接文件为:
SEGMENTS
RAM = READ_WRITE 0x2000 TO 0x2FFF;
ROM_C000 = READ_ONLY 0xC00E TO 0xEFFF;
NVM_DRIVER_RAM = READ_WRITE 0x3000 TO 0x3FFF FILL 0x00;
BOOT_ROM = READ_ONLY 0xF000 TO 0xFEFF;
END
PLACEMENT
_PRESTART,
STARTUP,
ROM_VAR,
STRINGS,
NON_BANKED,
DEFAULT_ROM,
COPY INTO BOOT_ROM;
DEFAULT_RAM INTO RAM, NVM_DRIVER_RAM;
APP_ROM_ENTRY INTO ROM_C000;
END
INIT _EntryPoint
STACKSIZE 0x0100
4. 总结
本文针对NXP公司的S12 (X) 系列MCU在汽车ECU应用中bootloader开发的实际需求,介绍了S12G128的片上NVM资源极其独立驱动开发,提出并实现了一种基于CAN总线通信将NVM驱动程序由上位机下载到RAM中运行而非让其驻留于MCU片上Flash的安全bootloader设计,有效避免了应用程序跑飞运行至驻留于片上Flash的NVM驱动代码所造成的程序/数据丢失失效。借助CodeWarrior 5.1 IDE的图形化外设配置和自动代码生成工具----处理器专家,便捷的实现了bootloader和应用程序的内存分配和片上外设配置。本设计提供完整设计工程和使用文档,在此基础上,根据整车厂的要求修改CAN报文boot ID和命令,并增加相应的UDP或者CCP协议栈即可快速开发出符合车厂要求的安全bootloader产品。
参考文献:
[1][德]康拉德·莱夫 .BOSCH汽车电气与电子, 中文第二版[M].孙泽昌,译,北京:北京理工大学出版社,,2014,8.
[2]孙同景. Freescale 9S12 十六位单片机原理及嵌入式开发技术[M].北京:机械工业出版社, 2008,7.
[3]AN3784.Understanding the Memory Scheme in the S12(X) Architecture, Application Note. NXP Semiconductor, http://www.nxp.com. 2009.
[4]MC9S12G Family Reference Manual, Rev.1.25. NXP Semiconductor, http://www.nxp.com. 2014.
[5]Standard Software Driver for MC9S12G / MC9S12VR User’s Manual, Rev.3.1. NXP Semiconductor, http://www.nxp.com. 2012.
本文来源于中国科技期刊《电子产品世界》2016年第7期第73页,欢迎您写论文时引用,并注明出处。
评论