From e3588b9d05aea7d7f64eb73e1d20aaf26d3a959a Mon Sep 17 00:00:00 2001 From: sungmin ha Date: Tue, 23 Jun 2015 19:49:45 +0900 Subject: [PATCH] keyboard: added checking-routine about whether device was realized Change-Id: I9515916648c3b52b07c4ebd0a8e0a46367c95b1f Signed-off-by: sungmin ha --- tizen/src/hw/virtio/maru_virtio_keyboard.c | 117 ++++++++++++++++++++- tizen/src/hw/virtio/maru_virtio_keyboard.h | 5 + tizen/src/skin/maruskin_operation.c | 5 - 3 files changed, 120 insertions(+), 7 deletions(-) diff --git a/tizen/src/hw/virtio/maru_virtio_keyboard.c b/tizen/src/hw/virtio/maru_virtio_keyboard.c index 745934b34d..3b8b72736b 100644 --- a/tizen/src/hw/virtio/maru_virtio_keyboard.c +++ b/tizen/src/hw/virtio/maru_virtio_keyboard.c @@ -4,9 +4,11 @@ * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd All Rights Reserved * * Contact: + * SungMin Ha * Kitae Kim * GiWoong Kim * SeokYeon Hwang + * SangHo Park * YeongKyoon Lee * * This program is free software; you can redistribute it and/or @@ -35,9 +37,103 @@ MULTI_DEBUG_CHANNEL(qemu, keyboard); -VirtIOKeyboard *vkbd; +static VirtIOKbdList *head = NULL; +static VirtIOKbdList *curr = NULL; VirtQueueElement elem; +static VirtIOKbdList* create_list(VirtIOKeyboard *vkbd) +{ + VirtIOKbdList *ptr = (VirtIOKbdList*)malloc(sizeof(VirtIOKbdList)); + if (ptr == NULL) { + ERR("Node creation failed\n"); + return NULL; + } + + ptr->vkbd = vkbd; + ptr->next = NULL; + + head = curr = ptr; + return ptr; +} + +static VirtIOKbdList* add_to_list(VirtIOKeyboard *vkbd, bool add_to_end) +{ + if (head == NULL) { + return (create_list(vkbd)); + } + + VirtIOKbdList *ptr = (VirtIOKbdList*)malloc(sizeof(VirtIOKbdList)); + if (ptr == NULL) { + ERR("Node creation failed\n"); + return NULL; + } + + ptr->vkbd = vkbd; + ptr->next = NULL; + + if (add_to_end) { + curr->next = ptr; + curr = ptr; + } else { + ptr->next = head; + head = ptr; + } + + return ptr; +} + +static VirtIOKbdList* search_in_list(VirtIOKeyboard *vkbd, VirtIOKbdList **prev) +{ + VirtIOKbdList *ptr = head; + VirtIOKbdList *tmp = NULL; + bool found = false; + + while (ptr != NULL) { + if (ptr->vkbd == vkbd) { + found = true; + break; + } else { + tmp = ptr; + ptr = ptr->next; + } + } + + if (true == found) { + if (prev) { + *prev = tmp; + } + return ptr; + } else { + return NULL; + } +} + +static int delete_from_list(VirtIOKeyboard *vkbd) +{ + VirtIOKbdList *prev = NULL; + VirtIOKbdList *del = NULL; + + del = search_in_list(vkbd, &prev); + if (del == NULL) { + return -1; + } else { + if (prev != NULL) { + prev->next = del->next; + } + + if (del == curr) { + curr = prev; + } else if (del == head) { + head = del->next; + } + } + + free(del); + del = NULL; + + return 0; +} + static void virtio_keyboard_handle(VirtIODevice *vdev, VirtQueue *vq) { VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev; @@ -117,6 +213,12 @@ void virtio_keyboard_event(int keycode) EmulKbdEvent kbdevt = {0}; int *index = NULL; + if (!curr) { + TRACE("The keyboard device is not realized.\n"); + return; + } + + VirtIOKeyboard *vkbd = curr->vkbd; if (!vkbd) { ERR("VirtIOKeyboard is NULL.\n"); return; @@ -228,7 +330,7 @@ static void virtio_keyboard_bh(void *opaque) static void virtio_keyboard_device_realize(DeviceState *dev, Error **errp) { VirtIODevice *vdev = VIRTIO_DEVICE(dev); - vkbd = VIRTIO_KEYBOARD(vdev); + VirtIOKeyboard *vkbd = VIRTIO_KEYBOARD(vdev); INFO("initialize virtio-keyboard device\n"); @@ -248,6 +350,12 @@ static void virtio_keyboard_device_realize(DeviceState *dev, Error **errp) /* bottom half */ vkbd->bh = qemu_bh_new(virtio_keyboard_bh, vkbd); + + if (curr == NULL) { + create_list(vkbd); + } else { + add_to_list(vkbd, true); + } } static void virtio_keyboard_device_unrealize(DeviceState *dev, Error **errp) @@ -255,6 +363,10 @@ static void virtio_keyboard_device_unrealize(DeviceState *dev, Error **errp) VirtIODevice *vdev = VIRTIO_DEVICE(dev); VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev; + if (delete_from_list(vkbd) != 0) { + ERR("not exist vkbd ptr!\n"); + } + INFO("destroy device\n"); if (vkbd->bh) { @@ -268,6 +380,7 @@ static void virtio_keyboard_device_unrealize(DeviceState *dev, Error **errp) static void virtio_keyboard_device_reset(VirtIODevice *vdev) { + VirtIOKeyboard *vkbd = curr->vkbd; vkbd = VIRTIO_KEYBOARD(vdev); INFO("reset keyboard device\n"); diff --git a/tizen/src/hw/virtio/maru_virtio_keyboard.h b/tizen/src/hw/virtio/maru_virtio_keyboard.h index f3296bc89a..c78075e2ff 100644 --- a/tizen/src/hw/virtio/maru_virtio_keyboard.h +++ b/tizen/src/hw/virtio/maru_virtio_keyboard.h @@ -65,6 +65,11 @@ typedef struct VirtIOKeyboard { QEMUBH *bh; } VirtIOKeyboard; +typedef struct VirtIOKbdList { + VirtIOKeyboard *vkbd; + struct VirtIOKbdList *next; +} VirtIOKbdList; + VirtIODevice *virtio_keyboard_init(DeviceState *dev); void virtio_keyboard_exit(VirtIODevice *vdev); diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index 76128a4f46..e38fd2547e 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -185,11 +185,6 @@ void do_mouse_event(int button_type, int event_type, } void do_qt_keyboard_key_event(int event_type, int keycode) { - if (is_host_keyboard_attached() == false) { - TRACE("ignore key event because keyboard device was dettached\n"); - return; - } - if (KEY_PRESSED == event_type) { TRACE("key pressed: %d\n", keycode); virtio_keyboard_event(keycode); -- 2.34.1