zoukankan      html  css  js  c++  java
  • u-boot include目录 gd_t结构体 如何关联芯片指定的目录

    1

    u-boot

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

    /* Automatically generated - do not edit */
    #define CONFIG_BOARDDIR board/fmxx/fmql
    #include <config_defaults.h>
    #include <config_uncmd_spl.h>
    #include <configs/fmxx-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-fmxx/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-fmxx/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下。

  • 相关阅读:
    Python 连接SQLite数据库 及基础操作
    删除爬取字符串中的特殊字符
    网页爬虫中xa0、u3000等字符的解释及去除
    File 文件操作及模式说明
    【re】模块运用,正则匹配操作 待编辑
    MySQL
    正则表达式的常用操作符
    pip操作
    Python 常见运算
    Python32 1.半连接数 2.粘包问题解决
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/11636922.html
Copyright © 2011-2022 走看看