get_device和put_device ,以及of_node_get <->of_node_put



get_device和put_device是一对相反的操作,get_device是对设备的引用数量加1,而put_device是对对象引用数减1。这个名字和popular的理解不太一样,一般getxxx应该是返回一个设备对象。




struct device *get_device(struct device *dev)
{
 return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL;
}


/**
 * put_device - decrement reference count.
 * @dev: device in question.
 */
void put_device(struct device *dev)
{
 /* might_sleep(); */
 if (dev)
  kobject_put(&dev->kobj);
}

与此同时of_node_get <->of_node_put实现了同样的上述功能。


在Linux内核中,`pio_get_from_of_node` 函数用于从设备树(Device Tree,DT)中获取特定节点的信息,特别是与GPIO(General Purpose Input/Output)相关的LED节点。这个函数通常与devicetree数据结构打交道,它是在系统启动早期加载设备树配置信息的一种方式。 要调用 `pio_get_from_of_node`,首先需要包含必要的头文件,如 `<linux/of.h>` 和 `<linux/of_gpio.h>`: ```c #include <linux/of.h> #include <linux/of_gpio.h> ``` 然后,你需要创建一个 `struct device_node *node` 指针,指向你要查询的LED节点。这通常在设备初始化或注册过程中完成,通过 `of_find_compatible_node()` 或其他查找函数找到对应的节点。 示例代码片段如下: ```c struct device_node *led_node = of_find_device_by_path("/sys/class/leds/your_led_name"); if (led_node) { struct gpio_desc *desc; int ret; /* 获取GPIO描述符 */ desc = of_get_named_gpio(led_node, "active-high", 0); // 假设"active-high"是高电平激活 if (desc) { /* 现在你可以访问GPIO资源 */ ret = gpio_request(desc->base, "led_gpio"); // 请求GPIO if (ret == 0) { // ... 使用GPIO控制LED操作 gpio_direction_output(desc->base, 1); // 设置输出并打开LED // ... } else { pr_err("Failed to request GPIO\n"); } gpio_free(desc); } else { pr_err("Failed to find LED GPIO pin\n"); } of_node_put(led_node); } else { pr_err("Failed to find LED node\n"); } ``` 这里要注意的是,实际路径 `/sys/class/leds/your_led_name` 应替换为你的LED的实际节点路径。调用成功后,你可以对GPIO进行操作,比如设置方向、读取状态等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值