内核对设备树的处理
目录
内核对设备树的处理 ...........................................................................................................................................................................................................1
1 内核 head.S 对 dtb 的简单处理 ...............................................................................................................................................................................1
2 对设备树中平台信息的处理....................................................................................................................................................................................2
2.1 数据结构简介 ................................................................................................................................................................................................2
2.2 machine 和 dts 的匹配过程............................................................................................................................................................................2
3 对设备树中运行时配置信息的处理........................................................................................................................................................................2
4 dtb 转换为 device_node(unflatten) ...........................................................................................................................................................................3
5 device_node 转换为 platform_device .......................................................................................................................................................................4
5.1 哪些 device_node 可以转换为 platform_device?.........................................................................................................................................4
5.2 转换处理过程 ................................................................................................................................................................................................4
5.3 I2c 总线节点的处理........................................................................................................................................................................................5
6 platform_device 跟 platform_driver 的匹配 .............................................................................................................................................................5
6.1 注册 platform_driver 的过程.......................................................................................................................................................................5
6.2 注册 platform_device 的过程 ......................................................................................................................................................................5
6.3 匹配顺序 ........................................................................................................................................................................................................5
1 内核 head.S 对 dtb 的简单处理
bootloader 启动内核时,会设置 r0,r1,r2 三个寄存器,
r0 一般设置为 0;
r1 一般设置为 machine id (在使用设备树时该参数没有被使用);
r2 一般设置 ATAGS 或 DTB 的开始地址
bootloader 给内核传递的参数时有 2 种方法:ATAGS 或 DTB
head.S 对 dtb 的简单处理的基本流程如下:
__lookup_processor_type @ 使用汇编指令读取 CPU ID, 根据该 ID 找到对应的 proc_info_list 结构体(里面含有这类 CPU 的初始化函
数、信息)
__vet_atags @ 判断是否存在可用的 ATAGS 或 DTB
__create_page_tables @ 创建页表, 即创建虚拟地址和物理地址的映射关系
__enable_mmu @ 使能 MMU, 以后就要使用虚拟地址了
__mmap_switched @ 上述函数里将会调用__mmap_switched
把 bootloader 传入的 r2 参数, 保存到变量__atags_pointer 中
调用 C 函数 start_kernel
以__lookup_processor_type 为例,简单分析下相关汇编代码: