of_函数读取设备树结点
设备树描述了设备的详细信息,这些信息包括数字类型的、字符串类型的、数组类型的,我们在编写驱动的时候需要获取到这些信息。Linux 内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀“of_”,所以在很多资料里面也被叫做 OF 函数。这些 OF 函数原型都定义在include/linux/of.h 文件中。
设备树节点
. . .
{
backlight {
compatible = "pwm-backlight" ;
pwms = < & pwm1 0 5000000 > ;
brightness- levels = < 0 4 8 16 32 64 128 255 > ;
default - brightness- level = < 6 > ;
status = "okay" ;
wp- inverted ;
} ;
} ;
. . .
驱动代码
struct device_node * ofdts_node;
struct property * blprop;
int ret = 0 ;
const char * out_string;
int result = 0 ;
int mem_count = 0 ;
u32* out_values;
static int __init xxx_init ( void )
{
. . .
printk ( "\n initing.........\n" ) ;
ofdts_node = of_find_node_by_name ( NULL , "backlight" ) ;
if ( ! ofdts_node) {
printk ( "of_find_node error !\n" ) ;
return - ENODEV;
}
printk ( "of_find_node_by_name = %s\n" , ofdts_node-> name) ;
ret = of_property_read_string ( ofdts_node, "compatible" , & out_string) ;
if ( ret < 0 ) {
printk ( "oproperty_read error !\n" ) ;
return ret;
}
printk ( "of_property_read_string = %s\n" , out_string) ;
blprop = of_find_property ( ofdts_node, "status" , NULL ) ;
if ( ! blprop) {
printk ( "of_find_property error !\n" ) ;
return - ENODEV;
}
printk ( "of_find_property = %s\n" , ( char * ) blprop-> value) ;
mem_count = of_property_count_elems_of_size ( ofdts_node, "default-brightness-level" , sizeof ( u32) ) ;
if ( mem_count < 0 ) {
printk ( "fail_property_count_elems_of_size!!!\n" ) ;
return - ENODEV;
}
ret = of_property_read_u32 ( ofdts_node, "default-brightness-level" , out_values) ;
if ( ret < 0 ) {
printk ( "fail_read_u32!!!\n" ) ;
kfree ( out_values) ;
return - ENODEV;
}
printk ( "of_property_read_u32:%d\n" , * out_values) ;
mem_count = of_property_count_elems_of_size ( ofdts_node, "brightness-levels" , sizeof ( u32) ) ;
if ( mem_count < 0 ) {
printk ( "fail_property_count_elems_of_size!!!\n" ) ;
return - ENODEV;
}
ret = of_property_read_u32_array ( ofdts_node, "brightness-levels" , out_values, mem_count) ;
if ( ret < 0 ) {
printk ( "fail_read_u32!!!\n" ) ;
kfree ( out_values) ;
return - ENODEV;
}
printk ( "of_property_read_u32_array " ) ;
for ( i = 0 ; i < mem_count; i++ ) {
printk ( "%d\t" , out_values[ i] ) ;
}
. . .
}
log打印
initing.. .. .. .. .
of_find_node_by_name = backlight
of_property_read_string = pwm-backlight
of_find_property = okay
of_property_read_u32:6
of_property_read_u32_array 0 4 8 16 32 64 128 255