fdt load API
从文件系统上读取设备树
void * fdt_load_from_fs ( char * dtb_filename )
参数
描述
dtb_filename
设备树文件名
返回
描述
void*
设备树在内存上的地址
从内存上读取设备树
void * fdt_load_from_memory ( void * dtb_ptr , rt_bool_t is_clone )
参数
描述
dtb_ptr
设备树在内存上的内存地址
is_clone
是否克隆到新的内存区域
返回
描述
void*
设备树在内存上的地址
fdt set API
设置Linux启动参数
rt_size_t fdt_set_linux_cmdline ( void * fdt , char * cmdline )
参数
描述
fdt
设备树指针
cmdline
启动参数
返回
描述
rt_size_t
修改设备树后设备树的大小
设置Linux init ramdisk
rt_size_t fdt_set_linux_initrd ( void * fdt , rt_uint64_t initrd_addr , rt_size_t initrd_size )
参数
描述
fdt
设备树指针
initrd_addr
init ramdisk 内存地址
initrd_size
init 大小
返回
描述
rt_size_t
修改设备树后设备树的大小
设置节点属性值
rt_size_t fdt_set_dtb_property ( void * fdt , char * pathname , char * property_name , rt_uint32_t * cells , rt_size_t cells_size );
参数
描述
fdt
设备树指针
pathname
节点路径
property_name
属性名称
cells
属性值地址
cells_size
属性值长度
返回
描述
rt_size_t
修改设备树后设备树的大小
添加保留内存
rt_size_t fdt_add_dtb_memreserve ( void * fdt , rt_uint64_t address , rt_uint64_t size )
参数
描述
fdt
设备树指针
address
保留内存起始地址
size
保留内存大小
返回
描述
rt_size_t
修改设备树后设备树的大小
删除保留内存
rt_size_t fdt_del_dtb_memreserve ( void * fdt , rt_uint64_t address )
参数
描述
fdt
设备树指针
address
保留内存起始地址
返回
描述
rt_size_t
修改设备树后设备树的大小
fdt get API
获取设备树软件包执行状态
rt_err_t fdt_get_exec_status ()
参数
描述
无
无参数
返回
描述
FDT_RET_NO_MEMORY
内存不足
FDT_RET_NO_LOADED
设备树还未加载进内存
FDT_RET_GET_OK
执行成功
FDT_RET_GET_EMPTY
读取数据为空
将原始设备树转换为设备节点树
struct dtb_node * fdt_get_dtb_list ( void * fdt )
参数
描述
fdt
设备树在内存上的地址
返回
描述
struct dtb_node *
设备节点树头指针
释放设备节点树内存
void fdt_free_dtb_list ( struct dtb_node * dtb_node_head )
参数
描述
dtb_node_head
设备节点树头节点
返回
描述
无返回值
无描述
示例:加载设备树
#include <rtthread.h>
#include <fdt.h>
int main ()
{
void * fdt = fdt_load_from_fs ( "sample.dtb" );
if ( fdt != RT_NULL )
{
struct dtb_node * dtb_node_list = fdt_get_dtb_list ( fdt );
if ( dtb_node_list != RT_NULL )
{
/* load dtb node list OK */
/* free dtb_node_list here */
fdt_free_dtb_list ( dtb_node_list );
}
rt_free ( fdt );
}
return 0 ;
}
打印设备树信息
void fdt_get_dts_dump ( struct dtb_node * dtb_node_head )
参数
描述
dtb_node_head
设备节点树头节点
返回
描述
无返回值
无描述
遍历设备节点树并使用程序定义的回调函数
void fdt_get_enum_dtb_node ( struct dtb_node * dtb_node_head , void ( * callback ( struct dtb_node * dtb_node )))
参数
描述
dtb_node_head
设备节点树头节点
callback
程序定义的回调函数
返回
描述
无返回值
无描述
示例:遍历设备树节点,并打印每个节点名称
#include <rtthread.h>
#include <fdt.h>
void callback ( struct dtb_node * node )
{
rt_kprintf ( "this node's name is %s \n " , node -> name );
}
int main ()
{
/* loaded dtb_node */
extern struct dtb_node * dtb_node_list ;
if ( dtb_node_list != RT_NULL )
{
fdt_get_enum_dtb_node ( dtb_node_list , callback );
}
return 0 ;
}
通过节点名称查找节点
struct dtb_node * fdt_get_dtb_node_by_name_DFS ( struct dtb_node * dtb_node , const char * nodename )
struct dtb_node * fdt_get_dtb_node_by_name_BFS ( struct dtb_node * dtb_node , const char * nodename )
参数
描述
dtb_node
设备节点树节点
nodename
查找节点的名称
返回
描述
struct dtb_node *
返回查找的节点
RT_NULL
未找到为RT_NULL
通过节点路径查找节点
struct dtb_node * fdt_get_dtb_node_by_path ( struct dtb_node * dtb_node , const char * pathname )
参数
描述
dtb_node
设备节点树节点
pathname
查找节点的路径
返回
描述
struct dtb_node *
返回查找的节点
RT_NULL
未找到为RT_NULL
通过节点phandle值查找节点
struct dtb_node * fdt_get_dtb_node_by_phandle_DFS ( struct dtb_node * dtb_node , phandle handle )
struct dtb_node * fdt_get_dtb_node_by_phandle_BFS ( struct dtb_node * dtb_node , phandle handle )
参数
描述
dtb_node
设备节点树节点
handle
查找节点的phandle值
返回
描述
struct dtb_node *
返回查找的节点
RT_NULL
未找到为RT_NULL
DFS和BFS是用于区分不同深度节点的搜索方法, 时间复杂度和空间复杂度都较高, 建议使用路径查找。
读取节点属性值的单位
void fdt_get_dtb_node_cells ( struct dtb_node * dtb_node , int * addr_cells , int * size_cells )
参数
描述
dtb_node
设备节点树节点
addr_cells
返回的地址块的单位( u32) 大小
size_cells
返回的尺寸块的单位( u32) 大小
返回
描述
无返回值
无描述
读取节点属性值
void * fdt_get_dtb_node_property ( struct dtb_node * dtb_node , const char * property_name , rt_size_t * property_size )
参数
描述
dtb_node
设备节点树节点
property_name
属性名称
property_size
属性大小
返回
描述
void *
无描述
RT_NULL
该设备树没有该属性
读取的值为在设备树中存储的值, CPU小端模式下可能需要使用其他API进行转换才是正确的值
读取预留内存信息
struct dtb_memreserve * fdt_get_dtb_memreserve ( struct dtb_node * dtb_node , int * memreserve_size )
参数
描述
dtb_node
设备节点树节点
memreserve_size
返回的内存信息数组长度
返回
描述
struct dtb_memreserve *
内存预留信息数组的内存地址
RT_NULL
该设备树没有预留内存信息
读取节点的状态
rt_bool_t fdt_get_dtb_node_status ( struct dtb_node * dtb_node )
参数
描述
dtb_node
设备节点树节点
返回
描述
RT_FALSE
状态为禁用
RT_TRUE
状态为使用
用于参数为字符串列表的函数
fdt_string_list ( string , ...)
读取节点compatible标志匹配
rt_bool_t fdt_get_dtb_node_compatible_match ( struct dtb_node * dtb_node , char ** compatibles )
参数
描述
dtb_node
设备节点树节点
compatibles
所有要匹配的字符串列表
返回
描述
RT_FALSE
匹配失败
RT_TRUE
匹配成功
读取属性值中的字符串
char * fdt_get_dtb_string_list_value ( void * value , int size , int index )
参数
描述
value
节点属性的内存地址
size
节点属性的尺寸
index
要读取字符串的索引
返回
描述
char *
字符串的内存地址
RT_NULL
该索引没有字符串
读取值为字符串属性下一个字符串
char * fdt_get_dtb_string_list_value_next ( void * value , void * end )
参数
描述
value
节点属性的内存地址
end
节点属性的结束地址
返回
描述
char *
字符串的内存地址
RT_NULL
没有下一个字符串
读取值为u32属性的值
rt_uint32_t fdt_get_dtb_cell_value ( void * value )
参数
描述
value
节点属性的内存地址
返回
描述
rt_uint32_t
该值小端的值
读取值为u8属性的值
rt_uint8_t fdt_get_dtb_byte_value ( void * value )
参数
描述
value
节点属性的内存地址
返回
描述
rt_uint8_t
该值小端的值
fdt foreach API
遍历属性中字符串宏
for_each_property_string ( node_ptr , property_name , str , size )
参数
描述
node_ptr
设备节点树节点
property_name
节点属性名称
str
每次遍历到的字符串
size
用于保存节点属性的尺寸
遍历属性中u32宏
for_each_property_cell ( node_ptr , property_name , value , list , size )
参数
描述
node_ptr
设备节点树节点
property_name
节点属性名称
value
每次遍历到的值
list
用于保存节点属性的值内存地址
size
用于保存节点属性的尺寸
遍历属性中u8宏
for_each_property_byte ( node_ptr , property_name , value , list , size )
参数
描述
node_ptr
设备节点树节点
property_name
节点属性名称
value
每次遍历到的值
list
用于保存节点属性的值内存地址
size
用于保存节点属性的尺寸
遍历子节点宏
for_each_node_child ( node_ptr )
遍历兄弟节点宏
for_each_node_sibling ( node_ptr )