学习U-Boot之--mkconfig

简介:

,要求在U-Boot里加点功能,使之启动的时候能对这几个芯片进行初始化,并提供U-Boot命令,方便动态调试。

有经验的同事给我操作一下,进入U-Boot源码目录,然后执行:
  $ make at91sam9263ek_config
我有一点不解,执行这个命令是在干嘛?于是我用vi打开Makefile文件,查找到“at91sam9263”这个关键字。


at91sam9263ek_config    :    unconfig
    @./mkconfig $(@:_config=) arm arm9263ejs at91sam9263ek NULL at91sam9263x

当执行 "make at91sam9263ek_config"时,make就会去找到Makefile文件里的at91sam9263ke_config这个目标,然后执行下面的语句。

我们可以看到,make调用了mkconfig并带了6个参数。这6个参数分别是干什么用的呢?
  $(@:_config=) ——其传换后的值就是at91sam9263ek,就是将目标名去掉了后面的"_config"得来。
  arm ——指定平台,除了arm,还i386,mps,PowerPC等等,平台之后的区别在于CPU的指令不一样,CPU架构也不一样。
  arm9263ejs ——具体的芯片型号,因为每个CPU芯片所带的功能模块有差异。
  at91sam9263ek ——主板型号,因为很多主板有特殊的芯片组,实现特殊的功能。
  NULL ——不知道干什么用的
  at91sam9263x ——也不知道干什么用的。

这个mkconfig后面所带的参数决定了我们编译的时候编译哪些文件、怎么编译。那么我们来看一下这个mkconfig脚本文件是怎么实现的。


(1)检查参数里有没有"-a"或"-n"的,设置APPEND与BOARD_NAME


APPEND=no       # Default: Create new config file
BOARD_NAME=""   # Name to print in make output
 
while [ $# -gt 0 ] ; do
        case "$1" in
        --) shift ; break ;;
        -a) shift ; APPEND=yes ;;
        -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
        *)  break ;;
        esac
done

如果有"-a"那么APPEND=yes,这个参数后面会用到。"-n",那么BOARD_NAME=??
这里没有"-a"与"-n"参数


(2)如果没有设置BOARD_NAME,那么就默认为第一个参数


[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

$1==>$(@:_config=)==>at91sam9263ek

这后BOARD_NAME没有启多大的作用,可以不用关心它。

(3)检查参数的个数是否符合要求


[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1

如果不满足 4<=$#<=6,那么就退出。


(4)创建src/include/asm符号链接文件


if [ "$SRCTREE" != "$OBJTREE" ] ; then
    ...
else
    cd ./include
    rm -f asm
    ln -s asm-$2 asm
fi

跟据$2的值,这里是"arm",创建asm-arm的符号文件asm。这样只要访问这个src/include/asm就是访src/include/asm_arm。


(5)创建src/include/asm/arch符号链接文件


rm -f asm-$2/arch
 
if [ -z "$6" -o "$6" = "NULL" ] ; then
    ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
    ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi

由于第4步已经将src/include/asm指定为src/include/asm-arm了。
那么这里根据$3或$6来决定那么arch-??文件链接为src/include/asm/arch。

(6)写src/include/config.mk文件


echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk
 
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

将平台、CPU型号、主板型号写入config.mk文件,执行完后config.mk文件中就会有:


ARCH    = arm
CPU     = <span style="font-family: Courier New;">arm9263ejs</span> BOARD   = <span style="font-family: Courier New;">at91sam9263ek</span>

(7)在src/include/config.h文件中插入文件包含语句 


if [ "$APPEND" = "yes" ]        # Append to existing config file
then
    echo >> config.h
else
    > config.h              # Create new config file
fi
echo "#include <configs/$1.h>" >>config.h

将"#include <configs/$1.h>"追加到config.h文件中。如果APPEND!=yes,那么将会覆盖原来config.h文件中有的内容。
在src/include/configs目录下有很多头文件,这里会根据$1的值从中抽取一个。


这样,通过mkconfig命令的执行就准备到了4个文件:

  • src/include/asm
  • src/include/asm/arch
  • src/include/config.mk
  • src/include/config.h

在编译U-Boot目标时,就会根据这几个文件进行编译。
对应的文件目录会被编译:

  • src/cpu/$CPU
  • src/board/$BOARD
目录
相关文章
|
10月前
|
人工智能 算法 搜索推荐
《开源算法:人工智能领域的双刃剑》
在人工智能蓬勃发展的今天,开源算法作为重要支撑,显著促进了算法创新、模型开发、技术进步与知识共享,并节省了时间与计算资源,降低了企业开发成本。然而,它也存在数据隐私与安全、个性化服务、创新速度、技术支持与维护及许可证与法律等方面的局限性。实际应用中需权衡优劣,选择合适方案以实现最大价值。
314 10
|
10月前
|
人工智能 自然语言处理 算法
打破AI信息差:2024年20款好用的人工智能工具大盘点
本文带你了解20款值得一试的AI工具,帮助你在内容创作、图像设计、音频视频编辑等领域提高效率、激发创意。
1440 1
打破AI信息差:2024年20款好用的人工智能工具大盘点
|
新能源
空间太阳能发电:从太空到地球的清洁能源
【10月更文挑战第12天】空间太阳能发电技术是一项具有革命性意义的清洁能源技术。它结合了航天技术与新能源技术的优势,为地球带来了前所未有的清洁能源革命。尽管在实现过程中面临诸多挑战,但随着技术的不断进步和创新,空间太阳能发电有望成为未来全球电力供应的主要来源之一,为人类的可持续发展贡献更多力量。让我们共同期待空间太阳能发电技术的美好未来!
|
11月前
|
机器学习/深度学习 分布式计算 供应链
阿里云先知安全沙龙(上海站) ——大模型基础设施安全攻防
大模型基础设施的安全攻防体系涵盖恶意输入防御和基础设施安全,包括框架、三方库、插件、平台、模型和系统安全。关键漏洞如CVE-2023-6019(Ray框架命令注入)、CVE-2024-5480(PyTorch分布式RPC)及llama.cpp中的多个漏洞,强调了代码安全性的重要性。模型文件安全方面,需防范pickle反序列化等风险,建议使用Safetensors格式。相关实践包括构建供应链漏洞库、智能化漏洞分析和深度检测,确保全方位防护。
|
存储 人工智能 安全
AI 赋能 UGC 内容审核解决方案
AI 赋能 UGC 内容审核解决方案
|
C语言 C++
STM32F103C8 串口的使用
STM32F103C8 串口的使用
522 0
|
弹性计算 人工智能 Cloud Native
阿里云弹性计算总经理张献涛:智能化、高效能、新交互将重塑互联网
从基础设施、自服务能力与生态等层面,全方位构建面向互联网企业的云基础架构
阿里云弹性计算总经理张献涛:智能化、高效能、新交互将重塑互联网
|
IDE NoSQL 前端开发
C语言学习——IDE软件Code::Blocks教程
C语言学习——IDE软件Code::Blocks教程
1379 0
C语言学习——IDE软件Code::Blocks教程
|
存储 SQL 数据库
达梦数据库存储过程
存储过程数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
达梦数据库存储过程