• 驱动——设备树属性获取相关实验


     完成设备树属性获取相关实验

    通过键名获取数值相关API获取设备树属性

    1、要获取的属性如下所示:

    /*mynode@0x12345678{

         compatible = "hqyj,mynode";//字符串

         astring="hello 22071";//字符串

         uint  =<0xaabbccdd 0x11223344>;//32位无符号整数

         binarry=[00 0c 29 7b f9 be];//二进制数据

         mixed ="hello",[11 22],<0x12345678>;//字符串,二进制数据。32位无符号整数

      };

    */

    2、获取属性的相关API:

    ①字符串类型属性获取API:

    int of_property_read_string(const struct device_node *np, const char *propname, const char **out_string)

    功能:读取字符串类型的值

    参数:

    np:节点结构体指针

    proname:键名

    out_string:指获取到的字符串的首地址

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

     ②获取32位无符号整型的值:

    int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value)

    功能:获取32位无符号整型的值

    参数:

    np:节点结构体指针

    propname:键名

    index:索引号

    out_value:获取到的值

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

     ③获取32位无符号整型数组

    int of_property_read_variable_u32_array(const struct device_node *np, const char *propname, u32 *out_values, size_t sz_min, size_t sz_max)

    功能:获取一个u32位数组

    参数:

    np:节点结构体指针

    proname:键名

    out_values:存放数据的数组名

    sz_min:期待读取到的元素的最小个数

    sz_max:期待读取到元素的最大个数

    返回值:成功返回读取到的个数,失败返回错误码

    ④获取无符号8位类型的数组

    int of_property_read_variable_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz_min, size_t sz_max)

    作用:读取u8类型的数组

    参数:

    np:节点结构体指针

    proname:键名

    out_values:存放数据的数组名

    sz_min:期待读取到的元素的最小个数

    sz_max:期待读取到元素的最大个数

    返回值:成功返回读取到的个数,失败返回错误码

     int of_property_read_u8_array(const struct device_node *np, const char *propname, u8 *out_values, size_t sz)

    作用:读取u8类型的数组

    np:节点结构体指针

    proname:键名

    out_values:存放数据的数组名

    sz:数组成员的个数

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

     3、设备树实现代码如下所示: 

    1. #include
    2. #include
    3. #include
    4. /*mynode@0x12345678{
    5. compatible = "hqyj,mynode";//字符串
    6. astring="hello 22071";//字符串
    7. uint =<0xaabbccdd 0x11223344>;//32位无符号整数
    8. binarry=[00 0c 29 7b f9 be];//二进制数据
    9. mixed ="hello",[11 22],<0x12345678>;//字符串,二进制数据。32位无符号整数
    10. };
    11. */
    12. struct property *pr;
    13. struct device_node *node;
    14. int len,i,ret;
    15. unsigned int val;
    16. unsigned int array[2];
    17. unsigned char brr[6];
    18. const char *str;
    19. static int __init mycdev_init(void)
    20. {
    21. node = of_find_node_by_path("/mynode@0x12345678");
    22. if(NULL==node)
    23. {
    24. printk("of find node by path error\n");
    25. return -EFAULT;
    26. }
    27. printk("of find node by path success\n");
    28. //获取compatible属性信息--字符串
    29. ret = of_property_read_string(node,"compatible",&str);
    30. if(ret)
    31. {
    32. printk("of property read string error\n");
    33. return -EFAULT;
    34. }
    35. printk("value=%s\n",str);
    36. //获取astring属性信息--字符串
    37. ret = of_property_read_string(node,"astring",&str);
    38. if(ret)
    39. {
    40. printk("of property read string error\n");
    41. return -EFAULT;
    42. }
    43. printk("value=%s\n",str);
    44. //获取uintu信息--32位无符号整数
    45. ret = of_property_read_variable_u32_array(node,"uint",array,2,2);
    46. if(ret<0)
    47. {
    48. printk("of property read variable u32 index error\n");
    49. return -EFAULT;
    50. }
    51. printk("value:%#x %#x\n",array[0],array[1]);
    52. //获取binarry信息--二进制数据
    53. ret = of_property_read_u8_array(node,"binarry",brr,6);
    54. if(ret<0)
    55. {
    56. printk("of property read variable u32 index error\n");
    57. return -EFAULT;
    58. }
    59. printk("value:=%#x %#x %#x %#x %#x %#x\n",brr[0],brr[1],brr[2],brr[3],brr[4],brr[5]);
    60. //获取mixd信息--字符串,二进制数据,32位无符号整型
    61. ret = of_property_read_string(node,"mixed",&str);
    62. if(ret)
    63. {
    64. printk("of property read string error\n");
    65. return -EFAULT;
    66. }
    67. printk("value=%s ",str);
    68. ret = of_property_read_u8_array(node,"mixed",brr,8);
    69. if(ret<0)
    70. {
    71. printk("of property read variable u32 index error\n");
    72. return -EFAULT;
    73. }
    74. printk("%#x %#x ",brr[6],brr[7]);
    75. ret = of_property_read_u32_index(node,"mixed",2,&val);
    76. if(ret<0)
    77. {
    78. printk("of property read u32 index error\n");
    79. return -EFAULT;
    80. }
    81. printk("%#x\n",val);
    82. return 0;
    83. }
    84. static void __exit mycdev_exit(void)
    85. {
    86. }
    87. module_init(mycdev_init);
    88. module_exit(mycdev_exit);
    89. MODULE_LICENSE("GPL");

     4、实验现象

  • 相关阅读:
    java毕业设计宠物之家电子商务网站mybatis+源码+调试部署+系统+数据库+lw
    游戏工作室为什么要使用海外住宅IP防封?
    Linux网络环境配置:(内含:随机ip和固定ip设置方式)
    进程与线程的区别
    ChatGPT追祖寻宗:GPT-3技术报告要点解读
    常用的 DOS 命令
    最真实的大数据SQL面试题(二)
    GTC大咖论坛:数字孪生工厂为啥势在必行
    软件测试分哪几种?
    软件无线电系列——宽带中频带通采样(超外差接收体制)和射频直接带通采样定理(盲区采样定理)
  • 原文地址:https://blog.csdn.net/ww1106/article/details/128006924