韦东山u-boot移植笔记
U-Boot的移植

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一致。
u-boot学习笔记

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,代码在下面。
VxWorks的bootrom 到u-boot的移植心得

设定 VmWare 的 CDROM 为 iso 文件 第一句是设定编译的 cpu 类型,第二句设定路径,就是编译器安装后的路径。 设置完毕之后可以找一个简单的 foo.c 文件编译一下,看看是否安装成功。 $ ${CROSS_COMPILE}gcc –o foo foo.c 具体情况参见/mnt/cdrom 下的 readme.html。 比较懒的人可以用 root 权限,在文件/etc/profile 文件下加入下面两行,这 样就不用每次都输入了。 (/html/2005/1024/51803.html,里 面有单用户设置
VxWorks 的 bootrom 到 u-boot 的移植心得
原因:Wind River 公司推出的 VxWorks 具有优良的性能,可惜是个收费软件。 因此考虑将原来 VxWorks 下配套的软件 (引导程序 bootrom, 操作系统 VxWorks, 用户程序 user application)统统移植到免费的 linux 下。其中 bootrom 可由 denx 推出的 u-boot 代替。 硬件条件:实验室自己开发的电路板,已经有成功运行的 bootrom 和 VxWorks, CPU 为 MPC8240(powerpc603 类型的核),启动地址对应到 8bit 数据宽度的 EEPROM,有板载 Flash,但地址不连续,串口网口齐全。 本文内容:用于将 bootrom 移植成 u-boot,虽然涉及到 bootrom,VxWorks 和 user application,但真正被代替的只有 bootrom。并不包括 VxWorks 到嵌入式 linux,以及 user application 的移植方法。 1.u-boot 简介 U-Boot,全称 Universal BootLoader,是遵循 GPL 条款的开放源码项目。其源 码目录、 编译形式与 Linux 内核很相似,事实上,不少 U-Boot 源码就是相应 的 Linux 内核源程序的 简化,尤其是一些设备的驱动程序,这从 U-Boot 源码 的注释中能体现这一点。但是 U-Boot 不仅仅支持嵌入式 Linux 系统的引导,当 前,它还支持 NetBSD, VxWorks, QNX, RTEMS, ARTOS,LynxOS 嵌入式操作系统。 其目前要支持的目标操作系统是 OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux,SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX,RTEMS,ARTOS。U-Boot 除了支持 PowerPC 系列的处理器外, 还能支持 MIPS、x86、 ARM、NIOS、XScale 等诸多常用系列的处理器。 更多内容:MPC8xx 的 U-Boot 移植体会 /logs/2005/10/1516893.html 2.准备工作 2.1 安装 VmWare 下的 Linux 通常玩 Tornado 的都是在 Windows 下 (或者在 windows 的伪 Dos 下玩命令行) 。 但是 u-boot 要在 linux 下编译。 由于移植过程中不可避免的要参考 VxWorks 的 BSP,而且从 u-boot 启动的 VxWorks 可能与从 bootrom 启动的 VxWorks 略有不 同,因此强烈建议在 Windows 下安装 VmWare 虚拟机,再装上一个 Linux。我用 的是比较古老的红帽子 Linux7.3。 关于 Linux 在 VmWare 下的安装资料网上到处都是, 自己搜去吧。 需要注意的是, 装完之后强烈建议安装 VMèInstall VmWare Tools,安装好了之后分辨率就可以 设置上去了, 否则看起来太难受了。 此外, 再设置一个共享文件夹 VMèSettings, linux 下在/mnt/hgfs/目录下,方便 Windows 和 Linux 之间互相拷贝文件(这 个地方我一直没有搞定,从 Windows 下向共享文件夹里拷贝文件可以,从 linux 下总是报错:Error while copying to … there is not enough space on the destination,用 root 也是一样。)或者设置一下网络后,用 ServU 在 Windows 下开一个 ftp,开放读写权限(反正也就 linux 一个用户),效果也是一样的。
韦东山linux第二期驱动总结

自己编写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.编译不能通过,有可能是编译器版本比较低的缘故。
uboot移植日记

在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启动了。
U-BOOT的启动流程及移植

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应用开发完全手册》-韦东山

[精华] 《嵌入式LINUX应用开发完全手册》一书作者:韦东山() 的部分备课笔记----------------------------------------------------------------------------------------------------------------------特别说明:此文章的原始出处/sz_farsight以下文章是华清远见深圳培训中心《嵌入式LINUX应用开发完全手册》一书作者韦东山() 的部分备课笔记,笔记语言比较风趣,比较好玩,此文档欢迎转载,但转载请保留相应个人信息及此段说明,谢谢!----------------------------------------------------------------------------------------------------------------------第1天1.入门介绍大家好,这两天我们将一起度过。
我叫韦东山,韦小宝的韦,东方的东,高山的山,大家直接叫我名字就可以了,也别叫我老师。
可能比你们都大上几年,在LINUX方面比你们早入门了几年门。
今天有幸来讲第一节课,我很乐意帮助大家解决一些入门问题。
当然,入门问题也有很难的问题,回答不上请大家见谅,等我下班后,回到家,找到了答案再告诉大家。
好了,下面开始我们的课程。
大家的基础各不相同,所以我只能假定大家第一次接触LINUX的驱动编写。
其实LINUX系统的一些原理,跟人类社会很有相通之处,那就分层分工,各司其职。
假设你是一个集团的老总,下面有很多子公司。
那你想了解公司的运营情况时,是不可能去实地考察每个公司的。
那怎么办?只能看每个子公司的财务报表。
打开报表==>阅读报表,嗯,明白了==>批示、下发。
报表怎么来的呢?老总可不管,都是由底下的人弄好的;批示怎么执行的呢?老总也不管,都是由底下的人做的。
这些“底下的人”,就是“驱动人员”回到我们的LINUX系统,我们控制电路板上的LED,怎么办呢?同样:打开LED文件==>写数据到文件==>LED亮、灭,这个文件怎么来的?写数据到这个文件后,LED怎么就会亮、灭?这些工作,就是“驱动人员”做的。
uboot 2014移植手册

@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \ $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep \ $(obj)include/spl-autoconf.mk \ $(obj)include/tpl-autoconf.mk \ $(obj)arch/${ARCH}/include/asm/arch \ $(obj)arch/${ARCH}/include/asm/proc
ldr r0, =0x4c000004 ldr r1, =S3C2440_MPLL_400MHZ str r1, [r0] smdk2410.c: // writel(0xFFFFFF, &clk_power->locktime); /* configure MPLL */ // writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV, // &clk_power->mpllcon);
int i = 0;
/* 如果是 NOR 启动 */ if (isBootFromNorFlash()) {
while (i < len) {
dest[i] = src[i]; i++; } } else { //nand_init(); nand_read_ll((unsigned int)src, dest, len); } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一:准备移植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移植网卡搞定。