固件升级_固件升级包制作 - CSDN
精华内容
参与话题
  • 固件在线升级流程

    千次阅读 2019-03-20 16:15:36
    从事硬件开发,为了方便维护,免不了对模块进行固件升级,所以对于固件升级,简单整理了一下完整的在线升级的实现思路,该思路适用于所有带通讯总线的模块。 需要注意的是,需要额外的上位机配合。 下位机在线升级...

     

    从事硬件开发,为了方便维护,免不了对模块进行固件升级,所以对于固件升级,简单整理了一下完整的在线升级的实现思路,该思路适用于所有带通讯总线的模块。

    需要注意的是,需要额外的上位机配合。

    下位机在线升级流程如下图:

     

    原创图片,转发请标注出处。

    APP升级步骤

    (1)读软件版本、CPU型号、模块型号

    (2)UDP包,每包长度1024字节,写入update区

    (3)接收n包升级数据包,正常长度1024,将255整数长度的写入FLASH

    (4)若接收到回读固件指令,则说明数据发送完成,将最后小于255长度的数据补全0xFF写入FLASH,且根据索引依次返回固件数据,进行校验比较

    (5)比较通过后,写入APP升级标志,供重启后boot识别

    (6)重启,boot判断升级标志,将升级区域数据复制到APP区,清除升级标志,跳入APP开始运行

    BOOT升级步骤

    (1)读软件版本、CPU型号、模块型号

    (2)UDP包,每包长度1024字节,写入update区

    (3)接收n包升级数据包,正常长度1024,将255整数长度的写入FLASH

    (4)若接收到回读固件指令,则说明数据发送完毕,将小于255长度的数据补全0xFF写入FLASH,且根据索引依次返回固件标志,进行校验比较

    (5)比较通过后,将update区域数据复制到boot区,注意最后未满足255长度的数据,需要补全后再写入。

    (6)重启,正常运行。


    在线升级笔记1:

    (1)需要安装Agv_tool工具包,且本机电脑IP为192.168.0.xx网段

    (2)打开AgvTool后,在车辆管理中新增车辆,输入参考。 编号:3;IP:192.168.0.3;端口号:4410

    (3)配置管理界面:选中新增车辆,点击“连接”按钮进行连接;

    (4)固件升级界面中,“选择目标文件”选中xml文件(需要xml文件和bin文件在同一路径下,xml文件是配置文件,bin是固件)。然后开始获取固件操作。

    若固件获取失败,可以通过抓包,查看网口数据包,排查问题。


    在线升级笔记2:

    (1)由于UDP发送时未获取到目标IP地址,导致VCU无法获取到模块类型、软件版本、CPU类型;

    (2)获取类型成功后,点击升级开始升级;

    (3)升级逻辑:由于升级代码存放在0x40000,所以可以通过bin文件查看工具打开bin文件,并于写入FLASH中的0x40000中的数据进行对比,若完全一样,则说明写入成功;否则,写入失败,检查写入失败原因。


    在线升级笔记3:调试在线升级遇到的问题:

    (1)无法获得模块型号、软件版本号、CPU型号

    原因:由于udp应答时,协议控制块中没有赋给目标IP地址和目标port,导致发送IP地址为0.0.0.0,MAC地址为FF FF FF FF FF FF ;VCU无法处理

    (2)写FLASH错误,每次写0x400长度,前0x100写成功,之后写均失败,写FLASH逻辑问题。

    原因:VCU一次写请求长度为0x400,即1KB,但是单次写FLASH最小长度为0x100,故要分开写4次,且最后不够0x100时,用0xFF凑够,再写入FLASH,修改逻辑后,写FLASH问题修复

    (3)写完FLASH后,重启失败

    原因:重启失败是因为写FLASH完成后,没发送重启响应给VCU,导致VCU以为响应超时,其实已经重启完成。在控制板重启前保证成功发送重启i响应给VCU,解决问题。

    (4)存在概率性文件对比失败问题(通过抓包排查了问题)

    原因:

    (1)没有清除UDP接收标志,导致UpdataProcess()一直被执行,数据一致性出现问题,响应的索引值与请求索引值不一致,导致文件对比失败。

    (2)UDP发送函数中,pbuf赋值采用pbuf_tack()函数;修改该项无影响。

    (3)写完FLASH后,第一次读FLASH,会因为刚写完立马去做读操作,IAP会来不及处理,导致第一次读取FLASH都是00,做延时处理解决;

    (4)将UpdataProcess()处理,放在UDP接收回调中处理,会解决数据一致性,以及第一次读FLASH错误问题。

    展开全文
  • 固件升级思路

    2020-10-12 09:24:33
    需要一个升级APP程序功能,但是又不想再Bootloader里面做,因为一开始没有设计BootLoader。 所以只能在APP添加一个Update模块了。 Update的逻辑流程如下: Update程序通过串口读取要升级的APP程序数据。

    需要一个升级APP程序功能,但是又不想再Bootloader里面做,因为一开始没有设计BootLoader难过。 所以只能在APP添加一个Update模块了。

                Update的逻辑流程如下:

                                     

                      Update程序通过串口读取要升级的APP程序数据。

                      然后编写到ROM中。

     

                      因为CODE自己就在ROM中,为了防止把自己擦掉,所以Update要先把自己拷贝到RAM中去运行。

     

                      把CODE从ROM拷贝到RAM中去本以为要用汇编来写,其实用C语言就OK了。就是简单的Buf拷贝操作。

                      因为ARM的架构支持统一寻址模型:操作Device和操作RAM没有任何区别。

     

                     但是有个非常有趣的现象。

     

    程序类似与:

    //ROM中的Update地址

                    src_addr=(int32u*)Update;

                   //RAM中的Update地址

                    dst_addr=(int32u*)(0xXXXXXXXX);

                   //指针函数

                    jump_addr=(jump_func_type)dst_addr;

     

                    //拷贝update程序

                    for(i=0; i<CODE_LENGTH; i++)

                        *dst_addr++=*src_addr++;

                  

    //跳转到RAM中去执行Update

                    (*jump_addr)();

                   我把程序地址拷贝到偶数地址,就是死活跳转不过去。。。

                   我想是不是长跳转必须用汇编才行?

                   

                    偶然间分析一下APP.MAP文件,发现所有的Code都是thumb code。而且所有的函数地址都是奇数地址。

                    突然间恍然大悟。因为thumb code指令,PC的最低位必须是1,所以跳转地址也必须是奇数才行。

                    修改之后,果然可以跳转了。本以为这样万事大吉了。

     

                   但是发现,只要代码稍微修改一下,就可能宕机(也就是不能跳转到Update中去了),多增加一点或者减少一点代码可能就好了。

                  很是奇怪。

                  

                   还好有JTAG可以单步调试。最后发现,跳转的地址都是对的。

                  又查看了生成的汇编文件。

                  终于发现了问题的原因了:

                           虽然函数的跳转地址是奇数地址:比如 0x2000abc1;

                           但是函数的代码实际开始地址是:   0x2000abc0,也就是偶数地址。

     

                          也就是说Code是2字节对齐的。thumb指令是16位的。。所以比然是2字节对齐。

                         但是为什么代码的调用地址是奇数地址呢。因为ARM为了区分thumb指令和ARM指令,使用PC寄存器的最低位来区分的。如果最低位是1,则是thumb指令,如果是0则是ARM指令。

                          所以跳转地址是奇数地址,但是实际的代码的开始地址是偶数地址。

                          所以其实我少拷贝了一个BYTE的代码才导致了这么奇怪的BUG。

                         

                 把拷贝代码从新修改后就OK了。

     

                    src_addr=(int32u*)((int32u)Update - 1); //地址先减去一,拷贝代码的实际开始位置.

                    dst_addr=(int32u*)(0xXXXXXXXX); //当然dst_addr也是偶数地址。

                   重新修正jump_addr=((int32u)dst_addr+1); //跳转地址必须是奇数地址(这样CPU才知道是Thumb指令)

                    for(i=0; i<CODE_LENGTH; i++)

                        *dst_addr++=*src_addr++;

     

    转载自:http://blog.csdn.net/yuan1125/article/details/7273175

     

    自己增加部分:

              一个极其讨厌的人分享给我的,此人已经挂了,呵呵

     

    记录一下思路

     

     

    展开全文
  • 什么是Firmware升级

    千次阅读 2009-06-09 16:16:00
    Firmware是一种软件的代名词,但这种软件与普通意义上的软件完全不同,它是一种固化在集成电路内部的源程序代码,而集成电路的功能就是由这些程序而决定的。ROM不过只是Firmware的载体,而我们通常所说的BIOS正是...

    Firmware是一种软件的代名词,但这种软件与普通意义上的软件完全不同,它是一种固化在集成电路内部的源程序代码,而集成电路的功能就是由这些程序而决定的。ROM不过只是Firmware的载体,而我们通常所说的BIOS正是固化了系统主板Firmware的ROM芯片。

    Firmware是固化在了硬件中的软件,光存储的Firmware是运行在驱动器上的软件指令集,它存储着计算机系统中硬件设备最基本的参数,为系统提供最底层、最直接的硬件控制。Firmware功能上有点类似于主板上BIOS,同样在开机过程中,系统会先读取其内部的硬件设备初始化信息,使操作系统能够正确识别硬件,并为其他软件的运行提供最基本的依据。部分厂商还会在Firmware内存储市面上各式光盘的资料数据,主要是刻录机的Firmware存储刻录盘的资料,在刻录时检测当前使用盘的信息,与存储的资料进行对比,进而采取相应的刻录方法。

    Firmware是存储在硬件中的,其存储介质主要有ROM、PROM、EPROM、EEPROM和Flash Rom,现在的光储产品基本都使用可擦写的存储介质存储Firmware,便于用户刷新。Flash Rom是一种在EEPROM基础上改进的非易失性的存储介质,它在擦写数据时是以“块”为单位进行的,块的大小由厂商自定,而EEPROM则是以字节为单位进行擦写的,因此Flash Rom的擦写速度较快,其技术的先进性和操作的便捷性非常方便用户自行对固件进行升级。具体采用何种存储介质,设备制造商往往是根据制造成本、安全性能、是否需要升级、设备标准的发展变化等实际情况来综合考虑的。

    Firmware的重要性不言而喻,采用可擦写的介制是为了对其进行升级。厂家可以提供对Firmware的升级,以便为Firmware增加更多的功能或改进其性能,甚至修正其中的错误。虽然有些固件的问题可以通过软件补丁来弥补,但终归还是不如直接进行固件的升级来得可靠和方便。因此目前绝大多数的厂家在推出硬件产品时,都采用了可以升级的固件设计以提供更加灵活的适用性。

    一般光储厂商都会提供必要的Firmware升级程序,可以去其官方网站直接下载,此类程序容量都较小,一般在一二百KB以内。大部分的Firmware升级程序都需要在纯DOS环境下运行。注意并不是指Windows下的DOS窗口,而是指未进入Windows界面之前的DOS操作环境。

    来源:http://www.shenmeshi.com/Science/Science_20080411182418.html

    展开全文
  • 设备固件升级流程

    千次阅读 2018-08-06 21:00:17
    设备固件升级流程 粗略的讲述下,设备固件升级的流程。 设备Flash划分 应用 区域 BOOT 0x00000~0x10000 APP 0x10000~0x80000 APP 偏移10240地址,存放16位字符串 const char projectVersion...

    设备固件升级流程

    粗略的讲述下,设备固件升级的流程。

    设备Flash划分

    应用 区域
    BOOT 0x00000~0x10000
    APP 0x10000~0x80000

    APP 偏移10240地址,存放16位字符串

    const char projectVersion[0x10] __attribute__((at(PROJECT_VERSION_ADDR))) ="proMT V3.0"; 
    

    上位机流程

    1. 打开bin文件,读取文件偏移10240地址是否有“proMT”等项目关键字符
    2. 启动升级(Modbus写寄存器)
    3. 延时(等待BOOT初始化)
    4. Modbus写文件
    5. 结束升级(Modbus写寄存器)
    6. 读取固件信息(Modbus读寄存器,16位字符串)

    设备流程

    1. 接收到启动升级命令,跳转回BOOT
    2. 接收Modbus写文件,覆盖APP Flash
    3. 接收到结束升级命令,读取(APP起始地址+10240偏移地址)的16位字符串
    4. 16位字符串是否包含“proMT”等项目关键字符。
    5. 是:跳转到APP;否:继续停留在BOOT。
    展开全文
  • OpenWRT(十)web页面更新固件

    万次阅读 2017-02-07 20:55:04
    当我们的openwrt添加了luci后就可以通过web页面进行固件升级了,下面我们来看一下具体步骤: 1、 2、 3、 通过上面三个步骤就完成了更新,是不是很简单!!更新过程要稍等一会。。。。
  • OTA固件升级介绍

    千次阅读 2019-06-27 09:54:36
    手把手教你如何实现自动固件更新—服务器篇 WiFi物联中的OTA固件升级设计原理
  • openmv固件升级(常规)

    千次阅读 2019-05-23 17:24:55
    一、为什么要对openmv进行固件升级 OpenMV项目是一直更新的,用户可以升级固件来保持更新。 每次更新,都会修复bug,增加新的功能。 有两种方式升级固件,一种是IDE自带的功能,使用bootloader升级固件,我们称之...
  • factory多了一些验证的东西,用于在原厂固件的基础上进行升级。 普通家用路由一般不是openwrt固件,如果要将家用路由升级为openwrt固件,就可以用factory刷到路由上。sysupgrade是在openwrt路由基础上升级固件,无论...
  • 关于Jlink v8固件升级的完美解决方法

    万次阅读 2017-12-01 16:22:28
    今天Jlink的固件突然丢失,连电脑灯都不亮,在网上找了很多升级固件的文章。按照文章里面的说的,也重新升级好了,但由于固件的原因,Jlink一插上电脑就提示Jlink是clone的,具体的提示信息就不详细写出来了。后来又...
  • 路由器TL-WR800N固件升级

    万次阅读 2014-02-24 20:10:35
    实验室最近的路由器出问题了,自己尝试一下固件升级。探索了有一个小时,费了不少功夫。。。 本人是win8系统,路由器为TL-WR800N便携路由器,方法如下: 一:首先要把路由器设置成AP模式(默认的就是AP模式的),...
  • DELL R720更新IDRAC固件(WEB界面更新)

    千次阅读 2018-12-28 11:31:50
    先下载好需要升级的iDRAC固件放到U盘,U盘插到PC端 登录iDRAC的web界面,以下界面是查看目前的iDRAC版本信息 更新固件选择update and rollback,然后浏览需要升级固件信息 浏览完成文件之后选择upload上载...
  • 实战Linksys WRH54G的固件升级

    万次阅读 2009-03-08 18:57:00
    实战Linksys WRH54G的固件升级Bob.Shao2009-3-8一、 引子 为了家中无线上网方便,买了一款家用级的无线路由器,选择Linksys WRH54G是因为它系出名门,价格又便宜,同时商家又宣称它支持第三方固件的升级,呃,这...
  • DELL R720更新IDRAC固件(LC界面更新)

    千次阅读 2018-12-28 11:28:19
    开机看见DELL图标之后按F10进入LIFECYCLE CONTROLLER界面,选择固件更新,并启动固件更新。 2.使将所需要更新的固件放在U盘中,选择本地驱动器,点击下一步。   3.插入U盘点击浏览后,选择相应固件,为方便...
  • 在浏览器里登陆 192.168.1.1 进行固件升级是比较简单的。今天我们要尝试的的是命令行刷机升级。命令行的方式更强大。 SSH登录路由器 在Ubuntu里,按Ctrl+Alt+T打开命令行终端,输入: ssh root@192.16
  • 小米蓝牙音箱固件升级工具

    千次阅读 2020-03-27 15:10:12
    小米蓝牙音箱固件升级工具 小米论坛流传的版本(没有体现到什么升级,只是能把变砖的救回来),重新挂网盘上,有需要可以下载。 链接:https://pan.baidu.com/s/1mK--ys5yPemElvSmdRLKlA 提取码:710f ...
  • rk3399开发板固件升级

    千次阅读 2017-12-21 15:18:27
    最近开发rk3399开发板上的应用,但是开发的过程中总是会时不时的出现Android studio识别不了开发板的情况,最后升级了一下rk3399的固件可了。 升级固件:很简单,就是用AndroidTool把新的固件替换上,win10系统也...
  • 由于课题研究的需要,昨天再次把DJI Phantom 3A拿出来准备熟悉一下飞行操作,可是就在上电准备起飞的时候,DJI GO提示遥控器固件需要升级,没想到就升出问题来了。我是按照App提示的操作进行升级的,从原来的1.4.30+...
  • Android蓝牙固件升级

    千次阅读 2019-06-20 18:23:28
    ble使用(一)http://blog.csdn.net/duo_shine/article/details/70257113 ...今天有时间补上ble的最后一篇固件升级(OTA升级,空中升级等)首先要知道为什么需要固件升级,有什么好处,固件升级可以修复bug,增加功能等,
  • 当防火墙使用了很长一段时间,或者出现一些莫名其妙问题的时候,我们建议将固件升级到新的版本。可以通过Web介面或命令行进行固件升级,这里我们介绍Web介面下的固件升级,操作比较简单。
  • k2p 官方固件纯净版

    千次阅读 2019-06-08 00:29:02
    k2p官方固件的纯净版本,去掉了在线升级,喜欢官方原版不折腾的用户可尝试,注意需要在breed下刷入,刷入固件的时候选择分区布局为菲讯布局,否则无法启动,只适用于银色A1 A2版本的机器,金色不适用。 解压密码123...
1 2 3 4 5 ... 20
收藏数 20,885
精华内容 8,354
关键字:

固件升级