?? uboot詳細分析.c
字號:
[0]目錄結(jié)構(gòu)
◆ board:和一些已有開發(fā)板有關的文件,比如Makefile和u-boot.lds等都和具體開發(fā)板的硬件和地址分配有關。
◆ common:與體系結(jié)構(gòu)無關的文件,實現(xiàn)各種命令的C文件。
◆ cpu:CPU相關文件,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定的子目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設置指令Cache和數(shù)據(jù)Cache等;interrupt.c設置系統(tǒng)的各種中斷和異常,比如快速中斷、開關中斷、時鐘中斷、軟件中斷、預取中止和未定義指令等;start.S是U-BOOT啟動時執(zhí)行的第一個文件,它主要是設置系統(tǒng)堆棧和工作方式,為進入C程序奠定基礎。
◆ disk:disk驅(qū)動的分區(qū)處理代碼。
◆ doc:文檔。
◆ drivers:通用設備驅(qū)動程序,比如各種網(wǎng)卡、支持CFI的Flash、串口和USB總線等。
◆fs:支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:頭文件,還有對各種硬件平臺支持的匯編文件,系統(tǒng)的配置文件和對文件系統(tǒng)支持的文件。
◆ net:與網(wǎng)絡有關的代碼,BOOTP協(xié)議、TFTP協(xié)議、RARP協(xié)議和NFS文件系統(tǒng)的實現(xiàn)。
◆ lib_arm:與ARM體系結(jié)構(gòu)相關的代碼。
◆ tools:創(chuàng)建S-Record格式文件 和U-BOOT images的工具。
==========================================================================================
[1]u-boot.1.1.2目錄下有Makefile
1)設置編譯器
可以看到這一項:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
也就是說這里所用的交叉編譯器是arm-linux-gcc,u-boot默認是用這個的,也有用arm-elf-gcc的,arm-elf-tools-20030314.sh,用它來編譯,沒有問題。如果最后MAKE的時候提示找不到arm-linux-gcc就是這錯了,改一下。
arm-elf-gcc是用來編譯uClinux內(nèi)核的工具,arm-linux-gcc用來編譯LINUX
2)加進自己板子的項目
搜索B2的這部分文件
B2_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
后面加上這部分:
TT_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 TT T2T
切記在@./mkconfig $(@:_config=) arm s3c44b0 TT T2T
前面的是Tab來的,TT_config : unconfig也是一樣,不能用空格代替,因為它是靠這個來識別命令的
==========================================================================================
[2]在宿主機(PC機)上建立arm-elf-gcc交叉編譯環(huán)境
1)建立arm-linux-gcc編譯環(huán)境
在RedHat Linux系統(tǒng)下以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 PATH=$PATH:/usr/local/arm/2.95.3/bin
或
把PATH=:$PATH:/usr/local/arm/2.95.3/bin添加到/ETC/bash_profile文件中
或者
在/etc/bashrc文件中添加一項:
export PATH=:$PATH:/usr/local/arm/2.95.3/bin
之后可以測試一下 echo $PATH
注意:PATH大小寫不一樣,另外LINUX下大小寫是不同的,以后不特別聲明。
注意:命令中的參數(shù)之間都由單個空格或者TAB隔開,命令前有的有# 代表命令行符,不用輸入。
注意:不可在WINDOWS下用winRAR解壓u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz這種文件,會少文件,去LINUX下,另外解壓的時候也不用非點用命令行操作,LINUX現(xiàn)在對GUI已經(jīng)支持的非常好了,比如解壓只要右鍵點文件,選解壓到當前文件夾就可以,執(zhí)行的時候只要雙擊再選“執(zhí)行”
注意:我用的VMWARE(虛擬機)裝的LINUX,要在LINUX和WIN中間傳遞文件用VM-》SETTING里的SHARE FOLDER
該功能是把WIN 下的一個文件夾共享給LINUX。
這個功能必須裝VMWARE TOOLS才能用,
裝VMWARE TOOLS方法:首先在VM-》SETTING里CDROM項里把光驅(qū)設置為裝入VMWARE安裝文件夾下的LINUX工具的.ISO,LUINUX下就出現(xiàn)CDROM了 拷貝 解壓 安裝不在話下。必須注意的是VMWARE TOOLS在每次重起LINUX之后還必須也重起一下,TMD,誰搞定不用重起告訴我一聲
重起的方法:/etc/init.d/vmware-tools restart
就有消息出來了
注意:另外郁悶的是我的WIN與LINUX之間復制文字似乎也不順暢,干脆在SHARE FOLDER里建立一個TXT,兩個系統(tǒng)搗文字玩~~
測試:
把終端關閉,重新打開后執(zhí)行如下命令:
# arm-linux-gcc –v
建立好交叉編譯環(huán)境后可以試著編譯u-boot了
2)也可以建立arm-elf-gcc
與上面類似,用周立功的編譯包直接安裝
會在/usr/local/bin下產(chǎn)生arm-elf-gcc只類的文件
然后設置路徑
[root@localhost root]# export PATH=$PATH:/usr/local/arm-elf/bin
======================================================================================================
[3] 測試交叉編譯器搞好沒有
編譯個44B0例子 在UBOOT包目錄下執(zhí)行一下命令,以下是編譯的包自帶的DAVE公司板子B2(名)
1) Make distclean (清除以前編譯的痕跡)
2) Make B2_config(B2代表B2板子的,前面見到過)
3) Make
沒問題就可以進行下面了
注意:B2默認用arm-linux-gcc編譯,要是前面安的arm-elf-gcc的話此時會報錯 把UBOOT目錄下的MAKEFILE按照前面說的改一下
注意:一般說來還會有個問題,懷疑是編譯器的問題 提示什么abi=apcs-gnu只類的找不到吧~~記不住了
改UBOOT目錄下config.mk (好象)
文件里改成如下
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
原來的行少了$(call cc-option,-mabi=apcs-gnu,) 具體在哪行忘了 CTRL+F搜索一下
其他應該沒問題,有問題GOOGLE搜一下,不是通病就是自己安裝的問題了
注意:
MAKE之后會生成三個文件:
u-boot——ELF格式的文件,可以被大多數(shù)Debug程序識別;
u-boot.bin——二進制bin文件,純粹的U-BOOT二進制執(zhí)行代碼,不保存ELF格式和調(diào)試信息。這個文件一般用于燒錄到用戶開發(fā)板中;
u-boot.srec——Motorola S-Record格式,可以通過串行口下載到開發(fā)板中。
[4]開始配置U BOOT
1)給自己板子個公司起個名,我的公司叫T2T 板子叫TT,剛才那個例子公司名DAVE板子名B2
以B2板子的程序做為模板來做,省很多工作
#cd u-boot-1.1.2//進U BOOT目錄
#cd board //進BOARD目錄,該目錄下存放各種公司的開發(fā)板,但44B0的好象只有一種B2
#cp -R dave T2T (復制 并且改名)
#cd T2T
#mv B2 TT (復制 并且改名)
#cd TT
# mv B2.c TT.c
修改TT里面的Makefile, 把B2改成TT,編譯時如果報的其它類似找不到B2的錯誤也是把相應的B2改成TT來處理。
修改T2T/TT/config.mk
TEXT_BASE = 0x0c1000000
修改T2T/TT/Makefile
將所有的B2改為TT
2)/include/configs
cp B2.h TT.h依舊是把B2的改個名
注意:DAVE的板子是用44B0的,但還有其他板子用嗎?怎么確定只有它用?用以下命令
到board目錄查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
結(jié)果是:
./dave/B2/B2.c
B2網(wǎng)站是: http://www.dave-tech.it
3)以下文件修改記錄
----------------------------------------------------------------------------------------------------
-----------------------------------/include/configs/TT.h-------------------------------------------
----------------------------------------------------------------------------------------------------
#define CONFIG_INIT_CRITICAL 1 這個在cpu/s3c44b0/start.S里面用到,如果你的u-boot程序不是在sdram中調(diào)試而是固化到flash中運行的話,這個必不可少。
找到 #define CONFIG_B2 1 改成CONFIG_TT
找到 #define CONFIG_S3C44B0_CLOCK_SPEED 75 主頻改成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_SIZE 128 /* size in bytes reserved for initial data */
#define CFG_ENV_IS_IN_FLASH 1 這個必不可少,如果你想把你的參數(shù)保存到flash的話
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x40000) 這個就是你的參數(shù)保存在flash里的起始地址了
#define CFG_ENV_OFFSET 0x40000 這個我后來看它源程序發(fā)現(xiàn)如果你上一步?jīng)]有設置它的起始地址的話就會用它來作默認地址的了
#define CONFIG_AUTO_COMPLETE
其它地方?jīng)]有深究哦,有些好像不要也行,你就試試吧。
找到Hardware drivers部分,這應該是網(wǎng)絡芯片設置吧,參考一下這個吧(要看芯片的):
#define CONFIG_DRIVER_RTL8019 這個就要看你的板上用的是什么網(wǎng)卡了(這個是臺灣出的,有10M)
#define RTL8019_BASE 0x06000300 這個是網(wǎng)卡相就寄存器的起始地址,有的掛在BANK4上了地址自然是0X08000300
以下部分我試過不要也行,你試下吧
#define RTL8019_BUS32 0
#define CONFIG_SMC_USE_16_BIT
#undef CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT 10 應該是重試的次數(shù)吧
#define CONFIG_SERIAL 1
#define CONFIG_BAUDRATE 115200 設置波特率
#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參數(shù)設置,看一下吧,其實我覺得了解一下就行的了,只是一些初始設置值,以后可以用命令setenv saveenv來修改的。
#define CONFIG_BOOTDELAY 3 這個就是運行bootcmd之前的等待時間
#define CONFIG_BOOTARGS "devfs=mount root=ramfs console=ttyS0,115200" 引導uClinux的時候傳遞的參數(shù),不會就先不用管它也行。
#define CONFIG_ETHADDR 00:50:c2:1e:af:fb 網(wǎng)卡的物理地址MAC
#define CONFIG_NETMASK 255.255.255.0 掩碼地址,設置過ip的人都應該知道吧
#define CONFIG_IPADDR 192.168.0.30 這是你板上網(wǎng)卡8019的ip地址
#define CONFIG_SERVERIP 192.168.0.10 這是你宿主機的ip地址,以后用tftp下載的時候用到,一定要跟你的宿主機一致才行。
#define CONFIG_BOOTFILE "u-boot.bin" 這個就是你要下載文件的默認名字,注意的是不是UBOOT編譯的文件 而是UBOOT下載以后在這個地址執(zhí)行這個文件,比如這個文件在下LINUX后就常被改成UCLINUC.BIN了
#define CONFIG_BOOTCOMMAND "bootm 0x50000" 這是bootdelay后運行的命令
Miscellaneous configurable options部分,參考一下吧:
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "TENWAY=>" 這是進入命令模式下的提示符,改個帥一點的吧
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS 100 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x0C400000 /* memtest works on */
#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM */
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
#define CFG_LOAD_ADDR 0x0c008000 默認的下載地址
#define CFG_HZ 1000 /* 1 kHz */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } 可供選擇的波特率
Physical Memory Map部分,比較重要,修改你的sdram和flash的地址和容量。
#define CONFIG_NR_DRAM_BANKS 1 我們只占用了一個Bank用來映射sdram
#define PHYS_SDRAM_1 0x0c000000 sdram的起始地址
#define PHYS_SDRAM_1_SIZE 0x00800000 sdram的容量(8M)
#define PHYS_FLASH_1 0x00000000 flash的起始地址
#define PHYS_FLASH_SIZE 0x00200000 flash的容量(2M)
#define CFG_FLASH_BASE PHYS_FLASH_1 定義多個名字而已,其它地方會用到
注意:
存儲容量的計算方法
2M=0x00200000-----------------16進制轉(zhuǎn)換成10進制(用WINDOWS自帶的計算機就行)-------------------》2097152
2097152=1024*1024*2
FLASH organization部分,看注釋應該知道了吧,參考一下:
/*-----------------------------------------------------------------------
* FLASH organization
*/
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 256 /* 最大支持的SECTOR數(shù)量,另外SAM FEI的補丁這里設置了32個 是錯誤的*/
//#define CFG_MAIN_SECT_SIZE 0x10000 /* main size of sectors on one chip */
#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms) 在前面加個4讓它長點 */
#define CFG_FLASH_WRITE_TOUT 1000 /* Timeout for Flash Write (in ms) */
其他地方還沒動 以后動的再補上
UBOOT 移植操作(3)
mamajinco 發(fā)表于 2006-9-6 9:41:00
----------------------------------------------------------------------------------------------------
-----------------------------------board/myboard/common/flash.c-----------------------------------
----------------------------------------------------------------------------------------------------
找到這個函數(shù):write_buff
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -