u-boot移植心得

幾經艱辛,終於基本完成了u-boot在s3c44b0的移植工作,在些記錄一下在移植過程中所碰到的困難和解決方法(一些心得),作爲日後參考之用,也希望能夠幫到其它有需要的人^_^。
1.來由:
在我搞完ucos後(本來我是想學uclinux的,不過在對系統一無所知的情況下,還是先學一下ucos比較實際^_^,從中也可以對系統有個清晰的概念),我意識到要搞系統的話一個功能強大的bootloader是必不可少的,而我的板上自帶的是armboot(其實我個人覺得應用在ARM上的話armboot已經足夠了,畢竟u-boot也是從armboot中發展過來的,純屬個人意見),如果我的板上自帶光盤有已經移植好的armboot源代碼供我參考的話,我想我也不會花這麼多時間去搞u-boot,可恨的是我的光盤上只有armboot.bin這個二進制文件,而沒有源文件,沒辦法,我下定主意自己搞一個,考慮了一番後我選擇了u-boot,畢竟參考資料相對比較多,再我學完u-boot後再回頭看armboot,簡直是一個爐裏出的餅,這是後話。
    2.準備:
          說是容易,做起來卻挺難。因爲編譯u-boot要在linux環境下,而不能在我們平時所熟悉的ads下那麼直觀。首先要建立好交叉編譯環境,這個交叉編譯環境可以自己來做,不過完全沒必要,而且難度也挺大,一般是下載人家編譯好的工具。我剛開始在這裏就鬱悶了很久,現在會了以後覺得原來就是這麼簡單,在些我把方法說清楚,希望不會再有人爲這個問題鬱悶了^_^:
1)在網上下載一個u-boot源代碼,我用的是1.1.2版本的,最新的應該是1.1.4的吧,其實差不多,那就像我那樣下載一個1.1.2版本的吧。把源文件解壓,這個應該不用說了吧,學過linux的人應該會,不會的話我想你繼續做下去也困難,那就先裝個linux用下吧(我用的是RedHat的,哦對了,編譯程序是需要gcc編譯器的,所以安裝方式一定要選擇工作站哦^_^)。好了,解壓後你發現在u-boot.1.1.2目錄下有Makefile這個文件吧?讓我們看看它裏面的內容,最簡單的方法就是vi Makefile了。我們要看的是它選擇的是哪一個交叉編譯器。可以看到這一項:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
看到吧,也就是說這裏所用的交叉編譯器是arm-linux-gcc了,(u-boot默認是用這個的,也有用arm-elf-gcc的,網上有個工具包arm-elf-tools-20030314.sh,我試過用它來編譯,沒有問題,順便提一下,arm-elf-gcc是用來編譯uClinux內核的工具來的)那你就下載一個arm-linux-的交叉編譯器吧,我是在網上下載cross-2.95.3.tar.bz2這個文件,然後解壓得到2.95.3版本的交叉編譯工具的,具體設置如下(參考網上資料):

2)在宿主機上建立arm-linux-gcc交叉編譯環境
在RedHat Linux系統下以root用戶登錄,
將cross-2.95.3.tar.bz2文件複製到/目錄下,
安裝:
# tar jxvf cross-2.95.3.tar.bz2
這個命令會在你的/usr/local/arm/2.95.3目錄下安裝 arm-linux-gcc 交叉編譯程序,
然後在PATH變量中添加一項:/usr/local/arm/2.95.3/bin.
[root@localhost root]# export ATH=/usr/local/arm/2.95.3/bin:$PATH

把PATH=/usr/local/arm/2.95.3/bin:$PATH添加到/ETC/bash_profile文件中
或者
在/etc/bashrc文件中添加一項:
export PATH=/usr/local/arm/2.95.3/bin:$PATH
測試:
把終端關閉,重新打開後執行如下命令:
# arm-linux-gcc –v
好了,建立好交叉編譯環境後可以試着編譯u-boot了

這裏提幾個注意點:
1.不可用winRAR解壓u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz這種文件(就個可能新手會犯,一般熟悉linux命令的人應該都不會這樣做吧,在此還是要提一下)
2.可能下載的文件有一些中間文件會阻礙編譯的運行,所以在編譯前最好來個徹底清除,在u-boot.1.1.2目錄下運行命令:make distclean (其實這個命令在Makefile文件下就有)我當時爲這個問題鬱悶了很久,希望你們不會像我這樣^_^);
3,有些人爲了方便想在cygwin下編譯,但是經常在網上看到在這個虛擬平臺下編譯有很多的問題,要配置的東西也多,而且好像我用過那個vi沒有linux環境下的好用,所以最好還是不要用這個軟件了吧,如果你真的離不開windows的話可以像我這樣裝個虛擬機,在虛擬機下再裝linux的系統,具體參考這個網站):http://fedora.linuxsir.org/doc/vmware/
3)好了,現在開始測試你的交叉編譯器搞好沒有。在u-boot.1.1.2目錄下執行如下命令:
1)Make distclean (再次強調)
2)Make B2_config(隨便再個現成的試試^_^)
3)Make (沒錯的話應該會生成u-boot.bin文件,發生錯誤的話也不怕,只要細心看一下哪裏錯就行了,gcc碰到錯誤後會退出編譯,所以可以一個個錯誤來改,一般的問題都是沒找到編譯器(可能你沒裝或者裝的不對,例如人家用的是arm-linux-而你裝的是arm-elf-,如果你裝了的話看看你的環境變量設好了沒有,前面有講,如果不關編譯器的事的話那就再看看,一般是文件的後綴不對,有些文件後綴是大寫的,例如start.S但是如果你的是start.s小寫的話那當然找不到(解決方法很,把它改成大寫就行了)。細心看吧,不用怕,它都有註明路徑,很容易可以找到的))
如果以上步驟都無誤的話那麼恭喜你,你的交叉編譯環境可以用來編譯你的u-boot源代碼了,可以開始以下階段。
3.移植:
說時遲那時快,現在開始移植工作(以下是我一步步重新做一遍,力求說得詳細點,感謝我吧^_^)
我以B2板子的程序做爲模板來做.
#cd u-boot-1.1.2
#cd board
#cp -R dave myboard (這是我取的板子名字,可以換上你的,但是後面的也要跟着來換哦^_^)
#cd myboard
#mv B2 myboards3c44b0 (自己取個板子名)
#cd myboards3c44b0
# mv B2.c myboards3c44b0.c
修改myboards3c44b0裏面的Makefile, 把B2改成myboards3c44b0,編譯時如果報的其它類似找不到B2的錯誤也是把相應的B2改成myboards3c44b0來處理。

1)其中的myboards3c44b0.c文件是板的初始化代碼,看一下就知道,根據你的板上自帶的44binit.s來修改吧。memsetup.S文件主要是存儲器的初始化設置,其實也是44binit.s裏面的一部分。
2)其實board這裏要修改的不多,先跳過flash部分吧,我們來看一下cpu設置部分吧。
u-boot-1.1.2裏面已經加入了對s3c44b0的支持,讓我們來看一下cpu/s3c44b0裏面的部分吧。
看到start.S這個文件了嗎?要修改的其實並不多,按照你的板設置一下中斷跳轉矢量就行了,或者上網查一下吧,應該很容易看明的。其中cpu.c這個文件簡直不用修改,再來看一下serial.c這個文件吧,改一下波特率的設置就行,就是你用多少M的CPU頻率的話對應的波特率參數設置問題,其實B2已經做得不錯的了,很多子程序都不用自己寫的了^_^,在我的板上是這樣設置的,參考一下吧:
#if CONFIG_S3C44B0_CLOCK_SPEED==66 ,把所有的這些66改成60,原因,我的實驗板上用的頻率是60(44B0最高頻率爲64M)。然後其它分頻係數,寄存器初始化設置,可以參考一下44blib.c,在這裏我給出我的設置出來吧,可以參考一下。

case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 32;

UFCON0 = 0x0;
ULCON0 = 0x03;
UCON0 = 0x245;
UBRDIV0 = divisor;

我在這方面算術不好,所以都是參考人家的。

3)好,再加上個頭文件:
cd u-boot-1.1.2/include/configs
cp B2.h myboards3c44b0.h
這個頭文件其實要改的地方還挺多的,我等下再說怎樣修改。先回到u-boot.1.1.2目錄,

4)在Makefile裏面加上這部分,不會的話就模仿B2來寫吧^_^
在B2的這部分文件
B2_config:unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
後面加上這部分:
myboards3c44b0_config:unconfig
@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard

切記在@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard前面的是Tab來的,萬萬不能用空格代替,因爲它是靠這個來識別命令的!
   
5)好,現在可以在u-boot-1.1.2目錄下執行如下命令:
Make distclean(還是用這個吧,比較徹底)
Make myboards3c44b0_config
Make
看看有沒有錯,有錯的話按着提示來改,如果沒錯的話應該就能生成u-boot.bin這個文件,現在還不能用哦,因爲這幾是B2的一個仿製品而已(注:在我的機上到這一步可沒有報錯哦,你一步步按着來做的話應該也不會有什麼錯誤吧^_^)。


6)好,現在繼續修改u-boot-1.1.2/include/configs/myboards3c44b0.h這個文件。
#define CONFIG_INIT_CRITICAL1         這個在cpu/s3c44b0/start.S裏面用到,如果你的u-boot程序不是在sdram中調試而是固化到flash中運行的話,這個必不可少。
找到 #define CONFIG_B2          1        把B2改成myboards3c44b0吧(不然就不會編譯你的板了)
找到 #define CONFIG_S3C44B0_CLOCK_SPEED   75   你的44b0x應該沒有75M吧 我的是改成60的
找到Size of malloc() pool這部分設置,改成這樣吧,反正我是照着人家來做的,你自己研究下吧^_^。

#define CFG_MONITOR_LEN(256 * 1024)/* Reserve 256 kB for Monitor*/
#define CFG_ENV_SIZE   (64*1024)/* 1024 bytes may be used for env vars*/
#define CFG_MALLOC_LEN(CFG_ENV_SIZE + 128*1024 )
#define CFG_GBL_DATA_SIZE128/* size in bytes reserved for initial data */
#define CFG_ENV_IS_IN_FLASH  1  這個必不可少,如果你想把你的參數保存到flash的話(有些板是保存到EEPRAM中去的,但是s3c44b0的話還是保存到flash吧)
#define CFG_ENV_ADDR(PHYS_FLASH_1+0x40000)  這個就是你的參數保存在flash裏的起始地址了
#define CFG_ENV_OFFSET0x40000      這個我後來看它源程序發現如果你上一步沒有設置它的起始地址的話就會用它來作默認地址的了
#define CONFIG_AUTO_COMPLETE

其它地方沒有深究哦,有些好像不要也行,你就試試吧。

找到Hardware drivers部分,這應該是網絡芯片設置吧,參考一下這個吧(要看芯片的):
#define CONFIG_DRIVER_RTL8019        這個就要看你的板上用的是什麼網卡了(這個是臺灣出的,有10M)
#define RTL8019_BASE0x06000000   這個是網卡相就寄存器的起始地址
以下部分我試過不要也行,你試下吧
#define RTL8019_BUS320
#define CONFIG_SMC_USE_16_BIT
#undef  CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT10   應該是重試的次數吧

#define CONFIG_BAUDRATE115200  設置波特率

#define CONFIG_COMMANDS( CONFIG_CMD_DFL | /
CFG_CMD_DATE | /
CFG_CMD_ELF| /
CFG_CMD_NET    | /
CFG_CMD_EEPROM| /
CFG_CMD_I2C| /
CFG_CMD_FAT | /
CFG_CMD_JFFS2)
把CFG_CMD_EEPROM改成CFG_CMD_FLASH吧,雖然不改也是可以的,具體沒考究。

以下是板上env參數設置,看一下吧,其實我覺得了解一下就行的了,只是一些初始設置值,以後可以用命令setenv  saveenv來修改的。
#define CONFIG_BOOTDELAY3                這個就是運行bootcmd之前的等待時間
#define CONFIG_BOOTARGS  "devfs=mount root=ramfs console=ttyS0,115200" 引導uClinux的時候傳遞的參數,不會就先不用管它也行。
#define CONFIG_ETHADDR00:50:c2:1e:af:fb    網卡的物理地址MAC
#define CONFIG_NETMASK  255.255.255.0       掩碼地址,設置過ip的人都應該知道吧
#define CONFIG_IPADDR   192.168.0.30          這是你板上網卡8019的ip地址
#define CONFIG_SERVERIP192.168.0.10       這是你宿主機的ip地址,以後用tftp下載的時候用到,一定要跟你的宿主機一致才行。
#define CONFIG_BOOTFILE"u-boot.bin"        這個就是你要下載文件的默認名字
#define CONFIG_BOOTCOMMAND"bootm 0x50000"   這是bootdelay後運行的命令

Miscellaneous configurable options部分,參考一下吧:
#defineCFG_LONGHELP/* undef to save memory*/
#defineCFG_PROMPT"s3c44b0=>"   這是進入命令模式下的提示符,改個帥一點的吧
#defineCFG_CBSIZE256/* Console I/O Buffer Size*/
#defineCFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#defineCFG_MAXARGS 100/* max number of command args*/
#define CFG_BARGSIZECFG_CBSIZE/* Boot Argument Buffer Size*/

#define CFG_MEMTEST_START    0x0C400000/* memtest works on*/
#define CFG_MEMTEST_END0x0C800000/* 4 ... 8 MB in DRAM*/
#undef  CFG_CLKS_IN_HZ/* everything, incl board info, in Hz */
#defineCFG_LOAD_ADDR0x0c008000默認的下載地址
#defineCFG_HZ1000/* 1 kHz */
#define CFG_BAUDRATE_TABLE  { 9600, 19200, 38400, 57600, 115200 } 可供選擇的波特率


Physical Memory Map部分,比較重要,修改你的sdram和flash的地址和容量。
#define CONFIG_NR_DRAM_BANKS1   我們只佔用了一個Bank用來映射sdram
#define PHYS_SDRAM_10x0c000000     sdram的起始地址
#define PHYS_SDRAM_1_SIZE0x00800000     sdram的容量(8M)
#define PHYS_FLASH_10x00000000     flash的起始地址
#define PHYS_FLASH_SIZEflash的容量(2M)
#define CFG_FLASH_BASEPHYS_FLASH_1   定義多個名字而已,其它地方會用到


FLASH organization部分,看註釋應該知道了吧,參考一下:
#define CFG_FLASH_ERASE_TOUT4120000/* Timeout for Flash Erase (in ms)*/
#define CFG_FLASH_WRITE_TOUT4000/* Timeout for Flash Write (in ms)*/


按着來一步步的做應該不難,這裏提一下vi程序的用法,其實在google一搜就找到了,不過爲了方便大家,還是說一聲吧,
在命令模式下:
按/ xxx再回車即可搜索到你所需要的內容(xxx),再按n搜索下一個,按shift+n搜索上一個
按:xxx即可跟到你想要的行
按:set nu顯示行號
其它查書都可以找到就不說了。

做到這個時候,你可以再編譯一下,看有沒有錯,這一步我就沒有幫你們做了,不過我覺得應該不會有問題吧,下載到ram中運行,看看效果。


7)終於到了flash的設置部分了,這完全是我個人悟出來的,網上資料好像講得不是先清楚。
 首先介紹一下flash的識別吧,每塊flash都有一個id,前部分用來說明生產廠家,後部分用來說明它的容量,類型,位數等。它們的定義是在u-boot-1.1.2/include/flash.h中,就以我的ssts9vf1601爲例:
#define SST_MANUFACT0x00BF00BF  這是生產廠家id
#define SST_ID_xF16010x234B234B  這是它的型號,容量,位數等id
#define FLASH_SST160A0x0046       這個我還說不清楚,有個要注意的問題是像sst160是不能用奇地址的,我做的過程中是把SST160A改成SST1601的,懶得幫它創一個
好了,相信你已經找到你的板上所用的flash對應的id號了吧?現在就來談談怎麼改。
先進入u-boot-1.1.2/board/myboards3c44b0/common/flash.c
它裏面已經幫SST160A設置好了,我的做法是把SST公司的160A都改成1601,是不是很簡單,當然你也可以幫1601再寫一分,但是我是個懶人,所以我就樣做了^_^

到這裏還有個問題沒提到的,就是如果你重新用setenv saveenv 設置了參數,但是復位後會發現怎麼沒有保存到的(不信你試試看)。其實我是故意留到這裏講的,應該它不會報錯,可以說是比較隱祕的問題,所以我故意放到這裏來說,以引起你的重視。
解決方法:vi u-boot-1.1.2/board/myboard/common/flash.c
找到這個函數:write_buff
裏面有這句話:#ifdef CONFIG_B2
要把B2改了,因爲我們的板不叫B2,那叫什麼呢?原來是在這裏定義的:u-boot-1.1.2/include/configs/myboards3c44b0.h
裏面有這句話:#define CONFIG_HFRK 你不喜歡HFRK這個名字也行,可以改成別的名字,只不過相應地前面的B2也要改成這個名字而已。


4.後記:
  本來是想剛做好的時候寫的,但是後來發現有些功能實現不了,所以就停住了筆,等我搞好了以後,又急着去學習uClinux的移植,真的很忙,現在終於抽空把它寫完。雖然有些地方還沒說清楚(畢竟我對它的瞭解還不是很深,但我相信在我以後移植系統的過程中會逐步加深對它的瞭解),我還是希望它能成爲最詳盡的u-boot移植新手指導,對u-boot移植的初學者起到實質性的作用,這樣就不枉我花了這麼多的心思來寫這個文檔。

參考資料:
http://blog.21ic.com/more.asp?name=sockit&id=8509
我所認爲的最有奉獻精神,寫得最詳細的記錄,在此表示我深深的敬意!





 

  發貼時間2006/04/29 10:33pm 此 IP 爲代理服務器IP: 已設置保密    
 
 
 
    -* 未註冊 *-
 



信息: 該用戶目前不在線
威望: 未知
來自: 未知
總髮貼數: 0
註冊日期: 未知
 
複製 引用 回覆貼子回覆 

 
ding...




 

  發貼時間2006/04/30 08:41am 此 IP 爲代理服務器IP: 已設置保密    
 
 
 
 頭銜: 認證會員
 


信息: 該用戶目前不在線此人爲認證用戶
威望: +16
來自: 保密 
總髮貼數: 214
註冊日期: 2005/12/09
 
消息 查看 搜索 好友 郵件 複製 引用 回覆貼子回覆 

 
好!




 

  發貼時間2006/04/30 11:18am 此 IP 爲代理服務器IP: 已設置保密    
 
 
 
    -* 未註冊 *-
 



信息: 該用戶目前不在線
威望: 未知
來自: 未知
總髮貼數: 0
註冊日期: 未知
 
複製 引用 回覆貼子回覆 

 
ding to stanler




 

  發貼時間2006/08/01 01:43pm 此 IP 爲代理服務器IP: 已設置保密    
 
 
 
    -* 未註冊 *-
 



信息: 該用戶目前不在線
威望: 未知
來自: 未知
總髮貼數: 0
註冊日期: 未知
 
複製 引用 回覆貼子回覆 

 
轉一個:
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=618767&page=0&view=collapsed&sb=5&o=0&fpart=
s3c44b0x主板啓動用到的代碼分析

一 首先從cpu/s3c44b0/start.S這個文件開始執行,這個文件主要作以下幾點:
1 設置處理器的工作模式。
2 初始化中斷向量。
3 關閉看門狗功能。
4 允許timer5的中斷(時鐘中斷)。
5 允許IRQ中斷,進制FIQ中斷。
6 設置時鐘控制寄存器控制CPU的主頻。根據我自己的開發板進行了設置。(下面介紹了時鐘主頻的計算公式)。
7 調用board//lowlevel.S對存儲器進行初始化。這個文件主要是根據開發板設置每個存儲器的BANK。我修改了這個文件使其支持我的開發板。
8 將ROM中的U-BOOT代碼拷貝到RAM中。並在RAM中設置好中斷向量表。
9 設置堆棧。
10 跳到lib_arm/board.c中執行start_armboot.
二 執行lib_arm/board.c中的start_armboot,主要完成一下工作:
1 調用cpu//cpu.c中的cpu_init()來刷新所有cache,將0x00000000~0x0c000000區設爲非cache區。並使用全部8K空間作爲cache。總線優先級爲默認優先級。
2 調用board//.c中的board_init()根據具體的開發板對PORT進行設置。我修改這個文件使其支持我的開發板。
3 調用cpu/s3c44b0/interrupts.c 中的interrupt_init()初始化Timer1定時器使其在指定時間產生中斷。
4 根據include/configs/.h配置文件中(CFG_ENV_IS_IN_<*>)環境變量保存位置選項來調用common/env_*.c對應文件中的env_init()。其作用是初始化環境變量。由於我的配置文件中的選項是CFG_ENV_IS_IN_FLASH,所以我修改board//flash.c使它支持我板子的FLASH。
5 調用本文件中的init_baudrate()來設置串口的波特率,這個函數的功能是可以使用環境變量對串口波特率進行修改。
6 調用cpu/s3c44b0/serial.c文件中的serial_init()對串口進行初始化。我修改這個文件使它支持我的開發板時鐘頻率對應的串口波特率。(下面介紹了串口波特率的計算公式)。
7 調用common/console.c文件中的console_init_f()對控制檯進行初始化。
8 調用本文件中的display_banner()顯示標題信息。
9 調用board//.c文件中的dram_init()對SDRAM進行初始化,其主要作用是在全局變量gd中設置SDRAM的起始地址與大小。
10 調用本文件中的display_dram_config()顯示一些配置信息。
11 調用flash_init()來初始化FLASH。如果CFG_FLASH_CFI_DRIVER在配置文件中被定義,則調用drivers/cfi_flash.c中flash_init()驅動。否則將調用自己的FALSH驅動。

 

移植U-BOOT過程

一 爲我的QT板子建立一個模板
1 cp –r board/dave board/51EDA
2 mv board/51EDA/B2 board/51EDA/QT
3 mv board/51EDA/QT/B2.c board/51EDA/QT/QT.c
4 cp include/configs/B2.h include/configs/QT.h
5 將board/51EDA/所有文件中的B2改爲QT,將include/configs/QT.h中的B2改爲QT。
6 修改Makefile和MAKEALL文件,爲QT添加新的選項。
7 然後開始編譯,能夠正確通過,說明上面爲我的QT板子建立的模板正確,下面開始修改模板中的文件使其支持自己的QT板子。
8 修改cpu/s3c44b0/start.S文件,根據自己的開發板提供的石英振盪頻率(Fin)來設置自己想要的時鐘主頻。
9 修改board/51EDA/QT/lowlevel_init.S文件,根據自己的開發板對存儲器(Bank)進行初始化。
10 修改board/51EDA/QT/QT.c文件,根據自己的開發板對PORT進行初始化。
11 修改board/51EDA/QT/flash.c文件,使它支持自己的開發板。
12 修改cpu/s3c44b0/serial.c文件,使它支持自己想要的波特率。
13 修改include/configs/QT.h文件,設置裏面的選項使其滿足自己的要求。

 

遇到的問題:

1. 在對應自己的開發板修改了board目錄下的lowlevel_init.S,QT.c文件後串口終於出東西了。但是總是出現亂碼,無論設置成什麼樣的時波特率,都是亂碼,於是認爲是自己的CPU主頻的串口的波特率計算錯誤,查看相關資料修改了cpu目錄下的start.S和serial.c文件中的系統時鐘和串口波特率部分後,串口終於讀到正確的數據了。(下面是有關cpu時鐘頻率和串口波特率的計算公式)。
S3C44B0的系統時鐘設置公式
一. 通過PLL輸出時鐘脈衝頻率的計算:
a) Fpllo = (m * Fin) / (p * 2s)
b) m = (MDIV + 8), p = (PDIV + 2), s = SDIV
c) 20MHz < Fpllo < 66MHz
d) Fpllo * 2s < 170MHz (s應該儘可能的大)
e) 1MHz <= Fin/p < 2MHz (最好是Fin/p = 1MHz)
f) 如果PLL打開則:Fpllo = Fout
g) 這樣計算出MDIV, PDIV, SDIV的值寫入PLLCON寄存器中就可設置Fpllo的輸出頻率。
二. PLL的鎖存時間(爲輸出穩定時鐘頻率需要的平靜時間)
a) T_lock = (1 / Fin) * n > 280us. (n = LTIMECNT value)
S3C44B0的UART波特率計算公式
UBRDIVn = ( (int)(MCLK / (bps * 16) + 0.5) – 1 )
MCLK = Fout = Fpllo
Bps = 1200,9600,19200,38400,57600,115200

2. 在使用printenv與bdinfo命令讀取flash中的環境變量總是出錯,並且每次讀出的數據都不一樣,在通過調試器進行觀察後發現原來是DECLARE_GLOBAL_DATA_PTR的使用問題,這是當前我使用的這個版本(u-boot-1.1.4)的一個bug,於是換了一個更新的版本(u-boot-2006-05-10-1800),這個版本已經將這個bug去處掉了。終於讀出了正確的環境變量。

3. 每當我使用出現錯誤死機重啓後都無法正常啓動,只有關掉電源10-30分鐘後在啓動就會正常,通過調試器對程序的觀察發現,在start.S文件中將程序從flash複製到RAM中時,它只複製到了bss段的開始,而並沒有對bss段進行復制(bss初始化爲0的靜態變量區),這樣到的當我運行的程序出現錯誤對bss段進行了寫入後,而內存在斷電後數據並沒有馬上消失,這樣就導致在重啓後讀取值爲0的靜態變量時出現了錯誤的數據。於是我修改了程序,讓它將bss段也複製到內存,這樣當重啓後總是會對內存的bss段進行初始化。
建議用git直接從git repository裏面拿最新的u-boot
git-clone http://www.denx.de/git/u-boot.git u-boot-git

 
發佈了26 篇原創文章 · 獲贊 1 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章