当前位置: 首页 > web >正文

深入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 *);
};





http://www.xdnf.cn/news/11569.html

相关文章:

  • 禅道的安装及使用流程
  • 霍兰德测试告诉你:最适合你的职业方向是什么?(包含开源免费的API接口)
  • 【2023最新版】超详细Wireshark安装保姆级教程,Wireshark抓包(网络分析),收藏这一篇就够了
  • ERROR: Could not connect to lockdownd, error code -19 -20
  • 【有内鬼,终止交易】手机壁纸Android客户端创意实现
  • Windows远控之权限维持
  • Android开发新手入门教程,【干货
  • vs2010 玩转金山界面库 (1)贮备篇
  • SQLite 入门教程(非常详细)零基础入门到精通,收藏这一篇就够了
  • 解决Foxit Reader 中文乱码问题
  • 亦舒的77句话
  • 你见过最“变态”的CPU散热器是什么样的?
  • Java注解面试题
  • 腾云忆想技术干货|TSF微服务治理实战系列(三)——服务限流
  • metaRTC+ZLMediaKit实现webrtc的推拉流
  • 菊花香香儿
  • GBK-unicode对照
  • JAVA经典面试题附答案
  • P4290 [HAOI2008]玩具取名 区间dp
  • 8个变态问题VS最终变态答案!!!
  • 自学编程推荐的11个学习及刷题网站
  • 2023年全国青少年信息素养大赛(Python)海南赛区复赛真题
  • STM32H7的LTCD控制学习和应用
  • 【理论+实践】史上最全-论文中常用的图像分割评价指标-附完整代码_分割指标hd95 aorta
  • 2024年最佳Icon图标库推荐,收藏等于学会(2),热门面试
  • 全网最全的Python入门基础教程,超详细。(最新版)
  • .bat批处理命令常用操作
  • HTML做一个简单漂亮的宠物网页(纯html代码)
  • 自增表的自增id的插入(IDENTITY_INSERT)
  • 山寨智能机多采用盗版Windows Mobile系统