天天看點

Davinci DM6446開發攻略——u-boot-1.3.4移植(1)

UBOOT的版本更新速度比較快,截止今天,穩定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM開發包裡的UBOOT是1.2.0版本,國内很多公司還一直使用u-boot-1.1.4和u-boot-1.1.6。其實,我們也沒必要追風跟上最新版本,程式跑穩定才是最重要的。當然,有興趣研究研究也不錯,畢竟最新版本增加很多實用的功能。在移植之前,我們簡單介紹u-boot這些版本架構的變化。從u-boot-1.3.0到u-boot-1.3.2基本上架構是一樣的,而從u-boot-1.3.3到u-boot-1.3.4,架構相對u-boot-1.3.2變化比較大。從u-boot-2008.10開始,nand flash驅動變化非常大,u-boot-2009.03增加強大的lzma壓縮解壓功能,fs支援yaffs2,u-boot-2009.06  nand flash變化更大。到u-boot-2009.11.1增加DM6467 DM365的支援。

關于u-boot-1.3.4的移植,本人的部落格也介紹在三星s3c2440上移植過,我們在這裡主要針對davinci 平台。由于UBOOT功能很多,要全部把移植的東西立刻寫出來,對本人還是有難度,是以中間會先釋出有關montavista linux-2.6.18的移植,如何把DSP程式先跑起來,等等。由于本人的主要工作是開發産品,賣賣DM6446核心闆、DM6437核心闆,及相關開發闆,智能視訊監控IVR,推推DSP方案,是以部落格更新速度比較慢,其實寫部落格的目的,有很大的部分就是想和全國各地朋友交流技術。<b>同時這裡要感謝</b><b>51CTO</b><b>的小松管理者,把本人的開發攻略改為推薦博文。</b>回到移植正題,我們一步一步把UBOOT跑起來,把核心也跑起來。鑒于學習的目的,本人這裡不提供patch。

<b>第一步:解壓和簡化</b><b>UBOOT</b>

<b></b>

在頂層目錄:把檔案avr32_config.mk,blackfin_config.mk,i386_config.mk,m68k_config.mk,microblaze_config.mk,mips_config.mk,nios2_config.mk,nios_config.mk,ppc_config.mk,sh_config.mk,sparc_config.mk删除;檔案夾lib_avr32,lib_blackfin,lib_i386,lib_m68k,lib_microblaze,lib_mips,lib_nios,lib_nios2,lib_ppc,lib_sh,lib_sparc,nand_spl,onenand_ipl,其他就不要删了。

在board目錄下:隻保留davinci檔案夾,其他平台闆子全部幹掉!男人就要狠一點。而davinci也隻保留TI 自己的dv-evm檔案夾,這也是我們要修改的平台,schmoogie、sffsdr、sonata是其他公司基于davinci上的闆子,你可以删掉,也可以參考。當然,還是在board\davinci目錄下,你可以COPY dv-evm并改成你公司的闆子的名字,然後在頂層修改makefile支援你公司的闆子,下一步再說。

在cpu的目錄:隻保留arm926ejs,其他CPU全部幹掉。進入arm926ejs目錄,同時把at91sam9、omap、versatile檔案夾删除,保留davinci和其他檔案。

在include目錄:把檔案夾asm-avr32、asm-blackfin、asm-i386、asm-m68k、asm-microblaze、asm-mips、asm-nios、asm-nios2、asm-ppc、asm-sh、asm-sparc删除掉。進入configs目錄,隻保留davinci_dvevm.h,其他*.h檔案全部删除調!

做完以上的工作後,UBOOT相當簡潔,其實還有一些檔案和檔案可以再删,不過已經沒必要,我們删除的對象是其他不相關的平台。備份一下這個源版本,便于日後自己修改的UBOOT和這個源版本比較。

<b>第二步:連結交叉編譯環境</b><b></b>

如果你已經看過本人有關《DAVINCI DM6446開發攻略——環境搭建篇》,按裡邊描述的方法,對交叉編譯環境進行搭建,那麼下面編譯工作就好進行了。

修改頂層makefile:

在144行:把CROSS_COMPILE = arm-linux-改為CROSS_COMPILE = arm_v5t_le-

在282行:把ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND),改為ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) <b>u-boot.img</b>,就是後面添加u-boot.img

在308行:./tools/mkimage -A $(ARCH) -T firmware -C none \後面,添加和登出以下代碼:

<b>    -a 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }') \</b>

<b>    -e 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }') \</b>

<b>    -n 'u-boot image' -d $&lt; $@</b>

<b>#       -a $(TEXT_BASE) -e 0 \</b>

<b>#       -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \</b>

<b>#          sed -e 's/"[  ]*$$/ for $(BOARD) board"/') \</b>

<b>#       -d $&lt; $@</b>

(注意要加tab鍵)

這裡這樣做的目的,生成的u-boot.img可以被上篇介紹的UBL給BOOT起來,而u-boot.bin可以被TI提供的uart_load.exe 和uartapp.bin 軟體方式(soft boot)啟動起來,便于生産和測試。

在源makefile檔案2416行:就是davinci_dvevm_config :    unconfig

    @$(MKCONFIG) $(@:_config=) arm arm926ejs dv-evm davinci davinci

根據這一行,你可以參考TI 這個做法定義自己的闆子,添加自己闆子的config,比如加入:

davinci_dm6446_config : unconfig

    @$(MKCONFIG) $(@:_config=) arm arm926ejs dm6446 davinci davinci

然後在board\davinci目錄下,使用

mkdir dm6446

cp –f dv-evm/* dm6446/

同時進入include/configs/目錄,使用cp –f davinci_dvevm.h davinci_dm6446.h

<b>注:其實直接在TI  dv-evm上移植也可以,沒必要定義自己的闆子和配置。這裡隻不過給大家舉個例子。</b>

編譯工作:

$make distclean

$make davinci_dm6446_config

$make

看是否編譯全部通過,是否生成u-boot.bin和u-boot.img等檔案,同時檢查你的交叉編譯環境是否建立好,沒問題繼續往下進行。

<b>第三步:移植闆子驅動和配置</b>

1、  修改davinci_dm6446.h

首先說說本人闆子的資訊:DDR2——256M-Byte,NAND——128M-Byte——2K Page; 通用網口PHY晶片,沒有NOR FLASH和ATA。

/*=======*/

/* Board */

#define DV_EVM

<b>#define CFG_USE_NAND</b><b>(支援NAND</b><b>)</b>

<b>#define CFG_NAND_LARGEPAGE </b><b>(支援2K Page</b><b>的NAND</b><b>)</b>

//#define CFG_NAND_SMALLPAGE(表示支援512 位元組 Page)

//#define CFG_USE_NOR(表示支援NOR FLASH)

。。。。。。。

/*===================*/

/* SoC Configuration */

#define CONFIG_ARM926EJS                   /* arm926ejs CPU core */

#define CONFIG_SYS_CLK_FREQ     297000000     /* Arm Clock frequency */

#define CFG_TIMERBASE          0x01c21400    /* use timer 0 */

#define CFG_HZ_CLOCK            27000000       /* Timer Input clock freq */

#define CFG_HZ                   1000

<b>#define CONFIG_SOC_DM644X   </b><b>(SOC</b><b>為DM644X</b><b>)</b>

/*====================================================*/

/* EEPROM definitions for Atmel 24C256BN SEEPROM chip */

/* on Sonata/DV_EVM board. No EEPROM on schmoogie.    */

<b>//#define CFG_I2C_EEPROM_ADDR_LEN            2</b>

<b>//#define CFG_I2C_EEPROM_ADDR              0x50</b>

<b>//#define CFG_EEPROM_PAGE_WRITE_BITS      6</b>

<b>//#define CFG_EEPROM_PAGE_WRITE_DELAY_MS  20</b>

(如果你的闆子沒有I2C接口的EEPROM,把上面的代碼注釋掉)

/*=============*/

/* Memory Info */

#define CFG_MALLOC_LEN              (0x10000 + 128*1024)  /* malloc() len */

#define CFG_GBL_DATA_SIZE    128         /* reserved for initial data */

#define CFG_MEMTEST_START  0x80000000    /* memtest start address */

#define CFG_MEMTEST_END            0x81000000    /* 16MB RAM test */

#define CONFIG_NR_DRAM_BANKS 1            /* we have 1 bank of DRAM */

#define CONFIG_STACKSIZE     (256*1024)     /* regular stack */

<b>#define PHYS_SDRAM_1           0x80000000    /* DDR Start */</b>

<b>#define PHYS_SDRAM_1_SIZE 0x10000000    /* DDR size 256MB */</b>

<b>#define DDR_8BANKS                      /* 8-bank DDR2 (256MB) */</b>

有關DDR Memory這裡不需要修改,因為本人的闆子是256M的。除非你的闆子是128M才改為:<b>SIZE     0x08000000 DDR_4BANKS</b><b>。</b>

/*====================*/

/* Serial Driver info */

序列槽驅動不用改。

/* I2C Configuration */

I2C 驅動可以不用改。也可以注釋掉,如果你不想在UBOOT操作任何I2C的動作。

/*==================================*/

/* Network &amp; Ethernet Configuration */

網絡配置也不需要修改

/*=====================*/

/* Flash &amp; Environment */

由于最開始我們已經定義好CFG_USE_NAND和CFG_NAND_LARGEPAGE的資訊,是以這裡也不需要修改;

/*==============================*/

/* U-Boot general configuration */

這裡主要定義UBOOT的一些操作,比如指令行顯示字元串,delay等待時間的長短,這些根據個人要求修改,不改也可以。

/* Linux Information */

UBOOT要把一些參數資訊傳給核心linux使用,linux核心運作的時候需要這些配置資訊,核心能夠識别這些字元串資訊。先把以下兩個定義注釋掉,

//#define CONFIG_BOOTARGS           xxxxxxxxxxxxxx

//#define CONFIG_BOOTCOMMAND     xxxxxxxxxxxxxxx

如果你要從NAND FLASH啟動:

#define CONFIG_BOOTARGS “mem=120M console=ttyS0,115200n8 noinitrd ip=off root=/dev/mtdblock3”(mtdblock3 表示檔案系統放在LINUX核心分區)

#define CONFIG_BOOTCOMMAND   " nboot 0x80008000 0x700000"(把linux 核心從FLASH BOOT起來,下面會介紹UBOOT的指令)

如果你還在調試階段,建議你使用NFS檔案系統:

#define CONFIG_BOOTARGS “mem=120M console=ttyS0,115200n8 noinitrd rw ip=dhcp root=/dev/nfs nfsroot=192.168.1.251:/home/&lt;useraccount&gt;/nfs/tirootfs,nolock”

#define CONFIG_BOOTCOMMAND   " nboot 0x80008000 0x700000"

本人的redhat linux的主機位址是:192.168.1.251,即SERVER IP=192.168.1.251

闆子的IP是:192.168.1.188

如果你沒有路由器給你配置設定IP位址,參數行裡使用:ip=off

mem=120M:本人定義前128M 給linux系統, 後128M 給DSP和圖像緩沖區等;

nboot 0x80008000 0x700000:講明本人把核心放在nand 位址為0x700000,通過nand boot的指令把核心從nand 0x700000位址導入DDR 0x80008000位址

/*=================*/

/* U-Boot commands */

這裡有很多功能的定義,包括#include &lt;config_cmd_default.h&gt;裡邊定義的,不需要的功能可以使用#undef ,進而減小UBOOT 生成BIN檔案的尺寸。比如

#undef CONFIG_CMD_DHCP

#undef CONFIG_CMD_DIAG

#undef CONFIG_CMD_EEPROM

#undef CONFIG_CMD_LOADB   /* loadb */

#undef CONFIG_CMD_LOADS    /* loads */

2、  修改board/davinci/dv-evm/dv_board.c裡的有關自己闆子的配置

在int board_init(void)函數裡,因為本人的闆子使用/EM_CS2作為NAND FLASH的片選信号,故在PINMUX0寄存器裡,有關AEAW必須關掉。

/* Enable EMAC and AEMIF pins */

//REG(PINMUX0) = 0x80000c1f;

<b>REG(PINMUX0) = 0x80000000;</b><b>隻使用</b>EMAC<b></b>

否則UBOOT 啟動不起來。

在int misc_init_r (void)函數裡,因為本人沒有使用I2C EEPROM存儲MAC 位址,是以要注釋掉

#if 0

/* Set Ethernet MAC address from EEPROM */

if (i2c_read(CFG_I2C_EEPROM_ADDR, 0x7f00, CFG_I2C_EEPROM_ADDR_LEN, buf, 6)) {

     printf("\nEEPROM @ 0x%02x read FAILED!!!\n", CFG_I2C_EEPROM_ADDR);

}

else

    {

     tmp[0] = 0xff;

     for (i = 0; i &lt; 6; i++)

         tmp[0] &amp;= buf[i];

     if ((tmp[0] != 0xff) &amp;&amp; (getenv("ethaddr") == NULL)) {

         sprintf((char *)&amp;tmp[0], "%02x:%02x:%02x:%02x:%02x:%02x",

             buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);

         setenv("ethaddr", (char *)&amp;tmp[0]);

     }

#endif

一般MAC位址儲存到NAND,降低成本。

………

i2c_read (0x39, 0x00, 1, (u_int8_t *)&amp;i, 1);

setenv ("videostd", ((i  &amp; 0x80) ? "pal" : "ntsc"));

如果你的闆子沒有TI 的視訊采集晶片TVP5146之類的,上面的功能最好去掉。

3、  網口驅動移植:Cpu/arm926ejs/davinci/ ether.c

因為DM6446晶片上內建EMAC和MDIO,是以直接使用PHY晶片就可以了,驅動就使用UBOOT-1.3.4 TI 預設的驅動,而不是TI EVM使用的PHY_LXT972。直接使用GENERIC PHY,有個地方需要修改,否則網口工作不起來,本人也是從一個網友那裡查到類似的資訊,在static int dm644x_eth_phy_detect(void)函數裡,改成:

for (i = 0; i &lt; 32; i++) {

        if (phy_act_state &amp; (1 &lt;&lt; i)) {

               if (phy_act_state &amp; ~(1 &lt;&lt; i))

                      return(0);              /* More than one PHY */

               else {

                      active_phy_addr = i;

                      return(1);

               }

        }

return(0);       /* Just to make GCC happy */

#else

active_phy_addr = 1;

return(1);

由于本人的開發闆使用GPIO對PHY晶片進行複位,是以在static int dm644x_eth_hw_init(void)函數裡,加入GPIO複位的支援,同時檔案頭部加入#include &lt;asm/arch/hardware.h&gt;。

可以說, UBOOT移植到這裡,基本上可以跑起網絡了,TFTP應該沒問題了,但是有關如何燒寫UBL,燒寫UBOOT,LINUX 核心等檔案,以後再慢慢聊吧,一步一步來,《UBOOT移植(2)》以後會推出來,下一篇直接到MonaVista linux-2.6.18的移植(1),先讓系統通過網絡和序列槽跑起來,由簡單到複雜。

繼續make一下,生成u-boot.bin和u-boot.img,COPY u-boot.bin到WINDOWS底下,使用uart_load.exe和配套uart.bin檔案,就可以把u-boot.bin給跑起來。如果有linux 核心編譯出來并使用UBOOT tool目錄下的mkimage工具生成 uImage,在UBOOT指令行下:

U-Boot &gt; tftp 80008000 uImage

#######################################

U-Boot &gt; bootm 80008000

## Booting kernel from Legacy Image at 80008000 ...

   Image Name:   linux-2.6.18

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1509948 Bytes =  1.4 MB

   Load Address: 80008000

   Entry Point:  80008040

   Verifying Checksum ... OK

   XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux...................................................................................................... done, booting the kernel.

Linux version 2.6.18_pro500-davinci_evm-arm_v5t_le ([email protected]) (gcc version 4.2.0 (MontaVista 4.2.0-16.0.32.0801914 2008-08-30)) #1 PREEMPT Sun Mar 7 01:07:16 CST 2010

CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177

Machine: DaVinci EVM

……………………………………………………………

當出現上面的資訊後,說明以上u-boot-1.3.4的移植是成功的。有興趣的朋友可以參考以上做法移植u-boot-2009.11-rc2,也可以跑起來,隻不過CROSS_COMPILE ?= arm-linux-不是放在頂層makefile了,而是放在lib_arm/config.mk裡,改成CROSS_COMPILE = arm_v5t_le-就可以編譯了。 

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

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

補充有關DM6446 BOOT的一點知識:如果闆子沒有任何程式,RBL會通過序列槽0發送BOOTME指令上來,運作uart_load.exe,會接到RBL的指令,然後握手通信,下載下傳uart.bin到闆子上,并運作起來,uart.bin程式就是小小的BOOT,通過序列槽0和PC通信,下載下傳u-boot.bin,并把u-boot.bin給運作起來。是以UBOOT移植到上面的步驟,可以進入linux 核心移植的工作了。

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

繼續閱讀