AC52 系列升级服务buf方式失败的问题说明
AC52 系列升级服务buf方式失败的问题说明
目录
TOC \o "1-3" \h \u HYPERLINK \l _Toc30794 一、升级方式说明 PAGEREF _Toc30794 2
HYPERLINK \l _Toc9872 二、如何使用升级服务的buf方式升级 PAGEREF _Toc9872 3
HYPERLINK \l _Toc2109 2.1 upgrade_detect函数修改点: PAGEREF _Toc2109 3
HYPERLINK \l _Toc6949 2.2 sfc_mode_file_upgrade函数: PAGEREF _Toc6949 4
HYPERLINK \l _Toc596 三、解决buf方式升级失败的问题 PAGEREF _Toc596 7
一、升级方式说明
1.1 杰理AC52系列主控upgrade_server使用的升级方式有两种,分别是文件句柄方式和buf方式(见图1.1)。本文档仅说明buf升级方式的实现以及升级失败的原因。
图1.1
1.2 buf升级方式什么时候掉电会变砖?
-》擦写flash的时候。
flash erasering 1...
二、如何使用升级服务的buf方式升级
2.1 upgrade_detect函数修改点:

2.2 sfc_mode_file_upgrade函数:
该函数是从SD卡读取升级文件到内存buf之中,buf传递给升级服务进行升级,值得注意的是使用该函数的接口升级,升级中途掉电的话会变砖。
| 1.#define RECV_BLOCK_SIZE (4 * 1024) 2./* 3. * flash升级文件测试代码,wifi可以参照这个写文件 4. */ 5.int sfc_mode_file_upgrade(void) 6.{ 7. void *sys_ufd = NULL; 8. struct server *upgrade_ser; 9. union sys_upgrade_req req = {0}; 10. u8 *buf = NULL; 11. int err = 0; 12. int block_size = 0; 13. int size = 0; 14. int offset = 0; 15. server_load(upgrade_server); 16. upgrade_ser = server_open("upgrade_server", NULL); 17. if (!upgrade_ser) { 18. log_e("open upgrade server error\n"); 19. return -EINVAL; 20. } 21. FILE fsdc = fopen(CONFIG_ROOT_PATH"JL_ACSFC.bfu", "r"); 22. if (!fsdc) { 23. log_e("open JL_ACSFC.bfu error\n"); 24. return -ENOENT; 25. } 26. buf = malloc(RECV_BLOCK_SIZE); 27. if (!buf) { 28. log_e("malloc recv buffer error\n"); 29. goto __ota_exit; 30. } 31. block_size = RECV_BLOCK_SIZE; 32. fread(fsdc, buf, block_size); 33. / 34. * 校验文件,必须从0开始校验 35. * 如果传入的长度 < 文件长度,则只校验头的部分 36. / 37. req.info.type = UPGRADE_TYPE_BUF; 38. req.info.input.data.buf = buf; 39. req.info.input.data.size = block_size; 40. req.info.offset = 0; 41. err = server_request(upgrade_ser, UPGRADE_REQ_CHECK_FILE, &req); 42. if (err) { 43. log_e("upgrade file err : 0x%x\n", err); 44. goto __ota_exit; 45. } 46. / 47. * 升级信息校验,确定系统是否需要升级 48. / 49.#if 1 50. req.info.type = UPGRADE_TYPE_BUF; 51. req.info.input.data.buf = buf; 52. req.info.input.data.size = block_size; 53. req.info.offset = 0; 54. err = server_request(upgrade_ser, UPGRADE_REQ_CHECK_SYSTEM, &req); 55. if (err) { 56. log_e("system not match to file : 0x%x\n", err); 57. goto __ota_exit; 58. } 59.#endif 60. / 61. * 这里已经确定可以升级 62. * 可以在这里进行升级确认,以及插电提醒 63. / 64. 65. / 66. * 开始升级 67. */ 68. size = flen(fsdc); 69. do { 70. req.core.type = UPGRADE_TYPE_BUF; 71. req.core.input.data.buf = buf; 72. req.core.input.data.size = block_size; 73. req.core.offset = offset; 74. err = server_request(upgrade_ser, UPGRADE_REQ_CORE_START, &req); 75. if (err) { 76. log_e("upgrade core run err : 0x%x\n", err); 77. } 78. offset += block_size; 79. size -= block_size; 80. block_size = size > RECV_BLOCK_SIZE ? RECV_BLOCK_SIZE : size; 81. fread(fsdc, buf, block_size); 82. } while (block_size); 83. server_close(upgrade_ser); 84. cpu_reset(); 85.__ota_exit: 86. if (fsdc) { 87. fclose(fsdc); 88. } 89. if (buf) { 90. free(buf); 91. } 92. return 0; 93.} |
|---|
三、解决buf方式升级失败的问题
经过2.1和2.2以上软件配置步骤完成升级服务的buf方式升级的准备,确保SD卡功能正常,机器能正确跑到升级流程的前提下,修改工程目录下的#升级文件.bat为如下内容,重新生成升级文件并命名为JL_ACSFC.bfu并存放于SD卡根目录,开机即可升级:
| 1.@echo off 2.isd_download.exe -cfg isd_tools.cfg -input uboot.boot ver.bin sdram.apu -resource res audlogo 32 -disk file -aline 4096 -bfumode 3 3. 4.del upgrade\JL_AC*.bfu upgrade*.bin 5.copy /B jl_isd.bfu upgrade\JL_AC5X.bfu 6.del jl_isd.bfu 7.echo. 8.echo 升级文件在upgrade目录下,将upgrade目录下的所有文件copy到SD卡的根目录,插卡上电即可升级 9.echo. 10.注意:需要升级uboot的话,请先更新upgrade.a 先升级一版程序,然后-bfumode 3改为 -bfumode 5 生成卡升级文件,之后的卡升级就可以把uboot烧进去。 11.pause |
|---|
1、为什么要修改批处理?
该批处理相比原批处理生成的升级文件少合成了一个sdram.bin,升级之所以失败,是因为buf升级这种方式未对升级文件的sdram.bin进行偏移导致。
2、buf升级方式为什么不能预防变砖?
由于sdram.bin起到防止变砖的作用,而buf升级方式却只能使用没合成sdram.bin的升级文件,自然buf升级方式不能预防掉电变砖。
杰理科技
2022年3月27日