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/路径下。





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