linux 移植 内存 配置,Linux 移植篇 之 uboot的移植

本文主要针对对于s3c2410的板子

一、在 U-Boot 中建立自己的开发板类型,并测试编译

(1)进入 UBoot 根目录,修改 Makefile

<1>为 james2410_config 建立编译选项,可以自己定义名字。

smdk2410_config : unconfig

@$(MKCONFIG)  $(@:_config=)  arm  arm920t  smdk2410  samsung

s3c24x0

james2410_config : unconfig

@$(MKCONFIG)  $(@:_config=)  arm  arm920t  james2410  samsung

s3c24x0

<2>指定交叉编译工具

在代码

ifeq ($(HOSTARCH),$(ARCH))

CROSS_COMPILE ?=

endif

前面添加代码

CROSS_COMPILE=  /usr/local/arm/crosstool-ng/crosstool_out/bin/armlinux-<3>修改如下

__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))

修改为

__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))

(2)建立自己的开发板目录

<1>建立开发板目录

# cd board/samsung/

# cp smdk2410/ james2410 -fr

# cd james2410/

# mv smdk2410.c james2410.c

<2>修改 james2410 目录下的 Makefile,如下:

COBJS := james2410.o flash.o

SOBJS := lowlevel_init.o

<3>建立自己开发板的头文件

进入 u-boot 源码的根目录

# cp include/configs/smdk2410.h include/configs/james2410.h

(3)测试编译能否成功

<1>进入 u-boot 源码的根目录

<2>#make james2410_config,出现如下语句,正常。

<3>#make

<4>若不报错且生成 u-boot.bin 文件,说明基本配置成功。

二、内存配置,从 NAND FLASH 搬运 UBOOT 到内存中

(1)修改文件 config.mk

<1># vim board/samsung/james2410/config.mk

<2>TEXT_BASE = 0x33F80000

改为

TEXT_BASE = 0x31F80000

(2)修改文件/arch/arm/cpu/arm920t/start.S

注释掉  set the cpu to SVC32 mode 后面的语句

//bl coloured_LED_init

//bl red_LED_on

在代码

# define INTSUBMSK 0x4A00001C

# define CLKDIVN 0x4C000014 /* clock divisor register */

下面添加代码:

# define CLK_CTL_BASE 0x4C000000

# define MDIV_200 0xa1 << 12

# define PSDIV_200 0x31

在代码

/* FCLK:HCLK:PCLK = 1:2:4 */

/* default FCLK is 120 MHz ! */

ldr r0, =CLKDIVN

mov r1, #3

str r1, [r0]

下面添加代码:

用于设置时钟频率(202.8MHz)

mrc p15, 0, r1, c1, c0, 0

orr r1, r1, #0xc0000000

mcr p15, 0, r1, c1, c0, 0 /*write ctrl register */

mov r1, #CLK_CTL_BASE

mov r2, #MDIV_200

add r2, r2, #PSDIV_200

str r2, [r1, #0x04]

修改:

# if defined(CONFIG_S3C2410)

ldr r1, =0x3ff

# if defined(CONFIG_S3C2410)

ldr r1, =0x7ff

(3)进入内存配置阶段

修改/board/samsung/james2410/lowlevel_init.S

<1>修改代码

#define B1_BWSCON       (DW32)

#define B2_BWSCON       (DW16)

#define B3_BWSCON       (DW16 + WAIT + UBLB)

#define B4_BWSCON       (DW16)

#define B5_BWSCON       (DW16)

#define B6_BWSCON       (DW32)

#define B7_BWSCON       (DW32)

#define B1_BWSCON       (DW16)

#define B2_BWSCON       (DW32)

#define B3_BWSCON       (DW16)

#define B4_BWSCON       (DW16)

#define B5_BWSCON       (DW16)

#define B6_BWSCON       (DW16)

#define B7_BWSCON       (DW16)

<2>修改刷新律

#define  REFCNT               1268    /*  period=7.8125us,  HCLK=100Mhz,

(2048+1-7.8125*100) */

<3>寻找如下部分并做修改

.word  ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+

(Tchr<<16)+REFCNT)

.word 0x32

.word 0x30

.word 0x30

修改 word 0x32 为 word 0xb2

<4>修改如下部分

#define B3_Tacs           0x0   /* 0clk */

#define B3_Tcos           0x3   /* 4clk */

#define B3_Tacc           0x7   /* 14clk */

#define B3_Tcoh           0x1   /* 1clk */

#define B3_Tah           0x0   /* 0clk */

#define B3_Tacp           0x3    /* 6clk */

#define B3_PMC           0x0   /* normal */

为:

#define B3_Tacs           0x0   /* 0clk */

#define B3_Tcos           0x0   /* 4clk */

#define B3_Tacc           0x7   /* 14clk */

#define B3_Tcoh           0x0   /* 1clk */

#define B3_Tah           0x0   /* 0clk */

#define B3_Tacp           0x0    /* 6clk */

#define B3_PMC           0x0   /* normal */

(4)修改文件/arch/arm/cpu/arm920t/start.S

<1>如下注释掉以前的搬运代码

#if 0

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

relocate:               /* relocate U-Boot to RAM       */

adr   r0, _start       /* r0

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

add   r2, r0, r2       /* r2

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

紧接着添加如下代码:

/*copy U-Boot to RAM*/

#define LENGTH_UBOOT 0x40000

#define NAND_CTL_BASE 0x4E000000

#ifdef   CONFIG_S3C2410

/* Offset */

#define oNFCONF 0x00

#define oNFCMD 0x04

#define oNFSTAT 0x10

@ 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, #LENGTH_UBOOT

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

<2>在代码

_start_armboot:   .word start_armboot

下面添加:

#define STACK_BASE 0x31f00000

#define STACK_SIZE 0x8000

.align   2

DW_STACK_START:   .word   STACK_BASE+STACK_SIZE-4

STACK_BASE 的设置,与上面 TEXT_BASE 的设置原因相同

(5)修改/include/configs/james2410.h 文件

/* nand boot */

#define CONFIG_S3C2410   1

修改下面宏定义的常量值

#define CONFIG_SYS_MEMTEST_END       0x31F00000   /* 31 MB in DRAM   */

#define CONFIG_SYS_LOAD_ADDR   0x30008000   /* default load address   */

#define PHYS_SDRAM_1_SIZE       0x02000000   /* 32 MB */

(6)在/board/samsung/james2410 路径下建立 nand_read.c,供 start.S 调用。文件

内容如下:

#include

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

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

#define NF_BASE 0x4e000000

#define NFCONF __REGi(NF_BASE + 0x0)

#if defined(CONFIG_S3C2410)

#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

#define NAND_SECTOR_SIZE   512

#define NAND_BLOCK_MASK       (NAND_SECTOR_SIZE - 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); i += NAND_SECTOR_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++) {

*buf = (NFDATA & 0xff);

buf++;

}

}

/* chip Disable */

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

return 0;

}

#endif

(7)修改/board/samsung/james2410/Makefile

COBJS := my2410.o flash.o nand_read.o

(8)修改/board/samsung/james2410/james2410.c

在 board_init()函数中

<1>修改下面的配置

gpio->GPFCON = 0x000051AA;

gpio->GPFUP = 0x000000EF;

gpio->GPGCON = 0xFD95FFBA;

gpio->GPGUP = 0x0000EFFF;

gpio->GPHCON = 0x0016FAAA;

<2>在上面配置下添加代码:

gpio->EXTINT0=0x22222222;

gpio->EXTINT1=0x22222222;

gpio->EXTINT2=0x22222222;

三、去掉 Nor Flash 部分

(1)修改/include/configs/james2410.h

注释 CONFIG_AMD_LV400

#if 0

#define  CONFIG_AMD_LV400    1    /*  uncomment  this  if  you  have  a  LV400

flash */

#define  CONFIG_AMD_LV800    1    /*  uncomment  this  if  you  have  a  LV800

flash */

#endif

去掉:

//#define   CONFIG_ENV_IS_IN_FLASH   1

//#define  CONFIG_ENV_SIZE         0x10000    /*  Total  Size  of  Environment

Sector */

添加:

#define CONFIG_SYS_NO_FLASH   1

#define CONFIG_ENV_IS_IN_NAND 1

#define CONFIG_ENV_OFFSET        0X60000

#define  CONFIG_ENV_SIZE              0x20000    /*  Total  Size  of  Environment

Sector */

(2)修改/board/samsung/james2410/Makefile

COBJS := my2410.o nand_read.o

(3)修改/common/cmd_bootm.c 的部分内容如下:

注释掉下面代码块:

#if 0

#if defined(CONFIG_CMD_IMLS)

#include

extern flash_info_t flash_info[]; /* info for FLASH chips */

static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);

#endif

#endif

修改

#if 0

#if defined(CONFIG_CMD_IMLS)

#if 0

defined(CONFIG_CMD_IMLS)

(4)修改/common/cmd_flash.c

/common/cmd_flash.c 32 行后面的所有部分均注释掉

#if 0

defined(CONFIG_CMD_JFFS2) && defined(CONFIG_CMD_MTDPARTS)

#endif

(5)修改配置文件,添加对 NAND FLASH 的支持  /include/configs/james2410.h

在  Command line configuration 部分,添加

#define CONFIG_CMD_NAND

在最后添加

#if defined(CONFIG_CMD_NAND)

#define CONFIG_NAND_S3C2410

#define CONFIG_SYS_NAND_BASE 0x4E000000

#define  CONFIG_SYS_MAX_NAND_DEVICE    1    /*  Max  number  of  NAND

devices       */

#define SECTORSIZE 512

#define SECTORSIZE_2K 2048

#define NAND_SECTOR_SIZE SECTORSIZE

#define NAND_SECTOR_SIZE_2K SECTORSIZE_2K

#define NAND_BLOCK_MASK 511

#define NAND_BLOCK_MASK_2K 2047

#define NAND_MAX_CHIPS 1

#define CONFIG_MTD_NAND_VERIFY_WRITE

#define CONFIG_SYS_64BIT_VSPRINTF       /* needed for nand_util.c */

#endif   /* CONFIG_CMD_NAND */

(6)在 board/samsung/james2410/james2410.c 文件中添加

#if defined(CONFIG_CMD_NAND)

#include

#endif

寻找如下部分:

clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);

/* some delay between MPLL and UPLL */

delay (4000);

/* configure UPLL */

clk_power->UPLLCON  =  ((U_M_MDIV  <

U_M_SDIV);

在 delay(4000);后再增加一段代码:delay (4000);。为了增加板子对 U 盘的支持。

(7)编译,运行

make distclean

make james2410_config

make

生成 u-boot.bin 文件

(8)烧写 uboot.bin 文件,进入 uboot 模式输入 help 命令,可以看到 nand 相关的命令。

四、增加 UBI 文件系统的支持

(1)修改/include/configs/james2410.h 文件,增加如下代码:

#if 1

#define CONFIG_MTD_DEVICE 1

#define CONFIG_MTD_PARTITIONS 1

#define CONFIG_CMD_MTDPARTS

#define CONFIG_CMD_UBIFS

#define CONFIG_CMD_UBI

#define CONFIG_LZO 1

#define CONFIG_RBTREE 1

#endif

#define MTDIDS_DEFAULT "nand0=nandflash0"

#define MTDPARTS_DEFAULT            "mtdparts=nandflash0:1m@0(uboot),"

"3m(kernel)," "-(root)"

(2)修改/arch/arm/cpu/arm920t/start.S

寻找并修改/*copy U-Boot to RAM*/下

ldr r0, =TEXT_BASE  //传递给 C 代码的第一个参数:u-boot 在 RAM 中的起始地址

mov r1, #0x0           //传递给 C 代码的第二个参数:Nand Flash 的起始地址

mov r2, #0x50000      //传递给 C 代码的第三个参数:u-boot 的长度大小(320KB)

bl nand_read_ll    //此处调用 C 代码中读 Nand 的函数,现在还没有要自己编写实现

(3)修改/include/configs/james2410.h

寻找如下信息并修改为:

#define CONFIG_SYS_MALLOC_LEN       (CONFIG_ENV_SIZE+  512*1024)

#define CONFIG_SYS_GBL_DATA_SIZE   512 /* size in bytes reserved for initial data */

#define CONFIG_STACKSIZE      (512*1024)   /* regular stack */

五、修改 uboot 的开机启动环境以及生成 uboot 镜像

(1)修改/u-boot-2010.06/include/configs/james2410.h

#define CONFIG_BOOTDELAY 3

#define CONFIG_BOOTARGS "console=ttySAC0,115200  ubi.mtd=2  root=ubi0:root

rootfstype=ubifs init=/linuxrc"

#define CONFIG_ETHADDR 08:00:3e:26:0a:5b

#define CONFIG_NETMASK 255.255.0.0

#define CONFIG_IPADDR 192.168.3.181

#define CONFIG_SERVERIP 192.168.3.124

/*#define CONFIG_BOOTFILE "elinos-lart" */

#define CONFIG_BOOTCOMMAND "nboot 0x30008000 0 0x100000; bootm"

#define CONFIG_SETUP_MEMORY_TAGS//to pass args to kernel

#define CONFIG_CMDLINE_TAG

#define CONFIG_CMDLINE_EDITING//mem last cmd

(4)编译,运行

make distclean

make james2410_config

make

生成 u-boot.bin 文件

(5)烧写 uboot.bin 文件,进入 uboot 模式输入 help 命令,可以看到 ubi 相关的命令。

(6)执行如下命令

#mtdpart default

#mtdpart

可以看到与我们对 ubi 文件系统的默认分区配置是一致的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值