[デバイスツリーノード情報の取得]

デバイスツリーとは何ですか

デバイス ツリーは、組み込み Linux でハードウェア デバイスを表現および制御するために通常使用される構造化ファイルです。これは、ハードウェア ノードを識別し、それにプロパティとデバイス ID を割り当てる一連のキーと値のペアで構成されます。ハードウェアのデバイス情報を記述したノードをデバイスノードと呼び、デバイスノードには現在のハードウェアの異なる属性が複数含まれ、同じノードの異なる属性がチェーン構造で格納されます。

キーと値のペアの形式

テキスト文字列 (ヌル終了) は二重引用符で示されます:
string-property = “a string”;
“cell” は山括弧で区切られた 32 ビットの符号なし整数です:
cell-property = <0xbeef 123 0xabcd1234>;
バイナリ データは区切られます角括弧で区切ります:
binary-property = [0x01 0x23 0x45 0x67];
異なる表現のデータはカンマを使用して結合できます:
mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>;
カンマも同様です文字列のリストを作成するには:
string-list = “red Fish”, “Blue Fish”;

カスタムデバイスノードを追加する

 mynode@0x12345678{
    compatible = "hqyj,mynode";
        astring="hello world";
    uint  =<0xaabbccdd 0x11223344>;
        binarry=[00 0c 29 7b f9 be];
        mixed ="hello",[11 22],<0x12345678>;
     };

ドライバー内のデバイス番号情報を取得する方法

デバイスツリーノード情報の取得

1. デバイス ツリー ノードの名前に従ってデバイス ツリー ノードを解析します。

struct device_node *of_find_node_by_name(struct device_node *from,
    const char *name);

2. デバイス ツリー ノードのパスに従ってデバイス ツリー ノードを解析します。

struct device_node *of_find_node_by_path(const char *path)

3. デバイス ツリー ノードの互換キーに従ってデバイス ツリー ノードを解析します。

struct device_node *of_find_compatible_node(struct device_node *from,
    const char *type, const char *compat);

デバイスツリーノードのプロパティを解析する

解析されたデバイス ツリー ノード情報構造に基づいて、指定された属性のキーと値のペアを解析します。

struct property *of_find_property(const struct device_node *np,const char *name,int *lenp)

コード例

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/device.h>
#include <linux/poll.h>
#include <linux/of.h>
struct device_node *node;
struct property *pr;
int len;
static int __init mycdev_init(void)
{
    
    
    int i;
    // 解析设备树节点
    node = of_find_node_by_path("/mynode@0x12345678");
    if (node == NULL)
    {
    
    
        printk("设备树节点信息解析失败\n");
        return -ENOENT;
    }
    pr = of_find_property(node, "astring", &len);
    printk("name = %s value = %s", pr->name, (char *)pr->value);
    
    if(len) {
    
    
        for (i = 0; i < len; i++)
        {
    
    
            printk("name=%s,value=%x\n", pr->name, ((char *)pr->value)[i]);
        }
    }
    return 0;
}
static void __exit mycdev_exit(void)
{
    
    
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

おすすめ

転載: blog.csdn.net/a1379292747/article/details/129016041