Device ARGS: added device properties option for sensors & jacks 81/18281/1
authorJinhyung Choi <jinhyung2.choi@samsung.com>
Thu, 20 Mar 2014 02:13:18 +0000 (11:13 +0900)
committerJinhyung Choi <jinhyung2.choi@samsung.com>
Thu, 20 Mar 2014 02:13:18 +0000 (11:13 +0900)
Sensor devices contains accel, geo, gyro, light and proxi sensors.
By device properties, sensor device turn on sensors selectively.
The option is now changed to

"-device virtio-sensor-pci,sensors=accel&geo&gyro&light&proxi"

Jack device is very similar to sensor device.
It contains earjack, earkey, charger, usb and hdmi.
Jack device's option is

"-device virtio-jack-pci,jacks=earjack&usb&charger"

Change-Id: If67ce1adf64a22225fe6f28e1ddb16d558e87c7a
Signed-off-by: Jinhyung Choi <jinhyung2.choi@samsung.com>
hw/virtio/virtio-pci.c
package/changelog
package/pkginfo.manifest
tizen/src/hw/maru_virtio_jack.c
tizen/src/hw/maru_virtio_jack.h
tizen/src/hw/maru_virtio_sensor.c
tizen/src/hw/maru_virtio_sensor.h

index 5920cd0..eec2104 100644 (file)
@@ -1769,8 +1769,15 @@ static int virtio_sensor_pci_init(VirtIOPCIProxy *vpci_dev)
     return 0;
 }
 
+static Property virtio_sensor_pci_properties[] = {
+    DEFINE_PROP_STRING(ATTRIBUTE_NAME_SENSORS, VirtIOSENSORPCI, vdev.sensors),
+    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void virtio_sensor_pci_class_init(ObjectClass *klass, void *data)
 {
+    DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
 
@@ -1779,6 +1786,7 @@ static void virtio_sensor_pci_class_init(ObjectClass *klass, void *data)
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_SENSOR;
     pcidev_k->revision = VIRTIO_PCI_ABI_VERSION;
     pcidev_k->class_id = PCI_CLASS_OTHERS;
+    dc->props = virtio_sensor_pci_properties;
 }
 
 static void virtio_sensor_pci_instance_init(Object *obj)
@@ -1851,8 +1859,15 @@ static int virtio_jack_pci_init(VirtIOPCIProxy *vpci_dev)
     return 0;
 }
 
+static Property virtio_jack_pci_properties[] = {
+    DEFINE_PROP_STRING(ATTRIBUTE_NAME_JACKS, VirtIOJACKPCI, vdev.jacks),
+    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void virtio_jack_pci_class_init(ObjectClass *klass, void *data)
 {
+    DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
     PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
 
@@ -1861,6 +1876,7 @@ static void virtio_jack_pci_class_init(ObjectClass *klass, void *data)
     pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_JACK;
     pcidev_k->revision = VIRTIO_PCI_ABI_VERSION;
     pcidev_k->class_id = PCI_CLASS_OTHERS;
+    dc->props = virtio_jack_pci_properties;
 }
 
 static void virtio_jack_pci_instance_init(Object *obj)
index c7eb51d..60e9f24 100644 (file)
@@ -1,3 +1,6 @@
+* 1.7.26
+- added device option for sensor & jack device
+== Jinhyung Choi <jinhyung2.choi@samsung.com> 2014-03-20
 * 1.7.25
 - added build/install dependency for spice server
 == SungMin Ha <sungmin82.ha@samsung.com> 2014-03-12
index 9c98a7b..ddf3120 100644 (file)
@@ -1,4 +1,4 @@
-Version: 1.7.25
+Version: 1.7.26
 Maintainer: Yeong-Kyoon Lee<yeongkyoon.lee@samsung.com>
 Source: emulator
 
index 0747487..2f682ba 100644 (file)
@@ -49,6 +49,7 @@ static int hdmi_online = 0;
 static int usb_online = 0;
 
 VirtIOJACK* vjack;
+static int jack_capability = 0;
 
 typedef struct msg_info {
     char buf[_MAX_BUF];
@@ -119,6 +120,9 @@ static void get_jack_data(enum jack_types type, char* msg_info)
     }
 
     switch (type) {
+        case jack_type_list:
+            sprintf(msg_info, "%d", jack_capability);
+            break;
         case jack_type_charger:
             sprintf(msg_info, "%d", charger_online);
             break;
@@ -212,6 +216,42 @@ static void virtio_jack_vq(VirtIODevice *vdev, VirtQueue *vq)
     }
 }
 
+static int set_capability(char* jack)
+{
+    if (!strncmp(jack, JACK_NAME_CHARGER, 7)) {
+        return jack_cap_charger;
+    } else if (!strncmp(jack, JACK_NAME_EARJACK, 7)) {
+        return jack_cap_earjack;
+    } else if (!strncmp(jack, JACK_NAME_EARKEY, 6)) {
+        return jack_cap_earkey;
+    } else if (!strncmp(jack, JACK_NAME_HDMI, 4)) {
+        return jack_cap_hdmi;
+    } else if (!strncmp(jack, JACK_NAME_USB, 3)) {
+        return jack_cap_usb;
+    }
+
+    return 0;
+}
+
+static void parse_jack_capability(char* lists)
+{
+    char token[] = JACK_CAP_TOKEN;
+    char* data = NULL;
+
+    if (lists == NULL)
+        return;
+
+    data = strtok(lists, token);
+    if (data != NULL) {
+        jack_capability |= set_capability(data);
+        while ((data = strtok(NULL, token)) != NULL) {
+            jack_capability |= set_capability(data);
+        }
+    }
+
+    INFO("jack device capabilty enabled with %02x\n", jack_capability);
+}
+
 static int virtio_jack_init(VirtIODevice *vdev)
 {
     INFO("initialize virtio-jack device\n");
@@ -227,6 +267,12 @@ static int virtio_jack_init(VirtIODevice *vdev)
 
     vjack->vq = virtio_add_queue(&vjack->vdev, 64, virtio_jack_vq);
 
+    INFO("initialized jack type: %s\n", vjack->jacks);
+
+    if (vjack->jacks) {
+        parse_jack_capability(vjack->jacks);
+    }
+
     return 0;
 }
 
@@ -253,11 +299,17 @@ static uint32_t virtio_jack_get_features(VirtIODevice *vdev,
     return 0;
 }
 
+static Property virtio_jack_properties[] = {
+    DEFINE_PROP_STRING(ATTRIBUTE_NAME_JACKS, VirtIOJACK, jacks),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void virtio_jack_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
     dc->exit = virtio_jack_exit;
+    dc->props = virtio_jack_properties;
     vdc->init = virtio_jack_init;
     vdc->get_features = virtio_jack_get_features;
     vdc->reset = virtio_jack_reset;
index 4b85232..615db82 100644 (file)
@@ -41,7 +41,8 @@ extern "C" {
         OBJECT_CHECK(VirtIOJACK, (obj), TYPE_VIRTIO_JACK)
 
 enum jack_types {
-    jack_type_charger = 0,
+    jack_type_list = 0,
+    jack_type_charger,
     jack_type_earjack,
     jack_type_earkey,
     jack_type_hdmi,
@@ -49,14 +50,32 @@ enum jack_types {
     jack_type_max
 };
 
+enum jack_capabilities {
+    jack_cap_charger = 0x01,
+    jack_cap_earjack = 0x02,
+    jack_cap_earkey  = 0x04,
+    jack_cap_hdmi    = 0x08,
+    jack_cap_usb     = 0x10
+};
+
 typedef struct VirtIOJACK {
     VirtIODevice    vdev;
     VirtQueue       *vq;
     DeviceState     *qdev;
 
-    QEMUBH          *bh;
+    char            *jacks;
 } VirtIOJACK;
 
+#define ATTRIBUTE_NAME_JACKS "jacks"
+
+#define JACK_NAME_CHARGER "charger"
+#define JACK_NAME_EARJACK "earjack"
+#define JACK_NAME_EARKEY "earkey"
+#define JACK_NAME_HDMI "hdmi"
+#define JACK_NAME_USB "usb"
+
+#define JACK_CAP_TOKEN "&"
+
 void set_jack_charger(int online);
 int get_jack_charger(void);
 
index a0475eb..bd76844 100644 (file)
@@ -57,6 +57,7 @@ static int light_level = 10;
 static int proxi_vo = 8;
 
 VirtIOSENSOR* vsensor;
+static int sensor_capability = 0;
 
 typedef struct msg_info {
     char buf[_MAX_BUF];
@@ -176,6 +177,9 @@ static void __get_sensor_data(enum sensor_types type, char* msg_info)
     }
 
     switch (type) {
+        case sensor_type_list:
+            sprintf(msg_info, "%d", sensor_capability);
+            break;
         case sensor_type_accel:
             strcpy(msg_info, accel_xyz);
             break;
@@ -255,7 +259,7 @@ static void handle_msg(struct msg_info *msg, VirtQueueElement *elem)
 {
     unsigned int len = 0;
 
-       if (msg == NULL) {
+    if (msg == NULL) {
         INFO("msg info structure is NULL.\n");
         return;
     }
@@ -303,6 +307,42 @@ static void virtio_sensor_vq(VirtIODevice *vdev, VirtQueue *vq)
     }
 }
 
+static int set_capability(char* sensor)
+{
+    if (!strncmp(sensor, SENSOR_NAME_ACCEL, 5)) {
+        return sensor_cap_accel;
+    } else if (!strncmp(sensor, SENSOR_NAME_GEO, 3)) {
+        return sensor_cap_geo;
+    } else if (!strncmp(sensor, SENSOR_NAME_GYRO, 4)) {
+        return sensor_cap_gyro;
+    } else if (!strncmp(sensor, SENSOR_NAME_LIGHT, 5)) {
+        return sensor_cap_light;
+    } else if (!strncmp(sensor, SENSOR_NAME_PROXI, 5)) {
+        return sensor_cap_proxi;
+    }
+
+    return 0;
+}
+
+static void parse_sensor_capability(char* lists)
+{
+    char token[] = SENSOR_CAP_TOKEN;
+    char* data = NULL;
+
+    if (lists == NULL)
+        return;
+
+    data = strtok(lists, token);
+    if (data != NULL) {
+        sensor_capability |= set_capability(data);
+        while ((data = strtok(NULL, token)) != NULL) {
+            sensor_capability |= set_capability(data);
+        }
+    }
+
+    INFO("sensor device capabilty enabled with %02x\n", sensor_capability);
+}
+
 static int virtio_sensor_init(VirtIODevice *vdev)
 {
     INFO("initialize virtio-sensor device\n");
@@ -318,6 +358,12 @@ static int virtio_sensor_init(VirtIODevice *vdev)
 
     vsensor->vq = virtio_add_queue(&vsensor->vdev, 64, virtio_sensor_vq);
 
+    INFO("initialized sensor type: %s\n", vsensor->sensors);
+
+    if (vsensor->sensors) {
+        parse_sensor_capability(vsensor->sensors);
+    }
+
     return 0;
 }
 
@@ -344,11 +390,17 @@ static uint32_t virtio_sensor_get_features(VirtIODevice *vdev,
     return 0;
 }
 
+static Property virtio_sensor_properties[] = {
+    DEFINE_PROP_STRING(ATTRIBUTE_NAME_SENSORS, VirtIOSENSOR, sensors),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void virtio_sensor_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
     dc->exit = virtio_sensor_exit;
+    dc->props = virtio_sensor_properties;
     vdc->init = virtio_sensor_init;
     vdc->get_features = virtio_sensor_get_features;
     vdc->reset = virtio_sensor_reset;
index 31093a5..fef5bf4 100644 (file)
@@ -43,7 +43,8 @@ enum request_cmd {
 };
 
 enum sensor_types {
-    sensor_type_accel = 0,
+    sensor_type_list = 0,
+    sensor_type_accel,
     sensor_type_geo,
     sensor_type_gyro,
     sensor_type_gyro_x,
@@ -58,6 +59,14 @@ enum sensor_types {
     sensor_type_max
 };
 
+enum sensor_capabilities {
+    sensor_cap_accel = 0x01,
+    sensor_cap_geo   = 0x02,
+    sensor_cap_gyro  = 0x04,
+    sensor_cap_light = 0x08,
+    sensor_cap_proxi = 0x10
+};
+
 #define MESSAGE_TYPE_SENSOR "sensor"
 
 #define GROUP_STATUS        15
@@ -68,6 +77,16 @@ enum sensor_types {
 #define ACTION_LIGHT        113
 #define ACTION_PROXI        114
 
+#define ATTRIBUTE_NAME_SENSORS "sensors"
+
+#define SENSOR_NAME_ACCEL "accel"
+#define SENSOR_NAME_GYRO  "gyro"
+#define SENSOR_NAME_GEO   "geo"
+#define SENSOR_NAME_LIGHT "light"
+#define SENSOR_NAME_PROXI "proxi"
+
+#define SENSOR_CAP_TOKEN "&"
+
 #define TYPE_VIRTIO_SENSOR "virtio-sensor-device"
 #define VIRTIO_SENSOR(obj) \
         OBJECT_CHECK(VirtIOSENSOR, (obj), TYPE_VIRTIO_SENSOR)
@@ -76,6 +95,8 @@ typedef struct VirtIOSENSOR {
     VirtIODevice    vdev;
     VirtQueue       *vq;
     DeviceState     *qdev;
+
+    char            *sensors;
 } VirtIOSENSOR;
 
 void req_sensor_data(enum sensor_types type, enum request_cmd req, char* data, int len);