先到u-boot的官方網站http://sourceforge.net/projects/u-boot去下載源代碼。我用的是u-boot-1.1.4版本。在u-boot中B2板就是S3C44B0的CPU,所以就對B2板進行修改,不必重新做起。其實修改的地方也不多。主要修改處:
1、 修改u-boot/ include/configs/B2.h文件,B2.h文件是u-boot的配置文件,主要修改
1、#define CONFIG_S3C44B0_CLOCK_SPEED 60 (改成自己的主頻)
2、除去
/*#define CONFIG_DRIVER_LAN91C96 */
/*#define CONFIG_LAN91C96_BASE 0x04000300 *//* base address
的定義,增加
#define CONFIG_DRIVER_RTL8019
#define RTL8019_BASE 0x06000000 /* net base address */
定義,因爲我是用RTL8019的網絡芯片,地址爲0x06000000
3、#define CONFIG_BAUDRATE 115200 (改成自己的波特率)
4、#define CONFIG_BOOTARGS "root=/dev/ram0 console=ttyS0,115200" (啓動參數,其他在最面的系統運行中,沒有這些參數也沒問題的)
5、增加
#define CFG_ENV_IS_IN_FLASH 1 /* use EEPROM for environment vars */
#undef CFG_ENV_IS_IN_NOWHERE
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x20000)
#define CFG_ENV_SECT_SIZE 0x10000
把環境變量放在flash中,註譯掉I2C EEPROM (STM24C02W6) for environment部分。
以上是B2.h重點要修改的地方,還有一些要改的,根據情況修改。
2、 修改u-boot/cpu/s3c44b0/start.S文件。start.S是cpu運行的第一個文件。
1、 注掉
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
add pc, pc, #0x0c000000
增加
ldr pc,Undefined_Addr
ldr pc,SWI_Addr
ldr pc,Prefetch_Addr
ldr pc,Abort_Addr
ldr pc,RESERVE_Addr
ldr pc,IRQ_Addr
ldr pc,FIQ_Addr
同時也要在start.S中定義這些符號,如:
Undefined_Addr:
.word 0x0c000004
SWI_Addr:
.word 0x0c000008
Prefetch_Addr:
.word 0x0c00000c
Abort_Addr:
.word 0x0c000010
RESERVE_Addr:
.word 0x0c000014
IRQ_Addr:
.word 0x0c000018
FIQ_Addr:
.word 0x0c00001c
如果不這樣做,運行時會出現問題。
2、修改CPU_init_critical registers部分。看其體情況修改初始化寄存器。
經過這步後u-boot可以運行了。但是無法識出我的SST39VF1601,這個折騰我好幾天呢。所以要對flash方面的修改。主要是修改u-boot/board/dave/common/flash.c文件,在345行中增加
case (CFG_FLASH_WORD_SIZE)SST_ID_xF1601:
346 info->flash_id += FLASH_SST1601;
347 info->sector_count = 512;
348 info->size = 0x00200000;
349 break;
因爲在value = addr2[CFG_FLASH_READ1];讀取flash的ID,u-boot沒有識出我的flash就是沒有對39VF1601的定義。在154行也增加
154 case FLASH_SST1601: printf ("SST39VF1601 (16Mbit,uniform sec tor size)/n");
這樣就基本完成u-boot的移植工作了,最後
cd u-boot
vi Makefile //修改編譯環境,把arm-linux-改爲arm-elf-
make B2_config
make
就OK了。如果是在FC6中編譯的話,還要注意兩個編譯上的問題。
第一,出現:
isystem /usr/local/arm/bin/../lib/gcc-lib/arm-linux/3.2/include -pipe -DCONFIG_ARM -D__ARM__ -march=armv4 -mtune=arm7tdmi -msoft-float -mabi=apcs-gnu -Uarm -Wall -Wstrict-prototypes -c -o hello_world.o hello_world.c
cc1: invalid option `abi=apcs-gnu'
修改:
出錯的文件是/cpu/s3c44b0/下的config.mk:將
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),)
第二,出現:
make[1]: *** No rule to make target `hello_world.srec', needed by `all'. Stop.
make[1]: Leaving directory `/home/mort/src/targa/u-boot/u-boot-TOT/examples'
make: *** [examples] Error 2
解決方法:
打開 vi examples/Makefile
119 $(LIB): .depend $(LIBOBJS)
120 $(AR) crv $@ $(LIBOBJS)
121
122 %: %.o $(LIB)
123 $(LD) -g $(EX_LDFLAGS) -Ttext $(LOAD_ADDR) /
124 -o $@ -e $(<:.o=) $< $(LIB) /
125 -L$(gcclibdir) -lgcc
126 %.srec: %
127 $(OBJCOPY) -O srec $< $@ 2>/dev/null
128
129 %.bin: %
130 $(OBJCOPY) -O binary $< $@ 2>/dev/null
把126行和129行改爲:
%.srec: %.o
%.bin: %.o
以上是u-boot的移植注意事項。