最可靠的UBOOT移植讲解学习.docx
- 文档编号:886979
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:30
- 大小:47.72KB
最可靠的UBOOT移植讲解学习.docx
《最可靠的UBOOT移植讲解学习.docx》由会员分享,可在线阅读,更多相关《最可靠的UBOOT移植讲解学习.docx(30页珍藏版)》请在冰点文库上搜索。
最可靠的UBOOT移植讲解学习
最可靠的UBOOT移植
一.
1、到ftp:
//ftp.denx.de/pub/u-boot/下载u-boot-2010.06.tar.bz2
2、解压 tarjxvfu-boot-2010.06.tar.bz2
3、进入uboot cdu-boot-2010.06
4、删减uboot
进入/board,留下samsung,其它全部删除
ls|grep-v"^samsung$"|xargsrm-rf
进入/arch,留下arm,其它全部删除
ls|grep-v"^arm$"|xargsrm-rf
进入/arch/arm/cpu,留下arm920t,其它全部删除
ls|grep-v"920"|xargsrm–rf
二.
1、建立自己的DEMO板
cd/board/samsung
mkdirsmdk2440
cp-rfsmdk2410/*smdk2440/ //将2410下所有的代码复制到2440下
cdsmdk2440 //进入smdk2440目录
mvsmdk2410.csmdk2440.c //将smdk2440下的smdk2410.c改名为smdk2440.c
然后在文件夹samsung里留下smdk2440,其它全部删除
cpinclude/configs/smdk2410.hinclude/configs/smdk2440.h //建立2440头文件
在include/configs下留下smdk2440.h,其它全部删除
vi board/samsung/smdk2440/Makefile //修改smdk2440下Makefile的编译项,如下:
COBJS:
=smdk2440.oflash.o //修改第28行因在smdk2440下我们将smdk2410.c改名为smdk2440.c
2、顶层Makefile文件。
查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立my2440_config的编译选项,另外还要指定交叉编译器,修改159行
CROSS_COMPILE?
=arm-linux- //指定交叉编译器为arm-linux-gcc
smdk2410_config :
unconfig //2410编译选项格式
@$(MKCONFIG)$(@:
_config=) armarm920tsmdk2410samsungs3c24x0
smdk2440_config :
unconfig //修改蒂3054行,2440编译选项格式
@$(MKCONFIG)$(@:
_config=) armarm920t smdk2440samsungs3c24x0
*说明:
arm :
CPU的架构(ARCH)
arm920t:
CPU的类型
smdk2440:
对应在board目录下建立新的开发板项目的目录
samsung:
新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
s3c24x0:
CPU型号
*注意:
编译选项格式的第二行要用Tab键开始,否则编译会出错
3、测试编译新建的smdk2440开发板项目
在uboot根目录测试
makesmdk2440_config
make即可在uboot根目录下生成bin文件
三
Makedistclean
在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
viinclude/configs/smdk2440.h 在第40行添加
#defineCONFIG_S3C24401
1start.S
找到程序的入口点,reset:
/*
*setthecputoSVC32mode
*/
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
1-1. 在下面添加开发板的LED测试代码,以方便观看u-boot的运行
//测试开发板的LED
#if1 //P284LED分别由S3C2440的PB5、6、7、8口来控制
#defineGPBCON0x56000010
#defineGPBDAT0x56000014
#defineGPBUP 0x56000018
ldrr0,=GPBUP
ldrr1,=0x7FF //即:
二进制11111111111,关闭PB口上拉
strr1,[r0]
ldrr0,=GPBCON //配置PB5、6、7、8为输出口,对应PBCON寄存器的第10-17位
ldrr1,=0x154FD //即:
二进制010*********
strr1,[r0]
ldrr0,=GPBDAT
ldrr1,=0x1C0 //即:
二进制111000000,PB5设为低电平,6、7、8为高电平
strr1,[r0] ////点亮开发板上的LED1,
#endif
1-2.去掉117,118行点亮AT91RM9200DK系列LED的代码
/*
blcoloured_LED_init
blred_LED_on
*/
1-3.中断,时钟
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
/*164行*/
#ifdefined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分
ldr r1,=0x7fff //根据2440芯片手册,INTSUBMSK寄存器有15位可用
ldr r0,=INTSUBMSK
str r1,[r0]
#endif
#ifdefined(CONFIG_S3C2440) //添加s3c2440的时钟部分
#defineMPLLCON 0x4C000004 //系统主频配置寄存器基地址
#defineUPLLCON 0x4C000008 //USB时钟频率配置寄存器基地址
ldr r0,=CLKDIVN //设置分频系数FCLK:
HCLK:
PCLK=1:
4:
8
mov r1,#5
str r1,[r0]
ldr r0,=MPLLCON //设置系统主频为405MHz
ldr r1,=0x7F021 //这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分
str r1,[r0]
ldr r0,=UPLLCON //设置USB时钟频率为48MHz
ldr r1,=0x38022 //这个值参考芯片手册“PLLVALUESELECTIONTABLE”部分
str r1,[r0]
#else//其他开发板的时钟部分,这里就不用管了,我们现在是做2440的
/*FCLK:
HCLK:
PCLK=1:
2:
4*/
/*defaultFCLKis120MHz!
*/
ldr r0,=CLKDIVN
mov r1,#3
str r1,[r0]
#endif
接下来为了观看u-boot的运行,添加一段LED的程序,此时点亮LED2,关闭其它LED
//点亮LED2
ldrr0,=GPBDAT
ldrr1,=0x1A0 //即:
二进制110100000,PB6设为低电平,5、7、8为高电平
strr1,[r0] ////点亮开发板上的LED2,
2S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/smdk2440/smdk2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:
viboard/samsung/smdk2440/smdk2440.c
时钟部分修改第34行和在45行添加如下红色部分
#defineFCLK_SPEED2 //设置默认等于2,即下面红色代码部分有效
#ifFCLK_SPEED==0 /*Fout=203MHz,Fin=12MHzforAudio*/
#defineM_MDIV 0xC3
#defineM_PDIV 0x4
#defineM_SDIV 0x1
#elifFCLK_SPEED==1 /*Fout=202.8MHz*/
#defineM_MDIV 0xA1
#defineM_PDIV 0x3
#defineM_SDIV 0x1
#elifFCLK_SPEED==2 /*Fout=405MHz*/
#defineM_MDIV 0x7F //这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置
#defineM_PDIV 0x2
#defineM_SDIV 0x1
#endif
USB时钟部分修改第51行和在61行添加如下红色部分
#defineUSB_CLOCK2 //设置默认等于2,即下面红色代码部分有效
#ifUSB_CLOCK==0
#defineU_M_MDIV 0xA1
#defineU_M_PDIV 0x3
#defineU_M_SDIV 0x1
#elifUSB_CLOCK==1
#defineU_M_MDIV 0x48
#defineU_M_PDIV 0x3
#defineU_M_SDIV 0x2
#elifUSB_CLOCK==2 /*Fout=48MHz*/
#defineU_M_MDIV 0x38 //这三个值根据S3C2440芯片手册“PLLVALUESELECTIONTABLE”部分进行设置
#defineU_M_PDIV 0x2
#defineU_M_SDIV 0x2
#endif
3、viarch/arm/cpu/arm920t/s3c24x0/speed.c//根据设置的分频系数FCLK:
HCLK:
PCLK=1:
4:
8修改获取时钟频率的函数
get_PLLCLK函数修改第66行如下
staticulongget_PLLCLK(intpllreg)
{
structs3c24x0_clock_power*clk_power=s3c24x0_get_base_clock_power();
ulongr,m,p,s;
if(pllreg==MPLL)
r=clk_power->MPLLCON;
elseif(pllreg==UPLL)
r=clk_power->UPLLCON;
else
hang();
m=((r&0xFF000)>>12)+8;
p=((r&0x003F0)>>4)+2;
s=r&0x3;
#ifdefined(CONFIG_S3C2440)
if(pllreg==MPLL)
{ //参考S3C2440芯片手册上的公式:
PLL=(2*m*Fin)/(p*2s)
return((CONFIG_SYS_CLK_FREQ*m*2)/(p<
}
#endif
return((CONFIG_SYS_CLK_FREQ*m)/(p<
}
修改84行get_HCLK函数为
/*returnHCLKfrequency*/
ulongget_HCLK(void)
{
structs3c24x0_clock_power*clk_power=s3c24x0_get_base_clock_power();
#ifdefined(CONFIG_S3C2440)
return(get_FCLK()/4);
#endif
return(readl(&clk_power->CLKDIVN)&2)?
get_FCLK()/2:
get_FCLK();
}
4board/smdk2440/lowlevel_init.S
还是回到start.S
#ifndefCONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
以上代码使程序跳转到cpu_init_crit在cpu_init_crit中程序还要跳转到
lowlevel_init执行,该函数在board/smdk2440/lowlevel_init.S中,用于对SDRAM的初始化,在该文件中需要修改SDRAM的刷新参数
#defineB1_BWSCON(DW16)//这个改不改无所谓,没有接东西
#defineB2_BWSCON(DW16+WAIT+UBLB)//芯片手册P208
#defineB3_BWSCON(DW16)
#defineB4_BWSCON(DW16)
#defineB5_BWSCON(DW8)
#defineB6_BWSCON(DW32)//芯片手册P197
#defineB7_BWSCON(DW32)
@AX88796用的是bank2,和smdk2410有所区别,所以要这么改(参考vivi):
#defineB2_Tacs0x0@[14:
13]00为0clock地址建立时间beforeNGCS2
#defineB2_Tcos0x3@[12:
11]00为0clock芯片选择建立时间beforenOE
#defineB2_Tacc0x7@[10:
8]111为14clock访问周期
#defineB2_Tcoh0x1@[7:
6]00为0clock芯片选择保持时间afternOE
#defineB2_Tah0x0@[5:
4]00为0clock地址保持时间afternGCSn
#defineB2_Tacp0x3@[3:
2]00为2clock页面模式存储周期
#defineB2_PMC0x0@[1:
0]00为normal(1data)页面模式配置
/*BANK6CON*/
@配置SDRAM的参数(SDRAM占用BANK6),BANK6和BANK7要配置成同样的值,需要查看SDRAM
@的datasheet当内存为ROM或SRAM时需要配置所有位,当为SDRAM时只要配置[0~3]
@这里不用修改,因为smdk2410也就是这样设置的
#defineB6_MT0x3/*SDRAM*/@决定内存类型[16:
15]=11—>SDRAM(缺省时使用SDRAM)
#defineB6_Trcd0x1@[3:
2]=013clockRAStoCASdelay(即RAS到CAS的延时)20ns
#defineB6_SCAN0x1/*9bit*/
@[1:
0]=019bit列地址位数,即列扫描数,在SDRAM手册上,有一句:
C0~C8即为9列
/*BANK7CON*/
#defineB7_MT0x3/*SDRAM*/
#defineB7_Trcd0x1/*3clk*/
#defineB7_SCAN0x1/*9bit*/
/*REFRESHparameter*/
@SDRAM刷新参数,这个很重要,移植时要更改
#defineREFEN0x1/*Refreshenable*/
@默认为允许刷新
#defineTREFMD0x0/*CBR(CASbeforeRAS)/Autorefresh*/
@下面三个时间参数多是根据经验来设置
#defineTrp0x0/*2clk*/
#defineTrc0x3/*7clk*/
#defineTchr0x2/*3clk*/
#defineREFCNT0x4F4/*1268period=7.8us,HCLK="100Mhz",(2048+1-15.6*100)*/
@SDRAM刷新计数值,这个值比较重要,根据SDRAM(HY57V561620AT-H)的datasheet,(我使用的@这款芯片在datasheet写着8192Refreshcycle/64ms,所以一个刷新周期为64ms/8192=7.8125us,取@7.9的话REFCNT的值就为1259)
在#ifndefCONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit//屏蔽掉,如在内存中运行
#endif
后面加:
//点亮LED3
ldrr0,=GPBDAT
ldrr1,=0x160 //即:
二进制101100000,PB7设为低电平,5、6、8为高电平
strr1,[r0] ////点亮开发板上的LED3,
四
u-boot-2011.03在TQ2440上的移植(3)--支持norflash启动
修改命令提示符为自己的
4-1viinclude/configs/smdk2440.h
第118行修改为
#defineCONFIG_SYS_PROMPT "[SMDK2440]#" //将命令行前的名字改成[SMDK2440]
#if0 //注释掉下面两个类型的NorFlash设置,或者选LV800,因为与本板类似
#defineCONFIG_AMD_LV400 1/*uncommentthisifyouhaveaLV400flash*/
#defineCONFIG_AMD_LV800 1/*uncommentthisifyouhaveaLV800flash*/
#endif
#defineCONFIG_SYS_MAX_FLASH_BANKS1 /*maxnumberofmemorybanks*/
#ifdefCONFIG_AMD_LV800
#definePHYS_FLASH_SIZE 0x00200000 /*1MB*/
#defineCONFIG_SYS_MAX_FLASH_SECT (19) /*maxnumberofsectorsononechip*/
#defineCONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE+0x0F0000)/*addrofenvironment*/
#endif
#ifdefCONFIG_AMD_LV400
#definePHYS_FLASH_SIZE 0x00080000 /*512KB*/
#defineCONFIG_SYS_MAX_FLASH_SECT (11) /*maxnumberofsectorsononechip*/
#defineCONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE+0x070000)/*addrofenvironment*/
#endif
//第175行添加如下内容
#defineCONFIG_EON_29LV160AB 1 //添加TQ2440开发板NorFlash设置
#definePHYS_FLASH_SIZE 0x200000//我们开发板的NorFlash是2M
#defineCONFIG_SYS_MAX_FLASH_SECT (35) //根据EN29LV160AB的芯片手册描述,共35个扇区
#defineCONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE+0x80000)//暂设置环境变量的首地址为0x80000//在256K处放uboot参数
4-2
添加Norflash的information
viinclude/flash.h
第181行添加
#defineEON_ID_LV160AB 0x22492249//通过JTAGJFLASH可查到
4-3
修改norflash的驱动,在u-boot中对NorFlash的操作分别有初始化、擦除和写入,所以我们主要修改与硬件密切相关的三个函数flash_init、flash_erase、write_hword。
viboard/samsung/smdk2440/flash.c
由-One 8-Kword, two 4-Kword, one 16-Kword,and thirty-one 32-Kwordsectors(wordmode)
可知主要扇区大小为32k,so修改第31行
#defineMAIN_SECT_SIZE 0x8000 //定义为32k,主要扇区的大小
#defineMEM_FLASH_ADDR1 (*(volatileu16*)(CONFIG_SYS_FLASH_BASE+(0x00000555<<1)))
#defineMEM_FLASH_ADDR2 (*(volatileu16*)(CONFIG_SYS_FLASH_BASE +(0x000002AA<<1)))
75行error改为
EON_ID_LV160AB
由于我们是把norflash连接到了s3c2440的bank0上,因此norflash中的地址相对于s3c2440来说基址为0x00000000,即CONFIG_SYS_FLASH_BASE =0。
而之所以又把norflash中的地址向左移一位(即乘以2),
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可靠 UBOOT 移植 讲解 学习