最近有编写一个简单的功能,就是通过底层中断来模拟一个按键返回事件
通过uevent的机制来与内核驱动进行通信,当然要模拟一个按键返回事件也可以简单在底层直接上报按键事件,这里我只是简单讲解下uevent的通信机制,其实就是通过socket通信拉,只是一些参数设置不太一样。
大家以前做过局域网通信的朋友都知道socket通信机制的一些基本原理,所以这里就不详细扯socket通信的基础理论,
先来看看底层驱动的部分代码
static void spidev_irq_work(struct work_struct *work)
{
printk("irq bottom half spidev_irq_work enter \n");
struct spidev_data* spidev = container_of(work,struct spidev_data,irq_work);
char* env_ext[2] = {"FP_EVENT=IRQ", NULL};
kobject_uevent_env(&spidev->spi->dev.kobj, KOBJ_CHANGE, env_ext);
}
如上代码,每当中断产生时构造一个uevent的事件,然后上报出去
然后我们只要在中间层去拦截捕获这些消息就可以了
我们看看中间层的代码:
struct uevent{
const char* irq_event;
const char* action;
const char* path;
const char* subsystem;
const char* firmware;
int major;
int minor;
};
int open_socket(int timeout) //这个函数主要用来创建初始化socket
{
struct sockaddr_nl local;
int sz = 1024;
int on = 1;
int skfd = 0;
JNI_LOGD("enter");
memset(&local, 0, sizeof(local));
local.nl_family = AF_NETLINK;
local.nl_pid = pthread_self() << 16 | getpid();
local.nl_groups = 0xffffffff;
skfd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
//skfd = socket(AF_UNIX,SOCK_DGRAM,0);
JNI_LOGD("skfd = %d ###############\n", skfd );
if(skfd < 0)
{
SL_JNI_LOGD("socket error");