恢复库实现了一个API,允许您配置不同支持的恢复命令并重新启动到恢复模式。这个库安装在Digi Embedded Yocto提供的工具链中,因此您可以使用它来开发自己的自定义应用程序,支持触发恢复命令。看到应用程序开发

使用库

要使用该库,您需要:

  1. 在应用程序中包含恢复头文件。

    # include < recovery.h >
  2. 指向已包含在预编译工具链中的恢复静态库的链接。该库提供了一个pkg-config文件recovery.pc,安装在工具链中。要配置正确的编译标志和链接库,请在makefile中添加以下行:

    […CFLAGS += $(shell pkg-config——CFLAGS recovery) LDLIBS += $(shell pkg-config——libs——static recovery)[…]

实现的功能

以下是当前版本中实现的功能:

函数 描述

Int encrypt_partitions(char *to_encrypt, char *to_unencrypt, unsigned char force)

配置恢复命令来加密/不加密提供的分区。如果force不等于0,则库在配置命令之前不会要求确认。成功时返回0,失败时返回-1,在没有恢复命令集的情况下返回1。

要完成(非)加密过程,必须调用reboot_recovery ()这之后的函数。如果函数返回1,则意味着命令没有被配置,要么是因为用户取消了操作,要么是因为输入没有改变分区的当前状态。

Int update_firmware(const char *swu_path)

配置恢复命令,使用中指定的包更新固件swu_path。成功时返回0,失败时返回-1。

要启动更新过程,必须调用reboot_recovery ()这之后的函数。

Int set_encryption_key(const char *key, unsigned char force)

使用实例配置恢复命令设置新的文件系统加密密钥。如果key为空或,将生成一个随机密钥。如果force不等于0,则库在配置命令之前不会要求确认。成功时返回0,失败时返回-1,在没有恢复命令集的情况下返回1。

要设置新配置的加密密钥,必须调用reboot_recovery ()这之后的函数。如果函数返回1,则表示由于用户取消了操作,命令尚未配置。

Int reboot_recovery(unsigned Int reboot_timeout)

之后重新启动到恢复模式reboot_timeout秒。失败时返回-1,否则不返回,系统重新启动。

以恢复模式启动后,配置的恢复命令将被应用。

int wipe_update_partition(空白)

配置恢复命令擦除和格式化更新分区。成功时返回0,失败时返回-1。

要启动擦除进程,必须调用reboot_recovery ()这之后的函数。

示例代码

下面的摘录(不可直接编译)演示了如何使用该库:

# include< recovery.h >int主要int命令行参数个数,字符* argv []) {intret =0;无符号字符need_reboot =0;/*读取和解析命令行*/parse_options(命令行参数个数,argv);/ **解析命令行后的变量:** swu_package:软件升级包路径* key_set:设置新的加密密钥的布尔标志* key:新的加密密钥* to_encrypt:需要加密的分区列表,以逗号分隔* to_unencrypt:需要解密的分区列表,以逗号分隔* wipe_update:布尔标记是否擦除' update '分区* reboot_timeout:等待重启的时间* /如果(set_key) {/*配置恢复命令设置fs加密密钥*/Ret = set_encryption_key(key, force);如果(ret <0){打印(“错误:set_encryption_key\ n);转到;}其他的如果(ret = =0) {/ **只有在严格必要时才重启,因为功能如果没有设置恢复命令,*可能会成功*(例如,如果用户取消操作)。* /need_reboot + +;}其他的{ret =0;}}如果(swu_package) {/*配置恢复命令更新固件*/Ret = update_firmware(swu_package);如果(ret) {printf(“错误:update_firmware\ n);转到;} need_reboot + +;}如果(wipe_update) {/*配置恢复命令格式化'update'分区*/Ret = wipe_update_partition();如果(ret) {printf(“错误:wipe_update_partition\ n);转到;} need_reboot + +;}如果(to_encrypt || to_unencrypt) {/*配置恢复命令加密/不加密分区*/Ret = encrypt_partitions(to_encrypt, to_unencrypt, force);如果(ret <0){打印(“错误:encrypt_partitions\ n);转到;}其他的如果(ret = =0) {/ **只有在严格必要时才重启,因为功能如果没有设置恢复命令,*可能会成功*(例如,如果您尝试加密分区*已经加密)。* /need_reboot + +;}其他的{ret =0;}}如果(need_reboot >0) {/*重启恢复*/Ret = reboot_recovery(reboot_timeout);如果(ret) {printf(“错误:reboot_recovery\ n);转到;}} print (\ n没有配置恢复命令。\ n);返回受潮湿腐烂;}