写在前面:
之前已经写过OTA过程是如何跳转进入bootloader的,在跳转之前主要做了什么,请参考以下文章,使用的SDK为SDK12.2.0,个人QQ:993650814
Nordic 52832 —— OTA 流程源码分析(一),
正文:
一、 准备工作:如何编译bootloader以及让他正常工作请参考如下文章:
DFU升级 ,非常感谢这位大牛的贡献。
二、OTA基本知识储备:
1、MBR了解:
如果bootloader存在的话,Master Boot Record(MBR)的作用是为了启动bootloader,因此,MBR必须要知道bootloader所在的起始地址,bootloader的起始地址定义在UICR.BOOTLOADERADDR之中,具体是0x10001014,代码中定义如下:
MBR是如何获取bootloader地址的呢?
在nrf_bootloader_info.c中有个宏定义,
这样UICR就得到了bootloader的起始地址,然后每次启动时,MBR都会检查boot是否存在。
2、52832 Memory Laylout 须知:
3. Nordic OTA分dual bank和single bank,application、协议栈、和bootloader都可以升级,这里只分析OTA application:
dual bank updates:
single bank updates:
三、源码分析:
1、OTA的setting结构体,里面包含了OTA过程中的一些信息,定义在nrf_dfu_types.h中:
2、nrf_dfu_settings_init 函数
3.nrf_dfu_continue 函数
这个函数的作用是通过setting中的信息判断目前使用的是哪个bank,并以此来决定是否进行代码搬运
4、nrf_dfu_continue_bank
这个函数的作用是判断需要搬运的是app、bootloader、SoftDevice还是bootloader+SoftDevice
5、 nrf_dfu_enter_check 函数
6、nrf_dfu_app_is_valid 函数
7、
8、nrf_dfu_transports_init 函数
注意这里面的 init_func函数和close_func函数是在nrf_ble_dfu.c中赋值的
所以实际上调用的是 ble_dfu_transport_init 这个函数
9、ble_dfu_transport_init函数
这个函数就是初始化了一下ble的参数之类的
在gap_params_init函数中调用了 gap_address_change来讲蓝牙地址改了
10.通过Ble 接受数据然后教研然后写flash的操作等的细节这里不讲。
11、最后,检查app的有效性,然后跳转运行