天天看點

DAVINCI DM3730開發攻略——xload-1.51移植

DM3730開發攻略已經停頓了一段時間,本人和公司其他軟體工程師都在忙攻克客戶定制的DM3730+OV的一款720P高清低照度産品和TVP5158  2路D1同時采集軟體,現在基本收尾工作,擠點時間,繼續寫開發攻略,希望對在這方面開發的朋友有幫助。本篇文章是基于本公司(桐烨科技)DM3730超級開發闆上面進行描述的,估計和TI EVM有點差别,或者和其他開發闆公司有些差别,但問題不大,都有參考作用。

1、DM3730啟動流程介紹

前面3篇文章已經從總體介紹DAVINCI低功耗晶片DM3730的性能、特點、開發環境和軟體開發包,等等。下面就可以進入程式設計開發階段了。DM3730 boot軟體是Xloader和U-BOOT,這個和DM36X、DM6446、DM6467T(UBL+U-BOOT)有點不一樣,和DM8148、DM8168系列的(U-BOOT MINI+UBOOT)又不一樣。本來想把把xload和uboot一起寫,現在覺得還是分開好,有時寫太長的東西怕沒這麼多精力,還有u-boot-2010.06要移植的東西也比較多。這篇文章從軟體角度重點如何讓闆子BOOT起來。開發驅動和系統軟體前,有個DM3730非常重要的檔案必須要介紹,這個檔案就是DM3730系統開發技術參考手冊——sprugn4q.pdf,或者TI已經把版本更新為sprugn4(x).pdf了,這個檔案3673頁,比較恐怖,裡邊很詳細介紹整個DM3730的每個功能子產品的結構和寄存器描述,等等,開發系統和驅動程式,絕對要認真看。

做好新的高頻布線PCB闆子回來,NAND FLASH裡邊是沒有程式的,在保證闆子電器特性穩定(主要是電源)穩定的情況下,如何讓DM3730闆子跑起來呢?這就要了解DM3730BOOT的過程。這一點在sprugn4q.pdf裡邊也有介紹,TI的圖描述是這樣的:

<a href="http://blog.51cto.com/attachment/201312/210520747.jpg" target="_blank"></a>

圖-1 TI DM3730 BOOT初始化流程

圖-1第一個Preinitialization預初始化是要求從硬體上設計出滿足DM3730軟體BOOT起來的環境,比如電源、時鐘CLK、RESET、BOOT MODE選擇電路等等。TI DAVINCI 晶片DM3730和DM81XX系列的電源管理相當複雜,TI專門為這些主CPU提供對應的電源管理晶片,比如DM3730使用Tps659xx系列的電源IC。時鐘CLOCK電路涉及到外部晶振時鐘和内部進行PLL時鐘的設定,RESET複位電路涉及到冷複位和熱複位等等,BOOT MODE選擇涉及到是從NAND FLASH BOOT、MMC(SD卡) BOOT、USB BOOT、UART BOOT還是XIP BOOT等等,BOOT MODE選擇可以使用電阻通過對sys_boot[5:0]信号腳上拉下拉,進行冷複位上電選擇。

圖-1 第2個框圖描述的是DM3730系統電源、時鐘、複位的上電複位時序,這個很講究的,以前寫DM6446、DM368開發攻略沒有提到這點,其實這些晶片都有上電複位時序。而在DM3730中,電源管理晶片Tps659xx已經幫你實作這些時序的要求。

圖-1 第3個框圖說明DM3730内部的COTEX-A8會從片上的ROM代碼區開始運作,這個ROM CODE已經存在晶片内部,然後根據BOOT MODE,去讀取對應的NAND接口、MMC接口、UART接口、USB接口等等放置的代碼——Xloader,而Xloader編譯出來的檔案是MLO檔案。比如從MMC (SD卡)BOOT的時候,如果沒有SD卡,ROM CODE會轉到NAND FLASH上去找Xloader,如果NAND FLASH沒有Xloader,就會去找UART接口,這個順序有很多種,可以看看sprugn4q.pdf文檔。舉個例子,我們就把特殊格式化的SD卡或TF卡(使用TI要求的或提供的格式化軟體),COPYMLO檔案到SD卡上,這樣一上電片上的ROM CODE就會把MLO給運作起來。下面本人把本公司的開發闆上電序列槽資訊COPY上來,讓大家更加了解這個過程。

60  (這個60表明ROMCODE已經運作起來)

Texas Instruments X-Loader 1.51 (Jun  1 2013 - 15:31:34) (開始運作Xloader代碼——MLO)

Starting X-loader on MMC  (如果使用NAND BOOT,這裡顯示的資訊不一樣)

Reading boot sector

231524 Bytes Read from MMC (Xloader開始從SD卡讀U-BOOT的代碼)

Starting OS Bootloader from MMC...

Starting OS Bootloader...    

U-Boot 2010.06-rc2 (Oct 29 2013 - 21:34:04)  (開始運作U-BOOT)

OMAP34xx/35xx-GP ES2.1, CPU-OPP2 L3-165MHz

OMAP3 EVM board + LPDDR/NAND

I2C:   ready

DRAM:  512 MiB

NAND:  512 MiB

*** Warning - bad CRC or NAND, using default environment

In:    serial

Out:   serial

Err:   serial

Die ID #439600029e3800000149c75518033013

Net:   resettingDM9000

dm9000

Hit ' ' or 'CR' or 'Esc' key to stop autoboot:  0 (一上電就回車或空格進入U-BOOT指令行)

DM3730-&gt;

上面就是SD卡或TF卡BOOT的過程,一般工廠生産的時候,通過跳線帽對BOOT MODE的sys_boot[5:0]進行電平設定,選擇SD卡 BOOT或UART序列槽BOOT,畢竟NAND裡邊SMT貼片出來是沒有程式的,當然有些超大批量生産會使用特殊的燒錄器對NAND進行預先燒寫。無程式的闆子維修的時候一般也是使用跳線帽對sys_boot[5:0]進行電平設定,選擇不同的BOOT MODE進行啟動闆子,目的就是讓闆子跑進U-BOOT再說,U-BOOT起來什麼都好說。

圖-1 第4個框圖就是Xloader,第5個框圖就是U-BOOT和後面跑起來的kernel、挂載檔案系統(ubifs,yaffs2,jaffs2等)、各種linux應用程式。

2、xload-1.51移植

依據上篇《DAVINCI DM3730開發攻略——DVSDK4_03和雙核CODEC機制介紹.doc》的介紹,在dvsdk4_03\psp目錄下,有TI 提供的x-load-1.51-psp04.02.00.07.sdk源碼,我們就在這個源碼上就行修改移植。由于前面介紹DM3730支援好多種接口BOOT,我們做産品必須根據産品的特性選擇不同的BOOT MODE,在這裡我們公司使用NAND BOOT和MMC BOOT模式。

第一步,在dvsdk4_03\psp\目錄下生成x-load-1.51和x-load-1.51-mmc兩個檔案,前面的x-load-1.51是要燒寫進NAND FLASH的,而x-load-1.51-mmc編譯出來的MLO是為了生産和測試維修使用的。然後把x-load-1.51-psp04.02.00.07.sdk裡邊的源碼COPY過來,而x-load-1.51-psp04.02.00.07.sdk裡邊的源碼保持不動,是出于備份和以後出問題的對比參照源碼而考慮的。而x-load-1.51是我們要移植的,想怎麼改都可以。

第一步,裁剪多餘的檔案夾和檔案,在dvsdk4_03\psp\x-load-1.51\board目錄下隻保留omap3evm檔案夾,其他OMAP晶片平台删除掉,dvsdk4_03\psp\x-load-1.51\include\configs目錄下隻保留omap3evm.h,沒辦法,本人追求簡潔。

第三步,在dvsdk4_03\psp\x-load-1.51目錄下生成build-x-load.sh的檔案,内容如下:

#for building x-load

exportPATH=$PATH:/home/davinci/dm3730/dvsdk4_03/linux-devkit/bin:(這行可以不要)

make distclean

make omap3evm_config

make

./signGP x-load.bin

chmod 777 x-load.bin.ift

cp x-load.bin.ift dm3730_xload.bin

cp dm3730_xload.bin /tftpboot

就是編譯的時候直接運作build-x-load.sh就可以得到我們想要的dm3730_xload.bin,這個dm3730_xload.bin就是要燒寫到NAND FLASH的,到時候會通過U-BOOT進行燒寫。Xloader放在NAND FLASH的位址範圍是0x00000000-0x00080000,其實放到第一個BLOCK 0x00000000-0x00020000就夠了,而從0x000080000的開始地方儲存u-boot.bin,這個後面移植u-boot會提到。build-x-load.sh提到一個signGP的工具,這個一般賣開發闆的公司都會提供這個工具,同時也把signGP放到這個x-load-1.51目錄下。上面sh檔案make後會直接生成x-load.bin,但是x-load.bin是不能直接被片上的ROM CODE識别的,是以就需要signGP轉化一下,得到x-load.bin.ift,然後重新命名成dm3730_xload.bin并COPY到/tftpboot,到時候可以通過U-BOOT TFTP燒寫,等等。

第四步,開始修改源碼移植。為了使上面編譯出來的dm3730_xload.bin燒到NAND FLASH能讓ROM CODE識别,我們還得對x-load-1.51裡邊的源碼進行修改,讓這個x-load-1.51能夠NAND BOOT,這裡必須修改x-load-1.51\include\configs\omap3evm.h的一個宏定義:

/* Enable the below macro if MMC bootsupport is required */

//#define CONFIG_MMC               1 //Jingbo: for nand

就是要把#defineCONFIG_MMC給屏蔽掉。

x-load-1.51相對u-boot 來說,代碼比較簡單,檔案也比較少,但是整個源碼工程也是參考了u-boot的結構,很像u-boot的源碼組織,主要關注x-load-1.51\Makefile,x-load-1.51\board\omap3evm\omap3evm.c和platform.S,x-load-1.51\include\configs\omap3evm.h。

先改x-load-1.51\Makefile:

第56行,

#CROSS_COMPILE = arm-none-linux-gnueabi- (屏蔽這個)

CROSS_COMPILE =arm-arago-linux-gnueabi-  (使用開發環境篇介紹的linux-devkit交叉編譯工具)

第149行的

omap3evm_config :       unconfig

      @./mkconfig$(@:_config=) arm omap3 omap3evm

這個就沒必要改動了。Make編譯就使用omap3evm_config。如果你喜歡改成你自己的闆子也可以,和u-boot一樣。

改動x-load-1.51\include\configs\omap3evm.h:

屏蔽第74行://#defineCONFIG_DDR_256MB_STACKED

根據自己闆子的特性,如果使用UART1做為LINUX的調試口,則

#defineCFG_NS16550_COM1         OMAP34XX_UART1

/*

* select serial console configuration

*/

#defineCONFIG_SERIAL1           1    /* UART1 on OMAP3EVM */

#defineCONFIG_CONS_INDEX        1

不需要改動,如果是UART3什麼的把那個1改成3就OK。

#defineNAND_UBOOT_START        0x0080000 /*Leaving first 4 blocks for x-load */

#defineNAND_UBOOT_END            0x0100000 /*Giving a space of 4 blocks = 512KB */

#defineNAND_BLOCK_SIZE         0x20000

這裡的定義也需要注意,就是u-boot.bin到底要存放NAND FLASH什麼地方,從什麼地方開始,到什麼地方結束,這在x-load-1.51 \lib\board.c裡start_armboot()會用到。

改動x-load-1.51\board\omap3evm\platform.S:

這個彙編檔案就是要做好DM3730最基本的初始化、設定PLL時鐘,GPMC接口時序設定等等重要的東西,深入研究必須要看看sprugn4q.pdf裡邊有關COTEX-A8的主時鐘設定,IVA2.2(C64+DSP)的時鐘設定。在Xlaoder工程裡,這個platform.S彙編代碼就是COTEX-A8最開始運作的代碼,它會調用到omap3evm.c\s_init的C函數。如果隻是學習過程,可以不用改這個檔案。

改動x-load-1.51\board\omap3evm\omap3evm.c:

這個檔案主要配置DM3730最小系統的運作環境了,檔案裡邊描述的MPU就是COTEX-A8,IVA就是C64+ DSP和圖像協處理器,是以在這裡設定MPU PLL,IVA PLL,DDR的時序配置,GPMC時序設定(就是NAND FLASH接口)。還有DM3730和OMAP3630 CPU基本一樣,是以有些條件判斷是CPU_OMAP36XX平台的也等同DM3730平台。

在s_init(void)函數裡,我們要把

//     if((get_mem_type() == GPMC_NAND) || (get_mem_type() == MMC_NAND))

//            nand_init();  //Jingbo: disable

給屏蔽掉,因為我們使用MMC-NAND-UART3BOOT 模式。

DDR的配置在config_3430sdram_ddr()函數,可以配置165M的頻率,也可以配置200M的頻率,這裡就不詳細說了,看代碼和手冊。

per_clocks_enable(void)函數就是在Xloader裡邊就開始設定這些外邊并行接口的時鐘,比如UART3,I2C,MMC,等等。

然後重點說一下就是#defineMUX_DEFAULT()

DM3730有423腳和515腳的晶片,晶片封裝又分為CUS、CBP、CBC等等。不同的封裝的管腳描述是不一樣的,而管腳複用更是不一樣。DM81XX系列也一樣,晶片越來越強大,管腳複用越來越複雜,這個讓開發的人非常頭疼。

set_muxconf_regs函數會用到#define MUX_DEFAULT()的定義,這裡确定某個管腳是GPIO功能還是其他接口功能,都在這裡定義

*IEN  - Input Enable

*IDIS - Input Disable

*PTD  - Pull type Down

*PTU  - Pull type Up

*DIS  - Pull type selection is inactive

*EN   - Pull type selection is active

*M0   - Mode 0

*The commented string gives the final mux configuration for that pin

TI 源碼給出這個說明,我想詳細看看代碼會明白如何修改#define MUX_DEFAULT()。這裡還有看看DM3730的晶片DATASHEET第2章,裡邊說明每個功能管腳都有7種複用模式,比如GPIO使用M4模式。修改這個内容一定要搞清楚你的DM3730晶片是什麼型号和封裝。當然,你也可以不用在Xloader修改,因為在U-BOOT的代碼裡邊還會有這個管腳複用修改表。同樣在核心源碼也有這個定義。其實就是重複設定了。

第五步,編譯修改生産測試維修用的x-load-1.51-mmc,因為本公司做的産品都帶SD卡或TF卡,是以我們的sys_boot[5:0]模式是預設MMC---NAND----UART3的模式(或者也可以類似做個x-load-1.51-uart的模式)。把x-load-1.51裡邊修改好的源碼全部COPY過來,然後修改x-load-1.51-mmc\include\configs\omap3evm.h第47行:

#define CONFIG_MMC               1 //Jingbo MLO for mmc

就是要打開這個CONFIG_MMC

然後修改x-load-1.51-mmc\build-x-load.sh

exportPATH=$PATH:/home/davinci/dm3730/dvsdk4_03/linux-devkit/bin:

cp x-load.bin.ift MLO

直接執行./ build-x-load.sh就得到我們想要的MLO。前面說過這個MLO和後面要講到的u-boot.bin一起COPY到SD卡或TF卡裡邊,才能被DM3730片上ROM CODE運作起來,最後進入u-boot的指令行裡進行其他燒寫操作。這裡我們需要使用SD卡或TF卡轉USB接口的轉接器,市場上面一般幾塊錢一個,然後使用特殊的格式化工具(比如HP USB Disk Storage Format Tool),進行格式化,絕對不能用XP或WIN7自帶的方法直接FAT32格式化,否則DM3730不認。把帶有MLO和u-boot.bin的sd卡插上,這兩個檔案名字不要亂改其他名字,然後給闆子上電,出現前面的序列槽資訊才是OK的。

好了,到這裡整個DM3730 BOOT過程和Xloader的移植也說完了,具體的操作還需要親自編譯調試燒寫等工作才能更好的掌握。這裡确實沒太多精力為每個函數都得去介紹。由于時間緊,估計有些問題沒時間較長的描述,其實都需要看手冊、代碼、DDR NAND晶片手冊就可以搞定。後面還會寫到u-boot的移植,核心的移植,關鍵要看看給其他客戶定制的項目進展如何,更進階的高清浮點CPU項目研發進展如何,或者春節有時間寫寫,明年就要寫更進階的CPU開發攻略了。

(聲明:

    桐烨科技DM3730/DM6446的闆子和其他公司的開發闆不一樣,特别是DM3730的闆子,目前國内好多家公司都隻提供ARM端(CORTEX-A8)的應用例子,很少介紹如何添加客戶自己的算法到DSP端的例子,有些需要做DSP算法的人貪便宜,結果買這些便宜的闆子回去花大量時間來學習,遲遲搞不清楚整個架構,浪費的這些時間難道不是資金嗎?我們桐烨科技的闆子都幫你采集好YUV格式的視訊圖像,并教會你如何把這個原始的圖像資料放到DSP端進行處理,然後再教會你如何傳處理過的圖像資料和參數到ARM端。同時提醒客戶還要注意一些冒牌的公司,特别是杭州有家沒道德的公司直接拿我們桐烨科技的DM3730開發闆圖檔放到他們公司網站上,欺騙其他人,我們桐烨科技從來沒有想到讓其他公司做代理。

本文轉自 zjb_integrated 51CTO部落格,原文連結:http://blog.51cto.com/zjbintsystem/1346487,如需轉載請自行聯系原作者

繼續閱讀