notifier_call(struct notifier_block *nb, unsigned long evt, void *ptr)函数运用实例
时间: 2024-03-18 19:39:33 浏览: 71
notifier_call函数是Linux内核中用于通知事件的函数,其运用实例如下:
```
static struct notifier_block nb = {
.notifier_call = my_notifier_func,
};
int register_my_notifier(void) {
return register_notifier_chain(&my_chain_head, &nb);
}
void unregister_my_notifier(void) {
unregister_notifier_chain(&my_chain_head, &nb);
}
int my_notifier_func(struct notifier_block *nb, unsigned long action, void *data) {
// 处理事件
return NOTIFY_OK;
}
```
在这个示例中,我们定义了一个notifier_block结构体对象nb,并将其notifier_call成员函数指针指向my_notifier_func函数。然后,我们将nb注册到notifier链表中,并在需要时调用my_notifier_func函数处理事件。my_notifier_func函数的参数包括notifier_block结构体指针、事件类型和事件数据,可以根据事件类型和数据来处理事件。最后,my_notifier_func函数返回NOTIFY_OK表示处理完成。
相关问题
怎么写一个psy_changed(struct notifier_block *nb, unsigned long evt, void *ptr)像系统上报插入充电器
psy_changed函数的实现可以参考以下代码:
```
static int psy_changed(struct notifier_block *nb, unsigned long evt, void *ptr)
{
struct power_supply *psy = ptr;
if (!psy || strcmp(psy->desc->name, "battery") != 0)
return NOTIFY_DONE;
if (evt == PSY_EVENT_PROP_CHANGED) {
struct power_supply_battery_info info;
if (power_supply_get_battery_info(psy, &info) == 0) {
if (info.status == POWER_SUPPLY_STATUS_CHARGING) {
// 插入充电器
// 执行相应操作
} else if (info.status == POWER_SUPPLY_STATUS_FULL) {
// 充电完成
// 执行相应操作
}
}
}
return NOTIFY_OK;
}
```
该函数是一个notifier_block的回调函数,用于处理电源相关的事件。在函数内部,通过evt参数来判断事件类型,并根据电源状态执行相应操作。通常,该函数的返回值为NOTIFY_OK表示事件已被处理,返回值为NOTIFY_DONE表示事件未被处理。
在上述代码中,我们首先判断电源是否为“battery”,然后判断事件类型是否为PSY_EVENT_PROP_CHANGED,如果是,我们通过power_supply_get_battery_info获取电池信息,然后根据电池状态执行相应操作,比如插入充电器或充电完成等。
static int psy_changed(struct notifier_block *nb, unsigned long evt, void ptr) pd->psy_nb.notifier_call = psy_changed; ret = power_supply_reg_notifier(&pd->psy_nb); if (ret) goto del_inst; / *force read initial power_supply values */ psy_changed(&pd->psy_nb, PSY_EVENT_PROP_CHANGED, pd->usb_psy); atomic_notifier_call_chain(&power_supply_notifier, PSY_EVENT_PROP_CHANGED, psy); kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);代码之间的关系
这段代码中的关系如下:
1. 首先定义了一个名为psy_changed的函数,该函数会在电源供应设备的属性变化时被调用。
2. 在代码中,pd->psy_nb.notifier_call被设置为psy_changed函数,以便在电源供应设备的属性变化时被调用。
3. 接着调用power_supply_reg_notifier函数,将pd->psy_nb注册为电源供应设备的notifier。如果注册失败,则跳转到del_inst标签处。
4. 为了强制读取电源供应设备的初始值,调用psy_changed函数,并传递PSY_EVENT_PROP_CHANGED和pd->usb_psy作为参数。
5. 接下来,调用atomic_notifier_call_chain函数,该函数会依次调用power_supply_notifier链表中的所有notifier,并传递PSY_EVENT_PROP_CHANGED和psy作为参数。
6. 最后,调用kobject_uevent函数,该函数会向用户空间发送一个内核对象的事件通知,通知用户空间有关电源供应设备的属性发生了变化。
阅读全文