uboot和linux_uboot linux - CSDN
  • 一.linux开发之uboot移植(一)——初识uboot

    万次阅读 多人点赞 2018-01-22 13:11:04
    一、uboot简介 U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的 开放源码项目。 - 在操作系统方面 ,U-...- 嵌入式Linux系统的引导,它还支持NetBSD, VxWorks,

    参考博文: http://blog.51cto.com/9291927/1791237

    一、uboot简介

    U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的 开放源码项目。
    - 在操作系统方面 ,U-Boot不仅支持
    - 嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统。目前支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。
    - 在CPU架构方面 ,U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。
    - uboot主要作用 是用来启动操作系统内核

    * *

    uboot什么时候开始运行,什么时候结束运行?

      1.uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot(意思就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot(所以uboot启动了内核后uboot自己本身就死了,要想再次看到      uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生)
    
      2. **uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核** 。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了
    

    二、uboot的工作模式

    * U-Boot的工作模式有启动加载模式和下载模式。*

    1、启动加载模式

    启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将 [嵌入式操作系统](file:///h)从FLASH中加载到SDRAM中运行,整个过程是自动的。
    

    2、下载模式

    下载模式就是Bootloader通过某些通信手段将 内核映像或 根文件系统映像等从PC机中下载到 目标板的FLASH中。用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。开发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机(Host)下载文件(比如内核映像、文件系统映像),将它们直接放在内存运行或是烧入Flash类固态存储设备中。

    板子与主机间传输文件时,可以使用串口的xmodem/ymodem/zmodem协议,还可以使用网络通过tftp、nfs协议来传输,以及USB下载等方法。

    一般来说,嵌入式开发人员采用下载模式进行开发嵌入式系统。通常采用交叉网线将PC与目标开发板连接,通过TFTP服务器下载内核,用NFS服务器挂载文件系统。

    三、uboot的常用命令

    1** 、获取命令**

    命令:help 或 ?

    功能:查看当前U-boot版本中支持的所有命令。
    

    2、环境变量命令

    环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份

    bootdelay 执行自动启动(bootcmd中的命令)的等候秒数
    baudrate 串口控制台的波特率
    netmask 以太网的网络掩码
    ethaddr 以太网的MAC地址
    bootfile 默认的下载文件名
    bootargs 传递给Linux内核的启动参数
    bootcmd 自动启动时执行命令
    serverip TFTP服务器端的IP地址
    ipaddr 本地的IP地址
    stdin 标准输入设备,一般是串口
    stdout 标准输出,一般是串口,也可是LCD(VGA)
    stderr 标准出错,一般是串口,也可是LCD(VGA)

    - 使用* print *命令可以打印出当前开发板的环境变量。
    - setenv envname value设置环境变量的值(设置后记得save保存

    (1)新建一个环境变量,使用set var value

    (2)更改一个环境变量,使用set var value

    (3)删除一个环境变量,使用set var

         (4)save将修改的环境变量保存到固态存储器中。
    
    • bootcmd 自动启动执行命令

    uboot开机后会自动倒计时,在倒计时结束前如果没有外部按键打断自动计时,uboot将自动执行bootcmd变量保存的命令。
    这里写图片描述
    意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。

    (1)可以将bootcmd设置为:set bootcmd print

    然后save保存;重启则会看到启动倒数后自动执行print命令打印出环境变量

    这里写图片描述
    (2) 再还原为内核启动命令:

    set bootcmd 'movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000'

    ( 中间有分号记得必须得加'' )

    • uboot给kernel传参:bootargs(内核移植中必定使用)

    (1)linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。

    (2)我们在uboot的环境变量中设置bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。
    这里写图片描述
    意义解释:

    console=ttySAC2,115200 控制台使用串口2,波特率115200.

    root=/dev/mmcblk0p2 rw 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的

    init=/linuxrc linux的进程1(init进程)的路径

    rootfstype=ext3 根文件系统的类型是ext3

    3、网络命令

    . uboot可以通过网络来传输文件到开发板,直接用交叉网线连接开发板和电脑,也可以用普通直连网线连接路由器。

    ping ip
    
    • 网络命令搭建开发板uboot和虚拟机ubuntu互相ping通记录在另一博课笔记中

      如果网络连通,就可以通过tftp、NFS挂载开发板

    4.tftp下载指令:tftp

    作用:使uboot为了部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中去。

    将要下载的镜像文件放在服务器的下载目录中,然后开发板中使用uboot的tftp命令去下载即可。

    我的虚拟机搭建的时候设置的tftp下载目录是/tftpboot,将要被下载的镜像复制到这个目录下。

    具体参考另一博客tftp服务器的安装搭建及使用(保证已经可以ping通)

    5.nfs启动内核命令:nfs

    作用: nfs服务,通过它"挂载"制作好的根文件系统。

    主机开启nfs服务后,就可以像tftp一样传文件到开发板了,而且nfs还可以挂载根文件系统,这就是nfs的主要作用

    具体参考另一博客* nfs服务器的安装及使用*

    6.SD卡/iNand操作指令movi

    • movi的指令都是movi read和movi write一组的,

      movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存

    • movi指令是一个命令集,有很多子命令,具体用法可以help ,这里说明怎么看

      例:movi read {u-boot | kernel} {addr}

    这个命令使用了一种通用型的描述方法来描述:movi 和 read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]表示可选参数(可以有也可以没有)

    譬如命令 movi read u-boot 0x30000000表示如下:

    意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。

    (uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名,uboot程序操作中可以使用直接地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000,意思是一样的( uboot的命令行中所有数字都被默认当作十六进制处理 ,不管你加不加0x都一样)。

    7.NandFlash操作指令nand
    这里写图片描述
    8.内存操作指令:mm、mw、md

    • * nm * 修改内存值 * ( *指定地址* ) *

      格式: nm [.b, .w, .l] address

    • * mm 修改内存值(地址自动加一)*

      格式: mm [.b, .w, .l] address

    • * md 显示内存值*

      格式: md [.b, .w, .l] address [# of objects]

    • mw 用指定的数据填充内存

      格式: mw [.b, .w, .l] address value [count]

    • * cp 内存的拷贝(包括内存与Nor Flash间的数据拷贝)*

      格式:cp [.b, .w, .l] source target count

    9.启动内核指令:bootm、go

    uboot命令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。

    差别: bootm启动内核同时给内核传参,而go命令启动内核不传参。 bootm其实才是正宗的启动内核的命令,一般情况下都用这个 ;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已

    四.uboot中对Flash和DDR的管理

    uboot在Flash中的分区

    Flash分区如下: 功能:
    自由分区 待用空间(一般做根文件系统使用)
    rootfs 根文件系统文件
    kernel 内核文件
    var 环境变量
    uboot bootlater(必须在最前面)

    (1)各分区彼此相连,前面一个分区的结尾就是后一个分区的开头。

    (2)整个flash充分利用,从开头到结尾。

    (3)uboot必须在Flash开头,其他分区相对位置是可变的。

    (4)各分区的大小由系统移植工程师自己来定,一般定为合适大小(不能太小,太小了容易溢出;不能太大,太大了浪费空间)

    (5)分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。将来在系统部署时和系统代码中的分区方法也必须一样。

    因为Flash是掉电不丢失的,因此,在对Flash进行分区的时候要考虑到以后的使用条件。而DDR是掉电丢失的,因此,在系统的每个阶段都可以对它进行重新分区,例如在uboot阶段它有自己的分区管理,而在kernel启动起来之后,整个内存又将被kernel给接替过来,kernel将会对内存进行重新的分区和管理。

    综上:DDR要根据具体使用情况对其进行分区管理,注意内存不要重叠。

    展开全文
  • uboot和Linux内核移植

    千次阅读 2020-01-03 05:24:04
    这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文。请发送「uboot和Linux内核移植」到公众号后台获取下载...

    这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文。

    请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接。


    这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文。

    请发送「uboot和Linux内核移植 」到公众号后台获取下载链接。

    一、uboot学习前传 1

    • 1.1为什么要有uboot 1

    • 1.1.1.计算机的主要部件 1

    • 1.1.2 .PC机的启动过程 1

    • 1.1.3.典型嵌入式linux系统启动过程 1

    • 1.1.4. android系统启动过程 1

    • 1.1.5.总结:uboot到底是干嘛的 1

    • 1.2 为什么是uboot 2

    • 1.2.1 .uboot从哪里来 2

    • 1.2.2 .uboot的发展历史 2

    • 1.2.3. uboot的版本号问题 2

    • 1.2.4. uboot的可移植性的正确理解 2

    • 1.2.5.总结:时势造英雄,任何牛逼的东西都是时代的产物 2

    • 1.3 uboot必须解决哪些问题 2

    • 1.3.1.能自身开机直接启动 2

    • 1.3.2.能引导操作系统内核启动并给内核传参 2

    • 1.3.3.能提供系统部署功能 3

    • 1.3.4.能进行SoC级和板级硬件管理 3

    • 1.3.5.uboot的生命周期 3

    • 1.4 uboot的工作方式 3

    • 1.4.1.从裸机程序镜像uboot.bin说起 3

    • 1.4.2.uboot的命令行式shell界面 4

    • 1.4.3.掌握uboot使用的2个关键点:命令和环境变量 4

    • 1.4.4.思考:结合ARM裸机部分进行理解和印证 4

    • 1.5 uboot的常用命令 4

    • 1.5.1.类似linux终端的行缓冲命令 4

    • 1.5.2.有些命令有简化的别名 4

    • 1.5.3.有些命令会带参数(注意格式是固定的) 5

    • 1.5.4.命令中的特殊符号(譬如单引号) 5

    • 1.5.5.有些命令是一个命令族(譬如movi) 5

    • 1.5.6.第一个命令:printenv/print 5

    • 1.5.7.设置(添加/更改)环境变量:setenv/set 5

    • 1.5.8.保存环境变量的更改:saveenv/save 5

    • 1.5.9.网络测试指令:ping 6

    • 1.5.10.tftp下载指令:tftp 6

    • 1.5.11.SD卡/iNand操作指令movi 7

    • 1.5.12.NandFlash操作指令nand 7

    • 1.5.13.内存操作指令:mm、mw、md 7

    • 1.6 开发板和主机的ping通 8

    • 1.6.1.开发板运行linux下和主机Windows的ping通 8

    • 1.6.2.开发板运行linux下和虚拟机ubuntu的ping通 8

    • 1.6.3.开发板运行uboot下和主机Windows的ping通 8

    • 1.6.4.开发板运行uboot下和虚拟机ubuntu的ping通 9

    • 1.7 uboot的常用环境变量 9

    • 1.7.1.环境变量如何参与程序运行 9

    • 1.7.2.自动运行倒计时:bootdelay 9

    • 1.7.3.网络设置:ipaddr serverip 9

    • 1.7.4.自动运行命令设置:bootcmd 9

    • 1.7.5.uboot给kernel传参:bootargs 9

    • 1.7.6.新建、更改、删除一个环境变量的方法 10

    • 1.7.7.注意:环境变量更改后的保存 10

    • 1.8 uboot中对Flash和DDR的管理 10

    • 1.8 .1.uboot阶段Flash的分区 10

    • 1.8 .2.uboot阶段DDR的分区 11

    二、Shell和Makefile 11

    • 2.1 Shell介绍 11

    • 2.1.1.Shell是什么? 11

    • 2.1.2.shell概指一类编程语言(在shell中用于编写程序的语言) 11

    • 2.1.3.shell脚本的运行机制:解释执行(没有编译和链接的过程) 11

    • 2.2 写shell程序 12

    • 2.2.1.文本编辑器 12

    • 2.2.2.shell程序的运行方法 12

    • 2.2.3.shell程序注意事项: 12

    • 2.2.4.shell不神秘 12

    • 2.3 shell编程学习 13

    • 2.3.1.shell中的变量定义、初始化、赋值和引用 13

    • 2.3.2.shell中无引号、单引号、双引号的区别 13

    • 2.3.3.shell中调用linux命令 14

    • 2.4 shell中的选择分支结构 14

    • 2.5 shell中的循环结构 15

    • 2.6 Makefile基础回顾 17

    • 2.6.1.Makefile的作用和意义 17

    • 2.6.2.目标、依赖、命令 17

    • 2.6.3.通配符%和Makefile自动推导(规则) 18

    • 2.6.4.Makefile中定义和使用变量 18

    • 2.6.5.伪目标(.PHONY) 18

    • 2.6.6.Makefile的文件名 18

    • 2.6.7.Makefile中引用其他Makefile(include指令) 18

    • 2.7 Makefile补充学习 18

    • 2.7.1.Makefile中的注释 # 18

    • 2.7.2.命令前面的@用来静默执行 18

    • 2.7.3.Makefile中几种变量赋值运算符 19

    • 2.7.4.Makefile的环境变量 20

    • 2.7.5.Makefile中的通配符 20

    • 2.7.6.Makefile的自动变量 20

    三、零距离体验uboot 20

    • 3.1 X210官方uboot配置编译实践 20

    • 3.1.1.找到官方移植好的uboot(BSP概念) 21

    • 3.1.2.在linux源生目录下配置编译 21

    • 3.1.3.配置 21

    • 3.1.4.编译得到uboot.bin 21

    • 3.2 uboot的源码目录分析 22

    • 3.2.1.九鼎官方uboot和三星原版uboot对比 22

    • 3.2.2.各文件介绍 22

    • 3.2.3.各文件夹介绍 23

    • 3.3 SourceInsight的基本使用 25

    • 3.3.1.为什么要使用SourceInsight 25

    • 3.3.2.建立工程及添加文件 25

    • 3.3.3.解析工程文件 26

    • 3.3.4.常用技巧 26

    四、uboot配置和编译过程详解 26

    • 4.1 uboot主Makefile分析 26

    • 4.1.1.uboot version确定(Makefile的24-29行) 26

    • 4.1.2.HOSTARCH和HOSTOS 26

    • 4.1.3.静默编译(50-54行) 27

    • 4.1.4.两种编译方法 27

    • 4.1.5.OBJTREE、SRCTREE、TOPDIR 27

    • 4.1.6.MKCONFIG(Makefile的101行) 27

    • 4.1.7.include $(obj)include/config.mk(133行) 28

    • 4.1.8.ARCH CROSS_COMPILE 28

    • 4.1.9.$(TOPDIR)/config.mk(主Makefile的185行) 29

    • 4.1.10.第一个目标all(主Makefile的第291行) 30

    • 4.2 uboot配置过程mkconfig详解 30

    • 4.3 uboot的u-boot.lds链接脚本 32

    五、uboot源码分析1-启动第一阶段 33

    • 5.1 start.S的引入 33

    • 5.1.1. u-boot.lds中找到start.S入口 33

    • 5.1.2. SI中如何找到文件 33

    • 5.1.3. SI中找文件技巧 33

    • 5.2 start.S解析 33

    • 5.2.1.不简单的头文件包含 34

    • 5.2.2.启动代码的16字节头部 34

    • 5.2.3.异常向量表的构建 35

    • 5.2.4.有点意思的deadbeef 35

    • 5.2.5.TEXT_BASE等 36

    • 5.2.6.(107行)CFG_PHY_UBOOT_BASE 36

    • 5.2.8.设置CPU为SVC模式(149行) 36

    • 5.2.9.设置L2、L1cache和MMU 36

    • 5.2.10.识别并暂存启动介质选择 36

    • 5.2.11.设置栈(SRAM中的栈)并调用lowlevel_init 37

    • 5.3 lowlevel_init.S解析 37

    • 5.3.1.检查复位状态 37

    • 5.3.2.IO状态恢复 37

    • 5.3.3.关看门狗 38

    • 5.3.4.一些SRAM SROM相关GPIO设置 38

    • 5.3.5.供电锁存 38

    • 5.3.6.判断当前代码执行位置 38

    • 5.3.7.system_clock_init 39

    • 5.3.8.mem_ctrl_asm_init 39

    • 5.3.9.uart_asm_init 40

    • 5.3.10.tzpc_init 40

    • 5.3.11.pop {pc}以返回 40

    • 5.4 回到start.S解析 40

    • 5.4.1.再次设置栈(DDR中的栈) 40

    • 5.4.2.再次判断当前地址以决定是否重定位 41

    • 5.5 uboot重定位详解 41

    • 5.6 start.S继续解析1 42

    • 5.6.1.关于虚拟地址和物理地址 42

    • 5.6.2.地址映射原理 43

    • 5.6.3.什么是页表(转换表)呢? 43

    • 5.6.4.uboot中虚拟地址映射采用了段模式 43

    • 5.6.5.uboot中的映射页表 46

    • 5.6.6.MMU单元的作用 46

    • 5.6.7.地址映射的额外收益1:访问控制 46

    • 5.6.8.地址映射的额外收益2:cache 46

    • 5.7 start.S继续解析2 47

    • 5.7.1.使能域访问(cp15的c3寄存器) 47

    • 5.7.2.设置TTB(cp15的c2寄存器) 47

    • 5.7.3.使能MMU单元(cp15的c1寄存器) 47

    • 5.7.4.找到映射表待分析 48

    • 5.8 start.S继续解析3 48

    • 5.8.1.再三次设置栈 48

    • 5.8.2.清理bss 48

    • 5.8.3. ldr pc, _start_armboot 48

    • 5.8.4.总结:uboot的第一阶段做了哪些工作 49

    六、uboot源码分析2-启动第二阶段 50

    • 6.1.start_armboot函数简介 50

    • 6.1.2.一个很长的函数组成uboot第二阶段 50

    • 6.1.3. 宏观分析:uboot第二阶段应该做什么 50

    • 6.1.4.思考:uboot第二阶段完结于何处? 50

    • 6.2 start_armboot解析1 51

    • 6.2.1. init_fnc_t 51

    • 6.2.2. DECLARE_GLOBAL_DATA_PTR 51

    • 6.3内存使用排布 52

    • 6.3.1.为什么要分配内存 52

    • 6.3.2.内存排布 52

    • 6.3.3. uboot运行过程中的存储分布图解 52

    • 6.4 start_armboot解析2 53

    • 6.4.1. for循环执行init_sequence 53

    • 6.4.2. int cpu_init(void) 55

    • 6.4.3. int board_init(void) 55

    • 6.4.4. int interrupt_init(void) 57

    • 6.4.5. int env_init(void) 58

    • 6.4.6. int init_baudrate(void) 59

    • 6.4.7. int serial_init(void) 59

    • 6.4.8. int console_init_f(void) 59

    • 6.4.9. int display_banner(void) 59

    • 6.4.10 int print_cpuinfo(void) 60

    • 6.4.11. int checkboard(void) 60

    • 6.4.12. int init_func_i2c(void) 61

    • 6.4.13. int dram_init(void) 61

    • 6.4.14. int display_dram_config(void) 61

    • 6.4.15. CFG_NO_FLASH 61

    • 6.4.16. 初始化堆管理器 mem_malloc_init 62

    • 6.4.17. 开发板独有初始化:mmc初始化 62

    • 6.4.18. env_relocate 62

    • 6.4.19. IP地址、MAC地址的确定 63

    • 6.4.20. int devices_init (void) 63

    • 6.4.21. void jumptable_init (void) 63

    • 6.4.22. console_init_r () 63

    • 6.4.23. void enable_interrupts (void) 64

    • 6.4.24. loadaddr、bootfile两个环境变量 64

    • 6.4.25. board_late_init (void) 64

    • 6.4.26. int eth_initialize(bd_t *bis) 64

    • 6.4.27. x210_preboot_init(void)(LCD和logo显示) 64

    • 6.4.28. check menukey to update from sd 65

    • 6.4.29. main_loop(uboot的归宿) 65

    • 6.4.30. 启动过程特征总结 66

    七、uboot源码分析3-uboot如何启动内核 66

    • 7.1 uboot和内核到底是什么 66

    • 7.1.1. uboot是一个裸机程序 66

    • 7.1.2.内核本身也是一个"裸机程序" 66

    • 7.1.3.部署在SD卡中特定分区内 66

    • 7.1.4.运行时必须先加载到DDR中链接地址处 67

    • 7.1.5.内核启动需要必要的启动参数 67

    • 7.2. 启动内核第一步:加载内核到DDR中 67

    • 7.2.1.静态内核镜像在哪里? 67

    • 7.2.2.镜像要放在DDR的什么地址? 67

    1. 3.zImage和uImage的区别联系 67

  • 7.3.1. bootm命令对应do_bootm函数 68

  • 7.3.2. vmlinux和zImage和uImage 68

  • 7.4 zImage启动细节 69

  • 7.4.1. LINUX_ZIMAGE_MAGIC 69

  • 7.4.2. image_header_t 69

  • 7.5 uImage启动 70

  • 7.6 do_bootm_linux函数 70

  • 7.6.1.找到do_bootm_linux函数 70

  • 7.6.2.镜像的entrypoint 70

  • 7.6.3.机器码的再次确定 70

  • 7.6.4.传参并启动概述 70

  • 7.7传参详解 71

  • 7.7.1. tag方式传参 71

  • 7.7.2. x210_sd.h中配置传参宏 71

  • 7.7.3.移植时注意事项 71

  • 7.8 uboot启动内核的总结 71

  • 八、uboot源码分析4-uboot的命令体系 72

    • 8.1 uboot命令体系基础 72

    • 8.1.1.使用uboot命令 72

    • 8.1.2. uboot命令体系实现代码在哪里 72

    • 8.1.3.每个命令对应一个函数 72

    • 8.1.4.命令参数以argc&argv传给函数 72

    • 8.2 uboot命令解析和执行过程分析 72

    • 8.2.1.从main_loop说起 72

    • 8.2.2关键点分析 73

    • 8.3 uboot如何处理命令集1 73

    • 8.3.1.可能的管理方式 73

    • 8.3.2.命令结构体cmd_tbl_t 73

    • 8.3.2. uboot实现命令管理的思路 74

    • 8.4 uboot如何处理命令集2 74

    • 8.4.1. uboot命令定义具体实现分析 74

    • 8.4.2. find_cmd函数详解 75

    • 8.5 uboot中添加自定义命令 76

    • 8.5.1.在已有的c文件中直接添加命令 76

    • 8.5.2.自建一个c文件并添加命令 76

    九、uboot源码分析5-uboot的环境变量 77

    • 9.1 uboot的环境变量基础 77

    • 9.1.1.环境变量的作用 77

    • 9.1.2.环境变量的优先级 77

    • 9.1.3.环境变量在uboot中工作方式 77

    • 9.2.环境变量相关命令源码解析 78

    • 9.2.1. printenv 78

    • 9.2.2. setenv 79

    • 9.2.3. saveenv 80

    • 9.2.4. getenv 80

    • 9.2.5. getenv_r 81

    十、uboot源码分析6-uboot的硬件驱动部分 81

    • 10.1 uboot与linux驱动 81

    • 10.1.2. uboot的虚拟地址对硬件操作的影响 81

    • 10.1.3. uboot借用(移植)了linux驱动 81

    • 10.2 iNand/SD驱动解析 82

    • 10.2.1.从start_armboot开始 82

    • 10.2.2. mmc_initialize 82

    • 10.2.3. cpu_mmc_init 82

    • 10.2.4. smdk_s3c_hsmmc_init 82

    • 10.2.5. s3c_hsmmc_initialize 82

    • 10.2.6. find_mmc_device 83

    • 10.2.7. mmc_init 83

    • 10.2.8. 总结 83

    • 10.2.9. struct mmc 84

    • 10.2.10.分离思想 84

    • 10.2.11.分层思想 84

    十一、uboot的移植1-从三星官方uboot开始移植 84

    • 11.1移植前的准备工作 84

    • 11.1.1.三星移植过的uboot源代码准备 85

    • 11.1.2. SourceInsight准备 85

    • 11.1.3.便捷的文件传输工具sshsecureshell 85

    • 11.2 ubuntu14.04上网及安装openssh 85

    • 11.2.1. ubuntu14.04上网问题 85

    • 11.2.2.搭建openssh环境 86

    • 11.3 移植初体验 86

    • 11.3.1.直接编译三星移植版uboot尝试运行 86

    • 11.3.2.代码分析&问题查找 86

    • 11.4时钟和DDR的配置移植 87

    • 11.4.1.确认时钟部分的配置 87

    • 11.4.2. DDR配置信息的更改 87

    • 11.5 将DDR端口0地址配置为30000000开头 87

    • 11.4.1. DDR初始化参数更改 87

    • 11.4.2. smdkv210single.h中相关宏定义修改 88

    • 11.4.3.虚拟地址映射表中相应修改 88

    • 11.4.4.修改DMC0的配置参数 88

    • 11.4.5.修改修改虚拟地址到物理地址的映射函数 89

    • 11.5 iNand驱动问题的解决 89

    • 11.5.1.先从现象出发定位问题 89

    • 11.5.2.网络搜索解决方案 89

    • 11.5.3.尝试修改代码解决问题 89

    • 11.5.4.推测和实验验证(SD卡和iNand的区别) 90

    • 11.6 一些小问题的修补 90

    • 11.6.1控制台串口更换为串口0 90

    • 11.6.2修改默认网络地址设置 90

    • 11.6.3修改行提示符 91

    • 11.6.1总结 91

    一、uboot学习前传

    1.1为什么要有uboot

    1.1.1.计算机的主要部件

    • (1)计算机系统就是由CPU来做核心进行运行的系统。典型的计算机系统有:PC机(台式机+笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(家用电器像电饭锅、空调)。

    • (2)计算机系统的组成部件非常多 ,不同计算机的组成部件也不同。但是所有的计算机系统运行时都需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/ 硬盘) + 内部存储器(DDR SDRAM/ SDRAM/ SRAM)。

    1.1.2 .PC机的启动过程

    • (1)典型的PC机的部署:BIOS程序部署在PC机主板上(随主板出厂时就已经预制了),操作系统部署在硬盘上,内存在掉电时无作用,CPU在掉电时不工作。

    • (2)启动过程:PC上电后先执行BIOS程序(实际上PC的BIOS保存在NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)。

    1.1.3.典型嵌入式linux系统启动过程

    • (1)嵌入式系统的部署和启动都是参考的PC机的。只是设备上有一些差别。

    • (2)典型嵌入式系统的部署:uboot程序部署在Flash(能作为启动设备的Flash上),OS部署在Flash(嵌入式系统中使用了Flash代替了硬盘),内存在掉电时无作用,CPU在掉电时不工作。

    • (3)启动过程:嵌入式系统上电后先执行uboot,然后ubbot负责初始化DDR、初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot无用了)。

    总结:嵌入式系统和PC机的启动过程几乎没有两样,只是BIOS成了uboot,硬盘成了Flash。

    1.1.4. android系统启动过程

    • (1)android系统的启动和linux系统(前面讲的典型的嵌入式系统启动)几乎一样。几乎一样意思就是前面完全一样,只是在内核启动后加载根文件系统不同了。

    • (2)可以认为启动分为2个阶段:第一个阶段是uboot到OS启动;第二个阶段是OS启动后到rootfs加载到命令行执行;现在我们主要研究第一个阶段,android的启动和linux的差别在第二阶段。

    1.1.5.总结:uboot到底是干嘛的

    • (1)uboot主要作用是用来启动操作系统内核的。

    • (2)uboot还主要负责部署整个计算机系统。

    • (3)uboot中还有操作Flash等板子上硬盘的驱动。

    • (4)uboot还得提供一个命令行界面供人机交互。

    1.2 为什么是uboot

    1.2.1 .uboot从哪里来

    • (1)uboot是SourceForge上的开源项目

    • (2)uboot项目的作者:是由一个德国人最早发起的

    • (3)uboot就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而来的一个BootLoader

    1.2.2 .uboot的发展历史

    • (1)自己使用的小开源项目。

    • (2)被更多人认可使用

    • (3)被SoC厂商默认支持。总结:uboot经过多年发展,已经成为事实上的业内bootloader标准。现在大部分的嵌入式设备都会默认使用uboot来做为bootloader。

    1.2.3. uboot的版本号问题

    • (1)早期的uboot的版本号类似于这样:uboot1.3.4。后来版本号便成了类似于uboot-2010.06。

    • (2)uboot的核心部分几乎没怎么变化,越新的版本支持的开发板越多而已,对于一个老版本的芯片来说,新旧版本的uboot并没有差异。

    1.2.4. uboot的可移植性的正确理解

    • (1)uboot就是universal bootloader(通用的启动代码),通用的意思就是在各种地方都可以用。所以说uboot具有可移植性。

    • (2)uboot具有可移植性并不是说uboot在哪个开发板都可以随便用,而是说uboot具有在源代码级别的移植能力,可以针对多个开发板进行移植,移植后就可以在这个开发板上使用了。

    1.2.5.总结:时势造英雄,任何牛逼的东西都是时代的产物

    uboot的出现是一种必然,如果没有uboot也会有另一个bootloader来代替。

    1.3 uboot必须解决哪些问题

    1.3.1.能自身开机直接启动

    • (1)一般的SoC都支持多种方式启动,譬如SD卡启动、NorFlash启动、NandFlash启动等……  uboot要能够开机启动,必须根据具体的SoC的启动设计来设计uboot

    • (2)uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。uboot中第一阶段的start.S文件就是具体处理了这一块。

    1.3.2.能引导操作系统内核启动并给内核传参

    • (1)uboot的终极目标就是启动内核

    • (2)linux内核在设计的时候,设计为可以被传参。也就是说我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定的位置然后传给内核,内核启动后会到这个特定的位置去取uboot传给它的参数,然后在内核中解析这些函数,这些函数将来被用来指导linux内核的启动过程。

    1.3.3.能提供系统部署功能

    • (1)uboot必须能够被人借助而完成整个系统(包括uboot、kernel、rootfs等的镜像)在Flash上的烧录下载工作。

    • (2)裸机中刷机就是利用uboot中的fastboot功能将各种镜像烧录到iNand中,然后从iNand启动。

    1.3.4.能进行SoC级和板级硬件管理

    • (1)uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在刷机时LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口,譬如uboot要实现网络功能就必须驱动网卡芯片。

    • (2)SoC级(譬如串口)就是SoC内部外设,板级就是SoC外面开发板上面的硬件(譬如 网卡、iNand)

    1.3.5.uboot的生命周期

    • (1)uboot的生命周期就是指:uboot什么时候开始运行,什么时候结束运行。

    • (2)uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot(意思就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot(所以uboot启动了内核后,uboot本身就死了,要想再次看到uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生)。

    • (3)uboot的入口和出口。uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行下继续执行uboot命令,而启动内核命令一旦执行就回不来了。

    总结 :一切都是为了启动内核。


    扫码或长按关注

    回复「 篮球的大肚子」进入技术群聊

    展开全文
  • 向Flash中烧写uboot和linux操作系统 2011年03月28日  向Flash中烧写uboot和linux操作系统  ================================================================================  from:...
    向Flash中烧写uboot和linux操作系统 
    2011年03月28日
      向Flash中烧写uboot和linux操作系统
      ================================================================================
      from:http://www.diybl.com/course/6_system/linux/Linuxjs/20090428/165769.html
      一、片内启动
      1、用Xmodem协议,发送loader.bin和uboot.bin文件,此时uboot.bin被发送到系统的
      SDRAM中,发送完后uboot开始运行,如果这时断电或退出,则一切将从头开始,因为SDRAM内存储的数据会在断电或退出后消失
      2、擦除 Flash
      在对Flash进行烧写之前,需要将其擦除:
      Uboot>protect off all 去掉Flash的扇区写保护
      Uboot>erase all 擦除Flash的所有扇区
      (注:
      如果只是要擦除某块区域的Flash,比如0x10000000到0x10060000之间的区域,则可用命令:
      1)protect off 10000000
      2)erase 10000000 1006ffff
      如果是要对某块区域加上写保护,比如0x10000000到0x10060000之间的区域,则可用命令:
      1)protect on 10000000 1006ffff
      可用flinfo命令来查看那些区域是受保护的,那些区域不是受保护的。
      3、烧写boot.bin到Flash
      在Uboot提示符下键入命令:
      Uboot>loadb 21000000
      (下完之后会显示boot.bin的大小,然后在后面用命令cp.b烧写时将其后4位变成f,假如文件大小为5e33a,则在烧写时将其变为5ffff) 将文件发送到系统的SDRAM中然后在超级终端使用Kermit协议,发送文件boot.bin,发送完毕后,键入以下命令:
      Uboot>cp.b 21000000 10000000 5ffff 将发送到SDRAM中的数据写入Flash
      Uboot>protect on 10000000 10005ffff 对写入Flash的内容进行写保护
      注:
      此处还可以用tftp或bootp协议来完成,不过要先设置网络变量,即设置本机和目标机的IP地址,还有目标机的Mac地址。
      网络环境变量:
      Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000
      ramdisk_size=15360
      console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
      Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
      tftp协议:
      1)tftp 21000000 lb/boot.bin
      2)cp.b 21000000 10000000 5ffff
      3)protect on 10000000
      bootp协议:
      1)bootp 21000000 lb/boot.bin
      2)cp.b 21000000 10000000 5ffff
      3)protect on 10000000 10005fff
      4、烧写 Uboot.gz 到 Flash
      在Uboot提示符下键入命令:装入Uboot.gz6
      Uboot>loadb 20000000 将文件发送到系统的SDRAM中.
      然后在超级终端使用Kermit协议,发送文件Uboot.gz,发送完毕后,键入以下命令:
      Uboot>cp.b 20000000 10010000 ffff 将发送到SDRAM中的数据写入Flash
      Uboot>protect on 10000000 1001ffff 对写入Flash的内容进行写保护
      (注:此处也可以用tftp或bootp协议)
      二、片外启动
      如何在uboot内运行自己的程序
      1、手动运行(只是将程序下载到SDRAM中运行,仅做测试之用,断电或退出后就会消失)
      1)loadb 20000000 下载用户程序(*.bin)
      2)go 20000000 程序就会运行
      2、自动运行(将程序写入Flash,uboot启动之后程序自动运行
      1)设置环境变量
      Uboot>setenv usr_prg cp.b 10300000 20000000 ffff(程序的大小)
      Uboot>setenv run_prg go 20000000
      Uboot>setenv bootcmd run usr_prg\;run run_prg
      Uboot>saveenv
      2)写入程序,即将其烧入Flash
      protect off all
      erase 10300000 103fffff
      loadb 20000000 下载*.bin
      cp.b 20000000 10300000 ffff(用户程序的大小)
      3)reset之后程序就会自动运行"T1X$m
      二、烧写linux程序开
      1、下载linux到系统的SDRAM运行(仅做测试之用,断电或退出后就会消失)程
      1)运行Uboot,设置环境变量
      Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000
      ramdisk_size=15360
      console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
      Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
      2)下载linux内核,文件系统
      打开tftpserver应用程序,设置根目录路径,将内核、文件系统等拷贝到所设置的根目录下。
      Uboot>tftp 21100000 ramdisk.gz 下载文件系统
      Uboot>tftp 21000000 uImage 下载 linux 内核
      Uboot>bootm 21000000 启动 linux
      然后linux操作系统就开始运行。
      2、烧写 Linux 到系统的 Flash 运行
      1)设置运行Linux的环境变量
      Uboot> setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000
      ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv image cp.b 10020000 21000000 b0000 拷贝内核到sdram
      Uboot>setenv ramdisk cp.b 100d0000 21100000 226000 拷贝文件系统到sdram
      Uboot>setenv boot bootm 设置变量
      Uboot>setenv bootcmd run ramdisk\;run image\;run boot 设置默认变量bootcmd
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr 目标板 ip 地址 目标板 ip 地址,由你自己决定
      Uboot>setenv serverip 主机ip地址 主机ip地址,就是你的PC的ip程序开
      Uboot>saveenv 保存环境变量
      2)烧写Linux内核到Flash
      Uboot>tftp 21100000 ramdisk.gz
      Uboot>cp.b 21100000 100d0000 226000
      Uboot>tftp 21000000 uImage
      Uboot>cp.b 21000000 10020000 b0000
      reset之linux操作系统就开始运行。
      ================================================================================
      ================================================================================
      from: http://www.91linux.com/html/article/qianrushiyingyong/20081227/15061.html
      u-boot命令介绍及烧写程序实例
      bootdelay
      定义执行自动启动的等候秒数
      baudrate
      定义串口控制台的波特率
      netmask
      定义以太网接口的掩码
      ethaddr
      定义以太网接口的MAC地址
      bootfile
      定义缺省的下载文件
      bootargs
      定义传递给Linux内核的命令行参数
      bootcmd
      定义自动启动时执行的几条命令
      serverip
      定义tftp服务器端的IP地址
      ipaddr
      定义本地的IP地址
      stdin
      定义标准输入设备,一般是串口
      stdout
      定义标准输出设备,一般是串口
      stderr
      定义标准出错信息输出设备,一般是串口
      u-boot命令介绍及烧写程序实例zz
      Printenv 打印环境变量。
      Uboot> printenv
      baudrate=115200
      ipaddr=192.168.1.1
      ethaddr=12:34:56:78:9A:BC
      serverip=192.168.1.5
      Environment size: 80/8188 bytes
      Setenv 设置新的变量
      Uboot> setenv myboard AT91RM9200DK
      Uboot> printenv
      baudrate=115200
      ipaddr=192.168.1.1
      ethaddr=12:34:56:78:9A:BC
      serverip=192.168.1.5
      myboard=AT91RM9200DK
      Environment size: 102/8188 bytes
      Saveenv 保存变量
      命令将当前定义的所有的变量及其值存入flash中。用来存储变量及其值的空间只有8k字节,应不要超过。
      Loadb 通过串口Kermit协议下载二进制数据。
      Tftp 通过网络下载程序,需要先设置好网络配置
      Uboot> setenv ipaddr 192.168.0.1
      Uboot> setenv serverip 192.168.1.115 (tftp服务器的地址)
      下载bin文件到地址0x20000000处。
      Uboot> tftp 20000000 u-bo.bin (u-boot.bin应位于tftp服务程序的目录)
      Uboot> tftp 32000000 vmlinux
      把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。
      Md 显示内存区的内容。
      Mm 修改内存,地址自动递增。
      Nm 修改内存,地址不自动递增。
      Mw 用模型填充内存
      mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
      Cp 拷贝一块内存到另一块
      Cmp 比较两块内存区
      这些内存操作命令后都可加一个后缀表示操作数据的大小,比如cp.b表示按字节拷贝。
      Protect 写保护操作
      protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)
      protect off 1:0-3取消写保护
      Erase 擦除扇区。
      erase: 删除FLASH的扇区
      erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)
      对DataFlash的操作
      U-Boot在引导时如果发现NPCS0和NPCS3上连有DataFlash,就会分配虚拟的地址给它,具体为 :
      0xC0000000---NPCS0
      0xD0000000---NPCS3
      run 执行设置好的脚本
      Uboot> setenv flashit tftp 20000000 mycode.bin\; erase 10020000 1002FFFF\;
      cp.b 20000000 10020000 8000
      Uboot> saveenv
      Uboot> run flashit
      bootcmd 保留的环境变量,也是一种脚本
      如果定义了该变量,在autoboot模式下,将会执行该脚本的内容。
      Go 执行内存中的二进制代码,一个简单的跳转到指定地址
      Bootm 执行内存中的二进制代码
      要求二进制代码为制定格式的。通常为mkimage处理过的二进制文件。
      起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
      Bootp 通过网络启动,需要提前设置好硬件地址。
      ? 得到所有命令列表
      help help usb, 列出USB功能的使用说明
      ping 注:只能开发板PING别的机器
      usb
      usb start: 起动usb 功能
      usb info: 列出设备
      usb scan: 扫描usb storage(u 盘)设备
      kgo 起动没有压缩的linux内核
      kgo 32000000
      fatls 列出DOS FAT文件系统
      fatls usb 0列出第一块U盘中的文件
      fatload 读入FAT中的一个文件
      fatload usb 0:
      
      [img]chrome://skype_ff_toolbar_win/content/famfamfam/cz.gif[/img]
      
      
      
      [img]chrome://skype_ff_toolbar_win/content/arrow.gif[/img]
      
      
      
      
      
      
      
      
      
      
      
      
      
      0 32000000
      
       u-boot.bin 把USB中的u-boot.bin 读到物理内存0x32000000处!
      flinfo 列出flash的信息
      nfs
      nfs 32000000 192.168.0.115:u-boot.bin
      把192.168.0.115(LINUX 的NFS文件系统)中的NFS文件系统中的u-boot.bin读入内存0x32000000处。
      [b]例:通过串口更新u-boot程序[/b]
      [
      u-boot@wpf
      ]# loadb
      ## Ready for binary (kermit) download to 0x33000000 at 115200 bps...
      loadb这个指令以kermit协议从串口下载二进制文件到开发板的内存中,默认下载到0x33000000。当然你可以改在别的地址,例如:loadb 30000000
      就是下载到0x30000000。这时候选择超级终端菜单上:传送〉发送文件,文件名选择编译好的U-Boot.bin,协议选择Kermit,点发送。可以看到发
      送进度。
      发送结束出现提示:
      ## Total Size = 0x0001d73c = 120636 Bytes
      ## Start Addr = 0x33000000
      这时可以测试新的修改好不好使:
      [
      u-boot@wpf
      ]# go 33000000
      ## Starting application at 0x33000000 ...
      go指令可以直接执行内存地址上的程序,
      然后烧写在NOR Flash中的U-boot。先看看NOR Flash的情况:
      [
      u-boot@wpf
      ]# flinfo
      Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)
      Size: 1 MB in 19 Sectors
      Sector Start Addresses:
      00000000 (RO) 00004000 (RO) 00006000 (RO) 00008000 (RO) 00010000 (RO)
      00020000 00030000 00040000 00050000 00060000
      00070000 00080000 00090000 000A0000 000B0000
      000C0000 000D0000 000E0000 000F0000 (RO)
      一共有19个sector,其中前5个总计128kb的sector有U-Boot程序。要烧写首先要去掉写保护:
      [
      u-boot@wpf
      ]# protect off 0 1ffff
      [
      u-boot@wpf
      ]# flinfo
      Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)
      Size: 1 MB in 19 Sectors
      Sector Start Addresses:
      00000000 00004000 00006000 00008000 00010000
      00020000 00030000 00040000 00050000 00060000
      00070000 00080000 00090000 000A0000 000B0000
      000C0000 000D0000 000E0000 000F0000 (RO)
      可以看到写保护已经去掉,然后擦除:
      [
      u-boot@wpf
      ]# erase 0 1ffff
      Erasing sector 0 ... ok.
      Erasing sector 1 ... ok.
      Erasing sector 2 ... ok.
      Erasing sector 3 ... ok.
      Erasing sector 4 ... ok.
      Erased 5 sectors
      烧写:(33000000下载地址 0 Nor起始地址 1d73c 文件长度)
      [
      u-boot@wpf
      ]# cp.b 33000000 0 1d73c
      Copy to Flash... done
      重启开发板,U-Boot的烧写就完成了。当然,一个更好的下载方法是利用tftp命令
      http://hi.baidu.com/vcmfc_linux/blog/item/9d07dfef11001c36acafd5d0.html
      ================================================================================
      ================================================================================
      from: http://www.ubuntuchina.com/viewthread.php?tid=3492
      uboot 下载内核和文件系统的步骤http://hi.baidu.com/xuhailong330 ... aa9bdc8d1029ab.html
      1)下载linux到系统的SDRAM运行(仅做测试之用,断电或退出后就会消失)
      1>运行Uboot,设置环境变量
      Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360
      console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
      Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
      2>下载linux内核,文件系统
      打开tftpserver应用程序,设置根目录路径,将内核、文件系统等拷贝到所设置的根目录下。
      Uboot>tftp 21100000 ramdisk.gz 下载文件系统
      Uboot>tftp 21000000 uImage 下载 linux 内核
      Uboot>bootm 21000000 启动 linux
      然后linux操作系统就开始运行。
      2)烧写 Linux 到系统的 Flash 运行
      1>设置运行Linux的环境变量
      Uboot> setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv image cp.b 10020000 21000000 b0000 拷贝内核到sdram
      Uboot>setenv ramdisk cp.b 100d0000 21100000 226000 拷贝文件系统到sdram
      Uboot>setenv boot bootm 设置变量boot
      Uboot>setenv bootcmd run ramdisk\;run image\;run boot 设置默认变量bootcmd
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr 目标板 ip 地址 目标板 ip 地址,由你自己决定
      Uboot>setenv serverip 主机ip地址 主机ip地址,就是你的PC的ip
      Uboot>saveenv 保存环境变量
      2>烧写Linux内核到Flash
      Uboot>tftp 21100000 ramdisk.gz
      Uboot>cp.b 21100000 100d0000 226000
      Uboot>tftp 21000000 uImage
      Uboot>cp.b 21000000 10020000 b0000
      reset之linux操作系统就开始运行。
      一、片内启动
      1、用Xmodem协议,发送loader.bin和uboot.bin文件,此时uboot.bin被发送到系统的SDRAM中,发送完后uboot开始运行,如果这时断电或退出,则一切将从头开始,因为SDRAM内存储的数据会在断电或退出后消失。
      2、擦除 Flash
      在对Flash进行烧写之前,需要将其擦除:
      Uboot>protect off all 去掉Flash的扇区写保护
      Uboot>erase all 擦除Flash的所有扇区
      (注:
      如果只是要擦除某块区域的Flash,比如0x10000000到0x10060000之间的区域,则可用命令:
      1)protect off 10000000 1006ffff
      2)erase 10000000 1006ffff
      如果是要对某块区域加上写保护,比如0x10000000到0x10060000之间的区域,则可用命令:
      1)protect on 10000000 1006ffff
      可用flinfo命令来查看那些区域是受保护的,那些区域不是受保护的。
      )
      3、烧写boot.bin到Flash
      在Uboot提示符下键入命令:
      Uboot>loadb 21000000 (下完之后会显示boot.bin的大小,然后在后面用命令cp.b烧写时将其后4位变成f,假如文件大小为5e33a,则在烧写时将其变为5ffff) 将文件发送到系统的SDRAM中
      然后在超级终端使用Kermit协议,发送文件boot.bin,发送完毕后,键入以下命令:
      Uboot>cp.b 21000000 10000000 5ffff 将发送到SDRAM中的数据写入Flash
      Uboot>protect on 10000000 10005ffff 对写入Flash的内容进行写保护
      (注:
      此处还可以用tftp或bootp协议来完成,不过要先设置网络变量,即设置本机和目标机的IP地址,还有目标机的Mac地址。
      网络环境变量:
      Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360
      console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
      Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
      tftp协议:
      1)tftp 21000000 lb/boot.bin
      2)cp.b 21000000 10000000 5ffff
      3)protect on 10000000 10005fff
      bootp协议:
      1)bootp 21000000 lb/boot.bin
      2)cp.b 21000000 10000000 5ffff
      3)protect on 10000000 10005fff
      )
      4、烧写 Uboot.gz 到 Flash
      在Uboot提示符下键入命令:装入Uboot.gz
      Uboot>loadb 20000000 将文件发送到系统的SDRAM中
      然后在超级终端使用Kermit协议,发送文件Uboot.gz,发送完毕后,键入以下命令:
      Uboot>cp.b 20000000 10010000 ffff 将发送到SDRAM中的数据写入Flash
      Uboot>protect on 10000000 1001ffff 对写入Flash的内容进行写保护
      (注:此处也可以用tftp或bootp协议)
      二、片外启动
      一)如何在uboot内运行自己的程序
      1、手动运行(只是将程序下载到SDRAM中运行,仅做测试之用,断电或退出后就会消失)
      1)loadb 20000000 下载用户程序(*.bin)
      2)go 20000000 程序就会运行
      2、自动运行(将程序写入Flash,uboot启动之后程序自动运行)
      1)设置环境变量
      Uboot>setenv usr_prg cp.b 10300000 20000000 ffff(程序的大小)
      Uboot>setenv run_prg go 20000000
      Uboot>setenv bootcmd run usr_prg\;run run_prg
      Uboot>saveenv
      2)写入程序,即将其烧入Flash
      protect off all
      erase 10300000 103fffff
      loadb 20000000 下载*.bin
      cp.b 20000000 10300000 ffff(用户程序的大小)
      3)reset之后程序就会自动运行
      二、烧写linux
      1、下载linux到系统的SDRAM运行(仅做测试之用,断电或退出后就会消失)
      1)运行Uboot,设置环境变量
      Uboot>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360
      console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr [目标板 ip 地址] 目标板 ip 地址
      Uboot>setenv serverip [主机 ip 地址] 主机 ip 地址
      2)下载linux内核,文件系统
      打开tftpserver应用程序,设置根目录路径,将内核、文件系统等拷贝到所设置的根目录下。
      Uboot>tftp 21100000 ramdisk.gz 下载文件系统
      Uboot>tftp 21000000 uImage 下载 linux 内核
      Uboot>bootm 21000000 启动 linux
      然后linux操作系统就开始运行。
      2、烧写 Linux 到系统的 Flash 运行
      1)设置运行Linux的环境变量
      Uboot> setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 console=ttyS0,115200,mem=32M 启动系统环境变量
      Uboot>setenv image cp.b 10020000 21000000 b0000 拷贝内核到sdram
      Uboot>setenv ramdisk cp.b 100d0000 21100000 226000 拷贝文件系统到sdram
      Uboot>setenv boot bootm 设置变量boot
      Uboot>setenv bootcmd run ramdisk\;run image\;run boot 设置默认变量bootcmd
      Uboot>setenv ethaddr 12:34:56:78:99:aa mac 地址
      Uboot>setenv ipaddr 目标板 ip 地址 目标板 ip 地址,由你自己决定
      Uboot>setenv serverip 主机ip地址 主机ip地址,就是你的PC的ip
      Uboot>saveenv 保存环境变量
      2)烧写Linux内核到Flash
      Uboot>tftp 21100000 ramdisk.gz
      Uboot>cp.b 21100000 100d0000 226000
      Uboot>tftp 21000000 uImage
      Uboot>cp.b 21000000 10020000 b0000
      reset之linux操作系统就开始运行。
      ================================================================================
      ================================================================================
      from: http://blog.21ic.com/user1/5165/archives/2008/50377.html
      [b]u-boot命令解释[/b]
      lanxch 发表于 2008-9-4 13:42:00
      0
      推荐
      U-Boot上电启动后,敲任意键能够退出自动启动状态,进入命令行。
      U-Boot 1.1.2 (Apr 26 2005 - 12:27:13)
      U-Boot code: 11080000 -> 1109614C BSS: -> 1109A91C
      RAM Configuration:
      Bank #0:
      
      [img]chrome://skype_ff_toolbar_win/content/famfamfam/cn.gif[/img]
      
      
      
      [img]chrome://skype_ff_toolbar_win/content/arrow.gif[/img]
      
      
      
      
      
      
      
      
      
      
      
      
      
      10000000 32
      
       MB
      Micron StrataFlash MT28F128J3 device initialized
      Flash: 32 MB
      In: serial
      Out: serial
      Err: serial
      Hit any key to stop autoboot: 0
      U-Boot>
      在命令行提示符下,能够输入U-Boot的命令并执行。U-Boot能够支持几十个常用命令,通过这些命令,能够对研发板进行调试,能够引导Linux内核,还能够擦写Flash完成系统部署等功能。掌控这些命令的使用,才能够顺利地进行嵌入式系统的研发。
      输入help命令,能够得到当前U-Boot的任何命令列表。每一条命令后面是简单的命令说明。
      => help
      ? - alias for 'help'
      autoscr - run from memory
      base - print or set address offset
      bdinfo - print Board Info structure
      boot - boot default, i.e., run 'bootcmd'
      bootd - boot default, i.e., run 'bootcmd'
      bootm - boot application image from memory
      bootp - boot image via network using BootP/TFTP protocol
      cmp - memory compare
      coninfo - print console devices and information
      cp - memory copy
      crc32 - checksum calculation
      dhcp - invoke DHCP client to obtain IP/boot params
      echo - echo args to console
      erase - erase FLASH memory
      flinfo - print FLASH memory information
      go - start application at address 'addr'
      help - print online help
      iminfo - print header information for application image
      imls - list all images found in flash
      itest - return true/false on integer compare
      loadb - load binary file over serial line (kermit mode)
      loads - load S-Record file over serial line
      loop - infinite loop on address range
      md - memory display
      mm - memory modify (auto-incrementing)
      mtest - simple RAM test
      mw - memory write (fill)
      nfs - boot image via network using NFS protocol
      nm - memory modify (constant address)
      printenv - print environment variables
      protect - enable or disable FLASH write protection
      rarpboot - boot image via network using RARP/TFTP protocol
      reset - Perform RESET of the CPU
      run - run commands in an environment variable
      saveenv - save environment variables to persistent storage
      setenv - set environment variables
      sleep - delay execution for some time
      tftpboot - boot image via network using TFTP protocol
      version - print monitor version
      =>
      U-Boot还提供了更加周详的命令帮助,通过help命令还能够查看每个命令的参数说明。由于研发过程的需要,有必要先把U-Boot命令的用法弄清楚。接下来,根据每一条命令的帮助信息,解释一下这些命令的功能和参数。
      => help bootm
      bootm [addr [arg ...]]
      - boot application image stored in memory
      passing arguments 'arg ...'; when booting a Linux kernel,
      'arg' can be the address of an initrd image
      bootm命令能够引导启动存储在内存中的程式映像。这些内存包括RAM和能够永久保存的Flash。
      第1个参数addr是程式映像的地址,这个程式映像必须转换成U-Boot的格式。
      第2个参数对于引导Linux内核有用,通常作为U-Boot格式的RAMDISK映像存储地址;也能够是传递给Linux内核的参数(缺省情况下传递bootargs环境变量给内核)。
      => help bootp
      bootp [loadAddress] [bootfilename]
      bootp命令通过bootp请求,需要DHCP服务器分配IP地址,然后通过TFTP协议下载指定的文档到内存。
      第1个参数是下载文档存放的内存地址。
      第2个参数是要下载的文档名称,这个文档应该在研发主机上准备好。
      => help cmp
      cmp [.b, .w, .l] addr1 addr2 count
      - compare memory
      cmp命令能够比较2块内存中的内容。.b以字节为单位;.w以字为单位;.l以长字为单位。注意:cmp.b中间不能保留空格,需要连续敲入命令。
      第1个参数addr1是第一块内存的起始地址。
      第2个参数addr2是第二块内存的起始地址。
      第3个参数count是要比较的数目,单位按照字节、字或长字。
      => help cp
      cp [.b, .w, .l] source target count
      - copy memory
      cp命令能够在内存中复制数据块,包括对Flash的读写操作。
      第1个参数source是要复制的数据块起始地址。
      第2个参数target是数据块要复制到的地址。这个地址假如在Flash中,那么会直接调用写Flash的函数操作。所以U-Boot写Flash就使用这个命令,当然需要先把对应Flash区域擦干净。
      第3个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。
      => help crc32
      crc32 address count [addr]
      - compute CRC32 checksum [save at addr]
      crc32命令能够计算存储数据的校验和。
      第1个参数address是需要校验的数据起始地址。
      第2个参数count是要校验的数据字节数。
      第3个参数addr用来指定保存结果的地址。
      => help echo
      echo [args..]
      - echo args to console; \c suppresses newline
      echo命令回显参数。
      => help erase
      erase start end
      - erase FLASH from addr 'start' to addr 'end'
      erase N:SF[-SL]
      - erase sectors SF-SL in FLASH bank # N
      erase bank N
      - erase FLASH bank # N
      erase all
      - erase all FLASH banks
      erase命令能够擦Flash。
      参数必须指定Flash擦除的范围。
      按照起始地址和结束地址,start必须是擦除块的起始地址;end必须是擦除末尾块的结束地址。这种方式最常用。举例说明:擦除0x20000
    展开全文
  • Uboot Linux启动流程

    万次阅读 2014-04-07 19:58:43
    Uboot启动流程 第一阶段:关闭看门狗,设置系统时钟,初始化RAM,复制第二阶段的代码到内存中,设置好栈,跳转到第二阶段的C语言入口点。 第二阶段:检测内存映射,将内核映像要传给内核的参数从flash复制到内存中...

    Uboot启动流程

    第一阶段:关闭看门狗,设置系统时钟,初始化RAM,复制第二阶段的代码到内存中,设置好栈,跳转到第二阶段的C语言入口点。

    第二阶段:检测内存映射,将内核映像和要传给内核的参数从flash复制到内存中,,设置处理器为SVC模式,关闭MMU、缓存,调用theKernel函数,传入机器号和参数列表地址作为参数,跳转到内核在内存的地址,从而启动内核。


    Linux内核启动

    架构和开发板相关(汇编代码):

    1.检测是否支持该架构,__lookup_processor_type,检测是否支持该机器。

    2.建立一级页表,__creat_page_table

    3.关闭Cache,使能Mmu。

    4.复制数据段、清除BSS段、设置栈、保存机器ID到全局变量。

    4.start_kernel

    后续通用过程:

    setup_arch,初始化CPU子系统,之后让内存和进程管理系统就位,解析uboot传给内核的参数,接下来启动外部总线和外部设备,最后一步是激活用户空间的Init进程,Init进程执行必要的服务和用户空间的脚本,根据配置文件,决定启动哪些程序,如shell、桌面。



    展开全文
  • 韩大卫@吉林师范大学 2015.1.27....uboot 和linux 下flash 的写入速度不一样, 主要原因是两者使用的延迟最小延时时间不一样. linux比较大. 原因如下: flash 芯片手册中有两个重要的时间参数:
  • 迅为I.MX6ULL终结者开发板对应的Uboot源码在光盘资料的“i.MX6UL终结者光盘资料\05_uboot linux源码\终结者Uboot和Linux源码.zip”压缩包里面,解压该压缩包,得到“uboot-imx-rel_imx_4.1.15_2.1.0_ga_xxxxxxxx.tar...
  • 好消息:淘宝上花了88块买的善领shuttle型号的DSA2lv,板载imx6dl芯片,经过一个月的研究逆向,终于将各个模块的管脚接法电源管理搞定了,目前可以正常启动自己编译的uboot和linux内核了,不需要再用原厂的固件...
  • 一:in uboot 1. 传给内核参数的地址: 首先设置参数存放在内存中的地址: in file:lib_mips/board.c  addr_sp -= CFG_BOOTPARAMS_LEN; bd->bi_boot_params = addr_sp;// bd->bi_boot_params = 0x80001000;...
  • u-boot启动后会运行液晶初始化程序并显示启动LOGO,但进入linux系统之后,又重新初始化一次,而且ubootlinux定义的显存地址也不一致,导致会有短暂的白屏闪烁。此补丁解决从ubootlinux启动完成一直保持LOGO不变...
  • 从学嵌入式以来,还没有真正意义上的进行过ubootLinux内核的移植,于是为了满足自己的好奇心探索精神,打算将最新的uboot和Linux内核移植到开发板上,最近移植也接近了尾声,因此打算开一个深坑:写一篇较为完整...
  • uboot启动linux的过程

    千次阅读 2018-09-19 17:05:58
     linux内核镜像常见到的有两种形式,zImageuImage。这两种文件的格式稍有差别,所以启动这两种格式的内核镜像也会有所不同。目前,uboot只支持启动uImage类型的镜像,对zImage还不支持(但是可以移植,TQ2440就是...
  • 在连续两个平台的uboot和Linux系统移植过程中,在千兆网口调试这块都遇到了很大的麻烦。由于寄存器数量庞大,千兆网口MACPHY内部结构复杂,MACPHY接口种类多,千兆以太网驱动的调试成了系统移植过程中最让人烦心...
  • 今天突然找到一种下载NXP原厂修改的高版本Linux和uboot源码的地方,特地记录一下。 uboot 先从uboot下载开始说起,首先是uboot下载地址,可以点击此处访问uboot。当进入网站以后会看到如下图片: 首先下载uboot整个...
  • Linux系统中,先启动UBOOT,后加载linux内核应用程序。启动ubootuboot网卡驱动启动起来了,但是内核加载完后uboot不再起作用,Linux的网卡驱动开始起作用。这样因为是两个阶段的不同驱动,带来了MAC地址的不一致...
  • uboot和linux的编译

    2014-08-27 22:32:42
    1.uboot的编译 cd u-boot-1.1.6/ 进入目录 make 100ask24x0_config 配置 make 编译
  • 原文转自:http://www.crifan.com/take_sd_card_driver_as_example_explain_uboot_drive_and_linux_kernel_drive_and_how_develop_uboot_driver/ 说明: 1.下面论相关的帖子: ...
  • uBoot和Linux内核中涉及到的几个地址参数的理解
  • uboot和linux kernel中创建defconfig文件

    千次阅读 2018-11-16 10:09:38
    最近在移植uboot的时候我想根据当前的.config文件创建自己的defconfig文件到configs/目录中,开始以为是直接拷贝.config文件然后重命名即可,然后想了想uboot的Makefile文件中应该是有这个功能的,但是百度时没有人...
1 2 3 4 5 ... 20
收藏数 26,902
精华内容 10,760
关键字:

uboot和linux