文獻標識碼: A
文章編號: 0258-7998(2014)02-0019-04
OMAPL138雙核處理器是由TI推出的雙核處理器,內(nèi)部包含ARM和DSP兩個內(nèi)核,已經(jīng)廣泛應用于對講機等低功耗產(chǎn)品中。目前,OMAPL138雙核處理器的自啟動通常采用AIS轉(zhuǎn)換器和串口下載程序的方式實現(xiàn),這種實現(xiàn)方式需要實現(xiàn)串口接收并燒寫AIS轉(zhuǎn)換器轉(zhuǎn)換出來的應用程序二進制文件,整個實現(xiàn)比較復雜。本文介紹了一種基于NOR Flash自舉引導啟動實現(xiàn)OMAPL138自啟動的方案,實現(xiàn)簡單,易于掌握。詳細分析了OMAPL138雙核系統(tǒng)的啟動流程和實現(xiàn)方法,對于OMAPL138系統(tǒng)應用具有很強的參考價值。
1 OMAPL138雙核系統(tǒng)NOR Flash自舉啟動原理
OMAPL138內(nèi)部包含ARM和DSP雙核,要實現(xiàn)OMA-PL138雙核系統(tǒng)的自舉啟動,就需要實現(xiàn)ARM和DSP雙核啟動。
本設計采用ARM喚醒DSP的引導啟動OMAPL138雙核系統(tǒng),這種方式需要實現(xiàn)ARM核bootloader引導程序和ARM、DSP應用程序段的燒寫程序的編寫。OMAPL138程序代碼段在NOR Flash中的地址映射如圖1所示,其中,bootloader代碼段存放在OMAPL138的共享內(nèi)存空間,共享內(nèi)存空間位于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函數(shù)中調(diào)用跳轉(zhuǎn)到ARM應用程序入口地址執(zhí)行程序。
首先,bootloader初始化ARM超級模式下的堆棧,因為在超級模式下可以訪問OMAPL138的所有寄存器,包括特權模式下才能訪問的寄存器,使得ARM系統(tǒng)具備初始化OMAPL138系統(tǒng)條件;其次,OMAPL138的初始化主要包含PSC電源管理模塊初始化、PLL時鐘管理模塊初始化、DDR的初始化和EMIFA初始化等,這些主要是OMAPL138的gel文件中的初始化工作;接下來就是初始化ARM超級模式下的堆棧起始地址和大小,然后就是拷貝ARM和DSP的應用程序到對應的DDR地址空間,這時DSP已經(jīng)具備了所有啟動的環(huán)境,可以直接喚醒DSP;最后,在main函數(shù)中直接放一個跳轉(zhuǎn)指令(*(void(*)(void))0xC0000000)(),實現(xiàn)由bootloader到ARM應用程序的切換。至此,ARM和DSP應用程序都實現(xiàn)啟動運行了。
最后就是所有程序燒寫的實現(xiàn)。程序燒寫是獨立于bootloader、ARM和DSP應用程序的一個應用程序,主要功能是將bootloader程序、ARM應用程序和DSP應用程序燒寫到NOR Flash對應的地址空間中去。燒寫程序代碼主要是NOR Flash讀寫程序,代碼量不大,可以直接放在OMAPL138共享內(nèi)存中,但是不能與bootloader代碼空間重疊。
2 系統(tǒng)設計
2.1 bootloader設計
2.1.1 bootloader啟動流程
首先,bootloader被燒寫到NOR Flash中起始地址位置處, OMAPL138內(nèi)部固化的一段代碼在上電之后運行,會自動將16 KB的NOR Flash起始地址(0x60000000)處代碼復制到OMAPL138的share RAM共享內(nèi)存起始地址處(0x80000000),其中,0x60000000~0x60000004這32 bit存放的是系統(tǒng)固化代碼配置字,可以配置拷貝數(shù)據(jù)大小、boot啟動方式和訪問數(shù)據(jù)寬度,這里boot啟動選擇拷貝數(shù)據(jù)大小為16 bit寬、Legacy NOR boot模式和16 KB數(shù)據(jù)復制寬度,在拷貝完數(shù)據(jù)之后,系統(tǒng)會自動跳轉(zhuǎn)到0x80000004處執(zhí)行。在0x80000004地址處存放的是一個跳轉(zhuǎn)指令BL_bootload_init,使得系統(tǒng)固化的啟動代碼在跳轉(zhuǎn)到0x80000004地址處開始執(zhí)行的第一個指令就是跳轉(zhuǎn)到bootloader初始化地址處執(zhí)行。
bootloader啟動流程如圖2所示。bootloader起始地址存放的是_bootload_init。首先,該函數(shù)更改CPSR的模式控制位和中斷控制位,使ARM處于超級模式下工作,這是因為超級模式可以直接訪問ARM的硬件資源,而且擁有與用戶模式一樣的寄存器,而用戶模式不能直接訪問特權模式下的寄存器;其次,關閉FIQ和IRQ中斷使能,初始化超級模式的堆棧;在超級模式堆棧初始化完成之后,通過BL _OMAPL138_CPU_
Init指令跳轉(zhuǎn)到OMAPL138的系統(tǒng)初始化函數(shù)中去處理,由于在超級模式下調(diào)用該函數(shù),所以OMAPL138_CPU_Init()可以直接訪問OMAPL138所有的系統(tǒng)配置寄存器SYS_CFG_
Reg,OMAPL138_CPU_Init()需要完成PSC電源管理模塊初始化、PLL時鐘管理模塊初始化、DDR的初始化和EMIFA初始化等,這些初始化工作是為ARM和DSP應用程序運行提供基本的最小化系統(tǒng);在OMAPL138初始化完成之后,DDR和EMIFA都已初始化,可以將NOR Flash中的ARM和DSP應用程序拷貝到DDR中,至此,DSP應用程序已經(jīng)存放在DDR中,并且已經(jīng)具備了DSP運行的所有環(huán)境。接下來即可喚醒DSP。喚醒時需要往系統(tǒng)寄存器HOST1CFG中寫入DSP喚醒初始地址,即DSP應用程序的起始地址。DSP喚醒就相當于對DSP做了一次軟復位,DSP在喚醒之后直接跳到復位異常地址處運行,DSP復位異常地址存放的是_c_int00函數(shù),該函數(shù)是DSP的系統(tǒng)庫函數(shù),由該函數(shù)初始化DSP運行的C語言環(huán)境,并跳轉(zhuǎn)到DSP主函數(shù)中運行。至此bootloader基本工作已經(jīng)完成,可以直接通過調(diào)用函數(shù)(*(void(*)(void))0xC0000000)()跳轉(zhuǎn)到ARM應用程序?qū)钠鹗嫉刂诽庨_始運行ARM應用程序[1-3]。
2.1.2 ARM應用程序的初始化
ARM初始化流程如圖3所示。首先,初始化ARM的各個異常對應的堆棧,這段代碼是ARM應用程序的初始化代碼,一般存放在ARM應用程序代碼段的起始地址處,這樣便于bootloader直接跳轉(zhuǎn)到ARM初始化開始地址處執(zhí)行ARM初始化;其次,在ARM異常堆棧初始化完成之后,需要執(zhí)行LDR PC,_c_int00,這個指令是調(diào)用_c_int00函數(shù),這是ARM的一個庫函數(shù),完成ARM運行時需要的C語言環(huán)境初始化等,并且在這個函數(shù)開始處就直接將模式切換成用戶模式,完成了用戶模式堆棧的初始化,在這個函數(shù)最后直接跳轉(zhuǎn)到ARM的main函數(shù)中執(zhí)行ARM的實際應用程序。ARM初始化還必須把ARM的中斷向量表初始化映射到0xFFFF0000地址處,這是OMAPL138默認的ARM中斷向量表存放地址空間,可以通過cmd文件直接配置。至此,ARM應用程序也開始運行了[4]。
2.1.3 bootloader.cmd和nor_cfg_word.asm的編寫
nor_cfg_word.asm文件是一個匯編文件,用來實現(xiàn)對NOR Flash自動拷貝bootloader程序大小的配置以及實現(xiàn)到bootloader初始化程序_bootload_init的跳轉(zhuǎn)。該文件直接由bootloader.cmd配置存放在0x80000000地址處,并且bootloader.cmd文件緊跟著將bootloader.asm啟動文件的匯編代碼存放在nor_cfg_word.asm文件之后。這兩個文件被燒寫到NOR Flash的起始地址空間,并最終通過系統(tǒng)上電啟動自動將nor_cfg_word.asm配置文件和bootloader.asm啟動文件同時復制到0x80000000共享內(nèi)存share RAM并自動開始運行。
如圖4所示,在nor_cfg_word.asm文件中第一個指令必須是.word 0x00000F01,用來實現(xiàn)對NOR Flash自舉引導復制程序段的配置,選擇為16 KB復制、Legacy NOR boot和16 bit寬度訪問,緊跟在配置字之后的是一個跳轉(zhuǎn)指令BL _bootload_init,該指令存放在0x80000004地址處,因為系統(tǒng)上電之后自動跳轉(zhuǎn)到0x80000004地址處執(zhí)行程序,即執(zhí)行BL _bootload_init,_bootload_init是bootloader.asm啟動文件第一個指令對應的地址,從而實現(xiàn)了到bootloader初始化程序的跳轉(zhuǎn)。
2.2 OMAPL138自舉啟動流程
整個OMAPL138自舉啟動流程如圖5所示。在Nor_cfg_word中配置NOR Flash的訪問數(shù)據(jù)寬度、訪問模式和自動搬運數(shù)據(jù)塊大小,在系統(tǒng)上電之后,就會自動讀取Nor_cfg_word配置,從NOR Flash中搬運16 KB數(shù)據(jù)到OMAPL138的共享內(nèi)存share RAM中,然后自動跳轉(zhuǎn)到share RAM的地址0x80000004中執(zhí)行。在這里存放的是bootloader代碼第一條指令B _bootload_init,然后執(zhí)行這條指令,由_bootload_init完成OMAPL138的系統(tǒng)初始化、超級模式堆棧初始化、ARM和DSP應用程序的拷貝和喚醒DSP,整個初始化過程在ARM的超級模式下完成。bootloader最后存放一條指令直接跳轉(zhuǎn)到ARM應用程序初始化地址處,開始執(zhí)行ARM應用程序。ARM應用程序的初始化主要是初始化各種ARM異常堆棧,ARM應用程序的初始化最后調(diào)用ARM庫函數(shù)自帶的初始化C語言環(huán)境函數(shù)_c_int00,并由該函數(shù)自動跳轉(zhuǎn)到ARM應用程序的主函數(shù)中執(zhí)行,整個ARM自舉啟動完成。DSP在被bootloader喚醒之后直接跳到系統(tǒng)寄存器HOST1CFG中寫入的地址處開始執(zhí)行。這個DSP開始執(zhí)行的地址處存放的是DSP自帶的庫函數(shù)_c_int00,這個函數(shù)會初始化DSP運行所需要的環(huán)境,并跳轉(zhuǎn)到DSP應用程序主函數(shù)中執(zhí)行DSP應用程序。至此,OMAPL138雙核系統(tǒng)就同時啟動運行了[5-6]。
2.3 NOR Flash燒寫代碼工程設計
在bootloader代碼、ARM和DSP應用程序代碼下載到對應的地址空間之后,這些代碼必須燒寫到NOR Flash指定地址空間。其中,配置代碼段和bootloader必須存放在NOR Flash起始地址處,這些工作由燒寫代碼工程完成。在OMAPL138的共享內(nèi)存share RAM中,bootloader和配置代碼段占用16 KB空間,剩下的代碼空間可以作為燒寫代碼工程使用空間,這樣就可以使得燒寫代碼完全獨立于其他已經(jīng)燒寫在內(nèi)存中的代碼。在整個代碼燒寫過程中,下載到OMAPL138內(nèi)存中的bootloader、ARM和DSP應用程序都不能運行,因為bootloader代碼中有對DDR的重新初始化過程,這個過程使得系統(tǒng)脫離了OMAPL138的gel文件初始化,而燒寫程序代碼是依賴gel文件的初始化環(huán)境運行的。所以,為了避免代碼運行過程中對燒寫代碼工程的影響,需要燒寫的代碼在下載后不可運行,燒寫代碼過程不能斷電,在燒寫完成之后,掉電再開始重新上電,燒寫的bootloader即開始自舉引導啟動OMAL138。
3 仿真結(jié)果與分析
仿真結(jié)果如圖6所示。首先,ARM和DSP應用程序中都初始化了串口UART2,用來打印ARM與DSP雙核通信信息,然后ARM應用程序通過配置系統(tǒng)寄存器CHIPSIG中的SYSCFG_CHIPINT3向DSP發(fā)送系統(tǒng)中斷。DSP應用程序通過配置系統(tǒng)寄存器CHIPSIG中的SYSCFG_CHIPINT1向ARM發(fā)送系統(tǒng)中斷,在ARM和DSP雙方通信的各自中斷處理程序中,都首先通過串口UART2打印接收到的中斷信息,然后延時一段時間,以使ARM和DSP雙核不會同時占用UART2資源,在延時之后各自都會向?qū)Ψ桨l(fā)送中斷。圖5中輸出的信息就是在硬件板燒寫完程序后上電串口UART2輸出的打印信息。由于ARM和DSP雙核不斷地向?qū)Ψ桨l(fā)送中斷,因此不斷地向串口輸出信息,仿真結(jié)果中發(fā)送字節(jié)數(shù)為0,接收字節(jié)數(shù)為158 437,這是接收的雙核通信輸出信息,整個仿真結(jié)果可靠,充分證明了OMAPL138雙核系統(tǒng)被成功引導啟動。
針對傳統(tǒng)的基于AIS和串口實現(xiàn)OMAPL138雙核系統(tǒng)自啟動處理復雜的問題,提出了基于NOF Flash的bootloader二次引導實現(xiàn)OMAPL138雙核自啟動的方案。在該方案中,分析了基于ARM核的bootloader實現(xiàn)流程和處理內(nèi)容,解決了bootloader中ARM核系統(tǒng)的初始化,并基于ARM核實現(xiàn)了OMAPL138系統(tǒng)的初始化以及ARM和DSP應用程序的復制,最終通過ARM核喚醒了DSP核,并成功跳轉(zhuǎn)到ARM應用程序中執(zhí)行,實現(xiàn)了OMAPL138的雙核運行。整個方案實現(xiàn)了bootloader、ARM和DSP應用程序及燒寫所有程序代碼工程都相互獨立運行、互不干擾,針對每個工程項目的cmd文件進行了詳細分析和介紹,對于整個bootloader啟動流程做了詳細的說明,整個過程清晰、可靠。實驗結(jié)果表明,該方案可以實現(xiàn)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系統(tǒng)的Flash引導自啟動設計[J].電子元器件應用,2012,12(14):35-39.
[5] 余同正,徐龍祥.基于雙DSP的磁軸承數(shù)字控制器容錯設計[J].電子技術應用,2005,31(1):27-29.
[6] 郭唐仕,尹華杰,陳錦云.基于雙DSP低電壓大電流交換器的模糊PID控制[J].電子技術應用,2003,29(5):79-81.