From af07aba3e0339340d0fbaaf0fcfda63098265cdb Mon Sep 17 00:00:00 2001 From: Kitae Kim Date: Fri, 26 Oct 2012 16:01:03 +0900 Subject: [PATCH] virtio-keyboard: add virtio-keyboard device. Implement virtio-keyboard to replace usb-keyboard module, because of performance issue on emulator. However, virtio-keyboard menu has not enabled yet. It needs to test a lot. Signed-off-by: Kitae Kim --- hw/pci-hotplug.c | 35 ++++ hw/virtio-pci.c | 66 ++++++-- input.c | 3 +- tizen/src/Makefile.tizen | 1 + tizen/src/hw/maru_device_ids.h | 7 +- tizen/src/hw/maru_virtio_keyboard.c | 143 +++++++++++++++++ tizen/src/hw/maru_virtio_keyboard.h | 50 ++++++ tizen/src/hw/maru_virtio_touchscreen.c | 2 + tizen/src/mloop_event.c | 150 +++++++++++++++--- tizen/src/mloop_event.h | 3 + .../client/resource/icons/host_keyboard.png | Bin 0 -> 3436 bytes .../org/tizen/emulator/skin/EmulatorSkin.java | 105 ++++++++---- .../emulator/skin/comm/ICommunicator.java | 1 + .../emulator/skin/image/ImageRegistry.java | 3 +- tizen/src/skin/maruskin_operation.c | 15 +- tizen/src/skin/maruskin_operation.h | 2 + tizen/src/skin/maruskin_server.c | 30 +++- 17 files changed, 542 insertions(+), 74 deletions(-) create mode 100644 tizen/src/hw/maru_virtio_keyboard.c create mode 100644 tizen/src/hw/maru_virtio_keyboard.h create mode 100644 tizen/src/skin/client/resource/icons/host_keyboard.png diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c index 12f61fea6e..f7d8d6f1b2 100644 --- a/hw/pci-hotplug.c +++ b/hw/pci-hotplug.c @@ -232,6 +232,35 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, return dev; } +#ifdef CONFIG_MARU +static PCIDevice *qemu_pci_hot_add_keyboard(Monitor *mon, + const char *devaddr, + const char *opts) +{ + PCIDevice *dev; + PCIBus *bus; + int devfn; + + bus = pci_get_bus_devfn(&devfn, devaddr); + if (!bus) { + monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); + return NULL; + } + + if (!((BusState*)bus)->allow_hotplug) { + monitor_printf(mon, "PCI bus doesn't support hotplug\n"); + return NULL; + } + + dev = pci_create(bus, devfn, "virtio-keyboard-pci"); + if (qdev_init(&dev->qdev) < 0) { + dev = NULL; + } + + return dev; +} +#endif /* CONFIG_MARU */ + void pci_device_hot_add(Monitor *mon, const QDict *qdict) { PCIDevice *dev = NULL; @@ -255,6 +284,12 @@ void pci_device_hot_add(Monitor *mon, const QDict *qdict) dev = qemu_pci_hot_add_nic(mon, pci_addr, opts); } else if (strcmp(type, "storage") == 0) { dev = qemu_pci_hot_add_storage(mon, pci_addr, opts); +#ifdef CONFIG_MARU + } else if (strcmp(type, "keyboard") == 0) { + printf("virtio-keyboard: pci_addr %s, type %s, opts %s\n", + pci_addr, type, opts); + dev = qemu_pci_hot_add_keyboard(mon, pci_addr, opts); +#endif } else { monitor_printf(mon, "invalid type: %s\n", type); } diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 8645eddcb4..b14a77ddd7 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -31,6 +31,7 @@ #include "range.h" #ifdef CONFIG_MARU #include "../tizen/src/hw/maru_device_ids.h" +#include "../tizen/src/mloop_event.h" #endif /* from Linux's linux/virtio_pci.h */ @@ -287,10 +288,10 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val) switch (addr) { case VIRTIO_PCI_GUEST_FEATURES: - /* Guest does not negotiate properly? We have to assume nothing. */ - if (val & (1 << VIRTIO_F_BAD_FEATURE)) { + /* Guest does not negotiate properly? We have to assume nothing. */ + if (val & (1 << VIRTIO_F_BAD_FEATURE)) { val = vdev->bad_features ? vdev->bad_features(vdev) : 0; - } + } virtio_set_features(vdev, val); break; case VIRTIO_PCI_QUEUE_PFN: @@ -823,6 +824,31 @@ static int maru_virtio_touchscreen_exit_pci(PCIDevice *pci_dev) } #endif +#ifdef CONFIG_MARU +static int virtio_keyboard_init_pci(PCIDevice *pci_dev) +{ + VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); + VirtIODevice *vdev; + + mloop_evcmd_set_hostkbd(pci_dev); + vdev = virtio_keyboard_init(&pci_dev->qdev); + if (!vdev) { + return -1; + } + virtio_init_pci(proxy, vdev); + return 0; +} + +static int virtio_keyboard_exit_pci(PCIDevice *pci_dev) +{ + VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); + + virtio_pci_stop_ioeventfd(proxy); + virtio_keyboard_exit(proxy->vdev); + return virtio_exit_pci(pci_dev); +} +#endif + static PCIDeviceInfo virtio_info[] = { { @@ -910,20 +936,20 @@ static PCIDeviceInfo virtio_info[] = { .qdev.reset = virtio_pci_reset, },{ #if defined(CONFIG_MARU) && (!defined(CONFIG_DARWIN)) - .qdev.name = "virtio-gl-pci", + .qdev.name = "virtio-gl-pci", .qdev.alias = "virtio-gl", - .qdev.size = sizeof(VirtIOPCIProxy), - .init = virtio_gl_init_pci, - .exit = virtio_exit_pci, + .qdev.size = sizeof(VirtIOPCIProxy), + .init = virtio_gl_init_pci, + .exit = virtio_exit_pci, .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET, .device_id = PCI_DEVICE_ID_VIRTIO_GL, .revision = VIRTIO_PCI_ABI_VERSION, .class_id = PCI_CLASS_OTHERS, - .qdev.props = (Property[]) { - DEFINE_PROP_END_OF_LIST(), - }, - .qdev.reset = virtio_pci_reset, - },{ + .qdev.props = (Property[]) { + DEFINE_PROP_END_OF_LIST(), + }, + .qdev.reset = virtio_pci_reset, + },{ #endif #ifdef CONFIG_MARU @@ -943,6 +969,22 @@ static PCIDeviceInfo virtio_info[] = { },{ #endif +#ifdef CONFIG_MARU + .qdev.name = "virtio-keyboard-pci", + .qdev.alias = "virtio-keyboard", + .qdev.size = sizeof(VirtIOPCIProxy), + .init = virtio_keyboard_init_pci, + .exit = virtio_keyboard_exit_pci, + .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET, + .device_id = PCI_DEVICE_ID_VIRTIO_KEYBOARD, + .revision = VIRTIO_PCI_ABI_VERSION, + .class_id = PCI_CLASS_OTHERS, + .qdev.props = (Property[]) { + DEFINE_PROP_END_OF_LIST(), + }, + .qdev.reset = virtio_pci_reset, + },{ +#endif /* end of list */ } }; diff --git a/input.c b/input.c index ad57eb4699..c3bb673db9 100644 --- a/input.c +++ b/input.c @@ -57,7 +57,7 @@ void qemu_remove_kbd_event_handler(void) } #ifdef CONFIG_MARU - +/* use ps2kbd device as a hardkey device. */ void qemu_add_ps2kbd_event_handler(QEMUPutKBDEvent *func, void *opaque) { qemu_put_ps2kbd_event_opaque = opaque; @@ -76,7 +76,6 @@ void ps2kbd_put_keycode(int keycode) qemu_put_ps2kbd_event(qemu_put_ps2kbd_event_opaque, keycode); } } - #endif static void check_mode_change(void) diff --git a/tizen/src/Makefile.tizen b/tizen/src/Makefile.tizen index d4596c91d7..f898cd08bf 100755 --- a/tizen/src/Makefile.tizen +++ b/tizen/src/Makefile.tizen @@ -89,6 +89,7 @@ obj-i386-y += maru_pm.o obj-i386-y += maru_vga.o obj-i386-y += maru_brightness.o obj-i386-y += maru_usb_touchscreen.o maru_virtio_touchscreen.o +obj-i386-y += maru_virtio_keyboard.o # FIXME: camera disabled ifndef CONFIG_DARWIN diff --git a/tizen/src/hw/maru_device_ids.h b/tizen/src/hw/maru_device_ids.h index 9d61c6e3e0..0049917684 100644 --- a/tizen/src/hw/maru_device_ids.h +++ b/tizen/src/hw/maru_device_ids.h @@ -47,8 +47,9 @@ #define PCI_DEVICE_ID_VIRTUAL_BRIGHTNESS 0x1014 #define PCI_DEVICE_ID_VIRTUAL_CAMERA 0x1018 #define PCI_DEVICE_ID_VIRTUAL_CODEC 0x101C -// Device ID 0x1000 through 0x103F inclusive is a virtio device +/* Device ID 0x1000 through 0x103F inclusive is a virtio device */ #define PCI_DEVICE_ID_VIRTIO_TOUCHSCREEN 0x101D +#define PCI_DEVICE_ID_VIRTIO_KEYBOARD 0x1020 /* Virtio */ /* @@ -77,7 +78,7 @@ | 10 | mac80211 wlan | - | +----------------------+--------------------+---------------+ */ -#define VIRTIO_ID_TOUCHSCREEN 11 - +#define VIRTIO_ID_TOUCHSCREEN 11 +#define VIRTIO_ID_KEYBOARD 12 #endif /* MARU_DEVICE_IDS_H_ */ diff --git a/tizen/src/hw/maru_virtio_keyboard.c b/tizen/src/hw/maru_virtio_keyboard.c new file mode 100644 index 0000000000..28ba0d9c66 --- /dev/null +++ b/tizen/src/hw/maru_virtio_keyboard.c @@ -0,0 +1,143 @@ +/* + * Virtio Keyboard Device + * + * Copyright (c) 2011 - 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: + * Kitae Kim + * SeokYeon Hwang + * YeongKyoon Lee + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +#include "console.h" +#include "mloop_event.h" +#include "maru_device_ids.h" +#include "maru_virtio_keyboard.h" +#include "tizen/src/debug_ch.h" + +MULTI_DEBUG_CHANNEL(qemu, virtio-kbd); + +#define VIRTIO_KBD_DEVICE_NAME "virtio-keyboard" + +typedef struct EmulKbdEvent +{ + uint16_t code; + uint16_t type; +} EmulKbdEvent; + +typedef struct VirtIOKeyboard +{ + VirtIODevice vdev; + VirtQueue *vq; + DeviceState *qdev; + EmulKbdEvent kbdevent; +} VirtIOKeyboard; + +VirtQueueElement elem; + +static void virtio_keyboard_handle (VirtIODevice *vdev, VirtQueue *vq) +{ + VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev; + + INFO("virtqueue keyboard handler.\n"); + if (virtio_queue_empty(vkbd->vq)) { + INFO("virtio_keyboard: virtqueue is empty.\n"); + return; + } + + /* Get a queue buffer which is written by guest side. */ + virtqueue_pop(vq, &elem); +} + +void virtio_keyboard_notify (void *opaque) +{ + VirtIOKeyboard *vkbd = (VirtIOKeyboard *)opaque; + int len = 0; + + len = sizeof(EmulKbdEvent); + + INFO("virtio_keyboard_notify: code:%d, type:%d\n", + vkbd->kbdevent.code, vkbd->kbdevent.type); + + if (!virtio_queue_ready(vkbd->vq)) { + INFO("virtio_keyboard: virtqueue is not ready.\n"); + return; + } + + /* Copy keyboard data into guest side. */ + memcpy(elem.in_sg[0].iov_base, &vkbd->kbdevent, len); + + virtqueue_push(vkbd->vq, &elem, len); + virtio_notify(&vkbd->vdev, vkbd->vq); +} + +static void virtio_keyboard_event (void *opaque, int keycode) +{ + VirtIOKeyboard *vkbd = opaque; + + if (!(keycode & 0x80)) { + vkbd->kbdevent.type = 1; /* KEY_PRESSED */ + } else { + vkbd->kbdevent.type = 0; /* KEY_RELEASED */ + } + vkbd->kbdevent.code = keycode & 0x7f; + + INFO("virito_keycode_event: keycode:%d, type:%d\n", + vkbd->kbdevent.code, vkbd->kbdevent.type); + + mloop_evcmd_keyboard(vkbd); +} + +static uint32_t virtio_keyboard_get_features (VirtIODevice *vdev, + uint32_t request_feature) +{ + INFO("virito_keycode_get_features.\n"); + return 0; +} + +VirtIODevice *virtio_keyboard_init(DeviceState *dev) +{ + VirtIOKeyboard *kbd; + INFO("initialize virtio keyboard device\n"); + + kbd = (VirtIOKeyboard *)virtio_common_init(VIRTIO_KBD_DEVICE_NAME, + VIRTIO_ID_KEYBOARD, 0, sizeof(VirtIOKeyboard)); + + if (kbd == NULL) { + ERR("failed to initialize the touchscreen device\n"); + return NULL; + } + + kbd->vdev.get_features = virtio_keyboard_get_features; + kbd->vq = virtio_add_queue(&kbd->vdev, 64, virtio_keyboard_handle); + kbd->qdev = dev; + + /* register keyboard handler */ + qemu_add_kbd_event_handler(virtio_keyboard_event, kbd); + + return &kbd->vdev; +} + +void virtio_keyboard_exit(VirtIODevice *vdev) +{ + INFO("destroy virtio keyboard device\n"); + virtio_cleanup(vdev); +} diff --git a/tizen/src/hw/maru_virtio_keyboard.h b/tizen/src/hw/maru_virtio_keyboard.h new file mode 100644 index 0000000000..0e4196e8f2 --- /dev/null +++ b/tizen/src/hw/maru_virtio_keyboard.h @@ -0,0 +1,50 @@ +/* + * Virtio Keyboard Device + * + * Copyright (c) 2011 - 2012 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: + * Kitae Kim + * SeokYeon Hwang + * YeongKyoon Lee + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +#ifndef VIRTIO_KEYBOARD_H_ +#define VIRTIO_KEYBOARD_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "hw.h" +#include "virtio.h" + +VirtIODevice *virtio_keyboard_init(DeviceState *dev); + +void virtio_keyboard_exit(VirtIODevice *vdev); + +void virtio_keyboard_notify (void *opaque); + +#ifdef __cplusplus +} +#endif + +#endif /* VIRTIO_KEYBOARD_H_ */ diff --git a/tizen/src/hw/maru_virtio_touchscreen.c b/tizen/src/hw/maru_virtio_touchscreen.c index 42b11df7e0..e7b1f4e16f 100644 --- a/tizen/src/hw/maru_virtio_touchscreen.c +++ b/tizen/src/hw/maru_virtio_touchscreen.c @@ -152,6 +152,8 @@ static void maru_virtio_touchscreen_handle(VirtIODevice *vdev, VirtQueue *vq) int sg_index = 0; ElementEntry *elem_entry = NULL; + TRACE("maru_virtio_touchscreen_handle\n"); + if (unlikely(virtio_queue_empty(ts->vq))) { TRACE("virtqueue is empty\n"); return; diff --git a/tizen/src/mloop_event.c b/tizen/src/mloop_event.c index aadb33a97b..ee17346d2d 100644 --- a/tizen/src/mloop_event.c +++ b/tizen/src/mloop_event.c @@ -41,8 +41,11 @@ #include "mloop_event.h" #include "console.h" #include "emul_state.h" +#include "tizen/src/debug_ch.h" +#include "monitor.h" +#include "pci.h" -#define error_report(x, ...) +MULTI_DEBUG_CHANNEL(qemu, mloop_event); struct mloop_evsock { int sockno; @@ -69,7 +72,9 @@ struct mloop_evpack { #define MLOOP_EVTYPE_INTR_DOWN 4 #define MLOOP_EVTYPE_HWKEY 5 #define MLOOP_EVTYPE_TOUCH 6 - +#define MLOOP_EVTYPE_KEYBOARD 7 +#define MLOOP_EVTYPE_KBD_ADD 8 +#define MLOOP_EVTYPE_KBD_DEL 9 static struct mloop_evsock mloop = {-1, 0, 0}; @@ -81,13 +86,13 @@ static int mloop_evsock_create(struct mloop_evsock *ev) unsigned long nonblock = 1; if (ev == NULL) { - error_report("mloop_evsock: null point"); + ERR("null pointer\n"); return -1; } ev->sockno = socket(AF_INET, SOCK_DGRAM, 0); - if( ev->sockno == -1 ) { - error_report("mloop_evsock: socket() failed"); + if ( ev->sockno == -1 ) { + ERR("socket() failed\n"); return -1; } @@ -108,7 +113,7 @@ static int mloop_evsock_create(struct mloop_evsock *ev) ret = bind(ev->sockno, &sa, sa_size); if (ret) { - error_report("mloop_evsock: bind() failed"); + ERR("bind() failed\n"); goto mloop_evsock_init_cleanup; } @@ -120,7 +125,7 @@ static int mloop_evsock_create(struct mloop_evsock *ev) ret = connect(ev->sockno, (struct sockaddr *) &sa, sa_size); if (ret) { - error_report("mloop_evsock: connect() failed"); + ERR("connect() failed\n"); goto mloop_evsock_init_cleanup; } @@ -162,12 +167,12 @@ static int mloop_evsock_send(struct mloop_evsock *ev, struct mloop_evpack *p) int ret; if (ev == NULL || ev->sockno == -1) { - error_report("invalid mloop_evsock"); + ERR("invalid mloop_evsock\n"); return -1; } if (p == NULL || p->size <= 0) { - error_report("invalid mloop_evpack"); + ERR("invalid mloop_evpack\n"); return -1; } @@ -184,30 +189,34 @@ static int mloop_evsock_send(struct mloop_evsock *ev, struct mloop_evpack *p) static USBDevice *usbkbd = NULL; static USBDevice *usbdisk = NULL; +static PCIDevice *hostkbd = NULL; + static void mloop_evhandle_usb_add(char *name) { if (name == NULL) { + ERR("Packet data for usb device is NULL\n"); return; } if (strcmp(name, "keyboard") == 0) { if (usbkbd == NULL) { usbkbd = usbdevice_create(name); - } - else if (usbkbd->attached == 0) { + } else if (usbkbd->attached == 0) { usb_device_attach(usbkbd); } - } - else if (strncmp(name, "disk:", 5) == 0) { + } else if (strncmp(name, "disk:", 5) == 0) { if (usbdisk == NULL) { usbdisk = usbdevice_create(name); } - } + } else { + WARN("There is no usb-device for %s.\n", name); + } } static void mloop_evhandle_usb_del(char *name) { if (name == NULL) { + ERR("Packet data for usb device is NULL\n"); return; } @@ -215,11 +224,12 @@ static void mloop_evhandle_usb_del(char *name) if (usbkbd && usbkbd->attached != 0) { usb_device_detach(usbkbd); } - } - else if (strncmp(name, "disk:", 5) == 0) { + } else if (strncmp(name, "disk:", 5) == 0) { if (usbdisk) { qdev_free(&usbdisk->qdev); } + } else { + WARN("There is no usb-device for %s.\n", name); } } @@ -267,6 +277,77 @@ static void mloop_evhandle_touch(struct mloop_evpack* pack) maru_virtio_touchscreen_notify(); } +static void mloop_evhandle_keyboard(long data) +{ + virtio_keyboard_notify((void*)data); +} + +static void mloop_evhandle_kbd_add(char *name) +{ + TRACE("mloop_evhandle_kbd_add\n"); + + if (name == NULL) { + ERR("packet data is NULL.\n"); + return; + } + + if (strcmp(name, "keyboard") == 0) { + QDict *qdict = qdict_new(); + + qdict_put(qdict, "pci_addr", qstring_from_str("auto")); + qdict_put(qdict, "type", qstring_from_str(name)); + + TRACE("hot_add keyboard device.\n"); + pci_device_hot_add(cur_mon, qdict); + + if (hostkbd) { + TRACE("virtio-keyboard device: domain %d, bus %d, slot %d, function %d\n", + pci_find_domain(hostkbd->bus), pci_bus_num(hostkbd->bus), + PCI_SLOT(hostkbd->devfn), PCI_FUNC(hostkbd->devfn)); + } else { + ERR("failed to hot_add keyboard device.\n"); + } + + QDECREF(qdict); + } else { + WARN("There is no %s device.\n", name); + } +} + +static void mloop_evhandle_kbd_del(char *name) +{ + TRACE("mloop_evhandle_kbd_del\n"); + + if (name == NULL) { + ERR("packet data is NULL.\n"); + return; + } + + if (strcmp(name, "keyboard") == 0) { + QDict *qdict = qdict_new(); + int slot = 0; + char slotbuf[4] = {0,}; + + if (hostkbd) { + slot = PCI_SLOT(hostkbd->devfn); + snprintf(slotbuf, sizeof(slotbuf), "%x", slot); + TRACE("virtio-keyboard slot %s.\n", slotbuf); + } else { + ERR("failed to hot_remove keyboard because hostkbd is NULL.\n"); + return; + } + + qdict_put(qdict, "pci_addr", qstring_from_str(slotbuf)); + + TRACE("hot_remove keyboard.\n"); + do_pci_device_hot_remove(cur_mon, qdict); + + QDECREF(qdict); + } else { + WARN("There is no %s device.\n", name); + } +} + static void mloop_evcb_recv(struct mloop_evsock *ev) { struct mloop_evpack pack; @@ -310,6 +391,15 @@ static void mloop_evcb_recv(struct mloop_evsock *ev) case MLOOP_EVTYPE_TOUCH: mloop_evhandle_touch(&pack); break; + case MLOOP_EVTYPE_KEYBOARD: + mloop_evhandle_keyboard(ntohl(*(long*)&pack.data[0])); + break; + case MLOOP_EVTYPE_KBD_ADD: + mloop_evhandle_kbd_add(pack.data); + break; + case MLOOP_EVTYPE_KBD_DEL: + mloop_evhandle_kbd_del(pack.data); + break; default: break; } @@ -337,6 +427,16 @@ void mloop_evcmd_usbkbd(int on) mloop_evsock_send(&mloop, &pack); } +void mloop_evcmd_hostkbd(int on) +{ + struct mloop_evpack pack + = {htons(MLOOP_EVTYPE_KBD_ADD), htons(13), "keyboard"}; + if (on == 0) { + pack.type = htons(MLOOP_EVTYPE_KBD_DEL); + } + mloop_evsock_send(&mloop, &pack); +} + void mloop_evcmd_usbdisk(char *img) { struct mloop_evpack pack; @@ -349,8 +449,7 @@ void mloop_evcmd_usbdisk(char *img) pack.type = htons(MLOOP_EVTYPE_USB_ADD); pack.size = htons(5 + sprintf(pack.data, "disk:%s", img)); - } - else { + } else { pack.type = htons(MLOOP_EVTYPE_USB_DEL); pack.size = htons(5 + sprintf(pack.data, "disk:")); } @@ -373,6 +472,11 @@ void mloop_evcmd_set_usbdisk(void *dev) usbdisk = (USBDevice *)dev; } +void mloop_evcmd_set_hostkbd(void *dev) +{ + hostkbd = (PCIDevice *)dev; +} + void mloop_evcmd_raise_intr(void *irq) { struct mloop_evpack pack; @@ -417,3 +521,13 @@ void mloop_evcmd_touch(void) mloop_evsock_send(&mloop, &pack); } +void mloop_evcmd_keyboard(void *data) +{ + struct mloop_evpack pack; + memset(&pack, 0, sizeof(struct mloop_evpack)); + + pack.type = htons(MLOOP_EVTYPE_KEYBOARD); + pack.size = htons(8); + *(long*)&pack.data[0] = htonl((long)data); + mloop_evsock_send(&mloop, &pack); +} diff --git a/tizen/src/mloop_event.h b/tizen/src/mloop_event.h index 7fb8434110..d7f69549c7 100644 --- a/tizen/src/mloop_event.h +++ b/tizen/src/mloop_event.h @@ -37,17 +37,20 @@ void mloop_ev_stop(void); void mloop_evcmd_usbkbd(int on); void mloop_evcmd_usbdisk(char *img); +void mloop_evcmd_hostkbd(int on); int mloop_evcmd_get_usbkbd_status(void); void mloop_evcmd_set_usbkbd(void *dev); void mloop_evcmd_set_usbdisk(void *dev); +void mloop_evcmd_set_hostkbd(void *dev); void mloop_evcmd_raise_intr(void *irq); void mloop_evcmd_lower_intr(void *irq); void mloop_evcmd_hwkey(int event_type, int keycode); void mloop_evcmd_touch(void); +void mloop_evcmd_keyboard(void *data); #ifdef __cplusplus } diff --git a/tizen/src/skin/client/resource/icons/host_keyboard.png b/tizen/src/skin/client/resource/icons/host_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..69a87f3207088fff6818621c88924c9804fffa5f GIT binary patch literal 3436 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 O0000= length ) { - INFO( "there is no data looking at 0 length." ); + log_cnt += sprintf(log_buf + log_cnt, "RECV_USB_KBD ==\n"); + TRACE(log_buf); + + if (length <= 0) { + INFO("there is no data looking at 0 length.\n"); continue; } + memcpy(&on, recvbuf, sizeof(on)); + onoff_usb_kbd(on); + break; + } + case RECV_HOST_KBD: { char on = 0; - memcpy( &on, recvbuf, sizeof( on ) ); - onoff_usb_kbd( on ); + + log_cnt += sprintf(log_buf + log_cnt, "RECV_HOST_KBD ==\n"); + TRACE(log_buf); + + if (length <= 0) { + INFO("there is no data looking at 0 length.\n"); + continue; + } + + memcpy(&on, recvbuf, sizeof(on)); + onoff_host_kbd(on); break; } + case RECV_CLOSE: { log_cnt += sprintf( log_buf + log_cnt, "RECV_CLOSE ==\n" ); TRACE( log_buf ); -- 2.34.1