《设备树 — 内核中设备树的操作函数(七)》
内核中开放出来的接口函数的声明大多在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文件的地址(虚拟地址)