通过内核notifier chain异步通知TP切换充电模式
机制:
Linux Kernel Notifier Chain
头文件:
#include <linux/notifier.h>
步骤:
- 在事件发生地:
定义一个struct blocking_notifier_head变量
BLOCKING_NOTIFIER_HEAD(cable_state_notifier_list);
- 在事件接收地:
- 定义一个struct notifier_block变量
struct notifier_block cable_state_notif;
- 定义一个回调函数
static int cable_state_notifier_callback(struct notifier_block *self,
unsigned long cable_state, void *data)
{
fts_set_charger_mode(cable_state);
return 0;
}
- 将回调函数赋值给cable_state_notif的notifier_call指针
cable_state_notif.notifier_call = cable_state_notifier_callback;
- 将notifier_block注册到blocking_notifier_head
估计就是个链表头插入结点的动作
blocking_notifier_chain_register(&cable_state_notifier_list, & cable_state_notif);
- 在事件发生地
找一个合适的地方,在事件发生时调用函数
blocking_notifier_call_chain(&cable_state_notifier_list, cable_state, NULL);
这个估计是遍历cable_state_notifier_list,调用每个结点的callback函数
后面两个作为函数的实参
- 在事件接收地:
执行cable_state_notif.notifier_call,也就是cable_state_notifier_callback
过程就是这么个过程,原理各位自行研习就好。