uboot在mini2440上移植.docx

上传人:b****8 文档编号:10197362 上传时间:2023-02-09 格式:DOCX 页数:16 大小:19.57KB
下载 相关 举报
uboot在mini2440上移植.docx_第1页
第1页 / 共16页
uboot在mini2440上移植.docx_第2页
第2页 / 共16页
uboot在mini2440上移植.docx_第3页
第3页 / 共16页
uboot在mini2440上移植.docx_第4页
第4页 / 共16页
uboot在mini2440上移植.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

uboot在mini2440上移植.docx

《uboot在mini2440上移植.docx》由会员分享,可在线阅读,更多相关《uboot在mini2440上移植.docx(16页珍藏版)》请在冰豆网上搜索。

uboot在mini2440上移植.docx

uboot在mini2440上移植

uboot在2440上移植(转的相广超老师的)

默认分类2010-11-1309:

09:

26阅读70评论0  字号:

大中小 订阅

以前一直在用vivi,很精简很方便,源码很好懂,想改什么就改什么,但是功能差了点,所以移植个uboot来跑跑,uboot很好很强大,但是想搞清它的机制有点困难,先移植个最简单的试试,还没有增加对yaffs的支持和usb下载,遇到一些小问题也都解决了。

我用的2440开发板,取名为TX2440。

 

解压U-BOOT-1.1.6,进入U-BOOT目录,修改Makefile:

在smdk2410_config:

      unconfig

       @$(MKCONFIG)$(@:

_config=)armarm920tsmdk2410NULLs3c24x0

加上

TX2440_config :

   unconfig

       @$(MKCONFIG)$(@:

_config=)armarm920tTX2440NULLs3c24x0

各项的意思如下:

arm:

CPU的架构(ARCH)

arm920t:

CPU的类型(CPU),其对应于cpu/arm920t子目录。

TX2440:

开发板的型号(BOARD),对应于board/TX2440目录。

NULL:

开发者/或经销商(vender)。

s3c24x0:

片上系统(SOC)。

 

在第128行:

ifeq($(ARCH),arm)

CROSS_COMPILE=arm-linux-

指定交叉编译器,我使用的是3.4.1,这里也可以写绝对路径

 

修改完Makefile后,在board目录下,新建自己的开发板目录TX2440,把smdk2410目录下的所有文件拷到TX2440,把smdk2410.c改为TX2440.c。

修改该目录下的Makefile,把smdk2410.o改为TX2410.o。

COBJS :

=TX2440.oflash.o

 

将board目录下所有文件夹全部删除,只留TX2440

 

在include/configs目录下创建板子的配置头文件,把smdk2410.h改名为TX2440.h,再把所有的文件全部删除,只留TX2440.h

 

测试能否编译成功:

执行makeTX2440_config

出现make:

execvp:

…………/mkconfig:

权限不够

查看mkconfig的权限,发现没有可执行权限,用chmod764mkconfig加上权限

然后再make,成功后可出现ConfiguringforTX2440board.....

 

修改SDRAM配置,在board/TX2440/lowlevel_init.S中,检查

#defineB6_BWSCON  (DW32)位宽为32

把B1_BWSCON改为(DW16) B5_BWSCON改为(DW8)

 

根据HCLK设置SDRAM 的刷新参数,主要是REFCNT寄存器,开发板HCLK为100M

将 #defineREFCNT  0x1113 改为 #defineREFCNT 0x4f4

 

增加对S3C2440的支持,2440的时钟计算公式、NAND操作和2410不太一样。

对于2440开发板,将FCLK设为400MHz,分频比为FCLK:

HCLK:

PCLK=1:

4:

8。

 

修改board/TX2440/TX2440.c中的board_init函数

/*S3C2440:

Mpll,Upll=(2*m*Fin)/(p*2^s)

 *m=M(thevaluefordividerM)+8,p=P(thevaluefordividerP)+2

 */

#defineS3C2440_MPLL_400MHZ    ((0x7f<<12)|(0x02<<4)|(0x01))

#defineS3C2440_UPLL_48MHZ     ((0x38<<12)|(0x02<<4)|(0x02))

#defineS3C2440_CLKDIV         0x05   /*FCLK:

HCLK:

PCLK=1:

4:

8*/

 

/*S3C2410:

Mpll,Upll=(m*Fin)/(p*2^s)

 *m=M(thevaluefordividerM)+8,p=P(thevaluefordividerP)+2

 */

#defineS3C2410_MPLL_200MHZ    ((0x5c<<12)|(0x04<<4)|(0x00))

#defineS3C2410_UPLL_48MHZ     ((0x28<<12)|(0x01<<4)|(0x02))

#defineS3C2410_CLKDIV         0x03   /*FCLK:

HCLK:

PCLK=1:

2:

4*/

 

intboard_init(void)

{

   S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

   S3C24X0_GPIO*constgpio=S3C24X0_GetBase_GPIO();

 

   /*setuptheI/Oports*/

   gpio->GPACON=0x007FFFFF;

   gpio->GPBCON=0x00044555;

   gpio->GPBUP=0x000007FF;

   gpio->GPCCON=0xAAAAAAAA;

   gpio->GPCUP=0x0000FFFF;

   gpio->GPDCON=0xAAAAAAAA;

   gpio->GPDUP=0x0000FFFF;

   gpio->GPECON=0xAAAAAAAA;

   gpio->GPEUP=0x0000FFFF;

   gpio->GPFCON=0x000055AA;

   gpio->GPFUP=0x000000FF;

   gpio->GPGCON=0xFF95FFBA;

   gpio->GPGUP=0x0000FFFF;

   gpio->GPHCON=0x002AFAAA;

   gpio->GPHUP=0x000007FF;

   

   /*supportbothofS3C2410andS3C2440*/

   if((gpio->GSTATUS1==0x32410000)||(gpio->GSTATUS1==0x32410002))

   {

      /*FCLK:

HCLK:

PCLK=1:

2:

4*/

      clk_power->CLKDIVN=S3C2410_CLKDIV;

      

      /*changetoasynchronousbusmod*/

       __asm__(   "mrc   p15,0,r1,c1,c0,0\n"   /*readctrlregister  */ 

                   "orr   r1,r1,#0xc0000000\n"     /*Asynchronous        */ 

                   "mcr   p15,0,r1,c1,c0,0\n"   /*writectrlregister */ 

                   :

:

:

"r1"

                   );

                 

       /*toreducePLLlocktime,adjusttheLOCKTIMEregister*/

       clk_power->LOCKTIME=0xFFFFFF;

 

       /*configureMPLL*/

       clk_power->MPLLCON=S3C2410_MPLL_200MHZ;

 

       /*somedelaybetweenMPLLandUPLL*/

       delay(4000);

 

       /*configureUPLL*/

       clk_power->UPLLCON=S3C2410_UPLL_48MHZ;

 

       /*somedelaybetweenMPLLandUPLL*/

       delay(8000);

       

       /*archnumberofSMDK2410-Board*/

       gd->bd->bi_arch_number=MACH_TYPE_SMDK2410;

   }

   else

   {

      /*FCLK:

HCLK:

PCLK=1:

4:

8*/

       clk_power->CLKDIVN=S3C2440_CLKDIV;

 

       /*changetoasynchronousbusmod*/

       __asm__(   "mrc   p15,0,r1,c1,c0,0\n"   /*readctrlregister  */ 

                   "orr   r1,r1,#0xc0000000\n"     /*Asynchronous        */ 

                   "mcr   p15,0,r1,c1,c0,0\n"   /*writectrlregister */ 

                   :

:

:

"r1"

                   );

 

       /*toreducePLLlocktime,adjusttheLOCKTIMEregister*/

       clk_power->LOCKTIME=0xFFFFFF;

 

       /*configureMPLL*/

       clk_power->MPLLCON=S3C2440_MPLL_400MHZ;

 

       /*somedelaybetweenMPLLandUPLL*/

       delay(4000);

 

       /*configureUPLL*/

       clk_power->UPLLCON=S3C2440_UPLL_48MHZ;

 

       /*somedelaybetweenMPLLandUPLL*/

       delay(8000);

       

       /*archnumberofSMDK2440-Board*/

       gd->bd->bi_arch_number=MACH_TYPE_S3C2440;

   }

 

   /*adressofbootparameters*/

   gd->bd->bi_boot_params=0x30000100;

 

   icache_enable();

   dcache_enable();

 

   return0;

}

 

在cpu/arm920t/s3c24X0/speed.c中修改:

在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量

修改get_PLLCLK函数:

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;

 

   /*supportbothofS3C2410andS3C2440*/

   if(gd->bd->bi_arch_number==MACH_TYPE_SMDK2410)

      return((CONFIG_SYS_CLK_FREQ*m)/(p<

   else

       return((CONFIG_SYS_CLK_FREQ*m*2)/(p<

}

 

修改get_HCLK,get_PCLK:

/*fors3c2440*/

#defineS3C2440_CLKDIVN_PDIVN       (1<<0)

#defineS3C2440_CLKDIVN_HDIVN_MASK  (3<<1)

#defineS3C2440_CLKDIVN_HDIVN_1     (0<<1)

#defineS3C2440_CLKDIVN_HDIVN_2     (1<<1)

#defineS3C2440_CLKDIVN_HDIVN_4_8   (2<<1)

#defineS3C2440_CLKDIVN_HDIVN_3_6   (3<<1)

#defineS3C2440_CLKDIVN_UCLK        (1<<3)

 

#defineS3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)

#defineS3C2440_CAMDIVN_CAMCLK_SEL  (1<<4)

#defineS3C2440_CAMDIVN_HCLK3_HALF  (1<<8)

#defineS3C2440_CAMDIVN_HCLK4_HALF  (1<<9)

#defineS3C2440_CAMDIVN_DVSEN       (1<<12)

 

/*returnHCLKfrequency*/

ulongget_HCLK(void)

{

   S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

   unsignedlongclkdiv;

   unsignedlongcamdiv;

   inthdiv=1;

 

   /*supportbothofS3C2410andS3C2440*/

   if(gd->bd->bi_arch_number==MACH_TYPE_SMDK2410)

   return((clk_power->CLKDIVN&0x2)?

get_FCLK()/2:

get_FCLK());

   else

   {

       clkdiv=clk_power->CLKDIVN;

       camdiv=clk_power->CAMDIVN;

 

       /*workoutclockscalings*/

 

       switch(clkdiv&S3C2440_CLKDIVN_HDIVN_MASK){

       caseS3C2440_CLKDIVN_HDIVN_1:

           hdiv=1;

           break;

 

       caseS3C2440_CLKDIVN_HDIVN_2:

           hdiv=2;

           break;

 

       caseS3C2440_CLKDIVN_HDIVN_4_8:

           hdiv=(camdiv&S3C2440_CAMDIVN_HCLK4_HALF)?

8:

4;

           break;

 

       caseS3C2440_CLKDIVN_HDIVN_3_6:

           hdiv=(camdiv&S3C2440_CAMDIVN_HCLK3_HALF)?

6:

3;

           break;

       }

 

       returnget_FCLK()/hdiv;

   }

}

 

/*returnPCLKfrequency*/

ulongget_PCLK(void)

{

   S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

   unsignedlongclkdiv;

   unsignedlongcamdiv;

   inthdiv=1;

 

   /*supportbothofS3C2410andS3C2440*/

   if(gd->bd->bi_arch_number==MACH_TYPE_SMDK2410)

   return((clk_power->CLKDIVN&0x1)?

get_HCLK()/2:

get_HCLK());

   else

   {  

       clkdiv=clk_power->CLKDIVN;

       camdiv=clk_power->CAMDIVN;

 

       /*workoutclockscalings*/

 

       switch(clkdiv&S3C2440_CLKDIVN_HDIVN_MASK){

       caseS3C2440_CLKDIVN_HDIVN_1:

           hdiv=1;

           break;

 

       caseS3C2440_CLKDIVN_HDIVN_2:

           hdiv=2;

           break;

 

       caseS3C2440_CLKDIVN_HDIVN_4_8:

           hdiv=(camdiv&S3C2440_CAMDIVN_HCLK4_HALF)?

8:

4;

           break;

 

       caseS3C2440_CLKDIVN_HDIVN_3_6:

           hdiv=(camdiv&S3C2440_CAMDIVN_HCLK3_HALF)?

6:

3;

           break;

       }

 

       returnget_FCLK()/hdiv/((clkdiv&S3C2440_CLKDIVN_PDIVN)?

2:

1);

   }       

}

 

重新执行makeTX2440_config   makeall生成u-boot.bin,由于还没有增加NANDFlash的支持,所以可烧入NORFlash中运行

在makeall时会出现错误:

没有CAMDIVN

这个要在include/s3c24x0.h中定义,在129行S3C24X0_CLOCK_POWER结构体中增加:

S3C24X0_REG32   CAMDIVN;   /*fors3c2440*/

 

支持NANDFlash

首先在配置文件include/configs/TX2440.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND(大概在82行)

编译,出现nand.c的错误和警告

解决:

在include/configs/TX2440.h的最后面增加3个宏:

/*NANDflashsettings*/

#defineCFG_NAND_BASE       0     //无实际意义:

基地址,在board_nand_init中重新定义

#defineCFG_MAX_NAND_DEVICE    1  //NANDFlash设备数目为1

#defineNAND_MAX_CHIPS         1  //每个NAND设备由1个NADN芯片组成

修改配置文件后再编译,只有一个错误了“board_nand_init”函数未定义

 

board_nand_init需要自己编写,在cpu/arm920t/s3c24x0下新建nand_flash.c

编写之前,需要针对S3C2440NANDFlash定义一些数据结构和函数

在include/s3c24x0.h中增加S3C2440_NAND数据结构(168行)

/*NANDFLASH(seeS3C2440manualchapter6)*/

typedefstruct{

   S3C24X0_REG32NFCONF;

   S3C24X0_REG32NFCONT;

   S3C24X0_REG32NFCMD;

   S3C24X0_REG32NFADDR;

   S3C24X0_REG32NFDATA;

   S3C24X0_REG32NFMECCD0;

   S3C24X0_REG32NFMECCD1;

   S3C24X0_REG32NFSECCD;

   S3C24X0_REG32NFSTAT;

   S3C24X0_REG32NFESTAT0;

   S3C24X0_REG32NFESTAT1;

   S3C24X0_REG32NFMECC0;

   S3C24X0_REG32NFMECC1;

   S3C24X0_REG32NFSECC;

   S3C24X0_REG32NFSBLK;

   S3C24X0_REG32NFEBLK;

}/*__attribute__((__packed__))*/S3C2440_NAND;

 

在include/s3c

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

当前位置:首页 > 高等教育 > 文学

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

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