最具体的u-boot移植到QT2410E开发板的过程1

最具体的u-boot移植QT2410E开发板的过程

U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。以S3C2410处理器的开发板为例,我们可以基于SMDK2410移植。

开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。推荐使用官方FTP下载UBOOT源码。http://www.icdev.com.cn/batch.viewlink.php?itemid=1694

移植U-Boot的基本步骤如下:

1创建开发板目录

(1) 在board目录下创建自己的工作目录,将smdk2410目录下的内容全部拷贝到qt2410e目录下

(2) cd u-boot-1.2.0/board

(3) mkdir qt2410e

(4) cd qt2410e

(5) cp  ../smdk2410/* .

(6) mv smdk2410.c qt2410e.c

(7) vi Makefile并把COBJS更改为:COBJS := qt2410e.o flash.o nand_read.o

(8) cd ../..

(9) cp include/configs/smdk2410.h include/configs/qt2410e.h

(10) vi Makefile顶层Makefile1924行填加如下两行:

qt2410e_config    :    unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t qt2410e null s3c24x0

2添加nand_read_ll读写函数

start.S文件中需要使用nand_read_ll读写函数,用来将uboot拷贝到内存里去。在/board/qt2410e目录下需要添加nand_read.c文件,主要实现了nand_read_ll读写函数。

(1) cd board/qt2410e

(2) vi nand_read.c创建此文件

(3) 阅读并分析nand_read_ll函数,将其添加到nand_read.c中,代码如下:

(1) #include <config.h>

(2) 

(3) #define __REGb(x)    (*(volatile unsigned char *)(x))

(4) #define __REGi(x)    (*(volatile unsigned int *)(x))

(5) #define NF_BASE        0x4e000000

(6) #define NFCONF        __REGi(NF_BASE + 0x0)

(7) #define NFCMD         __REGb(NF_BASE + 0x4)

(8) #define NFADDR        __REGb(NF_BASE + 0x8)

(9) #define NFDATA        __REGb(NF_BASE + 0xc)

(10) #define NFSTAT        __REGb(NF_BASE + 0x10)

(11) 

(12) #define BUSY 1

(13) inline void wait_idle(void) {

(14)     int i;

(15) 

(16)     while(!(NFSTAT & BUSY))

(17)       for(i=0; i<10; i++);    

(18) }

(19) 

(20) #define NAND_SECTOR_SIZE    512

(21) #define NAND_BLOCK_MASK        (NAND_SECTOR_SIZE - 1)

(22) 

(23) 

(24) int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)

(25) {

(26)     int i, j;

(27) 

(28)     if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {

(29)         return -1;   

(30) }

(31) 

(32)   

(33)     NFCONF &= ~0x800;

(34)     for(i=0; i<10; i++);

(35) 

(36)     for(i=start_addr; i < (start_addr + size);) {

(37)      

(38)       NFCMD = 0; 

(39) 

(40)       

(41)       NFADDR = i & 0xff; 

(42)       NFADDR = (i >> 9) & 0xff;   

(43)       NFADDR = (i >> 17) & 0xff;

(44)       NFADDR = (i >> 25) & 0xff;

(45) 

(46)       wait_idle();

(47) 

(48)       for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {

(49)     *buf = (NFDATA & 0xff);

(50)     buf++;

(51)       }

(52)     }

(53)     NFCONF |= 0x800;   

(54)     return 0;

(55) }

修改start.S

(1) vi ../../cpu/arm920t/start.S

(2) 在vi编辑器的命令模式下输入如下命令找到选择FLASH启动部分代码,命令如下:

(3) /RELOCATE

(4) 这时将看到如下代码为NOR的重定向代码:

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

(5) 可以将上述代码注释掉或删除,或者直接不予以理会,我们这里将光标移至#ifndef CONFIG_SKIP_RELOCATE_UBOOT并执行18dd命令直接将其删除。

(6) 删除部分将替换为NAND FLASH的初始化代码,并由此代码最终调用nand_read.c的函数。代码如下:

#ifdef CONFIG_S3C2410_NAND_BOOT   

@ reset NAND
  mov r1, #NAND_CTL_BASE
  ldr   r2, =0xf830           @ initial value
  str   r2, [r1, #oNFCONF]
  ldr   r2, [r1, #oNFCONF]
  bic  r2, r2, #0x800              @ enable chip
  str   r2, [r1, #oNFCONF]
  mov r2, #0xff         @ RESET command
  strb r2, [r1, #oNFCMD]


  mov r3, #0                   @ wait
nand1:  
  add  r3, r3, #0x1
  cmp r3, #0xa
  blt   nand1

nand2:
  ldr   r2, [r1, #oNFSTAT]      @ wait ready
  tst    r2, #0x1
  beq  nand2

  ldr   r2, [r1, #oNFCONF]
  orr  r2, r2, #0x800              @ disable chip
  str   r2, [r1, #oNFCONF]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值