移植UBoot120到博创2410S.docx
《移植UBoot120到博创2410S.docx》由会员分享,可在线阅读,更多相关《移植UBoot120到博创2410S.docx(14页珍藏版)》请在冰豆网上搜索。
移植UBoot120到博创2410S
移植U-Boot.1.2.0到博创2410-S(转自)
移植U-Boot.1.2.0到博创2410-S(S3C2410A)
一、在U-Boot中建立自己的开发板类型,并测试编译。
我为开发板取名叫:
tekkaman2410
0在工作目录下解压U-Boot。
$tarzxvfu-boot.git.tar.gz
1进入U-Boot目录,修改Makefile
$cdu-boot.git/
$viMakefile
#为tekkaman2410建立编译项
smdk2410_config:
unconfig@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2410NULLs3c24x0
tekkaman2410_config:
unconfig@$(MKCONFIG)$(@:
_config=)armarm920ttekkaman2410tekkamans3c24x0
各项的意思如下:
arm:
CPU的架构(ARCH)
arm920t:
CPU的类型(CPU),其对应于cpu/arm920t子目录。
tekkaman2410:
开发板的型号(BOARD),对应于board/tekkaman/tekkaman2410目录。
tekkaman:
开发者/或经销商(vender)。
s3c24x0:
片上系统(SOC)。
同时在“ifndefCROSS_COMPILE”之前加上自己交叉编译器的路径,比如我使用crosstool-0.43制作的基于2.6.22.2内核和gcc-4.1.0-glibc-2.3.2的ARM9TDMI交叉编译器,则:
CROSS_COMPILE=/home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
2在/board子目录中建立自己的开发板tekkaman2410目录
由于我在上一步板子的开发者/或经销商(vender)中填了tekkaman,所以开发板tekkaman2410目录一定要建在/board子目录中的tekkaman目录下,否则编译会出错。
$cdboard
$mkdirtekkamantekkaman/tekkaman2410$cp-arfsmdk2410/*tekkaman/tekkaman2410/$cdtekkaman/tekkaman2410$mvsmdk2410.ctekkaman2410.c
还要记得修改自己的开发板tekkaman2410目录下的Makefile文件,不然编译时会出错:
COBJS:
=tekkaman2410.oflash.o
$viMakefile
3在include/configs/中建立配置头文件
$cd../../..$cpinclude/configs/smdk2410.hinclude/configs/tekkaman2410.h
4测试编译能否成功
$maketekkaman2410_config
Configuringfortekkaman2410board...
(如果出现:
$maketekkaman2410_configMakefile:
1927:
***遗漏分隔符。
停止。
请在U-boot的根目录下的Makefile的
@$(MKCONFIG)$(@:
_config=)armarm920ttekkaman2410tekkaman)
前加上“Tab”键)
$make
我到这一步测试交叉编译成功!
!
二、修改U-Boot中的文件,以匹配博创的2410-S实验箱。
1修改/cpu/arm920t/start.S
(1)修改中断禁止部分
#ifdefined(CONFIG_S3C2410)ldrr1,=0x7ff//根据2410芯片手册,INTSUBMSK有11位可用,
//vivi也是0x7ff,不知为什么U-Boot一直没改过来。
ldrr0,=INTSUBMSKstrr1,[r0]#endif
(2)修改时钟设置(可以不修改,因为后面的board_init函数也会将时钟设为202.8MHz)
/*FCLK:
HCLK:
PCLK=1:
2:
4*/
/*defaultFCLKis120MHz!
*/
ldrr0,=CLKDIVNmovr1,#3strr1,[r0]
mrcp15,0,r1,c1,c0,0/*readctrlregistertekkaman*/orrr1,r1,#0xc0000000/*Asynchronoustekkaman*/mcrp15,0,r1,c1,c0,0/*writectrlregistertekkaman*//*now,CPUclockis202.8Mhztekkaman*/movr1,#CLK_CTL_BASE/*tekkaman*/movr2,#MDIV_200/*mpll_200mhztekkaman*/addr2,r2,#PSDIV_200/*mpll_200mhztekkaman*/strr2,[r1,#0x04]/*MPLLCONtekkaman*/#endif/*CONFIG_S3C2400||CONFIG_S3C2410*/
红色部分是我添加的,因为U-Boot使用的是/*defaultFCLKis120MHz!
*/
我利用博创提供的vivi的代码,将其设为202.8MHz并在前面加上:
#elifdefined(CONFIG_S3C2410)
#definepWTCON0x53000000
#defineINTMSK0x4A000008/*Interupt-Controllerbaseaddresses*/
#defineINTSUBMSK0x4A00001C
#defineCLKDIVN0x4C000014/*clockdivisorregister*/
#defineCLK_CTL_BASE0x4C000000/*tekkaman*/
#defineMDIV_2000xa1#definePSDIV_2000x31/*tekkaman*/
(3)将从Flash启动改成从NANDFlash启动。
将以下U-Boot的重定向语句段:
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
relocate:
/*relocateU-BoottoRAM*/
adrr0,_start/*r0#ifdefCONFIG_S3C2410_NAND_BOOT@tekkaman@@@@@@@@@@@@@@@@SSSSSSSSSSSSS@resetNANDmovr1,#NAND_CTL_BASEldrr2,=0xf830@initialvaluestrr2,[r1,#oNFCONF]ldrr2,[r1,#oNFCONF]bicr2,r2,#0x800@enablechipstrr2,[r1,#oNFCONF]movr2,#0xff@RESETcommandstrbr2,[r1,#oNFCMD]movr3,#0@waitnand1:
addr3,r3,#0x1cmpr3,#0xabltnand1nand2:
ldrr2,[r1,#oNFSTAT]@waitreadytstr2,#0x1beqnand2ldrr2,[r1,#oNFCONF]orrr2,r2,#0x800@disablechipstrr2,[r1,#oNFCONF]@getreadtocallCfunctions(fornand_read())ldrsp,DW_STACK_START@setupstackpointermovfp,#0@nopreviousframe,sofp=0@copyU-BoottoRAMldrr0,=TEXT_BASEmovr1,#0x0movr2,#0x20000blnand_read_lltstr0,#0x0beqok_nand_readbad_nand_read:
loop2:
bloop2@infiniteloopok_nand_read:
@verifymovr0,#0ldrr1,=TEXT_BASEmovr2,#0x400@4bytes*1024=4K-bytesgo_next:
ldrr3,[r0],#4ldrr4,[r1],#4teqr3,r4bnenotmatchsubsr2,r2,#4beqstack_setupbnego_nextnotmatch:
loop3:
bloop3@infiniteloop#endif@CONFIG_S3C2410_NAND_BOOT@tekkaman@@@@@@@@@@@@@@@@@@EEEEEEEEE
在“_start_armboot:
.wordstart_armboot”后加入:
.align2
DW_STACK_START:
.wordSTACK_BASE+STACK_SIZE-4
附:
顺便提一下,在start.S文件的注释部分有个小错误(红色部分:
原来是2):
cpu_init_crit:
......
/*
*disableMMUstuffandcaches
*/
mrcp15,0,r0,c1,c0,0
bicr0,r0,#0x00002300@clearbits13,9:
8(--V---RS)
bicr0,r0,#0x00000087@clearbits7,2:
0(B----CAM)
orrr0,r0,#0x00000002@setbit1(A)Align
......
2在board/tekkaman/tekkaman2410加入NANDFlash读函数,建立nand_read.c文件,加入如下内容(copyfromvivi):
#include
#define__REGb(x)(*(volatileunsignedchar*)(x))
#define__REGi(x)(*(volatileunsignedint*)(x))
#defineNF_BASE0x4e000000
#defineNFCONF__REGi(NF_BASE+0x0)
#defineNFCMD__REGb(NF_BASE+0x4)
#defineNFADDR__REGb(NF_BASE+0x8)
#defineNFDATA__REGb(NF_BASE+0xc)
#defineNFSTAT__REGb(NF_BASE+0x10)
#defineBUSY1
inlinevoidwait_idle(void){
inti;
while(!
(NFSTAT&BUSY))
for(i=0;i
/*lowlevelnandreadfunction*/
int
nand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize)
{
inti,j;
if((start_addr&NAND_BLOCK_MASK)||(size&NAND_BLOCK_MASK)){
return-1;/*invalidalignment*/
}
/*chipEnable*/
NFCONF&=~0x800;
for(i=0;i
for(i=start_addr;i
/*WriteAddress*/
NFADDR=i&0xff;
NFADDR=(i>>9)&0xff;
NFADDR=(i>>17)&0xff;
NFADDR=(i>>25)&0xff;
wait_idle();
for(j=0;j
/*chipDisable*/
NFCONF|=0x800;/*chipdisable*/
return0;
}
3修改board/tekkaman/tekkaman2410/Makefile文件
......
OBJS:
=tekkaman2410.onand_read.o......
4修改include/configs/tekkaman2410.h文件,添加如下内容:
......
/*
*NandflashBoot
*/
#defineCONFIG_S3C2410_NAND_BOOT1
#defineSTACK_BASE0x33f00000
#defineSTACK_SIZE0x8000
//#defineUBOOT_RAM_BASE0x33f80000
/*NANDFlashController*/
#defineNAND_CTL_BASE0x4E000000
#definebINT_CTL(Nb)__REG(INT_CTL_BASE+(Nb))
/*Offset*/
#defineoNFCONF0x00
#defineoNFCMD0x04
#defineoNFADDR0x08
#defineoNFDATA0x0c
#defineoNFSTAT0x10
#defineoNFECC0x14
#endif/*__CONFIG_H*/
5修改board/tekkaman/tekkaman2410/lowlevel_init.S文件
依照开发箱的内存区的配置情况,修改board/tekkaman/tekkaman2410/lowlevel_init.S文件,我利用博创提供的vivi源码里的信息做了如下更改:
......
#defineB1_BWSCON(DW16)/*@tekkaman*/
#defineB2_BWSCON(DW16)
#defineB3_BWSCON(DW16)/*@tekkaman*/
#defineB4_BWSCON(DW16)
#defineB5_BWSCON(DW16)
#defineB6_BWSCON(DW32)
#defineB7_BWSCON(DW32)
......
#defineB3_Tacs0x0/*0clk*/#defineB3_Tcos0x0/*0clk@tekkaman*/#defineB3_Tacc0x7/*14clk*/#defineB3_Tcoh0x0/*0clk@tekkaman*/#defineB3_Tah0x0/*0clk*/#defineB3_Tacp0x0/*@tekkaman*/#defineB3_PMC0x0/*normal*/
......
注:
之所以Bank3的改动较大,是因为smdk2410的网卡CS8900是在Bank3,而博创2410-S的AX88796是在Bank2。
.......word((B7_MT.word((REFEN.word0xb2/*@tekkaman*/.word0x30.word0x30
6修改/board/tekkaman/tekkaman2410/tekkaman2410.c
因为博创2410-S和smdk2410的GPIO连接有所不同,我依旧利用博创配的vivi,修改其对GPIO的配置(具体原因我并未深究,请参阅博创2410-S的硬件说明和2410芯片手册):
......
gpio->GPEUP=0x0000FFFF;
gpio->GPFCON=0x000051aa;//0x000055AA;tekkamangpio->GPFUP=0x000000ef;//0x000000FF;tekkamangpio->GPGCON=0xfd95ffba;//0xFF95FFBA;tekkamangpio->GPGUP=0x0000efff;//0x0000FFFF;tekkamangpio->GPHCON=0x0016faaa;//0x002AFAAA;tekkaman
gpio->GPHUP=0x000007FF;
......
7为了实现NANDFlash的读写,再次修改
/include/configs/tekkaman2410.h
(请格外注意:
如果编译时报错,在Linux下用KWrite等有高亮显示的文本编辑器看看文件的注释是不是为注释应有的颜色(KWrite中为灰色),如果不是,则将注释删除。
因为#define后面的注释被认为是程序的一部分。
建议注释和#define分行写)
......
/*
*Hardwaredrivers
*/
//#defineCONFIG_DRIVER_CS89001/*wehaveaCS8900on-board*///#defineCS8900_BASE0x19000300//#defineCS8900_BUS161/*theLinuxdriverdoesaccessesasshorts*/
#defineCONFIG_DRIVER_NE2000#defineCONFIG_DRIVER_NE2000_BASE(0x10000000+0x200)
......
/************************************************************Commanddefinition***********************************************************/#defineCONFIG_COMMANDS\(CONFIG_CMD_DFL|\CFG_CMD_CACHE|\CFG_CMD_NAND|\
CFG_CMD_NET|\/*CFG_CMD_EEPROM|*/\/*CFG_CMD_I2C|*/\/*CFG_CMD_USB|*/\
CFG_CMD_PING|\
CFG_CMD_ENV|\CFG_CMD_REGINFO|\CFG_CMD_DATE|\CFG_CMD_ELF)/*thismustbeincludedAFTERthedefinitionofCONFIG_COMMANDS(ifany)*/
#include
#defineCONFIG_CMDLINE_TAG
//增加U-Boot对内核参数传递的功能,
//具体内容请参阅
对《U-BOOT下使用bootm引导内核方法》的补充说明
......
#defineCFG_LONGHELP
/*undeftosavememory*/
#defineCFG_PROMPT"[Tekkaman2410]#"
/*MonitorCommandPrompt*/
#defineCFG_CBSIZE256
/*ConsoleI/OBufferSize*/
......
#defineCFG_LOAD_ADDR0x30008000
/*defaultloadaddress*/
......
//#definePHYS_FLASH_10x00000000/*FlashBank#1*/
//#defineCFG_FLASH_BASEPHYS_FLASH_1
/*-----------------------------------------------------------------------
*FLASHandenvironmentorganization
*/
#defineCFG_NO_FLASH1
#if0
#defineCONFIG_AMD_LV4001/*uncommentthisifyouhaveaLV400flash*/
//#if0
#defineCONFIG_AMD_LV8001/*uncommentthisifyouhaveaLV800flash*/
#endif
//#defineCFG_MAX_FLASH_BANKS1/*maxnumberofmemorybanks*/
......
/*timeoutvaluesareinticks*/
//#defineCFG_FLASH_ERASE_TOUT(5*CFG_HZ)
/*TimeoutforFlashErase*/
//#defineCFG_FLASH_WRITE_TOUT(5*CFG_HZ)
/*TimeoutforFlashWrite*/
#defineCFG_ENV_IS_IN_NAND1
#defineCFG_ENV_OFFSET0X20000
//#defineENV_IS_EMBEDDED1
#defineCFG_NAND_LEGACY
#defineCFG_ENV_SIZE0x10000
/*TotalSizeofEnvironmentSector*/
#if(CONFIG_COMMANDS&CFG_CMD_NAND)#defineCFG_NAND_BASE0x4E000000/*NandFlash控制器在SFR区起始寄存器地址*/
#defineCFG_MAX_NAND_DEVICE1
/*支持的最在NandFlash数据*/#defineSECTORSIZE512
/*1页的大小*/#defineNAND_SECTOR_SIZESECTORSIZE#defineNAND_BLOCK_MASK511
/*页掩码*/#defineADDR_COLUMN1
/*一个字节的Column地址*/