1.NB-IOT远程升级第3弹:移植代码分析
2.linuxuboot
3.U-Boot工作模式
4.云主机装黑果实践(4):阿里轻量机上变色龙bootloader启动问题
5.详解STM32在线IAP升级
6.嵌入式Linux之uboot源码make配置编译正向分析(一)
NB-IOT远程升级第3弹:移植代码分析
在物联网项目开发中,源码远程升级功能(OTA)至关重要,分析这允许通过WIFI、源码蓝牙、分析4G、源码NB-IOT等方式将升级包传输至MCU,分析cegui源码实现代码存储与更新。源码本文系列将详细介绍基于电信AEP平台的分析NB-IOT设备远程升级流程,包括STM内部分区、源码BootLoader编写、分析软件包制作、源码升级协议对接等内容。分析本系列将逐步解析,源码直至完成。分析 系列文章大纲如下: 在前两篇中,源码我们深入探讨了BootLoader编写要点及电信AEP平台软件包制作。在第二篇,我们了解了使用PCP协议的远程升级流程,并通过串口助手模拟升级流程,为代码编写做足准备。 此篇章,我们将通过分析开源FOTA代码,进一步理解PCP协议与远程升级流程,便于各位进行代码移植。源码介绍
本文档以小熊派开发板的ota远程升级代码为例,运行环境如下。ai辅助阅读源码结合参考案例代码与上篇内容,能够深化对远程升级的理解,发现过程并不复杂。源码分析
接收数据解析
接收电信AEP平台发送的数据,解析数据以判断是否为PCP协议的远程升级命令。解析信息包括起始标识位、版本号、消息码、校验码、数据区长度与数据区。升级流程状态机
基于消息码的状态机,用于跟踪远程升级流程中的状态变化。设备应答
设备向平台发送应答消息,确认接收与处理能力。设备发送数据
设备将数据发送至平台,执行命令或更新请求。新版本通知
设备收到新版本通知后,向物联网平台返回应答,请求或拒绝升级。请求分片包
设备请求下载完整软件包,以备后续升级。执行升级
设备接收到执行升级指令后,执行更新操作并反馈至平台。上报升级结果
设备完成升级后,向平台报告升级状态。gom引擎源码外泄超时处理
针对升级请求或执行过程中可能出现的超时问题,进行妥善处理。踩坑记录
至此,基于电信AEP平台的NB-IOT远程升级系列内容结束。在此过程中,我作为轻松学长,分享了物联网开发的点滴与经验,希望大家能从中获益,共同成长。 分享是一种精神,通过分享,我们不仅传递知识,也传递了生活的态度与乐趣。愿你在物联网开发的道路上越走越远,分享与学习并行,创造更多精彩。linuxuboot
ubootæ¯ä»ä¹ææï¼U-Bootï¼å ¨ç§°UniversalBootLoaderï¼æ¯éµå¾ªGPLæ¡æ¬¾çå¼æ¾æºç 项ç®ãU-Bootçä½ç¨æ¯ç³»ç»å¼å¯¼ãU-Bootä»FADSROMã8xxROMãPPCBOOTéæ¥åå±æ¼åèæ¥ãå ¶æºç ç®å½ãç¼è¯å½¢å¼ä¸Linuxå æ ¸å¾ç¸ä¼¼ï¼äºå®ä¸ï¼ä¸å°U-Bootæºç å°±æ¯æ ¹æ®ç¸åºçLinuxå æ ¸æºç¨åºè¿è¡ç®åèå½¢æçï¼å°¤å ¶æ¯ä¸äºè®¾å¤ç驱å¨ç¨åºï¼è¿ä»U-Bootæºç ç注éä¸è½ä½ç°è¿ä¸ç¹ã
ubootæ¯ä¸ä¸ªæä½ç³»ç»å æ ¸è¿æ¯ä¸æ®µå¼å¯¼ç¨åºï¼
æ¯ä¸æ®µå¼å¯¼ç¨åºã
1ï¼ubootæ¯ç¨æ¥å¹²ä»ä¹çï¼æä»ä¹ä½ç¨ï¼
ubootå±äºbootloaderçä¸ç§ï¼æ¯ç¨æ¥å¼å¯¼å¯å¨å æ ¸çï¼å®çæç»ç®çå°±æ¯ï¼ä»flashä¸è¯»åºå æ ¸ï¼æ¾å°å åä¸ï¼å¯å¨å æ ¸
æ以ï¼ç±ä¸é¢æè¿°çï¼å°±ç¥éï¼UBOOTéè¦å ·æ读åflashçè½åã
2ï¼ubootæ¯ææ ·å¼å¯¼å¯å¨å æ ¸çï¼
ubootåå¼å§è¢«æ¾å°flashä¸ï¼æ¿åä¸çµåï¼ä¼èªå¨æå ¶ä¸çä¸é¨å代ç æ·å°å åä¸æ§è¡ï¼è¿é¨å代ç è´è´£æå©ä½çuboot代ç æ·å°å åä¸ï¼ç¶åuboot代ç åækernelé¨å代ç ä¹æ·å°å åä¸ï¼å¹¶ä¸å¯å¨ï¼å æ ¸å¯å¨åï¼æçæ ¹æ件系ç»ï¼æ§è¡åºç¨ç¨åºã
3ï¼ubootå¯å¨ç大è¿ç¨æ¯æä¹æ ·çï¼
ubootå¯å¨ä¸»è¦å为两个é¶æ®µï¼ä¸»è¦å¨start.sæ件ä¸ï¼ç¬¬ä¸é¶æ®µä¸»è¦åçæ¯ç¡¬ä»¶çåå§åï¼å æ¬ï¼è®¾ç½®å¤çå¨æ¨¡å¼ä¸ºSVC模å¼ï¼å ³éçé¨çï¼å±è½ä¸æï¼åå§åsdramï¼è®¾ç½®æ ï¼è®¾ç½®æ¶éï¼ä»flashæ·è´ä»£ç å°å åï¼æ¸ é¤bss段çï¼bss段æ¯ç¨æ¥åå¨éæåéï¼å ¨å±åéçï¼ç¶åç¨åºè·³è½¬å°start_arm_bootå½æ°ï¼å®£å第ä¸é¶æ®µçç»æã
第äºé¶æ®µæ¯è¾å¤æï¼åçå·¥ä½ä¸»è¦æ¯1.ä»flashä¸è¯»åºå æ ¸ã2.å¯å¨å æ ¸ãstart_arm_bootç主è¦æµç¨ä¸ºï¼è®¾ç½®æºå¨idï¼åå§åflashï¼ç¶åè¿å ¥main_loopï¼çå¾ ubootå½ä»¤ï¼ubootè¦å¯å¨å æ ¸ï¼ä¸»è¦ç»è¿ä¸¤ä¸ªå½æ°ï¼ç¬¬ä¸ä¸ªæ¯s=getenv(bootcmdï¼ï¼ç¬¬äºä¸ªæ¯run_command(s...),æ以è¦å¯å¨å æ ¸ï¼éè¦æ ¹æ®bootcmdç¯å¢åéçå 容å¯å¨ï¼bootcmdç¯å¢åéä¸è¬æ示äºä»æ个flashå°å读åå æ ¸å°å¯å¨çå åå°åï¼ç¶åå¯å¨ï¼bootmã
ubootå¯å¨çå æ ¸ä¸ºuImage,è¿ç§æ ¼å¼çå æ ¸æ¯ç±ä¸¤é¨åç»æï¼çæ£çå æ ¸åå æ ¸å¤´é¨ç»æï¼å¤´é¨ä¸å æ¬å æ ¸ä¸çä¸äºä¿¡æ¯ï¼æ¯å¦å æ ¸çå è½½å°åï¼å ¥å£å°åã
ubootå¨æ¥åå°å¯å¨å½ä»¤åï¼è¦åç主è¦æ¯ï¼1ï¼è¯»åå æ ¸å¤´é¨ï¼2ï¼ç§»å¨å æ ¸å°åéçå è½½å°åï¼3ï¼å¯å¨å æ ¸ï¼æ§è¡do_bootm_linux
do_bootm_linux主è¦åç为ï¼1ï¼è®¾ç½®å¯å¨åæ°ï¼å¨ç¹å®çå°åï¼ä¿åå¯å¨åæ°ï¼å½æ°åå«ä¸ºsetup_start_tag,setup_memory_tag,setup_commandline_tag,setup_end_tagï¼æ ¹æ®ååæ们就ç¥éå ·ä½ç段å åå¨çä¿¡æ¯ï¼memoryä¸ä¸ºæ¿åçå å大å°ä¿¡æ¯ï¼commandline为å½ä»¤è¡ä¿¡æ¯ï¼
2ï¼è·³å°å ¥å£å°åï¼å¯å¨å æ ¸
å¯å¨çå½æ°ä¸ºthe_kernel(0,bd->bi_arch_number,bd->bi_boot_param)
bd->bi_arch_number为æ¿åçæºå¨ç ï¼bd->bi_boot_param为å¯å¨åæ°çå°å
æ»ç»ï¼
1)uboot主è¦ä½ç¨æ¯ç¨æ¥å¯å¨æä½ç³»ç»å æ ¸ãä½ç°å¨ubootæåä¸å¥ä»£ç å°±æ¯å¯å¨å æ ¸ã
2)ubootè¿è¦è´è´£é¨ç½²æ´ä¸ªè®¡ç®æºç³»ç»ãä½ç°å¨ubootæåçä¼ åã
3)ubootä¸è¿ææä½Flashçæ¿åä¸ç¡¬ä»¶ç驱å¨ãä¾å¦ä¸²å£è¦æå°ï¼pingç½ç»æåï¼æ¦é¤ãç§åflashæ¯å¦æåçã
4)ubootè¿å¾æä¾ä¸ä¸ªå½ä»¤è¡çé¢ä¾äººæ¥æä½ãå¾ç®åï¼è³å°ä½ è½çå°ã
ubootå½ä»¤å¦ä½å¼å¯¼linuxï¼
U-Booté¤äºBootloaderçç³»ç»å¼å¯¼åè½,å®è¿æç¨æ·å½ä»¤æ¥å£,å ·å¤å¤ç§å¼å¯¼å æ ¸å¯å¨çæ¹å¼ã常ç¨çgoåbootmå½ä»¤å¯ä»¥ç´æ¥å¼å¯¼Linuxå æ ¸æ åå¯å¨ãU-Bootï¼å ¨ç§°UniversalBootLoaderï¼æ¯éµå¾ªGPLæ¡æ¬¾çå¼æ¾æºç 项ç®ãä»FADSROMã8xxROMãPPCBOOTéæ¥åå±æ¼åèæ¥ãå ¶æºç ç®å½ãç¼è¯å½¢å¼ä¸Linuxå æ ¸å¾ç¸ä¼¼ï¼äºå®ä¸ï¼ä¸å°U-Bootæºç å°±æ¯æ ¹æ®ç¸åºçLinuxå æ ¸æºç¨åºè¿è¡ç®åèå½¢æçï¼å°¤å ¶æ¯ä¸äºè®¾å¤ç驱å¨ç¨åºï¼è¿ä»U-Bootæºç ç注éä¸è½ä½ç°è¿ä¸ç¹ã
å¦ä½ghostlinuxç³»ç»ï¼
使ç¨Ghost软件æ¥å®ç°å¤ä»½åæ¢å¤Linuxç³»ç»ï¼
1ãé¦å ç¨âé¨ææ¨é£GhostXPSP3纯åçY6.0âå çè¿è¡å¼å¯¼ï¼å¹¶ä½¿ç¨å ¶ä¸çPQ软件对硬çè¿è¡ååºï¼åååºä¸ä¸ªååºç¨äºå®è£ DOSç³»ç»ãç¶åéæ©ï¼âè¿è¡YLMFDOSå·¥å ·ç®±âãå³ï¼è¿è¡PQ软件ï¼å¯¹ç¡¬çè¿è¡ååºã
2ãå åä¸ä¸ªååºï¼å¤§å°ä¸ºå¤§çº¦ä¸º4Gï¼ç¨äºå®è£ DOSç³»ç»ä»¥ååæ¾GHOSTæåçå¤ä»½æ件ï¼å½ç¶å®é å½ä¸ï¼åºè¯¥å°è¿ä¸ªååºç大å°è°å¤§ç¹ã
3ãåæ¶è¿éææ°ååºåºæ¥çCçï¼è®¾ç½®ä¸ºâæ´»å¨âï¼ä»¥æ¹ä¾¿å¯å¨æ¶ï¼è½ä»Cçå¯å¨DOSç³»ç»ã
4ãç¨å çè¿è¡å¼å¯¼ï¼å建Cçå¯å¨DOSç³»ç»æ¶æéè¦çæ件ï¼ä»¥åGHOSTç¨åºçå¤å¶å°Cçã
5ãå®è£ Linuxç³»ç»ï¼å¨å®è£ æ¶ï¼å»ºè®®ä¸è¦æGRUBå®è£ MBRä¸ï¼åæ¶å¨ååååºæ¶ï¼å»ºè®®ä¸ºï¼bootãvarãhomeå建åç¬çååºã
6ãä»DOSç³»ç»å¯å¨ï¼ç¶åè¿è¡GHOST软件对Linuxç³»ç»è¿è¡å¤ä»½ã1ï¼ãå¤ä»½Linuxç³»ç»çbootååºï¼â/boot"ï¼ã2ï¼ãå¤ä»½Linuxç³»ç»çæ ¹ååºï¼"/"ï¼7ãLinuxç³»ç»åºç°é®é¢ï¼æ æ³å¯å¨æ³¨æï¼ç±äºä¹åæDOSç³»ç»çååºï¼å³ï¼Cçï¼ï¼è®¾ç½®æâæ´»å¨âï¼æ以è¿éå¿ é¡»ä¿®æ¹ä¸ä¸ï¼è®©â/boot"设置ææ´»å¨çï¼è¿æ ·æè½å¯å¨linuxç³»ç»ã
U-Boot工作模式
U-Boot, 一个广泛应用于嵌入式系统的Bootloader,具有两种主要的工作模式:启动加载模式和下载模式。在嵌入式产品出厂时,Bootloader默认处于启动加载模式,其核心任务是确保设备的正常启动。它会自动地从存储在FLASH中的嵌入式操作系统加载到SDRAM中,然后执行后续的操作流程。 相比之下,下载模式则提供了更为灵活的链科云源码操作方式。在这种模式下,Bootloader通过特定的通信机制,允许用户从外部PC机将内核映像或根文件系统映像等关键文件传输到目标板的存储介质——通常为FLASH。用户可以利用Bootloader提供的命令接口,进行定制化下载和管理,满足不同的需求和应用场景。扩展资料
U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。云主机装黑果实践(4):阿里轻量机上变色龙bootloader启动问题
在《云主机黑果实践系列》的第四部分,我们面临了在阿里轻量机上安装变色龙bootloader时的挑战。云主机环境下的大镜像安装问题尤其棘手,因为需要根据千差万别的机型和特定云特性进行调试,这是一项技术密集且充满变数的工作。首先,我们需要将镜像上传到阿里云主机,戴口罩溯源码过程中遇到了installnet.sh脚本的gzip版本问题,通过修改脚本解决了镜像上传的卡顿问题。
然而,更大的挑战是cdboot在云主机上无法正常运行,无论是grub2引导还是直接使用mbr。问题可能源于ignore_msrs和boot本身,通过排除法,我们发现v5.0.的enoch r版本的cdboot能够启动主机,而从r开始就存在问题。仔细查看源码,关键在于某些commit的改动,特别是与DMA Remapping table和AppleACPIplatform.kext有关的更新。
为了找到问题所在,我们需要在特定的编译环境(Xcode 8.2.1 for EL CAPTAN .)下编译不同版本的cdboot。编译过程中,我们发现从版本开始,只需在特定源文件中修改两行代码,就能让cdboot在云主机上正常启动。这个发现意味着调试工作进入了一个针对云主机环境的特定配置阶段。
总的来说,尽管云主机的特殊性增加了调试难度,但通过一步步的修改和打包,我们已经成功地将变色龙配置调整到了可以启动云主机的状态。尽管还有上传iso到云主机后无法启动的问题,但我们找到了一个workaround,即先用版本启动,再尝试版本,这可能是由于loader的参数变化影响了启动。接下来,我们将继续深入细节,为云主机的变色龙安装找到最优化的配置。
详解STM在线IAP升级
详解在线升级IAP的基础知识,本文将深入解析从原理到代码编写、实验验证的全过程,助您深入了解在线升级。
什么是BootLoader?它类似于引导程序,负责启动正式的App应用程序。BootLoader程序与App程序共同组成一个嵌入式系统,其中BootLoader用于启动并运行App程序。
在STM中,程序通常存储在片内Flash中。通过使用Keil进行调试,可以查看存储的代码。
接下来,我们将对程序进行分区,以FRB-NUCLEO开发板为例,其Flash分为三个区域:BootLoader区、App1区和App2区(备份区)。分区的目的是为了便于管理代码。
总体流程图展示了嵌入式系统中在线升级的基本步骤,确保您了解开发流程。
本节将详细介绍BootLoader的编写,包括流程图分析和代码编写。使用BootLoader进行在线升级(OTA)时,关键在于正确设置分区标记,以指示是否有新版本的App程序。
接下来,我们将讲解App1的编写,采用Ymodem协议进行串口传输。流程图分析将帮助您理解协议与代码之间的关系。
所需STM资源包括BootLoader和App1的源代码,以及Ymodem协议的实现。
进行整体测试,验证BootLoader与App的升级功能。提供的源代码可从原作者的gitee获取。
除了YModem协议,您还可以通过蓝牙、WIFI等其他协议传输.bin文件。主要原理相同,关键在于能够传输文件。
通过本教程,您将掌握在线升级的整个过程,包括原理、代码编写和测试验证。除了YModem协议,还可以探索其他传输方式。原文链接和转载自信息提供进一步资源。
嵌入式Linux之uboot源码make配置编译正向分析(一)
嵌入式Linux系统由以下几部分组成:在Flash存储器中,它们的分布一般如下。Bootloader是操作系统运行之前执行的一段小程序,用于初始化硬件设备、建立内存空间映射表,为操作系统内核做准备。Bootloader依赖于CPU体系结构和嵌入式系统板级设备配置。u-boot支持多种架构,适用于上百种开发板。设计与实现包括工程简介、源码结构、编译过程、源码加载等。u-boot源码可以从ftp.denx.de/pub/u-boot/网站下载,DENX网站提供更多信息,u-boot git仓库位于gitlab.denx.de/u-boot/u...。u-boot编译分为配置和编译两步,需要指定交叉工具链、处理器架构。配置过程可以生成.config文件。源码加载使用Source Insight,安装、打开项目、共享文件夹、映射网络驱动器等步骤。
当前在嵌入式系统开发中有哪些常用的bootloader
常见bootloader介绍
1.U-BOOT介绍
uboot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从/developer)
vivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,如下:
命令
功能
Load
把二进制文件载入Flash或RAM
Part
操作MTD分区信息。显示、增加、删除、复位、保存MTD分区
Param
设置参数
Boot
启动系统
Flash
管理Flash,如删除Flash的数据
vivi代码分析
vivi的代码包括arch,init,lib,drivers和include等几个目录,共多条文件。
Vivi主要包括下面几个目录:
arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c目录。
drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。
init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。
lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。
include:头文件的公共目录,其中的s3c.h定义了这块处理器的一些寄存器。Platform/smdk.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。