• 分析设备树文件


    1.设备树是干嘛的

    硬件资源有很多,想要实现分类管理,方便驱动去控制它,则需要设备树来管理硬件信息。

    所以,设备树主要存放了一些设备节点信息,键值对,和属性;节点中也可以包含子节点。

    2.设备树节点信息的获取

     有三种方法可以获取设备树信息:

    1)通过获取节点的函数---- ----  of_find_node_by_path 顾名思义通过路径获取节点信息

    成功返回目标节点的地址,失败返回NULL

     为什么调用大小端转换函数?

    因为arm架构是大端存储(低地址存储高位数据)正常的阅读习惯是千百十个,低地址存低位

     2)通过属性相关函数---struct property *of_find_property(节点地址,节点名,获取到的字节数)

     3)通过键名获取数值

    int of_property_read_u32_index(np:节点结构体指针 propname:键名 index:索引号 out_value:获取到的值 )

    返回值:成功返回0,失败返回错误码

    int of_property_read_variable_u32_array()

    int of_property_read_string

    int of_property_read_variable_u8_array

    int of_property_read_u8_array

    1. #include
    2. #include
    3. #include
    4. //定义结构体获取设备树节点信息
    5. struct device_node *node;
    6. //compatible
    7. struct device_node *compa;
    8. //定义属性结构体获取设备树节点信息
    9. struct property *pr;
    10. int i,len;
    11. //键名获取数值给到val
    12. unsigned int val;
    13. //获取u32数组
    14. unsigned int array[2];
    15. //获取u8数组
    16. char arry[6];
    17. //获取字符串给到str
    18. const char *str;
    19. int ret;
    20. static int __init mycdev_init(void)
    21. {
    22. //通过路径获取设备节点信息
    23. node=of_find_node_by_path("/mynode@0x12345678");
    24. if(node==NULL)
    25. {
    26. printk("failed\n");
    27. return -EFAULT;
    28. }
    29. printk("succeed\n");
    30. printk("name=%s,value=%s\n",node->properties->name,(char *)node->properties->value);
    31. printk("name=%s,value=%s\n",node->properties->next->name,(char *)node->properties->next->value);
    32. //32位无符号整形需要实现小端转大端再输出
    33. printk("name=%s,value=%#x,%#x\n",node->properties->name,__be32_to_cpup((int *)node->properties->next->next->value),\
    34. __be32_to_cpup((int *)node->properties->next->next->value+1));
    35. //通过compatible获取节点信息
    36. compa=of_find_compatible_node(NULL,NULL,"hqyj,mynode");
    37. if(compa==NULL)
    38. {
    39. printk("failed\n");
    40. printk("%d\n",__LINE__);
    41. return -EFAULT;
    42. }
    43. printk("succeed\n");
    44. printk("name1=%s,value1=%s\n",compa->properties->name,(char *)compa->properties->value);
    45. //1.根据属性名或节点信息结构体名解析出节点内指定名字的属性信息
    46. pr=of_find_property(node,"astring",&len);
    47. if(pr==NULL)
    48. {
    49. printk("属性解析失败\n");
    50. printk("%d\n",__LINE__);
    51. return -EFAULT;
    52. }
    53. printk("属性解析成功\n");
    54. printk("name=%s,value=%s\n",pr->name,(char *)pr->value);
    55. //解析单字节属性
    56. pr=of_find_property(node,"binarry",&len);
    57. if(pr==NULL)
    58. {
    59. printk("属性解析失败\n");
    60. printk("%d\n",__LINE__);
    61. return -EFAULT;
    62. }
    63. //循环遍历单字节属性值
    64. for(i=0;i
    65. {
    66. printk("name=%s value=%#x\n",pr->name,*((char *)pr->value+i));
    67. }
    68. //2.通过键名获取属性名
    69. //1)根据索引号index获取u32
    70. ret=of_property_read_u32_index(node,"unit",1,&val);
    71. if(ret)
    72. {
    73. printk("u32获取失败,ret=%d\n",ret);
    74. printk("%d\n",__LINE__);
    75. return -EFAULT;
    76. }
    77. printk("value=%#x\n",val);
    78. //2)获取u32数组,失败返回错误码
    79. ret=of_property_read_variable_u32_array(node,"unit",array,2,2);
    80. if(ret<0)
    81. {
    82. printk("获取u32数组失败\n");
    83. printk("%d\n",__LINE__);
    84. return -EFAULT;
    85. }
    86. printk("value:%#x %#x\n",array[0],array[1]);
    87. //3)获取u8数组1
    88. ret=of_property_read_variable_u8_array(node,"binarry",arry,6,6);
    89. if(ret<0)
    90. {
    91. printk("获取u8数组失败\n");
    92. printk("%d\n",__LINE__);
    93. return -EFAULT;
    94. }
    95. printk("binarry=[");
    96. for(i=0;i<6;i++)
    97. {
    98. printk("%#x ",arry[i]);
    99. }
    100. printk("]\n");
    101. //3)获取u8数组2
    102. ret=of_property_read_u8_array(node,"binarry",arry,6);
    103. if(ret)
    104. {
    105. printk("获取u8数组失败\n");
    106. printk("%d\n",__LINE__);
    107. return -EFAULT;
    108. }
    109. printk("binarry=[");
    110. for(i=0;i<6;i++)
    111. {
    112. printk("%#x ",arry[i]);
    113. }
    114. printk("]\n");
    115. //属性获取字符串
    116. ret=of_property_read_string(node,"astring",&str);
    117. if(ret)
    118. {
    119. printk("string not get\n");
    120. printk("%d\n",__LINE__);
    121. return -EFAULT;
    122. }
    123. printk("astring=%s\n",str);
    124. return 0;
    125. }
    126. static void __exit mycdev_exit(void)
    127. {
    128. }
    129. module_init(mycdev_init);
    130. module_exit(mycdev_exit);
    131. MODULE_LICENSE("GPL");

     打印信息:

  • 相关阅读:
    第十五届蓝桥杯物联网试题(省赛)
    数据结构-线性表
    LeeCode AutoX-4 计算几何
    [项目管理-32]:项目经理六阶段职业成长之路: 达克效应=>短板理论=>刻意练习=>长版板子理论=>精进=>布道
    2-39 JSP之EL表达式
    3.11-程序基本的控制语句 3.12-表达式 3.13-数据类型 3.14-常量/变量 3.15-标识符
    02 Redis的基本数据结构和常用命令
    从一道ctf题学习LD_PRELOAD绕过函数禁用
    openpowerlink 01
    sql中select查询大数据量表时很慢
  • 原文地址:https://blog.csdn.net/m0_68004652/article/details/128006477