离线加密编程器中的 BootLoader程序设计
扫描二维码
随时随地手机看文章
离线加密编程器是一种独立于PC机,并通过SPI接口直接对ATmega系列单片机进行编程操作的设备。在整个系统中,编程器与目标板之间的结合部分是一个最可能被解密的地方,因为可以通过抓取SPI总线上的时序得到所传输的数据,因此编程器与目标板之间传输的数据必须是经过加密的。而有效的编程数据不能为加密数据,所以加密数据需要经过解密还原才能用于单片机的编程。本设计中BootLoader程序的作用就是接收离线加密编程器的加密数据,对加密数据进行解密,然后完成目标板的编程操作。首先编程目标板单片机的BootLoaoler引导程序,最后与BootLoacler程序建立连接。编程器将加密数据传送给。BootLoader程序,由BootLoacler程序对加密数据进行解密,然后完成编程操作。这样做既可以确保数据不被外界破解,又能方便程序的升级操作。BootLoader程序的下载对具有知识产权保护要求的离线编程器设计是一个关键步骤,它的成功与否直接决定离线编程器设计能否成功。本文将以ATmegal69为例进行BootLoader程序下载的介绍。
1 系统硬件设计
本系统主要由单片机、显示部分、按键开关、存储部分和串行通信部分等组成,硬件结构框图如图1所示。
图1中,AVR ATmegal69P(V)单片机是一种高性能、低功耗的8位微处理器,采用先进的RISC结构,130条指令大多数可以在1个时钟周期内完成,满足了本系统对执行速度的要求。它具有非易失性的程序和数据存储器,16 KB的系统内可编程Flash,具有4×25段的LCD驱动器的ATmegal69P(V),输入电压3.3 V,串行US—ART,可工作于主机/从机模式的SPI串行接口;存储部分采用ATmel公司8个引脚的串口存储芯片AT45DB041B,主存容量大小为528 KB,一共2 048页,每页264B,具有2个大小为265B的数据缓存,允许通知对存储芯片进行读写,工作电压为3.3 V。由于系统单片机的SPI通信口用来对目标板进行编程,所以采用软件模拟SPI对AT45DB041B进行读写;其通信部分分为与PC机的通信和与目标板的通信。与PC机的通信采用USB接口,编程器内部采用UART—USB转换桥芯片PL一2303,在编程方式上等同于一个普通的UART接口,非常方便;与目标板的通信是通过高速的SPI接口,达到对目标板的编程操作;采用双键制按键开关,其中按键之一用来查询下载器的各种信息,另外一个按键用来启动对目标板的下载操作;为了充分利用ATmegal69P(V)具有LCD驱动器的特点,采用段式LCD屏,可以缩小下载器的体积,操作方便。
2 工作原理
2.1 几个概念
①开发方:设计IP的开发单位或个人。
②IP拥有方:拥有离线加密编程器的知识产权方。
③客户:离线加密编程器的使用者,需向IP拥有方购买离线加密编程器的各种软硬件资源。
2.2 三方关系
开发方负责开发离线加密编程器的各种软硬件,然后向IP拥有方提供各种所需的软硬件资源,包括编程器硬件、上位机软件,并且根据IP拥有方的要求编写目标板的程序。IP拥有方将软硬件卖给客户,客户使用IP拥有方提供的与编程器相关的软硬件对目标板进行编程操作。开发方提供给IP拥有方的适合目标板的程序是未经过加密的,IP拥有方通过上位机软件,自由选择加密参数,对未经过加密的程序进行加密。客户购买到离线加密编程器后,可以选择某一IP拥有方,并在选择的IP拥有方处进行注册。购买授权下载次数,通过客户端软件将加密编程器进行授权,此时,加密编程器具备了下载功能。客户根据自己的要求向自己注册过的IP拥有方提出目标板软件购买意向,IP拥有方将客户要求告知开发方,开发方根据要求进行软件的编写。软件编写成功后,开发方将软件交给IP拥有方,IP拥有方将软件进行加密,并交给客户,客户通过客户端软件将加密过的程序存储到加密编程器。此时,客户手中的加密编程器可以脱离PC机。客户将编程器带到现场对目标板进行编程,直到授权下载次数用完为止。授权次数使用完毕后,客户可以通过客户端软件提取加密编程器的授权购买请求文件,通过网络将文件传给IP拥有方,IP拥有方根据文件的内容进行相应的授权操作,然后将生成的授权文件通过网络回传给客户,客户通过客户端软件将授权文件下载到加密编程器,如果授权成功,那么编程器可以继续使用。
2.3 文件类型
整个工作过程涉及以下几种文件:
①加密下载文件:该文件是HEX文件经过加密后得到的文件,其中包含密钥信息和编程数据。
②注册申请文件:该文件包含申请注册所需编程器的内部信息及客户信息。
③注册文件:该文件是在注册申请文件的基础上,IP拥有方添加注册信息,包括各种参数。
④授权申请文件:该文件用来向IP拥有方购买授权下载次数,内容包括编程器信息、客户信息,以及交易达成的各种协议。
⑤授权文件:该文件在授权申请文件的基础上添加授权次数及说明。
注:其中注册申请文件、授权申请文件是通过客户端软件从编程器中提取的;注册文件、授权文件通过客户端软件下载到编程器。
3 编程器工作流程
编程器的工作流程如图2所示。下载到编程器的加密数据需要存入具有SPI接口的大容量外存AT45DB041B中,然而Atmegal69P(V)的SPI接口需要用来对目标板进行编程,所以只能采用软件模拟SPI接口来对AT45DB041B进行读写操作。对目标板进行编程时,为了防止通过抓取SPI接口的时序来得到有效的编程数据,首先编程目标板的引导程序,然后对目标板下载加密数据,通过引导程序对数据进行解密后再进行目标板的编程操作。这样做的好处是,通过数据加密,使得SPI总线上传输的数据均为加密信息,即使得到SPI总线上的时序,也不能使用。目标板的BootLoader程序将接收到的加密数据进行解密,然后将数据存储。这些操作都在单片机内部进行,不会被破解。
3.1 主程序
主程序要完成系统的初始化、中断设置、全局变量设置等。在初始化结束后,系统进入主查询循环过程以判断当前进行的操作,并进入相应的功能模块。系统主程序流程如图3所示。
3.2 编程器与目标板的通信
编程器通过SPI总线与目标板建立连接。当进行目标板的编程时,首先编程目标板的BootLoader区引导程序。引导区程序编程完毕后,编程器与目标板进行通信,将加密数据传送给目标板。目标板的BootLoader程序接收到加密数据后进行CRC校验。如果校验失败,Boot—Loader要求编程器重新发送数据;如果校验通过,对加密数据进行解密,然后写入Flash。编程器与目标板通信流程如图4所示。
4 BootLoader编程设计
4.1 BootLoader。介绍
BootLoader区位于单片机内部Flash的最高地址,BootLoader存储器空间的大小可以通过熔丝位进行配置。BootLoader为通过MCU本身来下载和上载程序代码提供了一个真正的同时读一写自编程机制(Read—While—Write,RWW)。这一特点使得系统可以在MCU的控制下,通过驻留于程序Flash的BootLoader,灵活地进行应用软件升级。BootLoader可以使用任何器件具有的数据接口和相关的协议获得代码并把代码(程序)写入闪存,或者是从程序存储器读取代码。BootLoader区的程序可以操作整个闪存,包括BootLoader区,因而BootLoader可以对其自身进行修改,甚至将自己擦除。如果系统已经不再需要BootLoader,则可以通过指令控制BootLoader程序,将BootLoader区擦除。
4.2 BootLoader区程序的设计思想
由于目标板上AVR单片机种类的不同,所包含的头文件也不尽相同,而且BootLoader区的大小也是根据目标板的不同而不同,所以存储芯片中BootLoader程序代码要满足当前主流的AVR单片机的需求。另外由于存储芯片容量大小的限制,要求引导程序要短小精炼。
编程BootLoader区的一个重要的内容是熔丝位的编程,熔丝位编程出错可能导致编程的失败。写SPIEN为“1”,导致编程器与目标板无法建立连接;写RSTDISBL为“O”,将导致复位引脚失效;写CKSEL熔丝位出错,将导致内外部晶振的选择混乱,从而导致编程失败。
BootLoader程序编程步骤:
①配置BOOTSZl和B00TSZ0熔丝位,设定Boot—Loader区的大小:
②配置BOOTRST熔丝位,芯片上电启动的设定从BootLoader区的起始地址处开始,即每次上电复位后,首先从BootLoader区起始位置开始运行。
③下载BootLoader程序的HEX文件。下载时要注意BootLoader区的起始位置。
④设置的Boot锁定位,保护BootLoader不被破坏,使其只能通过芯片擦除命令清除BootLoader区的程序。
5 BootLoader程序的下载
编程器外存中存储适合各种型号AVR单片机的BootLoader源代码。在下载BootLoader程序之前,首先在编程器外存中找到适合目标板单片机型号的Boot—Loader程序,然后下载到目标板。主要设计问题是数据的传输、熔丝位和锁定位的编程、Flash的读写。
5.1 实 例
本设计采用串行编程模式,串行接口包括RESET、SCK、MOSI(输入)及MISO(输出)四条线。当RESET为低电平时,可以通过串行SPI总线对Flash进行编程,应在执行编程或擦除操作之前执行编程使能指令。下面以ATmegal69为例,给出一个实际的程序。
首先对SPI接口进行初始化SPI_MasterInit(),并使能操作SPI_Enable(),然后擦除Flash页SPI_Erase(),进行Flash的页写操作program_bootloader(),再写熔丝位SPI_WriteFuse和写锁定位SPI_WriteLock,最后进行复位操作SPI_Over()。
5.2 串行编程应遵循的步骤
①上电过程:在RESET及SCK为0时,向VCC及GND供电。在一些系统中,编程器不能保证在上电时SCK保持为低。在这种情况下,SCK拉低之后应在RESET加一正脉冲,而且这个脉冲至少要维持2个CPU时钟周期。
②上电之后等待至少20 ms,然后向MOSI引脚输入串行编程使能指令以使能串行编程。
③通信不同步将造成串行编程失败。同步之后,在发送编程使能指令的第3个字节时,第2个字节的内容(0x53)将被反馈回来。不论反馈的内容正确与否,指令的4个字节必须全部传输。如果0x53未被反馈,则需要向RESET提供一个正脉冲以开始新的编程使能指令。
④Flash的编程以一次一页的方式进行。页的大小为128字节。在执行加载程序存储页指令时,通过6位的地址信息,数据以字节为单位加载到存储页。为保证加载的正确性,应先向给定地址传送数据低字节,之后是高字节。程序存储页通过地址的高8位以及写程序存储器页指令获得数据。如果不使用查询的方式,那么在操作下一页数据之前应等待至少4.5 ms。在Flash写操作完成之前访问串行编程接口,会导致编程错误。
⑤可通过读指令来校验任何一个存储单元的内容。数据从串行输出口MISO输出。
⑥编程结束后可以将RESET拉高,开始正常操作。
⑦下电序列:将RESET置“1”。
结 语
在一般的开发过程中,每次进行程序的调试和更新都要将产品与PC机直连,进行在线操作,这样就限制了程序调试和更新的场所。离线加密编程器的设计避免了这种场所的限制。编程器只有普通的火柴盒大小,功能完善且携带方便,这样可以将已编写好的程序存储在编程器中,然后将编程器带到所需场所(特别是在恶劣的工业现场和野外)对产品进行再编程。本设计采用BootLoader引导区程序进行数据的解密和编程操作,既达到了对知识产权进行保护的目的,又方便了程序的调试和更新。