zoukankan      html  css  js  c++  java
  • Jlink下载u-boot

    由于各种原因我的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 flash4K代码copy到内部sram,并从sram 0x00000000地址开始执行。

    2、通过内部sram的前4K代码完成对nand flashu-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.bin0x0开始处

     

    3.设置pc0x00处使用命令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-bootnand里,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 
    View Code
  • 相关阅读:
    nginx不支持pathinfo模式解决方法
    php只保留两位小数
    分享图文到QQ空间
    android 使用信鸽推送通知栏不显示推送的通知?
    Editetext获取焦点后让输入软键盘中出现搜索按键
    Android EditText的使用过程中遇到的问题
    在线根据现有apk生成指定id的推广apk (已过时)
    @Validated和@Valid区别
    idea快捷键使用总结
    大概
  • 原文地址:https://www.cnblogs.com/stardream/p/8482726.html
Copyright © 2011-2022 走看看