Linux中的设备树的作用是代替Linux3.10之前的arch/arm/xxx-mash/下面的大量的板级源文件。

设备树文件是以dts,dtsi结尾的文件。

dts中可以包含dtsi文件,

设备树文件是描述板子硬件的,和内核无关。可以通过dtc(device tree compiler)编译成dtb文件,可以连接到Linux内核中的img文件后,也可以通过boot加载到ddr中,当内核启动时会去读取的dtb中的文件。

当u-boot修改bootargs后,其实修改的是dts文件中的节点chosen节点中的bootargs

Linux内核通过of函数通过dts中的节点属性中的compatible匹配到啊一个节点。匹配好后,就会执行相应的proc函数。

 

在平台设备子系统中,分为platform_driver和platform_device,平台驱动是比较通用的驱动代码,平台设备是针对具体的哪一个板子的代码,平台设备和驱动的匹配主要通过name,dts中的compatible,使用了dts后原来的platform_device部分的代码就被dts的策略取代。首先在驱动模块的的插入函数中会有platform_drvier的注册函数,其中包括了of_match_table的函数指针指向的函数的参数就是of_match_id中,其中包含了compatible,在platform_driver注册时就去匹配dts中的compatible中的值,一样的话,就去执行prob函数指针指向的函数,dts节点中相对应的其它的属性,通过prob函数指针的参数platform_device传递进来,并在prob的函数中通过调用get_recoure_等函数接口获得这些设备节点的属性值

dts:

dtstest@1111 {
    compatile = “node_name,dttest”;
    #address-cells = <1>;
    #size-cells = <1>;
    reg = <0xxxxxxxxxx 0xy>;
};

基于设备树的匹配方式的驱动程序实例:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/of.h>
#include <linux/platform_device.h>

MODULE_LICENSE("GPL");

static int driver_probe(struct platform_device *dev)
{
    printk("platform :match o k\r\n");
    printk("resource start = 0x%x\n", dev->resource[0].start);

    printk("resource start = 0x%x\n", dev->resource[1].start);

    return 0;
}

static int driver_remove(struct platform_device *dev)
{
    printk("platform: driver remove\n");
    
    return 0;
}

static struct of_device_id platform_device_dt_table[] = {
    {.compatible = "node_name, dttest"},
    {/*as a node guard*/},
};

MODULE_DEVICE_TABLE(of, platform_device_dt_table);

struct platform_driver test_driver = {
    .probe = driver_probe,
    .remove = driver_remove,
    .driver = {
        .name = "test_device",
        .owner = THIS_MODULE,
        .of_match_table = of_match_ptr(platform_device_dt_table),
    },
};
static int __init rv1108_platform_init(void)
{
    platform_driver_register(&test_driver);
    return 0;
}

static void __exit rv1108_platform_exit(void)
{
    platform_driver_unregister(&test_driver);
}

module_init(rv1108_platform_init);
module_exit(rv1108_platform_exit);


 

 

 

 

 

 

 

 

 

Logo

更多推荐