由于各种原因我的fl2440无启动代码,无任何程序,这时要通过jlink来烧录相关boot程序。

准备工作:

1、Jlink使用jlink commander工具

2、初始化sdram的程序boot.bin

3、运行SDRAM的程序或者bootloader 这里使用u-boot_sdram.bin(至少包含nand擦写烧录和程序加载)

4、正常的u-boot程序u-boot.bin(这里使用的是u-boot-2013.10的版本,这个版本之后的相关配置使用了linux一样配置方法,功能差不多)

Bootloader(u-boot)设计启动原理步骤:

1、由于fl2440-I 只提供了nand flash启动,因此cpu启动是本身会把nand flash前4K代码copy到内部sram,并从sram 的0x00000000地址开始执行。

2、通过内部sram的前4K代码完成对nand flash里u-boot程序的读取,并设置pc跳转到正常的u-boot运行。(在编写正常u-boot时要确保前4k代码能正常,即使用位置无关的代码,函数调用bl等)

3、在u-boot里对相关内核参数设置或者维护操作处理。

BootLoader启动原理知道后,就应该知道内部4k sram必须要有启动代码。现在板子是白片,所以要用jlink给内部sram烧录程序。

步骤如下:

1.连接后打开j-link commander,第一次键入connect命令之后一直按enter键确定到正常模式

Jlink下载u-boot-LMLPHP

2.使用loadbin命令下载boot.bin到0x0开始处

Jlink下载u-boot-LMLPHP

3.设置pc到0x00处使用命令setpc  0,使用g命令开始运行程序

Jlink下载u-boot-LMLPHP

4.因为我的boot.bin里初始化了sdram为后期烧录u-boot_sdram.bin使用。在这里我点亮了一个灯方便调试。使用halt命令将cpu停掉。并使用loadbin命令将u-boot_sdram.bin烧录到0x32000000处。最后跳转到0x32000000处运行u-boot进行下一步操作。

这个u-boot_sdram.bin实现了nand flash的烧写和串口的通讯并且定位到0x32000000

Jlink下载u-boot-LMLPHP

5.进入u-boot程序截图如下:

Jlink下载u-boot-LMLPHP

6.在u-boot下使用loady 31000000命令超级终端的ymodem协议把程序加载到sdram这里我加载到0x31000000,注意不要覆盖你sdram里面的u-boot

Jlink下载u-boot-LMLPHP

7.使用命令nand erase 0 10000 擦除nand,和命令nand write 31000000 0 10000烧录自己的u-boot到nand里,reset命令即可进入新的u-boot的。此后nand里面就有相关的u-boot程序了。

Jlink下载u-boot-LMLPHP

8.新的u-boot如下:

Jlink下载u-boot-LMLPHP

其中boot.bin的程序如下使用汇编处理 u-boot_sdram.bin以附件给出https://files.cnblogs.com/files/stardream/boot_u-boot_sdram_bin.7z。

只针对fl2440

 @start.s

 .equ WTCON,     0x53000000

 .equ BWSCON,    0x48000000

 .equ CLKDIVN,   0x4c000014

 .equ MPLLCON,   0x4c000004

 .equ GPBCON,    0x56000010

 .equ GPBDAT,    0x56000014

 .text

 .global _start

 _start:

     bl close_watch_dog

     bl set_clock

     bl init_sdram

     ldr sp, =0x32000000

     ldr lr, =loop_halt          @设置返回地址

 loop_halt:

     b loop_halt

 close_watch_dog:

     ldr r0, =WTCON

     mov r1, #

     str r1, [r0]

     mov pc, lr

 set_clock:

     ldr r0, =CLKDIVN

     mov r1, #0x05   // FCLK:HCLK:PCLK=::, HDIVN=,PDIVN=

     str r1, [r0]

     mrc p15, , r1, c1, c0,         /* 读出控制寄存器*/

     orr r1, r1, #0xc0000000          /* 设置为“asynchronous bus mode?*/

     mcr p15, , r1, c1, c0,         /* 写入控制寄存器*/

     ldr r0, =MPLLCON

     ldr r1, =((0x5c<<)|(0x01<<)|(0x01))  //MPLL_400MHZ

     str r1, [r0]

     /* 启动ICACHE */

     mrc p15, , r0, c1, c0,    @ read control reg

     orr r0, r0, #(<<)

     mcr p15, , r0, c1, c0,    @ write it back

     mov pc, lr

 init_sdram:

     /*gpiob */

 ldr r0, =GPBCON

     mov r1, #0x00

 bic r1,r1, #((<<) | (<<))

 orr r1,r1, #((<<) | (<<))

     str r1, [r0]

 ldr r0, =GPBDAT

     mov r1, #0x00

 bic r1,r1, #(<<)

     str r1, [r0]

     /* 如果程序在sdram里,那么就不初始化了 */

     adr r0, _start

     ldr r1, =0x30000000

     cmp r0, r1

     beq 2f

     mov r0,#BWSCON

     adrl r1,mem_cfg_val

                             @STr [r1],[r0],#

     mov r4, #

 :

     ldr r3, [r1], #

     str r3, [r0], #

     add r4, #

     cmp r4, #

     bne 1b

 :

 ldr r0, =GPBDAT

     mov r1, #0x00

 bic r1,r1, #(<<)

     str r1, [r0]

     b .   @stop here

     mov pc, lr

 .align

 mem_cfg_val:

     @ 存储控制器13个寄存器的设置值

     .long   0x22011110      @ BWSCON

     .long   0x00000700      @ BANKCON0

     .long   0x00000700      @ BANKCON1

     .long   0x00000700      @ BANKCON2

     .long   0x00000700      @ BANKCON3

     .long   0x00000700      @ BANKCON4

     .long   0x00000700      @ BANKCON5

     .long   0x00018005      @ BANKCON6

     .long   0x00018005      @ BANKCON7

     .long   0x008C07A3      @ rEFrESH

     .long   0x000000B1      @ BANKSIZE

     .long   0x00000030      @ MrSrB6

     .long   0x00000030      @ MrSrB7 
05-11 23:01