【堪智K210】 下载程序的过程原理 探索

  回忆一下下载程序的过程:k210是通过官方提供的kflash工具或者IDE来下载程序的。其中注意到每次下载程序的时候都会先烧写一个bootloader.bin,再烧写用户bin。

  疑惑:这个bootloader.bin官方又称之为fast isp或者super-flash,于是引起我的好奇,为啥每次下载程序都要先烧写它,芯片内部不是有isp了吗?这个到底是bootloader还是isp啊?

在展开探索过程前,首先给赶时间的同学说一下【结论】。这个bootloader.bin其实不是bootloader,功能是把串口数据刷写到spi flash里,取名soft_isp.bin或者temp_iap.bin更为恰当。


为了方便,以下称这个bootloader.bin为软isp;称芯片内部isp为硬isp。

起初让我疑惑的是为啥有一个硬isp和一个软isp。
因为k210和以前熟悉的stm32芯片结构不同,stm32内部有用户flash,地址总线直接可达;而k210内部没有用户使用的flash。k210的储存结构和linux-arm芯片比较类似。

k210的flash一般是外挂一个w25qxx的spi flash,硬isp不支持spi协议,只能操作地址总线能够触及的ram,所以先在ram里运行一个支持spi协议的软isp,再来操作外部spi flash。

研究kflash.py和软isp(KendryteIDE/LocalPackage/isp)的代码,

1.首先看kflash.py

def process(...)
{
...
# download bootloader
loader.install_flash_bootloader(isp_loader) 	//下载软isp到ram地址0x80000000
...
# Boot from SRAM
self.loader.boot() 								//跳转运行软isp
...
if file_format == ProgramFileFormat.FMT_KFPKG:	//判断用户代码包是KFPKG格式还是bin格式
...
else
loader.flash_firmware(firmware_bin.read())		//软isp会接收用户代码,并下载到flash中
...
# boot from flash
loader.reset_to_boot_dan() 						//重启之后怎么运行用户代码的在下面有说
...
}

从kflash.py看,可以明显发现下载程序有两级过程。
1.硬isp接收从串口得来的软isp代码,写入ram里。
2.软isp开始运行,接收从串口得来的用户代码包,写入外部flash里。
软isp会判断用户代码包是KFPKG格式还是bin格式,如果是KFPKG格式,会解json再写入flash。

2.再看软isp代码(位于KendryteIDE/LocalPackage/isp

#super-flash.c
static int super_flash_main_start0(void* ctx) {			//cou核0的代码
...
  core0_step1_wait_hello();
  core0_step2_read_serial();
...
}
static int super_flash_main_start1(void* ctx) {			//cou核1的代码
...
  core1_step1_blink_led();
  core1_step2_write_flash();							//写入外部flash
...
}
void super_flash_main() 								//软isp的main函数
{
...
      register_core1(super_flash_main_start1, NULL);
      super_flash_main_start0(NULL);
...	
}
static void core1_step2_write_flash() 
{
...
w25qxx_init(3, 0, 60000000);					
...
    w25qxx_write_data(writing_buff->address, 			//写入外部flash
    				  (uint8_t*)writing_buff->buff,
                      FLASH_CHUNK_SIZE);				
...
}

可以看到,软isp实际操作就是吸收串口数据,写入w25qxx flash,并没有担当bootloader功能。


真正的bootloader到底在哪?

由于官方资料比较少,从datasheet数据手册来看,我认为上电先运行的是芯片内部一个叫做只读存储器(AXI ROM)的内部代码,这里面的代码才是真正的bootloader,它的作用是上电复制外部flash里的程序到ram里运行。

3.20 只读存储器 (ROM)
AXI ROM 负责从 SPI FLASH 中拷贝程序至芯片的 SRAM 中。


  整个过程中,k210芯片内部一共有两块固化的代码起作用,一个是硬isp,一个是真正的bootloader----AXI ROM
  没想明白的是,为什么官方不把硬isp和AXI ROM做到一起呢?或许是芯片硬件限制吧,亦或许是为了KFPKG的打包下载功能吧。

你可能感兴趣的:(生活)