系统相关
首页 > 系统相关> > Linux的uevent事件机制

Linux的uevent事件机制

作者:互联网

原文链接:https://blog.csdn.net/qq_30624591/article/details/92439991

转自:https://blog.csdn.net/qq_30624591/article/details/92439991

uevent事件机制

Linux设计了一种uevent的机制。当有新的设备加入的时候,将设备的信息发送消息到用户态。而用户态有一个udev的进程监听这个信息。当收到信息后做一定的解析,根据解析到的结果和用户程序的配置做一些处理,也包括加载驱动程序。

内核部分,Uevent是Kobject的一部分,用于在Kobject状态发生改变时,例如增加、移除等,通知用户空间程序,主要涉及kobject.h和kobject_uevent.c两个文件,如下:

include/linux/kobject.h
lib/kobject_uevent.c

比如下面的一个HDMI插拔的uevent字符串

 {SUBSYSTEM=extcon, SEQNUM=2706, ACTION=change, DEVTYPE=hdmi_audio, STATE=HDMI=1, DEVPATH=/devices/virtual/amhdmitx/amhdmitx0/hdmi_audio, NAME=hdmitx_extcon_audio}

android层面去读取uevent事件

frameworks/base/core/jni/android_os_UEventObserver.cpp
uevent_init()  //open socket for UEventObserver
uevent_next_event(buffer, sizeof(buffer) //读取uevent事件

for (;;) {
    int length = uevent_next_event(buffer, sizeof(buffer) - 1);
    if (length <= 0) {
        return NULL;
    }
    buffer[length] = '\0';

    ALOGV("Received uevent message: %s", buffer);

    if (isMatch(buffer, length)) {
        // Assume the message is ASCII.
        jchar message[length];
        for (int i = 0; i < length; i++) {
            message[i] = buffer[i];
        }
        return env->NewString(message, length);
    }
}

frameworks/base/core/java/android/os/UEventObserver.java
创建一个UEventThread线程不停的读取消息
            while (true) {
                String message = nativeWaitForNextEvent();
                if (message != null) {
                    if (DEBUG) {
                        Log.d(TAG, message);
                    }
                    sendEvent(message);
                }
            }

amlogic平台调试的例子

标签:code,uevent,Linux,kobject,keyboard,gpio,机制,event
来源: https://blog.csdn.net/wenjin359/article/details/100535680