《设备树 — 内核中设备树的操作函数(七)》

时间:2020-05-12
本文章向大家介绍《设备树 — 内核中设备树的操作函数(七)》,主要包括《设备树 — 内核中设备树的操作函数(七)》使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  内核中开放出来的接口函数的声明大多在include/linux/下面,关于设备树的都是以ofxxx.h形式命名

  这里介绍一下各个头文件中是关于那些的函数

of_fdt.h           // dtb文件的相关操作函数, 我们一般用不到, 因为dtb文件在内核中已经被转换为device_node树(它更易于使用)
 
b. 处理device_node
of.h               // 提供设备树的一般处理函数, 比如 of_property_read_u32(读取某个属性的u32值), of_get_child_count(获取某个device_node的子节点数)
of_address.h       // 地址相关的函数, 比如 of_get_address(获得reg属性中的addr, size值)
of_match_device(从matches数组中取出与当前设备最匹配的一项)
of_dma.h           // 设备树中DMA相关属性的函数
of_gpio.h          // GPIO相关的函数
of_graph.h         // GPU相关驱动中用到的函数, 从设备树中获得GPU信息
of_iommu.h         // 很少用到
of_irq.h           // 中断相关的函数
of_mdio.h          // MDIO (Ethernet PHY) API
of_net.h           // OF helpers for network devices. 
of_pci.h           // PCI相关函数
of_pdt.h           // 很少用到
of_reserved_mem.h  // reserved_mem的相关函数
 
c. 处理 platform_device
of_platform.h      // 把device_node转换为platform_device时用到的函数, 
                   // 比如of_device_alloc(根据device_node分配设置platform_device), 
                   //     of_find_device_by_node (根据device_node查找到platform_device),
                   //     of_platform_bus_probe (处理device_node及它的子节点)
of_device.h        // 设备相关的函数, 比如 of_match_device

  

  以of_fdt.h 头文件中举几个例子

//blob也就是启动时保留的那块存放dtb文件内存的起始地址,下面分别是从dtb文件中扫描获取信息
 
 
/* For scanning an arbitrary device-tree at any time */
extern char *of_fdt_get_string(const void *blob, u32 offset);    //从起始地址+偏移获取字符串
extern void *of_fdt_get_property(const void *blob,        //通过起始地址
				 unsigned long node,
				 const char *name,
				 int *size);
extern bool of_fdt_is_big_endian(const void *blob,        //判断某个节点是不是大端存放的
				 unsigned long node);
extern int of_fdt_match(const void *blob, unsigned long node,    //判断节点是不是匹配的
			const char *const *compat);
extern void *of_fdt_unflatten_tree(const unsigned long *blob,    //解析dtb到device_node的函数
				   struct device_node *dad,
				   struct device_node **mynodes);
 
/* TBD: Temporary export of fdt globals - remove when code fully merged */
extern int __initdata dt_root_addr_cells;    //内核dtb文件的根节点中addr-cells的值
extern int __initdata dt_root_size_cells;    //内核dtb文件的根节点中size-cells的值
extern void *initial_boot_params;            //内核存放dtb文件的地址(虚拟地址)

  

原文地址:https://www.cnblogs.com/zhuangquan/p/12877483.html