设备树(三)—— linux内核对设备树的支持

本文详细介绍了Linux内核如何处理设备树(DTB)文件,包括从获取DTB到转换为platform_device的过程。内核首先通过bootloader传递的地址获取DTB,然后解析DTB匹配单板,处理运行时配置信息,将设备树转换为device_node结构体,并进一步转化为platform_device。最后,平台设备与驱动进行匹配,完成设备初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内核获取DTB文件

1、bootloader启动内核时,会设置r0,r1,r2三个寄存器:
       r0一般设置为0;
       r1一般设置为machine id (在使用设备树时该参数没有被使用); 
       r2一般设置ATAGS或DTB的开始地址

2、通过head.S head-common.S处理,获得dtb文件指针__atags_pointer
       bl    __lookup_processor_type        //使用汇编指令读取CPU ID, 根据该ID找到对应的proc_info_list结构体(里面含有这类                                                                       CPU 的初始化函数、信息)
       bl    __vet_atags                             //判断是否存在可用的ATAGS或DTB
       bl    __create_page_tables             //创建页表, 即创建虚拟地址和物理地址的映射关系
       b    __enable_mmu                         //使能MMU, 以后就要使用虚拟地址了
      ldr    r13, =__mmap_switched        //上述函数里将会调用__mmap_switched

3、//r9  = processor ID
       __mmap_switched:  
       //缓存 r1 r2
       mov    r7, r1
       mov    r8, r2

     __mmap_switched_data:
           .long    processor_id                       @ r0
           .long    __machine_arch_type        @ r1
           .long    __atags_pointer                  @ r2

     adr    r4, __mmap_switched_data      //将存储变量的地址赋给r4
    
4、//将u-boot传递给内核的参数r0 r1 r2 分别赋给C变量 processor_id、__machine_arch_type、__atags_pointer
     ldmia    r4, {r0, r1, r2, r3}
         str    r9, [r0]            @ Save processor ID
         str    r7, [r1]            @ Save machine type
         str    r8, [r2]            @ Save atags pointer

二、内核解析dtb文件匹配单板

内核支持很多单板,每个单板在内核中都有一个machine_desc来描述,而在dtb文件中,在根节点以compatible这个属性描述这个单板。所以内核匹配单板的过程就是machine_desc中dt_compat与dtb中根节点compatible匹配的过程。

1、以jz2440这块单板为例:
dtb文件:
compatible = "samsung,smdk2440";

//arch/arm/mach-s3c24xx/mach-smdk2440.c
static const char *const smdk2440_dt_compat[] __initconst = {
    "samsung,s

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值