system.map代碼追蹤調試

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章