DM816x,C6A816x,AM389x是TI新一代高性能SOC,系統(tǒng)集成度高,系統(tǒng)控制模塊化,架構(gòu)與以往TI SOC平臺(tái)有所不同,本文針對(duì)最小系統(tǒng)的時(shí)鐘配置,電源管理,內(nèi)存映射,內(nèi)存配置的區(qū)別做深入解釋。
DM816x,C6A816x,AM389x引腳兼容(為方便討論,下面統(tǒng)稱DM816x),資源配置主要區(qū)別如下表所示,這種兼容系列產(chǎn)品便于用戶基于同一平臺(tái),根據(jù)不同的產(chǎn)品需求選擇合適的型號(hào),可以節(jié)省大量的硬件、系統(tǒng)軟件開發(fā)時(shí)間。
表1. DM816x, C6A816x, AM389x比較表

?
1.時(shí)鐘配置
DM816x內(nèi)部有4個(gè)FAPLL(Flying Adder PLL,結(jié)構(gòu)見圖1.1),分別負(fù)責(zé)不同模塊的時(shí)鐘配置,系統(tǒng)時(shí)鐘框圖見圖1.2。

?
圖1.1 Flying-Adder PLL框圖

?
圖1.2 DM816x系統(tǒng)時(shí)鐘結(jié)構(gòu)圖
FAPLL相對(duì)于傳統(tǒng)的PLL具有精度高,響應(yīng)快,減少模擬電路復(fù)雜度等優(yōu)點(diǎn),更適合于音視頻應(yīng)用。從使用者的角度在DM816x上最直接的體現(xiàn)是它支持小數(shù)分頻系數(shù),方便于產(chǎn)生需要的頻率。
每個(gè)FAPLL結(jié)構(gòu)由兩部分組成:
1. Multiphase PLL。
2. Flying Adder Synthesizer.(可能有多個(gè)為不同模塊提供不同頻率的時(shí)鐘)
FAPLL的配置屬于Control Module的PLL部分。
Multiphase PLL的配置寄存器為相應(yīng)的FAPLL控制寄存器,對(duì)應(yīng)四個(gè)FAPLL分別為:MAINPLL_CTRL,DDRPLL_CTRL,VIDEOPLL_CTRL,AUDIOPLL_CTRL.Multiphase PLL的輸出時(shí)鐘頻率為:

?
Flying Adder Synthesizer的配置寄存器為相應(yīng)FAPLL的PLL_FREQ和PLL_DIV寄存器,可能有多組對(duì)應(yīng)多個(gè)Synthesizer.對(duì)應(yīng)圖1.1中Fs和Fo的輸出頻率計(jì)算公式為:

?
FAPLL的配置參數(shù)不能任意選擇,在根據(jù)上述公式計(jì)算頻率的基礎(chǔ)上需要滿足下面公式的條件:

?
● A = 169 (如果AUDIOPLL的輸入源是從MAINPLL輸出的,則AUDIOPLL的A=218)。
● H = 10 (如果M*FREQ是8的倍數(shù),否則H=0)。
●800MHz≤PLL_CLKIN*N/P≤1600MHz?? 10MHz≤PLL_CLKIN/P≤60MHz
● MIN CYCLE見表2
表2 PLL時(shí)鐘頻率
?
針對(duì)視頻應(yīng)用,系統(tǒng)輸入時(shí)鐘CLKIN=27MHz,在EVM板提供的gel文件,UBOOT代碼里有提供合適的FAPLL配置參數(shù)。對(duì)于其它的輸入時(shí)鐘頻率,需要根據(jù)上面的條件計(jì)算合適的配置值。
CLKIN時(shí)鐘經(jīng)過FAPLL后,送到PRCM進(jìn)行選擇控制,給各模塊提供時(shí)鐘。以圖2.3Main PLL為例,框內(nèi)部分由PRCM(Power Reset Control Module)控制,參考后面的PRCM部分。

?
圖2.3 MAIN PLL框圖
下面以MainPLL的Main PLL clock 1輸出為例說明時(shí)鐘的配置方法,MAINPLL_FREQ1寄存器定義見表3,MAINPLL_DIV1寄存器定義見表4.
表3 MAINPLL_FREQ1寄存器

?
表4 MAINPLL_DIV1寄存器

?
Main PLL clock 1輸出頻率計(jì)算公式如下:
?
PLL_FREQ寄存器小數(shù)分頻系數(shù)MAIN_FRACFREQ1部分的計(jì)算方法是:
DecToHex(Fraction * 2 24),如0.5的16進(jìn)制小數(shù)=(0.5*224)= 0x800000。
同時(shí)需要注意的是PLL_FREQ的整數(shù)系數(shù)INTFREQ必須大于或等于8。
SYSCLK1的時(shí)鐘輸出為:

?
E為PRCM的CM_SYSCLK1_CLKSEL[CLKSEL]分頻系數(shù)選擇。
2.電源,復(fù)位,控制模塊配置
PRCM(Power Reset Control Module)是系統(tǒng)控制的樞紐。一方面控制系統(tǒng)模塊的正常供電,一方面可以將不用的模塊關(guān)閉達(dá)到省電的目的。
2.1 電源管理
電源管理模塊控制電源域的使能與關(guān)閉,共有的四個(gè)電源域?yàn)椋?Always On,Default, Active,SGX,視頻協(xié)處理器電源域IVAHD0,IVAHD1,IVAHD2是DM816x特有的。Always On電源域不能關(guān)閉,其它電源域由相應(yīng)的PRCM.PM__PWRSTCTRL[POWERSTAT]寄存器控制電源的開關(guān):
● PM_ACTIVE_PWRSTCTRL控制GEM,HDMI,HDD_SS.
● PM_DEFAULT_PWRSTCTRL控制TPDMA,DMM,DDR0/1,USB0/1,SATA,PCI,TPPSS,M3.
● PM_SGX_PWRSTCTRL控制3D圖形模塊。
● 三個(gè)視頻協(xié)處理分別由PM_IVAHD0_PWRSTCTRL,PM_IVAHD1_PWRSTCTRL,PM_IVAHD2_PWRSTCTRL控制。
通常一個(gè)電源域下包含多個(gè)模塊,如果同一電源域的某模塊需要繼續(xù)使用,則只能關(guān)閉其它不用的模塊的時(shí)鐘來達(dá)到省電的目的,而不能關(guān)閉整個(gè)電源域。
為了進(jìn)一步達(dá)到省電的目的,對(duì)于使能的模塊,可以通過_SYSCONFIG. MIDLEMODE 或者 >Module>_SYSCONFIG寄存器的STANDBYMODE設(shè)置將其配置為smart-standby模式,在其沒有操作的時(shí)候,模塊自動(dòng)關(guān)閉時(shí)鐘進(jìn)入省電狀態(tài),在有操作的時(shí)候,自動(dòng)打開時(shí)鐘。不是每個(gè)模塊都可配置STANDYMODE,需要檢查相應(yīng)的模塊是否有上述兩個(gè)寄存器之一。
2.2復(fù)位管理
芯片的復(fù)位分為兩大類:系統(tǒng)級(jí)復(fù)位和模塊級(jí)Local Reset。
2.2.1 系統(tǒng)級(jí)復(fù)位
表5列出了系統(tǒng)級(jí)復(fù)位的不同復(fù)位信號(hào)源分類,以及對(duì)芯片的不同影響。
表5 系統(tǒng)級(jí)復(fù)位分類

?
芯片的硬件復(fù)位分為上電復(fù)位(POR)和熱復(fù)位(WARM Reset),區(qū)別是Warm Reset不會(huì)復(fù)位仿真器的狀態(tài),如果仿真器處于連接狀態(tài)則不會(huì)斷連。這兩種硬件復(fù)位都會(huì)讓芯片重新Boot.
PRCM的PRM_RSTCTRL寄存器控制用來設(shè)置以下兩種軟件全局復(fù)位:
● 軟件全局冷復(fù)位(Software Cold Global Reset)。
●軟件全局熱復(fù)位(Software Warm Global Reset) .
這兩種復(fù)位都不會(huì)使芯片重新Boot,區(qū)別同樣是軟件全局熱復(fù)位不會(huì)復(fù)位仿真邏輯。
仿真器復(fù)位,看門狗復(fù)位與PRCM的Software Warm Global Reset的作用是一樣的。
TRST復(fù)位是通過仿真器對(duì)芯片JTAG電路的復(fù)位控制,不會(huì)復(fù)位芯片的狀態(tài)。
2.2.2 局部復(fù)位Local Reset
局部子系統(tǒng)可以通過軟件控制復(fù)位狀態(tài),一共有六個(gè)RM__RSTCTRL寄存器分別控制Always On之外的六個(gè)電源域下的局部子系統(tǒng)的復(fù)位:
● RM_ACTIVE_RSTCTRL控制DSP的復(fù)位;
●RM_DEFAULT_RSTCTRL控制PCIe,MMU和兩個(gè)M3的復(fù)位。
● RM_SGX_RSTCTRL控制SGX的復(fù)位。
● RM_IVAHD0_RSTCTRL,RM_IVAHD1_RSTCTRL,RM_IVAHD2_RSTCTRL控制視頻協(xié)處理的復(fù)位。
2.3 時(shí)鐘管理
時(shí)鐘經(jīng)FAPLL(Flying Adder PLL)倍頻后輸入PRCM,PRCM對(duì)時(shí)鐘的控制管理分為三個(gè)方面:
● 模塊時(shí)鐘頻率的配置由CM__CLKSEL[CLKSEL]控制;
●時(shí)鐘域的開關(guān)由CM___CLKSTCTRL控制;
● 模塊時(shí)鐘開關(guān)由CM___CLKCTRL控制;
由上可以看出系統(tǒng)架構(gòu)的劃分,首先是按電源域,然后按時(shí)鐘域,最后才是對(duì)模塊獨(dú)立的時(shí)鐘控制。為達(dá)到省電的目的,在不能對(duì)整個(gè)電源域關(guān)閉的情況下,要看時(shí)鐘域是否有模塊被使用,如果沒有,則可將時(shí)鐘域關(guān)閉,否則,就只能將相應(yīng)的模塊時(shí)鐘關(guān)閉。
以系統(tǒng)中用到EMIF0,但不用EMIF1為例說明如何配置PRCM控制電源域,時(shí)鐘域,以及模塊時(shí)鐘。
● EMIF屬于Default電源域,PM_DEFAULT_PWRSTCTRL寄存器只有一個(gè)控制位控制整個(gè)default電源域的開關(guān),因?yàn)镋MIF0要使能,所以這個(gè)寄存器必需使能,也就是不能關(guān)閉整個(gè)default電源域。
WR_MEM_32(PM_DEFAULT_PWRSTCTR, 0x2);
while((RD_MEM_32(PM_DEFAULT_PWRSTCTR) & 0x3000)!=0x3000);
● 配置EMIF的時(shí)鐘域,EMIF時(shí)鐘屬于L3_FAST_DEFAULT_GCLK時(shí)鐘域,由寄存器CM_DEFAULT_L3_FAST_CLKSTCTRL 控制,DMM,EMIF_FW也屬于這個(gè)時(shí)鐘域,所以這個(gè)時(shí)鐘域需要使能。
WR_MEM_32(CM_DEFAULT_L3_FAST_CLKSTCTRL, 0x2);
while((RD_MEM_32(CM_DEFAULT_L3_FAST_CLKSTCTRL) & 0x300)!=0x300);
● 配置EMIF模塊時(shí)鐘,EMIF0,EMIF1的模塊時(shí)鐘分別由CM_DEFAULT_EMIF_0_CLKCTRL和CM_DEFAULT_EMIF_1_CLKCTRL單獨(dú)控制。
WR_MEM_32(CM_DEFAULT_EMIF_0_CLKCTRL, 0x2); // Enable EMIF0 Clock
while(RD_MEM_32(CM_DEFAULT_EMIF_0_CLKCTRL)!=0x2);
WR_MEM_32(CM_DEFAULT_EMIF_1_CLKCTRL, 0x0); // Disable EMIF1 Clock
while((RD_MEM_32(CM_DEFAULT_EMIF_1_CLKCTRL) & 0x3000)!=0x3000);
3.DSP MMU配置
DM816x DSP上首次使用了MMU,MMU(Memory Management Unit)的作用是:
● 提供硬件機(jī)制的虛擬地址與物理地址轉(zhuǎn)換;
● 提供硬件機(jī)制的內(nèi)存訪問權(quán)限授權(quán)。
對(duì)于支持多進(jìn)程的HLOS(High Level Operation System),OS利用MMU的地址轉(zhuǎn)換功能可以為每個(gè)進(jìn)程提供獨(dú)立的地址空間。但對(duì)于DSP來說,通常不運(yùn)行HLOS, 這種功能得不到體現(xiàn)。
在ARM+DSP的雙核SOC架構(gòu)上,所有外設(shè)包括內(nèi)存空間都是共享的,平等訪問,這樣的架構(gòu)有很多好處,比如在兩個(gè)核間共享數(shù)據(jù)很高效,只需要傳遞數(shù)據(jù)的指針,不需要做數(shù)據(jù)的拷貝;但是帶來的問題是需要用戶程序保證不會(huì)非法改寫另一個(gè)核的程序數(shù)據(jù)空間,否則會(huì)導(dǎo)致系統(tǒng)崩潰,而且這種問題導(dǎo)致的現(xiàn)象不確定,通常難以精確定位。
ARM上的HLOS如Linux的內(nèi)存管理,可以保證不會(huì)非法訪問系統(tǒng)管理之外的空間。在以往的DaVinci系列芯片上DSP沒有MMU,需要用戶保證DSP程序不會(huì)非法訪問ARM的程序和數(shù)據(jù)空間。DM8168的DSP上使用MMU以硬件方式提供了內(nèi)存訪問授權(quán),使內(nèi)存訪問越界問題的定位變得格外容易, MMU的錯(cuò)誤狀態(tài)寄存器會(huì)記錄越界訪問,并且MMU_FAULT_AD會(huì)記錄最近通過MMU的訪問地址。
MMU可以工作在旁通模式,即不對(duì)地址做映射,但是在DM816x上GPMC的系統(tǒng)地址空間于0x0地址開始,與DSP的片內(nèi)地址空間重疊,如果DSP需要訪問GPMC,必需要通過MMU將GPMC的空間映射到虛擬空間。
MMU的TLB(Translation Look-aside Buffer)配置分為兩種:TWL(Table Walking Logic)模式,和靜態(tài)TLB模式;TWL模式功能靈活,靜態(tài)TLB模式轉(zhuǎn)換效率高[5].
通常DSP上不運(yùn)行HLOS,建議采用靜態(tài)TLB模式。一張超級(jí)映射表可以映射16MByte空間,TLB共可容納32張表,最多可以映射512MByte空間。由于外設(shè)通常由ARM控制,DSP訪問部分GPMC和部分DDR空間,以及部分外設(shè),所以512MByte空間能滿足絕大多數(shù)應(yīng)用的DSP訪問空間需求。目前UBoot中沒有DSP MMU的配置,用戶在DSP訪問片外空間之前完成MMU的配置即可。
4 DDR配置
DM816x的DDR控制器兼容支持DDR2和DDR3;有兩個(gè)獨(dú)立的控制器,各有兩個(gè)片選;每個(gè)DDR控制器的地址空間為1GByte;與TI以往處理器不同的是在DM816x上片選與地址空間的映射是可配置的,每個(gè)片選上的地址空間大小也是可配置的。所以在DM816x上的DDR配置分為三部分:
●DDR時(shí)鐘配置
●DDR地址空間映射,
●DDR時(shí)序配置
4.1 DDR時(shí)鐘配置
DDR時(shí)鐘FAPLL配置計(jì)算方法參見前面時(shí)鐘配置部分。DDR時(shí)鐘包括兩部分:接口時(shí)鐘,模塊功能時(shí)鐘。
接口時(shí)鐘即FDDR_CLK由DDR FAPLL的Fvco經(jīng)DDRPLL_DIV1分頻輸出。
DDR模塊功能時(shí)鐘FSYSCLK8固定為400MHz以與內(nèi)部總線L3時(shí)鐘同步, 無論DDR接口時(shí)鐘多少,都將SYSCLK8配置為400MHz.
DDR時(shí)鐘計(jì)算公式:

?
4.2 DDR地址空間映射
DDR空間尋址范圍共2GB,最多可分為4段,通過DMM的DMM_LISA_MAP0~3分別配置EMIF0的CS0,CS1和EMIF1的CS0和CS1的首地址映射,及兩個(gè)DDR控制器之間的尋址方式。兩個(gè)DDR控制器之間的尋址方式有兩種模式:非交織訪問,交織訪問。
非交織訪問,即兩個(gè)控制器的尋址在各自的映射范圍內(nèi)線性遞增。如果希望將ARM與DSP的內(nèi)存空間在物理上分開,可以選擇這種模式。當(dāng)只使用一個(gè)控制器時(shí),只能使用非交織的線性尋址模式。
交織訪問,即雙通道內(nèi)存技術(shù),當(dāng)訪問在控制器A上進(jìn)行時(shí),控制器B為下一次訪問做準(zhǔn)備,數(shù)據(jù)訪問在兩個(gè)控制器上交替進(jìn)行,從而提高DDR吞吐率。支持128byte,256byte,512byte的交織模式。如果要使用交織模式,要保證兩個(gè)控制器上有對(duì)稱的物理內(nèi)存:即兩塊內(nèi)存大小一致;在各自的控制器上的地址映射一致。
以兩個(gè)控制器上的CS0,CS1各接512MByte內(nèi)存,共2GByte內(nèi)存為例,非交織線性訪問模式的配置為:
/*Program the DMM to Access EMIF0*/
WR_MEM_32(DMM_LISA_MAP__0, 0x80500100);
WR_MEM_32(DMM_LISA_MAP__1, 0xA0500120);
/*Program the DMM to Access EMIF1*/
WR_MEM_32(DMM_LISA_MAP__2, 0xC0500200);
WR_MEM_32(DMM_LISA_MAP__3, 0xE0500220);
示意圖見4.1.

?
圖4.1 線性訪問模式
在線性訪問模式下,系統(tǒng)送出的物理地址在控制器上線性遞增尋址,圖4.2為線性模式的物理尋址示意圖。

?
圖4.2 線性訪問物理地址尋址。
128-byte交織訪問模式的配置為:
/*Program the DMM to Access EMIF0 and 1*/
// Interleaved 1GB section from 0x80000000 on EMIF0 CS0 and EMIF1 CS0
WR_MEM_32(DMM_LISA_MAP__0, 0x80640300);
// Interleaved 1GB section from 0xC0000000 on EMIF0 CS1 and EMIF1 CS1
WR_MEM_32(DMM_LISA_MAP__1, 0xC0640320);
WR_MEM_32(DMM_LISA_MAP__2, 0x80640300);
WR_MEM_32(DMM_LISA_MAP__3, 0xC0640320);
圖4.3為交織訪問模式下系統(tǒng)地址在控制器尋址訪問的示意圖。

?
圖4.3 交織訪問模式
在交織訪問模式下,系統(tǒng)送出的物理地址在兩個(gè)控制器上交替訪問,圖4.4為128Byte交織模式的物理尋址示意圖。

?
圖4.4 交織訪問物理地址尋址
4.3 DDR時(shí)序配置
DM816x 目前版本的DDR3控制器不支持硬件自動(dòng) Leveling,支持軟件leveling,運(yùn)用參考文獻(xiàn)[3]的工具,根據(jù)DDR布線計(jì)算出leveling種子,將計(jì)算結(jié)果更新到UBoot的ddr_def.h文件中。每次重新布板后,都需要重新計(jì)算leveling.工具中提供的配置基于4*8bit的,如果是用2x16bit的配置,那么在RatioSeed.xls中DQS0=DQS1,DQS2=DQS3;CK0=CK1,CK2=CK3.
結(jié)束語(yǔ)
閱讀本文請(qǐng)結(jié)合EVM板的gel文件,DM8168 EZSDK[7] UBoot源碼的board\ti\ti8168\evm.c文件的s_init()函數(shù)。
評(píng)論