Androidの入力システム

Embed Size (px)

Citation preview

  • 1. Androidmagoroku15

2. IKEA 2 http://www.ustream.tv/channel/magorokutv geekbar http://www.facebook.com/nagoyageekbar 3. applicationAndroid eventHubSystem server /dev/inputLinux /dev/inputhw 4. Y 0GND,V V5vX1v,Y4v XX-MAX20%Y-MAX80% X+,X-,Y+,Y- X X-GND,X+VCC,Y- Y Y-GND,Y+VCC,X- 5. XY ADC ADC Android PMIC drivers/input/touchscreen 6. usbtouchscreen.cstatic int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt){ if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) return 0; dev->x = ((pkt[3] & 0x0F) y = ((pkt[1] & 0x0F) touch = pkt[0] & 0x01; return 1;static struct usbtouch_device_info usbtouch_dev_info[] = {} #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX [DEVTYPE_EGALAX] = { .min_xc = 0x0, .max_xc = 0x07ff, .min_yc = 0x0, .max_yc = 0x07ff, .rept_size = 16, .process_pkt = usbtouch_process_multi, .get_pkt_len = egalax_get_pkt_len, .read_data = egalax_read_data, },#endif 7. usbtouchscreen.cstatic void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,unsigned char *pkt, int len){ struct usbtouch_device_info *type = usbtouch->type;input_xxxx/dev/inputif (!type->read_data(usbtouch, pkt))return;input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch);if (swap_xy) {input_report_abs(usbtouch->input, ABS_X, usbtouch->y);input_report_abs(usbtouch->input, ABS_Y, usbtouch->x);} else {input_report_abs(usbtouch->input, ABS_X, usbtouch->x);input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);}if (type->max_press)input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);input_sync(usbtouch->input);} 8. /dev/input/usr/include/linux/input.h /dev/input/eventNopenread struct input_eventstruct input_event { struct timeval time;// __u16 type; // __u16 code; // __s32 value;//}; 9. #define EV_SYN 0x00#define EV_KEY 0x01#define EV_REL 0x02#define EV_ABS 0x03#define EV_MSC0x04#define EV_SW0x05#define EV_LED 0x11#define EV_SND0x12#define EV_REP 0x14#define EV_FF0x15#define EV_PWR0x16#define EV_FF_STATUS0x17#define EV_MAX0x1f#define EV_CNT (EV_MAX+1) 10. /dev/uinput /dev/input ioctl uinputevent/dev/input VNC 11. evntHub frameworks/base/libs/ui/EventHub.cpp frameworks/base/libs/ui/InputReader.cpp 12. EventHub.cppbool EventHub::getEvent(RawEvent* outEvent) { for (;;) { if (minputbuffer)const struct input_event& iev = mInputBufferData[mInputBufferIndex++]; :outEvent->type = iev.type;outEvent->scanCode = iev.code;: return; }read(pfd.fd, mInputBufferData,sizeof(struct input_event) * INPUT_BUFFER_SIZE);int pollResult = poll(mFDs, mFDCount, -1);}} 13. InputReader.cppvoid InputReader::loopOnce() {RawEvent rawEvent;mEventHub->getEvent(& rawEvent);process(& rawEvent);}void InputReader::consumeEvent(const RawEvent* rawEvent) {int32_t deviceId = rawEvent->deviceId;{ssize_t deviceIndex = mDevices.indexOfKey(deviceId);InputDevice* device = mDevices.valueAt(deviceIndex);if (device->isIgnored()) { //LOGD("Discarding event for ignored deviceId %d.", deviceId); return;}device->process(rawEvent);}} 14. Input 2.3 2.3 androidraw