国民技术N32G430开发笔记(16)- IAP升级 整合多个bin文件为一个升级包

news2024/11/24 0:50:43

IAP升级 整合多个bin文件为一个升级包

1、我们的程序分区目前为:
Boot 0x8000000 – 0x8004000 16KB
Settings 0x8004000 – 0x8006000 8KB
App 0x8006000 – 0x800B000 20KB
Download 0x800B000 – 0x800FFFF 20KB

2、烧录时候的bin文件有三个:
Bootloader.bin. 起始地址0x8000000
Settings.bin 起始地址0x8004000
Application.bin 起始地址0x8006000

3、我们新建一个(16+8+20)*1024个字节的数组,将Bootloader.bin从0开始填到数组中,将Settings.bin从0x4000处填充到数组中,将Application.bin 从0x6000填充到数组中,最后写入文件中,即可得到我们想要的all.bin

4、代码路径:
在这里插入图片描述
5、代码分析:
generate_bin.c

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "settings.h"
#include "flash.h"

#define APP_BIN_PATH            "../Application/build/Application.bin"
#define BOOT_BIN_PATH           "../Bootloader/build/Bootloader.bin"
#define SETTING_BIN_PATH        "../Settings/build/Settings.bin"
#define ALL_BIN_LENGTH          (16 + 8 + 20) * 1024
#define OTA_BIN_LENGTH          (8 + 20) * 1024

static int copy_bootloader_bin(MI_U8 *p_buff)
{   
    FILE *file;
    MI_U8 r_buff[BOOT_SIZE] = {0};
    size_t r_size;
    size_t file_size;

    file = fopen(BOOT_BIN_PATH,"rb");

    if (file == NULL)
    {
        printf("fopen BootLoader error\n");
        return -1;
    }

    fseek(file,0,SEEK_END);
    file_size = ftell(file);
    fseek(file,0,SEEK_SET);

    r_size = fread(r_buff,sizeof(MI_U8),sizeof(r_buff),file);
    if (r_size != file_size)
    {
        printf("read bootloader size == %ld\n",r_size);
    }
    else
    {
        printf("read bootloader file ok\n" );
    }
    memcpy(p_buff,r_buff,r_size);

    fclose(file);
    return 0;
}

static int copy_settings_bin(MI_U8 *p_buff)
{

    FILE *file = fopen(SETTING_BIN_PATH,"rb");
    MI_U8 r_buff[SETTINGS_SIZE] = {0};
    size_t r_size;
    size_t file_size;

    if (file == NULL)
    {
        printf("fopen Application error\n");
        return -1;
    }

    fseek(file,0,SEEK_END);
    file_size = ftell(file);
    fseek(file,0,SEEK_SET);

    r_size = fread(r_buff,sizeof(MI_U8),sizeof(r_buff),file);
    if (r_size != file_size)
    {
        printf("read settings size == %ld\n",r_size);
    }
    else
    {
        printf("read settings file ok\n" );
    }
    p_buff += (BOOT_SIZE);
    memcpy(p_buff,r_buff,r_size);

    fclose(file);
    return 0;

}

static int copy_application_bin(MI_U8 *p_buff)
{

    FILE *file = fopen(APP_BIN_PATH,"rb");
    MI_U8 r_buff[APP_SIZE] = {0};
    size_t r_size;
    size_t file_size;

    if (file == NULL)
    {
        printf("fopen Application error\n");
        return -1;
    }

    fseek(file,0,SEEK_END);
    file_size = ftell(file);
    fseek(file,0,SEEK_SET);

    r_size = fread(r_buff,sizeof(MI_U8),sizeof(r_buff),file);
    if (r_size != file_size)
    {
        printf("read Application size == %ld\n",r_size);
    }
    else
    {
        printf("read Application file ok\n" );
    }

    p_buff += (BOOT_SIZE + SETTINGS_SIZE);
    memcpy(p_buff,r_buff,r_size);

    fclose(file);
    return 0;
}

static MI_BOOL create_all_bin(void)
{
    int ret;
    MI_U8 all_data[ALL_BIN_LENGTH] = {0};
    size_t w_size = 0;

    ret = copy_bootloader_bin(all_data);

    if (ret != 0)
    {
        printf("copy_bootloader_bin error\n");
        return -1;
    }

    ret = copy_settings_bin(all_data);

    if (ret != 0)
    {
        printf("copy_settings_bin error\n");
        return -1;
    }

    ret = copy_application_bin(all_data);

    if (ret != 0)
    {
        printf("copy_application_bin error\n");
        return -1;
    }

    FILE *file = fopen("../output/all.bin","wb");

    if (file == NULL)
    {
        printf("fopen all.bin error\n");
        return -1;
    }

    w_size = fwrite(all_data,1,(BOOT_SIZE + SETTINGS_SIZE + APP_SIZE),file);
    fclose(file);

    if (w_size == BOOT_SIZE + SETTINGS_SIZE + APP_SIZE)
    {
        printf("Create bin is Ok\n");
    }
    else
    {
        printf("Create bin error\n");
        return -1;
    }

    return MI_TRUE;
}

int main(int argc,char *argv[])
{
    if (MI_TRUE == create_all_bin())
        printf(FONT_COLOR_BLUE"Create all.bin Success!\n"COLOR_NONE);
    else
        printf(BACKGROUND_COLOR_RED"Create all.bin Success!\n"COLOR_NONE);
    return 0;
}

6、Makefile

CC = gcc
SRC = $(wildcard *.c)
OBJ = $(addprefix $(BUILD_DIR)/,$(notdir $(SRC:.c=.o)))
#OBJ = $(patsubst %.c, %.o, $(SRC))

TRAGET = generate
BUILD_DIR = build


C_INCLUDES +=  \
	-I../Common/Flash \
	-I../Common/Settings \
	-I../Common

C_FLAG += -Wall -MD -MP -MF"$(@:%.o=%.d)"

C_FLAG += -DUSER_SETTING_IN_HOST
 
all: $(BUILD_DIR) $(BUILD_DIR)/$(TRAGET)

$(BUILD_DIR)/$(TRAGET):$(OBJ) Makefile | $(BUILD_DIR) 
	$(CC)  $< -o $@

$(OBJ): $(SRC)  Makefile | $(BUILD_DIR) 
	$(CC) -c $(C_FLAG) $(C_INCLUDES) $< -o $@

$(BUILD_DIR):
	@-mkdir $@

clean:
	@rm -rf $(TRAGET)
	@rm -rf $(OBJ)
	@rm -rf $(BUILD_DIR)

-include $(wildcard $(BUILD_DIR)/*.d)

# *** EOF ***

7、根目录下make后回在output下生成all.bin文件
8、make allbin 烧录到办卡验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker笔记整理

安装Docker 通过 uname -r 命令查看你当前的内核版本 uname -r 使用 root 权限登录 Centos。确保 yum 包更新到最新 yum -y update 卸载旧版本(如果安装过旧版本的话) yum remove docker docker-common docker-selinux docker-engine 安装需要的软件包&#xff0c; yum-u…

Web前端已死?别带节奏了,说白了就是“卷”

趁着“前端已死”这个话题还有点热度&#xff0c;我想再好好聊聊这个话题。社区里怎么只有前端已死的论调&#xff0c;后端、DB、运维、连原生开发还在好好“划水”。前端却发出了哀嚎&#xff1a;前端已死&#xff0c;找工作好难啊。 前端技术精微渊深&#xff0c;除了基础的…

( 数组和矩阵) 766. 托普利茨矩阵 ——【Leetcode每日一题】

❓766. 托普利茨矩阵 难度&#xff1a;简单 给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同&#xff0c;那么这个矩阵是 托普利茨矩阵 。…

【Python习题集7】Python对CSV文件数据进行可视化

csv可视化 一、实验内容二、实验总结 一、实验内容 1、datal.csv中的B、C、D和E列数据分别是日期、权重、A企业的销售额、B企业的销售额。读取C、D、E列数据&#xff0c;并统计E列数据的算术平均数、加权平均值(权值为C列数据)、方差、中位数、最小值、最大值。并绘制E列数据的…

MyBatis:使用 MyBatis 实现多表查询(多对一和一对多)、动态 SQL、缓存

文章目录 MyBatis&#xff1a;Day 03一、复杂查询的环境搭建二、多表查询1. 多对一&#xff1a;关联&#xff08;1&#xff09;联表查询&#xff08;2&#xff09;子查询 2. 一对多&#xff1a;集合&#xff08;1&#xff09;联表查询&#xff08;2&#xff09;子查询 3. 总结 …

JavaScript学习(一)

一、JavaScript的背景及知识结构 1、三个问题 什么是JavaScript&#xff1f;JavaScript能干什么&#xff1f;JavaScript是由什么构成的&#xff1f;怎样学习JavaScript&#xff1f; 2、什么是JavaScript&#xff1f; ①JavaScript是一种轻量级的编程语言&#xff1b;借鉴了J…

2023年2月573名学员通过国家信息安全水平考试其中CISP218名,NISP二级355名

北京PER20230217HEBAN3 考试时间&#xff1a;2023年02月17日 地点&#xff1a;北京 王佳俊、王后月、程鹏、王海洋、牛麒盛、张飞、禹晓瑞、李鹏卫、柳位世、李霖、刘志超、刘峰、张广军、刘鑫博、王琳、翟栋、刘高军、康寅哲、夏中玲、冯光豪、程岩辉、白玉强、遆盼明、李淼…

IDEA部署tomcat项目

文章目录 只是部署一下看到这里即可war和war exploded的区别warwar exploded update的动作update resourcesupdate classes and resourcesredeployrestart server 解决了拿到了一个tomcat项目后如何将它部署到IDEA里面的问题。 file->open 选中pom.xml并open as project …

【网站架构】Nginx 4层、7层代理配置,正向代理、反向代理详解

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论网络代理。 在往期《大型网站 安全性》介绍过&#xff0c;出于网络安全的考虑&#xff0c;一般大型网站都需要做网络区域隔离&#xff0c;以防止攻击者直接操控服务器。 网站系统的应用及数据库都会放在这个网络安全…

js实现归并排序(mergeSort)

理解归并排序 归并排序是一种基于分治思想的排序算法&#xff0c;它将一个待排序的序列分为两个子序列&#xff0c;分别对子序列进行排序&#xff0c;然后将排好序的子序列合并成一个有序的序列。这个过程可以递归地进行&#xff0c;直到序列被划分为只有一个元素时停止递归。 …

版本控制 | 如何使用虚幻引擎的多用户编辑(MUE)功能

随着现代虚拟制作技术的发展&#xff0c;电影制片厂不再需要完全依赖实际场景&#xff0c;而是可以在拍摄期间就让虚拟制作设计团队将实景与计算机生成的虚拟内容融合在一起。虚幻多用户编辑&#xff08;Unreal Multi-User Editing&#xff0c;简称MUE&#xff09;可以帮助简化…

【产品方案】后台管理系统设计思路

第一章 前言 相比前端设计&#xff0c;我更喜欢设计后台管理系统。如果说前端设计考验的是共情能力&#xff0c;那后台管理系统设计考研的就是逻辑能力&#xff0c;前者需要站在用户的角度&#xff0c;后者是站在管理者的角度思考。 有幸参与了公司不少业务系统从“0-1”的设计…

使用prometheus时发现mongodb exporter的/metrics数据展示很慢,延迟高

项目场景&#xff1a; 使用prometheusgrafana搭建对mongoDB集群的监控。 问题描述 使用prometheus时发现mongodb exporter的/metrics数据展示接口很慢&#xff0c;延迟高。 看了一下大概是10s 原因分析&#xff1a; 由于是在云服务器上进行搭建的。 经过尝试之后发现创建mo…

Apache Doris学习记录

1. Doris基础学习 中文官网:https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary/ 1.1 doris 简介 Apache Doris 是一个现代化的 MPP(Massively Parallel Processing&#xff0c;即大规模并行处理) 分析型数据库产品 亚秒级响应时间即可获得查询结果 可以支持 10PB…

Python每日一练:最长递增的区间长度(一行代码花样解法)

文章目录 前言一、题目二、一行超人三、分析一下思路 总结 前言 很显然&#xff0c;Python的受众远远大于C&#xff0c;其实笔者本人对Python的理解也是远强于C的&#xff0c;C纯粹是为了假装笔者是个职业选手才随便玩玩的&#xff0c;借着十多年前学的C的功底&#xff0c;强行…

链表(数据结构)

目录 链表 链表的分类 1、单向或者双向 2、带头或者不带头 3、循环或者非循环 总结&#xff1a; 单链表 创建链式结构 创建新节点 尾插 尾删 头插 头删 查找节点 在pos位置后插入 删除pos位置后的节点 销毁 链表 概念&#xff1a; 链表是一种物理结构上非连续的、非顺序的存储结…

c# 数据保存为PDF(二) (Aspose pdf篇)

文章目录 前言关于Aspose PDF使用Aspose.Pdf常用的命名空间和类库1 创建简单的PDF文档2 美化PDF样式2.1 创建测试数据2.2 项目头部样式2.3 全部代码 小结附录参考 前言 项目中需要将数据导出存为PDF格式&#xff0c;试了一下Aspose组件&#xff0c;仅以此记录一下使用感受。 …

设计模式——原型模式(浅拷贝和深拷贝)

是什么&#xff1f; 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象&#xff1b; 结构 抽象原型类&#xff1a;规定了具体原型对象必须实现的Clone&#xff08;&#xff09;方法&#xff1b; 具体原型类&#xff1a;实现抽象…

Elasticsearch:NLP 和 Elastic:入门

自然语言处理 (Natural Language Processing - NLP) 是人工智能 (AI) 的一个分支&#xff0c;专注于尽可能接近人类解释的理解人类语言&#xff0c;将计算语言学与统计、机器学习和深度学习模型相结合。 AI - Artificial Inteligence 人工智能ML - Machine Learning 机器学习DL…

集线器、网桥、交换机

一.集线器 集线器&#xff08;HUB&#xff09;&#xff0c;它是工作在物理层的设备&#xff0c; 由于它只是工作在物理层的设备&#xff0c;所以它并不关心也不可能关心OSI上面几层所涉及的&#xff0c;它的工作机制流程是&#xff1a;从一个端口接收到数据包时&#xff0c;会在…