Changeset 51f0e410 in mainline


Ignore:
Timestamp:
2011-02-20T17:58:31Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7f56fb7
Parents:
6e6dc7d
Message:

Interface-based matches use also device descriptor

This way it is possible to distinguish generic class drivers and
class drivers for specific device (it allows to mix these drivers
when MID is in use).

Location:
uspace
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbmid/usbmid.c

    r6e6dc7d r51f0e410  
    208208        child->ops = &child_device_ops;
    209209
    210         rc = usb_device_create_match_ids_from_interface(interface_descriptor,
     210        rc = usb_device_create_match_ids_from_interface(device_descriptor,
     211            interface_descriptor,
    211212            &child->match_ids);
    212213        if (rc != EOK) {
  • uspace/lib/usb/include/usb/recognise.h

    r6e6dc7d r51f0e410  
    4242
    4343int usb_device_create_match_ids_from_interface(
     44    const usb_standard_device_descriptor_t *,
    4445    const usb_standard_interface_descriptor_t *, match_id_list_t *);
    4546
  • uspace/lib/usb/src/recognise.c

    r6e6dc7d r51f0e410  
    130130 */
    131131int usb_device_create_match_ids_from_interface(
    132     const usb_standard_interface_descriptor_t *descriptor,
     132    const usb_standard_device_descriptor_t *desc_device,
     133    const usb_standard_interface_descriptor_t *desc_interface,
    133134    match_id_list_t *matches)
    134135{
    135         if (descriptor == NULL) {
     136        if (desc_interface == NULL) {
    136137                return EINVAL;
    137138        }
     
    140141        }
    141142
    142         if (descriptor->interface_class == USB_CLASS_USE_INTERFACE) {
     143        if (desc_interface->interface_class == USB_CLASS_USE_INTERFACE) {
    143144                return ENOENT;
    144145        }
    145146
    146         const char *classname = usb_str_class(descriptor->interface_class);
     147        const char *classname = usb_str_class(desc_interface->interface_class);
    147148        assert(classname != NULL);
    148149
    149         ADD_MATCHID_OR_RETURN(matches, 50,
    150             "usb&interface&class=%s",
    151             classname);
    152         ADD_MATCHID_OR_RETURN(matches, 70,
    153             "usb&interface&class=%s&subclass=0x%02x",
    154             classname, descriptor->interface_subclass);
    155         ADD_MATCHID_OR_RETURN(matches, 100,
    156             "usb&interface&class=%s&subclass=0x%02x&protocol=0x%02x",
    157             classname, descriptor->interface_subclass,
    158             descriptor->interface_protocol);
     150#define IFACE_PROTOCOL_FMT "interface&class=%s&subclass=0x%02x&protocol=0x%02x"
     151#define IFACE_PROTOCOL_ARGS classname, desc_interface->interface_subclass, \
     152    desc_interface->interface_protocol
     153
     154#define IFACE_SUBCLASS_FMT "interface&class=%s&subclass=0x%02x"
     155#define IFACE_SUBCLASS_ARGS classname, desc_interface->interface_subclass
     156
     157#define IFACE_CLASS_FMT "interface&class=%s"
     158#define IFACE_CLASS_ARGS classname
     159
     160#define VENDOR_RELEASE_FMT "vendor=0x%04x&product=0x%04x&release=" BCD_FMT
     161#define VENDOR_RELEASE_ARGS desc_device->vendor_id, desc_device->product_id, \
     162    BCD_ARGS(desc_device->device_version)
     163
     164#define VENDOR_PRODUCT_FMT "vendor=0x%04x&product=0x%04x"
     165#define VENDOR_PRODUCT_ARGS desc_device->vendor_id, desc_device->product_id
     166
     167#define VENDOR_ONLY_FMT "vendor=0x%04x"
     168#define VENDOR_ONLY_ARGS desc_device->vendor_id
     169
     170        /*
     171         * If the vendor is specified, create match ids with vendor with
     172         * higher score.
     173         * Then the same ones without the vendor part.
     174         */
     175        if ((desc_device != NULL) && (desc_device->vendor_id != 0)) {
     176                /* First, interface matches with device release number. */
     177                ADD_MATCHID_OR_RETURN(matches, 250,
     178                    "usb&" VENDOR_RELEASE_FMT "&" IFACE_PROTOCOL_FMT,
     179                    VENDOR_RELEASE_ARGS, IFACE_PROTOCOL_ARGS);
     180                ADD_MATCHID_OR_RETURN(matches, 240,
     181                    "usb&" VENDOR_RELEASE_FMT "&" IFACE_SUBCLASS_FMT,
     182                    VENDOR_RELEASE_ARGS, IFACE_SUBCLASS_ARGS);
     183                ADD_MATCHID_OR_RETURN(matches, 230,
     184                    "usb&" VENDOR_RELEASE_FMT "&" IFACE_CLASS_FMT,
     185                    VENDOR_RELEASE_ARGS, IFACE_CLASS_ARGS);
     186
     187                /* Next, interface matches without release number. */
     188                ADD_MATCHID_OR_RETURN(matches, 220,
     189                    "usb&" VENDOR_PRODUCT_FMT "&" IFACE_PROTOCOL_FMT,
     190                    VENDOR_PRODUCT_ARGS, IFACE_PROTOCOL_ARGS);
     191                ADD_MATCHID_OR_RETURN(matches, 210,
     192                    "usb&" VENDOR_PRODUCT_FMT "&" IFACE_SUBCLASS_FMT,
     193                    VENDOR_PRODUCT_ARGS, IFACE_SUBCLASS_ARGS);
     194                ADD_MATCHID_OR_RETURN(matches, 200,
     195                    "usb&" VENDOR_PRODUCT_FMT "&" IFACE_CLASS_FMT,
     196                    VENDOR_PRODUCT_ARGS, IFACE_CLASS_ARGS);
     197
     198                /* Finally, interface matches with only vendor. */
     199                ADD_MATCHID_OR_RETURN(matches, 190,
     200                    "usb&" VENDOR_ONLY_FMT "&" IFACE_PROTOCOL_FMT,
     201                    VENDOR_ONLY_ARGS, IFACE_PROTOCOL_ARGS);
     202                ADD_MATCHID_OR_RETURN(matches, 180,
     203                    "usb&" VENDOR_ONLY_FMT "&" IFACE_SUBCLASS_FMT,
     204                    VENDOR_ONLY_ARGS, IFACE_SUBCLASS_ARGS);
     205                ADD_MATCHID_OR_RETURN(matches, 170,
     206                    "usb&" VENDOR_ONLY_FMT "&" IFACE_CLASS_FMT,
     207                    VENDOR_ONLY_ARGS, IFACE_CLASS_ARGS);
     208        }
     209
     210        /* Now, the same but without any vendor specification. */
     211        ADD_MATCHID_OR_RETURN(matches, 160,
     212            "usb&" IFACE_PROTOCOL_FMT,
     213            IFACE_PROTOCOL_ARGS);
     214        ADD_MATCHID_OR_RETURN(matches, 150,
     215            "usb&" IFACE_SUBCLASS_FMT,
     216            IFACE_SUBCLASS_ARGS);
     217        ADD_MATCHID_OR_RETURN(matches, 140,
     218            "usb&" IFACE_CLASS_FMT,
     219            IFACE_CLASS_ARGS);
     220
     221#undef IFACE_PROTOCOL_FMT
     222#undef IFACE_PROTOCOL_ARGS
     223#undef IFACE_SUBCLASS_FMT
     224#undef IFACE_SUBCLASS_ARGS
     225#undef IFACE_CLASS_FMT
     226#undef IFACE_CLASS_ARGS
     227#undef VENDOR_RELEASE_FMT
     228#undef VENDOR_RELEASE_ARGS
     229#undef VENDOR_PRODUCT_FMT
     230#undef VENDOR_PRODUCT_ARGS
     231#undef VENDOR_ONLY_FMT
     232#undef VENDOR_ONLY_ARGS
    159233
    160234        return EOK;
     
    231305                        return ENOENT;
    232306                }
    233                
     307
    234308                position += cur_descr_len;
    235                
     309
    236310                if (cur_descr_type != USB_DESCTYPE_INTERFACE) {
    237311                        continue;
    238312                }
    239                
     313
    240314                /*
    241315                 * Finally, we found an interface descriptor.
     
    244318                    = (usb_standard_interface_descriptor_t *)
    245319                    current_descriptor;
    246                
     320
    247321                ADD_MATCHID_OR_RETURN(matches, 50,
    248322                    "usb&interface&class=%s",
    249323                    usb_str_class(interface->interface_class));
    250324        }
    251        
     325
    252326        return EOK;
    253327}
     
    264338{
    265339        int final_rc = EOK;
    266        
     340
    267341        int config_index;
    268342        for (config_index = 0; config_index < config_count; config_index++) {
     
    292366                        continue;
    293367                }
    294                
     368
    295369                rc = usb_drv_create_match_ids_from_configuration_descriptor(
    296370                    matches,
     
    300374                        continue;
    301375                }
    302                
    303         }
    304        
     376
     377        }
     378
    305379        return final_rc;
    306380}
Note: See TracChangeset for help on using the changeset viewer.