打印

求助uboot移植,急!!高手请入...

[复制链接]
3206|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoyi6409|  楼主 | 2010-11-6 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaoyi6409 于 2010-11-7 13:23 编辑

小弟用的是TX2440的板子,为了移植好uboot已经花了20多天,可他就是不能从nandflash启动,先后换了1.1.6,1.2.0,1.3.4,200908四个版本,参考了很多博客,发觉有些人真的是很水,写个移植文档居然写着写着版本都变了,中间的错误更是数不胜数,还拿出来炫耀,很是气愤。在此恳求各位做技术的同志,如果文档不是自己一步步实践出来的,就不要发到网上去害人了....
接下来说说我的问题,现在移植的是u-boot-200908,环境为虚拟机下RedHat9.0,内核是2.4的,编译环境 arm-linux-gcc-4.3.2,能够成功的编译出uboot.bin文件,可他就是启动不了,串口打印不出任何信息,之前移植1.3.4时可以在norflash下启动,也能够支持nand,也是不能从nand启动(根据文档修改了start.s等文件),硬件没有问题,因为使用厂家的uboot.bin文件时可以正常启动。还望广大21ic中的高手不吝指教,来了21ic有一段时间了,每次问的问题似乎都没人能够真正解决,不知高手在何处?难道21一个高手都没有?我不相信....
下面是start.s的程序:

/*
*  armboot - Startup Code for ARM920 CPU-core
*
*  Copyright (c) 2001    Marius Gr鰃er <mag@sysgo.de>
*  Copyright (c) 2002    Alex Z黳ke <azu@sysgo.de>
*  Copyright (c) 2002    Gary Jennejohn <garyj@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
*/

#include <common.h>
#include <config.h>

/*
*************************************************************************
*
* Jump vector table as in table 3.1 in [1]
*
*************************************************************************
*/


.globl _start
_start:    b       start_code
    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 (called from the ARM reset exception 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

#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 start code
*/

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

    /*bl coloured_LED_init*/
    /*bl red_LED_on*/
   
#if defined(CONFIG_S3C2440)  
#define GPFCON 0x56000050
#define GPFDAT 0x56000054
#define GPFUP  0x56000058     

    ldr r0, =GPFCON   
    ldr r1, =0xFF55  
    str r1, [r0]
ldr r0, =GPFUP
    ldr r1, =0XFFF0  
    str r1, [r0]
    ldr r0, =GPFDAT
    ldr r1, =0xFFFE   
    str r1, [r0]
#endif
/*此段代码使u-boot启动后,点亮开发板上的LED1,LED2、LED3、LED4不亮*/


#if    defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK)
    /*
     * relocate exception table
     */
    ldr    r0, =_start
    ldr    r1, =0x0
    mov    r2, #16
copyex:
    subs    r2, r2, #1
    ldr    r3, [r0], #4
    str    r3, [r1], #4
    bne    copyex
#endif

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
    /* turn off the watchdog */

# if defined(CONFIG_S3C2400)
#  define pWTCON        0x15300000
#  define INTMSK        0x14400008    /* Interupt-Controller base addresses */
#  define CLKDIVN    0x14800014    /* clock divisor register */
#else
#  define pWTCON        0x53000000
#  define INTMSK        0x4A000008    /* Interupt-Controller base addresses */
#  define INTSUBMSK    0x4A00001C
#  define CLKDIVN    0x4C000014    /* clock divisor register */
# endif

    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]
# endif

# if defined(CONFIG_S3C2440)
    ldr  r1, =0x7fff           
    ldr  r0, =INTSUBMSK
    str  r1, [r0]
# endif

# if defined(CONFIG_S3C2440)   /*添加s3c2440的时钟部分*/
#define MPLLCON   0x4C000004   /*系统主频配置寄存器基地址*/
#define UPLLCON   0x4C000008   /*USB时钟频率配置寄存器基地址 */
    ldr  r0, =CLKDIVN          /*设置分频系数FCLK:HCLK:PCLK = 1:4:8*/
    mov  r1, #5
    str  r1, [r0]

    ldr  r0, =MPLLCON  /*设置系统主频为405MHz */
    ldr  r1, =0x7F021  /*这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分*/
    str  r1, [r0]

    ldr  r0, =UPLLCON  /*设置USB时钟频率为48MHz */
    ldr  r1, =0x38022  /*这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分*/
    str  r1, [r0]
# else                 /*其他开发板的时钟部分,这里就不用管了,我们现在是做2440的*/

    /* 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
#if  0
/*#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     stack_setup*/

    /*ldr    r2, _armboot_start*/
    /*ldr    r3, _bss_start*/
    /*sub    r2, r3, r2*/        /* r2 <- size of armboot            */
    /*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*/    /* CONFIG_SKIP_RELOCATE_UBOOT */
#endif

#ifdef CONFIG_S3C2440_NAND_BOOT
    mov r1, #NAND_CTL_BASE   /*复位Nand Flash*/
    ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
    str r2, [r1, #oNFCONF]   /*设置配置寄存器的初始值,参考s3c2440手册*/
    ldr r2, [r1, #oNFCONF]
    ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
    str r2, [r1, #oNFCONT]   /*设置控制寄存器*/
    ldr r2, [r1, #oNFCONT]
    ldr r2, =(0x6)           /*RnB Clear*/
    str r2, [r1, #oNFSTAT]
    ldr r2, [r1, #oNFSTAT]
    mov r2, #0xff            /*复位command*/
    strb r2, [r1, #oNFCMD]
    mov r3, #0               /*等待*/
nand1:
    add r3, r3, #0x1
    cmp r3, #0xa
    blt nand1
nand2:
    ldr r2, [r1, #oNFSTAT]   /*等待就绪*/
    tst r2, #0x4
    beq nand2
    ldr r2, [r1, #oNFCONT]
    orr r2, r2, #0x2         /*取消片选*/
    str r2, [r1, #oNFCONT]
    //get read to call C functions (for nand_read())
    ldr sp, DW_STACK_START   /*为C代码准备堆栈,DW_STACK_START定义在下面 */
    mov fp, #0               
    //copy U-Boot to RAM
    ldr r0, =TEXT_BASE/*传递给C代码的第一个参数:u-boot在RAM中的起始地址*/
    mov r1, #0x0      /*传递给C代码的第二个参数:Nand Flash的起始地址*/
    mov r2, #0x30000  /*传递给C代码的第三个参数:u-boot的长度大小(128k)*/
    bl nand_read_ll   /*此处调用C代码中读Nand的函数,现在还没有要自己编写实现*/
    tst r0, #0x0
    beq ok_nand_read
bad_nand_read:
    loop2: b loop2   
ok_nand_read:
    /*检查搬移后的数据,如果前4k完全相同,表示搬移成功*/
    mov r0, #0
    ldr r1, =TEXT_BASE
    mov r2, #0x400           /*4 bytes * 1024 = 4K-bytes*/
go_next:
    ldr r3, [r0], #4
    ldr r4, [r1], #4
    teq r3, r4
    bne notmatch
    subs r2, r2, #4
    beq stack_setup
    bne go_next
notmatch:
    loop3: b loop3           /*infinite loop*/
#endif /*CONFIG_S3C2440_NAND_BOOT*/


    /* Set up the stack                            */
stack_setup:
    ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
    sub    r0, r0, #CONFIG_SYS_MALLOC_LEN    /* malloc area                      */
    sub    r0, r0, #CONFIG_SYS_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    */

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

    ldr    pc, _start_armboot

_start_armboot:    .word start_armboot
.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4


/*
*************************************************************************
*
* 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, lr
#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)
    sub    r2, r2, #(CONFIG_SYS_MALLOC_LEN)
    sub    r2, r2, #(CONFIG_SYS_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     r7, sp, #S_PC
    stmdb   r7, {sp, lr}^                   @ Calling SP, LR
    str     lr, [r7, #0]                    @ Save calling PC
    mrs     r6, spsr
    str     r6, [r7, #4]                    @ Save CPSR
    str     r0, [r7, #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)
    sub    r13, r13, #(CONFIG_SYS_MALLOC_LEN)
    sub    r13, r13, #(CONFIG_SYS_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

#ifdef CONFIG_USE_IRQ

    .align    5
irq:
    get_irq_stack
    irq_save_user_regs
    bl    do_irq
    irq_restore_user_regs

    .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

相关帖子

沙发
xiaoyi6409|  楼主 | 2010-11-7 13:24 | 只看该作者
一天过去...莫非21就是用来下载点文件的一个论坛?

使用特权

评论回复
板凳
ji_dan| | 2010-11-7 15:45 | 只看该作者
:funk:

使用特权

评论回复
地板
icecut| | 2010-11-7 20:12 | 只看该作者
你基于2410移植的吧。好好比较一下芯片手册,串口还是很容易。你贴这个汇编代码不影响串口。。

有好几个寄存器不一样,不仅仅改串口配置。还有clk。
我记得发过一篇uboot移植初步的**。也没有支持nand。
关键你要有仿真器。没有的话猜的确很麻烦。有时候读nor,有时候读sdram。。。。。
你这水平还是用个d板的jlink+gdb吧。或者openjtag。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

14

帖子

0

粉丝