linux中的设备树的理解
Linux中的设备树的作用是代替Linux3.10之前的arch/arm/xxx-mash/下面的大量的板级源文件。设备树文件是以dts,dtsi结尾的文件。dts中可以包含dtsi文件,设备树文件是描述板子硬件的,和内核无关。可以通过dtc(device tree compiler)编译成dtb文件,可以连接到Linux内核中的img文件后,也可以通过boot加载到ddr中,当内核启...
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);
更多推荐
所有评论(0)