KDocs 研发资料库
  • 视频技术应用资料与文档入口汇总
  • Window下使用Makefile编译代码教程
  • AC52系列PWM使用说明文档
  • AC57系列PWM使用说明文档
  • 52 系列_串口外设的使用说明
  • 57 系列_串口外设的使用说明
  • AC52系列SPI使用说明文档
  • AC57系列SPI使用说明文档
  • AC52系列外部中断使用说明文档
  • AC57系列外部中断使用说明文档
  • AC54&56外部中断使用说明文档
  • AC52 红外捕获中断demo使用说明文档
  • 视频系列SDK汇总及获取方法
  • AC52系列软件典型问题整理文档获取
  • AC791N开发-入门到进阶开发指导文档(完善ing)
  • AC792N开发-入门到进阶开发指导文档(完善ing)
  • 792 littlefs文件系统配置
  • 792N系列 U盘单备份升级说明
  • 792x串口uart升级说明参考

AC52 系列升级服务buf方式失败的问题说明

📎 原始文档:https://www.kdocs.cn/l/ckGTNk7C2Vxr

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升级方式的实现以及升级失败的原因。
image

图1.1

1.2 buf升级方式什么时候掉电会变砖?
-》擦写flash的时候。
image

flash erasering 1...

二、如何使用升级服务的buf方式升级

2.1 upgrade_detect函数修改点:

image



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日