hilink_ota.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * Copyright (c) Huawei Technologies Co., Ltd. 2018-2021. All rights reserved.
  3. * Description: 此文件提供了升级相关的接口实现示例;
  4. * 其中升级相关功能的接口需要开发者或厂商进行实现,HiLink SDK在收到升级相关命令时会调用对应接口;
  5. * 请开发者仔细阅读文件中的注释说明,参考或修改实现。
  6. */
  7. #include "hilink_ota.h"
  8. /*
  9. * 获取MCU当前版本
  10. * version表示版本字符串
  11. * inLen表示输入字符串长度
  12. * outLen表示输出字符串长度
  13. * 返回值是RETURN_OK时,表示获取成功
  14. * 返回值是RETURN_ERROR_NO_MCU时,表示没有MCU
  15. * 返回值是RETURN_ERROR时,表示获取失败
  16. * 注意:如果获取不到MCU的版本,则不对MCU进行升级。
  17. * 建议厂商在MCU正常启动后,或升级启动后,就将MCU的版本号传递给模组,确保模组可以获取到MCU的版本。
  18. */
  19. int HilinkGetMcuVersion(char *version, unsigned int inLen, unsigned int *outLen)
  20. {
  21. /* 厂商实现此接口 */
  22. return RETURN_ERROR_NO_MCU;
  23. }
  24. /*
  25. * 开始模组升级
  26. * type表示升级类型
  27. * 当type是UPDATE_TYPE_MANUAL时,表示本次升级流程是由用户主动发起的手动升级
  28. * 当type是UPDATE_TYPE_AUTO时,表示本次升级流程是经过用户同意的自动升级
  29. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK将开始启动升级流程
  30. * 返回值是RETURN_ERROR时,表示处理不成功,HiLink SDK将终止本次升级流程
  31. * 注意:在手动场景场景下,HiLink SDK在接收到用户发出的升级指令后,将直接调用此接口;
  32. * 在自动升级场景下,当HiLink SDK在调用HilinkGetRebootFlag接口返回值是MODULE_CAN_REBOOT时,HiLink SDK将调用此接口。
  33. * 厂商可在此接口中完成和升级流程相关的处理。
  34. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。
  35. * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
  36. * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
  37. * 影响,比如发出声音,光亮等。
  38. */
  39. int HilinkOtaStartProcess(int type)
  40. {
  41. /* 厂商实现此接口 */
  42. return RETURN_OK;
  43. }
  44. /*
  45. * 模组升级结束
  46. * status表示升级结果
  47. * 当status是100时,表示升级成功
  48. * 当status不是100时,表示升级失败
  49. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK将置升级标志或切换运行区标志
  50. * 返回值不是RETURN_OK时,表示处理不成功,HiLink SDK将终止本次升级流程
  51. * 注意:HiLink SDK在将固件写入到OTA升级区后,且完整性校验通过后,将调用厂商适配的此接口;
  52. * 厂商可在此接口中完成和升级流程相关的处理。
  53. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。
  54. * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
  55. * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
  56. * 影响,比如发出声音,光亮等。升级类型是否为自动升级可参考接口HilinkOtaStartProcess的参数type的描述。
  57. */
  58. int HilinkOtaEndProcess(int status)
  59. {
  60. /* 厂商实现此接口 */
  61. return RETURN_OK;
  62. }
  63. /*
  64. * 判断模组是否能立即升级并重启
  65. * 返回值是MODULE_CAN_REBOOT时,表示模组可以立即升级并重启,HiLink SDK将开始自动升级流程。
  66. * 返回值是MODULE_CANNOT_REBOOT时,表示模组不能立即升级并重启,HiLink SDK将不进行本次自动升级流程。
  67. * 注意:在用户同意设备可以自动升级的情况下,HiLink SDK调用此接口获取设备当前业务状态下,模组是否可以立即升级并重启的标志。
  68. * 只有当设备处于业务空闲状态时,接口才可以返回MODULE_CAN_REBOOT。
  69. * 当设备处于业务非空闲状态时,接口返回MODULE_CANNOT_REBOOT。
  70. */
  71. int HilinkGetRebootFlag(void)
  72. {
  73. /* 厂商实现此接口 */
  74. return MODULE_CAN_REBOOT;
  75. }
  76. /*
  77. * HiLink SDK调用厂商适配的此接口通知MCU固件传输的状态
  78. * flag表示升级流程标志
  79. * 当flag是START_SEND_DATA时,表示通知模组即将开始发送MCU固件数据包
  80. * 当flag是STOP_SEND_DATA时,表示通知模组完整的MCU固件包已发送完成
  81. * 当flag是SEND_DATA_ERROR时,表示通知模组本次MCU固件升级异常终止
  82. * len表示MCU固件包的大小
  83. * type表示升级类型
  84. * 当type是UPDATE_TYPE_MANUAL时,表示本次升级流程是由用户主动发起的手动升级
  85. * 当type是UPDATE_TYPE_AUTO时,表示本次升级流程是经过用户同意的自动升级
  86. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK继续正常处理后续流程
  87. * 返回值是RETURN_ERROR时,表示处理失败,HiLink SDK将终止本次MCU升级流程
  88. * 注意:当flag是STOP_SEND_DATA时,此接口需返回MCU侧固件升级的结果;当flag是其它值时,需返回接口接收到此消息后的处理结果。
  89. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。
  90. * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
  91. * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
  92. * 影响,比如发出声音,光亮等。
  93. */
  94. int HilinkNotifyOtaStatus(int flag, unsigned int len, unsigned int type)
  95. {
  96. /* 厂商实现此接口 */
  97. return RETURN_OK;
  98. }
  99. /*
  100. * HiLink SDK调用厂商适配的此接口通知厂商发送MCU固件文件数据
  101. * data表示发送的数据
  102. * len表示发送的数据的长度
  103. * offset表示发送的数据起始位置相对于完整固件包的偏移量
  104. * 此接口需要返回MCU接收这部分数据的处理结果
  105. * 返回值是RETURN_OK时,模组将通知的数据正确发送给MCU,且MCU正确处理发送的数据,HiLink SDK将继续正常处理后续流程
  106. * 返回值是RETURN_ERROR时,模组或MCU未能正常处理通知的MCU的固件文件数据,HiLink SDK将终止本次MCU固件升级流程
  107. */
  108. int HilinkNotifyOtaData(const unsigned char *data, unsigned int len, unsigned int offset)
  109. {
  110. /* 厂商实现此接口 */
  111. return RETURN_OK;
  112. }
  113. /*
  114. * 获取设备升级文件保存路径
  115. * filePath表示设备升级文件保存路径
  116. * len表示设备升级文件保存路径的长度
  117. * 返回值是RETURN_OK时,表示获取成功
  118. * 返回值是RETURN_ERROR时,表示获取失败
  119. * 注意:Linux系统和安卓系统需要适配此接口,其他操作系统不用适配此接口。
  120. * HiLink SDK下载的设备升级文件需保存在设备上的某个文件路径下;
  121. * 此文件路径,需由厂商适配提供,例如“/var/update.bin”。
  122. */
  123. int HILINK_GetUpdateFilePath(char *filePath, unsigned int len)
  124. {
  125. /* 厂商实现此接口 */
  126. return RETURN_OK;
  127. }
  128. /*
  129. * 厂商适配此接口提供设备上能够保存的升级文件的最大大小,
  130. * 避免当HiLink SDK下载的升级文件大小大于分区大小时,导致升级失败。
  131. * 注意:Linux系统和安卓系统需要适配此接口,其他操作系统不用适配此接口。
  132. */
  133. unsigned int HILINK_GetMaxUpdateFileSize(void)
  134. {
  135. /* 厂商实现此接口 */
  136. return 0;
  137. }
  138. /*
  139. * 启动软件安装
  140. * 返回值是RETURN_OK时,表示启动成功
  141. * 返回值是RETURN_ERROR时,表示启动失败
  142. * 注意:Linux系统和安卓系统需要适配此接口,其他操作系统不用适配此接口。
  143. * HiLink SDK完成新版本的检测和下载流程后,由厂商实现软件安装流程。
  144. * HiLink SDK调用此接口后便会退出升级流程,交由厂商的安装程序来完成软件的安装。
  145. */
  146. int HILINK_StartSoftwareIntall(void)
  147. {
  148. /* 厂商实现此接口 */
  149. return RETURN_OK;
  150. }
  151. /*
  152. * 获取桥下子设备的当前版本
  153. * version返回同一proId品类的最低版本号
  154. * 返回值是RETURN_OK时,表示获取成功,反之失败
  155. */
  156. int HILINK_GetBrgSubDevVersion(const char *proId, unsigned int proIdLen,
  157. char *version, unsigned int versionLen)
  158. {
  159. /* 厂商实现此接口 */
  160. return RETURN_OK;
  161. }
  162. /*
  163. * HiLink SDK调用厂商适配的此接口通知厂商桥下子设备的hota最新版本号
  164. * version返回同一proId品类的最新版本号
  165. * 返回值是RETURN_OK时,表示获取成功,反之失败
  166. */
  167. int HILINK_NotifyBrgSubDevNewVersion(const char *proId, unsigned int proIdLen, const char *version,
  168. unsigned int versionLen)
  169. {
  170. /* 厂商实现此接口 */
  171. return RETURN_OK;
  172. }
  173. /*
  174. * HiLink SDK调用厂商适配的此接口通知厂商发送桥下子设备固件数据
  175. * data表示发送的数据
  176. * len表示发送的数据的长度
  177. * offset表示发送的数据起始位置相对于完整固件包的偏移量
  178. * 返回值是RETURN_OK时,表示接受成功,反之失败
  179. */
  180. int HILINK_NotifyBrgSubDevOtaData(const char *proId, unsigned int proIdLen,
  181. const unsigned char *data, unsigned int len, unsigned int offset)
  182. {
  183. /* 厂商实现此接口 */
  184. return RETURN_OK;
  185. }
  186. /*
  187. * HiLink SDK调用厂商适配的此接口通知桥下子设备固件传输的状态
  188. * flag表示升级流程标志
  189. * 当flag是START_SEND_DATA时,表示通知模组即将开始发送桥下子设备固件数据包
  190. * 当flag是STOP_SEND_DATA时,表示通知模组完整的桥下子设备固件包已发送完成
  191. * 当flag是SEND_DATA_ERROR时,表示通知模组本次桥下子设备固件升级异常终止
  192. * len表示MCU固件包的大小
  193. * type表示升级类型
  194. * 当type是UPDATE_TYPE_MANUAL时,表示本次升级流程是由用户主动发起的手动升级
  195. * 当type是UPDATE_TYPE_AUTO时,表示本次升级流程是经过用户同意的自动升级
  196. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK继续正常处理后续流程
  197. * 返回值是RETURN_ERROR时,表示处理失败,HiLink SDK将终止本次桥下子设备升级流程
  198. * 注意:当flag是STOP_SEND_DATA时,此接口需返回桥下子设备侧固件升级的结果;当flag是其它值时,需返回接口接收到此消息后的处理结果。
  199. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,
  200. * 就进行新版本的下载,下载完成后自动重启。
  201. */
  202. int HILINK_NotifyBrgSubDevOtaStatus(const char *proId, unsigned int proIdLen, int flag,
  203. unsigned int len, unsigned int type)
  204. {
  205. /* 厂商实现此接口 */
  206. return RETURN_OK;
  207. }