[PATCH] usb-ccid: make ids and descriptor configurable

Ripke, Klaus posted 1 patch 1 year, 3 months ago
Failed in applying to current master (apply log)
There is a newer version of this series
hw/usb/dev-smartcard-reader.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
[PATCH] usb-ccid: make ids and descriptor configurable
Posted by Ripke, Klaus 1 year, 3 months ago
Signed-off-by: Klaus Ripke <klaus.ripke@secunet.com>

hw/usb/dev-smartcard-reader.c:
Set static values from env vars QEMU_CCID_VENDOR/PRODUCT_ID and
_DESCRIPTOR

---
 hw/usb/dev-smartcard-reader.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-
reader.c
index 28164d89be..0632ab44c6 100644
--- a/hw/usb/dev-smartcard-reader.c
+++ b/hw/usb/dev-smartcard-reader.c
@@ -323,7 +323,7 @@ struct USBCCIDState {
  *   0dc3:1004 Athena Smartcard Solutions, Inc.
  */
 
-static const uint8_t qemu_ccid_descriptor[] = {
+static uint8_t qemu_ccid_descriptor[] = {
         /* Smart Card Device Class Descriptor */
         0x36,       /* u8  bLength; */
         0x21,       /* u8  bDescriptorType; Functional */
@@ -472,7 +472,7 @@ static const USBDescDevice desc_device = {
     },
 };
 
-static const USBDesc desc_ccid = {
+static USBDesc desc_ccid = {
     .id = {
         .idVendor          = CCID_VENDOR_ID,
         .idProduct         = CCID_PRODUCT_ID,
@@ -1437,12 +1437,33 @@ static Property ccid_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
+static void env_uint16(uint16_t *val, const char *env)
+{
+    const char *str = getenv(env);
+    if (str) {
+        *val = qemu_strtoul(str, NULL, 16);
+    }
+}
+
 static void ccid_class_initfn(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
     USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
-
+    const char *dsc = getenv("QEMU_CCID_DESCRIPTOR");
+
+    if (dsc) {
+        unsigned int idx = 0;
+        unsigned int val = 0;
+        int off = 0;
+        for (; 2 == sscanf(dsc, "%u:%x%n", &idx, &val, &off); dsc +=
off) {
+            if (idx < sizeof qemu_ccid_descriptor) {
+                qemu_ccid_descriptor[idx] = val;
+            }
+        }
+    }
+    env_uint16(&desc_ccid.id.idVendor, "QEMU_CCID_VENDOR_ID");
+    env_uint16(&desc_ccid.id.idProduct, "QEMU_CCID_PRODUCT_ID");
     uc->realize        = ccid_realize;
     uc->product_desc   = "QEMU USB CCID";
     uc->usb_desc       = &desc_ccid;
-- 
2.34.1



-- 
Klaus Ripke
Senior Developer
Public Authorities Division
secunet Security Networks AG

Telefon:  +49 201 5454-2982
Re: [PATCH] usb-ccid: make ids and descriptor configurable
Posted by Marc-André Lureau 1 year, 3 months ago
Hi Klaus

On Tue, Jan 10, 2023 at 7:49 PM Ripke, Klaus <klaus.ripke@secunet.com> wrote:
>
> Signed-off-by: Klaus Ripke <klaus.ripke@secunet.com>
>
> hw/usb/dev-smartcard-reader.c:
> Set static values from env vars QEMU_CCID_VENDOR/PRODUCT_ID and
> _DESCRIPTOR

We don't use environment variables to configure devices. Please add
properties to ccid_properties[] instead.

thanks

>
> ---
>  hw/usb/dev-smartcard-reader.c | 27 ++++++++++++++++++++++++---
>  1 file changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-
> reader.c
> index 28164d89be..0632ab44c6 100644
> --- a/hw/usb/dev-smartcard-reader.c
> +++ b/hw/usb/dev-smartcard-reader.c
> @@ -323,7 +323,7 @@ struct USBCCIDState {
>   *   0dc3:1004 Athena Smartcard Solutions, Inc.
>   */
>
> -static const uint8_t qemu_ccid_descriptor[] = {
> +static uint8_t qemu_ccid_descriptor[] = {
>          /* Smart Card Device Class Descriptor */
>          0x36,       /* u8  bLength; */
>          0x21,       /* u8  bDescriptorType; Functional */
> @@ -472,7 +472,7 @@ static const USBDescDevice desc_device = {
>      },
>  };
>
> -static const USBDesc desc_ccid = {
> +static USBDesc desc_ccid = {
>      .id = {
>          .idVendor          = CCID_VENDOR_ID,
>          .idProduct         = CCID_PRODUCT_ID,
> @@ -1437,12 +1437,33 @@ static Property ccid_properties[] = {
>      DEFINE_PROP_END_OF_LIST(),
>  };
>
> +static void env_uint16(uint16_t *val, const char *env)
> +{
> +    const char *str = getenv(env);
> +    if (str) {
> +        *val = qemu_strtoul(str, NULL, 16);
> +    }
> +}
> +
>  static void ccid_class_initfn(ObjectClass *klass, void *data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
>      USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
>      HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
> -
> +    const char *dsc = getenv("QEMU_CCID_DESCRIPTOR");
> +
> +    if (dsc) {
> +        unsigned int idx = 0;
> +        unsigned int val = 0;
> +        int off = 0;
> +        for (; 2 == sscanf(dsc, "%u:%x%n", &idx, &val, &off); dsc +=
> off) {
> +            if (idx < sizeof qemu_ccid_descriptor) {
> +                qemu_ccid_descriptor[idx] = val;
> +            }
> +        }
> +    }
> +    env_uint16(&desc_ccid.id.idVendor, "QEMU_CCID_VENDOR_ID");
> +    env_uint16(&desc_ccid.id.idProduct, "QEMU_CCID_PRODUCT_ID");
>      uc->realize        = ccid_realize;
>      uc->product_desc   = "QEMU USB CCID";
>      uc->usb_desc       = &desc_ccid;
> --
> 2.34.1
>
>
>
> --
> Klaus Ripke
> Senior Developer
> Public Authorities Division
> secunet Security Networks AG
>
> Telefon:  +49 201 5454-2982



-- 
Marc-André Lureau