深入Device Tree--LINUX中用DT_MACHINE_START/MACHINE_START

本文上接  深入Device Tree。

关于驱动想说的话:以前总以为高而攀不到。花时间去积累了,总会进步的。
这个世界需要的是全力以赴,战胜他人先战胜子自己!!



LINUX中用DT_MACHINE_START/MACHINE_START定义的MACH,并给出定义的各个成员函数在初始化过程中被调用的时机

所以  如下的 DT_MACHINE_START,
DT_MACHINE_START(MSM8974_DT, "Qualcomm MSM 8974 (Flattened Device Tree)")
    .map_io = msm8974_map_io,
    .init_irq = msm_dt_init_irq,
    .init_machine = msm8974_init,
    .handle_irq = gic_handle_irq,
    .timer = &msm_dt_timer,
    .dt_compat = msm8974_dt_match,
    .reserve = msm_8974_reserve,
    .init_very_early = msm8974_init_very_early,
    .restart = msm_restart,
    .smp = &msm8974_smp_ops,
MACHINE_END
可展开为 :
static const struct machine_desc   __mach_desc_MSM8974_DT{
 __used                            
 __attribute__((__section__(".arch.info.init"))) = {    
    .nr        = ~0,                
    .name        = "Qualcomm MSM 8974 (Flattened Device Tree)",
    .map_io = msm8974_map_io,
    .init_irq = msm_dt_init_irq,
    .init_machine = msm8974_init,
    .handle_irq = gic_handle_irq,
    .timer = &msm_dt_timer,
    .dt_compat = msm8974_dt_match,
    .reserve = msm_8974_reserve,
    .init_very_early = msm8974_init_very_early,
    .restart = msm_restart,
    .smp = &msm8974_smp_ops,
};
定义了"struct machine_desc"的类型变量,放在 section(".arch.info.init"),是内核初始化数据。


*******************************************************************************************
***  DT_MACHINE_START 宏展开
*******************************************************************************************

kernel\arch\arm\include\asm\mach\arch.h
/*
 * Set of macros to define architecture features.  This is built into
 * a table by the linker.
 */
#define MACHINE_START (_type,_name)            \
static const struct machine_desc __mach_desc_##_type    \
 __used                            \
 __attribute__((__section__(".arch.info.init"))) = {    \
    .nr        = MACH_TYPE_##_type,        \
    .name        = _name,

#define MACHINE_END                \
};

#define DT_MACHINE_START(_name, _namestr)        \
static const struct machine_desc __mach_desc_##_name    \
 __used                            \
 __attribute__((__section__(".arch.info.init"))) = {    \
    .nr        = ~0,                \
    .name        = _namestr,

#endif


machine_desc 的定义
struct machine_desc {
    unsigned int       nr;        /* architecture number    */
    const char        *name;        /* architecture name    */
    unsigned long        atag_offset;    /* tagged list (relative) */
    const char *const     *dt_compat;    /* array of device tree
                         * 'compatible' strings    */

    unsigned int        nr_irqs;    /* number of IRQs */

#ifdef CONFIG_ZONE_DMA
    phys_addr_t        dma_zone_size;    /* size of DMA-able area */
#endif

    unsigned int        video_start;    /* start of video RAM    */
    unsigned int        video_end;    /* end of video RAM    */

    unsigned char        reserve_lp0 :1;    /* never has lp0    */
    unsigned char        reserve_lp1 :1;    /* never has lp1    */
    unsigned char        reserve_lp2 :1;    /* never has lp2    */
    enum reboot_mode    reboot_mode;    /* default restart mode    */
    unsigned        l2c_aux_val;    /* L2 cache aux value    */
    unsigned        l2c_aux_mask;    /* L2 cache aux mask    */
    void            (*l2c_write_sec)(unsigned long, unsigned);
    struct smp_operations    *smp;        /* SMP operations    */
    bool            (*smp_init)(void);
    void            (*fixup)(struct tag *, char **);
    void            (*dt_fixup)(void);
    void            (*init_meminfo)(void);
    void            (*reserve)(void);/* reserve mem blocks    */
    void            (*map_io)(void);/* IO mapping function    */
    void            (*init_early)(void);
    void            (*init_irq)(void);
    void            (*init_time)(void);
    void            (*init_machine)(void);
    void            (*init_late)(void);
#ifdef CONFIG_MULTI_IRQ_HANDLER
    void            (*handle_irq)(struct pt_regs *);
#endif
    void            (*restart)(enum reboot_mode, const char *);
};





  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值