aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Krufky <mkrufky@linuxtv.org>2012-01-29 13:44:58 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-05-20 08:41:50 -0400
commitca689488ee6f850000b8d12f0f41e810bff28a7c (patch)
tree5097cee48780ca4cb30e973e9c4de8c1450349e1
parent4ad34da0300d7196be25ef79ef3f054756cdc739 (diff)
[media] linux-dvb v5 API support for ATSC-MH
Add the following properties for controlling an ATSC-MH frontend: DTV_ATSCMH_FIC_VER DTV_ATSCMH_PARADE_ID DTV_ATSCMH_NOG DTV_ATSCMH_TNOG DTV_ATSCMH_SGN DTV_ATSCMH_PRC DTV_ATSCMH_RS_FRAME_MODE DTV_ATSCMH_RS_FRAME_ENSEMBLE DTV_ATSCMH_RS_CODE_MODE_PRI DTV_ATSCMH_RS_CODE_MODE_SEC DTV_ATSCMH_SCCC_BLOCK_MODE DTV_ATSCMH_SCCC_CODE_MODE_A DTV_ATSCMH_SCCC_CODE_MODE_B DTV_ATSCMH_SCCC_CODE_MODE_C DTV_ATSCMH_SCCC_CODE_MODE_D DTV_ATSCMH_FIC_ERR DTV_ATSCMH_CRC_ERR DTV_ATSCMH_RS_ERR Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.c92
-rw-r--r--drivers/media/dvb/dvb-core/dvb_frontend.h22
-rw-r--r--include/linux/dvb/frontend.h54
3 files changed, 166 insertions, 2 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
index cb888d835a89..cd23f303162a 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -182,13 +182,13 @@ static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system)
182 case SYS_DMBTH: 182 case SYS_DMBTH:
183 return DVBV3_OFDM; 183 return DVBV3_OFDM;
184 case SYS_ATSC: 184 case SYS_ATSC:
185 case SYS_ATSCMH:
185 case SYS_DVBC_ANNEX_B: 186 case SYS_DVBC_ANNEX_B:
186 return DVBV3_ATSC; 187 return DVBV3_ATSC;
187 case SYS_UNDEFINED: 188 case SYS_UNDEFINED:
188 case SYS_ISDBC: 189 case SYS_ISDBC:
189 case SYS_DVBH: 190 case SYS_DVBH:
190 case SYS_DAB: 191 case SYS_DAB:
191 case SYS_ATSCMH:
192 default: 192 default:
193 /* 193 /*
194 * Doesn't know how to emulate those types and/or 194 * Doesn't know how to emulate those types and/or
@@ -1030,6 +1030,28 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
1030 _DTV_CMD(DTV_HIERARCHY, 0, 0), 1030 _DTV_CMD(DTV_HIERARCHY, 0, 0),
1031 1031
1032 _DTV_CMD(DTV_ENUM_DELSYS, 0, 0), 1032 _DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
1033
1034 _DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
1035 _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),
1036
1037 _DTV_CMD(DTV_ATSCMH_FIC_VER, 0, 0),
1038 _DTV_CMD(DTV_ATSCMH_PARADE_ID, 0, 0),
1039 _DTV_CMD(DTV_ATSCMH_NOG, 0, 0),
1040 _DTV_CMD(DTV_ATSCMH_TNOG, 0, 0),
1041 _DTV_CMD(DTV_ATSCMH_SGN, 0, 0),
1042 _DTV_CMD(DTV_ATSCMH_PRC, 0, 0),
1043 _DTV_CMD(DTV_ATSCMH_RS_FRAME_MODE, 0, 0),
1044 _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 0, 0),
1045 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_PRI, 0, 0),
1046 _DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_SEC, 0, 0),
1047 _DTV_CMD(DTV_ATSCMH_SCCC_BLOCK_MODE, 0, 0),
1048 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_A, 0, 0),
1049 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0),
1050 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0),
1051 _DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0),
1052 _DTV_CMD(DTV_ATSCMH_FIC_ERR, 0, 0),
1053 _DTV_CMD(DTV_ATSCMH_CRC_ERR, 0, 0),
1054 _DTV_CMD(DTV_ATSCMH_RS_ERR, 0, 0),
1033}; 1055};
1034 1056
1035static void dtv_property_dump(struct dtv_property *tvp) 1057static void dtv_property_dump(struct dtv_property *tvp)
@@ -1121,6 +1143,8 @@ static int dtv_property_cache_sync(struct dvb_frontend *fe,
1121 case DVBV3_ATSC: 1143 case DVBV3_ATSC:
1122 dprintk("%s() Preparing ATSC req\n", __func__); 1144 dprintk("%s() Preparing ATSC req\n", __func__);
1123 c->modulation = p->u.vsb.modulation; 1145 c->modulation = p->u.vsb.modulation;
1146 if (c->delivery_system == SYS_ATSCMH)
1147 break;
1124 if ((c->modulation == VSB_8) || (c->modulation == VSB_16)) 1148 if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
1125 c->delivery_system = SYS_ATSC; 1149 c->delivery_system = SYS_ATSC;
1126 else 1150 else
@@ -1367,6 +1391,63 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
1367 case DTV_DVBT2_PLP_ID: 1391 case DTV_DVBT2_PLP_ID:
1368 tvp->u.data = c->dvbt2_plp_id; 1392 tvp->u.data = c->dvbt2_plp_id;
1369 break; 1393 break;
1394
1395 /* ATSC-MH */
1396 case DTV_ATSCMH_FIC_VER:
1397 tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
1398 break;
1399 case DTV_ATSCMH_PARADE_ID:
1400 tvp->u.data = fe->dtv_property_cache.atscmh_parade_id;
1401 break;
1402 case DTV_ATSCMH_NOG:
1403 tvp->u.data = fe->dtv_property_cache.atscmh_nog;
1404 break;
1405 case DTV_ATSCMH_TNOG:
1406 tvp->u.data = fe->dtv_property_cache.atscmh_tnog;
1407 break;
1408 case DTV_ATSCMH_SGN:
1409 tvp->u.data = fe->dtv_property_cache.atscmh_sgn;
1410 break;
1411 case DTV_ATSCMH_PRC:
1412 tvp->u.data = fe->dtv_property_cache.atscmh_prc;
1413 break;
1414 case DTV_ATSCMH_RS_FRAME_MODE:
1415 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_mode;
1416 break;
1417 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
1418 tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_ensemble;
1419 break;
1420 case DTV_ATSCMH_RS_CODE_MODE_PRI:
1421 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_pri;
1422 break;
1423 case DTV_ATSCMH_RS_CODE_MODE_SEC:
1424 tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_sec;
1425 break;
1426 case DTV_ATSCMH_SCCC_BLOCK_MODE:
1427 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_block_mode;
1428 break;
1429 case DTV_ATSCMH_SCCC_CODE_MODE_A:
1430 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_a;
1431 break;
1432 case DTV_ATSCMH_SCCC_CODE_MODE_B:
1433 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_b;
1434 break;
1435 case DTV_ATSCMH_SCCC_CODE_MODE_C:
1436 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_c;
1437 break;
1438 case DTV_ATSCMH_SCCC_CODE_MODE_D:
1439 tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
1440 break;
1441 case DTV_ATSCMH_FIC_ERR:
1442 tvp->u.data = fe->dtv_property_cache.atscmh_fic_err;
1443 break;
1444 case DTV_ATSCMH_CRC_ERR:
1445 tvp->u.data = fe->dtv_property_cache.atscmh_crc_err;
1446 break;
1447 case DTV_ATSCMH_RS_ERR:
1448 tvp->u.data = fe->dtv_property_cache.atscmh_rs_err;
1449 break;
1450
1370 default: 1451 default:
1371 return -EINVAL; 1452 return -EINVAL;
1372 } 1453 }
@@ -1708,6 +1789,15 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
1708 case DTV_DVBT2_PLP_ID: 1789 case DTV_DVBT2_PLP_ID:
1709 c->dvbt2_plp_id = tvp->u.data; 1790 c->dvbt2_plp_id = tvp->u.data;
1710 break; 1791 break;
1792
1793 /* ATSC-MH */
1794 case DTV_ATSCMH_PARADE_ID:
1795 fe->dtv_property_cache.atscmh_parade_id = tvp->u.data;
1796 break;
1797 case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
1798 fe->dtv_property_cache.atscmh_rs_frame_ensemble = tvp->u.data;
1799 break;
1800
1711 default: 1801 default:
1712 return -EINVAL; 1802 return -EINVAL;
1713 } 1803 }
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h
index d63a8215fe03..80f5c27ddc9f 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.h
@@ -372,6 +372,28 @@ struct dtv_frontend_properties {
372 372
373 /* DVB-T2 specifics */ 373 /* DVB-T2 specifics */
374 u32 dvbt2_plp_id; 374 u32 dvbt2_plp_id;
375
376 /* ATSC-MH specifics */
377 u8 atscmh_fic_ver;
378 u8 atscmh_parade_id;
379 u8 atscmh_nog;
380 u8 atscmh_tnog;
381 u8 atscmh_sgn;
382 u8 atscmh_prc;
383
384 u8 atscmh_rs_frame_mode;
385 u8 atscmh_rs_frame_ensemble;
386 u8 atscmh_rs_code_mode_pri;
387 u8 atscmh_rs_code_mode_sec;
388 u8 atscmh_sccc_block_mode;
389 u8 atscmh_sccc_code_mode_a;
390 u8 atscmh_sccc_code_mode_b;
391 u8 atscmh_sccc_code_mode_c;
392 u8 atscmh_sccc_code_mode_d;
393
394 u16 atscmh_fic_err;
395 u16 atscmh_crc_err;
396 u16 atscmh_rs_err;
375}; 397};
376 398
377struct dvb_frontend { 399struct dvb_frontend {
diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h
index cb4428ab81ed..5aedd5ae7f8f 100644
--- a/include/linux/dvb/frontend.h
+++ b/include/linux/dvb/frontend.h
@@ -320,7 +320,27 @@ struct dvb_frontend_event {
320 320
321#define DTV_ENUM_DELSYS 44 321#define DTV_ENUM_DELSYS 44
322 322
323#define DTV_MAX_COMMAND DTV_ENUM_DELSYS 323/* ATSC-MH */
324#define DTV_ATSCMH_FIC_VER 45
325#define DTV_ATSCMH_PARADE_ID 46
326#define DTV_ATSCMH_NOG 47
327#define DTV_ATSCMH_TNOG 48
328#define DTV_ATSCMH_SGN 49
329#define DTV_ATSCMH_PRC 50
330#define DTV_ATSCMH_RS_FRAME_MODE 51
331#define DTV_ATSCMH_RS_FRAME_ENSEMBLE 52
332#define DTV_ATSCMH_RS_CODE_MODE_PRI 53
333#define DTV_ATSCMH_RS_CODE_MODE_SEC 54
334#define DTV_ATSCMH_SCCC_BLOCK_MODE 55
335#define DTV_ATSCMH_SCCC_CODE_MODE_A 56
336#define DTV_ATSCMH_SCCC_CODE_MODE_B 57
337#define DTV_ATSCMH_SCCC_CODE_MODE_C 58
338#define DTV_ATSCMH_SCCC_CODE_MODE_D 59
339#define DTV_ATSCMH_FIC_ERR 60
340#define DTV_ATSCMH_CRC_ERR 61
341#define DTV_ATSCMH_RS_ERR 62
342
343#define DTV_MAX_COMMAND DTV_ATSCMH_RS_ERR
324 344
325typedef enum fe_pilot { 345typedef enum fe_pilot {
326 PILOT_ON, 346 PILOT_ON,
@@ -360,6 +380,38 @@ typedef enum fe_delivery_system {
360 380
361#define SYS_DVBC_ANNEX_AC SYS_DVBC_ANNEX_A 381#define SYS_DVBC_ANNEX_AC SYS_DVBC_ANNEX_A
362 382
383/* ATSC-MH */
384
385enum atscmh_sccc_block_mode {
386 ATSCMH_SCCC_BLK_SEP = 0,
387 ATSCMH_SCCC_BLK_COMB = 1,
388 ATSCMH_SCCC_BLK_RES = 2,
389};
390
391enum atscmh_sccc_code_mode {
392 ATSCMH_SCCC_CODE_HLF = 0,
393 ATSCMH_SCCC_CODE_QTR = 1,
394 ATSCMH_SCCC_CODE_RES = 2,
395};
396
397enum atscmh_rs_frame_ensemble {
398 ATSCMH_RSFRAME_ENS_PRI = 0,
399 ATSCMH_RSFRAME_ENS_SEC = 1,
400};
401
402enum atscmh_rs_frame_mode {
403 ATSCMH_RSFRAME_PRI_ONLY = 0,
404 ATSCMH_RSFRAME_PRI_SEC = 1,
405 ATSCMH_RSFRAME_RES = 2,
406};
407
408enum atscmh_rs_code_mode {
409 ATSCMH_RSCODE_211_187 = 0,
410 ATSCMH_RSCODE_223_187 = 1,
411 ATSCMH_RSCODE_235_187 = 2,
412 ATSCMH_RSCODE_RES = 3,
413};
414
363 415
364struct dtv_cmds_h { 416struct dtv_cmds_h {
365 char *name; /* A display name for debugging purposes */ 417 char *name; /* A display name for debugging purposes */