dvb-core: use origion dvb-core in kernel [1/2]
PD#SWPL-89132
Problem:
use dvb-core to ko
Solution:
put aml modification to dvb-core
Verify:
not verified, compile pass
Signed-off-by: chuangcheng peng <chuangcheng.peng@amlogic.com>
Change-Id: I8e63da3d2b7a89538aef180b6e20f40c898445c6
diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
index 8abf7f4..d7d78e7 100644
--- a/drivers/media/dvb-core/dmxdev.c
+++ b/drivers/media/dvb-core/dmxdev.c
@@ -1115,6 +1115,110 @@ static int dvb_demux_do_ioctl(struct file *file,
&((struct dmx_stc *)parg)->base);
break;
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ case DMX_SET_INPUT:
+ if (!dmxdev->demux->set_input) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->set_input(dmxdev->demux, arg);
+ break;
+ case DMX_GET_MEM_INFO:
+ if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+ {
+ struct dmx_mem_info *info = parg;
+
+ info->dvb_core_total_size = dmxdevfilter->buffer.size;
+ info->dvb_core_free_size =
+ dvb_ringbuffer_free(&dmxdevfilter->buffer);
+
+ if (dmxdevfilter->type == DMXDEV_TYPE_SEC) {
+ if (dmxdev->demux->get_sec_mem_info) {
+ struct dmx_section_feed *sec_feed =
+ dmxdevfilter->feed.sec;
+
+ ret =
+ dmxdev->demux->get_sec_mem_info(dmxdev->demux,
+ sec_feed, info);
+ }
+ } else if (dmxdevfilter->type == DMXDEV_TYPE_PES) {
+ if (dmxdev->demux->get_ts_mem_info) {
+ struct dmxdev_feed *feed;
+
+ list_for_each_entry(feed,
+ &dmxdevfilter->feed.ts, next) {
+ ret =
+ dmxdev->demux->get_ts_mem_info(dmxdev->demux,
+ feed->ts,
+ info);
+ break;
+ }
+ }
+ }
+ }
+ mutex_unlock(&dmxdevfilter->mutex);
+ break;
+ case DMX_GET_FILTER_MEM_INFO:
+ if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+ {
+ struct dmx_filter_mem_info *info = parg;
+
+ if (dmxdev->demux->get_dmx_mem_info)
+ ret =
+ dmxdev->demux->get_dmx_mem_info(dmxdev->demux, info);
+ }
+ mutex_unlock(&dmxdevfilter->mutex);
+ break;
+ case DMX_SET_HW_SOURCE:
+ if (!dmxdev->demux->set_hw_source) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->set_hw_source(dmxdev->demux, arg);
+ break;
+ case DMX_GET_HW_SOURCE:
+ if (!dmxdev->demux->get_hw_source) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->get_hw_source(dmxdev->demux, parg);
+ break;
+ case DMX_SET_SEC_MEM:
+ if (!dmxdev->demux->set_sec_mem) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->set_sec_mem(dmxdev->demux, parg);
+ break;
+ case DMX_GET_DVR_MEM:
+ if (!dmxdev->demux->get_dvr_mem) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->get_dvr_mem(dmxdev->demux, parg);
+ break;
+ case DMX_REMAP_PID:
+ if (!dmxdev->demux->remap_pid) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->remap_pid(dmxdev->demux, parg);
+ break;
+ case DMX_SET_DECODE_INFO:
+ if (!dmxdev->demux->decode_info) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->decode_info(dmxdev->demux, parg);
+ break;
+#endif
+
case DMX_ADD_PID:
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
ret = -ERESTARTSYS;
@@ -1305,7 +1409,22 @@ static int dvb_dvr_do_ioctl(struct file *file,
case DMX_SET_BUFFER_SIZE:
ret = dvb_dvr_set_buffer_size(dmxdev, arg);
break;
-
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ case DMX_SET_INPUT:
+ if (!dmxdev->demux->set_input) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->set_input(dmxdev->demux, arg);
+ break;
+ case DMX_GET_DVR_MEM:
+ if (!dmxdev->demux->get_dvr_mem) {
+ ret = -EINVAL;
+ break;
+ }
+ ret = dmxdev->demux->get_dvr_mem(dmxdev->demux, parg);
+ break;
+#endif
#ifdef CONFIG_DVB_MMAP
case DMX_REQBUFS:
ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg);
@@ -1405,6 +1524,9 @@ static const struct file_operations dvb_dvr_fops = {
#ifdef CONFIG_DVB_MMAP
.mmap = dvb_dvr_mmap,
#endif
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ .compat_ioctl = dvb_dvr_ioctl,
+#endif
};
static const struct dvb_device dvbdev_dvr = {
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index fea62bc..35b657c 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -234,8 +234,13 @@ static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system)
}
}
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+void dvb_frontend_add_event(struct dvb_frontend *fe,
+ enum fe_status status)
+#else
static void dvb_frontend_add_event(struct dvb_frontend *fe,
enum fe_status status)
+#endif
{
struct dvb_frontend_private *fepriv = fe->frontend_priv;
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
@@ -267,6 +272,10 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe,
wake_up_interruptible(&events->wait_queue);
}
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+EXPORT_SYMBOL(dvb_frontend_add_event);
+#endif
+
static int dvb_frontend_test_event(struct dvb_frontend_private *fepriv,
struct dvb_fe_events *events)
{
@@ -1122,7 +1131,19 @@ static char *dtv_cmds[DTV_MAX_COMMAND + 1] = {
_DTV_CMD(DTV_DVBT2_PLP_ID_LEGACY),
_DTV_CMD(DTV_SCRAMBLING_SEQUENCE_INDEX),
_DTV_CMD(DTV_LNA),
-
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ /*set blind scan cmd*/
+ _DTV_CMD(DTV_START_BLIND_SCAN),
+ _DTV_CMD(DTV_CANCEL_BLIND_SCAN),
+ _DTV_CMD(DTV_BLIND_SCAN_MIN_FRE),
+ _DTV_CMD(DTV_BLIND_SCAN_MAX_FRE),
+ _DTV_CMD(DTV_BLIND_SCAN_MIN_SRATE),
+ _DTV_CMD(DTV_BLIND_SCAN_MAX_SRATE),
+ _DTV_CMD(DTV_BLIND_SCAN_FRE_RANGE),
+ _DTV_CMD(DTV_BLIND_SCAN_FRE_STEP),
+ _DTV_CMD(DTV_BLIND_SCAN_TIMEOUT),
+ /*set blind scan cmd end*/
+#endif
/* Get */
_DTV_CMD(DTV_DISEQC_SLAVE_REPLY),
_DTV_CMD(DTV_API_VERSION),
@@ -1345,6 +1366,9 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
struct file *file)
{
int ncaps;
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ int r = 0;
+#endif
unsigned int len = 1;
switch (tvp->cmd) {
@@ -1579,6 +1603,12 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
tvp->u.buffer.len = MAX_DTV_STATS * sizeof(u32);
len = tvp->u.buffer.len;
break;
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ case DTV_DELIVERY_SUB_SYSTEM:
+ case DTV_TS_INPUT:
+ r = 0;
+ break;
+#endif
default:
dev_dbg(fe->dvb->device,
"%s: FE property %d doesn't exist\n",
@@ -1586,6 +1616,14 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
return -EINVAL;
}
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ /* Allow the frontend to override outgoing properties */
+ if (fe->ops.get_property) {
+ r = fe->ops.get_property(fe, tvp);
+ if (r < 0)
+ return r;
+ }
+#endif
if (len < 1)
len = 1;
@@ -1601,8 +1639,20 @@ static int dtv_set_frontend(struct dvb_frontend *fe);
static bool is_dvbv3_delsys(u32 delsys)
{
- return (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
- (delsys == SYS_DVBS) || (delsys == SYS_ATSC);
+ bool status = false;
+
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ status = (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
+ (delsys == SYS_DVBS) || (delsys == SYS_ATSC) ||
+ (delsys == SYS_DTMB) || (delsys == SYS_DVBS2) ||
+ (delsys == SYS_DVBT2) || (delsys == SYS_ISDBC) ||
+ (delsys == SYS_ISDBT) || (delsys == SYS_ISDBS);
+#else
+ status = (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
+ (delsys == SYS_DVBS) || (delsys == SYS_ATSC);
+#endif
+
+ return status;
}
/**
@@ -1883,6 +1933,20 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
int r = 0;
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ struct dtv_property tvp;
+
+ tvp.cmd = cmd;
+ tvp.u.data = data;
+
+ /* Allow the frontend to validate incoming properties */
+ if (fe->ops.set_property) {
+ r = fe->ops.set_property(fe, &tvp);
+ if (r < 0)
+ return r;
+ }
+#endif
+
/** Dump DTV command name and value*/
if (!cmd || cmd > DTV_MAX_COMMAND)
dev_warn(fe->dvb->device, "%s: SET cmd 0x%08x undefined\n",
@@ -1937,6 +2001,11 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
case DTV_DELIVERY_SYSTEM:
r = dvbv5_set_delivery_system(fe, data);
break;
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ case DTV_DELIVERY_SUB_SYSTEM:
+ r = 0;
+ break;
+#endif
case DTV_VOLTAGE:
c->voltage = data;
r = dvb_frontend_handle_ioctl(file, FE_SET_VOLTAGE,
@@ -2048,7 +2117,19 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
if (r < 0)
c->lna = LNA_AUTO;
break;
-
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ case DTV_START_BLIND_SCAN:
+ case DTV_CANCEL_BLIND_SCAN:
+ case DTV_BLIND_SCAN_MIN_FRE:
+ case DTV_BLIND_SCAN_MAX_FRE:
+ case DTV_BLIND_SCAN_MIN_SRATE:
+ case DTV_BLIND_SCAN_MAX_SRATE:
+ case DTV_BLIND_SCAN_FRE_RANGE:
+ case DTV_BLIND_SCAN_FRE_STEP:
+ case DTV_BLIND_SCAN_TIMEOUT:
+ r = 0;
+ break;
+#endif
default:
return -EINVAL;
}
diff --git a/include/media/demux.h b/include/media/demux.h
index bf00a5a..149ce62 100644
--- a/include/media/demux.h
+++ b/include/media/demux.h
@@ -595,6 +595,28 @@ struct dmx_demux {
*/
int (*get_stc)(struct dmx_demux *demux, unsigned int num,
u64 *stc, unsigned int *base);
+
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ int (*set_input)(struct dmx_demux *demux, int source);
+ int (*get_ts_mem_info)(struct dmx_demux *demux,
+ struct dmx_ts_feed *feed,
+ struct dmx_mem_info *info);
+ int (*get_sec_mem_info)(struct dmx_demux *demux,
+ struct dmx_section_feed *feed,
+ struct dmx_mem_info *info);
+ int (*set_hw_source)(struct dmx_demux *demux, int hw_source);
+ int (*get_hw_source)(struct dmx_demux *demux, int *hw_source);
+ int (*get_dmx_mem_info)(struct dmx_demux *demux,
+ struct dmx_filter_mem_info *info);
+ int (*set_sec_mem)(struct dmx_demux *demux,
+ struct dmx_sec_mem *sec_mem);
+ int (*get_dvr_mem)(struct dmx_demux *demux,
+ struct dvr_mem_info *info);
+ int (*remap_pid)(struct dmx_demux *demux,
+ u16 pids[2]);
+ int (*decode_info)(struct dmx_demux *demux,
+ struct decoder_mem_info *info);
+#endif
};
#endif /* #ifndef __DEMUX_H */
diff --git a/include/media/dvb_frontend.h b/include/media/dvb_frontend.h
index 0d76fa4..47379e0 100644
--- a/include/media/dvb_frontend.h
+++ b/include/media/dvb_frontend.h
@@ -51,7 +51,11 @@
* Maximum number of Delivery systems per frontend. It
* should be smaller or equal to 32
*/
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+#define MAX_DELSYS 32
+#else
#define MAX_DELSYS 8
+#endif
/* Helper definitions to be used at frontend drivers */
#define kHz 1000UL
@@ -266,6 +270,10 @@ struct dvb_tuner_ops {
*/
int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
+
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ int (*get_strength)(struct dvb_frontend *fe, s16 *strength);
+#endif
};
/**
@@ -337,6 +345,11 @@ struct dtv_frontend_properties;
*/
struct dvb_frontend_internal_info {
char name[128];
+
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ enum fe_type type;
+#endif
+
u32 frequency_min_hz;
u32 frequency_max_hz;
u32 frequency_stepsize_hz;
@@ -491,6 +504,11 @@ struct dvb_frontend_ops {
struct dvb_tuner_ops tuner_ops;
struct analog_demod_ops analog_ops;
+
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+ int (*set_property)(struct dvb_frontend *fe, struct dtv_property *tvp);
+ int (*get_property)(struct dvb_frontend *fe, struct dtv_property *tvp);
+#endif
};
#ifdef __DVB_CORE__
@@ -821,5 +839,10 @@ void dvb_frontend_reinitialise(struct dvb_frontend *fe);
* calling this function directly.
*/
void dvb_frontend_sleep_until(ktime_t *waketime, u32 add_usec);
-
+#ifdef CONFIG_AMLOGIC_DVB_COMPAT
+/**
+ * dvb_frontend_add_event() - add event for the dvb frontend
+ */
+void dvb_frontend_add_event(struct dvb_frontend *fe, enum fe_status status);
+#endif
#endif
diff --git a/include/uapi/linux/dvb/ca.h b/include/uapi/linux/dvb/ca.h
index dffa59e..d084a26 100644
--- a/include/uapi/linux/dvb/ca.h
+++ b/include/uapi/linux/dvb/ca.h
@@ -132,6 +132,172 @@ struct ca_descr {
unsigned char cw[8];
};
+/* amlogic define */
+/* CW type. */
+enum ca_cw_type {
+ CA_CW_DVB_CSA_EVEN,
+ CA_CW_DVB_CSA_ODD,
+ CA_CW_AES_EVEN,
+ CA_CW_AES_ODD,
+ CA_CW_AES_EVEN_IV,
+ CA_CW_AES_ODD_IV,
+ CA_CW_DES_EVEN,
+ CA_CW_DES_ODD,
+ CA_CW_SM4_EVEN,
+ CA_CW_SM4_ODD,
+ CA_CW_SM4_EVEN_IV,
+ CA_CW_SM4_ODD_IV,
+ CA_CW_TYPE_MAX
+};
+
+enum ca_dsc_mode {
+ CA_DSC_CBC = 1,
+ CA_DSC_ECB,
+ CA_DSC_IDSA
+};
+
+struct ca_descr_ex {
+ unsigned int index;
+ enum ca_cw_type type;
+ enum ca_dsc_mode mode;
+ int flags;
+#define CA_CW_FROM_KL 1
+ unsigned char cw[16];
+};
+
+/* add for support sc2 ca*/
+enum ca_sc2_cmd_type {
+ CA_ALLOC,
+ CA_FREE,
+ CA_KEY,
+ CA_GET_STATUS,
+ CA_SET_SCB,
+ CA_SET_ALGO
+};
+
+enum ca_sc2_algo_type {
+ CA_ALGO_AES_ECB_CLR_END,
+ CA_ALGO_AES_ECB_CLR_FRONT,
+ CA_ALGO_AES_CBC_CLR_END,
+ CA_ALGO_AES_CBC_IDSA,
+ CA_ALGO_CSA2,
+ CA_ALGO_DES_SCTE41,
+ CA_ALGO_DES_SCTE52,
+ CA_ALGO_TDES_ECB_CLR_END,
+ CA_ALGO_CPCM_LSA_MDI_CBC,
+ CA_ALGO_CPCM_LSA_MDD_CBC,
+ CA_ALGO_CSA3,
+ CA_ALGO_ASA,
+ CA_ALGO_ASA_LIGHT,
+ CA_ALGO_S17_ECB_CLR_END,
+ CA_ALGO_S17_ECB_CTS,
+ CA_ALGO_UNKNOWN
+};
+
+enum ca_sc2_dsc_type {
+ CA_DSC_COMMON_TYPE,
+ CA_DSC_TSD_TYPE, /*just support AES descramble.*/
+ CA_DSC_TSE_TYPE /*just support AES enscramble.*/
+};
+
+/**
+ * struct ca_alloc - malloc ca slot index by params
+ *
+ * @pid: slot use pid.
+ * @algo: use the algorithm
+ * @dsc_type: CA_DSC_COMMON_TYPE:support all ca_algo_type
+ * CA_DSC_TSD_TYPE & CA_DSC_TSE_TYPE just support AES
+ * @ca_index: return slot index.
+ * @loop: 0: just descramble once.
+ * 1: descramble twice.
+ */
+struct ca_sc2_alloc {
+ unsigned int pid;
+ enum ca_sc2_algo_type algo;
+ enum ca_sc2_dsc_type dsc_type;
+ unsigned int ca_index;
+ unsigned char loop;
+};
+
+/**
+ * struct ca_sc2_free - free slot index
+ *
+ * @ca_index: need free slot index.
+ */
+struct ca_sc2_free {
+ unsigned int ca_index;
+};
+
+enum ca_sc2_key_type {
+ CA_KEY_EVEN_TYPE,
+ CA_KEY_EVEN_IV_TYPE,
+ CA_KEY_ODD_TYPE,
+ CA_KEY_ODD_IV_TYPE,
+ CA_KEY_00_TYPE,
+ CA_KEY_00_IV_TYPE
+};
+
+/**
+ * struct ca_sc2_key - set key slot index
+ *
+ * @ca_index: use slot index.
+ * @parity: key type (odd/even/key00)
+ * @key_index: key store index.
+ */
+struct ca_sc2_key {
+ unsigned int ca_index;
+ enum ca_sc2_key_type parity;
+ unsigned int key_index;
+};
+
+/**
+ * struct ca_sc2_scb - set scb
+ *
+ * @ca_index: use slot index.
+ * @ca_scb: ca_scb (2bit)
+ * @ca_scb_as_is:if 1, scb use original
+ * if 0, use ca_scb
+ */
+struct ca_sc2_scb {
+ unsigned int ca_index;
+ unsigned char ca_scb;
+ unsigned char ca_scb_as_is;
+};
+
+/**
+ * struct ca_sc2_algo - set algo
+ *
+ * @ca_index: use slot index.
+ * @algo: algo
+ */
+struct ca_sc2_algo {
+ unsigned int ca_index;
+ enum ca_sc2_algo_type algo;
+};
+
+/**
+ * struct ca_sc2_descr_ex - ca externd descriptor
+ *
+ * @params: command resource params
+ */
+struct ca_sc2_descr_ex {
+ enum ca_sc2_cmd_type cmd;
+ union {
+ struct ca_sc2_alloc alloc_params;
+ struct ca_sc2_free free_params;
+ struct ca_sc2_key key_params;
+ struct ca_sc2_scb scb_params;
+ struct ca_sc2_algo algo_params;
+ } params;
+};
+
+struct ca_pid {
+ unsigned int pid;
+ int index; /* -1 == disable*/
+};
+
+/* amlogic define end */
+
#define CA_RESET _IO('o', 128)
#define CA_GET_CAP _IOR('o', 129, struct ca_caps)
#define CA_GET_SLOT_INFO _IOR('o', 130, struct ca_slot_info)
@@ -139,7 +305,11 @@ struct ca_descr {
#define CA_GET_MSG _IOR('o', 132, struct ca_msg)
#define CA_SEND_MSG _IOW('o', 133, struct ca_msg)
#define CA_SET_DESCR _IOW('o', 134, struct ca_descr)
-
+/* amlogic define */
+#define CA_SET_PID _IOW('o', 135, struct ca_pid)
+#define CA_SET_DESCR_EX _IOW('o', 200, struct ca_descr_ex)
+#define CA_SC2_SET_DESCR_EX _IOWR('o', 201, struct ca_sc2_descr_ex)
+/* amlogic define end */
#if !defined(__KERNEL__)
/* This is needed for legacy userspace support */
@@ -150,6 +320,4 @@ typedef struct ca_msg ca_msg_t;
typedef struct ca_descr ca_descr_t;
#endif
-
-
#endif
diff --git a/include/uapi/linux/dvb/dmx.h b/include/uapi/linux/dvb/dmx.h
index b4112f0..0afb883 100644
--- a/include/uapi/linux/dvb/dmx.h
+++ b/include/uapi/linux/dvb/dmx.h
@@ -30,7 +30,6 @@
#include <time.h>
#endif
-
#define DMX_FILTER_SIZE 16
/**
@@ -178,8 +177,97 @@ struct dmx_sct_filter_params {
#define DMX_CHECK_CRC 1
#define DMX_ONESHOT 2
#define DMX_IMMEDIATE_START 4
+/* amlogic define */
+#define DMX_USE_SWFILTER 0x100
+
+/*bit 8~15 for mem sec_level*/
+#define DMX_MEM_SEC_LEVEL1 (1 << 10)
+#define DMX_MEM_SEC_LEVEL2 (2 << 10)
+#define DMX_MEM_SEC_LEVEL3 (3 << 10)
+#define DMX_MEM_SEC_LEVEL4 (4 << 10)
+#define DMX_MEM_SEC_LEVEL5 (5 << 10)
+#define DMX_MEM_SEC_LEVEL6 (6 << 10)
+#define DMX_MEM_SEC_LEVEL7 (7 << 10)
+/* amlogic define end */
};
+/*amlogic define*/
+enum dmx_input_source {
+ INPUT_DEMOD,
+ INPUT_LOCAL,
+ INPUT_LOCAL_SEC
+};
+
+/**
+ * struct dmx_non_sec_es_header - non-sec Elementary Stream (ES) Header
+ *
+ * @pts_dts_flag:[1:0], 01:pts valid, 10:dts valid
+ * @pts: pts value
+ * @dts: dts value
+ * @len: data len
+ */
+struct dmx_non_sec_es_header {
+ __u8 pts_dts_flag;
+ __u64 pts;
+ __u64 dts;
+ __u32 len;
+};
+
+/**
+ * struct dmx_sec_es_data - sec Elementary Stream (ES)
+ *
+ * @pts_dts_flag:[1:0], 01:pts valid, 10:dts valid
+ * @pts: pts value
+ * @dts: dts value
+ * @buf_start: buf start addr
+ * @buf_end: buf end addr
+ * @data_start: data start addr
+ * @data_end: data end addr
+ */
+struct dmx_sec_es_data {
+ __u8 pts_dts_flag;
+ __u64 pts;
+ __u64 dts;
+ __u32 buf_start;
+ __u32 buf_end;
+ __u32 data_start;
+ __u32 data_end;
+};
+
+struct dmx_sec_ts_data {
+ __u32 buf_start;
+ __u32 buf_end;
+ __u32 data_start;
+ __u32 data_end;
+};
+
+enum dmx_audio_format {
+ AUDIO_UNKNOWN = 0, /* unknown media */
+ AUDIO_MPX = 1, /* mpeg audio MP2/MP3 */
+ AUDIO_AC3 = 2, /* Dolby AC3/EAC3 */
+ AUDIO_AAC_ADTS = 3, /* AAC-ADTS */
+ AUDIO_AAC_LOAS = 4, /* AAC-LOAS */
+ AUDIO_DTS = 5, /* DTS */
+ AUDIO_MAX
+};
+
+struct dmx_mem_info {
+ __u32 dmx_total_size;
+ __u32 dmx_buf_phy_start;
+ __u32 dmx_free_size;
+ __u32 dvb_core_total_size;
+ __u32 dvb_core_free_size;
+ __u32 wp_offset;
+ __u64 newest_pts;
+};
+
+struct dmx_sec_mem {
+ __u32 buff;
+ __u32 size;
+};
+
+/* amlogic define end */
+
/**
* struct dmx_pes_filter_params - Specifies Packetized Elementary Stream (PES)
* filter parameters.
@@ -196,6 +284,25 @@ struct dmx_pes_filter_params {
enum dmx_output output;
enum dmx_ts_pes pes_type;
__u32 flags;
+ /*amlogic define*/
+/*bit 8~15 for mem sec_level*/
+#define DMX_MEM_SEC_LEVEL1 (1 << 10)
+#define DMX_MEM_SEC_LEVEL2 (2 << 10)
+#define DMX_MEM_SEC_LEVEL3 (3 << 10)
+#define DMX_MEM_SEC_LEVEL4 (4 << 10)
+#define DMX_MEM_SEC_LEVEL5 (5 << 10)
+#define DMX_MEM_SEC_LEVEL6 (6 << 10)
+#define DMX_MEM_SEC_LEVEL7 (7 << 10)
+
+/*bit 16~23 for output */
+#define DMX_ES_OUTPUT (1 << 16)
+/*set raw mode, it will send the struct dmx_sec_es_data, not es data*/
+#define DMX_OUTPUT_RAW_MODE (1 << 17)
+
+/*24~31 one byte for audio type, dmx_audio_format_t*/
+#define DMX_AUDIO_FORMAT_BIT 24
+
+/* amlogic define end */
};
/**
@@ -301,6 +408,72 @@ struct dmx_exportbuffer {
__s32 fd;
};
+/* amlogic define */
+enum {
+ DMA_0 = 0,
+ DMA_1,
+ DMA_2,
+ DMA_3,
+ DMA_4,
+ DMA_5,
+ DMA_6,
+ DMA_7,
+ FRONTEND_TS0 = 32,
+ FRONTEND_TS1,
+ FRONTEND_TS2,
+ FRONTEND_TS3,
+ FRONTEND_TS4,
+ FRONTEND_TS5,
+ FRONTEND_TS6,
+ FRONTEND_TS7,
+ DMA_0_1 = 64,
+ DMA_1_1,
+ DMA_2_1,
+ DMA_3_1,
+ DMA_4_1,
+ DMA_5_1,
+ DMA_6_1,
+ DMA_7_1,
+ FRONTEND_TS0_1 = 96,
+ FRONTEND_TS1_1,
+ FRONTEND_TS2_1,
+ FRONTEND_TS3_1,
+ FRONTEND_TS4_1,
+ FRONTEND_TS5_1,
+ FRONTEND_TS6_1,
+ FRONTEND_TS7_1,
+};
+
+/*define filter mem_info type*/
+enum {
+ DMX_VIDEO_TYPE = 0,
+ DMX_AUDIO_TYPE,
+ DMX_SUBTITLE_TYPE,
+ DMX_TELETEXT_TYPE,
+ DMX_SECTION_TYPE,
+};
+
+struct filter_mem_info {
+ __u32 type;
+ __u32 pid;
+ struct dmx_mem_info filter_info;
+};
+
+struct dmx_filter_mem_info {
+ __u32 filter_num;
+ struct filter_mem_info info[40];
+};
+
+struct dvr_mem_info {
+ __u32 wp_offset;
+};
+
+struct decoder_mem_info {
+ __u32 rp_phy;
+};
+
+/* amlogic define end */
+
#define DMX_START _IO('o', 41)
#define DMX_STOP _IO('o', 42)
#define DMX_SET_FILTER _IOW('o', 43, struct dmx_sct_filter_params)
@@ -310,7 +483,6 @@ struct dmx_exportbuffer {
#define DMX_GET_STC _IOWR('o', 50, struct dmx_stc)
#define DMX_ADD_PID _IOW('o', 51, __u16)
#define DMX_REMOVE_PID _IOW('o', 52, __u16)
-
#if !defined(__KERNEL__)
/* This is needed for legacy userspace support */
@@ -327,4 +499,16 @@ typedef struct dmx_filter dmx_filter_t;
#define DMX_QBUF _IOWR('o', 63, struct dmx_buffer)
#define DMX_DQBUF _IOWR('o', 64, struct dmx_buffer)
+/* amlogic define */
+#define DMX_SET_INPUT _IO('o', 80)
+#define DMX_GET_MEM_INFO _IOR('o', 81, struct dmx_mem_info)
+#define DMX_SET_HW_SOURCE _IO('o', 82)
+#define DMX_GET_HW_SOURCE _IOR('o', 83, int)
+#define DMX_GET_FILTER_MEM_INFO _IOR('o', 84, struct dmx_filter_mem_info)
+/*just for dvr sec mem, please call before DMX_SET_PES_FILTER*/
+#define DMX_SET_SEC_MEM _IOW('o', 85, struct dmx_sec_mem)
+#define DMX_GET_DVR_MEM _IOR('o', 86, struct dvr_mem_info)
+#define DMX_REMAP_PID _IOR('o', 87, __u16[2])
+#define DMX_SET_DECODE_INFO _IOW('o', 88, struct decoder_mem_info)
+/* amlogic define end */
#endif /* _DVBDMX_H_ */
diff --git a/include/uapi/linux/dvb/frontend.h b/include/uapi/linux/dvb/frontend.h
index 4f9b455..ad9a75f 100644
--- a/include/uapi/linux/dvb/frontend.h
+++ b/include/uapi/linux/dvb/frontend.h
@@ -29,6 +29,10 @@
#include <linux/types.h>
+/* amlogic define */
+#include <linux/videodev2.h>
+/* amlogic define end */
+
/**
* enum fe_caps - Frontend capabilities
*
@@ -110,9 +114,13 @@ enum fe_type {
FE_QPSK,
FE_QAM,
FE_OFDM,
- FE_ATSC
+ FE_ATSC,
+ /*amlogic define*/
+ FE_ANALOG,
+ FE_DTMB,
+ FE_ISDBT
+ /*amlogic define end*/
};
-
/**
* struct dvb_frontend_info - Frontend properties and capabilities
*
@@ -258,6 +266,12 @@ enum fe_status {
FE_HAS_LOCK = 0x10,
FE_TIMEDOUT = 0x20,
FE_REINIT = 0x40,
+ /*amlogic define*/
+ BLINDSCAN_NONEDO = 0x80, /* not blind scan */
+ BLINDSCAN_UPDATESTARTFREQ = 0x100, /* blind scan update start freq */
+ BLINDSCAN_UPDATEPROCESS = 0x200, /* blind scan update process */
+ BLINDSCAN_UPDATERESULTFREQ = 0x400/* blind scan update result */
+ /*amlogic define end*/
};
/**
@@ -455,6 +469,26 @@ enum fe_interleaving {
INTERLEAVING_720,
};
+/*amlogic define*/
+struct fe_blind_scan_parameters {
+ /* minimum tuner frequency in kHz */
+ __u32 min_frequency;
+ /* maximum tuner frequency in kHz */
+ __u32 max_frequency;
+ /* minimum symbol rate in sym/sec */
+ __u32 min_symbol_rate;
+ /* maximum symbol rate in sym/sec */
+ __u32 max_symbol_rate;
+ /* search range in kHz. freq -/+freqRange will be searched */
+ __u32 frequency_range;
+ /* tuner step frequency in kHz */
+ __u32 frequency_step;
+ /* blindscan event timeout */
+ __s32 timeout;
+};
+
+/*amlogic define end*/
+
/* DVBv5 property Commands */
#define DTV_UNDEFINED 0
@@ -516,6 +550,9 @@ enum fe_interleaving {
#define DTV_DVBT2_PLP_ID_LEGACY 43
#define DTV_ENUM_DELSYS 44
+/*amlogic define*/
+#define DTV_DVBT2_PLP_ID DTV_DVBT2_PLP_ID_LEGACY
+/*amlogic define end*/
/* ATSC-MH */
#define DTV_ATSCMH_FIC_VER 45
@@ -550,8 +587,23 @@ enum fe_interleaving {
/* Physical layer scrambling */
#define DTV_SCRAMBLING_SEQUENCE_INDEX 70
-#define DTV_MAX_COMMAND DTV_SCRAMBLING_SEQUENCE_INDEX
-
+/* amlogic define */
+/* Get tne TS input of the frontend */
+#define DTV_TS_INPUT 100
+/* Blind scan */
+#define DTV_START_BLIND_SCAN 101
+#define DTV_CANCEL_BLIND_SCAN 102
+#define DTV_BLIND_SCAN_MIN_FRE 103
+#define DTV_BLIND_SCAN_MAX_FRE 104
+#define DTV_BLIND_SCAN_MIN_SRATE 105
+#define DTV_BLIND_SCAN_MAX_SRATE 106
+#define DTV_BLIND_SCAN_FRE_RANGE 107
+#define DTV_BLIND_SCAN_FRE_STEP 108
+#define DTV_BLIND_SCAN_TIMEOUT 109
+/* Blind scan end*/
+#define DTV_DELIVERY_SUB_SYSTEM 110
+#define DTV_MAX_COMMAND DTV_DELIVERY_SUB_SYSTEM
+/* amlogic define end */
/**
* enum fe_pilot - Type of pilot tone
*
@@ -645,6 +697,9 @@ enum fe_delivery_system {
SYS_DVBT2,
SYS_TURBO,
SYS_DVBC_ANNEX_C,
+ /* amlogic define */
+ SYS_ANALOG
+ /* amlogic define end */
};
/* backward compatibility definitions for delivery systems */
@@ -957,6 +1012,14 @@ typedef enum fe_pilot fe_pilot_t;
typedef enum fe_rolloff fe_rolloff_t;
typedef enum fe_delivery_system fe_delivery_system_t;
+/* amlogic define */
+enum fe_ofdm_mode {
+ OFDM_DVBT,
+ OFDM_DVBT2,
+};
+
+/* amlogic define end */
+
/* DVBv3 structs */
struct dvb_qpsk_parameters {
@@ -984,6 +1047,21 @@ struct dvb_ofdm_parameters {
fe_hierarchy_t hierarchy_information;
};
+/* amlogic define */
+#define ANALOG_FLAG_ENABLE_AFC 0X00000001
+#define ANALOG_FLAG_MANUL_SCAN 0x00000011
+struct dvb_analog_parameters {
+ /*V4L2_TUNER_MODE_MONO,V4L2_TUNER_MODE_STEREO,*/
+ /*V4L2_TUNER_MODE_LANG2,V4L2_TUNER_MODE_SAP,*/
+ /*V4L2_TUNER_MODE_LANG1,V4L2_TUNER_MODE_LANG1_LANG2 */
+ unsigned int audmode;
+ unsigned int soundsys; /*A2,BTSC,EIAJ,NICAM */
+ v4l2_std_id std;
+ unsigned int flag;
+ unsigned int afc_range;
+};
+
+/* amlogic define end */
struct dvb_frontend_parameters {
__u32 frequency; /* (absolute) frequency in Hz for DVB-C/DVB-T/ATSC */
/* intermediate frequency in kHz for DVB-S */
@@ -1001,6 +1079,103 @@ struct dvb_frontend_event {
struct dvb_frontend_parameters parameters;
};
+/* amlogic define */
+/* Satellite blind scan event */
+struct dvbsx_blindscanevent {
+ enum fe_status status;
+ union {
+ /* The percentage completion of the*/
+ /*blind scan procedure. A value of*/
+ /*100 indicates that the blind scan*/
+ /*is finished. */
+ __u16 m_uiprogress;
+ /*The start scan frequency in units of kHz.*/
+ /*The minimum value depends on the tuner*/
+ /*specification.*/
+ __u32 m_uistartfreq_khz;
+ /* Blind scan channel info. */
+ struct dvb_frontend_parameters parameters;
+ } u;
+};
+
+/*for atv*/
+struct tuner_status_s {
+ unsigned int frequency;
+ unsigned int rssi;
+ unsigned char mode;/*dtv:0 or atv:1*/
+ unsigned char tuner_locked;/*notlocked:0,locked:1*/
+ union {
+ void *ressrved;
+ __u64 reserved1;
+ };
+};
+
+struct atv_status_s {
+ unsigned char atv_lock;/*notlocked:0,locked 1*/
+ v4l2_std_id std;
+ unsigned int audmode;
+ int snr;
+ int afc;
+ union {
+ void *resrvred;
+ __u64 reserved1;
+ };
+};
+
+struct sound_status_s {
+ unsigned short sound_sys;/*A2DK/A2BG/NICAM BG/NICAM DK/BTSC/EIAJ*/
+ unsigned short sound_mode;/*SETERO/DUAL/MONO/SAP*/
+ union {
+ void *resrvred;
+ __u64 reserved1;
+ };
+};
+
+enum tuner_param_cmd_e {
+ TUNER_CMD_AUDIO_MUTE = 0x0000,
+ TUNER_CMD_AUDIO_ON,
+ TUNER_CMD_TUNER_POWER_ON,
+ TUNER_CMD_TUNER_POWER_DOWN,
+ TUNER_CMD_SET_VOLUME,
+ TUNER_CMD_SET_LEAP_SETP_SIZE,
+ TUNER_CMD_GET_MONO_MODE,
+ TUNER_CMD_SET_BEST_LOCK_RANGE,
+ TUNER_CMD_GET_BEST_LOCK_RANGE,
+ TUNER_CMD_SET_CVBS_AMP_OUT,
+ TUNER_CMD_GET_CVBS_AMP_OUT,
+ TUNER_CMD_NULL,
+};
+
+/*parameter for set param box*/
+struct tuner_param_s {
+ enum tuner_param_cmd_e cmd;
+ unsigned int parm;
+ unsigned int resvred;
+};
+
+// typedef struct dvb_analog_parameters dvb_analog_parameters_t;
+// typedef struct tuner_status_s tuner_status_t;
+// typedef struct atv_status_s atv_status_t;
+// typedef struct sound_status_s sound_status_t;
+// typedef enum tuner_param_cmd_e tuner_param_cmd_t;
+// typedef struct tuner_param_s tuner_param_t;
+// typedef enum fe_layer fe_layer_t;
+// typedef enum fe_ofdm_mode fe_ofdm_mode_t;
+
+/* Satellite blind scan settings */
+struct dvbsx_blindscanpara {
+ __u32 minfrequency;/* minimum tuner frequency in kHz */
+ __u32 maxfrequency;/* maximum tuner frequency in kHz */
+ __u32 minSymbolRate;/* minimum symbol rate in sym/sec */
+ __u32 maxSymbolRate;/* maximum symbol rate in sym/sec */
+ /*search range in kHz. freq -/+freqRange will be searched */
+ __u32 frequencyRange;
+ __u32 frequencyStep;/* tuner step frequency in kHz */
+ __s32 timeout;/* blindscan event timeout*/
+};
+
+/* amlogic define end */
+
/* DVBv3 API calls */
#define FE_SET_FRONTEND _IOW('o', 76, struct dvb_frontend_parameters)