U-boot移植
之前花左一段时间,开始学习u-boot的移植,先从start.S,u-boot第一段执行的代码分析,明白左u-boot系点引导的过程,知道左u-boot是分为两个阶段既,再跳入第2段C程序前,要用汇编来实现:设置异常向量;设置CPU时钟,频率,终端控制器;初始化内存控制器;拷贝第二阶段代码到SDRAM里;设置堆栈等操作。各结构体的含义(前提对ARM汇编熟悉),跟住就写下详细步骤如下:
1.删除多余文件:
1.在board/下除smdk2410,把其余的都删除,因为
目标板CPU为S3C2440
2.在cpu/下删除除arm920t 以外的所有其他cpu目录
3.在根目录下的lib_xxx的库文件目录里留lib_arm和lib_generic
4.在include/目录下asm-xxx的文件目录只留asm-arm。
5.删除include/configs目录下除smdk2410.h以外的所有头文件。
2.编译测试:
首先先建立自己的目录,我把/board/smdk2410目录改为yangyi2440目录,命令:cp –R board/smdk2410/ board/yangyi2440
接着就修改smdk2410.c为yangyi2440.c
接着修改该目录下的Makefile文件中(大概在28行左右)
COBJS :=yangyi2440.o flash.o
接着建立目标板配置文件:include/config目录下将smdk2410.h复制为yangyi2440.h(因为要有对应的配置文件对应新目录)
接着修改顶层Makefile文件大概1878行,增加:
yangyi2440_config : unconfig
@$(MKCONFIG)$(@:_config=)arm arm920t yangyi2440
NULL s3c24x0
arm :CPU的架构
arm920t:CPU的类型
yangyi2440 :对应在board目录下建立新的开发板项目的目录samsung:新开发板项目目录的上级目录
如直接在board下建立新的开发板项目的目
录, 则这里就为NULLs3c24x0:CPU型号
接着配置交叉编译器:修改顶层的Makeflie,(大概128行)修改:
ifeq($(ARCH),arm)
CROSS_COMPILE=arm-linux-
endif
接着就可以进行编译测试了:
进入u-boot-1.1.6目录
输入命令:make yangyi2440_config(而呢句话究竟做了什么可以睇韦东山的那本嵌入式LINUX书的u-boot编译个章)
再输入:make all
如果无出错,就会生成u-boot.bin文件,到呢到基本既目标板框架就建立好啦
跟住落黎就可以开始真正既移植啦。(修改配置)和(更改驱动)。
3.增加对S3C2440的支持:
一.(1)首先要做既系修改SDRAM配置,首先先进入board/yangyi2440目录修改lowlevel_init.S(大概54行)修改成如下:
#define B1_BWSCON (DW16) //(IDE)
#define B2_BWSCON (DW16) //(IDE)
#define B3_BWSCON (DW16 + WAIT + UBLB) //(CS8900)
#define B4_BWSCON (DW16) //(DM9000)
#define B5_BWSCON (DW8)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
首先呢到要讲下D位数点解要艮设,(开始我都唔明,后来查资料就明,
啦,首先系艮既:S3C2440 bank0:接norflash(16位),bank1和bank2
都系接IDE硬盘接口(16位),bank3:接CS8900网卡(16位),bank4:
接DM9000网卡(16位),bank5:接8位既串口,bank6:接32位既SDRAM
知道硬件分布后就修改相应的位就OK。(所以有问题解决唔到就百度,哈)
(2)继续修改lowlevel_init.S文件既大概126行如下:
#define REFCNT 0x4f4
(系咩意思呢,系艮既,我块主板既HCLK时钟配置为100MHZ,而查看S3C2440及芯片PDF可以查到一条公式系计算SDRAM刷新频率:
(period=7.8125us, HCLK=100Mhz, (2048+1-7.8125*100)=0x4f4所以就系艮计算出黎既)
二.配置时钟:
(1)首先进入目录/cpu/arm920t/start.S系呢内面修改,因为距系系统启动既第一阶段运行既代码,修改如下:
将原来的时钟设置屏蔽:
#if 0
//FCLK:HCLK:PCLK = 1:2:4
//default FCLK is 120 MHz !
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
(2)将stack_setup子程序放到relocate子程序前面(呢部重要),跟住系statck_setup子程序后加一条跳转指令调用clock_init子函数
进行时钟初始化:(原因在调用clock_init子函数时,要有到栈)
//set up the stack
stack_setup:
ldr r0, _TEXT_BASE //upper 128 KiB: relocated uboot
sub r0, r0, #CFG_MALLOC_LEN //malloc area
sub r0, r0, #CFG_GBL_DATA_SIZE //bdinfo
sub sp, r0, #12 //leave 3 words for abort-stack
bl clock_init//系呢到加!!!!!!!