u-boot-2009.11在mini2440上面的移植

发布者:masphia最新更新时间:2022-06-23 来源: eefocus关键字:u-boot  mini2440  移植 手机看文章 扫描二维码
随时随地手机看文章

最近在学习u-boot,通过一周的不停的捣鼓,终于成功移植u-boot到mini2440开发板上,我承认我很菜。中间走了很多弯路,先是烧写Norflash失败,导致原厂u-boot丢失,自己的U-boot也无法烧写。后是移植u-boot-1.16失败。u-boot的移植成功与否与很多因素有关系,与开发板,编译工具链,U-boot版本等等。对于菜鸟来说,网上的移植文档茫茫多,通常会把自己弄晕过去,即使你的开发板,编译工具链,还有u-boot版本全都一样,你按照他的步骤也未必能成功,因为我们菜鸟通常都还不具备u-boot的代码分析能力和修改能力,只能按着别人的代码修改。查了很多移植文档后来发现有个牛人,用过mini2440的人应该都知道这个人-tekkaman,这哥们居然成功移植各种版本的u-boot到mini2440,而且分析透彻,完全原创。后来在友善之臂的官网上找到了一份官方的u-boot移植文档,这份文档就是友善之臂联系tekkaman编写的,看来tekkaman真乃神人也!通过这个文档的指点,我终于顺利的移植u-boot 2009.11到mini2440。为了让以后得哥们少走一些弯路,我写下此文,希望能够给他人提供一点帮助,先声明此贴是基于Mini2440的移植文档的。该移植文档有位好心的哥们已经将其上传至csdn :http://download.csdn.net/source/2889911。


我的开发板平台:board:mini2440; cpu:s3c2440;sdram:64M; nor:2M; nand:128M


交叉工具链:arm-linux-gcc-4.3.2


u-boot版本:u-boot-2009.11


第一部分:u-boot基础知识(推荐阅读《bootloader技术内幕》)


如果你已经了解了基础知识,请无视这部分。


u-boot是最简单的概括就是类似于windows的bios,我想只要亲手装过系统的哥们应该都知道这个bios是干嘛的。最只要的作用还是引导系统的。同样u-boot的作用也是一样,不过他在引导系统之前还有对硬件资源进行一些初始化,比如说cpu内部寄存器初始化,内存初始化等等。


一个嵌入式的存储设备通过通常包括四个分区,第一分区存放的当然是u-boot,第二个分区存放着u-boot要传给系统内核的参数,第三个分区是系统内核(kernel),第三个分区则是根文件系统。

嵌入式使用的存储设备一般都是flash闪存,flash又分两种,一种是norflash,一种是nandflash,它们的区别在于:nor是十六位数据线一次可以传16位数据,它可以用cpu的地址线寻址,读取数据比较快,但是价格比较昂贵,而nand则是8位数据线,一次只能传8位的数据,读取数据相对比较慢一点,但是他价格比较便宜,比较受欢迎。Nand不是通过cpu的地址总线来寻址的,nand是直接与cpu相连的,通过对cpu内部的寄存器的控制来访问nand。Nand不是线性寻址方式,因为他不是通过分字节访问的,一个nand的最小单位是页(page),很多个page又组成一个块(block),最后所以的block组成了nandflash,所以要对nand进行访问,得知道通过指定block和page来访问。Nand又分大页nand和小页nand,结构上有一点点细微的差别。

这个是K9F1G08U0B大页flash的结构,可以看出它的一个block是有64个page组成的,整个nand是由1024个block组成的。


         U-boot的主要任务及典型结构框架


         u-boot的任务分为两个阶段(stage1,stage2)(按执行的先后顺序列出):


第一阶段:主要在cpu/xxx/start.S和和lowlevel_init.S两个汇编文件中完成


1,  硬件设备的初始化,包括中断,cpu速度和时钟,ram,led,内部指令、数据 cache。


2,  为加载bootloader的stage2准备ram空间,计算stage2代码所需空间大小,和设置stage2代码起始地址在ram空间的位置。注意此处的ram是sdram内存,不要和arm内部的4k ram混淆了。


3,  拷贝stage2的代码到ram空间


4,  设置好堆栈


5,  跳转到stage2的c程序入口点


第二阶段:主要在/board/board.c和/common/main.c 中完成


1,  初始化本阶段要用到的硬件设备,串口(用来使用打印),Led(用来指示U-boot的运行),等等。


2,   检测系统内存映射,检测系统哪些地址被实际对应到外部的sdram


3,  将kernel映像 和根文件系统映像从flash上读到ram空间


4,  为内核设置启动参数,包括存储设备参数,命令行参数,RAMDISK参数,INITRD参数等等。


5,  调用内核


第二部分u-boot移植


我用的ARM芯片是S3C2440,由于U-BOOT移植没有提供对S3C2440的支持,我们只有选择对S3C2410的代码的修改来完成s3c2440的移植。首先我们要了解S3C2410和S3C2440的区别才能知道应该对哪些部分进行修改


S3C2440和S3C2410的区别主要是2440的主频更高,接口方面增加了摄像头接口和AC’97音频接口,寄存器方面,出了新增模块寄存器外nand flash的控制寄存器有了较大的变化,芯片的时钟频率控制寄存器有一定的变化,其他寄存器是兼容的,综上所述,我们要的的时钟频率和NAND FLASH底层驱动。另外根据SDRAM芯片不同还需修改SDRAM刷新频率和SDRAM RAS充电速度。再者要想u-boot在nor,sdram,nand都可以运行,还得修改代码的定向文件。


以下移植步骤是我基于tekkaman的移植文档修改的,tekkaman的移植步骤大而全,完善了u-boot的所有功能,但是操作比较复杂,不适合初学者,我秉着最简单,最容易理解的原则做了修改,希望能给初学者一些帮助。


因此我们主要需要修改的文件有:


/cpu/arm920t/start.S


在此文件中修改cpu时钟频率,和代码重定向代码,同时为了支持nand启动,我们还需要添加nand_read.c的nand驱动。


/board/sbc240x/lowlevel_init.S


在此文件中修改SDRAM相关寄存器


/board/Samsung/mini2440/mini2440.c


再此文件中修改cpu时钟频率,肯定会有人奇怪,为什么在start.S文件中修改了cpu时钟频率,这里还要该一次呢?因为第二阶段的代码mini2440.c又会重新设置时钟频率,如不修改。就变成了s3c2410的时钟设置了,结果是跑不起来。


我将整个移植过程分为3个阶段,我只列出操作步骤,没有详细陈述怎样修改代码,详细代码部分还请参考这个手册http://download.csdn.net/source/2889911。我的步骤中删减了一些手册中的步骤,去除了类似于led指示,网卡驱动等等步骤。这些步骤不影响移植,删减有利于初学者的学习。


第一阶段:建立开发板文件


修改u-boot-2009.11/Makefile文件


在board目录中建立开发板mini2440的目录


在include/comfigs中建立开发板配置文件


测试编译环境


第二阶段:修改启动代码


修改cpu频率初始化设置,在start.S中


修改lowlevel_init.S文件,修改sdram相关寄存器和修改内存启动u-boot支持


增加代码重定向功能,使其能够支持sdram,nand启动,在start.S中修改,另外增加nand_read.c文件,使其能够从nand启动,并在Makefile中增加对nand_read.o文件的链接。


第三阶段:修改初始化代码


修改/board/Samsung/mini2440/mini2440.c文件,修改CPU时钟。


通过上面三个阶段的修改,编译并烧写进flash或内存并运行,如果你的终端飘过一串english,那表示成功!如编译后的Bin文件大250K有可能无法运行。


U-boot能成功运行,但也还不能引导内核,因为没有增加U-boot的stage2阶段的nand驱动。


综上,其实u-boot的移植需要的改的就是cpu时钟频率,sdram相关参数,增加nand驱动和nand启动功能三个部分。如果还需要nand引导或者网络支持等等功能,就增加相应的驱动。


 


PS:移植u-boot是个很纠结的过程,作为菜鸟来说,资料太多,都不知道应该相信哪份资料,我建议去你开发板所在官网找官方的移植文档,那个比较可靠,如没有,就找最接近你开发板配置的移植文档。还有不要一开始就分析源码,那样效率很低,我的方法是这样的,这也是视频教程里面的老师说的,先对u-boot源码目录结构有个大体的了解先跟着步骤移植,也不要去纠结每个步骤到底什么意思,移植完了之后再去分析整个移植过程和源码。

关键字:u-boot  mini2440  移植 引用地址:u-boot-2009.11在mini2440上面的移植

上一篇:Linux2.6.32移植到MINI2440(2)添加Nand Flash驱动,修改分区
下一篇:友善之臂最新版mini2440学习笔记——开发板架构和搭建开发环境

推荐阅读最新更新时间:2024-11-13 05:56

U-BOOT移植的经验之谈
也不知道U-BOOT移植到底是不是成功了,或者说是完全成功了。移植后的U-BOOT其他的一些功能,比如printenv,loadb,bdi,fli等命令和显示的信息都是正确的 也能加载uclinux,但就是加载不成功有些uclinux内核能加载进去,可是不能解压;有些根本就没有显示,连内核头的一些信息都没显示,像是死机了,哎,也不知道是哪的原因,还要慢慢搞~~~ 上次也写过一篇差不多的文章: http://www.51hei.com/mcu/1135.html ,本文只是做为那个的补充吧~~~现在就总体的记录一下U-BOOT移植过程中自己做的工作吧。还是用代码的形式进行描述吧,即简单,又讲的清楚: (说明:顶行写的为需要修改的文件名
[单片机]
LPC2119简介 μC/OS-II在LPC2119上的移植
本文在分析实时嵌入式系统mC/OS-II和LPC2119芯片的基础上,对mC/OS-II向处理器上移植前需要了解的知识和需要做的前期准备工作进行了分析和讨论,最后给出了移植的具体工作。论文着重分析了mC/OS-II的移植。 μC/OS-II是一个完整的,可移植、可固化、可裁减的占先式实时多任务内核,它功能强大,支持56个用户任务,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。公开源代码,程序可读性强、移植性好,同时可免费获得。 LPC2119是由PHILIPS生产的一款32位ARM7TDMI-S微处理器,其核心为高性能的32位RISC体系结构,并具有高密度的16位指令集和极低的功耗。具有零等待128K字节的片内FL
[单片机]
LPC2119简介 μC/OS-II在LPC2119上的<font color='red'>移植</font>
如何将lua移植到arm平台的linux内核
将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的,于是自己研究了下,现将它分享出来。 移植到arm平台,主要是要重新实现setjmp和longjmp两个函数,网上相关的资料很少,最后终于找到一个klibc的项目,里面有setmp和longjmp的arm平台的实现,于是直接拿来用了,不用说,当看到脚本在内核中执行并打印出 hello,world 的时候,还是很exciting的。这里讲下使用的方法,具体的代码可以去下面的位置下载: https://github.com/
[单片机]
文件系统的移植(四):cramfs 文件系统的移植
内 核 版 本:linux-3.0 u-boot版本:u-boot-2010.09 开发板型号:FL2440 1、对根文件系统进行修改 无修改 2、添加内核对 cramfs 的支持 $ vt100 $ make menuconfig File systems --- Miscellaneous filesystems --- * Compressed ROM file system support (cramfs) 修改Makefile $ vim Makefile 修改195、196行 $ make
[单片机]
文件系统的<font color='red'>移植</font>(四):cramfs 文件系统的<font color='red'>移植</font>
ARM移植MPlayer
奋斗了一晚上,多方查找资料,终于将MPlayer交叉编译成功了,小记经验于此。 MPlayer版本:MPlayer-1.0rc2.tar.bz2; 交叉编译器:cross-3.2.tar.bz2 1 在我的主目录中解压Mplayer 2 安装交叉编译器,将cross-3.2.tar.bz2以root权限拷贝到/目录执行解压操作 3 cd Mplayer目录 4 修改stream.c,注释掉 //#ifdef USE_DVDREAD //extern stream_info_t stream_info_dvd; //#endif //#ifdef USE_DVDREAD // &stream_info_dvd, //#endif 原
[单片机]
u-boot-2016.09移植(8)-合并tq210-spl.bin与u-boot.bin
为了方便烧录,我们直接将u-boot.bin追加到tq210-spl.bin后面,组成一个文件。 修改Makefile,定义合并规则: combine: u-boot.bin spl/u-boot-spl.bin FORCE cp $(objtree)/spl/tq210-spl.bin $(objtree)/tmp.bin truncate $(objtree)/tmp.bin -c -s 16K cat $(objtree)/u-boot.bin $(objtree)/tmp.bin cp $(objtree)/tmp.bin $(objtree)/ky-uboot.bin chmod 777 k
[单片机]
u-boot-2016.09<font color='red'>移植</font>(8)-合并tq210-spl.bin与u-boot.bin
OK6410A 开发板 (三) 15 u-boot-2021.01 boot 解析 U-boot 镜像编译部分 Makefile解析
Makefile 分几层 顶层 : Makefile 2层 : scripts/Makefile.build 2层 : scripts/Makefile.autoconf 2层 : scripts/Makefile.spl 当然还有其他的Makefile , 不过编译log 中没提到 例如 scripts/Kbuild.include 重要Makefile 以及变量 arm cc 的编译 : rule_cc_o_c 与 cmd_cc_o_c cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $ # Built-in and composite module parts
[单片机]
我的MiniGUI移植之路
一:前言 最近几天在移植minigui,一直没有使用过minigui界面,想看看什么效果,顺便学习一下,毕竟是国产的。花了我三天的时间,终于在我的LCD上显示minigui界面了,可以运行MDE演示程序。期间遇到很多问题,还好我都把我的问题以及解决方法都记录下来,下面开始我的移植。 二:使用环境的搭建 1.主机:RedHat Enterprise Linux AS4 2.交叉编译工具路径:/usr/local/arm/2.95.3/ (用于编译vivi,minigui1.3.3) /usr/local/arm/3.3.2/ (用于编译busybox1.5.1) /usr/local/arm/3.4.1/ (
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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