Linux Kernel设备驱动模型之 struct device_node

本文介绍了一种用于描述设备节点的数据结构——device_node。该结构在内存中表示DTS中的节点,包含名称、类型等属性,并链接到父节点、子节点及同级节点,支持属性管理和IRQ控制器设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

严格说,此数据结构不是设备模型中的,它是一个DTS中节点对应的内存中设备描述,一般此
对象代表一个设备。

struct device_node {  const char *name;  const char *type;  phandle phandle;  const char *full_name;  struct fwnode_handle fwnode;

 struct property *properties;  struct property *deadprops; /* removed properties */  struct device_node *parent;  struct device_node *child;  struct device_node *sibling;  struct kobject kobj;  unsigned long _flags;  void *data; #if defined(CONFIG_SPARC)  const char *path_component_name;  unsigned int unique_id;  struct of_irq_controller *irq_trans; #endif };

 
 
### 关于 `struct device_driver` 的使用说明 #### 结构定义与作用 `struct device_driver` 是 Linux 设备模型的核心组成部分之一,主要用于表示设备驱动程序的信息。该结构体包含了多个字段来描述驱动的行为以及它所支持的特定操作[^4]。 ```c struct device_driver { const char *name; struct bus_type *bus; struct module *owner; const char *mod_name; int (*probe)(struct device *dev); int (*remove)(struct device *dev); void (*shutdown)(struct device *dev); // ...其他成员... }; ``` - **name**: 驱动名称,在系统中唯一标识此驱动。 - **bus**: 所属总线类型指针,表明该驱动属于哪个硬件通信协议下的设备类别。 - **owner**: 加载模块的所有者信息。 - **mod_name**: 模块名字符串常量。 - **probe/remove/shutdown**: 对应不同生命周期阶段的操作回调函数原型声明。 #### 注册过程 当创建并初始化好一个具体的 `platform_driver` 或者其他的某种类型的驱动实例之后(比如 PCI、I2C),就需要将其注册到内核当中去以便能够被发现和匹配相应的物理设备。这通常通过调用诸如 `platform_driver_register()` 来完成,而这些高层API最终会调用通用接口 `_driver_register()` 完成实际工作[^5]。 对于自定义实现来说,则可以直接利用如下方式: ```c static struct platform_driver my_platform_driver = { .probe = my_probe, .remove = my_remove, .driver = { .name = "my-device", .of_match_table = of_match_ptr(my_of_match), }, }; module_platform_driver(my_platform_driver); ``` 上述代码片段展示了如何构建一个基于平台总线(`platform`)上的简单驱动框架,并且关联了一个 Open Firmware (OF) 节点表用于自动识别兼容性的设备节点[^1]。 #### 实际应用案例分析 考虑 I2C 总线下传感器类设备的情况,这里展示了一部分关于设置其对应 `device` 属性的例子: ```c client->dev.bus = &i2c_bus_type; client->dev.type = &i2c_client_type; client->dev.of_node = info->of_node; ``` 这段代码来自某处具体场景下对 I2C 客户端对象 (`struct i2c_client`) 中嵌入式的 `struct device dev` 成员变量进行了必要的配置,使其可以正确参与到整个系统的资源管理和事件处理机制之中[^3]。 #### 初始化顺序概述 从内核启动直至所有基础服务准备就绪期间,存在一系列精心设计好的初始化步骤确保各个组件按需加载和服务可用性。其中涉及到的关键环节包括但不限于执行 `start_kernel()` 函数链路直到最后一步显式调用了全局范围内的 `driver_init()` 方法,从而正式开启了各类驱动器向核心层登记的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值