close

DM368在內頻上提升到432MHZ,相對於DM365其它功能部分幾乎一樣.唯一最大的改變就是能夠支持1080P的H.264壓縮.IPCAM裡算是很不錯的規格了.不過沒有de-interlace使得在使用tv-decoder會有interlace問題.而Hi3515/3520雖然有de-interlace,但是H.264壓縮規格似乎只到1280x1024的輸出..難道就沒有比較兩全其美的方案嗎?

回歸正題, 過去接觸的平台,硬體初始化都在bootloader做比較多,TI有一個簡單的UBL設計,讓硬體的初始化是在這個比較小的Firmware上做, 然後完成之後,才進到真正的bootloader.

UBL boot

RBL -> UBL -> Bootloader -> Kernel

所以input crystal不變的情況下,幾乎不必改動到bootloader or kernel的程式碼.理論上只要修正UBL的區段即可.

以下是比較365和368不同的PLL registerg設定:

diff -r flash_utils_dm365/DM36x/Common/src/device.c flash_utils_dm368/DM36x/Common/src/device.c
366,367c366,367
<       PLL1->PLLM = 90; //# VCO will 24*2M/N+1 = 540Mhz
<       PLL1->PREDIV = (0x8000|0x7);
---
>       PLL1->PLLM = 170; //# VCO will 24*2M/N+1 = 680Mhz
>       PLL1->PREDIV = (0x8000|0xB);
379,383c379,383
<       PLL1->PLLDIV3 = 0x8001;   // POST DIV 540/(1+1)  -> MJCP/HDVICP (270MHz)
<       PLL1->PLLDIV4 = 0x8003;   // POST DIV 540/(3+1)  -> EDMA CFG (135MHz)
<       PLL1->PLLDIV5 = 0x8001;   // POST DIV 540/(1+1)  -> VPSS
<       PLL1->PLLDIV6 = 0x8013;   // POST DIV 540/(19+1) -> 27MHz VENC
<       PLL1->PLLDIV7 = 0x8000;   // POST DIV 540                -> DDR(270MHz)
---
>       PLL1->PLLDIV3 = 0x8001;   // POST DIV 680/(1+1)  -> MJCP/HDVICP (340MHz)
>       PLL1->PLLDIV4 = 0x8003;   // POST DIV 680/(3+1)  -> PERI_CFG(should be MJCP/2,170)
>       PLL1->PLLDIV5 = 0x8001;   // POST DIV 680/(1+1)  -> VPSS (340)
>       PLL1->PLLDIV6 = 0x8018;   // POST DIV 680/(24+1) -> 27.2MHz VENC
>       PLL1->PLLDIV7 = 0x8000;   // POST DIV 680            -> DDR(680MHz)
385,386c385,386
<       PLL1->PLLDIV8 = 0x800A;   // POST DIV 540/(10+1) -> MMC0/SD0(49.09MHz)
<       PLL1->PLLDIV9 = 0x8001;   // POST DIV 540/2      -> CLKOUT
---
>       PLL1->PLLDIV8 = 0x800D;   // POST DIV 680/(13+1) -> MMC0/SD0(48.5MHz)
>       PLL1->PLLDIV9 = 0x8001;   // POST DIV 680/2      -> CLKOUT
438,439c438,439
<       PLL2->PLLM = 99;
<       PLL2->PREDIV = 0x8000|0x7; //# VCO will be 24*2*PLLM/PREDIV+1 = 594MHz
---
>       PLL2->PLLM = 144;
>       PLL2->PREDIV = 0x8000|0x7; //# VCO will be 24*2*PLLM/PREDIV+1 = 864MHz
447,449c447,449
<       PLL2->PLLDIV2 = 0x8001;          // POST DIV 594/(1+1)  -> ARM (297 MHz)
<       PLL2->PLLDIV4 = 0x801C;      // POST DIV 594/(28+1) = 20.48  -> VOICE Codec Clock
<       PLL2->PLLDIV5 = 0x8015;      // POST DIV 594/(21+1) 27 -> VIDEO
---
>       PLL2->PLLDIV2 = 0x8001;          // POST DIV 864/(1+1)  = 432 -> ARM
>       PLL2->PLLDIV4 = 0x8029;      // POST DIV 864/(41+1) = 20.57 -> VOICE Codec Clock
>       PLL2->PLLDIV5 = 0x801F;      // POST DIV 864/(31+1) = 27 -> VIDEO
523,525c523,525
<       DDR->SDTIMR  = 0x45246412;              //Program SDRAM Timing Control Register1
<       DDR->SDTIMR2 = 0x3A25C742;              //Program SDRAM Timing Control Register2
---
>       DDR->SDTIMR  = 0x5525745B;              //Program SDRAM Timing Control Register1
>       DDR->SDTIMR2 = 0x442EC863;              //Program SDRAM Timing Control Register2
538,539c538,539
<       DDR->SDRCR = 0x0000083A;                //SDRAM Refresh(270MHz*7.8 = 2106)
---
>       DDR->SDRCR = 0x00000A5C;                //SDRAM Refresh(340MHz*7.8 = 2652)
555,557c555,557
<       AEMIF->A1CR = 0x4820230C;
---
>       AEMIF->A1CR = 0x5030420C;

以上是某家的參考值.但我自己的案例是用原始的UBL source code. 所以針對PLL1/PLL2調整之後,再調整DDR2,EMIF的參數即可.

跑出來的BogoMIPS:215,原來只有148左右.

//Program the Multiper and Pre-Divider for PLL1
PLL1->PLLM   =   170;   // VCO will 24*2M/N+1 = 680Mhz
PLL1->PREDIV =   0x8000|0xB; 

//Program the PostDiv for PLL1
PLL1->POSTDIV = 0x8000;

// Post divider setting for PLL1 
PLL1->PLLDIV2 = 0x8001;   // not used.
PLL1->PLLDIV3 = 0x8001;   // POST DIV 680/(1+1)  -> MJCP/HDVICP (340MHz)
PLL1->PLLDIV4 = 0x8003;   // POST DIV 680/(3+1)  -> PERI_CFG(should be MJCP/2,170)
PLL1->PLLDIV5 = 0x8001;   // POST DIV 680/(1+1)  -> VPSS (340)
PLL1->PLLDIV6 = 0x8018;   // POST DIV 680/(24+1) -> 27.2MHz VENC
PLL1->PLLDIV7 = 0x8000;   // POST DIV 680      -> DDR(680MHz)
PLL1->PLLDIV8 = 0x800D;   // POST DIV 680/(13+1) -> MMC0/SD0(48.5MHz)
PLL1->PLLDIV9 = 0x8001;   // POST DIV 680/2       -> CLKOUT

//Program the Multiper and Pre-Divider for PLL2
PLL2->PLLM   =   144;   // VCO will 24*2M/N+1 = 594Mhz

PLL2->PREDIV = 0x8000|0x7; //# VCO will be 24*2*PLLM/PREDIV+1 = 864MHz
PLL2->POSTDIV = 0x8000;

PLL2->PLLDIV2 = 0x8001;        // POST DIV 864/(1+1)  = 432 -> ARM
PLL2->PLLDIV4 = 0x8029;      // POST DIV 864/(41+1) = 20.57 -> VOICE Codec Clock
PLL2->PLLDIV5 = 0x801F;      // POST DIV 864/(31+1) = 27 -> VIDEO

DDR->DDRPHYCR = 0x000000C6;
DDR->SDBCR = 0x08D34A32;        //Program SDRAM Bank Config Register
DDR->SDBCR = 0x0853CA32;
DDR->SDTIMR  = 0x5525745B;        //Program SDRAM Timing Control Register1
DDR->SDTIMR2 = 0x442EC863;        //Program SDRAM Timing Control Register2
DDR->PBBPR = 0x000000FE;
DDR->SDBCR = 0x08534A32;        //Program SDRAM Bank Config Register
DDR->SDRCR = 0x00000A5C;        //SDRAM Refresh(340MHz*7.8 = 2652)

AEMIF->AWCCR = 0xff;
AEMIF->A1CR = 0x5030420C;
AEMIF->NANDFCR |= 1;

實際output:

PLL0: fixedrate: 24000000, commonrate: 170000000, vpssrate: 340000000

PLL0: vencrate_sd: 27200000, ddrrate: 340000000 mmcsdrate: 48571428

PLL1: armrate: 432000000, voicerate: 86400000, vencrate_hd: 27000000

arrow
arrow
    全站熱搜

    Person 發表在 痞客邦 留言(2) 人氣()