Uboot 基于TQ2440 开发板上的移植.docx
《Uboot 基于TQ2440 开发板上的移植.docx》由会员分享,可在线阅读,更多相关《Uboot 基于TQ2440 开发板上的移植.docx(51页珍藏版)》请在冰豆网上搜索。
Uboot基于TQ2440开发板上的移植
u-boot-2011.03在TQ2440上的移植
(1)--建立自己的demo板 收藏
参考文章
黄刚博客
tekkman博客
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,其它全部删除
进入/arch,留下arm,其它全部删除
进入/arch/arm/cpu,留下arm920t,其它全部删除
5、建立自己的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
6、修改u-boot跟目录下的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键开始,否则编译会出错
7、测试编译新建的smdk2440开发板项目
在uboot根目录测试
makesmdk2440_config
make即可在uboot根目录下生成bin文件
在uboot里,清除中间文件用命令makedistclean
u-boot-2011.03在TQ2440上的移植
(2)--初始化时钟 收藏
smdk2440的初始化设置
1、u-boot主要的目录结构如下
2、启动流程图下图
由上图可知
u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;
u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
3、在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
viinclude/configs/smdk2440.h 在第40行添加
#defineCONFIG_S3C24401
4、stage1阶段的硬件设备初始化。
viarch/arm/cpu/arm920t/start.S
去掉117,118行点亮AT91RM9200DK系列LED的代码
/*
blcoloured_LED_init
blred_LED_on
*/
5、在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分。
在164行添加如下红色内容
# 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的
6、S3C2440的时钟部分除了在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
7、viarch/arm/cpu/arm920t/s3c24x0/speed.c//根据设置的分频系数FCLK:
HCLK:
PCLK=1:
4:
8修改获取时钟频率的函数
get_PLLCLK函数修改第66行如下
staticulongget_PLLCLK(intpllreg)
{
S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_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)
{
S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();
#ifdefined(CONFIG_S3C2440)
return(get_FCLK()/4);
#endif
return((clk_power->CLKDIVN&0x2)?
get_FCLK()/2:
get_FCLK());
}
u-boot-2011.03在TQ2440上的移植(3)--支持norflash启动 收藏
1、修改命令提示符为自己的
viinclude/configs/smdk2440.h
第118行修改为
#defineCONFIG_SYS_PROMPT "[SMDK2440]#" //将命令行前的名字改成[SMDK2440]
2、通常,在嵌入式bootloader中,有两种方式来引导启动内核:
从NorFlash启动和从NandFlash启动。
u-boot中默认是从NorFlash启动的。
3、TQ2440的所用的Norflash为EN29LV160AB。
接线同AM29LV160DB
翻开此芯片的datasheet看到
TQ2440原理图上的第47脚 BYTE#是接高电平的,so此芯片工作于16位模式(半字模式)
A0-A19是地址线,在半字模式下,D0-D15做为数据输入输出口。
因为数据位是16位,A0-A19可以选择2^20=1M*2BYTE=2Mbyte。
正好是AM29LV160DB的容量。
S3C2440的ADDR1要接AM29LV160DB的A0。
上图中AM29LV160DB的A20,A21是空脚,分别接的是LADDR21,LADDR22。
这应该是为了以后方便扩展NORFLASH的容量。
LADDR21,LADDR22对AM29LV160DB是没用的。
<1>2048K*8bit/1024K*16bitFlashMemoryBootSectorFlashMemory
<2>FlexibleSectorArchitecture:
-One 16-Kbyte, two 8-Kbyte, one 32-Kbyte,and thirty-one 64-Kbytesectors(bytemode)
-One 8-Kword, two 4-Kword, one 16-Kword,and thirty-one 32-Kwordsectors(wordmode)
无论哪种模式总扇区是 35 sectors。
4、修改Norflash参数
viinclude/configs/smdk2440.h
/*-----------------------------------------------------------------------
*FLASHandenvironmentorganization
*/
#if0 //注释掉下面两个类型的NorFlash设置,因为不是我们所使用的型号
#defineCONFIG_AMD_LV400 1/*uncommentthisifyouhaveaLV400flash*/
#defineCONFIG_AMD_LV800 1/*uncommentthisifyouhaveaLV800flash*/
#endif
#defineCONFIG_SYS_MAX_FLASH_BANKS1 /*maxnumberofmemorybanks*/
#ifdefCONFIG_AMD_LV800
#definePHYS_FLASH_SIZE 0x00100000 /*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参数
5、添加Norflash的information
viinclude/flash.h
第181行添加
#defineEON_ID_LV160AB 0x22492249
6、修改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)))
由于我们是把norflash连接到了s3c2440的bank0上,因此norflash中的地址相对于s3c2440来说基址为0x00000000,即CONFIG_SYS_FLASH_BASE =0。
而之所以又把norflash中的地址向左移一位(即乘以2),是因为我们是把s3c2440的ADDR1连接到了norflash的A0上的缘故。
由数据手册可知EN29LV160AB第0扇区大小为8K,第1、2为4K,第3为16K,后面31扇区为32K。
前面4个扇区加起来刚好是主要扇区的大小=32K,所以修改87行下如下
for(j=0;j{
if(j<=3)
{
/*1stoneis8KB*/
if(j==0)
{
flash_info[i].start[j]=flashbase+0;
}
/*2ndand3rdareboth4KB*/
if((j==1)||(j==2))
{
flash_info[i].start[j]=flashbase+0x2000+(j-1)*0x1000;
}
/*4th 16KB*/
if(j==3)
{
flash_info[i].start[j]=flashbase+0x4000;
}
}
else
{
flash_info[i].start[j]=flashbase+(j-3)*MAIN_SECT_SIZE;
}
}
size+=flash_info[i].size;
修改flash_print_info,添加EN29LV160AB相关信息如下:
switch(info->flash_id&FLASH_VENDMASK){
case(AMD_MANUFACT&FLASH_VENDMASK):
printf("AMD:
");
break;
case(EON_MANUFACT&FLASH_VENDMASK):
printf("EON:
");
break;
default:
printf("UnknownVendor");
break;
}
switch(info->flash_id&FLASH_TYPEMASK){
case(AMD_ID_LV400B&FLASH_TYPEMASK):
printf("1xAmd29LV400BB(4Mbit)\n");
break;
case(AMD_ID_LV800B&FLASH_TYPEMASK):
printf("1xAmd29LV800BB(8Mbit)\n");
break;
case(EON_ID_LV160AB&FLASH_TYPEMASK):
printf("1xEN29LV160AB(16Mbit)\n");
break;
default:
printf("UnknownChipType\n");
gotoDone;
break;
}
修改intflash_erase(flash_info_t*info,ints_first,ints_last)
if((info->flash_id&FLASH_VENDMASK)!
=
(EON_MANUFACT &FLASH_VENDMASK)){
returnERR_UNKNOWN_FLASH_VENDOR;
7、至此,uboot关于Norflash已经移植好
makedistclean
makesmdk2440_config
make即可生成u-boot.bin
下载到板子的Norflash,在命令台输入saveenv即可
[SMDK2440]# saveenv
SavingEnvironmenttoFlash...
Un-Protected2sectors
ErasingFlash...Erasingsector19...ok.
Erasingsector20...ok.
Erased2sectors
WritingtoFlash...done
Prote