来源:Linux社区  作者:xiaojiang1025  :http://www.linuxidc.com/Linux/2017-02/141018.htm

和绝大多数源码编译安装一样,uboot的编译流程也类似于"make config->make->make install"**三步,只是由于uboot本身是针对多种平台的bootloader,软件的复杂性和通用型决定了编译uboot需要自行填补很多坑。本文主要讨论的就是移植uboot-2013.01的第一个坑——uboot分析。

配置编译环境

既然要编译uboot,首先就要有相应的编译器,我的目标板是三星的exynos4412,就是一个ARM核的SoC,这意味着两件事,第一,我编译的时候必须写明"export ARCH=arm"来表明我要编译的目标平台。第二,必须选择合适的开发工具,由于各种uboot各种linux都是对编译器比较敏感的,所以强烈建议使用tar来安装交叉编译器而不是apt,这样可以防止多个编译工具的冲突,这里,uboot作为裸板程序,我用的是arm-none-linux-guneabi-xxx的编译器,所以用来编译的脚本加了下面两句:

  1. export ARCH=arm
  2. export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
  3. ...

config的流程

uboot的顶层配置主要依靠下面的这棵树

.
├── Makefile
├── mkconfig
├── include
│    ├── config.mk
│  └── config.h
└── boards.cfg

uboot的配置就是通过键入相应的命令将相应的Makfile变量赋值,通过你的配置,Makefile相应的变量就知道编译哪个平台下的哪个cpu的哪个版本的开发板。注意:不同版本的uboot的配置命令可能是不同的,拿到源码包看README是个很好的习惯,比如uboot-2013-01的配置命令是下面这个样子的,但uboot-2016.10的配置命令就不是这个,感兴趣的可以查一下。:

在uboot-2013-01中,顶层目录下的boards.cfs文件中查看它支持的开发板和相应的信息,这个文件就像一个全局的"字典",后续的编译过程需要根据配置名检索到相应的信息,所以不要随意修改。下面这个就是字典的样子

了解了这些,手痒的话就可以先执行下面的脚本试一下,但是并不会生成真正适配我们板子的uboot,只是适配参考板

  1. #!/bin/bash
  2. export ARCH=arm
  3. export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
  4. make origen_config
  5. make all

config的分析

首先,当我们"make origen_config"的时候,显然是打算创建makefile里面的一个叫origen_config的目标。根据Makefile的语法,我们就可以找到下面这一段(然而并不是想象中的origen_config:)

Makefile
--770-->unconfig目标的作用是删除所有由于配置产生的文件
--775-->%是Makefile中的通配符,表示任意字符串,所以我们的origen_config就会与之相匹配,这个目标的依赖于unconfig,即每次config之前都会删除之前的配置。如果你键入两次"make xxx_config",那么它最终只会形成一个相应的配置文件,这种写法值得借鉴
--776-->"MKCONFIG"就是顶层目录下的mkconfig脚本,而"$(@:_config=)"就是去除目标中的"_config"串,所以实际上就是去到顶层目录下执行"$mkconfig -A origen"

我们去到这个mkconfig看看它都做了什么

mkconfig
--22-->我们传入的参数会导致脚本执行这个if里面的内容
--23-31-->用扩展正则表达式去顶层目录下的boads.cfg文件中提取含有origen相应的行到line变量中,并把line设置为新的参数列表。取得了这个参数字符串,mkconfig就可以把相应的头文件,链接和全局变量准备好。

我们来稍微看点细节,首先,line里应该有的内容是我们在Boards.cfg中搜到的这个:

根据boards.cfg,这几个参数分别是:TARGET,ARCH,CPU,Board name,Vendor,SoC,Options(origen只有6个,加上之前的$1一共7个参数),So执行的代码是:

从中可以看出,这段代码就是把之前line的内容分段并赋值给开头的arch、cpu、board等变量,显然,这些变量对于我们找到相应的目录,相应的文件进行编译至关重要。这些信息,会在mkconfig的之后写入到相应的文件中:

此外,还要建立一些硬链接:

至此,我们需要的"include/config.mk"就配置完成了,这个文件是长成这个样子的:

除了生成"include/config.mk"mkconfig还负责生成"include/config.h"文件,不过有了之前准备好的变量,这部分只不过是将上面的变量和相应的文件夹进行了初步的定位,代码就是下面这部分:

它生成的"include/config.h"最终是长成这个样子的:

有了这两个文件,当我们再执行"$make"的时候就可以找到相应的文件了。

从0移植uboot (一) _配置分析的更多相关文章

  1. (转)从0移植uboot (一) _配置分析

    ref : https://www.cnblogs.com/xiaojiang1025/p/6106431.html 本人建议的uboot学习路线,先分析原有配置,根据现有的配置修改.增加有关的部分, ...

  2. 从0移植uboot (二) _启动流程分析

    经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合 ...

  3. 从0移植uboot(六) _实现网络功能

    为uboot添加网卡功能可以让uboot通过tftp下载内核, 方便我们的开发, 对于网卡功能的移植,我们依然在在一遍又一遍的实践这个uboot改造的套路. 找运行逻辑,即插入代码的位置. 根据运行逻 ...

  4. (转)从0移植uboot(六) _实现网络功能

    ref:https://www.cnblogs.com/xiaojiang1025/p/6500532.html 为uboot添加网卡功能可以让uboot通过tftp下载内核, 方便我们的开发, 对于 ...

  5. 从0移植uboot(五) _实现串口输出

    串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可以将程序运行的情况直接通过串口线输出到屏幕上,对于这种异常重要的功能,uboot原生就提供了支持,但为此我们需要做一些 ...

  6. (转) 从0移植uboot(五) _实现串口输出

    ref : https://www.cnblogs.com/xiaojiang1025/p/6500520.html 串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可 ...

  7. 从0移植uboot(三) _编译最小可用uboot

    前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对uboot源码进行配置,将一个可用的uboot烧录到SD卡中. 定制自己的core board 市面上能买到的开发板 ...

  8. (转)从0移植uboot(三) _编译最小可用uboot

    ref: https://www.cnblogs.com/xiaojiang1025/p/6436752.html 前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对 ...

  9. 从0移植uboot (四) _点亮调试LED

    这一节主要讨论1个问题:点灯.点灯是实际开发中,特别是裸板开发中常见的调试手段,相当于主机开发中漫天飞舞的printf/printk.为了追踪程序的现场执行情况,很多时候我们都使用点一个灯的方法来进行 ...

随机推荐

  1. jQuery js 中return false,e.preventDefault(),e.stopPropagation()的区别(事件冒泡)

    有时候遇到冒泡事件很烦人,真的..... 1.e.stopPropagation()阻止事件冒泡 <head> <title></title> <script ...

  2. wangEditor-基于javascript和css开发的 Web富文本编辑器, 轻量、简洁、易用、开源免费(2)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. python自动化开发-6

    python的常用模块(续) shutil模块:主要是做文件复制的.文件,文件夹,压缩包等的处理模块. 常用的方法: shutil.copyfileobj:将文件的内容拷贝到另一个文件中. 例子: # ...

  4. eclipse没有server选项解决方法

    eclipse是是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境. 它使用频率十分高,然而当使用它配置weblogic的时候,经常 ...

  5. Android系统启动流程 总结

    整体流程大致如下:   Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程.从系统角度看,Android的启动程序可分为:   1.bootload ...

  6. Kotlin入门(2)让App开发变得更容易

    上一篇文章介绍了如何搭建Kotlin的开发环境,可是这个开发环境依然基于Android Studio,而在Android Studio上使用Java进行编码,本来就是理所应当的,何必还要专门弄个Kot ...

  7. Python使用np.c_和np.r_实现数组转换成矩阵

    # -*- coding: utf-8 -*-"""Created on Sat Jun 30 14:49:22 2018 @author: zhen"&quo ...

  8. 转:SQL Server中服务器角色和数据库角色权限详解

    当几个用户需要在某个特定的数据库中执行类似的动作时(这里没有相应的Windows用户组),就可以向该数据库中添加一个角色(role).数据库角色指定了可以访问相同数据库对象的一组数据库用户. 数据库角 ...

  9. Spring系列(1)--IOC 和 DI

    IOC 和 DI IOC 原理 xml 配置文件配置 bean dom4j 读取配置文件 工厂设计模式 反射机制创建对象 applicationContext.xml 配置文件,该配置文件名可自定义: ...

  10. Python基础知识:模块

    目录 JSON模块&pickle模块 requests模块 time模块 datetime模块 logging模块 os模块 sys模块 hashlib模块 re模块.正则表达式 config ...