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节点的树结构,去寻找该总线的子节点,所有的子节点将被作为设备注册到该总线上。
- 浏览: 44873 次
相关推荐
将服务器中得日志文件进行分割,自动生成含日志后缀得文件,并存储在服务器中
自己写的一个小工具,用以替换文件中得某些特定字符串,可以是文件夹中得也可以是直接文件。希望对您有所帮助
本文介绍如何不借助第三方框架实现iOS开发中得文件上传。 由于过程较为复杂,因此本文只贴出部分关键代码。 主控制器的关键代码: 代码如下: YYViewController.m #import “YYViewController.h” #define ...
spring配置文件实例
Linux系统内核被引导程序装进内存并运行后,Linux内核会检测系统中得各种硬件,并做好硬件得初始化工作,使他们在系统正式运行后能正常工作。剩下就是Linux内核要做得最后一个工作:运行/sbin下的init程序。Init是...
本文件管理程序旨在规范GMP文件管理行为,强化文件管理,保证各种GMP文件制定得规范性、系统性、准确性与严肃性,从而保证企业生产质量管理活动得全过程规范化运转,使企业得一切活动有章可循、责任明确,以达到有效...
"RC中得循环检测"这个主题聚焦于CR的一种关键技术——循环检测,它在频谱感知中扮演着重要角色。循环检测主要应用于检测是否存在已授权的无线通信系统,确保认知设备不会干扰它们。 循环检测的原理基于信号的自循环...
标题中的“提取ts流中得iframe”指的是在数字电视传输中如何从Transport Stream (TS) 流中解析并提取出I帧(Instantaneous Decoding Picture)的过程。在视频编码和解码领域,I帧是非常重要的,因为它能独立解码,不...
ERP实施过程中得3类常见错误,敬请关注
- 在删除了相关的注册表项之后,还需要检查并删除之前安装过程中可能遗留下来的文件。例如,对于MSSQL Server 2010的安装失败情况,通常需要清理以下目录下的文件: - `D:\Program Files\Microsoft SQL Server` - ...
jsp中得servlet技术,让你学会servlet
第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar 第2章 线性表(教材中得程序).rar
在iOS开发中,用户经常需要从相册中选取多张图片进行操作,如上传到社交媒体、编辑或保存等。然而,iOS的系统相册API默认只支持单张图片选择,...在实际开发过程中,还应考虑性能优化,如分批加载图片以减少内存占用。
这里使用了`with`语句,它确保在操作完成后正确地关闭文件,即使在处理过程中发生错误。`ZipFile`的`open`方法返回一个文件对象,`pd.read_csv`函数可以接受这个文件对象作为参数,从而读取ZIP内的CSV数据。 一旦...
本程序"matlab_激光标定中得激光线检测程序"专注于激光线检测,这是激光标定过程中的关键步骤。下面我们将详细探讨这一主题。 激光线检测通常涉及到以下几个核心知识点: 1. **激光雷达数据获取**:首先,我们需要...
2.破解过程。 a.先将压缩包中得PanabitWB3_XIHANr5_20110113_FreeBSD8.1_kx8.iso 刻录成光碟,从光盘引导安装。具体安装方法从Panabit官方网站获取,讲解的很详细. b.安装好后进入web管理界面至“系统升级”,使用...
5.WriteEnviHdr.m文件是将结构体写入到hdr文本文件中得函数。 具体详细介绍可以浏览我的博客:...
2. 将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下,这样可以达到减少 jar 文档重复占用内存的目的。 PermGen space 问题的原因: 1. 应用程序加载了太多的 Class,导致 PermGen space 溢出。 2. 使用...
通过对这些文件的分析,我们可以看到一个基于ADO的数据库应用的构建过程,从设计用户界面到编写数据访问代码,再到项目的配置和编译。尽管描述中提到作者对某些细节还不完全理解,但通过学习和实践,可以逐步掌握ADO...
最后,使用刻录软件将镜像文件刻录到光盘上,或者直接将文件复制到USB驱动器上。 #### WinPE工具盘的应用场景 1. **系统修复**:当电脑系统无法正常启动时,可以通过WinPE工具盘进入一个临时的操作环境,进而诊断...