`
网络接口
  • 浏览: 44873 次
文章分类
社区版块
存档分类
最新评论

Linux设备驱动中得DTS文件加载过程

 
阅读更多

1. 在\kernel\of\fdt.c 中有如下初始化函数  注释上:展开设备树,创建device_nodes到全局变量allnodes中

void __init unflatten_device_tree(void)
{
    __unflatten_device_tree(initial_boot_params, &allnodes,
                early_init_dt_alloc_memory_arch);

    /* Get pointer to "/chosen" and "/aliasas" nodes for use everywhere */
    of_alias_scan(early_init_dt_alloc_memory_arch);
}
unflatten_device_tree函数被setup_arch函数调用,
因为我们使用得是arm平台所以存在\kernel\arch\arm\kernel\setup.c中
void __init setup_arch(char **cmdline_p)
{
unflatten_device_tree()
}

setup_arch函数在kernel启动是被调用,如下启动kernel存在\kernel\init\main.c中
asmlinkage void __init start_kernel(void)
{
  setup_arch(&command_line);
}

这些工作完成解析DTS文件。保存到全局链表allnodes中。


2、在makefile中有这段话来编译dts文件:

$(obj)/A20%.dtb: $(src)/dts/A20%.dts FORCE
    $(call if_changed_dep,dtc)

$(obj)/A68M%.dtb: $(src)/dts/A68M%.dts FORCE
    $(call if_changed_dep,dtc)

和.c文件生成.o文件一样 回生成.dtb文件。在
/home/liyang/workspace/SZ_JB-mr1-8628-bsp-1012/out/target/product/msm8226/obj/KERNEL_OBJ/arch/arm/boot
目录下,与zimage一个目录。

3、
在 board-8226.c中有初始化函数-->启动自动掉用
void __init msm8226_init(void)
{
   of_platform_populate(NULL, of_default_bus_match_table, adata, NULL);
}

of_platform_populate在kernel\driver\of\platform.c中定义,回查询

    root = root ? of_node_get(root) : of_find_node_by_path("/");
    for_each_child_of_node(root, child)
        {
        rc = of_platform_bus_create(child, matches, lookup, parent, true);
        if (rc)
            break;
    }
    of_node_put(root);

在这里用到得函数of_find_node_by_path会最终调用到kernel\driver\of\base.c中得函数
struct device_node *of_find_node_by_path(const char *path)
{
  遍历第1步中得allnodes找到根节点
}

 of_platform_bus_create()函数中创建得内容存在了 adata中。


(2)使用DTS注册总线设备的过程   
以高通8974平台为例,在注册i2c总线时,会调用到qup_i2c_probe()接口,该接口用于申请总线资源和添加i2c适配器。在成功添加i2c适配器后,会调用of_i2c_register_devices()接口。此接口会解析i2c总线节点的子节点(挂载在该总线上的i2c设备节点),获取i2c设备的地址、中断号等硬件信息。然后调用request_module()加载设备对应的驱动文件,调用i2c_new_device(),生成i2c设备。此时设备和驱动都已加载,于是drvier里面的probe方法将被调用。后面流程就和之前一样了。
简而言之,Linux采用DTS描述设备硬件信息后,省去了大量板文件垃圾信息。Linux在开机启动阶段,会解析DTS文件,保存到全局链表allnodes中,在掉用.init_machine时,会跟据allnodes中的信息注册平台总线和设备。值得注意的是,加载流程并不是按找从树根到树叶的方式递归注册,而是只注册根节点下的第一级子节点,第二级及之后的子节点暂不注册。Linux系统下的设备大多都是挂载在平台总线下的,因此在平台总线被注册后,会根据allnodes节点的树结构,去寻找该总线的子节点,所有的子节点将被作为设备注册到该总线上。

分享到:
评论

相关推荐

    将服务器中得日志文件进行分割,自动生成含日志后缀得文件

    将服务器中得日志文件进行分割,自动生成含日志后缀得文件,并存储在服务器中

    java实现替换文件中得特定字符串

    自己写的一个小工具,用以替换文件中得某些特定字符串,可以是文件夹中得也可以是直接文件。希望对您有所帮助

    iOS开发中文件的上传和下载功能的基本实现

    本文介绍如何不借助第三方框架实现iOS开发中得文件上传。  由于过程较为复杂,因此本文只贴出部分关键代码。 主控制器的关键代码: 代码如下: YYViewController.m #import “YYViewController.h” #define ...

    spring配置文件实例

    spring配置文件实例

    基于CF卡的linux系统制作.doc

    Linux系统内核被引导程序装进内存并运行后,Linux内核会检测系统中得各种硬件,并做好硬件得初始化工作,使他们在系统正式运行后能正常工作。剩下就是Linux内核要做得最后一个工作:运行/sbin下的init程序。Init是...

    GMP认证文件文件管理程序.pdf

    本文件管理程序旨在规范GMP文件管理行为,强化文件管理,保证各种GMP文件制定得规范性、系统性、准确性与严肃性,从而保证企业生产质量管理活动得全过程规范化运转,使企业得一切活动有章可循、责任明确,以达到有效...

    RC中得循环检测

    "RC中得循环检测"这个主题聚焦于CR的一种关键技术——循环检测,它在频谱感知中扮演着重要角色。循环检测主要应用于检测是否存在已授权的无线通信系统,确保认知设备不会干扰它们。 循环检测的原理基于信号的自循环...

    提取ts流中得iframe

    标题中的“提取ts流中得iframe”指的是在数字电视传输中如何从Transport Stream (TS) 流中解析并提取出I帧(Instantaneous Decoding Picture)的过程。在视频编码和解码领域,I帧是非常重要的,因为它能独立解码,不...

    ERP实施过程中得3类常见错误

    ERP实施过程中得3类常见错误,敬请关注

    数据库安装中得问题

    - 在删除了相关的注册表项之后,还需要检查并删除之前安装过程中可能遗留下来的文件。例如,对于MSSQL Server 2010的安装失败情况,通常需要清理以下目录下的文件: - `D:\Program Files\Microsoft SQL Server` - ...

    jsp中得servlet技术

    jsp中得servlet技术,让你学会servlet

    第2章 线性表(教材中得程序)

    第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar

    多选相册中得图片

    在iOS开发中,用户经常需要从相册中选取多张图片进行操作,如上传到社交媒体、编辑或保存等。然而,iOS的系统相册API默认只支持单张图片选择,...在实际开发过程中,还应考虑性能优化,如分批加载图片以减少内存占用。

    对python读取zip压缩文件里面的csv数据实例详解

    这里使用了`with`语句,它确保在操作完成后正确地关闭文件,即使在处理过程中发生错误。`ZipFile`的`open`方法返回一个文件对象,`pd.read_csv`函数可以接受这个文件对象作为参数,从而读取ZIP内的CSV数据。 一旦...

    matlab_激光标定中得激光线检测程序

    本程序"matlab_激光标定中得激光线检测程序"专注于激光线检测,这是激光标定过程中的关键步骤。下面我们将详细探讨这一主题。 激光线检测通常涉及到以下几个核心知识点: 1. **激光雷达数据获取**:首先,我们需要...

    panabit流控大师1000用户授权文件打包5分下载

    2.破解过程。 a.先将压缩包中得PanabitWB3_XIHANr5_20110113_FreeBSD8.1_kx8.iso 刻录成光碟,从光盘引导安装。具体安装方法从Panabit官方网站获取,讲解的很详细. b.安装好后进入web管理界面至“系统升级”,使用...

    matlab读取生成ENVI标准格式数据

    5.WriteEnviHdr.m文件是将结构体写入到hdr文本文件中得函数。 具体详细介绍可以浏览我的博客:...

    解决JVM中得PermGen spac问题

    2. 将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下,这样可以达到减少 jar 文档重复占用内存的目的。 PermGen space 问题的原因: 1. 应用程序加载了太多的 Class,导致 PermGen space 溢出。 2. 使用...

    ADO中得一些总结心得

    通过对这些文件的分析,我们可以看到一个基于ADO的数据库应用的构建过程,从设计用户界面到编写数据访问代码,再到项目的配置和编译。尽管描述中提到作者对某些细节还不完全理解,但通过学习和实践,可以逐步掌握ADO...

    winpe在电脑系统维护中得作用

    最后,使用刻录软件将镜像文件刻录到光盘上,或者直接将文件复制到USB驱动器上。 #### WinPE工具盘的应用场景 1. **系统修复**:当电脑系统无法正常启动时,可以通过WinPE工具盘进入一个临时的操作环境,进而诊断...

Global site tag (gtag.js) - Google Analytics