Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca689488 authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 4ad34da0
Loading
Loading
Loading
Loading
+91 −1
Original line number Original line Diff line number Diff line
@@ -182,13 +182,13 @@ static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system)
	case SYS_DMBTH:
	case SYS_DMBTH:
		return DVBV3_OFDM;
		return DVBV3_OFDM;
	case SYS_ATSC:
	case SYS_ATSC:
	case SYS_ATSCMH:
	case SYS_DVBC_ANNEX_B:
	case SYS_DVBC_ANNEX_B:
		return DVBV3_ATSC;
		return DVBV3_ATSC;
	case SYS_UNDEFINED:
	case SYS_UNDEFINED:
	case SYS_ISDBC:
	case SYS_ISDBC:
	case SYS_DVBH:
	case SYS_DVBH:
	case SYS_DAB:
	case SYS_DAB:
	case SYS_ATSCMH:
	default:
	default:
		/*
		/*
		 * Doesn't know how to emulate those types and/or
		 * 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] = {
	_DTV_CMD(DTV_HIERARCHY, 0, 0),
	_DTV_CMD(DTV_HIERARCHY, 0, 0),


	_DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
	_DTV_CMD(DTV_ENUM_DELSYS, 0, 0),

	_DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
	_DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),

	_DTV_CMD(DTV_ATSCMH_FIC_VER, 0, 0),
	_DTV_CMD(DTV_ATSCMH_PARADE_ID, 0, 0),
	_DTV_CMD(DTV_ATSCMH_NOG, 0, 0),
	_DTV_CMD(DTV_ATSCMH_TNOG, 0, 0),
	_DTV_CMD(DTV_ATSCMH_SGN, 0, 0),
	_DTV_CMD(DTV_ATSCMH_PRC, 0, 0),
	_DTV_CMD(DTV_ATSCMH_RS_FRAME_MODE, 0, 0),
	_DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 0, 0),
	_DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_PRI, 0, 0),
	_DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_SEC, 0, 0),
	_DTV_CMD(DTV_ATSCMH_SCCC_BLOCK_MODE, 0, 0),
	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_A, 0, 0),
	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0),
	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0),
	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0),
	_DTV_CMD(DTV_ATSCMH_FIC_ERR, 0, 0),
	_DTV_CMD(DTV_ATSCMH_CRC_ERR, 0, 0),
	_DTV_CMD(DTV_ATSCMH_RS_ERR, 0, 0),
};
};


static void dtv_property_dump(struct dtv_property *tvp)
static void dtv_property_dump(struct dtv_property *tvp)
@@ -1121,6 +1143,8 @@ static int dtv_property_cache_sync(struct dvb_frontend *fe,
	case DVBV3_ATSC:
	case DVBV3_ATSC:
		dprintk("%s() Preparing ATSC req\n", __func__);
		dprintk("%s() Preparing ATSC req\n", __func__);
		c->modulation = p->u.vsb.modulation;
		c->modulation = p->u.vsb.modulation;
		if (c->delivery_system == SYS_ATSCMH)
			break;
		if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
		if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
			c->delivery_system = SYS_ATSC;
			c->delivery_system = SYS_ATSC;
		else
		else
@@ -1367,6 +1391,63 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
	case DTV_DVBT2_PLP_ID:
	case DTV_DVBT2_PLP_ID:
		tvp->u.data = c->dvbt2_plp_id;
		tvp->u.data = c->dvbt2_plp_id;
		break;
		break;

	/* ATSC-MH */
	case DTV_ATSCMH_FIC_VER:
		tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
		break;
	case DTV_ATSCMH_PARADE_ID:
		tvp->u.data = fe->dtv_property_cache.atscmh_parade_id;
		break;
	case DTV_ATSCMH_NOG:
		tvp->u.data = fe->dtv_property_cache.atscmh_nog;
		break;
	case DTV_ATSCMH_TNOG:
		tvp->u.data = fe->dtv_property_cache.atscmh_tnog;
		break;
	case DTV_ATSCMH_SGN:
		tvp->u.data = fe->dtv_property_cache.atscmh_sgn;
		break;
	case DTV_ATSCMH_PRC:
		tvp->u.data = fe->dtv_property_cache.atscmh_prc;
		break;
	case DTV_ATSCMH_RS_FRAME_MODE:
		tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_mode;
		break;
	case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
		tvp->u.data = fe->dtv_property_cache.atscmh_rs_frame_ensemble;
		break;
	case DTV_ATSCMH_RS_CODE_MODE_PRI:
		tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_pri;
		break;
	case DTV_ATSCMH_RS_CODE_MODE_SEC:
		tvp->u.data = fe->dtv_property_cache.atscmh_rs_code_mode_sec;
		break;
	case DTV_ATSCMH_SCCC_BLOCK_MODE:
		tvp->u.data = fe->dtv_property_cache.atscmh_sccc_block_mode;
		break;
	case DTV_ATSCMH_SCCC_CODE_MODE_A:
		tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_a;
		break;
	case DTV_ATSCMH_SCCC_CODE_MODE_B:
		tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_b;
		break;
	case DTV_ATSCMH_SCCC_CODE_MODE_C:
		tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_c;
		break;
	case DTV_ATSCMH_SCCC_CODE_MODE_D:
		tvp->u.data = fe->dtv_property_cache.atscmh_sccc_code_mode_d;
		break;
	case DTV_ATSCMH_FIC_ERR:
		tvp->u.data = fe->dtv_property_cache.atscmh_fic_err;
		break;
	case DTV_ATSCMH_CRC_ERR:
		tvp->u.data = fe->dtv_property_cache.atscmh_crc_err;
		break;
	case DTV_ATSCMH_RS_ERR:
		tvp->u.data = fe->dtv_property_cache.atscmh_rs_err;
		break;

	default:
	default:
		return -EINVAL;
		return -EINVAL;
	}
	}
@@ -1708,6 +1789,15 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
	case DTV_DVBT2_PLP_ID:
	case DTV_DVBT2_PLP_ID:
		c->dvbt2_plp_id = tvp->u.data;
		c->dvbt2_plp_id = tvp->u.data;
		break;
		break;

	/* ATSC-MH */
	case DTV_ATSCMH_PARADE_ID:
		fe->dtv_property_cache.atscmh_parade_id = tvp->u.data;
		break;
	case DTV_ATSCMH_RS_FRAME_ENSEMBLE:
		fe->dtv_property_cache.atscmh_rs_frame_ensemble = tvp->u.data;
		break;

	default:
	default:
		return -EINVAL;
		return -EINVAL;
	}
	}
+22 −0
Original line number Original line Diff line number Diff line
@@ -372,6 +372,28 @@ struct dtv_frontend_properties {


	/* DVB-T2 specifics */
	/* DVB-T2 specifics */
	u32                     dvbt2_plp_id;
	u32                     dvbt2_plp_id;

	/* ATSC-MH specifics */
	u8			atscmh_fic_ver;
	u8			atscmh_parade_id;
	u8			atscmh_nog;
	u8			atscmh_tnog;
	u8			atscmh_sgn;
	u8			atscmh_prc;

	u8			atscmh_rs_frame_mode;
	u8			atscmh_rs_frame_ensemble;
	u8			atscmh_rs_code_mode_pri;
	u8			atscmh_rs_code_mode_sec;
	u8			atscmh_sccc_block_mode;
	u8			atscmh_sccc_code_mode_a;
	u8			atscmh_sccc_code_mode_b;
	u8			atscmh_sccc_code_mode_c;
	u8			atscmh_sccc_code_mode_d;

	u16			atscmh_fic_err;
	u16			atscmh_crc_err;
	u16			atscmh_rs_err;
};
};


struct dvb_frontend {
struct dvb_frontend {
+53 −1
Original line number Original line Diff line number Diff line
@@ -320,7 +320,27 @@ struct dvb_frontend_event {


#define DTV_ENUM_DELSYS		44
#define DTV_ENUM_DELSYS		44


#define DTV_MAX_COMMAND				DTV_ENUM_DELSYS
/* ATSC-MH */
#define DTV_ATSCMH_FIC_VER		45
#define DTV_ATSCMH_PARADE_ID		46
#define DTV_ATSCMH_NOG			47
#define DTV_ATSCMH_TNOG			48
#define DTV_ATSCMH_SGN			49
#define DTV_ATSCMH_PRC			50
#define DTV_ATSCMH_RS_FRAME_MODE	51
#define DTV_ATSCMH_RS_FRAME_ENSEMBLE	52
#define DTV_ATSCMH_RS_CODE_MODE_PRI	53
#define DTV_ATSCMH_RS_CODE_MODE_SEC	54
#define DTV_ATSCMH_SCCC_BLOCK_MODE	55
#define DTV_ATSCMH_SCCC_CODE_MODE_A	56
#define DTV_ATSCMH_SCCC_CODE_MODE_B	57
#define DTV_ATSCMH_SCCC_CODE_MODE_C	58
#define DTV_ATSCMH_SCCC_CODE_MODE_D	59
#define DTV_ATSCMH_FIC_ERR		60
#define DTV_ATSCMH_CRC_ERR		61
#define DTV_ATSCMH_RS_ERR		62

#define DTV_MAX_COMMAND				DTV_ATSCMH_RS_ERR


typedef enum fe_pilot {
typedef enum fe_pilot {
	PILOT_ON,
	PILOT_ON,
@@ -360,6 +380,38 @@ typedef enum fe_delivery_system {


#define SYS_DVBC_ANNEX_AC	SYS_DVBC_ANNEX_A
#define SYS_DVBC_ANNEX_AC	SYS_DVBC_ANNEX_A


/* ATSC-MH */

enum atscmh_sccc_block_mode {
	ATSCMH_SCCC_BLK_SEP      = 0,
	ATSCMH_SCCC_BLK_COMB     = 1,
	ATSCMH_SCCC_BLK_RES      = 2,
};

enum atscmh_sccc_code_mode {
	ATSCMH_SCCC_CODE_HLF     = 0,
	ATSCMH_SCCC_CODE_QTR     = 1,
	ATSCMH_SCCC_CODE_RES     = 2,
};

enum atscmh_rs_frame_ensemble {
	ATSCMH_RSFRAME_ENS_PRI   = 0,
	ATSCMH_RSFRAME_ENS_SEC   = 1,
};

enum atscmh_rs_frame_mode {
	ATSCMH_RSFRAME_PRI_ONLY  = 0,
	ATSCMH_RSFRAME_PRI_SEC   = 1,
	ATSCMH_RSFRAME_RES       = 2,
};

enum atscmh_rs_code_mode {
	ATSCMH_RSCODE_211_187    = 0,
	ATSCMH_RSCODE_223_187    = 1,
	ATSCMH_RSCODE_235_187    = 2,
	ATSCMH_RSCODE_RES        = 3,
};



struct dtv_cmds_h {
struct dtv_cmds_h {
	char	*name;		/* A display name for debugging purposes */
	char	*name;		/* A display name for debugging purposes */