From 112d1de00a45811bc2b50a6582d8cf2a531c6781 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Sun, 9 Oct 2011 06:22:57 -0300 Subject: [PATCH] utils/dvb: Rearrange functions on a more logical structure Signed-off-by: Mauro Carvalho Chehab --- utils/dvb/dvb-fe.c | 406 +++++++++++++++++++++++++++-------------------------- utils/dvb/dvb-fe.h | 11 +- 2 files changed, 211 insertions(+), 206 deletions(-) diff --git a/utils/dvb/dvb-fe.c b/utils/dvb/dvb-fe.c index 6db593a..180d8c9 100644 --- a/utils/dvb/dvb-fe.c +++ b/utils/dvb/dvb-fe.c @@ -6,7 +6,210 @@ #include "dvb-v5-std.h" #include "dvb-fe.h" -void dvb_fe_prt(struct dvb_v5_fe_parms *parms) +static void dvb_v5_free(struct dvb_v5_fe_parms *parms) +{ + if (parms->fname) + free(parms->fname); + + free(parms); +} + +struct dvb_v5_fe_parms *dvb_fe_open(int adapter, int frontend, unsigned verbose) +{ + int fd, i; + char *fname; + struct dtv_properties dtv_prop; + struct dvb_v5_fe_parms *parms = NULL; + + asprintf(&fname, "/dev/dvb/adapter%i/frontend%i", adapter, frontend); + if (!fname) { + perror("fname malloc"); + return NULL; + } + + fd = open(fname, O_RDWR, 0); + if (fd == -1) { + fprintf(stderr, "%s while opening %s\n", strerror(errno), fname); + return NULL; + } + parms = calloc(sizeof(*parms), 1); + if (!parms) { + perror("parms calloc"); + return NULL; + } + parms->fname = fname; + parms->verbose = verbose; + + if (ioctl(fd, FE_GET_INFO, &parms->info)) { + perror("FE_GET_INFO"); + dvb_v5_free(parms); + return NULL; + } + + if (verbose) { + fe_caps_t caps = parms->info.caps; + + printf("Device %s (%s) capabilities:\n\t", + parms->info.name, fname); + for (i = 0; i < ARRAY_SIZE(fe_caps_name); i++) { + if (caps & fe_caps_name[i].idx) + printf ("%s ", fe_caps_name[i].name); + } + printf("\n"); + } + + parms->dvb_prop[0].cmd = DTV_API_VERSION; + parms->dvb_prop[1].cmd = DTV_DELIVERY_SYSTEM; + + dtv_prop.num = 2; + dtv_prop.props = parms->dvb_prop; + + /* Detect a DVBv3 device */ + if (ioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) { + parms->dvb_prop[0].u.data = 0x300; + parms->dvb_prop[1].u.data = SYS_UNDEFINED; + } + parms->version = parms->dvb_prop[0].u.data; + parms->current_sys = parms->dvb_prop[1].u.data; + if (verbose) + printf ("DVB API Version %d.%d, Current v5 delivery system: %s\n", + parms->version / 256, + parms->version % 256, + delivery_system_name[parms->current_sys]); + + if (parms->current_sys == SYS_UNDEFINED) { + parms->legacy_fe = 1; + switch(parms->info.type) { + case FE_QPSK: + parms->current_sys = SYS_DVBS; + parms->systems[parms->num_systems++] = parms->current_sys; + if (parms->info.caps & FE_CAN_2G_MODULATION) { + parms->systems[parms->num_systems++] = SYS_DVBS2; + } + break; + case FE_QAM: + parms->current_sys = SYS_DVBC_ANNEX_AC; + parms->systems[parms->num_systems++] = parms->current_sys; + break; + case FE_OFDM: + parms->current_sys = SYS_DVBT; + parms->systems[parms->num_systems++] = parms->current_sys; + if (parms->info.caps & FE_CAN_2G_MODULATION) { + parms->systems[parms->num_systems++] = SYS_DVBT2; + } + break; + case FE_ATSC: + if (parms->info.caps & (FE_CAN_8VSB | FE_CAN_16VSB)) + parms->systems[parms->num_systems++] = SYS_ATSC; + if (parms->info.caps & (FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO)) + parms->systems[parms->num_systems++] = SYS_DVBC_ANNEX_B; + parms->current_sys = parms->systems[0]; + break; + } + if (!parms->num_systems) { + fprintf(stderr, "delivery system not detected\n"); + dvb_v5_free(parms); + return NULL; + } + } else { + for (i = 0; i < ARRAY_SIZE(dvb_v5_delivery_system); i++) { + if (!dvb_v5_delivery_system[i]) + continue; + + dtv_prop.num = 1; + parms->dvb_prop[0].cmd = DTV_DELIVERY_SYSTEM; + parms->dvb_prop[0].u.data = i; + if (ioctl(fd, FE_SET_PROPERTY, &dtv_prop) == -1) + continue; + if (ioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) + continue; + if (parms->dvb_prop[0].u.data == i) + parms->systems[parms->num_systems++] = i; + } + if (parms->num_systems == 0) { + fprintf(stderr, "driver died while trying to set the delivery system\n"); + dvb_v5_free(parms); + return NULL; + } + if (parms->num_systems == 1 && parms->systems[0] != parms->current_sys) { + fprintf(stderr, "failed to detect all delivery systems\n"); + dvb_v5_free(parms); + return NULL; + } + } + + if (verbose) { + printf("Supported delivery system%s: ", + (parms->num_systems > 1) ? "s" : ""); + for (i = 0; i < parms->num_systems; i++) { + if (parms->systems[i] == parms->current_sys) + printf ("[%s] ", + delivery_system_name[parms->systems[i]]); + else + printf ("%s ", + delivery_system_name[parms->systems[i]]); + } + printf("\n"); + } + + /* Prepare to use the delivery system */ + dvb_set_sys(parms, parms->current_sys); + + return parms; +} + +void dvb_fe_close(struct dvb_v5_fe_parms *parms) +{ + if (!parms) + return; + + + if (parms->fd < 0) + return; +} + +int dvb_set_sys(struct dvb_v5_fe_parms *parms, + fe_delivery_system_t sys) +{ + struct dtv_property dvb_prop[1]; + struct dtv_properties prop; + const unsigned int *sys_props; + int n; + + if (sys != parms->current_sys) { + /* Can't change standard with the legacy FE support */ + if (parms->legacy_fe) + return EINVAL; + + dvb_prop[0].cmd = DTV_DELIVERY_SYSTEM; + dvb_prop[0].u.data = sys; + prop.num = 1; + prop.props = dvb_prop; + + if (ioctl(parms->fd, FE_SET_PROPERTY, &prop) == -1) { + perror("Set delivery system"); + return errno; + } + parms->current_sys = sys; + } + + /* Make dvb properties reflect the current standard */ + + sys_props = dvb_v5_delivery_system[parms->current_sys]; + if (!sys_props) + return EINVAL; + + n = 0; + while (sys_props[n]) { + parms->dvb_prop[n].cmd = sys_props[n]; + n++; + } + parms->n_props = n; + + return 0; +} + +void dvb_fe_prt_parms(struct dvb_v5_fe_parms *parms) { int i; @@ -80,7 +283,7 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms) if (parms->verbose) { printf("Got parameters for %s:", delivery_system_name[parms->current_sys]); - dvb_fe_prt(parms); + dvb_fe_prt_parms(parms); } return 0; } @@ -121,43 +324,6 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms) return 0; } -int dvb_change_sys(struct dvb_v5_fe_parms *parms, - fe_delivery_system_t sys) -{ - struct dtv_property dvb_prop[1]; - struct dtv_properties prop; - const unsigned int *sys_props; - int n; - - if (parms->legacy_fe) - return EINVAL; - - if (sys != parms->current_sys) { - dvb_prop[0].cmd = DTV_DELIVERY_SYSTEM; - dvb_prop[0].u.data = sys; - prop.num = 1; - prop.props = dvb_prop; - - if (ioctl(parms->fd, FE_SET_PROPERTY, &prop) == -1) { - perror("Set delivery system"); - return errno; - } - parms->current_sys = sys; - } - - sys_props = dvb_v5_delivery_system[parms->current_sys]; - if (!sys_props) - return EINVAL; - - n = 0; - while (sys_props[n]) { - parms->dvb_prop[n].cmd = sys_props[n]; - n++; - } - - return 0; -} - int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms) { struct dtv_properties prop; @@ -207,165 +373,3 @@ int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms) } return 0; } - -static void dvb_v5_free(struct dvb_v5_fe_parms *parms) -{ - if (parms->fname) - free(parms->fname); - - free(parms); -} - -struct dvb_v5_fe_parms *dvb_fe_open(int adapter, int frontend, unsigned verbose) -{ - int fd, i; - char *fname; - struct dtv_properties dtv_prop; - struct dvb_v5_fe_parms *parms = NULL; - - asprintf(&fname, "/dev/dvb/adapter%i/frontend%i", adapter, frontend); - if (!fname) { - perror("fname malloc"); - return NULL; - } - - fd = open(fname, O_RDWR, 0); - if (fd == -1) { - fprintf(stderr, "%s while opening %s\n", strerror(errno), fname); - return NULL; - } - parms = calloc(sizeof(*parms), 1); - if (!parms) { - perror("parms calloc"); - return NULL; - } - parms->fname = fname; - parms->verbose = verbose; - - if (ioctl(fd, FE_GET_INFO, &parms->info)) { - perror("FE_GET_INFO"); - dvb_v5_free(parms); - return NULL; - } - - if (verbose) { - fe_caps_t caps = parms->info.caps; - - printf("Device %s (%s) capabilities:\n\t", - parms->info.name, fname); - for (i = 0; i < ARRAY_SIZE(fe_caps_name); i++) { - if (caps & fe_caps_name[i].idx) - printf ("%s ", fe_caps_name[i].name); - } - printf("\n"); - } - - parms->dvb_prop[0].cmd = DTV_API_VERSION; - parms->dvb_prop[1].cmd = DTV_DELIVERY_SYSTEM; - - dtv_prop.num = 2; - dtv_prop.props = parms->dvb_prop; - - /* Detect a DVBv3 device */ - if (ioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) { - parms->dvb_prop[0].u.data = 0x300; - parms->dvb_prop[1].u.data = SYS_UNDEFINED; - } - parms->version = parms->dvb_prop[0].u.data; - parms->current_sys = parms->dvb_prop[1].u.data; - if (verbose) - printf ("DVB API Version %d.%d, Current v5 delivery system: %s\n", - parms->version / 256, - parms->version % 256, - delivery_system_name[parms->current_sys]); - - if (parms->current_sys == SYS_UNDEFINED) { - parms->legacy_fe = 1; - switch(parms->info.type) { - case FE_QPSK: - parms->current_sys = SYS_DVBS; - parms->systems[parms->num_systems++] = parms->current_sys; - if (parms->info.caps & FE_CAN_2G_MODULATION) { - parms->systems[parms->num_systems++] = SYS_DVBS2; - } - break; - case FE_QAM: - parms->current_sys = SYS_DVBC_ANNEX_AC; - parms->systems[parms->num_systems++] = parms->current_sys; - break; - case FE_OFDM: - parms->current_sys = SYS_DVBT; - parms->systems[parms->num_systems++] = parms->current_sys; - if (parms->info.caps & FE_CAN_2G_MODULATION) { - parms->systems[parms->num_systems++] = SYS_DVBT2; - } - break; - case FE_ATSC: - if (parms->info.caps & (FE_CAN_8VSB | FE_CAN_16VSB)) - parms->systems[parms->num_systems++] = SYS_ATSC; - if (parms->info.caps & (FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO)) - parms->systems[parms->num_systems++] = SYS_DVBC_ANNEX_B; - parms->current_sys = parms->systems[0]; - break; - } - if (!parms->num_systems) { - fprintf(stderr, "delivery system not detected\n"); - dvb_v5_free(parms); - return NULL; - } - } else { - for (i = 0; i < ARRAY_SIZE(dvb_v5_delivery_system); i++) { - if (!dvb_v5_delivery_system[i]) - continue; - - dtv_prop.num = 1; - parms->dvb_prop[0].cmd = DTV_DELIVERY_SYSTEM; - parms->dvb_prop[0].u.data = i; - if (ioctl(fd, FE_SET_PROPERTY, &dtv_prop) == -1) - continue; - if (ioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) - continue; - if (parms->dvb_prop[0].u.data == i) - parms->systems[parms->num_systems++] = i; - } - if (parms->num_systems == 0) { - fprintf(stderr, "driver died while trying to set the delivery system\n"); - dvb_v5_free(parms); - return NULL; - } - if (parms->num_systems == 1 && parms->systems[0] != parms->current_sys) { - fprintf(stderr, "failed to detect all delivery systems\n"); - dvb_v5_free(parms); - return NULL; - } - } - - if (verbose) { - printf("Supported delivery system%s: ", - (parms->num_systems > 1) ? "s" : ""); - for (i = 0; i < parms->num_systems; i++) { - if (parms->systems[i] == parms->current_sys) - printf ("[%s] ", - delivery_system_name[parms->systems[i]]); - else - printf ("%s ", - delivery_system_name[parms->systems[i]]); - } - printf("\n"); - } - - /* Prepare to use the delivery system */ - dvb_change_sys(parms, parms->current_sys); - - return parms; -} - -void dvb_fe_close(struct dvb_v5_fe_parms *parms) -{ - if (!parms) - return; - - - if (parms->fd < 0) - return; -} diff --git a/utils/dvb/dvb-fe.h b/utils/dvb/dvb-fe.h index f43eeb8..c03ec5d 100644 --- a/utils/dvb/dvb-fe.h +++ b/utils/dvb/dvb-fe.h @@ -31,15 +31,16 @@ struct dvb_v5_fe_parms { int legacy_fe; }; -void dvb_fe_prt(struct dvb_v5_fe_parms *parms); +struct dvb_v5_fe_parms *dvb_fe_open(int adapter, int frontend, + unsigned verbose); +void dvb_fe_close(struct dvb_v5_fe_parms *parms); + int dvb_fe_retrieve_parm(struct dvb_v5_fe_parms *parms, unsigned cmd, uint32_t *value); int dvb_fe_store_parm(struct dvb_v5_fe_parms *parms, unsigned cmd, uint32_t value); -int dvb_change_sys(struct dvb_v5_fe_parms *parms, +int dvb_set_sys(struct dvb_v5_fe_parms *parms, fe_delivery_system_t sys); +void dvb_fe_prt_parms(struct dvb_v5_fe_parms *parms); int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms); int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms); -struct dvb_v5_fe_parms *dvb_fe_open(int adapter, int frontend, - unsigned verbose); -void dvb_fe_close(struct dvb_v5_fe_parms *parms); -- 2.7.4