平臺:高通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/路徑下。