韦东山u-boot移植笔记
- 格式:doc
- 大小:172.50 KB
- 文档页数:18
U-Boot的移植之(一)基础篇:添加新的目标板定义本文使用最新的U-Boot-1.3.0-rc2。
U-Boot本身支持很多开发板,在其源代码中,每个板子都对应一个board/目录下的文件夹(笔者注:这并不确切,因为有的文件夹是供应商名称,下面可以有多个目标板目录,这里只考虑最简单的情况),以及include/configs/目录下的目标板配置头文件。
因此,要添加U-Boot对我们的目标板的支持,首先就是要建立目标板文件夹和配置头文件,并修改相关的Makefile。
下面以实例说明为U-Boot添加新的目标板定义的步骤和过程。
(1)在board/目录下建立目标板目录。
笔者的目标板是XSBASE270,处理器是PXA270。
由于U-Boot中本身支持很多开发板和处理器,可以从中找出与自己处理器型号相同或相近的开发板,在此基础上再做后续修改。
adsvix使用的也是PXA27x处理器,因此可以把它作为模板。
cd board/cp -arv adsvix xsbase270mv xsbase270/adsvix.c xsbase270/xsbase270.c(2)在include/configs/目录下建立目标板配置头文件。
cd include/configs/cp adsvix.hxsbase270.h(3)修改Makefile。
一是要在总的Makefile(U-Boot源码顶层目录下)中加入目标板的编译配置选项,这也可以参考adsvix的进行修改,只要把目标板名称改换为xsbase270即可:adsvix_config: unconfig@$(MKCONFIG) $(@:_config=) arm pxa adsvixxsbase270_config: unconfig@$(MKCONFIG) $(@:_config=) arm pxa xsbase270这里xsbase270与board/目录下目标板文件夹名称xsbase270一致。
2014.4.16 u-boot学习笔记u-boot版本:u-boot-2014.01-rc1作者:charles.lu参考资料:《ARM嵌入式系统开发:软件设计与优化》,《S3C2440手册》,《嵌入式linux应用开发完全手册》韦东山教学视频,《嵌入式bootloader技术内幕》。
目的:1)分析源码; 2)移植到飞凌嵌入式S3C2440开发板首先看第一阶段的u-boot代码。
打开文件arch/arm/cpu/arm920t/start.S.globl _start_start: b start_codeldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq代码从_start处开始执行。
b start_code即跳转到start_code(b还有后面常有的bl是ARM9跳转指令,若要学习指令可参考《ARM嵌入式系统开发:软件设计与优化》)。
我们往下走,找到start_code,可知首先是硬件初始化,分别做如下工作:1.设置CPU为SVC32模式2.关看门狗3.禁止所有中断4.设置时钟分频这里,对于具体的硬件初始化细节,可以参考《S3C2440手册》,为什么要这么做就不讲了,可以参考上述的书籍。
#if defined(CONFIG_AT91RM9200DK)||defined(CONFIG_AT91RM9200EK) 在头文件include/configs/smdk2410.h中没有这个宏定义,所以这个#if 和#endif里的代码不用管。
后面又有一个宏定义,区分S3C2440和S3C2410。
#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit5.跳转到cpu_init_crit,代码在下面。
自己编写bootloaderbootloader从flash上把bootloader读取内存(包括有flash的读写、初始化内存SDRAM、同时也会初始化时钟,关闭看门口,启动则就是地址跳转,设置参数)最简单的bootloader1.关看门狗,设置时钟、设置SDRAM、设置NAND FLASH,2.把内核从NAND FLASH(开发板配置的nor flash比较小,没法写入内核)3.设置要传给内核的参数4.跳转执行U-boot制作从start.s文件开始分析。
下载下来的u-boot只有s3c2410,所以需要自己修改1.把board(单板)下面的2410拷贝成2440.2.拷贝配置文件,在include-configs把smdk2410_config.h拷贝成smdk2440_config.h3.如果此时make smdk2440_config,会提示没有规则的错误,需要修改其他文件4.搜索带smdk2410内容的文件grep“smdk2410”*-nR---可以看到boads.cfg中有相关内容,模仿2410来写。
5.修改过后,就可以make了。
编译通过后,进行调试,看什么地方出错。
1.在sourceinsight中添加新添加的内容。
2.分析错误,根据启动流程一步一步的进行。
3.start.s里面一些初始化代码修改,用之前裸机写的代码来替换部分初始化。
4.串口乱码,发现在get_HCLK里面没有定义config_s3c2440U-BOOT移植1.在http://www.denx.de/wiki/U-Boot/SourceCode中下载最新u-boot2.放入服务器/work/system目录下。
3.解压u-boot。
4.同时也在window下解压出来,建立sourceinsiged工程。
5.sourceinsiged中先把所有加入,然后把board中只保留summary的2410,Arch目录下只保留Arch/arm/cpu/arm920t(因为2440用的arm920t)6.在根目录下执行make smdk2410_config(配置)7.编译,执行make(全局编译)8.编译不能通过,有可能是编译器版本比较低的缘故。
在at91rm9200上移植u-boot1 前言:最近写驱动写应用感觉有点乏味了,像玩点新鲜的,于是我拿手里的那块H9200E开发板玩玩移植UBOOT,参考开发板提供的uboot的源码我移植了一个ubot-1.1.1。
目的是通过移植了解掌握atmel 的at91rm9200的启动流程个uboot的启动流程和移植要点及其方法。
我把在移植uboot过程中遇到的问题记录下来,希望能帮助自己在以后的移植过程中更快的找到方向,也希望能帮助初学的朋友少走些弯路。
开发板的硬件配置SDRAM 32MNORFLASH 4M (atmel的AT49BV322A)NANDFLASH 64M (SAMSUNG的K9F1208U0B)2 移植思路我认为要想真正的理解和成功的移植uboot得先弄明白at91rm9200的启动流程和ubot的启动方法at91rm9200有片内引导和片外引导 2 种启动方式,由一根跳线控制。
上电MCU检测BMS的电平,如果是高则选择片内ROM启动,如果是低则从外部flash启动。
(1)片外引导执行烧在flash上的引导程序。
(2)片内引导 at91rm9200内部本身有128k的片内rom,其固化了一个bootloader和uploader,片内引导时启动uploader,uploader开启xmodem协议,等待用户上传程序,上传的程序将载入片内SRAM,重映射,然后pc跳转到片内SRAM执行上传的用户程序。
注:片内SRAM只有16k,除去3-4k片内启动程序的占用的部分数据空间,因此下载的程序大小限制在12k内。
官方at91rm9200DK u-boot Flash Programming Solutions文档提供的解决方案如下。
开发板flash上没有引导程序,于是只能用片内引导方式,载入一个12k以内的小程序到内部SRAM运行,而这个小程序初始化SDRAM后,再把u-boot下载到SDRAM运行(u-boot大于12k),pc跳到SDRAM的u-boot位置运行u-boot,u-boot启动后再用u-boot自己的flash烧写命令把自己烧到flash去,以后就可以片外flash启动了。
11U-BOOT的启动流程及移植摘要:嵌入式系统一般没有通用的bootloader,u-boot是功能强大的bootlo ader开发软件,但相对也比较复杂。
文中对u-boot的启动流程作了介绍,详细给出了u-boot在S3C44B0开发板上的移植方法和步骤。
1Bootloader及u-boot简介Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。
Bootloader代码与CPU芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。
由于bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader,开发时需要用户根据具体情况进行移植。
嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较流行,功能比较强大的bootloader,可以支持多种体系结构,但相对也比较复杂。
bootloader的实现依赖于CPU的体系结构,大多数bootloader都分为stage1和stage2两大部分。
Bootloader的基本原理见参考文献。
u-boot是sourceforge网站上的一个开放源代码的项目。
它可对PowerPC MPC5xx、MPC8xx、MPC82xx、MPC7xx、MPC74xx 、ARM(ARM7、ARM9、StrongARM、Xscale)、MIPS(4kc、5kc)、X86等处理器提供支持,支持的嵌入式操作系统有Linux、Vx-Works、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用来开发嵌入式系统初始化代码bootloader。
软件的主站点是http //sourceforge.net/projects/u-boot。
[精华] 《嵌入式LINUX应用开发完全手册》一书作者:韦东山() 的部分备课笔记----------------------------------------------------------------------------------------------------------------------特别说明:此文章的原始出处/sz_farsight以下文章是华清远见深圳培训中心《嵌入式LINUX应用开发完全手册》一书作者韦东山() 的部分备课笔记,笔记语言比较风趣,比较好玩,此文档欢迎转载,但转载请保留相应个人信息及此段说明,谢谢!----------------------------------------------------------------------------------------------------------------------第1天1.入门介绍大家好,这两天我们将一起度过。
我叫韦东山,韦小宝的韦,东方的东,高山的山,大家直接叫我名字就可以了,也别叫我老师。
可能比你们都大上几年,在LINUX方面比你们早入门了几年门。
今天有幸来讲第一节课,我很乐意帮助大家解决一些入门问题。
当然,入门问题也有很难的问题,回答不上请大家见谅,等我下班后,回到家,找到了答案再告诉大家。
好了,下面开始我们的课程。
大家的基础各不相同,所以我只能假定大家第一次接触LINUX的驱动编写。
其实LINUX系统的一些原理,跟人类社会很有相通之处,那就分层分工,各司其职。
假设你是一个集团的老总,下面有很多子公司。
那你想了解公司的运营情况时,是不可能去实地考察每个公司的。
那怎么办?只能看每个子公司的财务报表。
打开报表==>阅读报表,嗯,明白了==>批示、下发。
报表怎么来的呢?老总可不管,都是由底下的人弄好的;批示怎么执行的呢?老总也不管,都是由底下的人做的。
这些“底下的人”,就是“驱动人员”回到我们的LINUX系统,我们控制电路板上的LED,怎么办呢?同样:打开LED文件==>写数据到文件==>LED亮、灭,这个文件怎么来的?写数据到这个文件后,LED怎么就会亮、灭?这些工作,就是“驱动人员”做的。
几经艰辛,终于基本完成了u-boot在s3c44b0的移植工作,在些记录一下在移植过程中所碰到的困难和解决方法(一些心得),作为日后参考之用,也希望能够帮到其它有需要的人^_^。
1.来由:在我搞完ucos后(本来我是想学uclinux的,不过在对系统一无所知的情况下,还是先学一下ucos比较实际^_^,从中也可以对系统有个清晰的概念),我意识到要搞系统的话一个功能强大的bootloader是必不可少的,而我的板上自带的是armboot(其实我个人觉得应用在ARM上的话armboot已经足够了,毕竟u-boot也是从armboot中发展过来的,纯属个人意见),如果我的板上自带光盘有已经移植好的armboot源代码供我参考的话,我想我也不会花这么多时间去搞u-boot,可恨的是我的光盘上只有armboot.bin这个二进制文件,而没有源文件,没办法,我下定主意自己搞一个,考虑了一番后我选择了u-boot,毕竟参考资料相对比较多,再我学完u-boot后再回头看armboot,简直是一个炉里出的饼,这是后话。
2.准备:说是容易,做起来却挺难。
因为编译u-boot要在linux环境下,而不能在我们平时所熟悉的ads下那么直观。
首先要建立好交叉编译环境,这个交叉编译环境可以自己来做,不过完全没必要,而且难度也挺大,一般是下载人家编译好的工具。
我刚开始在这里就郁闷了很久,现在会了以后觉得原来就是这么简单,在些我把方法说清楚,希望不会再有人为这个问题郁闷了^_^:1)在网上下载一个u-boot源代码,我用的是1.1.2版本的,最新的应该是1.1.4的吧,其实差不多,那就像我那样下载一个1.1.2版本的吧。
把源文件解压,这个应该不用说了吧,学过linux的人应该会,不会的话我想你继续做下去也困难,那就先装个linux用下吧(我用的是RedHat的,哦对了,编译程序是需要gcc 编译器的,所以安装方式一定要选择工作站哦^_^)。
Part1:remap.remap比较简单,和MMU的功能可以看做是等价的,只是一般remap地址估定为0x0 ,网上有个帖子叫<<ARM remap与重定位摘抄>>专门讲了它对remap的理解,对remap的作用是这样讲的: 当ARM处理器上电或者Reset之后,处理器从0x0取指。
因此,必须保证系统上电时,0x0处有指令可以执行。
所以,上电的时候,0x0地址处必定是ROM或者Flash(NOR)。
但是,为了加快启动的速度,也方便可以更改异常向量表,加快中断响应速度,往往把异常向量表映射到更快、更宽(32bit/16bit)的RAM中。
但是异常向量表的开始地址是由ARM架构决定的,必须位于0x0处,因此,必须把RAM映射到0x0。
文中提到了ARM处理器remap的三种情况,如下1)如果处理器有专门的寄存器可以完成Remap。
那么Remap是通过Remap寄存器的相应bit置1完成的。
如Atmel AT91xx2)如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank的起始地址,那么只要把RAM的起始地址编程为0x0,也可以完成remap。
如samsung s3c4510 .3)如果上面两种机制都没有,那么Remap就不要做了。
因为处理器实现决定了SDRAM对应的bank地址是不能改变的。
如Samsung S3c2410.不过我的看法有点稍微不一样,如果上面两种机制都没有,那么Remap就不要做了,它给的典型例子是Samsung S3c2410 ,2410虽然sdram对应的bank地址不能改变,但它有MMU功能, MMU可以起到remap的作用,常用的最典型的应该是例子Samsung S3c44b0,它既没有mmu,又SDRAM对应地址有没办法改变.顺便补充下除了4510可以改变每个bank的地址,还有华邦的w90P740(arm7),呵呵,我现在用的U就是这款U,可以把bank的地址随意的设置.2.relocate .relocate (地址重定位),个人觉得这个是boot里面最麻烦也是最核心的部分,刚开始看boot代码的时候,它简直是我的噩梦,不知道大家分析boot的源码流程是否这样,也可能我大学不是计算机的,没学过编译原理(现在也没看过)对链接和加载一无所知,有两个星期非常痛苦,就是不懂人家boot里面的链接脚本为什么要那样写.网上关于uboot的帖子很多,但对链接加载这块,始终写的不详细,不知道是不是太过于基础了,高手都不愿意讲,最后自己找资料,发现其实一切痛苦的根源都是对链接和加载不太清楚造成的,但个人感觉boot除了初始化以外就是搬运程序,如何搬运?为什么要那样搬运都需要对硬件板的地址分布很清楚?而这些都是链接决定的,所以非弄清楚不可!1.我们为什么需要relocate ? 经济方面,(nandflash和norflash 每兆价格相差悬殊),把boot代码放在norflash里面(为什么不放在nandflash里面,因为nandflash读需要驱动支持,norflash可以直接访问),boot通常很小,只需要占用几十k的空间,所以只需要很小的norflash芯片,这样很便宜,而把应用程序通常很大,所以用价格低廉nandflash来储存,实际应用,通过执行boot程序,把nandflash里面代码和数据搬运到内存中来执行,这样比程序直接放在norflash里执行,可以.另外还有运行速度方面的差别,程序在norflash里执行的速度远远小于在sdram中执行的速度,为了追求更高的速度,也需要relocate,让程序在sdram里面执行.2.关于加载域(VMA)和运行域(LMA)(加载域和运行域,加载域是程序代码在ROM、FLASH中的排列次序及地址安排,运行域是程序运行时代码在SRAM、SDRAM中地址安排;存储代码时按照加载域存放在FLASH中,运行时再从FLASH中取出代码到RAM运行域运行,一段代码的加载域和存储域可以不同),杜春雷在它那本经典的<<arm体系结构与编程>>一书专门有一章来讲加载域和运行域不一致的情况,但我当初接触了它的这些加载域和运行域后,看uboot的lds ,uboot的lds没有设置LMA,只是设置了VMA,为此我疑惑很久.直到耐心的看了那本链接器和加载器的书才豁然明白( /viewthread.php?tid=817770 ),任何一个链接器和加载器的基本工作都非常简单: 将更抽象的名字与更底层的名字绑定起来,好让程序员使用更抽象的名字编写代码,链接器的就是把源文件进行符号解析,把解析出来的符号和地址的进行绑定,把全局变量,函数,标号等等这些符合和地址绑定起来.3.boot上电后开始能够正确执行还有个很重要的原因,是要保证boot在系统加电或复位后最初执行的代码是跟地址无关的,(即在代码搬运前所执行的代码是与地址无关),地址无关即地址无关代码生成的这个映象文件可以被放在内存中的任何一个地址上运行。
一:准备移植1、从下面的官网下载最新的U-boot。
用google英文版搜索最新的u-boot源码ftp://ftp.denx.de/pub/u-boot/2、建立sourceinsight工程a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SIb、添加文件到SI工程1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lowersub-directories”点击“OK”2、选中“Board”目录,点击“Remove Tree”,去掉总个目录进入“Board\Samsung\Smdk2410\”,点击"Add All"3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。
进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All"进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree"进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All"进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree"进入“Arch\Arm\Lib\”,点击"Add All"4、选中“Include”目录,点击“Remove Tree”,去掉总个目录进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件进入“Include\”,单击选中"Andestech",点击"Add Tree"进入“Include\”,单击选中"Asm-generic",点击"Add Tree"进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。
U boot学习笔记(二)一、移植环境主机:Ubutu9开发板:qq2440--64MB编译器:arm-linux-gcc-3.4.5.tgzu-boot:u-boot-1.1.6.tar.bz2二、增加NAND FLASH命令#gedit include/configs/qq2440.h//增加NAND FLASH操作命令#define CONFIG_COMMANDS\(CONFIG_CMD_DFL|\CFG_CMD_CACHE|\CFG_CMD_NAND|\//增加NAND FLASH控制宏#define CFG_NAND_BASE0#define NAND_MAX_CHIPS1#define CFG_MAX_NAND_DEVICE1下面需要做的是编写board_nand_init函数(1)针对S3C2410、S3C2440NAND Flash控制器的不同来定义一些数据结构和函数,在include/s3c24x0.h文件中增加S3C2440_NAND数据结构。
/*NAND FLASH*/typedef struct{S3C24X0_REG32NFCONF;S3C24X0_REG32NFCONT;S3C24X0_REG32NFCMD;S3C24X0_REG32NFADDR;S3C24X0_REG32NFDATA;S3C24X0_REG32NFMECCD0;S3C24X0_REG32NFMECCD1;S3C24X0_REG32NFSECCD;S3C24X0_REG32NFSTAT;S3C24X0_REG32NFESTAT0;S3C24X0_REG32NFESTAT1;S3C24X0_REG32NFMECC0;S3C24X0_REG32NFMECC1;S3C24X0_REG32NFSECC;S3C24X0_REG32NFSBLK;S3C24X0_REG32NFEBLK;}/*__attribute__((__packed__))*/S3C2440_NAND;(2)在include/s3c2440.h文件中仿照S3C2410_GetBase_NAND函数定义S3C2440_GetBase_NAND函数。
移植u-boot2009.08到OK2440V3开发板移植u-boot2009.08到OK2440V3开发板(1)---方向与方法开发板到了之后,用的是板子自带的bootloader、linux内核和文件系统,在上面跑了几个小程序知道流程和方法后,就想着用自已移植的这些东西了,因为既然要搞底层的东西,我想这些东西还是要学会的。
刚开始踌躇满志,以为不会有什么困难,网上不都多得是文章吗。
可实际上,下了N多资料,看了N多文章之后,下到flash中一运行,串口控制台中什么都没有,当时真有点蒙了。
其实不成功,倒还没什么,关键是你想继续努力的时候,却没有方向和方法,那真的才是又浪费时间,又郁闷。
不过还得感谢网络,文章看多了,就知道哪些可以直接close,那些可以复制下来慢慢看(我通常都是一气狂搜,一气“另存为”,最后再集中在一起看)。
三五天后,终于找到了方向和方法,而且在sdram中运行,成功地在串口输出里看到了u-boot启动信息。
第一次学做u-boot移植,综合别人的方法,总结归纳如下:1. 先不去考虑nor/nand flash启动,先让u-boot在SDARM中成功运行。
2. 把那个既经典又简单又very useful的调试方法用上,那就是在程序中需要的地方加上led灯指示。
(有时串口没信息,一头雾水,连自己的程序是否在运行都不知道,这里在程序开头加led的代码,最合适不过了)3. u-boot能在SDRAM中运行后,先考虑nor flash中运行(如果有nor flash的话),因为支持nor flash比支持nand flash改动少,较容易一些。
SMDK2410里也是支持nor flash的,那里用的是AMD公司的。
4. 能在flash 中启动后,增加nand支持,看是否能检测到nand,并在u-boot中用些nand的命令验证驱动是否有问题。
5. 增加代码,让u-boot从nand启动。
6. u-boot可是从nand启动后,增加代码,让代码能自动识别跳线的设置,从相应的flash启动。
JZ2440学习笔记Chili2015.5前言本人入手JZ2440半个月,以前未接触过linux,但在校接触过许多不跑linux系统的CPU,具有LPC1114,LPC1343,STM32,blackfin等处理器的编程经验,对微处理器的原理以及运行方式具有一定的了解。
靠着这点小经验,以及新学习的知识,自己动手移植了最新的uboot,绝对原创,得益于韦老师的书籍以及开发板,能让我们这个小白可以踏进linux的世界,但本人毕竟在linux方面只是个类似小白的学生,许多不对之处,希望大家不吝指教!说明:阅读本文需要一点的ARM以及S3C2440的基础知识,建议先阅读《嵌入式Linux应用开发完全手册》,此书对对ARM以及JZ2440有很好的介绍和说明,在阅读中有不懂的也可以再去翻看此书,查漏补缺。
JZ2440移植最新u-boot-2015.04-rc4.tar1,配置uboot去官网下载最新uboot源代码u-boot-2015.04-rc4.tar,开发环境采用JZ2440光盘上的vmware 虚拟机ubuntu9.10。
本次采用smdk2410的默认配置来配置uboot,然后启动类似linux一样的menuconfig菜单进行配置,然后make,并烧写进JZ2440看效果,然后根据现象一步步修改。
我们移植uboot的基本原则是:因为我们刚上手,可能什么都不知道,更加不知需要更改什么,这个时候我们就先尽量什么都不改,直接烧写进去看现象,然后根据现象或者提示信息一步步更改,从而移植完成。
配置命令如下:book@book-desktop:~/uboot/u-boot-2015.04-rc4$ tar jxvf u-boot-2015.04-rc4.tar.bz2book@book-desktop:~/uboot/u-boot-2015.04-rc4$ cd u-boot-2015.04-rc4/book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make smdk2410_defconfigbook@book-desktop:~/uboot/u-boot-2015.04-rc4$ make menuconfig3,在uboot根目录执行book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make报错:cc1: error: bad value (armv4) for -march= switchcc1: error: bad value (armv4) for -mtune= switchmake[2]: *** [include/autoconf.mk] Error 1make[1]: *** [silentoldconfig] Error 1make: *** No rule to make target `include/config/auto.conf', needed by `include/config/uboot.release'. Stop.错误并不可怕,学会看错误提示,根据提示进行下一步工作。
uboot一、uboot是ppcboot和armboot合并而成,现在主流的bootloader为uboot和redboot二、bootm addr_kernel addr_initrd三、移植uboot时最好(一定)要找到一个自己板子的原形(即自己的板子是在这个板子上做一些修改而来的)的版本,这样就可以事半功倍。
这样要修改的地方就比较少,也比较容易了。
uboot支持很多平台,与一个具体平台相关的主要有三个地方:1、./include/configs/xxxxx.h, 主要定义了flash、sdram的起始地址等信息,一般要修改flash的起始地址、大小,有时候会有位宽等。
2、./board/xxxxx/*,这个目录下主要有两三个.c文件,主要为该平台的初始化和flash操作的函数。
有时候flash的操作需要修改,不过一般都是找一个现有的支持该flash的驱动,一般情况在uboot 别的./board/平台下就会有现成的,拷贝过了就可以了。
3、./cpu/xxxxxx/arch_xxx/xxxxxx/*, 一般是此cpu的初始等函数。
四、具体移植的时候最多涉及到的会是./include/configs/xxxx.h,如果有现成的平台(uboot现在支持绝大部分我们常用的平台),可能只需要对着原来的xxxx.h文件,修改几个我们在硬件上修改了的地方,一般会是flash的起始地址、大小;内存大小(内存的起始地址应该都是0);uboot设置信息保存的地址和长度;console 口和它的波特率;默认的设置;uboot的入口地址等(具体情况可能会有一些变化),如果不是从相同的平台移植,可能会比较麻烦,因为这时候要修改一些和此cpu相关的一些寄存器、频率和内存等硬件方面的东西了(也在这个xxxx.h中),虽然这时改动的地方也不多,但是会很痛苦,因为经常不知道要改哪里或者改为多少。
所以可能需要参考cpu的datasheet和到网上找一些资料了并且慢慢试了。
u-boot-1.3.4 移植到S3C2440 (带有某些解析)移植u-boot-1.3.4到S3C2440一.预备知识:1. 首先,U-Boot1.3.4还没有支持s3c2440,移植仍是用2410的文件稍作修改而成的。
2. 2440和2410的区别:2440和2410的区别主要是2440的主频更高,增加了摄像头接口和AC‘97音频接口;寄存器方面,除了新增模块的寄存器外,移植所要注意的是NAND FlASH控制器的寄存器有较大的变化、芯片的时钟频率控制寄存器(芯片PLL的寄存器)有一定的变化。
其他寄存器基本是兼容的。
3. 你开发板的boot方式是什么,开发板上电以后是怎么执行的。
一般来说三星的开发板有三种启动方式:nand、nor、ram。
具体用那一种方式来启动决定于CPU的0M[0:1]这两个引脚,具体请参考S3C2440的datasheetnand:对于2440来说,CPU是不给nand-flash分配地址空间的,nand-flash只相当于CPU的一个外设,S3C2440做了一个从nand-flash启动的机制。
开发板一上电,CPU就自动复制nand-flash里面的前4K-Bytes内容到S3C2440内部集成的SDRAM,然后把4K内容所在的RAM映射到S3C2440的0地址,从0地址开始执行。
这4K的内容主要负责下面这些工作:初始化中断矢量、设定CPU的工作模式为SVC32模式、屏蔽看门狗、屏蔽中断、初始化时钟、把整个u-boot重定向到外部SDRAM、跳到主要的C函数入口。
nor: 早期的时候利用nor-flash启动的方式比较多,就是把u-boot烧写到nor-flash里面,直接把nor-flash映射到S3C2440的0地址,上电从0地址开始执行。
ram: 直接把u-boot放到外部SDRAM上跑,这一般debug时候用到。
4. u-boot程序的入口地址问题要理解程序的入口地址,自然想到的是连接文件,首先看看开发板相对于某个开发板的连接文件"/board/你的开发板/u-boot.lds",看一个2410的例子:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/start.o (.text)*(.text)}. = ALIGN(4);.rodata : { *(.rodata) }. = ALIGN(4);.data : { *(.data) }. = ALIGN(4);.got : { *(.got) }__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;. = ALIGN(4);__bss_start = .;.bss : { *(.bss) }_end = .;}(1) 从ENTRY(_start)可以看出u-boot的入口函数是_start,这个没错(2) 从. = 0x00000000也许可以看出_start的地址是0x00000000,事实并不是这样的,这里的0x00000000没效,在连接的时候最终会被TETX_BASE所代替的,具体请参考u-boot根目录下的config.mk.(3) 网上很多说法是_start=TEXT_BASE,我想这种说法也是正确的,但没有说具体原因。
驱动程序开发教程1.驱动的安装1.1 第一安装 openjtag 的驱动1.2.安装串口驱动 (PL2303_Prolific_DriverInstaller_v1.7.0)2.有关软件的安装2.1 oflash 的安装复制光盘 1\windows\tools中的文件(oflash.exe和FTD2XX.dll)到目C:\WINDOWS\system录之下,就能够在命令行中运转了2.2SecureCRT的安装光盘1\windows\tools\scrt522中进行安装(使用时成立串口,注意去掉流控选项)注意点1.串口的接口是USB-COM1,用于 SecureCRT的使用。
B 用于在 U-boot 下用 DNW 下载数据OPenjtag(拥有自动3.Openjtag 和串口 USB-COM1 不可以够同时使用,不过用串口是需要将复位,拉低)上的线拔下来,不然矛盾。
B 和 USB-COM1能够同时使用烧写程序的方法1.Openjtag 下载程序1.1 第一设置为nand 启动,且安装了oflash,只采纳 openjtag 连结电脑与开发板1.2 cmd 进入命令行模式,输入程序目标盘符(D:)1.3 cd D:\work\card1\bin\hardware1.4 oflash leds.bin2.u-boot 烧写程序( DNW)2.1 采纳 USB(下载程序)和USB-com1(SecureCRT)连结开发板, NOR 启动模式2.2 USB(下载程序)驱动安装目录D:\work\card1\windows\dnw 中的( SECBULK.inf和SECBULK.sys)2.3 NOR 下开发板上电,读秒的时候快速按下空格,进入bootloader ,在菜单下进行下载2.4 程序下载到 nand flash,选择 [n] Download u-boot to Nand Flash 下载2.5 启动 DNW,选择传递文件2.6 断电,选择 nand 启动,从头上电就能够了3.u-boot 下载( tftp )3.1 启动 tftp 进行设置,目录设置成程序所在的目录(下载时自动地位此目录,不需要再cd 切换),查察服务器的ip3.1 SecureCRT下 print 查找3.2 设置开发板和服务器 ip set ipaddr 192.168.0.1 (开发板)(tftp软件生成的)3.3 save 进行保存3.4 连结网线3.5 ping 192.168.0.100 开能否通了,只好开发板到电脑3.6 下载 tftp 30000000 lcd.bin3.7 擦除 tftp 30000000 lcd.bin3.8 写 nand write 30000000 bootloader3.9 断电,改为 NAND 启动重装系统参看学前班第0课3节VMware 的设置1.安装 7zip 软件 D:\work\card1\windows下的7zip.msi2.解压 D:\work\card1\VMWare下的到NTFS格式下的磁盘Makefile 规则解说目标:依靠 1 依靠 2TAB 命令1.目标不存在目2标.源文件已更新生成的条件是目标:依靠 1 依靠 2 hello : hello.c a.cTAB 命令 (gcc)gcc - o hello hello.c a.c hello依靠 hello.c 和 a.c 进行生成gcc是命令能够改成下边的hello : hello.o a.ogcc - o hello hello.o a.ohello.o : hello.cgcc - o hello.o -c hello.ca.o : a.cgcc - o a.o -c a.chello 依靠于 hello.o 和 a.o可是 hello.o 和 a.o 不存在需要到下边的文件命令中找寻,需要下边的两条命令hello.o : hello.cgcc - o hello.o -c hello.c-c 的意思是编译不链接总结:就是在进行makefile 时从第一条开始履行,碰到不存在或许不可以履行的命令回到下面中找寻因为此 Makefile 中村庄啊两条相像的指令,能够采纳通配符进行代替,所以hello : hello.o a.ogcc - o hello hello.o a.ohello.o : hello.cgcc - o hello.o -c hello.ca.o : a.cgcc - o a.o -c a.c能够改写为下边的形式hello : hello.o a.ogcc - o hello hello.o a.o改为:hello : hello.o a.ogcc - o $@ $^解说:1.$@:代表目标2.$^:代表两个依靠下边的两条相像指令hello.o : hello.cgcc - o hello.o -c hello.ca.o : a.cgcc - o a.o -c a.c能够改写为%.o :%.cgcc -0 $@ -c $<解说:1.%.o :%.c : %是通配符2.$@:代表目标3.$<:代表 1 个依靠makeclean例子:clean :rm %.o hello解说:1.clean 是一个虚构的函数,生成不需要依靠2.履行 rm 命令,删除中间产生的目标文件,和hello3.履行一次,则所有删除,下一次履行时就不存在了,能够再次履行。
开发板熟悉与体验1、开发板部件与串口连接开发板部件:1)电源插座2)开关3)JTAG 烧写器:将PC 上写好的程序写到开发板上,必备。
即USB 烧写器:a )Jlinkb )op/eop4)串口(九针串口):多采用串口转usb (即USB 串口)与PC 连接,一般将 串口转USB 电路集成到开发板上,直接在开发板上引出USB 串口。
5)USB Device (usb 口):可在开发板与PC 间高速传输,连接PC 的USB 口。
(USB 下载)注:开发板3个通信接口:USB 串口(使用串口转USB 电路)、USB Device (USB 高速下 载口)、JTAG 烧写口(烧写速度慢但极其稳定)。
小结:1)接通电源,按下开关。
2)使用串口(USB 串口,已将串口转USB 电路集成到开发板上,在开发板上 引出了USB 串口)观察信息。
3)使用JTAG 口(需使用USB 烧写器-->作为烧写和开发板与PC 间连接的工 具)烧写程序:软件:oflash.exe --> 烧写所有的bin 程序⎪⎪⎩⎪⎪⎨⎧-....5.4.3...bin lcd bin leds bin boot u 其中,u-boot.bin -->NOR Flash 、Nand Flash (0地址开始烧)leds.bin 、lcd.3.4.5.bin 、...-->Nand Flash (0地址开始烧)烧写步骤:a )eop-->(连接)PCb )安装驱动(eop 驱动;把完整压缩文件下载下来再安装,采用更新驱动模式安装)c )安装APP (oflash )d )开发板-->(排线)eop-->PCe )执行:oflash xxx.bin (最好以管理员权限运行cmd.exe ;选择NOR 或Nand 存储区,并记得在开发板上调节拨码开关到 对应的存储区)f )一定要把eop 与开发板间连接的排线断开。
一:准备移植1、从下面的官网下载最新的U-boot。
用google英文版搜索最新的u-boot源码ftp://ftp.denx.de/pub/u-boot/2、建立sourceinsight工程a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SIb、添加文件到SI工程1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lowersub-directories”点击“OK”2、选中“Board”目录,点击“Remove Tree”,去掉总个目录进入“Board\Samsung\Smdk2410\”,点击"Add All"3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。
进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All"进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree"进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All"进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree"进入“Arch\Arm\Lib\”,点击"Add All"4、选中“Include”目录,点击“Remove Tree”,去掉总个目录进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件进入“Include\”,单击选中"Andestech",点击"Add Tree"进入“Include\”,单击选中"Asm-generic",点击"Add Tree"进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。
"Configs"目录先不加,下面再议进入“Include\Configs\”,双击选中“Smdk2410.h”5、同步文件,完成3、编译尝试编译解压:book@book-desktop:/work/system$ tar xjf u-boot-2012.04.01.tar.bz2book@book-desktop:/work/system$ cd u-boot-2012.04.01/配置:book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config 编译:book@book-desktop:/work/system/u-boot-2012.04.01$ make编译不成功,因为版本太老查看版本:book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-gcc -v拷贝解压:book@book-desktop:/work/system/u-boot-2012.04.01$ cd /work/tools/ book@book-desktop:/work/tools$ mkdir tmpbook@book-desktop:/work/tools$ tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C tmp/book@book-desktop:/work/tools$ cd tmp/book@book-desktop:/work/tools/tmp$ lsusrbook@book-desktop:/work/tools/tmp$ cd usr/local/arm/4.3.2/book@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ lsarm-none-linux-gnueabi bin lib libexec sharebook@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ ls bin/解压到根目录:book@book-desktop:/work/tools$ sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /查看环境变量: book@book-desktop:/work/tools$ echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/other_board/gc c-3.4.5-glibc-2.3.6/bin设置环境变量:book@book-desktop:/work/tools$ exportPATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr /games查看环境变量:book@book-desktop:/work/tools$ arm-linux-gcc -v如果不想手动设置,你可以按如下方式修改:book@book-desktop:/work/tools$ sudo vi /etc/environment重新编译:book@book-desktop:/work/tools$ cd /work/system/u-boot-2012.04.01/ book@book-desktop:/work/system/u-boot-2012.04.01$ make distcleanbook@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_configConfiguring for smdk2410 board...book@book-desktop:/work/system/u-boot-2012.04.01$ make4、下载刚编译成功的u-boot.bin,发现重新启动,串口没有任何信息二、分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程重新编译,只关心最后一条链接命令:book@book-desktop:/work/system/u-boot-2012.04.01$ rm u-bootbook@book-desktop:/work/system/u-boot-2012.04.01$ make里面有这句arm-linux-ld -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYMarch/arm/cpu/arm920t/start.obook@book-desktop:/work/system/u-boot-2012.04.01$ vi u-boot.lds通过链接脚本知道: . = 0x00000000;同时-Ttext 0x0,由此我们知道是从NOR flash开始运行,通过链接脚本还知道第一个运行的是arch/arm/cpu/arm920t/start.s自己写bootload的总结的过程:a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASHb. 如果bootloader比较大,要把它重定位到SDRAMc. 把内核从NAND FLASH读到SDRAMd. 设置"要传给内核的参数"e. 跳转执行内核反汇编:book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot > u-boot.dis新uboot的过程:2.1 set the cpu to SVC32 mode2.2 turn off the watchdog2.3 mask all IRQs by setting all bits in the INTMR2.4 设置时钟比例2.5 设置内存控制器2.6 设置栈,调用C函数board_init_f2.7 调用函数数组init_sequence里的各个函数2.7.1 board_early_init_f : 设置系统时钟、设置GPIO......2.8 重定位代码:2.8.1 从NOR FLASH把代码复制到SDRAM2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"现在把程序复制到了SDRAM需要修改代码,把"基于0地址编译得到的地址"改为新地址2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs2.9 clear_bss2.10 调用C函数board_init_r:第2阶段的代码book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-ld --help | grep pie -pie, --pic-executable Create a position independent executable可以修改配置定义CONFIG_S3C24403. 修改U-BOOT代码3.1 建一个单板(修改3个文件)book@book-desktop:/work/system/u-boot-2012.04.01$ make distcleanbook@book-desktop:/work/system/u-boot-2012.04.01$ cd board/samsung/book@book-desktop:/work/system/u-boot-2012.04.01/board/samsung$ cp smdk2410 smdk2440 -rfbook@book-desktop:/work/system/u-boot-2012.04.01/board/samsung$ cd ../..book@book-desktop:/work/system/u-boot-2012.04.01$ cd include/configs/book@book-desktop:/work/system/u-boot-2012.04.01/include/configs$ cp smdk2410.h smdk2440.h看看是否能编译通过:book@book-desktop:/work/system/u-boot-2012.04.01/include/configs$ cd ../..book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2440_config make: *** No rule to make target `smdk2440_config'. Stop.make: *** [smdk2440_config] Error 1编译通不过.怀疑是makefile的问题,搜索一下:book@book-desktop:/work/system/u-boot-2012.04.01$ grep "smdk2410" * -nRarch/arm/include/asm/mach-types.h:1644:# definemachine_is_smdk2410() (machine_arch_type == MACH_TYPE_SMDK2410)arch/arm/include/asm/mach-types.h:1646:# define machine_is_smdk2410() (0)board/samsung/smdk2410/Makefile:28:COBJS := smdk2410.oboard/samsung/smdk2440/Makefile:28:COBJS := smdk2410.oboards.cfg:65:smdk2410 arm arm920t - samsungs3c24x0MAINTAINERS:750: smdk2410 ARM920Tbook@book-desktop:/work/system/u-boot-2012.04.01$ vi boards.cfg在boards.cfg文件下复制65行,修改boards.cfg:仿照smdk2410 arm arm920t - samsung s3c24x0添加:smdk2440 arm arm920t - samsung s3c24x0然后重新配置一下book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2440_config然后重新编译一下book@book-desktop:/work/system/u-boot-2012.04.01$ make3.2 烧写看结果无法执行,下面按照第2节里面的分析启动过程3.3 调试:a. 阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置①处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置,如下面注释掉下面两行//writel(0xFFFFFF, &clk_power->locktime);/* configure MPLL *///writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,// &clk_power->mpllcon);编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot 来烧写新的uboot先查看一下是不是刚下的烧写结果是不是有问题等待usb下载完: OpenJTAG> usb 1 30000000 //1表示一直等待把flash的写保护去掉: OpenJTAG> protect off all //解除norflash写保护把flash擦除:开始和结束地址 OpenJTAG> erase 0 7FFFF //擦除从0到0x7FFFF共0x80000个字节下载进flash: OpenJTAG> cp.b 30000000 0 80000 //从内存0x30000000开始烧写程序到norflash的0地址去,烧写0X80000个字节反汇编:book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot > u-boot.dis上面反汇编的目的是:查看call_board_init_f所在的汇编地址,开始执行这个函数的时候,说明cpu_init_crit已经执行完了,SDRAM已经初始化完了,我们现在就是想验证一下SDRAM是否初始化成功②修改start.S里的代码# endif/* 2. 设置时钟*/ldr r0, =0x4c000014// mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8str 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, =0x4c000004ldr r1, =S3C2440_MPLL_400MHZstr r1, [r0]/* 启动ICACHE */mrc p15, 0, r0, c1, c0, 0 @ read control regorr r0, r0, #(1<<12)mcr p15, 0, r0, c1, c0, 0 @ write it back#endif /* CONFIG_S3C24X0 */③把lowlevel_init.S里面的lowlevel_init函数里面SMRDATA:.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_Tac p<<2)+(B0_PMC)).word((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tac p<<2)+(B1_PMC)).word((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tac p<<2)+(B2_PMC)).word((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tac p<<2)+(B3_PMC)).word((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tac p<<2)+(B4_PMC)).word((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tac p<<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替换为:SMRDATA:.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完成上面3步之后,编译生成新的uboot.bin,我们先用openjtag烧写原来的uboot,然后通过原来的uboot来下载新生成的uboot.bin等待usb下载完: OpenJTAG> usb 1 30000000 //1表示一直等待把flash的写保护去掉: OpenJTAG> protect off all //解除norflash写保护把flash擦除:开始和结束地址 OpenJTAG> erase 0 7FFFF //擦除从0到0x7FFFF共0x80000个字节下载进flash: OpenJTAG> cp.b 30000000 0 80000 //从内存0x30000000开始烧写程序到norflash的0地址去,烧写0X80000个字节到这里可以用openjtag去验证一下内存设置有没有成功3.4 乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440①更改get_HCLK里没有定义CONFIG_S3C2440board_init_finit_sequenceserial_initserial_init_dev_serial_setbrgget_PCLKget_HCLK处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410#define CONFIG_S3C2440②做完第一步后我们编译一下,发现错误,由于第一步的更改导致了第二步出现问题:s3c2410_nand.c:72: error: dereferencing pointer to incomplete type查看代码后解决:book@book-desktop:/work/system/u-boot-2012.04.01$ vi drivers/mtd/nand/Makefile那我们就去掉这个宏:在smdk2440.h#ifdef CONFIG_CMD_NAND#define CONFIG_NAND_S3C2410解决办法:暂时去掉如下行//#define CONFIG_CMD_NAND③验证:先烧写1.1.6的uboot,然后重启开发板,烧写开发板等待usb下载完: OpenJTAG> usb 1 30000000 //1表示一直等待把flash的写保护去掉: OpenJTAG> protect off all //解除norflash写保护把flash擦除:开始和结束地址 OpenJTAG> erase 0 7FFFF //擦除从0到0x7FFFF共0x80000个字节下载进flash: OpenJTAG> cp.b 30000000 0 80000 //从内存0x30000000开始烧写程序到norflash的0地址去,烧写0X80000个字节下面是uboot输出:U-Boot 2012.04.01 (Jul 29 2013 - 20:26:01)CPUID: 32440001FCLK: 400 MHzHCLK: 100 MHzPCLK: 50 MHzDRAM: 64 MiBWARNING: Caches not enabledFlash: *** failed ***### ERROR ### Please RESET the board ###3.5 修改UBOOT支持NAND启动原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)3.5.1 去掉"-pie"选项book@book-desktop:/work/system/u-boot-2012.04.01$ grep "\-pie" * -nR arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行3.5.2 参考"毕业班第1课"的start.S, init.c来修改代码把init.c放入board/samsung/smdk2440目录,修改init.c文件主要是加上static , 修改Makefile修改CONFIG_SYS_TEXT_BASE为0x33f80000修改start.S3.5.3 修改board_init_f, 把relocate_code去掉3.5.4 修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面book@book-desktop:/work/system/u-boot-2012.04.01$ find -name "u-boot.lds"./arch/arm/cpu/u-boot.lds:board/samsung/smdk2440/libsmdk2440.o生成反汇编文件检查book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot >u-boot.dis烧写:OpenJTAG> usb 1 30000000OpenJTAG> nand erase 0 80000OpenJTAG> nand write 30000000 0 80000把开关拨到nand重启有输出,说明现在支持了nand启动:U-Boot 2012.04.01 (Jul 29 2013 - 22:08:35)CPUID: 32440001FCLK: 400 MHzHCLK: 100 MHzPCLK: 50 MHzDRAM: 64 MiBWARNING: Caches not enabledFlash: *** failed ***### ERROR ### Please RESET the board ###在源码里面搜索“Flash:”,可以发现出现错误的原因,是由于board_init_r函数里面,如果你的程序是从nand启动,那么会卡死,做如下修改:# endif /* CONFIG_SYS_FLASH_CHECKSUM */} else {puts("0 KB\n\r");//puts(failed);//hang();}3.6 修改UBOOT支持NOR FLASHdrivers\mtd\jedec_flash.c 加上新的型号#define CONFIG_SYS_MAX_FLASH_SECT (128)修复了重定时留下来的BUG:SP要重新设置SMDK2410 # loady 32000000SMDK2410 # protec off allSMDK2410 # erase 0 7ffffSMDK2410 # cp.b 32000000 0 800003.7 修改UBOOT支持NAND FLASH修改:include/configs/smdk2440.h: #define CONFIG_CMD_NAND 把drivers\mtd\nand\s3c2410_nand.c复制为s3c2440_nand.c分析过程:nand_initnand_init_chipboard_nand_init设置nand_chip结构体, 提供底层的操作函数nand_scannand_scan_identnand_set_defaultschip->select_chip = nand_select_chip;chip->cmdfunc = nand_command;chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;nand_get_flash_typechip->select_chipchip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);nand_command() // 即可以用来发命令,也可以用来发列地址(页内地址)、行地址(哪一页)chip->cmd_ctrls3c2440_hwcontrolchip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);*maf_id = chip->read_byte(mtd);*dev_id = chip->read_byte(mtd);烧写实验:①烧写到NOR FlashSMDK2410 # loady 30000000SMDK2410 # protect off allSMDK2410 # erase 0 7ffffSMDK2410 # cp.b 30000000 0 80000②烧写到NAND FlashSMDK2410 # nand erase 0 80000SMDK2410 # nand write 0 0 80000 把norflash 0地址里面的程序烧写到nand flash 0地址里面去,烧写80000比较SMDK2410 # nand read 30000000 0 80000NAND read: device 0 offset 0x0, size 0x80000524288 bytes read: OKSMDK2410 # cmp.b 0 30000000 80000Total of 524288 bytes were the same3.8 修改UBOOT支持DM9000网卡①修改smdk2440.h使它支持网卡DM9000#if 0#define CONFIG_CS8900 /* we have a CS8900 on-board */#define CONFIG_CS8900_BASE 0x19000300#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */#else#define CONFIG_DRIVER_DM9000#endif然后编译出错:dm9000x.c:156: error: 'DM9000_DATA' undeclared (first use in this function)查找原因:book@book-desktop:/work/system/u-boot-2012.04.01$ grep "DM9000_DATA" * -nR 参考别人的代码:更改smdk2440.h和lowlevel_init.S里面的时序还是有错误:看一下调用过程eth_initializeboard_eth_initcs8900_initialize*** ERROR: `ethaddr' not set现在可以用tftp下载代码了:SMDK2410 # set ipaddr 192.168.1.17SMDK2410 # set ethaddr 00:0c:29:4d:e4:f4到这里先要在xp打开tptp服务器,服务器ip为192.168.1.50SMDK2410 # set serverip 192.168.1.50SMDK2410 # tftp 30000000 uImageSMDK2410 # bootm 30000000移植网卡搞定。