• 第二天-uboot学习


    源码阅读方法
    1、源码目录结构
    2、配置(支持当前使用的硬件)
    3、编译(Makefile)
    4、启动流程

    工具使用
    1、在同一文件查找
    shitf+8
    N n进行上下查找

    2、在工程目录中
    ctags


    uboot版本选择:2013

    uboot 2010版本前 只能识别zImage 文件
    uboot 2013 能够识别uImage文件

    选用原则:
    1、适用于当前开发板
    2、资料问题

    uboot目录结构
    平台相关
    arch(架构) board(板级结构)

    平台无关
    common(uboot命令) disk(磁盘) doc(文档) drivers(uboot阶段驱动) fs(文件系统) include lib(通用的头、库文件) net(网络支持)
    tools(编译相关工具)

    uboot配置
    1、步骤
    make fs4412_config
    make XXXX_config

    2.流程
    进入Makefile
    790 %_config:: unconfig
    791 @$(MKCONFIG) -A $(@:_config=)
    131 MKCONFIG := $(SRCTREE)/mkconfig ==> mkconfig
    126 SRCTREE := $(CURDIR) ==> 当前路径

    $(@:_config=) @指的是目标文件 fs4412_config 字符串A:字符串B= 将A中B去掉 fs4412

    ./mkconfig -A fs4412

    进入mkconfig中

    #代表了参数个数
    ^[[:space:]]*${2}[[:space:]] 正则表达式 前面没有空格fs4412 后面有空格 一行的开头位置
    line = fs4412 arm armv7 fs4412 samsung exynos
    $1 $2 $3 $4 $5 $6

    set line 将line中的值以空格为分隔编程执行参数

    ./mkconfig fs4412 arm armv7 fs4412 samsung exynos
    $1 $2 $3 $4 $5 $6

    CONFIG_NAME=fs4412_config
    BOARD_NAME=fs4412_config
    awk文本分析工具
    arch = arm
    cpu = armv7
    spl_cpu = armv7
    board = fs4412
    vendor = samung
    soc = exynos

    113 cd ./include
    114 rm -f asm
    115 ln -s ../arch/${arch}/include/asm asm 创建符号链接 arch/arm/include/asm asm

    shell中 条件判断 -z选项 判断变量有值 返回0
    123 ln -s arch-exynos asm/arch
    127 rm -f asm/proc
    128 ln -s proc-armv asm/proc

    添加了三个符号链接

    现在位于include路径下

    创建了一个config.mk 将小写arch等参数 赋给了大写的ARCH等参数

    154 BOARDDIR=${vendor}/${board} ==>samung/fs4412

    创建了一个板级特定的头文件 config.h

    总结:创建了三个符号链接,创建config.mk(包含板级特定全局变量)创建了config.h(创建板级特定头文件,添加了一些宏)

    uboot编译
    1、步骤
    make

    2、流程
    进入Makefile
    先去找all:
    429 all: $(ALL-y) $(SUBDIR_EXAMPLES)
    412 ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map

    444 $(obj)u-boot.bin: $(obj)u-boot
    445 $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
    446 $(BOARD_SIZE_CHECK)

    (obj)==> 指明的是当前Makefile路径
    objcopy --gap-fill -O binary u-boot(源文件) u-boot.bin(目标文件)

    581 $(obj)u-boot: depend
    582 $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
    583 $(GEN_UBOOT)

    关于CONFIG_这样的宏配置 include/config.h 和 include/configs/fs4412.h

    160 SUBDIR_TOOLS = tools (编译需要的工具)查找
    237 OBJS = $(CPUDIR)/start.o 当前Makefile下没有CPUDIR 查找include
    194 include $(TOPDIR)/config.mk config.mk
    127 TOPDIR := $(SRCTREE)

    166 CPUDIR=arch/$(ARCH)/cpu/$(CPU) arch/arm/cpu/armv7

    arch/arm/cpu/armv7/start.o(启动的第一个文件)

    365 LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).o ==>board/samung/fs4412/libfs4412.o 板级结构相关库文件
    366 LIBBOARD := $(addprefix $(obj),$(LIBBOARD)) addprefix拼接路径(obj) (LIBBOARD)

    362 LIBS := $(addprefix $(obj),$(sort $(LIBS-y))) sort $(LIBS-y) 进行排序 (LIBS-y) 添加的是通用的库文件(文件很多)

    wildcard 扩展通配符 确定当前文件是否存在 如果扩展的路径文件不存在,返回空值
    219 LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds 完成了赋值,但是当前路径下文件并不存在
    221 ifeq ($(wildcard $(LDSCRIPT)),) 当前路径下文件不存在 返回空值,判断成立
    222 LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot.lds arch/arm/cpu/armv7/u-boot.lds 完成了赋值,但是当前路径下文件并不存在
    225 LDSCRIPT := $(TOPDIR)/arch/$(ARCH)/cpu/u-boot.lds arch/arm/cpu/u-boot.lds 赋值成功 这就是我们想要的

    613 $(obj)u-boot.lds: $(LDSCRIPT) $(obj)include/u-boot.lst
    614 $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$< >$@ cpp预处理命令

    生成了u-boot文件,经过格式转换生成了u-boot.bin
    u-boot.bin是bootloader的半成品,缺少三星提供的安全启动代码

    u-boot-fs4412.bin
    bl1
    bl2
    u-boot.bin
    加密算法
    数字签名


    作业:实验三

  • 相关阅读:
    使用PullToRefresh实现下拉刷新和上拉加载
    Java RandomAccessFile用法
    Java_io体系之RandomAccessFile简介、走进源码及示例——20
    获取Android设备唯一标识码
    MQTT协议简记
    ORMLite学习入门笔记
    service的生命周期
    android广播(内部类)使用
    intent 几种用法
    intent.setFlags方法中的参数值含义
  • 原文地址:https://www.cnblogs.com/renchong/p/5756380.html
Copyright © 2020-2023  润新知