s3c44b0移植uboot
最近uclinux的应用程序基本完成,闲来无事,准备玩玩底层驱动,就先从uboot开始:
移植之前确保系统中安装好arm-elf-gcc。
1.在官网上下载最新的uboot源码,u-boot-1.3.4.tar.bz2
2.解压u-boot-1.3.4.tar.bz2
3.首先在Board下建立自己的开发板类型,名字为vd44b0;在uboot里找到Board文件夹,将dave文件夹里的b2文件夹拷贝到vd44b0文件里,改名为vd44b0。把dave文件夹下的common文件夹放到vd44b0里。
将文件夹和相关的文件内的B2替换成vd44b0;
4.修改lowlevel_init.S,直接替换成一下内容
/* Bank 0 parameter */ .equ B0_Tacs, 0x3 /* 0clk */ .equ B0_Tcos, 0x3 /* 0clk */ .equ B0_Tacc, 0x7 /* 14clk */ .equ B0_Tcoh, 0x3 /* 0clk */ .equ B0_Tah, 0x3 /* 0clk */ .equ B0_Tacp, 0x1 /* 0clk */ .equ B0_PMC, 0x0 /* normal(1data) */ /* Bank 1 parameter */ .equ B1_Tacs, 0x0 /* 4clk */ .equ B1_Tcos, 0x1 /* 4clk */ .equ B1_Tacc, 0x2 /* 14clkv */ .equ B1_Tcoh, 0x1 /* 4clk */ .equ B1_Tah, 0x0 /* 4clk */ .equ B1_Tacp, 0x0 /* 6clk */ .equ B1_PMC, 0x0 /* normal(1data) */ /* Bank 2 parameter - */ .equ B2_Tacs, 0x0 /* 4clk */ .equ B2_Tcos, 0x2 /* 4clk */ .equ B2_Tacc, 0x4 /* 14clk */ .equ B2_Tcoh, 0x2 /* 4clk */ .equ B2_Tah, 0x3 /* 4clk */ .equ B2_Tacp, 0x3 /* 6clk */ .equ B2_PMC, 0x0 /* normal(1data) */ /* Bank 3 parameter */ .equ B3_Tacs, 0x3 /* 4clk */ .equ B3_Tcos, 0x3 /* 4clk */ .equ B3_Tacc, 0x7 /* 14clk */ .equ B3_Tcoh, 0x3 /* 4clk */ .equ B3_Tah, 0x3 /* 4clk */ .equ B3_Tacp, 0x3 /* 6clk */ .equ B3_PMC, 0x0 /* normal(1data) */ /* Bank 4 parameter */ .equ B4_Tacs, 0x3 /* 4clk */ .equ B4_Tcos, 0x3 /* 4clk */ .equ B4_Tacc, 0x7 /* 14clk */ .equ B4_Tcoh, 0x3 /* 4clk */ .equ B4_Tah, 0x3 /* 4clk */ .equ B4_Tacp, 0x3 /* 6clk */ .equ B4_PMC, 0x0 /* normal(1data) */ /* Bank 5 parameter */ .equ B5_Tacs, 0x0 /* 4clk */ .equ B5_Tcos, 0x1 /* 4clk */ .equ B5_Tacc, 0x4 /* 14clk */ .equ B5_Tcoh, 0x1 /* 4clk */ .equ B5_Tah, 0x0 /* 4clk */ .equ B5_Tacp, 0x0 /* 6clk */ .equ B5_PMC, 0x0 /* normal(1data) */ /* Bank 6(if SROM) parameter */ .equ B6_Tacs, 0x3 /* 4clk */ .equ B6_Tcos, 0x3 /* 4clk */ .equ B6_Tacc, 0x7 /* 14clk */ .equ B6_Tcoh, 0x3 /* 4clk */ .equ B6_Tah, 0x3 /* 4clk */ .equ B6_Tacp, 0x3 /* 6clk */ .equ B6_PMC, 0x0 /* normal(1data) */ /* Bank 7(if SROM) parameter */ .equ B7_Tacs, 0x3 /* 4clk */ .equ B7_Tcos, 0x3 /* 4clk */ .equ B7_Tacc, 0x7 /* 14clk */ .equ B7_Tcoh, 0x3 /* 4clk */ .equ B7_Tah, 0x3 /* 4clk */ .equ B7_Tacp, 0x3 /* 6clk */ .equ B7_PMC, 0x0 /* normal(1data) */ /* Bank 6 parameter */ .equ B6_MT, 0x3 /* SDRAM */ .equ B6_Trcd, 0x1 /* 2clk */ .equ B6_SCAN, 0x0 /* 8bit */ .equ B7_MT, 0x3 /* SDRAM */ .equ B7_Trcd, 0x1 /* 2clk */ .equ B7_SCAN, 0x0 /* 8bit */ /* REFRESH parameter */ .equ REFEN, 0x1 /* Refresh enable */ .equ TREFMD, 0x0 /* CBR(CAS before RAS)/Auto refresh */ .equ Trp, 0x0 /* 2clk */ .equ Trc, 0x3 /* 0x1=5clk 0x3=11clk*/ .equ Tchr, 0x0 /* 0x2=3clk 0x0=0clks */ .equ REFCNT, 1550 MEMORY_CONFIG: .long 0x01001102 /* Bank0 = OM[1:0] , Bank1-7 16bit, Bank2=Nowait,UB/LB*/ .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) /*GCS0*/ .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) /*GCS1*/ .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) /*GCS2*/ .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) /*GCS3*/ .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) /*GCS4*/ .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) /*GCS5*/ .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) /*GCS6*/ .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) /*GCS7*/ .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) /*REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019*/ .word 0x10 /*SCLK power down mode, BANKSIZE 16M/16M*/ .word 0x20 /*MRSR6 CL=2clk*/ .word 0x20 /*MRSR7*/ .globl lowlevel_init lowlevel_init: /* the next instruction fail due memory relocation... we'll find the right MEMORY_CONFIG address with the next 3 lines... */ adr r0, MEMORY_CONFIG ldmia r0, {r1-r13} ldr r0, =0x01c80000 stmia r0, {r1-r13} mov pc, lr
5.修改主目录下的makefile:
编译工具:arm-linux-gcc改成arm-elf-gcc
在S3C44B0 Systems中按照B2的格式添加(具体格式的定义 自己去百度)
vd44b0_config : unconfig @./mkconfig $(@:_config=) arm s3c44b0 vd44b0 vd44b0
6.在include/configs的文件夹下建立自己板子的头文件vd44b0.h 拷贝B2.h的内容进去
修改时钟频率:#define CONFIG_S3C44B0_CLOCK_SPEED 60 /* we have a 60Mhz S3C44B0*/
其他的ram flash配置(大小,起始地址等) 自己照着自己的硬件改
7.在cpu/star44b0文件夹下找到start.s 与serial.c,修改与频率设置相关的设置。
8.其他暂时不管,先编译一下; make vd44b0_ config make 然后就是waiting。。。出错了:
arm-elf-gcc -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -msoft-float -D__KERNEL__ -DTEXT_BASE=0x0C100000 -I/home/li/uboot/u-boot-1.1.4/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/lib/gcc-lib/arm-elf/2.95.3/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' make[1]: *** [hello_world.o] 错误 1 make[1]: 离开目录“/home/li/uboot/u-boot-1.1.4/examples” make: *** [examples] 错误 2 解决办法: 修改 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))
9.继续make 又出错了
arm-elf-gcc:start.o:????????
arm-elf-gcc:unrecognized option '-MQ'
arm-elf-gcc:cpu.o:????????
arm-elf-gcc:unrecognized option '-MQ'
arm-elf-gcc:interrupts.o:????????
arm-elf-gcc:unrecognized option '-MQ'
发现原来是 编译器版本太低。换句话也可以说是uboot太新。郁闷
最后只有重新下载了1.1.4的版本,就OK了。
只是大概的记录了下,若有不对之处,敬请谅解。也可留言,一起探讨。。。。