1. 程式人生 > >裝置樹中ranges屬性理解

裝置樹中ranges屬性理解

作者

彭東林
[email protected]

文章來源

正文

一、裝置樹
  • 下面是我們將要實驗的裝置樹的例子:
/ {
    #address-cells = <1>;
    #size-cells = <1>;

    demo_level0 {
        compatible = "simple-bus";
        ranges = <0x0 0x3000000 0x3000>;
        #address-cells = <1>;
        #size-cells = <1
>; [email protected]0 { compatible = "range"; reg = <0x100 0x200>; reg-names = "range0"; }; [email protected]1 { compatible = "range"; reg = <0x300 0x200>; reg-names = "range1"; };
[email protected]
2 { compatible = "range"; reg = <0x600 0x200>; reg-names = "range2"; }; demo_level1 { compatible = "simple-bus"; ranges = <0x0 0x1000 0x1000>; #address-cells = <1>; #size-cells
= <1>; [email protected]3 { compatible = "range"; reg = <0x100 0x200>; reg-names = "range3"; }; demo_level1-1 { compatible = "simple-bus"; ranges = <0x0 0x300 0x500>; #address-cells = <1>; #size-cells = <1>; ra[email protected]4 { compatible = "range"; reg = <0x100 0x200>; reg-names = "range4"; }; [email protected]5 { compatible = "range"; reg = <0x300 0x100>; reg-names = "range5"; }; demo_level1-1-1 { compatible = "simple-bus"; ranges = <0x0 0x400 0x100>; #address-cells = <1>; #size-cells = <1>; [email protected]6 { compatible = "range"; reg = <0x50 0x30>; reg-names = "range6"; }; demo_level1-1-1-1 { compatible = "simple-bus"; ranges = <0x0 0x20 0x20>; #address-cells = <1>; #size-cells = <1>; [email protected]7 { compatible = "range"; reg = <0x10 0x10>; reg-names = "range7"; }; [email protected]8 { compatible = "range"; reg = <0x0 0x10>; reg-names = "range8"; }; }; }; }; [email protected]9 { compatible = "range"; reg = <0x800 0x50>; reg-names = "range9"; }; demo_level1-2 { compatible = "simple-bus"; ranges = <0x0 0x900 0x100>; #address-cells = <1>; #size-cells = <1>; [email protected]10 { compatible = "range"; reg = <0x0 0x50>; reg-names = "range10"; }; demo_level1-2-1 { compatible = "simple-bus"; ranges; #address-cells = <1>; #size-cells = <1>; [email protected]11 { compatible = "range"; reg = <0x50 0x30>; reg-names = "range11"; }; }; }; }; demo_level2 { compatible = "simple-bus"; ranges; #address-cells = <1>; #size-cells = <1>; [email protected]12 { compatible = "range"; reg = <0x2000 0x1000>; reg-names = "range12"; }; }; } };
二、驅動
  • 下面是一個簡單的驅動,功能很簡單,只是在probe函式中將memory資源的start和(end+1)打印出來.
demo_range.c:

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

static int demo_range_probe(struct platform_device *pdev)
{
    struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

    printk(KERN_INFO "%s start: 0x%x, end: 0x%x\n",
        res->name, res->start, res->end + 1);

    return 0;
}

static int demo_range_remove(struct platform_device *pdev)
{
    return 0;
}

static const struct of_device_id demo_range_of_match[]  = {
    { .compatible = "range"},
    {},
};

static struct platform_driver demo_range_driver = {
    .driver = {
        .name = "demo_range",
        .owner = THIS_MODULE,
        .of_match_table = demo_range_of_match,
    },
    .probe = demo_range_probe,
    .remove = demo_range_remove,
};
module_platform_driver(demo_range_driver);

MODULE_LICENSE("GPL v2");
  • 在驅動中會獲得memory資源,然後將start和(end+1)打印出來,之所以這裡用(end+1),僅僅是為了便於理解下面的kernel log。
三、驗證
  • 編譯驅動,然後載入,可以看到下面的列印資訊:
[[email protected] mnt]# insmod demo_range.ko 
[  382.940402] range0 start: 0x3000100, end: 0x3000300
[  382.940697] range1 start: 0x3000300, end: 0x3000500
[  382.941448] range2 start: 0x3000600, end: 0x3000800
[  382.941657] range3 start: 0x3001100, end: 0x3001300
[  382.941855] range4 start: 0x3001400, end: 0x3001600
[  382.942057] range5 start: 0x3001600, end: 0x3001700
[  382.942262] range6 start: 0x3001750, end: 0x3001780
[  382.942470] range7 start: 0x3001730, end: 0x3001740
[  382.942684] range8 start: 0x3001720, end: 0x3001730
[  382.949796] range9 start: 0x3001800, end: 0x3001850
[  382.950023] range10 start: 0x3001900, end: 0x3001950
[  382.950603] range11 start: 0x3001950, end: 0x3001980
[  382.950805] range12 start: 0x3002000, end: 0x3003000
總結:
  • 1、ranges屬性值的格式
四、示意圖
  • 對照上面的log理解下面的框圖
    image