1 /*
2  * Copyright (c) 2013-2014 - Mauro Carvalho Chehab <mchehab@kernel.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation version 2.1 of the License.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16  * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
17  *
18  * Based on ETSI EN 300 468 V1.11.1 (2010-04)
19  */
20 
21 /**
22  * @file desc_t2_delivery.h
23  * @ingroup descriptors
24  * @brief Provides the descriptors for the DVB-T2 delivery system descriptor
25  * @copyright GNU Lesser General Public License version 2.1 (LGPLv2.1)
26  * @author Mauro Carvalho Chehab
27  *
28  * @par Relevant specs
29  * The descriptor described herein is defined at:
30  * - ETSI EN 300 468 V1.11.1
31  *
32  * @par Bug Report
33  * Please submit bug reports and patches to linux-media@vger.kernel.org
34  */
35 
36 #ifndef _T2_DELIVERY_H
37 #define _T2_DELIVERY_H
38 
39 #include <libdvbv5/descriptors.h>
40 
41 /**
42  * @struct dvb_desc_t2_delivery_subcell_old
43  * @ingroup descriptors
44  * @brief Structure to describe transponder subcell extension and frequencies
45  *
46  * @param cell_id_extension	cell id extension
47  * @param transposer_frequency	transposer frequency
48  *
49  * NOTE: This struct is deprecated and will never be filled.
50  *       It is kept here just to avoid breaking ABI.
51  *
52  * All subcell transposer frequencies will be added to
53  * dvb_desc_t2_delivery::centre_frequency array.
54  */
55 struct dvb_desc_t2_delivery_subcell_old {
56 	uint8_t cell_id_extension;
57 	uint16_t transposer_frequency;		// Should be 32 bits, instead
58 } __attribute__((packed));
59 
60 
61 /**
62  * @struct dvb_desc_t2_delivery_subcell
63  * @ingroup descriptors
64  * @brief Structure to describe transponder subcell extension and frequencies
65  *
66  * @param cell_id_extension	cell id extension
67  * @param transposer_frequency	pointer to transposer frequency
68  */
69 struct dvb_desc_t2_delivery_subcell {
70 	uint8_t cell_id_extension;
71 	uint32_t transposer_frequency;
72 } __attribute__((packed));
73 
74 
75 /**
76  * @struct dvb_desc_t2_delivery_cell
77  * @ingroup descriptors
78  * @brief Structure to describe transponder cells
79  *
80  * @param cell_id		cell id extension
81  * @param num_freqs		number of cell frequencies
82  * @param centre_frequency	pointer to centre frequencies
83  * @param subcel_length		number of subcells. May be zero
84  * @param subcell		pointer to subcell array. May be NULL
85  */
86 struct dvb_desc_t2_delivery_cell {
87 	uint16_t cell_id;
88 	int num_freqs;
89 	uint32_t *centre_frequency;
90 	uint8_t subcel_length;
91 	struct dvb_desc_t2_delivery_subcell *subcel;
92 } __attribute__((packed));
93 
94 /**
95  * @struct dvb_desc_t2_delivery
96  * @ingroup descriptors
97  * @brief Structure containing the T2 delivery system descriptor
98  *
99  * @param plp_id		data PLP id
100  * @param system_id		T2 system id
101  * @param SISO_MISO		SISO MISO
102  * @param bandwidth		bandwidth
103  * @param guard_interval	guard interval
104  * @param transmission_mode	transmission mode
105  * @param other_frequency_flag	other frequency flag
106  * @param tfs_flag		tfs flag
107  *
108  * @param centre_frequency	centre frequency vector. It contains the full
109  *				frequencies for all cells and subcells.
110  * @param frequency_loop_length	size of the dvb_desc_t2_delivery::centre_frequency
111  *				vector
112  *
113  * @param subcel_info_loop_length unused. Always 0
114  * @param subcell		unused. Always NULL
115  * @param num_cell		number of cells
116  * @param cell			cell array. Contains per-cell and per-subcell
117  *				pointers to the frequencies parsed.
118  */
119 struct dvb_desc_t2_delivery {
120 	/* extended descriptor */
121 
122 	uint8_t plp_id;
123 	uint16_t system_id;
124 	union {
125 		uint16_t bitfield;
126 		struct {
127 			uint16_t tfs_flag:1;
128 			uint16_t other_frequency_flag:1;
129 			uint16_t transmission_mode:3;
130 			uint16_t guard_interval:3;
131 			uint16_t reserved:2;
132 			uint16_t bandwidth:4;
133 			uint16_t SISO_MISO:2;
134 		} __attribute__((packed));
135 	} __attribute__((packed));
136 
137 	uint32_t *centre_frequency;
138 	uint8_t frequency_loop_length;
139 
140 	/* Unused, as the definitions here are incomplete. */
141 	uint8_t subcel_info_loop_length;
142 	struct dvb_desc_t2_delivery_subcell_old *subcell;
143 
144 	/* Since version 1.13 */
145 	unsigned int num_cell;
146 	struct dvb_desc_t2_delivery_cell *cell;
147 
148 } __attribute__((packed));
149 
150 struct dvb_v5_fe_parms;
151 
152 #ifdef __cplusplus
153 extern "C" {
154 #endif
155 
156 /**
157  * @brief Initializes and parses the T2 delivery system descriptor
158  * @ingroup descriptors
159  *
160  * @param parms	struct dvb_v5_fe_parms pointer to the opened device
161  * @param buf	buffer containing the descriptor's raw data
162  * @param ext	struct dvb_extension_descriptor pointer
163  * @param desc	pointer to struct dvb_desc to be allocated and filled
164  *
165  * This function allocates a the descriptor and fills the fields inside
166  * the struct. It also makes sure that all fields will follow the CPU
167  * endianness. Due to that, the content of the buffer may change.
168  *
169  * @return On success, it returns the size of the allocated struct.
170  *	   A negative value indicates an error.
171  */
172 int dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
173 			       const uint8_t *buf,
174 			       struct dvb_extension_descriptor *ext,
175 			       void *desc);
176 
177 /**
178  * @brief Prints the content of the T2 delivery system descriptor
179  * @ingroup descriptors
180  *
181  * @param parms	struct dvb_v5_fe_parms pointer to the opened device
182  * @param ext	struct dvb_extension_descriptor pointer
183  * @param desc	pointer to struct dvb_desc
184  */
185 void dvb_desc_t2_delivery_print(struct dvb_v5_fe_parms *parms,
186 				const struct dvb_extension_descriptor *ext,
187 				const void *desc);
188 
189 /**
190  * @brief Frees all data allocated by the T2 delivery system descriptor
191  * @ingroup descriptors
192  *
193  * @param desc pointer to struct dvb_desc to be freed
194  */
195 void dvb_desc_t2_delivery_free(const void *desc);
196 
197 /**
198  * @brief converts from internal representation into bandwidth in Hz
199  */
200 extern const unsigned dvbt2_bw[];
201 
202 /**
203  * @brief converts from internal representation into enum fe_guard_interval,
204  * as defined at DVBv5 API.
205  */
206 extern const uint32_t dvbt2_interval[];
207 
208 /**
209  * @brief converts from the descriptor's transmission mode into
210  *	  enum fe_transmit_mode, as defined by DVBv5 API.
211  */
212 extern const unsigned dvbt2_transmission_mode[];
213 
214 /**
215  * @brief converts from internal representation to string the SISO_MISO
216  *	  field of dvb_desc_t2_delivery:SISO_MISO field.
217  */
218 extern const char *siso_miso[4];
219 
220 #ifdef __cplusplus
221 }
222 #endif
223 
224 #endif
225