Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 124335
b: refs/heads/master
c: 2bdd29c
h: refs/heads/master
i:
  124333: 4fe9622
  124331: b83c37b
  124327: 50d7c6d
  124319: 5e14457
v: v3
  • Loading branch information
Laurent Pinchart authored and Mauro Carvalho Chehab committed Dec 30, 2008
1 parent 34edaee commit dba0391
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0fbd8ee6de6ac3d0b93c96da848c5bc3ccc1dc83
refs/heads/master: 2bdd29cf3d4d32e4371fbd6b27ea171f2c1f0836
57 changes: 55 additions & 2 deletions trunk/drivers/media/video/uvc/uvc_ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -543,11 +543,16 @@ static inline __u8 *uvc_ctrl_data(struct uvc_control *ctrl, int id)
return ctrl->data + id * ctrl->info->size;
}

static inline int uvc_get_bit(const __u8 *data, int bit)
static inline int uvc_test_bit(const __u8 *data, int bit)
{
return (data[bit >> 3] >> (bit & 7)) & 1;
}

static inline void uvc_clear_bit(__u8 *data, int bit)
{
data[bit >> 3] &= ~(1 << (bit & 7));
}

/* Extract the bit string specified by mapping->offset and mapping->size
* from the little-endian data stored at 'data' and return the result as
* a signed 32bit integer. Sign extension will be performed if the mapping
Expand Down Expand Up @@ -1305,6 +1310,51 @@ int uvc_ctrl_add_mapping(struct uvc_control_mapping *mapping)
return ret;
}

/*
* Prune an entity of its bogus controls. This currently includes processing
* unit auto controls for which no corresponding manual control is available.
* Such auto controls make little sense if any, and are known to crash at
* least the SiGma Micro webcam.
*/
static void
uvc_ctrl_prune_entity(struct uvc_entity *entity)
{
static const struct {
u8 idx_manual;
u8 idx_auto;
} blacklist[] = {
{ 2, 11 }, /* Hue */
{ 6, 12 }, /* White Balance Temperature */
{ 7, 13 }, /* White Balance Component */
};

u8 *controls;
unsigned int size;
unsigned int i;

if (UVC_ENTITY_TYPE(entity) != VC_PROCESSING_UNIT)
return;

controls = entity->processing.bmControls;
size = entity->processing.bControlSize;

for (i = 0; i < ARRAY_SIZE(blacklist); ++i) {
if (blacklist[i].idx_auto >= 8 * size ||
blacklist[i].idx_manual >= 8 * size)
continue;

if (!uvc_test_bit(controls, blacklist[i].idx_auto) ||
uvc_test_bit(controls, blacklist[i].idx_manual))
continue;

uvc_trace(UVC_TRACE_CONTROL, "Auto control %u/%u has no "
"matching manual control, removing it.\n", entity->id,
blacklist[i].idx_auto);

uvc_clear_bit(controls, blacklist[i].idx_auto);
}
}

/*
* Initialize device controls.
*/
Expand All @@ -1331,6 +1381,9 @@ int uvc_ctrl_init_device(struct uvc_device *dev)
bControlSize = entity->camera.bControlSize;
}

if (dev->quirks & UVC_QUIRK_PRUNE_CONTROLS)
uvc_ctrl_prune_entity(entity);

for (i = 0; i < bControlSize; ++i)
ncontrols += hweight8(bmControls[i]);

Expand All @@ -1345,7 +1398,7 @@ int uvc_ctrl_init_device(struct uvc_device *dev)

ctrl = entity->controls;
for (i = 0; i < bControlSize * 8; ++i) {
if (uvc_get_bit(bmControls, i) == 0)
if (uvc_test_bit(bmControls, i) == 0)
continue;

ctrl->entity = entity;
Expand Down
3 changes: 2 additions & 1 deletion trunk/drivers/media/video/uvc/uvc_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -1894,7 +1894,8 @@ static struct usb_device_id uvc_ids[] = {
.bInterfaceSubClass = 1,
.bInterfaceProtocol = 0,
.driver_info = UVC_QUIRK_PROBE_MINMAX
| UVC_QUIRK_IGNORE_SELECTOR_UNIT},
| UVC_QUIRK_IGNORE_SELECTOR_UNIT
| UVC_QUIRK_PRUNE_CONTROLS },
/* Generic USB Video Class */
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },
{}
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/media/video/uvc/uvcvideo.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ struct uvc_xu_control {
#define UVC_QUIRK_BUILTIN_ISIGHT 0x00000008
#define UVC_QUIRK_STREAM_NO_FID 0x00000010
#define UVC_QUIRK_IGNORE_SELECTOR_UNIT 0x00000020
#define UVC_QUIRK_PRUNE_CONTROLS 0x00000040

/* Format flags */
#define UVC_FMT_FLAG_COMPRESSED 0x00000001
Expand Down

0 comments on commit dba0391

Please sign in to comment.