【Bootloader】移植U-Boot.1.2.0到博创2410-S(S3C2410A)

 

转载自:http://blog.chinaunix.net/u1/34474/showart.php?id=363269 同时附加自己的一些修改

一、在U-Boot中建立自己的开发板类型,并测试编译。
我为开发板取名叫: tekkaman2410


0 在工作目录下解压U-Boot。
$tar zxvf u-boot.git.tar.gz


1 进入U-Boot目录,修改Makefile
$cd u-boot.git/
$vi Makefile
#为tekkaman2410建立编译项

smdk2410_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

tekkaman2410_config    :    unconfig
         @$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2410 tekkaman s3c24x0
各项的意思如下:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
tekkaman2410: 开发板的型号(BOARD),对应于board/tekkaman/tekkaman2410目录。
tekkaman: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。

同时在
“ifndef CROSS_COMPILE ”之前  加上自己交叉编译器的路径,比如我使用crosstool-0.43制作的基于2.6.22.2内核和 gcc-4.1.0-glibc-2.3.2的 ARM9TDMI交叉编译器,则:

CROSS_COMPILE=/home/tekkaman/working/crosstool-gcc410-k26222/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-



2 在/board子目录中建立自己的开发板tekkaman2410目录

由于我在上一步板子的
开发者/或经销商(vender)中填了 tekkaman ,所以 开发板tekkaman2410目录一定要建在 /board子目录中的tekkaman目录下  ,否则编译会出错。

$cd board
$mkdir tekkaman tekkaman/tekkaman2410
$cp -arf smdk2410/*   tekkaman/tekkaman2410/
$cd tekkaman/tekkaman2410
$mv smdk2410.c tekkaman2410.c


    还要记得修改自己的开发板tekkaman2410目录下的Makefile文件,不然编译时会出错:
COBJS    := tekkaman2410.o flash.o
$vi Makefile



3 在include/configs/中建立配置头文件
$cd ../../..
$cp include/configs/smdk2410.h include/configs/tekkaman2410.h


4 测试编译能否成功
$make tekkaman2410_config
Configuring for tekkaman2410 board...
(如果出现:
$ make tekkaman2410_config

Makefile:1927: *** 遗漏分隔符 。 停止。
请在U-boot的根目录下的Makefile的
         @$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2410 tekkaman )
前加上“Tab”键)
$make


    我到这一步测试交叉编译成功!!


移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home 移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home 移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home移植U-Boot.1.2.0到博创2410-S(S3C2410A) - 寒翎 - Pigs Home

二、修改U-Boot中的文件,以匹配博创的2410-S实验箱。
 1 修改/cpu/arm920t/start.S

  (1)修改中断禁止部分

# if defined(CONFIG_S3C2410)
    ldr    r1, =0x7ff   //根据2410芯片手册,
INTSUBMSK有11位可用,
                       //
vivi也是0x7ff, 不知为什么U-Boot一直没改过来。
    ldr    r0, =INTSUBMSK
    str    r1, [r0]
# endif


  (2)修改时钟设置(可以不修改,因为后面的board_init函数也会
将时钟设为202.8MHz
    
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN

    mov    r1, #3
    str    r1, [r0]

    mrc    p15, 0, r1, c1, c0, 0        /*read ctrl register   tekkaman*/
    orr    r1, r1, #0xc0000000         /*Asynchronous  tekkaman*/
    mcr    p15, 0, r1, c1, c0, 0      /*write ctrl register tekkaman*/

    /*now, CPU clock is 202.8 Mhz   tekkaman*/
    mov    r1, #CLK_CTL_BASE    /* tekkaman*/
    mov    r2, #MDIV_200                   /* mpll_200mhz    tekkaman*/
    add    r2, r2, #PSDIV_200             /* mpll_200mhz    tekkaman*/
    str    r2, [r1, #0x04]               /* MPLLCON tekkaman */

#endif    /* CONFIG_S3C2400 || CONFIG_S3C2410 */

    红色部分是我添加的,因为 U-Boot 使用的是
 /* default FCLK is 120 MHz ! */
    我利用
博创提供的 vivi的代码,将其设为202.8MHz 并在前面加上:

#elif defined(CONFIG_S3C2410)
# define pWTCON        0x53000000
# define INTMSK        0x4A000008    /* Interupt-Controller base addresses */
# define INTSUBMSK    0x4A00001C
# define CLKDIVN    0x4C000014    /* clock divisor register */
#define CLK_CTL_BASE        0x4C000000  
/* tekkaman */
#define MDIV_200        0xa1 << 12   /* tekkaman */
#define PSDIV_200        0x31
       /* tekkaman */



  
(3)将从Flash启动改成从NAND Flash启动。
将以下U-Boot的重定向语句段:

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



替换成:

#ifdef CONFIG_S3C2410_NAND_BOOT   @tekkaman@@@@@@@@@@@@@@@@SSSSSSSSSSSSS
@ 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]

@ get read to call C functions (for nand_read())
  ldr   sp, DW_STACK_START       @ setup stack pointer
  mov fp, #0                    @ no previous frame, so fp=0

@ copy U-Boot to RAM
  ldr   r0, =TEXT_BASE
  mov     r1, #0x0
  mov r2, #0x20000
  bl    nand_read_ll
  tst    r0, #0x0
  beq  ok_nand_read

bad_nand_read:
loop2:    b     loop2          @ infinite loop


ok_nand_read:
@ verify
  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_S3C2410_NAND_BOOT  @tekkaman@@@@@@@@@@@@@@@@@@EEEEEEEEE

 “  _start_armboot:    .word start_armboot   ” 后加入:
   .align     2
DW_STACK_START:  .word  STACK_BASE+STACK_SIZE-4


附:顺便提一下,在
start.S 文件的注释部分有个小错误(红色部分:原来是2)
cpu_init_crit:
    ......
    /*
     * 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 1 (A) Align
    ......

 
2  
在board/ tekkaman/tekkaman2410 加入NAND Flash读函数,建立nand_read.c文件,加入如下内容(copy from vivi):

#include <config.h>

#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE  0x4e000000
#define NFCONF  __REGi(NF_BASE + 0x0)
#define NFCMD  __REGb(NF_BASE + 0x4)
#define NFADDR  __REGb(NF_BASE + 0x8)
#define NFDATA  __REGb(NF_BASE + 0xc)
#define NFSTAT  __REGb(NF_BASE + 0x10)

#define BUSY 1


inline void wait_idle(void) {
    int i;

    while(!(NFSTAT & BUSY))
      for(i=0; i<10; i++);
}

/* low level nand read function */
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
    int i, j;

    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
        return -1; /* invalid alignment */
    }

    /* chip Enable */
    NFCONF &= ~0x800;
    for(i=0; i<10; i++);

    for(i=start_addr; i < (start_addr + size);) {
      /* READ0 */
      NFCMD = 0;

      /* Write Address */
      NFADDR = i & 0xff;
      NFADDR = (i >> 9) & 0xff;
      NFADDR = (i >> 17) & 0xff;
      NFADDR = (i >> 25) & 0xff;

      wait_idle();

      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
 *buf = (NFDATA & 0xff);
 buf++;
      }
    }

    /* chip Disable */
    NFCONF |= 0x800; /* chip disable */

    return 0;
}


 


 

修改board/tekkaman/tekkaman2410/Makefile文件
......
OBJS := tekkaman2410.o  nand_read.o
 
......

 


 

修改include/configs/tekkaman2410.h文件,添加如下内容:
......
/*
 * Nandflash Boot
 */
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE    0x33f00000
#define STACK_SIZE    0x8000
//#define UBOOT_RAM_BASE    0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE            0x4E000000
#define bINT_CTL(Nb)        __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF               0x00
#define oNFCMD                0x04
#define oNFADDR               0x08
#define oNFDATA               0x0c
#define oNFSTAT               0x10
#define oNFECC                0x14
#endif    /* __CONFIG_H */

 


 

5 修改board/tekkaman/tekkaman2410/lowlevel_init.S文件
    依照开发箱的内存区的配置情况, 修改board/tekkaman/tekkaman2410/lowlevel_init.S文件,我利用博创提供的vivi源码里的信息做了如下更改:
......
#define B1_BWSCON          (DW16)    /*@tekkaman*/
#define B2_BWSCON          (DW16)
#define B3_BWSCON          (DW16)    /*@tekkaman*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值