(转)从0移植uboot(三) _编译最小可用uboot
ref: https://www.cnblogs.com/xiaojiang1025/p/6436752.html
前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对uboot源码进行配置,将一个可用的uboot烧录到SD卡中。
定制自己的core board
市面上能买到的开发板的核心板基本都是基于官方参考板制作的,所以虽然标准操作是"定制"自己的core board,但鉴于我的板子的核心板是基于三星的参考板做的,所以我们做的主要工作就是按照(一)中的原理,编写(山寨)我们"自己的"核心板配置。我们需要的目录是"board/samsung/origen/",这部分的主要功能就是将其中的文件"改名字"。首先来认识一下原版以示尊重
board/samsung/origen/
$ls board/samsung/origen/
lowlevel_init.S Makefile mem_setup.S mmc_boot.c origen.c origen_setup.h tools
接下来就开始我们的山寨工作
//山寨参考板目录
$cp -arf ./board/samsung/origen ./board/samsung/xboot
//山寨关键文件
$mv ./board/samsung/xboot/origen.c ./board/samsung/xboot/xboot.c
uboot的编译系统和内核的类似,所以Makefile也得改(./board/samsung/xboot/Makefile)
from
30 ifndef CONFIG_SPL_BUILD
31 COBJS += origen.o
32 endif
to
30 ifndef CONFIG_SPL_BUILD
31 COBJS += xboot.o
32 endif
include/configs/origen.h
用于配置整个板子的头文件也不能放过
$cp include/configs/origen.h include/configs/xboot.h
from
104 #define CONFIG_SYS_PROMPT "ORIGEN # "
133 #define CONFIG_IDENT_STRING " for ORIGEN"
to
104 #define CONFIG_SYS_PROMPT "xboot # "
133 #define CONFIG_IDENT_STRING " for xboot"
boards.cfg
最后,别忘了我在上文提到的boards.cfg文件,如果这里面不动手脚,我们的板子是不会被Makefile找到的,So,
284 origen arm armv7 origen samsung exynos
285 xboot arm armv7 xboot samsung exynos
和之前一样,至此,我们就可以先编译一下过过手瘾(顺便检查一下配置^-^),
1 #!/bin/bash
2 CPU_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')
3 export ARCH=arm
4 export CROSS_COMPILE=/opt/arm-cross-compile/arm-2014.05/bin/arm-none-linux-gnueabi-
5 newName="xboot"
6 make distclean
7 make ${newName}_config
8 make -j${CPU_NUM}
上面是编译的小脚本,下面是编译的输出。
编译and烧录
按照(一)中介绍的,此时已经可以"make xboot_config;make -8"并得到uboot.bin,但此时这个uboot.bin是不能直接烧录的。但无论如何,请暂且记住它的大小:176568byte。接下来,我们需要对uboot.bin进行一系列处理使它能够在exynos4412上运行,这其中要用到下面的几个命令或三星提供的工具软件,这些操作的目的就是根据三星的芯片的启动要求对uboot.bin
进行一些处理,包括在特定长度的位置加上和校验信息以及插入一些文件段。
$split -b 14336 uboot.bin bl2
$chksum
$add_padding
$rm bl2a*
$cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin >xboot.bin
注意到那个E4412_N.bl1.SCP2G.bin了吗,这个文件就是前文说的三星SoC启动过程的BL1阶段。我们可以使用脚本一次性完成上面的工作。
make -j${CPU_NUM}
cp tools/mkimage /usr/bin/
cp u-boot.bin ${ROOTDIR}/sdfuse_q
cd ${ROOTDIR}/sdfuse_q
split -b 14336 u-boot.bin bl2 #split u-boot to bl2a... why14336???==>参考三星bl2对uboot的校验方式,它会读取14336处的CS校验码
make #编译chksum
${ROOTDIR}/sdfuse_q/chksum #源码显示程序生成的校验码并没有回写到uboot,即uboot还是没有校验,不知道为什么还成功了,但是这个>
${ROOTDIR}/sdfuse_q/add_padding
rm bl2a*
cp u-boot.bin ${ROOTDIR}/CodeSign4SecureBoot/
cd ${ROOTDIR}/CodeSign4SecureBoot
cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-${newName}.bin
rm ./u-boot.bin
cp -a ./u-boot-${newName}.bin $TFTPDIR
cp ./u-boot-${newName}.bin ../mk_sdboot/
cd ${ROOTDIR}/mk_sdboot
sudo ./sd_fusing_exynos4x12.sh /dev/sdb u-boot-${newName}.bin
至此,我们就得到了一个能使用的镜像xboot.bin,这个xboot.bin的大小:527104byte!然后我们就可以使用另外的一些工具烧录到SD卡,注意如果你的开发主机对直接读取SD卡的支持不是很好的话,可以使用读卡器,不论是虚拟机还是Linux主机,对USB设备的支持还是让人满意的,烧录很简单,我们只需要执行下下面的"./sd_fusing_exynos4x12.sh /dev/your_SD_device u-boot-xboot.bin"即可,这个脚本是三星公司提供的,就是将镜像烧录到SD卡中,下面是我用的,贴出来供参考。
#!/bin/sh
#
# Copyright (C) 2010 Samsung Electronics Co., Ltd.
# http://www.samsung.com/
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
# sd_fusing_exynos4x12.sh
####################################
reader_type1="/dev/sd"
reader_type2="/dev/mmcblk0"
if [ -z $2 ]
then
echo "usage: ./sd_fusing.sh <SD Reader's device file> <filename>"
exit 0
fi
param1=`echo "$1" | awk '{print substr($1,1,7)}'`
if [ "$param1" = "$reader_type1" ]
then
partition=$1"1"
elif [ "$1" = "$reader_type2" ]
then
partition=$1"p1"
else
echo "Unsupported SD reader"
exit 0
fi
if [ -b $1 ]
then
echo "$1 reader is identified."
else
echo "$1 is NOT identified."
exit 0
fi
####################################
echo "----------------------------------"
echo $partition
echo "----------------------------------"
# format
umount $partition 2> /dev/null
echo "$2 fusing..."
dd iflag=dsync oflag=dsync if=./$2 of=$1 seek=1 && \
echo "$2 image has been fused successfully."
####################################
#<Message Display>
echo "Eject SD ca
将启动模式调整到从SD卡启动,uboot就可以跑起来了。
(转)从0移植uboot(三) _编译最小可用uboot的更多相关文章
- 从0移植uboot(三) _编译最小可用uboot
前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对uboot源码进行配置,将一个可用的uboot烧录到SD卡中. 定制自己的core board 市面上能买到的开发板 ...
- u-boot(三)启动文件
目录 u-boot(三)启动文件 汇编 C:_start_armboot 代码摘要 C:main_loop 内核启动 菜单处理(自定义实现) 命令处理 title: u-boot(三)启动文件 tag ...
- 从0移植uboot(六) _实现网络功能
为uboot添加网卡功能可以让uboot通过tftp下载内核, 方便我们的开发, 对于网卡功能的移植,我们依然在在一遍又一遍的实践这个uboot改造的套路. 找运行逻辑,即插入代码的位置. 根据运行逻 ...
- 从0移植uboot (一) _配置分析
来源:Linux社区 作者:xiaojiang1025 :http://www.linuxidc.com/Linux/2017-02/141018.htm 和绝大多数源码编译安装一样,uboot的 ...
- (转)从0移植uboot(六) _实现网络功能
ref:https://www.cnblogs.com/xiaojiang1025/p/6500532.html 为uboot添加网卡功能可以让uboot通过tftp下载内核, 方便我们的开发, 对于 ...
- (转)从0移植uboot (一) _配置分析
ref : https://www.cnblogs.com/xiaojiang1025/p/6106431.html 本人建议的uboot学习路线,先分析原有配置,根据现有的配置修改.增加有关的部分, ...
- 从0移植uboot (二) _启动流程分析
经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合 ...
- 从0移植uboot(五) _实现串口输出
串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可以将程序运行的情况直接通过串口线输出到屏幕上,对于这种异常重要的功能,uboot原生就提供了支持,但为此我们需要做一些 ...
- (转) 从0移植uboot(五) _实现串口输出
ref : https://www.cnblogs.com/xiaojiang1025/p/6500520.html 串口作为一种非常简单的通信方式,才是嵌入式系统调试的王道,通过设置串口输出,我们可 ...
随机推荐
- /dev/mem同步写不能使用msync的MS_SYNC选项探究
问题 做了个测试板子的程序,里面有一项写铁电的功能,要求写入之后立即断电,重启后校验数据准确性:铁电设计是通过内存地址直接映射的,于是,使用mmap直接映射了/dev/mem文件,自然地写入之后使用m ...
- 【转】Linux下软件安装的几种方式
转自Linux下软件安装的几种方式 Linux 系统的/usr目录 Linux 软件安装到哪里合适,目录详解 Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统 ...
- nginx配置监控
通过查看Nginx的并发连接,我们可以更清除的知道网站的负载情况.Nginx并发查看有两种方法(之所以这么说,是因为笔者只知道两种),一种是通过web界面,一种是通过命令,web查看要比命令查看显示的 ...
- OpenJudge计算概论-人民币支付
/*========================================================== 人民币支付 总时间限制: 1000ms 内存限制: 65536kB 描述 从键 ...
- lua字符串处理(string库用法)
原文地址http://www.freecls.com/a/2712/f lua的string库是用来处理字符串的,基础函数如下 string.byte(s [, i [, j]]) string.by ...
- C语言练习,可以解析协议,主机,路径,询问,片段等
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
- 阶段5 3.微服务项目【学成在线】_day06 页面发布 课程管理_20-课程计划添加-前端页面调试
调试课程计划的添加功能 课程添加的弹窗使用的是dialog组件 这个变量控制对话框是否显示 当点击按钮的时候就设置为true.那么弹窗就会显示出来了 测试 在测试的节点下面添加一个子节点 添加成功后 ...
- 123457123456---com.threeObj03.FanPaiZi01--- 记忆翻牌儿童
com.threeObj03.FanPaiZi01--- 记忆翻牌儿童
- Linux——定时任务crontab
linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题. cron介绍 我们经常使用的是crontab命令是cron table的简写,它是cron的配 ...
- 为什么要用k8s
经过几次面试,发现有的公司没有用过k8s,有的公司正在用,但是都问了共同的问题:k8s的好处在哪里.所以总结了一下几点 1.故障迁移:当某一个node节点关机或挂掉后,node节点上的服务会自动转移到 ...