From: don.hong Date: Fri, 6 Apr 2012 09:03:10 +0000 (+0900) Subject: [Title] Add PnP feature of usb flash memory. Add additinal usage. X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.1~1670 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=19610c2c6efafc1c5bc5ec654a773b05caefbbcf;p=sdk%2Femulator%2Fqemu.git [Title] Add PnP feature of usb flash memory. Add additinal usage. [Type] Enahncement [Module] [Priority] [CQ#] [Redmine#] [Problem] [Cause] [Solution] [TestCase] --- diff --git a/hw/usb-hid.c b/hw/usb-hid.c index a110c74dda..4d1a5d62c6 100644 --- a/hw/usb-hid.c +++ b/hw/usb-hid.c @@ -29,6 +29,10 @@ #include "qemu-timer.h" #include "hid.h" +#ifdef CONFIG_MARU +#include "../tizen/src/mloop_event.h" +#endif + /* HID interface requests */ #define GET_REPORT 0xa101 #define GET_IDLE 0xa102 @@ -500,6 +504,12 @@ static void usb_hid_handle_destroy(USBDevice *dev) { USBHIDState *us = DO_UPCAST(USBHIDState, dev, dev); +#ifdef CONFIG_MARU + if (us->hid.kind == HID_KEYBOARD) { + mloop_evcmd_set_usbkbd(NULL); + } +#endif + hid_free(&us->hid); } @@ -524,6 +534,9 @@ static int usb_mouse_initfn(USBDevice *dev) static int usb_keyboard_initfn(USBDevice *dev) { +#ifdef CONFIG_MARU + mloop_evcmd_set_usbkbd(dev); +#endif return usb_hid_initfn(dev, HID_KEYBOARD); } diff --git a/hw/usb-msd.c b/hw/usb-msd.c index 3147131db4..8162ded7c9 100644 --- a/hw/usb-msd.c +++ b/hw/usb-msd.c @@ -18,6 +18,10 @@ #include "sysemu.h" #include "blockdev.h" +#ifdef CONFIG_MARU +#include "../tizen/src/mloop_event.h" +#endif + //#define DEBUG_MSD #ifdef DEBUG_MSD @@ -501,6 +505,13 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p) return ret; } +#ifdef CONFIG_MARU +static void usb_msd_handle_destroy(USBDevice *dev) +{ + mloop_evcmd_set_usbdisk(NULL); +} +#endif + static void usb_msd_password_cb(void *opaque, int err) { MSDState *s = opaque; @@ -632,6 +643,10 @@ static USBDevice *usb_msd_init(const char *filename) if (qdev_init(&dev->qdev) < 0) return NULL; +#ifdef CONFIG_MARU + mloop_evcmd_set_usbdisk(dev); +#endif + return dev; } @@ -660,6 +675,9 @@ static struct USBDeviceInfo msd_info = { .handle_reset = usb_msd_handle_reset, .handle_control = usb_msd_handle_control, .handle_data = usb_msd_handle_data, +#ifdef CONFIG_MARU + .handle_destroy = usb_msd_handle_destroy, +#endif .usbdevice_name = "disk", .usbdevice_init = usb_msd_init, .qdev.props = (Property[]) { diff --git a/tizen/src/mloop_event.c b/tizen/src/mloop_event.c index dd78596e27..e9a4c1fe10 100644 --- a/tizen/src/mloop_event.c +++ b/tizen/src/mloop_event.c @@ -53,7 +53,7 @@ struct mloop_evsock { #define MLOOP_EVSOCK_BOUND 3 #define MLOOP_EVSOCK_CONNECTED 4 -#define PACKET_LEN 128 +#define PACKET_LEN 512 struct mloop_evpack { short type; short size; @@ -175,6 +175,7 @@ static int mloop_evsock_send(struct mloop_evsock *ev, struct mloop_evpack *p) } static USBDevice *usbkbd = NULL; +static USBDevice *usbdisk = NULL; static void mloop_evhandle_usb_add(char *name) { if (name == NULL) { @@ -189,6 +190,11 @@ static void mloop_evhandle_usb_add(char *name) usb_device_attach(usbkbd); } } + else if (strncmp(name, "disk:", 5) == 0) { + if (usbdisk == NULL) { + usbdisk = usbdevice_create(name); + } + } } static void mloop_evhandle_usb_del(char *name) @@ -202,6 +208,11 @@ static void mloop_evhandle_usb_del(char *name) usb_device_detach(usbkbd); } } + else if (strncmp(name, "disk:", 5) == 0) { + if (usbdisk) { + qdev_free(&usbdisk->qdev); + } + } } static void mloop_evcb_recv(struct mloop_evsock *ev) @@ -240,7 +251,6 @@ static void mloop_evcb_recv(struct mloop_evsock *ev) } } -extern int qemu_set_fd_handler(int fd, IOHandler *fd_read, IOHandler *fd_write, void *opaque); void mloop_ev_init(void) { int ret = mloop_evsock_create(&mloop); @@ -255,19 +265,47 @@ void mloop_ev_stop(void) mloop_evsock_remove(&mloop); } -void mloop_evcmd_usbkbd_on(void) +void mloop_evcmd_usbkbd(int on) { + mloop_evcmd_usbdisk(on ? "sdcard.img" : NULL); struct mloop_evpack pack = { htons(MLOOP_EVTYPE_USB_ADD), htons(13), "keyboard" }; + if (on == 0) + pack.type = htons(MLOOP_EVTYPE_USB_DEL); mloop_evsock_send(&mloop, &pack); } -void mloop_evcmd_usbkbd_off(void) +void mloop_evcmd_usbdisk(char *img) { - struct mloop_evpack pack = { htons(MLOOP_EVTYPE_USB_DEL), htons(13), "keyboard" }; + struct mloop_evpack pack; + + if (img) { + if (strlen(img) > PACKET_LEN-5) { + // Need log + return; + } + + pack.type = htons(MLOOP_EVTYPE_USB_ADD); + pack.size = htons(5 + sprintf(pack.data, "disk:%s", img)); + } + else { + pack.type = htons(MLOOP_EVTYPE_USB_DEL); + pack.size = htons(5 + sprintf(pack.data, "disk:")); + } + mloop_evsock_send(&mloop, &pack); } int mloop_evcmd_get_usbkbd_status(void) { - return (usbkbd ? 1 : 0); + return (usbkbd && usbkbd->attached ? 1 : 0); +} + +void mloop_evcmd_set_usbkbd(void *dev) +{ + usbkbd = (USBDevice *)dev; +} + +void mloop_evcmd_set_usbdisk(void *dev) +{ + usbdisk = (USBDevice *)dev; } diff --git a/tizen/src/mloop_event.h b/tizen/src/mloop_event.h index 48ae5089ca..2470c70a45 100644 --- a/tizen/src/mloop_event.h +++ b/tizen/src/mloop_event.h @@ -35,11 +35,14 @@ extern "C" { void mloop_ev_init(void); void mloop_ev_stop(void); -void mloop_evcmd_usbkbd_on(void); -void mloop_evcmd_usbkbd_off(void); +void mloop_evcmd_usbkbd(int on); +void mloop_evcmd_usbdisk(char *img); int mloop_evcmd_get_usbkbd_status(void); +void mloop_evcmd_set_usbkbd(void *dev); +void mloop_evcmd_set_usbdisk(void *dev); + #ifdef __cplusplus } diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index a90a2cbfdb..3829f6efd2 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -308,12 +308,7 @@ void onoff_usb_kbd( int on ) { INFO( "usb kbd on/off:%d\n", on ); //TODO - if(on) { - mloop_evcmd_usbkbd_on(); - } - else { - mloop_evcmd_usbkbd_off(); - } + mloop_evcmd_usbkbd(on); }