完成设备树属性获取相关实验
通过键名获取数值相关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、设备树实现代码如下所示:
#include<linux/init.h>
#include<linux/module.h>
#include<linux/of.h>
/*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位无符号整数
};
*/
struct property *pr;
struct device_node *node;
int len,i,ret;
unsigned int val;
unsigned int array[2];
unsigned char brr[6];
const char *str;
static int __init mycdev_init(void)
{
node = of_find_node_by_path("/mynode@0x12345678");
if(NULL==node)
{
printk("of find node by path error\n");
return -EFAULT;
}
printk("of find node by path success\n");
//获取compatible属性信息--字符串
ret = of_property_read_string(node,"compatible",&str);
if(ret)
{
printk("of property read string error\n");
return -EFAULT;
}
printk("value=%s\n",str);
//获取astring属性信息--字符串
ret = of_property_read_string(node,"astring",&str);
if(ret)
{
printk("of property read string error\n");
return -EFAULT;
}
printk("value=%s\n",str);
//获取uintu信息--32位无符号整数
ret = of_property_read_variable_u32_array(node,"uint",array,2,2);
if(ret<0)
{
printk("of property read variable u32 index error\n");
return -EFAULT;
}
printk("value:%#x %#x\n",array[0],array[1]);
//获取binarry信息--二进制数据
ret = of_property_read_u8_array(node,"binarry",brr,6);
if(ret<0)
{
printk("of property read variable u32 index error\n");
return -EFAULT;
}
printk("value:=%#x %#x %#x %#x %#x %#x\n",brr[0],brr[1],brr[2],brr[3],brr[4],brr[5]);
//获取mixd信息--字符串,二进制数据,32位无符号整型
ret = of_property_read_string(node,"mixed",&str);
if(ret)
{
printk("of property read string error\n");
return -EFAULT;
}
printk("value=%s ",str);
ret = of_property_read_u8_array(node,"mixed",brr,8);
if(ret<0)
{
printk("of property read variable u32 index error\n");
return -EFAULT;
}
printk("%#x %#x ",brr[6],brr[7]);
ret = of_property_read_u32_index(node,"mixed",2,&val);
if(ret<0)
{
printk("of property read u32 index error\n");
return -EFAULT;
}
printk("%#x\n",val);
return 0;
}
static void __exit mycdev_exit(void)
{
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
4、实验现象