From: sungmin ha Date: Wed, 20 Mar 2013 03:12:30 +0000 (+0900) Subject: hwkey: modified virtio hwkey device X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.1~1042 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ad0a0acc10c26fd6793c1e70a9aa965f9a6257c0;p=sdk%2Femulator%2Fqemu.git hwkey: modified virtio hwkey device improved hwkey mapping Signed-off-by: Sungmin Ha --- diff --git a/package/changelog b/package/changelog index 7611dae72c..8ba16c7535 100644 --- a/package/changelog +++ b/package/changelog @@ -1,3 +1,6 @@ +* 1.5.12 +- modified virtio hwkey device and improved hwkey mapping +== Sungmin Ha 2013-03-20 * 1.5.10 - moved kvm script files from qemu-common to qemu-x86 package. == Kitae Kim 2013-03-15 diff --git a/package/pkginfo.manifest b/package/pkginfo.manifest index cab96da346..59b53ad7a7 100644 --- a/package/pkginfo.manifest +++ b/package/pkginfo.manifest @@ -1,4 +1,4 @@ -Version: 1.5.11 +Version: 1.5.12 Maintainer: Yeong-Kyoon Lee Source: emulator diff --git a/tizen/src/emul_state.h b/tizen/src/emul_state.h index 66655ccf75..4a6baf9c7e 100644 --- a/tizen/src/emul_state.h +++ b/tizen/src/emul_state.h @@ -39,8 +39,8 @@ /* keep it consistent with emulator-skin definition */ enum { - HARD_KEY_HOME = 101, - HARD_KEY_POWER = 103, + HARD_KEY_HOME = 139, + HARD_KEY_POWER = 116, HARD_KEY_VOL_UP = 115, HARD_KEY_VOL_DOWN = 114, }; diff --git a/tizen/src/hw/maru_virtio_hwkey.c b/tizen/src/hw/maru_virtio_hwkey.c index a882820e62..ac5e4bd31d 100644 --- a/tizen/src/hw/maru_virtio_hwkey.c +++ b/tizen/src/hw/maru_virtio_hwkey.c @@ -36,7 +36,6 @@ MULTI_DEBUG_CHANNEL(qemu, hwkey); - #define DEVICE_NAME "virtio-hwkey" /* @@ -59,11 +58,29 @@ static QTAILQ_HEAD(, HwKeyEventEntry) events_queue = static unsigned int event_ringbuf_cnt; /* _events_buf */ static unsigned int event_queue_cnt; /* events_queue */ +/* + * VirtQueueElement queue + */ +typedef struct ElementEntry { + unsigned int el_index; + unsigned int sg_index; + VirtQueueElement elem; + + QTAILQ_ENTRY(ElementEntry) node; +} ElementEntry; + +static ElementEntry _elem_buf[10]; +static QTAILQ_HEAD(, ElementEntry) elem_queue = + QTAILQ_HEAD_INITIALIZER(elem_queue); + +static unsigned int elem_ringbuf_cnt; /* _elem_buf */ +static unsigned int elem_queue_cnt; /* elem_queue */ + VirtIOHwKey *vhk; /* lock for between communication thread and IO thread */ static pthread_mutex_t event_mutex = PTHREAD_MUTEX_INITIALIZER; - +static pthread_mutex_t elem_mutex = PTHREAD_MUTEX_INITIALIZER; void maru_hwkey_event(int event_type, int keycode) { @@ -98,38 +115,87 @@ void maru_hwkey_event(int event_type, int keycode) entry->index, entry->hwkey.keycode, entry->hwkey.event_type); } +static void maru_virtio_hwkey_handle(VirtIODevice *vdev, VirtQueue *vq) +{ + int virt_sg_index = 0; + ElementEntry *elem_entry = NULL; + + TRACE("maru_virtio_hwkey_handle\n"); + + if (unlikely(virtio_queue_empty(vhk->vq))) { + TRACE("virtqueue is empty\n"); + return; + } + + while (true) { + elem_entry = &(_elem_buf[elem_ringbuf_cnt % 10]); + elem_ringbuf_cnt++; + + virt_sg_index = virtqueue_pop(vhk->vq, &elem_entry->elem); + if (virt_sg_index == 0) { + elem_ringbuf_cnt--; + break; + } else if (virt_sg_index < 0) { + ERR("virtqueue is broken\n"); + elem_ringbuf_cnt--; + return; + } + + pthread_mutex_lock(&elem_mutex); + + elem_entry->el_index = ++elem_queue_cnt; + elem_entry->sg_index = (unsigned int)virt_sg_index; + + /* save VirtQueueElement */ + QTAILQ_INSERT_TAIL(&elem_queue, elem_entry, node); + /* call maru_virtio_touchscreen_notify */ + qemu_bh_schedule(vhk->bh); + + pthread_mutex_unlock(&elem_mutex); + } +} + void maru_virtio_hwkey_notify(void) { HwKeyEventEntry *event_entry = NULL; + ElementEntry *elem_entry = NULL; + VirtQueueElement *element = NULL; + void *vbuf = NULL; TRACE("maru_virtio_hwkey_notify\n"); + if (unlikely(!virtio_queue_ready(vhk->vq))) { + ERR("virtio queue is not ready\n"); + return; + } + while (true) { if (event_queue_cnt == 0) { TRACE("no event\n"); break; } - /* get touch event from host queue */ - event_entry = QTAILQ_FIRST(&events_queue); - - TRACE("hwkey(%d) : keycode=%d, event_type=%d | \ - event_queue_cnt=%d\n", - event_entry->index, - event_entry->hwkey.keycode, event_entry->hwkey.event_type, - event_queue_cnt); - - /* copy event into virtio buffer */ - //memcpy(vbuf, &(event_entry->touch), sizeof(event_entry->touch)); - /* TODO: */ - if (KEY_PRESSED == event_entry->hwkey.event_type) { - ps2kbd_put_keycode(event_entry->hwkey.keycode & 0x7f); - } else if (KEY_RELEASED == event_entry->hwkey.event_type) { - ps2kbd_put_keycode(event_entry->hwkey.keycode | 0x80); - } else { - ERR("Unknown hwkey event type : keycode=%d, event_type=%d\n", - event_entry->hwkey.keycode, event_entry->hwkey.event_type); - } + elem_entry = QTAILQ_FIRST(&elem_queue); + + if ( elem_entry->sg_index > 0) { + /* get hwkey event from host queue */ + event_entry = QTAILQ_FIRST(&events_queue); + + TRACE("hwkey(%d) : keycode=%d, event_type=%d | \ + event_queue_cnt=%d\n", + event_entry->index, + event_entry->hwkey.keycode, event_entry->hwkey.event_type, + event_queue_cnt); + + element = &elem_entry->elem; + vbuf = element->in_sg[elem_entry->sg_index - 1].iov_base; + + /* copy event into virtio buffer */ + memcpy(vbuf, &(event_entry->hwkey), sizeof(EmulHwKeyEvent)); + + virtqueue_push(vhk->vq, element, sizeof(EmulHwKeyEvent)); + virtio_notify(&vhk->vdev, vhk->vq); + } pthread_mutex_lock(&event_mutex); @@ -166,8 +232,14 @@ VirtIODevice *maru_virtio_hwkey_init(DeviceState *dev) } vhk->vdev.get_features = virtio_hwkey_get_features; + vhk->vq = virtio_add_queue(&vhk->vdev, 64, maru_virtio_hwkey_handle); + vhk->qdev = dev; + /* reset the counters */ + event_queue_cnt = event_ringbuf_cnt = 0; + elem_queue_cnt = elem_ringbuf_cnt = 0; + /* bottom-half */ vhk->bh = qemu_bh_new(maru_hwkey_bh, vhk); diff --git a/tizen/src/skin/client/skins/emul-320x480/default.dbi b/tizen/src/skin/client/skins/emul-320x480/default.dbi index 112e2a7971..b904f0865f 100644 --- a/tizen/src/skin/client/skins/emul-320x480/default.dbi +++ b/tizen/src/skin/client/skins/emul-320x480/default.dbi @@ -57,7 +57,7 @@ - 101 + 139 HOME Home @@ -65,7 +65,7 @@ - 103 + 116 POWER Power diff --git a/tizen/src/skin/client/skins/emul-480x800/default.dbi b/tizen/src/skin/client/skins/emul-480x800/default.dbi index 6658fd0bfc..61bed8f7d1 100644 --- a/tizen/src/skin/client/skins/emul-480x800/default.dbi +++ b/tizen/src/skin/client/skins/emul-480x800/default.dbi @@ -14,7 +14,7 @@ - 101 + 139 HOME Home @@ -22,7 +22,7 @@ - 103 + 116 POWER Power diff --git a/tizen/src/skin/client/skins/emul-600x1024/default.dbi b/tizen/src/skin/client/skins/emul-600x1024/default.dbi index 16947ce099..dc9f9a69a1 100644 --- a/tizen/src/skin/client/skins/emul-600x1024/default.dbi +++ b/tizen/src/skin/client/skins/emul-600x1024/default.dbi @@ -14,7 +14,7 @@ - 101 + 139 HOME Home @@ -22,7 +22,7 @@ - 103 + 116 POWER Power diff --git a/tizen/src/skin/client/skins/emul-720x1280/default.dbi b/tizen/src/skin/client/skins/emul-720x1280/default.dbi index c54e83d619..0a72633419 100644 --- a/tizen/src/skin/client/skins/emul-720x1280/default.dbi +++ b/tizen/src/skin/client/skins/emul-720x1280/default.dbi @@ -14,7 +14,7 @@ - 101 + 139 HOME Home @@ -22,7 +22,7 @@ - 103 + 116 POWER Power diff --git a/tizen/src/skin/client/skins/emul-general/default.dbi b/tizen/src/skin/client/skins/emul-general/default.dbi index 0b98aecc66..82cee6484f 100644 --- a/tizen/src/skin/client/skins/emul-general/default.dbi +++ b/tizen/src/skin/client/skins/emul-general/default.dbi @@ -8,14 +8,14 @@ - 101 + 139 Home Home - 103 + 116 Power Power diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index 301c0485a4..ffb1e2f8d5 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -283,7 +283,7 @@ void do_hardkey_event(int event_type, int keycode) } } - mloop_evcmd_hwkey(event_type, keycode); + maru_hwkey_event(event_type, keycode); } void do_scale_event(double scale_factor)