通过Socket uevent与内核通信

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


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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uevent是Linux内核实现的一种通信机制,用于内核和用户空间之间的事件通知。而netlink是Linux内核的另一种通信机制,用于内核和用户空间之间的进程通信。 在uevent内核实现中,netlink被广泛用于发送和接收uevent消息。当某个硬件设备的状态发生变化时,比如插入或拔出设备,内核会生成相应的uevent消息,并通过netlink将消息发送给用户空间的进程进行处理。 通过netlink发送uevent消息的过程包括以下几个步骤: 1. 内核生成uevent消息,并构建一个netlink消息。 2. 内核将netlink消息通过系统调用发送给用户空间的进程。这个系统调用通常是nlmsg_multicast函数,用于向所有订阅了uevent的进程广播消息。 3. 用户空间的进程通过netlink的接口监听消息,并接收到uevent消息。 4. 用户空间的进程根据接收到的uevent消息进行相应的处理。 用户空间的程序可以使用socket内核进行netlink通信。监听uevent消息的程序通常会创建一个netlink socket,并通过bind函数将其绑定到特定的netlink家族和组。然后,程序可以通过recvmsg系统调用从socket接收消息,并通过解析收到的消息以得到uevent相关的信息。 总之,uevent内核实现的netlink是一种用于内核和用户空间之间通信的机制。通过netlink发送和接收uevent消息,内核可以将硬件设备状态变化等信息传递给用户空间的进程,以便进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值