uboot116的移植目标板TQ24401 编译测试.docx

上传人:b****6 文档编号:7308425 上传时间:2023-01-22 格式:DOCX 页数:11 大小:18.35KB
下载 相关 举报
uboot116的移植目标板TQ24401 编译测试.docx_第1页
第1页 / 共11页
uboot116的移植目标板TQ24401 编译测试.docx_第2页
第2页 / 共11页
uboot116的移植目标板TQ24401 编译测试.docx_第3页
第3页 / 共11页
uboot116的移植目标板TQ24401 编译测试.docx_第4页
第4页 / 共11页
uboot116的移植目标板TQ24401 编译测试.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

uboot116的移植目标板TQ24401 编译测试.docx

《uboot116的移植目标板TQ24401 编译测试.docx》由会员分享,可在线阅读,更多相关《uboot116的移植目标板TQ24401 编译测试.docx(11页珍藏版)》请在冰豆网上搜索。

uboot116的移植目标板TQ24401 编译测试.docx

uboot116的移植目标板TQ24401编译测试

u-boot1.1.6的移植(目标板TQ2440)1编译测试

Linux内核2009-12-1501:

18:

50阅读146评论0  字号:

大中小 订阅

    如何将u-booot1.1.6从smdk2410移植到tq2440目标板?

阅读了天嵌公司的tq2440开发板u-boot代码,以下是我的总结。

    为实践需要,另起自己的目标板名字,故用jzy2440替代tq2440。

 蓝色的为修改部分,红色为jzy23注释。

(一)编译测试

1. /board目录下

(1). 将smdk2410目录复制为jzy2440目录。

(2).将jzy2440目录下的Makefile中的COBJS改为:

COBJS:

=jzy2440.oflash.o

 

2./include/configs目录下

 将smdk2410.h复制为jzy2440.h。

 

3.修改顶层Makefile

 增加:

 jzy2440_config:

   unconfig

         @$(MKCONFIG)$(@:

_config=)armarm920tjzy2440NULLs3c24X0

    这两句的含义,可参见韦东山编著的《嵌入式Linux应用开发完全手册》的bootloader部分--第15章,第249页u-boot配置过程。

4.使用支持softfloat的交叉编译器:

crosstools_3.4.1_soft(光盘附带)。

5.编译测试

 配置

 makejzy2440_config

编译:

 make

  具体u-boot编译,连接过程参看韦东山《嵌入式Linux应用开发完全手册》第254页。

6.清除上次编译的结果:

makemrproper

u-boot1.1.6的移植(目标板TQ2440)4.lds设置

Linux内核2009-12-1501:

17:

34阅读43评论0  字号:

大中小 订阅

 (四).lds文件设置

      注:

蓝色部分为修改或者改动部分,红色部分为jzy23注解。

在board/jzy2440/u-boot.lds里修改:

SECTIONS

{

 .=0x00000000;

 .=ALIGN(4);

 .text     :

 {

  cpu/arm920t/start.o (.text)

         board/jzy2440/boot_init.o(.text)  //添加这句

  *(.text)

 }

 .=ALIGN(4);

 .rodata:

{*(.rodata)}

 .=ALIGN(4);

 .data:

{*(.data)}

 .=ALIGN(4);

 .got:

{*(.got)}

 .=.;

 __u_boot_cmd_start=.;

 .u_boot_cmd:

{*(.u_boot_cmd)}

 __u_boot_cmd_end=.;

 .=ALIGN(4);

 __bss_start=.;

 .bss:

{*(.bss)}

 _end=.;

}

u-boot1.1.6的移植(目标板TQ2440)5代码重定向

Linux内核2009-12-1501:

15:

55阅读81评论0  字号:

大中小 订阅

(五)代码重定向

  注:

蓝色部分为修改或者改动部分,红色部分为jzy23注解。

 1.  start.S里修改:

#ifndefCONFIG_SKIP_RELOCATE_UBOOT     

relocate:

    /*relocateU-BoottoRAM    */

 adr r0,_start  /*r0<-currentpositionofcode(r0=0) */

 ldr r1,_TEXT_BASE  /*testifwerunfromflashorRAM(r1=0x33f80000*/

 cmp    r0,r1                 /*don'trelocduringdebug        */

 beq    clear_bss              /*(原来为stack_setup)*/

 ldr r2,_armboot_start     /*(r2为_start的地址=0x3ff80000)*/

 ldr r3,_bss_start         /*(在连接文件中定义)*/

 sub r2,r3,r2  

#if1  /*(增加)*/

 bl CopyCode2Ram /*r0:

source,r1:

dest,r2:

size*/ 

                                    /*(跳转到CopyCode2Ram函数)*/

#else

 add r2,r0,r2  //r2<-sourceendaddress        */

copy_loop:

 ldmia r0!

{r3-r10}  //copyfromsourceaddress[r0]   */

 stmia r1!

{r3-r10}  //copyto  targetaddress[r1]   */

 cmp r0,r2   //untilsourceendaddreee[r2]   */

 ble copy_loop

#endif

#endif //CONFIG_SKIP_RELOCATE_UBOOT*/

 

2.在board/jzy2440/boot_init.c中与CopyCode2Ram()相关的函数与定义如下:

#include

#include

#defineGSTATUS1       (*(volatileunsignedint*)0x560000B0)

#defineBUSY           1

//供外部调用的函数*/

voidnand_init_ll(void);

intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize);

//NANDFlash操作的总入口,它们将调用S3C2410或S3C2440的相应函数*/

staticvoidnand_reset(void);

staticvoidwait_idle(void);

staticvoidnand_select_chip(void);

staticvoidnand_deselect_chip(void);

staticvoidwrite_cmd(intcmd);

staticvoidwrite_addr(unsignedintaddr);

staticunsignedcharread_data(void);

//S3C2410的NANDFlash处理函数*/

staticvoids3c2410_nand_reset(void);

staticvoids3c2410_wait_idle(void);

staticvoids3c2410_nand_select_chip(void);

staticvoids3c2410_nand_deselect_chip(void);

staticvoids3c2410_write_cmd(intcmd);

staticvoids3c2410_write_addr(unsignedintaddr);

staticunsignedchars3c2410_read_data(void);

//S3C2440的NANDFlash处理函数*/

staticvoids3c2440_nand_reset(void);

staticvoids3c2440_wait_idle(void);

staticvoids3c2440_nand_select_chip(void);

staticvoids3c2440_nand_deselect_chip(void);

staticvoids3c2440_write_cmd(intcmd);

staticvoids3c2440_write_addr(unsignedintaddr);

staticunsignedchars3c2440_read_data(void);

//S3C2410的NANDFlash操作函数*/

//复位*/

staticvoids3c2410_nand_reset(void)

{

   s3c2410_nand_select_chip();

   s3c2410_write_cmd(0xff); //复位命令

   s3c2410_wait_idle();

   s3c2410_nand_deselect_chip();

}

//等待NANDFlash就绪*/

staticvoids3c2410_wait_idle(void)

{

   inti;

 S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;

 

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFSTAT;

   while(!

(*p&BUSY))

       for(i=0;i<10;i++);

}

// 发出片选信号*/

staticvoids3c2410_nand_select_chip(void)

{

   inti;

 S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;

   s3c2410nand->NFCONF&=~(1<<11);

   for(i=0;i<10;i++);   

}

//取消片选信号*/

staticvoids3c2410_nand_deselect_chip(void)

{

 S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;

   s3c2410nand->NFCONF|=(1<<11);

}

//发出命令*/

staticvoids3c2410_write_cmd(intcmd)

{

 S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFCMD;

   *p=cmd;

}

//发出地址*/

staticvoids3c2410_write_addr(unsignedintaddr)

{

   inti;

 S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFADDR;

   

   *p=addr&0xff;

   for(i=0;i<10;i++);

   *p=(addr>>9)&0xff;

   for(i=0;i<10;i++);

   *p=(addr>>17)&0xff;

   for(i=0;i<10;i++);

   *p=(addr>>25)&0xff;

   for(i=0;i<10;i++);

}

//读取数据*/

staticunsignedchars3c2410_read_data(void)

{

 S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFDATA;

   return*p;

}

//S3C2440的NANDFlash操作函数*/

//复位*/

staticvoids3c2440_nand_reset(void)

{

   s3c2440_nand_select_chip();

   s3c2440_write_cmd(0xff); //复位命令

   s3c2440_wait_idle();

   s3c2440_nand_deselect_chip();

}

//等待NANDFlash就绪*/

staticvoids3c2440_wait_idle(void)

{

   inti;

 S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFSTAT;

   while(!

(*p&BUSY))

       for(i=0;i<10;i++);

}

// 发出片选信号*/

staticvoids3c2440_nand_select_chip(void)

{

   inti;

 S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;

   s3c2440nand->NFCONT&=~(1<<1);

   for(i=0;i<10;i++);   

}

//取消片选信号*/

staticvoids3c2440_nand_deselect_chip(void)

{

 S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;

   s3c2440nand->NFCONT|=(1<<1);

}

//发出命令*/

staticvoids3c2440_write_cmd(intcmd)

{

 S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFCMD;

   *p=cmd;

}

//发出地址*/

staticvoids3c2440_write_addr(unsignedintaddr)

{

   inti;

 S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFADDR;

   

   *p=addr&0xff;

   for(i=0;i<10;i++);

   *p=(addr>>9)&0xff;*/(不是8!

)*/

   for(i=0;i<10;i++);

   *p=(addr>>17)&0xff;

   for(i=0;i<10;i++);

   *p=(addr>>25)&0xff;

   for(i=0;i<10;i++);

}

//读取数据*/

staticunsignedchars3c2440_read_data(void)

{

 S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;

   volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFDATA;

   return*p;

}

//在第一次使用NANDFlash前,复位一下NANDFlash*/

staticvoidnand_reset(void)

{

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

 {

    s3c2410_nand_reset();

 }

 else

 {

    s3c2440_nand_reset();

 }

}

staticvoidwait_idle(void)

{

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

 {

    s3c2410_wait_idle();

 }

 else

 {

    s3c2440_wait_idle();

 }

}

staticvoidnand_select_chip(void)

{

   inti;

 

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

 {

    s3c2410_nand_select_chip();

 }

 else

 {

    s3c2440_nand_select_chip();

 }

 

   for(i=0;i<10;i++);

}

staticvoidnand_deselect_chip(void)

{

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

 {

    s3c2410_nand_deselect_chip();

 }

 else

 {

    s3c2440_nand_deselect_chip();

 } 

}

staticvoidwrite_cmd(intcmd)

{

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

 {

    s3c2410_write_cmd(cmd);

 }

 else

 {

    s3c2440_write_cmd(cmd);

 } 

}

staticvoidwrite_addr(unsignedintaddr)

{

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

 {

    s3c2410_write_addr(addr);

 }

 else

 {

    s3c2440_write_addr(addr);

 } 

}

staticunsignedcharread_data(void)

{

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

 {

    returns3c2410_read_data();

 }

 else

 {

    returns3c2440_read_data();

 } 

}

//初始化NANDFlash*/

voidnand_init_ll(void)

{

 S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;

 S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;

#defineTACLS  0

#defineTWRPH0 3

#defineTWRPH1 0

   //判断是S3C2410还是S3C2440*/

   if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))

   {

  //使能NANDFlash控制器,初始化ECC,禁止片选,设置时序*/

       s3c2410nand->NFCONF=(1<<15)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);

   }

   else

   {

  //设置时序*/

       s3c2440nand->NFCONF=(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);

       

       s3c2440nand->NFCONT=(1<<4)|(1<<1)|(1<<0);

   }

 //复位NANDFlash*/

 nand_reset();

}

#defineNAND_SECTOR_SIZE   512

#defineNAND_BLOCK_MASK    (NAND_SECTOR_SIZE-1)

//读函数*/

intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize)

{

   inti,j;

   

   if((start_addr&NAND_BLOCK_MASK)||(size&NAND_BLOCK_MASK)){

       return;   

   }

   //选中芯片*/

   nand_select_chip();

   for(i=start_addr;i<(start_addr+size);){

     //发出READ0命令*/

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

当前位置:首页 > 职业教育 > 其它

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

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