kaiyun官方注册
您所在的位置: 首页> 嵌入式技术> 设计应用> 基于NOR Flash的OMAPL138双核系统自举引导启动实现
基于NOR Flash的OMAPL138双核系统自举引导启动实现
来源:电子技术应用2014年第2期
邓国荣,刘厚钦
暨南大学 信息技术研究所,广东 广州510075
摘要:针对传统基于AIS和串口引导启动OMAPL138相对复杂的问题,提出了一种基于NOR Flash实现OMAPL138双核系统二次引导自举启动的方法。在该方案中,分析了OMAPL138双核系统基于ARM系统自举引导启动的bootloader实现流程,解决了ARM系统初始化问题,并基于ARM系统完成了OMAPL138系统硬件的初始化和应用程序的复制。最后,通过ARM系统唤醒了DSP系统,并在bootloader最后跳转到ARM应用程序中执行,最终实现了OMAPL138双核系统的运行。实验结果表明,该方案能够实现OMAPL138双核系统的引导启动,较之于传统AIS和串口启动方式更简单,更易于实现。
关键词: DSP OMAPL138 ARM Bootloader
中图分类号:TP368
文献标识码:A
文章编号: 0258-7998(2014)02-0019-04
A design for OMAPL138 dual-core system boot based on NOR Flash
Deng Guorong,Liu Houqin
Institute of Information Technology, Jinan University, Guangzhou 510075,China
Abstract:For the problem of the complexity of OMAPL138 boot based on AIS and serial,a new mothed based on NOR Flash to achieve OMAPL138 dual-core system boot is introduced. In this scenario,the process of bootloader of OMAPL138 dual-core system is analyzed. Firstly,the ARM system initialization problems is solved. Then OMAPL138 system hardware initialization and copy of the ARM and DSP applications code are completed based on ARM system. Finally,DSP system is waked up by ARM system,and bootloader jumps to the ARM application at the last of bootloader,and OMAPL138 dual-core system boot is implemented finally. Experimental results show that the program can achieve OMAPL138 dual-core system boot, and it is more simple and easy to implement compared to traditional AIS and serial start-up mode.
Key words :OMAPL138;ARM;DSP;bootloader

OMAPL138双核处理器是由TI推出的双核处理器,内部包含ARMDSP两个内核,已经广泛应用于对讲机等低功耗产品中。目前,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.

此内容为AET网站原创,未经授权禁止转载。
Baidu
map