Uboot 基于TQ2440 开发板上的移植.docx

上传人:b****7 文档编号:9729360 上传时间:2023-02-06 格式:DOCX 页数:51 大小:40.82KB
下载 相关 举报
Uboot 基于TQ2440 开发板上的移植.docx_第1页
第1页 / 共51页
Uboot 基于TQ2440 开发板上的移植.docx_第2页
第2页 / 共51页
Uboot 基于TQ2440 开发板上的移植.docx_第3页
第3页 / 共51页
Uboot 基于TQ2440 开发板上的移植.docx_第4页
第4页 / 共51页
Uboot 基于TQ2440 开发板上的移植.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

Uboot 基于TQ2440 开发板上的移植.docx

《Uboot 基于TQ2440 开发板上的移植.docx》由会员分享,可在线阅读,更多相关《Uboot 基于TQ2440 开发板上的移植.docx(51页珍藏版)》请在冰豆网上搜索。

Uboot 基于TQ2440 开发板上的移植.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1