原本四天前就写了这篇博文,奈何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文件的编写,但最近有点忙,先写到这里,下次再记录吧。。