移植u-boot-2012.04.01到JZ2440

发布者:和谐共融最新更新时间:2024-06-17 关键字:移植  u-boot  JZ2440 手机看文章 扫描二维码
随时随地手机看文章

开发环境:Ubuntu 12.04

开发板:JZ2440  256M NandFlash  64M SDRAM

交叉编译器:arm-linux-gcc-4.3.2

u-boot:u-boot-2012.04.01 

分析uboot中 make xxx_config过程  http://www.linuxidc.com/Linux/2017-06/145292.htm

U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

  最近在学习BootLoader,移植u-boot-2012.04.01到JZ2440开发板,现在把移植过程记录下来,一来梳理思路,二来方便以后更进一步学习。

一、  u-boot分析过程

    a、 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH

    b、如果bootloader比较大,要把它重定位到SDRAM

    c、把内核从NAND FLASH读到SDRAM

    d、设置'要传给内核的参数'

    e、跳转执行内核

具体代码分析

1、set the cpu to SVC32 mode

2、turn off the watchdog

3、mask all IRQs by setting all bits in the INTMR

4、设置时钟比例

5、设置内存控制器

6、设置栈,调用C函数board_init_f

7、调用函数数组init_sequence里的各个函数

    7.1 board_early_init_f : 设置系统时钟、设置GPIO

......................................

8、重定位代码

    8.1 从NOR FLASH把代码复制到SDRAM

    8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使'基于0地址编译得到的地址',现在把程序复制到了SDRAM,需要修改代码,把'基于0地址编译得到的地址'改为新地址。

    8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs

9、clear_bss

10、调用C函数board_init_r:第2阶段的代码

 

二、初始编译

 1、  解压 u-boot-2012.04.01.tar.bz2


tar xjf u-boot-2012.04.01.tar.bz2

进入解压后文件目录

cd u-boot-2012.04.01

2、在解压后文件目录下根据靠近的单板,配置

make smdk2410_config
make

这个时候编译完成后是不能在JZ2440上正常运行

三、建立自己的单板,定制适合自己单板的bootloader

1、新建一个单板

    cd board/samsung/
    cp smdk2410 smdk2440 -rf
    cd ../../include/configs/
    cp smdk2410.h smdk2440.h

修改boards.cfg

仿照2410,添加2440


smdk2410                    arm        arm920t    -                  samsung        s3c24x0

添加

smdk2440                    arm        arm920t    -                  samsung        s3c24x0

make , 烧写调试

2、根据需求进一步配置

make menuconfig 

3、修改Makefile ,开头指定架构和编译器

 ARCH=arm
 CROSS_COMPILE=arm-linux-

4、修改uboot代码,适合单板

  uboot里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置

  处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置

a、设置PLL的时钟的函数在_main中的board_init_f中初始化函数列表中的  boad_early_init_f 中,设置MPLL倍频值。它应该要在设置分频系数和初始化内存控制器之前来设置。

做如下修改: 在smdk2410.c文件中找到设置MPLL部分的代码,注释掉。

 


    /* to reduce PLL lock time, adjust the LOCKTIME register */
        //writel(0xFFFFFF, &clk_power->locktime);

      /* configure MPLL */
        //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
          //    &clk_power->mpllcon);

然后在start.S中再设置MPLL

#define S3C2440_MPLL_400MHZ    ((0x5c<<12)|(0x01<<4)|(0x01))
#if 0
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]
  #else
        /* 2. 设置时钟 400MHz */
        ldr r0, =0x4c000014
        //  mov r1, #0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
        mov r1, #0x05;            // FCLK:HCLK:PCLK=1:4:8
        str r1, [r0]
        /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
        mrc p15, 0, r1, c1, c0, 0      /* 读出控制寄存器 */
        orr r1, r1, #0xc0000000        /* 设置为“asynchronous bus mode” */
        mcr p15, 0, r1, c1, c0, 0      /* 写入控制寄存器 */
   
        #define S3C2440_MPLL_400MHZ    ((0x5c<<12)|(0x01<<4)|(0x01))
        /* MPLLCON = S3C2440_MPLL_200MHZ */
        ldr r0, =0x4c000004
        ldr r1, =S3C2440_MPLL_400MHZ
        str r1, [r0]
 
        /* 启动ICACHE */
        mrc p15, 0, r0, c1, c0, 0  @ read control reg
        orr r0, r0, #(1<<12)
        mcr p15, 0, r0, c1, c0, 0  @ write it back
  #endif

关闭看门狗、关中断

#define S3C2440_MPLL_400MHZ    ((0x5c<<12)|(0x01<<4)|(0x01))
#if 0
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]
  #else
        /* 2. 设置时钟 400MHz */
        ldr r0, =0x4c000014
        //  mov r1, #0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
        mov r1, #0x05;            // FCLK:HCLK:PCLK=1:4:8
        str r1, [r0]
        /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
        mrc p15, 0, r1, c1, c0, 0      /* 读出控制寄存器 */
        orr r1, r1, #0xc0000000        /* 设置为“asynchronous bus mode” */
        mcr p15, 0, r1, c1, c0, 0      /* 写入控制寄存器 */
   
        #define S3C2440_MPLL_400MHZ    ((0x5c<<12)|(0x01<<4)|(0x01))
        /* MPLLCON = S3C2440_MPLL_200MHZ */
        ldr r0, =0x4c000004
        ldr r1, =S3C2440_MPLL_400MHZ
        str r1, [r0]
 
        /* 启动ICACHE */
        mrc p15, 0, r0, c1, c0, 0  @ read control reg
        orr r0, r0, #(1<<12)
        mcr p15, 0, r0, c1, c0, 0  @ write it back
  #endif
关闭看门狗、关中断

#ifdef CONFIG_S3C24X0
    /* turn off the watchdog */

# if defined(CONFIG_S3C2400)
#  define pWTCON    0x15300000
#  define INTMSK    0x14400008    /* Interrupt-Controller base addresses */
#  define CLKDIVN    0x14800014    /* clock divisor register */
#else
#  define pWTCON    0x53000000
#  define INTMSK    0x4A000008    /* Interrupt-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
#endif

b、内存控制器的设置值改为如下

在/board/samsung/smdk2410/lowlevel_init.S文件中做一下修改

SMRDATA:
#if 0
    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x32
    .word 0x30
    .word 0x30
#else

  .long 0x22011110    //BWSCON
  .long 0x00000700    //BANKCON0
  .long 0x00000700    //BANKCON1
  .long 0x00000700    //BANKCON2
  .long 0x00000700    //BANKCON3
  .long 0x00000700    //BANKCON4
  .long 0x00000700    //BANKCON5
  .long 0x00018005    //BANKCON6
  .long 0x00018005    //BANKCON7
  .long 0x008C04F4    //REFRESH
  .long 0x000000B1    //BANKSIZE
  .long 0x00000030    //MRSRB6
  .long 0x00000030    //MRSRB7

 #endif

c、设置串口波特率(get_HCLK函数),乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440宏

处理措施:在include/configs/smdk2440.h中


//#define CONFIG_S3C2410        /* specifically a SAMSUNG S3C2410 SoC */
//#define CONFIG_SMDK2410        /* on a SAMSUNG SMDK2410 Board */
#define CONFIG_S3C2440        /* specifically a SAMSUNG S3C2440 SoC */
#define CONFIG_SMDK2440        /* on a SAMSUNG SMDK2440 Board */

d、修改UBOOT支持NAND启动,原来的代码在链接时加了'-pie'选项, 使得u-boot.bin里多了'*(.rel*)', '*(.dynsym)'

    使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)


arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行

把init.c放入board/samsung/smdk2440目录,修改Makefile,使init.c编译进去

修改smdk2440.h ,修改CONFIG_SYS_TEXT_BASE为0x33f80000


#define CONFIG_SYS_TEXT_BASE    0x33f00000

init.c

/* NAND FLASH控制器 */
#define NFCONF (*((volatile unsigned long *)0x4E000000))
#define NFCONT (*((volatile unsigned long *)0x4E000004))
#define NFCMMD (*((volatile unsigned char *)0x4E000008))
#define NFADDR (*((volatile unsigned char *)0x4E00000C))
#define NFDATA (*((volatile unsigned char *)0x4E000010))
#define NFSTAT (*((volatile unsigned char *)0x4E000020))

[1] [2] [3]
关键字:移植  u-boot  JZ2440 引用地址:移植u-boot-2012.04.01到JZ2440

上一篇:移植Linux-3.4.2内核到S3C2440
下一篇:移植U-boot_2016.09到JZ2440开发板

推荐阅读最新更新时间:2026-03-10 11:21

[JZ2440] 第09课第1节 u-boot 分析之编译体验
一、课堂笔记 1. Windows 电脑和嵌入式设备启动流程对比 |-- Windows 上电启动流程 | |-- 上电 - BIOS(引导操作系统) - Windows - 识别 C、D 盘 - 运行应用程序 |-- 嵌入式设备 |-- 上电 - BootLoader(引导内核) - Linux Kernel - 挂载根文件系统 - 运行应用程序 2. BootLoader 最终目的是启动内核 |-- 启动内核 |-- 从 Flash 读取 kernel | |-- u-boot 要能够读取 Flash |-- 将读取到的 kernel 放进 SDRAM 中
[单片机]
[JZ2440] 使用 oflash + OpenJTAG 烧写 U-Boot
在 光盘资料 - 烧写工具 - 裸机 - eop&op 目录下可以获取本篇文章所有相关驱动文件。 一、安装 oflash oflash 安装包路径:eop&op - 调试工具 - 01.OpenOCD with GUI setup.exe 使用 管理员权限 安装 OpenOCD with GUI setup.exe 即可在 cmd.exe 命令行里执行 oflash 程序。 验证驱动 oflash 是否安装成功,依次执行:Win + R - 输入 cmd 调起控制台 - 输入 oflash 执行,出现以下提示说明 oflash 安装成功。 C:Usersuser oflash +---
[单片机]
[<font color='red'>JZ2440</font>] 使用 oflash + OpenJTAG 烧写 <font color='red'>U-Boot</font>
移植U-boot_2016.09到JZ2440开发板
一.下载源码:U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm 二.初始化编译:   ①make smdk2410_defconfig  #首先使用默认配置,减少后续的配置工作   ②make menuconfig   #根据自身需求进一步配置   ③修改Makefile ,开头只能架构和编译器:      ARCH=arm      CROSS_COMPILE=arm-linux- ④修改uboot代码:    1. 设置PLL的时钟的函数在_main中的board_init_f中初始化函数列表中的 boad_early_init_f 中,
[单片机]
ARM筆記:Linux内核移植JZ2440
一、准备工作: 1、Linux内核:Linux2.6.22.6,可从 www.kernel.org 上下载; 2、交叉工具编译链:arm-linux-gcc-3.4.5-glibc-2.3.6; 3、yaffs2文件代码; 4、ubuntu9.10; 5、JZ2440; 二、内核移植: 1、修改Makefile: 修改内核源码根目录下的Makefile文件 #ARCH ?= arm #CROSS_COMPILE ?=arm-linux- 2、修改晶振 修改arch/arm/mach-s3c2440/mach-smdk2440.c static void __init smdk2440_map_io(void) {
[单片机]
u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解
RAM的原理简单学习 DDR是RAM的一种,RAM常见的类型有SRAM,SDRAM,DDR他们的共同特点是,随机存储意味着读写速度快,掉电后数据丢失,所以常用来存储程序中的变量。 SRAM 静态随机存储器英文是static random-access memory 就是保持上电就可以保存数据而不需要刷新。数据线和地址线分离以IS62WV51216这个芯片为例,他数据位宽为16,大小为1MB,地址线宽是19。所以可以访问的空间大小就是2的19次方即524288=512KB,然后数据线是16位了,所以512KB*2 就是这个芯片的全部容量。然后在加上一些必要的控制线比如片选,字节选择等就可以完成读写控制,他的特点是不需要刷新
[单片机]
<font color='red'>u-boot</font> <font color='red'>移植</font> --->4、Tiny210核心板的DDR初始化下详解
u-boot分析与移植——基于u-boot-2011.3和FL2440
关于移植的基本方法可以先阅读u-boot的README文档 If the system board that you have is not listed, then you will need to port U-Boot to your hardware platform. To do this, follow these steps: 1. Add a new configuration option for your board to the toplevel Makefile and to the MAKEALL script, using the existing entries as example
[单片机]
u-boot移植到s3c2440开发板(一)--建立单板
由于没有系统的学习shell,所以Makefile大多数看不懂,一个小小的细节,把我难住了几天。现在开始分享我的操作过程 本文所有linux下的操作是root用户,如果你使用普通用户,请在命令前加上 $ sudo xxxx 所有Linux命令都是加粗,需要加入的文本是斜体 /* *  Ubuntu 16.04 *  u-boot-2016.05.tar.bz2 *  arm-linux-gcc-4.4.3.tar.gz */ 准备工作 1.下载u-boot,我是用的u-boot-2016.05.tar.bz2,可以自己去官网下载 下载地址, ftp://ftp.denx.de/pub/u-boot/ 2.下载arm-linux-g
[单片机]
<font color='red'>u-boot</font><font color='red'>移植</font>到s3c2440开发板(一)--建立单板
U-Boot移植
1. 安装韦东山的虚拟版的ubuntu 9, 里面交叉编译啥的都弄好了, 直接用, 然后把workstation共享目录打开, 指向uboot的压缩包所在目录. 2. 在虚拟机上, 打开ssh, 通过ssh, 进/mnt/hgfs/ 把uboot压缩包解压了. 3. 编辑Makefile, 在smdk2400下面增加两行, 注意要好tab键 smdk2400_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0 tx2440_config : unconfig @$(MKCONFIG) $(@:_conf
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved