SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
Androidの入力システム

magoroku15 横浜市在住 会社員
近況
• 最近、横浜市民になった
 – 6月に新横浜に引っ越し
 – 隔週末は名古屋に帰ります
 – IKEAだいすきです、カーシェア便利です
• 「ぐだ生」 累計視聴者1万2千人超えた
 – http://www.ustream.tv/channel/magorokutv
• 名古屋geekbarも快調
 – http://www.facebook.com/nagoyageekbar
今日の話
                          タッチスクリーンを例に各
           application
                          レイヤの要点を説明
Android
                               eventHubの役割
          System server


           /dev/input

Linux                          タッチスクリーンドラ
            ドライバ               イバと/dev/input



hw        入力ディバイス              タッチスクリーンの仕
                               組み
タッチスクリーンの仕組み
• 基本的な構造                 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-を読み取る
タッチスクリーンコントローラ
• タッチスクリーン自体はアナログディバイス
 – X軸、Y軸の分圧している
 – 読み取りには最低ADCが必要
 – マイコンでは直接ADCにつないで制御する
• Androidでは専用のコントローラで経由で接続
 – PMICが兼ねる場合も多い
 – drivers/input/touchscreenを参照
usbtouchscreen.c
static 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
usbtouchscreen.c
static 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);
}
/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;              //値
};
いろいろあります
#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)
すこし寄り道
• /dev/uinput
  – /dev/inputの逆
  – 仮想入力装置をioctlで定義
  – uinputにeventを書き込むと/dev/inputで読める
  – VNCサーバ、センサマネージャで利用
  – 展示会で自動運転する時に便利
evntHubと関連コード
• frameworks/base/libs/ui/EventHub.cpp
• frameworks/base/libs/ui/InputReader.cpp
EventHub.cpp
bool 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);
  }
}
InputReader.cpp
void 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);
    }
}
ここまで
• Inputの仕組みはファイル単位で変更 2.3から?
• もし、2.3対応のマウスパッチがあれば
 – その修正ファイルを追ってみてください
 – androidフレームワークのraw入力の仕組みがわかります
 – 内部コードへの読み替えなどの仕組みがわかります

Más contenido relacionado

La actualidad más candente

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor Skochinsky
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor SkochinskyインテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor Skochinsky
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor SkochinskyCODE BLUE
 
Assembly Definition あれやこれ
Assembly Definition あれやこれAssembly Definition あれやこれ
Assembly Definition あれやこれNakanoYosuke1
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方wata2ki
 
Addressables で大量のリソース管理・困りどころと解消法
Addressables で大量のリソース管理・困りどころと解消法Addressables で大量のリソース管理・困りどころと解消法
Addressables で大量のリソース管理・困りどころと解消法Kenta Nagai
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-toolNaruto TAKAHASHI
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入Hiroki Tamiya
 
モンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれモンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれYusuke Shirakawa
 
UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~
UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~ UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~
UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~ masayahamazaki
 
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功CODE BLUE
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011Hiroh Satoh
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをi_yudai
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 
WebIDLを見てみる
WebIDLを見てみるWebIDLを見てみる
WebIDLを見てみるtakenspc
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングAkihiko Matuura
 

La actualidad más candente (20)

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor Skochinsky
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor SkochinskyインテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor Skochinsky
インテルMEの秘密 - チップセットに隠されたコードと、それが一体何をするかを見出す方法 - by イゴール・スコチンスキー - Igor Skochinsky
 
Assembly Definition あれやこれ
Assembly Definition あれやこれAssembly Definition あれやこれ
Assembly Definition あれやこれ
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方
 
Addressables で大量のリソース管理・困りどころと解消法
Addressables で大量のリソース管理・困りどころと解消法Addressables で大量のリソース管理・困りどころと解消法
Addressables で大量のリソース管理・困りどころと解消法
 
CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-tool
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
モンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれモンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれ
 
UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~
UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~ UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~
UIと2D/3Dと私 ~2D/3Dを混在させたUIを作ったら、とてもめんどくさかった話~
 
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
[CB19] Autopsyで迅速なマルウェアのスキャンとディスク内の簡単調査 by ターナー・功
 
【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
WebIDLを見てみる
WebIDLを見てみるWebIDLを見てみる
WebIDLを見てみる
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
 
Wireguard 実践入門
Wireguard 実践入門Wireguard 実践入門
Wireguard 実践入門
 

Similar a Androidの入力システム

デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!Masami Ichikawa
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化翔新 史
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Takefumi MIYOSHI
 
ものづくりプロジェクトII 一日でわかるArduino入門
ものづくりプロジェクトII 一日でわかるArduino入門ものづくりプロジェクトII 一日でわかるArduino入門
ものづくりプロジェクトII 一日でわかるArduino入門Yoichi Yamazaki
 
dofilewrite and vn_write
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_writekusabanachi
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
Moony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalMoony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalPacSecJP
 
インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作
インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作
インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作Takashi Yamanoue
 
Scikit-learn and TensorFlow Chap-14 RNN (v1.1)
Scikit-learn and TensorFlow Chap-14 RNN (v1.1)Scikit-learn and TensorFlow Chap-14 RNN (v1.1)
Scikit-learn and TensorFlow Chap-14 RNN (v1.1)孝好 飯塚
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaandroid sola
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題Makoto Setoh
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)ryos36
 
Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Yuki Higuchi
 
自作RISC-VチップでLチカをやってみた
自作RISC-VチップでLチカをやってみた自作RISC-VチップでLチカをやってみた
自作RISC-VチップでLチカをやってみたJunichi Akita
 

Similar a Androidの入力システム (20)

デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
 
ものづくりプロジェクトII 一日でわかるArduino入門
ものづくりプロジェクトII 一日でわかるArduino入門ものづくりプロジェクトII 一日でわかるArduino入門
ものづくりプロジェクトII 一日でわかるArduino入門
 
dofilewrite and vn_write
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_write
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
Moony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalMoony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinal
 
インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作
インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作
インターネット上のWikiページ上でエッジ側端末のI2Cデバイスの設定と入出力を可能とするIoTシステムの試作
 
Scikit-learn and TensorFlow Chap-14 RNN (v1.1)
Scikit-learn and TensorFlow Chap-14 RNN (v1.1)Scikit-learn and TensorFlow Chap-14 RNN (v1.1)
Scikit-learn and TensorFlow Chap-14 RNN (v1.1)
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
No.2 超初心者向け セキュリティ入門
No.2 超初心者向け セキュリティ入門No.2 超初心者向け セキュリティ入門
No.2 超初心者向け セキュリティ入門
 
Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.
 
自作RISC-VチップでLチカをやってみた
自作RISC-VチップでLチカをやってみた自作RISC-VチップでLチカをやってみた
自作RISC-VチップでLチカをやってみた
 

Más de magoroku Yamamoto

Más de magoroku Yamamoto (20)

Deep learning入門
Deep learning入門Deep learning入門
Deep learning入門
 
波形で見るBig.little
波形で見るBig.little波形で見るBig.little
波形で見るBig.little
 
自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction
 
Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
V6 unix vol.2 in okinawa
V6 unix vol.2 in okinawaV6 unix vol.2 in okinawa
V6 unix vol.2 in okinawa
 
Adk2012
Adk2012Adk2012
Adk2012
 
Android binder-ipc
Android binder-ipcAndroid binder-ipc
Android binder-ipc
 
V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
ぐだ生システム#2
ぐだ生システム#2ぐだ生システム#2
ぐだ生システム#2
 
ぐだ生って何
ぐだ生って何ぐだ生って何
ぐだ生って何
 
Android builders summit slide tour
Android builders summit slide tourAndroid builders summit slide tour
Android builders summit slide tour
 
第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料
 
Poorman’s adk トレーナ
Poorman’s adk トレーナPoorman’s adk トレーナ
Poorman’s adk トレーナ
 
20分でわかった事にするパワーマネジメント
20分でわかった事にするパワーマネジメント20分でわかった事にするパワーマネジメント
20分でわかった事にするパワーマネジメント
 
Poormans sdk
Poormans sdkPoormans sdk
Poormans sdk
 
Ngk2011 b
Ngk2011 bNgk2011 b
Ngk2011 b
 
オレオレ家電
オレオレ家電オレオレ家電
オレオレ家電
 
V6read#4
V6read#4V6read#4
V6read#4
 

Androidの入力システム

  • 2. 近況 • 最近、横浜市民になった – 6月に新横浜に引っ越し – 隔週末は名古屋に帰ります – IKEAだいすきです、カーシェア便利です • 「ぐだ生」 累計視聴者1万2千人超えた – http://www.ustream.tv/channel/magorokutv • 名古屋geekbarも快調 – http://www.facebook.com/nagoyageekbar
  • 3. 今日の話 タッチスクリーンを例に各 application レイヤの要点を説明 Android eventHubの役割 System server /dev/input Linux タッチスクリーンドラ ドライバ イバと/dev/input hw 入力ディバイス タッチスクリーンの仕 組み
  • 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. タッチスクリーンコントローラ • タッチスクリーン自体はアナログディバイス – X軸、Y軸の分圧している – 読み取りには最低ADCが必要 – マイコンでは直接ADCにつないで制御する • Androidでは専用のコントローラで経由で接続 – PMICが兼ねる場合も多い – drivers/input/touchscreenを参照
  • 6. usbtouchscreen.c static 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. usbtouchscreen.c static 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. /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. いろいろあります #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. すこし寄り道 • /dev/uinput – /dev/inputの逆 – 仮想入力装置をioctlで定義 – uinputにeventを書き込むと/dev/inputで読める – VNCサーバ、センサマネージャで利用 – 展示会で自動運転する時に便利
  • 12. EventHub.cpp bool 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.cpp void 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対応のマウスパッチがあれば – その修正ファイルを追ってみてください – androidフレームワークのraw入力の仕組みがわかります – 内部コードへの読み替えなどの仕組みがわかります