u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动

发布者:SerendipityDawn最新更新时间:2024-11-07 来源: cnblogs关键字:u-boot  移植  start 手机看文章 扫描二维码
随时随地手机看文章

----------------------------------------------------------

使用环境

PC:     Centos5.4


kernel: 3.0.1


corss:  arm-linux-gcc 4.4.1


arm:    s3c6410

uboot:  uboot-2010-03

----------------------------------------------------------




uboot的第一阶段,其实做的事情也是比较多的,,但是一般来说,重点就是配置各种硬件环境,来保证第二阶段能正常启动.

而该部分根据不同的硬件也是不同的..像我的,s3c6410有2片dram,和一片nand..所以我为了保证我的代码能正常执行,

我必须得把代码搬移到内存里面去.不然代码在nand中也没法执行...但是为什么代码在nand中不能执行呢?其中一个比较

重要的原因就是nand并不是挂在CPU总线上面的,而是采用专门的硬件处理单元来控制的...nand控制器.

在你不添加任何代码的情况下,是不能控制外围的nand芯片的...但是怎么办.cpu内根本没有代码,怎么才能读取nand中的

代码到内存中去呢?没错-----s3c6410在启动的时候会帮我们以nand的最基本的时序.搬移nand中的前8K代码,到stepping

这样就可以执行了.而uboot的代码远比这个大..以至于我们得紧靠这部分代码,来完成剩下的代码部分的搬移....


今天的重点就是这个了.主要是来完成nand中剩余部分的uboot搬移到ram中,以便uboot能正常启动起来....好了.直接开始..


首先,你得有smdk6410_config 编译目标,不然怎么开始.....此处省略N字...请看我的移植篇第一篇...


下面开始.打开start.S (cpu/arm1176/start.S)和smdk6410.h (include/configs/smdk6410.h)

我们得一边参看头文件中的配置,一边修改代码,来达到我们的目的..

在start.S 中,最开始就是一段啥?异常向量表,此处忽略,请参考分析篇中对start.S的分析


前面一部分是MMU啥的...直接招待after_copy:这个标签

什么?之前没有任何copy的东西???怎么有after_copy一说呢?

没错..所以我们得把copy代码添加在这里..从nand中把数据搬移出来,放到这之前完成,这样才对得起这个after_copy的标签

说干就干,这里我是调用的C代码,你也可以用汇编来完成的,只要功能一样就行了



图片转文字:


 ldr r0, =0xff000fff

 bic r1, pc, r0

 ldr r2, _TEXT_BASE

 bic r2, r2, r0

 cmp r1, r2

 beq     after_copy

#ifdef CONFIG_NAND_BOOT

 mov r0, #0x1000

 bl copy_from_nand

#endif



这里我们得向我们的配置头文件内添加一个宏,就是 #define CONFIG_NAND_BOOT

接着,我们要去添加我们要调用的copy_from_nand

这个文件比较大,分析篇我会重点分析,究竟nand是如何搬移数据的. 在cpu/arm1176/下创建个文件nand_cp.c,这里我们只要复制下好了,

[cpp] view plaincopyprint?

#include    

#ifdef CONFIG_S3C64XX   

#include    

#include    

#include   

  

static int nandll_read_page(uchar * buf, ulong addr, int large_block)  

{  

    int i;  

    int page_size = 512;  

  

    if (large_block == 1)  

        page_size = 2048;  

    if (large_block == 2)  

        page_size = 4096;  

  

    NAND_ENABLE_CE();  

  

    NFCMD_REG = NAND_CMD_READ0;  

  

    /* Write Address */  

    NFADDR_REG = 0;  

  

    if (large_block)  

        NFADDR_REG = 0;  

  

    NFADDR_REG = (addr) & 0xff;  

    NFADDR_REG = (addr >> 8) & 0xff;  

    NFADDR_REG = (addr >> 16) & 0xff;  

  

    if (large_block)  

        NFCMD_REG = NAND_CMD_READSTART;  

  

    NF_TRANSRnB();  

  

    /* for compatibility(2460). u32 cannot be used. by scsuh */  

    for (i = 0; i < page_size; i++) {  

        *buf++ = NFDATA8_REG;  

    }  

  

    NAND_DISABLE_CE();  

    return 0;  

}  

  

static int nandll_read_blocks(ulong dst_addr, ulong size, int large_block)  

{  

    uchar *buf = (uchar *) dst_addr;  

    int i;  

    uint page_shift = 9;  

  

    if (large_block == 1)  

        page_shift = 11;  

  

    /* Read pages */  

    if (large_block == 2)  

        page_shift = 12;  

  

    if (large_block == 2) {  

        /* Read pages */  

        for (i = 0; i < 4; i++, buf += (1 << (page_shift - 1))) {  

            nandll_read_page(buf, i, large_block);  

        }  

        /* Read pages */  

        for (i = 4; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) {  

            nandll_read_page(buf, i, large_block);  

        }  

    } else {  

        for (i = 0; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) {  

            nandll_read_page(buf, i, large_block);  

        }  

    }  

  

    return 0;  

}  

  

int copy_uboot_to_ram(void)  

{  

    int large_block = 0;  

    int i;  

    vu_char id;  

  

    NAND_ENABLE_CE();  

    NFCMD_REG = NAND_CMD_READID;  

    NFADDR_REG = 0x00;  

  

    /* wait for a while */  

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

        id = NFDATA8_REG;  

    id = NFDATA8_REG;  

  

    if (id > 0x80)  

        large_block = 1;  

    if (id == 0xd5)  

        large_block = 2;  

  

    /* read NAND Block. 

     * 128KB ->240KB because of U-Boot size increase. by scsuh 

     * So, read 0x3c000 bytes not 0x20000(128KB). 

     */  

    return nandll_read_blocks(CONFIG_SYS_PHY_UBOOT_BASE, 0x60000,large_block);  

}  

  

#endif  

然后修改Makefile 把我们的nand_cp.c添加到uboot中去编译


最后make下.你会发现.编译好了....编译器记得重新make smdk6410_config下.因为我们修改了头文件,需要重新生成.mk文件


今天的任务基本完成了,今天比较轻松,接着我们稍微修改下smdk6410.h中的配置.

主要是改几个名字,把什么6400的改成6410就好了..

没错,你只要查找替换就行了...因为我们现在编译的已经是6410了.不是6400了...


修改完之后,有一个地方得稍微改下.



cpu/arm1176/s3c64xx/Makefile




把6400改成64XX因为,我们的配置文件里面已经没有6400了....

这个请查看头文件中的配置定义...


关键字:u-boot  移植  start 引用地址:u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动

上一篇:ok6410的mplayer移植
下一篇:u-boot2010.03 移植篇(三)-----进一步修改start.S,smdk6410.h,支持nand启动及配置DM9000网卡

推荐阅读最新更新时间:2024-11-17 03:19

S7-200 SMART 通信端口以及连接方式
每个S7-200 SMART CPU都提供一个以太网端口和一个RS485端口(端口0),标准型CPU额外支持SB CM01信号板(端口1),信号板可通过STEP 7-Micro/WIN SMART软件组态为RS232通信端口或RS485通信端口。 CPU 通信端口引脚分配 1.S7-200 SMART CPU 集成的 RS485 通信端口(端口0)是与 RS485 兼容的9针 D 型连接器。CPU 集成的 RS485 通信端口的引脚分配如表1. S7-200 SMART CPU 集成 RS485 端口的引脚分配表所示。 表1. S7-200 SMART CPU 集成 RS485 端口的引脚分配 2.标准型 CPU 额外支持
[嵌入式]
<font color='red'>S</font>7-200 SMART 通信端口以及连接方式
面对新冠病毒三星也怕了,Galaxy S20销量将大降
新型冠状病毒的爆发席卷全球,科技巨头也正在进行一场完全不同的战斗。 此前报道称,三星Gumi智能手机工厂中发生一例冠状病毒感染后,于周末关闭。今天早些时候,三星证实另一名工人已被感染,该公司决定关闭工厂。 现在,三星将韩国令人沮丧的Galaxy S20销售量归咎于新型冠状病毒。据IT之家了解到的数据,三星在韩国首日售出70,800部手机,比Galaxy S10少得多,后者售出140,000部手机,有些惨淡,而Galaxy Note10则为220,000部。 三星发言人官方回应称: 由于担心冠状病毒感染,新手机的折扣大幅下降以及线下商店的访客数量影响了销售。 三星
[手机便携]
面对新冠病毒三星也怕了,Galaxy <font color='red'>S</font>20销量将大降
新SE更悬了!苹果重启iPhone 6S:售价更低主攻新兴市场
现在的苹果在iPhone上的重心都是全面屏,而曾经的iPhone SE已经被彻底边缘化,这款产品之所以还在保留的一个重要原因就是,满足那些新兴市场的需求,比如印度。 之前产业链给出消息称,iPhone SE新版可能不会有了,因为苹果所有的精力和资源都给了今年要推出的三款新iPhone X,当然他们边缘化iPhone SE的行动还在继续。 据印度媒体报道称,苹果与纬创在当地合建的工厂已经有新的行动,那就是拓展新的产品线,用于生产新的iPhone,而它就是两年的iPhone 6S系列,本地化生产后会让它的售价变得跟SE一样低,同时更大的屏幕也更适合当地的用户。 对于现在的苹果来说,最当紧的任务就是在印度抢下更多的市场份额,
[手机便携]
S3C2440启动程序运行过程
s3c2440有两种启动方式,一种Nor flash 启动,一种Nand flash 启动。 由于NAND FLASH是接在NAND FLASH控制器上而不是系统总线上,所以没有在S3C2440A的8个BANK中分配地址空间。如果S3C2440被配置成从Nand Flash启动,在S3C2440上电后,Nand Flash控制器的会自动的把Nand Flash上的前4K数据搬移到内部SRAM中,也就是所谓的”Steppingstone”, 同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。系统会从这个内部SRAM中启动,程序员需要完成的工作,就是把最核心的启动程序放在Nand Flash的前4K中,也
[单片机]
<font color='red'>S</font>3C2440<font color='red'>启动</font>程序运行过程
89S52单片机检测控制温度的监测系统实现
  引言   温度检测是许多行业的重要工作条件之一。   无论是粮食仓库、中药仓库,还是图书保存。都需要在符合规定的温度环境条件之中。而温度却是最不易保障的指标。针对这一情况。研制一款可靠、方便、易及时调控的温度检测系统就显得极为重要。笔者运用D1S18B20采集数字信号,通过蓝牙无线通信技术和USB接口技术。实现由89S52单片机检测控制温度的监测系统。   1 系统的结构   整个系统由采集板、通信板和PC机监控程序组成。采集板以温度监测芯片 DS18B20t21、单片机芯片AT89S52和蓝牙芯片BC4为核心分时完成监听主机的命令和数据采集以及数据发送的功能。可以根据接收到的主机的命令随时改变系统的工作状态。 如图1
[单片机]
89<font color='red'>S</font>52单片机检测控制温度的监测系统实现
S3C2440的启动
本文章是学习过一段时间S3C2440所写,如有错误之处请指正。将不胜感激! S3C2440有两种启动模式 一、NandFlash启动模式 NangFlash的价格便宜,但是它不是直接连到CPU的总线上。但是在S3C2440中有NandFlash控制器,通过控制器来访问外部的NandFlash。由于CPU不能通过地址和数据总线直接访问NandFlash,那么当设置为该启动方式时,CPU从哪里调程序呐? 在S3C2440中有一个4KB的Step-Stone,它是为NandFlash的启动而存在。当设置为 该模式时,会将4KB的Step-Stone映射到0地址,然后将NandFlash中前4KB复制到 Step-Stone中,这样系统启
[单片机]
三星Galaxy S10渲染图曝光:屏下摄像头 屏占比惊人
        在智能手机领域,三星一直扮演先行者和领导者的角色。除了最近三星刚刚公布的折叠手机,还有爆料称,三星将首次推出屏下摄像头方案的全面屏手机,预计这款手机为三星S10。   根据消息,三星S10将配备屏下指纹识别,会有三个版本;S10标准版代号为“Beyond”配备圆角曲面屏,顶部和底部的边框极为窄小;手机整体和今年发布的5.8英寸S9大致相同,不过S10将搭载后置三摄,并且前置摄像将隐藏在屏幕下,也就是说三星S10将会是一款真正的全面屏手机。   另外,根据早前的爆料,三星S10预计也会有5G版本,作为一款三星旗舰手机,各种最前沿的黑科技当然是必不可少的。目前关于三星S10的渲染图也已经被曝出,从正面看,几乎就
[手机便携]
市场寒气逼人 SemiTool裁员K&S降薪
据国外媒体报道,半导体产业再添坏消息,SemiTool执行了新一轮裁员,同时Kulicke&Soffa(K&S)采取了降薪措施。 据悉,SemiTool此轮裁员280人。 11月,SemiTool已裁员170人。 处于亏损状态的K&S于11月裁员240人,并放弃了原定于1月的增薪计划。 目前,K&S的高管正在降薪。公司主席兼CEO C.Scott Kulicke将降薪20%。据公司的文件,公司员工的基本薪水将减少10%。
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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