Androidの入力システムmagoroku15 横浜市在住 会社員
近況• 最近、横浜市民になった – 6月に新横浜に引っ越し – 隔週末は名古屋に帰ります – IKEAだいすきです、カーシェア便利です• 「ぐだ生」 累計視聴者1万2千人超えた – http://www.ustream.tv/channel/m...
今日の話                          タッチスクリーンを例に各           application                          レイヤの要点を説明Android                ...
タッチスクリーンの仕組み• 基本的な構造                 Y軸 – 0点をGND,軸の終端にVを与える – 押した点の2軸の分圧値を測定 例:Vを5vとしてX軸の電圧が1v,Y軸の電圧が4vとすれ X軸  ば、X-MAXの20%...
タッチスクリーンコントローラ• タッチスクリーン自体はアナログディバイス – X軸、Y軸の分圧している – 読み取りには最低ADCが必要 – マイコンでは直接ADCにつないで制御する• Androidでは専用のコントローラで経由で接続 – PM...
usbtouchscreen.cstatic int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt){     if ((pkt[0] & EGALAX_PKT_TY...
usbtouchscreen.cstatic void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,                  unsigned char *pkt, int l...
/dev/input/usr/include/linux/input.h• 使い方  /dev/input/eventNをopen後readして、 struct input_eventを読むstruct input_event {     st...
いろいろあります#define EV_SYN         0x00#define EV_KEY         0x01#define EV_REL         0x02#define EV_ABS         0x03#defin...
すこし寄り道• /dev/uinput  – /dev/inputの逆  – 仮想入力装置をioctlで定義  – uinputにeventを書き込むと/dev/inputで読める  – VNCサーバ、センサマネージャで利用  – 展示会で自動...
evntHubと関連コード• frameworks/base/libs/ui/EventHub.cpp• frameworks/base/libs/ui/InputReader.cpp
EventHub.cppbool EventHub::getEvent(RawEvent* outEvent) {   for (;;) {     if (minputbufferが空でなかったら)        const struct i...
InputReader.cppvoid InputReader::loopOnce() {  RawEvent rawEvent;  mEventHub->getEvent(& rawEvent);  process(& rawEvent);}...
ここまで• Inputの仕組みはファイル単位で変更 2.3から?• もし、2.3対応のマウスパッチがあれば – その修正ファイルを追ってみてください – androidフレームワークのraw入力の仕組みがわかります – 内部コードへの読み替えな...
Upcoming SlideShare
Loading in …5
×

Androidの入力システム

6,333 views

Published on

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,333
On SlideShare
0
From Embeds
0
Number of Embeds
31
Actions
Shares
0
Downloads
43
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Androidの入力システム

  1. 1. Androidの入力システムmagoroku15 横浜市在住 会社員
  2. 2. 近況• 最近、横浜市民になった – 6月に新横浜に引っ越し – 隔週末は名古屋に帰ります – IKEAだいすきです、カーシェア便利です• 「ぐだ生」 累計視聴者1万2千人超えた – http://www.ustream.tv/channel/magorokutv• 名古屋geekbarも快調 – http://www.facebook.com/nagoyageekbar
  3. 3. 今日の話 タッチスクリーンを例に各 application レイヤの要点を説明Android eventHubの役割 System server /dev/inputLinux タッチスクリーンドラ ドライバ イバと/dev/inputhw 入力ディバイス タッチスクリーンの仕 組み
  4. 4. タッチスクリーンの仕組み• 基本的な構造 Y軸 – 0点をGND,軸の終端にVを与える – 押した点の2軸の分圧値を測定 例:Vを5vとしてX軸の電圧が1v,Y軸の電圧が4vとすれ X軸 ば、X-MAXの20%の位置、Y-MAXの80%の位置を押し たと判断• 4線式の場合X+,X-,Y+,Y-の4線 – X軸を読む場合 X-をGND,X+にVCC,Y-を読み取る – Y軸を読む場合 Y-をGND,Y+にVCC,X-を読み取る
  5. 5. タッチスクリーンコントローラ• タッチスクリーン自体はアナログディバイス – X軸、Y軸の分圧している – 読み取りには最低ADCが必要 – マイコンでは直接ADCにつないで制御する• Androidでは専用のコントローラで経由で接続 – PMICが兼ねる場合も多い – drivers/input/touchscreenを参照
  6. 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) << 7) | (pkt[4] & 0x7F); dev->y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F); dev->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. 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/inputの if (!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. 8. /dev/input/usr/include/linux/input.h• 使い方 /dev/input/eventNをopen後readして、 struct input_eventを読むstruct input_event { struct timeval time; //時間 __u16 type; //種別 __u16 code; // コード __s32 value; //値};
  9. 9. いろいろあります#define EV_SYN 0x00#define EV_KEY 0x01#define EV_REL 0x02#define EV_ABS 0x03#define EV_MSC 0x04#define EV_SW 0x05#define EV_LED 0x11#define EV_SND 0x12#define EV_REP 0x14#define EV_FF 0x15#define EV_PWR 0x16#define EV_FF_STATUS 0x17#define EV_MAX 0x1f#define EV_CNT (EV_MAX+1)
  10. 10. すこし寄り道• /dev/uinput – /dev/inputの逆 – 仮想入力装置をioctlで定義 – uinputにeventを書き込むと/dev/inputで読める – VNCサーバ、センサマネージャで利用 – 展示会で自動運転する時に便利
  11. 11. evntHubと関連コード• frameworks/base/libs/ui/EventHub.cpp• frameworks/base/libs/ui/InputReader.cpp
  12. 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. 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. 14. ここまで• Inputの仕組みはファイル単位で変更 2.3から?• もし、2.3対応のマウスパッチがあれば – その修正ファイルを追ってみてください – androidフレームワークのraw入力の仕組みがわかります – 内部コードへの読み替えなどの仕組みがわかります

×