平台:高通msm8916
Linux3.1.x
客户需要特定情况下设置按键在有些情况下为特殊键。需要修改驱动层的东西,当然也有其他方法。
很不巧,这个按键是电源芯片的GPIO,修改起来难度很大。这方面高通架构很少资料,自己跟踪代码分析。
1、首先查找中断 cat /proc/interrupts
实际按键,得知200f000.qcom,spmi是这个按键的中断。
2、通过“qcom,spmi”关键字寻找对应驱动spmi-pmic-arb.c。
3、找到中断函数periph_interrupt(...)
继续追踪
第一层qpnpint_handle_irq(...);
__qpnpint_handle_irq(...);
第二层:generic_handle_irq(...);
generic_handle_irq_desc(...)
{
.......
desc->handle_irq(...);
}
跟踪到这里发现一个函数指针desc->handle_irq,要找到原型,浏览了这个文件,发现不到有用线索。
想到system.map是一个内核函数表,找到地址,就可以找到函数名,索性把这个地址打出来,0xc01625ac,对应函数handle_edge_irq()
文件路径:kernel/irq/chip.c
继续跟踪
第三层:
handle_edge_irq()
handle_irq_event()
handle_irq_event_percpu()
{
...
action->handler(...);
}
又遇到一个函数指针,不知道是哪个具体函数,把这个地址打印出来0xc07078cc,对应函数是qpnp_resin_irq()
文件路径 kernel/drivers/platform/msm/qpnp-power-on.c
继续跟踪
第四层:
qpnp_resin_irq()
qpnp_on_input_dispatch()
input_report_key();
找到最终要找到的地方,input_report_key,这里我就可以按照我的想法修改按键值。
部分log:
.....................
<6>[ 38.136010] =>__pmic_arb_periph_irq,id:1,show:0
<6>[ 38.136029] generic_handle_irq_desc, desc->handle_irq:0xc01625ac
<6>[ 38.136033] handle_irq_event_percpu,action->handler:0xc07078cc
<6>[ 38.136051] qpnp_pon_input_dispatch,code:114,status2
................
System.map位于KERNEL_OBJ/路径下。