uboot移植(二)——uboot mkconfig脚本分析

uboot移植(二)——uboot  mkconfig 脚本分析

一:mkconfig脚本的作用

mkconfig是通过传入的参数来脚本用于某个开发板配置uboot,主要是通过判断其输入的参数来创建符号链接文件,使它们指向该开发板对应的配置文件来进行配置。

(1)配置CPU架构相关的文件:在include目录下创建asm文件,指向include/asm-arm

(2)配置SOC类型相关的文件:include目录下创建regs.h文件,指向include/s5pc110.h

include/asm-arm目录下创建arch文件,指向include/arch-s5pc11x
(3)其他:include/asm-arm目录下创建proc文件,指向include/asm-arm/proc-armv,这个文件夹中存放了四个.h文件,具体作用还不清楚;

创建config.mk文件,文件的内容也是根据我们的输入参数来确定的。这个文件在我们的主Makefile中也有提到。

二:具体代码分析(红色的为注释)

#!/bin/sh -e

x210_sd_config :    unconfig

@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110

@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

主Makefile中调用mkconfig这个脚本,同时传进来了6个参数

$1=$(@:_config=)

$(@:_config=)解析:[email protected]表示目标,也就是我们的x210_sd_config ,:表示要对这个目标进行处理,处理方法就是x210_sd_config 里面的_config用空替代,得到x210_sd,所以

$1=x210_sd

$2=arm

$3=s5pc11x

$4= x210

$5= samsung

$6=s5pc110

所以$#=6

# Script to create header files and links to configure

# U-Boot for a specific board.

#

# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

#

# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <[email protected]>

#

APPEND=no    # Default: Create new config file

BOARD_NAME=""    # Name to print in make output

while [ $# -gt 0 ] ; do  #while($#>0)

case "$1" in

--) shift ; break ;;

-a) shift ; APPEND=yes ;;

-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;

*)  break ;;  *万能匹配符,我们这里的$=x210_sd,和--  -a -n  不匹配,所以和*匹配,执行break跳出while循环,注意case是没有break的

esac

done

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"  简略的if语句,先执行第一个,如果成立,则不执行第二个

这个BOARD_NAME为空,if语句不成立,执行后面的BOARD_NAME="$1" ,执行完后BOARD_NAME= x210_sd

[ $# -lt 4 ] && exit 1   如果$#小于4,mkconfig脚本返回1

[ $# -gt 6 ] && exit 1  如果$#<6,mkconfig脚本也返回1

所以,$#的值为4  5  6 ,如果是其他值,则报错

echo "Configuring for ${BOARD_NAME} board..."

#

# Create link to architecture specific headers  创建一些符号链接文件(开始)

#创建符号链接的目的就是为了让uboot具有可移植性

#uboot可移植性实现的原理:在uboot中有很多的平行代码,各自属于不同的架构/cpu/开发板,当我们确定使用那款CPU/开#发板时,就通过这些创建的符号链接来找到相应的配置文件,进行配置

if [ "$SRCTREE" != "$OBJTREE" ] ; then

mkdir -p ${OBJTREE}/include

mkdir -p ${OBJTREE}/include2

cd ${OBJTREE}/include2

rm -f asm

ln -s ${SRCTREE}/include/asm-$2 asm

LNPREFIX="../../include2/asm/"

cd ../include

rm -rf asm-$2

rm -f asm

mkdir asm-$2

ln -s asm-$2 asm

else

cd ./include

rm -f asm

ln -s asm-$2 asm 在include目录下创建一个asm文件,指向include/asm-arm

fi

rm -f asm-$2/arch

if [ -z "$6" -o "$6" = "NULL" ] ; then   -z:表示判断是否为空   -o:表示逻辑或

#所以这句话的意思是if($6为空,或者$6="NULL")注Makefile中等于是“=”不是“==”

ln -s ${LNPREFIX}arch-$3 asm-$2/arch

else

ln -s ${LNPREFIX}arch-$6 asm-$2/arch在include/asm-arm目录下创建一个arch文件,指向include/asm-arm/arch-s5pc110

fi

# create link for s3c24xx SoC

if [ "$3" = "s3c24xx" ] ; then

rm -f regs.h

ln -s $6.h regs.h

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fi

# create link for s3c64xx SoC

if [ "$3" = "s3c64xx" ] ; then

rm -f regs.h

ln -s $6.h regs.h

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fi

# create link for s5pc1xx SoC

if [ "$3" = "s5pc1xx" ] ; then

rm -f regs.h

ln -s $6.h regs.h

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fi

# create link for s5pc11x SoC  根据不同的SOC创建不同的符号链接

if [ "$3" = "s5pc11x" ] ; then

rm -f regs.h  当前目录是在include下

ln -s $6.h regs.h  在include目录下创建一个regs.h文件,指向include/s5pc110.h

rm -f asm-$2/arch   删除asm-arm/arch文件

ln -s arch-$3 asm-$2/arch  在include/asm-arm目录下创建一个arch文件,指向include/arch-s5pc11x

fi

# create link for s5p64xx SoC

if [ "$3" = "s5p64xx" ] ; then

rm -f regs.h

ln -s $6.h regs.h

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fi

# create link for s5p644x SoC

if [ "$3" = "s5p644x" ] ; then

rm -f regs.h

ln -s $6.h regs.h

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fi

if [ "$2" = "arm" ] ; then

rm -f asm-$2/proc

ln -s ${LNPREFIX}proc-armv asm-$2/proc  在include/asm-arm目录下创建一个proc文件,指向include/asm-

fi                                                                       arm/proc-armv(存放一些头文件)

# create link for s3c64xx-mp SoC

if [ "$3" = "s3c64xx-mp" ] ; then

rm -f regs.h

ln -s $6.h regs.h

rm -f asm-$2/arch

ln -s arch-$3 asm-$2/arch

fi  创建符号链接结束,这些符号链接的作用就是用来包含头文件,所以将来我们写代码的时候比如 include<asm/xx.h>就要到相应的路径去找相应的文件。

#

# Create include file for Make

#注意我们前面cd include后就没出来过,所以,我们当前还在include目录下,注意在指定文件输出内容的方法,也是写文件的方法:echo "ARCH   = $2" >  config.mk

#  >  表示创建文件   >>表示追加文件(在文件中继续添加内容)

echo "ARCH   = $2" >  config.mk     创建文件config.mk   并写  "ARCH=arm"

echo "CPU    = $3" >> config.mk    追加内容 “CPU=s5pc11x”

echo "BOARD  = $4" >> config.mk 追加内容  “BOARD=x210”

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk  追加内容  “VENDOR=samsung”

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk      追加内容“SOC=s5pc110”

#以上这部分就是创建并写内容到我们的config.mk文件中。对于config.mk文件,在我们的主Makefile中提到过,是否还有印象

#

# Create board specific header file

#

if [ "$APPEND" = "yes" ]    # Append to existing config file

then

echo >> config.h

else

> config.h        # Create new config file

fi

echo "/* Automatically generated - do not edit */" >>config.h

echo "#include <configs/$1.h>" >>config.h

exit 0

时间: 2024-10-10 04:10:53

uboot移植(二)——uboot mkconfig脚本分析的相关文章

第二章、Tiny4412 U-BOOT移植二 启动分析【转】

本文转载自:http://blog.csdn.net/eshing/article/details/37521481 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.启动过程说明 讲解启动过程,首先的源头就是打开电源,这个相信没人人不知道.CPU上电后,此时SP指针指向0x0000_0000,从这个地址取第一条指令.但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低(Exynos4412芯片边上有一颗24MHz,一颗27MHz,一颗32.768KHz):CPU的工作模式.

uboot移植一uboot架构分析

开发环境: 1 .开发板mini2440 2. u-boot-2010.12 参考i资料:https://blog.csdn.net/androidbbc/article/details/50961163 http://www.cnblogs.com/kele-dad/p/8969174.html 一.下载u-boot- 2010.12,并且解压 二.分析u-boor-2010.12 api: 存放uboot提供的接口函数 config.mk: 根据不同开发板定制的代码,代码也不少 driver

mkconfig脚本分析

声明:本文由个人学习过程中整理而成,转载请注明出处. 1.uboot/mkconfig (1)uboot是一个多CPU多架构的统一bootloader, 为了完成针对的特定目标板,目标架构的编译,需要给Makefile指明哪些文件需要编译,相当与从整体上控制 需要编译的cpu,单板等. 2.主Makefile传递的6个参数 $1:x210_sd $2:arm $3: s5pc11x $4:x210 $5: samsumg $6:s5pc110 解析传递的参数 while [ $# -gt 0 ]

uboot移植之uboot中的SD卡驱动解析

1:地址对硬件操作的影响 (1)操作系统(指的是linux)下MMU肯定是开启的,也就是说linux驱动中肯定都使用的是虚拟地址.而纯裸机程序中根本不会开MMU,全部使用的是物理地址.这是裸机下和驱动中操控硬件的一个重要区别. (2)uboot早期也是纯物理地址工作的,但是现在的uboot开启了MMU做了虚拟地址映射,这个东西驱动也必须考虑.查uboot中的虚拟地址映射表,发现210开发板里面,除了0x30000000-0x3FFFFFFF映射到了0xC0000000-0xCFFFFFFF之外,

uboot移植之uboot命令体系解析

1:回归到main_loop uboot启动第二阶段的最后,进入死循环main_loop()函数,命令行中没输出一次命令,就会执行一次main_loop函数,完成一次命令的获取.解析和执行. 2:uboot命令体系的实现原理 uboot中里面维护了很多命令,每个命令对应一个结构体变量,当我们在命令行输入一个命令时.这时就涉及如何去维护这些命令的问题,一般的方法有两种,数组或者链表,但是数组的缺陷在开始的时候需要确定数组的大小,链表的话效率比较低,所以uboot使用了另一种方式.uboot中一个命

嵌入式linux开发uboot移植(二)——uboot工程源码目录分析

嵌入式linux开发uboot移植(二)--uboot工程源码目录分析 本文分析的uboot为uboot_smdkv210,是三星官方发布的基于S5PV210评估开发板对应的uboot. 一.uboot源码目录结构解析 1.cpu 本文件夹下的子文件与处理器相关,每个文件夹代表一种CPU系列.每个子目录中都包括cpu.c.interrupts.c.start.S文件. cpu.c主要用于初始化CPU.设置指令Cache和数据Cache等 interrupt.c主要用于设置系统的各种中断和异常 s

U-Boot移植之前期分析(上)

老是看别人移植uboot,用别人移植好的uboot,今天终于下定决心自己移植一个uboot来玩玩,好歹我也是个软件开发人员啊. 第一步:去ftp://ftp.denx.de/pub/u-boot/网站下载个uboot工程源码,为了防止环境出问题,我决定用个老一点的,于是就下了:u-boot-1.1.6.tar.bz2. 第二步:解压源码:tar  jxvf  u-boot-1.1.6.tar.bz2. 第三步:建立source insight工程 好了完成以上三步之后,我们需要的前提条件都准备好

uboot移植之前的工作

1.1计算机系统的主要部件:计算机系统是有cpu来做核心进行运行的系统.典型的计算机系统有:pc机,嵌入式设备(手机.平板电脑.游戏机),单片机(家用电器). 1.2计算机系统组件部件非常多,不同的计算机系统组成部件也不同.但是所有的计算机系统运行时需要的主要核心部件都是3个东西:cpu+外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM). 1.3pc机的启动过程:(1)典型的pc部署:BIOS程序部署在pc机主板上(随主板出厂时已经预制了),操作系统部署

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植

前段时间就开始学习I.MX6Q了,但是最近工作实在是忙,间断了一些时间了.为了提高移植效率,还是考虑移植Freescale维护的3.10版本的内核. 源码获取 Freescale维护的3.10的内核是使用git管理的,但是直接使用git下载代码会比较慢,下面是我下载好的uboot和kernel: I.MX6Q BSP源码(Freescale官方维护) 代码下载好后,先将u-boot解压到工作目录,然后在终端下切换到uboot根目录.由于这个版本的bsp是使用git管理的,因此,需要切换到指定分支