文献标识码:A
文章编号: 0258-7998(2014)02-0019-04
OMAPL138双核处理器是由TI推出的双核处理器,内部包含ARM和DSP两个内核,已经广泛应用于对讲机等低功耗产品中。目前,OMAPL138双核处理器的自启动通常采用AIS转换器和串口下载程序的方式实现,这种实现方式需要实现串口接收并烧写AIS转换器转换出来的应用程序二进制文件,整个实现比较复杂。本文介绍了一种基于NOR Flash自举引导启动实现OMAPL138自启动的方案,实现简单,易于掌握。详细分析了OMAPL138双核系统的启动流程和实现方法,对于OMAPL138系统应用具有很强的参考价值。
1 OMAPL138双核系统NOR Flash自举启动原理
OMAPL138内部包含ARM和DSP双核,要实现OMA-PL138双核系统的自举启动,就需要实现ARM和DSP双核启动。
本设计采用ARM唤醒DSP的引导启动OMAPL138双核系统,这种方式需要实现ARM核bootloader引导程序和ARM、DSP应用程序段的烧写程序的编写。OMAPL138程序代码段在NOR Flash中的地址映射如图1所示,其中,bootloader代码段存放在OMAPL138的共享内存空间,共享内存空间位于0x80000000起始地址处,而且bootloader程序代码段不能超过16 KB,16 KB是NOR Flash引导启动方式自动拷贝程序代码段的最大范围;ARM应用程序代码段和DSP应用程序代码段首先都存放在OMAPL138的DDR RAM空间中,DDR的起始地址为0xC0000000, ARM应用程序和DSP应用程序必须存放在DDR中的不同地址空间;最后,ARM中断向量表存放在ARM_LOCAL_RAM地址空间,位于0xFFFF0000处。
基于ARM初始化OMAPL138的bootloader主要完成以下几项工作:
(1)初始化ARM超级模式下的堆栈;
(2)OMAPL138的初始化;
(3)从NOR Flash中拷贝ARM和DSP的应用程序到对应的DDR地址空间;
(4)唤醒DSP;
(5)在main函数中调用跳转到ARM应用程序入口地址执行程序。
首先,bootloader初始化ARM超级模式下的堆栈,因为在超级模式下可以访问OMAPL138的所有寄存器,包括特权模式下才能访问的寄存器,使得ARM系统具备初始化OMAPL138系统条件;其次,OMAPL138的初始化主要包含PSC电源管理模块初始化、PLL时钟管理模块初始化、DDR的初始化和EMIFA初始化等,这些主要是OMAPL138的gel文件中的初始化工作;接下来就是初始化ARM超级模式下的堆栈起始地址和大小,然后就是拷贝ARM和DSP的应用程序到对应的DDR地址空间,这时DSP已经具备了所有启动的环境,可以直接唤醒DSP;最后,在main函数中直接放一个跳转指令(*(void(*)(void))0xC0000000)(),实现由bootloader到ARM应用程序的切换。至此,ARM和DSP应用程序都实现启动运行了。
最后就是所有程序烧写的实现。程序烧写是独立于bootloader、ARM和DSP应用程序的一个应用程序,主要功能是将bootloader程序、ARM应用程序和DSP应用程序烧写到NOR Flash对应的地址空间中去。烧写程序代码主要是NOR Flash读写程序,代码量不大,可以直接放在OMAPL138共享内存中,但是不能与bootloader代码空间重叠。
2 系统设计
2.1 bootloader设计
2.1.1 bootloader启动流程
首先,bootloader被烧写到NOR Flash中起始地址位置处, OMAPL138内部固化的一段代码在上电之后运行,会自动将16 KB的NOR Flash起始地址(0x60000000)处代码复制到OMAPL138的share RAM共享内存起始地址处(0x80000000),其中,0x60000000~0x60000004这32 bit存放的是系统固化代码配置字,可以配置拷贝数据大小、boot启动方式和访问数据宽度,这里boot启动选择拷贝数据大小为16 bit宽、Legacy NOR boot模式和16 KB数据复制宽度,在拷贝完数据之后,系统会自动跳转到0x80000004处执行。在0x80000004地址处存放的是一个跳转指令BL_bootload_init,使得系统固化的启动代码在跳转到0x80000004地址处开始执行的第一个指令就是跳转到bootloader初始化地址处执行。
bootloader启动流程如图2所示。bootloader起始地址存放的是_bootload_init。首先,该函数更改CPSR的模式控制位和中断控制位,使ARM处于超级模式下工作,这是因为超级模式可以直接访问ARM的硬件资源,而且拥有与用户模式一样的寄存器,而用户模式不能直接访问特权模式下的寄存器;其次,关闭FIQ和IRQ中断使能,初始化超级模式的堆栈;在超级模式堆栈初始化完成之后,通过BL _OMAPL138_CPU_
Init指令跳转到OMAPL138的系统初始化函数中去处理,由于在超级模式下调用该函数,所以OMAPL138_CPU_Init()可以直接访问OMAPL138所有的系统配置寄存器SYS_CFG_
Reg,OMAPL138_CPU_Init()需要完成PSC电源管理模块初始化、PLL时钟管理模块初始化、DDR的初始化和EMIFA初始化等,这些初始化工作是为ARM和DSP应用程序运行提供基本的最小化系统;在OMAPL138初始化完成之后,DDR和EMIFA都已初始化,可以将NOR Flash中的ARM和DSP应用程序拷贝到DDR中,至此,DSP应用程序已经存放在DDR中,并且已经具备了DSP运行的所有环境。接下来即可唤醒DSP。唤醒时需要往系统寄存器HOST1CFG中写入DSP唤醒初始地址,即DSP应用程序的起始地址。DSP唤醒就相当于对DSP做了一次软复位,DSP在唤醒之后直接跳到复位异常地址处运行,DSP复位异常地址存放的是_c_int00函数,该函数是DSP的系统库函数,由该函数初始化DSP运行的C语言环境,并跳转到DSP主函数中运行。至此bootloader基本工作已经完成,可以直接通过调用函数(*(void(*)(void))0xC0000000)()跳转到ARM应用程序对应的起始地址处开始运行ARM应用程序[1-3]。
2.1.2 ARM应用程序的初始化
ARM初始化流程如图3所示。首先,初始化ARM的各个异常对应的堆栈,这段代码是ARM应用程序的初始化代码,一般存放在ARM应用程序代码段的起始地址处,这样便于bootloader直接跳转到ARM初始化开始地址处执行ARM初始化;其次,在ARM异常堆栈初始化完成之后,需要执行LDR PC,_c_int00,这个指令是调用_c_int00函数,这是ARM的一个库函数,完成ARM运行时需要的C语言环境初始化等,并且在这个函数开始处就直接将模式切换成用户模式,完成了用户模式堆栈的初始化,在这个函数最后直接跳转到ARM的main函数中执行ARM的实际应用程序。ARM初始化还必须把ARM的中断向量表初始化映射到0xFFFF0000地址处,这是OMAPL138默认的ARM中断向量表存放地址空间,可以通过cmd文件直接配置。至此,ARM应用程序也开始运行了[4]。
2.1.3 bootloader.cmd和nor_cfg_word.asm的编写
nor_cfg_word.asm文件是一个汇编文件,用来实现对NOR Flash自动拷贝bootloader程序大小的配置以及实现到bootloader初始化程序_bootload_init的跳转。该文件直接由bootloader.cmd配置存放在0x80000000地址处,并且bootloader.cmd文件紧跟着将bootloader.asm启动文件的汇编代码存放在nor_cfg_word.asm文件之后。这两个文件被烧写到NOR Flash的起始地址空间,并最终通过系统上电启动自动将nor_cfg_word.asm配置文件和bootloader.asm启动文件同时复制到0x80000000共享内存share RAM并自动开始运行。
如图4所示,在nor_cfg_word.asm文件中第一个指令必须是.word 0x00000F01,用来实现对NOR Flash自举引导复制程序段的配置,选择为16 KB复制、Legacy NOR boot和16 bit宽度访问,紧跟在配置字之后的是一个跳转指令BL _bootload_init,该指令存放在0x80000004地址处,因为系统上电之后自动跳转到0x80000004地址处执行程序,即执行BL _bootload_init,_bootload_init是bootloader.asm启动文件第一个指令对应的地址,从而实现了到bootloader初始化程序的跳转。
2.2 OMAPL138自举启动流程
整个OMAPL138自举启动流程如图5所示。在Nor_cfg_word中配置NOR Flash的访问数据宽度、访问模式和自动搬运数据块大小,在系统上电之后,就会自动读取Nor_cfg_word配置,从NOR Flash中搬运16 KB数据到OMAPL138的共享内存share RAM中,然后自动跳转到share RAM的地址0x80000004中执行。在这里存放的是bootloader代码第一条指令B _bootload_init,然后执行这条指令,由_bootload_init完成OMAPL138的系统初始化、超级模式堆栈初始化、ARM和DSP应用程序的拷贝和唤醒DSP,整个初始化过程在ARM的超级模式下完成。bootloader最后存放一条指令直接跳转到ARM应用程序初始化地址处,开始执行ARM应用程序。ARM应用程序的初始化主要是初始化各种ARM异常堆栈,ARM应用程序的初始化最后调用ARM库函数自带的初始化C语言环境函数_c_int00,并由该函数自动跳转到ARM应用程序的主函数中执行,整个ARM自举启动完成。DSP在被bootloader唤醒之后直接跳到系统寄存器HOST1CFG中写入的地址处开始执行。这个DSP开始执行的地址处存放的是DSP自带的库函数_c_int00,这个函数会初始化DSP运行所需要的环境,并跳转到DSP应用程序主函数中执行DSP应用程序。至此,OMAPL138双核系统就同时启动运行了[5-6]。
2.3 NOR Flash烧写代码工程设计
在bootloader代码、ARM和DSP应用程序代码下载到对应的地址空间之后,这些代码必须烧写到NOR Flash指定地址空间。其中,配置代码段和bootloader必须存放在NOR Flash起始地址处,这些工作由烧写代码工程完成。在OMAPL138的共享内存share RAM中,bootloader和配置代码段占用16 KB空间,剩下的代码空间可以作为烧写代码工程使用空间,这样就可以使得烧写代码完全独立于其他已经烧写在内存中的代码。在整个代码烧写过程中,下载到OMAPL138内存中的bootloader、ARM和DSP应用程序都不能运行,因为bootloader代码中有对DDR的重新初始化过程,这个过程使得系统脱离了OMAPL138的gel文件初始化,而烧写程序代码是依赖gel文件的初始化环境运行的。所以,为了避免代码运行过程中对烧写代码工程的影响,需要烧写的代码在下载后不可运行,烧写代码过程不能断电,在烧写完成之后,掉电再开始重新上电,烧写的bootloader即开始自举引导启动OMAL138。
3 仿真结果与分析
仿真结果如图6所示。首先,ARM和DSP应用程序中都初始化了串口UART2,用来打印ARM与DSP双核通信信息,然后ARM应用程序通过配置系统寄存器CHIPSIG中的SYSCFG_CHIPINT3向DSP发送系统中断。DSP应用程序通过配置系统寄存器CHIPSIG中的SYSCFG_CHIPINT1向ARM发送系统中断,在ARM和DSP双方通信的各自中断处理程序中,都首先通过串口UART2打印接收到的中断信息,然后延时一段时间,以使ARM和DSP双核不会同时占用UART2资源,在延时之后各自都会向对方发送中断。图5中输出的信息就是在硬件板烧写完程序后上电串口UART2输出的打印信息。由于ARM和DSP双核不断地向对方发送中断,因此不断地向串口输出信息,仿真结果中发送字节数为0,接收字节数为158 437,这是接收的双核通信输出信息,整个仿真结果可靠,充分证明了OMAPL138双核系统被成功引导启动。
针对传统的基于AIS和串口实现OMAPL138双核系统自启动处理复杂的问题,提出了基于NOF Flash的bootloader二次引导实现OMAPL138双核自启动的方案。在该方案中,分析了基于ARM核的bootloader实现流程和处理内容,解决了bootloader中ARM核系统的初始化,并基于ARM核实现了OMAPL138系统的初始化以及ARM和DSP应用程序的复制,最终通过ARM核唤醒了DSP核,并成功跳转到ARM应用程序中执行,实现了OMAPL138的双核运行。整个方案实现了bootloader、ARM和DSP应用程序及烧写所有程序代码工程都相互独立运行、互不干扰,针对每个工程项目的cmd文件进行了详细分析和介绍,对于整个bootloader启动流程做了详细的说明,整个过程清晰、可靠。实验结果表明,该方案可以实现OMAPL138的自举启动。
参考文献
[1] 刘远峰,陈志华.一种新的基于TMS320C6000 DSP的Flash引导自启动方法[J].电视技术,2011,21(35):54-57.
[2] 王洁,苏东林,姜铁华.基于TMS320C6000系列DSP的二次Bootl oader研究[J].电子工程师,2005,8(31):53-55.
[3] 刘涛,倪江生,王丹丹.基于DSP的Flash自启动设计[J].仪表技术,2009(9):44-45.
[4] 王鹏,简秦勤,范俊锋.基于TMS320C6000 DSP及DSP/BIOS系统的Flash引导自启动设计[J].电子元器件应用,2012,12(14):35-39.
[5] 余同正,徐龙祥.基于双DSP的磁轴承数字控制器容错设计[J].电子技术应用,2005,31(1):27-29.
[6] 郭唐仕,尹华杰,陈锦云.基于双DSP低电压大电流交换器的模糊PID控制[J].电子技术应用,2003,29(5):79-81.