技术笔记20230718 rBoot学习3
继续昨天的学习。
配置
count
是可用的rom数量(只能比MAX_ROMS
少)。unused[2]
是填充,为了使uint32_t
类型的成员变量rom
四字节对齐。roms
是保存rom在Flash上的地址的数组。默认生成的配置将包含两个地址:0x00002000
和0x00082000
。chksum
是一个字节的校验。如果使能了校验功能(默认为不使能),它的值应该是配置结构体中的每个字节与0xef
的异或和。显然,计算校验和时不包括chksum
本身。
默认配置
如果默认的配置扇区不存在,或者仅有的配置被损坏,那么将在boot阶段创建一个默认的配置扇区,此默认rom将被设置为0号rom。如果我们需要实现一套自定义的配置,而不是默认配置时,我们可以在rboot.h
头文件中修改。更多相关信息在rboot.h
的注释与源码中记录。
GPIO引导模式
如果在编译rBoot时在rBoot.h
中定义了BOOT_GPIO_ENABLED
或者在Makefile中设置了RBOOT_GPIO_ENABLED
,那么将启用GPIO引导功能。然后可以通过将rboot_config的成员变量mode
设置为MODE_GPIO_ROM
来启用该功能。我们还需要在配置中设置gpio_rom
来指定在进入GPIO引导模式时要启动哪个rom。
如果引导检测GPIO在启动时读取到高电平,那么rBoot将根据当前状态启动当前选择的正常或临时rom。相反,如果该GPIO被拉低,那么配置选项gpio_rom
中指定的rom将被启动。
默认的GPIO为GPIO16,我们可以根据实际情况在Makefile(RBOOT_GPIO_NUMBER
)或rboot.h
(BOOT_GPIO_NUM
)中修改。如果使用GPIO16以外的IO口,就需要在读取引脚电平之前使能内部上拉电阻,在读取结束后立刻禁用该IO口。For pins that default on reset to configuration other than GPIO input, the pin mode is changed to input when reading but changed back before rboot continues.不太懂这一句是什么意思。大概是GPIO引导引脚存在复用时,应该在进入rBoot前将GPIO设置为输入模式。
在进入GPIO引导模式后,配置中的current_rom
变量会被更新。因此,GPIO引导的rom应该在适当位置再次更改此变量。
GPIO引导跳过模式
如果在编译rBoot时,rBoot.h
中定义了BOOT_SKIP_ENABLED
或者在Makefile中设置了RBOOT_GPIO_SKIP_ENABLED
,那么GPIO可以用来在引导时跳到下一个rom。然后将配置rboot_config中的成员变量mode
的值设置为MODE_GPIO_SKIP
来启用该功能。这就意味着我们不需要有一个专用的GPIO引导rom。如果我们配置一个专用的GPIO引导rom,那更能体现我们的技术力,但是可能引发操作问题,例如WiFi不工作或在程序引导阶段崩溃。这样rBoot就无法检测到且无法自动切换。在这种情况下,只能重新启动设备,同时拉低GPIO迫使rBoot跳过这个rom并尝试运行下一个rom。在简单的双rom配置中,这只是简单地切换rom启动。 RBOOT_GPIO_SKIP_ENABLED
和RBOOT_GPIO_ENABLED
不能同时使用。BOOT_GPIO_NUM
用于选择GPIO引脚。