一、TI_66AK u-Boot 启动流程
Ti_66ak 是德州仪器公司设计的高性能多核arm + dsp处理器,包含4个arm核和 8 个dsp核。
本文将以spi nor flash启动方式分析Ti_66ak u-Boot 启动流程。在该模式下 66ak 将默认 arm 为启动主核。该启动流程分为两个阶段,首先在板子上电后,RBL(ROM BOOT LOADER) 将首先从spi nor flash将小的(约10K)启动程序(SPL u-Boot)加载到地址为0xc200000的MSM(Multicore shared memory)并执行,然后,此SPL u-Boot将从偏移量为0x10000的spi nor flash处读出完整的U-Boot镜像(u-boot-keystone-evm.img)加载到地址为0xc001000处的MSM并执行。
启动分为两个阶段的主要原因是一阶段加载SPL u-Boot时时钟频率较低,速度较慢,一阶段加载完后,SPL U-Boot会初始化ARM 0 核的PLL,以提高时钟频率。此后二阶段加载U-Boot 镜像时速度将大大加快。
二、u-Boot 固化
u-Boot固化需要用到ti官方提供的CCS工具,固化流程如下: 1.板卡启动模式设置为no-boot模式。拨码开关如图1所示: 图1 no-boot启动模式拨码开关 2.启动板卡,待LCD屏上显示boot complete,启动CCS Debug。CCS Debug 配置如图2所示。 图2 CCS Debug ccxml 文件创建方式如下: (1)View–>Target Configurations (2)右击Target Configurations工作区,点击New Target Configurations,设置名字和路径,ccxml配置如图3所示。 图3 ccxml 配置
3.连接CortexA15_1。如图4所示。 图4 连接CortexA15_1 4.Tools–>load memory,加载U-Boot镜像。具体配置如图5所示。 图5 load memory具体配置 5.设置PC指针,view–>registers。具体设置如图6所示。 图6 设置PC指针 6.点击运行,可以在串口中看到u-boot 命令行。然后运行以下命令: tftp 0xc300000 u-boot.gph Sf probe sf erase 0x0 <文件大小(0x10000的整数倍)> sf write 0xc300000 0x0 <文件大小>
三、arm 核启动
arm端4个核在SMP(对称多处理器结构)模式下运行SylixOS。u-Boot 将镜像加载到运行地址后,arm0核会先执行系统镜像,然后0核会唤醒其余3核。需要注意的是在运行多核之前需要利用TI官方提供的skern-keystone-evm.bin文件,将该文件加载到0x0c5f0000地址处,并执行mon_install 0x0c5f0000指令进行安装。 u-Boot加载arm端镜像是通过翼辉信息IDE提供的tftp工具实现的。具体设置如图7所示。 打开IDE,点击tools–>tftp,设置镜像路径,点击save,然后点击start。 图7 tftp设置 最后在u-Boot上输入 tftp 0x80000000 bspevmk2h.bin; tftp 0x0c5f0000 skern-keystone-evm.bin; mon_install 0x0c5f0000; go 0x80000000;
arm启动时需要注意的问题:
- arm端使用的是Crotex-A15架构,该架构自旋锁需要cache支持,因此在启动时需要设置自旋锁不依赖cache,否则会卡死在armspinlock()。具体设置是在启动参数中添加sldepcache=yes,参数前后要有空格。如图8所示。
图8 启动参数设置 - 因为u-Boot 固化在spi flash中,所以启动时需要将板子的启动方式切换为spi启动模式。拨码开关的设置是将图1 中的3号拨码开关拨上去,4号拨下来。
- 通过CCS加载arm端镜像具体操作如下:
首先需要加载gel文件,该文件是ti官方提供的用于初始化硬件的文件,可以在ccs的安装目录下找到。具体路径是ccsv5\ccs_base\emulation\boards。该路径下存放着对应各个板卡的gel文件。我们要用的文件保存在xtcievmk2xm目录下。(ccs5.0 可能没有arm端的初始化文件,需要自己找)。 gel文件加载方式如图9所示。 首先打开ccxml文件,点击Advance,然后添加gel文件路径。 图9 加载gel文件 - 通过仿真器加载arm多核时,需要执行全局初始化,因为arm1-3核启动时,电源默认关闭。具体操作为:在正确加载完gel文件并启动之后,点击 Scripts 选项,找到 Global setup slience.(该操作会调用gel文件中的 Global setup slience() 函数,初始化arm1-3核的psc)
四、dsp核启动
66ak中有8个C66x架构的dsp处理器,这8个核是运行在AMP模式下,首先由arm唤醒dsp0核,然后dsp0核会唤醒其余7核。 arm核启动dsp时,首先会将dsp镜像的运行地址填入Boot Magic address(类似存放启动地址的寄存器),Boot Magic address一般是每个dsp核私有ddr的最后四个字节。然后arm核会向dsp0核发送ipc中断,dsp0核收到中断后将会从Boot Magic address中读出起动地址,然后跳转到操作系统入口开始运行程序。在SylixOS中将dsp镜像作为文件存贮在arm文件系统里,加载运行dsp通过指令 activeSlaveCore 【核id】 【镜像路径】执行。 该指令首先会解析dsp镜像(镜像应当为elf文件),并加载到指定位置,然后会按照上述流程启动dsp。
Dsp加载时需要注意:dsp 加载的地址需要arm做过映射才可以访问,否则会报memory map。因为arm和dsp公用一块ddr空间,为了能够和arm不产生地址冲突 ,arm使用的地址空间是0x80000000~0x90000000,dsp使用的是0x90000000之后的空间,arm映射的地址空间是0x80000000-0xb0000000。 dsp镜像空间的映射类型应当避免是不进行提前映射的类型(如图10),该类型在MMU初始化时不会进行映射,而是需要用户在使用时通过malloc等接口进行申请。本设计中使用的是LW_PHYSICAL_MEM_BOOTSFR类型。
图10 地址映射类型
|