hwkey: modified virtio hwkey device
authorsungmin ha <sungmin82.ha@samsung.com>
Wed, 20 Mar 2013 03:12:30 +0000 (12:12 +0900)
committersungmin ha <sungmin82.ha@samsung.com>
Wed, 20 Mar 2013 03:12:30 +0000 (12:12 +0900)
improved hwkey mapping

Signed-off-by: Sungmin Ha <sungmin82.ha@samsung.com>
package/changelog
package/pkginfo.manifest
tizen/src/emul_state.h
tizen/src/hw/maru_virtio_hwkey.c
tizen/src/skin/client/skins/emul-320x480/default.dbi
tizen/src/skin/client/skins/emul-480x800/default.dbi
tizen/src/skin/client/skins/emul-600x1024/default.dbi
tizen/src/skin/client/skins/emul-720x1280/default.dbi
tizen/src/skin/client/skins/emul-general/default.dbi
tizen/src/skin/maruskin_operation.c

index 7611dae72cb11ee77888fa4019d87c54ee99a2b6..8ba16c75359e169f774af443a65830f108c74188 100644 (file)
@@ -1,3 +1,6 @@
+* 1.5.12
+- modified virtio hwkey device and improved hwkey mapping 
+== Sungmin Ha <sungmin82.ha@samsung.com> 2013-03-20
 * 1.5.10
 - moved kvm script files from qemu-common to qemu-x86 package. 
 == Kitae Kim <kt920.kim@samsung.com> 2013-03-15
index cab96da346170f1133c0706236f61867c61146b2..59b53ad7a7bf9bb337a55333d3a81b589f596f9a 100644 (file)
@@ -1,4 +1,4 @@
-Version: 1.5.11
+Version: 1.5.12
 Maintainer: Yeong-Kyoon Lee<yeongkyoon.lee@samsung.com>
 Source: emulator
 
index 66655ccf7555df547b39c79e1360f46991d7e183..4a6baf9c7ed6666f4d3990b5d5006064ea89d63a 100644 (file)
@@ -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,
 };
index a882820e627978db432fbd44acfe25b3a90c6383..ac5e4bd31da32c14b9ddfde1adfb647d47a39354 100644 (file)
@@ -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);
 
index 112e2a797127834e88faa447493341135c5021af..b904f0865f0187468d6dcc495cc251c9b12c51b2 100644 (file)
@@ -57,7 +57,7 @@
                 <keyMap>
                     <region left="552" top="167" width="54" height="54"/>
                     <eventInfo>
-                        <keyCode>101</keyCode>
+                        <keyCode>139</keyCode>
                         <keyName>HOME</keyName>
                     </eventInfo>
                     <tooltip>Home</tooltip>
@@ -65,7 +65,7 @@
                 <keyMap>
                     <region left="486" top="3" width="70" height="15"/>
                     <eventInfo>
-                        <keyCode>103</keyCode>
+                        <keyCode>116</keyCode>
                         <keyName>POWER</keyName>
                     </eventInfo>
                     <tooltip>Power</tooltip>
index 6658fd0bfc49627369c07a9859bb3b0200040108..61bed8f7d15fc65adc28ffc6566babf9793dc7ef 100644 (file)
@@ -14,7 +14,7 @@
                 <keyMap>
                     <region left="238" top="887" width="74" height="74"/>
                     <eventInfo>
-                        <keyCode>101</keyCode>
+                        <keyCode>139</keyCode>
                         <keyName>HOME</keyName>
                     </eventInfo>
                     <tooltip>Home</tooltip>
@@ -22,7 +22,7 @@
                 <keyMap>
                     <region left="541" top="819" width="20" height="74"/>
                     <eventInfo>
-                        <keyCode>103</keyCode>
+                        <keyCode>116</keyCode>
                         <keyName>POWER</keyName>
                     </eventInfo>
                     <tooltip>Power</tooltip>
index 16947ce099d80e672bba1154e12f2bcbcadbcaf4..dc9f9a69a1efcf58e5b50f0adaddef14042c2a66 100644 (file)
@@ -14,7 +14,7 @@
                 <keyMap>
                     <region left="310" top="1139" width="84" height="84"/>
                     <eventInfo>
-                        <keyCode>101</keyCode>
+                        <keyCode>139</keyCode>
                         <keyName>HOME</keyName>
                     </eventInfo>
                     <tooltip>Home</tooltip>
@@ -22,7 +22,7 @@
                 <keyMap>
                     <region left="690" top="1055" width="24" height="88"/>
                     <eventInfo>
-                        <keyCode>103</keyCode>
+                        <keyCode>116</keyCode>
                         <keyName>POWER</keyName>
                     </eventInfo>
                     <tooltip>Power</tooltip>
index c54e83d6194da19df30432e765928db1d1d976d3..0a72633419098be10e4efb5f9dc45adffa92ad91 100644 (file)
@@ -14,7 +14,7 @@
                 <keyMap>
                     <region left="390" top="1401" width="84" height="84"/>
                     <eventInfo>
-                        <keyCode>101</keyCode>
+                        <keyCode>139</keyCode>
                         <keyName>HOME</keyName>
                     </eventInfo>
                     <tooltip>Home</tooltip>
@@ -22,7 +22,7 @@
                 <keyMap>
                     <region left="841" top="1309" width="24" height="96"/>
                     <eventInfo>
-                        <keyCode>103</keyCode>
+                        <keyCode>116</keyCode>
                         <keyName>POWER</keyName>
                     </eventInfo>
                     <tooltip>Power</tooltip>
index 0b98aecc663c0a80f8652a3e552a1b94a634ee8d..82cee6484f086130a326208087004a6dcc53e2b0 100644 (file)
@@ -8,14 +8,14 @@
             <keyMapList>
                 <keyMap>
                     <eventInfo>
-                        <keyCode>101</keyCode>
+                        <keyCode>139</keyCode>
                         <keyName>Home</keyName>
                     </eventInfo>
                     <tooltip>Home</tooltip>
                 </keyMap>
                 <keyMap>
                     <eventInfo>
-                        <keyCode>103</keyCode>
+                        <keyCode>116</keyCode>
                         <keyName>Power</keyName>
                     </eventInfo>
                     <tooltip>Power</tooltip>
index 301c0485a443f92ae12b5ee888b94ab77555760d..ffb1e2f8d532cc03024fff683a3281a192aaa440 100644 (file)
@@ -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)