通过Socket uevent与内核通信

本文介绍了一个通过底层中断模拟按键事件并利用uevent机制与内核驱动通信的过程。在中断触发时,驱动构造uevent事件并上报,中间层通过socket监听并解析这些事件,实现通信。代码示例展示了驱动部分如何构造uevent,以及中间层如何创建socket、接收和解析uevent消息。关键在于正确设置socket参数和处理权限问题。
摘要由CSDN通过智能技术生成

最近有编写一个简单的功能,就是通过底层中断来模拟一个按键返回事件


通过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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值