U-Boot首要目录结构
– board 方针板相关文件,首要包括SDRAM、FLASH驱动;
– common 独立于处理器体系结构的通用代码,如内存大小勘探与毛病检测;
– cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中止初始化等文件;
– driver 通用设备驱动,如CFI FLASH驱动(现在对INTEL FLASH支撑较好)
– doc U-Boot的阐明文档;
– examples可在U-Boot下运转的示例程序;如hello_world.c,timer.c;
– include U-Boot头文件;特别configs子目录下与方针板相关的装备头文件是移植过程中常常要修正的文件;
– lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录别离包括与PowerPC、ARM体系结构相关的文件;
– net 与网络功用相关的文件目录,如bootp,nfs,tftp;
– post 上电自检文件目录。尚有待于进一步完善;
– rtc RTC驱动程序;
– tools 用于创立U-Boot S-RECORD和BIN镜像文件的东西;
一、树立自己的开发板文件
1.在borad文件夹中新建自己的板子目录,仿制sbc2410x中的文件到此目录,作为蓝本,加速移植进展,修正板子目录下的makefile文件COBJS := tq2440.o flash.o(其间tq2440.o文件的生成必需要修正此目录下的sbc2410x.c文件)
2.在include/configs文件夹下以sbc2410x.h为蓝本,创立tq2440.h文件
3.修正uboot根目录下的makefile文件,确认CROSS_COMPLE即编译器选项,参加make选项:
tq2440_config:unconfig
(TAB)@./mkconfig $(@:_config=) arm arm920t tq2440 NULL s3c24x0
其间:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
tq2440: 开发板的类型(BOARD),对应于board/tq2440目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上体系(SOC)。
4.接下来测验是否能编译经过,履行:make disclean–删去本来的编译成果
make tqconfig
成功后呈现Configuring for xxx board…..
make –能够生成uboot.bin文件
二、修正源码
1、修正start.S
修正如下代码:
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
#ifdefined(CONFIG_S3C2440)
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
#if0
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
#endif
#ifndefCONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
//把仓库初始化拿到前面来,应为后边要写的时钟初始化函数会用到仓库
stack_setup:
ldr r0, _TEXT_BASE
sub r0, r0, #CFG_MALLOC_LEN
sub r0, r0, #CFG_GBL_DATA_SIZE
#ifdefCONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12
//跳转到时钟初始话函数
bl clock_init
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
relocate:
adr r0, _start
ldr r1, _TEXT_BASE
cmp r0, r1
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2
//屏蔽原先代码,重写代码转移函数
#if1
bl CopyCode2Ram
#else
add r2, r0, r2
copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop
#endif
#endif
接着在include/configs/tq2440.h增加
#define CONFIG_S3C2440 1
#define CONFIG_TQ2440 1
并屏蔽原先的芯片和开发板界说,与此同时s3c24x0.h中的S3C24X0_GPIO结构体也要改写,使其支撑2440,并且要增加
S3C24X0_REG32 res9[4];
S3C24X0_REG32 GPJCON;
S3C24X0_REG32 GPJDAT;
S3C24X0_REG32 GPJUP;
此为GPIO_J口的界说
增加typedefstruct{
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFMECCD0;
S3C24X0_REG32 NFMECCD1;
S3C24X0_REG32 NFSECCD;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSBLK;
S3C24X0_REG32 NFEBLK;
} S3C2440_NAND;
其他结构体也要修正
修正lowlevel_init.S,修正54,58,126行即可,即外部存储器操控器。
54 #defineB1_BWSCON (DW16)
58 #defineB5_BWSCON (DW8)
126 #defineREFCNT 0x4f4
lowlevel_init.S 首要设置SDRAM装备
ARM的存储器操控器
位宽和等候操控寄存器BWSCON中每4位操控一个BANK,最高4位对应BANK7、接下来4位对应BANK6,依此类推
8 个存储器 banks
6 个是 ROM,SRAM 等类型存储器 bank
2 个是能够作为 ROM、SRAM、SDRAM 等存储器 bank
BANK操控寄存器BANKCONx(BANKCON1~5)这几个寄存器用来操控BANK0~BANK5外接设备的拜访时序,一般运用默许的0x0700即可。
BANK操控寄存器BANKCONx(BANKCON6~7,在8个BANK中,只要BANK6和BANK7能够外接SRAM和SDRAM,所以BANKCON6~BANKCON7与BANKCON0~BANKCON5有点不同。
在board文件夹中增加boot_init.c文件,并修正makefile(boot_init.c文件首要包括nand的读写,时钟的初始化,和代码的复制函数)
boot_init.c
#include
#include
#defineGSTATUS1 (*(volatileunsignedint*)0x560000B0)
#defineBUSY 1
#defineNAND_SECTOR_SIZE 512
#defineNAND_BLOCK_MASK (NAND_SECTOR_SIZE – 1)
#defineNAND_SECTOR_SIZE_LP 2048
#defineNAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP – 1)
charbLARGEBLOCK; //HJ_add 20090807
charb128MB; //HJ_add 20090807
voidnand_init_ll(void);
intnand_read_ll(unsignedchar*buf, unsignedlongstart_addr, intsize);
intnand_read_ll_lp(unsignedchar*buf, unsignedlongstart_addr, intsize);
staticvoidnand_reset(void);
staticvoidwait_idle(void);
staticvoidnand_select_chip(void);
staticvoidnand_deselect_chip(void);
staticvoidwrite_cmd(intcmd);
staticvoidwrite_addr(unsignedintaddr);
staticvoidwrite_addr_lp(unsignedintaddr);
staticunsignedcharread_data(void);
intNF_ReadID(void); //HJ_add 20090807