Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 861|回复: 0

开发交流:Android 是如何读取按键及Touch Panel 的驱动的(一)

[复制链接]

该用户从未签到

发表于 2011-10-24 10:38:34 | 显示全部楼层 |阅读模式
一, 先看一下 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;

}

}

}
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 06:36 , Processed in 0.334052 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表