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方案,所以博客更新速度比較慢,其實寫博客的目的,有很大的部分就是想和全國各地朋友交流技術。同時這裏要感謝51CTO的小鬆管理員,把本人的開發攻略改為推薦博文。回到移植正題,我們一步一步把UBOOT跑起來,把內核也跑起來。鑒於學習的目的,本人這裏不提供patch。
第一步:解壓和簡化UBOOT
從ftp.denx.de下載u-boot-1.3.4.tar.bz2或u-boot-1.3.4-rc2.tar.bz2,然後解壓到你的工作目錄,很多人解壓完後,就馬上進入正題,修改makefile什麼的,本人覺得不用那麼急。首先刪除和平台不相關的文件和文件夾,目的讓UBOOT更簡化,好理解,減少虛擬機的存儲空間,便於備份(每次有進展的修改後,備份和修改記錄很重要,這是良好習慣):
在頂層目錄:把文件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和這個源版本比較。
第二步:鏈接交叉編譯環境
如果你已經看過本人有關《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) u-boot.img,就是後麵添加u-boot.img
在308行:./tools/mkimage -A $(ARCH) -T firmware -C none \後麵,添加和注銷以下代碼:
-a 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }') \
-e 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }') \
-n 'u-boot image' -d $< $@
# -a $(TEXT_BASE) -e 0 \
# -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
# sed -e 's/"[ ]*$$/ for $(BOARD) board"/') \
# -d $< $@
(注意要加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目錄下,使用
同時進入include/configs/目錄,使用cp –f davinci_dvevm.h davinci_dm6446.h
注:其實直接在TI dv-evm上移植也可以,沒必要定義自己的板子和配置。這裏隻不過給大家舉個例子。
編譯工作:
看是否編譯全部通過,是否生成u-boot.bin和u-boot.img等文件,同時檢查你的交叉編譯環境是否建立好,沒問題繼續往下進行。
第三步:移植板子驅動和配置
修改davinci_dm6446.h
首先說說本人板子的信息:DDR2——256M-Byte,NAND——128M-Byte——2K Page; 通用網口PHY芯片,沒有NOR FLASH和ATA。
#define CFG_USE_NAND(支持NAND)
#define CFG_NAND_LARGEPAGE (支持2K Page的NAND)
//#define CFG_NAND_SMALLPAGE(表示支持512 字節 Page)
//#define CFG_USE_NOR(表示支持NOR FLASH)
#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
#define CONFIG_SOC_DM644X (SOC為DM644X)
/* on Sonata/DV_EVM board. No EEPROM on schmoogie. */
//#define CFG_I2C_EEPROM_ADDR_LEN 2
//#define CFG_I2C_EEPROM_ADDR 0x50
//#define CFG_EEPROM_PAGE_WRITE_BITS 6
//#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 20
(如果你的板子沒有I2C接口的EEPROM,把上麵的代碼注釋掉)
#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 */
#define PHYS_SDRAM_1 0x80000000 /* DDR Start */
#define PHYS_SDRAM_1_SIZE 0x10000000 /* DDR size 256MB */
#define DDR_8BANKS /* 8-bank DDR2 (256MB) */
有關DDR Memory這裏不需要修改,因為本人的板子是256M的。除非你的板子是128M才改為:SIZE 0x08000000 DDR_4BANKS。
I2C 驅動可以不用改。也可以注釋掉,如果你不想在UBOOT操作任何I2C的動作。
由於最開始我們已經定義好CFG_USE_NAND和CFG_NAND_LARGEPAGE的信息,所以這裏也不需要修改;
這裏主要定義UBOOT的一些操作,比如命令行顯示字符串,delay等待時間的長短,這些根據個人要求修改,不改也可以。
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_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地址
這裏有很多功能的定義,包括#include <config_cmd_default.h>裏邊定義的,不需要的功能可以使用#undef ,從而減小UBOOT 生成BIN文件的尺寸。比如
#undef CONFIG_CMD_LOADB /* loadb */
#undef CONFIG_CMD_LOADS /* loads */
修改board/davinci/dv-evm/dv_board.c裏的有關自己板子的配置
在int board_init(void)函數裏,因為本人的板子使用/EM_CS2作為NAND FLASH的片選信號,故在PINMUX0寄存器裏,有關AEAW必須關掉。
隻使用EMAC
否則UBOOT 啟動不起來。
在int misc_init_r (void)函數裏,因為本人沒有使用I2C EEPROM存儲MAC 地址,所以要注釋掉
printf("\nEEPROM @ 0x%02x read FAILED!!!\n", CFG_I2C_EEPROM_ADDR);
{
tmp[0] = 0xff;
for (i = 0; i < 6; i++)
tmp[0] &= buf[i];
if ((tmp[0] != 0xff) && (getenv("ethaddr") == NULL)) {
sprintf((char *)&tmp[0], "%02x:%02x:%02x:%02x:%02x:%02x",
buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
setenv("ethaddr", (char *)&tmp[0]);
}
一般MAC地址保存到NAND,降低成本。
setenv ("videostd", ((i & 0x80) ? "pal" : "ntsc"));
如果你的板子沒有TI 的視頻采集芯片TVP5146之類的,上麵的功能最好去掉。
網口驅動移植: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 (phy_act_state & (1 << i)) {
if (phy_act_state & ~(1 << i))
return(0); /* More than one PHY */
else {
active_phy_addr = i;
return(1);
}
}
return(0); /* Just to make GCC happy */
由於本人的開發板使用GPIO對PHY芯片進行複位,所以在static int dm644x_eth_hw_init(void)函數裏,加入GPIO複位的支持,同時文件頭部加入#include <asm/arch/hardware.h>。
可以說, 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命令行下:
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
當出現上麵的信息後,說明以上u-boot-1.3.4的移植是成功的。有興趣的朋友可以參考以上做法移植u-boot-2009.11-rc2,也可以跑起來,隻不過CROSS_COMPILE ?= arm-linux-不是放在頂層makefile了,而是放在lib_arm/config.mk裏,改成CROSS_COMPILE = arm_v5t_le-就可以編譯了。
補充有關DM6446 BOOT的一點知識:如果板子沒有任何程序,RBL會通過串口0發送BOOTME命令上來,運行uart_load.exe,會接到RBL的命令,然後握手通信,下載uart.bin到板子上,並運行起來,uart.bin程序就是小小的BOOT,通過串口0和PC通信,下載u-boot.bin,並把u-boot.bin給運行起來。所以UBOOT移植到上麵的步驟,可以進入linux 內核移植的工作了。
本文出自 “集成係統-踏上文明的征程” 博客,請務必保留此出處https://zjbintsystem.blog.51cto.com/964211/282387
![]() | ![]() |
![]() | 5人
| 了這篇文章 |
相關文章
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,謝謝了
這樣也生成了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,謝謝了
2010-04-13 18:23:07
這個原因有很多,你要跟蹤是否運行到board.c裏的start_armboot()函數,等等。你可以參考人家給你的UBOOT是如何編譯出u-boot.bin還是其他加有頭信息的二進製文件
2011-01-03 18:27:12
你好,我的的uboot用老的環境是可以編譯通過的並可以正常使用,最近從新裝了一個編譯環境,也是編譯過去的,但是,下載到NORflash中美任何反應,但是可以用軟件可以啟動啟動起來!!!
請問這是什麼原因引起來的!!
請問這是什麼原因引起來的!!
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"
的路徑
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"
的路徑
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
export PATH
. $HOME/.bashrc
路徑肯定個配置了,在.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
export PATH
. $HOME/.bashrc
2011-01-06 16:06:43
謝謝你的回複,肯定設置了,不然也編譯不過去,我的是放在.bash_profile中的。
新的編譯環境見下:
[root@localhost bin]# 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
export PATH
. $HOME/.bashrc
新的編譯環境見下:
[root@localhost bin]# 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
export PATH
. $HOME/.bashrc
最後更新:2017-04-03 16:48:39
上一篇:
關於編譯FFMPEG的初級教程
下一篇:
Windows PowerShell漫談-win7下沒有超級終端
intent flags標記
Swift內存管理-示例講解
VR時代;VR行業大咖年中關鍵詞盤點之線下主題公園篇
scikit-learn學習之神經網絡算法
設計模式——控製反轉&依賴注入
員工辭職是為了炒老板魷魚,而不是不滿意公司
StringBuffer使用append提示String concatenation as argument to 'StringBuffer.append()' call
用Java編寫函數反轉字符串
前沿|人工智能新算法「CHIRP」或幫助宇宙科學家生成第一張黑洞圖像
ACL 2017 | 三位阿裏人工智能專家獨家解密NLP、機器翻譯優秀論文