加载中…
个人资料
峯挚
峯挚
  • 博客等级:
  • 博客积分:0
  • 博客访问:13,170
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

linux内核设备树流程

(2019-10-10 18:20:45)
标签:

it

分类: 笔记
1,对设备树中平台信息的处理(选择machine_desc)
head.S arch/arm/kernel/head.S
ldr r13, =__mmap_switched
head-common.S arch/arm/kernel/head-common.S
b start_kernel
main.c init/main.c
setup_arch(&command_line);
mdesc = setup_machine_fdt(__atags_pointer); arch/arm/kernel/devtree.c
early_init_dt_verify(phys_to_virt(dt_phys) //判断是否是有效dtb driver/of/fdt.c
initial_boot_params = params; //设置 driver/of/fdt.c
mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach); //找到最匹配的machine_desc driver/of/fdt.c
while ((data = get_next_compat(&compat))) {
score = of_flat_dt_match(dt_root, compat);
if (score > 0 && score < best_score) {
best_data = data;
best_score = score;
}
}
machine_desc = mdesc;


2,对设备树中运行时配置信息的处理
main.c init/main.c
setup_arch(&command_line);
mdesc = setup_machine_fdt(__atags_pointer); arch/arm/kernel/devtree.c
early_init_dt_scan_nodes(); driver/of/fdt.c
of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); //将dtb中chosen节点中的数据保存到boot_command_line);
of_scan_flat_dt(early_init_dt_scan_root, NULL); //确定根节点的这2个属性的值:#address-cells和#size-cells
of_scan_flat_dt(early_init_dt_scan_memory, NULL); //解析/memory中的reg属性,提取出“base,size",最终调用memblock_add(base,size)
early_init_dt_add_memory_arch(base, size);
memblock_add(base, size);

3,dtb转换为device_node结构体
main.c init/main.c
setup_arch(&command_line);
unflatten_device_tree();
static void __unflatten_device_tree(void *blob,struct device_node **mynodes,void * (*dt_alloc)(u64 size, u64 align)) drivers/of/fdt.c
size = (unsigned long)unflatten_dt_node(blob, NULL, &start, NULL, NULL, 0, true); //第一步,计算大小
mem = dt_alloc(size + 4, __alignof__(struct device_node)); //分配内存
unflatten_dt_node(blob, mem, &start, NULL, mynodes, 0, false); //第二步,做实际的解压
np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl,__alignof__(struct device_node));

4,device_node转换为platform_device
dts -> dtb -> device_node -> paltform_device


5,并非所有的device_node都会转换为platform_device
只有一下的device_node会转换:
a,该节点必须啊包含compatible属性
b,根节点的子节点(节点必须含有compatible属性)
c,含有特殊compatible属性的节点的子节点:
这些特殊的compatible属性为:"simple-bus","simple-mfd","arm,amba-bus"


6,问题:
1,哪些device_node可以转换为platform_device?
i2c,spi等总线节点下的子节点,应该交给对应的总线驱动程序来处理,它们不应该被转换为platform_device
2,怎么转换?
platform_device中含有resource数组,它来自device_node的reg,interrupts属性;
platform_device.device.dev.of_node只想device_node,可以通过它获得其他属性

0

阅读 收藏 禁止转载 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有