本文为作者发表于EEworld(bbs.eeworld.com.cn),未经EEworld许可,请勿转载。 |
前面主要是讲了C6678的总体的BOOT方式。这一讲,告诉大家C6678从上电复位后的BOOTLOADER的工作情况。
C6678的BOOT过程由COREPAC0执行。前面文章说到,C6678的BOOT方式有4种。上电复位,硬件复位,软件复位和局部复位。前面的3个复位模式是全局型的,影响到整个C6678。后者只是局部的复位,不会触发BOOT过程。
上电复位后的BOOT过程究竟是如何的呢?如何触发BOOT呢?
从C6678的DATASHEET(参考:
查看详情)可以看出,POR和RESETFULL 两个管脚可以触发上电复位,从而引起RBL初始化。POR引脚由上电时序产生,RESETFULL则由主机来复位系统。只有在POR实现上电复位之后,RESETFULL才能实现全局复位,也就是说RESETFULL复位时热复位。在上电复位的过程中,13个BOOTLOADER引脚状态分别被采样且被锁存在BOOT的配置寄存器中,RBL就凭着这些设备状态寄存器的值去进行决策,往后如何BOOT—使用设备状态寄存器中的启动配置,BOOT过程就是执行初始化代码,也就是RBL初始化代码:
(1)ROM里面的代码激活所有支持该功能的外设的复位隔离,也就是说,这些外设的状态不会被改变。有哪些外设支持这个功能呢?记住下面这些外设:SmartReflex,DDR3,Embedded Trace,Ehternet SGMII,Ethernet Switch,SRIO,AIF2。怎么样,这下清楚了吧 。
(2)ROM代码必须在所有启动需要使用的外设供电和时钟都是有效的情况下才能正常 。
(3)ROM代码配置系统的PLL,根据DEVSTAT寄存器中PLL选择的3个BIT,配置C6678 的工作速度。
(4)对于NO-BOOT,SPI以及I2C BOOT模式,主PLL保留在BYPASS模式下。其他的BOOT模式BOOTLOADER初始化过程则把主PLL配置成PLL MODE。
(5)ROM代码在所有的COREPACS中保留最后0xD23F 字节。这个东西做啥用呢?这个保留的RAM区域其实就是用来存储启动过程中的初始化配置,也就是我们常听说的启动参数表。下面有一个表,放在局部L2里面的COREPAC0的启动参数表:
注意哟,对于EMIF16 BOOT模式,RBL不保留MEMORY。这时候MEMORY的使用完全依赖存储在NOR FLASH的镜像。
(6)在启动过程中,BOOTLAODER会在SECONDARY COREPACS(即COREPAC1-7) 执行IDLE命令,且等待中断,只有在应用程序加载到SENCONDARYCOREPACS之后,每个COREPACS中的BOOT_MAGIC_ADDRESS被启用,这时候COREPAC0中的应用程序就可以触发一个 IPC唤醒其他的核,完成启动。此时从核执行程序指向BOOT_MAGIC_ADDRESS指定的地址。
如上表中的BOOTMAGIC地址就是ROM搬移到RAM信息的最后一个字,这里面存放的就是各CORE初始化之后需要跳转的C程序入口地址:_c_int00()。是不是很绕口啊。没办法。暂且记住吧。C6678 的内存规划设计的时候,不同CORE的BOOT_MAGIC_ADDRESS存放在该核的L2 RAM的最后一个字里面。所以用一个公式的形式表示每个核的BOOT_MAGIC_ADDRESS就是0x1n87ffc,其中n表示第n个核)。
(7)所有的L1D和L1P被BOOT代码配置成CACHE,而L2存储器则配置成可寻址的内存空间。
(8)这时候除了主机中断,其他的中断都是无效的。主机中断在PCIe,SRIO及Hyperlink Boot模式下是需要使用的。
(9)BOOTLAODER里面有个DDR配置表。缺省配置初始化为0 。在启动时,每块BOOT表加载完后,表格中的所有参数都会进行测试。发现其中ENABLE BITMAP域非零,DDR3就会被配置。此时允许BOOT表配置DDR表,然后初始化并加载数据到DDR。
以下分别是对上述的各种BOOT的配置参数:
下一讲将对MCSDK提供的多核BOOT方法做详细的讲解。