<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 設備樹組成 ## 文件類型 ~~~ .dts 是ASCII的文本格式的設備樹描述,一個.dts對應一個ARM設備,一般放在arch/arm/boot/dts下 .dtsi 類似c .h文件 是所有公用部分的提煉 dtb 被編譯后的文件能夠被linux識別 uboot也能識別 dtc是編譯 .dts為.dtb的工具 dtc源碼在 scripts/dtc/Makefile hostprogs-y:=dtc ubuntu安裝dtc sudo apt-get install device-tree-complier soc被選中 dtc會被編譯 例如: dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-frdm.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-qds.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-rdb.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1043a-qds.dtb ~~~ ## 綁定 ~~~ 在 Documentation/devicetree/bindings下有綁定有設備綁定信息介紹 ~~~ ~~~ UBoot支持設備樹 使能: #define CONFIG_OF_LIBFDT ~~~ # 根節點兼容 ~~~ compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull"; static const char * const imx6ul_dt_compat[] __initconst = { "fsl,imx6ul", "fsl,imx6ull", "fsl,imx6ulz", NULL, }; DT_MACHINE_START(IMX6UL, "Freescale i.MX6 UltraLite (Device Tree)") .map_io = imx6ul_map_io, .init_irq = imx6ul_init_irq, .init_machine = imx6ul_init_machine, .init_late = imx6ul_init_late, .dt_compat = imx6ul_dt_compat, MACHINE_END of_machine_is_compatible(const char *compat) 判斷具體電路板 ~~~ # 設備節點兼容 ~~~ static const struct of_device_id a1234_i2c_of_match[] = { {.compatible = "acme,a1234-i2c-bus", .data = (void *)&fns}, // .data附加數據 {}, } MODULE_DEVICE_TABLE(of, a1234_i2c_of_match); 熱插拔設備自動加載驅動 usb pcie platform static struct platform_driver i2c_a1234_driver = { .driver = { .name = "a1234-i2c-bus", .owner = THIS_MODULE, .of_match_table = a1234_i2c_of_match } .probe = i2c_probe .remove = i2c_remove } module_platfrom_driver(i2c_a123_driver) 注冊驅動到內核 ~~~ ## 展開module\_platfrom\_driver宏 ~~~ static int __init gpio_led_driver_init(void) { return platform_driver_register (&(gpio_led_driver)); } module_init(gpio_led_driver_init); static void __exit gpio_led_driver_exit(void) { platform_driver_unregister (&(gpio_led_driver) ); } module_exit(gpio_led_driver_exit); 展開后就是標準的注冊和刪除platfrom_driver ~~~ ## 一個驅動兼容多個設備 ~~~ 1. int of_device_is_compatible(const struct device_node *device, const char *compat) 查看設備兼容屬性 2. 設備驅動附加數據 .data static const struct of_device_id a1234_i2c_of_match[] = { {.compatible = "acme,a1234-i2c-bus", .data = (void *)&fns}, // .data附加數據 {}, } ~~~ # 設備樹常用OF操作函數 ~~~ 設備樹描述了設備的詳細信息,這些信息包括數字類型的、字符串類型的、數組類型的,我們在編寫驅動的時候需要獲取到這些信息。比如設備樹使用 reg 屬性描述了某個外設的寄存器地址為 0X02005482,長度為 0X400,我們在編寫驅動的時候需要獲取到reg屬性的0X02005482和 0X400這兩個值,然后初始化外設。Linux 內核給我們提供了一系列的函數來獲取設備樹中的節點或者屬性信息,這一系列的函數都有一個統一的前綴“of\_”,所以在很多資料里面也被叫做 OF 函數。這些 OF 函數原型都定義在include/linux/of.h文件中。 ~~~ ## 查找節點的 OF 函數 ~~~ 設備都是以節點的形式“掛”到設備樹上的,因此要想獲取這個設備的其他屬性信息,必 須先獲取到這個設備的節點。Linux 內核使用 device_node 結構體來描述一個節點,此結構體定 義在文件 include/linux/of.h 中,定義如下: 示例代碼 43.3.9.1 device_node 節點 struct device_node { const char *name; /* 節點名字 */ const char *type; /* 設備類型 */ phandle phandle; const char *full_name; /* 節點全名 */ struct fwnode_handle fwnode; struct property *properties; /* 屬性 */ struct property *deadprops; /* removed 屬性 */ struct device_node *parent; /* 父節點 */ struct device_node *child; /* 子節點 */ struct device_node *sibling; struct kobject kobj; unsigned long _flags; void *data; #if defined(CONFIG_SPARC) const char *path_component_name; unsigned int unique_id; struct of_irq_controller *irq_trans; #endif }; 與查找節點有關的 OF 函數有 5 個,我們依次來看一下 1. of_find_node_by_name 函數 of_find_node_by_name 函數通過節點名字查找指定的節點,函數原型如下: struct device_node *of_find_node_by_name(struct device_node *from, const char *name); 函數參數和返回值含義如下: from:開始查找的節點,如果為 NULL 表示從根節點開始查找整個設備樹。 name:要查找的節點名字。 返回值:找到的節點,如果為 NULL 表示查找失敗。 2 、of_find_node_by_type 函數 of_find_node_by_type 函數通過 device_type 屬性查找指定的節點,函數原型如下: struct device_node *of_find_node_by_type(struct device_node *from, const char *type) 函數參數和返回值含義如下: from:開始查找的節點,如果為 NULL 表示從根節點開始查找整個設備樹。 type:要查找的節點對應的 type 字符串,也就是 device_type 屬性值。 返回值:找到的節點,如果為 NULL 表示查找失敗。 3 、of_find_compatible_node 函數 of_find_compatible_node 函數根據 device_type 和 compatible 這兩個屬性查找指定的節點, 函數原型如下: struct device_node *of_find_compatible_node(struct device_node *from, const char *type, const char *compatible) 函數參數和返回值含義如下: from:開始查找的節點,如果為 NULL 表示從根節點開始查找整個設備樹。 type:要查找的節點對應的 type 字符串,也就是 device_type 屬性值,可以為 NULL,表示 忽略掉 device_type 屬性。 compatible :要查找的節點所對應的 compatible 屬性列表。 返回值:找到的節點,如果為 NULL 表示查找失敗 4 、of_find_matching_node_and_match 函數 of_find_matching_node_and_match 函數通過 of_device_id 匹配表來查找指定的節點,函數原 型如下: struct device_node *of_find_matching_node_and_match(struct device_node *from, const struct of_device_id *matches, const struct of_device_id **match) 函數參數和返回值含義如下: from:開始查找的節點,如果為 NULL 表示從根節點開始查找整個設備樹。 matches:of_device_id 匹配表,也就是在此匹配表里面查找節點。 match :找到的匹配的 of_device_id。 返回值:找到的節點,如果為 NULL 表示查找失敗 5 、of_find_node_by_path 函數 of_find_node_by_path 函數通過路徑來查找指定的節點,函數原型如下: inline struct device_node *of_find_node_by_path(const char *path) 函數參數和返回值含義如下: path:帶有全路徑的節點名,可以使用節點的別名,比如“/backlight”就是 backlight 這個 節點的全路徑。 返回值:找到的節點,如果為 NULL 表示查找失敗 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看