Weitere ähnliche Inhalte
Ähnlich wie Androidの入力システム (20)
Mehr von magoroku Yamamoto (20)
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-を読み取る
- 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);
}
- 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);
}
}