|
一, 先看一下 Android HAL
Class EventHub 在 $(ANDROID_DIR)/frameworks/base/include/ui/eventhub。h 定义。
i。 scan_dir(const char *dirname) // dirname = "/dev/input"
扫描 dirname 目录, 该目录下有 event0, event1 …, 等设备。
ii。 open_device(devname);
打开 /dev/input/event0, /dev/input/event1 等设备。
这里以打开 /dev/input/event0 设备为例, 分析按键的底层处理。
java代码: for (attempt = 0; attempt < 10; attempt++) {
fd = open(deviceName, O_RDWR);
if (fd >= 0) break;
usleep(100);
}
复制代码首先会打开传进来的设备. 然后会获取version, id等信息.
java代码:
if(ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
//fprintf(stderr, "could not get device name for %s, %s\n", deviceName, strerror(errno));
name[0] = '\0';
}
复制代码获取 driver name, 在这里也就是 /dev/input/evevnt0, 也就是要到 Driver 里面去读取。
这个名字很重要, 之后要与 keyboard map 相匹配。
这里返回的值是: name = "wayland_m_ebook_key_input"
为什么会返回这个值? 请看 event0 的 linux driver。
wayland_m_ebook_keypad_probe() 函数中,有以下语句:
gpio_key_input->name = "wayland_m_ebook_key_input"。
所以这个值是在这个时候设置的。
java代码: int devid = 0;
while (devid < mNumDevicesById) {
if (mDevicesById[devid].device == NULL) {
break;
}
devid++;
}
if (devid >= mNumDevicesById) {
device_ent* new_devids = (device_ent*)realloc(mDevicesById,
sizeof(mDevicesById[0]) * (devid + 1));
if (new_devids == NULL) {
LOGE("out of memory");
return -1;
}
mDevicesById = new_devids;
mNumDevicesById = devid+1;
mDevicesById[devid].device = NULL;
mDevicesById[devid].seq = 0;
}
复制代码分配 new device, 将 device 信息保存至 mDeviceById[] 数组中。
mNumDevicesById: device 的数量
mDevicesById: devive 的信息
new_mFDs = (pollfd*)realloc(mFDs, sizeof(mFDs[0]) * (mFDCount + 1));
new_devices = (device_t**)realloc(mDevices, sizeof(mDevices[0]) * (mFDCount + 1));
为 new_mFDs, mFDs 分配空间, 以备之后保存每个 event(x) 的fd。
mFDs[mFDCount]。fd = fd;
mFDs[mFDCount]。events = POLLIN;
将 fd 放到 mFDs 数组中。
java代码: // See if this is a keyboard, and classify it.
uint8_t key_bitmask[(KEY_MAX+1)/8];
memset(key_bitmask, 0, sizeof(key_bitmask));
LOGV("Getting keys...");
if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask) >= 0) {
//LOGI("MAP\n");
//for (int i=0; i<((KEY_MAX+1)/8); i++) {
// LOGI("%d: 0x%02x\n", i, key_bitmask);
//}
for (int i=0; i<((BTN_MISC+7)/8); i++) {
if (key_bitmask != 0) {
device->classes |= CLASS_KEYBOARD;
break;
}
}
if ((device->classes & CLASS_KEYBOARD) != 0) {
device->keyBitmask = new uint8_t[sizeof(key_bitmask)];
if (device->keyBitmask != NULL) {
memcpy(device->keyBitmask, key_bitmask, sizeof(key_bitmask));
} else {
delete device;
LOGE("out of memory allocating key bitmask");
return -1;
}
}
}
复制代码 |
|