说一下uboot分析与移植:

1、下载、建立source insight工程、编译、烧写、如果无运行分析原因

tar xjf u-boot-2012.04.01.tar.bz2

cd u-boot-2012.04.01

make smdk2410_config

make

2. 分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程

a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH

b. 如果bootloader比较大,要把它重定位到SDRAM

c. 把内核从NAND FLASH读到SDRAM

d. 设置"要传给内核的参数"

e. 跳转执行内核

2.1 set the cpu to SVC32 mode

2.2 turn off the watchdog

2.3 mask all IRQs by setting all bits in the INTMR

2.4 设置时钟比例

2.5 设置内存控制器

2.6 设置栈,调用C函数board_init_f

2.7 调用函数数组init_sequence里的各个函数

2.7.1 board_early_init_f : 设置系统时钟、设置GPIO

......

2.8 重定位代码:

2.8.1 从NOR FLASH把代码复制到SDRAM

2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"

现在把程序复制到了SDRAM

需要修改代码,把"基于0地址编译得到的地址"改为新地址

2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs

2.9 clear_bss

2.10 调用C函数board_init_r:第2阶段的代码

可以修改配置定义CONFIG_S3C2440

3. 修改U-BOOT代码

3.1 建一个单板

cd board/samsung/

cp smdk2410 smdk2440 -rf

cd ../../include/configs/

cp smdk2410.h smdk2440.h

修改boards.cfg:

仿照

smdk2410                     arm         arm920t     -                   samsung        s3c24x0

添加:

smdk2440                     arm         arm920t     -                   samsung        s3c24x0

3.2 烧写看结果

3.3 调试:

a. 阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置

处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置

编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot

3.4 乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440

处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410

#define CONFIG_S3C2440

//#define CONFIG_CMD_NAND

3.5 修改UBOOT支持NAND启动

原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"

使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)

3.5.1 去掉 "-pie"选项

arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行

3.5.2 参考"毕业班第1课"的start.S, init.c来修改代码

把init.c放入board/samsung/smdk2440目录, 修改Makefile

修改CONFIG_SYS_TEXT_BASE为0x33f80000

修改start.S

3.5.3 修改board_init_f, 把relocate_code去掉

3.5.4 修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面

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

board/samsung/smdk2440/libsmdk2440.o

3.6 修改UBOOT支持NOR FLASH

drivers\mtd\jedec_flash.c 加上新的型号

#define CONFIG_SYS_MAX_FLASH_SECT (128)

修复了重定时留下来的BUG:SP要重新设置

3.7 修改UBOOT支持NAND FLASH

修改:include/configs/smdk2440.h: #define CONFIG_CMD_NAND

把drivers\mtd\nand\s3c2410_nand.c复制为s3c2440_nand.c

分析过程:

nand_init

nand_init_chip

board_nand_init

设置nand_chip结构体, 提供底层的操作函数

nand_scan

nand_scan_ident

nand_set_defaults

chip->select_chip = nand_select_chip;

chip->cmdfunc = nand_command;

chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;

nand_get_flash_type

chip->select_chip

chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);

nand_command()  // 即可以用来发命令,也可以用来发列地址(页内地址)、行地址(哪一页)

chip->cmd_ctrl

s3c2440_hwcontrol

chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

*maf_id = chip->read_byte(mtd);

*dev_id = chip->read_byte(mtd);

3.8 修改UBOOT支持DM9000网卡

eth_initialize

board_eth_init

cs8900_initialize

*** ERROR: `ethaddr' not set

set ipaddr 192.168.1.17

set ethaddr 00:0c:29:4d:e4:f4

set serverip 192.168.1.3

4. 易用性修裁剪及制作补丁

内核打印出来的分区信息

0x00000000-0x00040000 : "bootloader"

0x00040000-0x00060000 : "params"

0x00060000-0x00260000 : "kernel"

0x00260000-0x10000000 : "root"

nand erase 60000 200000

nand write 30000000 60000 200000

tftp 30000000 uImage

nand erase.part kernel

nand write 30000000 kernel

附笔者的学习笔记,字写的不好勿怪,将就看吧:

1).uboot介绍以及最终目的:

2).分析makefile找到第一个执行的文件:

3).源码分析:

4)uboot中命令实现:

5)uboot启动内核:

Linux之uboot分析与移植20160601的更多相关文章

  1. 18.13 Uboot分析与移植

    18.13.1 使用JLink烧写Nor Flash JLink只支持烧写NOR Flash,不支持烧写Nand Flash. 1.准备工作:JLink的USB口接到电脑上,JLink的JTAG口用排 ...

  2. U-boot分析与移植(2)----U-boot stage1分析

    我们要生成u-boot.bin文件,它首先依赖于很多.o文件和.lds链接脚本文件 我们只要找到对应的.lds链接脚本文件就可以分析u-boot的启动流程. 1.打开u-boot-1.1.6\u-bo ...

  3. 【转】U-boot分析与移植(1)----bootloader分析

    原文网址:http://blog.csdn.net/jianchi88/article/details/7061089  一.Boot Loader 概念 就是在操作系统内核运行之前运行的一段小程序. ...

  4. U-boot分析与移植(3)----U-boot stage2分析

    一来到void start_armboot (void)函数,马上出现两个很重要的数据结构gd_t和bd_t 1.gd_t : global data数据结构定义,位于文件 include/asm-a ...

  5. U-boot分析与移植(1)----bootloader分析

    一.Boot Loader 概念 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作 ...

  6. 2.1 linux中uboot移植

    -- --------------------------------------------------------------------------------------- (一)友善之臂介绍 ...

  7. u-boot分析

    4.Bootloader:u-boot.2009.08分析与移植4.1:分析u-boot根文件夹下的Makefile,能够看到uboot编译的顺序例如以下,由此可知编译运行的第一个文件是cpu/$(C ...

  8. Linux之kernal分析与启动20160610

    说一下LINUX内核的分析与启动: 一. 内核启动流程,据此配置内核(机器ID) 1.1 修改Makefile 1.2 选择默认配置 : make s3c2410_defconfig 1.3 make ...

  9. u-boot分析(十一)----MMU简单分析|u-boot分析大结局|学习规划

    u-boot分析(十一) 通过前面十篇博文,我们已经完成了对BL1阶段的分析,通过这些分析相信我们对u-boot已经有了一个比较深入的认识,在BL2阶段大部分是对外设的初始化,并且有的我们已经分析过, ...

随机推荐

  1. 常见的MIME类型

    超文本标记语言文本 .htm,.html text/html 普通文本 .txt text/plain GIF图形 .gif image/gif JPEG图形 .ipeg,.jpg image/jpe ...

  2. (转)由Uploadify插件想到的Flash无法传递Session和Cookie的问题解决

    在ASP.NET MVC3中使用Uploadify上传文件时发现,在后台需要验证登录状态的时候,Uploadify根本无法完成验证,因此,在后台只能使用非验证状态进行文件上传 —— 众所周知,这无异于 ...

  3. MFC中,如何自定义用户消息

    1.用处 在多个类之间传递消息.当需要响应用户操作,本类却无法实现时,可以向系统发出消息.然后让系统中的需要的位置实现它. 2.方法 2.1定义这个消息,并让拥有者发送这个这个消息,传递一个整型参数 ...

  4. 多设备同时安装apk问题(安卓)

    前几天在做安卓设备的多个设备同时安装的小脚本.因为目前我这边设备有点多,想顺便做一下安装的测试.而且因为本人负责公司所有的app测试人手上有点不足,就想通过这个办法去在安装的时候更方便省事一点. 本来 ...

  5. pytest学习笔记(二)

    继续文档的第二章 (一)pytest中可以在命令行中静态/动态添加option,这里没什么好讲的,略过... 这里面主要讲下如何试用skip/xfail,还有incremental(包含一些列的测试步 ...

  6. TchApp项目说明

    概述 使用Web做UI,csharp编程,构建跨平台桌面软件,项目目标是打造一个框架,做完相关的基础设施,让使用者能够只关注业务开发,而不需要重新构建基础设施. 项目应该包括:窗口管理API,跨语言( ...

  7. Testing and Checking Refined

    还是James大叔的文章:http://www.satisfice.com/blog/archives/856 本文提出了Testing和checking的定义和他们之间的区别. ========== ...

  8. 慕课网-安卓工程师初养成-4-9 Java循环语句之 for

    来源:http://www.imooc.com/code/1425 Java 的循环结构中除了 while 和 do...while 外,还有 for 循环,三种循环可以相互替换. 语法: 执行过程: ...

  9. nginx 配置高并发

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  10. opencv_协方差矩阵与协方差讲解

    统计学的基本概念 学过概率统计的孩子都知道,统计里最基本的概念就是样本的均值,方差,或者再加个标准差.首先我们给你一个含有n个样本的集合,依次给出这些概念的公式描述,这些高中学过数学的孩子都应该知道吧 ...