天嵌 ARM开发社区

 找回密码
 注册
查看: 4360|回复: 7

编译好的UBOOT要支持从NANDFLASH启动

[复制链接]
大墩子 发表于 2012-12-12 02:27:52 | 显示全部楼层 |阅读模式
编译好的UBOOT要测试支持从NANDFLASH启动,可以从NORFLASH的菜单里  按1指令把自己做的UBOOT下到NANDFLASH,然后再把开关打到NAND上 然后 按重启键吗?
---------------------------------------

请问我这样的方法是否可行,还是必须用JTAG 烧写, 编译的UBOOT 内存里运行都可以,做到支持NANDFLASH启动的时候 就不行了,我这样做有没有问题
embedsky_lhh 发表于 2012-12-12 09:01:38 | 显示全部楼层
你这样操作也可以,但是在内存里能运行,不一定从nand能启动,因为nand启动有个copy的过程
 楼主| 大墩子 发表于 2012-12-12 14:33:58 | 显示全部楼层
embedsky_lhh 发表于 2012-12-12 09:01
你这样操作也可以,但是在内存里能运行,不一定从nand能启动,因为nand启动有个copy的过程

您好 内存里我测试了能运行的 但是在光盘里运行的时候 有一个COPY程序 我也添加了,完成以后  然后用NOR下的UBOOT的第一个指令 DOWNLOAD  uboot 到NANDFLASH里 然后重启 发现就不行了还有 cpu_init_crit, 我在移植的时候  没屏蔽
embedsky_lhh 发表于 2012-12-12 16:26:15 | 显示全部楼层
大墩子 发表于 2012-12-12 14:33
您好 内存里我测试了能运行的 但是在光盘里运行的时候 有一个COPY程序 我也添加了,完成以后  然后用NOR下 ...

加个LED调试下
 楼主| 大墩子 发表于 2012-12-13 00:34:55 | 显示全部楼层
embedsky_lhh 发表于 2012-12-12 16:26
加个LED调试下

按照斑竹的想法 我在START.每一步都加了电灯程序,但是到跳转start_armboot之后的灯就不亮了,后面的C语言程序 ,我都是按照1.16移植到TQ2440手册上复制的代码,不知为何,下面是我的START.s代码
应该不会有错吧
-------------------------------------------

/*
*  armboot - Startup Code for ARM920 CPU-core
*
*  Copyright (c) 2001        Marius Gr榘僥r <mag@sysgo.de>
*  Copyright (c) 2002        Alex Z榛砶e <azu@sysgo.de>
*  Copyright (c) 2002        Gary Jennejohn <gj@denx.de>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/

 楼主| 大墩子 发表于 2012-12-13 00:36:46 | 显示全部楼层
#include <config.h>
#include <version.h>
/*#if defined (CONFIG_S3C2440)
#define GPBCON 0X56000010
#define GPBDAT 0X56000014
#define GPBUP 0X56000018
ldr r2 ,=0X7ff
ldr r1,=GPBUP
str r2,[r1]
ldr r2 ,=0X15400
ldr r1,=GPBCON
str r2,[r1]
ldr r2 ,=0X1D0
ldr r1,=GPBDAT
str r2,[r1]
#endif
*/
.globl _start
_start:        b       reset
        ldr        pc, _undefined_instruction
        ldr        pc, _software_interrupt
        ldr        pc, _prefetch_abort
        ldr        pc, _data_abort
        ldr        pc, _not_used
        ldr        pc, _irq
        ldr        pc, _fiq

_undefined_instruction:        .word undefined_instruction
_software_interrupt:        .word software_interrupt
_prefetch_abort:        .word prefetch_abort
_data_abort:                .word data_abort
_not_used:                .word not_used
_irq:                        .word irq
_fiq:                        .word fiq

        .balignl 16,0xdeadbeef


/*
*************************************************************************
*
* Startup Code (reset vector)
*
* do important init only if we don't start from memory!
* relocate armboot to ram
* setup stack
* jump to second stage
*
*************************************************************************
*/

_TEXT_BASE:
        .word        TEXT_BASE

.globl _armboot_start
_armboot_start:
        .word _start

/*
* These are defined in the board-specific linker script.
*/
.globl _bss_start
_bss_start:
        .word __bss_start

.globl _bss_end
_bss_end:
        .word _end

.globl FREE_RAM_END
FREE_RAM_END:
        .word        0x0badc0de

.globl FREE_RAM_SIZE
FREE_RAM_SIZE:
        .word        0x0badc0de

#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
        .word        0x0badc0de

/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
        .word 0x0badc0de
#endif


/*
* the actual reset code
*/

reset:
        /*
         * set the cpu to SVC32 mode
         */
        mrs        r0,cpsr
        bic        r0,r0,#0x1f
        orr        r0,r0,#0xd3
        msr        cpsr,r0

/* turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON                0x15300000
# define INTMSK                0x14400008        /* Interupt-Controller base addresses */
# define CLKDIVN        0x14800014        /* clock divisor register */
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
# define pWTCON                0x53000000
# define INTMOD                0X4A000004
# define INTMSK                0x4A000008        /* Interupt-Controller base addresses */
# define INTSUBMSK        0x4A00001C
# define CLKDIVN        0x4C000014        /* clock divisor register */
#endif

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
        ldr     r0, =pWTCON
        mov     r1, #0x0
        str     r1, [r0]

        /*
         * mask all IRQs by setting all bits in the INTMR - default
         */
        mov        r1, #0xffffffff
        ldr        r0, =INTMSK
        str        r1, [r0]
#if defined(CONFIG_S3C2410)
        ldr        r1, =0x3ff
        ldr        r0, =INTSUBMSK
        str        r1, [r0]
#elif defined(CONFIG_S3C2440)
        ldr        r1, =0x7fff
        ldr        r0, =INTSUBMSK
        str        r1, [r0]
#endif

#if 0
        /* FCLK:HCLK:PCLK = 1:2:4 */
        /* default FCLK is 120 MHz ! */
        ldr        r0, =CLKDIVN
        mov        r1, #3
        str        r1, [r0]
#endif
#endif        /* CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440 */

        /*
         * we do sys-critical inits only at reboot,
         * not when booting from ram!
         */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
        bl        cpu_init_crit
#endif

        /* Set up the stack                                                    */
stack_setup:
        ldr        r0, _TEXT_BASE                /* upper 128 KiB: relocated uboot   */
        sub        r0, r0, #CFG_MALLOC_LEN        /* malloc area                      */
        sub        r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */

#ifdef CONFIG_USE_IRQ
        sub        r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
        sub        sp, r0, #12                /* leave 3 words for abort-stack    */

        bl clock_init

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:                                /* relocate U-Boot to RAM            */
        adr        r0, _start                /* r0 <- current position of code   */
        ldr        r1, _TEXT_BASE                /* test if we run from flash or RAM */
        cmp     r0, r1                  /* don't reloc during debug         */
        beq     clear_bss

        ldr        r2, _armboot_start
        ldr        r3, _bss_start
        sub        r2, r3, r2                /* r2 <- size of armboot            */
#if 1
        bl  CopyCode2Ram                /* r0: source, r1: dest, r2: size */

#else
        add        r2, r0, r2                /* r2 <- source end address         */

copy_loop:
        ldmia        r0!, {r3-r10}                /* copy from source address [r0]    */
        stmia        r1!, {r3-r10}                /* copy to   target address [r1]    */
        cmp        r0, r2                        /* until source end addreee [r2]    */
        ble        copy_loop
#endif
#endif        /* CONFIG_SKIP_RELOCATE_UBOOT */

#if 0
        /* try doing this stuff after the relocation */
        ldr     r0, =pWTCON
        mov     r1, #0x0
        str     r1, [r0]

        /*
         * mask all IRQs by setting all bits in the INTMR - default
         */
        mov        r1, #0xffffffff
        ldr        r0, =INTMR
        str        r1, [r0]

        /* FCLK:HCLK:PCLK = 1:2:4 */
        /* default FCLK is 120 MHz ! */
        ldr        r0, =CLKDIVN
        mov        r1, #3
        str        r1, [r0]
        /* END stuff after relocation */
#endif
clear_bss:
        ldr        r0, _bss_start                /* find start of bss segment        */
        ldr        r1, _bss_end                /* stop here                        */
        mov         r2, #0x00000000                /* clear                            */

clbss_l:str        r2, [r0]                /* clear loop...                    */
        add        r0, r0, #4
        cmp        r0, r1
        ble        clbss_l
#if defined (CONFIG_S3C2440)
#define GPBCON 0X56000010
#define GPBDAT 0X56000014
#define GPBUP 0X56000018
ldr r2 ,=0X7ff
ldr r1,=GPBUP
str r2,[r1]
ldr r2 ,=0X15400
ldr r1,=GPBCON
str r2,[r1]
ldr r2 ,=0X1D0
ldr r1,=GPBDAT
str r2,[r1]
#endif


ldr        pc, _start_armboot
_start_armboot:        .word start_armboot
       

/*
*************************************************************************
*
* CPU_init_critical registers
*
* setup important registers
* setup memory timing
*
*************************************************************************
*/


#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
        /*
         * flush v4 I/D caches
         */
        mov        r0, #0
        mcr        p15, 0, r0, c7, c7, 0        /* flush v3/v4 cache */
        mcr        p15, 0, r0, c8, c7, 0        /* flush v4 TLB */

        /*
         * disable MMU stuff and caches
         */
        mrc        p15, 0, r0, c1, c0, 0
        bic        r0, r0, #0x00002300        @ clear bits 13, 9:8 (--V- --RS)
        bic        r0, r0, #0x00000087        @ clear bits 7, 2:0 (B--- -CAM)
        orr        r0, r0, #0x00000002        @ set bit 2 (A) Align
        orr        r0, r0, #0x00001000        @ set bit 12 (I) I-Cache
        mcr        p15, 0, r0, c1, c0, 0

        /*
         * before relocating, we have to setup RAM timing
         * because memory timing is board-dependend, you will
         * find a lowlevel_init.S in your board directory.
         */
        mov        ip, lr
        bl        lowlevel_init
        mov        lr, ip
        mov        pc,
      #endif /* CONFIG_SKIP_LOWLEVEL_INIT */

/*
*************************************************************************
*
* Interrupt handling
*
*************************************************************************
*/

@
@ IRQ stack frame.
@
#define S_FRAME_SIZE        72

#define S_OLD_R0        68
#define S_PSR                64
#define S_PC                60
#define S_LR                56
#define S_SP                52

#define S_IP                48
#define S_FP                44
#define S_R10                40
#define S_R9                36
#define S_R8                32
#define S_R7                28
#define S_R6                24
#define S_R5                20
#define S_R4                16
#define S_R3                12
#define S_R2                8
#define S_R1                4
#define S_R0                0

#define MODE_SVC 0x13
#define I_BIT         0x80

/*
* use bad_save_user_regs for abort/prefetch/undef/swi ...
* use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
*/

        .macro        bad_save_user_regs
        sub        sp, sp, #S_FRAME_SIZE
        stmia        sp, {r0 - r12}                        @ Calling r0-r12
        ldr        r2, _armboot_start
        sub        r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
        sub        r2, r2, #(CFG_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack
        ldmia        r2, {r2 - r3}                        @ get pc, cpsr
        add        r0, sp, #S_FRAME_SIZE                @ restore sp_SVC

        add        r5, sp, #S_SP
        mov        r1, lr
        stmia        r5, {r0 - r3}                        @ save sp_SVC, lr_SVC, pc, cpsr
        mov        r0, sp
        .endm

        .macro        irq_save_user_regs
        sub        sp, sp, #S_FRAME_SIZE
        stmia        sp, {r0 - r12}                        @ Calling r0-r12
        add     r8, sp, #S_PC
        stmdb   r8, {sp, lr}^                   @ Calling SP, LR
        str     lr, [r8, #0]                    @ Save calling PC
        mrs     r6, spsr
        str     r6, [r8, #4]                    @ Save CPSR
        str     r0, [r8, #8]                    @ Save OLD_R0
        mov        r0, sp
        .endm

        .macro        irq_restore_user_regs
        ldmia        sp, {r0 - lr}^                        @ Calling r0 - lr
        mov        r0, r0
        ldr        lr, [sp, #S_PC]                        @ Get PC
        add        sp, sp, #S_FRAME_SIZE
        subs        pc, lr, #4                        @ return & move spsr_svc into cpsr
        .endm

        .macro get_bad_stack
        ldr        r13, _armboot_start                @ setup our mode stack
        sub        r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
        sub        r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack

        str        lr, [r13]                        @ save caller lr / spsr
        mrs        lr, spsr
        str     lr, [r13, #4]

        mov        r13, #MODE_SVC                        @ prepare SVC-Mode
        @ msr        spsr_c, r13
        msr        spsr, r13
        mov        lr, pc
        movs        pc, lr
        .endm

        .macro get_irq_stack                        @ setup IRQ stack
        ldr        sp, IRQ_STACK_START
        .endm

        .macro get_fiq_stack                        @ setup FIQ stack
        ldr        sp, FIQ_STACK_START
        .endm

/*
* exception handlers
*/
        .align  5
undefined_instruction:
        get_bad_stack
        bad_save_user_regs
        bl         do_undefined_instruction

        .align        5
software_interrupt:
        get_bad_stack
        bad_save_user_regs
        bl         do_software_interrupt

        .align        5
prefetch_abort:
        get_bad_stack
        bad_save_user_regs
        bl         do_prefetch_abort

        .align        5
data_abort:
        get_bad_stack
        bad_save_user_regs
        bl         do_data_abort

        .align        5
not_used:
        get_bad_stack
        bad_save_user_regs
        bl         do_not_used

 楼主| 大墩子 发表于 2012-12-13 00:37:20 | 显示全部楼层
@ HJ
.globl Launch
    .align        4
Launch:   
    mov r7, r0
    @ diable interrupt
        @ disable watch dog timer
        mov        r1, #0x53000000
        mov        r2, #0x0
        str        r2, [r1]

    ldr r1,=INTMSK
    ldr r2,=0xffffffff  @ all interrupt disable
    str r2,[r1]

    ldr r1,=INTSUBMSK
    ldr r2,=0x7ff       @ all sub interrupt disable
    str r2,[r1]

    ldr     r1, = INTMOD
    mov r2, #0x0        @ set all interrupt as IRQ (not FIQ)
    str     r2, [r1]

    @
        mov        ip, #0
        mcr        p15, 0, ip, c13, c0, 0      @        /* zero PID */
        mcr        p15, 0, ip, c7, c7, 0       @        /* invalidate I,D caches */
        mcr        p15, 0, ip, c7, c10, 4      @        /* drain write buffer */
        mcr        p15, 0, ip, c8, c7, 0       @        /* invalidate I,D TLBs */
        mrc        p15, 0, ip, c1, c0, 0       @        /* get control register */
        bic        ip, ip, #0x0001             @        /* disable MMU */
        mcr        p15, 0, ip, c1, c0, 0       @        /* write control register */

    @ MMU_EnableICache
    @mrc p15,0,r1,c1,c0,0
    @orr r1,r1,#(1<<12)
    @mcr p15,0,r1,c1,c0,0

#ifdef CONFIG_SURPORT_WINCE
    bl Wince_Port_Init
#endif

    @ clear SDRAM: the end of free mem(has wince on it now) to the end of SDRAM
    ldr     r3, FREE_RAM_END
    ldr     r4, =PHYS_SDRAM_1+PHYS_SDRAM_1_SIZE    @ must clear all the memory unused to zero
    mov     r5, #0

    ldr     r1, _armboot_start
    ldr     r2, =On_Steppingstone
    sub     r2, r2, r1
    mov     pc, r2
On_Steppingstone:
2:  stmia   r3!, {r5}
    cmp     r3, r4
    bne     2b

    @ set sp = 0 on sys mode
    mov sp, #0

    @ add by HJ, switch to SVC mode
        msr        cpsr_c,        #0xdf        @ set the I-bit = 1, diable the IRQ interrupt
        msr        cpsr_c,        #0xd3        @ set the I-bit = 1, diable the IRQ interrupt
    ldr sp, =0x31ff5800       
   
    nop
        nop
    nop
        nop

        mov     pc, r7  @ Jump to PhysicalAddress
        nop
    mov pc, lr

#ifdef CONFIG_USE_IRQ

        .align        5
irq:
/* add by www.embedsky.net to use IRQ for USB and DMA */
        sub        lr, lr, #4                                @ the return address
        ldr        sp, IRQ_STACK_START                @ the stack for irq
        stmdb        sp!,         { r0-r12,lr }        @ save registers
       
        ldr        lr,        =int_return                        @ set the return addr
        ldr        pc, =IRQ_Handle                        @ call the isr
int_return:
        ldmia        sp!,         { r0-r12,pc }^        @ return from interrupt

        .align        5
fiq:
        get_fiq_stack
        /* someone ought to write a more effiction fiq_save_user_regs */
        irq_save_user_regs
        bl         do_fiq
        irq_restore_user_regs

#else

        .align        5
irq:
        get_bad_stack
        bad_save_user_regs
        bl         do_irq

        .align        5
fiq:
        get_bad_stack
        bad_save_user_regs
        bl         do_fiq
#endif
embedsky_lhh 发表于 2012-12-13 08:53:41 | 显示全部楼层
你贴这么长的代码,我就没有一一去看了,你从nor启动的时候,你的LED控制代码能起作用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-11-1 07:41 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表