u-boot-2014.10移植(8)重定位,支持NAND启动

发布者:cwk2003最新更新时间:2023-06-09 来源: elecfans关键字:u-boot  移植  重定位  NAND启动 手机看文章 扫描二维码
随时随地手机看文章

前面链接地址都是0x0,可以从nor正常启动内核和文件系统。

现在把链接地址改成0x33f00000

一旦更改了链接地址, u-boot从nor flash加载时,串口没有任何输出

 

添加文件boot_init.c


#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))

        

static void nand_select(void)

{

    NFCONT &= ~(1<<1);    

}


static void nand_deselect(void)

{

    NFCONT |= (1<<1);    

}

    

        

static void nand_cmd(unsigned char cmd)

{

    volatile int i;

    NFCMMD = cmd;

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

}

        

static void nand_addr(unsigned int addr)

{

    unsigned int col  = addr % 2048;

    unsigned int page = addr / 2048;

    volatile int i;


    NFADDR = col & 0xff;

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

    NFADDR = (col >> 8) & 0xff;

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

    

    NFADDR  = page & 0xff;

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

    NFADDR  = (page >> 8) & 0xff;

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

    NFADDR  = (page >> 16) & 0xff;

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

}

    

static void nand_wait_ready(void)

{

    while (!(NFSTAT & 1));

}

    

static unsigned char nand_data(void)

{

    return NFDATA;

}

        

        

static void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)

{

    int col = addr % 2048;

    int i = 0;


    nand_select();

    while (i < len)

    {

        nand_cmd(0x00);


        nand_addr(addr);


        nand_cmd(0x30);

        

        nand_wait_ready();

        

        for (; (col < 2048) && (i < len); col++)

        {

            buf[i] = nand_data();

            i++;

            addr++;

        }

                

        col = 0;

    }

            

    nand_deselect();

}

        

static void nand_init(void)

{

#define TACLS   0

#define TWRPH0  1

#define TWRPH1  0

        

    NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);

    NFCONT = (1<<4)|(1<<1)|(1<<0);    

}

        

        

/* 1: from nor 0: from nand */

static int isBootFromNorFlash(void)

{

    volatile int *p = (volatile int *)0;

    int val;


    val = *p;

    *p = 0x12345678;

    if (*p == 0x12345678)

    {

        *p = val;

        return 0;

    }

    else

    {

        // nor

        return 1;

    }

}

        

void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)

{

    int i = 0;

    if (isBootFromNorFlash())

    {

        while (i < len)

        {

            dest[i] = src[i];

            i++;

        }

    }

      else     // from nand

      {

        nand_init();

        nand_read_ll((unsigned int)src, dest, len);

    }

}

        

void clear_bss(void)

{

    extern int __bss_start, __bss_end;

    int *p = &__bss_start;

        

    for (; p < &__bss_end; p++)

        *p = 0;

}    


修改对应目录Makefile


obj-y   := smdk2440.o boot_init.o

把smdk2440/目录下内容放最前面,满足4K内


vim arch/arm/cpu/u-boot.lds


board/samsung/smdk2440/built-in.o (.text*)

修改重定位代码:


#if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SPL_BUILD)

        sub     sp, sp, #CONFIG_SYS_MALLOC_F_LEN

        str     sp, [r9, #GD_MALLOC_BASE]

        #endif

        

    #if defined(CONFIG_S3C2440)

        mov r0, #0

        ldr r1, = CONFIG_SYS_TEXT_BASE

        ldr r2, = CONFIG_SYS_TEXT_BASE

        ldr r3, =__bss_end

        sub r2, r3, r2

        bl copy_code_to_sdram


        bl clear_bss

        ldr pc, =call_board_init_f

        

call_board_init_f:

        mov     r0, #0

        bl      board_init_f

        

        ldr     sp, [r9, #GD_START_ADDR_SP]     /* sp = gd->start_addr_sp */

        bic     sp, sp, #7                      /* 8-byte alignment for ABI compliance */

        ldr     r9, [r9, #GD_BD]                /* r9 = gd->bd */

        sub     r9, r9, #GD_SIZE                /* new GD is below bd */

        

        mov r0, r9

        ldr r1, = CONFIG_SYS_TEXT_BASE

        bl  board_init_r

#else

        /* mov r0, #0 not needed due to above code */

        bl      board_init_f


        ...

#endif


去掉pie选项vim arch/arm/config.mk


#LDFLAGS_u-boot += -pie

#ALL-y += checkarmreloc

 


此外board.c里面还应修改


board_init_f

    //addr -= gd->mon_len;

        //addr &= ~(4096 - 1);

        addr = CONFIG_SYS_TEXT_BASE ; 

烧写u-boot到nand


bootloader:

    tftp 30000000 u-boot.bin

    nand erase.part bootloader

    nand write.jffs2 30000000 bootloader

烧写u-boot到nor


tftp 30000000 u-boot.bin

    protect off all

    erase 0 3ffff   (256K)

    cp.b 30000000 0 40000


关键字:u-boot  移植  重定位  NAND启动 引用地址:u-boot-2014.10移植(8)重定位,支持NAND启动

上一篇:u-boot-2014.10移植(7)修改环境变量的存储位置
下一篇:双轴加速度测量系统ADXL202的性能特点和应用场景

推荐阅读最新更新时间:2024-11-17 15:01

Linux-2.6.32.2内核在mini2440上的移植(二)---yaffs2文件系统移植
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 【1】嵌入式linux应用开发完全手册,韦东山,编著。 【2】 http://blogold.chinaunix.net/u3/101649/showart_2276906.html
[单片机]
Linux-2.6.32.2内核在mini2440上的<font color='red'>移植</font>(二)---yaffs2文件系统<font color='red'>移植</font>
linux 2.6.32 在arm9(s3c2440)平台的移植2 -- Kconfig和Makefile(2)linux
Linux内核源码树的每个目录下都有一个Kconfig和Makefile, 分布到各目录的Kconfig构成了一个分布式的内核配置数据库, 每个Kconfig分别描述了所属目录源文档相关的内核配置菜单. 在linux目录执行内核配置make menuconfig时, 从Kconfig中读出菜单, 用户选择后保存到linux-2.6/.config的内核配置文档中. 在内核编译时, 主Makefile调用这个.config, Kconfig就是对应着内核的每级配置菜单. 添加新的驱动时需要修改有两种( 1如果添加的只是文件, 则只需修改当前层Kconfig和Makefile文件; 2如果添加的是目录, 则需修改当前层和新添目
[单片机]
[stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
_ :这里的动画是黄色矩形区域中一个模仿俯视图的起重机运作动画,一个是模仿主视图的吊钩的运动。通过改变初始Init函数中的数据b_x,b_y实现矩形区域的移动。当实时采集时要首先根据起重机的实际情况改变比例,当传感器传来数据时就相当于这里的run函数,只要把传感器数据接收函数和相关函数结合即可。 _ :main code: 1 #include stdlib.h 2 #include GUI.H 3 /* 4 颜色 5 */ 6 #define Black 0x000000 7 #define White 0xFFFFFF 8 #define Blue 0xFF0000 9 #define R
[单片机]
iTOP-4412开发板-QtE4.7-usb3G上网卡移植教程
开发板用的是迅为的iTOP-4412开发板 移植华为 E261 WCDMA 12d1:1446USB 上网卡到 4412 开发板 QtELinux 系统。 1 内核配置 配置内核以下选项 和 如下图所示 然后编译内核,烧写到开发板。 2 工具的编译 本次移植共需要四个工具,它们互相有依赖关系,为了方便编译,将它们拷贝到同一目录 并解压,如下图所示。 2.1 编译libusb-0.1.12 进入文件夹 libusb-0.1.12,执行以下命令。 进入文件夹 libusb-0.1.12,执行以下命令。 ./configure --host=arm-none-linux-
[单片机]
iTOP-4412开发板-QtE4.7-usb3G上网卡<font color='red'>移植</font>教程
05-S3C2440学习之内核(移植)linux3.4.2移植(2) yffs2文件系统移植+内核裁剪+内核制作补丁
一、移植YFFS2文件系统 yffs文件系统更加支持nand设备 上节移植了jffs2文件系统(点击查看)到移植的内核中,这节我们将yffs2文件系统移植到刚移植好的内核中。 (1)获取源码并解压 git clone git://www.aleph1.co.uk/yaffs2 tar xjf yaffs2.tar.bz2 (2)给内核打上yffs2补丁 ./patch-ker.sh c m /home/book/linux-3.4.2 (3) 配置内核支持YAFFS 1. ls fs/yaffs2 (4)编译、生成uImage 出错,制作yffs2 source工程. (
[单片机]
05-S3C2440学习之内核(<font color='red'>移植</font>)linux3.4.2<font color='red'>移植</font>(2) yffs2文件系统<font color='red'>移植</font>+内核裁剪+内核制作补丁
linux 调试之lrz的移植与一些说明
开发板:RT5350 编译器:mipsel-linux-gcc ( 如果是arm平台和arm_linux的话,请参照修改即可) 1.获取源码:lrzsz-0.12.20.tar.gz 2. 解压: tar–xvf lrzsz-0.12.20.tar.gz 3.添加配置参数: vi mipsel-linux.cache (默认下没有这个文件,因为新建这个文件并打开,添加以下内容) 添加内容: ac_cv_prog_CC=${ac_cv_prog_CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc'} 备注一下: /opt/buildroot-gcc342/bin是mipse-l
[单片机]
linux 调试之lrz的<font color='red'>移植</font>与一些说明
ARM开发板系统移植-----kernel的编译
前面一篇文章介绍了开发板上系统软件的第一部分--bootloader的编译方法。 背景:把bootloader烧写到开发板的Nand Flash中后,开发板从Nand启动,硬件会自动将bootloader加载到内存中运行,bootloader将板载资源都初始化完成后,会停留在一个命令行界面,接收并执行用户敲入的命令。这时候用户可以通过命令控制开发板,比如查看参数列表:print、读写nand:nand readnand write 、内存管理:mm、设置参数列表:setenv、网络下载:tftp、启动内核:bootm等等。如果我们把一个编译好的内核通过tftp服务器下载到内存中,就可以通过bootm 命令启动内核。 好吧,
[单片机]
ARM开发板系统<font color='red'>移植</font>-----kernel的编译
u-boot.lds文件详解
网上大部分u-boot.lds文件的分析大部分都是千遍一律,例如下面就是本人在网上找到的关于u-boot.lds的资料。 OUTPUT_FORMAT( elf32-littlearm , elf32-littlearm , elf32-littlearm ) /*指定输出可执行文件是elf格式,32位ARM指令,小端*/ OUTPUT_ARCH(arm) /*指定输出可执行文件的平台为ARM*/ ENTRY(_start) /*指定输出可执行文件的起始代码段为_start*/ SECTIONS { /*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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