From 7a72c961de7996a27e64995e9321732d8e216fd0 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 29 Jun 2012 18:04:04 +0200 Subject: [PATCH] cam: Allow time for CA to initialize Some devices take some time to initialize, and until they are they will error out when trying to get information about the CA device. --- sys/dvb/camdevice.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/sys/dvb/camdevice.c b/sys/dvb/camdevice.c index d38d625aea..0a160ceb17 100644 --- a/sys/dvb/camdevice.c +++ b/sys/dvb/camdevice.c @@ -104,6 +104,7 @@ cam_device_open (CamDevice * device, const char *filename) ca_caps_t ca_caps; int ret; int i; + int count = 10; g_return_val_if_fail (device != NULL, FALSE); g_return_val_if_fail (device->state == CAM_DEVICE_STATE_CLOSED, FALSE); @@ -117,17 +118,31 @@ cam_device_open (CamDevice * device, const char *filename) return FALSE; } + GST_DEBUG ("Successfully opened device %s", filename); + device->fd = ret; ret = ioctl (device->fd, CA_RESET); - sleep (1); - /* get the capabilities of the CA */ - ret = ioctl (device->fd, CA_GET_CAP, &ca_caps); - if (ret == -1) { - GST_ERROR ("CA_GET_CAP ioctl failed: %s", strerror (errno)); - reset_state (device); - return FALSE; + g_usleep (G_USEC_PER_SEC / 10); + + while (TRUE) { + /* get the capabilities of the CA */ + ret = ioctl (device->fd, CA_GET_CAP, &ca_caps); + if (ret == -1) { + GST_ERROR ("CA_GET_CAP ioctl failed: %s", strerror (errno)); + reset_state (device); + return FALSE; + } + if (ca_caps.slot_num > 0) + break; + if (!count) { + GST_ERROR ("CA_GET_CAP succeeded but not slots"); + reset_state (device); + return FALSE; + } + count--; + g_usleep (G_USEC_PER_SEC / 5); } device->tl = cam_tl_new (device->fd);