ARM平台device tree是如何工作的?(一)

原创 2016年05月31日 16:14:06

bootloader传递给内核的参数


在bootloader启动kernel之前会设置ARM CPU的r0,r1,r2,r9寄存器:
未使用device tree的2.6版本中,只需要将:
r0=0;
r1=machine_id;
r2=atags_address;

使用device tree之后,就稍微复杂一些,设置如下:
r0=cp#15 control register;
r1=machine ID;
r2=atags/dtb pointer;
r9=processor ID;

在arm/arm/kernel/head-common.S中,汇编代码会将这几个寄存器的值保存到几个变量中。

/*
 * The following fragment of code is executed with the MMU on in MMU mode,
 * and uses absolute addresses; this is not position independent.
 *
 *  r0  = cp#15 control register                                                                                                                                                                             
 *  r1  = machine ID
 *  r2  = atags/dtb pointer
 *  r9  = processor ID
 */
        __INIT
__mmap_switched:
        adr     r3, __mmap_switched_data

        ldmia   r3!, {r4, r5, r6, r7}
        cmp     r4, r5                          @ Copy data segment if needed
1:      cmpne   r5, r6
        ldrne   fp, [r4], #4
        strne   fp, [r5], #4
        bne     1b

        mov     fp, #0                          @ Clear BSS (and zero fp)
1:      cmp     r6, r7
        strcc   fp, [r6],#4
        bcc     1b

 ARM(   ldmia   r3, {r4, r5, r6, r7, sp})
 THUMB( ldmia   r3, {r4, r5, r6, r7}    )
 THUMB( ldr     sp, [r3, #16]           )
        str     r9, [r4]                        @ Save processor ID
        str     r1, [r5]                        @ Save machine type
        str     r2, [r6]                        @ Save atags pointer
        cmp     r7, #0
        strne   r0, [r7]                        @ Save control register values
        b       start_kernel
ENDPROC(__mmap_switched)

        .align  2
        .type   __mmap_switched_data, %object
__mmap_switched_data:
        .long   __data_loc                      @ r4
        .long   _sdata                          @ r5
        .long   __bss_start                     @ r6
        .long   _end                            @ r7
        .long   processor_id                    @ r4
        .long   __machine_arch_type             @ r5
        .long   __atags_pointer                 @ r6
#ifdef CONFIG_CPU_CP15
        .long   cr_alignment                    @ r7
#else
        .long   0                               @ r7
#endif
        .long   init_thread_union + THREAD_START_SP @ sp
        .size   __mmap_switched_data, . - __mmap_switched_da

上述代码做了三件事:
1、如果需要,保存数据段信息到__data_loc,_sdata,__bss_start_end变量中;
2、保存r9寄存器的值,即processor ID到processor_id变量中,保存r1寄存器的值,即machine ID到__machine_arch_type中,保存r2寄存器的值,即atags或dtb的地址到__atags_pointer变量中;
3、跳转到start_kernel()这个函数中去执行;

start_kernel()这个函数是C代码实现的。

linux内核device tree的初始化流程

linux内核device tree的初始化流程一、前言自从内核引入device tree之后,驱动开发者再也不需要因为硬件上的修改而去修改arch/arm/plat-xxx和arch/arm/mac...
  • mrcc_yy
  • mrcc_yy
  • 2016年05月12日 16:31
  • 1614

Device Tree(二):基本概念

一、前言 一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念。 简单...
  • mrwangwang
  • mrwangwang
  • 2014年06月28日 15:42
  • 10875

(DT系列二)device tree的书写规范

devicetree的书写规范 下面从节点,属性,reg,ranges,中断控制器等几个方面叙述devicetree的书写规范。 1,dts的基本元素:节点 .dts(或者其include的...
  • lichengtongxiazai
  • lichengtongxiazai
  • 2014年08月30日 09:53
  • 6768

msm平台GPIO相关的device tree设置

转http://www.ithao123.cn/content-8794703.html msm平台GPIO相关的device tree设置 [摘要:GPIO相干的dvice tree...
  • keleming1
  • keleming1
  • 2016年04月01日 10:38
  • 2996

简析PPC的Device Tree机制

我的理解是为了适应灵活的嵌入式平台,FDT将一些固定人为需要修改的参数信息从uboot和kernel中(如uboot下的bd_t)剥离出来,修改硬件后,不需要重新修改烧录uboot kernel,仅需...
  • skyflying2012
  • skyflying2012
  • 2015年03月05日 11:03
  • 2132

关于Device tree的问题

在搞am335x的东西,最近到了spi的地方, 按照uart的套路&uart1{ pinctrl - names = "default"; pinctrl - 0 = ; s...
  • spark550
  • spark550
  • 2016年08月05日 13:59
  • 215

使用BBB的device tree和cape(重新整理版)

只要你想用BBB做哪怕一丁点涉及到硬件的东西,你就不可避免地要用到cape和device tree的知识。所以尽管它们看起来很陌生而且有点复杂,但还是得学。其实用起来不难的。下面我只讲使用时必须会的内...
  • wytalfred
  • wytalfred
  • 2014年03月15日 22:33
  • 6142

Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)

一.什么是DTS?为什么要引入DTS?   DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。 ...
  • RadianceBlau
  • RadianceBlau
  • 2017年04月26日 14:40
  • 2767

Device Tree常用方法解析

Device Tree常用方法解析 Device Tree在Linux内核驱动中的使用源于2011年3月17日Linus Torvalds在ARM Linux邮件列表中的一封邮件,他宣称“this ...
  • airk000
  • airk000
  • 2014年03月16日 23:21
  • 18424

Linux为什么使用DeviceTree

介绍为什么使用DeviceTree介绍DeviceTree之前先看一下Linux内核中设备注册到系统的方式有哪些...
  • Lonzoc
  • Lonzoc
  • 2016年03月23日 22:27
  • 824
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARM平台device tree是如何工作的?(一)
举报原因:
原因补充:

(最多只允许输入30个字)