From 5baac1bd2e185af75fef5d04f7d420cb35ae8cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E8=87=B4=E9=B9=8F?= Date: Fri, 15 May 2026 13:40:33 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E8=A1=8C=E7=83=A7=E5=BD=95=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温致鹏 --- vendor/ebaina/README.md | 1 + vendor/ebaina/docs/histart/README_zh.md | 125 ++++++++++++ .../docs/pic/image-20260508203250622.png | Bin 0 -> 19208 bytes .../docs/pic/image-20260508203314336.png | Bin 0 -> 6785 bytes .../docs/pic/image-20260508203636216.png | Bin 0 -> 39050 bytes .../docs/pic/image-20260508203713664.png | Bin 0 -> 4845 bytes .../docs/pic/image-20260508203728787.png | Bin 0 -> 11346 bytes .../docs/pic/image-20260508204836125.png | Bin 0 -> 4886 bytes vendor/ebaina/file/histart/gen_hstart.py | 183 ++++++++++++++++++ .../histart/u-boot-2020.01/cmd/cmd_histart.c | 156 +++++++++++++++ 10 files changed, 465 insertions(+) create mode 100644 vendor/ebaina/docs/histart/README_zh.md create mode 100644 vendor/ebaina/docs/pic/image-20260508203250622.png create mode 100644 vendor/ebaina/docs/pic/image-20260508203314336.png create mode 100644 vendor/ebaina/docs/pic/image-20260508203636216.png create mode 100644 vendor/ebaina/docs/pic/image-20260508203713664.png create mode 100644 vendor/ebaina/docs/pic/image-20260508203728787.png create mode 100644 vendor/ebaina/docs/pic/image-20260508204836125.png create mode 100644 vendor/ebaina/file/histart/gen_hstart.py create mode 100644 vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c diff --git a/vendor/ebaina/README.md b/vendor/ebaina/README.md index 4cd01b1c..5334be2b 100644 --- a/vendor/ebaina/README.md +++ b/vendor/ebaina/README.md @@ -6,6 +6,7 @@ - 如有除openEuler系统外的其他系统需求,可下载[【易百纳】Euler Pi 2.0](https://pan.baidu.com/s/1GwvuEjbLGsMLyX8kkG8dlQ?pwd=s7hs)资料,需注意,其他系统需求不基于[Hi3403V100 HiSpark社区版本](https://gitee.com/HiSpark/pegasus/tree/master)。 - 海鸥派相关咨询或者疑问请前往[易百纳主导的海鸥派开源开发者社区](https://gitee.com/hieulerpi)提问。 - [海鸥派淘宝购买链接](https://item.taobao.com/item.htm?abbucket=13&id=755989596567&skuId=5948917988054)。 +- 提供了命令行烧录方式说明,详情请看[《histart 自动更新系统设计与使用手册》](./docs/histart/README_zh.md)。 ## 一、补丁说明 diff --git a/vendor/ebaina/docs/histart/README_zh.md b/vendor/ebaina/docs/histart/README_zh.md new file mode 100644 index 00000000..96badc63 --- /dev/null +++ b/vendor/ebaina/docs/histart/README_zh.md @@ -0,0 +1,125 @@ +# histart 自动更新系统设计与使用手册 + +## 1. 系统概述 + +`histart` 是一套为海思 (HiSilicon) Hi3403V100平台设计的自动固件烧录方案,实现了基于网络 (TFTP) 的一键式全自动更新;该方案解决了传统手动烧录过程繁琐、容易出错且难以维护多个分区表的问题。**目前只支持eMMC烧录。** + +## 2. 系统架构 + +系统由两部分组成: +1. **离线预处理器 (Host 端)**:`gen_hstart.py`。负责将 XML 分区表换算为 U-Boot 可执行的脚本。 +2. **在线执行引擎 (Target 端)**:`cmd_histart.c`。集成在 U-Boot 中的新命令 `histart`。 + +## 3. 集成步骤 + +### 3.1 预处理器配置 + +在[`gen_hstart.py`](../../file/histart/gen_hstart.py)脚本顶部的配置区,可以根据实际硬件修改参数: + +- `LOAD_ADDR_HEX`: 镜像文件在 DDR 中的加载基地址(默认 `0x41000000`)。 +- `MAX_CHUNK_SIZE`: 单次下载的最大分段大小(默认 `256MB`),建议设为 DDR 容量的 1/4 到 1/2。 +- `BLOCK_SIZE_BYTES`: eMMC 扇区大小(标准为 `512`)。 + +### 3.2 U-Boot 命令集成 + +**【注意】:这里以u-boot-2020.01为例。** + +1. 将 [`cmd_histart.c`](../../file/histart/u-boot-2020.01/cmd/cmd_histart.c) 放置于 U-Boot 源码的 `cmd/` 目录下。 + +2. 修改 `cmd/Makefile`,添加: + + ```makefile + obj-$(CONFIG_CMD_HISTART) += cmd_histart.o + ``` + + ![image-20260508203250622](./../pic/image-20260508203250622.png) + +3. 修改 `cmd/Kconfig`:在合适位置(如 config SYS_XTRACE命令后)添加配置定义: + + ``` + config CMD_HISTART + bool "histart - Hisilicon auto-start burn system" + default y + help + This command enables the HiSilicon automatic firmware update system. + It allows U-Boot to download and execute burn scripts from a TFTP + server, supporting one-click multi-partition updates with CRC32 + verification and automatic reboot. + ``` + +4. 配置并编译:执行 `make menuconfig` 并勾选 `histart` 命令,随后执行 `make`4. 测试与操作人员指南 (使用步骤) + + ![image-20260508203314336](./../pic/image-20260508203314336.png) + +## 4. 使用步骤 + +### 前提条件 + +- 开发板相关源码已编译完成,已形成烧录文件。 + +- 客户端(操作平台,例如Linux系统)部署了TFTP服务。 + + 1. windows安装Tftpd工具即可。 + + 2. Ubuntu安装Tftpd: + + ```bash + apt-get update + apt-get -y install tftpd-hpa + mkdir /tftpboot + chmod 777 /tftpboot + ``` + + `vim /etc/default/tftpd-hpa`修改以下内容: `TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-l -c -s"` ,其中TFTP_DIRECTORY 指定文件存储路径。 -c 允许创建新文件。 + + ![image-20260508204836125](./../pic/image-20260508204836125.png) + + 重启服务以应用配置: + + ```bash + systemctl restart tftpd-hpa.service + ``` + +- 客户端拥有python3环境。 + +- 使用串口线缆和网线连接客户端与开发板。 + +- 已经烧录了uboot镜像。 + +### 步骤 1:准备烧录相关文件 + +在客户端创建TFTP文件夹,将镜像文件和[`gen_hstart.py`](../../file/histart/gen_hstart.py)拷贝至TFTP文件夹内,生成histart脚本,进入TFTP文件夹目录执行下面命令。。 + +```bash +python3 gen_hstart.py path/to/emmc_burn_table.xml +``` + +**输出结果**:在 XML 所在目录下生成 `histart.txt` 和 `scripts/` 文件夹。 + +### 步骤 2:使用histart烧录 + +1. 重启板端,`ctrl+c`进入uboot。 + +2. 配置网络环境,(需根据情况修改serverip、ipaddr和gatewayip,确保能 ping 通服务器): + + ``` + setenv serverip + setenv ethaddr 00:cf:55:38:4f:0a + setenv ipaddr + setenv netmask 255.255.255.0 + setenv gatewayip + ``` + + ![image-20260508203713664](./../pic/image-20260508203713664.png) + +3. 执行histart烧录。 + + ```bash + histart + ``` + + ![image-20260508203728787](./../pic/image-20260508203728787.png) + + **自动完成**:系统将自动依次下载并烧录所有分区。完成后,系统将自动执行 `reset` 重启设备。 + + ![image-20260508203636216](./../pic/image-20260508203636216.png) diff --git a/vendor/ebaina/docs/pic/image-20260508203250622.png b/vendor/ebaina/docs/pic/image-20260508203250622.png new file mode 100644 index 0000000000000000000000000000000000000000..a19b54de616dfb27bbffaf9c1a6d11870b43c5a2 GIT binary patch literal 19208 zcmbrmcUV(j*DV@FMFGKrAYDX2iXy#+C@4r5kX{9(7wHh1ih%y;O?nV1k=}b3sR98) zhft)q&_MzTXQA)=ec$`sbINZ!EI+ptVDZXSgP8VTtO5wj(wVja;pLb1jo zBGFCByaEDz_Uj#=nj<5H6pJ#y(6GzIE7OWaC_7n^%3fj*n;d;EAn-A`+2r<{ua5x6IlPx1JkxYgEKLp3@H@O+JOlSW_s043q~T)34oF$B`Y z_Zxp)nQ^*OoO=!edHedw@)huMk$LX|`0V{PI9Rgrlgm)>S<#&j2(W(bYf>uUh5K?E zJ9we`(03EOkV^gUzJ_?dY^A}+tCwYR6uz()uJZsK+1-b}3|&hN=5&YG8y33jJ@3BL z;(OmlwosFGj?@}&M1iD_Og*$);yTT4sH#RViS;>{OTOty9X|>?^)_*UK(?YJKJ}q- z{R68>vl0BNRU7-tB@`V6QF4asht}{VW*)U zZ;W`YbCeRLy%+dpt)CoPbRUz@ZuFS#SdMJpG0u^$nyQ2FHT#@Js_F0==c!_1SFqkD zv_MiHTKL6M*uYWX1&s8*H@A@^g@w0iSf`2lkdmJ+Ps_U}jm_Il-7{OWx81gmsvlZ} z?As3X53S2R(86?UO%@5tC+O9#nAgq?6H3Z!V=?3VCMs*VuL-%=_0B`yX7c*?l_Cx) zFezq&BG^%mN+Evx80`lY;p^|dn{PW~XvWrEyR6*5psxHVVeg%N=Om=po9F!i>EiL* zLN=juc1A!|q{Os6d}uP#$NqWOwK0kXmvWIOqq?X1wu^4beI>qQ;~4q-v#p5X{b&3s z@`=hWzqUTj*?_CeZinkD_0>^|gOQP8bVjI^glp8lzKPilBuqYOFyqV@b-Fu_37&tv z_ZgbKkkk4r$039F-okynWB1m*Rx@s@V7rPg2IT$Ronq@kj_1GIpe^%c(OY2CP*c&` zYcxu3>`Nb9ihDF;BHN$NR=^ro7nmLBoy@xKc!gTzC%X-MhebRDVW2FEafyTLj!;h} zzBel#tE;Mr@hGKb4Y>$`c<^RXK%=ww-gJB(9aqwV!BKnOd4b(rDnD|(U6v-;ZruE$EG`tYutL#PGV6dS7O z>r!n`XYV6d+vV}NuPaP8N_9GRRIm}u(xU&G*m1i@^$oD#CujMUxOf61{5I9pplR_; z?9>t0LA6U}v5{MWEZVy7drHW+C?7@_`sxVQU7-Zqr82gA1-cO%*(*@CIkrth=k0#K zPy{4ie9994EIGJP7Hc{xRYVZT%+Y`4rSkV2Gjm)Gi*O^HaHW8~oHK!)V2#u<3Txlb zaJU44n1ATonHk)$El?DNbACHDHV6qQFP;#UvY3Wc5U_JXF;sQZ%#B>cS~DCA-D z^;}&!W@o2eC>%%p+bG6UKdfEQn;)!rfE)b{SuY#qz}=r?cH+h6DIIc_1=}~o(~YN| zXE?mHz4NM#E|uQ;g~kjR3?xs�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 JtaD0e0sy_9OXUCn literal 0 HcmV?d00001 diff --git a/vendor/ebaina/docs/pic/image-20260508203314336.png b/vendor/ebaina/docs/pic/image-20260508203314336.png new file mode 100644 index 0000000000000000000000000000000000000000..716a5c13aa31d52cd5280d0f984143e9847db8e5 GIT binary patch literal 6785 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 E4;+M4c>n+a literal 0 HcmV?d00001 diff --git a/vendor/ebaina/docs/pic/image-20260508203728787.png b/vendor/ebaina/docs/pic/image-20260508203728787.png new file mode 100644 index 0000000000000000000000000000000000000000..26c5eb3e2e5724230fda231ffd829198631c8a4b GIT binary patch literal 11346 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 literal 0 HcmV?d00001 diff --git a/vendor/ebaina/docs/pic/image-20260508204836125.png b/vendor/ebaina/docs/pic/image-20260508204836125.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a39047e93961acae02bba6f72318bf8101e614 GIT binary patch literal 4886 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 Partition: {name} ({length_str})'" + ] + content.extend(calc_cmds) + + # 3. Generate multi-stage burning logic for chunks + current_offset_blk = start_blk + for i, chunk_file in enumerate(chunk_filenames): + chunk_size = os.path.getsize(os.path.join(output_root, chunk_file)) + + content.extend([ + f"echo '>>> Chunk {i}: {chunk_file}'", + f"mw.b {LOAD_ADDR_HEX} 0xFF {hex(MAX_CHUNK_SIZE)}", + f"tftp {LOAD_ADDR_HEX} {chunk_file}", + f"crc32 {LOAD_ADDR_HEX} ${{filesize}}", + f"setexpr actual_blkcnt ${{filesize}} + 0x1ff", + f"setexpr actual_blkcnt ${{actual_blkcnt}} / {hex(BLOCK_SIZE_BYTES)}", + # Per-chunk boundary check (Assertion style for compatibility) + f"setexpr current_limit {max_count_var} - {hex(current_offset_blk - start_blk)}", + f"echo '>>> Checking boundary...'", + f"itest.l ${{actual_blkcnt}} <= ${{current_limit}}", + f"mmc write {hex(MMC_DEV_ID)} {LOAD_ADDR_HEX} {hex(current_offset_blk)} ${{actual_blkcnt}}", + ]) + current_offset_blk += (chunk_size + BLOCK_SIZE_BYTES - 1) // BLOCK_SIZE_BYTES + + content.append(f"echo '>>> {name} write complete.'") + + with open(os.path.join(scripts_path, sub_script_name), 'w') as f: + f.write('\n'.join(content) + '\n') + + index_script_lines.append(f"histart {sub_script_rel_path}") + + # Finalize main index script + index_script_lines.extend([ + "echo '====================================='", + "echo ' FIRMWARE UPDATE COMPLETED SUCCESS '", + "echo ' REBOOTING IN 3 SECONDS... '", + "echo '====================================='", + "sleep 3", + "reset", + ]) + + with open(os.path.join(output_root, 'histart.txt'), 'w') as f: + f.write('\n'.join(index_script_lines) + '\n') + + print(f"[+] Success: Scripts and chunks generated in '{output_root}'") + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='HiSilicon hstart Script Generator') + parser.add_argument('xml', help='Path to the emmc_burn_table.xml file') + args = parser.parse_args() + generate_update_scripts(args.xml) diff --git a/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c b/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c new file mode 100644 index 00000000..2e120647 --- /dev/null +++ b/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c @@ -0,0 +1,156 @@ +#include +#include +#include +#include +#include + +/* Configuration Constants */ +#define HISTART_SCRIPT_MAX_SIZE (32 * 1024) /* 32KB Limit for script files */ +#define HISTART_DEFAULT_FILE "histart.txt" +#define HISTART_LOAD_ADDR 0x41000000 +#define HISTART_MMC_DEV_ID 0 /* Default eMMC device ID */ + +/** + * detect_emmc_capacity - Detect total blocks of eMMC and set environment variable + */ +static void detect_emmc_capacity(void) +{ + struct mmc *mmc = find_mmc_device(HISTART_MMC_DEV_ID); + if (mmc) { + if (mmc_init(mmc) == 0) { + char val[32]; + /* capacity is in bytes, convert to 512B blocks */ + snprintf(val, sizeof(val), "0x%llx", (unsigned long long)mmc->capacity_user / 512); + env_set("emmc_total_blk", val); + } + } +} + +/** + * get_script_next_line - Extract the next valid command line from the buffer + * @line_buf_ptr: Pointer to the current position in the script buffer + * + * Handles \r, \n, skip comments (#), and terminates at EOF or '%' + */ +static char *get_script_next_line(char **line_buf_ptr) +{ + char *line_buf = *line_buf_ptr; + char *next_line = NULL; + + if (!line_buf || *line_buf == '\0') + return NULL; + + /* Skip leading whitespace and line breaks */ + while (1) { + while (*line_buf && (isspace(*line_buf))) + line_buf++; + + /* Check for EOF or end-of-script marker */ + if (*line_buf == '\0' || *line_buf == '%') + return NULL; + + /* Handle comments: skip until end of line and continue searching */ + if (*line_buf == '#') { + while (*line_buf && *line_buf != '\r' && *line_buf != '\n') + line_buf++; + continue; + } + + break; + } + + next_line = line_buf; + + /* Find the end of the current line */ + while (*line_buf && *line_buf != '\r' && *line_buf != '\n') + line_buf++; + + /* Null-terminate the current line and advance the buffer pointer */ + if (*line_buf != '\0') { + *line_buf = '\0'; + *line_buf_ptr = line_buf + 1; + } else { + *line_buf_ptr = line_buf; + } + + /* Trim trailing spaces from the extracted line */ + char *end = next_line + strlen(next_line) - 1; + while (end > next_line && isspace(*end)) { + *end = '\0'; + end--; + } + + return next_line; +} + +/** + * do_histart - The main histart command handler + */ +static int do_histart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + const char *script_name = (argc > 1) ? argv[1] : HISTART_DEFAULT_FILE; + char cmd[128]; + char *script_heap_buf = NULL; + char *script_ptr = NULL; + char *next_line = NULL; + const char *filesize_str; + unsigned long filesize = 0; + int ret = CMD_RET_SUCCESS; + + /* Automatically detect eMMC capacity for dynamic partitions */ + detect_emmc_capacity(); + + /* 1. Fetch script from TFTP to temporary staging area */ + printf("histart: Fetching script [%s] to 0x%08x...\n", script_name, HISTART_LOAD_ADDR); + snprintf(cmd, sizeof(cmd), "tftp 0x%08x %s", HISTART_LOAD_ADDR, script_name); + if (run_command(cmd, 0) != 0) { + printf("histart: Error - TFTP failed for %s\n", script_name); + return CMD_RET_FAILURE; + } + + /* 2. Validate script size */ + filesize_str = env_get("filesize"); + if (!filesize_str) { + printf("histart: Error - 'filesize' env not found after TFTP\n"); + return CMD_RET_FAILURE; + } + filesize = simple_strtoul(filesize_str, NULL, 16); + + if (filesize == 0 || filesize > HISTART_SCRIPT_MAX_SIZE) { + printf("histart: Error - Script too large (%lu bytes, max %d)\n", + filesize, HISTART_SCRIPT_MAX_SIZE); + return CMD_RET_FAILURE; + } + + /* 3. Clone script to heap to prevent overwrite by subsequent image downloads */ + script_heap_buf = malloc(filesize + 1); + if (!script_heap_buf) { + printf("histart: Error - Memory allocation failed\n"); + return CMD_RET_FAILURE; + } + memcpy(script_heap_buf, (void *)HISTART_LOAD_ADDR, filesize); + script_heap_buf[filesize] = '\0'; + + /* 4. Parse and Execute Line-by-Line */ + script_ptr = script_heap_buf; + while ((next_line = get_script_next_line(&script_ptr)) != NULL) { + if (strlen(next_line) == 0) + continue; + + printf("\n[histart] %s\n", next_line); + if (run_command(next_line, 0) != 0) { + printf("histart: Error - Command failed. Aborting script execution.\n"); + ret = CMD_RET_FAILURE; + break; + } + } + + free(script_heap_buf); + return ret; +} + +U_BOOT_CMD( + histart, 2, 1, do_histart, + "HiSilicon automatic firmware update system", + "[script_name] - Load and execute a flash script from TFTP" +); -- Gitee From 735e2c84d84b64240f5dc1ef2e0f25309c85566c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E8=87=B4=E9=B9=8F?= Date: Fri, 15 May 2026 13:50:38 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BB=A3=E7=A0=81=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=B7=BB=E5=8A=A0copyright=E3=80=81license?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温致鹏 --- vendor/ebaina/README.md | 2 +- vendor/ebaina/file/histart/gen_hstart.py | 14 ++++++++++++++ .../histart/u-boot-2020.01/cmd/cmd_histart.c | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/vendor/ebaina/README.md b/vendor/ebaina/README.md index 5334be2b..44e1791e 100644 --- a/vendor/ebaina/README.md +++ b/vendor/ebaina/README.md @@ -6,7 +6,7 @@ - 如有除openEuler系统外的其他系统需求,可下载[【易百纳】Euler Pi 2.0](https://pan.baidu.com/s/1GwvuEjbLGsMLyX8kkG8dlQ?pwd=s7hs)资料,需注意,其他系统需求不基于[Hi3403V100 HiSpark社区版本](https://gitee.com/HiSpark/pegasus/tree/master)。 - 海鸥派相关咨询或者疑问请前往[易百纳主导的海鸥派开源开发者社区](https://gitee.com/hieulerpi)提问。 - [海鸥派淘宝购买链接](https://item.taobao.com/item.htm?abbucket=13&id=755989596567&skuId=5948917988054)。 -- 提供了命令行烧录方式说明,详情请看[《histart 自动更新系统设计与使用手册》](./docs/histart/README_zh.md)。 +- 提供了命令行烧录方式说明,详情请查看[《histart 自动更新系统设计与使用手册》](./docs/histart/README_zh.md)。 ## 一、补丁说明 diff --git a/vendor/ebaina/file/histart/gen_hstart.py b/vendor/ebaina/file/histart/gen_hstart.py index 220b8527..973f2874 100644 --- a/vendor/ebaina/file/histart/gen_hstart.py +++ b/vendor/ebaina/file/histart/gen_hstart.py @@ -1,3 +1,17 @@ +# Copyright (c) 2026 Nanjing Qinuo Information Technology Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import xml.etree.ElementTree as ET import os import re diff --git a/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c b/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c index 2e120647..baf95999 100644 --- a/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c +++ b/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2026 Nanjing Qinuo Information Technology Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include #include #include -- Gitee From 8a924db00a5f852e99f4cb187f9290e110040d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E8=87=B4=E9=B9=8F?= Date: Fri, 15 May 2026 14:25:27 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dcodecheck?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温致鹏 --- .../histart/u-boot-2020.01/cmd/cmd_histart.c | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c b/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c index baf95999..df56b1c0 100644 --- a/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c +++ b/vendor/ebaina/file/histart/u-boot-2020.01/cmd/cmd_histart.c @@ -25,6 +25,7 @@ #define HISTART_DEFAULT_FILE "histart.txt" #define HISTART_LOAD_ADDR 0x41000000 #define HISTART_MMC_DEV_ID 0 /* Default eMMC device ID */ +#define RADIX_HEX 16 /* Hexadecimal base for string conversion */ /** * detect_emmc_capacity - Detect total blocks of eMMC and set environment variable @@ -45,7 +46,6 @@ static void detect_emmc_capacity(void) /** * get_script_next_line - Extract the next valid command line from the buffer * @line_buf_ptr: Pointer to the current position in the script buffer - * * Handles \r, \n, skip comments (#), and terminates at EOF or '%' */ static char *get_script_next_line(char **line_buf_ptr) @@ -53,22 +53,26 @@ static char *get_script_next_line(char **line_buf_ptr) char *line_buf = *line_buf_ptr; char *next_line = NULL; - if (!line_buf || *line_buf == '\0') + if (!line_buf || *line_buf == '\0') { return NULL; + } /* Skip leading whitespace and line breaks */ while (1) { - while (*line_buf && (isspace(*line_buf))) + while (*line_buf && (isspace(*line_buf))) { line_buf++; + } /* Check for EOF or end-of-script marker */ - if (*line_buf == '\0' || *line_buf == '%') + if (*line_buf == '\0' || *line_buf == '%') { return NULL; + } /* Handle comments: skip until end of line and continue searching */ if (*line_buf == '#') { - while (*line_buf && *line_buf != '\r' && *line_buf != '\n') + while (*line_buf && *line_buf != '\r' && *line_buf != '\n') { line_buf++; + } continue; } @@ -78,8 +82,9 @@ static char *get_script_next_line(char **line_buf_ptr) next_line = line_buf; /* Find the end of the current line */ - while (*line_buf && *line_buf != '\r' && *line_buf != '\n') + while (*line_buf && *line_buf != '\r' && *line_buf != '\n') { line_buf++; + } /* Null-terminate the current line and advance the buffer pointer */ if (*line_buf != '\0') { @@ -130,10 +135,9 @@ static int do_histart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) printf("histart: Error - 'filesize' env not found after TFTP\n"); return CMD_RET_FAILURE; } - filesize = simple_strtoul(filesize_str, NULL, 16); - + filesize = simple_strtoul(filesize_str, NULL, RADIX_HEX); if (filesize == 0 || filesize > HISTART_SCRIPT_MAX_SIZE) { - printf("histart: Error - Script too large (%lu bytes, max %d)\n", + printf("histart: Error - Script too large (%lu bytes, max %d)\n", filesize, HISTART_SCRIPT_MAX_SIZE); return CMD_RET_FAILURE; } @@ -150,8 +154,9 @@ static int do_histart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) /* 4. Parse and Execute Line-by-Line */ script_ptr = script_heap_buf; while ((next_line = get_script_next_line(&script_ptr)) != NULL) { - if (strlen(next_line) == 0) + if (strlen(next_line) == 0) { continue; + } printf("\n[histart] %s\n", next_line); if (run_command(next_line, 0) != 0) { -- Gitee From 99f003ee6c5e0b077c1c84afcd62dc7834e71a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E8=87=B4=E9=B9=8F?= Date: Wed, 20 May 2026 13:51:55 +0800 Subject: [PATCH 4/4] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=AD=98=E5=82=A8=E8=B7=AF=E5=BE=84=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=9B=BE=E7=89=87=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温致鹏 --- vendor/ebaina/docs/histart/README_zh.md | 12 ++++++------ .../{ => histart}/pic/image-20260508203250622.png | Bin .../{ => histart}/pic/image-20260508203314336.png | Bin .../{ => histart}/pic/image-20260508203636216.png | Bin .../{ => histart}/pic/image-20260508203713664.png | Bin .../{ => histart}/pic/image-20260508203728787.png | Bin .../{ => histart}/pic/image-20260508204836125.png | Bin 7 files changed, 6 insertions(+), 6 deletions(-) rename vendor/ebaina/docs/{ => histart}/pic/image-20260508203250622.png (100%) rename vendor/ebaina/docs/{ => histart}/pic/image-20260508203314336.png (100%) rename vendor/ebaina/docs/{ => histart}/pic/image-20260508203636216.png (100%) rename vendor/ebaina/docs/{ => histart}/pic/image-20260508203713664.png (100%) rename vendor/ebaina/docs/{ => histart}/pic/image-20260508203728787.png (100%) rename vendor/ebaina/docs/{ => histart}/pic/image-20260508204836125.png (100%) diff --git a/vendor/ebaina/docs/histart/README_zh.md b/vendor/ebaina/docs/histart/README_zh.md index 96badc63..a4bddb6e 100644 --- a/vendor/ebaina/docs/histart/README_zh.md +++ b/vendor/ebaina/docs/histart/README_zh.md @@ -32,7 +32,7 @@ obj-$(CONFIG_CMD_HISTART) += cmd_histart.o ``` - ![image-20260508203250622](./../pic/image-20260508203250622.png) + ![image-20260508203250622](./pic/image-20260508203250622.png) 3. 修改 `cmd/Kconfig`:在合适位置(如 config SYS_XTRACE命令后)添加配置定义: @@ -49,7 +49,7 @@ 4. 配置并编译:执行 `make menuconfig` 并勾选 `histart` 命令,随后执行 `make`4. 测试与操作人员指南 (使用步骤) - ![image-20260508203314336](./../pic/image-20260508203314336.png) + ![image-20260508203314336](./pic/image-20260508203314336.png) ## 4. 使用步骤 @@ -72,7 +72,7 @@ `vim /etc/default/tftpd-hpa`修改以下内容: `TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-l -c -s"` ,其中TFTP_DIRECTORY 指定文件存储路径。 -c 允许创建新文件。 - ![image-20260508204836125](./../pic/image-20260508204836125.png) + ![image-20260508204836125](./pic/image-20260508204836125.png) 重启服务以应用配置: @@ -110,7 +110,7 @@ python3 gen_hstart.py path/to/emmc_burn_table.xml setenv gatewayip ``` - ![image-20260508203713664](./../pic/image-20260508203713664.png) + ![image-20260508203713664](./pic/image-20260508203713664.png) 3. 执行histart烧录。 @@ -118,8 +118,8 @@ python3 gen_hstart.py path/to/emmc_burn_table.xml histart ``` - ![image-20260508203728787](./../pic/image-20260508203728787.png) + ![image-20260508203728787](./pic/image-20260508203728787.png) **自动完成**:系统将自动依次下载并烧录所有分区。完成后,系统将自动执行 `reset` 重启设备。 - ![image-20260508203636216](./../pic/image-20260508203636216.png) + ![image-20260508203636216](./pic/image-20260508203636216.png) diff --git a/vendor/ebaina/docs/pic/image-20260508203250622.png b/vendor/ebaina/docs/histart/pic/image-20260508203250622.png similarity index 100% rename from vendor/ebaina/docs/pic/image-20260508203250622.png rename to vendor/ebaina/docs/histart/pic/image-20260508203250622.png diff --git a/vendor/ebaina/docs/pic/image-20260508203314336.png b/vendor/ebaina/docs/histart/pic/image-20260508203314336.png similarity index 100% rename from vendor/ebaina/docs/pic/image-20260508203314336.png rename to vendor/ebaina/docs/histart/pic/image-20260508203314336.png diff --git a/vendor/ebaina/docs/pic/image-20260508203636216.png b/vendor/ebaina/docs/histart/pic/image-20260508203636216.png similarity index 100% rename from vendor/ebaina/docs/pic/image-20260508203636216.png rename to vendor/ebaina/docs/histart/pic/image-20260508203636216.png diff --git a/vendor/ebaina/docs/pic/image-20260508203713664.png b/vendor/ebaina/docs/histart/pic/image-20260508203713664.png similarity index 100% rename from vendor/ebaina/docs/pic/image-20260508203713664.png rename to vendor/ebaina/docs/histart/pic/image-20260508203713664.png diff --git a/vendor/ebaina/docs/pic/image-20260508203728787.png b/vendor/ebaina/docs/histart/pic/image-20260508203728787.png similarity index 100% rename from vendor/ebaina/docs/pic/image-20260508203728787.png rename to vendor/ebaina/docs/histart/pic/image-20260508203728787.png diff --git a/vendor/ebaina/docs/pic/image-20260508204836125.png b/vendor/ebaina/docs/histart/pic/image-20260508204836125.png similarity index 100% rename from vendor/ebaina/docs/pic/image-20260508204836125.png rename to vendor/ebaina/docs/histart/pic/image-20260508204836125.png -- Gitee