芯片平台:mdm9x07
第一种方法当然是用 input 事件 event。
/dev/input/event0
测试代码如下:
#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
int main()
{
int keys_fd; //按键句柄
struct input_event t;
keys_fd = open("/dev/input/event0", O_RDONLY);
if(keys_fd<=0)
{
printf("open /dev/input/event0 device error!\n");
return 0;
}
while(1)
{
if(read(keys_fd,&t,sizeof(t))==sizeof(t))
{
printf("hjb type:%d,coe:%d,value:%d,time: %d\n",t.type,t.code,t.value,t.time);
if(t.type==EV_KEY) //获取的是按键消息
{
if(t.value==1)
{
printf("key %d Pressed time: %d\n",t.code,t.time);
}
if(t.value==0) //返回值是1或者0
printf("key %d %s\n",t.code,(t.value)?"Pressed":"Released"); //1表按下,0表弹起
}
}
}
close(keys_fd);
return 0;
}
第二种方法是利用 debugfs。
首先挂载 :
mount -t debugfs none /sys/kernel/debug
在 SBL 里找到
#define PON_BASE 0x00000800
#define PMIO_PON_INT_RT_STS_ADDR (PON_BASE + 0x00000010)
那么确定了PMIC 寄存器地址了 0x00000800,那 PMIO_PON_INT_RT_STS_ADDR 是什么鬼?
被告知 PMIO_PON_INT_RT_STS_ADDR 是电源寄存器的状态 ,其值也可以判断电源按键是否按下,它地址是0x810.
echo 0x810 > /sys/kernel/debug/spmi/spmi-0/address
cat /sys/kernel/debug/spmi/spmi-0/data
就这样可以读出按键是否按下了,这种方法更适合那种拨动开关,结果如下:
/ # echo 0x810 > /sys/kernel/debug/spmi/spmi-0/address
/ # cat /sys/kernel/debug/spmi/spmi-0/data
00810 00
/ # cat /sys/kernel/debug/spmi/spmi-0/data
00810 04
当然也可以利用 debugfs 把PMIC 寄存器值全部读出来:
cd /sys/kernel/debug/spmi/spmi-0
echo 0x100 > count
echo 0x800 > address
cat data
debugfs真是个好东西,以后调试又多了一种方法了, 其实上篇 GPIO 里也用到了 debugfs,比如:
cat /sys/kernel/debug/gpio