天天看點

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><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,降低成本。 ……… #if 0 i2c_read (0x39, 0x00, 1, (u_int8_t *)&amp;i, 1); setenv ("videostd", ((i  &amp; 0x80) ? "pal" : "ntsc")); #endif 如果你的闆子沒有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)函數裡,改成: #if 0 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); #endif 由于本人的開發闆使用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-就可以編譯了。 

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

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

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

<a>wuyunzdh、xi2008、tsin</a>

5人

了這篇文章

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

<a></a>

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

2010-03-11 15:59:39 不錯!學習了

呵呵 很有難度的東西啊

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

2010-03-11 23:25:22 幾個月前自己也裝過一個“有奔頭”玩了一下,感覺還可以。

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

2010-03-12 09:19:20 uboot在開源嵌入産品設計中,地位越來越重要,功能越來越豐富。

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

2010-04-12 11:00:06 你好,我也是做dm6446,我們公司買的闆子是ti原廠的,就是那個dvevm,我現在想移植下u-boot-1.3.4,就把根目錄下的那個makefile的cross_compile=arm_v5t_le-,然後就直接make distclean;make davinci_dvevm_config;make

這樣也生成了u-boot.bin以後,用dvflasher下載下傳到闆子上了,發現uboot啟動不了,列印資訊如下:

ti ubl version: 1.12, flash type: nand

booting psp boot loader

pspbootmode = nand

starting nand copy...

initializing nand flash...

valid magicnum found.

nand boot success.

  done

然後就停止了,請問下為什麼???謝謝了,我的qq是451686458,謝謝了

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

2010-04-13 18:23:07 這個原因有很多,你要跟蹤是否運作到board.c裡的start_armboot()函數,等等。你可以參考人家給你的uboot是如何編譯出u-boot.bin還是其他加有頭資訊的二進制檔案

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

2010-05-12 12:15:12 你好,我的dvflasher不能運作。

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

2010-05-12 15:29:20 抱歉,沒用過dvflasher,我們肯定不用這個dvflasher。

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

2010-09-16 09:51:08 下載下傳uboot之前有個flashwrite到什麼地方能夠下載下傳源碼?這個檔案時通用的還是根據硬體決定

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

2010-09-16 10:56:13 這個估計是ti的dsp out檔案,我們不關心這個。

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

2011-01-03 18:27:12 你好,我的的uboot用老的環境是可以編譯通過的并可以正常使用,最近從新裝了一個編譯環境,也是編譯過去的,但是,下載下傳到norflash中美任何反應,但是可以用軟體可以啟動啟動起來!!!

請問這是什麼原因引起來的!!

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

2011-01-04 16:54:43 我們沒有測試過nor flash的應用。你的新編譯環境.bashrc檔案是否設定:

path="/opt/mv_pro_5.0.0/montavista/pro/devkit/arm/v5t_le/bin:

/opt/mv_pro_5.0.0/montavista/pro/bin:

/opt/mv_pro_5.0.0/montavista/common/bin:$path"

的路徑

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

2011-01-06 11:18:09 謝謝你的回複,

路徑肯定個配置了,在.bash_profile不然應該也編譯不過去呀,是不是?

這是我新環境的:

cat /root/.bash_profile

# .bash_profile

# get the aliases and functions

if [ -f ~/.bashrc ]; then

    . ~/.bashrc

fi

# user specific environment and startup programs

path=$path:$home/bin

path=/opt/montavista/pro/devkit/arm/v5t_le/bin:/opt/montavista/pro/bin:/opt/montavista/common/bin:/opt/3.4.1/bin:/opt/arm-920t-3.4.4/bin:$path

export path

unset username

下面是我老環境的:

[root@myhost ~]# cat /root/.bash_profile

alias rm='rm -i'

alias ll='ls -l --color'

alias cp='cp -i'

alias mv='mv -i'

path="${path}":/usr/local/arm/3.4.1/bin:/usr/local/920t_le/bin:/usr/local/bin:/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/bin:/opt/mv_pro_4.0/montavista/common/bin:/opt/mv_pro_4.0/montavista/pro/bin:/opt/hisilicon/toolchains/arm-uclibc-linux-soft/bin:/opt/uclinux/bfin-uclinux/bin://opt/uclinux/bfin-linux-uclibc/bin

. $home/.bashrc

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

2011-01-06 16:06:43 謝謝你的回複,肯定設定了,不然也編譯不過去,我的是放在.bash_profile中的。

新的編譯環境見下:

[root@localhost bin]# cat /root/.bash_profile

老的編譯環境是:

繼續閱讀