友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(二)
友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(二)
zhaowei09 发表于2年前
友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(二)
  • 发表于 2年前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

原本四天前就写了这篇博文,奈何ibus输入法默认鼠标左键选中之后删除,好好的一篇博文就这样没了。调整了几天郁闷的心情之后,继续记录u-boot 1.1.6的移植过程。

接上一篇,本文主要介绍以下内容:

  • 存储相关的board/mini2440/lowlevel_init.S文件移植

  • BWSCON寄存器

根据mini2440原理图,Bank0接NOR(NAND启动状态下不可见),Bank3无外设,Bank4连接DM9000EP,BANK6接SDRAM,因此需要对BWSCON寄存器进行修改。

原代码:

#define B1_BWSCON          (DW32)
#define B2_BWSCON          (DW16)
#define B3_BWSCON          (DW16 + WAIT + UBLB)
#define B4_BWSCON          (DW16)
#define B5_BWSCON          (DW16)
#define B6_BWSCON          (DW32)
#define B7_BWSCON          (DW32)

更改后:

#define B0_BWSCON	  	(DW16)			/* NOR flash */
#define B1_BWSCON	  	0x0
#define B2_BWSCON	  	0x0
#define B3_BWSCON	  	0x0
#define B4_BWSCON	  	(DW16 + WAIT + UBLB)	/* DM9000 */
#define B5_BWSCON	  	0x0
#define B6_BWSCON	  	(DW32)			/* SDRAM */
#define B7_BWSCON	  	(DW32)
  • BANK4CON寄存器

BANK3CON寄存器可以保持不便,但由于BANK4外接DM9000EP,寄存器BANK4CON应作如下修改。具体数值将在今后DM9000网卡移植中作详细解释,这里只给出结论。

原代码:

#define B4_Tacs		 	0x0	/*  0clk */
#define B4_Tcos		 	0x0	/*  0clk */
#define B4_Tacc		 	0x7	/* 14clk */
#define B4_Tcoh		 	0x0	/*  0clk */
#define B4_Tah		 	0x0	/*  0clk */
#define B4_Tacp		 	0x0
#define B4_PMC		 	0x0	/* normal */

更改后:

#define B4_Tacs		 	0x0	/*  0clk */
#define B4_Tcos		 	0x3	/*  4clk */
#define B4_Tacc		 	0x7	/* 14clk */
#define B4_Tcoh		 	0x1	/*  1clk */
#define B4_Tah		 	0x3	/*  4clk */
#define B4_Tacp		 	0x3	/*  6clk */
#define B4_PMC		 	0x0	/* normal */
  • REFRESH寄存器

REFRESH寄存器用于设置SDRAM的自刷新速率。根据原理图,mini2440的BANK6外接两片并联的EM63A165TS-6G型SDRAM。EM63A165TS-6G的产品手册表明其最高自刷新率可以为133MHz。根据前一篇博文,HCLK=100MHz,因此应有如下修改:

原代码:

#define REFEN		 	0x1	/* Refresh enable */
#define TREFMD		 	0x0	/* CBR(CAS before RAS)/Auto refresh */
#define Trp		 	0x0	/* 2clk */
#define Trc		 	0x3	/* 7clk */
#define Tchr		 	0x2	/* 3clk */
#define REFCNT		 	1113	/* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */

更改后:

#define REFEN		 	0x1	/* Refresh enable */
#define TREFMD		 	0x0	/* CBR(CAS before RAS)/Auto refresh */
#define Trp		 	0x0	/* 2clk */
#define Trc		 	0x3	/* 7clk */
#define REFCNT		 	0x4F4	/* period=7.8125us, HCLK=100MHz, (2048+1-7.8125*100) */

当然,作裸机程序时,博主也设置过133MHz的情况,一切运行正常。

  • BANKSIZE寄存器

BANKSIZE寄存器的设置在《嵌入式Linux应用开发完全手册》中有详细介绍,应改为0xB1,这里不作过多解释。

原代码:

SMRDATA:
    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x32
    .word 0x30
    .word 0x30

修改后:

SMRDATA:
    .word ((B0_BWSCON)+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+REFCNT)
    .word 0xB1
    .word 0x30
    .word 0x30
  • 添加空函数

博主采用arm-none-linux-gnueabi进行编译,但是u-boot 1.1.6默认并不兼容此编译器。随着移植过程,编译器会报错,显示不支持raise()和__aeabi_unwind_cpp_pr0()这两个函数。

认真的程序员可能会发现,编译过程中编译器只是需要寻找这两个函数并且编译进目标文件,但是并没有任何地方对其进行调用,因此最好的解决办法是不要修改编译器,而是在u-boot 1.1.6中添加如下两个空函数。博主将这两个函数添加在lowlevel_init.S文件末尾,如下:

/*add empty raise()*/
.globl raise
raise:
    nop
    mov pc, lr

/*add empty __aeabi_unwind_cpp_pr0()*/
.globl __aeabi_unwind_cpp_pr0
__aeabi_unwind_cpp_pr0:
    nop
    mov pc, lr

原计划本篇博文同时记录nandread_ll.c文件的编写,但最近有点忙,先写到这里,下次再记录吧。。

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 7
码字总数 45754
×
zhaowei09
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: