u-boot include目录 gd_t结构体 如何关联芯片指定的目录

Posted idyllcheung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了u-boot include目录 gd_t结构体 如何关联芯片指定的目录相关的知识,希望对你有一定的参考价值。

1

u-boot

/u-boot-2018.07-fmsh/include/config.h

/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/fmsh/fmql
#include <config_defaults.h>
#include <config_uncmd_spl.h>
#include <configs/fmsh-common.h>
#include <asm/config.h>
#include <linux/kconfig.h>
#include <config_fallbacks.h>

 

就在想尖括号中的h文件都在哪里搜索

 

于是去Makefile中找找看线索:

搜索INCLUDE,找到了

 

UBOOTINCLUDE    := \
        -Iinclude \
        $(if $(KBUILD_SRC), -I$(srctree)/include) \
        $(if $(CONFIG_$(SPL_)SYS_THUMB_BUILD), \
            $(if $(CONFIG_HAS_THUMB2),, \
                -I$(srctree)/arch/$(ARCH)/thumb1/include),) \
        -I$(srctree)/arch/$(ARCH)/include \
        -include $(srctree)/include/linux/kconfig.h

 

gcc –o main –I../include -DDebug –g main.c
输出文件 头文件搜索目录 定义宏 用于调试 源文件

–I../include  头文件搜索目录

-I dir 在dir这个目录寻找被include的文

 

 

2

gd_t结构体在哪里定义呢

u-boot-2018.07-fmsh/common/board_r.c

中用到了DECLARE_GLOBAL_DATA_PTR

DECLARE_GLOBAL_DATA_PTR在arch/arm/include/asm/global_data.h中定义

 

#include <asm-generic/global_data.h>

 

#ifdef CONFIG_ARM64
#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("x18")
#else
#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r9")
#endif

gd_t在u-boot-2018.07-fmsh/include/asm-generic/global_data.h中定义

typedef struct global_data
    bd_t *bd;
    unsigned long flags;
    unsigned int baudrate;
    unsigned long cpu_clk;        /* CPU clock in Hz!        */
    unsigned long bus_clk;
    /* We cannot bracket this with CONFIG_PCI due to mpc5xxx */
    unsigned long pci_clk;
    unsigned long mem_clk;
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
    unsigned long fb_base;        /* Base address of framebuffer mem */
#endif
#if defined(CONFIG_POST)
    unsigned long post_log_word;    /* Record POST activities */
    unsigned long post_log_res;    /* success of POST test */
    unsigned long post_init_f_time;    /* When post_init_f started */
#endif
#ifdef CONFIG_BOARD_TYPES
    unsigned long board_type;
#endif
    unsigned long have_console;    /* serial_init() was called */
#if CONFIG_IS_ENABLED(PRE_CONSOLE_BUFFER)
    unsigned long precon_buf_idx;    /* Pre-Console buffer index */
#endif
    unsigned long env_addr;        /* Address  of Environment struct */
    unsigned long env_valid;    /* Environment valid? enum env_valid */
    unsigned long env_has_init;    /* Bitmask of boolean of struct env_location offsets */
    int env_load_location;

    unsigned long ram_top;        /* Top address of RAM used by U-Boot */
    unsigned long relocaddr;    /* Start address of U-Boot in RAM */
    phys_size_t ram_size;        /* RAM size */
    unsigned long mon_len;        /* monitor len */
    unsigned long irq_sp;        /* irq stack pointer */
    unsigned long start_addr_sp;    /* start_addr_stackpointer */
    unsigned long reloc_off;
    struct global_data *new_gd;    /* relocated global data */

#ifdef CONFIG_DM
    struct udevice    *dm_root;    /* Root instance for Driver Model */
    struct udevice    *dm_root_f;    /* Pre-relocation root instance */
    struct list_head uclass_root;    /* Head of core tree */
#endif
#ifdef CONFIG_TIMER
    struct udevice    *timer;        /* Timer instance for Driver Model */
#endif

    const void *fdt_blob;        /* Our device tree, NULL if none */
    void *new_fdt;            /* Relocated FDT */
    unsigned long fdt_size;        /* Space reserved for relocated FDT */
#ifdef CONFIG_OF_LIVE
    struct device_node *of_root;
#endif
    struct jt_funcs *jt;        /* jump table */
    char env_buf[32];        /* buffer for env_get() before reloc. */
#ifdef CONFIG_TRACE
    void        *trace_buff;    /* The trace buffer */
#endif
#if defined(CONFIG_SYS_I2C)
    int        cur_i2c_bus;    /* current used i2c bus */
#endif
#ifdef CONFIG_SYS_I2C_MXC
    void *srdata[10];
#endif
    unsigned int timebase_h;
    unsigned int timebase_l;
#if CONFIG_VAL(SYS_MALLOC_F_LEN)
    unsigned long malloc_base;    /* base address of early malloc() */
    unsigned long malloc_limit;    /* limit address */
    unsigned long malloc_ptr;    /* current address */
#endif
#ifdef CONFIG_PCI
    struct pci_controller *hose;    /* PCI hose for early use */
    phys_addr_t pci_ram_top;    /* top of region accessible to PCI */
#endif
#ifdef CONFIG_PCI_BOOTDELAY
    int pcidelay_done;
#endif
    struct udevice *cur_serial_dev;    /* current serial device */
    struct arch_global_data arch;    /* architecture-specific data */
#ifdef CONFIG_CONSOLE_RECORD
    struct membuff console_out;    /* console output */
    struct membuff console_in;    /* console input */
#endif
#ifdef CONFIG_DM_VIDEO
    ulong video_top;        /* Top of video frame buffer area */
    ulong video_bottom;        /* Bottom of video frame buffer area */
#endif
#ifdef CONFIG_BOOTSTAGE
    struct bootstage_data *bootstage;    /* Bootstage information */
    struct bootstage_data *new_bootstage;    /* Relocated bootstage info */
#endif
#ifdef CONFIG_LOG
    int log_drop_count;        /* Number of dropped log messages */
    int default_log_level;        /* For devices with no filters */
    struct list_head log_head;    /* List of struct log_device */
    int log_fmt;            /* Mask containing log format info */
#endif
gd_t;

 

3

1.2.2 create_symlink的规则

# symbolic links
# If arch/$(ARCH)/mach-$(SOC)/include/mach exists,
# make a symbolic link to that directory.
# Otherwise, create a symbolic link to arch/$(ARCH)/include/asm/arch-$(SOC).
PHONY += create_symlink
create_symlink:
ifdef CONFIG_CREATE_ARCH_SYMLINK
ifneq ($(KBUILD_SRC),)
    $(Q)mkdir -p include/asm
    $(Q)if [ -d $(KBUILD_SRC)/arch/$(ARCH)/mach-$(SOC)/include/mach ]; then \
        dest=arch/$(ARCH)/mach-$(SOC)/include/mach;         \
    else                                    \
        dest=arch/$(ARCH)/include/asm/arch-$(if $(SOC),$(SOC),$(CPU));  \
    fi;                                 \
    ln -fsn $(KBUILD_SRC)/$$dest include/asm/arch
else
    $(Q)if [ -d arch/$(ARCH)/mach-$(SOC)/include/mach ]; then   \
        dest=../../mach-$(SOC)/include/mach;            \
    else                                \
        dest=arch-$(if $(SOC),$(SOC),$(CPU));           \
    fi;                             \
    ln -fsn $$dest arch/$(ARCH)/include/asm/arch
endif
endif
  

注释已经很好解释了create_symlink的行为:

    如果arch/$(ARCH)/mach-$(SOC)/include/mach存在,则生成符号链接:arch/$(ARCH)/include/asm/arch --> arch/$(ARCH)/mach-$(SOC)/include/mach
    否则生成符号链接arch/$(ARCH)/include/asm/arch --> arch/$(ARCH)/include/asm/arch-$(if $(SOC),$(SOC),$(CPU));

对基于arm v7架构的bcm2837芯片,arch/arm/math-bcm283x文件夹存在,所以生成链接:
arch/arm/include/asm/arch --> arch/arm/mach-bcm283x/include/mach

简单说来,create_symlink就是将芯片指定的arch/$(ARCH)math-$(SOC)连接到跟芯片名字无关的arch/$(ARCH)/include/asm下。

以上是关于u-boot include目录 gd_t结构体 如何关联芯片指定的目录的主要内容,如果未能解决你的问题,请参考以下文章

U-boot的目录结构及spl功能

10th.U-boot——代码结构分析

嵌入式开发(S5PV210)——u-boot的不同来源和目录结构

u-boot-2016.07 README文档结构

u-boot-2015.07 autoconf.mk生成过程分析

u-boot