Android事件处理分析(4)

系统底层事件处理过程

在系统启动后,Android 会通过

static const char *device_path = "/dev/input";

bool EventHub::penPlatformInput(void)

res = scan_dir(device_path);

通过下面的函数打开设备。

int EventHub::pen_device(const char *deviceName)
{
    ...
    fd = open(deviceName, O_RDWR);
    ... 
    mFDs[mFDCount].fd = fd;
    mFDs[mFDCount].events = POLLIN;
    ...
    ioctl(mFDs[mFDCount].fd, EVIOCGNAME(sizeof(devname)-1), devname);
    ...
    const char* root = getenv("ANDROID_ROOT");
    snprintf(keylayoutFilename, sizeof(keylayoutFilename),
                 "%s/usr/keylayout/%s.kl", root, tmpfn);
    ...
    device->layoutMap->load(keylayoutFilename);
    ...
}

打开设备的时候,如果 device->classes&CLASS_KEYBOARD 不等于 0 表明是键盘。

常用输入设备的定义有:

enum {
        CLASS_KEYBOARD      = 0x00000001, //键盘

CLASS_ALPHAKEY      = 0x00000002, //

CLASS_TOUCHSCREEN   = 0x00000004, //触摸屏

CLASS_TRACKBALL     = 0x00000008 //轨迹球
};

打开键盘设备的时候通过上面的 ioctl 获得设备名称,命令字 EVIOCGNAME 的定义在文件:

kernel/include/linux/input.h 中。

#define EVIOCGNAME(len)   _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */

在内核键盘驱动文件 drivers/input/keyboard/pxa27x_keypad.c 中定义了设备名称:pxa27x-keypad

static struct platform_driver pxa27x_keypad_driver = {

.probe        = pxa27x_keypad_probe,

.remove        = __devexit_p(pxa27x_keypad_remove),

.suspend    = pxa27x_keypad_suspend,

.resume        = pxa27x_keypad_resume,

.driver        = {

.name    = "pxa27x-keypad",

.owner    = THIS_MODULE,

},

};

ANDROID_ROOT 为环境变量,在android的命令模式下通过 printenv 可以知道它为: system

所以 keylayoutFilename 为:/system/usr/keylayout/pxa27x-keypad.kl

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwspjj.html