mBed Pelion学习笔记(四) Porting devices

一、 Porting Device Management Client

(一)、 Porting with PAL

  • PAL:平台抽象层(Platform Abstraction Layer),用于连接设备管理客户端和操作系统。它处于设备或者操作系统和设备管理客户端库之间,为设备管理客户端提供API。PAL让设备管理客户端变得更容易移植。

(二)、 Porting a new target for Mbed OS

  • Bootloader需要知道:
    ①活动应用位置和它的起点。
    ②备选固件位置和它们的起点。
  • Bootloader和更新客户端需要为固件更新扮演安全性检查和版本有效性验证的角色。这意味着它们之间需要交换用于存储和激活固件的的元数据。
  • 这些元数据头部,是BootLoader更新的接口。每一组boot序列(root BootLoader除外)引出和包含的应用,和一个元数据头部匹配。
  • 有两种头部格式:内部头部、扩展头部。
    扩展头部格式意味着固件放在扩展存储中,该扩展存储会被预设为不安全的。因此,扩展头部格式包含了额外的安全信息。

 

  • 多数MCU都有两组内部Flash(独立读写)。因此我们会将所有可执行内容放于第一组内存,其他存储内容放于第二组内存。这样当我们读写第二组内存时,不会打断第一组内存中程序的执行。
  • 以Nucleo F429ZI为例的内部存储空间:每组内存有:4 x 16 KB, 1 x 64 KB, 7 x 128 KB。 因此一组大小为1MB。

mBed Pelion学习笔记(四) Porting devices_第1张图片

  • 如上图所示,第一组内部存储:
    ①BootLoader位于Flash起始32KB的位置。
    ②活跃APP元数据头部必须位于Flash擦除的边缘。在这块板子上,他起始于32KB,长度是1KB。
    ③活跃应用从元数据头部后开始,因此起始于33KB。
    第二组内部存储:
    ①KVStore在第二组内存的起始位置。它至少会占用内部Flash上两个连续的可擦除的扇区(这里即4 x 16 KB, 1 x 64 KB两个区域,大小共128KB)。
    ②第二组内存的剩余部分就是用于存储备选固件镜像的位置。
  • 可以通过查看mbed-os/targets/targets.json,看其他目标板是否支持,不支持要先移植mbed-OS。

 

  • 上述用的是内部存储,下面是用扩展存储(一般是SD卡)来存储客户端的证书和固件更新镜像。
  • 这种情况下,用的是内部存储+扩展存储:
    ①内部存储:
    a. BootLoader占用内存的最起始32KB。
    b. KVStore紧位于BootLoader后面。同样的,它也需要占用内部存储Flash至少两个连续的、可擦除的扇区。
    c. 活跃App的数据头从40KB开始,长度为1KB。
    d. 活跃应用跟在数据头后面,从41KB开始。
    ②扩展存储如图所示。

mBed Pelion学习笔记(四) Porting devices_第2张图片

(三)、 Basic configurations for PAL porting

  • mbed-cloud-client/mbed-client-pal/Source/PAL-lmpl/Services-API/pal_configuration.h文件里有关于PAL模块的基础配置。
  • PAL_USE_HW_ROT:定义PAL用的是不是硬件的RoT(Root of Trust,信任源)。
    ①默认为1,即使用硬件RoT。PAL通过函数pal_plat_osGetRoTFromHW(uint8_t * key,size_t keyLenBytes)从硬件获得RoT。
    ②当设置为0时,RoT从平台软件随机生成,或者通过工厂配置客户端注入设备。
  • PAL_USE_INTERNAL_FLASH:定义平台是否有内置Flash。默认值为1。如果要定义以下几项,就必须先定义PAL_USE_INTERNAL_FLASH:
    ①PAL_INTERNAL_FLASH_NUM_#_SECTIONS:表示Flash上可用于安全存储的扇区数。默认为2,最大为2。如果为0则表示内部Flash上没有可用的扇区。
    ②PAL_INTERNAL_FLASH_SECTION_#_ADDRESS:每个扇区(#)的起始地址。扇区最小大小是KB
  • PAL_USE_HW_TRNG:定义是否使用硬件TRNG(True random number generator)。默认值为1。

(四)、 Porting the modules

①RTOS

  • RTOS模块负责实时操作系统相关函数,它提供了:
    进程、信号量、互斥量、定时器和时间功能、内存池和内存管理、消息队列、原子递增、随机数生成。
  • 在pal_plat_rtos.h头文件中声明了RTOS相关的函数。
  • 移植成功的平台前提条件:
    ①能够通过软件重启。②硬件支持实时时钟。③能够获得系统内核tick,频率必须达到最低要求。④原子操作。⑤硬件RoT。⑥实时时钟。⑦随机数生成源。
  • 在pal_configuration.h中可以定义PAL_MAX_NUMBER_OF_THREADS来定义最大线程数。

②Networking

  • Networking模块作用是:
    a. 基于IPv4和IPv6的TCP/UDP socket
    b. 基础DNS功能
    c. Socket 多路复用
  • pal_plat_network.h声明网络函数。
  • 为了Pelion Device Management,Networking module 有3个编译时的flags需要打开:PAL_NET_TCP_AND_TLS_SUPPORT、PAL_NET_ASYNCHRONOUS_SOCKET_API、PAL_NET_DNS_SUPPORT。
  • mbed os中关于network的API文件:Source/Port/Reference-Impl/OS_Specific/mbedOS/Networking/pal_plat_network.cpp
  • 如果要移植过去的平台需要特别的初始化操作,可以通过函数pal_plat_socketsInit()去进行一些特别的初始化操作。
  • 不要直接修改palSocketAddress_t的值而是使用pal_network.h中的函数,例如pal_setSockAddrPort或pal_setSockAddrIPV4Addr。
  • PAL_NET_DEFAULT_INTERFACE定义目标的默认接口。移植时,将其设置为目标系统的默认适配器。
  • 通过pal_plat_RegisterNetworkInterface 函数注册网络接口。注册顺序确定网络接口顺序。

③Crypto

  • 模块用于:
    ①加密/解密算法:AES-CTR、AES-ECB、AES-CCM
    ②随机数生成器:AES CTR-DRBG
    ③哈希函数:SHA256
    ……

④RoT

  • RoT:Root of Trust,是一个用于保护存储、加密数据的密钥。
  • 如果要成功移植RoT,必须要随机数生成源。
  • 如果目标板没有硬件RoT,可以将PAL_USE_HW_ROT设置为0,此时不需要移植。

⑤Secure Storage

  • 安全存储模块提供:加密、存储数据验证、物理rollback保护、“一次写入”数据保护。
  • 头文件pal_sst.h声明和安全存储相关的函数。

⑥FileSystem

  • 该模块方便Pelion Device Management Client 进行文件I/O操作。
  • 模块支持的主要功能:
    a. 文件夹操作(创建和删除目录)
    b. 文件操作(打开、搜索、读取、写入、关闭、删除)
    c. 可删除文件夹内容(非递归删除,也就是说只能删除文件夹、不能删除文件夹中的文件夹、无文件夹迭代)
    d. 非递归将一个文件夹中所有内容复制到另一个文件夹
    e. 格式化分区
  • 移植该模块需要先成功移植RTOS

⑦TLS/DTLS

  • 该模块主要功能:为TCP和UDP socket 提供握手协议;通过安全连接进行读写操作。
  • TLS/DTLS 的API定义在头文件pal_plat_TLS.h中。

 

二、 Porting the Device Management Update client

(一)、Planning Update port

  • 关于固件更新功能的移植,需要考虑的两个关键点是:内存布局、引导程序。
  • 要有以下组件、并且协同工作:
    ①BootLoader:启动时第一个执行、可以将控制权交给用户应用程序、能够读取到新固件的存储区域、能够重写用户应用程序。
    ②活跃的用户应用:BootLoader知道它的位置、包含固件更新客户端。
    ③一个给新固件的存储区域:大小足够,是BootLoader和用户应用程序已知的位置。
  • BootLoader应该具有最小的功能集,以增加操作正确的概率,因为BootLoader失败的恢复成本很高。
  • BootLoader应该知道目标应用程序的跳转位置,可以将控制权移交,可能需要:能够设置主栈指针(MSP)、可以更新向量表偏移寄存器(VTOR)、可以设置程序计数器。
  • 首先需要确定应用程序是使用位置无关代码(PIC),还是从内存固定位置执行代码。PIC更容易更新,因为引导加载程序只需在下载时将控制权交给新的固件镜像(只要它存储在支持就地执行的非易失性存储器中)。PIC的缺点是由相对寻址引起的运行时开销增加,这使得代码运行速度变慢。如果您决定使用固定内存位置,则必须先将新固件复制到当前活动的固件映像上,然后才能执行。
  • 对于从固定位置执行的应用程序,更新意味着使用较新的应用程序覆盖当前放置在该固定位置的应用程序。对于PIC应用程序,应用更新意味着将控制权交给新固件而不是旧固件。
  • 在更新过程中的任何时刻,都要保留至少一个已知稳定版本的固件。如果系统不稳定,BootLoader会将活动映像还原为先前已知的稳定版本。

 

(二)、 Porting the Device Management Update to Linux system

 

你可能感兴趣的:(mBed)