由于各种原因我的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键确定到正常模式
2.使用loadbin命令下载boot.bin到0x0开始处
3.设置pc到0x00处使用命令setpc 0,使用g命令开始运行程序
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
5.进入u-boot程序截图如下:
6.在u-boot下使用loady 31000000命令超级终端的ymodem协议把程序加载到sdram这里我加载到0x31000000,注意不要覆盖你sdram里面的u-boot
7.使用命令nand erase 0 10000 擦除nand,和命令nand write 31000000 0 10000烧录自己的u-boot到nand里,reset命令即可进入新的u-boot的。此后nand里面就有相关的u-boot程序了。
8.新的u-boot如下:
其中boot.bin的程序如下使用汇编处理 u-boot_sdram.bin以附件给出https://files.cnblogs.com/files/stardream/boot_u-boot_sdram_bin.7z。
只针对fl2440
1 @start.s 2 3 .equ WTCON, 0x53000000 4 5 .equ BWSCON, 0x48000000 6 7 .equ CLKDIVN, 0x4c000014 8 9 .equ MPLLCON, 0x4c000004 10 11 .equ GPBCON, 0x56000010 12 13 .equ GPBDAT, 0x56000014 14 15 16 17 .text 18 19 .global _start 20 21 _start: 22 23 bl close_watch_dog 24 25 bl set_clock 26 27 bl init_sdram 28 29 ldr sp, =0x32000000 30 31 ldr lr, =loop_halt @设置返回地址 32 33 34 35 loop_halt: 36 37 b loop_halt 38 39 40 41 close_watch_dog: 42 43 ldr r0, =WTCON 44 45 mov r1, #0 46 47 str r1, [r0] 48 49 mov pc, lr 50 51 52 53 set_clock: 54 55 ldr r0, =CLKDIVN 56 57 mov r1, #0x05 // FCLK:HCLK:PCLK=1:4:8, HDIVN=2,PDIVN=1 58 59 str r1, [r0] 60 61 62 63 mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器*/ 64 65 orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode?*/ 66 67 mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器*/ 68 69 70 71 ldr r0, =MPLLCON 72 73 ldr r1, =((0x5c<<12)|(0x01<<4)|(0x01)) //MPLL_400MHZ 74 75 str r1, [r0] 76 77 78 79 /* 启动ICACHE */ 80 81 mrc p15, 0, r0, c1, c0, 0 @ read control reg 82 83 orr r0, r0, #(1<<12) 84 85 mcr p15, 0, r0, c1, c0, 0 @ write it back 86 87 88 89 mov pc, lr 90 91 92 93 init_sdram: 94 95 96 97 /*gpiob 5*/ 98 99 ldr r0, =GPBCON 100 101 mov r1, #0x00 102 103 bic r1,r1, #((3<<10) | (3<<12)) 104 105 orr r1,r1, #((1<<10) | (1<<12)) 106 107 str r1, [r0] 108 109 110 111 ldr r0, =GPBDAT 112 113 mov r1, #0x00 114 115 bic r1,r1, #(1<<5) 116 117 str r1, [r0] 118 119 120 121 /* 如果程序在sdram里,那么就不初始化了 */ 122 123 adr r0, _start 124 125 ldr r1, =0x30000000 126 127 cmp r0, r1 128 129 beq 2f 130 131 132 133 mov r0,#BWSCON 134 135 adrl r1,mem_cfg_val 136 137 @STr [r1],[r0],#4 138 139 mov r4, #0 140 141 1: 142 143 ldr r3, [r1], #4 144 145 str r3, [r0], #4 146 147 add r4, #1 148 149 cmp r4, #13 150 151 bne 1b 152 153 2: 154 155 ldr r0, =GPBDAT 156 157 mov r1, #0x00 158 159 bic r1,r1, #(1<<6) 160 161 str r1, [r0] 162 163 b . @stop here 164 165 mov pc, lr 166 167 168 169 .align 4 170 171 mem_cfg_val: 172 173 @ 存储控制器13个寄存器的设置值 174 175 .long 0x22011110 @ BWSCON 176 177 .long 0x00000700 @ BANKCON0 178 179 .long 0x00000700 @ BANKCON1 180 181 .long 0x00000700 @ BANKCON2 182 183 .long 0x00000700 @ BANKCON3 184 185 .long 0x00000700 @ BANKCON4 186 187 .long 0x00000700 @ BANKCON5 188 189 .long 0x00018005 @ BANKCON6 190 191 .long 0x00018005 @ BANKCON7 192 193 .long 0x008C07A3 @ rEFrESH 194 195 .long 0x000000B1 @ BANKSIZE 196 197 .long 0x00000030 @ MrSrB6 198 199 .long 0x00000030 @ MrSrB7