日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

奇小葩讲设备树(5/5)-- Linux设备树详解(五)设备树的使用

發布時間:2023/12/15 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 奇小葩讲设备树(5/5)-- Linux设备树详解(五)设备树的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于任何的知識來說,了解了理論的知識,知道了設備樹怎么解析用以代替傳統的范式之后,我們需要知道怎么使用設備樹。對于使用我們分兩部分,一部分是它有哪些接口,能做些什么,至于怎么編寫dts文件本章不討論。主要包括兩部分:

  • 對于設備樹,編譯和設備啟動后,怎么來查看設備樹的信息,怎么用來debug
  • 設備樹的操作函數提供了哪些接口,基本的方法有哪些
  • 1. 文件系統下的設備樹

    一部分是出現問題后,怎么用來debug,對于內核來說一切皆是文件的思想,設備樹與文件系統的關系,在Linux系統起來后,會將解析完成的設備樹導出到用戶空間。
    kernel啟動在of_init()函數中在sys/firmware/devicetree/base目錄下面為設備樹展開成sysfs的目錄和二進制屬性文件,所有的node節點就是一個目錄,所有的property屬性就是一個二進制屬性文件。

    static int __init of_init(void) {struct device_node *np;/* Create the kset, and register existing nodes */mutex_lock(&of_mutex);of_kset = kset_create_and_add("devicetree", NULL, firmware_kobj);if (!of_kset) {mutex_unlock(&of_mutex);return -ENOMEM;}for_each_of_allnodes(np)__of_attach_node_sysfs(np);mutex_unlock(&of_mutex);/* Symlink in /proc as required by userspace ABI */if (of_allnodes)proc_symlink("device-tree", NULL, "/sys/firmware/devicetree/base");return 0; } core_initcall(of_init);

    該函數比較簡單,其主要完成下面三件事情:

  • 創建/sys/firmware/devicetree/目錄
  • 遍歷所有的設備樹節點,并且在./sys/firmware/devicetree/目錄下創建對應的sysfs,以目錄結構程現的dtb文件, 根節點對應base目錄, 每一個節點對應一個目錄, 每一個屬性對應一個文件
  • 在/proc/device-tree文件軟連接到/sys/firmware/devicetree/base
  • 2. 設備樹的操作函數

    學習完了設備樹的文件系統查看方法,那么對于在源碼中去拿到設備樹的節點或者屬性信息,內核提供了那些操作函數呢?內核中開放出來的接口函數的聲明大多在include/linux/下面,關于設備樹的都是以of形式開頭的命名

    對應各個文件主要完成什么功能如下:

    文件名功能描述
    of.h提供設備樹的一般處理函數,大部分的功能函數都在該文件中
    of_address.h地址相關的函數, 比如 of_get_address(獲得reg屬性中的addr, size值)
    of_device.h設備相關的函數, 比如 of_match_device、of_device_register
    of_dma.h設備樹中DMA相關屬性的函數
    of_fdt.hdtb文件的相關操作函數,我們一般不使用
    of_gpio.hGPIO相關的函數
    of_graph.hGPU相關驅動中用到的函數, 從設備樹中獲得GPU信息
    of_iommu.hIOMMU相關函數
    of_irq.h中斷相關的函數
    of_mdio.hmdio相關的函數
    of_mtd.hmtd相關的函數
    of_net.hnet相關的函數
    of_pci.hpci相關的函數
    of_platform.h把device_node轉換為platform_device時用到的函數
    of_reserved_mem.hreserved_mem的相關函數
    • 通過compatible屬性查找指定節點
    struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compat);

    使用方法可以如下
    np = of_find_compatible_node(NULL, NULL, “fsl,imx23-digctl”);
    digctrl = of_iomap(np, 0);

    digctl: digctl@8001c000 {compatible = "fsl,imx28-digctl", "fsl,imx23-digctl";reg = <0x8001c000 0x2000>;interrupts = <89>;status = "disabled"; };
    • 通過節點名查找指定節點
    static const struct of_device_id exynos_dt_mcpm_match[] = {{ .compatible = "samsung,exynos5420" },{ .compatible = "samsung,exynos5800" },{}, };node = of_find_matching_node(NULL, exynos_dt_mcpm_match);if (!node)return -ENODEV;of_node_put(node);
    • 通過路徑查找指定節點
    struct device_node *of_find_node_by_path(const char *path);/* 參數: const char *path - 帶全路徑的節點名,也可以是節點的別名 */

    data->current_node = of_find_node_by_path("/");

    • 通過節點名查找指定節點
    sscg_np = of_find_node_by_name(NULL, "sscg");if (sscg_np == NULL) {pr_err("cannot get SSCG register node\n");return system_clk;}sscg_map = of_iomap(sscg_np, 0);if (sscg_map == NULL) {pr_err("cannot map SSCG register\n");goto out;}

    由于接口操作函數集比較多,詳細的需要看對應的函數定義。

    總結

    以上是生活随笔為你收集整理的奇小葩讲设备树(5/5)-- Linux设备树详解(五)设备树的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。